diff --git a/man/figures/Readme-Example-2.html b/man/figures/Readme-Example-2.html
new file mode 100644
index 0000000..5048531
--- /dev/null
+++ b/man/figures/Readme-Example-2.html
@@ -0,0 +1,4306 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8" />
+<style>body{background-color:white;}</style>
+<script>(function() {
+  // If window.HTMLWidgets is already defined, then use it; otherwise create a
+  // new object. This allows preceding code to set options that affect the
+  // initialization process (though none currently exist).
+  window.HTMLWidgets = window.HTMLWidgets || {};
+
+  // See if we're running in a viewer pane. If not, we're in a web browser.
+  var viewerMode = window.HTMLWidgets.viewerMode =
+      /\bviewer_pane=1\b/.test(window.location);
+
+  // See if we're running in Shiny mode. If not, it's a static document.
+  // Note that static widgets can appear in both Shiny and static modes, but
+  // obviously, Shiny widgets can only appear in Shiny apps/documents.
+  var shinyMode = window.HTMLWidgets.shinyMode =
+      typeof(window.Shiny) !== "undefined" && !!window.Shiny.outputBindings;
+
+  // We can't count on jQuery being available, so we implement our own
+  // version if necessary.
+  function querySelectorAll(scope, selector) {
+    if (typeof(jQuery) !== "undefined" && scope instanceof jQuery) {
+      return scope.find(selector);
+    }
+    if (scope.querySelectorAll) {
+      return scope.querySelectorAll(selector);
+    }
+  }
+
+  function asArray(value) {
+    if (value === null)
+      return [];
+    if ($.isArray(value))
+      return value;
+    return [value];
+  }
+
+  // Implement jQuery's extend
+  function extend(target /*, ... */) {
+    if (arguments.length == 1) {
+      return target;
+    }
+    for (var i = 1; i < arguments.length; i++) {
+      var source = arguments[i];
+      for (var prop in source) {
+        if (source.hasOwnProperty(prop)) {
+          target[prop] = source[prop];
+        }
+      }
+    }
+    return target;
+  }
+
+  // IE8 doesn't support Array.forEach.
+  function forEach(values, callback, thisArg) {
+    if (values.forEach) {
+      values.forEach(callback, thisArg);
+    } else {
+      for (var i = 0; i < values.length; i++) {
+        callback.call(thisArg, values[i], i, values);
+      }
+    }
+  }
+
+  // Replaces the specified method with the return value of funcSource.
+  //
+  // Note that funcSource should not BE the new method, it should be a function
+  // that RETURNS the new method. funcSource receives a single argument that is
+  // the overridden method, it can be called from the new method. The overridden
+  // method can be called like a regular function, it has the target permanently
+  // bound to it so "this" will work correctly.
+  function overrideMethod(target, methodName, funcSource) {
+    var superFunc = target[methodName] || function() {};
+    var superFuncBound = function() {
+      return superFunc.apply(target, arguments);
+    };
+    target[methodName] = funcSource(superFuncBound);
+  }
+
+  // Add a method to delegator that, when invoked, calls
+  // delegatee.methodName. If there is no such method on
+  // the delegatee, but there was one on delegator before
+  // delegateMethod was called, then the original version
+  // is invoked instead.
+  // For example:
+  //
+  // var a = {
+  //   method1: function() { console.log('a1'); }
+  //   method2: function() { console.log('a2'); }
+  // };
+  // var b = {
+  //   method1: function() { console.log('b1'); }
+  // };
+  // delegateMethod(a, b, "method1");
+  // delegateMethod(a, b, "method2");
+  // a.method1();
+  // a.method2();
+  //
+  // The output would be "b1", "a2".
+  function delegateMethod(delegator, delegatee, methodName) {
+    var inherited = delegator[methodName];
+    delegator[methodName] = function() {
+      var target = delegatee;
+      var method = delegatee[methodName];
+
+      // The method doesn't exist on the delegatee. Instead,
+      // call the method on the delegator, if it exists.
+      if (!method) {
+        target = delegator;
+        method = inherited;
+      }
+
+      if (method) {
+        return method.apply(target, arguments);
+      }
+    };
+  }
+
+  // Implement a vague facsimilie of jQuery's data method
+  function elementData(el, name, value) {
+    if (arguments.length == 2) {
+      return el["htmlwidget_data_" + name];
+    } else if (arguments.length == 3) {
+      el["htmlwidget_data_" + name] = value;
+      return el;
+    } else {
+      throw new Error("Wrong number of arguments for elementData: " +
+        arguments.length);
+    }
+  }
+
+  // http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
+  function escapeRegExp(str) {
+    return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
+  }
+
+  function hasClass(el, className) {
+    var re = new RegExp("\\b" + escapeRegExp(className) + "\\b");
+    return re.test(el.className);
+  }
+
+  // elements - array (or array-like object) of HTML elements
+  // className - class name to test for
+  // include - if true, only return elements with given className;
+  //   if false, only return elements *without* given className
+  function filterByClass(elements, className, include) {
+    var results = [];
+    for (var i = 0; i < elements.length; i++) {
+      if (hasClass(elements[i], className) == include)
+        results.push(elements[i]);
+    }
+    return results;
+  }
+
+  function on(obj, eventName, func) {
+    if (obj.addEventListener) {
+      obj.addEventListener(eventName, func, false);
+    } else if (obj.attachEvent) {
+      obj.attachEvent(eventName, func);
+    }
+  }
+
+  function off(obj, eventName, func) {
+    if (obj.removeEventListener)
+      obj.removeEventListener(eventName, func, false);
+    else if (obj.detachEvent) {
+      obj.detachEvent(eventName, func);
+    }
+  }
+
+  // Translate array of values to top/right/bottom/left, as usual with
+  // the "padding" CSS property
+  // https://developer.mozilla.org/en-US/docs/Web/CSS/padding
+  function unpackPadding(value) {
+    if (typeof(value) === "number")
+      value = [value];
+    if (value.length === 1) {
+      return {top: value[0], right: value[0], bottom: value[0], left: value[0]};
+    }
+    if (value.length === 2) {
+      return {top: value[0], right: value[1], bottom: value[0], left: value[1]};
+    }
+    if (value.length === 3) {
+      return {top: value[0], right: value[1], bottom: value[2], left: value[1]};
+    }
+    if (value.length === 4) {
+      return {top: value[0], right: value[1], bottom: value[2], left: value[3]};
+    }
+  }
+
+  // Convert an unpacked padding object to a CSS value
+  function paddingToCss(paddingObj) {
+    return paddingObj.top + "px " + paddingObj.right + "px " + paddingObj.bottom + "px " + paddingObj.left + "px";
+  }
+
+  // Makes a number suitable for CSS
+  function px(x) {
+    if (typeof(x) === "number")
+      return x + "px";
+    else
+      return x;
+  }
+
+  // Retrieves runtime widget sizing information for an element.
+  // The return value is either null, or an object with fill, padding,
+  // defaultWidth, defaultHeight fields.
+  function sizingPolicy(el) {
+    var sizingEl = document.querySelector("script[data-for='" + el.id + "'][type='application/htmlwidget-sizing']");
+    if (!sizingEl)
+      return null;
+    var sp = JSON.parse(sizingEl.textContent || sizingEl.text || "{}");
+    if (viewerMode) {
+      return sp.viewer;
+    } else {
+      return sp.browser;
+    }
+  }
+
+  // @param tasks Array of strings (or falsy value, in which case no-op).
+  //   Each element must be a valid JavaScript expression that yields a
+  //   function. Or, can be an array of objects with "code" and "data"
+  //   properties; in this case, the "code" property should be a string
+  //   of JS that's an expr that yields a function, and "data" should be
+  //   an object that will be added as an additional argument when that
+  //   function is called.
+  // @param target The object that will be "this" for each function
+  //   execution.
+  // @param args Array of arguments to be passed to the functions. (The
+  //   same arguments will be passed to all functions.)
+  function evalAndRun(tasks, target, args) {
+    if (tasks) {
+      forEach(tasks, function(task) {
+        var theseArgs = args;
+        if (typeof(task) === "object") {
+          theseArgs = theseArgs.concat([task.data]);
+          task = task.code;
+        }
+        var taskFunc = tryEval(task);
+        if (typeof(taskFunc) !== "function") {
+          throw new Error("Task must be a function! Source:\n" + task);
+        }
+        taskFunc.apply(target, theseArgs);
+      });
+    }
+  }
+
+  // Attempt eval() both with and without enclosing in parentheses.
+  // Note that enclosing coerces a function declaration into
+  // an expression that eval() can parse
+  // (otherwise, a SyntaxError is thrown)
+  function tryEval(code) {
+    var result = null;
+    try {
+      result = eval(code);
+    } catch(error) {
+      if (!error instanceof SyntaxError) {
+        throw error;
+      }
+      try {
+        result = eval("(" + code + ")");
+      } catch(e) {
+        if (e instanceof SyntaxError) {
+          throw error;
+        } else {
+          throw e;
+        }
+      }
+    }
+    return result;
+  }
+
+  function initSizing(el) {
+    var sizing = sizingPolicy(el);
+    if (!sizing)
+      return;
+
+    var cel = document.getElementById("htmlwidget_container");
+    if (!cel)
+      return;
+
+    if (typeof(sizing.padding) !== "undefined") {
+      document.body.style.margin = "0";
+      document.body.style.padding = paddingToCss(unpackPadding(sizing.padding));
+    }
+
+    if (sizing.fill) {
+      document.body.style.overflow = "hidden";
+      document.body.style.width = "100%";
+      document.body.style.height = "100%";
+      document.documentElement.style.width = "100%";
+      document.documentElement.style.height = "100%";
+      if (cel) {
+        cel.style.position = "absolute";
+        var pad = unpackPadding(sizing.padding);
+        cel.style.top = pad.top + "px";
+        cel.style.right = pad.right + "px";
+        cel.style.bottom = pad.bottom + "px";
+        cel.style.left = pad.left + "px";
+        el.style.width = "100%";
+        el.style.height = "100%";
+      }
+
+      return {
+        getWidth: function() { return cel.offsetWidth; },
+        getHeight: function() { return cel.offsetHeight; }
+      };
+
+    } else {
+      el.style.width = px(sizing.width);
+      el.style.height = px(sizing.height);
+
+      return {
+        getWidth: function() { return el.offsetWidth; },
+        getHeight: function() { return el.offsetHeight; }
+      };
+    }
+  }
+
+  // Default implementations for methods
+  var defaults = {
+    find: function(scope) {
+      return querySelectorAll(scope, "." + this.name);
+    },
+    renderError: function(el, err) {
+      var $el = $(el);
+
+      this.clearError(el);
+
+      // Add all these error classes, as Shiny does
+      var errClass = "shiny-output-error";
+      if (err.type !== null) {
+        // use the classes of the error condition as CSS class names
+        errClass = errClass + " " + $.map(asArray(err.type), function(type) {
+          return errClass + "-" + type;
+        }).join(" ");
+      }
+      errClass = errClass + " htmlwidgets-error";
+
+      // Is el inline or block? If inline or inline-block, just display:none it
+      // and add an inline error.
+      var display = $el.css("display");
+      $el.data("restore-display-mode", display);
+
+      if (display === "inline" || display === "inline-block") {
+        $el.hide();
+        if (err.message !== "") {
+          var errorSpan = $("<span>").addClass(errClass);
+          errorSpan.text(err.message);
+          $el.after(errorSpan);
+        }
+      } else if (display === "block") {
+        // If block, add an error just after the el, set visibility:none on the
+        // el, and position the error to be on top of the el.
+        // Mark it with a unique ID and CSS class so we can remove it later.
+        $el.css("visibility", "hidden");
+        if (err.message !== "") {
+          var errorDiv = $("<div>").addClass(errClass).css("position", "absolute")
+            .css("top", el.offsetTop)
+            .css("left", el.offsetLeft)
+            // setting width can push out the page size, forcing otherwise
+            // unnecessary scrollbars to appear and making it impossible for
+            // the element to shrink; so use max-width instead
+            .css("maxWidth", el.offsetWidth)
+            .css("height", el.offsetHeight);
+          errorDiv.text(err.message);
+          $el.after(errorDiv);
+
+          // Really dumb way to keep the size/position of the error in sync with
+          // the parent element as the window is resized or whatever.
+          var intId = setInterval(function() {
+            if (!errorDiv[0].parentElement) {
+              clearInterval(intId);
+              return;
+            }
+            errorDiv
+              .css("top", el.offsetTop)
+              .css("left", el.offsetLeft)
+              .css("maxWidth", el.offsetWidth)
+              .css("height", el.offsetHeight);
+          }, 500);
+        }
+      }
+    },
+    clearError: function(el) {
+      var $el = $(el);
+      var display = $el.data("restore-display-mode");
+      $el.data("restore-display-mode", null);
+
+      if (display === "inline" || display === "inline-block") {
+        if (display)
+          $el.css("display", display);
+        $(el.nextSibling).filter(".htmlwidgets-error").remove();
+      } else if (display === "block"){
+        $el.css("visibility", "inherit");
+        $(el.nextSibling).filter(".htmlwidgets-error").remove();
+      }
+    },
+    sizing: {}
+  };
+
+  // Called by widget bindings to register a new type of widget. The definition
+  // object can contain the following properties:
+  // - name (required) - A string indicating the binding name, which will be
+  //   used by default as the CSS classname to look for.
+  // - initialize (optional) - A function(el) that will be called once per
+  //   widget element; if a value is returned, it will be passed as the third
+  //   value to renderValue.
+  // - renderValue (required) - A function(el, data, initValue) that will be
+  //   called with data. Static contexts will cause this to be called once per
+  //   element; Shiny apps will cause this to be called multiple times per
+  //   element, as the data changes.
+  window.HTMLWidgets.widget = function(definition) {
+    if (!definition.name) {
+      throw new Error("Widget must have a name");
+    }
+    if (!definition.type) {
+      throw new Error("Widget must have a type");
+    }
+    // Currently we only support output widgets
+    if (definition.type !== "output") {
+      throw new Error("Unrecognized widget type '" + definition.type + "'");
+    }
+    // TODO: Verify that .name is a valid CSS classname
+
+    // Support new-style instance-bound definitions. Old-style class-bound
+    // definitions have one widget "object" per widget per type/class of
+    // widget; the renderValue and resize methods on such widget objects
+    // take el and instance arguments, because the widget object can't
+    // store them. New-style instance-bound definitions have one widget
+    // object per widget instance; the definition that's passed in doesn't
+    // provide renderValue or resize methods at all, just the single method
+    //   factory(el, width, height)
+    // which returns an object that has renderValue(x) and resize(w, h).
+    // This enables a far more natural programming style for the widget
+    // author, who can store per-instance state using either OO-style
+    // instance fields or functional-style closure variables (I guess this
+    // is in contrast to what can only be called C-style pseudo-OO which is
+    // what we required before).
+    if (definition.factory) {
+      definition = createLegacyDefinitionAdapter(definition);
+    }
+
+    if (!definition.renderValue) {
+      throw new Error("Widget must have a renderValue function");
+    }
+
+    // For static rendering (non-Shiny), use a simple widget registration
+    // scheme. We also use this scheme for Shiny apps/documents that also
+    // contain static widgets.
+    window.HTMLWidgets.widgets = window.HTMLWidgets.widgets || [];
+    // Merge defaults into the definition; don't mutate the original definition.
+    var staticBinding = extend({}, defaults, definition);
+    overrideMethod(staticBinding, "find", function(superfunc) {
+      return function(scope) {
+        var results = superfunc(scope);
+        // Filter out Shiny outputs, we only want the static kind
+        return filterByClass(results, "html-widget-output", false);
+      };
+    });
+    window.HTMLWidgets.widgets.push(staticBinding);
+
+    if (shinyMode) {
+      // Shiny is running. Register the definition with an output binding.
+      // The definition itself will not be the output binding, instead
+      // we will make an output binding object that delegates to the
+      // definition. This is because we foolishly used the same method
+      // name (renderValue) for htmlwidgets definition and Shiny bindings
+      // but they actually have quite different semantics (the Shiny
+      // bindings receive data that includes lots of metadata that it
+      // strips off before calling htmlwidgets renderValue). We can't
+      // just ignore the difference because in some widgets it's helpful
+      // to call this.renderValue() from inside of resize(), and if
+      // we're not delegating, then that call will go to the Shiny
+      // version instead of the htmlwidgets version.
+
+      // Merge defaults with definition, without mutating either.
+      var bindingDef = extend({}, defaults, definition);
+
+      // This object will be our actual Shiny binding.
+      var shinyBinding = new Shiny.OutputBinding();
+
+      // With a few exceptions, we'll want to simply use the bindingDef's
+      // version of methods if they are available, otherwise fall back to
+      // Shiny's defaults. NOTE: If Shiny's output bindings gain additional
+      // methods in the future, and we want them to be overrideable by
+      // HTMLWidget binding definitions, then we'll need to add them to this
+      // list.
+      delegateMethod(shinyBinding, bindingDef, "getId");
+      delegateMethod(shinyBinding, bindingDef, "onValueChange");
+      delegateMethod(shinyBinding, bindingDef, "onValueError");
+      delegateMethod(shinyBinding, bindingDef, "renderError");
+      delegateMethod(shinyBinding, bindingDef, "clearError");
+      delegateMethod(shinyBinding, bindingDef, "showProgress");
+
+      // The find, renderValue, and resize are handled differently, because we
+      // want to actually decorate the behavior of the bindingDef methods.
+
+      shinyBinding.find = function(scope) {
+        var results = bindingDef.find(scope);
+
+        // Only return elements that are Shiny outputs, not static ones
+        var dynamicResults = results.filter(".html-widget-output");
+
+        // It's possible that whatever caused Shiny to think there might be
+        // new dynamic outputs, also caused there to be new static outputs.
+        // Since there might be lots of different htmlwidgets bindings, we
+        // schedule execution for later--no need to staticRender multiple
+        // times.
+        if (results.length !== dynamicResults.length)
+          scheduleStaticRender();
+
+        return dynamicResults;
+      };
+
+      // Wrap renderValue to handle initialization, which unfortunately isn't
+      // supported natively by Shiny at the time of this writing.
+
+      shinyBinding.renderValue = function(el, data) {
+        Shiny.renderDependencies(data.deps);
+        // Resolve strings marked as javascript literals to objects
+        if (!(data.evals instanceof Array)) data.evals = [data.evals];
+        for (var i = 0; data.evals && i < data.evals.length; i++) {
+          window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]);
+        }
+        if (!bindingDef.renderOnNullValue) {
+          if (data.x === null) {
+            el.style.visibility = "hidden";
+            return;
+          } else {
+            el.style.visibility = "inherit";
+          }
+        }
+        if (!elementData(el, "initialized")) {
+          initSizing(el);
+
+          elementData(el, "initialized", true);
+          if (bindingDef.initialize) {
+            var result = bindingDef.initialize(el, el.offsetWidth,
+              el.offsetHeight);
+            elementData(el, "init_result", result);
+          }
+        }
+        bindingDef.renderValue(el, data.x, elementData(el, "init_result"));
+        evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]);
+      };
+
+      // Only override resize if bindingDef implements it
+      if (bindingDef.resize) {
+        shinyBinding.resize = function(el, width, height) {
+          // Shiny can call resize before initialize/renderValue have been
+          // called, which doesn't make sense for widgets.
+          if (elementData(el, "initialized")) {
+            bindingDef.resize(el, width, height, elementData(el, "init_result"));
+          }
+        };
+      }
+
+      Shiny.outputBindings.register(shinyBinding, bindingDef.name);
+    }
+  };
+
+  var scheduleStaticRenderTimerId = null;
+  function scheduleStaticRender() {
+    if (!scheduleStaticRenderTimerId) {
+      scheduleStaticRenderTimerId = setTimeout(function() {
+        scheduleStaticRenderTimerId = null;
+        window.HTMLWidgets.staticRender();
+      }, 1);
+    }
+  }
+
+  // Render static widgets after the document finishes loading
+  // Statically render all elements that are of this widget's class
+  window.HTMLWidgets.staticRender = function() {
+    var bindings = window.HTMLWidgets.widgets || [];
+    forEach(bindings, function(binding) {
+      var matches = binding.find(document.documentElement);
+      forEach(matches, function(el) {
+        var sizeObj = initSizing(el, binding);
+
+        if (hasClass(el, "html-widget-static-bound"))
+          return;
+        el.className = el.className + " html-widget-static-bound";
+
+        var initResult;
+        if (binding.initialize) {
+          initResult = binding.initialize(el,
+            sizeObj ? sizeObj.getWidth() : el.offsetWidth,
+            sizeObj ? sizeObj.getHeight() : el.offsetHeight
+          );
+          elementData(el, "init_result", initResult);
+        }
+
+        if (binding.resize) {
+          var lastSize = {
+            w: sizeObj ? sizeObj.getWidth() : el.offsetWidth,
+            h: sizeObj ? sizeObj.getHeight() : el.offsetHeight
+          };
+          var resizeHandler = function(e) {
+            var size = {
+              w: sizeObj ? sizeObj.getWidth() : el.offsetWidth,
+              h: sizeObj ? sizeObj.getHeight() : el.offsetHeight
+            };
+            if (size.w === 0 && size.h === 0)
+              return;
+            if (size.w === lastSize.w && size.h === lastSize.h)
+              return;
+            lastSize = size;
+            binding.resize(el, size.w, size.h, initResult);
+          };
+
+          on(window, "resize", resizeHandler);
+
+          // This is needed for cases where we're running in a Shiny
+          // app, but the widget itself is not a Shiny output, but
+          // rather a simple static widget. One example of this is
+          // an rmarkdown document that has runtime:shiny and widget
+          // that isn't in a render function. Shiny only knows to
+          // call resize handlers for Shiny outputs, not for static
+          // widgets, so we do it ourselves.
+          if (window.jQuery) {
+            window.jQuery(document).on(
+              "shown.htmlwidgets shown.bs.tab.htmlwidgets shown.bs.collapse.htmlwidgets",
+              resizeHandler
+            );
+            window.jQuery(document).on(
+              "hidden.htmlwidgets hidden.bs.tab.htmlwidgets hidden.bs.collapse.htmlwidgets",
+              resizeHandler
+            );
+          }
+
+          // This is needed for the specific case of ioslides, which
+          // flips slides between display:none and display:block.
+          // Ideally we would not have to have ioslide-specific code
+          // here, but rather have ioslides raise a generic event,
+          // but the rmarkdown package just went to CRAN so the
+          // window to getting that fixed may be long.
+          if (window.addEventListener) {
+            // It's OK to limit this to window.addEventListener
+            // browsers because ioslides itself only supports
+            // such browsers.
+            on(document, "slideenter", resizeHandler);
+            on(document, "slideleave", resizeHandler);
+          }
+        }
+
+        var scriptData = document.querySelector("script[data-for='" + el.id + "'][type='application/json']");
+        if (scriptData) {
+          var data = JSON.parse(scriptData.textContent || scriptData.text);
+          // Resolve strings marked as javascript literals to objects
+          if (!(data.evals instanceof Array)) data.evals = [data.evals];
+          for (var k = 0; data.evals && k < data.evals.length; k++) {
+            window.HTMLWidgets.evaluateStringMember(data.x, data.evals[k]);
+          }
+          binding.renderValue(el, data.x, initResult);
+          evalAndRun(data.jsHooks.render, initResult, [el, data.x]);
+        }
+      });
+    });
+
+    invokePostRenderHandlers();
+  }
+
+
+  function has_jQuery3() {
+    if (!window.jQuery) {
+      return false;
+    }
+    var $version = window.jQuery.fn.jquery;
+    var $major_version = parseInt($version.split(".")[0]);
+    return $major_version >= 3;
+  }
+
+  /*
+  / Shiny 1.4 bumped jQuery from 1.x to 3.x which means jQuery's
+  / on-ready handler (i.e., $(fn)) is now asyncronous (i.e., it now
+  / really means $(setTimeout(fn)).
+  / https://jquery.com/upgrade-guide/3.0/#breaking-change-document-ready-handlers-are-now-asynchronous
+  /
+  / Since Shiny uses $() to schedule initShiny, shiny>=1.4 calls initShiny
+  / one tick later than it did before, which means staticRender() is
+  / called renderValue() earlier than (advanced) widget authors might be expecting.
+  / https://github.com/rstudio/shiny/issues/2630
+  /
+  / For a concrete example, leaflet has some methods (e.g., updateBounds)
+  / which reference Shiny methods registered in initShiny (e.g., setInputValue).
+  / Since leaflet is privy to this life-cycle, it knows to use setTimeout() to
+  / delay execution of those methods (until Shiny methods are ready)
+  / https://github.com/rstudio/leaflet/blob/18ec981/javascript/src/index.js#L266-L268
+  /
+  / Ideally widget authors wouldn't need to use this setTimeout() hack that
+  / leaflet uses to call Shiny methods on a staticRender(). In the long run,
+  / the logic initShiny should be broken up so that method registration happens
+  / right away, but binding happens later.
+  */
+  function maybeStaticRenderLater() {
+    if (shinyMode && has_jQuery3()) {
+      window.jQuery(window.HTMLWidgets.staticRender);
+    } else {
+      window.HTMLWidgets.staticRender();
+    }
+  }
+
+  if (document.addEventListener) {
+    document.addEventListener("DOMContentLoaded", function() {
+      document.removeEventListener("DOMContentLoaded", arguments.callee, false);
+      maybeStaticRenderLater();
+    }, false);
+  } else if (document.attachEvent) {
+    document.attachEvent("onreadystatechange", function() {
+      if (document.readyState === "complete") {
+        document.detachEvent("onreadystatechange", arguments.callee);
+        maybeStaticRenderLater();
+      }
+    });
+  }
+
+
+  window.HTMLWidgets.getAttachmentUrl = function(depname, key) {
+    // If no key, default to the first item
+    if (typeof(key) === "undefined")
+      key = 1;
+
+    var link = document.getElementById(depname + "-" + key + "-attachment");
+    if (!link) {
+      throw new Error("Attachment " + depname + "/" + key + " not found in document");
+    }
+    return link.getAttribute("href");
+  };
+
+  window.HTMLWidgets.dataframeToD3 = function(df) {
+    var names = [];
+    var length;
+    for (var name in df) {
+        if (df.hasOwnProperty(name))
+            names.push(name);
+        if (typeof(df[name]) !== "object" || typeof(df[name].length) === "undefined") {
+            throw new Error("All fields must be arrays");
+        } else if (typeof(length) !== "undefined" && length !== df[name].length) {
+            throw new Error("All fields must be arrays of the same length");
+        }
+        length = df[name].length;
+    }
+    var results = [];
+    var item;
+    for (var row = 0; row < length; row++) {
+        item = {};
+        for (var col = 0; col < names.length; col++) {
+            item[names[col]] = df[names[col]][row];
+        }
+        results.push(item);
+    }
+    return results;
+  };
+
+  window.HTMLWidgets.transposeArray2D = function(array) {
+      if (array.length === 0) return array;
+      var newArray = array[0].map(function(col, i) {
+          return array.map(function(row) {
+              return row[i]
+          })
+      });
+      return newArray;
+  };
+  // Split value at splitChar, but allow splitChar to be escaped
+  // using escapeChar. Any other characters escaped by escapeChar
+  // will be included as usual (including escapeChar itself).
+  function splitWithEscape(value, splitChar, escapeChar) {
+    var results = [];
+    var escapeMode = false;
+    var currentResult = "";
+    for (var pos = 0; pos < value.length; pos++) {
+      if (!escapeMode) {
+        if (value[pos] === splitChar) {
+          results.push(currentResult);
+          currentResult = "";
+        } else if (value[pos] === escapeChar) {
+          escapeMode = true;
+        } else {
+          currentResult += value[pos];
+        }
+      } else {
+        currentResult += value[pos];
+        escapeMode = false;
+      }
+    }
+    if (currentResult !== "") {
+      results.push(currentResult);
+    }
+    return results;
+  }
+  // Function authored by Yihui/JJ Allaire
+  window.HTMLWidgets.evaluateStringMember = function(o, member) {
+    var parts = splitWithEscape(member, '.', '\\');
+    for (var i = 0, l = parts.length; i < l; i++) {
+      var part = parts[i];
+      // part may be a character or 'numeric' member name
+      if (o !== null && typeof o === "object" && part in o) {
+        if (i == (l - 1)) { // if we are at the end of the line then evalulate
+          if (typeof o[part] === "string")
+            o[part] = tryEval(o[part]);
+        } else { // otherwise continue to next embedded object
+          o = o[part];
+        }
+      }
+    }
+  };
+
+  // Retrieve the HTMLWidget instance (i.e. the return value of an
+  // HTMLWidget binding's initialize() or factory() function)
+  // associated with an element, or null if none.
+  window.HTMLWidgets.getInstance = function(el) {
+    return elementData(el, "init_result");
+  };
+
+  // Finds the first element in the scope that matches the selector,
+  // and returns the HTMLWidget instance (i.e. the return value of
+  // an HTMLWidget binding's initialize() or factory() function)
+  // associated with that element, if any. If no element matches the
+  // selector, or the first matching element has no HTMLWidget
+  // instance associated with it, then null is returned.
+  //
+  // The scope argument is optional, and defaults to window.document.
+  window.HTMLWidgets.find = function(scope, selector) {
+    if (arguments.length == 1) {
+      selector = scope;
+      scope = document;
+    }
+
+    var el = scope.querySelector(selector);
+    if (el === null) {
+      return null;
+    } else {
+      return window.HTMLWidgets.getInstance(el);
+    }
+  };
+
+  // Finds all elements in the scope that match the selector, and
+  // returns the HTMLWidget instances (i.e. the return values of
+  // an HTMLWidget binding's initialize() or factory() function)
+  // associated with the elements, in an array. If elements that
+  // match the selector don't have an associated HTMLWidget
+  // instance, the returned array will contain nulls.
+  //
+  // The scope argument is optional, and defaults to window.document.
+  window.HTMLWidgets.findAll = function(scope, selector) {
+    if (arguments.length == 1) {
+      selector = scope;
+      scope = document;
+    }
+
+    var nodes = scope.querySelectorAll(selector);
+    var results = [];
+    for (var i = 0; i < nodes.length; i++) {
+      results.push(window.HTMLWidgets.getInstance(nodes[i]));
+    }
+    return results;
+  };
+
+  var postRenderHandlers = [];
+  function invokePostRenderHandlers() {
+    while (postRenderHandlers.length) {
+      var handler = postRenderHandlers.shift();
+      if (handler) {
+        handler();
+      }
+    }
+  }
+
+  // Register the given callback function to be invoked after the
+  // next time static widgets are rendered.
+  window.HTMLWidgets.addPostRenderHandler = function(callback) {
+    postRenderHandlers.push(callback);
+  };
+
+  // Takes a new-style instance-bound definition, and returns an
+  // old-style class-bound definition. This saves us from having
+  // to rewrite all the logic in this file to accomodate both
+  // types of definitions.
+  function createLegacyDefinitionAdapter(defn) {
+    var result = {
+      name: defn.name,
+      type: defn.type,
+      initialize: function(el, width, height) {
+        return defn.factory(el, width, height);
+      },
+      renderValue: function(el, x, instance) {
+        return instance.renderValue(x);
+      },
+      resize: function(el, width, height, instance) {
+        return instance.resize(width, height);
+      }
+    };
+
+    if (defn.find)
+      result.find = defn.find;
+    if (defn.renderError)
+      result.renderError = defn.renderError;
+    if (defn.clearError)
+      result.clearError = defn.clearError;
+
+    return result;
+  }
+})();
+
+</script>
+<script>/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;
+if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")
+},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
+</script>
+<script>!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.proj4=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({"./includedProjections":[function(a,b,c){var d=[a("./lib/projections/tmerc"),a("./lib/projections/utm"),a("./lib/projections/sterea"),a("./lib/projections/stere"),a("./lib/projections/somerc"),a("./lib/projections/omerc"),a("./lib/projections/lcc"),a("./lib/projections/krovak"),a("./lib/projections/cass"),a("./lib/projections/laea"),a("./lib/projections/aea"),a("./lib/projections/gnom"),a("./lib/projections/cea"),a("./lib/projections/eqc"),a("./lib/projections/poly"),a("./lib/projections/nzmg"),a("./lib/projections/mill"),a("./lib/projections/sinu"),a("./lib/projections/moll"),a("./lib/projections/eqdc"),a("./lib/projections/vandg"),a("./lib/projections/aeqd"),a("./lib/projections/ortho")];b.exports=function(proj4){d.forEach(function(a){proj4.Proj.projections.add(a)})}},{"./lib/projections/aea":40,"./lib/projections/aeqd":41,"./lib/projections/cass":42,"./lib/projections/cea":43,"./lib/projections/eqc":44,"./lib/projections/eqdc":45,"./lib/projections/gnom":47,"./lib/projections/krovak":48,"./lib/projections/laea":49,"./lib/projections/lcc":50,"./lib/projections/mill":53,"./lib/projections/moll":54,"./lib/projections/nzmg":55,"./lib/projections/omerc":56,"./lib/projections/ortho":57,"./lib/projections/poly":58,"./lib/projections/sinu":59,"./lib/projections/somerc":60,"./lib/projections/stere":61,"./lib/projections/sterea":62,"./lib/projections/tmerc":63,"./lib/projections/utm":64,"./lib/projections/vandg":65}],1:[function(a,b,c){function Point(a,b,c){if(!(this instanceof Point))return new Point(a,b,c);if(Array.isArray(a))this.x=a[0],this.y=a[1],this.z=a[2]||0;else if("object"==typeof a)this.x=a.x,this.y=a.y,this.z=a.z||0;else if("string"==typeof a&&"undefined"==typeof b){var d=a.split(",");this.x=parseFloat(d[0],10),this.y=parseFloat(d[1],10),this.z=parseFloat(d[2],10)||0}else this.x=a,this.y=b,this.z=c||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}var d=a("mgrs");Point.fromMGRS=function(a){return new Point(d.toPoint(a))},Point.prototype.toMGRS=function(a){return d.forward([this.x,this.y],a)},b.exports=Point},{mgrs:68}],2:[function(a,b,c){function Projection(a,b){if(!(this instanceof Projection))return new Projection(a);b=b||function(a){if(a)throw a};var c=d(a);if("object"!=typeof c)return void b(a);var f=g(c),h=Projection.projections.get(f.projName);h?(e(this,f),e(this,h),this.init(),b(null,this)):b(a)}var d=a("./parseCode"),e=a("./extend"),f=a("./projections"),g=a("./deriveConstants");Projection.projections=f,Projection.projections.start(),b.exports=Projection},{"./deriveConstants":33,"./extend":34,"./parseCode":37,"./projections":39}],3:[function(a,b,c){b.exports=function(a,b,c){var d,e,f,g=c.x,h=c.y,i=c.z||0;for(f=0;3>f;f++)if(!b||2!==f||void 0!==c.z)switch(0===f?(d=g,e="x"):1===f?(d=h,e="y"):(d=i,e="z"),a.axis[f]){case"e":c[e]=d;break;case"w":c[e]=-d;break;case"n":c[e]=d;break;case"s":c[e]=-d;break;case"u":void 0!==c[e]&&(c.z=d);break;case"d":void 0!==c[e]&&(c.z=-d);break;default:return null}return c}},{}],4:[function(a,b,c){var d=Math.PI/2,e=a("./sign");b.exports=function(a){return Math.abs(a)<d?a:a-e(a)*Math.PI}},{"./sign":21}],5:[function(a,b,c){var d=2*Math.PI,e=3.14159265359,f=a("./sign");b.exports=function(a){return Math.abs(a)<=e?a:a-f(a)*d}},{"./sign":21}],6:[function(a,b,c){b.exports=function(a){return Math.abs(a)>1&&(a=a>1?1:-1),Math.asin(a)}},{}],7:[function(a,b,c){b.exports=function(a){return 1-.25*a*(1+a/16*(3+1.25*a))}},{}],8:[function(a,b,c){b.exports=function(a){return.375*a*(1+.25*a*(1+.46875*a))}},{}],9:[function(a,b,c){b.exports=function(a){return.05859375*a*a*(1+.75*a)}},{}],10:[function(a,b,c){b.exports=function(a){return a*a*a*(35/3072)}},{}],11:[function(a,b,c){b.exports=function(a,b,c){var d=b*c;return a/Math.sqrt(1-d*d)}},{}],12:[function(a,b,c){b.exports=function(a,b,c,d,e){var f,g;f=a/b;for(var h=0;15>h;h++)if(g=(a-(b*f-c*Math.sin(2*f)+d*Math.sin(4*f)-e*Math.sin(6*f)))/(b-2*c*Math.cos(2*f)+4*d*Math.cos(4*f)-6*e*Math.cos(6*f)),f+=g,Math.abs(g)<=1e-10)return f;return NaN}},{}],13:[function(a,b,c){var d=Math.PI/2;b.exports=function(a,b){var c=1-(1-a*a)/(2*a)*Math.log((1-a)/(1+a));if(Math.abs(Math.abs(b)-c)<1e-6)return 0>b?-1*d:d;for(var e,f,g,h,i=Math.asin(.5*b),j=0;30>j;j++)if(f=Math.sin(i),g=Math.cos(i),h=a*f,e=Math.pow(1-h*h,2)/(2*g)*(b/(1-a*a)-f/(1-h*h)+.5/a*Math.log((1-h)/(1+h))),i+=e,Math.abs(e)<=1e-10)return i;return NaN}},{}],14:[function(a,b,c){b.exports=function(a,b,c,d,e){return a*e-b*Math.sin(2*e)+c*Math.sin(4*e)-d*Math.sin(6*e)}},{}],15:[function(a,b,c){b.exports=function(a,b,c){var d=a*b;return c/Math.sqrt(1-d*d)}},{}],16:[function(a,b,c){var d=Math.PI/2;b.exports=function(a,b){for(var c,e,f=.5*a,g=d-2*Math.atan(b),h=0;15>=h;h++)if(c=a*Math.sin(g),e=d-2*Math.atan(b*Math.pow((1-c)/(1+c),f))-g,g+=e,Math.abs(e)<=1e-10)return g;return-9999}},{}],17:[function(a,b,c){var d=1,e=.25,f=.046875,g=.01953125,h=.01068115234375,i=.75,j=.46875,k=.013020833333333334,l=.007120768229166667,m=.3645833333333333,n=.005696614583333333,o=.3076171875;b.exports=function(a){var b=[];b[0]=d-a*(e+a*(f+a*(g+a*h))),b[1]=a*(i-a*(f+a*(g+a*h)));var c=a*a;return b[2]=c*(j-a*(k+a*l)),c*=a,b[3]=c*(m-a*n),b[4]=c*a*o,b}},{}],18:[function(a,b,c){var d=a("./pj_mlfn"),e=1e-10,f=20;b.exports=function(a,b,c){for(var g=1/(1-b),h=a,i=f;i;--i){var j=Math.sin(h),k=1-b*j*j;if(k=(d(h,j,Math.cos(h),c)-a)*(k*Math.sqrt(k))*g,h-=k,Math.abs(k)<e)return h}return h}},{"./pj_mlfn":19}],19:[function(a,b,c){b.exports=function(a,b,c,d){return c*=b,b*=b,d[0]*a-c*(d[1]+b*(d[2]+b*(d[3]+b*d[4])))}},{}],20:[function(a,b,c){b.exports=function(a,b){var c;return a>1e-7?(c=a*b,(1-a*a)*(b/(1-c*c)-.5/a*Math.log((1-c)/(1+c)))):2*b}},{}],21:[function(a,b,c){b.exports=function(a){return 0>a?-1:1}},{}],22:[function(a,b,c){b.exports=function(a,b){return Math.pow((1-a)/(1+a),b)}},{}],23:[function(a,b,c){b.exports=function(a){var b={x:a[0],y:a[1]};return a.length>2&&(b.z=a[2]),a.length>3&&(b.m=a[3]),b}},{}],24:[function(a,b,c){var d=Math.PI/2;b.exports=function(a,b,c){var e=a*c,f=.5*a;return e=Math.pow((1-e)/(1+e),f),Math.tan(.5*(d-b))/e}},{}],25:[function(a,b,c){c.wgs84={towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},c.ch1903={towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},c.ggrs87={towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},c.nad83={towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},c.nad27={nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},c.potsdam={towgs84:"606.0,23.0,413.0",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},c.carthage={towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},c.hermannskogel={towgs84:"653.0,-212.0,449.0",ellipse:"bessel",datumName:"Hermannskogel"},c.ire65={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},c.rassadiran={towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},c.nzgd49={towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},c.osgb36={towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},c.s_jtsk={towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},c.beduaram={towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},c.gunung_segara={towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},c.rnb72={towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"}},{}],26:[function(a,b,c){c.MERIT={a:6378137,rf:298.257,ellipseName:"MERIT 1983"},c.SGS85={a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},c.GRS80={a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},c.IAU76={a:6378140,rf:298.257,ellipseName:"IAU 1976"},c.airy={a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},c.APL4={a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},c.NWL9D={a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},c.mod_airy={a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},c.andrae={a:6377104.43,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},c.aust_SA={a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},c.GRS67={a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},c.bessel={a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},c.bess_nam={a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},c.clrk66={a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},c.clrk80={a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},c.clrk58={a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},c.CPM={a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},c.delmbr={a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},c.engelis={a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},c.evrst30={a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},c.evrst48={a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},c.evrst56={a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},c.evrst69={a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},c.evrstSS={a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},c.fschr60={a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},c.fschr60m={a:6378155,rf:298.3,ellipseName:"Fischer 1960"},c.fschr68={a:6378150,rf:298.3,ellipseName:"Fischer 1968"},c.helmert={a:6378200,rf:298.3,ellipseName:"Helmert 1906"},c.hough={a:6378270,rf:297,ellipseName:"Hough"},c.intl={a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},c.kaula={a:6378163,rf:298.24,ellipseName:"Kaula 1961"},c.lerch={a:6378139,rf:298.257,ellipseName:"Lerch 1979"},c.mprts={a:6397300,rf:191,ellipseName:"Maupertius 1738"},c.new_intl={a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},c.plessis={a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},c.krass={a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},c.SEasia={a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},c.walbeck={a:6376896,b:6355834.8467,ellipseName:"Walbeck"},c.WGS60={a:6378165,rf:298.3,ellipseName:"WGS 60"},c.WGS66={a:6378145,rf:298.25,ellipseName:"WGS 66"},c.WGS7={a:6378135,rf:298.26,ellipseName:"WGS 72"},c.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"},c.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"}},{}],27:[function(a,b,c){c.greenwich=0,c.lisbon=-9.131906111111,c.paris=2.337229166667,c.bogota=-74.080916666667,c.madrid=-3.687938888889,c.rome=12.452333333333,c.bern=7.439583333333,c.jakarta=106.807719444444,c.ferro=-17.666666666667,c.brussels=4.367975,c.stockholm=18.058277777778,c.athens=23.7163375,c.oslo=10.722916666667},{}],28:[function(a,b,c){c.ft={to_meter:.3048},c["us-ft"]={to_meter:1200/3937}},{}],29:[function(a,b,c){function d(a,b,c){var d;return Array.isArray(c)?(d=g(a,b,c),3===c.length?[d.x,d.y,d.z]:[d.x,d.y]):g(a,b,c)}function e(a){return a instanceof f?a:a.oProj?a.oProj:f(a)}function proj4(a,b,c){a=e(a);var f,g=!1;return"undefined"==typeof b?(b=a,a=h,g=!0):("undefined"!=typeof b.x||Array.isArray(b))&&(c=b,b=a,a=h,g=!0),b=e(b),c?d(a,b,c):(f={forward:function(c){return d(a,b,c)},inverse:function(c){return d(b,a,c)}},g&&(f.oProj=b),f)}var f=a("./Proj"),g=a("./transform"),h=f("WGS84");b.exports=proj4},{"./Proj":2,"./transform":66}],30:[function(a,b,c){var d=Math.PI/2,e=1,f=2,g=3,h=4,i=5,j=484813681109536e-20,k=1.0026,l=.3826834323650898,m=function(a){return this instanceof m?(this.datum_type=h,void(a&&(a.datumCode&&"none"===a.datumCode&&(this.datum_type=i),a.datum_params&&(this.datum_params=a.datum_params.map(parseFloat),0===this.datum_params[0]&&0===this.datum_params[1]&&0===this.datum_params[2]||(this.datum_type=e),this.datum_params.length>3&&(0===this.datum_params[3]&&0===this.datum_params[4]&&0===this.datum_params[5]&&0===this.datum_params[6]||(this.datum_type=f,this.datum_params[3]*=j,this.datum_params[4]*=j,this.datum_params[5]*=j,this.datum_params[6]=this.datum_params[6]/1e6+1))),this.datum_type=a.grids?g:this.datum_type,this.a=a.a,this.b=a.b,this.es=a.es,this.ep2=a.ep2,this.datum_type===g&&(this.grids=a.grids)))):new m(a)};m.prototype={compare_datums:function(a){return this.datum_type!==a.datum_type?!1:this.a!==a.a||Math.abs(this.es-a.es)>5e-11?!1:this.datum_type===e?this.datum_params[0]===a.datum_params[0]&&this.datum_params[1]===a.datum_params[1]&&this.datum_params[2]===a.datum_params[2]:this.datum_type===f?this.datum_params[0]===a.datum_params[0]&&this.datum_params[1]===a.datum_params[1]&&this.datum_params[2]===a.datum_params[2]&&this.datum_params[3]===a.datum_params[3]&&this.datum_params[4]===a.datum_params[4]&&this.datum_params[5]===a.datum_params[5]&&this.datum_params[6]===a.datum_params[6]:this.datum_type===g||a.datum_type===g?this.nadgrids===a.nadgrids:!0},geodetic_to_geocentric:function(a){var b,c,e,f,g,h,i,j=a.x,k=a.y,l=a.z?a.z:0,m=0;if(-d>k&&k>-1.001*d)k=-d;else if(k>d&&1.001*d>k)k=d;else if(-d>k||k>d)return null;return j>Math.PI&&(j-=2*Math.PI),g=Math.sin(k),i=Math.cos(k),h=g*g,f=this.a/Math.sqrt(1-this.es*h),b=(f+l)*i*Math.cos(j),c=(f+l)*i*Math.sin(j),e=(f*(1-this.es)+l)*g,a.x=b,a.y=c,a.z=e,m},geocentric_to_geodetic:function(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t=1e-12,u=t*t,v=30,w=a.x,x=a.y,y=a.z?a.z:0;if(o=!1,b=Math.sqrt(w*w+x*x),c=Math.sqrt(w*w+x*x+y*y),b/this.a<t){if(o=!0,q=0,c/this.a<t)return r=d,void(s=-this.b)}else q=Math.atan2(x,w);e=y/c,f=b/c,g=1/Math.sqrt(1-this.es*(2-this.es)*f*f),j=f*(1-this.es)*g,k=e*g,p=0;do p++,i=this.a/Math.sqrt(1-this.es*k*k),s=b*j+y*k-i*(1-this.es*k*k),h=this.es*i/(i+s),g=1/Math.sqrt(1-h*(2-h)*f*f),l=f*(1-h)*g,m=e*g,n=m*j-l*k,j=l,k=m;while(n*n>u&&v>p);return r=Math.atan(m/Math.abs(l)),a.x=q,a.y=r,a.z=s,a},geocentric_to_geodetic_noniter:function(a){var b,c,e,f,g,h,i,j,m,n,o,p,q,r,s,t,u,v=a.x,w=a.y,x=a.z?a.z:0;if(v=parseFloat(v),w=parseFloat(w),x=parseFloat(x),u=!1,0!==v)b=Math.atan2(w,v);else if(w>0)b=d;else if(0>w)b=-d;else if(u=!0,b=0,x>0)c=d;else{if(!(0>x))return c=d,void(e=-this.b);c=-d}return g=v*v+w*w,f=Math.sqrt(g),h=x*k,j=Math.sqrt(h*h+g),n=h/j,p=f/j,o=n*n*n,i=x+this.b*this.ep2*o,t=f-this.a*this.es*p*p*p,m=Math.sqrt(i*i+t*t),q=i/m,r=t/m,s=this.a/Math.sqrt(1-this.es*q*q),e=r>=l?f/r-s:-l>=r?f/-r-s:x/q+s*(this.es-1),u===!1&&(c=Math.atan(q/r)),a.x=b,a.y=c,a.z=e,a},geocentric_to_wgs84:function(a){if(this.datum_type===e)a.x+=this.datum_params[0],a.y+=this.datum_params[1],a.z+=this.datum_params[2];else if(this.datum_type===f){var b=this.datum_params[0],c=this.datum_params[1],d=this.datum_params[2],g=this.datum_params[3],h=this.datum_params[4],i=this.datum_params[5],j=this.datum_params[6],k=j*(a.x-i*a.y+h*a.z)+b,l=j*(i*a.x+a.y-g*a.z)+c,m=j*(-h*a.x+g*a.y+a.z)+d;a.x=k,a.y=l,a.z=m}},geocentric_from_wgs84:function(a){if(this.datum_type===e)a.x-=this.datum_params[0],a.y-=this.datum_params[1],a.z-=this.datum_params[2];else if(this.datum_type===f){var b=this.datum_params[0],c=this.datum_params[1],d=this.datum_params[2],g=this.datum_params[3],h=this.datum_params[4],i=this.datum_params[5],j=this.datum_params[6],k=(a.x-b)/j,l=(a.y-c)/j,m=(a.z-d)/j;a.x=k+i*l-h*m,a.y=-i*k+l+g*m,a.z=h*k-g*l+m}}},b.exports=m},{}],31:[function(a,b,c){var d=1,e=2,f=3,g=5,h=6378137,i=.006694379990141316;b.exports=function(a,b,c){function j(a){return a===d||a===e}var k,l,m;if(a.compare_datums(b))return c;if(a.datum_type===g||b.datum_type===g)return c;var n=a.a,o=a.es,p=b.a,q=b.es,r=a.datum_type;if(r===f)if(0===this.apply_gridshift(a,0,c))a.a=h,a.es=i;else{if(!a.datum_params)return a.a=n,a.es=a.es,c;for(k=1,l=0,m=a.datum_params.length;m>l;l++)k*=a.datum_params[l];if(0===k)return a.a=n,a.es=a.es,c;r=a.datum_params.length>3?e:d}return b.datum_type===f&&(b.a=h,b.es=i),(a.es!==b.es||a.a!==b.a||j(r)||j(b.datum_type))&&(a.geodetic_to_geocentric(c),j(a.datum_type)&&a.geocentric_to_wgs84(c),j(b.datum_type)&&b.geocentric_from_wgs84(c),b.geocentric_to_geodetic(c)),b.datum_type===f&&this.apply_gridshift(b,1,c),a.a=n,a.es=o,b.a=p,b.es=q,c}},{}],32:[function(a,b,c){function d(a){var b=this;if(2===arguments.length){var c=arguments[1];"string"==typeof c?"+"===c.charAt(0)?d[a]=f(arguments[1]):d[a]=g(arguments[1]):d[a]=c}else if(1===arguments.length){if(Array.isArray(a))return a.map(function(a){Array.isArray(a)?d.apply(b,a):d(a)});if("string"==typeof a){if(a in d)return d[a]}else"EPSG"in a?d["EPSG:"+a.EPSG]=a:"ESRI"in a?d["ESRI:"+a.ESRI]=a:"IAU2000"in a?d["IAU2000:"+a.IAU2000]=a:console.log(a);return}}var e=a("./global"),f=a("./projString"),g=a("./wkt");e(d),b.exports=d},{"./global":35,"./projString":38,"./wkt":67}],33:[function(a,b,c){var d=a("./constants/Datum"),e=a("./constants/Ellipsoid"),f=a("./extend"),g=a("./datum"),h=1e-10,i=.16666666666666666,j=.04722222222222222,k=.022156084656084655;b.exports=function(a){if(a.datumCode&&"none"!==a.datumCode){var b=d[a.datumCode];b&&(a.datum_params=b.towgs84?b.towgs84.split(","):null,a.ellps=b.ellipse,a.datumName=b.datumName?b.datumName:a.datumCode)}if(!a.a){var c=e[a.ellps]?e[a.ellps]:e.WGS84;f(a,c)}return a.rf&&!a.b&&(a.b=(1-1/a.rf)*a.a),(0===a.rf||Math.abs(a.a-a.b)<h)&&(a.sphere=!0,a.b=a.a),a.a2=a.a*a.a,a.b2=a.b*a.b,a.es=(a.a2-a.b2)/a.a2,a.e=Math.sqrt(a.es),a.R_A&&(a.a*=1-a.es*(i+a.es*(j+a.es*k)),a.a2=a.a*a.a,a.b2=a.b*a.b,a.es=0),a.ep2=(a.a2-a.b2)/a.b2,a.k0||(a.k0=1),a.axis||(a.axis="enu"),a.datum||(a.datum=g(a)),a}},{"./constants/Datum":25,"./constants/Ellipsoid":26,"./datum":30,"./extend":34}],34:[function(a,b,c){b.exports=function(a,b){a=a||{};var c,d;if(!b)return a;for(d in b)c=b[d],void 0!==c&&(a[d]=c);return a}},{}],35:[function(a,b,c){b.exports=function(a){a("EPSG:4326","+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"),a("EPSG:4269","+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"),a("EPSG:3857","+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"),a.WGS84=a["EPSG:4326"],a["EPSG:3785"]=a["EPSG:3857"],a.GOOGLE=a["EPSG:3857"],a["EPSG:900913"]=a["EPSG:3857"],a["EPSG:102113"]=a["EPSG:3857"]}},{}],36:[function(a,b,c){var proj4=a("./core");proj4.defaultDatum="WGS84",proj4.Proj=a("./Proj"),proj4.WGS84=new proj4.Proj("WGS84"),proj4.Point=a("./Point"),proj4.toPoint=a("./common/toPoint"),proj4.defs=a("./defs"),proj4.transform=a("./transform"),proj4.mgrs=a("mgrs"),proj4.version=a("../package.json").version,a("./includedProjections")(proj4),b.exports=proj4},{"../package.json":69,"./Point":1,"./Proj":2,"./common/toPoint":23,"./core":29,"./defs":32,"./includedProjections":"./includedProjections","./transform":66,mgrs:68}],37:[function(a,b,c){function d(a){return"string"==typeof a}function e(a){return a in i}function f(a){var b=["GEOGCS","GEOCCS","PROJCS","LOCAL_CS"];return b.reduce(function(b,c){return b+1+a.indexOf(c)},0)}function g(a){return"+"===a[0]}function h(a){return d(a)?e(a)?i[a]:f(a)?j(a):g(a)?k(a):void 0:a}var i=a("./defs"),j=a("./wkt"),k=a("./projString");b.exports=h},{"./defs":32,"./projString":38,"./wkt":67}],38:[function(a,b,c){var d=.017453292519943295,e=a("./constants/PrimeMeridian"),f=a("./constants/units");b.exports=function(a){var b={},c={};a.split("+").map(function(a){return a.trim()}).filter(function(a){return a}).forEach(function(a){var b=a.split("=");b.push(!0),c[b[0].toLowerCase()]=b[1]});var g,h,i,j={proj:"projName",datum:"datumCode",rf:function(a){b.rf=parseFloat(a)},lat_0:function(a){b.lat0=a*d},lat_1:function(a){b.lat1=a*d},lat_2:function(a){b.lat2=a*d},lat_ts:function(a){b.lat_ts=a*d},lon_0:function(a){b.long0=a*d},lon_1:function(a){b.long1=a*d},lon_2:function(a){b.long2=a*d},alpha:function(a){b.alpha=parseFloat(a)*d},lonc:function(a){b.longc=a*d},x_0:function(a){b.x0=parseFloat(a)},y_0:function(a){b.y0=parseFloat(a)},k_0:function(a){b.k0=parseFloat(a)},k:function(a){b.k0=parseFloat(a)},a:function(a){b.a=parseFloat(a)},b:function(a){b.b=parseFloat(a)},r_a:function(){b.R_A=!0},zone:function(a){b.zone=parseInt(a,10)},south:function(){b.utmSouth=!0},towgs84:function(a){b.datum_params=a.split(",").map(function(a){return parseFloat(a)})},to_meter:function(a){b.to_meter=parseFloat(a)},units:function(a){b.units=a,f[a]&&(b.to_meter=f[a].to_meter)},from_greenwich:function(a){b.from_greenwich=a*d},pm:function(a){b.from_greenwich=(e[a]?e[a]:parseFloat(a))*d},nadgrids:function(a){"@null"===a?b.datumCode="none":b.nadgrids=a},axis:function(a){var c="ewnsud";3===a.length&&-1!==c.indexOf(a.substr(0,1))&&-1!==c.indexOf(a.substr(1,1))&&-1!==c.indexOf(a.substr(2,1))&&(b.axis=a)}};for(g in c)h=c[g],g in j?(i=j[g],"function"==typeof i?i(h):b[i]=h):b[g]=h;return"string"==typeof b.datumCode&&"WGS84"!==b.datumCode&&(b.datumCode=b.datumCode.toLowerCase()),b}},{"./constants/PrimeMeridian":27,"./constants/units":28}],39:[function(a,b,c){function d(a,b){var c=g.length;return a.names?(g[c]=a,a.names.forEach(function(a){f[a.toLowerCase()]=c}),this):(console.log(b),!0)}var e=[a("./projections/merc"),a("./projections/longlat")],f={},g=[];c.add=d,c.get=function(a){if(!a)return!1;var b=a.toLowerCase();return"undefined"!=typeof f[b]&&g[f[b]]?g[f[b]]:void 0},c.start=function(){e.forEach(d)}},{"./projections/longlat":51,"./projections/merc":52}],40:[function(a,b,c){var d=1e-10,e=a("../common/msfnz"),f=a("../common/qsfnz"),g=a("../common/adjust_lon"),h=a("../common/asinz");c.init=function(){Math.abs(this.lat1+this.lat2)<d||(this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e3=Math.sqrt(this.es),this.sin_po=Math.sin(this.lat1),this.cos_po=Math.cos(this.lat1),this.t1=this.sin_po,this.con=this.sin_po,this.ms1=e(this.e3,this.sin_po,this.cos_po),this.qs1=f(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat2),this.cos_po=Math.cos(this.lat2),this.t2=this.sin_po,this.ms2=e(this.e3,this.sin_po,this.cos_po),this.qs2=f(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat0),this.cos_po=Math.cos(this.lat0),this.t3=this.sin_po,this.qs0=f(this.e3,this.sin_po,this.cos_po),Math.abs(this.lat1-this.lat2)>d?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},c.forward=function(a){var b=a.x,c=a.y;this.sin_phi=Math.sin(c),this.cos_phi=Math.cos(c);var d=f(this.e3,this.sin_phi,this.cos_phi),e=this.a*Math.sqrt(this.c-this.ns0*d)/this.ns0,h=this.ns0*g(b-this.long0),i=e*Math.sin(h)+this.x0,j=this.rh-e*Math.cos(h)+this.y0;return a.x=i,a.y=j,a},c.inverse=function(a){var b,c,d,e,f,h;return a.x-=this.x0,a.y=this.rh-a.y+this.y0,this.ns0>=0?(b=Math.sqrt(a.x*a.x+a.y*a.y),d=1):(b=-Math.sqrt(a.x*a.x+a.y*a.y),d=-1),e=0,0!==b&&(e=Math.atan2(d*a.x,d*a.y)),d=b*this.ns0/this.a,this.sphere?h=Math.asin((this.c-d*d)/(2*this.ns0)):(c=(this.c-d*d)/this.ns0,h=this.phi1z(this.e3,c)),f=g(e/this.ns0+this.long0),a.x=f,a.y=h,a},c.phi1z=function(a,b){var c,e,f,g,i,j=h(.5*b);if(d>a)return j;for(var k=a*a,l=1;25>=l;l++)if(c=Math.sin(j),e=Math.cos(j),f=a*c,g=1-f*f,i=.5*g*g/e*(b/(1-k)-c/g+.5/a*Math.log((1-f)/(1+f))),j+=i,Math.abs(i)<=1e-7)return j;return null},c.names=["Albers_Conic_Equal_Area","Albers","aea"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/msfnz":15,"../common/qsfnz":20}],41:[function(a,b,c){var d=a("../common/adjust_lon"),e=Math.PI/2,f=1e-10,g=a("../common/mlfn"),h=a("../common/e0fn"),i=a("../common/e1fn"),j=a("../common/e2fn"),k=a("../common/e3fn"),l=a("../common/gN"),m=a("../common/asinz"),n=a("../common/imlfn");c.init=function(){this.sin_p12=Math.sin(this.lat0),this.cos_p12=Math.cos(this.lat0)},c.forward=function(a){var b,c,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H=a.x,I=a.y,J=Math.sin(a.y),K=Math.cos(a.y),L=d(H-this.long0);return this.sphere?Math.abs(this.sin_p12-1)<=f?(a.x=this.x0+this.a*(e-I)*Math.sin(L),a.y=this.y0-this.a*(e-I)*Math.cos(L),a):Math.abs(this.sin_p12+1)<=f?(a.x=this.x0+this.a*(e+I)*Math.sin(L),a.y=this.y0+this.a*(e+I)*Math.cos(L),a):(B=this.sin_p12*J+this.cos_p12*K*Math.cos(L),z=Math.acos(B),A=z/Math.sin(z),a.x=this.x0+this.a*A*K*Math.sin(L),a.y=this.y0+this.a*A*(this.cos_p12*J-this.sin_p12*K*Math.cos(L)),a):(b=h(this.es),c=i(this.es),m=j(this.es),n=k(this.es),Math.abs(this.sin_p12-1)<=f?(o=this.a*g(b,c,m,n,e),p=this.a*g(b,c,m,n,I),a.x=this.x0+(o-p)*Math.sin(L),a.y=this.y0-(o-p)*Math.cos(L),a):Math.abs(this.sin_p12+1)<=f?(o=this.a*g(b,c,m,n,e),p=this.a*g(b,c,m,n,I),a.x=this.x0+(o+p)*Math.sin(L),a.y=this.y0+(o+p)*Math.cos(L),a):(q=J/K,r=l(this.a,this.e,this.sin_p12),s=l(this.a,this.e,J),t=Math.atan((1-this.es)*q+this.es*r*this.sin_p12/(s*K)),u=Math.atan2(Math.sin(L),this.cos_p12*Math.tan(t)-this.sin_p12*Math.cos(L)),C=0===u?Math.asin(this.cos_p12*Math.sin(t)-this.sin_p12*Math.cos(t)):Math.abs(Math.abs(u)-Math.PI)<=f?-Math.asin(this.cos_p12*Math.sin(t)-this.sin_p12*Math.cos(t)):Math.asin(Math.sin(L)*Math.cos(t)/Math.sin(u)),v=this.e*this.sin_p12/Math.sqrt(1-this.es),w=this.e*this.cos_p12*Math.cos(u)/Math.sqrt(1-this.es),x=v*w,y=w*w,D=C*C,E=D*C,F=E*C,G=F*C,z=r*C*(1-D*y*(1-y)/6+E/8*x*(1-2*y)+F/120*(y*(4-7*y)-3*v*v*(1-7*y))-G/48*x),a.x=this.x0+z*Math.sin(u),a.y=this.y0+z*Math.cos(u),a))},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I;if(this.sphere){if(b=Math.sqrt(a.x*a.x+a.y*a.y),b>2*e*this.a)return;return c=b/this.a,o=Math.sin(c),p=Math.cos(c),q=this.long0,Math.abs(b)<=f?r=this.lat0:(r=m(p*this.sin_p12+a.y*o*this.cos_p12/b),s=Math.abs(this.lat0)-e,q=d(Math.abs(s)<=f?this.lat0>=0?this.long0+Math.atan2(a.x,-a.y):this.long0-Math.atan2(-a.x,a.y):this.long0+Math.atan2(a.x*o,b*this.cos_p12*p-a.y*this.sin_p12*o))),a.x=q,a.y=r,a}return t=h(this.es),u=i(this.es),v=j(this.es),w=k(this.es),Math.abs(this.sin_p12-1)<=f?(x=this.a*g(t,u,v,w,e),b=Math.sqrt(a.x*a.x+a.y*a.y),y=x-b,r=n(y/this.a,t,u,v,w),q=d(this.long0+Math.atan2(a.x,-1*a.y)),a.x=q,a.y=r,a):Math.abs(this.sin_p12+1)<=f?(x=this.a*g(t,u,v,w,e),b=Math.sqrt(a.x*a.x+a.y*a.y),y=b-x,r=n(y/this.a,t,u,v,w),q=d(this.long0+Math.atan2(a.x,a.y)),a.x=q,a.y=r,a):(b=Math.sqrt(a.x*a.x+a.y*a.y),B=Math.atan2(a.x,a.y),z=l(this.a,this.e,this.sin_p12),C=Math.cos(B),D=this.e*this.cos_p12*C,E=-D*D/(1-this.es),F=3*this.es*(1-E)*this.sin_p12*this.cos_p12*C/(1-this.es),G=b/z,H=G-E*(1+E)*Math.pow(G,3)/6-F*(1+3*E)*Math.pow(G,4)/24,I=1-E*H*H/2-G*H*H*H/6,A=Math.asin(this.sin_p12*Math.cos(H)+this.cos_p12*Math.sin(H)*C),q=d(this.long0+Math.asin(Math.sin(B)*Math.sin(H)/Math.cos(A))),r=Math.atan((1-this.es*I*this.sin_p12/Math.sin(A))*Math.tan(A)/(1-this.es)),a.x=q,a.y=r,a)},c.names=["Azimuthal_Equidistant","aeqd"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/imlfn":12,"../common/mlfn":14}],42:[function(a,b,c){var d=a("../common/mlfn"),e=a("../common/e0fn"),f=a("../common/e1fn"),g=a("../common/e2fn"),h=a("../common/e3fn"),i=a("../common/gN"),j=a("../common/adjust_lon"),k=a("../common/adjust_lat"),l=a("../common/imlfn"),m=Math.PI/2,n=1e-10;c.init=function(){this.sphere||(this.e0=e(this.es),this.e1=f(this.es),this.e2=g(this.es),this.e3=h(this.es),this.ml0=this.a*d(this.e0,this.e1,this.e2,this.e3,this.lat0))},c.forward=function(a){var b,c,e=a.x,f=a.y;if(e=j(e-this.long0),this.sphere)b=this.a*Math.asin(Math.cos(f)*Math.sin(e)),c=this.a*(Math.atan2(Math.tan(f),Math.cos(e))-this.lat0);else{var g=Math.sin(f),h=Math.cos(f),k=i(this.a,this.e,g),l=Math.tan(f)*Math.tan(f),m=e*Math.cos(f),n=m*m,o=this.es*h*h/(1-this.es),p=this.a*d(this.e0,this.e1,this.e2,this.e3,f);b=k*m*(1-n*l*(1/6-(8-l+8*o)*n/120)),c=p-this.ml0+k*g/h*n*(.5+(5-l+6*o)*n/24)}return a.x=b+this.x0,a.y=c+this.y0,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,d=a.x/this.a,e=a.y/this.a;if(this.sphere){var f=e+this.lat0;b=Math.asin(Math.sin(f)*Math.cos(d)),c=Math.atan2(Math.tan(d),Math.cos(f))}else{var g=this.ml0/this.a+e,h=l(g,this.e0,this.e1,this.e2,this.e3);if(Math.abs(Math.abs(h)-m)<=n)return a.x=this.long0,a.y=m,0>e&&(a.y*=-1),a;var o=i(this.a,this.e,Math.sin(h)),p=o*o*o/this.a/this.a*(1-this.es),q=Math.pow(Math.tan(h),2),r=d*this.a/o,s=r*r;b=h-o*Math.tan(h)/p*r*r*(.5-(1+3*q)*r*r/24),c=r*(1-s*(q/3+(1+3*q)*q*s/15))/Math.cos(h)}return a.x=j(c+this.long0),a.y=k(b),a},c.names=["Cassini","Cassini_Soldner","cass"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/imlfn":12,"../common/mlfn":14}],43:[function(a,b,c){var d=a("../common/adjust_lon"),e=a("../common/qsfnz"),f=a("../common/msfnz"),g=a("../common/iqsfnz");c.init=function(){this.sphere||(this.k0=f(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},c.forward=function(a){var b,c,f=a.x,g=a.y,h=d(f-this.long0);if(this.sphere)b=this.x0+this.a*h*Math.cos(this.lat_ts),c=this.y0+this.a*Math.sin(g)/Math.cos(this.lat_ts);else{var i=e(this.e,Math.sin(g));b=this.x0+this.a*this.k0*h,c=this.y0+this.a*i*.5/this.k0}return a.x=b,a.y=c,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c;return this.sphere?(b=d(this.long0+a.x/this.a/Math.cos(this.lat_ts)),c=Math.asin(a.y/this.a*Math.cos(this.lat_ts))):(c=g(this.e,2*a.y*this.k0/this.a),b=d(this.long0+a.x/(this.a*this.k0))),a.x=b,a.y=c,a},c.names=["cea"]},{"../common/adjust_lon":5,"../common/iqsfnz":13,"../common/msfnz":15,"../common/qsfnz":20}],44:[function(a,b,c){var d=a("../common/adjust_lon"),e=a("../common/adjust_lat");c.init=function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},c.forward=function(a){var b=a.x,c=a.y,f=d(b-this.long0),g=e(c-this.lat0);return a.x=this.x0+this.a*f*this.rc,a.y=this.y0+this.a*g,a},c.inverse=function(a){var b=a.x,c=a.y;return a.x=d(this.long0+(b-this.x0)/(this.a*this.rc)),a.y=e(this.lat0+(c-this.y0)/this.a),a},c.names=["Equirectangular","Equidistant_Cylindrical","eqc"]},{"../common/adjust_lat":4,"../common/adjust_lon":5}],45:[function(a,b,c){var d=a("../common/e0fn"),e=a("../common/e1fn"),f=a("../common/e2fn"),g=a("../common/e3fn"),h=a("../common/msfnz"),i=a("../common/mlfn"),j=a("../common/adjust_lon"),k=a("../common/adjust_lat"),l=a("../common/imlfn"),m=1e-10;c.init=function(){Math.abs(this.lat1+this.lat2)<m||(this.lat2=this.lat2||this.lat1,this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=d(this.es),this.e1=e(this.es),this.e2=f(this.es),this.e3=g(this.es),this.sinphi=Math.sin(this.lat1),this.cosphi=Math.cos(this.lat1),this.ms1=h(this.e,this.sinphi,this.cosphi),this.ml1=i(this.e0,this.e1,this.e2,this.e3,this.lat1),Math.abs(this.lat1-this.lat2)<m?this.ns=this.sinphi:(this.sinphi=Math.sin(this.lat2),this.cosphi=Math.cos(this.lat2),this.ms2=h(this.e,this.sinphi,this.cosphi),this.ml2=i(this.e0,this.e1,this.e2,this.e3,this.lat2),this.ns=(this.ms1-this.ms2)/(this.ml2-this.ml1)),this.g=this.ml1+this.ms1/this.ns,this.ml0=i(this.e0,this.e1,this.e2,this.e3,this.lat0),this.rh=this.a*(this.g-this.ml0))},c.forward=function(a){var b,c=a.x,d=a.y;if(this.sphere)b=this.a*(this.g-d);else{var e=i(this.e0,this.e1,this.e2,this.e3,d);b=this.a*(this.g-e)}var f=this.ns*j(c-this.long0),g=this.x0+b*Math.sin(f),h=this.y0+this.rh-b*Math.cos(f);return a.x=g,a.y=h,a},c.inverse=function(a){a.x-=this.x0,a.y=this.rh-a.y+this.y0;var b,c,d,e;this.ns>=0?(c=Math.sqrt(a.x*a.x+a.y*a.y),
+b=1):(c=-Math.sqrt(a.x*a.x+a.y*a.y),b=-1);var f=0;if(0!==c&&(f=Math.atan2(b*a.x,b*a.y)),this.sphere)return e=j(this.long0+f/this.ns),d=k(this.g-c/this.a),a.x=e,a.y=d,a;var g=this.g-c/this.a;return d=l(g,this.e0,this.e1,this.e2,this.e3),e=j(this.long0+f/this.ns),a.x=e,a.y=d,a},c.names=["Equidistant_Conic","eqdc"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/imlfn":12,"../common/mlfn":14,"../common/msfnz":15}],46:[function(a,b,c){var d=Math.PI/4,e=a("../common/srat"),f=Math.PI/2,g=20;c.init=function(){var a=Math.sin(this.lat0),b=Math.cos(this.lat0);b*=b,this.rc=Math.sqrt(1-this.es)/(1-this.es*a*a),this.C=Math.sqrt(1+this.es*b*b/(1-this.es)),this.phic0=Math.asin(a/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+d)/(Math.pow(Math.tan(.5*this.lat0+d),this.C)*e(this.e*a,this.ratexp))},c.forward=function(a){var b=a.x,c=a.y;return a.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*c+d),this.C)*e(this.e*Math.sin(c),this.ratexp))-f,a.x=this.C*b,a},c.inverse=function(a){for(var b=1e-14,c=a.x/this.C,h=a.y,i=Math.pow(Math.tan(.5*h+d)/this.K,1/this.C),j=g;j>0&&(h=2*Math.atan(i*e(this.e*Math.sin(a.y),-.5*this.e))-f,!(Math.abs(h-a.y)<b));--j)a.y=h;return j?(a.x=c,a.y=h,a):null},c.names=["gauss"]},{"../common/srat":22}],47:[function(a,b,c){var d=a("../common/adjust_lon"),e=1e-10,f=a("../common/asinz");c.init=function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0),this.infinity_dist=1e3*this.a,this.rc=1},c.forward=function(a){var b,c,f,g,h,i,j,k,l=a.x,m=a.y;return f=d(l-this.long0),b=Math.sin(m),c=Math.cos(m),g=Math.cos(f),i=this.sin_p14*b+this.cos_p14*c*g,h=1,i>0||Math.abs(i)<=e?(j=this.x0+this.a*h*c*Math.sin(f)/i,k=this.y0+this.a*h*(this.cos_p14*b-this.sin_p14*c*g)/i):(j=this.x0+this.infinity_dist*c*Math.sin(f),k=this.y0+this.infinity_dist*(this.cos_p14*b-this.sin_p14*c*g)),a.x=j,a.y=k,a},c.inverse=function(a){var b,c,e,g,h,i;return a.x=(a.x-this.x0)/this.a,a.y=(a.y-this.y0)/this.a,a.x/=this.k0,a.y/=this.k0,(b=Math.sqrt(a.x*a.x+a.y*a.y))?(g=Math.atan2(b,this.rc),c=Math.sin(g),e=Math.cos(g),i=f(e*this.sin_p14+a.y*c*this.cos_p14/b),h=Math.atan2(a.x*c,b*this.cos_p14*e-a.y*this.sin_p14*c),h=d(this.long0+h)):(i=this.phic0,h=0),a.x=h,a.y=i,a},c.names=["gnom"]},{"../common/adjust_lon":5,"../common/asinz":6}],48:[function(a,b,c){var d=a("../common/adjust_lon");c.init=function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},c.forward=function(a){var b,c,e,f,g,h,i,j=a.x,k=a.y,l=d(j-this.long0);return b=Math.pow((1+this.e*Math.sin(k))/(1-this.e*Math.sin(k)),this.alfa*this.e/2),c=2*(Math.atan(this.k*Math.pow(Math.tan(k/2+this.s45),this.alfa)/b)-this.s45),e=-l*this.alfa,f=Math.asin(Math.cos(this.ad)*Math.sin(c)+Math.sin(this.ad)*Math.cos(c)*Math.cos(e)),g=Math.asin(Math.cos(c)*Math.sin(e)/Math.cos(f)),h=this.n*g,i=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(f/2+this.s45),this.n),a.y=i*Math.cos(h)/1,a.x=i*Math.sin(h)/1,this.czech||(a.y*=-1,a.x*=-1),a},c.inverse=function(a){var b,c,d,e,f,g,h,i,j=a.x;a.x=a.y,a.y=j,this.czech||(a.y*=-1,a.x*=-1),g=Math.sqrt(a.x*a.x+a.y*a.y),f=Math.atan2(a.y,a.x),e=f/Math.sin(this.s0),d=2*(Math.atan(Math.pow(this.ro0/g,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),b=Math.asin(Math.cos(this.ad)*Math.sin(d)-Math.sin(this.ad)*Math.cos(d)*Math.cos(e)),c=Math.asin(Math.cos(d)*Math.sin(e)/Math.cos(b)),a.x=this.long0-c/this.alfa,h=b,i=0;var k=0;do a.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(b/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(h))/(1-this.e*Math.sin(h)),this.e/2))-this.s45),Math.abs(h-a.y)<1e-10&&(i=1),h=a.y,k+=1;while(0===i&&15>k);return k>=15?null:a},c.names=["Krovak","krovak"]},{"../common/adjust_lon":5}],49:[function(a,b,c){var d=Math.PI/2,e=Math.PI/4,f=1e-10,g=a("../common/qsfnz"),h=a("../common/adjust_lon");c.S_POLE=1,c.N_POLE=2,c.EQUIT=3,c.OBLIQ=4,c.init=function(){var a=Math.abs(this.lat0);if(Math.abs(a-d)<f?this.mode=this.lat0<0?this.S_POLE:this.N_POLE:Math.abs(a)<f?this.mode=this.EQUIT:this.mode=this.OBLIQ,this.es>0){var b;switch(this.qp=g(this.e,1),this.mmf=.5/(1-this.es),this.apa=this.authset(this.es),this.mode){case this.N_POLE:this.dd=1;break;case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),b=Math.sin(this.lat0),this.sinb1=g(this.e,b)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*b*b)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},c.forward=function(a){var b,c,i,j,k,l,m,n,o,p,q=a.x,r=a.y;if(q=h(q-this.long0),this.sphere){if(k=Math.sin(r),p=Math.cos(r),i=Math.cos(q),this.mode===this.OBLIQ||this.mode===this.EQUIT){if(c=this.mode===this.EQUIT?1+p*i:1+this.sinph0*k+this.cosph0*p*i,f>=c)return null;c=Math.sqrt(2/c),b=c*p*Math.sin(q),c*=this.mode===this.EQUIT?k:this.cosph0*k-this.sinph0*p*i}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(i=-i),Math.abs(r+this.phi0)<f)return null;c=e-.5*r,c=2*(this.mode===this.S_POLE?Math.cos(c):Math.sin(c)),b=c*Math.sin(q),c*=i}}else{switch(m=0,n=0,o=0,i=Math.cos(q),j=Math.sin(q),k=Math.sin(r),l=g(this.e,k),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(m=l/this.qp,n=Math.sqrt(1-m*m)),this.mode){case this.OBLIQ:o=1+this.sinb1*m+this.cosb1*n*i;break;case this.EQUIT:o=1+n*i;break;case this.N_POLE:o=d+r,l=this.qp-l;break;case this.S_POLE:o=r-d,l=this.qp+l}if(Math.abs(o)<f)return null;switch(this.mode){case this.OBLIQ:case this.EQUIT:o=Math.sqrt(2/o),c=this.mode===this.OBLIQ?this.ymf*o*(this.cosb1*m-this.sinb1*n*i):(o=Math.sqrt(2/(1+n*i)))*m*this.ymf,b=this.xmf*o*n*j;break;case this.N_POLE:case this.S_POLE:l>=0?(b=(o=Math.sqrt(l))*j,c=i*(this.mode===this.S_POLE?o:-o)):b=c=0}}return a.x=this.a*b+this.x0,a.y=this.a*c+this.y0,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,e,g,i,j,k,l=a.x/this.a,m=a.y/this.a;if(this.sphere){var n,o=0,p=0;if(n=Math.sqrt(l*l+m*m),c=.5*n,c>1)return null;switch(c=2*Math.asin(c),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(p=Math.sin(c),o=Math.cos(c)),this.mode){case this.EQUIT:c=Math.abs(n)<=f?0:Math.asin(m*p/n),l*=p,m=o*n;break;case this.OBLIQ:c=Math.abs(n)<=f?this.phi0:Math.asin(o*this.sinph0+m*p*this.cosph0/n),l*=p*this.cosph0,m=(o-Math.sin(c)*this.sinph0)*n;break;case this.N_POLE:m=-m,c=d-c;break;case this.S_POLE:c-=d}b=0!==m||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(l,m):0}else{if(k=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(l/=this.dd,m*=this.dd,j=Math.sqrt(l*l+m*m),f>j)return a.x=0,a.y=this.phi0,a;g=2*Math.asin(.5*j/this.rq),e=Math.cos(g),l*=g=Math.sin(g),this.mode===this.OBLIQ?(k=e*this.sinb1+m*g*this.cosb1/j,i=this.qp*k,m=j*this.cosb1*e-m*this.sinb1*g):(k=m*g/j,i=this.qp*k,m=j*e)}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(m=-m),i=l*l+m*m,!i)return a.x=0,a.y=this.phi0,a;k=1-i/this.qp,this.mode===this.S_POLE&&(k=-k)}b=Math.atan2(l,m),c=this.authlat(Math.asin(k),this.apa)}return a.x=h(this.long0+b),a.y=c,a},c.P00=.3333333333333333,c.P01=.17222222222222222,c.P02=.10257936507936508,c.P10=.06388888888888888,c.P11=.0664021164021164,c.P20=.016415012942191543,c.authset=function(a){var b,c=[];return c[0]=a*this.P00,b=a*a,c[0]+=b*this.P01,c[1]=b*this.P10,b*=a,c[0]+=b*this.P02,c[1]+=b*this.P11,c[2]=b*this.P20,c},c.authlat=function(a,b){var c=a+a;return a+b[0]*Math.sin(c)+b[1]*Math.sin(c+c)+b[2]*Math.sin(c+c+c)},c.names=["Lambert Azimuthal Equal Area","Lambert_Azimuthal_Equal_Area","laea"]},{"../common/adjust_lon":5,"../common/qsfnz":20}],50:[function(a,b,c){var d=1e-10,e=a("../common/msfnz"),f=a("../common/tsfnz"),g=Math.PI/2,h=a("../common/sign"),i=a("../common/adjust_lon"),j=a("../common/phi2z");c.init=function(){if(this.lat2||(this.lat2=this.lat1),this.k0||(this.k0=1),this.x0=this.x0||0,this.y0=this.y0||0,!(Math.abs(this.lat1+this.lat2)<d)){var a=this.b/this.a;this.e=Math.sqrt(1-a*a);var b=Math.sin(this.lat1),c=Math.cos(this.lat1),g=e(this.e,b,c),h=f(this.e,this.lat1,b),i=Math.sin(this.lat2),j=Math.cos(this.lat2),k=e(this.e,i,j),l=f(this.e,this.lat2,i),m=f(this.e,this.lat0,Math.sin(this.lat0));Math.abs(this.lat1-this.lat2)>d?this.ns=Math.log(g/k)/Math.log(h/l):this.ns=b,isNaN(this.ns)&&(this.ns=b),this.f0=g/(this.ns*Math.pow(h,this.ns)),this.rh=this.a*this.f0*Math.pow(m,this.ns),this.title||(this.title="Lambert Conformal Conic")}},c.forward=function(a){var b=a.x,c=a.y;Math.abs(2*Math.abs(c)-Math.PI)<=d&&(c=h(c)*(g-2*d));var e,j,k=Math.abs(Math.abs(c)-g);if(k>d)e=f(this.e,c,Math.sin(c)),j=this.a*this.f0*Math.pow(e,this.ns);else{if(k=c*this.ns,0>=k)return null;j=0}var l=this.ns*i(b-this.long0);return a.x=this.k0*(j*Math.sin(l))+this.x0,a.y=this.k0*(this.rh-j*Math.cos(l))+this.y0,a},c.inverse=function(a){var b,c,d,e,f,h=(a.x-this.x0)/this.k0,k=this.rh-(a.y-this.y0)/this.k0;this.ns>0?(b=Math.sqrt(h*h+k*k),c=1):(b=-Math.sqrt(h*h+k*k),c=-1);var l=0;if(0!==b&&(l=Math.atan2(c*h,c*k)),0!==b||this.ns>0){if(c=1/this.ns,d=Math.pow(b/(this.a*this.f0),c),e=j(this.e,d),-9999===e)return null}else e=-g;return f=i(l/this.ns+this.long0),a.x=f,a.y=e,a},c.names=["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_2SP","lcc"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/sign":21,"../common/tsfnz":24}],51:[function(a,b,c){function d(a){return a}c.init=function(){},c.forward=d,c.inverse=d,c.names=["longlat","identity"]},{}],52:[function(a,b,c){var d=a("../common/msfnz"),e=Math.PI/2,f=1e-10,g=57.29577951308232,h=a("../common/adjust_lon"),i=Math.PI/4,j=a("../common/tsfnz"),k=a("../common/phi2z");c.init=function(){var a=this.b/this.a;this.es=1-a*a,"x0"in this||(this.x0=0),"y0"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.sphere?this.k0=Math.cos(this.lat_ts):this.k0=d(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k?this.k0=this.k:this.k0=1)},c.forward=function(a){var b=a.x,c=a.y;if(c*g>90&&-90>c*g&&b*g>180&&-180>b*g)return null;var d,k;if(Math.abs(Math.abs(c)-e)<=f)return null;if(this.sphere)d=this.x0+this.a*this.k0*h(b-this.long0),k=this.y0+this.a*this.k0*Math.log(Math.tan(i+.5*c));else{var l=Math.sin(c),m=j(this.e,c,l);d=this.x0+this.a*this.k0*h(b-this.long0),k=this.y0-this.a*this.k0*Math.log(m)}return a.x=d,a.y=k,a},c.inverse=function(a){var b,c,d=a.x-this.x0,f=a.y-this.y0;if(this.sphere)c=e-2*Math.atan(Math.exp(-f/(this.a*this.k0)));else{var g=Math.exp(-f/(this.a*this.k0));if(c=k(this.e,g),-9999===c)return null}return b=h(this.long0+d/(this.a*this.k0)),a.x=b,a.y=c,a},c.names=["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/tsfnz":24}],53:[function(a,b,c){var d=a("../common/adjust_lon");c.init=function(){},c.forward=function(a){var b=a.x,c=a.y,e=d(b-this.long0),f=this.x0+this.a*e,g=this.y0+this.a*Math.log(Math.tan(Math.PI/4+c/2.5))*1.25;return a.x=f,a.y=g,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b=d(this.long0+a.x/this.a),c=2.5*(Math.atan(Math.exp(.8*a.y/this.a))-Math.PI/4);return a.x=b,a.y=c,a},c.names=["Miller_Cylindrical","mill"]},{"../common/adjust_lon":5}],54:[function(a,b,c){var d=a("../common/adjust_lon"),e=1e-10;c.init=function(){},c.forward=function(a){for(var b=a.x,c=a.y,f=d(b-this.long0),g=c,h=Math.PI*Math.sin(c),i=0;!0;i++){var j=-(g+Math.sin(g)-h)/(1+Math.cos(g));if(g+=j,Math.abs(j)<e)break}g/=2,Math.PI/2-Math.abs(c)<e&&(f=0);var k=.900316316158*this.a*f*Math.cos(g)+this.x0,l=1.4142135623731*this.a*Math.sin(g)+this.y0;return a.x=k,a.y=l,a},c.inverse=function(a){var b,c;a.x-=this.x0,a.y-=this.y0,c=a.y/(1.4142135623731*this.a),Math.abs(c)>.999999999999&&(c=.999999999999),b=Math.asin(c);var e=d(this.long0+a.x/(.900316316158*this.a*Math.cos(b)));e<-Math.PI&&(e=-Math.PI),e>Math.PI&&(e=Math.PI),c=(2*b+Math.sin(2*b))/Math.PI,Math.abs(c)>1&&(c=1);var f=Math.asin(c);return a.x=e,a.y=f,a},c.names=["Mollweide","moll"]},{"../common/adjust_lon":5}],55:[function(a,b,c){var d=484813681109536e-20;c.iterations=1,c.init=function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},c.forward=function(a){var b,c=a.x,e=a.y,f=e-this.lat0,g=c-this.long0,h=f/d*1e-5,i=g,j=1,k=0;for(b=1;10>=b;b++)j*=h,k+=this.A[b]*j;var l,m,n=k,o=i,p=1,q=0,r=0,s=0;for(b=1;6>=b;b++)l=p*n-q*o,m=q*n+p*o,p=l,q=m,r=r+this.B_re[b]*p-this.B_im[b]*q,s=s+this.B_im[b]*p+this.B_re[b]*q;return a.x=s*this.a+this.x0,a.y=r*this.a+this.y0,a},c.inverse=function(a){var b,c,e,f=a.x,g=a.y,h=f-this.x0,i=g-this.y0,j=i/this.a,k=h/this.a,l=1,m=0,n=0,o=0;for(b=1;6>=b;b++)c=l*j-m*k,e=m*j+l*k,l=c,m=e,n=n+this.C_re[b]*l-this.C_im[b]*m,o=o+this.C_im[b]*l+this.C_re[b]*m;for(var p=0;p<this.iterations;p++){var q,r,s=n,t=o,u=j,v=k;for(b=2;6>=b;b++)q=s*n-t*o,r=t*n+s*o,s=q,t=r,u+=(b-1)*(this.B_re[b]*s-this.B_im[b]*t),v+=(b-1)*(this.B_im[b]*s+this.B_re[b]*t);s=1,t=0;var w=this.B_re[1],x=this.B_im[1];for(b=2;6>=b;b++)q=s*n-t*o,r=t*n+s*o,s=q,t=r,w+=b*(this.B_re[b]*s-this.B_im[b]*t),x+=b*(this.B_im[b]*s+this.B_re[b]*t);var y=w*w+x*x;n=(u*w+v*x)/y,o=(v*w-u*x)/y}var z=n,A=o,B=1,C=0;for(b=1;9>=b;b++)B*=z,C+=this.D[b]*B;var D=this.lat0+C*d*1e5,E=this.long0+A;return a.x=E,a.y=D,a},c.names=["New_Zealand_Map_Grid","nzmg"]},{}],56:[function(a,b,c){var d=a("../common/tsfnz"),e=a("../common/adjust_lon"),f=a("../common/phi2z"),g=Math.PI/2,h=Math.PI/4,i=1e-10;c.init=function(){this.no_off=this.no_off||!1,this.no_rot=this.no_rot||!1,isNaN(this.k0)&&(this.k0=1);var a=Math.sin(this.lat0),b=Math.cos(this.lat0),c=this.e*a;this.bl=Math.sqrt(1+this.es/(1-this.es)*Math.pow(b,4)),this.al=this.a*this.bl*this.k0*Math.sqrt(1-this.es)/(1-c*c);var f=d(this.e,this.lat0,a),g=this.bl/b*Math.sqrt((1-this.es)/(1-c*c));1>g*g&&(g=1);var h,i;if(isNaN(this.longc)){var j=d(this.e,this.lat1,Math.sin(this.lat1)),k=d(this.e,this.lat2,Math.sin(this.lat2));this.lat0>=0?this.el=(g+Math.sqrt(g*g-1))*Math.pow(f,this.bl):this.el=(g-Math.sqrt(g*g-1))*Math.pow(f,this.bl);var l=Math.pow(j,this.bl),m=Math.pow(k,this.bl);h=this.el/l,i=.5*(h-1/h);var n=(this.el*this.el-m*l)/(this.el*this.el+m*l),o=(m-l)/(m+l),p=e(this.long1-this.long2);this.long0=.5*(this.long1+this.long2)-Math.atan(n*Math.tan(.5*this.bl*p)/o)/this.bl,this.long0=e(this.long0);var q=e(this.long1-this.long0);this.gamma0=Math.atan(Math.sin(this.bl*q)/i),this.alpha=Math.asin(g*Math.sin(this.gamma0))}else h=this.lat0>=0?g+Math.sqrt(g*g-1):g-Math.sqrt(g*g-1),this.el=h*Math.pow(f,this.bl),i=.5*(h-1/h),this.gamma0=Math.asin(Math.sin(this.alpha)/g),this.long0=this.longc-Math.asin(i*Math.tan(this.gamma0))/this.bl;this.no_off?this.uc=0:this.lat0>=0?this.uc=this.al/this.bl*Math.atan2(Math.sqrt(g*g-1),Math.cos(this.alpha)):this.uc=-1*this.al/this.bl*Math.atan2(Math.sqrt(g*g-1),Math.cos(this.alpha))},c.forward=function(a){var b,c,f,j=a.x,k=a.y,l=e(j-this.long0);if(Math.abs(Math.abs(k)-g)<=i)f=k>0?-1:1,c=this.al/this.bl*Math.log(Math.tan(h+f*this.gamma0*.5)),b=-1*f*g*this.al/this.bl;else{var m=d(this.e,k,Math.sin(k)),n=this.el/Math.pow(m,this.bl),o=.5*(n-1/n),p=.5*(n+1/n),q=Math.sin(this.bl*l),r=(o*Math.sin(this.gamma0)-q*Math.cos(this.gamma0))/p;c=Math.abs(Math.abs(r)-1)<=i?Number.POSITIVE_INFINITY:.5*this.al*Math.log((1-r)/(1+r))/this.bl,b=Math.abs(Math.cos(this.bl*l))<=i?this.al*this.bl*l:this.al*Math.atan2(o*Math.cos(this.gamma0)+q*Math.sin(this.gamma0),Math.cos(this.bl*l))/this.bl}return this.no_rot?(a.x=this.x0+b,a.y=this.y0+c):(b-=this.uc,a.x=this.x0+c*Math.cos(this.alpha)+b*Math.sin(this.alpha),a.y=this.y0+b*Math.cos(this.alpha)-c*Math.sin(this.alpha)),a},c.inverse=function(a){var b,c;this.no_rot?(c=a.y-this.y0,b=a.x-this.x0):(c=(a.x-this.x0)*Math.cos(this.alpha)-(a.y-this.y0)*Math.sin(this.alpha),b=(a.y-this.y0)*Math.cos(this.alpha)+(a.x-this.x0)*Math.sin(this.alpha),b+=this.uc);var d=Math.exp(-1*this.bl*c/this.al),h=.5*(d-1/d),j=.5*(d+1/d),k=Math.sin(this.bl*b/this.al),l=(k*Math.cos(this.gamma0)+h*Math.sin(this.gamma0))/j,m=Math.pow(this.el/Math.sqrt((1+l)/(1-l)),1/this.bl);return Math.abs(l-1)<i?(a.x=this.long0,a.y=g):Math.abs(l+1)<i?(a.x=this.long0,a.y=-1*g):(a.y=f(this.e,m),a.x=e(this.long0-Math.atan2(h*Math.cos(this.gamma0)-k*Math.sin(this.gamma0),Math.cos(this.bl*b/this.al))/this.bl)),a},c.names=["Hotine_Oblique_Mercator","Hotine Oblique Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin","Hotine_Oblique_Mercator_Azimuth_Center","omerc"]},{"../common/adjust_lon":5,"../common/phi2z":16,"../common/tsfnz":24}],57:[function(a,b,c){var d=a("../common/adjust_lon"),e=1e-10,f=a("../common/asinz"),g=Math.PI/2;c.init=function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},c.forward=function(a){var b,c,f,g,h,i,j,k,l=a.x,m=a.y;return f=d(l-this.long0),b=Math.sin(m),c=Math.cos(m),g=Math.cos(f),i=this.sin_p14*b+this.cos_p14*c*g,h=1,(i>0||Math.abs(i)<=e)&&(j=this.a*h*c*Math.sin(f),k=this.y0+this.a*h*(this.cos_p14*b-this.sin_p14*c*g)),a.x=j,a.y=k,a},c.inverse=function(a){var b,c,h,i,j,k,l;return a.x-=this.x0,a.y-=this.y0,b=Math.sqrt(a.x*a.x+a.y*a.y),c=f(b/this.a),h=Math.sin(c),i=Math.cos(c),k=this.long0,Math.abs(b)<=e?(l=this.lat0,a.x=k,a.y=l,a):(l=f(i*this.sin_p14+a.y*h*this.cos_p14/b),j=Math.abs(this.lat0)-g,Math.abs(j)<=e?(k=d(this.lat0>=0?this.long0+Math.atan2(a.x,-a.y):this.long0-Math.atan2(-a.x,a.y)),a.x=k,a.y=l,a):(k=d(this.long0+Math.atan2(a.x*h,b*this.cos_p14*i-a.y*this.sin_p14*h)),a.x=k,a.y=l,a))},c.names=["ortho"]},{"../common/adjust_lon":5,"../common/asinz":6}],58:[function(a,b,c){var d=a("../common/e0fn"),e=a("../common/e1fn"),f=a("../common/e2fn"),g=a("../common/e3fn"),h=a("../common/adjust_lon"),i=a("../common/adjust_lat"),j=a("../common/mlfn"),k=1e-10,l=a("../common/gN"),m=20;c.init=function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=d(this.es),this.e1=e(this.es),this.e2=f(this.es),this.e3=g(this.es),this.ml0=this.a*j(this.e0,this.e1,this.e2,this.e3,this.lat0)},c.forward=function(a){var b,c,d,e=a.x,f=a.y,g=h(e-this.long0);if(d=g*Math.sin(f),this.sphere)Math.abs(f)<=k?(b=this.a*g,c=-1*this.a*this.lat0):(b=this.a*Math.sin(d)/Math.tan(f),c=this.a*(i(f-this.lat0)+(1-Math.cos(d))/Math.tan(f)));else if(Math.abs(f)<=k)b=this.a*g,c=-1*this.ml0;else{var m=l(this.a,this.e,Math.sin(f))/Math.tan(f);b=m*Math.sin(d),c=this.a*j(this.e0,this.e1,this.e2,this.e3,f)-this.ml0+m*(1-Math.cos(d))}return a.x=b+this.x0,a.y=c+this.y0,a},c.inverse=function(a){var b,c,d,e,f,g,i,l,n;if(d=a.x-this.x0,e=a.y-this.y0,this.sphere)if(Math.abs(e+this.a*this.lat0)<=k)b=h(d/this.a+this.long0),c=0;else{g=this.lat0+e/this.a,i=d*d/this.a/this.a+g*g,l=g;var o;for(f=m;f;--f)if(o=Math.tan(l),n=-1*(g*(l*o+1)-l-.5*(l*l+i)*o)/((l-g)/o-1),l+=n,Math.abs(n)<=k){c=l;break}b=h(this.long0+Math.asin(d*Math.tan(l)/this.a)/Math.sin(c))}else if(Math.abs(e+this.ml0)<=k)c=0,b=h(this.long0+d/this.a);else{g=(this.ml0+e)/this.a,i=d*d/this.a/this.a+g*g,l=g;var p,q,r,s,t;for(f=m;f;--f)if(t=this.e*Math.sin(l),p=Math.sqrt(1-t*t)*Math.tan(l),q=this.a*j(this.e0,this.e1,this.e2,this.e3,l),r=this.e0-2*this.e1*Math.cos(2*l)+4*this.e2*Math.cos(4*l)-6*this.e3*Math.cos(6*l),s=q/this.a,n=(g*(p*s+1)-s-.5*p*(s*s+i))/(this.es*Math.sin(2*l)*(s*s+i-2*g*s)/(4*p)+(g-s)*(p*r-2/Math.sin(2*l))-r),l-=n,Math.abs(n)<=k){c=l;break}p=Math.sqrt(1-this.es*Math.pow(Math.sin(c),2))*Math.tan(c),b=h(this.long0+Math.asin(d*p/this.a)/Math.sin(c))}return a.x=b,a.y=c,a},c.names=["Polyconic","poly"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/mlfn":14}],59:[function(a,b,c){var d=a("../common/adjust_lon"),e=a("../common/adjust_lat"),f=a("../common/pj_enfn"),g=20,h=a("../common/pj_mlfn"),i=a("../common/pj_inv_mlfn"),j=Math.PI/2,k=1e-10,l=a("../common/asinz");c.init=function(){this.sphere?(this.n=1,this.m=0,this.es=0,this.C_y=Math.sqrt((this.m+1)/this.n),this.C_x=this.C_y/(this.m+1)):this.en=f(this.es)},c.forward=function(a){var b,c,e=a.x,f=a.y;if(e=d(e-this.long0),this.sphere){if(this.m)for(var i=this.n*Math.sin(f),j=g;j;--j){var l=(this.m*f+Math.sin(f)-i)/(this.m+Math.cos(f));if(f-=l,Math.abs(l)<k)break}else f=1!==this.n?Math.asin(this.n*Math.sin(f)):f;b=this.a*this.C_x*e*(this.m+Math.cos(f)),c=this.a*this.C_y*f}else{var m=Math.sin(f),n=Math.cos(f);c=this.a*h(f,m,n,this.en),b=this.a*e*n/Math.sqrt(1-this.es*m*m)}return a.x=b,a.y=c,a},c.inverse=function(a){var b,c,f,g;return a.x-=this.x0,f=a.x/this.a,a.y-=this.y0,b=a.y/this.a,this.sphere?(b/=this.C_y,f/=this.C_x*(this.m+Math.cos(b)),this.m?b=l((this.m*b+Math.sin(b))/this.n):1!==this.n&&(b=l(Math.sin(b)/this.n)),f=d(f+this.long0),b=e(b)):(b=i(a.y/this.a,this.es,this.en),g=Math.abs(b),j>g?(g=Math.sin(b),c=this.long0+a.x*Math.sqrt(1-this.es*g*g)/(this.a*Math.cos(b)),f=d(c)):j>g-k&&(f=this.long0)),a.x=f,a.y=b,a},c.names=["Sinusoidal","sinu"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/asinz":6,"../common/pj_enfn":17,"../common/pj_inv_mlfn":18,"../common/pj_mlfn":19}],60:[function(a,b,c){c.init=function(){var a=this.lat0;this.lambda0=this.long0;var b=Math.sin(a),c=this.a,d=this.rf,e=1/d,f=2*e-Math.pow(e,2),g=this.e=Math.sqrt(f);this.R=this.k0*c*Math.sqrt(1-f)/(1-f*Math.pow(b,2)),this.alpha=Math.sqrt(1+f/(1-f)*Math.pow(Math.cos(a),4)),this.b0=Math.asin(b/this.alpha);var h=Math.log(Math.tan(Math.PI/4+this.b0/2)),i=Math.log(Math.tan(Math.PI/4+a/2)),j=Math.log((1+g*b)/(1-g*b));this.K=h-this.alpha*i+this.alpha*g/2*j},c.forward=function(a){var b=Math.log(Math.tan(Math.PI/4-a.y/2)),c=this.e/2*Math.log((1+this.e*Math.sin(a.y))/(1-this.e*Math.sin(a.y))),d=-this.alpha*(b+c)+this.K,e=2*(Math.atan(Math.exp(d))-Math.PI/4),f=this.alpha*(a.x-this.lambda0),g=Math.atan(Math.sin(f)/(Math.sin(this.b0)*Math.tan(e)+Math.cos(this.b0)*Math.cos(f))),h=Math.asin(Math.cos(this.b0)*Math.sin(e)-Math.sin(this.b0)*Math.cos(e)*Math.cos(f));return a.y=this.R/2*Math.log((1+Math.sin(h))/(1-Math.sin(h)))+this.y0,a.x=this.R*g+this.x0,a},c.inverse=function(a){for(var b=a.x-this.x0,c=a.y-this.y0,d=b/this.R,e=2*(Math.atan(Math.exp(c/this.R))-Math.PI/4),f=Math.asin(Math.cos(this.b0)*Math.sin(e)+Math.sin(this.b0)*Math.cos(e)*Math.cos(d)),g=Math.atan(Math.sin(d)/(Math.cos(this.b0)*Math.cos(d)-Math.sin(this.b0)*Math.tan(e))),h=this.lambda0+g/this.alpha,i=0,j=f,k=-1e3,l=0;Math.abs(j-k)>1e-7;){if(++l>20)return;i=1/this.alpha*(Math.log(Math.tan(Math.PI/4+f/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(j))/2)),k=j,j=2*Math.atan(Math.exp(i))-Math.PI/2}return a.x=h,a.y=j,a},c.names=["somerc"]},{}],61:[function(a,b,c){var d=Math.PI/2,e=1e-10,f=a("../common/sign"),g=a("../common/msfnz"),h=a("../common/tsfnz"),i=a("../common/phi2z"),j=a("../common/adjust_lon");c.ssfn_=function(a,b,c){return b*=c,Math.tan(.5*(d+a))*Math.pow((1-b)/(1+b),.5*c)},c.init=function(){this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=e&&(this.k0=.5*(1+f(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=e&&(this.lat0>0?this.con=1:this.con=-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=e&&(this.k0=.5*this.cons*g(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/h(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=g(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-d,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},c.forward=function(a){var b,c,f,g,i,k,l=a.x,m=a.y,n=Math.sin(m),o=Math.cos(m),p=j(l-this.long0);return Math.abs(Math.abs(l-this.long0)-Math.PI)<=e&&Math.abs(m+this.lat0)<=e?(a.x=NaN,a.y=NaN,a):this.sphere?(b=2*this.k0/(1+this.sinlat0*n+this.coslat0*o*Math.cos(p)),a.x=this.a*b*o*Math.sin(p)+this.x0,a.y=this.a*b*(this.coslat0*n-this.sinlat0*o*Math.cos(p))+this.y0,a):(c=2*Math.atan(this.ssfn_(m,n,this.e))-d,g=Math.cos(c),f=Math.sin(c),Math.abs(this.coslat0)<=e?(i=h(this.e,m*this.con,this.con*n),k=2*this.a*this.k0*i/this.cons,a.x=this.x0+k*Math.sin(l-this.long0),a.y=this.y0-this.con*k*Math.cos(l-this.long0),a):(Math.abs(this.sinlat0)<e?(b=2*this.a*this.k0/(1+g*Math.cos(p)),a.y=b*f):(b=2*this.a*this.k0*this.ms1/(this.cosX0*(1+this.sinX0*f+this.cosX0*g*Math.cos(p))),a.y=b*(this.cosX0*f-this.sinX0*g*Math.cos(p))+this.y0),a.x=b*g*Math.sin(p)+this.x0,a))},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,f,g,h,k=Math.sqrt(a.x*a.x+a.y*a.y);if(this.sphere){var l=2*Math.atan(k/(.5*this.a*this.k0));return b=this.long0,c=this.lat0,e>=k?(a.x=b,a.y=c,a):(c=Math.asin(Math.cos(l)*this.sinlat0+a.y*Math.sin(l)*this.coslat0/k),b=j(Math.abs(this.coslat0)<e?this.lat0>0?this.long0+Math.atan2(a.x,-1*a.y):this.long0+Math.atan2(a.x,a.y):this.long0+Math.atan2(a.x*Math.sin(l),k*this.coslat0*Math.cos(l)-a.y*this.sinlat0*Math.sin(l))),a.x=b,a.y=c,a)}if(Math.abs(this.coslat0)<=e){if(e>=k)return c=this.lat0,b=this.long0,a.x=b,a.y=c,a;a.x*=this.con,a.y*=this.con,f=k*this.cons/(2*this.a*this.k0),c=this.con*i(this.e,f),b=this.con*j(this.con*this.long0+Math.atan2(a.x,-1*a.y))}else g=2*Math.atan(k*this.cosX0/(2*this.a*this.k0*this.ms1)),b=this.long0,e>=k?h=this.X0:(h=Math.asin(Math.cos(g)*this.sinX0+a.y*Math.sin(g)*this.cosX0/k),b=j(this.long0+Math.atan2(a.x*Math.sin(g),k*this.cosX0*Math.cos(g)-a.y*this.sinX0*Math.sin(g)))),c=-1*i(this.e,Math.tan(.5*(d+h)));return a.x=b,a.y=c,a},c.names=["stere","Stereographic_South_Pole","Polar Stereographic (variant B)"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/sign":21,"../common/tsfnz":24}],62:[function(a,b,c){var d=a("./gauss"),e=a("../common/adjust_lon");c.init=function(){d.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},c.forward=function(a){var b,c,f,g;return a.x=e(a.x-this.long0),d.forward.apply(this,[a]),b=Math.sin(a.y),c=Math.cos(a.y),f=Math.cos(a.x),g=this.k0*this.R2/(1+this.sinc0*b+this.cosc0*c*f),a.x=g*c*Math.sin(a.x),a.y=g*(this.cosc0*b-this.sinc0*c*f),a.x=this.a*a.x+this.x0,a.y=this.a*a.y+this.y0,a},c.inverse=function(a){var b,c,f,g,h;if(a.x=(a.x-this.x0)/this.a,a.y=(a.y-this.y0)/this.a,a.x/=this.k0,a.y/=this.k0,h=Math.sqrt(a.x*a.x+a.y*a.y)){var i=2*Math.atan2(h,this.R2);b=Math.sin(i),c=Math.cos(i),g=Math.asin(c*this.sinc0+a.y*b*this.cosc0/h),f=Math.atan2(a.x*b,h*this.cosc0*c-a.y*this.sinc0*b)}else g=this.phic0,f=0;return a.x=f,a.y=g,d.inverse.apply(this,[a]),a.x=e(a.x+this.long0),a},c.names=["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative"]},{"../common/adjust_lon":5,"./gauss":46}],63:[function(a,b,c){var d=a("../common/e0fn"),e=a("../common/e1fn"),f=a("../common/e2fn"),g=a("../common/e3fn"),h=a("../common/mlfn"),i=a("../common/adjust_lon"),j=Math.PI/2,k=1e-10,l=a("../common/sign"),m=a("../common/asinz");c.init=function(){this.e0=d(this.es),this.e1=e(this.es),this.e2=f(this.es),this.e3=g(this.es),this.ml0=this.a*h(this.e0,this.e1,this.e2,this.e3,this.lat0)},c.forward=function(a){var b,c,d,e=a.x,f=a.y,g=i(e-this.long0),j=Math.sin(f),k=Math.cos(f);if(this.sphere){var l=k*Math.sin(g);if(Math.abs(Math.abs(l)-1)<1e-10)return 93;c=.5*this.a*this.k0*Math.log((1+l)/(1-l)),b=Math.acos(k*Math.cos(g)/Math.sqrt(1-l*l)),0>f&&(b=-b),d=this.a*this.k0*(b-this.lat0)}else{var m=k*g,n=Math.pow(m,2),o=this.ep2*Math.pow(k,2),p=Math.tan(f),q=Math.pow(p,2);b=1-this.es*Math.pow(j,2);var r=this.a/Math.sqrt(b),s=this.a*h(this.e0,this.e1,this.e2,this.e3,f);c=this.k0*r*m*(1+n/6*(1-q+o+n/20*(5-18*q+Math.pow(q,2)+72*o-58*this.ep2)))+this.x0,d=this.k0*(s-this.ml0+r*p*(n*(.5+n/24*(5-q+9*o+4*Math.pow(o,2)+n/30*(61-58*q+Math.pow(q,2)+600*o-330*this.ep2)))))+this.y0}return a.x=c,a.y=d,a},c.inverse=function(a){var b,c,d,e,f,g,h=6;if(this.sphere){var n=Math.exp(a.x/(this.a*this.k0)),o=.5*(n-1/n),p=this.lat0+a.y/(this.a*this.k0),q=Math.cos(p);b=Math.sqrt((1-q*q)/(1+o*o)),f=m(b),0>p&&(f=-f),g=0===o&&0===q?this.long0:i(Math.atan2(o,q)+this.long0)}else{var r=a.x-this.x0,s=a.y-this.y0;for(b=(this.ml0+s/this.k0)/this.a,c=b,e=0;!0&&(d=(b+this.e1*Math.sin(2*c)-this.e2*Math.sin(4*c)+this.e3*Math.sin(6*c))/this.e0-c,c+=d,!(Math.abs(d)<=k));e++)if(e>=h)return 95;if(Math.abs(c)<j){var t=Math.sin(c),u=Math.cos(c),v=Math.tan(c),w=this.ep2*Math.pow(u,2),x=Math.pow(w,2),y=Math.pow(v,2),z=Math.pow(y,2);b=1-this.es*Math.pow(t,2);var A=this.a/Math.sqrt(b),B=A*(1-this.es)/b,C=r/(A*this.k0),D=Math.pow(C,2);f=c-A*v*D/B*(.5-D/24*(5+3*y+10*w-4*x-9*this.ep2-D/30*(61+90*y+298*w+45*z-252*this.ep2-3*x))),g=i(this.long0+C*(1-D/6*(1+2*y+w-D/20*(5-2*w+28*y-3*x+8*this.ep2+24*z)))/u)}else f=j*l(s),g=this.long0}return a.x=g,a.y=f,a},c.names=["Transverse_Mercator","Transverse Mercator","tmerc"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/mlfn":14,"../common/sign":21}],64:[function(a,b,c){var d=.017453292519943295,e=a("./tmerc");c.dependsOn="tmerc",c.init=function(){this.zone&&(this.lat0=0,this.long0=(6*Math.abs(this.zone)-183)*d,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,e.init.apply(this),this.forward=e.forward,this.inverse=e.inverse)},c.names=["Universal Transverse Mercator System","utm"]},{"./tmerc":63}],65:[function(a,b,c){var d=a("../common/adjust_lon"),e=Math.PI/2,f=1e-10,g=a("../common/asinz");c.init=function(){this.R=this.a},c.forward=function(a){var b,c,h=a.x,i=a.y,j=d(h-this.long0);Math.abs(i)<=f&&(b=this.x0+this.R*j,c=this.y0);var k=g(2*Math.abs(i/Math.PI));(Math.abs(j)<=f||Math.abs(Math.abs(i)-e)<=f)&&(b=this.x0,c=i>=0?this.y0+Math.PI*this.R*Math.tan(.5*k):this.y0+Math.PI*this.R*-Math.tan(.5*k));var l=.5*Math.abs(Math.PI/j-j/Math.PI),m=l*l,n=Math.sin(k),o=Math.cos(k),p=o/(n+o-1),q=p*p,r=p*(2/n-1),s=r*r,t=Math.PI*this.R*(l*(p-s)+Math.sqrt(m*(p-s)*(p-s)-(s+m)*(q-s)))/(s+m);0>j&&(t=-t),b=this.x0+t;var u=m+p;return t=Math.PI*this.R*(r*u-l*Math.sqrt((s+m)*(m+1)-u*u))/(s+m),c=i>=0?this.y0+t:this.y0-t,a.x=b,a.y=c,a},c.inverse=function(a){var b,c,e,g,h,i,j,k,l,m,n,o,p;return a.x-=this.x0,a.y-=this.y0,n=Math.PI*this.R,e=a.x/n,g=a.y/n,h=e*e+g*g,i=-Math.abs(g)*(1+h),
+j=i-2*g*g+e*e,k=-2*i+1+2*g*g+h*h,p=g*g/k+(2*j*j*j/k/k/k-9*i*j/k/k)/27,l=(i-j*j/3/k)/k,m=2*Math.sqrt(-l/3),n=3*p/l/m,Math.abs(n)>1&&(n=n>=0?1:-1),o=Math.acos(n)/3,c=a.y>=0?(-m*Math.cos(o+Math.PI/3)-j/3/k)*Math.PI:-(-m*Math.cos(o+Math.PI/3)-j/3/k)*Math.PI,b=Math.abs(e)<f?this.long0:d(this.long0+Math.PI*(h-1+Math.sqrt(1+2*(e*e-g*g)+h*h))/2/e),a.x=b,a.y=c,a},c.names=["Van_der_Grinten_I","VanDerGrinten","vandg"]},{"../common/adjust_lon":5,"../common/asinz":6}],66:[function(a,b,c){var d=.017453292519943295,e=57.29577951308232,f=1,g=2,h=a("./datum_transform"),i=a("./adjust_axis"),j=a("./Proj"),k=a("./common/toPoint");b.exports=function l(a,b,c){function m(a,b){return(a.datum.datum_type===f||a.datum.datum_type===g)&&"WGS84"!==b.datumCode}var n;return Array.isArray(c)&&(c=k(c)),a.datum&&b.datum&&(m(a,b)||m(b,a))&&(n=new j("WGS84"),l(a,n,c),a=n),"enu"!==a.axis&&i(a,!1,c),"longlat"===a.projName?(c.x*=d,c.y*=d):(a.to_meter&&(c.x*=a.to_meter,c.y*=a.to_meter),a.inverse(c)),a.from_greenwich&&(c.x+=a.from_greenwich),c=h(a.datum,b.datum,c),b.from_greenwich&&(c.x-=b.from_greenwich),"longlat"===b.projName?(c.x*=e,c.y*=e):(b.forward(c),b.to_meter&&(c.x/=b.to_meter,c.y/=b.to_meter)),"enu"!==b.axis&&i(b,!0,c),c}},{"./Proj":2,"./adjust_axis":3,"./common/toPoint":23,"./datum_transform":31}],67:[function(a,b,c){function d(a,b,c){a[b]=c.map(function(a){var b={};return e(a,b),b}).reduce(function(a,b){return j(a,b)},{})}function e(a,b){var c;return Array.isArray(a)?(c=a.shift(),"PARAMETER"===c&&(c=a.shift()),1===a.length?Array.isArray(a[0])?(b[c]={},e(a[0],b[c])):b[c]=a[0]:a.length?"TOWGS84"===c?b[c]=a:(b[c]={},["UNIT","PRIMEM","VERT_DATUM"].indexOf(c)>-1?(b[c]={name:a[0].toLowerCase(),convert:a[1]},3===a.length&&(b[c].auth=a[2])):"SPHEROID"===c?(b[c]={name:a[0],a:a[1],rf:a[2]},4===a.length&&(b[c].auth=a[3])):["GEOGCS","GEOCCS","DATUM","VERT_CS","COMPD_CS","LOCAL_CS","FITTED_CS","LOCAL_DATUM"].indexOf(c)>-1?(a[0]=["name",a[0]],d(b,c,a)):a.every(function(a){return Array.isArray(a)})?d(b,c,a):e(a,b[c])):b[c]=!0,void 0):void(b[a]=!0)}function f(a,b){var c=b[0],d=b[1];!(c in a)&&d in a&&(a[c]=a[d],3===b.length&&(a[c]=b[2](a[c])))}function g(a){return a*i}function h(a){function b(b){var c=a.to_meter||1;return parseFloat(b,10)*c}"GEOGCS"===a.type?a.projName="longlat":"LOCAL_CS"===a.type?(a.projName="identity",a.local=!0):"object"==typeof a.PROJECTION?a.projName=Object.keys(a.PROJECTION)[0]:a.projName=a.PROJECTION,a.UNIT&&(a.units=a.UNIT.name.toLowerCase(),"metre"===a.units&&(a.units="meter"),a.UNIT.convert&&("GEOGCS"===a.type?a.DATUM&&a.DATUM.SPHEROID&&(a.to_meter=parseFloat(a.UNIT.convert,10)*a.DATUM.SPHEROID.a):a.to_meter=parseFloat(a.UNIT.convert,10))),a.GEOGCS&&(a.GEOGCS.DATUM?a.datumCode=a.GEOGCS.DATUM.name.toLowerCase():a.datumCode=a.GEOGCS.name.toLowerCase(),"d_"===a.datumCode.slice(0,2)&&(a.datumCode=a.datumCode.slice(2)),"new_zealand_geodetic_datum_1949"!==a.datumCode&&"new_zealand_1949"!==a.datumCode||(a.datumCode="nzgd49"),"wgs_1984"===a.datumCode&&("Mercator_Auxiliary_Sphere"===a.PROJECTION&&(a.sphere=!0),a.datumCode="wgs84"),"_ferro"===a.datumCode.slice(-6)&&(a.datumCode=a.datumCode.slice(0,-6)),"_jakarta"===a.datumCode.slice(-8)&&(a.datumCode=a.datumCode.slice(0,-8)),~a.datumCode.indexOf("belge")&&(a.datumCode="rnb72"),a.GEOGCS.DATUM&&a.GEOGCS.DATUM.SPHEROID&&(a.ellps=a.GEOGCS.DATUM.SPHEROID.name.replace("_19","").replace(/[Cc]larke\_18/,"clrk"),"international"===a.ellps.toLowerCase().slice(0,13)&&(a.ellps="intl"),a.a=a.GEOGCS.DATUM.SPHEROID.a,a.rf=parseFloat(a.GEOGCS.DATUM.SPHEROID.rf,10)),~a.datumCode.indexOf("osgb_1936")&&(a.datumCode="osgb36")),a.b&&!isFinite(a.b)&&(a.b=a.a);var c=function(b){return f(a,b)},d=[["standard_parallel_1","Standard_Parallel_1"],["standard_parallel_2","Standard_Parallel_2"],["false_easting","False_Easting"],["false_northing","False_Northing"],["central_meridian","Central_Meridian"],["latitude_of_origin","Latitude_Of_Origin"],["latitude_of_origin","Central_Parallel"],["scale_factor","Scale_Factor"],["k0","scale_factor"],["latitude_of_center","Latitude_of_center"],["lat0","latitude_of_center",g],["longitude_of_center","Longitude_Of_Center"],["longc","longitude_of_center",g],["x0","false_easting",b],["y0","false_northing",b],["long0","central_meridian",g],["lat0","latitude_of_origin",g],["lat0","standard_parallel_1",g],["lat1","standard_parallel_1",g],["lat2","standard_parallel_2",g],["alpha","azimuth",g],["srsCode","name"]];d.forEach(c),a.long0||!a.longc||"Albers_Conic_Equal_Area"!==a.projName&&"Lambert_Azimuthal_Equal_Area"!==a.projName||(a.long0=a.longc),a.lat_ts||!a.lat1||"Stereographic_South_Pole"!==a.projName&&"Polar Stereographic (variant B)"!==a.projName||(a.lat0=g(a.lat1>0?90:-90),a.lat_ts=a.lat1)}var i=.017453292519943295,j=a("./extend");b.exports=function(a,b){var c=JSON.parse((","+a).replace(/\s*\,\s*([A-Z_0-9]+?)(\[)/g,',["$1",').slice(1).replace(/\s*\,\s*([A-Z_0-9]+?)\]/g,',"$1"]').replace(/,\["VERTCS".+/,"")),d=c.shift(),f=c.shift();c.unshift(["name",f]),c.unshift(["type",d]),c.unshift("output");var g={};return e(c,g),h(g.output),j(b,g.output)}},{"./extend":34}],68:[function(a,b,c){function d(a){return a*(Math.PI/180)}function e(a){return 180*(a/Math.PI)}function f(a){var b,c,e,f,g,i,j,k,l,m=a.lat,n=a.lon,o=6378137,p=.00669438,q=.9996,r=d(m),s=d(n);l=Math.floor((n+180)/6)+1,180===n&&(l=60),m>=56&&64>m&&n>=3&&12>n&&(l=32),m>=72&&84>m&&(n>=0&&9>n?l=31:n>=9&&21>n?l=33:n>=21&&33>n?l=35:n>=33&&42>n&&(l=37)),b=6*(l-1)-180+3,k=d(b),c=p/(1-p),e=o/Math.sqrt(1-p*Math.sin(r)*Math.sin(r)),f=Math.tan(r)*Math.tan(r),g=c*Math.cos(r)*Math.cos(r),i=Math.cos(r)*(s-k),j=o*((1-p/4-3*p*p/64-5*p*p*p/256)*r-(3*p/8+3*p*p/32+45*p*p*p/1024)*Math.sin(2*r)+(15*p*p/256+45*p*p*p/1024)*Math.sin(4*r)-35*p*p*p/3072*Math.sin(6*r));var t=q*e*(i+(1-f+g)*i*i*i/6+(5-18*f+f*f+72*g-58*c)*i*i*i*i*i/120)+5e5,u=q*(j+e*Math.tan(r)*(i*i/2+(5-f+9*g+4*g*g)*i*i*i*i/24+(61-58*f+f*f+600*g-330*c)*i*i*i*i*i*i/720));return 0>m&&(u+=1e7),{northing:Math.round(u),easting:Math.round(t),zoneNumber:l,zoneLetter:h(m)}}function g(a){var b=a.northing,c=a.easting,d=a.zoneLetter,f=a.zoneNumber;if(0>f||f>60)return null;var h,i,j,k,l,m,n,o,p,q,r=.9996,s=6378137,t=.00669438,u=(1-Math.sqrt(1-t))/(1+Math.sqrt(1-t)),v=c-5e5,w=b;"N">d&&(w-=1e7),o=6*(f-1)-180+3,h=t/(1-t),n=w/r,p=n/(s*(1-t/4-3*t*t/64-5*t*t*t/256)),q=p+(3*u/2-27*u*u*u/32)*Math.sin(2*p)+(21*u*u/16-55*u*u*u*u/32)*Math.sin(4*p)+151*u*u*u/96*Math.sin(6*p),i=s/Math.sqrt(1-t*Math.sin(q)*Math.sin(q)),j=Math.tan(q)*Math.tan(q),k=h*Math.cos(q)*Math.cos(q),l=s*(1-t)/Math.pow(1-t*Math.sin(q)*Math.sin(q),1.5),m=v/(i*r);var x=q-i*Math.tan(q)/l*(m*m/2-(5+3*j+10*k-4*k*k-9*h)*m*m*m*m/24+(61+90*j+298*k+45*j*j-252*h-3*k*k)*m*m*m*m*m*m/720);x=e(x);var y=(m-(1+2*j+k)*m*m*m/6+(5-2*k+28*j-3*k*k+8*h+24*j*j)*m*m*m*m*m/120)/Math.cos(q);y=o+e(y);var z;if(a.accuracy){var A=g({northing:a.northing+a.accuracy,easting:a.easting+a.accuracy,zoneLetter:a.zoneLetter,zoneNumber:a.zoneNumber});z={top:A.lat,right:A.lon,bottom:x,left:y}}else z={lat:x,lon:y};return z}function h(a){var b="Z";return 84>=a&&a>=72?b="X":72>a&&a>=64?b="W":64>a&&a>=56?b="V":56>a&&a>=48?b="U":48>a&&a>=40?b="T":40>a&&a>=32?b="S":32>a&&a>=24?b="R":24>a&&a>=16?b="Q":16>a&&a>=8?b="P":8>a&&a>=0?b="N":0>a&&a>=-8?b="M":-8>a&&a>=-16?b="L":-16>a&&a>=-24?b="K":-24>a&&a>=-32?b="J":-32>a&&a>=-40?b="H":-40>a&&a>=-48?b="G":-48>a&&a>=-56?b="F":-56>a&&a>=-64?b="E":-64>a&&a>=-72?b="D":-72>a&&a>=-80&&(b="C"),b}function i(a,b){var c="00000"+a.easting,d="00000"+a.northing;return a.zoneNumber+a.zoneLetter+j(a.easting,a.northing,a.zoneNumber)+c.substr(c.length-5,b)+d.substr(d.length-5,b)}function j(a,b,c){var d=k(c),e=Math.floor(a/1e5),f=Math.floor(b/1e5)%20;return l(e,f,d)}function k(a){var b=a%q;return 0===b&&(b=q),b}function l(a,b,c){var d=c-1,e=r.charCodeAt(d),f=s.charCodeAt(d),g=e+a-1,h=f+b,i=!1;g>x&&(g=g-x+t-1,i=!0),(g===u||u>e&&g>u||(g>u||u>e)&&i)&&g++,(g===v||v>e&&g>v||(g>v||v>e)&&i)&&(g++,g===u&&g++),g>x&&(g=g-x+t-1),h>w?(h=h-w+t-1,i=!0):i=!1,(h===u||u>f&&h>u||(h>u||u>f)&&i)&&h++,(h===v||v>f&&h>v||(h>v||v>f)&&i)&&(h++,h===u&&h++),h>w&&(h=h-w+t-1);var j=String.fromCharCode(g)+String.fromCharCode(h);return j}function m(a){if(a&&0===a.length)throw"MGRSPoint coverting from nothing";for(var b,c=a.length,d=null,e="",f=0;!/[A-Z]/.test(b=a.charAt(f));){if(f>=2)throw"MGRSPoint bad conversion from: "+a;e+=b,f++}var g=parseInt(e,10);if(0===f||f+3>c)throw"MGRSPoint bad conversion from: "+a;var h=a.charAt(f++);if("A">=h||"B"===h||"Y"===h||h>="Z"||"I"===h||"O"===h)throw"MGRSPoint zone letter "+h+" not handled: "+a;d=a.substring(f,f+=2);for(var i=k(g),j=n(d.charAt(0),i),l=o(d.charAt(1),i);l<p(h);)l+=2e6;var m=c-f;if(m%2!==0)throw"MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters"+a;var q,r,s,t,u,v=m/2,w=0,x=0;return v>0&&(q=1e5/Math.pow(10,v),r=a.substring(f,f+v),w=parseFloat(r)*q,s=a.substring(f+v),x=parseFloat(s)*q),t=w+j,u=x+l,{easting:t,northing:u,zoneLetter:h,zoneNumber:g,accuracy:q}}function n(a,b){for(var c=r.charCodeAt(b-1),d=1e5,e=!1;c!==a.charCodeAt(0);){if(c++,c===u&&c++,c===v&&c++,c>x){if(e)throw"Bad character: "+a;c=t,e=!0}d+=1e5}return d}function o(a,b){if(a>"V")throw"MGRSPoint given invalid Northing "+a;for(var c=s.charCodeAt(b-1),d=0,e=!1;c!==a.charCodeAt(0);){if(c++,c===u&&c++,c===v&&c++,c>w){if(e)throw"Bad character: "+a;c=t,e=!0}d+=1e5}return d}function p(a){var b;switch(a){case"C":b=11e5;break;case"D":b=2e6;break;case"E":b=28e5;break;case"F":b=37e5;break;case"G":b=46e5;break;case"H":b=55e5;break;case"J":b=64e5;break;case"K":b=73e5;break;case"L":b=82e5;break;case"M":b=91e5;break;case"N":b=0;break;case"P":b=8e5;break;case"Q":b=17e5;break;case"R":b=26e5;break;case"S":b=35e5;break;case"T":b=44e5;break;case"U":b=53e5;break;case"V":b=62e5;break;case"W":b=7e6;break;case"X":b=79e5;break;default:b=-1}if(b>=0)return b;throw"Invalid zone letter: "+a}var q=6,r="AJSAJS",s="AFAFAF",t=65,u=73,v=79,w=86,x=90;c.forward=function(a,b){return b=b||5,i(f({lat:a[1],lon:a[0]}),b)},c.inverse=function(a){var b=g(m(a.toUpperCase()));return b.lat&&b.lon?[b.lon,b.lat,b.lon,b.lat]:[b.left,b.bottom,b.right,b.top]},c.toPoint=function(a){var b=g(m(a.toUpperCase()));return b.lat&&b.lon?[b.lon,b.lat]:[(b.left+b.right)/2,(b.top+b.bottom)/2]}},{}],69:[function(a,b,c){b.exports={name:"proj4",version:"2.3.15",description:"Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.",main:"lib/index.js",directories:{test:"test",doc:"docs"},scripts:{test:"./node_modules/istanbul/lib/cli.js test ./node_modules/mocha/bin/_mocha test/test.js"},repository:{type:"git",url:"git://github.com/proj4js/proj4js.git"},author:"",license:"MIT",jam:{main:"dist/proj4.js",include:["dist/proj4.js","README.md","AUTHORS","LICENSE.md"]},devDependencies:{"grunt-cli":"~0.1.13",grunt:"~0.4.2","grunt-contrib-connect":"~0.6.0","grunt-contrib-jshint":"~0.8.0",chai:"~1.8.1",mocha:"~1.17.1","grunt-mocha-phantomjs":"~0.4.0",browserify:"~12.0.1","grunt-browserify":"~4.0.1","grunt-contrib-uglify":"~0.11.1",curl:"git://github.com/cujojs/curl.git",istanbul:"~0.2.4",tin:"~0.4.0"},dependencies:{mgrs:"~0.0.2"}}},{}]},{},[36])(36)});</script>
+<style type="text/css">.loading {margin-top: 10em;text-align: center;color: gray;}#play-controls {position: absolute;bottom: 0;text-align: center;min-width: 310px;max-width: 800px;margin: 0 auto;padding: 5px 0 1em 0;}#play-controls * {display: inline-block;vertical-align: middle;}#play-pause-button {color: #666666;width: 30px;height: 30px;text-align: center;font-size: 15px;cursor: pointer;border: 1px solid silver;border-radius: 3px;background: #f8f8f8;}#play-range {margin: 2.5%;width: 70%;}#play-output {color: #666666;font-family: Arial, Helvetica, sans-serif;}</style>
+<style type="text/css">*, *:after, *:before {-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;}body {margin: 0;}[class*='col-'] {float: left;min-height: 1px;padding-right: 0px; }.grid {width: 100%;margin: 0 auto;overflow: hidden;}.grid:after {content: "";display: table;clear: both;}.grid-pad {padding-top: 0px;padding-left: 0px; padding-right: 0; }.push-right {float: right;}.col-1-1 {width: 100%;}.col-2-3, .col-8-12 {width: 66.66%;}.col-1-2, .col-6-12 {width: 50%;}.col-1-3, .col-4-12 {width: 33.33%;}.col-1-4, .col-3-12 {width: 25%;}.col-1-5 {width: 20%;}.col-1-6, .col-2-12 {width: 16.667%;}.col-1-7 {width: 14.28%;}.col-1-8 {width: 12.5%;}.col-1-9 {width: 11.1%;}.col-1-10 {width: 10%;}.col-1-11 {width: 9.09%;}.col-1-12 {width: 8.33%}.col-11-12 {width: 91.66%}.col-10-12 {width: 83.333%;}.col-9-12 {width: 75%;}.col-5-12 {width: 41.66%;}.col-7-12 {width: 58.33%}.push-2-3, .push-8-12 {margin-left: 66.66%;}.push-1-2, .push-6-12 {margin-left: 50%;}.push-1-3, .push-4-12 {margin-left: 33.33%;}.push-1-4, .push-3-12 {margin-left: 25%;}.push-1-5 {margin-left: 20%;}.push-1-6, .push-2-12 {margin-left: 16.667%;}.push-1-7 {margin-left: 14.28%;}.push-1-8 {margin-left: 12.5%;}.push-1-9 {margin-left: 11.1%;}.push-1-10 {margin-left: 10%;}.push-1-11 {margin-left: 9.09%;}.push-1-12 {margin-left: 8.33%}@media handheld, only screen and (max-width: 767px) {.grid {width: 100%;min-width: 0;margin-left: 0;margin-right: 0;padding-left: 20px; padding-right: 10px; }[class*='col-'] {width: auto;float: none;margin: 10px 0;padding-left: 0;padding-right: 10px; }[class*='mobile-col-'] {float: left;margin: 0 0 10px;padding-left: 0;padding-right: 10px; padding-bottom: 0;}.mobile-col-1-1 {width: 100%;}.mobile-col-2-3, .mobile-col-8-12 {width: 66.66%;}.mobile-col-1-2, .mobile-col-6-12 {width: 50%;}.mobile-col-1-3, .mobile-col-4-12 {width: 33.33%;}.mobile-col-1-4, .mobile-col-3-12 {width: 25%;}.mobile-col-1-5 {width: 20%;}.mobile-col-1-6, .mobile-col-2-12 {width: 16.667%;}.mobile-col-1-7 {width: 14.28%;}.mobile-col-1-8 {width: 12.5%;}.mobile-col-1-9 {width: 11.1%;}.mobile-col-1-10 {width: 10%;}.mobile-col-1-11 {width: 9.09%;}.mobile-col-1-12 {width: 8.33%}.mobile-col-11-12 {width: 91.66%}.mobile-col-10-12 {width: 83.333%;}.mobile-col-9-12 {width: 75%;}.mobile-col-5-12 {width: 41.66%;}.mobile-col-7-12 {width: 58.33%}.hide-on-mobile {display: none !important;width: 0;height: 0;}}</style>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+
+ (c) 2009-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(O,J){"object"===typeof module&&module.exports?module.exports=O.document?J(O):J:"function"===typeof define&&define.amd?define(function(){return J(O)}):O.Highcharts=J(O)})("undefined"!==typeof window?window:this,function(O){var J=function(){var a="undefined"===typeof O?window:O,y=a.document,G=a.navigator&&a.navigator.userAgent||"",E=y&&y.createElementNS&&!!y.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,h=/(edge|msie|trident)/i.test(G)&&!a.opera,c=-1!==G.indexOf("Firefox"),
+r=-1!==G.indexOf("Chrome"),u=c&&4>parseInt(G.split("Firefox/")[1],10);return a.Highcharts?a.Highcharts.error(16,!0):{product:"Highcharts",version:"7.0.1",deg2rad:2*Math.PI/360,doc:y,hasBidiBug:u,hasTouch:y&&void 0!==y.documentElement.ontouchstart,isMS:h,isWebKit:-1!==G.indexOf("AppleWebKit"),isFirefox:c,isChrome:r,isSafari:!r&&-1!==G.indexOf("Safari"),isTouchDevice:/(Mobile|Android|Windows Phone)/.test(G),SVG_NS:"http://www.w3.org/2000/svg",chartCount:0,seriesTypes:{},symbolSizes:{},svg:E,win:a,marginNames:["plotTop",
+"marginRight","marginBottom","plotLeft"],noop:function(){},charts:[]}}();(function(a){a.timers=[];var y=a.charts,G=a.doc,E=a.win;a.error=function(h,c,r){var u=a.isNumber(h)?"Highcharts error #"+h+": www.highcharts.com/errors/"+h:h;r&&a.fireEvent(r,"displayError",{code:h});if(c)throw Error(u);E.console&&console.log(u)};a.Fx=function(a,c,r){this.options=c;this.elem=a;this.prop=r};a.Fx.prototype={dSetter:function(){var a=this.paths[0],c=this.paths[1],r=[],u=this.now,v=a.length,w;if(1===u)r=this.toD;
+else if(v===c.length&&1>u)for(;v--;)w=parseFloat(a[v]),r[v]=isNaN(w)?c[v]:u*parseFloat(c[v]-w)+w;else r=c;this.elem.attr("d",r,null,!0)},update:function(){var a=this.elem,c=this.prop,r=this.now,u=this.options.step;if(this[c+"Setter"])this[c+"Setter"]();else a.attr?a.element&&a.attr(c,r,null,!0):a.style[c]=r+this.unit;u&&u.call(a,r,this)},run:function(h,c,r){var u=this,v=u.options,w=function(a){return w.stopped?!1:u.step(a)},n=E.requestAnimationFrame||function(a){setTimeout(a,13)},g=function(){for(var d=
+0;d<a.timers.length;d++)a.timers[d]()||a.timers.splice(d--,1);a.timers.length&&n(g)};h!==c||this.elem["forceAnimate:"+this.prop]?(this.startTime=+new Date,this.start=h,this.end=c,this.unit=r,this.now=this.start,this.pos=0,w.elem=this.elem,w.prop=this.prop,w()&&1===a.timers.push(w)&&n(g)):(delete v.curAnim[this.prop],v.complete&&0===Object.keys(v.curAnim).length&&v.complete.call(this.elem))},step:function(h){var c=+new Date,r,u=this.options,v=this.elem,w=u.complete,n=u.duration,g=u.curAnim;v.attr&&
+!v.element?h=!1:h||c>=n+this.startTime?(this.now=this.end,this.pos=1,this.update(),r=g[this.prop]=!0,a.objectEach(g,function(a){!0!==a&&(r=!1)}),r&&w&&w.call(v),h=!1):(this.pos=u.easing((c-this.startTime)/n),this.now=this.start+(this.end-this.start)*this.pos,this.update(),h=!0);return h},initPath:function(h,c,r){function u(a){var b,k;for(f=a.length;f--;)b="M"===a[f]||"L"===a[f],k=/[a-zA-Z]/.test(a[f+3]),b&&k&&a.splice(f+1,0,a[f+1],a[f+2],a[f+1],a[f+2])}function v(a,l){for(;a.length<b;){a[0]=l[b-a.length];
+var k=a.slice(0,p);[].splice.apply(a,[0,0].concat(k));x&&(k=a.slice(a.length-p),[].splice.apply(a,[a.length,0].concat(k)),f--)}a[0]="M"}function w(a,f){for(var k=(b-a.length)/p;0<k&&k--;)l=a.slice().splice(a.length/t-p,p*t),l[0]=f[b-p-k*p],m&&(l[p-6]=l[p-2],l[p-5]=l[p-1]),[].splice.apply(a,[a.length/t,0].concat(l)),x&&k--}c=c||"";var n,g=h.startX,d=h.endX,m=-1<c.indexOf("C"),p=m?7:3,b,l,f;c=c.split(" ");r=r.slice();var x=h.isArea,t=x?2:1,H;m&&(u(c),u(r));if(g&&d){for(f=0;f<g.length;f++)if(g[f]===
+d[0]){n=f;break}else if(g[0]===d[d.length-g.length+f]){n=f;H=!0;break}void 0===n&&(c=[])}c.length&&a.isNumber(n)&&(b=r.length+n*t*p,H?(v(c,r),w(r,c)):(v(r,c),w(c,r)));return[c,r]},fillSetter:function(){a.Fx.prototype.strokeSetter.apply(this,arguments)},strokeSetter:function(){this.elem.attr(this.prop,a.color(this.start).tweenTo(a.color(this.end),this.pos),null,!0)}};a.merge=function(){var h,c=arguments,r,u={},v=function(c,n){"object"!==typeof c&&(c={});a.objectEach(n,function(g,d){!a.isObject(g,!0)||
+a.isClass(g)||a.isDOMElement(g)?c[d]=n[d]:c[d]=v(c[d]||{},g)});return c};!0===c[0]&&(u=c[1],c=Array.prototype.slice.call(c,2));r=c.length;for(h=0;h<r;h++)u=v(u,c[h]);return u};a.pInt=function(a,c){return parseInt(a,c||10)};a.isString=function(a){return"string"===typeof a};a.isArray=function(a){a=Object.prototype.toString.call(a);return"[object Array]"===a||"[object Array Iterator]"===a};a.isObject=function(h,c){return!!h&&"object"===typeof h&&(!c||!a.isArray(h))};a.isDOMElement=function(h){return a.isObject(h)&&
+"number"===typeof h.nodeType};a.isClass=function(h){var c=h&&h.constructor;return!(!a.isObject(h,!0)||a.isDOMElement(h)||!c||!c.name||"Object"===c.name)};a.isNumber=function(a){return"number"===typeof a&&!isNaN(a)&&Infinity>a&&-Infinity<a};a.erase=function(a,c){for(var h=a.length;h--;)if(a[h]===c){a.splice(h,1);break}};a.defined=function(a){return void 0!==a&&null!==a};a.attr=function(h,c,r){var u;a.isString(c)?a.defined(r)?h.setAttribute(c,r):h&&h.getAttribute&&((u=h.getAttribute(c))||"class"!==
+c||(u=h.getAttribute(c+"Name"))):a.defined(c)&&a.isObject(c)&&a.objectEach(c,function(a,c){h.setAttribute(c,a)});return u};a.splat=function(h){return a.isArray(h)?h:[h]};a.syncTimeout=function(a,c,r){if(c)return setTimeout(a,c,r);a.call(0,r)};a.clearTimeout=function(h){a.defined(h)&&clearTimeout(h)};a.extend=function(a,c){var h;a||(a={});for(h in c)a[h]=c[h];return a};a.pick=function(){var a=arguments,c,r,u=a.length;for(c=0;c<u;c++)if(r=a[c],void 0!==r&&null!==r)return r};a.css=function(h,c){a.isMS&&
+!a.svg&&c&&void 0!==c.opacity&&(c.filter="alpha(opacity\x3d"+100*c.opacity+")");a.extend(h.style,c)};a.createElement=function(h,c,r,u,v){h=G.createElement(h);var w=a.css;c&&a.extend(h,c);v&&w(h,{padding:0,border:"none",margin:0});r&&w(h,r);u&&u.appendChild(h);return h};a.extendClass=function(h,c){var r=function(){};r.prototype=new h;a.extend(r.prototype,c);return r};a.pad=function(a,c,r){return Array((c||2)+1-String(a).replace("-","").length).join(r||0)+a};a.relativeLength=function(a,c,r){return/%$/.test(a)?
+c*parseFloat(a)/100+(r||0):parseFloat(a)};a.wrap=function(a,c,r){var h=a[c];a[c]=function(){var a=Array.prototype.slice.call(arguments),c=arguments,n=this;n.proceed=function(){h.apply(n,arguments.length?arguments:c)};a.unshift(h);a=r.apply(this,a);n.proceed=null;return a}};a.datePropsToTimestamps=function(h){a.objectEach(h,function(c,r){a.isObject(c)&&"function"===typeof c.getTime?h[r]=c.getTime():(a.isObject(c)||a.isArray(c))&&a.datePropsToTimestamps(c)})};a.formatSingle=function(h,c,r){var u=/\.([0-9])/,
+v=a.defaultOptions.lang;/f$/.test(h)?(r=(r=h.match(u))?r[1]:-1,null!==c&&(c=a.numberFormat(c,r,v.decimalPoint,-1<h.indexOf(",")?v.thousandsSep:""))):c=(r||a.time).dateFormat(h,c);return c};a.format=function(h,c,r){for(var u="{",v=!1,w,n,g,d,m=[],p;h;){u=h.indexOf(u);if(-1===u)break;w=h.slice(0,u);if(v){w=w.split(":");n=w.shift().split(".");d=n.length;p=c;for(g=0;g<d;g++)p&&(p=p[n[g]]);w.length&&(p=a.formatSingle(w.join(":"),p,r));m.push(p)}else m.push(w);h=h.slice(u+1);u=(v=!v)?"}":"{"}m.push(h);
+return m.join("")};a.getMagnitude=function(a){return Math.pow(10,Math.floor(Math.log(a)/Math.LN10))};a.normalizeTickInterval=function(h,c,r,u,v){var w,n=h;r=a.pick(r,1);w=h/r;c||(c=v?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===u&&(1===r?c=c.filter(function(a){return 0===a%1}):.1>=r&&(c=[1/r])));for(u=0;u<c.length&&!(n=c[u],v&&n*r>=h||!v&&w<=(c[u]+(c[u+1]||c[u]))/2);u++);return n=a.correctFloat(n*r,-Math.round(Math.log(.001)/Math.LN10))};a.stableSort=function(a,c){var h=a.length,u,v;for(v=0;v<
+h;v++)a[v].safeI=v;a.sort(function(a,n){u=c(a,n);return 0===u?a.safeI-n.safeI:u});for(v=0;v<h;v++)delete a[v].safeI};a.arrayMin=function(a){for(var c=a.length,h=a[0];c--;)a[c]<h&&(h=a[c]);return h};a.arrayMax=function(a){for(var c=a.length,h=a[0];c--;)a[c]>h&&(h=a[c]);return h};a.destroyObjectProperties=function(h,c){a.objectEach(h,function(a,u){a&&a!==c&&a.destroy&&a.destroy();delete h[u]})};a.discardElement=function(h){var c=a.garbageBin;c||(c=a.createElement("div"));h&&c.appendChild(h);c.innerHTML=
+""};a.correctFloat=function(a,c){return parseFloat(a.toPrecision(c||14))};a.setAnimation=function(h,c){c.renderer.globalAnimation=a.pick(h,c.options.chart.animation,!0)};a.animObject=function(h){return a.isObject(h)?a.merge(h):{duration:h?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5};a.numberFormat=function(h,c,r,u){h=+h||0;c=+c;var v=a.defaultOptions.lang,w=(h.toString().split(".")[1]||"").split("e")[0].length,n,g,d=h.toString().split("e");
+-1===c?c=Math.min(w,20):a.isNumber(c)?c&&d[1]&&0>d[1]&&(n=c+ +d[1],0<=n?(d[0]=(+d[0]).toExponential(n).split("e")[0],c=n):(d[0]=d[0].split(".")[0]||0,h=20>c?(d[0]*Math.pow(10,d[1])).toFixed(c):0,d[1]=0)):c=2;g=(Math.abs(d[1]?d[0]:h)+Math.pow(10,-Math.max(c,w)-1)).toFixed(c);w=String(a.pInt(g));n=3<w.length?w.length%3:0;r=a.pick(r,v.decimalPoint);u=a.pick(u,v.thousandsSep);h=(0>h?"-":"")+(n?w.substr(0,n)+u:"");h+=w.substr(n).replace(/(\d{3})(?=\d)/g,"$1"+u);c&&(h+=r+g.slice(-c));d[1]&&0!==+h&&(h+=
+"e"+d[1]);return h};Math.easeInOutSine=function(a){return-.5*(Math.cos(Math.PI*a)-1)};a.getStyle=function(h,c,r){if("width"===c)return Math.max(0,Math.min(h.offsetWidth,h.scrollWidth,h.getBoundingClientRect?Math.floor(h.getBoundingClientRect().width):Infinity)-a.getStyle(h,"padding-left")-a.getStyle(h,"padding-right"));if("height"===c)return Math.max(0,Math.min(h.offsetHeight,h.scrollHeight)-a.getStyle(h,"padding-top")-a.getStyle(h,"padding-bottom"));E.getComputedStyle||a.error(27,!0);if(h=E.getComputedStyle(h,
+void 0))h=h.getPropertyValue(c),a.pick(r,"opacity"!==c)&&(h=a.pInt(h));return h};a.inArray=function(a,c,r){return c.indexOf(a,r)};a.find=Array.prototype.find?function(a,c){return a.find(c)}:function(a,c){var h,u=a.length;for(h=0;h<u;h++)if(c(a[h],h))return a[h]};a.keys=Object.keys;a.offset=function(a){var c=G.documentElement;a=a.parentElement||a.parentNode?a.getBoundingClientRect():{top:0,left:0};return{top:a.top+(E.pageYOffset||c.scrollTop)-(c.clientTop||0),left:a.left+(E.pageXOffset||c.scrollLeft)-
+(c.clientLeft||0)}};a.stop=function(h,c){for(var r=a.timers.length;r--;)a.timers[r].elem!==h||c&&c!==a.timers[r].prop||(a.timers[r].stopped=!0)};a.objectEach=function(a,c,r){for(var h in a)a.hasOwnProperty(h)&&c.call(r||a[h],a[h],h,a)};a.objectEach({map:"map",each:"forEach",grep:"filter",reduce:"reduce",some:"some"},function(h,c){a[c]=function(a){return Array.prototype[h].apply(a,[].slice.call(arguments,1))}});a.addEvent=function(h,c,r,u){var v,w=h.addEventListener||a.addEventListenerPolyfill;v="function"===
+typeof h&&h.prototype?h.prototype.protoEvents=h.prototype.protoEvents||{}:h.hcEvents=h.hcEvents||{};a.Point&&h instanceof a.Point&&h.series&&h.series.chart&&(h.series.chart.runTrackerClick=!0);w&&w.call(h,c,r,!1);v[c]||(v[c]=[]);v[c].push(r);u&&a.isNumber(u.order)&&(r.order=u.order,v[c].sort(function(a,g){return a.order-g.order}));return function(){a.removeEvent(h,c,r)}};a.removeEvent=function(h,c,r){function u(g,d){var m=h.removeEventListener||a.removeEventListenerPolyfill;m&&m.call(h,g,d,!1)}function v(g){var d,
+m;h.nodeName&&(c?(d={},d[c]=!0):d=g,a.objectEach(d,function(a,b){if(g[b])for(m=g[b].length;m--;)u(b,g[b][m])}))}var w,n;["protoEvents","hcEvents"].forEach(function(a){var d=h[a];d&&(c?(w=d[c]||[],r?(n=w.indexOf(r),-1<n&&(w.splice(n,1),d[c]=w),u(c,r)):(v(d),d[c]=[])):(v(d),h[a]={}))})};a.fireEvent=function(h,c,r,u){var v,w,n,g,d;r=r||{};G.createEvent&&(h.dispatchEvent||h.fireEvent)?(v=G.createEvent("Events"),v.initEvent(c,!0,!0),a.extend(v,r),h.dispatchEvent?h.dispatchEvent(v):h.fireEvent(c,v)):["protoEvents",
+"hcEvents"].forEach(function(m){if(h[m])for(w=h[m][c]||[],n=w.length,r.target||a.extend(r,{preventDefault:function(){r.defaultPrevented=!0},target:h,type:c}),g=0;g<n;g++)(d=w[g])&&!1===d.call(h,r)&&r.preventDefault()});u&&!r.defaultPrevented&&u.call(h,r)};a.animate=function(h,c,r){var u,v="",w,n,g;a.isObject(r)||(g=arguments,r={duration:g[2],easing:g[3],complete:g[4]});a.isNumber(r.duration)||(r.duration=400);r.easing="function"===typeof r.easing?r.easing:Math[r.easing]||Math.easeInOutSine;r.curAnim=
+a.merge(c);a.objectEach(c,function(d,g){a.stop(h,g);n=new a.Fx(h,r,g);w=null;"d"===g?(n.paths=n.initPath(h,h.d,c.d),n.toD=c.d,u=0,w=1):h.attr?u=h.attr(g):(u=parseFloat(a.getStyle(h,g))||0,"opacity"!==g&&(v="px"));w||(w=d);w&&w.match&&w.match("px")&&(w=w.replace(/px/g,""));n.run(u,w,v)})};a.seriesType=function(h,c,r,u,v){var w=a.getOptions(),n=a.seriesTypes;w.plotOptions[h]=a.merge(w.plotOptions[c],r);n[h]=a.extendClass(n[c]||function(){},u);n[h].prototype.type=h;v&&(n[h].prototype.pointClass=a.extendClass(a.Point,
+v));return n[h]};a.uniqueKey=function(){var a=Math.random().toString(36).substring(2,9),c=0;return function(){return"highcharts-"+a+"-"+c++}}();a.isFunction=function(a){return"function"===typeof a};E.jQuery&&(E.jQuery.fn.highcharts=function(){var h=[].slice.call(arguments);if(this[0])return h[0]?(new (a[a.isString(h[0])?h.shift():"Chart"])(this[0],h[0],h[1]),this):y[a.attr(this[0],"data-highcharts-chart")]})})(J);(function(a){var y=a.isNumber,G=a.merge,E=a.pInt;a.Color=function(h){if(!(this instanceof
+a.Color))return new a.Color(h);this.init(h)};a.Color.prototype={parsers:[{regex:/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,parse:function(a){return[E(a[1]),E(a[2]),E(a[3]),parseFloat(a[4],10)]}},{regex:/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,parse:function(a){return[E(a[1]),E(a[2]),E(a[3]),1]}}],names:{white:"#ffffff",black:"#000000"},init:function(h){var c,r,u,v;if((this.input=h=this.names[h&&h.toLowerCase?h.toLowerCase():
+""]||h)&&h.stops)this.stops=h.stops.map(function(c){return new a.Color(c[1])});else if(h&&h.charAt&&"#"===h.charAt()&&(c=h.length,h=parseInt(h.substr(1),16),7===c?r=[(h&16711680)>>16,(h&65280)>>8,h&255,1]:4===c&&(r=[(h&3840)>>4|(h&3840)>>8,(h&240)>>4|h&240,(h&15)<<4|h&15,1])),!r)for(u=this.parsers.length;u--&&!r;)v=this.parsers[u],(c=v.regex.exec(h))&&(r=v.parse(c));this.rgba=r||[]},get:function(a){var c=this.input,h=this.rgba,u;this.stops?(u=G(c),u.stops=[].concat(u.stops),this.stops.forEach(function(c,
+h){u.stops[h]=[u.stops[h][0],c.get(a)]})):u=h&&y(h[0])?"rgb"===a||!a&&1===h[3]?"rgb("+h[0]+","+h[1]+","+h[2]+")":"a"===a?h[3]:"rgba("+h.join(",")+")":c;return u},brighten:function(a){var c,h=this.rgba;if(this.stops)this.stops.forEach(function(c){c.brighten(a)});else if(y(a)&&0!==a)for(c=0;3>c;c++)h[c]+=E(255*a),0>h[c]&&(h[c]=0),255<h[c]&&(h[c]=255);return this},setOpacity:function(a){this.rgba[3]=a;return this},tweenTo:function(a,c){var h=this.rgba,u=a.rgba;u.length&&h&&h.length?(a=1!==u[3]||1!==
+h[3],c=(a?"rgba(":"rgb(")+Math.round(u[0]+(h[0]-u[0])*(1-c))+","+Math.round(u[1]+(h[1]-u[1])*(1-c))+","+Math.round(u[2]+(h[2]-u[2])*(1-c))+(a?","+(u[3]+(h[3]-u[3])*(1-c)):"")+")"):c=a.input||"none";return c}};a.color=function(h){return new a.Color(h)}})(J);(function(a){var y,G,E=a.addEvent,h=a.animate,c=a.attr,r=a.charts,u=a.color,v=a.css,w=a.createElement,n=a.defined,g=a.deg2rad,d=a.destroyObjectProperties,m=a.doc,p=a.extend,b=a.erase,l=a.hasTouch,f=a.isArray,x=a.isFirefox,t=a.isMS,H=a.isObject,
+F=a.isString,z=a.isWebKit,k=a.merge,A=a.noop,D=a.objectEach,B=a.pick,e=a.pInt,q=a.removeEvent,L=a.splat,I=a.stop,R=a.svg,K=a.SVG_NS,M=a.symbolSizes,S=a.win;y=a.SVGElement=function(){return this};p(y.prototype,{opacity:1,SVG_NS:K,textProps:"direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline cursor".split(" "),init:function(a,e){this.element="span"===e?w(e):m.createElementNS(this.SVG_NS,e);this.renderer=a},animate:function(e,q,
+b){q=a.animObject(B(q,this.renderer.globalAnimation,!0));0!==q.duration?(b&&(q.complete=b),h(this,e,q)):(this.attr(e,null,b),q.step&&q.step.call(this));return this},complexColor:function(e,q,b){var C=this.renderer,l,d,p,g,A,K,m,N,x,c,t,I=[],L;a.fireEvent(this.renderer,"complexColor",{args:arguments},function(){e.radialGradient?d="radialGradient":e.linearGradient&&(d="linearGradient");d&&(p=e[d],A=C.gradients,m=e.stops,c=b.radialReference,f(p)&&(e[d]=p={x1:p[0],y1:p[1],x2:p[2],y2:p[3],gradientUnits:"userSpaceOnUse"}),
+"radialGradient"===d&&c&&!n(p.gradientUnits)&&(g=p,p=k(p,C.getRadialAttr(c,g),{gradientUnits:"userSpaceOnUse"})),D(p,function(a,e){"id"!==e&&I.push(e,a)}),D(m,function(a){I.push(a)}),I=I.join(","),A[I]?t=A[I].attr("id"):(p.id=t=a.uniqueKey(),A[I]=K=C.createElement(d).attr(p).add(C.defs),K.radAttr=g,K.stops=[],m.forEach(function(e){0===e[1].indexOf("rgba")?(l=a.color(e[1]),N=l.get("rgb"),x=l.get("a")):(N=e[1],x=1);e=C.createElement("stop").attr({offset:e[0],"stop-color":N,"stop-opacity":x}).add(K);
+K.stops.push(e)})),L="url("+C.url+"#"+t+")",b.setAttribute(q,L),b.gradient=I,e.toString=function(){return L})})},applyTextOutline:function(e){var C=this.element,q,f,k,l,d;-1!==e.indexOf("contrast")&&(e=e.replace(/contrast/g,this.renderer.getContrast(C.style.fill)));e=e.split(" ");f=e[e.length-1];if((k=e[0])&&"none"!==k&&a.svg){this.fakeTS=!0;e=[].slice.call(C.getElementsByTagName("tspan"));this.ySetter=this.xSetter;k=k.replace(/(^[\d\.]+)(.*?)$/g,function(a,e,C){return 2*e+C});for(d=e.length;d--;)q=
+e[d],"highcharts-text-outline"===q.getAttribute("class")&&b(e,C.removeChild(q));l=C.firstChild;e.forEach(function(a,e){0===e&&(a.setAttribute("x",C.getAttribute("x")),e=C.getAttribute("y"),a.setAttribute("y",e||0),null===e&&C.setAttribute("y",0));a=a.cloneNode(1);c(a,{"class":"highcharts-text-outline",fill:f,stroke:f,"stroke-width":k,"stroke-linejoin":"round"});C.insertBefore(a,l)})}},symbolCustomAttribs:"x y width height r start end innerR anchorX anchorY rounded".split(" "),attr:function(e,q,b,
+f){var C,k=this.element,l,d=this,p,g,A=this.symbolCustomAttribs;"string"===typeof e&&void 0!==q&&(C=e,e={},e[C]=q);"string"===typeof e?d=(this[e+"Getter"]||this._defaultGetter).call(this,e,k):(D(e,function(C,q){p=!1;f||I(this,q);this.symbolName&&-1!==a.inArray(q,A)&&(l||(this.symbolAttr(e),l=!0),p=!0);!this.rotation||"x"!==q&&"y"!==q||(this.doTransform=!0);p||(g=this[q+"Setter"]||this._defaultSetter,g.call(this,C,q,k),!this.styledMode&&this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(q)&&
+this.updateShadows(q,C,g))},this),this.afterSetters());b&&b.call(this);return d},afterSetters:function(){this.doTransform&&(this.updateTransform(),this.doTransform=!1)},updateShadows:function(a,e,q){for(var C=this.shadows,b=C.length;b--;)q.call(C[b],"height"===a?Math.max(e-(C[b].cutHeight||0),0):"d"===a?this.d:e,a,C[b])},addClass:function(a,e){var C=this.attr("class")||"";-1===C.indexOf(a)&&(e||(a=(C+(C?" ":"")+a).replace("  "," ")),this.attr("class",a));return this},hasClass:function(a){return-1!==
+(this.attr("class")||"").split(" ").indexOf(a)},removeClass:function(a){return this.attr("class",(this.attr("class")||"").replace(a,""))},symbolAttr:function(a){var e=this;"x y r start end width height innerR anchorX anchorY".split(" ").forEach(function(C){e[C]=B(a[C],e[C])});e.attr({d:e.renderer.symbols[e.symbolName](e.x,e.y,e.width,e.height,e)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":"none")},crisp:function(a,e){var C;e=e||a.strokeWidth||0;C=Math.round(e)%
+2/2;a.x=Math.floor(a.x||this.x||0)+C;a.y=Math.floor(a.y||this.y||0)+C;a.width=Math.floor((a.width||this.width||0)-2*C);a.height=Math.floor((a.height||this.height||0)-2*C);n(a.strokeWidth)&&(a.strokeWidth=e);return a},css:function(a){var C=this.styles,q={},b=this.element,k,f="",l,d=!C,g=["textOutline","textOverflow","width"];a&&a.color&&(a.fill=a.color);C&&D(a,function(a,e){a!==C[e]&&(q[e]=a,d=!0)});d&&(C&&(a=p(C,q)),a&&(null===a.width||"auto"===a.width?delete this.textWidth:"text"===b.nodeName.toLowerCase()&&
+a.width&&(k=this.textWidth=e(a.width))),this.styles=a,k&&!R&&this.renderer.forExport&&delete a.width,b.namespaceURI===this.SVG_NS?(l=function(a,e){return"-"+e.toLowerCase()},D(a,function(a,e){-1===g.indexOf(e)&&(f+=e.replace(/([A-Z])/g,l)+":"+a+";")}),f&&c(b,"style",f)):v(b,a),this.added&&("text"===this.element.nodeName&&this.renderer.buildText(this),a&&a.textOutline&&this.applyTextOutline(a.textOutline)));return this},getStyle:function(a){return S.getComputedStyle(this.element||this,"").getPropertyValue(a)},
+strokeWidth:function(){if(!this.renderer.styledMode)return this["stroke-width"]||0;var a=this.getStyle("stroke-width"),q;a.indexOf("px")===a.length-2?a=e(a):(q=m.createElementNS(K,"rect"),c(q,{width:a,"stroke-width":0}),this.element.parentNode.appendChild(q),a=q.getBBox().width,q.parentNode.removeChild(q));return a},on:function(a,e){var q=this,C=q.element;l&&"click"===a?(C.ontouchstart=function(a){q.touchEventFired=Date.now();a.preventDefault();e.call(C,a)},C.onclick=function(a){(-1===S.navigator.userAgent.indexOf("Android")||
+1100<Date.now()-(q.touchEventFired||0))&&e.call(C,a)}):C["on"+a]=e;return this},setRadialReference:function(a){var e=this.renderer.gradients[this.element.gradient];this.element.radialReference=a;e&&e.radAttr&&e.animate(this.renderer.getRadialAttr(a,e.radAttr));return this},translate:function(a,e){return this.attr({translateX:a,translateY:e})},invert:function(a){this.inverted=a;this.updateTransform();return this},updateTransform:function(){var a=this.translateX||0,e=this.translateY||0,q=this.scaleX,
+b=this.scaleY,f=this.inverted,k=this.rotation,l=this.matrix,d=this.element;f&&(a+=this.width,e+=this.height);a=["translate("+a+","+e+")"];n(l)&&a.push("matrix("+l.join(",")+")");f?a.push("rotate(90) scale(-1,1)"):k&&a.push("rotate("+k+" "+B(this.rotationOriginX,d.getAttribute("x"),0)+" "+B(this.rotationOriginY,d.getAttribute("y")||0)+")");(n(q)||n(b))&&a.push("scale("+B(q,1)+" "+B(b,1)+")");a.length&&d.setAttribute("transform",a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);
+return this},align:function(a,e,q){var C,f,k,l,d={};f=this.renderer;k=f.alignedObjects;var p,g;if(a){if(this.alignOptions=a,this.alignByTranslate=e,!q||F(q))this.alignTo=C=q||"renderer",b(k,this),k.push(this),q=null}else a=this.alignOptions,e=this.alignByTranslate,C=this.alignTo;q=B(q,f[C],f);C=a.align;f=a.verticalAlign;k=(q.x||0)+(a.x||0);l=(q.y||0)+(a.y||0);"right"===C?p=1:"center"===C&&(p=2);p&&(k+=(q.width-(a.width||0))/p);d[e?"translateX":"x"]=Math.round(k);"bottom"===f?g=1:"middle"===f&&(g=
+2);g&&(l+=(q.height-(a.height||0))/g);d[e?"translateY":"y"]=Math.round(l);this[this.placed?"animate":"attr"](d);this.placed=!0;this.alignAttr=d;return this},getBBox:function(a,e){var q,C=this.renderer,b,f=this.element,k=this.styles,l,d=this.textStr,A,K=C.cache,m=C.cacheKeys,x=f.namespaceURI===this.SVG_NS,c;e=B(e,this.rotation);b=e*g;l=C.styledMode?f&&y.prototype.getStyle.call(f,"font-size"):k&&k.fontSize;n(d)&&(c=d.toString(),-1===c.indexOf("\x3c")&&(c=c.replace(/[0-9]/g,"0")),c+=["",e||0,l,this.textWidth,
+k&&k.textOverflow].join());c&&!a&&(q=K[c]);if(!q){if(x||C.forExport){try{(A=this.fakeTS&&function(a){[].forEach.call(f.querySelectorAll(".highcharts-text-outline"),function(e){e.style.display=a})})&&A("none"),q=f.getBBox?p({},f.getBBox()):{width:f.offsetWidth,height:f.offsetHeight},A&&A("")}catch(W){}if(!q||0>q.width)q={width:0,height:0}}else q=this.htmlGetBBox();C.isSVG&&(a=q.width,C=q.height,x&&(q.height=C={"11px,17":14,"13px,20":16}[k&&k.fontSize+","+Math.round(C)]||C),e&&(q.width=Math.abs(C*Math.sin(b))+
+Math.abs(a*Math.cos(b)),q.height=Math.abs(C*Math.cos(b))+Math.abs(a*Math.sin(b))));if(c&&0<q.height){for(;250<m.length;)delete K[m.shift()];K[c]||m.push(c);K[c]=q}}return q},show:function(a){return this.attr({visibility:a?"inherit":"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var e=this;e.animate({opacity:0},{duration:a||150,complete:function(){e.attr({y:-9999})}})},add:function(a){var e=this.renderer,q=this.element,C;a&&(this.parentGroup=a);this.parentInverted=
+a&&a.inverted;void 0!==this.textStr&&e.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)C=this.zIndexSetter();C||(a?a.element:e.box).appendChild(q);if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var e=a.parentNode;e&&e.removeChild(a)},destroy:function(){var a=this,e=a.element||{},q=a.renderer,f=q.isSVG&&"SPAN"===e.nodeName&&a.parentGroup,k=e.ownerSVGElement,l=a.clipPath;e.onclick=e.onmouseout=e.onmouseover=e.onmousemove=e.point=null;I(a);l&&k&&([].forEach.call(k.querySelectorAll("[clip-path],[CLIP-PATH]"),
+function(a){var e=a.getAttribute("clip-path"),q=l.element.id;(-1<e.indexOf("(#"+q+")")||-1<e.indexOf('("#'+q+'")'))&&a.removeAttribute("clip-path")}),a.clipPath=l.destroy());if(a.stops){for(k=0;k<a.stops.length;k++)a.stops[k]=a.stops[k].destroy();a.stops=null}a.safeRemoveChild(e);for(q.styledMode||a.destroyShadows();f&&f.div&&0===f.div.childNodes.length;)e=f.parentGroup,a.safeRemoveChild(f.div),delete f.div,f=e;a.alignTo&&b(q.alignedObjects,a);D(a,function(e,q){delete a[q]});return null},shadow:function(a,
+e,q){var b=[],f,C,k=this.element,l,d,p,g;if(!a)this.destroyShadows();else if(!this.shadows){d=B(a.width,3);p=(a.opacity||.15)/d;g=this.parentInverted?"(-1,-1)":"("+B(a.offsetX,1)+", "+B(a.offsetY,1)+")";for(f=1;f<=d;f++)C=k.cloneNode(0),l=2*d+1-2*f,c(C,{stroke:a.color||"#000000","stroke-opacity":p*f,"stroke-width":l,transform:"translate"+g,fill:"none"}),C.setAttribute("class",(C.getAttribute("class")||"")+" highcharts-shadow"),q&&(c(C,"height",Math.max(c(C,"height")-l,0)),C.cutHeight=l),e?e.element.appendChild(C):
+k.parentNode&&k.parentNode.insertBefore(C,k),b.push(C);this.shadows=b}return this},destroyShadows:function(){(this.shadows||[]).forEach(function(a){this.safeRemoveChild(a)},this);this.shadows=void 0},xGetter:function(a){"circle"===this.element.nodeName&&("x"===a?a="cx":"y"===a&&(a="cy"));return this._defaultGetter(a)},_defaultGetter:function(a){a=B(this[a+"Value"],this[a],this.element?this.element.getAttribute(a):null,0);/^[\-0-9\.]+$/.test(a)&&(a=parseFloat(a));return a},dSetter:function(a,e,q){a&&
+a.join&&(a=a.join(" "));/(NaN| {2}|^$)/.test(a)&&(a="M 0 0");this[e]!==a&&(q.setAttribute(e,a),this[e]=a)},dashstyleSetter:function(a){var q,f=this["stroke-width"];"inherit"===f&&(f=1);if(a=a&&a.toLowerCase()){a=a.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(q=a.length;q--;)a[q]=e(a[q])*f;a=a.join(",").replace(/NaN/g,
+"none");this.element.setAttribute("stroke-dasharray",a)}},alignSetter:function(a){this.alignValue=a;this.element.setAttribute("text-anchor",{left:"start",center:"middle",right:"end"}[a])},opacitySetter:function(a,e,q){this[e]=a;q.setAttribute(e,a)},titleSetter:function(a){var e=this.element.getElementsByTagName("title")[0];e||(e=m.createElementNS(this.SVG_NS,"title"),this.element.appendChild(e));e.firstChild&&e.removeChild(e.firstChild);e.appendChild(m.createTextNode(String(B(a),"").replace(/<[^>]*>/g,
+"").replace(/&lt;/g,"\x3c").replace(/&gt;/g,"\x3e")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this))},fillSetter:function(a,e,q){"string"===typeof a?q.setAttribute(e,a):a&&this.complexColor(a,e,q)},visibilitySetter:function(a,e,q){"inherit"===a?q.removeAttribute(e):this[e]!==a&&q.setAttribute(e,a);this[e]=a},zIndexSetter:function(a,q){var f=this.renderer,b=this.parentGroup,k=(b||f).element||f.box,l,d=this.element,C,p,f=k===f.box;
+l=this.added;var g;n(a)?(d.setAttribute("data-z-index",a),a=+a,this[q]===a&&(l=!1)):n(this[q])&&d.removeAttribute("data-z-index");this[q]=a;if(l){(a=this.zIndex)&&b&&(b.handleZ=!0);q=k.childNodes;for(g=q.length-1;0<=g&&!C;g--)if(b=q[g],l=b.getAttribute("data-z-index"),p=!n(l),b!==d)if(0>a&&p&&!f&&!g)k.insertBefore(d,q[g]),C=!0;else if(e(l)<=a||p&&(!n(a)||0<=a))k.insertBefore(d,q[g+1]||null),C=!0;C||(k.insertBefore(d,q[f?3:0]||null),C=!0)}return C},_defaultSetter:function(a,e,q){q.setAttribute(e,a)}});
+y.prototype.yGetter=y.prototype.xGetter;y.prototype.translateXSetter=y.prototype.translateYSetter=y.prototype.rotationSetter=y.prototype.verticalAlignSetter=y.prototype.rotationOriginXSetter=y.prototype.rotationOriginYSetter=y.prototype.scaleXSetter=y.prototype.scaleYSetter=y.prototype.matrixSetter=function(a,e){this[e]=a;this.doTransform=!0};y.prototype["stroke-widthSetter"]=y.prototype.strokeSetter=function(a,e,q){this[e]=a;this.stroke&&this["stroke-width"]?(y.prototype.fillSetter.call(this,this.stroke,
+"stroke",q),q.setAttribute("stroke-width",this["stroke-width"]),this.hasStroke=!0):"stroke-width"===e&&0===a&&this.hasStroke&&(q.removeAttribute("stroke"),this.hasStroke=!1)};G=a.SVGRenderer=function(){this.init.apply(this,arguments)};p(G.prototype,{Element:y,SVG_NS:K,init:function(a,e,q,f,b,k,l){var d;d=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"});l||d.css(this.getStyle(f));f=d.element;a.appendChild(f);c(a,"dir","ltr");-1===a.innerHTML.indexOf("xmlns")&&c(f,"xmlns",this.SVG_NS);
+this.isSVG=!0;this.box=f;this.boxWrapper=d;this.alignedObjects=[];this.url=(x||z)&&m.getElementsByTagName("base").length?S.location.href.split("#")[0].replace(/<[^>]*>/g,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(m.createTextNode("Created with Highcharts 7.0.1"));this.defs=this.createElement("defs").add();this.allowHTML=k;this.forExport=b;this.styledMode=l;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(e,
+q,!1);var C;x&&a.getBoundingClientRect&&(e=function(){v(a,{left:0,top:0});C=a.getBoundingClientRect();v(a,{left:Math.ceil(C.left)-C.left+"px",top:Math.ceil(C.top)-C.top+"px"})},e(),this.unSubPixelFix=E(S,"resize",e))},definition:function(a){function e(a,f){var b;L(a).forEach(function(a){var k=q.createElement(a.tagName),l={};D(a,function(a,e){"tagName"!==e&&"children"!==e&&"textContent"!==e&&(l[e]=a)});k.attr(l);k.add(f||q.defs);a.textContent&&k.element.appendChild(m.createTextNode(a.textContent));
+e(a.children||[],k);b=k});return b}var q=this;return e(a)},getStyle:function(a){return this.style=p({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},setStyle:function(a){this.boxWrapper.css(this.getStyle(a))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();d(this.gradients||{});this.gradients=null;a&&(this.defs=a.destroy());this.unSubPixelFix&&
+this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var e=new this.Element;e.init(this,a);return e},draw:A,getRadialAttr:function(a,e){return{cx:a[0]-a[2]/2+e.cx*a[2],cy:a[1]-a[2]/2+e.cy*a[2],r:e.r*a[2]}},truncate:function(a,e,q,f,b,k,l){var d=this,p=a.rotation,C,g=f?1:0,A=(q||f).length,K=A,c=[],x=function(a){e.firstChild&&e.removeChild(e.firstChild);a&&e.appendChild(m.createTextNode(a))},n=function(k,p){p=p||k;if(void 0===c[p])if(e.getSubStringLength)try{c[p]=b+e.getSubStringLength(0,
+f?p+1:p)}catch(X){}else d.getSpanWidth&&(x(l(q||f,k)),c[p]=b+d.getSpanWidth(a,e));return c[p]},t,I;a.rotation=0;t=n(e.textContent.length);if(I=b+t>k){for(;g<=A;)K=Math.ceil((g+A)/2),f&&(C=l(f,K)),t=n(K,C&&C.length-1),g===A?g=A+1:t>k?A=K-1:g=K;0===A?x(""):q&&A===q.length-1||x(C||l(q||f,K))}f&&f.splice(0,K);a.actualWidth=t;a.rotation=p;return I},escapes:{"\x26":"\x26amp;","\x3c":"\x26lt;","\x3e":"\x26gt;","'":"\x26#39;",'"':"\x26quot;"},buildText:function(a){var q=a.element,f=this,k=f.forExport,b=B(a.textStr,
+"").toString(),l=-1!==b.indexOf("\x3c"),d=q.childNodes,p,g=c(q,"x"),C=a.styles,A=a.textWidth,x=C&&C.lineHeight,n=C&&C.textOutline,t=C&&"ellipsis"===C.textOverflow,I=C&&"nowrap"===C.whiteSpace,L=C&&C.fontSize,z,H,h=d.length,C=A&&!a.added&&this.box,F=function(a){var b;f.styledMode||(b=/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:L||f.style.fontSize||12);return x?e(x):f.fontMetrics(b,a.getAttribute("style")?a:q).h},M=function(a,e){D(f.escapes,function(q,f){e&&-1!==e.indexOf(q)||(a=a.toString().replace(new RegExp(q,
+"g"),f))});return a},w=function(a,e){var q;q=a.indexOf("\x3c");a=a.substring(q,a.indexOf("\x3e")-q);q=a.indexOf(e+"\x3d");if(-1!==q&&(q=q+e.length+1,e=a.charAt(q),'"'===e||"'"===e))return a=a.substring(q+1),a.substring(0,a.indexOf(e))};z=[b,t,I,x,n,L,A].join();if(z!==a.textCache){for(a.textCache=z;h--;)q.removeChild(d[h]);l||n||t||A||-1!==b.indexOf(" ")?(C&&C.appendChild(q),l?(b=f.styledMode?b.replace(/<(b|strong)>/g,'\x3cspan class\x3d"highcharts-strong"\x3e').replace(/<(i|em)>/g,'\x3cspan class\x3d"highcharts-emphasized"\x3e'):
+b.replace(/<(b|strong)>/g,'\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g,'\x3cspan style\x3d"font-style:italic"\x3e'),b=b.replace(/<a/g,"\x3cspan").replace(/<\/(b|strong|i|em|a)>/g,"\x3c/span\x3e").split(/<br.*?>/g)):b=[b],b=b.filter(function(a){return""!==a}),b.forEach(function(e,b){var l,d=0,C=0;e=e.replace(/^\s+|\s+$/g,"").replace(/<span/g,"|||\x3cspan").replace(/<\/span>/g,"\x3c/span\x3e|||");l=e.split("|||");l.forEach(function(e){if(""!==e||1===l.length){var x={},n=m.createElementNS(f.SVG_NS,
+"tspan"),D,B;(D=w(e,"class"))&&c(n,"class",D);if(D=w(e,"style"))D=D.replace(/(;| |^)color([ :])/,"$1fill$2"),c(n,"style",D);(B=w(e,"href"))&&!k&&(c(n,"onclick",'location.href\x3d"'+B+'"'),c(n,"class","highcharts-anchor"),f.styledMode||v(n,{cursor:"pointer"}));e=M(e.replace(/<[a-zA-Z\/](.|\n)*?>/g,"")||" ");if(" "!==e){n.appendChild(m.createTextNode(e));d?x.dx=0:b&&null!==g&&(x.x=g);c(n,x);q.appendChild(n);!d&&H&&(!R&&k&&v(n,{display:"block"}),c(n,"dy",F(n)));if(A){var z=e.replace(/([^\^])-/g,"$1- ").split(" "),
+x=!I&&(1<l.length||b||1<z.length);B=0;var h=F(n);if(t)p=f.truncate(a,n,e,void 0,0,Math.max(0,A-parseInt(L||12,10)),function(a,e){return a.substring(0,e)+"\u2026"});else if(x)for(;z.length;)z.length&&!I&&0<B&&(n=m.createElementNS(K,"tspan"),c(n,{dy:h,x:g}),D&&c(n,"style",D),n.appendChild(m.createTextNode(z.join(" ").replace(/- /g,"-"))),q.appendChild(n)),f.truncate(a,n,null,z,0===B?C:0,A,function(a,e){return z.slice(0,e).join(" ").replace(/- /g,"-")}),C=a.actualWidth,B++}d++}}});H=H||q.childNodes.length}),
+t&&p&&a.attr("title",M(a.textStr,["\x26lt;","\x26gt;"])),C&&C.removeChild(q),n&&a.applyTextOutline&&a.applyTextOutline(n)):q.appendChild(m.createTextNode(M(b)))}},getContrast:function(a){a=u(a).rgba;a[0]*=1;a[1]*=1.2;a[2]*=.5;return 459<a[0]+a[1]+a[2]?"#000000":"#FFFFFF"},button:function(a,e,q,f,b,l,d,g,A){var C=this.label(a,e,q,A,null,null,null,null,"button"),K=0,n=this.styledMode;C.attr(k({padding:8,r:2},b));if(!n){var m,x,c,I;b=k({fill:"#f7f7f7",stroke:"#cccccc","stroke-width":1,style:{color:"#333333",
+cursor:"pointer",fontWeight:"normal"}},b);m=b.style;delete b.style;l=k(b,{fill:"#e6e6e6"},l);x=l.style;delete l.style;d=k(b,{fill:"#e6ebf5",style:{color:"#000000",fontWeight:"bold"}},d);c=d.style;delete d.style;g=k(b,{style:{color:"#cccccc"}},g);I=g.style;delete g.style}E(C.element,t?"mouseover":"mouseenter",function(){3!==K&&C.setState(1)});E(C.element,t?"mouseout":"mouseleave",function(){3!==K&&C.setState(K)});C.setState=function(a){1!==a&&(C.state=K=a);C.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-"+
+["normal","hover","pressed","disabled"][a||0]);n||C.attr([b,l,d,g][a||0]).css([m,x,c,I][a||0])};n||C.attr(b).css(p({cursor:"default"},m));return C.on("click",function(a){3!==K&&f.call(C,a)})},crispLine:function(a,e){a[1]===a[4]&&(a[1]=a[4]=Math.round(a[1])-e%2/2);a[2]===a[5]&&(a[2]=a[5]=Math.round(a[2])+e%2/2);return a},path:function(a){var e=this.styledMode?{}:{fill:"none"};f(a)?e.d=a:H(a)&&p(e,a);return this.createElement("path").attr(e)},circle:function(a,e,q){a=H(a)?a:void 0===a?{}:{x:a,y:e,r:q};
+e=this.createElement("circle");e.xSetter=e.ySetter=function(a,e,q){q.setAttribute("c"+e,a)};return e.attr(a)},arc:function(a,e,q,b,f,k){H(a)?(b=a,e=b.y,q=b.r,a=b.x):b={innerR:b,start:f,end:k};a=this.symbol("arc",a,e,q,q,b);a.r=q;return a},rect:function(a,e,q,b,f,k){f=H(a)?a.r:f;var l=this.createElement("rect");a=H(a)?a:void 0===a?{}:{x:a,y:e,width:Math.max(q,0),height:Math.max(b,0)};this.styledMode||(void 0!==k&&(a.strokeWidth=k,a=l.crisp(a)),a.fill="none");f&&(a.r=f);l.rSetter=function(a,e,q){c(q,
+{rx:a,ry:a})};return l.attr(a)},setSize:function(a,e,q){var b=this.alignedObjects,f=b.length;this.width=a;this.height=e;for(this.boxWrapper.animate({width:a,height:e},{step:function(){this.attr({viewBox:"0 0 "+this.attr("width")+" "+this.attr("height")})},duration:B(q,!0)?void 0:0});f--;)b[f].align()},g:function(a){var e=this.createElement("g");return a?e.attr({"class":"highcharts-"+a}):e},image:function(a,e,q,b,f,k){var l={preserveAspectRatio:"none"},d,g=function(a,e){a.setAttributeNS?a.setAttributeNS("http://www.w3.org/1999/xlink",
+"href",e):a.setAttribute("hc-svg-href",e)},A=function(e){g(d.element,a);k.call(d,e)};1<arguments.length&&p(l,{x:e,y:q,width:b,height:f});d=this.createElement("image").attr(l);k?(g(d.element,"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw\x3d\x3d"),l=new S.Image,E(l,"load",A),l.src=a,l.complete&&A({})):g(d.element,a);return d},symbol:function(a,e,q,b,f,k){var l=this,d,g=/^url\((.*?)\)$/,A=g.test(a),K=!A&&(this.symbols[a]?a:"circle"),C=K&&this.symbols[K],x=n(e)&&C&&C.call(this.symbols,
+Math.round(e),Math.round(q),b,f,k),c,t;C?(d=this.path(x),l.styledMode||d.attr("fill","none"),p(d,{symbolName:K,x:e,y:q,width:b,height:f}),k&&p(d,k)):A&&(c=a.match(g)[1],d=this.image(c),d.imgwidth=B(M[c]&&M[c].width,k&&k.width),d.imgheight=B(M[c]&&M[c].height,k&&k.height),t=function(){d.attr({width:d.width,height:d.height})},["width","height"].forEach(function(a){d[a+"Setter"]=function(a,e){var q={},b=this["img"+e],f="width"===e?"translateX":"translateY";this[e]=a;n(b)&&(this.element&&this.element.setAttribute(e,
+b),this.alignByTranslate||(q[f]=((this[e]||0)-b)/2,this.attr(q)))}}),n(e)&&d.attr({x:e,y:q}),d.isImg=!0,n(d.imgwidth)&&n(d.imgheight)?t():(d.attr({width:0,height:0}),w("img",{onload:function(){var a=r[l.chartIndex];0===this.width&&(v(this,{position:"absolute",top:"-999em"}),m.body.appendChild(this));M[c]={width:this.width,height:this.height};d.imgwidth=this.width;d.imgheight=this.height;d.element&&t();this.parentNode&&this.parentNode.removeChild(this);l.imgCount--;if(!l.imgCount&&a&&a.onload)a.onload()},
+src:c}),this.imgCount++));return d},symbols:{circle:function(a,e,q,b){return this.arc(a+q/2,e+b/2,q/2,b/2,{start:0,end:2*Math.PI,open:!1})},square:function(a,e,q,b){return["M",a,e,"L",a+q,e,a+q,e+b,a,e+b,"Z"]},triangle:function(a,e,q,b){return["M",a+q/2,e,"L",a+q,e+b,a,e+b,"Z"]},"triangle-down":function(a,e,q,b){return["M",a,e,"L",a+q,e,a+q/2,e+b,"Z"]},diamond:function(a,e,q,b){return["M",a+q/2,e,"L",a+q,e+b/2,a+q/2,e+b,a,e+b/2,"Z"]},arc:function(a,e,q,b,f){var k=f.start,d=f.r||q,l=f.r||b||q,p=f.end-
+.001;q=f.innerR;b=B(f.open,.001>Math.abs(f.end-f.start-2*Math.PI));var g=Math.cos(k),A=Math.sin(k),K=Math.cos(p),p=Math.sin(p);f=.001>f.end-k-Math.PI?0:1;d=["M",a+d*g,e+l*A,"A",d,l,0,f,1,a+d*K,e+l*p];n(q)&&d.push(b?"M":"L",a+q*K,e+q*p,"A",q,q,0,f,0,a+q*g,e+q*A);d.push(b?"":"Z");return d},callout:function(a,e,q,b,f){var k=Math.min(f&&f.r||0,q,b),d=k+6,l=f&&f.anchorX;f=f&&f.anchorY;var p;p=["M",a+k,e,"L",a+q-k,e,"C",a+q,e,a+q,e,a+q,e+k,"L",a+q,e+b-k,"C",a+q,e+b,a+q,e+b,a+q-k,e+b,"L",a+k,e+b,"C",a,e+
+b,a,e+b,a,e+b-k,"L",a,e+k,"C",a,e,a,e,a+k,e];l&&l>q?f>e+d&&f<e+b-d?p.splice(13,3,"L",a+q,f-6,a+q+6,f,a+q,f+6,a+q,e+b-k):p.splice(13,3,"L",a+q,b/2,l,f,a+q,b/2,a+q,e+b-k):l&&0>l?f>e+d&&f<e+b-d?p.splice(33,3,"L",a,f+6,a-6,f,a,f-6,a,e+k):p.splice(33,3,"L",a,b/2,l,f,a,b/2,a,e+k):f&&f>b&&l>a+d&&l<a+q-d?p.splice(23,3,"L",l+6,e+b,l,e+b+6,l-6,e+b,a+k,e+b):f&&0>f&&l>a+d&&l<a+q-d&&p.splice(3,3,"L",l-6,e,l,e-6,l+6,e,q-k,e);return p}},clipRect:function(e,q,b,f){var k=a.uniqueKey(),l=this.createElement("clipPath").attr({id:k}).add(this.defs);
+e=this.rect(e,q,b,f,0).add(l);e.id=k;e.clipPath=l;e.count=0;return e},text:function(a,e,q,b){var f={};if(b&&(this.allowHTML||!this.forExport))return this.html(a,e,q);f.x=Math.round(e||0);q&&(f.y=Math.round(q));n(a)&&(f.text=a);a=this.createElement("text").attr(f);b||(a.xSetter=function(a,e,q){var b=q.getElementsByTagName("tspan"),f,k=q.getAttribute(e),l;for(l=0;l<b.length;l++)f=b[l],f.getAttribute(e)===k&&f.setAttribute(e,a);q.setAttribute(e,a)});return a},fontMetrics:function(a,q){a=this.styledMode?
+q&&y.prototype.getStyle.call(q,"font-size"):a||q&&q.style&&q.style.fontSize||this.style&&this.style.fontSize;a=/px/.test(a)?e(a):/em/.test(a)?parseFloat(a)*(q?this.fontMetrics(null,q.parentNode).f:16):12;q=24>a?a+3:Math.round(1.2*a);return{h:q,b:Math.round(.8*q),f:a}},rotCorr:function(a,e,q){var b=a;e&&q&&(b=Math.max(b*Math.cos(e*g),4));return{x:-a/3*Math.sin(e*g),y:b}},label:function(e,b,f,l,d,g,A,K,c){var m=this,x=m.styledMode,t=m.g("button"!==c&&"label"),I=t.text=m.text("",0,0,A).attr({zIndex:1}),
+D,L,C=0,B=3,z=0,H,h,F,M,R,w={},r,u,S=/^url\((.*?)\)$/.test(l),v=x||S,N=function(){return x?D.strokeWidth()%2/2:(r?parseInt(r,10):0)%2/2},P,T,E;c&&t.addClass("highcharts-"+c);P=function(){var a=I.element.style,e={};L=(void 0===H||void 0===h||R)&&n(I.textStr)&&I.getBBox();t.width=(H||L.width||0)+2*B+z;t.height=(h||L.height||0)+2*B;u=B+Math.min(m.fontMetrics(a&&a.fontSize,I).b,L?L.height:Infinity);v&&(D||(t.box=D=m.symbols[l]||S?m.symbol(l):m.rect(),D.addClass(("button"===c?"":"highcharts-label-box")+
+(c?" highcharts-"+c+"-box":"")),D.add(t),a=N(),e.x=a,e.y=(K?-u:0)+a),e.width=Math.round(t.width),e.height=Math.round(t.height),D.attr(p(e,w)),w={})};T=function(){var a=z+B,e;e=K?0:u;n(H)&&L&&("center"===R||"right"===R)&&(a+={center:.5,right:1}[R]*(H-L.width));if(a!==I.x||e!==I.y)I.attr("x",a),I.hasBoxWidthChanged&&(L=I.getBBox(!0),P()),void 0!==e&&I.attr("y",e);I.x=a;I.y=e};E=function(a,e){D?D.attr(a,e):w[a]=e};t.onAdd=function(){I.add(t);t.attr({text:e||0===e?e:"",x:b,y:f});D&&n(d)&&t.attr({anchorX:d,
+anchorY:g})};t.widthSetter=function(e){H=a.isNumber(e)?e:null};t.heightSetter=function(a){h=a};t["text-alignSetter"]=function(a){R=a};t.paddingSetter=function(a){n(a)&&a!==B&&(B=t.padding=a,T())};t.paddingLeftSetter=function(a){n(a)&&a!==z&&(z=a,T())};t.alignSetter=function(a){a={left:0,center:.5,right:1}[a];a!==C&&(C=a,L&&t.attr({x:F}))};t.textSetter=function(a){void 0!==a&&I.textSetter(a);P();T()};t["stroke-widthSetter"]=function(a,e){a&&(v=!0);r=this["stroke-width"]=a;E(e,a)};x?t.rSetter=function(a,
+e){E(e,a)}:t.strokeSetter=t.fillSetter=t.rSetter=function(a,e){"r"!==e&&("fill"===e&&a&&(v=!0),t[e]=a);E(e,a)};t.anchorXSetter=function(a,e){d=t.anchorX=a;E(e,Math.round(a)-N()-F)};t.anchorYSetter=function(a,e){g=t.anchorY=a;E(e,a-M)};t.xSetter=function(a){t.x=a;C&&(a-=C*((H||L.width)+2*B),t["forceAnimate:x"]=!0);F=Math.round(a);t.attr("translateX",F)};t.ySetter=function(a){M=t.y=Math.round(a);t.attr("translateY",M)};var Q=t.css;A={css:function(a){if(a){var e={};a=k(a);t.textProps.forEach(function(q){void 0!==
+a[q]&&(e[q]=a[q],delete a[q])});I.css(e);"width"in e&&P();"fontSize"in e&&(P(),T())}return Q.call(t,a)},getBBox:function(){return{width:L.width+2*B,height:L.height+2*B,x:L.x-B,y:L.y-B}},destroy:function(){q(t.element,"mouseenter");q(t.element,"mouseleave");I&&(I=I.destroy());D&&(D=D.destroy());y.prototype.destroy.call(t);t=m=P=T=E=null}};x||(A.shadow=function(a){a&&(P(),D&&D.shadow(a));return t});return p(t,A)}});a.Renderer=G})(J);(function(a){var y=a.attr,G=a.createElement,E=a.css,h=a.defined,c=
+a.extend,r=a.isFirefox,u=a.isMS,v=a.isWebKit,w=a.pick,n=a.pInt,g=a.SVGRenderer,d=a.win,m=a.wrap;c(a.SVGElement.prototype,{htmlCss:function(a){var b="SPAN"===this.element.tagName&&a&&"width"in a,l=w(b&&a.width,void 0),f;b&&(delete a.width,this.textWidth=l,f=!0);a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=c(this.styles,a);E(this.element,a);f&&this.htmlUpdateTransform();return this},htmlGetBBox:function(){var a=this.element;return{x:a.offsetLeft,y:a.offsetTop,
+width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,l=this.translateX||0,f=this.translateY||0,d=this.x||0,g=this.y||0,m=this.textAlign||"left",c={left:0,center:.5,right:1}[m],z=this.styles,k=z&&z.whiteSpace;E(b,{marginLeft:l,marginTop:f});!a.styledMode&&this.shadows&&this.shadows.forEach(function(a){E(a,{marginLeft:l+1,marginTop:f+1})});this.inverted&&b.childNodes.forEach(function(e){a.invertChild(e,b)});if("SPAN"===b.tagName){var z=
+this.rotation,A=this.textWidth&&n(this.textWidth),D=[z,m,b.innerHTML,this.textWidth,this.textAlign].join(),B;(B=A!==this.oldTextWidth)&&!(B=A>this.oldTextWidth)&&((B=this.textPxLength)||(E(b,{width:"",whiteSpace:k||"nowrap"}),B=b.offsetWidth),B=B>A);B&&(/[ \-]/.test(b.textContent||b.innerText)||"ellipsis"===b.style.textOverflow)?(E(b,{width:A+"px",display:"block",whiteSpace:k||"normal"}),this.oldTextWidth=A,this.hasBoxWidthChanged=!0):this.hasBoxWidthChanged=!1;D!==this.cTT&&(k=a.fontMetrics(b.style.fontSize,
+b).b,!h(z)||z===(this.oldRotation||0)&&m===this.oldAlign||this.setSpanRotation(z,c,k),this.getSpanCorrection(!h(z)&&this.textPxLength||b.offsetWidth,k,c,z,m));E(b,{left:d+(this.xCorr||0)+"px",top:g+(this.yCorr||0)+"px"});this.cTT=D;this.oldRotation=z;this.oldAlign=m}}else this.alignOnAdd=!0},setSpanRotation:function(a,b,l){var f={},d=this.renderer.getTransformKey();f[d]=f.transform="rotate("+a+"deg)";f[d+(r?"Origin":"-origin")]=f.transformOrigin=100*b+"% "+l+"px";E(this.element,f)},getSpanCorrection:function(a,
+b,l){this.xCorr=-a*l;this.yCorr=-b}});c(g.prototype,{getTransformKey:function(){return u&&!/Edge/.test(d.navigator.userAgent)?"-ms-transform":v?"-webkit-transform":r?"MozTransform":d.opera?"-o-transform":""},html:function(d,b,l){var f=this.createElement("span"),g=f.element,p=f.renderer,n=p.isSVG,h=function(a,b){["opacity","visibility"].forEach(function(f){m(a,f+"Setter",function(a,e,q,f){a.call(this,e,q,f);b[q]=e})});a.addedSetters=!0},z=a.charts[p.chartIndex],z=z&&z.styledMode;f.textSetter=function(a){a!==
+g.innerHTML&&delete this.bBox;this.textStr=a;g.innerHTML=w(a,"");f.doTransform=!0};n&&h(f,f.element.style);f.xSetter=f.ySetter=f.alignSetter=f.rotationSetter=function(a,b){"align"===b&&(b="textAlign");f[b]=a;f.doTransform=!0};f.afterSetters=function(){this.doTransform&&(this.htmlUpdateTransform(),this.doTransform=!1)};f.attr({text:d,x:Math.round(b),y:Math.round(l)}).css({position:"absolute"});z||f.css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});g.style.whiteSpace="nowrap";f.css=
+f.htmlCss;n&&(f.add=function(a){var b,l=p.box.parentNode,k=[];if(this.parentGroup=a){if(b=a.div,!b){for(;a;)k.push(a),a=a.parentGroup;k.reverse().forEach(function(a){function e(e,q){a[q]=e;"translateX"===q?d.left=e+"px":d.top=e+"px";a.doTransform=!0}var d,g=y(a.element,"class");g&&(g={className:g});b=a.div=a.div||G("div",g,{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},b||l);d=b.style;
+c(a,{classSetter:function(a){return function(e){this.element.setAttribute("class",e);a.className=e}}(b),on:function(){k[0].div&&f.on.apply({element:k[0].div},arguments);return a},translateXSetter:e,translateYSetter:e});a.addedSetters||h(a,d)})}}else b=l;b.appendChild(g);f.added=!0;f.alignOnAdd&&f.htmlUpdateTransform();return f});return f}})})(J);(function(a){var y=a.defined,G=a.extend,E=a.merge,h=a.pick,c=a.timeUnits,r=a.win;a.Time=function(a){this.update(a,!1)};a.Time.prototype={defaultOptions:{},
+update:function(a){var c=h(a&&a.useUTC,!0),w=this;this.options=a=E(!0,this.options||{},a);this.Date=a.Date||r.Date;this.timezoneOffset=(this.useUTC=c)&&a.timezoneOffset;this.getTimezoneOffset=this.timezoneOffsetFunction();(this.variableTimezone=!(c&&!a.getTimezoneOffset&&!a.timezone))||this.timezoneOffset?(this.get=function(a,g){var d=g.getTime(),m=d-w.getTimezoneOffset(g);g.setTime(m);a=g["getUTC"+a]();g.setTime(d);return a},this.set=function(a,g,d){var m;if("Milliseconds"===a||"Seconds"===a||"Minutes"===
+a&&0===g.getTimezoneOffset()%60)g["set"+a](d);else m=w.getTimezoneOffset(g),m=g.getTime()-m,g.setTime(m),g["setUTC"+a](d),a=w.getTimezoneOffset(g),m=g.getTime()+a,g.setTime(m)}):c?(this.get=function(a,g){return g["getUTC"+a]()},this.set=function(a,g,d){return g["setUTC"+a](d)}):(this.get=function(a,g){return g["get"+a]()},this.set=function(a,g,d){return g["set"+a](d)})},makeTime:function(c,r,w,n,g,d){var m,p,b;this.useUTC?(m=this.Date.UTC.apply(0,arguments),p=this.getTimezoneOffset(m),m+=p,b=this.getTimezoneOffset(m),
+p!==b?m+=b-p:p-36E5!==this.getTimezoneOffset(m-36E5)||a.isSafari||(m-=36E5)):m=(new this.Date(c,r,h(w,1),h(n,0),h(g,0),h(d,0))).getTime();return m},timezoneOffsetFunction:function(){var c=this,h=this.options,w=r.moment;if(!this.useUTC)return function(a){return 6E4*(new Date(a)).getTimezoneOffset()};if(h.timezone){if(w)return function(a){return 6E4*-w.tz(a,h.timezone).utcOffset()};a.error(25)}return this.useUTC&&h.getTimezoneOffset?function(a){return 6E4*h.getTimezoneOffset(a)}:function(){return 6E4*
+(c.timezoneOffset||0)}},dateFormat:function(c,h,w){if(!a.defined(h)||isNaN(h))return a.defaultOptions.lang.invalidDate||"";c=a.pick(c,"%Y-%m-%d %H:%M:%S");var n=this,g=new this.Date(h),d=this.get("Hours",g),m=this.get("Day",g),p=this.get("Date",g),b=this.get("Month",g),l=this.get("FullYear",g),f=a.defaultOptions.lang,x=f.weekdays,t=f.shortWeekdays,H=a.pad,g=a.extend({a:t?t[m]:x[m].substr(0,3),A:x[m],d:H(p),e:H(p,2," "),w:m,b:f.shortMonths[b],B:f.months[b],m:H(b+1),o:b+1,y:l.toString().substr(2,2),
+Y:l,H:H(d),k:d,I:H(d%12||12),l:d%12||12,M:H(n.get("Minutes",g)),p:12>d?"AM":"PM",P:12>d?"am":"pm",S:H(g.getSeconds()),L:H(Math.floor(h%1E3),3)},a.dateFormats);a.objectEach(g,function(a,b){for(;-1!==c.indexOf("%"+b);)c=c.replace("%"+b,"function"===typeof a?a.call(n,h):a)});return w?c.substr(0,1).toUpperCase()+c.substr(1):c},resolveDTLFormat:function(c){return a.isObject(c,!0)?c:(c=a.splat(c),{main:c[0],from:c[1],to:c[2]})},getTimeTicks:function(a,r,w,n){var g=this,d=[],m,p={},b;m=new g.Date(r);var l=
+a.unitRange,f=a.count||1,x;n=h(n,1);if(y(r)){g.set("Milliseconds",m,l>=c.second?0:f*Math.floor(g.get("Milliseconds",m)/f));l>=c.second&&g.set("Seconds",m,l>=c.minute?0:f*Math.floor(g.get("Seconds",m)/f));l>=c.minute&&g.set("Minutes",m,l>=c.hour?0:f*Math.floor(g.get("Minutes",m)/f));l>=c.hour&&g.set("Hours",m,l>=c.day?0:f*Math.floor(g.get("Hours",m)/f));l>=c.day&&g.set("Date",m,l>=c.month?1:Math.max(1,f*Math.floor(g.get("Date",m)/f)));l>=c.month&&(g.set("Month",m,l>=c.year?0:f*Math.floor(g.get("Month",
+m)/f)),b=g.get("FullYear",m));l>=c.year&&g.set("FullYear",m,b-b%f);l===c.week&&(b=g.get("Day",m),g.set("Date",m,g.get("Date",m)-b+n+(b<n?-7:0)));b=g.get("FullYear",m);n=g.get("Month",m);var t=g.get("Date",m),H=g.get("Hours",m);r=m.getTime();g.variableTimezone&&(x=w-r>4*c.month||g.getTimezoneOffset(r)!==g.getTimezoneOffset(w));r=m.getTime();for(m=1;r<w;)d.push(r),r=l===c.year?g.makeTime(b+m*f,0):l===c.month?g.makeTime(b,n+m*f):!x||l!==c.day&&l!==c.week?x&&l===c.hour&&1<f?g.makeTime(b,n,t,H+m*f):r+
+l*f:g.makeTime(b,n,t+m*f*(l===c.day?1:7)),m++;d.push(r);l<=c.hour&&1E4>d.length&&d.forEach(function(a){0===a%18E5&&"000000000"===g.dateFormat("%H%M%S%L",a)&&(p[a]="day")})}d.info=G(a,{higherRanks:p,totalRange:l*f});return d}}})(J);(function(a){var y=a.color,G=a.merge;a.defaultOptions={colors:"#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "),symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January February March April May June July August September October November December".split(" "),
+shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),weekdays:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),decimalPoint:".",numericSymbols:"kMGTPE".split(""),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{},time:a.Time.prototype.defaultOptions,chart:{styledMode:!1,borderRadius:0,colorCount:10,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:6},position:{align:"right",
+x:-10,y:10}},width:null,height:null,borderColor:"#335cad",backgroundColor:"#ffffff",plotBorderColor:"#cccccc"},title:{text:"Chart title",align:"center",margin:15,widthAdjust:-44},subtitle:{text:"",align:"center",widthAdjust:-44},plotOptions:{},labels:{style:{position:"absolute",color:"#333333"}},legend:{enabled:!0,align:"center",alignColumns:!0,layout:"horizontal",labelFormatter:function(){return this.name},borderColor:"#999999",borderRadius:0,navigation:{activeColor:"#003399",inactiveColor:"#cccccc"},
+itemStyle:{color:"#333333",cursor:"pointer",fontSize:"12px",fontWeight:"bold",textOverflow:"ellipsis"},itemHoverStyle:{color:"#000000"},itemHiddenStyle:{color:"#cccccc"},shadow:!1,itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},squareSymbol:!0,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:"#ffffff",opacity:.5,textAlign:"center"}},tooltip:{enabled:!0,
+animation:a.svg,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},footerFormat:"",padding:8,snap:a.isTouchDevice?25:10,headerFormat:'\x3cspan style\x3d"font-size: 10px"\x3e{point.key}\x3c/span\x3e\x3cbr/\x3e',pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e',
+backgroundColor:y("#f7f7f7").setOpacity(.85).get(),borderWidth:1,shadow:!0,style:{color:"#333333",cursor:"default",fontSize:"12px",pointerEvents:"none",whiteSpace:"nowrap"}},credits:{enabled:!0,href:"https://www.highcharts.com?credits",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#999999",fontSize:"9px"},text:"Highcharts.com"}};a.setOptions=function(y){a.defaultOptions=G(!0,a.defaultOptions,y);a.time.update(G(a.defaultOptions.global,a.defaultOptions.time),
+!1);return a.defaultOptions};a.getOptions=function(){return a.defaultOptions};a.defaultPlotOptions=a.defaultOptions.plotOptions;a.time=new a.Time(G(a.defaultOptions.global,a.defaultOptions.time));a.dateFormat=function(y,h,c){return a.time.dateFormat(y,h,c)}})(J);(function(a){var y=a.correctFloat,G=a.defined,E=a.destroyObjectProperties,h=a.fireEvent,c=a.isNumber,r=a.merge,u=a.pick,v=a.deg2rad;a.Tick=function(a,c,g,d,m){this.axis=a;this.pos=c;this.type=g||"";this.isNewLabel=this.isNew=!0;this.parameters=
+m||{};this.tickmarkOffset=this.parameters.tickmarkOffset;this.options=this.parameters.options;g||d||this.addLabel()};a.Tick.prototype={addLabel:function(){var c=this,n=c.axis,g=n.options,d=n.chart,m=n.categories,p=n.names,b=c.pos,l=u(c.options&&c.options.labels,g.labels),f=n.tickPositions,x=b===f[0],t=b===f[f.length-1],m=this.parameters.category||(m?u(m[b],p[b],b):b),h=c.label,f=f.info,F,z,k,A;n.isDatetimeAxis&&f&&(z=d.time.resolveDTLFormat(g.dateTimeLabelFormats[!g.grid&&f.higherRanks[b]||f.unitName]),
+F=z.main);c.isFirst=x;c.isLast=t;c.formatCtx={axis:n,chart:d,isFirst:x,isLast:t,dateTimeLabelFormat:F,tickPositionInfo:f,value:n.isLog?y(n.lin2log(m)):m,pos:b};g=n.labelFormatter.call(c.formatCtx,this.formatCtx);if(A=z&&z.list)c.shortenLabel=function(){for(k=0;k<A.length;k++)if(h.attr({text:n.labelFormatter.call(a.extend(c.formatCtx,{dateTimeLabelFormat:A[k]}))}),h.getBBox().width<n.getSlotWidth(c)-2*u(l.padding,5))return;h.attr({text:""})};if(G(h))h&&h.textStr!==g&&(!h.textWidth||l.style&&l.style.width||
+h.styles.width||h.css({width:null}),h.attr({text:g}));else{if(c.label=h=G(g)&&l.enabled?d.renderer.text(g,0,0,l.useHTML).add(n.labelGroup):null)d.styledMode||h.css(r(l.style)),h.textPxLength=h.getBBox().width;c.rotation=0}},getLabelSize:function(){return this.label?this.label.getBBox()[this.axis.horiz?"height":"width"]:0},handleOverflow:function(a){var c=this.axis,g=c.options.labels,d=a.x,m=c.chart.chartWidth,p=c.chart.spacing,b=u(c.labelLeft,Math.min(c.pos,p[3])),p=u(c.labelRight,Math.max(c.isRadial?
+0:c.pos+c.len,m-p[1])),l=this.label,f=this.rotation,x={left:0,center:.5,right:1}[c.labelAlign||l.attr("align")],t=l.getBBox().width,h=c.getSlotWidth(this),F=h,z=1,k,A={};if(f||"justify"!==u(g.overflow,"justify"))0>f&&d-x*t<b?k=Math.round(d/Math.cos(f*v)-b):0<f&&d+x*t>p&&(k=Math.round((m-d)/Math.cos(f*v)));else if(m=d+(1-x)*t,d-x*t<b?F=a.x+F*(1-x)-b:m>p&&(F=p-a.x+F*x,z=-1),F=Math.min(h,F),F<h&&"center"===c.labelAlign&&(a.x+=z*(h-F-x*(h-Math.min(t,F)))),t>F||c.autoRotation&&(l.styles||{}).width)k=F;
+k&&(this.shortenLabel?this.shortenLabel():(A.width=Math.floor(k),(g.style||{}).textOverflow||(A.textOverflow="ellipsis"),l.css(A)))},getPosition:function(c,n,g,d){var m=this.axis,p=m.chart,b=d&&p.oldChartHeight||p.chartHeight;c={x:c?a.correctFloat(m.translate(n+g,null,null,d)+m.transB):m.left+m.offset+(m.opposite?(d&&p.oldChartWidth||p.chartWidth)-m.right-m.left:0),y:c?b-m.bottom+m.offset-(m.opposite?m.height:0):a.correctFloat(b-m.translate(n+g,null,null,d)-m.transB)};h(this,"afterGetPosition",{pos:c});
+return c},getLabelPosition:function(a,c,g,d,m,p,b,l){var f=this.axis,x=f.transA,t=f.reversed,n=f.staggerLines,F=f.tickRotCorr||{x:0,y:0},z=m.y,k=d||f.reserveSpaceDefault?0:-f.labelOffset*("center"===f.labelAlign?.5:1),A={};G(z)||(z=0===f.side?g.rotation?-8:-g.getBBox().height:2===f.side?F.y+8:Math.cos(g.rotation*v)*(F.y-g.getBBox(!1,0).height/2));a=a+m.x+k+F.x-(p&&d?p*x*(t?-1:1):0);c=c+z-(p&&!d?p*x*(t?1:-1):0);n&&(g=b/(l||1)%n,f.opposite&&(g=n-g-1),c+=f.labelOffset/n*g);A.x=a;A.y=Math.round(c);h(this,
+"afterGetLabelPosition",{pos:A});return A},getMarkPath:function(a,c,g,d,m,p){return p.crispLine(["M",a,c,"L",a+(m?0:-g),c+(m?g:0)],d)},renderGridLine:function(a,c,g){var d=this.axis,m=d.options,p=this.gridLine,b={},l=this.pos,f=this.type,x=u(this.tickmarkOffset,d.tickmarkOffset),t=d.chart.renderer,n=f?f+"Grid":"grid",h=m[n+"LineWidth"],z=m[n+"LineColor"],m=m[n+"LineDashStyle"];p||(d.chart.styledMode||(b.stroke=z,b["stroke-width"]=h,m&&(b.dashstyle=m)),f||(b.zIndex=1),a&&(c=0),this.gridLine=p=t.path().attr(b).addClass("highcharts-"+
+(f?f+"-":"")+"grid-line").add(d.gridGroup));if(p&&(g=d.getPlotLinePath(l+x,p.strokeWidth()*g,a,"pass")))p[a||this.isNew?"attr":"animate"]({d:g,opacity:c})},renderMark:function(a,c,g){var d=this.axis,m=d.options,p=d.chart.renderer,b=this.type,l=b?b+"Tick":"tick",f=d.tickSize(l),x=this.mark,t=!x,n=a.x;a=a.y;var h=u(m[l+"Width"],!b&&d.isXAxis?1:0),m=m[l+"Color"];f&&(d.opposite&&(f[0]=-f[0]),t&&(this.mark=x=p.path().addClass("highcharts-"+(b?b+"-":"")+"tick").add(d.axisGroup),d.chart.styledMode||x.attr({stroke:m,
+"stroke-width":h})),x[t?"attr":"animate"]({d:this.getMarkPath(n,a,f[0],x.strokeWidth()*g,d.horiz,p),opacity:c}))},renderLabel:function(a,n,g,d){var m=this.axis,p=m.horiz,b=m.options,l=this.label,f=b.labels,x=f.step,m=u(this.tickmarkOffset,m.tickmarkOffset),t=!0,h=a.x;a=a.y;l&&c(h)&&(l.xy=a=this.getLabelPosition(h,a,l,p,f,m,d,x),this.isFirst&&!this.isLast&&!u(b.showFirstLabel,1)||this.isLast&&!this.isFirst&&!u(b.showLastLabel,1)?t=!1:!p||f.step||f.rotation||n||0===g||this.handleOverflow(a),x&&d%x&&
+(t=!1),t&&c(a.y)?(a.opacity=g,l[this.isNewLabel?"attr":"animate"](a),this.isNewLabel=!1):(l.attr("y",-9999),this.isNewLabel=!0))},render:function(c,n,g){var d=this.axis,m=d.horiz,p=this.pos,b=u(this.tickmarkOffset,d.tickmarkOffset),p=this.getPosition(m,p,b,n),b=p.x,l=p.y,d=m&&b===d.pos+d.len||!m&&l===d.pos?-1:1;g=u(g,1);this.isActive=!0;this.renderGridLine(n,g,d);this.renderMark(p,g,d);this.renderLabel(p,n,g,c);this.isNew=!1;a.fireEvent(this,"afterRender")},destroy:function(){E(this,this.axis)}}})(J);
+var V=function(a){var y=a.addEvent,G=a.animObject,E=a.arrayMax,h=a.arrayMin,c=a.color,r=a.correctFloat,u=a.defaultOptions,v=a.defined,w=a.deg2rad,n=a.destroyObjectProperties,g=a.extend,d=a.fireEvent,m=a.format,p=a.getMagnitude,b=a.isArray,l=a.isNumber,f=a.isString,x=a.merge,t=a.normalizeTickInterval,H=a.objectEach,F=a.pick,z=a.removeEvent,k=a.splat,A=a.syncTimeout,D=a.Tick,B=function(){this.init.apply(this,arguments)};a.extend(B.prototype,{defaultOptions:{dateTimeLabelFormats:{millisecond:{main:"%H:%M:%S.%L",
+range:!1},second:{main:"%H:%M:%S",range:!1},minute:{main:"%H:%M",range:!1},hour:{main:"%H:%M",range:!1},day:{main:"%e. %b"},week:{main:"%e. %b"},month:{main:"%b '%y"},year:{main:"%Y"}},endOnTick:!1,labels:{enabled:!0,indentation:10,x:0,style:{color:"#666666",cursor:"default",fontSize:"11px"}},maxPadding:.01,minorTickLength:2,minorTickPosition:"outside",minPadding:.01,startOfWeek:1,startOnTick:!1,tickLength:10,tickPixelInterval:100,tickmarkPlacement:"between",tickPosition:"outside",title:{align:"middle",
+style:{color:"#666666"}},type:"linear",minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#ccd6eb",lineWidth:1,gridLineColor:"#e6e6e6",tickColor:"#ccd6eb"},defaultYAxisOptions:{endOnTick:!0,maxPadding:.05,minPadding:.05,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{allowOverlap:!1,enabled:!1,formatter:function(){return a.numberFormat(this.total,-1)},style:{color:"#000000",fontSize:"11px",fontWeight:"bold",
+textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15},title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},init:function(a,q){var e=q.isX,b=this;b.chart=a;b.horiz=a.inverted&&!b.isZAxis?!e:e;b.isXAxis=e;b.coll=b.coll||(e?"xAxis":"yAxis");d(this,"init",{userOptions:q});b.opposite=
+q.opposite;b.side=q.side||(b.horiz?b.opposite?0:2:b.opposite?1:3);b.setOptions(q);var f=this.options,l=f.type;b.labelFormatter=f.labels.formatter||b.defaultLabelFormatter;b.userOptions=q;b.minPixelPadding=0;b.reversed=f.reversed;b.visible=!1!==f.visible;b.zoomEnabled=!1!==f.zoomEnabled;b.hasNames="category"===l||!0===f.categories;b.categories=f.categories||b.hasNames;b.names||(b.names=[],b.names.keys={});b.plotLinesAndBandsGroups={};b.isLog="logarithmic"===l;b.isDatetimeAxis="datetime"===l;b.positiveValuesOnly=
+b.isLog&&!b.allowNegativeLog;b.isLinked=v(f.linkedTo);b.ticks={};b.labelEdge=[];b.minorTicks={};b.plotLinesAndBands=[];b.alternateBands={};b.len=0;b.minRange=b.userMinRange=f.minRange||f.maxZoom;b.range=f.range;b.offset=f.offset||0;b.stacks={};b.oldStacks={};b.stacksTouched=0;b.max=null;b.min=null;b.crosshair=F(f.crosshair,k(a.options.tooltip.crosshairs)[e?0:1],!1);q=b.options.events;-1===a.axes.indexOf(b)&&(e?a.axes.splice(a.xAxis.length,0,b):a.axes.push(b),a[b.coll].push(b));b.series=b.series||
+[];a.inverted&&!b.isZAxis&&e&&void 0===b.reversed&&(b.reversed=!0);H(q,function(a,e){y(b,e,a)});b.lin2log=f.linearToLogConverter||b.lin2log;b.isLog&&(b.val2lin=b.log2lin,b.lin2val=b.lin2log);d(this,"afterInit")},setOptions:function(a){this.options=x(this.defaultOptions,"yAxis"===this.coll&&this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],x(u[this.coll],a));d(this,"afterSetOptions",{userOptions:a})},
+defaultLabelFormatter:function(){var e=this.axis,q=this.value,b=e.chart.time,f=e.categories,l=this.dateTimeLabelFormat,k=u.lang,d=k.numericSymbols,k=k.numericSymbolMagnitude||1E3,g=d&&d.length,c,p=e.options.labels.format,e=e.isLog?Math.abs(q):e.tickInterval;if(p)c=m(p,this,b);else if(f)c=q;else if(l)c=b.dateFormat(l,q);else if(g&&1E3<=e)for(;g--&&void 0===c;)b=Math.pow(k,g+1),e>=b&&0===10*q%b&&null!==d[g]&&0!==q&&(c=a.numberFormat(q/b,-1)+d[g]);void 0===c&&(c=1E4<=Math.abs(q)?a.numberFormat(q,-1):
+a.numberFormat(q,-1,void 0,""));return c},getSeriesExtremes:function(){var a=this,q=a.chart;d(this,"getSeriesExtremes",null,function(){a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();a.series.forEach(function(e){if(e.visible||!q.options.chart.ignoreHiddenSeries){var b=e.options,f=b.threshold,k;a.hasVisibleSeries=!0;a.positiveValuesOnly&&0>=f&&(f=null);if(a.isXAxis)b=e.xData,b.length&&(e=h(b),k=E(b),l(e)||e instanceof Date||(b=b.filter(l),
+e=h(b),k=E(b)),b.length&&(a.dataMin=Math.min(F(a.dataMin,b[0],e),e),a.dataMax=Math.max(F(a.dataMax,b[0],k),k)));else if(e.getExtremes(),k=e.dataMax,e=e.dataMin,v(e)&&v(k)&&(a.dataMin=Math.min(F(a.dataMin,e),e),a.dataMax=Math.max(F(a.dataMax,k),k)),v(f)&&(a.threshold=f),!b.softThreshold||a.positiveValuesOnly)a.softThreshold=!1}})});d(this,"afterGetSeriesExtremes")},translate:function(a,q,b,f,k,d){var e=this.linkedParent||this,c=1,g=0,p=f?e.oldTransA:e.transA;f=f?e.oldMin:e.min;var A=e.minPixelPadding;
+k=(e.isOrdinal||e.isBroken||e.isLog&&k)&&e.lin2val;p||(p=e.transA);b&&(c*=-1,g=e.len);e.reversed&&(c*=-1,g-=c*(e.sector||e.len));q?(a=(a*c+g-A)/p+f,k&&(a=e.lin2val(a))):(k&&(a=e.val2lin(a)),a=l(f)?c*(a-f)*p+g+c*A+(l(d)?p*d:0):void 0);return a},toPixels:function(a,q){return this.translate(a,!1,!this.horiz,null,!0)+(q?0:this.pos)},toValue:function(a,q){return this.translate(a-(q?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,q,b,f,k){var e=this.chart,d=this.left,c=this.top,g,p,A=b&&
+e.oldChartHeight||e.chartHeight,t=b&&e.oldChartWidth||e.chartWidth,m;g=this.transB;var x=function(a,e,q){if("pass"!==f&&a<e||a>q)f?a=Math.min(Math.max(e,a),q):m=!0;return a};k=F(k,this.translate(a,null,null,b));k=Math.min(Math.max(-1E5,k),1E5);a=b=Math.round(k+g);g=p=Math.round(A-k-g);l(k)?this.horiz?(g=c,p=A-this.bottom,a=b=x(a,d,d+this.width)):(a=d,b=t-this.right,g=p=x(g,c,c+this.height)):(m=!0,f=!1);return m&&!f?null:e.renderer.crispLine(["M",a,g,"L",b,p],q||1)},getLinearTickPositions:function(a,
+q,b){var e,f=r(Math.floor(q/a)*a);b=r(Math.ceil(b/a)*a);var k=[],d;r(f+a)===f&&(d=20);if(this.single)return[q];for(q=f;q<=b;){k.push(q);q=r(q+a,d);if(q===e)break;e=q}return k},getMinorTickInterval:function(){var a=this.options;return!0===a.minorTicks?F(a.minorTickInterval,"auto"):!1===a.minorTicks?null:a.minorTickInterval},getMinorTickPositions:function(){var a=this,q=a.options,b=a.tickPositions,f=a.minorTickInterval,k=[],d=a.pointRangePadding||0,l=a.min-d,d=a.max+d,g=d-l;if(g&&g/f<a.len/3)if(a.isLog)this.paddedTicks.forEach(function(e,
+q,b){q&&k.push.apply(k,a.getLogTickPositions(f,b[q-1],b[q],!0))});else if(a.isDatetimeAxis&&"auto"===this.getMinorTickInterval())k=k.concat(a.getTimeTicks(a.normalizeTimeTickInterval(f),l,d,q.startOfWeek));else for(q=l+(b[0]-l)%f;q<=d&&q!==k[0];q+=f)k.push(q);0!==k.length&&a.trimTicks(k);return k},adjustForMinRange:function(){var a=this.options,q=this.min,b=this.max,f,k,d,l,g,c,p,A;this.isXAxis&&void 0===this.minRange&&!this.isLog&&(v(a.min)||v(a.max)?this.minRange=null:(this.series.forEach(function(a){c=
+a.xData;for(l=p=a.xIncrement?1:c.length-1;0<l;l--)if(g=c[l]-c[l-1],void 0===d||g<d)d=g}),this.minRange=Math.min(5*d,this.dataMax-this.dataMin)));b-q<this.minRange&&(k=this.dataMax-this.dataMin>=this.minRange,A=this.minRange,f=(A-b+q)/2,f=[q-f,F(a.min,q-f)],k&&(f[2]=this.isLog?this.log2lin(this.dataMin):this.dataMin),q=E(f),b=[q+A,F(a.max,q+A)],k&&(b[2]=this.isLog?this.log2lin(this.dataMax):this.dataMax),b=h(b),b-q<A&&(f[0]=b-A,f[1]=F(a.min,b-A),q=E(f)));this.min=q;this.max=b},getClosest:function(){var a;
+this.categories?a=1:this.series.forEach(function(e){var q=e.closestPointRange,b=e.visible||!e.chart.options.chart.ignoreHiddenSeries;!e.noSharedTooltip&&v(q)&&b&&(a=v(a)?Math.min(a,q):q)});return a},nameToX:function(a){var e=b(this.categories),f=e?this.categories:this.names,k=a.options.x,d;a.series.requireSorting=!1;v(k)||(k=!1===this.options.uniqueNames?a.series.autoIncrement():e?f.indexOf(a.name):F(f.keys[a.name],-1));-1===k?e||(d=f.length):d=k;void 0!==d&&(this.names[d]=a.name,this.names.keys[a.name]=
+d);return d},updateNames:function(){var a=this,q=this.names;0<q.length&&(Object.keys(q.keys).forEach(function(a){delete q.keys[a]}),q.length=0,this.minRange=this.userMinRange,(this.series||[]).forEach(function(e){e.xIncrement=null;if(!e.points||e.isDirtyData)a.max=Math.max(a.max,e.xData.length-1),e.processData(),e.generatePoints();e.data.forEach(function(q,b){var f;q&&q.options&&void 0!==q.name&&(f=a.nameToX(q),void 0!==f&&f!==q.x&&(q.x=f,e.xData[b]=f))})}))},setAxisTranslation:function(a){var e=
+this,b=e.max-e.min,k=e.axisPointRange||0,l,g=0,c=0,p=e.linkedParent,A=!!e.categories,t=e.transA,m=e.isXAxis;if(m||A||k)l=e.getClosest(),p?(g=p.minPointOffset,c=p.pointRangePadding):e.series.forEach(function(a){var b=A?1:m?F(a.options.pointRange,l,0):e.axisPointRange||0;a=a.options.pointPlacement;k=Math.max(k,b);e.single||(g=Math.max(g,f(a)?0:b/2),c=Math.max(c,"on"===a?0:b))}),p=e.ordinalSlope&&l?e.ordinalSlope/l:1,e.minPointOffset=g*=p,e.pointRangePadding=c*=p,e.pointRange=Math.min(k,b),m&&(e.closestPointRange=
+l);a&&(e.oldTransA=t);e.translationSlope=e.transA=t=e.staticScale||e.len/(b+c||1);e.transB=e.horiz?e.left:e.bottom;e.minPixelPadding=t*g;d(this,"afterSetAxisTranslation")},minFromRange:function(){return this.max-this.range},setTickInterval:function(e){var b=this,f=b.chart,k=b.options,g=b.isLog,c=b.isDatetimeAxis,A=b.isXAxis,m=b.isLinked,x=k.maxPadding,n=k.minPadding,D,h=k.tickInterval,B=k.tickPixelInterval,z=b.categories,H=l(b.threshold)?b.threshold:null,w=b.softThreshold,u,y,E;c||z||m||this.getTickAmount();
+y=F(b.userMin,k.min);E=F(b.userMax,k.max);m?(b.linkedParent=f[b.coll][k.linkedTo],D=b.linkedParent.getExtremes(),b.min=F(D.min,D.dataMin),b.max=F(D.max,D.dataMax),k.type!==b.linkedParent.options.type&&a.error(11,1,f)):(!w&&v(H)&&(b.dataMin>=H?(D=H,n=0):b.dataMax<=H&&(u=H,x=0)),b.min=F(y,D,b.dataMin),b.max=F(E,u,b.dataMax));g&&(b.positiveValuesOnly&&!e&&0>=Math.min(b.min,F(b.dataMin,b.min))&&a.error(10,1,f),b.min=r(b.log2lin(b.min),15),b.max=r(b.log2lin(b.max),15));b.range&&v(b.max)&&(b.userMin=b.min=
+y=Math.max(b.dataMin,b.minFromRange()),b.userMax=E=b.max,b.range=null);d(b,"foundExtremes");b.beforePadding&&b.beforePadding();b.adjustForMinRange();!(z||b.axisPointRange||b.usePercentage||m)&&v(b.min)&&v(b.max)&&(f=b.max-b.min)&&(!v(y)&&n&&(b.min-=f*n),!v(E)&&x&&(b.max+=f*x));l(k.softMin)&&!l(b.userMin)&&(b.min=Math.min(b.min,k.softMin));l(k.softMax)&&!l(b.userMax)&&(b.max=Math.max(b.max,k.softMax));l(k.floor)&&(b.min=Math.min(Math.max(b.min,k.floor),Number.MAX_VALUE));l(k.ceiling)&&(b.max=Math.max(Math.min(b.max,
+k.ceiling),F(b.userMax,-Number.MAX_VALUE)));w&&v(b.dataMin)&&(H=H||0,!v(y)&&b.min<H&&b.dataMin>=H?b.min=H:!v(E)&&b.max>H&&b.dataMax<=H&&(b.max=H));b.tickInterval=b.min===b.max||void 0===b.min||void 0===b.max?1:m&&!h&&B===b.linkedParent.options.tickPixelInterval?h=b.linkedParent.tickInterval:F(h,this.tickAmount?(b.max-b.min)/Math.max(this.tickAmount-1,1):void 0,z?1:(b.max-b.min)*B/Math.max(b.len,B));A&&!e&&b.series.forEach(function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);
+b.beforeSetTickPositions&&b.beforeSetTickPositions();b.postProcessTickInterval&&(b.tickInterval=b.postProcessTickInterval(b.tickInterval));b.pointRange&&!h&&(b.tickInterval=Math.max(b.pointRange,b.tickInterval));e=F(k.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);!h&&b.tickInterval<e&&(b.tickInterval=e);c||g||h||(b.tickInterval=t(b.tickInterval,null,p(b.tickInterval),F(k.allowDecimals,!(.5<b.tickInterval&&5>b.tickInterval&&1E3<b.max&&9999>b.max)),!!this.tickAmount));this.tickAmount||(b.tickInterval=
+b.unsquish());this.setTickPositions()},setTickPositions:function(){var e=this.options,b,f=e.tickPositions;b=this.getMinorTickInterval();var k=e.tickPositioner,l=e.startOnTick,g=e.endOnTick;this.tickmarkOffset=this.categories&&"between"===e.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===b&&this.tickInterval?this.tickInterval/5:b;this.single=this.min===this.max&&v(this.min)&&!this.tickAmount&&(parseInt(this.min,10)===this.min||!1!==e.allowDecimals);this.tickPositions=
+b=f&&f.slice();!b&&(!this.ordinalPositions&&(this.max-this.min)/this.tickInterval>Math.max(2*this.len,200)?(b=[this.min,this.max],a.error(19,!1,this.chart)):b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,e.units),this.min,this.max,e.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],
+b.pop()],b[0]===b[1]&&(b.length=1)),this.tickPositions=b,k&&(k=k.apply(this,[this.min,this.max])))&&(this.tickPositions=b=k);this.paddedTicks=b.slice(0);this.trimTicks(b,l,g);this.isLinked||(this.single&&2>b.length&&(this.min-=.5,this.max+=.5),f||k||this.adjustTickAmount());d(this,"afterSetTickPositions")},trimTicks:function(a,b,f){var e=a[0],k=a[a.length-1],q=this.minPointOffset||0;if(!this.isLinked){if(b&&-Infinity!==e)this.min=e;else for(;this.min-q>a[0];)a.shift();if(f)this.max=k;else for(;this.max+
+q<a[a.length-1];)a.pop();0===a.length&&v(e)&&!this.options.tickPositions&&a.push((k+e)/2)}},alignToOthers:function(){var a={},b,f=this.options;!1===this.chart.options.chart.alignTicks||!1===f.alignTicks||!1===f.startOnTick||!1===f.endOnTick||this.isLog||this.chart[this.coll].forEach(function(e){var f=e.options,f=[e.horiz?f.left:f.top,f.width,f.height,f.pane].join();e.series.length&&(a[f]?b=!0:a[f]=1)});return b},getTickAmount:function(){var a=this.options,b=a.tickAmount,f=a.tickPixelInterval;!v(a.tickInterval)&&
+this.len<f&&!this.isRadial&&!this.isLog&&a.startOnTick&&a.endOnTick&&(b=2);!b&&this.alignToOthers()&&(b=Math.ceil(this.len/f)+1);4>b&&(this.finalTickAmt=b,b=5);this.tickAmount=b},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,f=this.tickAmount,k=this.finalTickAmt,d=b&&b.length,l=F(this.threshold,this.softThreshold?0:null);if(this.hasData()){if(d<f){for(;b.length<f;)b.length%2||this.min===l?b.push(r(b[b.length-1]+a)):b.unshift(r(b[0]-a));this.transA*=(d-1)/(f-1);this.min=
+b[0];this.max=b[b.length-1]}else d>f&&(this.tickInterval*=2,this.setTickPositions());if(v(k)){for(a=f=b.length;a--;)(3===k&&1===a%2||2>=k&&0<a&&a<f-1)&&b.splice(a,1);this.finalTickAmt=void 0}}},setScale:function(){var a,b;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();b=this.len!==this.oldAxisLength;this.series.forEach(function(e){if(e.isDirtyData||e.isDirty||e.xAxis.isDirty)a=!0});b||a||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==
+this.oldUserMax||this.alignToOthers()?(this.resetStacks&&this.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.oldUserMin=this.userMin,this.oldUserMax=this.userMax,this.isDirty||(this.isDirty=b||this.min!==this.oldMin||this.max!==this.oldMax)):this.cleanStacks&&this.cleanStacks();d(this,"afterSetScale")},setExtremes:function(a,b,f,k,l){var e=this,q=e.chart;f=F(f,!0);e.series.forEach(function(a){delete a.kdTree});l=g(l,{min:a,max:b});d(e,"setExtremes",l,function(){e.userMin=
+a;e.userMax=b;e.eventArgs=l;f&&q.redraw(k)})},zoom:function(a,b){var e=this.dataMin,f=this.dataMax,k=this.options,d=Math.min(e,F(k.min,e)),k=Math.max(f,F(k.max,f));if(a!==this.min||b!==this.max)this.allowZoomOutside||(v(e)&&(a<d&&(a=d),a>k&&(a=k)),v(f)&&(b<d&&(b=d),b>k&&(b=k))),this.displayBtn=void 0!==a||void 0!==b,this.setExtremes(a,b,!1,void 0,{trigger:"zoom"});return!0},setAxisSize:function(){var e=this.chart,b=this.options,f=b.offsets||[0,0,0,0],k=this.horiz,d=this.width=Math.round(a.relativeLength(F(b.width,
+e.plotWidth-f[3]+f[1]),e.plotWidth)),l=this.height=Math.round(a.relativeLength(F(b.height,e.plotHeight-f[0]+f[2]),e.plotHeight)),g=this.top=Math.round(a.relativeLength(F(b.top,e.plotTop+f[0]),e.plotHeight,e.plotTop)),b=this.left=Math.round(a.relativeLength(F(b.left,e.plotLeft+f[3]),e.plotWidth,e.plotLeft));this.bottom=e.chartHeight-l-g;this.right=e.chartWidth-d-b;this.len=Math.max(k?d:l,0);this.pos=k?b:g},getExtremes:function(){var a=this.isLog;return{min:a?r(this.lin2log(this.min)):this.min,max:a?
+r(this.lin2log(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var e=this.isLog,b=e?this.lin2log(this.min):this.min,e=e?this.lin2log(this.max):this.max;null===a||-Infinity===a?a=b:Infinity===a?a=e:b>a?a=b:e<a&&(a=e);return this.translate(a,0,1,0,1)},autoLabelAlign:function(a){a=(F(a,0)-90*this.side+720)%360;return 15<a&&165>a?"right":195<a&&345>a?"left":"center"},tickSize:function(a){var e=this.options,b=e[a+"Length"],
+f=F(e[a+"Width"],"tick"===a&&this.isXAxis?1:0);if(f&&b)return"inside"===e[a+"Position"]&&(b=-b),[b,f]},labelMetrics:function(){var a=this.tickPositions&&this.tickPositions[0]||0;return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize,this.ticks[a]&&this.ticks[a].label)},unsquish:function(){var a=this.options.labels,b=this.horiz,f=this.tickInterval,k=f,d=this.len/(((this.categories?1:0)+this.max-this.min)/f),l,g=a.rotation,c=this.labelMetrics(),p,A=Number.MAX_VALUE,
+t,m=function(a){a/=d||1;a=1<a?Math.ceil(a):1;return r(a*f)};b?(t=!a.staggerLines&&!a.step&&(v(g)?[g]:d<F(a.autoRotationLimit,80)&&a.autoRotation))&&t.forEach(function(a){var b;if(a===g||a&&-90<=a&&90>=a)p=m(Math.abs(c.h/Math.sin(w*a))),b=p+Math.abs(a/360),b<A&&(A=b,l=a,k=p)}):a.step||(k=m(c.h));this.autoRotation=t;this.labelRotation=F(l,g);return k},getSlotWidth:function(a){var b=this.chart,e=this.horiz,f=this.options.labels,k=Math.max(this.tickPositions.length-(this.categories?0:1),1),d=b.margin[3];
+return a&&a.slotWidth||e&&2>(f.step||0)&&!f.rotation&&(this.staggerLines||1)*this.len/k||!e&&(f.style&&parseInt(f.style.width,10)||d&&d-b.spacing[3]||.33*b.chartWidth)},renderUnsquish:function(){var a=this.chart,b=a.renderer,k=this.tickPositions,d=this.ticks,l=this.options.labels,g=l&&l.style||{},c=this.horiz,p=this.getSlotWidth(),A=Math.max(1,Math.round(p-2*(l.padding||5))),t={},m=this.labelMetrics(),x=l.style&&l.style.textOverflow,n,D,h=0,B;f(l.rotation)||(t.rotation=l.rotation||0);k.forEach(function(a){(a=
+d[a])&&a.label&&a.label.textPxLength>h&&(h=a.label.textPxLength)});this.maxLabelLength=h;if(this.autoRotation)h>A&&h>m.h?t.rotation=this.labelRotation:this.labelRotation=0;else if(p&&(n=A,!x))for(D="clip",A=k.length;!c&&A--;)if(B=k[A],B=d[B].label)B.styles&&"ellipsis"===B.styles.textOverflow?B.css({textOverflow:"clip"}):B.textPxLength>p&&B.css({width:p+"px"}),B.getBBox().height>this.len/k.length-(m.h-m.f)&&(B.specificTextOverflow="ellipsis");t.rotation&&(n=h>.5*a.chartHeight?.33*a.chartHeight:h,x||
+(D="ellipsis"));if(this.labelAlign=l.align||this.autoLabelAlign(this.labelRotation))t.align=this.labelAlign;k.forEach(function(a){var b=(a=d[a])&&a.label,e=g.width,f={};b&&(b.attr(t),a.shortenLabel?a.shortenLabel():n&&!e&&"nowrap"!==g.whiteSpace&&(n<b.textPxLength||"SPAN"===b.element.tagName)?(f.width=n,x||(f.textOverflow=b.specificTextOverflow||D),b.css(f)):b.styles&&b.styles.width&&!f.width&&!e&&b.css({width:null}),delete b.specificTextOverflow,a.rotation=t.rotation)},this);this.tickRotCorr=b.rotCorr(m.b,
+this.labelRotation||0,0!==this.side)},hasData:function(){return this.hasVisibleSeries||v(this.min)&&v(this.max)&&this.tickPositions&&0<this.tickPositions.length},addTitle:function(a){var b=this.chart.renderer,e=this.horiz,f=this.opposite,k=this.options.title,d,l=this.chart.styledMode;this.axisTitle||((d=k.textAlign)||(d=(e?{low:"left",middle:"center",high:"right"}:{low:f?"right":"left",middle:"center",high:f?"left":"right"})[k.align]),this.axisTitle=b.text(k.text,0,0,k.useHTML).attr({zIndex:7,rotation:k.rotation||
+0,align:d}).addClass("highcharts-axis-title"),l||this.axisTitle.css(x(k.style)),this.axisTitle.add(this.axisGroup),this.axisTitle.isNew=!0);l||k.style.width||this.isRadial||this.axisTitle.css({width:this.len});this.axisTitle[a?"show":"hide"](!0)},generateTick:function(a){var b=this.ticks;b[a]?b[a].addLabel():b[a]=new D(this,a)},getOffset:function(){var a=this,b=a.chart,f=b.renderer,k=a.options,l=a.tickPositions,g=a.ticks,c=a.horiz,p=a.side,A=b.inverted&&!a.isZAxis?[1,0,3,2][p]:p,t,m,x=0,n,D=0,h=k.title,
+B=k.labels,z=0,r=b.axisOffset,b=b.clipOffset,w=[-1,1,1,-1][p],u=k.className,y=a.axisParent;t=a.hasData();a.showAxis=m=t||F(k.showEmpty,!0);a.staggerLines=a.horiz&&B.staggerLines;a.axisGroup||(a.gridGroup=f.g("grid").attr({zIndex:k.gridZIndex||1}).addClass("highcharts-"+this.coll.toLowerCase()+"-grid "+(u||"")).add(y),a.axisGroup=f.g("axis").attr({zIndex:k.zIndex||2}).addClass("highcharts-"+this.coll.toLowerCase()+" "+(u||"")).add(y),a.labelGroup=f.g("axis-labels").attr({zIndex:B.zIndex||7}).addClass("highcharts-"+
+a.coll.toLowerCase()+"-labels "+(u||"")).add(y));t||a.isLinked?(l.forEach(function(b,e){a.generateTick(b,e)}),a.renderUnsquish(),a.reserveSpaceDefault=0===p||2===p||{1:"left",3:"right"}[p]===a.labelAlign,F(B.reserveSpace,"center"===a.labelAlign?!0:null,a.reserveSpaceDefault)&&l.forEach(function(a){z=Math.max(g[a].getLabelSize(),z)}),a.staggerLines&&(z*=a.staggerLines),a.labelOffset=z*(a.opposite?-1:1)):H(g,function(a,b){a.destroy();delete g[b]});h&&h.text&&!1!==h.enabled&&(a.addTitle(m),m&&!1!==h.reserveSpace&&
+(a.titleOffset=x=a.axisTitle.getBBox()[c?"height":"width"],n=h.offset,D=v(n)?0:F(h.margin,c?5:10)));a.renderLine();a.offset=w*F(k.offset,r[p]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};f=0===p?-a.labelMetrics().h:2===p?a.tickRotCorr.y:0;D=Math.abs(z)+D;z&&(D=D-f+w*(c?F(B.y,a.tickRotCorr.y+8*w):B.x));a.axisTitleMargin=F(n,D);a.getMaxLabelDimensions&&(a.maxLabelDimensions=a.getMaxLabelDimensions(g,l));c=this.tickSize("tick");r[p]=Math.max(r[p],a.axisTitleMargin+x+w*a.offset,D,t&&l.length&&c?c[0]+w*a.offset:
+0);k=k.offset?0:2*Math.floor(a.axisLine.strokeWidth()/2);b[A]=Math.max(b[A],k);d(this,"afterGetOffset")},getLinePath:function(a){var b=this.chart,e=this.opposite,f=this.offset,k=this.horiz,d=this.left+(e?this.width:0)+f,f=b.chartHeight-this.bottom-(e?this.height:0)+f;e&&(a*=-1);return b.renderer.crispLine(["M",k?this.left:d,k?f:this.top,"L",k?b.chartWidth-this.right:d,k?f:b.chartHeight-this.bottom],a)},renderLine:function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),
+this.chart.styledMode||this.axisLine.attr({stroke:this.options.lineColor,"stroke-width":this.options.lineWidth,zIndex:7}))},getTitlePosition:function(){var a=this.horiz,b=this.left,f=this.top,k=this.len,d=this.options.title,l=a?b:f,g=this.opposite,c=this.offset,p=d.x||0,A=d.y||0,t=this.axisTitle,m=this.chart.renderer.fontMetrics(d.style&&d.style.fontSize,t),t=Math.max(t.getBBox(null,0).height-m.h-1,0),k={low:l+(a?0:k),middle:l+k/2,high:l+(a?k:0)}[d.align],b=(a?f+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+
+[-t,t,m.f,-t][this.side];return{x:a?k+p:b+(g?this.width:0)+c+p,y:a?b+A-(g?this.height:0)+c:k+A}},renderMinorTick:function(a){var b=this.chart.hasRendered&&l(this.oldMin),e=this.minorTicks;e[a]||(e[a]=new D(this,a,"minor"));b&&e[a].isNew&&e[a].render(null,!0);e[a].render(null,!1,1)},renderTick:function(a,b){var e=this.isLinked,f=this.ticks,k=this.chart.hasRendered&&l(this.oldMin);if(!e||a>=this.min&&a<=this.max)f[a]||(f[a]=new D(this,a)),k&&f[a].isNew&&f[a].render(b,!0,-1),f[a].render(b)},render:function(){var b=
+this,f=b.chart,k=b.options,g=b.isLog,c=b.isLinked,p=b.tickPositions,t=b.axisTitle,m=b.ticks,x=b.minorTicks,n=b.alternateBands,h=k.stackLabels,B=k.alternateGridColor,z=b.tickmarkOffset,F=b.axisLine,r=b.showAxis,w=G(f.renderer.globalAnimation),u,v;b.labelEdge.length=0;b.overlap=!1;[m,x,n].forEach(function(a){H(a,function(a){a.isActive=!1})});if(b.hasData()||c)b.minorTickInterval&&!b.categories&&b.getMinorTickPositions().forEach(function(a){b.renderMinorTick(a)}),p.length&&(p.forEach(function(a,e){b.renderTick(a,
+e)}),z&&(0===b.min||b.single)&&(m[-1]||(m[-1]=new D(b,-1,null,!0)),m[-1].render(-1))),B&&p.forEach(function(e,k){v=void 0!==p[k+1]?p[k+1]+z:b.max-z;0===k%2&&e<b.max&&v<=b.max+(f.polar?-z:z)&&(n[e]||(n[e]=new a.PlotLineOrBand(b)),u=e+z,n[e].options={from:g?b.lin2log(u):u,to:g?b.lin2log(v):v,color:B},n[e].render(),n[e].isActive=!0)}),b._addedPlotLB||((k.plotLines||[]).concat(k.plotBands||[]).forEach(function(a){b.addPlotBandOrLine(a)}),b._addedPlotLB=!0);[m,x,n].forEach(function(a){var b,e=[],k=w.duration;
+H(a,function(a,b){a.isActive||(a.render(b,!1,0),a.isActive=!1,e.push(b))});A(function(){for(b=e.length;b--;)a[e[b]]&&!a[e[b]].isActive&&(a[e[b]].destroy(),delete a[e[b]])},a!==n&&f.hasRendered&&k?k:0)});F&&(F[F.isPlaced?"animate":"attr"]({d:this.getLinePath(F.strokeWidth())}),F.isPlaced=!0,F[r?"show":"hide"](!0));t&&r&&(k=b.getTitlePosition(),l(k.y)?(t[t.isNew?"attr":"animate"](k),t.isNew=!1):(t.attr("y",-9999),t.isNew=!0));h&&h.enabled&&b.renderStackTotals();b.isDirty=!1;d(this,"afterRender")},redraw:function(){this.visible&&
+(this.render(),this.plotLinesAndBands.forEach(function(a){a.render()}));this.series.forEach(function(a){a.isDirty=!0})},keepProps:"extKey hcEvents names series userMax userMin".split(" "),destroy:function(a){var b=this,e=b.stacks,f=b.plotLinesAndBands,k;d(this,"destroy",{keepEvents:a});a||z(b);H(e,function(a,b){n(a);e[b]=null});[b.ticks,b.minorTicks,b.alternateBands].forEach(function(a){n(a)});if(f)for(a=f.length;a--;)f[a].destroy();"stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross scrollbar".split(" ").forEach(function(a){b[a]&&
+(b[a]=b[a].destroy())});for(k in b.plotLinesAndBandsGroups)b.plotLinesAndBandsGroups[k]=b.plotLinesAndBandsGroups[k].destroy();H(b,function(a,e){-1===b.keepProps.indexOf(e)&&delete b[e]})},drawCrosshair:function(a,b){var e,f=this.crosshair,k=F(f.snap,!0),l,g=this.cross;d(this,"drawCrosshair",{e:a,point:b});a||(a=this.cross&&this.cross.e);if(this.crosshair&&!1!==(v(b)||!k)){k?v(b)&&(l=F(b.crosshairPos,this.isXAxis?b.plotX:this.len-b.plotY)):l=a&&(this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos);
+v(l)&&(e=this.getPlotLinePath(b&&(this.isXAxis?b.x:F(b.stackY,b.y)),null,null,null,l)||null);if(!v(e)){this.hideCrosshair();return}k=this.categories&&!this.isRadial;g||(this.cross=g=this.chart.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-"+(k?"category ":"thin ")+f.className).attr({zIndex:F(f.zIndex,2)}).add(),this.chart.styledMode||(g.attr({stroke:f.color||(k?c("#ccd6eb").setOpacity(.25).get():"#cccccc"),"stroke-width":F(f.width,1)}).css({"pointer-events":"none"}),f.dashStyle&&
+g.attr({dashstyle:f.dashStyle})));g.show().attr({d:e});k&&!f.width&&g.attr({"stroke-width":this.transA});this.cross.e=a}else this.hideCrosshair();d(this,"afterDrawCrosshair",{e:a,point:b})},hideCrosshair:function(){this.cross&&this.cross.hide()}});return a.Axis=B}(J);(function(a){var y=a.Axis,G=a.getMagnitude,E=a.normalizeTickInterval,h=a.timeUnits;y.prototype.getTimeTicks=function(){return this.chart.time.getTimeTicks.apply(this.chart.time,arguments)};y.prototype.normalizeTimeTickInterval=function(a,
+r){var c=r||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,3,4,6]],["year",null]];r=c[c.length-1];var v=h[r[0]],w=r[1],n;for(n=0;n<c.length&&!(r=c[n],v=h[r[0]],w=r[1],c[n+1]&&a<=(v*w[w.length-1]+h[c[n+1][0]])/2);n++);v===h.year&&a<5*v&&(w=[1,2,5]);a=E(a/v,w,"year"===r[0]?Math.max(G(a/v),1):1);return{unitRange:v,count:a,unitName:r[0]}}})(J);(function(a){var y=a.Axis,G=a.getMagnitude,
+E=a.normalizeTickInterval,h=a.pick;y.prototype.getLogTickPositions=function(a,r,u,v){var c=this.options,n=this.len,g=[];v||(this._minorAutoInterval=null);if(.5<=a)a=Math.round(a),g=this.getLinearTickPositions(a,r,u);else if(.08<=a)for(var n=Math.floor(r),d,m,p,b,l,c=.3<a?[1,2,4]:.15<a?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];n<u+1&&!l;n++)for(m=c.length,d=0;d<m&&!l;d++)p=this.log2lin(this.lin2log(n)*c[d]),p>r&&(!v||b<=u)&&void 0!==b&&g.push(b),b>u&&(l=!0),b=p;else r=this.lin2log(r),u=this.lin2log(u),a=v?this.getMinorTickInterval():
+c.tickInterval,a=h("auto"===a?null:a,this._minorAutoInterval,c.tickPixelInterval/(v?5:1)*(u-r)/((v?n/this.tickPositions.length:n)||1)),a=E(a,null,G(a)),g=this.getLinearTickPositions(a,r,u).map(this.log2lin),v||(this._minorAutoInterval=a/5);v||(this.tickInterval=a);return g};y.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};y.prototype.lin2log=function(a){return Math.pow(10,a)}})(J);(function(a,y){var G=a.arrayMax,E=a.arrayMin,h=a.defined,c=a.destroyObjectProperties,r=a.erase,u=a.merge,
+v=a.pick;a.PlotLineOrBand=function(a,c){this.axis=a;c&&(this.options=c,this.id=c.id)};a.PlotLineOrBand.prototype={render:function(){a.fireEvent(this,"render");var c=this,n=c.axis,g=n.horiz,d=c.options,m=d.label,p=c.label,b=d.to,l=d.from,f=d.value,x=h(l)&&h(b),t=h(f),H=c.svgElem,F=!H,z=[],k=d.color,A=v(d.zIndex,0),D=d.events,z={"class":"highcharts-plot-"+(x?"band ":"line ")+(d.className||"")},B={},e=n.chart.renderer,q=x?"bands":"lines";n.isLog&&(l=n.log2lin(l),b=n.log2lin(b),f=n.log2lin(f));n.chart.styledMode||
+(t?(z.stroke=k,z["stroke-width"]=d.width,d.dashStyle&&(z.dashstyle=d.dashStyle)):x&&(k&&(z.fill=k),d.borderWidth&&(z.stroke=d.borderColor,z["stroke-width"]=d.borderWidth)));B.zIndex=A;q+="-"+A;(k=n.plotLinesAndBandsGroups[q])||(n.plotLinesAndBandsGroups[q]=k=e.g("plot-"+q).attr(B).add());F&&(c.svgElem=H=e.path().attr(z).add(k));if(t)z=n.getPlotLinePath(f,H.strokeWidth());else if(x)z=n.getPlotBandPath(l,b,d);else return;F&&z&&z.length?(H.attr({d:z}),D&&a.objectEach(D,function(a,b){H.on(b,function(a){D[b].apply(c,
+[a])})})):H&&(z?(H.show(),H.animate({d:z})):(H.hide(),p&&(c.label=p=p.destroy())));m&&h(m.text)&&z&&z.length&&0<n.width&&0<n.height&&!z.isFlat?(m=u({align:g&&x&&"center",x:g?!x&&4:10,verticalAlign:!g&&x&&"middle",y:g?x?16:10:x?6:-4,rotation:g&&!x&&90},m),this.renderLabel(m,z,x,A)):p&&p.hide();return c},renderLabel:function(a,c,g,d){var m=this.label,p=this.axis.chart.renderer;m||(m={align:a.textAlign||a.align,rotation:a.rotation,"class":"highcharts-plot-"+(g?"band":"line")+"-label "+(a.className||
+"")},m.zIndex=d,this.label=m=p.text(a.text,0,0,a.useHTML).attr(m).add(),this.axis.chart.styledMode||m.css(a.style));d=c.xBounds||[c[1],c[4],g?c[6]:c[1]];c=c.yBounds||[c[2],c[5],g?c[7]:c[2]];g=E(d);p=E(c);m.align(a,!1,{x:g,y:p,width:G(d)-g,height:G(c)-p});m.show()},destroy:function(){r(this.axis.plotLinesAndBands,this);delete this.axis;c(this)}};a.extend(y.prototype,{getPlotBandPath:function(a,c){var g=this.getPlotLinePath(c,null,null,!0),d=this.getPlotLinePath(a,null,null,!0),m=[],p=this.horiz,b=
+1,l;a=a<this.min&&c<this.min||a>this.max&&c>this.max;if(d&&g)for(a&&(l=d.toString()===g.toString(),b=0),a=0;a<d.length;a+=6)p&&g[a+1]===d[a+1]?(g[a+1]+=b,g[a+4]+=b):p||g[a+2]!==d[a+2]||(g[a+2]+=b,g[a+5]+=b),m.push("M",d[a+1],d[a+2],"L",d[a+4],d[a+5],g[a+4],g[a+5],g[a+1],g[a+2],"z"),m.isFlat=l;return m},addPlotBand:function(a){return this.addPlotBandOrLine(a,"plotBands")},addPlotLine:function(a){return this.addPlotBandOrLine(a,"plotLines")},addPlotBandOrLine:function(c,n){var g=(new a.PlotLineOrBand(this,
+c)).render(),d=this.userOptions;g&&(n&&(d[n]=d[n]||[],d[n].push(c)),this.plotLinesAndBands.push(g));return g},removePlotBandOrLine:function(a){for(var c=this.plotLinesAndBands,g=this.options,d=this.userOptions,m=c.length;m--;)c[m].id===a&&c[m].destroy();[g.plotLines||[],d.plotLines||[],g.plotBands||[],d.plotBands||[]].forEach(function(d){for(m=d.length;m--;)d[m].id===a&&r(d,d[m])})},removePlotBand:function(a){this.removePlotBandOrLine(a)},removePlotLine:function(a){this.removePlotBandOrLine(a)}})})(J,
+V);(function(a){var y=a.doc,G=a.extend,E=a.format,h=a.isNumber,c=a.merge,r=a.pick,u=a.splat,v=a.syncTimeout,w=a.timeUnits;a.Tooltip=function(){this.init.apply(this,arguments)};a.Tooltip.prototype={init:function(a,c){this.chart=a;this.options=c;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=c.split&&!a.inverted;this.shared=c.shared||this.split;this.outside=c.outside&&!this.split},cleanSplit:function(a){this.chart.series.forEach(function(c){var d=c&&c.tt;d&&(!d.isActive||a?c.tt=d.destroy():
+d.isActive=!1)})},applyFilter:function(){var a=this.chart;a.renderer.definition({tagName:"filter",id:"drop-shadow-"+a.index,opacity:.5,children:[{tagName:"feGaussianBlur","in":"SourceAlpha",stdDeviation:1},{tagName:"feOffset",dx:1,dy:1},{tagName:"feComponentTransfer",children:[{tagName:"feFuncA",type:"linear",slope:.3}]},{tagName:"feMerge",children:[{tagName:"feMergeNode"},{tagName:"feMergeNode","in":"SourceGraphic"}]}]});a.renderer.definition({tagName:"style",textContent:".highcharts-tooltip-"+a.index+
+"{filter:url(#drop-shadow-"+a.index+")}"})},getLabel:function(){var c=this.chart.renderer,g=this.chart.styledMode,d=this.options,m;this.label||(this.outside&&(this.container=m=a.doc.createElement("div"),m.className="highcharts-tooltip-container",a.css(m,{position:"absolute",top:"1px",pointerEvents:d.style&&d.style.pointerEvents}),a.doc.body.appendChild(m),this.renderer=c=new a.Renderer(m,0,0)),this.split?this.label=c.g("tooltip"):(this.label=c.label("",0,0,d.shape||"callout",null,null,d.useHTML,null,
+"tooltip").attr({padding:d.padding,r:d.borderRadius}),g||this.label.attr({fill:d.backgroundColor,"stroke-width":d.borderWidth}).css(d.style).shadow(d.shadow)),g&&(this.applyFilter(),this.label.addClass("highcharts-tooltip-"+this.chart.index)),this.outside&&(this.label.attr({x:this.distance,y:this.distance}),this.label.xSetter=function(a){m.style.left=a+"px"},this.label.ySetter=function(a){m.style.top=a+"px"}),this.label.attr({zIndex:8}).add());return this.label},update:function(a){this.destroy();
+c(!0,this.chart.options.tooltip.userOptions,a);this.init(this.chart,c(!0,this.options,a))},destroy:function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart,!0),this.tt=this.tt.destroy());this.renderer&&(this.renderer=this.renderer.destroy(),a.discardElement(this.container));a.clearTimeout(this.hideTimer);a.clearTimeout(this.tooltipTimeout)},move:function(c,g,d,m){var p=this,b=p.now,l=!1!==p.options.animation&&!p.isHidden&&(1<Math.abs(c-b.x)||1<Math.abs(g-
+b.y)),f=p.followPointer||1<p.len;G(b,{x:l?(2*b.x+c)/3:c,y:l?(b.y+g)/2:g,anchorX:f?void 0:l?(2*b.anchorX+d)/3:d,anchorY:f?void 0:l?(b.anchorY+m)/2:m});p.getLabel().attr(b);l&&(a.clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){p&&p.move(c,g,d,m)},32))},hide:function(c){var g=this;a.clearTimeout(this.hideTimer);c=r(c,this.options.hideDelay,500);this.isHidden||(this.hideTimer=v(function(){g.getLabel()[c?"fadeOut":"hide"]();g.isHidden=!0},c))},getAnchor:function(a,c){var d=
+this.chart,g=d.pointer,p=d.inverted,b=d.plotTop,l=d.plotLeft,f=0,x=0,t,h;a=u(a);this.followPointer&&c?(void 0===c.chartX&&(c=g.normalize(c)),a=[c.chartX-d.plotLeft,c.chartY-b]):a[0].tooltipPos?a=a[0].tooltipPos:(a.forEach(function(a){t=a.series.yAxis;h=a.series.xAxis;f+=a.plotX+(!p&&h?h.left-l:0);x+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!p&&t?t.top-b:0)}),f/=a.length,x/=a.length,a=[p?d.plotWidth-x:f,this.shared&&!p&&1<a.length&&c?c.chartY-b:p?d.plotHeight-f:x]);return a.map(Math.round)},getPosition:function(a,
+c,d){var g=this.chart,p=this.distance,b={},l=g.inverted&&d.h||0,f,x=this.outside,t=x?y.documentElement.clientWidth-2*p:g.chartWidth,h=x?Math.max(y.body.scrollHeight,y.documentElement.scrollHeight,y.body.offsetHeight,y.documentElement.offsetHeight,y.documentElement.clientHeight):g.chartHeight,n=g.pointer.chartPosition,z=["y",h,c,(x?n.top-p:0)+d.plotY+g.plotTop,x?0:g.plotTop,x?h:g.plotTop+g.plotHeight],k=["x",t,a,(x?n.left-p:0)+d.plotX+g.plotLeft,x?0:g.plotLeft,x?t:g.plotLeft+g.plotWidth],A=!this.followPointer&&
+r(d.ttBelow,!g.inverted===!!d.negative),D=function(a,e,f,k,d,c){var g=f<k-p,q=k+p+f<e,t=k-p-f;k+=p;if(A&&q)b[a]=k;else if(!A&&g)b[a]=t;else if(g)b[a]=Math.min(c-f,0>t-l?t:t-l);else if(q)b[a]=Math.max(d,k+l+f>e?k:k+l);else return!1},B=function(a,e,f,k){var d;k<p||k>e-p?d=!1:b[a]=k<f/2?1:k>e-f/2?e-f-2:k-f/2;return d},e=function(a){var b=z;z=k;k=b;f=a},q=function(){!1!==D.apply(0,z)?!1!==B.apply(0,k)||f||(e(!0),q()):f?b.x=b.y=0:(e(!0),q())};(g.inverted||1<this.len)&&e();q();return b},defaultFormatter:function(a){var c=
+this.points||u(this),d;d=[a.tooltipFooterHeaderFormatter(c[0])];d=d.concat(a.bodyFormatter(c));d.push(a.tooltipFooterHeaderFormatter(c[0],!0));return d},refresh:function(c,g){var d,m=this.options,p,b=c,l,f={},x=[];d=m.formatter||this.defaultFormatter;var f=this.shared,t,h=this.chart.styledMode;m.enabled&&(a.clearTimeout(this.hideTimer),this.followPointer=u(b)[0].series.tooltipOptions.followPointer,l=this.getAnchor(b,g),g=l[0],p=l[1],!f||b.series&&b.series.noSharedTooltip?f=b.getLabelConfig():(b.forEach(function(a){a.setState("hover");
+x.push(a.getLabelConfig())}),f={x:b[0].category,y:b[0].y},f.points=x,b=b[0]),this.len=x.length,f=d.call(f,this),t=b.series,this.distance=r(t.tooltipOptions.distance,16),!1===f?this.hide():(d=this.getLabel(),this.isHidden&&d.attr({opacity:1}).show(),this.split?this.renderSplit(f,u(c)):(m.style.width&&!h||d.css({width:this.chart.spacingBox.width}),d.attr({text:f&&f.join?f.join(""):f}),d.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-"+r(b.colorIndex,t.colorIndex)),h||d.attr({stroke:m.borderColor||
+b.color||t.color||"#666666"}),this.updatePosition({plotX:g,plotY:p,negative:b.negative,ttBelow:b.ttBelow,h:l[2]||0})),this.isHidden=!1))},renderSplit:function(c,g){var d=this,m=[],p=this.chart,b=p.renderer,l=!0,f=this.options,x=0,t,h=this.getLabel(),n=p.plotTop;a.isString(c)&&(c=[!1,c]);c.slice(0,g.length+1).forEach(function(a,k){if(!1!==a&&""!==a){k=g[k-1]||{isHeader:!0,plotX:g[0].plotX,plotY:p.plotHeight};var c=k.series||d,D=c.tt,B=k.series||{},e="highcharts-color-"+r(k.colorIndex,B.colorIndex,
+"none");D||(D={padding:f.padding,r:f.borderRadius},p.styledMode||(D.fill=f.backgroundColor,D.stroke=f.borderColor||k.color||B.color||"#333333",D["stroke-width"]=f.borderWidth),c.tt=D=b.label(null,null,null,(k.isHeader?f.headerShape:f.shape)||"callout",null,null,f.useHTML).addClass("highcharts-tooltip-box "+e).attr(D).add(h));D.isActive=!0;D.attr({text:a});p.styledMode||D.css(f.style).shadow(f.shadow);a=D.getBBox();B=a.width+D.strokeWidth();k.isHeader?(x=a.height,p.xAxis[0].opposite&&(t=!0,n-=x),B=
+Math.max(0,Math.min(k.plotX+p.plotLeft-B/2,p.chartWidth+(p.scrollablePixels?p.scrollablePixels-p.marginRight:0)-B))):B=k.plotX+p.plotLeft-r(f.distance,16)-B;0>B&&(l=!1);a=(k.series&&k.series.yAxis&&k.series.yAxis.pos)+(k.plotY||0);a-=n;k.isHeader&&(a=t?-x:p.plotHeight+x);m.push({target:a,rank:k.isHeader?1:0,size:c.tt.getBBox().height+1,point:k,x:B,tt:D})}});this.cleanSplit();f.positioner&&m.forEach(function(a){var b=f.positioner.call(d,a.tt.getBBox().width,a.size,a.point);a.x=b.x;a.align=0;a.target=
+b.y;a.rank=r(b.rank,a.rank)});a.distribute(m,p.plotHeight+x);m.forEach(function(a){var b=a.point,d=b.series;a.tt.attr({visibility:void 0===a.pos?"hidden":"inherit",x:l||b.isHeader||f.positioner?a.x:b.plotX+p.plotLeft+r(f.distance,16),y:a.pos+n,anchorX:b.isHeader?b.plotX+p.plotLeft:b.plotX+d.xAxis.pos,anchorY:b.isHeader?p.plotTop+p.plotHeight/2:b.plotY+d.yAxis.pos})})},updatePosition:function(a){var c=this.chart,d=this.getLabel(),m=(this.options.positioner||this.getPosition).call(this,d.width,d.height,
+a),p=a.plotX+c.plotLeft;a=a.plotY+c.plotTop;var b;this.outside&&(b=(this.options.borderWidth||0)+2*this.distance,this.renderer.setSize(d.width+b,d.height+b,!1),p+=c.pointer.chartPosition.left-m.x,a+=c.pointer.chartPosition.top-m.y);this.move(Math.round(m.x),Math.round(m.y||0),p,a)},getDateFormat:function(a,c,d,m){var g=this.chart.time,b=g.dateFormat("%m-%d %H:%M:%S.%L",c),l,f,x={millisecond:15,second:12,minute:9,hour:6,day:3},t="millisecond";for(f in w){if(a===w.week&&+g.dateFormat("%w",c)===d&&"00:00:00.000"===
+b.substr(6)){f="week";break}if(w[f]>a){f=t;break}if(x[f]&&b.substr(x[f])!=="01-01 00:00:00.000".substr(x[f]))break;"week"!==f&&(t=f)}f&&(l=g.resolveDTLFormat(m[f]).main);return l},getXDateFormat:function(a,c,d){c=c.dateTimeLabelFormats;var g=d&&d.closestPointRange;return(g?this.getDateFormat(g,a.x,d.options.startOfWeek,c):c.day)||c.year},tooltipFooterHeaderFormatter:function(a,c){c=c?"footer":"header";var d=a.series,g=d.tooltipOptions,p=g.xDateFormat,b=d.xAxis,l=b&&"datetime"===b.options.type&&h(a.key),
+f=g[c+"Format"];l&&!p&&(p=this.getXDateFormat(a,g,b));l&&p&&(a.point&&a.point.tooltipDateKeys||["key"]).forEach(function(a){f=f.replace("{point."+a+"}","{point."+a+":"+p+"}")});d.chart.styledMode&&(f=this.styledModeFormat(f));return E(f,{point:a,series:d},this.chart.time)},bodyFormatter:function(a){return a.map(function(a){var d=a.series.tooltipOptions;return(d[(a.point.formatPrefix||"point")+"Formatter"]||a.point.tooltipFormatter).call(a.point,d[(a.point.formatPrefix||"point")+"Format"]||"")})},
+styledModeFormat:function(a){return a.replace('style\x3d"font-size: 10px"','class\x3d"highcharts-header"').replace(/style="color:{(point|series)\.color}"/g,'class\x3d"highcharts-color-{$1.colorIndex}"')}}})(J);(function(a){var y=a.addEvent,G=a.attr,E=a.charts,h=a.color,c=a.css,r=a.defined,u=a.extend,v=a.find,w=a.fireEvent,n=a.isNumber,g=a.isObject,d=a.offset,m=a.pick,p=a.splat,b=a.Tooltip;a.Pointer=function(a,b){this.init(a,b)};a.Pointer.prototype={init:function(a,f){this.options=f;this.chart=a;this.runChartClick=
+f.chart.events&&!!f.chart.events.click;this.pinchDown=[];this.lastValidTouch={};b&&(a.tooltip=new b(a,f.tooltip),this.followTouchMove=m(f.tooltip.followTouchMove,!0));this.setDOMEvents()},zoomOption:function(a){var b=this.chart,d=b.options.chart,l=d.zoomType||"",b=b.inverted;/touch/.test(a.type)&&(l=m(d.pinchType,l));this.zoomX=a=/x/.test(l);this.zoomY=l=/y/.test(l);this.zoomHor=a&&!b||l&&b;this.zoomVert=l&&!b||a&&b;this.hasZoom=a||l},normalize:function(a,b){var f;f=a.touches?a.touches.length?a.touches.item(0):
+a.changedTouches[0]:a;b||(this.chartPosition=b=d(this.chart.container));return u(a,{chartX:Math.round(f.pageX-b.left),chartY:Math.round(f.pageY-b.top)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};this.chart.axes.forEach(function(f){b[f.isXAxis?"xAxis":"yAxis"].push({axis:f,value:f.toValue(a[f.horiz?"chartX":"chartY"])})});return b},findNearestKDPoint:function(a,b,d){var f;a.forEach(function(a){var l=!(a.noSharedTooltip&&b)&&0>a.options.findNearestPointBy.indexOf("y");a=a.searchPoint(d,
+l);if((l=g(a,!0))&&!(l=!g(f,!0)))var l=f.distX-a.distX,c=f.dist-a.dist,k=(a.series.group&&a.series.group.zIndex)-(f.series.group&&f.series.group.zIndex),l=0<(0!==l&&b?l:0!==c?c:0!==k?k:f.series.index>a.series.index?-1:1);l&&(f=a)});return f},getPointFromEvent:function(a){a=a.target;for(var b;a&&!b;)b=a.point,a=a.parentNode;return b},getChartCoordinatesFromPoint:function(a,b){var f=a.series,d=f.xAxis,f=f.yAxis,l=m(a.clientX,a.plotX),c=a.shapeArgs;if(d&&f)return b?{chartX:d.len+d.pos-l,chartY:f.len+
+f.pos-a.plotY}:{chartX:l+d.pos,chartY:a.plotY+f.pos};if(c&&c.x&&c.y)return{chartX:c.x,chartY:c.y}},getHoverData:function(a,b,d,c,p,h,n){var f,l=[],t=n&&n.isBoosting;c=!(!c||!a);n=b&&!b.stickyTracking?[b]:d.filter(function(a){return a.visible&&!(!p&&a.directTouch)&&m(a.options.enableMouseTracking,!0)&&a.stickyTracking});b=(f=c?a:this.findNearestKDPoint(n,p,h))&&f.series;f&&(p&&!b.noSharedTooltip?(n=d.filter(function(a){return a.visible&&!(!p&&a.directTouch)&&m(a.options.enableMouseTracking,!0)&&!a.noSharedTooltip}),
+n.forEach(function(a){var b=v(a.points,function(a){return a.x===f.x&&!a.isNull});g(b)&&(t&&(b=a.getPoint(b)),l.push(b))})):l.push(f));return{hoverPoint:f,hoverSeries:b,hoverPoints:l}},runPointActions:function(b,f){var d=this.chart,c=d.tooltip&&d.tooltip.options.enabled?d.tooltip:void 0,l=c?c.shared:!1,g=f||d.hoverPoint,p=g&&g.series||d.hoverSeries,p=this.getHoverData(g,p,d.series,"touchmove"!==b.type&&(!!f||p&&p.directTouch&&this.isDirectTouch),l,b,{isBoosting:d.isBoosting}),k,g=p.hoverPoint;k=p.hoverPoints;
+f=(p=p.hoverSeries)&&p.tooltipOptions.followPointer;l=l&&p&&!p.noSharedTooltip;if(g&&(g!==d.hoverPoint||c&&c.isHidden)){(d.hoverPoints||[]).forEach(function(a){-1===k.indexOf(a)&&a.setState()});(k||[]).forEach(function(a){a.setState("hover")});if(d.hoverSeries!==p)p.onMouseOver();d.hoverPoint&&d.hoverPoint.firePointEvent("mouseOut");if(!g.series)return;g.firePointEvent("mouseOver");d.hoverPoints=k;d.hoverPoint=g;c&&c.refresh(l?k:g,b)}else f&&c&&!c.isHidden&&(g=c.getAnchor([{}],b),c.updatePosition({plotX:g[0],
+plotY:g[1]}));this.unDocMouseMove||(this.unDocMouseMove=y(d.container.ownerDocument,"mousemove",function(b){var f=E[a.hoverChartIndex];if(f)f.pointer.onDocumentMouseMove(b)}));d.axes.forEach(function(f){var d=m(f.crosshair.snap,!0),c=d?a.find(k,function(a){return a.series[f.coll]===f}):void 0;c||!d?f.drawCrosshair(b,c):f.hideCrosshair()})},reset:function(a,b){var f=this.chart,d=f.hoverSeries,c=f.hoverPoint,l=f.hoverPoints,g=f.tooltip,k=g&&g.shared?l:c;a&&k&&p(k).forEach(function(b){b.series.isCartesian&&
+void 0===b.plotX&&(a=!1)});if(a)g&&k&&k.length&&(g.refresh(k),g.shared&&l?l.forEach(function(a){a.setState(a.state,!0);a.series.isCartesian&&(a.series.xAxis.crosshair&&a.series.xAxis.drawCrosshair(null,a),a.series.yAxis.crosshair&&a.series.yAxis.drawCrosshair(null,a))}):c&&(c.setState(c.state,!0),f.axes.forEach(function(a){a.crosshair&&a.drawCrosshair(null,c)})));else{if(c)c.onMouseOut();l&&l.forEach(function(a){a.setState()});if(d)d.onMouseOut();g&&g.hide(b);this.unDocMouseMove&&(this.unDocMouseMove=
+this.unDocMouseMove());f.axes.forEach(function(a){a.hideCrosshair()});this.hoverX=f.hoverPoints=f.hoverPoint=null}},scaleGroups:function(a,b){var f=this.chart,d;f.series.forEach(function(c){d=a||c.getPlotBox();c.xAxis&&c.xAxis.zoomEnabled&&c.group&&(c.group.attr(d),c.markerGroup&&(c.markerGroup.attr(d),c.markerGroup.clip(b?f.clipRect:null)),c.dataLabelsGroup&&c.dataLabelsGroup.attr(d))});f.clipRect.attr(b||f.clipBox)},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=
+this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,d=b.options.chart,c=a.chartX,l=a.chartY,g=this.zoomHor,p=this.zoomVert,k=b.plotLeft,m=b.plotTop,D=b.plotWidth,B=b.plotHeight,e,q=this.selectionMarker,n=this.mouseDownX,r=this.mouseDownY,u=d.panKey&&a[d.panKey+"Key"];q&&q.touch||(c<k?c=k:c>k+D&&(c=k+D),l<m?l=m:l>m+B&&(l=m+B),this.hasDragged=Math.sqrt(Math.pow(n-c,2)+Math.pow(r-l,2)),10<this.hasDragged&&(e=b.isInsidePlot(n-k,r-m),b.hasCartesianSeries&&
+(this.zoomX||this.zoomY)&&e&&!u&&!q&&(this.selectionMarker=q=b.renderer.rect(k,m,g?1:D,p?1:B,0).attr({"class":"highcharts-selection-marker",zIndex:7}).add(),b.styledMode||q.attr({fill:d.selectionMarkerFill||h("#335cad").setOpacity(.25).get()})),q&&g&&(c-=n,q.attr({width:Math.abs(c),x:(0<c?0:c)+n})),q&&p&&(c=l-r,q.attr({height:Math.abs(c),y:(0<c?0:c)+r})),e&&!q&&d.panning&&b.pan(a,d.panning)))},drop:function(a){var b=this,d=this.chart,l=this.hasPinched;if(this.selectionMarker){var g={originalEvent:a,
+xAxis:[],yAxis:[]},p=this.selectionMarker,m=p.attr?p.attr("x"):p.x,k=p.attr?p.attr("y"):p.y,A=p.attr?p.attr("width"):p.width,D=p.attr?p.attr("height"):p.height,h;if(this.hasDragged||l)d.axes.forEach(function(e){if(e.zoomEnabled&&r(e.min)&&(l||b[{xAxis:"zoomX",yAxis:"zoomY"}[e.coll]])){var f=e.horiz,d="touchend"===a.type?e.minPixelPadding:0,c=e.toValue((f?m:k)+d),f=e.toValue((f?m+A:k+D)-d);g[e.coll].push({axis:e,min:Math.min(c,f),max:Math.max(c,f)});h=!0}}),h&&w(d,"selection",g,function(a){d.zoom(u(a,
+l?{animation:!1}:null))});n(d.index)&&(this.selectionMarker=this.selectionMarker.destroy());l&&this.scaleGroups()}d&&n(d.index)&&(c(d.container,{cursor:d._cursor}),d.cancelClick=10<this.hasDragged,d.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])},onContainerMouseDown:function(a){a=this.normalize(a);2!==a.button&&(this.zoomOption(a),a.preventDefault&&a.preventDefault(),this.dragStart(a))},onDocumentMouseUp:function(b){E[a.hoverChartIndex]&&E[a.hoverChartIndex].pointer.drop(b)},onDocumentMouseMove:function(a){var b=
+this.chart,d=this.chartPosition;a=this.normalize(a,d);!d||this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)||this.reset()},onContainerMouseLeave:function(b){var f=E[a.hoverChartIndex];f&&(b.relatedTarget||b.toElement)&&(f.pointer.reset(),f.pointer.chartPosition=null)},onContainerMouseMove:function(b){var f=this.chart;r(a.hoverChartIndex)&&E[a.hoverChartIndex]&&E[a.hoverChartIndex].mouseIsDown||(a.hoverChartIndex=f.index);b=this.normalize(b);b.returnValue=
+!1;"mousedown"===f.mouseIsDown&&this.drag(b);!this.inClass(b.target,"highcharts-tracker")&&!f.isInsidePlot(b.chartX-f.plotLeft,b.chartY-f.plotTop)||f.openMenu||this.runPointActions(b)},inClass:function(a,b){for(var f;a;){if(f=G(a,"class")){if(-1!==f.indexOf(b))return!0;if(-1!==f.indexOf("highcharts-container"))return!1}a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries;a=a.relatedTarget||a.toElement;this.isDirectTouch=!1;if(!(!b||!a||b.stickyTracking||this.inClass(a,"highcharts-tooltip")||
+this.inClass(a,"highcharts-series-"+b.index)&&this.inClass(a,"highcharts-tracker")))b.onMouseOut()},onContainerClick:function(a){var b=this.chart,d=b.hoverPoint,c=b.plotLeft,l=b.plotTop;a=this.normalize(a);b.cancelClick||(d&&this.inClass(a.target,"highcharts-tracker")?(w(d.series,"click",u(a,{point:d})),b.hoverPoint&&d.firePointEvent("click",a)):(u(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-c,a.chartY-l)&&w(b,"click",a)))},setDOMEvents:function(){var b=this,f=b.chart.container,d=f.ownerDocument;
+f.onmousedown=function(a){b.onContainerMouseDown(a)};f.onmousemove=function(a){b.onContainerMouseMove(a)};f.onclick=function(a){b.onContainerClick(a)};this.unbindContainerMouseLeave=y(f,"mouseleave",b.onContainerMouseLeave);a.unbindDocumentMouseUp||(a.unbindDocumentMouseUp=y(d,"mouseup",b.onDocumentMouseUp));a.hasTouch&&(f.ontouchstart=function(a){b.onContainerTouchStart(a)},f.ontouchmove=function(a){b.onContainerTouchMove(a)},a.unbindDocumentTouchEnd||(a.unbindDocumentTouchEnd=y(d,"touchend",b.onDocumentTouchEnd)))},
+destroy:function(){var b=this;b.unDocMouseMove&&b.unDocMouseMove();this.unbindContainerMouseLeave();a.chartCount||(a.unbindDocumentMouseUp&&(a.unbindDocumentMouseUp=a.unbindDocumentMouseUp()),a.unbindDocumentTouchEnd&&(a.unbindDocumentTouchEnd=a.unbindDocumentTouchEnd()));clearInterval(b.tooltipTimeout);a.objectEach(b,function(a,d){b[d]=null})}}})(J);(function(a){var y=a.charts,G=a.extend,E=a.noop,h=a.pick;G(a.Pointer.prototype,{pinchTranslate:function(a,h,u,v,w,n){this.zoomHor&&this.pinchTranslateDirection(!0,
+a,h,u,v,w,n);this.zoomVert&&this.pinchTranslateDirection(!1,a,h,u,v,w,n)},pinchTranslateDirection:function(a,h,u,v,w,n,g,d){var c=this.chart,p=a?"x":"y",b=a?"X":"Y",l="chart"+b,f=a?"width":"height",x=c["plot"+(a?"Left":"Top")],t,r,F=d||1,z=c.inverted,k=c.bounds[a?"h":"v"],A=1===h.length,D=h[0][l],B=u[0][l],e=!A&&h[1][l],q=!A&&u[1][l],L;u=function(){!A&&20<Math.abs(D-e)&&(F=d||Math.abs(B-q)/Math.abs(D-e));r=(x-B)/F+D;t=c["plot"+(a?"Width":"Height")]/F};u();h=r;h<k.min?(h=k.min,L=!0):h+t>k.max&&(h=
+k.max-t,L=!0);L?(B-=.8*(B-g[p][0]),A||(q-=.8*(q-g[p][1])),u()):g[p]=[B,q];z||(n[p]=r-x,n[f]=t);n=z?1/F:F;w[f]=t;w[p]=h;v[z?a?"scaleY":"scaleX":"scale"+b]=F;v["translate"+b]=n*x+(B-n*D)},pinch:function(a){var c=this,u=c.chart,v=c.pinchDown,w=a.touches,n=w.length,g=c.lastValidTouch,d=c.hasZoom,m=c.selectionMarker,p={},b=1===n&&(c.inClass(a.target,"highcharts-tracker")&&u.runTrackerClick||c.runChartClick),l={};1<n&&(c.initiated=!0);d&&c.initiated&&!b&&a.preventDefault();[].map.call(w,function(a){return c.normalize(a)});
+"touchstart"===a.type?([].forEach.call(w,function(a,b){v[b]={chartX:a.chartX,chartY:a.chartY}}),g.x=[v[0].chartX,v[1]&&v[1].chartX],g.y=[v[0].chartY,v[1]&&v[1].chartY],u.axes.forEach(function(a){if(a.zoomEnabled){var b=u.bounds[a.horiz?"h":"v"],f=a.minPixelPadding,d=a.toPixels(h(a.options.min,a.dataMin)),c=a.toPixels(h(a.options.max,a.dataMax)),l=Math.max(d,c);b.min=Math.min(a.pos,Math.min(d,c)-f);b.max=Math.max(a.pos+a.len,l+f)}}),c.res=!0):c.followTouchMove&&1===n?this.runPointActions(c.normalize(a)):
+v.length&&(m||(c.selectionMarker=m=G({destroy:E,touch:!0},u.plotBox)),c.pinchTranslate(v,w,p,m,l,g),c.hasPinched=d,c.scaleGroups(p,l),c.res&&(c.res=!1,this.reset(!1,0)))},touch:function(c,r){var u=this.chart,v,w;if(u.index!==a.hoverChartIndex)this.onContainerMouseLeave({relatedTarget:!0});a.hoverChartIndex=u.index;1===c.touches.length?(c=this.normalize(c),(w=u.isInsidePlot(c.chartX-u.plotLeft,c.chartY-u.plotTop))&&!u.openMenu?(r&&this.runPointActions(c),"touchmove"===c.type&&(r=this.pinchDown,v=r[0]?
+4<=Math.sqrt(Math.pow(r[0].chartX-c.chartX,2)+Math.pow(r[0].chartY-c.chartY,2)):!1),h(v,!0)&&this.pinch(c)):r&&this.reset()):2===c.touches.length&&this.pinch(c)},onContainerTouchStart:function(a){this.zoomOption(a);this.touch(a,!0)},onContainerTouchMove:function(a){this.touch(a)},onDocumentTouchEnd:function(c){y[a.hoverChartIndex]&&y[a.hoverChartIndex].pointer.drop(c)}})})(J);(function(a){var y=a.addEvent,G=a.charts,E=a.css,h=a.doc,c=a.extend,r=a.noop,u=a.Pointer,v=a.removeEvent,w=a.win,n=a.wrap;
+if(!a.hasTouch&&(w.PointerEvent||w.MSPointerEvent)){var g={},d=!!w.PointerEvent,m=function(){var b=[];b.item=function(a){return this[a]};a.objectEach(g,function(a){b.push({pageX:a.pageX,pageY:a.pageY,target:a.target})});return b},p=function(b,d,f,c){"touch"!==b.pointerType&&b.pointerType!==b.MSPOINTER_TYPE_TOUCH||!G[a.hoverChartIndex]||(c(b),c=G[a.hoverChartIndex].pointer,c[d]({type:f,target:b.currentTarget,preventDefault:r,touches:m()}))};c(u.prototype,{onContainerPointerDown:function(a){p(a,"onContainerTouchStart",
+"touchstart",function(a){g[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},onContainerPointerMove:function(a){p(a,"onContainerTouchMove","touchmove",function(a){g[a.pointerId]={pageX:a.pageX,pageY:a.pageY};g[a.pointerId].target||(g[a.pointerId].target=a.currentTarget)})},onDocumentPointerUp:function(a){p(a,"onDocumentTouchEnd","touchend",function(a){delete g[a.pointerId]})},batchMSEvents:function(a){a(this.chart.container,d?"pointerdown":"MSPointerDown",this.onContainerPointerDown);
+a(this.chart.container,d?"pointermove":"MSPointerMove",this.onContainerPointerMove);a(h,d?"pointerup":"MSPointerUp",this.onDocumentPointerUp)}});n(u.prototype,"init",function(a,d,f){a.call(this,d,f);this.hasZoom&&E(d.container,{"-ms-touch-action":"none","touch-action":"none"})});n(u.prototype,"setDOMEvents",function(a){a.apply(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(y)});n(u.prototype,"destroy",function(a){this.batchMSEvents(v);a.call(this)})}})(J);(function(a){var y=a.addEvent,
+G=a.css,E=a.discardElement,h=a.defined,c=a.fireEvent,r=a.isFirefox,u=a.marginNames,v=a.merge,w=a.pick,n=a.setAnimation,g=a.stableSort,d=a.win,m=a.wrap;a.Legend=function(a,b){this.init(a,b)};a.Legend.prototype={init:function(a,b){this.chart=a;this.setOptions(b);b.enabled&&(this.render(),y(this.chart,"endResize",function(){this.legend.positionCheckboxes()}),this.proximate?this.unchartrender=y(this.chart,"render",function(){this.legend.proximatePositions();this.legend.positionItems()}):this.unchartrender&&
+this.unchartrender())},setOptions:function(a){var b=w(a.padding,8);this.options=a;this.chart.styledMode||(this.itemStyle=a.itemStyle,this.itemHiddenStyle=v(this.itemStyle,a.itemHiddenStyle));this.itemMarginTop=a.itemMarginTop||0;this.padding=b;this.initialItemY=b-5;this.symbolWidth=w(a.symbolWidth,16);this.pages=[];this.proximate="proximate"===a.layout&&!this.chart.inverted},update:function(a,b){var d=this.chart;this.setOptions(v(!0,this.options,a));this.destroy();d.isDirtyLegend=d.isDirtyBox=!0;
+w(b,!0)&&d.redraw();c(this,"afterUpdate")},colorizeItem:function(a,b){a.legendGroup[b?"removeClass":"addClass"]("highcharts-legend-item-hidden");if(!this.chart.styledMode){var d=this.options,f=a.legendItem,g=a.legendLine,p=a.legendSymbol,m=this.itemHiddenStyle.color,d=b?d.itemStyle.color:m,h=b?a.color||m:m,n=a.options&&a.options.marker,k={fill:h};f&&f.css({fill:d,color:d});g&&g.attr({stroke:h});p&&(n&&p.isMarker&&(k=a.pointAttribs(),b||(k.stroke=k.fill=m)),p.attr(k))}c(this,"afterColorizeItem",{item:a,
+visible:b})},positionItems:function(){this.allItems.forEach(this.positionItem,this);this.chart.isResizing||this.positionCheckboxes()},positionItem:function(a){var b=this.options,d=b.symbolPadding,b=!b.rtl,f=a._legendItemPos,c=f[0],f=f[1],g=a.checkbox;if((a=a.legendGroup)&&a.element)a[h(a.translateY)?"animate":"attr"]({translateX:b?c:this.legendWidth-c-2*d-4,translateY:f});g&&(g.x=c,g.y=f)},destroyItem:function(a){var b=a.checkbox;["legendItem","legendLine","legendSymbol","legendGroup"].forEach(function(b){a[b]&&
+(a[b]=a[b].destroy())});b&&E(a.checkbox)},destroy:function(){function a(a){this[a]&&(this[a]=this[a].destroy())}this.getAllItems().forEach(function(b){["legendItem","legendGroup"].forEach(a,b)});"clipRect up down pager nav box title group".split(" ").forEach(a,this);this.display=null},positionCheckboxes:function(){var a=this.group&&this.group.alignAttr,b,d=this.clipHeight||this.legendHeight,f=this.titleHeight;a&&(b=a.translateY,this.allItems.forEach(function(c){var g=c.checkbox,l;g&&(l=b+f+g.y+(this.scrollOffset||
+0)+3,G(g,{left:a.translateX+c.checkboxOffset+g.x-20+"px",top:l+"px",display:this.proximate||l>b-6&&l<b+d-6?"":"none"}))},this))},renderTitle:function(){var a=this.options,b=this.padding,d=a.title,f=0;d.text&&(this.title||(this.title=this.chart.renderer.label(d.text,b-3,b-4,null,null,null,a.useHTML,null,"legend-title").attr({zIndex:1}),this.chart.styledMode||this.title.css(d.style),this.title.add(this.group)),a=this.title.getBBox(),f=a.height,this.offsetWidth=a.width,this.contentGroup.attr({translateY:f}));
+this.titleHeight=f},setText:function(d){var b=this.options;d.legendItem.attr({text:b.labelFormat?a.format(b.labelFormat,d,this.chart.time):b.labelFormatter.call(d)})},renderItem:function(a){var b=this.chart,d=b.renderer,f=this.options,c=this.symbolWidth,g=f.symbolPadding,p=this.itemStyle,m=this.itemHiddenStyle,h="horizontal"===f.layout?w(f.itemDistance,20):0,k=!f.rtl,A=a.legendItem,D=!a.series,B=!D&&a.series.drawLegendSymbol?a.series:a,e=B.options,e=this.createCheckboxForItem&&e&&e.showCheckbox,h=
+c+g+h+(e?20:0),q=f.useHTML,n=a.options.className;A||(a.legendGroup=d.g("legend-item").addClass("highcharts-"+B.type+"-series highcharts-color-"+a.colorIndex+(n?" "+n:"")+(D?" highcharts-series-"+a.index:"")).attr({zIndex:1}).add(this.scrollGroup),a.legendItem=A=d.text("",k?c+g:-g,this.baseline||0,q),b.styledMode||A.css(v(a.visible?p:m)),A.attr({align:k?"left":"right",zIndex:2}).add(a.legendGroup),this.baseline||(this.fontMetrics=d.fontMetrics(b.styledMode?12:p.fontSize,A),this.baseline=this.fontMetrics.f+
+3+this.itemMarginTop,A.attr("y",this.baseline)),this.symbolHeight=f.symbolHeight||this.fontMetrics.f,B.drawLegendSymbol(this,a),this.setItemEvents&&this.setItemEvents(a,A,q),e&&this.createCheckboxForItem(a));this.colorizeItem(a,a.visible);!b.styledMode&&p.width||A.css({width:(f.itemWidth||f.width||b.spacingBox.width)-h});this.setText(a);b=A.getBBox();a.itemWidth=a.checkboxOffset=f.itemWidth||a.legendItemWidth||b.width+h;this.maxItemWidth=Math.max(this.maxItemWidth,a.itemWidth);this.totalItemWidth+=
+a.itemWidth;this.itemHeight=a.itemHeight=Math.round(a.legendItemHeight||b.height||this.symbolHeight)},layoutItem:function(a){var b=this.options,d=this.padding,f="horizontal"===b.layout,c=a.itemHeight,g=b.itemMarginBottom||0,p=this.itemMarginTop,m=f?w(b.itemDistance,20):0,h=b.width,k=h||this.chart.spacingBox.width-2*d-b.x,b=b.alignColumns&&this.totalItemWidth>k?this.maxItemWidth:a.itemWidth;f&&this.itemX-d+b>k&&(this.itemX=d,this.itemY+=p+this.lastLineHeight+g,this.lastLineHeight=0);this.lastItemY=
+p+this.itemY+g;this.lastLineHeight=Math.max(c,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];f?this.itemX+=b:(this.itemY+=p+c+g,this.lastLineHeight=c);this.offsetWidth=h||Math.max((f?this.itemX-d-(a.checkbox?0:m):b)+d,this.offsetWidth)},getAllItems:function(){var a=[];this.chart.series.forEach(function(b){var d=b&&b.options;b&&w(d.showInLegend,h(d.linkedTo)?!1:void 0,!0)&&(a=a.concat(b.legendItems||("point"===d.legendType?b.data:b)))});c(this,"afterGetAllItems",{allItems:a});return a},
+getAlignment:function(){var a=this.options;return this.proximate?a.align.charAt(0)+"tv":a.floating?"":a.align.charAt(0)+a.verticalAlign.charAt(0)+a.layout.charAt(0)},adjustMargins:function(a,b){var d=this.chart,f=this.options,c=this.getAlignment();c&&[/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/].forEach(function(g,l){g.test(c)&&!h(a[l])&&(d[u[l]]=Math.max(d[u[l]],d.legend[(l+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][l]*f[l%2?"x":"y"]+w(f.margin,12)+b[l]+(0===l&&void 0!==d.options.title.margin?
+d.titleOffset+d.options.title.margin:0)))})},proximatePositions:function(){var d=this.chart,b=[],c="left"===this.options.align;this.allItems.forEach(function(f){var g,l;g=c;f.xAxis&&f.points&&(f.xAxis.options.reversed&&(g=!g),g=a.find(g?f.points:f.points.slice(0).reverse(),function(b){return a.isNumber(b.plotY)}),l=f.legendGroup.getBBox().height,b.push({target:f.visible?(g?g.plotY:f.xAxis.height)-.3*l:d.plotHeight,size:l,item:f}))},this);a.distribute(b,d.plotHeight);b.forEach(function(a){a.item._legendItemPos[1]=
+d.plotTop-d.spacing[0]+a.pos})},render:function(){var a=this.chart,b=a.renderer,d=this.group,f,c,m,h=this.box,n=this.options,z=this.padding;this.itemX=z;this.itemY=this.initialItemY;this.lastItemY=this.offsetWidth=0;d||(this.group=d=b.g("legend").attr({zIndex:7}).add(),this.contentGroup=b.g().attr({zIndex:1}).add(d),this.scrollGroup=b.g().add(this.contentGroup));this.renderTitle();f=this.getAllItems();g(f,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||
+0)});n.reversed&&f.reverse();this.allItems=f;this.display=c=!!f.length;this.itemHeight=this.totalItemWidth=this.maxItemWidth=this.lastLineHeight=0;f.forEach(this.renderItem,this);f.forEach(this.layoutItem,this);f=(n.width||this.offsetWidth)+z;m=this.lastItemY+this.lastLineHeight+this.titleHeight;m=this.handleOverflow(m);m+=z;h||(this.box=h=b.rect().addClass("highcharts-legend-box").attr({r:n.borderRadius}).add(d),h.isNew=!0);a.styledMode||h.attr({stroke:n.borderColor,"stroke-width":n.borderWidth||
+0,fill:n.backgroundColor||"none"}).shadow(n.shadow);0<f&&0<m&&(h[h.isNew?"attr":"animate"](h.crisp.call({},{x:0,y:0,width:f,height:m},h.strokeWidth())),h.isNew=!1);h[c?"show":"hide"]();a.styledMode&&"none"===d.getStyle("display")&&(f=m=0);this.legendWidth=f;this.legendHeight=m;c&&(b=a.spacingBox,/(lth|ct|rth)/.test(this.getAlignment())&&(b=v(b,{y:b.y+a.titleOffset+a.options.title.margin})),d.align(v(n,{width:f,height:m,verticalAlign:this.proximate?"top":n.verticalAlign}),!0,b));this.proximate||this.positionItems()},
+handleOverflow:function(a){var b=this,d=this.chart,f=d.renderer,c=this.options,g=c.y,m=this.padding,g=d.spacingBox.height+("top"===c.verticalAlign?-g:g)-m,p=c.maxHeight,h,k=this.clipRect,A=c.navigation,D=w(A.animation,!0),n=A.arrowSize||12,e=this.nav,q=this.pages,r,u=this.allItems,v=function(a){"number"===typeof a?k.attr({height:a}):k&&(b.clipRect=k.destroy(),b.contentGroup.clip());b.contentGroup.div&&(b.contentGroup.div.style.clip=a?"rect("+m+"px,9999px,"+(m+a)+"px,0)":"auto")};"horizontal"!==c.layout||
+"middle"===c.verticalAlign||c.floating||(g/=2);p&&(g=Math.min(g,p));q.length=0;a>g&&!1!==A.enabled?(this.clipHeight=h=Math.max(g-20-this.titleHeight-m,0),this.currentPage=w(this.currentPage,1),this.fullHeight=a,u.forEach(function(a,b){var e=a._legendItemPos[1],d=Math.round(a.legendItem.getBBox().height),f=q.length;if(!f||e-q[f-1]>h&&(r||e)!==q[f-1])q.push(r||e),f++;a.pageIx=f-1;r&&(u[b-1].pageIx=f-1);b===u.length-1&&e+d-q[f-1]>h&&e!==r&&(q.push(e),a.pageIx=f);e!==r&&(r=e)}),k||(k=b.clipRect=f.clipRect(0,
+m,9999,0),b.contentGroup.clip(k)),v(h),e||(this.nav=e=f.g().attr({zIndex:1}).add(this.group),this.up=f.symbol("triangle",0,0,n,n).on("click",function(){b.scroll(-1,D)}).add(e),this.pager=f.text("",15,10).addClass("highcharts-legend-navigation"),d.styledMode||this.pager.css(A.style),this.pager.add(e),this.down=f.symbol("triangle-down",0,0,n,n).on("click",function(){b.scroll(1,D)}).add(e)),b.scroll(0),a=g):e&&(v(),this.nav=e.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},
+scroll:function(a,b){var d=this.pages,f=d.length;a=this.currentPage+a;var c=this.clipHeight,g=this.options.navigation,m=this.pager,p=this.padding;a>f&&(a=f);0<a&&(void 0!==b&&n(b,this.chart),this.nav.attr({translateX:p,translateY:c+this.padding+7+this.titleHeight,visibility:"visible"}),this.up.attr({"class":1===a?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"}),m.attr({text:a+"/"+f}),this.down.attr({x:18+this.pager.getBBox().width,"class":a===f?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"}),
+this.chart.styledMode||(this.up.attr({fill:1===a?g.inactiveColor:g.activeColor}).css({cursor:1===a?"default":"pointer"}),this.down.attr({fill:a===f?g.inactiveColor:g.activeColor}).css({cursor:a===f?"default":"pointer"})),this.scrollOffset=-d[a-1]+this.initialItemY,this.scrollGroup.animate({translateY:this.scrollOffset}),this.currentPage=a,this.positionCheckboxes())}};a.LegendSymbolMixin={drawRectangle:function(a,b){var d=a.symbolHeight,f=a.options.squareSymbol;b.legendSymbol=this.chart.renderer.rect(f?
+(a.symbolWidth-d)/2:0,a.baseline-d+1,f?d:a.symbolWidth,d,w(a.options.symbolRadius,d/2)).addClass("highcharts-point").attr({zIndex:3}).add(b.legendGroup)},drawLineMarker:function(a){var b=this.options,d=b.marker,f=a.symbolWidth,c=a.symbolHeight,g=c/2,m=this.chart.renderer,p=this.legendGroup;a=a.baseline-Math.round(.3*a.fontMetrics.b);var h={};this.chart.styledMode||(h={"stroke-width":b.lineWidth||0},b.dashStyle&&(h.dashstyle=b.dashStyle));this.legendLine=m.path(["M",0,a,"L",f,a]).addClass("highcharts-graph").attr(h).add(p);
+d&&!1!==d.enabled&&f&&(b=Math.min(w(d.radius,g),g),0===this.symbol.indexOf("url")&&(d=v(d,{width:c,height:c}),b=0),this.legendSymbol=d=m.symbol(this.symbol,f/2-b,a-b,2*b,2*b,d).addClass("highcharts-point").add(p),d.isMarker=!0)}};(/Trident\/7\.0/.test(d.navigator.userAgent)||r)&&m(a.Legend.prototype,"positionItem",function(a,b){var d=this,f=function(){b._legendItemPos&&a.call(d,b)};f();d.bubbleLegend||setTimeout(f)})})(J);(function(a){var y=a.addEvent,G=a.animate,E=a.animObject,h=a.attr,c=a.doc,r=
+a.Axis,u=a.createElement,v=a.defaultOptions,w=a.discardElement,n=a.charts,g=a.css,d=a.defined,m=a.extend,p=a.find,b=a.fireEvent,l=a.isNumber,f=a.isObject,x=a.isString,t=a.Legend,H=a.marginNames,F=a.merge,z=a.objectEach,k=a.Pointer,A=a.pick,D=a.pInt,B=a.removeEvent,e=a.seriesTypes,q=a.splat,L=a.syncTimeout,I=a.win,R=a.Chart=function(){this.getArgs.apply(this,arguments)};a.chart=function(a,b,e){return new R(a,b,e)};m(R.prototype,{callbacks:[],getArgs:function(){var a=[].slice.call(arguments);if(x(a[0])||
+a[0].nodeName)this.renderTo=a.shift();this.init(a[0],a[1])},init:function(e,d){var f,k,c=e.series,g=e.plotOptions||{};b(this,"init",{args:arguments},function(){e.series=null;f=F(v,e);for(k in f.plotOptions)f.plotOptions[k].tooltip=g[k]&&F(g[k].tooltip)||void 0;f.tooltip.userOptions=e.chart&&e.chart.forExport&&e.tooltip.userOptions||e.tooltip;f.series=e.series=c;this.userOptions=e;var q=f.chart,l=q.events;this.margin=[];this.spacing=[];this.bounds={h:{},v:{}};this.labelCollectors=[];this.callback=
+d;this.isResizing=0;this.options=f;this.axes=[];this.series=[];this.time=e.time&&Object.keys(e.time).length?new a.Time(e.time):a.time;this.styledMode=q.styledMode;this.hasCartesianSeries=q.showAxes;var m=this;m.index=n.length;n.push(m);a.chartCount++;l&&z(l,function(a,b){y(m,b,a)});m.xAxis=[];m.yAxis=[];m.pointCount=m.colorCounter=m.symbolCounter=0;b(m,"afterInit");m.firstRender()})},initSeries:function(b){var d=this.options.chart;(d=e[b.type||d.type||d.defaultSeriesType])||a.error(17,!0,this);d=
+new d;d.init(this,b);return d},orderSeries:function(a){var b=this.series;for(a=a||0;a<b.length;a++)b[a]&&(b[a].index=a,b[a].name=b[a].getName())},isInsidePlot:function(a,b,e){var d=e?b:a;a=e?a:b;return 0<=d&&d<=this.plotWidth&&0<=a&&a<=this.plotHeight},redraw:function(e){b(this,"beforeRedraw");var d=this.axes,f=this.series,k=this.pointer,c=this.legend,g=this.userOptions.legend,q=this.isDirtyLegend,l,p,A=this.hasCartesianSeries,h=this.isDirtyBox,D,t=this.renderer,n=t.isHidden(),B=[];this.setResponsive&&
+this.setResponsive(!1);a.setAnimation(e,this);n&&this.temporaryDisplay();this.layOutTitles();for(e=f.length;e--;)if(D=f[e],D.options.stacking&&(l=!0,D.isDirty)){p=!0;break}if(p)for(e=f.length;e--;)D=f[e],D.options.stacking&&(D.isDirty=!0);f.forEach(function(a){a.isDirty&&("point"===a.options.legendType?(a.updateTotals&&a.updateTotals(),q=!0):g&&(g.labelFormatter||g.labelFormat)&&(q=!0));a.isDirtyData&&b(a,"updatedData")});q&&c&&c.options.enabled&&(c.render(),this.isDirtyLegend=!1);l&&this.getStacks();
+A&&d.forEach(function(a){a.updateNames();a.updateYNames&&a.updateYNames();a.setScale()});this.getMargins();A&&(d.forEach(function(a){a.isDirty&&(h=!0)}),d.forEach(function(a){var e=a.min+","+a.max;a.extKey!==e&&(a.extKey=e,B.push(function(){b(a,"afterSetExtremes",m(a.eventArgs,a.getExtremes()));delete a.eventArgs}));(h||l)&&a.redraw()}));h&&this.drawChartBox();b(this,"predraw");f.forEach(function(a){(h||a.isDirty)&&a.visible&&a.redraw();a.isDirtyData=!1});k&&k.reset(!0);t.draw();b(this,"redraw");
+b(this,"render");n&&this.temporaryDisplay(!0);B.forEach(function(a){a.call()})},get:function(a){function b(b){return b.id===a||b.options&&b.options.id===a}var e,d=this.series,f;e=p(this.axes,b)||p(this.series,b);for(f=0;!e&&f<d.length;f++)e=p(d[f].points||[],b);return e},getAxes:function(){var a=this,e=this.options,d=e.xAxis=q(e.xAxis||{}),e=e.yAxis=q(e.yAxis||{});b(this,"getAxes");d.forEach(function(a,b){a.index=b;a.isX=!0});e.forEach(function(a,b){a.index=b});d.concat(e).forEach(function(b){new r(a,
+b)});b(this,"afterGetAxes")},getSelectedPoints:function(){var a=[];this.series.forEach(function(b){a=a.concat((b.data||[]).filter(function(a){return a.selected}))});return a},getSelectedSeries:function(){return this.series.filter(function(a){return a.selected})},setTitle:function(a,b,e){var d=this,f=d.options,k=d.styledMode,c;c=f.title=F(!k&&{style:{color:"#333333",fontSize:f.isStock?"16px":"18px"}},f.title,a);f=f.subtitle=F(!k&&{style:{color:"#666666"}},f.subtitle,b);[["title",a,c],["subtitle",b,
+f]].forEach(function(a,b){var e=a[0],f=d[e],c=a[1];a=a[2];f&&c&&(d[e]=f=f.destroy());a&&!f&&(d[e]=d.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,"class":"highcharts-"+e,zIndex:a.zIndex||4}).add(),d[e].update=function(a){d.setTitle(!b&&a,b&&a)},k||d[e].css(a.style))});d.layOutTitles(e)},layOutTitles:function(a){var b=0,e,d=this.renderer,f=this.spacingBox;["title","subtitle"].forEach(function(a){var e=this[a],k=this.options[a];a="title"===a?-3:k.verticalAlign?0:b+2;var c;e&&(this.styledMode||
+(c=k.style.fontSize),c=d.fontMetrics(c,e).b,e.css({width:(k.width||f.width+k.widthAdjust)+"px"}).align(m({y:a+c},k),!1,"spacingBox"),k.floating||k.verticalAlign||(b=Math.ceil(b+e.getBBox(k.useHTML).height)))},this);e=this.titleOffset!==b;this.titleOffset=b;!this.isDirtyBox&&e&&(this.isDirtyBox=this.isDirtyLegend=e,this.hasRendered&&A(a,!0)&&this.isDirtyBox&&this.redraw())},getChartSize:function(){var b=this.options.chart,e=b.width,b=b.height,f=this.renderTo;d(e)||(this.containerWidth=a.getStyle(f,
+"width"));d(b)||(this.containerHeight=a.getStyle(f,"height"));this.chartWidth=Math.max(0,e||this.containerWidth||600);this.chartHeight=Math.max(0,a.relativeLength(b,this.chartWidth)||(1<this.containerHeight?this.containerHeight:400))},temporaryDisplay:function(b){var e=this.renderTo;if(b)for(;e&&e.style;)e.hcOrigStyle&&(a.css(e,e.hcOrigStyle),delete e.hcOrigStyle),e.hcOrigDetached&&(c.body.removeChild(e),e.hcOrigDetached=!1),e=e.parentNode;else for(;e&&e.style;){c.body.contains(e)||e.parentNode||
+(e.hcOrigDetached=!0,c.body.appendChild(e));if("none"===a.getStyle(e,"display",!1)||e.hcOricDetached)e.hcOrigStyle={display:e.style.display,height:e.style.height,overflow:e.style.overflow},b={display:"block",overflow:"hidden"},e!==this.renderTo&&(b.height=0),a.css(e,b),e.offsetWidth||e.style.setProperty("display","block","important");e=e.parentNode;if(e===c.body)break}},setClassName:function(a){this.container.className="highcharts-container "+(a||"")},getContainer:function(){var e,d=this.options,
+f=d.chart,k,q;e=this.renderTo;var p=a.uniqueKey(),A,t;e||(this.renderTo=e=f.renderTo);x(e)&&(this.renderTo=e=c.getElementById(e));e||a.error(13,!0,this);k=D(h(e,"data-highcharts-chart"));l(k)&&n[k]&&n[k].hasRendered&&n[k].destroy();h(e,"data-highcharts-chart",this.index);e.innerHTML="";f.skipClone||e.offsetWidth||this.temporaryDisplay();this.getChartSize();k=this.chartWidth;q=this.chartHeight;g(e,{overflow:"hidden"});this.styledMode||(A=m({position:"relative",overflow:"hidden",width:k+"px",height:q+
+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},f.style));this.container=e=u("div",{id:p},A,e);this._cursor=e.style.cursor;this.renderer=new (a[f.renderer]||a.Renderer)(e,k,q,null,f.forExport,d.exporting&&d.exporting.allowHTML,this.styledMode);this.setClassName(f.className);if(this.styledMode)for(t in d.defs)this.renderer.definition(d.defs[t]);else this.renderer.setStyle(f.style);this.renderer.chartIndex=this.index;b(this,"afterGetContainer")},getMargins:function(a){var e=
+this.spacing,f=this.margin,k=this.titleOffset;this.resetMargins();k&&!d(f[0])&&(this.plotTop=Math.max(this.plotTop,k+this.options.title.margin+e[0]));this.legend&&this.legend.display&&this.legend.adjustMargins(f,e);b(this,"getMargins");a||this.getAxisMargins()},getAxisMargins:function(){var a=this,b=a.axisOffset=[0,0,0,0],e=a.margin;a.hasCartesianSeries&&a.axes.forEach(function(a){a.visible&&a.getOffset()});H.forEach(function(f,k){d(e[k])||(a[f]+=b[k])});a.setChartSize()},reflow:function(b){var e=
+this,f=e.options.chart,k=e.renderTo,g=d(f.width)&&d(f.height),q=f.width||a.getStyle(k,"width"),f=f.height||a.getStyle(k,"height"),k=b?b.target:I;if(!g&&!e.isPrinting&&q&&f&&(k===I||k===c)){if(q!==e.containerWidth||f!==e.containerHeight)a.clearTimeout(e.reflowTimeout),e.reflowTimeout=L(function(){e.container&&e.setSize(void 0,void 0,!1)},b?100:0);e.containerWidth=q;e.containerHeight=f}},setReflow:function(a){var b=this;!1===a||this.unbindReflow?!1===a&&this.unbindReflow&&(this.unbindReflow=this.unbindReflow()):
+(this.unbindReflow=y(I,"resize",function(a){b.reflow(a)}),y(this,"destroy",this.unbindReflow))},setSize:function(e,f,d){var k=this,c=k.renderer,q;k.isResizing+=1;a.setAnimation(d,k);k.oldChartHeight=k.chartHeight;k.oldChartWidth=k.chartWidth;void 0!==e&&(k.options.chart.width=e);void 0!==f&&(k.options.chart.height=f);k.getChartSize();k.styledMode||(q=c.globalAnimation,(q?G:g)(k.container,{width:k.chartWidth+"px",height:k.chartHeight+"px"},q));k.setChartSize(!0);c.setSize(k.chartWidth,k.chartHeight,
+d);k.axes.forEach(function(a){a.isDirty=!0;a.setScale()});k.isDirtyLegend=!0;k.isDirtyBox=!0;k.layOutTitles();k.getMargins();k.redraw(d);k.oldChartHeight=null;b(k,"resize");L(function(){k&&b(k,"endResize",null,function(){--k.isResizing})},E(q).duration)},setChartSize:function(a){var e=this.inverted,f=this.renderer,d=this.chartWidth,k=this.chartHeight,c=this.options.chart,g=this.spacing,q=this.clipOffset,l,m,p,A;this.plotLeft=l=Math.round(this.plotLeft);this.plotTop=m=Math.round(this.plotTop);this.plotWidth=
+p=Math.max(0,Math.round(d-l-this.marginRight));this.plotHeight=A=Math.max(0,Math.round(k-m-this.marginBottom));this.plotSizeX=e?A:p;this.plotSizeY=e?p:A;this.plotBorderWidth=c.plotBorderWidth||0;this.spacingBox=f.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:k-g[0]-g[2]};this.plotBox=f.plotBox={x:l,y:m,width:p,height:A};d=2*Math.floor(this.plotBorderWidth/2);e=Math.ceil(Math.max(d,q[3])/2);f=Math.ceil(Math.max(d,q[0])/2);this.clipBox={x:e,y:f,width:Math.floor(this.plotSizeX-Math.max(d,q[1])/
+2-e),height:Math.max(0,Math.floor(this.plotSizeY-Math.max(d,q[2])/2-f))};a||this.axes.forEach(function(a){a.setAxisSize();a.setAxisTranslation()});b(this,"afterSetChartSize",{skipAxes:a})},resetMargins:function(){b(this,"resetMargins");var a=this,e=a.options.chart;["margin","spacing"].forEach(function(b){var d=e[b],k=f(d)?d:[d,d,d,d];["Top","Right","Bottom","Left"].forEach(function(d,f){a[b][f]=A(e[b+d],k[f])})});H.forEach(function(b,e){a[b]=A(a.margin[e],a.spacing[e])});a.axisOffset=[0,0,0,0];a.clipOffset=
+[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,e=this.renderer,d=this.chartWidth,f=this.chartHeight,k=this.chartBackground,c=this.plotBackground,g=this.plotBorder,q,l=this.styledMode,m=this.plotBGImage,p=a.backgroundColor,A=a.plotBackgroundColor,h=a.plotBackgroundImage,D,t=this.plotLeft,n=this.plotTop,B=this.plotWidth,x=this.plotHeight,r=this.plotBox,z=this.clipRect,u=this.clipBox,v="animate";k||(this.chartBackground=k=e.rect().addClass("highcharts-background").add(),v="attr");if(l)q=
+D=k.strokeWidth();else{q=a.borderWidth||0;D=q+(a.shadow?8:0);p={fill:p||"none"};if(q||k["stroke-width"])p.stroke=a.borderColor,p["stroke-width"]=q;k.attr(p).shadow(a.shadow)}k[v]({x:D/2,y:D/2,width:d-D-q%2,height:f-D-q%2,r:a.borderRadius});v="animate";c||(v="attr",this.plotBackground=c=e.rect().addClass("highcharts-plot-background").add());c[v](r);l||(c.attr({fill:A||"none"}).shadow(a.plotShadow),h&&(m?m.animate(r):this.plotBGImage=e.image(h,t,n,B,x).add()));z?z.animate({width:u.width,height:u.height}):
+this.clipRect=e.clipRect(u);v="animate";g||(v="attr",this.plotBorder=g=e.rect().addClass("highcharts-plot-border").attr({zIndex:1}).add());l||g.attr({stroke:a.plotBorderColor,"stroke-width":a.plotBorderWidth||0,fill:"none"});g[v](g.crisp({x:t,y:n,width:B,height:x},-g.strokeWidth()));this.isDirtyBox=!1;b(this,"afterDrawChartBox")},propFromSeries:function(){var a=this,b=a.options.chart,d,f=a.options.series,k,c;["inverted","angular","polar"].forEach(function(g){d=e[b.type||b.defaultSeriesType];c=b[g]||
+d&&d.prototype[g];for(k=f&&f.length;!c&&k--;)(d=e[f[k].type])&&d.prototype[g]&&(c=!0);a[g]=c})},linkSeries:function(){var a=this,e=a.series;e.forEach(function(a){a.linkedSeries.length=0});e.forEach(function(b){var e=b.options.linkedTo;x(e)&&(e=":previous"===e?a.series[b.index-1]:a.get(e))&&e.linkedParent!==b&&(e.linkedSeries.push(b),b.linkedParent=e,b.visible=A(b.options.visible,e.options.visible,b.visible))});b(this,"afterLinkSeries")},renderSeries:function(){this.series.forEach(function(a){a.translate();
+a.render()})},renderLabels:function(){var a=this,b=a.options.labels;b.items&&b.items.forEach(function(e){var d=m(b.style,e.style),f=D(d.left)+a.plotLeft,k=D(d.top)+a.plotTop+12;delete d.left;delete d.top;a.renderer.text(e.html,f,k).attr({zIndex:2}).css(d).add()})},render:function(){var a=this.axes,b=this.renderer,e=this.options,d,f,k;this.setTitle();this.legend=new t(this,e.legend);this.getStacks&&this.getStacks();this.getMargins(!0);this.setChartSize();e=this.plotWidth;d=this.plotHeight=Math.max(this.plotHeight-
+21,0);a.forEach(function(a){a.setScale()});this.getAxisMargins();f=1.1<e/this.plotWidth;k=1.05<d/this.plotHeight;if(f||k)a.forEach(function(a){(a.horiz&&f||!a.horiz&&k)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries&&a.forEach(function(a){a.visible&&a.render()});this.seriesGroup||(this.seriesGroup=b.g("series-group").attr({zIndex:3}).add());this.renderSeries();this.renderLabels();this.addCredits();this.setResponsive&&this.setResponsive();this.hasRendered=!0},
+addCredits:function(a){var b=this;a=F(!0,this.options.credits,a);a.enabled&&!this.credits&&(this.credits=this.renderer.text(a.text+(this.mapCredits||""),0,0).addClass("highcharts-credits").on("click",function(){a.href&&(I.location.href=a.href)}).attr({align:a.position.align,zIndex:8}),b.styledMode||this.credits.css(a.style),this.credits.add().align(a.position),this.credits.update=function(a){b.credits=b.credits.destroy();b.addCredits(a)})},destroy:function(){var e=this,d=e.axes,f=e.series,k=e.container,
+c,g=k&&k.parentNode;b(e,"destroy");e.renderer.forExport?a.erase(n,e):n[e.index]=void 0;a.chartCount--;e.renderTo.removeAttribute("data-highcharts-chart");B(e);for(c=d.length;c--;)d[c]=d[c].destroy();this.scroller&&this.scroller.destroy&&this.scroller.destroy();for(c=f.length;c--;)f[c]=f[c].destroy();"title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" ").forEach(function(a){var b=e[a];
+b&&b.destroy&&(e[a]=b.destroy())});k&&(k.innerHTML="",B(k),g&&w(k));z(e,function(a,b){delete e[b]})},firstRender:function(){var e=this,d=e.options;if(!e.isReadyToRender||e.isReadyToRender()){e.getContainer();e.resetMargins();e.setChartSize();e.propFromSeries();e.getAxes();(a.isArray(d.series)?d.series:[]).forEach(function(a){e.initSeries(a)});e.linkSeries();b(e,"beforeRender");k&&(e.pointer=new k(e,d));e.render();if(!e.renderer.imgCount&&e.onload)e.onload();e.temporaryDisplay(!0)}},onload:function(){[this.callback].concat(this.callbacks).forEach(function(a){a&&
+void 0!==this.index&&a.apply(this,[this])},this);b(this,"load");b(this,"render");d(this.index)&&this.setReflow(this.options.chart.reflow);this.onload=null}})})(J);(function(a){var y=a.addEvent,G=a.Chart;y(G,"afterSetChartSize",function(y){var h=this.options.chart.scrollablePlotArea;(h=h&&h.minWidth)&&!this.renderer.forExport&&(this.scrollablePixels=h=Math.max(0,h-this.chartWidth))&&(this.plotWidth+=h,this.clipBox.width+=h,y.skipAxes||this.axes.forEach(function(c){1===c.side?c.getPlotLinePath=function(){var h=
+this.right,u;this.right=h-c.chart.scrollablePixels;u=a.Axis.prototype.getPlotLinePath.apply(this,arguments);this.right=h;return u}:(c.setAxisSize(),c.setAxisTranslation())}))});y(G,"render",function(){this.scrollablePixels?(this.setUpScrolling&&this.setUpScrolling(),this.applyFixed()):this.fixedDiv&&this.applyFixed()});G.prototype.setUpScrolling=function(){this.scrollingContainer=a.createElement("div",{className:"highcharts-scrolling"},{overflowX:"auto",WebkitOverflowScrolling:"touch"},this.renderTo);
+this.innerContainer=a.createElement("div",{className:"highcharts-inner-container"},null,this.scrollingContainer);this.innerContainer.appendChild(this.container);this.setUpScrolling=null};G.prototype.applyFixed=function(){var y=this.container,h,c,r=!this.fixedDiv;r&&(this.fixedDiv=a.createElement("div",{className:"highcharts-fixed"},{position:"absolute",overflow:"hidden",pointerEvents:"none",zIndex:2},null,!0),this.renderTo.insertBefore(this.fixedDiv,this.renderTo.firstChild),this.renderTo.style.overflow=
+"visible",this.fixedRenderer=h=new a.Renderer(this.fixedDiv,0,0),this.scrollableMask=h.path().attr({fill:a.color(this.options.chart.backgroundColor||"#fff").setOpacity(.85).get(),zIndex:-1}).addClass("highcharts-scrollable-mask").add(),[this.inverted?".highcharts-xaxis":".highcharts-yaxis",this.inverted?".highcharts-xaxis-labels":".highcharts-yaxis-labels",".highcharts-contextbutton",".highcharts-credits",".highcharts-legend",".highcharts-subtitle",".highcharts-title",".highcharts-legend-checkbox"].forEach(function(a){[].forEach.call(y.querySelectorAll(a),
+function(a){(a.namespaceURI===h.SVG_NS?h.box:h.box.parentNode).appendChild(a);a.style.pointerEvents="auto"})}));this.fixedRenderer.setSize(this.chartWidth,this.chartHeight);c=this.chartWidth+this.scrollablePixels;a.stop(this.container);this.container.style.width=c+"px";this.renderer.boxWrapper.attr({width:c,height:this.chartHeight,viewBox:[0,0,c,this.chartHeight].join(" ")});this.chartBackground.attr({width:c});r&&(c=this.options.chart.scrollablePlotArea,c.scrollPositionX&&(this.scrollingContainer.scrollLeft=
+this.scrollablePixels*c.scrollPositionX));r=this.axisOffset;c=this.plotTop-r[0]-1;var r=this.plotTop+this.plotHeight+r[2],u=this.plotLeft+this.plotWidth-this.scrollablePixels;this.scrollableMask.attr({d:this.scrollablePixels?["M",0,c,"L",this.plotLeft-1,c,"L",this.plotLeft-1,r,"L",0,r,"Z","M",u,c,"L",this.chartWidth,c,"L",this.chartWidth,r,"L",u,r,"Z"]:["M",0,0]})}})(J);(function(a){var y,G=a.extend,E=a.erase,h=a.fireEvent,c=a.format,r=a.isArray,u=a.isNumber,v=a.pick,w=a.uniqueKey,n=a.defined,g=a.removeEvent;
+a.Point=y=function(){};a.Point.prototype={init:function(a,c,g){var b;b=a.chart.options.chart.colorCount;var d=a.chart.styledMode;this.series=a;d||(this.color=a.color);this.applyOptions(c,g);this.id=n(this.id)?this.id:w();a.options.colorByPoint?(d||(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter],b=b.length),c=a.colorCounter,a.colorCounter++,a.colorCounter===b&&(a.colorCounter=0)):c=a.colorIndex;this.colorIndex=v(this.colorIndex,c);a.chart.pointCount++;h(this,"afterInit");
+return this},applyOptions:function(a,c){var d=this.series,b=d.options.pointValKey||d.pointValKey;a=y.prototype.optionsToObject.call(this,a);G(this,a);this.options=this.options?G(this.options,a):a;a.group&&delete this.group;a.dataLabels&&delete this.dataLabels;b&&(this.y=this[b]);this.isNull=v(this.isValid&&!this.isValid(),null===this.x||!u(this.y,!0));this.selected&&(this.state="select");"name"in this&&void 0===c&&d.xAxis&&d.xAxis.hasNames&&(this.x=d.xAxis.nameToX(this));void 0===this.x&&d&&(this.x=
+void 0===c?d.autoIncrement(this):c);return this},setNestedProperty:function(d,c,g){g.split(".").reduce(function(b,d,f,g){b[d]=g.length-1===f?c:a.isObject(b[d],!0)?b[d]:{};return b[d]},d);return d},optionsToObject:function(d){var c={},g=this.series,b=g.options.keys,l=b||g.pointArrayMap||["y"],f=l.length,h=0,t=0;if(u(d)||null===d)c[l[0]]=d;else if(r(d))for(!b&&d.length>f&&(g=typeof d[0],"string"===g?c.name=d[0]:"number"===g&&(c.x=d[0]),h++);t<f;)b&&void 0===d[h]||(0<l[t].indexOf(".")?a.Point.prototype.setNestedProperty(c,
+d[h],l[t]):c[l[t]]=d[h]),h++,t++;else"object"===typeof d&&(c=d,d.dataLabels&&(g._hasPointLabels=!0),d.marker&&(g._hasPointMarkers=!0));return c},getClassName:function(){return"highcharts-point"+(this.selected?" highcharts-point-select":"")+(this.negative?" highcharts-negative":"")+(this.isNull?" highcharts-null-point":"")+(void 0!==this.colorIndex?" highcharts-color-"+this.colorIndex:"")+(this.options.className?" "+this.options.className:"")+(this.zone&&this.zone.className?" "+this.zone.className.replace("highcharts-negative",
+""):"")},getZone:function(){var a=this.series,c=a.zones,a=a.zoneAxis||"y",g=0,b;for(b=c[g];this[a]>=b.value;)b=c[++g];this.nonZonedColor||(this.nonZonedColor=this.color);this.color=b&&b.color&&!this.options.color?b.color:this.nonZonedColor;return b},destroy:function(){var a=this.series.chart,c=a.hoverPoints,h;a.pointCount--;c&&(this.setState(),E(c,this),c.length||(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel||this.dataLabels)g(this),this.destroyElements();
+this.legendItem&&a.legend.destroyItem(this);for(h in this)this[h]=null},destroyElements:function(){for(var a=["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"],c,g=6;g--;)c=a[g],this[c]&&(this[c]=this[c].destroy());this.dataLabels&&(this.dataLabels.forEach(function(a){a.element&&a.destroy()}),delete this.dataLabels);this.connectors&&(this.connectors.forEach(function(a){a.element&&a.destroy()}),delete this.connectors)},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,
+colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var d=this.series,g=d.tooltipOptions,b=v(g.valueDecimals,""),l=g.valuePrefix||"",f=g.valueSuffix||"";d.chart.styledMode&&(a=d.chart.tooltip.styledModeFormat(a));(d.pointArrayMap||["y"]).forEach(function(d){d="{point."+d;if(l||f)a=a.replace(RegExp(d+"}","g"),l+d+"}"+f);a=a.replace(RegExp(d+"}","g"),d+":,."+b+"f}")});return c(a,
+{point:this,series:this.series},d.chart.time)},firePointEvent:function(a,c,g){var b=this,d=this.series.options;(d.point.events[a]||b.options&&b.options.events&&b.options.events[a])&&this.importEvents();"click"===a&&d.allowPointSelect&&(g=function(a){b.select&&b.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});h(this,a,c,g)},visible:!0}})(J);(function(a){var y=a.addEvent,G=a.animObject,E=a.arrayMax,h=a.arrayMin,c=a.correctFloat,r=a.defaultOptions,u=a.defaultPlotOptions,v=a.defined,w=a.erase,n=a.extend,
+g=a.fireEvent,d=a.isArray,m=a.isNumber,p=a.isString,b=a.merge,l=a.objectEach,f=a.pick,x=a.removeEvent,t=a.splat,H=a.SVGElement,F=a.syncTimeout,z=a.win;a.Series=a.seriesType("line",null,{lineWidth:2,allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},marker:{lineWidth:0,lineColor:"#ffffff",enabledThreshold:2,radius:4,states:{normal:{animation:!0},hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},
+point:{events:{}},dataLabels:{align:"center",formatter:function(){return null===this.y?"":a.numberFormat(this.y,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{normal:{animation:!0},hover:{animation:{duration:50},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{}},stickyTracking:!0,turboThreshold:1E3,findNearestPointBy:"x"},{isCartesian:!0,pointClass:a.Point,
+sorted:!0,requireSorting:!0,directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],coll:"series",init:function(a,b){g(this,"init",{options:b});var d=this,k,e=a.series,c;d.chart=a;d.options=b=d.setOptions(b);d.linkedSeries=[];d.bindAxes();n(d,{name:b.name,state:"",visible:!1!==b.visible,selected:!0===b.selected});k=b.events;l(k,function(a,b){y(d,b,a)});if(k&&k.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;d.getColor();d.getSymbol();
+d.parallelArrays.forEach(function(a){d[a+"Data"]=[]});d.setData(b.data,!1);d.isCartesian&&(a.hasCartesianSeries=!0);e.length&&(c=e[e.length-1]);d._i=f(c&&c._i,-1)+1;a.orderSeries(this.insert(e));g(this,"afterInit")},insert:function(a){var b=this.options.index,d;if(m(b)){for(d=a.length;d--;)if(b>=f(a[d].options.index,a[d]._i)){a.splice(d+1,0,this);break}-1===d&&a.unshift(this);d+=1}else a.push(this);return f(d,a.length-1)},bindAxes:function(){var b=this,d=b.options,f=b.chart,c;(b.axisTypes||[]).forEach(function(e){f[e].forEach(function(a){c=
+a.options;if(d[e]===c.index||void 0!==d[e]&&d[e]===c.id||void 0===d[e]&&0===c.index)b.insert(a.series),b[e]=a,a.isDirty=!0});b[e]||b.optionalAxis===e||a.error(18,!0,f)})},updateParallelArrays:function(a,b){var d=a.series,f=arguments,e=m(b)?function(e){var f="y"===e&&d.toYData?d.toYData(a):a[e];d[e+"Data"][b]=f}:function(a){Array.prototype[b].apply(d[a+"Data"],Array.prototype.slice.call(f,2))};d.parallelArrays.forEach(e)},autoIncrement:function(){var a=this.options,b=this.xIncrement,d,c=a.pointIntervalUnit,
+e=this.chart.time,b=f(b,a.pointStart,0);this.pointInterval=d=f(this.pointInterval,a.pointInterval,1);c&&(a=new e.Date(b),"day"===c?e.set("Date",a,e.get("Date",a)+d):"month"===c?e.set("Month",a,e.get("Month",a)+d):"year"===c&&e.set("FullYear",a,e.get("FullYear",a)+d),d=a.getTime()-b);this.xIncrement=b+d;return b},setOptions:function(a){var d=this.chart,c=d.options,k=c.plotOptions,e=(d.userOptions||{}).plotOptions||{},q=k[this.type],l=d.styledMode;this.userOptions=a;d=b(q,k.series,a);this.tooltipOptions=
+b(r.tooltip,r.plotOptions.series&&r.plotOptions.series.tooltip,r.plotOptions[this.type].tooltip,c.tooltip.userOptions,k.series&&k.series.tooltip,k[this.type].tooltip,a.tooltip);this.stickyTracking=f(a.stickyTracking,e[this.type]&&e[this.type].stickyTracking,e.series&&e.series.stickyTracking,this.tooltipOptions.shared&&!this.noSharedTooltip?!0:d.stickyTracking);null===q.marker&&delete d.marker;this.zoneAxis=d.zoneAxis;a=this.zones=(d.zones||[]).slice();!d.negativeColor&&!d.negativeFillColor||d.zones||
+(c={value:d[this.zoneAxis+"Threshold"]||d.threshold||0,className:"highcharts-negative"},l||(c.color=d.negativeColor,c.fillColor=d.negativeFillColor),a.push(c));a.length&&v(a[a.length-1].value)&&a.push(l?{}:{color:this.color,fillColor:this.fillColor});g(this,"afterSetOptions",{options:d});return d},getName:function(){return f(this.options.name,"Series "+(this.index+1))},getCyclic:function(a,b,d){var c,e=this.chart,k=this.userOptions,g=a+"Index",l=a+"Counter",m=d?d.length:f(e.options.chart[a+"Count"],
+e[a+"Count"]);b||(c=f(k[g],k["_"+g]),v(c)||(e.series.length||(e[l]=0),k["_"+g]=c=e[l]%m,e[l]+=1),d&&(b=d[c]));void 0!==c&&(this[g]=c);this[a]=b},getColor:function(){this.chart.styledMode?this.getCyclic("color"):this.options.colorByPoint?this.options.color=null:this.getCyclic("color",this.options.color||u[this.type].color,this.chart.options.colors)},getSymbol:function(){this.getCyclic("symbol",this.options.marker.symbol,this.chart.options.symbols)},drawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,
+updateData:function(b){var d=this.options,f=this.points,c=[],e,k,g,l=this.requireSorting;this.xIncrement=null;b.forEach(function(b){var k,q,h;k=a.defined(b)&&this.pointClass.prototype.optionsToObject.call({series:this},b)||{};h=k.x;if((k=k.id)||m(h))k&&(q=(q=this.chart.get(k))&&q.x),void 0===q&&m(h)&&(q=this.xData.indexOf(h,g)),-1===q||void 0===q||f[q].touched?c.push(b):b!==d.data[q]?(f[q].update(b,!1,null,!1),f[q].touched=!0,l&&(g=q+1)):f[q]&&(f[q].touched=!0),e=!0},this);if(e)for(b=f.length;b--;)k=
+f[b],k.touched||k.remove(!1),k.touched=!1;else if(b.length===f.length)b.forEach(function(a,b){f[b].update&&a!==d.data[b]&&f[b].update(a,!1,null,!1)});else return!1;c.forEach(function(a){this.addPoint(a,!1)},this);return!0},setData:function(b,c,g,l){var e=this,k=e.points,h=k&&k.length||0,A,t=e.options,n=e.chart,D=null,B=e.xAxis,x=t.turboThreshold,z=this.xData,r=this.yData,u=(A=e.pointArrayMap)&&A.length,v;b=b||[];A=b.length;c=f(c,!0);!1!==l&&A&&h&&!e.cropped&&!e.hasGroupedData&&e.visible&&!e.isSeriesBoosting&&
+(v=this.updateData(b));if(!v){e.xIncrement=null;e.colorCounter=0;this.parallelArrays.forEach(function(a){e[a+"Data"].length=0});if(x&&A>x){for(g=0;null===D&&g<A;)D=b[g],g++;if(m(D))for(g=0;g<A;g++)z[g]=this.autoIncrement(),r[g]=b[g];else if(d(D))if(u)for(g=0;g<A;g++)D=b[g],z[g]=D[0],r[g]=D.slice(1,u+1);else for(g=0;g<A;g++)D=b[g],z[g]=D[0],r[g]=D[1];else a.error(12,!1,n)}else for(g=0;g<A;g++)void 0!==b[g]&&(D={series:e},e.pointClass.prototype.applyOptions.apply(D,[b[g]]),e.updateParallelArrays(D,
+g));r&&p(r[0])&&a.error(14,!0,n);e.data=[];e.options.data=e.userOptions.data=b;for(g=h;g--;)k[g]&&k[g].destroy&&k[g].destroy();B&&(B.minRange=B.userMinRange);e.isDirty=n.isDirtyBox=!0;e.isDirtyData=!!k;g=!1}"point"===t.legendType&&(this.processData(),this.generatePoints());c&&n.redraw(g)},processData:function(b){var d=this.xData,f=this.yData,c=d.length,e;e=0;var k,g,l=this.xAxis,m,h=this.options;m=h.cropThreshold;var p=this.getExtremesFromAll||h.getExtremesFromAll,t=this.isCartesian,h=l&&l.val2lin,
+n=l&&l.isLog,x=this.requireSorting,r,z;if(t&&!this.isDirty&&!l.isDirty&&!this.yAxis.isDirty&&!b)return!1;l&&(b=l.getExtremes(),r=b.min,z=b.max);t&&this.sorted&&!p&&(!m||c>m||this.forceCrop)&&(d[c-1]<r||d[0]>z?(d=[],f=[]):this.yData&&(d[0]<r||d[c-1]>z)&&(e=this.cropData(this.xData,this.yData,r,z),d=e.xData,f=e.yData,e=e.start,k=!0));for(m=d.length||1;--m;)c=n?h(d[m])-h(d[m-1]):d[m]-d[m-1],0<c&&(void 0===g||c<g)?g=c:0>c&&x&&(a.error(15,!1,this.chart),x=!1);this.cropped=k;this.cropStart=e;this.processedXData=
+d;this.processedYData=f;this.closestPointRange=g},cropData:function(a,b,d,c,e){var k=a.length,g=0,l=k,m;e=f(e,this.cropShoulder,1);for(m=0;m<k;m++)if(a[m]>=d){g=Math.max(0,m-e);break}for(d=m;d<k;d++)if(a[d]>c){l=d+e;break}return{xData:a.slice(g,l),yData:b.slice(g,l),start:g,end:l}},generatePoints:function(){var a=this.options,b=a.data,d=this.data,f,e=this.processedXData,c=this.processedYData,g=this.pointClass,l=e.length,m=this.cropStart||0,h,p=this.hasGroupedData,a=a.keys,x,r=[],z;d||p||(d=[],d.length=
+b.length,d=this.data=d);a&&p&&(this.options.keys=!1);for(z=0;z<l;z++)h=m+z,p?(x=(new g).init(this,[e[z]].concat(t(c[z]))),x.dataGroup=this.groupMap[z],x.dataGroup.options&&(x.options=x.dataGroup.options,n(x,x.dataGroup.options))):(x=d[h])||void 0===b[h]||(d[h]=x=(new g).init(this,b[h],e[z])),x&&(x.index=h,r[z]=x);this.options.keys=a;if(d&&(l!==(f=d.length)||p))for(z=0;z<f;z++)z!==m||p||(z+=l),d[z]&&(d[z].destroyElements(),d[z].plotX=void 0);this.data=d;this.points=r},getExtremes:function(a){var b=
+this.yAxis,f=this.processedXData,c,e=[],k=0;c=this.xAxis.getExtremes();var g=c.min,l=c.max,p,t,n=this.requireSorting?1:0,x,z;a=a||this.stackedYData||this.processedYData||[];c=a.length;for(z=0;z<c;z++)if(t=f[z],x=a[z],p=(m(x,!0)||d(x))&&(!b.positiveValuesOnly||x.length||0<x),t=this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||(f[z+n]||t)>=g&&(f[z-n]||t)<=l,p&&t)if(p=x.length)for(;p--;)"number"===typeof x[p]&&(e[k++]=x[p]);else e[k++]=x;this.dataMin=h(e);this.dataMax=E(e)},translate:function(){this.processedXData||
+this.processData();this.generatePoints();var a=this.options,b=a.stacking,d=this.xAxis,l=d.categories,e=this.yAxis,q=this.points,h=q.length,p=!!this.modifyValue,t=a.pointPlacement,n="between"===t||m(t),x=a.threshold,z=a.startFromThreshold?x:0,r,u,F,H,w=Number.MAX_VALUE;"between"===t&&(t=.5);m(t)&&(t*=f(a.pointRange||d.pointRange));for(a=0;a<h;a++){var y=q[a],E=y.x,G=y.y;u=y.low;var J=b&&e.stacks[(this.negStacks&&G<(z?0:x)?"-":"")+this.stackKey],U;e.positiveValuesOnly&&null!==G&&0>=G&&(y.isNull=!0);
+y.plotX=r=c(Math.min(Math.max(-1E5,d.translate(E,0,0,0,1,t,"flags"===this.type)),1E5));b&&this.visible&&!y.isNull&&J&&J[E]&&(H=this.getStackIndicator(H,E,this.index),U=J[E],G=U.points[H.key],u=G[0],G=G[1],u===z&&H.key===J[E].base&&(u=f(m(x)&&x,e.min)),e.positiveValuesOnly&&0>=u&&(u=null),y.total=y.stackTotal=U.total,y.percentage=U.total&&y.y/U.total*100,y.stackY=G,U.setOffset(this.pointXOffset||0,this.barW||0));y.yBottom=v(u)?Math.min(Math.max(-1E5,e.translate(u,0,1,0,1)),1E5):null;p&&(G=this.modifyValue(G,
+y));y.plotY=u="number"===typeof G&&Infinity!==G?Math.min(Math.max(-1E5,e.translate(G,0,1,0,1)),1E5):void 0;y.isInside=void 0!==u&&0<=u&&u<=e.len&&0<=r&&r<=d.len;y.clientX=n?c(d.translate(E,0,0,0,1,t)):r;y.negative=y.y<(x||0);y.category=l&&void 0!==l[y.x]?l[y.x]:y.x;y.isNull||(void 0!==F&&(w=Math.min(w,Math.abs(r-F))),F=r);y.zone=this.zones.length&&y.getZone()}this.closestPointRangePx=w;g(this,"afterTranslate")},getValidPoints:function(a,b){var d=this.chart;return(a||this.points||[]).filter(function(a){return b&&
+!d.isInsidePlot(a.plotX,a.plotY,d.inverted)?!1:!a.isNull})},setClip:function(a){var b=this.chart,d=this.options,f=b.renderer,e=b.inverted,c=this.clipBox,k=c||b.clipBox,g=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,k.height,d.xAxis,d.yAxis].join(),l=b[g],m=b[g+"m"];l||(a&&(k.width=0,e&&(k.x=b.plotSizeX),b[g+"m"]=m=f.clipRect(e?b.plotSizeX+99:-99,e?-b.plotLeft:-b.plotTop,99,e?b.chartWidth:b.chartHeight)),b[g]=l=f.clipRect(k),l.count={length:0});a&&!l.count[this.index]&&(l.count[this.index]=
+!0,l.count.length+=1);!1!==d.clip&&(this.group.clip(a||c?l:b.clipRect),this.markerGroup.clip(m),this.sharedClipKey=g);a||(l.count[this.index]&&(delete l.count[this.index],--l.count.length),0===l.count.length&&g&&b[g]&&(c||(b[g]=b[g].destroy()),b[g+"m"]&&(b[g+"m"]=b[g+"m"].destroy())))},animate:function(a){var b=this.chart,d=G(this.options.animation),f;a?this.setClip(d):(f=this.sharedClipKey,(a=b[f])&&a.animate({width:b.plotSizeX,x:0},d),b[f+"m"]&&b[f+"m"].animate({width:b.plotSizeX+99,x:0},d),this.animate=
+null)},afterAnimate:function(){this.setClip();g(this,"afterAnimate");this.finishedAnimating=!0},drawPoints:function(){var a=this.points,b=this.chart,d,c,e,g,l=this.options.marker,m,h,p,t=this[this.specialGroup]||this.markerGroup;d=this.xAxis;var n,x=f(l.enabled,!d||d.isRadial?!0:null,this.closestPointRangePx>=l.enabledThreshold*l.radius);if(!1!==l.enabled||this._hasPointMarkers)for(d=0;d<a.length;d++)c=a[d],g=c.graphic,m=c.marker||{},h=!!c.marker,e=x&&void 0===m.enabled||m.enabled,p=!1!==c.isInside,
+e&&!c.isNull?(e=f(m.symbol,this.symbol),n=this.markerAttribs(c,c.selected&&"select"),g?g[p?"show":"hide"](!0).animate(n):p&&(0<n.width||c.hasImage)&&(c.graphic=g=b.renderer.symbol(e,n.x,n.y,n.width,n.height,h?m:l).add(t)),g&&!b.styledMode&&g.attr(this.pointAttribs(c,c.selected&&"select")),g&&g.addClass(c.getClassName(),!0)):g&&(c.graphic=g.destroy())},markerAttribs:function(a,b){var d=this.options.marker,c=a.marker||{},e=c.symbol||d.symbol,k=f(c.radius,d.radius);b&&(d=d.states[b],b=c.states&&c.states[b],
+k=f(b&&b.radius,d&&d.radius,k+(d&&d.radiusPlus||0)));a.hasImage=e&&0===e.indexOf("url");a.hasImage&&(k=0);a={x:Math.floor(a.plotX)-k,y:a.plotY-k};k&&(a.width=a.height=2*k);return a},pointAttribs:function(a,b){var d=this.options.marker,c=a&&a.options,e=c&&c.marker||{},k=this.color,g=c&&c.color,l=a&&a.color,c=f(e.lineWidth,d.lineWidth);a=a&&a.zone&&a.zone.color;k=g||a||l||k;a=e.fillColor||d.fillColor||k;k=e.lineColor||d.lineColor||k;b&&(d=d.states[b],b=e.states&&e.states[b]||{},c=f(b.lineWidth,d.lineWidth,
+c+f(b.lineWidthPlus,d.lineWidthPlus,0)),a=b.fillColor||d.fillColor||a,k=b.lineColor||d.lineColor||k);return{stroke:k,"stroke-width":c,fill:a}},destroy:function(){var b=this,d=b.chart,f=/AppleWebKit\/533/.test(z.navigator.userAgent),c,e,q=b.data||[],m,h;g(b,"destroy");x(b);(b.axisTypes||[]).forEach(function(a){(h=b[a])&&h.series&&(w(h.series,b),h.isDirty=h.forceRedraw=!0)});b.legendItem&&b.chart.legend.destroyItem(b);for(e=q.length;e--;)(m=q[e])&&m.destroy&&m.destroy();b.points=null;a.clearTimeout(b.animationTimeout);
+l(b,function(a,b){a instanceof H&&!a.survive&&(c=f&&"group"===b?"hide":"destroy",a[c]())});d.hoverSeries===b&&(d.hoverSeries=null);w(d.series,b);d.orderSeries();l(b,function(a,e){delete b[e]})},getGraphPath:function(a,b,d){var f=this,e=f.options,c=e.step,g,k=[],l=[],m;a=a||f.points;(g=a.reversed)&&a.reverse();(c={right:1,center:2}[c]||c&&3)&&g&&(c=4-c);!e.connectNulls||b||d||(a=this.getValidPoints(a));a.forEach(function(g,q){var h=g.plotX,p=g.plotY,t=a[q-1];(g.leftCliff||t&&t.rightCliff)&&!d&&(m=
+!0);g.isNull&&!v(b)&&0<q?m=!e.connectNulls:g.isNull&&!b?m=!0:(0===q||m?q=["M",g.plotX,g.plotY]:f.getPointSpline?q=f.getPointSpline(a,g,q):c?(q=1===c?["L",t.plotX,p]:2===c?["L",(t.plotX+h)/2,t.plotY,"L",(t.plotX+h)/2,p]:["L",h,t.plotY],q.push("L",h,p)):q=["L",h,p],l.push(g.x),c&&(l.push(g.x),2===c&&l.push(g.x)),k.push.apply(k,q),m=!1)});k.xMap=l;return f.graphPath=k},drawGraph:function(){var a=this,b=this.options,d=(this.gappedPath||this.getGraphPath).call(this),f=this.chart.styledMode,e=[["graph",
+"highcharts-graph"]];f||e[0].push(b.lineColor||this.color,b.dashStyle);e=a.getZonesGraphs(e);e.forEach(function(e,c){var g=e[0],k=a[g];k?(k.endX=a.preventGraphAnimation?null:d.xMap,k.animate({d:d})):d.length&&(a[g]=a.chart.renderer.path(d).addClass(e[1]).attr({zIndex:1}).add(a.group),f||(k={stroke:e[2],"stroke-width":b.lineWidth,fill:a.fillGraph&&a.color||"none"},e[3]?k.dashstyle=e[3]:"square"!==b.linecap&&(k["stroke-linecap"]=k["stroke-linejoin"]="round"),k=a[g].attr(k).shadow(2>c&&b.shadow)));k&&
+(k.startX=d.xMap,k.isArea=d.isArea)})},getZonesGraphs:function(a){this.zones.forEach(function(b,d){d=["zone-graph-"+d,"highcharts-graph highcharts-zone-graph-"+d+" "+(b.className||"")];this.chart.styledMode||d.push(b.color||this.color,b.dashStyle||this.options.dashStyle);a.push(d)},this);return a},applyZones:function(){var a=this,b=this.chart,d=b.renderer,c=this.zones,e,g,l=this.clips||[],m,h=this.graph,p=this.area,t=Math.max(b.chartWidth,b.chartHeight),n=this[(this.zoneAxis||"y")+"Axis"],x,z,r=b.inverted,
+u,v,F,H,w=!1;c.length&&(h||p)&&n&&void 0!==n.min&&(z=n.reversed,u=n.horiz,h&&!this.showLine&&h.hide(),p&&p.hide(),x=n.getExtremes(),c.forEach(function(c,k){e=z?u?b.plotWidth:0:u?0:n.toPixels(x.min)||0;e=Math.min(Math.max(f(g,e),0),t);g=Math.min(Math.max(Math.round(n.toPixels(f(c.value,x.max),!0)||0),0),t);w&&(e=g=n.toPixels(x.max));v=Math.abs(e-g);F=Math.min(e,g);H=Math.max(e,g);n.isXAxis?(m={x:r?H:F,y:0,width:v,height:t},u||(m.x=b.plotHeight-m.x)):(m={x:0,y:r?H:F,width:t,height:v},u&&(m.y=b.plotWidth-
+m.y));r&&d.isVML&&(m=n.isXAxis?{x:0,y:z?F:H,height:m.width,width:b.chartWidth}:{x:m.y-b.plotLeft-b.spacingBox.x,y:0,width:m.height,height:b.chartHeight});l[k]?l[k].animate(m):(l[k]=d.clipRect(m),h&&a["zone-graph-"+k].clip(l[k]),p&&a["zone-area-"+k].clip(l[k]));w=c.value>x.max;a.resetZones&&0===g&&(g=void 0)}),this.clips=l)},invertGroups:function(a){function b(){["group","markerGroup"].forEach(function(b){d[b]&&(f.renderer.isVML&&d[b].attr({width:d.yAxis.len,height:d.xAxis.len}),d[b].width=d.yAxis.len,
+d[b].height=d.xAxis.len,d[b].invert(a))})}var d=this,f=d.chart,e;d.xAxis&&(e=y(f,"resize",b),y(d,"destroy",e),b(a),d.invertGroups=b)},plotGroup:function(a,b,d,f,e){var c=this[a],g=!c;g&&(this[a]=c=this.chart.renderer.g().attr({zIndex:f||.1}).add(e));c.addClass("highcharts-"+b+" highcharts-series-"+this.index+" highcharts-"+this.type+"-series "+(v(this.colorIndex)?"highcharts-color-"+this.colorIndex+" ":"")+(this.options.className||"")+(c.hasClass("highcharts-tracker")?" highcharts-tracker":""),!0);
+c.attr({visibility:d})[g?"attr":"animate"](this.getPlotBox());return c},getPlotBox:function(){var a=this.chart,b=this.xAxis,d=this.yAxis;a.inverted&&(b=d,d=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:d?d.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,d,f=a.options,e=!!a.animate&&b.renderer.isSVG&&G(f.animation).duration,c=a.visible?"inherit":"hidden",l=f.zIndex,m=a.hasRendered,h=b.seriesGroup,p=b.inverted;d=a.plotGroup("group","series",c,l,h);a.markerGroup=
+a.plotGroup("markerGroup","markers",c,l,h);e&&a.animate(!0);d.inverted=a.isCartesian?p:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(p);!1===f.clip||a.sharedClipKey||m||d.clip(b.clipRect);e&&a.animate();m||(a.animationTimeout=F(function(){a.afterAnimate()},e));a.isDirty=!1;a.hasRendered=!0;g(a,"afterRender")},redraw:function(){var a=this.chart,b=this.isDirty||
+this.isDirtyData,d=this.group,c=this.xAxis,e=this.yAxis;d&&(a.inverted&&d.attr({width:a.plotWidth,height:a.plotHeight}),d.animate({translateX:f(c&&c.left,a.plotLeft),translateY:f(e&&e.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdAxisArray:["clientX","plotY"],searchPoint:function(a,b){var d=this.xAxis,f=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?d.len-a.chartY+d.pos:a.chartX-d.pos,plotY:e?f.len-a.chartX+f.pos:a.chartY-f.pos},b)},buildKDTree:function(){function a(d,
+e,f){var c,g;if(g=d&&d.length)return c=b.kdAxisArray[e%f],d.sort(function(a,b){return a[c]-b[c]}),g=Math.floor(g/2),{point:d[g],left:a(d.slice(0,g),e+1,f),right:a(d.slice(g+1),e+1,f)}}this.buildingKdTree=!0;var b=this,d=-1<b.options.findNearestPointBy.indexOf("y")?2:1;delete b.kdTree;F(function(){b.kdTree=a(b.getValidPoints(null,!b.directTouch),d,d);b.buildingKdTree=!1},b.options.kdNow?0:1)},searchKDTree:function(a,b){function d(a,b,k,l){var m=b.point,h=f.kdAxisArray[k%l],q,p,t=m;p=v(a[e])&&v(m[e])?
+Math.pow(a[e]-m[e],2):null;q=v(a[c])&&v(m[c])?Math.pow(a[c]-m[c],2):null;q=(p||0)+(q||0);m.dist=v(q)?Math.sqrt(q):Number.MAX_VALUE;m.distX=v(p)?Math.sqrt(p):Number.MAX_VALUE;h=a[h]-m[h];q=0>h?"left":"right";p=0>h?"right":"left";b[q]&&(q=d(a,b[q],k+1,l),t=q[g]<t[g]?q:m);b[p]&&Math.sqrt(h*h)<t[g]&&(a=d(a,b[p],k+1,l),t=a[g]<t[g]?a:t);return t}var f=this,e=this.kdAxisArray[0],c=this.kdAxisArray[1],g=b?"distX":"dist";b=-1<f.options.findNearestPointBy.indexOf("y")?2:1;this.kdTree||this.buildingKdTree||
+this.buildKDTree();if(this.kdTree)return d(a,this.kdTree,b,b)}})})(J);(function(a){var y=a.Axis,G=a.Chart,E=a.correctFloat,h=a.defined,c=a.destroyObjectProperties,r=a.format,u=a.objectEach,v=a.pick,w=a.Series;a.StackItem=function(a,c,d,m,h){var b=a.chart.inverted;this.axis=a;this.isNegative=d;this.options=c;this.x=m;this.total=null;this.points={};this.stack=h;this.rightCliff=this.leftCliff=0;this.alignOptions={align:c.align||(b?d?"left":"right":"center"),verticalAlign:c.verticalAlign||(b?"middle":
+d?"bottom":"top"),y:v(c.y,b?4:d?14:-6),x:v(c.x,b?d?-6:6:0)};this.textAlign=c.textAlign||(b?d?"right":"left":"center")};a.StackItem.prototype={destroy:function(){c(this,this.axis)},render:function(a){var c=this.axis.chart,d=this.options,m=d.format,m=m?r(m,this,c.time):d.formatter.call(this);this.label?this.label.attr({text:m,visibility:"hidden"}):this.label=c.renderer.text(m,null,null,d.useHTML).css(d.style).attr({align:this.textAlign,rotation:d.rotation,visibility:"hidden"}).add(a);this.label.labelrank=
+c.plotHeight},setOffset:function(a,c){var d=this.axis,g=d.chart,p=d.translate(d.usePercentage?100:this.total,0,0,0,1),b=d.translate(0),b=h(p)&&Math.abs(p-b);a=g.xAxis[0].translate(this.x)+a;d=h(p)&&this.getStackBox(g,this,a,p,c,b,d);(c=this.label)&&d&&(c.align(this.alignOptions,null,d),d=c.alignAttr,c[!1===this.options.crop||g.isInsidePlot(d.x,d.y)?"show":"hide"](!0))},getStackBox:function(a,c,d,m,h,b,l){var f=c.axis.reversed,g=a.inverted;a=l.height+l.pos-(g?a.plotLeft:a.plotTop);c=c.isNegative&&
+!f||!c.isNegative&&f;return{x:g?c?m:m-b:d,y:g?a-d-h:c?a-m-b:a-m,width:g?b:h,height:g?h:b}}};G.prototype.getStacks=function(){var a=this;a.yAxis.forEach(function(a){a.stacks&&a.hasVisibleSeries&&(a.oldStacks=a.stacks)});a.series.forEach(function(c){!c.options.stacking||!0!==c.visible&&!1!==a.options.chart.ignoreHiddenSeries||(c.stackKey=c.type+v(c.options.stack,""))})};y.prototype.buildStacks=function(){var a=this.series,c=v(this.options.reversedStacks,!0),d=a.length,m;if(!this.isXAxis){this.usePercentage=
+!1;for(m=d;m--;)a[c?m:d-m-1].setStackedPoints();for(m=0;m<d;m++)a[m].modifyStacks()}};y.prototype.renderStackTotals=function(){var a=this.chart,c=a.renderer,d=this.stacks,m=this.stackTotalGroup;m||(this.stackTotalGroup=m=c.g("stack-labels").attr({visibility:"visible",zIndex:6}).add());m.translate(a.plotLeft,a.plotTop);u(d,function(a){u(a,function(a){a.render(m)})})};y.prototype.resetStacks=function(){var a=this,c=a.stacks;a.isXAxis||u(c,function(d){u(d,function(c,g){c.touched<a.stacksTouched?(c.destroy(),
+delete d[g]):(c.total=null,c.cumulative=null)})})};y.prototype.cleanStacks=function(){var a;this.isXAxis||(this.oldStacks&&(a=this.stacks=this.oldStacks),u(a,function(a){u(a,function(a){a.cumulative=a.total})}))};w.prototype.setStackedPoints=function(){if(this.options.stacking&&(!0===this.visible||!1===this.chart.options.chart.ignoreHiddenSeries)){var c=this.processedXData,g=this.processedYData,d=[],m=g.length,p=this.options,b=p.threshold,l=v(p.startFromThreshold&&b,0),f=p.stack,p=p.stacking,x=this.stackKey,
+t="-"+x,r=this.negStacks,u=this.yAxis,z=u.stacks,k=u.oldStacks,A,D,B,e,q,w,y;u.stacksTouched+=1;for(q=0;q<m;q++)w=c[q],y=g[q],A=this.getStackIndicator(A,w,this.index),e=A.key,B=(D=r&&y<(l?0:b))?t:x,z[B]||(z[B]={}),z[B][w]||(k[B]&&k[B][w]?(z[B][w]=k[B][w],z[B][w].total=null):z[B][w]=new a.StackItem(u,u.options.stackLabels,D,w,f)),B=z[B][w],null!==y?(B.points[e]=B.points[this.index]=[v(B.cumulative,l)],h(B.cumulative)||(B.base=e),B.touched=u.stacksTouched,0<A.index&&!1===this.singleStacks&&(B.points[e][0]=
+B.points[this.index+","+w+",0"][0])):B.points[e]=B.points[this.index]=null,"percent"===p?(D=D?x:t,r&&z[D]&&z[D][w]?(D=z[D][w],B.total=D.total=Math.max(D.total,B.total)+Math.abs(y)||0):B.total=E(B.total+(Math.abs(y)||0))):B.total=E(B.total+(y||0)),B.cumulative=v(B.cumulative,l)+(y||0),null!==y&&(B.points[e].push(B.cumulative),d[q]=B.cumulative);"percent"===p&&(u.usePercentage=!0);this.stackedYData=d;u.oldStacks={}}};w.prototype.modifyStacks=function(){var a=this,c=a.stackKey,d=a.yAxis.stacks,m=a.processedXData,
+h,b=a.options.stacking;a[b+"Stacker"]&&[c,"-"+c].forEach(function(c){for(var f=m.length,g,l;f--;)if(g=m[f],h=a.getStackIndicator(h,g,a.index,c),l=(g=d[c]&&d[c][g])&&g.points[h.key])a[b+"Stacker"](l,g,f)})};w.prototype.percentStacker=function(a,c,d){c=c.total?100/c.total:0;a[0]=E(a[0]*c);a[1]=E(a[1]*c);this.stackedYData[d]=a[1]};w.prototype.getStackIndicator=function(a,c,d,m){!h(a)||a.x!==c||m&&a.key!==m?a={x:c,index:0,key:m}:a.index++;a.key=[d,c,a.index].join();return a}})(J);(function(a){var y=a.addEvent,
+G=a.animate,E=a.Axis,h=a.Chart,c=a.createElement,r=a.css,u=a.defined,v=a.erase,w=a.extend,n=a.fireEvent,g=a.isNumber,d=a.isObject,m=a.isArray,p=a.merge,b=a.objectEach,l=a.pick,f=a.Point,x=a.Series,t=a.seriesTypes,H=a.setAnimation,F=a.splat;a.cleanRecursively=function(c,f){var g={};b(c,function(b,k){if(d(c[k],!0)&&f[k])b=a.cleanRecursively(c[k],f[k]),Object.keys(b).length&&(g[k]=b);else if(d(c[k])||c[k]!==f[k])g[k]=c[k]});return g};w(h.prototype,{addSeries:function(a,b,d){var c,f=this;a&&(b=l(b,!0),
+n(f,"addSeries",{options:a},function(){c=f.initSeries(a);f.isDirtyLegend=!0;f.linkSeries();n(f,"afterAddSeries");b&&f.redraw(d)}));return c},addAxis:function(a,b,d,c){var f=b?"xAxis":"yAxis",e=this.options;a=p(a,{index:this[f].length,isX:b});b=new E(this,a);e[f]=F(e[f]||{});e[f].push(a);l(d,!0)&&this.redraw(c);return b},showLoading:function(a){var b=this,d=b.options,f=b.loadingDiv,g=d.loading,e=function(){f&&r(f,{left:b.plotLeft+"px",top:b.plotTop+"px",width:b.plotWidth+"px",height:b.plotHeight+"px"})};
+f||(b.loadingDiv=f=c("div",{className:"highcharts-loading highcharts-loading-hidden"},null,b.container),b.loadingSpan=c("span",{className:"highcharts-loading-inner"},null,f),y(b,"redraw",e));f.className="highcharts-loading";b.loadingSpan.innerHTML=a||d.lang.loading;b.styledMode||(r(f,w(g.style,{zIndex:10})),r(b.loadingSpan,g.labelStyle),b.loadingShown||(r(f,{opacity:0,display:""}),G(f,{opacity:g.style.opacity||.5},{duration:g.showDuration||0})));b.loadingShown=!0;e()},hideLoading:function(){var a=
+this.options,b=this.loadingDiv;b&&(b.className="highcharts-loading highcharts-loading-hidden",this.styledMode||G(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){r(b,{display:"none"})}}));this.loadingShown=!1},propsRequireDirtyBox:"backgroundColor borderColor borderWidth margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "),
+propsRequireUpdateSeries:"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip".split(" "),collectionsWithUpdate:"xAxis yAxis zAxis series colorAxis pane".split(" "),update:function(d,c,f,m){var k=this,e={credits:"addCredits",title:"setTitle",subtitle:"setSubtitle"},h,t,x,r=[];n(k,"update",{options:d});d=a.cleanRecursively(d,k.options);if(h=d.chart){p(!0,k.options.chart,h);"className"in h&&k.setClassName(h.className);"reflow"in h&&k.setReflow(h.reflow);if("inverted"in
+h||"polar"in h||"type"in h)k.propFromSeries(),t=!0;"alignTicks"in h&&(t=!0);b(h,function(a,b){-1!==k.propsRequireUpdateSeries.indexOf("chart."+b)&&(x=!0);-1!==k.propsRequireDirtyBox.indexOf(b)&&(k.isDirtyBox=!0)});!k.styledMode&&"style"in h&&k.renderer.setStyle(h.style)}!k.styledMode&&d.colors&&(this.options.colors=d.colors);d.plotOptions&&p(!0,this.options.plotOptions,d.plotOptions);b(d,function(a,b){if(k[b]&&"function"===typeof k[b].update)k[b].update(a,!1);else if("function"===typeof k[e[b]])k[e[b]](a);
+"chart"!==b&&-1!==k.propsRequireUpdateSeries.indexOf(b)&&(x=!0)});this.collectionsWithUpdate.forEach(function(a){var b;d[a]&&("series"===a&&(b=[],k[a].forEach(function(a,d){a.options.isInternal||b.push(l(a.options.index,d))})),F(d[a]).forEach(function(d,e){(e=u(d.id)&&k.get(d.id)||k[a][b?b[e]:e])&&e.coll===a&&(e.update(d,!1),f&&(e.touched=!0));if(!e&&f)if("series"===a)k.addSeries(d,!1).touched=!0;else if("xAxis"===a||"yAxis"===a)k.addAxis(d,"xAxis"===a,!1).touched=!0}),f&&k[a].forEach(function(a){a.touched||
+a.options.isInternal?delete a.touched:r.push(a)}))});r.forEach(function(a){a.remove&&a.remove(!1)});t&&k.axes.forEach(function(a){a.update({},!1)});x&&k.series.forEach(function(a){a.update({},!1)});d.loading&&p(!0,k.options.loading,d.loading);t=h&&h.width;h=h&&h.height;g(t)&&t!==k.chartWidth||g(h)&&h!==k.chartHeight?k.setSize(t,h,m):l(c,!0)&&k.redraw(m);n(k,"afterUpdate",{options:d})},setSubtitle:function(a){this.setTitle(void 0,a)}});w(f.prototype,{update:function(a,b,c,f){function g(){e.applyOptions(a);
+null===e.y&&h&&(e.graphic=h.destroy());d(a,!0)&&(h&&h.element&&a&&a.marker&&void 0!==a.marker.symbol&&(e.graphic=h.destroy()),a&&a.dataLabels&&e.dataLabel&&(e.dataLabel=e.dataLabel.destroy()),e.connector&&(e.connector=e.connector.destroy()));m=e.index;k.updateParallelArrays(e,m);t.data[m]=d(t.data[m],!0)||d(a,!0)?e.options:l(a,t.data[m]);k.isDirty=k.isDirtyData=!0;!k.fixedBox&&k.hasCartesianSeries&&(p.isDirtyBox=!0);"point"===t.legendType&&(p.isDirtyLegend=!0);b&&p.redraw(c)}var e=this,k=e.series,
+h=e.graphic,m,p=k.chart,t=k.options;b=l(b,!0);!1===f?g():e.firePointEvent("update",{options:a},g)},remove:function(a,b){this.series.removePoint(this.series.data.indexOf(this),a,b)}});w(x.prototype,{addPoint:function(a,b,d,c){var f=this.options,e=this.data,g=this.chart,k=this.xAxis,k=k&&k.hasNames&&k.names,h=f.data,m,p,t=this.xData,n,x;b=l(b,!0);m={series:this};this.pointClass.prototype.applyOptions.apply(m,[a]);x=m.x;n=t.length;if(this.requireSorting&&x<t[n-1])for(p=!0;n&&t[n-1]>x;)n--;this.updateParallelArrays(m,
+"splice",n,0,0);this.updateParallelArrays(m,n);k&&m.name&&(k[x]=m.name);h.splice(n,0,a);p&&(this.data.splice(n,0,null),this.processData());"point"===f.legendType&&this.generatePoints();d&&(e[0]&&e[0].remove?e[0].remove(!1):(e.shift(),this.updateParallelArrays(m,"shift"),h.shift()));this.isDirtyData=this.isDirty=!0;b&&g.redraw(c)},removePoint:function(a,b,d){var c=this,f=c.data,e=f[a],g=c.points,k=c.chart,h=function(){g&&g.length===f.length&&g.splice(a,1);f.splice(a,1);c.options.data.splice(a,1);c.updateParallelArrays(e||
+{series:c},"splice",a,1);e&&e.destroy();c.isDirty=!0;c.isDirtyData=!0;b&&k.redraw()};H(d,k);b=l(b,!0);e?e.firePointEvent("remove",null,h):h()},remove:function(a,b,d){function c(){f.destroy();f.remove=null;e.isDirtyLegend=e.isDirtyBox=!0;e.linkSeries();l(a,!0)&&e.redraw(b)}var f=this,e=f.chart;!1!==d?n(f,"remove",null,c):c()},update:function(b,d){b=a.cleanRecursively(b,this.userOptions);var c=this,f=c.chart,g=c.userOptions,e=c.oldType||c.type,k=b.type||g.type||f.options.chart.type,h=t[e].prototype,
+m,x=["group","markerGroup","dataLabelsGroup"],r=["navigatorSeries","baseSeries"],u=c.finishedAnimating&&{animation:!1},z=["data","name","turboThreshold"],v=Object.keys(b),F=0<v.length;v.forEach(function(a){-1===z.indexOf(a)&&(F=!1)});if(F)b.data&&this.setData(b.data,!1),b.name&&this.setName(b.name,!1);else{r=x.concat(r);r.forEach(function(a){r[a]=c[a];delete c[a]});b=p(g,u,{index:c.index,pointStart:l(g.pointStart,c.xData[0])},{data:c.options.data},b);c.remove(!1,null,!1);for(m in h)c[m]=void 0;t[k||
+e]?w(c,t[k||e].prototype):a.error(17,!0,f);r.forEach(function(a){c[a]=r[a]});c.init(f,b);b.zIndex!==g.zIndex&&x.forEach(function(a){c[a]&&c[a].attr({zIndex:b.zIndex})});c.oldType=e;f.linkSeries()}n(this,"afterUpdate");l(d,!0)&&f.redraw(F?void 0:!1)},setName:function(a){this.name=this.options.name=this.userOptions.name=a;this.chart.isDirtyLegend=!0}});w(E.prototype,{update:function(a,d){var c=this.chart,f=a&&a.events||{};a=p(this.userOptions,a);c.options[this.coll].indexOf&&(c.options[this.coll][c.options[this.coll].indexOf(this.userOptions)]=
+a);b(c.options[this.coll].events,function(a,b){"undefined"===typeof f[b]&&(f[b]=void 0)});this.destroy(!0);this.init(c,w(a,{events:f}));c.isDirtyBox=!0;l(d,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,d=this.coll,c=this.series,f=c.length;f--;)c[f]&&c[f].remove(!1);v(b.axes,this);v(b[d],this);m(b.options[d])?b.options[d].splice(this.options.index,1):delete b.options[d];b[d].forEach(function(a,b){a.options.index=a.userOptions.index=b});this.destroy();b.isDirtyBox=!0;l(a,!0)&&b.redraw()},
+setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}})})(J);(function(a){var y=a.color,G=a.pick,E=a.Series,h=a.seriesType;h("area","line",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(c){var h=[],u=[],v=this.xAxis,w=this.yAxis,n=w.stacks[this.stackKey],g={},d=this.index,m=w.series,p=m.length,b,l=G(w.options.reversedStacks,!0)?1:-1,f;c=c||this.points;if(this.options.stacking){for(f=0;f<c.length;f++)c[f].leftNull=c[f].rightNull=
+null,g[c[f].x]=c[f];a.objectEach(n,function(a,b){null!==a.total&&u.push(b)});u.sort(function(a,b){return a-b});b=m.map(function(a){return a.visible});u.forEach(function(a,c){var m=0,t,x;if(g[a]&&!g[a].isNull)h.push(g[a]),[-1,1].forEach(function(k){var h=1===k?"rightNull":"leftNull",m=0,r=n[u[c+k]];if(r)for(f=d;0<=f&&f<p;)t=r.points[f],t||(f===d?g[a][h]=!0:b[f]&&(x=n[a].points[f])&&(m-=x[1]-x[0])),f+=l;g[a][1===k?"rightCliff":"leftCliff"]=m});else{for(f=d;0<=f&&f<p;){if(t=n[a].points[f]){m=t[1];break}f+=
+l}m=w.translate(m,0,1,0,1);h.push({isNull:!0,plotX:v.translate(a,0,0,0,1),x:a,plotY:m,yBottom:m})}})}return h},getGraphPath:function(a){var c=E.prototype.getGraphPath,h=this.options,v=h.stacking,w=this.yAxis,n,g,d=[],m=[],p=this.index,b,l=w.stacks[this.stackKey],f=h.threshold,x=w.getThreshold(h.threshold),t,h=h.connectNulls||"percent"===v,H=function(c,g,k){var h=a[c];c=v&&l[h.x].points[p];var t=h[k+"Null"]||0;k=h[k+"Cliff"]||0;var n,e,h=!0;k||t?(n=(t?c[0]:c[1])+k,e=c[0]+k,h=!!t):!v&&a[g]&&a[g].isNull&&
+(n=e=f);void 0!==n&&(m.push({plotX:b,plotY:null===n?x:w.getThreshold(n),isNull:h,isCliff:!0}),d.push({plotX:b,plotY:null===e?x:w.getThreshold(e),doCurve:!1}))};a=a||this.points;v&&(a=this.getStackPoints(a));for(n=0;n<a.length;n++)if(g=a[n].isNull,b=G(a[n].rectPlotX,a[n].plotX),t=G(a[n].yBottom,x),!g||h)h||H(n,n-1,"left"),g&&!v&&h||(m.push(a[n]),d.push({x:n,plotX:b,plotY:t})),h||H(n,n+1,"right");n=c.call(this,m,!0,!0);d.reversed=!0;g=c.call(this,d,!0,!0);g.length&&(g[0]="L");g=n.concat(g);c=c.call(this,
+m,!1,h);g.xMap=n.xMap;this.areaPath=g;return c},drawGraph:function(){this.areaPath=[];E.prototype.drawGraph.apply(this);var a=this,h=this.areaPath,u=this.options,v=[["area","highcharts-area",this.color,u.fillColor]];this.zones.forEach(function(c,h){v.push(["zone-area-"+h,"highcharts-area highcharts-zone-area-"+h+" "+c.className,c.color||a.color,c.fillColor||u.fillColor])});v.forEach(function(c){var n=c[0],g=a[n];g?(g.endX=a.preventGraphAnimation?null:h.xMap,g.animate({d:h})):(g={zIndex:0},a.chart.styledMode||
+(g.fill=G(c[3],y(c[2]).setOpacity(G(u.fillOpacity,.75)).get())),g=a[n]=a.chart.renderer.path(h).addClass(c[1]).attr(g).add(a.group),g.isArea=!0);g.startX=h.xMap;g.shiftUnit=u.step?2:1})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})})(J);(function(a){var y=a.pick;a=a.seriesType;a("spline","line",{},{getPointSpline:function(a,E,h){var c=E.plotX,r=E.plotY,u=a[h-1];h=a[h+1];var v,w,n,g;if(u&&!u.isNull&&!1!==u.doCurve&&!E.isCliff&&h&&!h.isNull&&!1!==h.doCurve&&!E.isCliff){a=u.plotY;n=h.plotX;h=
+h.plotY;var d=0;v=(1.5*c+u.plotX)/2.5;w=(1.5*r+a)/2.5;n=(1.5*c+n)/2.5;g=(1.5*r+h)/2.5;n!==v&&(d=(g-w)*(n-c)/(n-v)+r-g);w+=d;g+=d;w>a&&w>r?(w=Math.max(a,r),g=2*r-w):w<a&&w<r&&(w=Math.min(a,r),g=2*r-w);g>h&&g>r?(g=Math.max(h,r),w=2*r-g):g<h&&g<r&&(g=Math.min(h,r),w=2*r-g);E.rightContX=n;E.rightContY=g}E=["C",y(u.rightContX,u.plotX),y(u.rightContY,u.plotY),y(v,c),y(w,r),c,r];u.rightContX=u.rightContY=null;return E}})})(J);(function(a){var y=a.seriesTypes.area.prototype,G=a.seriesType;G("areaspline",
+"spline",a.defaultPlotOptions.area,{getStackPoints:y.getStackPoints,getGraphPath:y.getGraphPath,drawGraph:y.drawGraph,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})})(J);(function(a){var y=a.animObject,G=a.color,E=a.extend,h=a.defined,c=a.isNumber,r=a.merge,u=a.pick,v=a.Series,w=a.seriesType,n=a.svg;w("column","line",{borderRadius:0,crisp:!0,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{halo:!1,brightness:.1},select:{color:"#cccccc",
+borderColor:"#000000"}},dataLabels:{align:null,verticalAlign:null,y:null},softThreshold:!1,startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0,borderColor:"#ffffff"},{cropShoulder:0,directTouch:!0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){v.prototype.init.apply(this,arguments);var a=this,d=a.chart;d.hasRendered&&d.series.forEach(function(d){d.type===a.type&&(d.isDirty=!0)})},getColumnMetrics:function(){var a=this,d=a.options,c=a.xAxis,h=a.yAxis,b=
+c.options.reversedStacks,b=c.reversed&&!b||!c.reversed&&b,l,f={},n=0;!1===d.grouping?n=1:a.chart.series.forEach(function(b){var d=b.options,c=b.yAxis,g;b.type!==a.type||!b.visible&&a.chart.options.chart.ignoreHiddenSeries||h.len!==c.len||h.pos!==c.pos||(d.stacking?(l=b.stackKey,void 0===f[l]&&(f[l]=n++),g=f[l]):!1!==d.grouping&&(g=n++),b.columnIndex=g)});var t=Math.min(Math.abs(c.transA)*(c.ordinalSlope||d.pointRange||c.closestPointRange||c.tickInterval||1),c.len),r=t*d.groupPadding,v=(t-2*r)/(n||
+1),d=Math.min(d.maxPointWidth||c.len,u(d.pointWidth,v*(1-2*d.pointPadding)));a.columnMetrics={width:d,offset:(v-d)/2+(r+((a.columnIndex||0)+(b?1:0))*v-t/2)*(b?-1:1)};return a.columnMetrics},crispCol:function(a,d,c,h){var b=this.chart,g=this.borderWidth,f=-(g%2?.5:0),g=g%2?.5:1;b.inverted&&b.renderer.isVML&&(g+=1);this.options.crisp&&(c=Math.round(a+c)+f,a=Math.round(a)+f,c-=a);h=Math.round(d+h)+g;f=.5>=Math.abs(d)&&.5<h;d=Math.round(d)+g;h-=d;f&&h&&(--d,h+=1);return{x:a,y:d,width:c,height:h}},translate:function(){var a=
+this,d=a.chart,c=a.options,p=a.dense=2>a.closestPointRange*a.xAxis.transA,p=a.borderWidth=u(c.borderWidth,p?0:1),b=a.yAxis,l=c.threshold,f=a.translatedThreshold=b.getThreshold(l),n=u(c.minPointLength,5),t=a.getColumnMetrics(),r=t.width,F=a.barW=Math.max(r,1+2*p),z=a.pointXOffset=t.offset;d.inverted&&(f-=.5);c.pointPadding&&(F=Math.ceil(F));v.prototype.translate.apply(a);a.points.forEach(function(c){var g=u(c.yBottom,f),k=999+Math.abs(g),m=r,k=Math.min(Math.max(-k,c.plotY),b.len+k),e=c.plotX+z,q=F,
+p=Math.min(k,g),t,x=Math.max(k,g)-p;n&&Math.abs(x)<n&&(x=n,t=!b.reversed&&!c.negative||b.reversed&&c.negative,c.y===l&&a.dataMax<=l&&b.min<l&&(t=!t),p=Math.abs(p-f)>n?g-n:f-(t?n:0));h(c.options.pointWidth)&&(m=q=Math.ceil(c.options.pointWidth),e-=Math.round((m-r)/2));c.barX=e;c.pointWidth=m;c.tooltipPos=d.inverted?[b.len+b.pos-d.plotLeft-k,a.xAxis.len-e-q/2,x]:[e+q/2,k+b.pos-d.plotTop,x];c.shapeType=c.shapeType||"rect";c.shapeArgs=a.crispCol.apply(a,c.isNull?[e,f,q,0]:[e,p,q,x])})},getSymbol:a.noop,
+drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")},pointAttribs:function(a,d){var c=this.options,g,b=this.pointAttrToOptions||{};g=b.stroke||"borderColor";var l=b["stroke-width"]||"borderWidth",f=a&&a.color||this.color,h=a&&a[g]||c[g]||this.color||f,t=a&&a[l]||c[l]||this[l]||0,b=c.dashStyle;a&&this.zones.length&&(f=a.getZone(),f=a.options.color||f&&f.color||this.color);d&&(a=r(c.states[d],a.options.states&&
+a.options.states[d]||{}),d=a.brightness,f=a.color||void 0!==d&&G(f).brighten(a.brightness).get()||f,h=a[g]||h,t=a[l]||t,b=a.dashStyle||b);g={fill:f,stroke:h,"stroke-width":t};b&&(g.dashstyle=b);return g},drawPoints:function(){var a=this,d=this.chart,h=a.options,p=d.renderer,b=h.animationLimit||250,l;a.points.forEach(function(f){var g=f.graphic,m=g&&d.pointCount<b?"animate":"attr";if(c(f.plotY)&&null!==f.y){l=f.shapeArgs;if(g)g[m](r(l));else f.graphic=g=p[f.shapeType](l).add(f.group||a.group);h.borderRadius&&
+g.attr({r:h.borderRadius});d.styledMode||g[m](a.pointAttribs(f,f.selected&&"select")).shadow(h.shadow,null,h.stacking&&!h.borderRadius);g.addClass(f.getClassName(),!0)}else g&&(f.graphic=g.destroy())})},animate:function(a){var d=this,c=this.yAxis,g=d.options,b=this.chart.inverted,h={},f=b?"translateX":"translateY",x;n&&(a?(h.scaleY=.001,a=Math.min(c.pos+c.len,Math.max(c.pos,c.toPixels(g.threshold))),b?h.translateX=a-c.len:h.translateY=a,d.group.attr(h)):(x=d.group.attr(f),d.group.animate({scaleY:1},
+E(y(d.options.animation),{step:function(a,b){h[f]=x+b.pos*(c.pos-x);d.group.attr(h)}})),d.animate=null))},remove:function(){var a=this,d=a.chart;d.hasRendered&&d.series.forEach(function(d){d.type===a.type&&(d.isDirty=!0)});v.prototype.remove.apply(a,arguments)}})})(J);(function(a){a=a.seriesType;a("bar","column",null,{inverted:!0})})(J);(function(a){var y=a.Series;a=a.seriesType;a("scatter","line",{lineWidth:0,findNearestPointBy:"xy",marker:{enabled:!0},tooltip:{headerFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cspan style\x3d"font-size: 10px"\x3e {series.name}\x3c/span\x3e\x3cbr/\x3e',
+pointFormat:"x: \x3cb\x3e{point.x}\x3c/b\x3e\x3cbr/\x3ey: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e"}},{sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1,drawGraph:function(){this.options.lineWidth&&y.prototype.drawGraph.call(this)}})})(J);(function(a){var y=a.deg2rad,G=a.isNumber,E=a.pick,h=a.relativeLength;a.CenteredSeriesMixin={getCenter:function(){var a=this.options,r=this.chart,u=2*(a.slicedOffset||0),v=r.plotWidth-2*u,
+r=r.plotHeight-2*u,w=a.center,w=[E(w[0],"50%"),E(w[1],"50%"),a.size||"100%",a.innerSize||0],n=Math.min(v,r),g,d;for(g=0;4>g;++g)d=w[g],a=2>g||2===g&&/%$/.test(d),w[g]=h(d,[v,r,n,w[2]][g])+(a?u:0);w[3]>w[2]&&(w[3]=w[2]);return w},getStartAndEndRadians:function(a,h){a=G(a)?a:0;h=G(h)&&h>a&&360>h-a?h:a+360;return{start:y*(a+-90),end:y*(h+-90)}}}})(J);(function(a){var y=a.addEvent,G=a.CenteredSeriesMixin,E=a.defined,h=a.extend,c=G.getStartAndEndRadians,r=a.noop,u=a.pick,v=a.Point,w=a.Series,n=a.seriesType,
+g=a.setAnimation;n("pie","line",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{allowOverlap:!0,connectorPadding:5,distance:30,enabled:!0,formatter:function(){return this.point.isNull?void 0:this.point.name},softConnector:!0,x:0,connectorShape:"fixedOffset",crookDistance:"70%"},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",borderWidth:1,states:{hover:{brightness:.1}}},{isCartesian:!1,
+requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var d=this,c=d.points,b=d.startAngleRad;a||(c.forEach(function(a){var c=a.graphic,g=a.shapeArgs;c&&(c.attr({r:a.startR||d.center[3]/2,start:b,end:b}),c.animate({r:g.r,start:g.start,end:g.end},d.options.animation))}),d.animate=null)},updateTotals:function(){var a,c=0,g=this.points,b=g.length,h,f=this.options.ignoreHiddenPoint;
+for(a=0;a<b;a++)h=g[a],c+=f&&!h.visible?0:h.isNull?0:h.y;this.total=c;for(a=0;a<b;a++)h=g[a],h.percentage=0<c&&(h.visible||!f)?h.y/c*100:0,h.total=c},generatePoints:function(){w.prototype.generatePoints.call(this);this.updateTotals()},getX:function(a,c,g){var b=this.center,d=this.radii?this.radii[g.index]:b[2]/2;return b[0]+(c?-1:1)*Math.cos(Math.asin(Math.max(Math.min((a-b[1])/(d+g.labelDistance),1),-1)))*(d+g.labelDistance)+(0<g.labelDistance?(c?-1:1)*this.options.dataLabels.padding:0)},translate:function(a){this.generatePoints();
+var d=0,g=this.options,b=g.slicedOffset,h=b+(g.borderWidth||0),f,n,t=c(g.startAngle,g.endAngle),r=this.startAngleRad=t.start,t=(this.endAngleRad=t.end)-r,v=this.points,z,k,A=g.dataLabels.distance,g=g.ignoreHiddenPoint,w,B=v.length,e;a||(this.center=a=this.getCenter());for(w=0;w<B;w++){e=v[w];e.labelDistance=u(e.options.dataLabels&&e.options.dataLabels.distance,A);this.maxLabelDistance=Math.max(this.maxLabelDistance||0,e.labelDistance);f=r+d*t;if(!g||e.visible)d+=e.percentage/100;n=r+d*t;e.shapeType=
+"arc";e.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:Math.round(1E3*f)/1E3,end:Math.round(1E3*n)/1E3};n=(n+f)/2;n>1.5*Math.PI?n-=2*Math.PI:n<-Math.PI/2&&(n+=2*Math.PI);e.slicedTranslation={translateX:Math.round(Math.cos(n)*b),translateY:Math.round(Math.sin(n)*b)};z=Math.cos(n)*a[2]/2;k=Math.sin(n)*a[2]/2;e.tooltipPos=[a[0]+.7*z,a[1]+.7*k];e.half=n<-Math.PI/2||n>Math.PI/2?1:0;e.angle=n;f=Math.min(h,e.labelDistance/5);e.labelPosition={natural:{x:a[0]+z+Math.cos(n)*e.labelDistance,y:a[1]+k+
+Math.sin(n)*e.labelDistance},"final":{},alignment:0>e.labelDistance?"center":e.half?"right":"left",connectorPosition:{breakAt:{x:a[0]+z+Math.cos(n)*f,y:a[1]+k+Math.sin(n)*f},touchingSliceAt:{x:a[0]+z,y:a[1]+k}}}}},drawGraph:null,drawPoints:function(){var a=this,c=a.chart,g=c.renderer,b,l,f,n,t=a.options.shadow;!t||a.shadowGroup||c.styledMode||(a.shadowGroup=g.g("shadow").add(a.group));a.points.forEach(function(d){l=d.graphic;if(d.isNull)l&&(d.graphic=l.destroy());else{n=d.shapeArgs;b=d.getTranslate();
+if(!c.styledMode){var m=d.shadowGroup;t&&!m&&(m=d.shadowGroup=g.g("shadow").add(a.shadowGroup));m&&m.attr(b);f=a.pointAttribs(d,d.selected&&"select")}l?(l.setRadialReference(a.center),c.styledMode||l.attr(f),l.animate(h(n,b))):(d.graphic=l=g[d.shapeType](n).setRadialReference(a.center).attr(b).add(a.group),c.styledMode||l.attr(f).attr({"stroke-linejoin":"round"}).shadow(t,m));l.attr({visibility:d.visible?"inherit":"hidden"});l.addClass(d.getClassName())}})},searchPoint:r,sortByAngle:function(a,c){a.sort(function(a,
+b){return void 0!==a.angle&&(b.angle-a.angle)*c})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:G.getCenter,getSymbol:r},{init:function(){v.prototype.init.apply(this,arguments);var a=this,c;a.name=u(a.name,"Slice");c=function(d){a.slice("select"===d.type)};y(a,"select",c);y(a,"unselect",c);return a},isValid:function(){return a.isNumber(this.y,!0)&&0<=this.y},setVisible:function(a,c){var d=this,b=d.series,g=b.chart,f=b.options.ignoreHiddenPoint;c=u(c,f);a!==d.visible&&(d.visible=d.options.visible=
+a=void 0===a?!d.visible:a,b.options.data[b.data.indexOf(d)]=d.options,["graphic","dataLabel","connector","shadowGroup"].forEach(function(b){if(d[b])d[b][a?"show":"hide"](!0)}),d.legendItem&&g.legend.colorizeItem(d,a),a||"hover"!==d.state||d.setState(""),f&&(b.isDirty=!0),c&&g.redraw())},slice:function(a,c,h){var b=this.series;g(h,b.chart);u(c,!0);this.sliced=this.options.sliced=E(a)?a:!this.sliced;b.options.data[b.data.indexOf(this)]=this.options;this.graphic.animate(this.getTranslate());this.shadowGroup&&
+this.shadowGroup.animate(this.getTranslate())},getTranslate:function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}},haloPath:function(a){var d=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(d.x,d.y,d.r+a,d.r+a,{innerR:this.shapeArgs.r-1,start:d.start,end:d.end})},connectorShapes:{fixedOffset:function(a,c,g){var b=c.breakAt;c=c.touchingSliceAt;return["M",a.x,a.y].concat(g.softConnector?["C",a.x+("left"===a.alignment?-5:5),a.y,2*
+b.x-c.x,2*b.y-c.y,b.x,b.y]:["L",b.x,b.y]).concat(["L",c.x,c.y])},straight:function(a,c){c=c.touchingSliceAt;return["M",a.x,a.y,"L",c.x,c.y]},crookedLine:function(d,c,g){c=c.touchingSliceAt;var b=this.series,h=b.center[0],f=b.chart.plotWidth,m=b.chart.plotLeft,b=d.alignment,t=this.shapeArgs.r;g=a.relativeLength(g.crookDistance,1);g="left"===b?h+t+(f+m-h-t)*(1-g):m+(h-t)*g;h=["L",g,d.y];if("left"===b?g>d.x||g<c.x:g<d.x||g>c.x)h=[];return["M",d.x,d.y].concat(h).concat(["L",c.x,c.y])}},getConnectorPath:function(){var a=
+this.labelPosition,c=this.series.options.dataLabels,g=c.connectorShape,b=this.connectorShapes;b[g]&&(g=b[g]);return g.call(this,{x:a.final.x,y:a.final.y,alignment:a.alignment},a.connectorPosition,c)}})})(J);(function(a){var y=a.addEvent,G=a.arrayMax,E=a.defined,h=a.extend,c=a.format,r=a.merge,u=a.noop,v=a.pick,w=a.relativeLength,n=a.Series,g=a.seriesTypes,d=a.stableSort,m=a.isArray,p=a.splat;a.distribute=function(b,c,f){function g(a,b){return a.target-b.target}var h,l=!0,m=b,p=[],k;k=0;var n=m.reducedLen||
+c;for(h=b.length;h--;)k+=b[h].size;if(k>n){d(b,function(a,b){return(b.rank||0)-(a.rank||0)});for(k=h=0;k<=n;)k+=b[h].size,h++;p=b.splice(h-1,b.length)}d(b,g);for(b=b.map(function(a){return{size:a.size,targets:[a.target],align:v(a.align,.5)}});l;){for(h=b.length;h--;)l=b[h],k=(Math.min.apply(0,l.targets)+Math.max.apply(0,l.targets))/2,l.pos=Math.min(Math.max(0,k-l.size*l.align),c-l.size);h=b.length;for(l=!1;h--;)0<h&&b[h-1].pos+b[h-1].size>b[h].pos&&(b[h-1].size+=b[h].size,b[h-1].targets=b[h-1].targets.concat(b[h].targets),
+b[h-1].align=.5,b[h-1].pos+b[h-1].size>c&&(b[h-1].pos=c-b[h-1].size),b.splice(h,1),l=!0)}m.push.apply(m,p);h=0;b.some(function(b){var d=0;if(b.targets.some(function(){m[h].pos=b.pos+d;if(Math.abs(m[h].pos-m[h].target)>f)return m.slice(0,h+1).forEach(function(a){delete a.pos}),m.reducedLen=(m.reducedLen||c)-.1*c,m.reducedLen>.1*c&&a.distribute(m,c,f),!0;d+=m[h].size;h++}))return!0});d(m,g)};n.prototype.drawDataLabels=function(){function b(a,b){var c=b.filter;return c?(b=c.operator,a=a[c.property],
+c=c.value,"\x3e"===b&&a>c||"\x3c"===b&&a<c||"\x3e\x3d"===b&&a>=c||"\x3c\x3d"===b&&a<=c||"\x3d\x3d"===b&&a==c||"\x3d\x3d\x3d"===b&&a===c?!0:!1):!0}function d(a,b){var c=[],d;if(m(a)&&!m(b))c=a.map(function(a){return r(a,b)});else if(m(b)&&!m(a))c=b.map(function(b){return r(a,b)});else if(m(a)||m(b))for(d=Math.max(a.length,b.length);d--;)c[d]=r(a[d],b[d]);else c=r(a,b);return c}var f=this,g=f.chart,h=f.options,n=h.dataLabels,u=f.points,z,k=f.hasRendered||0,A,w=v(n.defer,!!h.animation),B=g.renderer,
+n=d(d(g.options.plotOptions&&g.options.plotOptions.series&&g.options.plotOptions.series.dataLabels,g.options.plotOptions&&g.options.plotOptions[f.type]&&g.options.plotOptions[f.type].dataLabels),n);a.fireEvent(this,"drawDataLabels");if(m(n)||n.enabled||f._hasPointLabels)A=f.plotGroup("dataLabelsGroup","data-labels",w&&!k?"hidden":"visible",n.zIndex||6),w&&(A.attr({opacity:+k}),k||y(f,"afterAnimate",function(){f.visible&&A.show(!0);A[h.animation?"animate":"attr"]({opacity:1},{duration:200})})),u.forEach(function(e){z=
+p(d(n,e.dlOptions||e.options&&e.options.dataLabels));z.forEach(function(d,k){var l=d.enabled&&!e.isNull&&b(e,d),m,q,t,p,n=e.dataLabels?e.dataLabels[k]:e.dataLabel,r=e.connectors?e.connectors[k]:e.connector,u=!n;l&&(m=e.getLabelConfig(),q=d[e.formatPrefix+"Format"]||d.format,m=E(q)?c(q,m,g.time):(d[e.formatPrefix+"Formatter"]||d.formatter).call(m,d),q=d.style,t=d.rotation,g.styledMode||(q.color=v(d.color,q.color,f.color,"#000000"),"contrast"===q.color&&(e.contrastColor=B.getContrast(e.color||f.color),
+q.color=d.inside||0>v(d.distance,e.labelDistance)||h.stacking?e.contrastColor:"#000000"),h.cursor&&(q.cursor=h.cursor)),p={r:d.borderRadius||0,rotation:t,padding:d.padding,zIndex:1},g.styledMode||(p.fill=d.backgroundColor,p.stroke=d.borderColor,p["stroke-width"]=d.borderWidth),a.objectEach(p,function(a,b){void 0===a&&delete p[b]}));!n||l&&E(m)?l&&E(m)&&(n?p.text=m:(e.dataLabels=e.dataLabels||[],n=e.dataLabels[k]=t?B.text(m,0,-9999).addClass("highcharts-data-label"):B.label(m,0,-9999,d.shape,null,
+null,d.useHTML,null,"data-label"),k||(e.dataLabel=n),n.addClass(" highcharts-data-label-color-"+e.colorIndex+" "+(d.className||"")+(d.useHTML?" highcharts-tracker":""))),n.options=d,n.attr(p),g.styledMode||n.css(q).shadow(d.shadow),n.added||n.add(A),f.alignDataLabel(e,n,d,null,u)):(e.dataLabel=e.dataLabel&&e.dataLabel.destroy(),e.dataLabels&&(1===e.dataLabels.length?delete e.dataLabels:delete e.dataLabels[k]),k||delete e.dataLabel,r&&(e.connector=e.connector.destroy(),e.connectors&&(1===e.connectors.length?
+delete e.connectors:delete e.connectors[k])))})});a.fireEvent(this,"afterDrawDataLabels")};n.prototype.alignDataLabel=function(a,d,c,g,m){var b=this.chart,f=this.isCartesian&&b.inverted,l=v(a.dlBox&&a.dlBox.centerX,a.plotX,-9999),k=v(a.plotY,-9999),n=d.getBBox(),p,t=c.rotation,e=c.align,q=this.visible&&(a.series.forceDL||b.isInsidePlot(l,Math.round(k),f)||g&&b.isInsidePlot(l,f?g.x+1:g.y+g.height-1,f)),r="justify"===v(c.overflow,"justify");if(q&&(p=b.renderer.fontMetrics(b.styledMode?void 0:c.style.fontSize,
+d).b,g=h({x:f?this.yAxis.len-k:l,y:Math.round(f?this.xAxis.len-l:k),width:0,height:0},g),h(c,{width:n.width,height:n.height}),t?(r=!1,l=b.renderer.rotCorr(p,t),l={x:g.x+c.x+g.width/2+l.x,y:g.y+c.y+{top:0,middle:.5,bottom:1}[c.verticalAlign]*g.height},d[m?"attr":"animate"](l).attr({align:e}),k=(t+720)%360,k=180<k&&360>k,"left"===e?l.y-=k?n.height:0:"center"===e?(l.x-=n.width/2,l.y-=n.height/2):"right"===e&&(l.x-=n.width,l.y-=k?0:n.height),d.placed=!0,d.alignAttr=l):(d.align(c,null,g),l=d.alignAttr),
+r&&0<=g.height?a.isLabelJustified=this.justifyDataLabel(d,c,l,n,g,m):v(c.crop,!0)&&(q=b.isInsidePlot(l.x,l.y)&&b.isInsidePlot(l.x+n.width,l.y+n.height)),c.shape&&!t))d[m?"attr":"animate"]({anchorX:f?b.plotWidth-a.plotY:a.plotX,anchorY:f?b.plotHeight-a.plotX:a.plotY});q||(d.attr({y:-9999}),d.placed=!1)};n.prototype.justifyDataLabel=function(a,d,c,g,h,m){var b=this.chart,f=d.align,k=d.verticalAlign,l,n,p=a.box?0:a.padding||0;l=c.x+p;0>l&&("right"===f?d.align="left":d.x=-l,n=!0);l=c.x+g.width-p;l>b.plotWidth&&
+("left"===f?d.align="right":d.x=b.plotWidth-l,n=!0);l=c.y+p;0>l&&("bottom"===k?d.verticalAlign="top":d.y=-l,n=!0);l=c.y+g.height-p;l>b.plotHeight&&("top"===k?d.verticalAlign="bottom":d.y=b.plotHeight-l,n=!0);n&&(a.placed=!m,a.align(d,null,h));return n};g.pie&&(g.pie.prototype.dataLabelPositioners={radialDistributionY:function(a){return a.top+a.distributeBox.pos},radialDistributionX:function(a,d,c,g){return a.getX(c<d.top+2||c>d.bottom-2?g:c,d.half,d)},justify:function(a,d,c){return c[0]+(a.half?-1:
+1)*(d+a.labelDistance)},alignToPlotEdges:function(a,d,c,g){a=a.getBBox().width;return d?a+g:c-a-g},alignToConnectors:function(a,d,c,g){var b=0,f;a.forEach(function(a){f=a.dataLabel.getBBox().width;f>b&&(b=f)});return d?b+g:c-b-g}},g.pie.prototype.drawDataLabels=function(){var b=this,d=b.data,c,g=b.chart,h=b.options.dataLabels,m=h.connectorPadding,p=v(h.connectorWidth,1),r=g.plotWidth,k=g.plotHeight,u=g.plotLeft,w=Math.round(g.chartWidth/3),B,e=b.center,q=e[2]/2,y=e[1],I,J,K,M,S=[[],[]],C,N,P,T,Q=
+[0,0,0,0],O=b.dataLabelPositioners;b.visible&&(h.enabled||b._hasPointLabels)&&(d.forEach(function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&(a.dataLabel.attr({width:"auto"}).css({width:"auto",textOverflow:"clip"}),a.dataLabel.shortened=!1)}),n.prototype.drawDataLabels.apply(b),d.forEach(function(a){a.dataLabel&&(a.visible?(S[a.half].push(a),a.dataLabel._pos=null,!E(h.style.width)&&!E(a.options.dataLabels&&a.options.dataLabels.style&&a.options.dataLabels.style.width)&&a.dataLabel.getBBox().width>
+w&&(a.dataLabel.css({width:.7*w}),a.dataLabel.shortened=!0)):(a.dataLabel=a.dataLabel.destroy(),a.dataLabels&&1===a.dataLabels.length&&delete a.dataLabels))}),S.forEach(function(d,f){var l,n,p=d.length,t=[],x;if(p)for(b.sortByAngle(d,f-.5),0<b.maxLabelDistance&&(l=Math.max(0,y-q-b.maxLabelDistance),n=Math.min(y+q+b.maxLabelDistance,g.plotHeight),d.forEach(function(a){0<a.labelDistance&&a.dataLabel&&(a.top=Math.max(0,y-q-a.labelDistance),a.bottom=Math.min(y+q+a.labelDistance,g.plotHeight),x=a.dataLabel.getBBox().height||
+21,a.distributeBox={target:a.labelPosition.natural.y-a.top+x/2,size:x,rank:a.y},t.push(a.distributeBox))}),l=n+x-l,a.distribute(t,l,l/5)),T=0;T<p;T++){c=d[T];K=c.labelPosition;I=c.dataLabel;P=!1===c.visible?"hidden":"inherit";N=l=K.natural.y;t&&E(c.distributeBox)&&(void 0===c.distributeBox.pos?P="hidden":(M=c.distributeBox.size,N=O.radialDistributionY(c)));delete c.positionIndex;if(h.justify)C=O.justify(c,q,e);else switch(h.alignTo){case "connectors":C=O.alignToConnectors(d,f,r,u);break;case "plotEdges":C=
+O.alignToPlotEdges(I,f,r,u);break;default:C=O.radialDistributionX(b,c,N,l)}I._attr={visibility:P,align:K.alignment};I._pos={x:C+h.x+({left:m,right:-m}[K.alignment]||0),y:N+h.y-10};K.final.x=C;K.final.y=N;v(h.crop,!0)&&(J=I.getBBox().width,l=null,C-J<m&&1===f?(l=Math.round(J-C+m),Q[3]=Math.max(l,Q[3])):C+J>r-m&&0===f&&(l=Math.round(C+J-r+m),Q[1]=Math.max(l,Q[1])),0>N-M/2?Q[0]=Math.max(Math.round(-N+M/2),Q[0]):N+M/2>k&&(Q[2]=Math.max(Math.round(N+M/2-k),Q[2])),I.sideOverflow=l)}}),0===G(Q)||this.verifyDataLabelOverflow(Q))&&
+(this.placeDataLabels(),p&&this.points.forEach(function(a){var d;B=a.connector;if((I=a.dataLabel)&&I._pos&&a.visible&&0<a.labelDistance){P=I._attr.visibility;if(d=!B)a.connector=B=g.renderer.path().addClass("highcharts-data-label-connector  highcharts-color-"+a.colorIndex+(a.className?" "+a.className:"")).add(b.dataLabelsGroup),g.styledMode||B.attr({"stroke-width":p,stroke:h.connectorColor||a.color||"#666666"});B[d?"attr":"animate"]({d:a.getConnectorPath()});B.attr("visibility",P)}else B&&(a.connector=
+B.destroy())}))},g.pie.prototype.placeDataLabels=function(){this.points.forEach(function(a){var b=a.dataLabel;b&&a.visible&&((a=b._pos)?(b.sideOverflow&&(b._attr.width=b.getBBox().width-b.sideOverflow,b.css({width:b._attr.width+"px",textOverflow:(this.options.dataLabels.style||{}).textOverflow||"ellipsis"}),b.shortened=!0),b.attr(b._attr),b[b.moved?"animate":"attr"](a),b.moved=!0):b&&b.attr({y:-9999}))},this)},g.pie.prototype.alignDataLabel=u,g.pie.prototype.verifyDataLabelOverflow=function(a){var b=
+this.center,d=this.options,c=d.center,g=d.minSize||80,h,m=null!==d.size;m||(null!==c[0]?h=Math.max(b[2]-Math.max(a[1],a[3]),g):(h=Math.max(b[2]-a[1]-a[3],g),b[0]+=(a[3]-a[1])/2),null!==c[1]?h=Math.max(Math.min(h,b[2]-Math.max(a[0],a[2])),g):(h=Math.max(Math.min(h,b[2]-a[0]-a[2]),g),b[1]+=(a[0]-a[2])/2),h<b[2]?(b[2]=h,b[3]=Math.min(w(d.innerSize||0,h),h),this.translate(b),this.drawDataLabels&&this.drawDataLabels()):m=!0);return m});g.column&&(g.column.prototype.alignDataLabel=function(a,d,c,g,h){var b=
+this.chart.inverted,f=a.series,l=a.dlBox||a.shapeArgs,k=v(a.below,a.plotY>v(this.translatedThreshold,f.yAxis.len)),m=v(c.inside,!!this.options.stacking);l&&(g=r(l),0>g.y&&(g.height+=g.y,g.y=0),l=g.y+g.height-f.yAxis.len,0<l&&(g.height-=l),b&&(g={x:f.yAxis.len-g.y-g.height,y:f.xAxis.len-g.x-g.width,width:g.height,height:g.width}),m||(b?(g.x+=k?0:g.width,g.width=0):(g.y+=k?g.height:0,g.height=0)));c.align=v(c.align,!b||m?"center":k?"right":"left");c.verticalAlign=v(c.verticalAlign,b||m?"middle":k?"top":
+"bottom");n.prototype.alignDataLabel.call(this,a,d,c,g,h);a.isLabelJustified&&a.contrastColor&&d.css({color:a.contrastColor})})})(J);(function(a){var y=a.Chart,G=a.isArray,E=a.objectEach,h=a.pick,c=a.addEvent,r=a.fireEvent;c(y,"render",function(){var a=[];(this.labelCollectors||[]).forEach(function(c){a=a.concat(c())});(this.yAxis||[]).forEach(function(c){c.options.stackLabels&&!c.options.stackLabels.allowOverlap&&E(c.stacks,function(c){E(c,function(c){a.push(c.label)})})});(this.series||[]).forEach(function(c){var r=
+c.options.dataLabels;c.visible&&(!1!==r.enabled||c._hasPointLabels)&&c.points.forEach(function(c){c.visible&&(G(c.dataLabels)?c.dataLabels:c.dataLabel?[c.dataLabel]:[]).forEach(function(g){var d=g.options;g.labelrank=h(d.labelrank,c.labelrank,c.shapeArgs&&c.shapeArgs.height);d.allowOverlap||a.push(g)})})});this.hideOverlappingLabels(a)});y.prototype.hideOverlappingLabels=function(a){var c=this,h=a.length,n=c.renderer,g,d,m,p,b,l,f=function(a,b,c,d,f,g,h,l){return!(f>a+c||f+h<a||g>b+d||g+l<b)};m=function(a){var b,
+c,d,f=a.box?0:a.padding||0;d=0;if(a&&(!a.alignAttr||a.placed))return b=a.alignAttr||{x:a.attr("x"),y:a.attr("y")},c=a.parentGroup,a.width||(d=a.getBBox(),a.width=d.width,a.height=d.height,d=n.fontMetrics(null,a.element).h),{x:b.x+(c.translateX||0)+f,y:b.y+(c.translateY||0)+f-d,width:a.width-2*f,height:a.height-2*f}};for(d=0;d<h;d++)if(g=a[d])g.oldOpacity=g.opacity,g.newOpacity=1,g.absoluteBox=m(g);a.sort(function(a,b){return(b.labelrank||0)-(a.labelrank||0)});for(d=0;d<h;d++)for(l=(m=a[d])&&m.absoluteBox,
+g=d+1;g<h;++g)if(b=(p=a[g])&&p.absoluteBox,l&&b&&m!==p&&0!==m.newOpacity&&0!==p.newOpacity&&(b=f(l.x,l.y,l.width,l.height,b.x,b.y,b.width,b.height)))(m.labelrank<p.labelrank?m:p).newOpacity=0;a.forEach(function(a){var b,d;a&&(d=a.newOpacity,a.oldOpacity!==d&&(a.alignAttr&&a.placed?(d?a.show(!0):b=function(){a.hide()},a.alignAttr.opacity=d,a[a.isOld?"animate":"attr"](a.alignAttr,null,b),r(c,"afterHideOverlappingLabels")):a.attr({opacity:d})),a.isOld=!0)})}})(J);(function(a){var y=a.addEvent,G=a.Chart,
+E=a.createElement,h=a.css,c=a.defaultOptions,r=a.defaultPlotOptions,u=a.extend,v=a.fireEvent,w=a.hasTouch,n=a.isObject,g=a.Legend,d=a.merge,m=a.pick,p=a.Point,b=a.Series,l=a.seriesTypes,f=a.svg,x;x=a.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart,c=b.pointer,d=function(a){var b=c.getPointFromEvent(a);void 0!==b&&(c.isDirectTouch=!0,b.onMouseOver(a))};a.points.forEach(function(a){a.graphic&&(a.graphic.element.point=a);a.dataLabel&&(a.dataLabel.div?a.dataLabel.div.point=a:a.dataLabel.element.point=
+a)});a._hasTracking||(a.trackerGroups.forEach(function(f){if(a[f]){a[f].addClass("highcharts-tracker").on("mouseover",d).on("mouseout",function(a){c.onTrackerMouseOut(a)});if(w)a[f].on("touchstart",d);!b.styledMode&&a.options.cursor&&a[f].css(h).css({cursor:a.options.cursor})}}),a._hasTracking=!0);v(this,"afterDrawTracker")},drawTrackerGraph:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),g=d.length,h=a.chart,l=h.pointer,m=h.renderer,e=h.options.tooltip.snap,
+q=a.tracker,p,n=function(){if(h.hoverSeries!==a)a.onMouseOver()},r="rgba(192,192,192,"+(f?.0001:.002)+")";if(g&&!c)for(p=g+1;p--;)"M"===d[p]&&d.splice(p+1,0,d[p+1]-e,d[p+2],"L"),(p&&"M"===d[p]||p===g)&&d.splice(p,0,"L",d[p-2]+e,d[p-1]);q?q.attr({d:d}):a.graph&&(a.tracker=m.path(d).attr({visibility:a.visible?"visible":"hidden",zIndex:2}).addClass(c?"highcharts-tracker-area":"highcharts-tracker-line").add(a.group),h.styledMode||a.tracker.attr({"stroke-linejoin":"round",stroke:r,fill:c?r:"none","stroke-width":a.graph.strokeWidth()+
+(c?0:2*e)}),[a.tracker,a.markerGroup].forEach(function(a){a.addClass("highcharts-tracker").on("mouseover",n).on("mouseout",function(a){l.onTrackerMouseOut(a)});b.cursor&&!h.styledMode&&a.css({cursor:b.cursor});if(w)a.on("touchstart",n)}));v(this,"afterDrawTracker")}};l.column&&(l.column.prototype.drawTracker=x.drawTrackerPoint);l.pie&&(l.pie.prototype.drawTracker=x.drawTrackerPoint);l.scatter&&(l.scatter.prototype.drawTracker=x.drawTrackerPoint);u(g.prototype,{setItemEvents:function(a,b,c){var f=
+this,g=f.chart.renderer.boxWrapper,h="highcharts-legend-"+(a instanceof p?"point":"series")+"-active",l=f.chart.styledMode;(c?b:a.legendGroup).on("mouseover",function(){a.setState("hover");g.addClass(h);l||b.css(f.options.itemHoverStyle)}).on("mouseout",function(){f.styledMode||b.css(d(a.visible?f.itemStyle:f.itemHiddenStyle));g.removeClass(h);a.setState()}).on("click",function(b){var c=function(){a.setVisible&&a.setVisible()};g.removeClass(h);b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",
+b,c):v(a,"legendItemClick",b,c)})},createCheckboxForItem:function(a){a.checkbox=E("input",{type:"checkbox",className:"highcharts-legend-checkbox",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);y(a.checkbox,"click",function(b){v(a.series||a,"checkboxClick",{checked:b.target.checked,item:a},function(){a.select()})})}});u(G.prototype,{showResetZoom:function(){function a(){b.zoomOut()}var b=this,d=c.lang,f=b.options.chart.resetZoomButton,g=f.theme,h=
+g.states,l="chart"===f.relativeTo?null:"plotBox";v(this,"beforeShowResetZoom",null,function(){b.resetZoomButton=b.renderer.button(d.resetZoom,null,null,a,g,h&&h.hover).attr({align:f.position.align,title:d.resetZoomTitle}).addClass("highcharts-reset-zoom").add().align(f.position,!1,l)})},zoomOut:function(){v(this,"selection",{resetSelection:!0},this.zoom)},zoom:function(a){var b,c=this.pointer,d=!1,f;!a||a.resetSelection?(this.axes.forEach(function(a){b=a.zoom()}),c.initiated=!1):a.xAxis.concat(a.yAxis).forEach(function(a){var f=
+a.axis;c[f.isXAxis?"zoomX":"zoomY"]&&(b=f.zoom(a.min,a.max),f.displayBtn&&(d=!0))});f=this.resetZoomButton;d&&!f?this.showResetZoom():!d&&n(f)&&(this.resetZoomButton=f.destroy());b&&this.redraw(m(this.options.chart.animation,a&&a.animation,100>this.pointCount))},pan:function(a,b){var c=this,d=c.hoverPoints,f;d&&d.forEach(function(a){a.setState()});("xy"===b?[1,0]:[1]).forEach(function(b){b=c[b?"xAxis":"yAxis"][0];var d=b.horiz,g=a[d?"chartX":"chartY"],d=d?"mouseDownX":"mouseDownY",e=c[d],h=(b.pointRange||
+0)/2,k=b.reversed&&!c.inverted||!b.reversed&&c.inverted?-1:1,l=b.getExtremes(),m=b.toValue(e-g,!0)+h*k,k=b.toValue(e+b.len-g,!0)-h*k,p=k<m,e=p?k:m,m=p?m:k,k=Math.min(l.dataMin,h?l.min:b.toValue(b.toPixels(l.min)-b.minPixelPadding)),h=Math.max(l.dataMax,h?l.max:b.toValue(b.toPixels(l.max)+b.minPixelPadding)),p=k-e;0<p&&(m+=p,e=k);p=m-h;0<p&&(m=h,e-=p);b.series.length&&e!==l.min&&m!==l.max&&(b.setExtremes(e,m,!1,!1,{trigger:"pan"}),f=!0);c[d]=g});f&&c.redraw(!1);h(c.container,{cursor:"move"})}});u(p.prototype,
+{select:function(a,b){var c=this,d=c.series,f=d.chart;a=m(a,!c.selected);c.firePointEvent(a?"select":"unselect",{accumulate:b},function(){c.selected=c.options.selected=a;d.options.data[d.data.indexOf(c)]=c.options;c.setState(a&&"select");b||f.getSelectedPoints().forEach(function(a){a.selected&&a!==c&&(a.selected=a.options.selected=!1,d.options.data[d.data.indexOf(a)]=a.options,a.setState(""),a.firePointEvent("unselect"))})})},onMouseOver:function(a){var b=this.series.chart,c=b.pointer;a=a?c.normalize(a):
+c.getChartCoordinatesFromPoint(this,b.inverted);c.runPointActions(a,this)},onMouseOut:function(){var a=this.series.chart;this.firePointEvent("mouseOut");(a.hoverPoints||[]).forEach(function(a){a.setState()});a.hoverPoints=a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var b=this,c=d(b.series.options.point,b.options).events;b.events=c;a.objectEach(c,function(a,c){y(b,c,a)});this.hasImportedEvents=!0}},setState:function(a,b){var c=Math.floor(this.plotX),d=this.plotY,f=this.series,
+g=f.options.states[a||"normal"]||{},h=r[f.type].marker&&f.options.marker,l=h&&!1===h.enabled,e=h&&h.states&&h.states[a||"normal"]||{},p=!1===e.enabled,n=f.stateMarkerGraphic,t=this.marker||{},w=f.chart,x=f.halo,y,E=h&&f.markerAttribs;a=a||"";if(!(a===this.state&&!b||this.selected&&"select"!==a||!1===g.enabled||a&&(p||l&&!1===e.enabled)||a&&t.states&&t.states[a]&&!1===t.states[a].enabled)){E&&(y=f.markerAttribs(this,a));if(this.graphic)this.state&&this.graphic.removeClass("highcharts-point-"+this.state),
+a&&this.graphic.addClass("highcharts-point-"+a),w.styledMode||this.graphic.animate(f.pointAttribs(this,a),m(w.options.chart.animation,g.animation)),y&&this.graphic.animate(y,m(w.options.chart.animation,e.animation,h.animation)),n&&n.hide();else{if(a&&e){h=t.symbol||f.symbol;n&&n.currentSymbol!==h&&(n=n.destroy());if(n)n[b?"animate":"attr"]({x:y.x,y:y.y});else h&&(f.stateMarkerGraphic=n=w.renderer.symbol(h,y.x,y.y,y.width,y.height).add(f.markerGroup),n.currentSymbol=h);!w.styledMode&&n&&n.attr(f.pointAttribs(this,
+a))}n&&(n[a&&w.isInsidePlot(c,d,w.inverted)?"show":"hide"](),n.element.point=this)}(c=g.halo)&&c.size?(x||(f.halo=x=w.renderer.path().add((this.graphic||n).parentGroup)),x.show()[b?"animate":"attr"]({d:this.haloPath(c.size)}),x.attr({"class":"highcharts-halo highcharts-color-"+m(this.colorIndex,f.colorIndex)+(this.className?" "+this.className:""),zIndex:-1}),x.point=this,w.styledMode||x.attr(u({fill:this.color||f.color,"fill-opacity":c.opacity},c.attributes))):x&&x.point&&x.point.haloPath&&x.animate({d:x.point.haloPath(0)},
+null,x.hide);this.state=a;v(this,"afterSetState")}},haloPath:function(a){return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX)-a,this.plotY-a,2*a,2*a)}});u(b.prototype,{onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&v(this,"mouseOver");this.setState("hover");a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;b.hoverSeries=null;if(d)d.onMouseOut();this&&a.events.mouseOut&&
+v(this,"mouseOut");!c||this.stickyTracking||c.shared&&!this.noSharedTooltip||c.hide();this.setState()},setState:function(a){var b=this,c=b.options,d=b.graph,f=c.states,g=c.lineWidth,c=0;a=a||"";if(b.state!==a&&([b.group,b.markerGroup,b.dataLabelsGroup].forEach(function(c){c&&(b.state&&c.removeClass("highcharts-series-"+b.state),a&&c.addClass("highcharts-series-"+a))}),b.state=a,!(b.chart.styledMode||f[a]&&!1===f[a].enabled)&&(a&&(g=f[a].lineWidth||g+(f[a].lineWidthPlus||0)),d&&!d.dashstyle)))for(g=
+{"stroke-width":g},d.animate(g,m(f[a||"normal"]&&f[a||"normal"].animation,b.chart.options.chart.animation));b["zone-graph-"+c];)b["zone-graph-"+c].attr(g),c+=1},setVisible:function(a,b){var c=this,d=c.chart,f=c.legendItem,g,h=d.options.chart.ignoreHiddenSeries,l=c.visible;g=(c.visible=a=c.options.visible=c.userOptions.visible=void 0===a?!l:a)?"show":"hide";["group","dataLabelsGroup","markerGroup","tracker","tt"].forEach(function(a){if(c[a])c[a][g]()});if(d.hoverSeries===c||(d.hoverPoint&&d.hoverPoint.series)===
+c)c.onMouseOut();f&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&d.series.forEach(function(a){a.options.stacking&&a.visible&&(a.isDirty=!0)});c.linkedSeries.forEach(function(b){b.setVisible(a,!1)});h&&(d.isDirtyBox=!0);v(c,g);!1!==b&&d.redraw()},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=this.options.selected=void 0===a?!this.selected:a;this.checkbox&&(this.checkbox.checked=a);v(this,a?"select":"unselect")},drawTracker:x.drawTrackerGraph})})(J);
+(function(a){var y=a.Chart,G=a.isArray,E=a.isObject,h=a.pick,c=a.splat;y.prototype.setResponsive=function(c){var h=this.options.responsive,r=[],w=this.currentResponsive;h&&h.rules&&h.rules.forEach(function(g){void 0===g._id&&(g._id=a.uniqueKey());this.matchResponsiveRule(g,r,c)},this);var n=a.merge.apply(0,r.map(function(c){return a.find(h.rules,function(a){return a._id===c}).chartOptions})),r=r.toString()||void 0;r!==(w&&w.ruleIds)&&(w&&this.update(w.undoOptions,c),r?(this.currentResponsive={ruleIds:r,
+mergedOptions:n,undoOptions:this.currentOptions(n)},this.update(n,c)):this.currentResponsive=void 0)};y.prototype.matchResponsiveRule=function(a,c){var r=a.condition;(r.callback||function(){return this.chartWidth<=h(r.maxWidth,Number.MAX_VALUE)&&this.chartHeight<=h(r.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=h(r.minWidth,0)&&this.chartHeight>=h(r.minHeight,0)}).call(this)&&c.push(a._id)};y.prototype.currentOptions=function(h){function r(h,n,g,d){var m;a.objectEach(h,function(a,b){if(!d&&-1<["series",
+"xAxis","yAxis"].indexOf(b))for(a=c(a),g[b]=[],m=0;m<a.length;m++)n[b][m]&&(g[b][m]={},r(a[m],n[b][m],g[b][m],d+1));else E(a)?(g[b]=G(a)?[]:{},r(a,n[b]||{},g[b],d+1)):g[b]=n[b]||null})}var v={};r(h,this.options,v,0);return v}})(J);return J});
+//# sourceMappingURL=highcharts.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+
+ 3D features for Highcharts JS
+
+ @license: www.highcharts.com/license
+*/
+(function(A){"object"===typeof module&&module.exports?module.exports=A:"function"===typeof define&&define.amd?define(function(){return A}):A("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(A){(function(b){var y=b.deg2rad,z=b.pick;b.perspective3D=function(b,q,v){q=0<v&&v<Number.POSITIVE_INFINITY?v/(b.z+q.z+v):1;return{x:b.x*q,y:b.y*q}};b.perspective=function(u,q,v){var x=q.options.chart.options3d,f=v?q.inverted:!1,w={x:q.plotWidth/2,y:q.plotHeight/2,z:x.depth/2,vd:z(x.depth,1)*z(x.viewDistance,
+0)},p=q.scale3d||1,e=y*x.beta*(f?-1:1),x=y*x.alpha*(f?-1:1),a=Math.cos(x),l=Math.cos(-e),r=Math.sin(x),k=Math.sin(-e);v||(w.x+=q.plotLeft,w.y+=q.plotTop);return u.map(function(e){var d;d=(f?e.y:e.x)-w.x;var c=(f?e.x:e.y)-w.y;e=(e.z||0)-w.z;d={x:l*d-k*e,y:-r*k*d+a*c-l*r*e,z:a*k*d+r*c+a*l*e};c=b.perspective3D(d,w,w.vd);c.x=c.x*p+w.x;c.y=c.y*p+w.y;c.z=d.z*p+w.z;return{x:f?c.y:c.x,y:f?c.x:c.y,z:c.z}})};b.pointCameraDistance=function(b,q){var v=q.options.chart.options3d,x=q.plotWidth/2;q=q.plotHeight/
+2;v=z(v.depth,1)*z(v.viewDistance,0)+v.depth;return Math.sqrt(Math.pow(x-b.plotX,2)+Math.pow(q-b.plotY,2)+Math.pow(v-b.plotZ,2))};b.shapeArea=function(b){var q=0,v,x;for(v=0;v<b.length;v++)x=(v+1)%b.length,q+=b[v].x*b[x].y-b[x].x*b[v].y;return q/2};b.shapeArea3d=function(u,q,v){return b.shapeArea(b.perspective(u,q,v))}})(A);(function(b){function y(a,d,h,b,g,C,e,p){var m=[],F=C-g;return C>g&&C-g>Math.PI/2+.0001?(m=m.concat(y(a,d,h,b,g,g+Math.PI/2,e,p)),m=m.concat(y(a,d,h,b,g+Math.PI/2,C,e,p))):C<g&&
+g-C>Math.PI/2+.0001?(m=m.concat(y(a,d,h,b,g,g-Math.PI/2,e,p)),m=m.concat(y(a,d,h,b,g-Math.PI/2,C,e,p))):["C",a+h*Math.cos(g)-h*c*F*Math.sin(g)+e,d+b*Math.sin(g)+b*c*F*Math.cos(g)+p,a+h*Math.cos(C)+h*c*F*Math.sin(C)+e,d+b*Math.sin(C)-b*c*F*Math.cos(C)+p,a+h*Math.cos(C)+e,d+b*Math.sin(C)+p]}var z=Math.cos,u=Math.PI,q=Math.sin,v=b.animObject,x=b.charts,f=b.color,w=b.defined,p=b.deg2rad,e=b.extend,a=b.merge,l=b.perspective,r=b.pick,k=b.SVGElement,t=b.SVGRenderer,d=b.wrap,c,n,g;c=4*(Math.sqrt(2)-1)/3/
+(u/2);t.prototype.toLinePath=function(a,d){var h=[];a.forEach(function(a){h.push("L",a.x,a.y)});a.length&&(h[0]="M",d&&h.push("Z"));return h};t.prototype.toLineSegments=function(a){var d=[],h=!0;a.forEach(function(a){d.push(h?"M":"L",a.x,a.y);h=!h});return d};t.prototype.face3d=function(a){var c=this,h=this.createElement("path");h.vertexes=[];h.insidePlotArea=!1;h.enabled=!0;d(h,"attr",function(a,d){if("object"===typeof d&&(w(d.enabled)||w(d.vertexes)||w(d.insidePlotArea))){this.enabled=r(d.enabled,
+this.enabled);this.vertexes=r(d.vertexes,this.vertexes);this.insidePlotArea=r(d.insidePlotArea,this.insidePlotArea);delete d.enabled;delete d.vertexes;delete d.insidePlotArea;var h=l(this.vertexes,x[c.chartIndex],this.insidePlotArea),m=c.toLinePath(h,!0),h=b.shapeArea(h),h=this.enabled&&0<h?"visible":"hidden";d.d=m;d.visibility=h}return a.apply(this,[].slice.call(arguments,1))});d(h,"animate",function(a,d){if("object"===typeof d&&(w(d.enabled)||w(d.vertexes)||w(d.insidePlotArea))){this.enabled=r(d.enabled,
+this.enabled);this.vertexes=r(d.vertexes,this.vertexes);this.insidePlotArea=r(d.insidePlotArea,this.insidePlotArea);delete d.enabled;delete d.vertexes;delete d.insidePlotArea;var h=l(this.vertexes,x[c.chartIndex],this.insidePlotArea),m=c.toLinePath(h,!0),h=b.shapeArea(h),h=this.enabled&&0<h?"visible":"hidden";d.d=m;this.attr("visibility",h)}return a.apply(this,[].slice.call(arguments,1))});return h.attr(a)};t.prototype.polyhedron=function(a){var c=this,h=this.g(),m=h.destroy;this.styledMode||h.attr({"stroke-linejoin":"round"});
+h.faces=[];h.destroy=function(){for(var a=0;a<h.faces.length;a++)h.faces[a].destroy();return m.call(this)};d(h,"attr",function(a,d,m,b,g){if("object"===typeof d&&w(d.faces)){for(;h.faces.length>d.faces.length;)h.faces.pop().destroy();for(;h.faces.length<d.faces.length;)h.faces.push(c.face3d().add(h));for(var e=0;e<d.faces.length;e++)c.styledMode&&delete d.faces[e].fill,h.faces[e].attr(d.faces[e],null,b,g);delete d.faces}return a.apply(this,[].slice.call(arguments,1))});d(h,"animate",function(a,d,
+m,b){if(d&&d.faces){for(;h.faces.length>d.faces.length;)h.faces.pop().destroy();for(;h.faces.length<d.faces.length;)h.faces.push(c.face3d().add(h));for(var g=0;g<d.faces.length;g++)h.faces[g].animate(d.faces[g],m,b);delete d.faces}return a.apply(this,[].slice.call(arguments,1))});return h.attr(a)};n={initArgs:function(a){var d=this,h=d.renderer,c=h[d.pathType+"Path"](a),m=c.zIndexes;d.parts.forEach(function(a){d[a]=h.path(c[a]).attr({"class":"highcharts-3d-"+a,zIndex:m[a]||0}).add(d)});d.attr({"stroke-linejoin":"round",
+zIndex:m.group});d.originalDestroy=d.destroy;d.destroy=d.destroyParts},singleSetterForParts:function(a,d,h,c,g,e){var m={};c=[null,null,c||"attr",g,e];var p=h&&h.zIndexes;h?(b.objectEach(h,function(d,c){m[c]={};m[c][a]=d;p&&(m[c].zIndex=h.zIndexes[c]||0)}),c[1]=m):(m[a]=d,c[0]=m);return this.processParts.apply(this,c)},processParts:function(a,d,c,g,e){var h=this;h.parts.forEach(function(m){d&&(a=b.pick(d[m],!1));if(!1!==a)h[m][c](a,g,e)});return h},destroyParts:function(){this.processParts(null,null,
+"destroy");return this.originalDestroy.call(this)}};g=b.merge(n,{parts:["front","top","side"],pathType:"cuboid",attr:function(a,d,c,b){if("string"===typeof a&&"undefined"!==typeof d){var h=a;a={};a[h]=d}return a.shapeArgs||w(a.x)?this.singleSetterForParts("d",null,this.renderer[this.pathType+"Path"](a.shapeArgs||a)):k.prototype.attr.call(this,a,void 0,c,b)},animate:function(a,d,c){w(a.x)&&w(a.y)?(a=this.renderer[this.pathType+"Path"](a),this.singleSetterForParts("d",null,a,"animate",d,c),this.attr({zIndex:a.zIndexes.group})):
+a.opacity?this.processParts(a,null,"animate",d,c):k.prototype.animate.call(this,a,d,c);return this},fillSetter:function(a){this.singleSetterForParts("fill",null,{front:a,top:f(a).brighten(.1).get(),side:f(a).brighten(-.1).get()});this.color=this.fill=a;return this},opacitySetter:function(a){return this.singleSetterForParts("opacity",a)}});t.prototype.elements3d={base:n,cuboid:g};t.prototype.element3d=function(a,d){var c=this.g();b.extend(c,this.elements3d[a]);c.initArgs(d);return c};t.prototype.cuboid=
+function(a){return this.element3d("cuboid",a)};b.SVGRenderer.prototype.cuboidPath=function(a){function d(a){return f[a]}var c=a.x,g=a.y,e=a.z,p=a.height,m=a.width,k=a.depth,r=x[this.chartIndex],n,t,v=r.options.chart.options3d.alpha,q=0,f=[{x:c,y:g,z:e},{x:c+m,y:g,z:e},{x:c+m,y:g+p,z:e},{x:c,y:g+p,z:e},{x:c,y:g+p,z:e+k},{x:c+m,y:g+p,z:e+k},{x:c+m,y:g,z:e+k},{x:c,y:g,z:e+k}],f=l(f,r,a.insidePlotArea);t=function(a,c){var h=[[],-1];a=a.map(d);c=c.map(d);0>b.shapeArea(a)?h=[a,0]:0>b.shapeArea(c)&&(h=[c,
+1]);return h};n=t([3,2,1,0],[7,6,5,4]);a=n[0];m=n[1];n=t([1,6,7,0],[4,5,2,3]);p=n[0];k=n[1];n=t([1,2,5,6],[0,7,4,3]);t=n[0];n=n[1];1===n?q+=1E4*(1E3-c):n||(q+=1E4*c);q+=10*(!k||0<=v&&180>=v||360>v&&357.5<v?r.plotHeight-g:10+g);1===m?q+=100*e:m||(q+=100*(1E3-e));return{front:this.toLinePath(a,!0),top:this.toLinePath(p,!0),side:this.toLinePath(t,!0),zIndexes:{group:Math.round(q)},isFront:m,isTop:k}};b.SVGRenderer.prototype.arc3d=function(c){function g(d){var c=!1,h={},g;d=a(d);for(g in d)-1!==l.indexOf(g)&&
+(h[g]=d[g],delete d[g],c=!0);return c?h:!1}var h=this.g(),m=h.renderer,l="x y r innerR start end".split(" ");c=a(c);c.alpha=(c.alpha||0)*p;c.beta=(c.beta||0)*p;h.top=m.path();h.side1=m.path();h.side2=m.path();h.inn=m.path();h.out=m.path();h.onAdd=function(){var a=h.parentGroup,d=h.attr("class");h.top.add(h);["out","inn","side1","side2"].forEach(function(c){h[c].attr({"class":d+" highcharts-3d-side"}).add(a)})};["addClass","removeClass"].forEach(function(a){h[a]=function(){var d=arguments;["top","out",
+"inn","side1","side2"].forEach(function(c){h[c][a].apply(h[c],d)})}});h.setPaths=function(a){var d=h.renderer.arc3dPath(a),c=100*d.zTop;h.attribs=a;h.top.attr({d:d.top,zIndex:d.zTop});h.inn.attr({d:d.inn,zIndex:d.zInn});h.out.attr({d:d.out,zIndex:d.zOut});h.side1.attr({d:d.side1,zIndex:d.zSide1});h.side2.attr({d:d.side2,zIndex:d.zSide2});h.zIndex=c;h.attr({zIndex:c});a.center&&(h.top.setRadialReference(a.center),delete a.center)};h.setPaths(c);h.fillSetter=function(a){var d=f(a).brighten(-.1).get();
+this.fill=a;this.side1.attr({fill:d});this.side2.attr({fill:d});this.inn.attr({fill:d});this.out.attr({fill:d});this.top.attr({fill:a});return this};["opacity","translateX","translateY","visibility"].forEach(function(a){h[a+"Setter"]=function(a,d){h[d]=a;["out","inn","side1","side2","top"].forEach(function(c){h[c].attr(d,a)})}});d(h,"attr",function(a,d){var c;"object"===typeof d&&(c=g(d))&&(e(h.attribs,c),h.setPaths(h.attribs));return a.apply(this,[].slice.call(arguments,1))});d(h,"animate",function(d,
+c,e,p){var m,k=this.attribs,l,n="data-"+Math.random().toString(26).substring(2,9);delete c.center;delete c.z;delete c.depth;delete c.alpha;delete c.beta;l=v(r(e,this.renderer.globalAnimation));l.duration&&(m=g(c),h[n]=0,c[n]=1,h[n+"Setter"]=b.noop,m&&(l.step=function(d,c){function h(a){return k[a]+(r(m[a],k[a])-k[a])*c.pos}c.prop===n&&c.elem.setPaths(a(k,{x:h("x"),y:h("y"),r:h("r"),innerR:h("innerR"),start:h("start"),end:h("end")}))}),e=l);return d.call(this,c,e,p)});h.destroy=function(){this.top.destroy();
+this.out.destroy();this.inn.destroy();this.side1.destroy();this.side2.destroy();k.prototype.destroy.call(this)};h.hide=function(){this.top.hide();this.out.hide();this.inn.hide();this.side1.hide();this.side2.hide()};h.show=function(a){this.top.show(a);this.out.show(a);this.inn.show(a);this.side1.show(a);this.side2.show(a)};return h};t.prototype.arc3dPath=function(a){function d(a){a%=2*Math.PI;a>Math.PI&&(a=2*Math.PI-a);return a}var c=a.x,g=a.y,b=a.start,e=a.end-.00001,p=a.r,k=a.innerR||0,l=a.depth||
+0,m=a.alpha,n=a.beta,r=Math.cos(b),t=Math.sin(b);a=Math.cos(e);var v=Math.sin(e),f=p*Math.cos(n),p=p*Math.cos(m),x=k*Math.cos(n),w=k*Math.cos(m),k=l*Math.sin(n),B=l*Math.sin(m),l=["M",c+f*r,g+p*t],l=l.concat(y(c,g,f,p,b,e,0,0)),l=l.concat(["L",c+x*a,g+w*v]),l=l.concat(y(c,g,x,w,e,b,0,0)),l=l.concat(["Z"]),A=0<n?Math.PI/2:0,n=0<m?0:Math.PI/2,A=b>-A?b:e>-A?-A:b,D=e<u-n?e:b<u-n?u-n:e,E=2*u-n,m=["M",c+f*z(A),g+p*q(A)],m=m.concat(y(c,g,f,p,A,D,0,0));e>E&&b<E?(m=m.concat(["L",c+f*z(D)+k,g+p*q(D)+B]),m=
+m.concat(y(c,g,f,p,D,E,k,B)),m=m.concat(["L",c+f*z(E),g+p*q(E)]),m=m.concat(y(c,g,f,p,E,e,0,0)),m=m.concat(["L",c+f*z(e)+k,g+p*q(e)+B]),m=m.concat(y(c,g,f,p,e,E,k,B)),m=m.concat(["L",c+f*z(E),g+p*q(E)]),m=m.concat(y(c,g,f,p,E,D,0,0))):e>u-n&&b<u-n&&(m=m.concat(["L",c+f*Math.cos(D)+k,g+p*Math.sin(D)+B]),m=m.concat(y(c,g,f,p,D,e,k,B)),m=m.concat(["L",c+f*Math.cos(e),g+p*Math.sin(e)]),m=m.concat(y(c,g,f,p,e,D,0,0)));m=m.concat(["L",c+f*Math.cos(D)+k,g+p*Math.sin(D)+B]);m=m.concat(y(c,g,f,p,D,A,k,B));
+m=m.concat(["Z"]);n=["M",c+x*r,g+w*t];n=n.concat(y(c,g,x,w,b,e,0,0));n=n.concat(["L",c+x*Math.cos(e)+k,g+w*Math.sin(e)+B]);n=n.concat(y(c,g,x,w,e,b,k,B));n=n.concat(["Z"]);r=["M",c+f*r,g+p*t,"L",c+f*r+k,g+p*t+B,"L",c+x*r+k,g+w*t+B,"L",c+x*r,g+w*t,"Z"];c=["M",c+f*a,g+p*v,"L",c+f*a+k,g+p*v+B,"L",c+x*a+k,g+w*v+B,"L",c+x*a,g+w*v,"Z"];v=Math.atan2(B,-k);g=Math.abs(e+v);a=Math.abs(b+v);b=Math.abs((b+e)/2+v);g=d(g);a=d(a);b=d(b);b*=1E5;e=1E5*a;g*=1E5;return{top:l,zTop:1E5*Math.PI+1,out:m,zOut:Math.max(b,
+e,g),inn:n,zInn:Math.max(b,e,g),side1:r,zSide1:.99*g,side2:c,zSide2:.99*e}}})(A);(function(b){function y(b,e){var a=b.plotLeft,p=b.plotWidth+a,r=b.plotTop,k=b.plotHeight+r,t=a+b.plotWidth/2,d=r+b.plotHeight/2,c=Number.MAX_VALUE,n=-Number.MAX_VALUE,g=Number.MAX_VALUE,m=-Number.MAX_VALUE,f,h=1;f=[{x:a,y:r,z:0},{x:a,y:r,z:e}];[0,1].forEach(function(a){f.push({x:p,y:f[a].y,z:f[a].z})});[0,1,2,3].forEach(function(a){f.push({x:f[a].x,y:k,z:f[a].z})});f=v(f,b,!1);f.forEach(function(a){c=Math.min(c,a.x);
+n=Math.max(n,a.x);g=Math.min(g,a.y);m=Math.max(m,a.y)});a>c&&(h=Math.min(h,1-Math.abs((a+t)/(c+t))%1));p<n&&(h=Math.min(h,(p-t)/(n-t)));r>g&&(h=0>g?Math.min(h,(r+d)/(-g+r+d)):Math.min(h,1-(r+d)/(g+d)%1));k<m&&(h=Math.min(h,Math.abs((k-d)/(m-d))));return h}var z=b.addEvent,u=b.Chart,q=b.merge,v=b.perspective,x=b.pick,f=b.wrap;u.prototype.is3d=function(){return this.options.chart.options3d&&this.options.chart.options3d.enabled};u.prototype.propsRequireDirtyBox.push("chart.options3d");u.prototype.propsRequireUpdateSeries.push("chart.options3d");
+z(u,"afterInit",function(){var b=this.options;this.is3d()&&(b.series||[]).forEach(function(e){"scatter"===(e.type||b.chart.type||b.chart.defaultSeriesType)&&(e.type="scatter3d")})});z(u,"addSeries",function(b){this.is3d()&&"scatter"===b.options.type&&(b.options.type="scatter3d")});b.wrap(b.Chart.prototype,"isInsidePlot",function(b){return this.is3d()||b.apply(this,[].slice.call(arguments,1))});var w=b.getOptions();q(!0,w,{chart:{options3d:{enabled:!1,alpha:0,beta:0,depth:100,fitToPlot:!0,viewDistance:25,
+axisLabelPosition:null,frame:{visible:"default",size:1,bottom:{},top:{},left:{},right:{},back:{},front:{}}}}});z(u,"afterGetContainer",function(){this.styledMode&&(this.renderer.definition({tagName:"style",textContent:".highcharts-3d-top{filter: url(#highcharts-brighter)}\n.highcharts-3d-side{filter: url(#highcharts-darker)}\n"}),[{name:"darker",slope:.6},{name:"brighter",slope:1.4}].forEach(function(b){this.renderer.definition({tagName:"filter",id:"highcharts-"+b.name,children:[{tagName:"feComponentTransfer",
+children:[{tagName:"feFuncR",type:"linear",slope:b.slope},{tagName:"feFuncG",type:"linear",slope:b.slope},{tagName:"feFuncB",type:"linear",slope:b.slope}]}]})},this))});f(u.prototype,"setClassName",function(b){b.apply(this,[].slice.call(arguments,1));this.is3d()&&(this.container.className+=" highcharts-3d-chart")});z(b.Chart,"afterSetChartSize",function(){var b=this.options.chart.options3d;if(this.is3d()){var e=this.inverted,a=this.clipBox,l=this.margin;a[e?"y":"x"]=-(l[3]||0);a[e?"x":"y"]=-(l[0]||
+0);a[e?"height":"width"]=this.chartWidth+(l[3]||0)+(l[1]||0);a[e?"width":"height"]=this.chartHeight+(l[0]||0)+(l[2]||0);this.scale3d=1;!0===b.fitToPlot&&(this.scale3d=y(this,b.depth));this.frame3d=this.get3dFrame()}});z(u,"beforeRedraw",function(){this.is3d()&&(this.isDirtyBox=!0)});z(u,"beforeRender",function(){this.is3d()&&(this.frame3d=this.get3dFrame())});f(u.prototype,"renderSeries",function(b){var e=this.series.length;if(this.is3d())for(;e--;)b=this.series[e],b.translate(),b.render();else b.call(this)});
+z(u,"afterDrawChartBox",function(){if(this.is3d()){var p=this.renderer,e=this.options.chart.options3d,a=this.get3dFrame(),l=this.plotLeft,r=this.plotLeft+this.plotWidth,k=this.plotTop,t=this.plotTop+this.plotHeight,e=e.depth,d=l-(a.left.visible?a.left.size:0),c=r+(a.right.visible?a.right.size:0),n=k-(a.top.visible?a.top.size:0),g=t+(a.bottom.visible?a.bottom.size:0),m=0-(a.front.visible?a.front.size:0),f=e+(a.back.visible?a.back.size:0),h=this.hasRendered?"animate":"attr";this.frame3d=a;this.frameShapes||
+(this.frameShapes={bottom:p.polyhedron().add(),top:p.polyhedron().add(),left:p.polyhedron().add(),right:p.polyhedron().add(),back:p.polyhedron().add(),front:p.polyhedron().add()});this.frameShapes.bottom[h]({"class":"highcharts-3d-frame highcharts-3d-frame-bottom",zIndex:a.bottom.frontFacing?-1E3:1E3,faces:[{fill:b.color(a.bottom.color).brighten(.1).get(),vertexes:[{x:d,y:g,z:m},{x:c,y:g,z:m},{x:c,y:g,z:f},{x:d,y:g,z:f}],enabled:a.bottom.visible},{fill:b.color(a.bottom.color).brighten(.1).get(),vertexes:[{x:l,
+y:t,z:e},{x:r,y:t,z:e},{x:r,y:t,z:0},{x:l,y:t,z:0}],enabled:a.bottom.visible},{fill:b.color(a.bottom.color).brighten(-.1).get(),vertexes:[{x:d,y:g,z:m},{x:d,y:g,z:f},{x:l,y:t,z:e},{x:l,y:t,z:0}],enabled:a.bottom.visible&&!a.left.visible},{fill:b.color(a.bottom.color).brighten(-.1).get(),vertexes:[{x:c,y:g,z:f},{x:c,y:g,z:m},{x:r,y:t,z:0},{x:r,y:t,z:e}],enabled:a.bottom.visible&&!a.right.visible},{fill:b.color(a.bottom.color).get(),vertexes:[{x:c,y:g,z:m},{x:d,y:g,z:m},{x:l,y:t,z:0},{x:r,y:t,z:0}],
+enabled:a.bottom.visible&&!a.front.visible},{fill:b.color(a.bottom.color).get(),vertexes:[{x:d,y:g,z:f},{x:c,y:g,z:f},{x:r,y:t,z:e},{x:l,y:t,z:e}],enabled:a.bottom.visible&&!a.back.visible}]});this.frameShapes.top[h]({"class":"highcharts-3d-frame highcharts-3d-frame-top",zIndex:a.top.frontFacing?-1E3:1E3,faces:[{fill:b.color(a.top.color).brighten(.1).get(),vertexes:[{x:d,y:n,z:f},{x:c,y:n,z:f},{x:c,y:n,z:m},{x:d,y:n,z:m}],enabled:a.top.visible},{fill:b.color(a.top.color).brighten(.1).get(),vertexes:[{x:l,
+y:k,z:0},{x:r,y:k,z:0},{x:r,y:k,z:e},{x:l,y:k,z:e}],enabled:a.top.visible},{fill:b.color(a.top.color).brighten(-.1).get(),vertexes:[{x:d,y:n,z:f},{x:d,y:n,z:m},{x:l,y:k,z:0},{x:l,y:k,z:e}],enabled:a.top.visible&&!a.left.visible},{fill:b.color(a.top.color).brighten(-.1).get(),vertexes:[{x:c,y:n,z:m},{x:c,y:n,z:f},{x:r,y:k,z:e},{x:r,y:k,z:0}],enabled:a.top.visible&&!a.right.visible},{fill:b.color(a.top.color).get(),vertexes:[{x:d,y:n,z:m},{x:c,y:n,z:m},{x:r,y:k,z:0},{x:l,y:k,z:0}],enabled:a.top.visible&&
+!a.front.visible},{fill:b.color(a.top.color).get(),vertexes:[{x:c,y:n,z:f},{x:d,y:n,z:f},{x:l,y:k,z:e},{x:r,y:k,z:e}],enabled:a.top.visible&&!a.back.visible}]});this.frameShapes.left[h]({"class":"highcharts-3d-frame highcharts-3d-frame-left",zIndex:a.left.frontFacing?-1E3:1E3,faces:[{fill:b.color(a.left.color).brighten(.1).get(),vertexes:[{x:d,y:g,z:m},{x:l,y:t,z:0},{x:l,y:t,z:e},{x:d,y:g,z:f}],enabled:a.left.visible&&!a.bottom.visible},{fill:b.color(a.left.color).brighten(.1).get(),vertexes:[{x:d,
+y:n,z:f},{x:l,y:k,z:e},{x:l,y:k,z:0},{x:d,y:n,z:m}],enabled:a.left.visible&&!a.top.visible},{fill:b.color(a.left.color).brighten(-.1).get(),vertexes:[{x:d,y:g,z:f},{x:d,y:n,z:f},{x:d,y:n,z:m},{x:d,y:g,z:m}],enabled:a.left.visible},{fill:b.color(a.left.color).brighten(-.1).get(),vertexes:[{x:l,y:k,z:e},{x:l,y:t,z:e},{x:l,y:t,z:0},{x:l,y:k,z:0}],enabled:a.left.visible},{fill:b.color(a.left.color).get(),vertexes:[{x:d,y:g,z:m},{x:d,y:n,z:m},{x:l,y:k,z:0},{x:l,y:t,z:0}],enabled:a.left.visible&&!a.front.visible},
+{fill:b.color(a.left.color).get(),vertexes:[{x:d,y:n,z:f},{x:d,y:g,z:f},{x:l,y:t,z:e},{x:l,y:k,z:e}],enabled:a.left.visible&&!a.back.visible}]});this.frameShapes.right[h]({"class":"highcharts-3d-frame highcharts-3d-frame-right",zIndex:a.right.frontFacing?-1E3:1E3,faces:[{fill:b.color(a.right.color).brighten(.1).get(),vertexes:[{x:c,y:g,z:f},{x:r,y:t,z:e},{x:r,y:t,z:0},{x:c,y:g,z:m}],enabled:a.right.visible&&!a.bottom.visible},{fill:b.color(a.right.color).brighten(.1).get(),vertexes:[{x:c,y:n,z:m},
+{x:r,y:k,z:0},{x:r,y:k,z:e},{x:c,y:n,z:f}],enabled:a.right.visible&&!a.top.visible},{fill:b.color(a.right.color).brighten(-.1).get(),vertexes:[{x:r,y:k,z:0},{x:r,y:t,z:0},{x:r,y:t,z:e},{x:r,y:k,z:e}],enabled:a.right.visible},{fill:b.color(a.right.color).brighten(-.1).get(),vertexes:[{x:c,y:g,z:m},{x:c,y:n,z:m},{x:c,y:n,z:f},{x:c,y:g,z:f}],enabled:a.right.visible},{fill:b.color(a.right.color).get(),vertexes:[{x:c,y:n,z:m},{x:c,y:g,z:m},{x:r,y:t,z:0},{x:r,y:k,z:0}],enabled:a.right.visible&&!a.front.visible},
+{fill:b.color(a.right.color).get(),vertexes:[{x:c,y:g,z:f},{x:c,y:n,z:f},{x:r,y:k,z:e},{x:r,y:t,z:e}],enabled:a.right.visible&&!a.back.visible}]});this.frameShapes.back[h]({"class":"highcharts-3d-frame highcharts-3d-frame-back",zIndex:a.back.frontFacing?-1E3:1E3,faces:[{fill:b.color(a.back.color).brighten(.1).get(),vertexes:[{x:c,y:g,z:f},{x:d,y:g,z:f},{x:l,y:t,z:e},{x:r,y:t,z:e}],enabled:a.back.visible&&!a.bottom.visible},{fill:b.color(a.back.color).brighten(.1).get(),vertexes:[{x:d,y:n,z:f},{x:c,
+y:n,z:f},{x:r,y:k,z:e},{x:l,y:k,z:e}],enabled:a.back.visible&&!a.top.visible},{fill:b.color(a.back.color).brighten(-.1).get(),vertexes:[{x:d,y:g,z:f},{x:d,y:n,z:f},{x:l,y:k,z:e},{x:l,y:t,z:e}],enabled:a.back.visible&&!a.left.visible},{fill:b.color(a.back.color).brighten(-.1).get(),vertexes:[{x:c,y:n,z:f},{x:c,y:g,z:f},{x:r,y:t,z:e},{x:r,y:k,z:e}],enabled:a.back.visible&&!a.right.visible},{fill:b.color(a.back.color).get(),vertexes:[{x:l,y:k,z:e},{x:r,y:k,z:e},{x:r,y:t,z:e},{x:l,y:t,z:e}],enabled:a.back.visible},
+{fill:b.color(a.back.color).get(),vertexes:[{x:d,y:g,z:f},{x:c,y:g,z:f},{x:c,y:n,z:f},{x:d,y:n,z:f}],enabled:a.back.visible}]});this.frameShapes.front[h]({"class":"highcharts-3d-frame highcharts-3d-frame-front",zIndex:a.front.frontFacing?-1E3:1E3,faces:[{fill:b.color(a.front.color).brighten(.1).get(),vertexes:[{x:d,y:g,z:m},{x:c,y:g,z:m},{x:r,y:t,z:0},{x:l,y:t,z:0}],enabled:a.front.visible&&!a.bottom.visible},{fill:b.color(a.front.color).brighten(.1).get(),vertexes:[{x:c,y:n,z:m},{x:d,y:n,z:m},{x:l,
+y:k,z:0},{x:r,y:k,z:0}],enabled:a.front.visible&&!a.top.visible},{fill:b.color(a.front.color).brighten(-.1).get(),vertexes:[{x:d,y:n,z:m},{x:d,y:g,z:m},{x:l,y:t,z:0},{x:l,y:k,z:0}],enabled:a.front.visible&&!a.left.visible},{fill:b.color(a.front.color).brighten(-.1).get(),vertexes:[{x:c,y:g,z:m},{x:c,y:n,z:m},{x:r,y:k,z:0},{x:r,y:t,z:0}],enabled:a.front.visible&&!a.right.visible},{fill:b.color(a.front.color).get(),vertexes:[{x:r,y:k,z:0},{x:l,y:k,z:0},{x:l,y:t,z:0},{x:r,y:t,z:0}],enabled:a.front.visible},
+{fill:b.color(a.front.color).get(),vertexes:[{x:c,y:g,z:m},{x:d,y:g,z:m},{x:d,y:n,z:m},{x:c,y:n,z:m}],enabled:a.front.visible}]})}});u.prototype.retrieveStacks=function(b){var e=this.series,a={},l,p=1;this.series.forEach(function(k){l=x(k.options.stack,b?0:e.length-1-k.index);a[l]?a[l].series.push(k):(a[l]={series:[k],position:p},p++)});a.totalStacks=p+1;return a};u.prototype.get3dFrame=function(){var p=this,e=p.options.chart.options3d,a=e.frame,l=p.plotLeft,f=p.plotLeft+p.plotWidth,k=p.plotTop,t=
+p.plotTop+p.plotHeight,d=e.depth,c=function(a){a=b.shapeArea3d(a,p);return.5<a?1:-.5>a?-1:0},n=c([{x:l,y:t,z:d},{x:f,y:t,z:d},{x:f,y:t,z:0},{x:l,y:t,z:0}]),g=c([{x:l,y:k,z:0},{x:f,y:k,z:0},{x:f,y:k,z:d},{x:l,y:k,z:d}]),m=c([{x:l,y:k,z:0},{x:l,y:k,z:d},{x:l,y:t,z:d},{x:l,y:t,z:0}]),q=c([{x:f,y:k,z:d},{x:f,y:k,z:0},{x:f,y:t,z:0},{x:f,y:t,z:d}]),h=c([{x:l,y:t,z:0},{x:f,y:t,z:0},{x:f,y:k,z:0},{x:l,y:k,z:0}]),c=c([{x:l,y:k,z:d},{x:f,y:k,z:d},{x:f,y:t,z:d},{x:l,y:t,z:d}]),w=!1,u=!1,y=!1,z=!1;[].concat(p.xAxis,
+p.yAxis,p.zAxis).forEach(function(a){a&&(a.horiz?a.opposite?u=!0:w=!0:a.opposite?z=!0:y=!0)});var A=function(a,c,d){for(var b=["size","color","visible"],g={},e=0;e<b.length;e++)for(var m=b[e],h=0;h<a.length;h++)if("object"===typeof a[h]){var f=a[h][m];if(void 0!==f&&null!==f){g[m]=f;break}}a=d;!0===g.visible||!1===g.visible?a=g.visible:"auto"===g.visible&&(a=0<c);return{size:x(g.size,1),color:x(g.color,"none"),frontFacing:0<c,visible:a}},a={bottom:A([a.bottom,a.top,a],n,w),top:A([a.top,a.bottom,a],
+g,u),left:A([a.left,a.right,a.side,a],m,y),right:A([a.right,a.left,a.side,a],q,z),back:A([a.back,a.front,a],c,!0),front:A([a.front,a.back,a],h,!1)};"auto"===e.axisLabelPosition?(q=function(a,c){return a.visible!==c.visible||a.visible&&c.visible&&a.frontFacing!==c.frontFacing},e=[],q(a.left,a.front)&&e.push({y:(k+t)/2,x:l,z:0,xDir:{x:1,y:0,z:0}}),q(a.left,a.back)&&e.push({y:(k+t)/2,x:l,z:d,xDir:{x:0,y:0,z:-1}}),q(a.right,a.front)&&e.push({y:(k+t)/2,x:f,z:0,xDir:{x:0,y:0,z:1}}),q(a.right,a.back)&&e.push({y:(k+
+t)/2,x:f,z:d,xDir:{x:-1,y:0,z:0}}),n=[],q(a.bottom,a.front)&&n.push({x:(l+f)/2,y:t,z:0,xDir:{x:1,y:0,z:0}}),q(a.bottom,a.back)&&n.push({x:(l+f)/2,y:t,z:d,xDir:{x:-1,y:0,z:0}}),g=[],q(a.top,a.front)&&g.push({x:(l+f)/2,y:k,z:0,xDir:{x:1,y:0,z:0}}),q(a.top,a.back)&&g.push({x:(l+f)/2,y:k,z:d,xDir:{x:-1,y:0,z:0}}),m=[],q(a.bottom,a.left)&&m.push({z:(0+d)/2,y:t,x:l,xDir:{x:0,y:0,z:-1}}),q(a.bottom,a.right)&&m.push({z:(0+d)/2,y:t,x:f,xDir:{x:0,y:0,z:1}}),t=[],q(a.top,a.left)&&t.push({z:(0+d)/2,y:k,x:l,xDir:{x:0,
+y:0,z:-1}}),q(a.top,a.right)&&t.push({z:(0+d)/2,y:k,x:f,xDir:{x:0,y:0,z:1}}),l=function(a,c,d){if(0===a.length)return null;if(1===a.length)return a[0];for(var b=0,g=v(a,p,!1),e=1;e<g.length;e++)d*g[e][c]>d*g[b][c]?b=e:d*g[e][c]===d*g[b][c]&&g[e].z<g[b].z&&(b=e);return a[b]},a.axes={y:{left:l(e,"x",-1),right:l(e,"x",1)},x:{top:l(g,"y",-1),bottom:l(n,"y",1)},z:{top:l(t,"y",-1),bottom:l(m,"y",1)}}):a.axes={y:{left:{x:l,z:0,xDir:{x:1,y:0,z:0}},right:{x:f,z:0,xDir:{x:0,y:0,z:1}}},x:{top:{y:k,z:0,xDir:{x:1,
+y:0,z:0}},bottom:{y:t,z:0,xDir:{x:1,y:0,z:0}}},z:{top:{x:y?f:l,y:k,xDir:y?{x:0,y:0,z:1}:{x:0,y:0,z:-1}},bottom:{x:y?f:l,y:t,xDir:y?{x:0,y:0,z:1}:{x:0,y:0,z:-1}}}};return a};b.Fx.prototype.matrixSetter=function(){var f;if(1>this.pos&&(b.isArray(this.start)||b.isArray(this.end))){var e=this.start||[1,0,0,1,0,0],a=this.end||[1,0,0,1,0,0];f=[];for(var l=0;6>l;l++)f.push(this.pos*a[l]+(1-this.pos)*e[l])}else f=this.end;this.elem.attr(this.prop,f,null,!0)}})(A);(function(b){function y(d,c,b){if(!d.chart.is3d()||
+"colorAxis"===d.coll)return c;var g=d.chart,e=x*g.options.chart.options3d.alpha,f=x*g.options.chart.options3d.beta,h=a(b&&d.options.title.position3d,d.options.labels.position3d);b=a(b&&d.options.title.skew3d,d.options.labels.skew3d);var k=g.frame3d,n=g.plotLeft,t=g.plotWidth+n,r=g.plotTop,q=g.plotHeight+r,g=!1,v=0,w=0,u={x:0,y:1,z:0};c=d.swapZ({x:c.x,y:c.y,z:0});if(d.isZAxis)if(d.opposite){if(null===k.axes.z.top)return{};w=c.y-r;c.x=k.axes.z.top.x;c.y=k.axes.z.top.y;n=k.axes.z.top.xDir;g=!k.top.frontFacing}else{if(null===
+k.axes.z.bottom)return{};w=c.y-q;c.x=k.axes.z.bottom.x;c.y=k.axes.z.bottom.y;n=k.axes.z.bottom.xDir;g=!k.bottom.frontFacing}else if(d.horiz)if(d.opposite){if(null===k.axes.x.top)return{};w=c.y-r;c.y=k.axes.x.top.y;c.z=k.axes.x.top.z;n=k.axes.x.top.xDir;g=!k.top.frontFacing}else{if(null===k.axes.x.bottom)return{};w=c.y-q;c.y=k.axes.x.bottom.y;c.z=k.axes.x.bottom.z;n=k.axes.x.bottom.xDir;g=!k.bottom.frontFacing}else if(d.opposite){if(null===k.axes.y.right)return{};v=c.x-t;c.x=k.axes.y.right.x;c.z=k.axes.y.right.z;
+n=k.axes.y.right.xDir;n={x:n.z,y:n.y,z:-n.x}}else{if(null===k.axes.y.left)return{};v=c.x-n;c.x=k.axes.y.left.x;c.z=k.axes.y.left.z;n=k.axes.y.left.xDir}"chart"!==h&&("flap"===h?d.horiz?(f=Math.sin(e),e=Math.cos(e),d.opposite&&(f=-f),g&&(f=-f),u={x:n.z*f,y:e,z:-n.x*f}):n={x:Math.cos(f),y:0,z:Math.sin(f)}:"ortho"===h?d.horiz?(u=Math.cos(e),h=Math.sin(f)*u,e=-Math.sin(e),f=-u*Math.cos(f),u={x:n.y*f-n.z*e,y:n.z*h-n.x*f,z:n.x*e-n.y*h},e=1/Math.sqrt(u.x*u.x+u.y*u.y+u.z*u.z),g&&(e=-e),u={x:e*u.x,y:e*u.y,
+z:e*u.z}):n={x:Math.cos(f),y:0,z:Math.sin(f)}:d.horiz?u={x:Math.sin(f)*Math.sin(e),y:Math.cos(e),z:-Math.cos(f)*Math.sin(e)}:n={x:Math.cos(f),y:0,z:Math.sin(f)});c.x+=v*n.x+w*u.x;c.y+=v*n.y+w*u.y;c.z+=v*n.z+w*u.z;g=p([c],d.chart)[0];b&&(0>l(p([c,{x:c.x+n.x,y:c.y+n.y,z:c.z+n.z},{x:c.x+u.x,y:c.y+u.y,z:c.z+u.z}],d.chart))&&(n={x:-n.x,y:-n.y,z:-n.z}),d=p([{x:c.x,y:c.y,z:c.z},{x:c.x+n.x,y:c.y+n.y,z:c.z+n.z},{x:c.x+u.x,y:c.y+u.y,z:c.z+u.z}],d.chart),g.matrix=[d[1].x-d[0].x,d[1].y-d[0].y,d[2].x-d[0].x,d[2].y-
+d[0].y,g.x,g.y],g.matrix[4]-=g.x*g.matrix[0]+g.y*g.matrix[2],g.matrix[5]-=g.x*g.matrix[1]+g.y*g.matrix[3]);return g}var z,u=b.addEvent,q=b.Axis,v=b.Chart,x=b.deg2rad,f=b.extend,w=b.merge,p=b.perspective,e=b.perspective3D,a=b.pick,l=b.shapeArea,r=b.splat,k=b.Tick,t=b.wrap;w(!0,q.prototype.defaultOptions,{labels:{position3d:"offset",skew3d:!1},title:{position3d:null,skew3d:null}});u(q,"afterSetOptions",function(){var d;this.chart.is3d&&this.chart.is3d()&&"colorAxis"!==this.coll&&(d=this.options,d.tickWidth=
+a(d.tickWidth,0),d.gridLineWidth=a(d.gridLineWidth,1))});t(q.prototype,"getPlotLinePath",function(a){var c=a.apply(this,[].slice.call(arguments,1));if(!this.chart.is3d()||"colorAxis"===this.coll||null===c)return c;var d=this.chart,b=d.options.chart.options3d,b=this.isZAxis?d.plotWidth:b.depth,d=d.frame3d,c=[this.swapZ({x:c[1],y:c[2],z:0}),this.swapZ({x:c[1],y:c[2],z:b}),this.swapZ({x:c[4],y:c[5],z:0}),this.swapZ({x:c[4],y:c[5],z:b})],b=[];this.horiz?(this.isZAxis?(d.left.visible&&b.push(c[0],c[2]),
+d.right.visible&&b.push(c[1],c[3])):(d.front.visible&&b.push(c[0],c[2]),d.back.visible&&b.push(c[1],c[3])),d.top.visible&&b.push(c[0],c[1]),d.bottom.visible&&b.push(c[2],c[3])):(d.front.visible&&b.push(c[0],c[2]),d.back.visible&&b.push(c[1],c[3]),d.left.visible&&b.push(c[0],c[1]),d.right.visible&&b.push(c[2],c[3]));b=p(b,this.chart,!1);return this.chart.renderer.toLineSegments(b)});t(q.prototype,"getLinePath",function(a){return this.chart.is3d()&&"colorAxis"!==this.coll?[]:a.apply(this,[].slice.call(arguments,
+1))});t(q.prototype,"getPlotBandPath",function(a){if(!this.chart.is3d()||"colorAxis"===this.coll)return a.apply(this,[].slice.call(arguments,1));var d=arguments,b=d[2],e=[],d=this.getPlotLinePath(d[1]),b=this.getPlotLinePath(b);if(d&&b)for(var f=0;f<d.length;f+=6)e.push("M",d[f+1],d[f+2],"L",d[f+4],d[f+5],"L",b[f+4],b[f+5],"L",b[f+1],b[f+2],"Z");return e});t(k.prototype,"getMarkPath",function(a){var d=a.apply(this,[].slice.call(arguments,1)),d=[y(this.axis,{x:d[1],y:d[2],z:0}),y(this.axis,{x:d[4],
+y:d[5],z:0})];return this.axis.chart.renderer.toLineSegments(d)});u(k,"afterGetLabelPosition",function(a){f(a.pos,y(this.axis,a.pos))});t(q.prototype,"getTitlePosition",function(a){var d=a.apply(this,[].slice.call(arguments,1));return y(this,d,!0)});u(q,"drawCrosshair",function(a){this.chart.is3d()&&"colorAxis"!==this.coll&&a.point&&(a.point.crosshairPos=this.isXAxis?a.point.axisXpos:this.len-a.point.axisYpos)});u(q,"destroy",function(){["backFrame","bottomFrame","sideFrame"].forEach(function(a){this[a]&&
+(this[a]=this[a].destroy())},this)});q.prototype.swapZ=function(a,c){return this.isZAxis?(c=c?0:this.chart.plotLeft,{x:c+a.z,y:a.y,z:a.x-c}):a};z=b.ZAxis=function(){this.init.apply(this,arguments)};f(z.prototype,q.prototype);f(z.prototype,{isZAxis:!0,setOptions:function(a){a=w({offset:0,lineWidth:0},a);q.prototype.setOptions.call(this,a);this.coll="zAxis"},setAxisSize:function(){q.prototype.setAxisSize.call(this);this.width=this.len=this.chart.options.chart.options3d.depth;this.right=this.chart.chartWidth-
+this.width-this.left},getSeriesExtremes:function(){var d=this,c=d.chart;d.hasVisibleSeries=!1;d.dataMin=d.dataMax=d.ignoreMinPadding=d.ignoreMaxPadding=null;d.buildStacks&&d.buildStacks();d.series.forEach(function(b){if(b.visible||!c.options.chart.ignoreHiddenSeries)d.hasVisibleSeries=!0,b=b.zData,b.length&&(d.dataMin=Math.min(a(d.dataMin,b[0]),Math.min.apply(null,b)),d.dataMax=Math.max(a(d.dataMax,b[0]),Math.max.apply(null,b)))})}});u(v,"afterGetAxes",function(){var a=this,c=this.options,c=c.zAxis=
+r(c.zAxis||{});a.is3d()&&(this.zAxis=[],c.forEach(function(d,c){d.index=c;d.isX=!0;(new z(a,d)).setScale()}))});t(q.prototype,"getSlotWidth",function(d,c){if(this.chart.is3d()&&c&&c.label&&this.categories&&this.chart.frameShapes){var b=this.chart,g=this.ticks,f=this.gridGroup.element.childNodes[0].getBBox(),k=b.frameShapes.left.getBBox(),h=b.options.chart.options3d,b={x:b.plotWidth/2,y:b.plotHeight/2,z:h.depth/2,vd:a(h.depth,1)*a(h.viewDistance,0)},l,p,h=c.pos,r=g[h-1],g=g[h+1];0!==h&&r&&r.label.xy&&
+(l=e({x:r.label.xy.x,y:r.label.xy.y,z:null},b,b.vd));g&&g.label.xy&&(p=e({x:g.label.xy.x,y:g.label.xy.y,z:null},b,b.vd));g={x:c.label.xy.x,y:c.label.xy.y,z:null};g=e(g,b,b.vd);return Math.abs(l?g.x-l.x:p?p.x-g.x:f.x-k.x)}return d.apply(this,[].slice.call(arguments,1))})})(A);(function(b){var y=b.addEvent,z=b.perspective,u=b.pick;y(b.Series,"afterTranslate",function(){this.chart.is3d()&&this.translate3dPoints()});b.Series.prototype.translate3dPoints=function(){var b=this.chart,v=u(this.zAxis,b.options.zAxis[0]),
+x=[],f,w,p;for(p=0;p<this.data.length;p++)f=this.data[p],v&&v.translate?(w=v.isLog&&v.val2lin?v.val2lin(f.z):f.z,f.plotZ=v.translate(w),f.isInside=f.isInside?w>=v.min&&w<=v.max:!1):f.plotZ=0,f.axisXpos=f.plotX,f.axisYpos=f.plotY,f.axisZpos=f.plotZ,x.push({x:f.plotX,y:f.plotY,z:f.plotZ});b=z(x,b,!0);for(p=0;p<this.data.length;p++)f=this.data[p],v=b[p],f.plotX=v.x,f.plotY=v.y,f.plotZ=v.z}})(A);(function(b){function y(b){var e=b.apply(this,[].slice.call(arguments,1));this.chart.is3d&&this.chart.is3d()&&
+(e.stroke=this.options.edgeColor||e.fill,e["stroke-width"]=q(this.options.edgeWidth,1));return e}var z=b.addEvent,u=b.perspective,q=b.pick,v=b.Series,x=b.seriesTypes,f=b.svg,w=b.wrap;w(x.column.prototype,"translate",function(b){b.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&this.translate3dShapes()});w(b.Series.prototype,"alignDataLabel",function(b){arguments[3].outside3dPlot=arguments[1].outside3dPlot;b.apply(this,[].slice.call(arguments,1))});w(b.Series.prototype,"justifyDataLabel",
+function(b){return arguments[2].outside3dPlot?!1:b.apply(this,[].slice.call(arguments,1))});x.column.prototype.translate3dPoints=function(){};x.column.prototype.translate3dShapes=function(){var b=this,e=b.chart,a=b.options,f=a.depth||25,r=(a.stacking?a.stack||0:b.index)*(f+(a.groupZPadding||1)),k=b.borderWidth%2?.5:0;e.inverted&&!b.yAxis.reversed&&(k*=-1);!1!==a.grouping&&(r=0);r+=a.groupZPadding||1;b.data.forEach(function(a){a.outside3dPlot=null;if(null!==a.y){var d=a.shapeArgs,c=a.tooltipPos,l;
+[["x","width"],["y","height"]].forEach(function(c){l=d[c[0]]-k;0>l&&(d[c[1]]+=d[c[0]]+k,d[c[0]]=-k,l=0);l+d[c[1]]>b[c[0]+"Axis"].len&&0!==d[c[1]]&&(d[c[1]]=b[c[0]+"Axis"].len-d[c[0]]);if(0!==d[c[1]]&&(d[c[0]]>=b[c[0]+"Axis"].len||d[c[0]]+d[c[1]]<=k)){for(var e in d)d[e]=0;a.outside3dPlot=!0}});"rect"===a.shapeType&&(a.shapeType="cuboid");d.z=r;d.depth=f;d.insidePlotArea=!0;c=u([{x:c[0],y:c[1],z:r}],e,!0)[0];a.tooltipPos=[c.x,c.y]}});b.z=r};w(x.column.prototype,"animate",function(b){if(this.chart.is3d()){var e=
+arguments[1],a=this.yAxis,l=this,p=this.yAxis.reversed;f&&(e?l.data.forEach(function(b){null!==b.y&&(b.height=b.shapeArgs.height,b.shapey=b.shapeArgs.y,b.shapeArgs.height=1,p||(b.shapeArgs.y=b.stackY?b.plotY+a.translate(b.stackY):b.plotY+(b.negative?-b.height:b.height)))}):(l.data.forEach(function(a){null!==a.y&&(a.shapeArgs.height=a.height,a.shapeArgs.y=a.shapey,a.graphic&&a.graphic.animate(a.shapeArgs,l.options.animation))}),this.drawDataLabels(),l.animate=null))}else b.apply(this,[].slice.call(arguments,
+1))});w(x.column.prototype,"plotGroup",function(b,e,a,f,r,k){this.chart.is3d()&&k&&!this[e]&&(this.chart.columnGroup||(this.chart.columnGroup=this.chart.renderer.g("columnGroup").add(k)),this[e]=this.chart.columnGroup,this.chart.columnGroup.attr(this.getPlotBox()),this[e].survive=!0);return b.apply(this,Array.prototype.slice.call(arguments,1))});w(x.column.prototype,"setVisible",function(b,e){var a=this,f;a.chart.is3d()&&a.data.forEach(function(b){f=(b.visible=b.options.visible=e=void 0===e?!b.visible:
+e)?"visible":"hidden";a.options.data[a.data.indexOf(b)]=b.options;b.graphic&&b.graphic.attr({visibility:f})});b.apply(this,Array.prototype.slice.call(arguments,1))});x.column.prototype.handle3dGrouping=!0;z(v,"afterInit",function(){if(this.chart.is3d()&&this.handle3dGrouping){var b=this.options,e=b.grouping,a=b.stacking,f=q(this.yAxis.options.reversedStacks,!0),r=0;if(void 0===e||e){e=this.chart.retrieveStacks(a);r=b.stack||0;for(a=0;a<e[r].series.length&&e[r].series[a]!==this;a++);r=10*(e.totalStacks-
+e[r].position)+(f?a:-a);this.xAxis.reversed||(r=10*e.totalStacks-r)}b.zIndex=r}});w(x.column.prototype,"pointAttribs",y);x.columnrange&&(w(x.columnrange.prototype,"pointAttribs",y),x.columnrange.prototype.plotGroup=x.column.prototype.plotGroup,x.columnrange.prototype.setVisible=x.column.prototype.setVisible);w(v.prototype,"alignDataLabel",function(b){if(this.chart.is3d()&&this instanceof x.column){var e=arguments,a=e[4],e=e[1],f={x:a.x,y:a.y,z:this.z},f=u([f],this.chart,!0)[0];a.x=f.x;a.y=e.outside3dPlot?
+-9E9:f.y}b.apply(this,[].slice.call(arguments,1))});w(b.StackItem.prototype,"getStackBox",function(f,e){var a=f.apply(this,[].slice.call(arguments,1));if(e.is3d()){var l={x:a.x,y:a.y,z:0},l=b.perspective([l],e,!0)[0];a.x=l.x;a.y=l.y}return a})})(A);(function(b){var y=b.deg2rad,z=b.pick,u=b.seriesTypes,q=b.svg;b=b.wrap;b(u.pie.prototype,"translate",function(b){b.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var q=this,f=q.options,v=f.depth||0,p=q.chart.options.chart.options3d,e=p.alpha,
+a=p.beta,l=f.stacking?(f.stack||0)*v:q._i*v,l=l+v/2;!1!==f.grouping&&(l=0);q.data.forEach(function(b){var k=b.shapeArgs;b.shapeType="arc3d";k.z=l;k.depth=.75*v;k.alpha=e;k.beta=a;k.center=q.center;k=(k.end+k.start)/2;b.slicedTranslation={translateX:Math.round(Math.cos(k)*f.slicedOffset*Math.cos(e*y)),translateY:Math.round(Math.sin(k)*f.slicedOffset*Math.cos(e*y))}})}});b(u.pie.prototype.pointClass.prototype,"haloPath",function(b){var q=arguments;return this.series.chart.is3d()?[]:b.call(this,q[1])});
+b(u.pie.prototype,"pointAttribs",function(b,q,f){b=b.call(this,q,f);f=this.options;this.chart.is3d()&&!this.chart.styledMode&&(b.stroke=f.edgeColor||q.color||this.color,b["stroke-width"]=z(f.edgeWidth,1));return b});b(u.pie.prototype,"drawDataLabels",function(b){if(this.chart.is3d()){var q=this.chart.options.chart.options3d;this.data.forEach(function(b){var f=b.shapeArgs,p=f.r,e=(f.start+f.end)/2;b=b.labelPosition;var a=b.connectorPosition,l=-p*(1-Math.cos((f.alpha||q.alpha)*y))*Math.sin(e),r=p*(Math.cos((f.beta||
+q.beta)*y)-1)*Math.cos(e);[b.natural,a.breakAt,a.touchingSliceAt].forEach(function(a){a.x+=r;a.y+=l})})}b.apply(this,[].slice.call(arguments,1))});b(u.pie.prototype,"addPoint",function(b){b.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&this.update(this.userOptions,!0)});b(u.pie.prototype,"animate",function(b){if(this.chart.is3d()){var u=arguments[1],f=this.options.animation,v=this.center,p=this.group,e=this.markerGroup;q&&(!0===f&&(f={}),u?(p.oldtranslateX=p.translateX,p.oldtranslateY=
+p.translateY,u={translateX:v[0],translateY:v[1],scaleX:.001,scaleY:.001},p.attr(u),e&&(e.attrSetters=p.attrSetters,e.attr(u))):(u={translateX:p.oldtranslateX,translateY:p.oldtranslateY,scaleX:1,scaleY:1},p.animate(u,f),e&&e.animate(u,f),this.animate=null))}else b.apply(this,[].slice.call(arguments,1))})})(A);(function(b){var y=b.Point,z=b.seriesType,u=b.seriesTypes;z("scatter3d","scatter",{tooltip:{pointFormat:"x: \x3cb\x3e{point.x}\x3c/b\x3e\x3cbr/\x3ey: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3ez: \x3cb\x3e{point.z}\x3c/b\x3e\x3cbr/\x3e"}},
+{pointAttribs:function(q){var v=u.scatter.prototype.pointAttribs.apply(this,arguments);this.chart.is3d()&&q&&(v.zIndex=b.pointCameraDistance(q,this.chart));return v},axisTypes:["xAxis","yAxis","zAxis"],pointArrayMap:["x","y","z"],parallelArrays:["x","y","z"],directTouch:!0},{applyOptions:function(){y.prototype.applyOptions.apply(this,arguments);void 0===this.z&&(this.z=0);return this}})})(A);(function(b){var y=b.addEvent,z=b.Axis,u=b.SVGRenderer,q=b.VMLRenderer;q&&(b.setOptions({animate:!1}),q.prototype.face3d=
+u.prototype.face3d,q.prototype.polyhedron=u.prototype.polyhedron,q.prototype.elements3d=u.prototype.elements3d,q.prototype.element3d=u.prototype.element3d,q.prototype.cuboid=u.prototype.cuboid,q.prototype.cuboidPath=u.prototype.cuboidPath,q.prototype.toLinePath=u.prototype.toLinePath,q.prototype.toLineSegments=u.prototype.toLineSegments,q.prototype.arc3d=function(b){b=u.prototype.arc3d.call(this,b);b.css({zIndex:b.zIndex});return b},b.VMLRenderer.prototype.arc3dPath=b.SVGRenderer.prototype.arc3dPath,
+y(z,"render",function(){this.sideFrame&&(this.sideFrame.css({zIndex:0}),this.sideFrame.front.attr({fill:this.sideFrame.color}));this.bottomFrame&&(this.bottomFrame.css({zIndex:1}),this.bottomFrame.front.attr({fill:this.bottomFrame.color}));this.backFrame&&(this.backFrame.css({zIndex:0}),this.backFrame.front.attr({fill:this.backFrame.color}))}))})(A)});
+//# sourceMappingURL=highcharts-3d.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+
+ (c) 2009-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(y){"object"===typeof module&&module.exports?module.exports=y:"function"===typeof define&&define.amd?define(function(){return y}):y("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(y){(function(a){function v(a,d){this.init(a,d)}var w=a.CenteredSeriesMixin,e=a.extend,m=a.merge,u=a.splat;e(v.prototype,{coll:"pane",init:function(a,d){this.chart=d;this.background=[];d.pane.push(this);this.setOptions(a)},setOptions:function(a){this.options=m(this.defaultOptions,this.chart.angular?
+{background:{}}:void 0,a)},render:function(){var a=this.options,d=this.options.background,c=this.chart.renderer;this.group||(this.group=c.g("pane-group").attr({zIndex:a.zIndex||0}).add());this.updateCenter();if(d)for(d=u(d),a=Math.max(d.length,this.background.length||0),c=0;c<a;c++)d[c]&&this.axis?this.renderBackground(m(this.defaultBackgroundOptions,d[c]),c):this.background[c]&&(this.background[c]=this.background[c].destroy(),this.background.splice(c,1))},renderBackground:function(a,d){var c="animate",
+n={"class":"highcharts-pane "+(a.className||"")};this.chart.styledMode||e(n,{fill:a.backgroundColor,stroke:a.borderColor,"stroke-width":a.borderWidth});this.background[d]||(this.background[d]=this.chart.renderer.path().add(this.group),c="attr");this.background[d][c]({d:this.axis.getPlotBandPath(a.from,a.to,a)}).attr(n)},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{shape:"circle",borderWidth:1,borderColor:"#cccccc",backgroundColor:{linearGradient:{x1:0,y1:0,
+x2:0,y2:1},stops:[[0,"#ffffff"],[1,"#e6e6e6"]]},from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"},updateCenter:function(a){this.center=(a||this.axis||{}).center=w.getCenter.call(this)},update:function(a,d){m(!0,this.options,a);this.setOptions(this.options);this.render();this.chart.axes.forEach(function(c){c.pane===this&&(c.pane=null,c.update({},d))},this)}});a.Pane=v})(y);(function(a){var v=a.addEvent,w=a.Axis,e=a.extend,m=a.merge,u=a.noop,q=a.pick,d=a.pInt,c=a.Tick,n=a.wrap,
+b=a.correctFloat,l,k,h=w.prototype,f=c.prototype;a.radialAxisExtended||(a.radialAxisExtended=!0,l={getOffset:u,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:u,setCategories:u,setTitle:u},k={defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2},defaultRadialXOptions:{gridLineWidth:1,
+labels:{align:null,distance:15,x:0,y:null,style:{textOverflow:"none"}},maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(b){b=this.options=m(this.defaultOptions,this.defaultRadialOptions,b);b.plotBands||(b.plotBands=[]);a.fireEvent(this,"afterSetOptions")},getOffset:function(){h.getOffset.call(this);this.chart.axisOffset[this.side]=0},
+getLinePath:function(b,c){b=this.center;var g=this.chart,p=q(c,b[2]/2-this.offset);this.isCircular||void 0!==c?(c=this.chart.renderer.symbols.arc(this.left+b[0],this.top+b[1],p,p,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0}),c.xBounds=[this.left+b[0]],c.yBounds=[this.top+b[1]-p]):(c=this.postTranslate(this.angleRad,p),c=["M",b[0]+g.plotLeft,b[1]+g.plotTop,"L",c.x,c.y]);return c},setAxisTranslation:function(){h.setAxisTranslation.call(this);this.center&&(this.transA=this.isCircular?
+(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0)},beforeSetTickPositions:function(){if(this.autoConnect=this.isCircular&&void 0===q(this.userMax,this.options.max)&&b(this.endAngleRad-this.startAngleRad)===b(2*Math.PI))this.max+=this.categories&&1||this.pointRange||this.closestPointRange||0},setAxisSize:function(){h.setAxisSize.call(this);this.isRadial&&(this.pane.updateCenter(this),
+this.isCircular&&(this.sector=this.endAngleRad-this.startAngleRad),this.len=this.width=this.height=this.center[2]*q(this.sector,1)/2)},getPosition:function(b,c){return this.postTranslate(this.isCircular?this.translate(b):this.angleRad,q(this.isCircular?c:this.translate(b),this.center[2]/2)-this.offset)},postTranslate:function(b,c){var g=this.chart,p=this.center;b=this.startAngleRad+b;return{x:g.plotLeft+p[0]+Math.cos(b)*c,y:g.plotTop+p[1]+Math.sin(b)*c}},getPlotBandPath:function(b,c,g){var p=this.center,
+n=this.startAngleRad,l=p[2]/2,a=[q(g.outerRadius,"100%"),g.innerRadius,q(g.thickness,10)],t=Math.min(this.offset,0),h=/%$/,k,f=this.isCircular;"polygon"===this.options.gridLineInterpolation?p=this.getPlotLinePath(b).concat(this.getPlotLinePath(c,!0)):(b=Math.max(b,this.min),c=Math.min(c,this.max),f||(a[0]=this.translate(b),a[1]=this.translate(c)),a=a.map(function(g){h.test(g)&&(g=d(g,10)*l/100);return g}),"circle"!==g.shape&&f?(b=n+this.translate(b),c=n+this.translate(c)):(b=-Math.PI/2,c=1.5*Math.PI,
+k=!0),a[0]-=t,a[2]-=t,p=this.chart.renderer.symbols.arc(this.left+p[0],this.top+p[1],a[0],a[0],{start:Math.min(b,c),end:Math.max(b,c),innerR:q(a[1],a[0]-a[2]),open:k}));return p},getPlotLinePath:function(b,c){var g=this,p=g.center,n=g.chart,d=g.getPosition(b),a,l,t;g.isCircular?t=["M",p[0]+n.plotLeft,p[1]+n.plotTop,"L",d.x,d.y]:"circle"===g.options.gridLineInterpolation?(b=g.translate(b),t=g.getLinePath(0,b)):(n.xAxis.forEach(function(b){b.pane===g.pane&&(a=b)}),t=[],b=g.translate(b),p=a.tickPositions,
+a.autoConnect&&(p=p.concat([p[0]])),c&&(p=[].concat(p).reverse()),p.forEach(function(g,c){l=a.getPosition(g,b);t.push(c?"L":"M",l.x,l.y)}));return t},getTitlePosition:function(){var b=this.center,c=this.chart,g=this.options.title;return{x:c.plotLeft+b[0]+(g.x||0),y:c.plotTop+b[1]-{high:.5,middle:.25,low:0}[g.align]*b[2]+(g.y||0)}}},v(w,"init",function(b){var c=this.chart,g=c.angular,p=c.polar,n=this.isXAxis,d=g&&n,a,h=c.options;b=b.userOptions.pane||0;b=this.pane=c.pane&&c.pane[b];if(g){if(e(this,
+d?l:k),a=!n)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else p&&(e(this,k),this.defaultRadialOptions=(a=n)?this.defaultRadialXOptions:m(this.defaultYAxisOptions,this.defaultRadialYOptions));g||p?(this.isRadial=!0,c.inverted=!1,h.chart.zoomType=null):this.isRadial=!1;b&&a&&(b.axis=this);this.isCircular=a}),v(w,"afterInit",function(){var b=this.chart,c=this.options,g=this.pane,p=g&&g.options;b.angular&&this.isXAxis||!g||!b.angular&&!b.polar||(this.angleRad=(c.angle||0)*Math.PI/180,this.startAngleRad=
+(p.startAngle-90)*Math.PI/180,this.endAngleRad=(q(p.endAngle,p.startAngle+360)-90)*Math.PI/180,this.offset=c.offset||0)}),n(h,"autoLabelAlign",function(b){if(!this.isRadial)return b.apply(this,[].slice.call(arguments,1))}),v(c,"afterGetPosition",function(b){this.axis.getPosition&&e(b.pos,this.axis.getPosition(this.pos))}),v(c,"afterGetLabelPosition",function(b){var c=this.axis,g=this.label,p=c.options.labels,n=p.y,d,a=20,l=p.align,h=(c.translate(this.pos)+c.startAngleRad+Math.PI/2)/Math.PI*180%360;
+c.isRadial&&(d=c.getPosition(this.pos,c.center[2]/2+q(p.distance,-25)),"auto"===p.rotation?g.attr({rotation:h}):null===n&&(n=c.chart.renderer.fontMetrics(g.styles&&g.styles.fontSize).b-g.getBBox().height/2),null===l&&(c.isCircular?(this.label.getBBox().width>c.len*c.tickInterval/(c.max-c.min)&&(a=0),l=h>a&&h<180-a?"left":h>180+a&&h<360-a?"right":"center"):l="center",g.attr({align:l})),b.pos.x=d.x+p.x,b.pos.y=d.y+n)}),n(f,"getMarkPath",function(b,c,g,p,n,d,a){var l=this.axis;l.isRadial?(b=l.getPosition(this.pos,
+l.center[2]/2+p),c=["M",c,g,"L",b.x,b.y]):c=b.call(this,c,g,p,n,d,a);return c}))})(y);(function(a){var v=a.pick,w=a.extend,e=a.isArray,m=a.defined,u=a.seriesType,q=a.seriesTypes,d=a.Series.prototype,c=a.Point.prototype;u("arearange","area",{lineWidth:1,threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{series.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},trackByArea:!0,dataLabels:{align:null,verticalAlign:null,
+xLow:0,xHigh:0,yLow:0,yHigh:0}},{pointArrayMap:["low","high"],toYData:function(c){return[c.low,c.high]},pointValKey:"low",deferTranslatePolar:!0,highToXY:function(c){var b=this.chart,n=this.xAxis.postTranslate(c.rectPlotX,this.yAxis.len-c.plotHigh);c.plotHighX=n.x-b.plotLeft;c.plotHigh=n.y-b.plotTop;c.plotLowX=c.plotX},translate:function(){var c=this,b=c.yAxis,d=!!c.modifyValue;q.area.prototype.translate.apply(c);c.points.forEach(function(a){var n=a.low,l=a.high,k=a.plotY;null===l||null===n?(a.isNull=
+!0,a.plotY=null):(a.plotLow=k,a.plotHigh=b.translate(d?c.modifyValue(l,a):l,0,1,0,1),d&&(a.yBottom=a.plotHigh))});this.chart.polar&&this.points.forEach(function(b){c.highToXY(b);b.tooltipPos=[(b.plotHighX+b.plotLowX)/2,(b.plotHigh+b.plotLow)/2]})},getGraphPath:function(c){var b=[],a=[],d,n=q.area.prototype.getGraphPath,f,r,t;t=this.options;var g=this.chart.polar&&!1!==t.connectEnds,p=t.connectNulls,x=t.step;c=c||this.points;for(d=c.length;d--;)f=c[d],f.isNull||g||p||c[d+1]&&!c[d+1].isNull||a.push({plotX:f.plotX,
+plotY:f.plotY,doCurve:!1}),r={polarPlotY:f.polarPlotY,rectPlotX:f.rectPlotX,yBottom:f.yBottom,plotX:v(f.plotHighX,f.plotX),plotY:f.plotHigh,isNull:f.isNull},a.push(r),b.push(r),f.isNull||g||p||c[d-1]&&!c[d-1].isNull||a.push({plotX:f.plotX,plotY:f.plotY,doCurve:!1});c=n.call(this,c);x&&(!0===x&&(x="left"),t.step={left:"right",center:"center",right:"left"}[x]);b=n.call(this,b);a=n.call(this,a);t.step=x;t=[].concat(c,b);this.chart.polar||"M"!==a[0]||(a[0]="L");this.graphPath=t;this.areaPath=c.concat(a);
+t.isArea=!0;t.xMap=c.xMap;this.areaPath.xMap=c.xMap;return t},drawDataLabels:function(){var c=this.points,b=c.length,a,k=[],h=this.options.dataLabels,f,r,t=this.chart.inverted,g,p;e(h)?1<h.length?(g=h[0],p=h[1]):(g=h[0],p={enabled:!1}):(g=w({},h),g.x=h.xHigh,g.y=h.yHigh,p=w({},h),p.x=h.xLow,p.y=h.yLow);if(g.enabled||this._hasPointLabels){for(a=b;a--;)if(f=c[a])r=g.inside?f.plotHigh<f.plotLow:f.plotHigh>f.plotLow,f.y=f.high,f._plotY=f.plotY,f.plotY=f.plotHigh,k[a]=f.dataLabel,f.dataLabel=f.dataLabelUpper,
+f.below=r,t?g.align||(g.align=r?"right":"left"):g.verticalAlign||(g.verticalAlign=r?"top":"bottom");this.options.dataLabels=g;d.drawDataLabels&&d.drawDataLabels.apply(this,arguments);for(a=b;a--;)if(f=c[a])f.dataLabelUpper=f.dataLabel,f.dataLabel=k[a],delete f.dataLabels,f.y=f.low,f.plotY=f._plotY}if(p.enabled||this._hasPointLabels){for(a=b;a--;)if(f=c[a])r=p.inside?f.plotHigh<f.plotLow:f.plotHigh>f.plotLow,f.below=!r,t?p.align||(p.align=r?"left":"right"):p.verticalAlign||(p.verticalAlign=r?"bottom":
+"top");this.options.dataLabels=p;d.drawDataLabels&&d.drawDataLabels.apply(this,arguments)}if(g.enabled)for(a=b;a--;)if(f=c[a])f.dataLabels=[f.dataLabel,f.dataLabelUpper].filter(function(b){return!!b});this.options.dataLabels=h},alignDataLabel:function(){q.column.prototype.alignDataLabel.apply(this,arguments)},drawPoints:function(){var c=this.points.length,b,l;d.drawPoints.apply(this,arguments);for(l=0;l<c;)b=this.points[l],b.origProps={plotY:b.plotY,plotX:b.plotX,isInside:b.isInside,negative:b.negative,
+zone:b.zone,y:b.y},b.lowerGraphic=b.graphic,b.graphic=b.upperGraphic,b.plotY=b.plotHigh,m(b.plotHighX)&&(b.plotX=b.plotHighX),b.y=b.high,b.negative=b.high<(this.options.threshold||0),b.zone=this.zones.length&&b.getZone(),this.chart.polar||(b.isInside=b.isTopInside=void 0!==b.plotY&&0<=b.plotY&&b.plotY<=this.yAxis.len&&0<=b.plotX&&b.plotX<=this.xAxis.len),l++;d.drawPoints.apply(this,arguments);for(l=0;l<c;)b=this.points[l],b.upperGraphic=b.graphic,b.graphic=b.lowerGraphic,a.extend(b,b.origProps),delete b.origProps,
+l++},setStackedPoints:a.noop},{setState:function(){var a=this.state,b=this.series,d=b.chart.polar;m(this.plotHigh)||(this.plotHigh=b.yAxis.toPixels(this.high,!0));m(this.plotLow)||(this.plotLow=this.plotY=b.yAxis.toPixels(this.low,!0));b.stateMarkerGraphic&&(b.lowerStateMarkerGraphic=b.stateMarkerGraphic,b.stateMarkerGraphic=b.upperStateMarkerGraphic);this.graphic=this.upperGraphic;this.plotY=this.plotHigh;d&&(this.plotX=this.plotHighX);c.setState.apply(this,arguments);this.state=a;this.plotY=this.plotLow;
+this.graphic=this.lowerGraphic;d&&(this.plotX=this.plotLowX);b.stateMarkerGraphic&&(b.upperStateMarkerGraphic=b.stateMarkerGraphic,b.stateMarkerGraphic=b.lowerStateMarkerGraphic,b.lowerStateMarkerGraphic=void 0);c.setState.apply(this,arguments)},haloPath:function(){var a=this.series.chart.polar,b=[];this.plotY=this.plotLow;a&&(this.plotX=this.plotLowX);this.isInside&&(b=c.haloPath.apply(this,arguments));this.plotY=this.plotHigh;a&&(this.plotX=this.plotHighX);this.isTopInside&&(b=b.concat(c.haloPath.apply(this,
+arguments)));return b},destroyElements:function(){["lowerGraphic","upperGraphic"].forEach(function(c){this[c]&&(this[c]=this[c].destroy())},this);this.graphic=null;return c.destroyElements.apply(this,arguments)}})})(y);(function(a){var v=a.seriesType;v("areasplinerange","arearange",null,{getPointSpline:a.seriesTypes.spline.prototype.getPointSpline})})(y);(function(a){var v=a.defaultPlotOptions,w=a.merge,e=a.noop,m=a.pick,u=a.seriesType,q=a.seriesTypes.column.prototype;u("columnrange","arearange",
+w(v.column,v.arearange,{pointRange:null,marker:null,states:{hover:{halo:!1}}}),{translate:function(){var a=this,c=a.yAxis,n=a.xAxis,b=n.startAngleRad,l,k=a.chart,h=a.xAxis.isRadial,f=Math.max(k.chartWidth,k.chartHeight)+999,r;q.translate.apply(a);a.points.forEach(function(d){var g=d.shapeArgs,p=a.options.minPointLength,x,t;d.plotHigh=r=Math.min(Math.max(-f,c.translate(d.high,0,1,0,1)),f);d.plotLow=Math.min(Math.max(-f,d.plotY),f);t=r;x=m(d.rectPlotY,d.plotY)-r;Math.abs(x)<p?(p-=x,x+=p,t-=p/2):0>x&&
+(x*=-1,t-=x);h?(l=d.barX+b,d.shapeType="path",d.shapeArgs={d:a.polarArc(t+x,t,l,l+d.pointWidth)}):(g.height=x,g.y=t,d.tooltipPos=k.inverted?[c.len+c.pos-k.plotLeft-t-x/2,n.len+n.pos-k.plotTop-g.x-g.width/2,x]:[n.left-k.plotLeft+g.x+g.width/2,c.pos-k.plotTop+t+x/2,x])})},directTouch:!0,trackerGroups:["group","dataLabelsGroup"],drawGraph:e,getSymbol:e,crispCol:function(){return q.crispCol.apply(this,arguments)},drawPoints:function(){return q.drawPoints.apply(this,arguments)},drawTracker:function(){return q.drawTracker.apply(this,
+arguments)},getColumnMetrics:function(){return q.getColumnMetrics.apply(this,arguments)},pointAttribs:function(){return q.pointAttribs.apply(this,arguments)},animate:function(){return q.animate.apply(this,arguments)},polarArc:function(){return q.polarArc.apply(this,arguments)},translate3dPoints:function(){return q.translate3dPoints.apply(this,arguments)},translate3dShapes:function(){return q.translate3dShapes.apply(this,arguments)}},{setState:q.pointClass.prototype.setState})})(y);(function(a){var v=
+a.pick,w=a.seriesType,e=a.seriesTypes.column.prototype;w("columnpyramid","column",{},{translate:function(){var a=this,u=a.chart,q=a.options,d=a.dense=2>a.closestPointRange*a.xAxis.transA,d=a.borderWidth=v(q.borderWidth,d?0:1),c=a.yAxis,n=q.threshold,b=a.translatedThreshold=c.getThreshold(n),l=v(q.minPointLength,5),k=a.getColumnMetrics(),h=k.width,f=a.barW=Math.max(h,1+2*d),r=a.pointXOffset=k.offset;u.inverted&&(b-=.5);q.pointPadding&&(f=Math.ceil(f));e.translate.apply(a);a.points.forEach(function(d){var g=
+v(d.yBottom,b),p=999+Math.abs(g),k=Math.min(Math.max(-p,d.plotY),c.len+p),p=d.plotX+r,t=f/2,e=Math.min(k,g),g=Math.max(k,g)-e,m,z,A,w,C,D;d.barX=p;d.pointWidth=h;d.tooltipPos=u.inverted?[c.len+c.pos-u.plotLeft-k,a.xAxis.len-p-t,g]:[p+t,k+c.pos-u.plotTop,g];k=n+(d.total||d.y);"percent"===q.stacking&&(k=n+(0>d.y)?-100:100);k=c.toPixels(k,!0);m=u.plotHeight-k-(u.plotHeight-b);z=t*(e-k)/m;A=t*(e+g-k)/m;m=p-z+t;z=p+z+t;w=p+A+t;A=p-A+t;C=e-l;D=e+g;0>d.y&&(C=e,D=e+g+l);u.inverted&&(w=u.plotWidth-e,m=k-(u.plotWidth-
+b),z=t*(k-w)/m,A=t*(k-(w-g))/m,m=p+t+z,z=m-2*z,w=p-A+t,A=p+A+t,C=e,D=e+g-l,0>d.y&&(D=e+g+l));d.shapeType="path";d.shapeArgs={x:m,y:C,width:z-m,height:g,d:["M",m,C,"L",z,C,w,D,A,D,"Z"]}})}})})(y);(function(a){var v=a.isNumber,w=a.merge,e=a.pick,m=a.pInt,u=a.Series,q=a.seriesType,d=a.TrackerMixin;q("gauge","line",{dataLabels:{enabled:!0,defer:!1,y:15,borderRadius:3,crop:!1,verticalAlign:"top",zIndex:2,borderWidth:1,borderColor:"#cccccc"},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1},{angular:!0,
+directTouch:!0,drawGraph:a.noop,fixedBox:!0,forceDL:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],translate:function(){var c=this.yAxis,a=this.options,b=c.center;this.generatePoints();this.points.forEach(function(d){var n=w(a.dial,d.dial),h=m(e(n.radius,80))*b[2]/200,f=m(e(n.baseLength,70))*h/100,l=m(e(n.rearLength,10))*h/100,t=n.baseWidth||3,g=n.topWidth||1,p=a.overshoot,x=c.startAngleRad+c.translate(d.y,null,null,null,!0);v(p)?(p=p/180*Math.PI,x=Math.max(c.startAngleRad-p,Math.min(c.endAngleRad+
+p,x))):!1===a.wrap&&(x=Math.max(c.startAngleRad,Math.min(c.endAngleRad,x)));x=180*x/Math.PI;d.shapeType="path";d.shapeArgs={d:n.path||["M",-l,-t/2,"L",f,-t/2,h,-g/2,h,g/2,f,t/2,-l,t/2,"z"],translateX:b[0],translateY:b[1],rotation:x};d.plotX=b[0];d.plotY=b[1]})},drawPoints:function(){var c=this,a=c.chart,b=c.yAxis.center,d=c.pivot,k=c.options,h=k.pivot,f=a.renderer;c.points.forEach(function(b){var d=b.graphic,g=b.shapeArgs,p=g.d,n=w(k.dial,b.dial);d?(d.animate(g),g.d=p):(b.graphic=f[b.shapeType](g).attr({rotation:g.rotation,
+zIndex:1}).addClass("highcharts-dial").add(c.group),a.styledMode||b.graphic.attr({stroke:n.borderColor||"none","stroke-width":n.borderWidth||0,fill:n.backgroundColor||"#000000"}))});d?d.animate({translateX:b[0],translateY:b[1]}):(c.pivot=f.circle(0,0,e(h.radius,5)).attr({zIndex:2}).addClass("highcharts-pivot").translate(b[0],b[1]).add(c.group),a.styledMode||c.pivot.attr({"stroke-width":h.borderWidth||0,stroke:h.borderColor||"#cccccc",fill:h.backgroundColor||"#000000"}))},animate:function(c){var a=
+this;c||(a.points.forEach(function(b){var c=b.graphic;c&&(c.attr({rotation:180*a.yAxis.startAngleRad/Math.PI}),c.animate({rotation:b.shapeArgs.rotation},a.options.animation))}),a.animate=null)},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);u.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:function(c,a){u.prototype.setData.call(this,c,!1);this.processData();this.generatePoints();e(a,
+!0)&&this.chart.redraw()},drawTracker:d&&d.drawTrackerPoint},{setState:function(c){this.state=c}})})(y);(function(a){var v=a.noop,w=a.pick,e=a.seriesType,m=a.seriesTypes;e("boxplot","column",{threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eMaximum: {point.high}\x3cbr/\x3eUpper quartile: {point.q3}\x3cbr/\x3eMedian: {point.median}\x3cbr/\x3eLower quartile: {point.q1}\x3cbr/\x3eMinimum: {point.low}\x3cbr/\x3e'},
+whiskerLength:"50%",fillColor:"#ffffff",lineWidth:1,medianWidth:2,whiskerWidth:2},{pointArrayMap:["low","q1","median","q3","high"],toYData:function(a){return[a.low,a.q1,a.median,a.q3,a.high]},pointValKey:"high",pointAttribs:function(){return{}},drawDataLabels:v,translate:function(){var a=this.yAxis,e=this.pointArrayMap;m.column.prototype.translate.apply(this);this.points.forEach(function(d){e.forEach(function(c){null!==d[c]&&(d[c+"Plot"]=a.translate(d[c],0,1,0,1))})})},drawPoints:function(){var a=
+this,e=a.options,d=a.chart,c=d.renderer,n,b,l,k,h,f,m=0,t,g,p,x,E=!1!==a.doQuartiles,F,B=a.options.whiskerLength;a.points.forEach(function(r){var q=r.graphic,u=q?"animate":"attr",z=r.shapeArgs,v={},H={},J={},y={},G=r.color||a.color;void 0!==r.plotY&&(t=z.width,g=Math.floor(z.x),p=g+t,x=Math.round(t/2),n=Math.floor(E?r.q1Plot:r.lowPlot),b=Math.floor(E?r.q3Plot:r.lowPlot),l=Math.floor(r.highPlot),k=Math.floor(r.lowPlot),q||(r.graphic=q=c.g("point").add(a.group),r.stem=c.path().addClass("highcharts-boxplot-stem").add(q),
+B&&(r.whiskers=c.path().addClass("highcharts-boxplot-whisker").add(q)),E&&(r.box=c.path(void 0).addClass("highcharts-boxplot-box").add(q)),r.medianShape=c.path(void 0).addClass("highcharts-boxplot-median").add(q)),d.styledMode||(H.stroke=r.stemColor||e.stemColor||G,H["stroke-width"]=w(r.stemWidth,e.stemWidth,e.lineWidth),H.dashstyle=r.stemDashStyle||e.stemDashStyle,r.stem.attr(H),B&&(J.stroke=r.whiskerColor||e.whiskerColor||G,J["stroke-width"]=w(r.whiskerWidth,e.whiskerWidth,e.lineWidth),r.whiskers.attr(J)),
+E&&(v.fill=r.fillColor||e.fillColor||G,v.stroke=e.lineColor||G,v["stroke-width"]=e.lineWidth||0,r.box.attr(v)),y.stroke=r.medianColor||e.medianColor||G,y["stroke-width"]=w(r.medianWidth,e.medianWidth,e.lineWidth),r.medianShape.attr(y)),f=r.stem.strokeWidth()%2/2,m=g+x+f,r.stem[u]({d:["M",m,b,"L",m,l,"M",m,n,"L",m,k]}),E&&(f=r.box.strokeWidth()%2/2,n=Math.floor(n)+f,b=Math.floor(b)+f,g+=f,p+=f,r.box[u]({d:["M",g,b,"L",g,n,"L",p,n,"L",p,b,"L",g,b,"z"]})),B&&(f=r.whiskers.strokeWidth()%2/2,l+=f,k+=f,
+F=/%$/.test(B)?x*parseFloat(B)/100:B/2,r.whiskers[u]({d:["M",m-F,l,"L",m+F,l,"M",m-F,k,"L",m+F,k]})),h=Math.round(r.medianPlot),f=r.medianShape.strokeWidth()%2/2,h+=f,r.medianShape[u]({d:["M",g,h,"L",p,h]}))})},setStackedPoints:v})})(y);(function(a){var v=a.noop,w=a.seriesType,e=a.seriesTypes;w("errorbar","boxplot",{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},
+whiskerWidth:null},{type:"errorbar",pointArrayMap:["low","high"],toYData:function(a){return[a.low,a.high]},pointValKey:"high",doQuartiles:!1,drawDataLabels:e.arearange?function(){var a=this.pointValKey;e.arearange.prototype.drawDataLabels.call(this);this.data.forEach(function(e){e.y=e[a]})}:v,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||e.column.prototype.getColumnMetrics.call(this)}})})(y);(function(a){var v=a.correctFloat,w=a.isNumber,e=a.pick,m=a.Point,
+u=a.Series,q=a.seriesType,d=a.seriesTypes;q("waterfall","column",{dataLabels:{inside:!0},lineWidth:1,lineColor:"#333333",dashStyle:"Dot",borderColor:"#333333",states:{hover:{lineWidthPlus:0}}},{pointValKey:"y",showLine:!0,generatePoints:function(){var c=this.options.threshold,a,b,l,k;d.column.prototype.generatePoints.apply(this);l=0;for(b=this.points.length;l<b;l++)a=this.points[l],k=this.processedYData[l],a.isSum?a.y=v(k):a.isIntermediateSum&&(a.y=v(k-c),c=k)},translate:function(){var c=this.options,
+a=this.yAxis,b,l,k,h,f,r,t,g,p,m,q=e(c.minPointLength,5),u=q/2,B=c.threshold,z=c.stacking,v;d.column.prototype.translate.apply(this);g=p=B;l=this.points;b=0;for(c=l.length;b<c;b++)k=l[b],t=this.processedYData[b],h=k.shapeArgs,f=z&&a.stacks[(this.negStacks&&t<B?"-":"")+this.stackKey],v=this.getStackIndicator(v,k.x,this.index),m=e(f&&f[k.x].points[v.key],[0,t]),r=Math.max(g,g+k.y)+m[0],h.y=a.translate(r,0,1,0,1),k.isSum?(h.y=a.translate(m[1],0,1,0,1),h.height=Math.min(a.translate(m[0],0,1,0,1),a.len)-
+h.y):k.isIntermediateSum?(h.y=a.translate(m[1],0,1,0,1),h.height=Math.min(a.translate(p,0,1,0,1),a.len)-h.y,p=m[1]):(h.height=0<t?a.translate(g,0,1,0,1)-h.y:a.translate(g,0,1,0,1)-a.translate(g-t,0,1,0,1),g+=f&&f[k.x]?f[k.x].total:t,k.below=g<e(B,0)),0>h.height&&(h.y+=h.height,h.height*=-1),k.plotY=h.y=Math.round(h.y)-this.borderWidth%2/2,h.height=Math.max(Math.round(h.height),.001),k.yBottom=h.y+h.height,h.height<=q&&!k.isNull?(h.height=q,h.y-=u,k.plotY=h.y,k.minPointLengthOffset=0>k.y?-u:u):(k.isNull&&
+(h.width=0),k.minPointLengthOffset=0),h=k.plotY+(k.negative?h.height:0),this.chart.inverted?k.tooltipPos[0]=a.len-h:k.tooltipPos[1]=h},processData:function(a){var c=this.yData,b=this.options.data,d,k=c.length,h,f,r,e,g,p;f=h=r=e=this.options.threshold||0;for(p=0;p<k;p++)g=c[p],d=b&&b[p]?b[p]:{},"sum"===g||d.isSum?c[p]=v(f):"intermediateSum"===g||d.isIntermediateSum?c[p]=v(h):(f+=g,h+=g),r=Math.min(f,r),e=Math.max(f,e);u.prototype.processData.call(this,a);this.options.stacking||(this.dataMin=r,this.dataMax=
+e)},toYData:function(a){return a.isSum?0===a.x?null:"sum":a.isIntermediateSum?0===a.x?null:"intermediateSum":a.y},pointAttribs:function(a,n){var b=this.options.upColor;b&&!a.options.color&&(a.color=0<a.y?b:null);a=d.column.prototype.pointAttribs.call(this,a,n);delete a.dashstyle;return a},getGraphPath:function(){return["M",0,0]},getCrispPath:function(){var a=this.data,d=a.length,b=this.graph.strokeWidth()+this.borderWidth,b=Math.round(b)%2/2,l=this.xAxis.reversed,k=this.yAxis.reversed,h=[],f,r,e;
+for(e=1;e<d;e++){r=a[e].shapeArgs;f=a[e-1].shapeArgs;r=["M",f.x+(l?0:f.width),f.y+a[e-1].minPointLengthOffset+b,"L",r.x+(l?f.width:0),f.y+a[e-1].minPointLengthOffset+b];if(0>a[e-1].y&&!k||0<a[e-1].y&&k)r[2]+=f.height,r[5]+=f.height;h=h.concat(r)}return h},drawGraph:function(){u.prototype.drawGraph.call(this);this.graph.attr({d:this.getCrispPath()})},setStackedPoints:function(){var a=this.options,d,b;u.prototype.setStackedPoints.apply(this,arguments);d=this.stackedYData?this.stackedYData.length:0;
+for(b=1;b<d;b++)a.data[b].isSum||a.data[b].isIntermediateSum||(this.stackedYData[b]+=this.stackedYData[b-1])},getExtremes:function(){if(this.options.stacking)return u.prototype.getExtremes.apply(this,arguments)}},{getClassName:function(){var a=m.prototype.getClassName.call(this);this.isSum?a+=" highcharts-sum":this.isIntermediateSum&&(a+=" highcharts-intermediate-sum");return a},isValid:function(){return w(this.y,!0)||this.isSum||this.isIntermediateSum}})})(y);(function(a){var v=a.Series,w=a.seriesType,
+e=a.seriesTypes;w("polygon","scatter",{marker:{enabled:!1,states:{hover:{enabled:!1}}},stickyTracking:!1,tooltip:{followPointer:!0,pointFormat:""},trackByArea:!0},{type:"polygon",getGraphPath:function(){for(var a=v.prototype.getGraphPath.call(this),e=a.length+1;e--;)(e===a.length||"M"===a[e])&&0<e&&a.splice(e,0,"z");return this.areaPath=a},drawGraph:function(){this.options.fillColor=this.color;e.area.prototype.drawGraph.call(this)},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawTracker:v.prototype.drawTracker,
+setStackedPoints:a.noop})})(y);(function(a){var v=a.Series,w=a.Legend,e=a.Chart,m=a.addEvent,u=a.wrap,q=a.color,d=a.isNumber,c=a.numberFormat,n=a.objectEach,b=a.merge,l=a.noop,k=a.pick,h=a.stableSort,f=a.setOptions,r=a.arrayMin,t=a.arrayMax;f({legend:{bubbleLegend:{borderColor:void 0,borderWidth:2,className:void 0,color:void 0,connectorClassName:void 0,connectorColor:void 0,connectorDistance:60,connectorWidth:1,enabled:!1,labels:{className:void 0,allowOverlap:!1,format:"",formatter:void 0,align:"right",
+style:{fontSize:10,color:void 0},x:0,y:0},maxSize:60,minSize:10,legendIndex:0,ranges:{value:void 0,borderColor:void 0,color:void 0,connectorColor:void 0},sizeBy:"area",sizeByAbsoluteValue:!1,zIndex:1,zThreshold:0}}});a.BubbleLegend=function(a,b){this.init(a,b)};a.BubbleLegend.prototype={init:function(a,b){this.options=a;this.visible=!0;this.chart=b.chart;this.legend=b},setState:l,addToLegend:function(a){a.splice(this.options.legendIndex,0,this)},drawLegendSymbol:function(a){var b=this.chart,c=this.options,
+g=k(a.options.itemDistance,20),f,e=c.ranges;f=c.connectorDistance;this.fontMetrics=b.renderer.fontMetrics(c.labels.style.fontSize.toString()+"px");e&&e.length&&d(e[0].value)?(h(e,function(a,b){return b.value-a.value}),this.ranges=e,this.setOptions(),this.render(),b=this.getMaxLabelSize(),e=this.ranges[0].radius,a=2*e,f=f-e+b.width,f=0<f?f:0,this.maxLabel=b,this.movementX="left"===c.labels.align?f:0,this.legendItemWidth=a+f+g,this.legendItemHeight=a+this.fontMetrics.h/2):a.options.bubbleLegend.autoRanges=
+!0},setOptions:function(){var a=this,c=a.ranges,d=a.options,h=a.chart.series[d.seriesIndex],f=a.legend.baseline,e={"z-index":d.zIndex,"stroke-width":d.borderWidth},l={"z-index":d.zIndex,"stroke-width":d.connectorWidth},n=a.getLabelStyles(),r=h.options.marker.fillOpacity,m=a.chart.styledMode;c.forEach(function(g,p){m||(e.stroke=k(g.borderColor,d.borderColor,h.color),e.fill=k(g.color,d.color,1!==r?q(h.color).setOpacity(r).get("rgba"):h.color),l.stroke=k(g.connectorColor,d.connectorColor,h.color));c[p].radius=
+a.getRangeRadius(g.value);c[p]=b(c[p],{center:c[0].radius-c[p].radius+f});m||b(!0,c[p],{bubbleStyle:b(!1,e),connectorStyle:b(!1,l),labelStyle:n})})},getLabelStyles:function(){var a=this.options,c={},d="left"===a.labels.align,h=this.legend.options.rtl;n(a.labels.style,function(a,b){"color"!==b&&"fontSize"!==b&&"z-index"!==b&&(c[b]=a)});return b(!1,c,{"font-size":a.labels.style.fontSize,fill:k(a.labels.style.color,"#000000"),"z-index":a.zIndex,align:h||d?"right":"left"})},getRangeRadius:function(a){var b=
+this.options;return this.chart.series[this.options.seriesIndex].getRadius.call(this,b.ranges[b.ranges.length-1].value,b.ranges[0].value,b.minSize,b.maxSize,a)},render:function(){var a=this,b=a.chart.renderer,c=a.options.zThreshold;a.symbols||(a.symbols={connectors:[],bubbleItems:[],labels:[]});a.legendSymbol=b.g("bubble-legend");a.legendItem=b.g("bubble-legend-item");a.legendSymbol.translateX=0;a.legendSymbol.translateY=0;a.ranges.forEach(function(b){b.value>=c&&a.renderRange(b)});a.legendSymbol.add(a.legendItem);
+a.legendItem.add(a.legendGroup);a.hideOverlappingLabels()},renderRange:function(a){var b=this.options,c=b.labels,d=this.chart.renderer,g=this.symbols,h=g.labels,f=a.center,e=Math.abs(a.radius),k=b.connectorDistance,l=c.align,r=c.style.fontSize,k=this.legend.options.rtl||"left"===l?-k:k,c=b.connectorWidth,n=this.ranges[0].radius,m=f-e-b.borderWidth/2+c/2,t,r=r/2-(this.fontMetrics.h-r)/2,q=d.styledMode;"center"===l&&(k=0,b.connectorDistance=0,a.labelStyle.align="center");l=m+b.labels.y;t=n+k+b.labels.x;
+g.bubbleItems.push(d.circle(n,f+((m%1?1:.5)-(c%2?0:.5)),e).attr(q?{}:a.bubbleStyle).addClass((q?"highcharts-color-"+this.options.seriesIndex+" ":"")+"highcharts-bubble-legend-symbol "+(b.className||"")).add(this.legendSymbol));g.connectors.push(d.path(d.crispLine(["M",n,m,"L",n+k,m],b.connectorWidth)).attr(q?{}:a.connectorStyle).addClass((q?"highcharts-color-"+this.options.seriesIndex+" ":"")+"highcharts-bubble-legend-connectors "+(b.connectorClassName||"")).add(this.legendSymbol));a=d.text(this.formatLabel(a),
+t,l+r).attr(q?{}:a.labelStyle).addClass("highcharts-bubble-legend-labels "+(b.labels.className||"")).add(this.legendSymbol);h.push(a);a.placed=!0;a.alignAttr={x:t,y:l+r}},getMaxLabelSize:function(){var a,b;this.symbols.labels.forEach(function(c){b=c.getBBox(!0);a=a?b.width>a.width?b:a:b});return a||{}},formatLabel:function(b){var d=this.options,g=d.labels.formatter;return(d=d.labels.format)?a.format(d,b):g?g.call(b):c(b.value,1)},hideOverlappingLabels:function(){var a=this.chart,b=this.symbols;!this.options.labels.allowOverlap&&
+b&&(a.hideOverlappingLabels(b.labels),b.labels.forEach(function(a,c){a.newOpacity?a.newOpacity!==a.oldOpacity&&b.connectors[c].show():b.connectors[c].hide()}))},getRanges:function(){var a=this.legend.bubbleLegend,c,h=a.options.ranges,f,e=Number.MAX_VALUE,l=-Number.MAX_VALUE;a.chart.series.forEach(function(a){a.isBubble&&!a.ignoreSeries&&(f=a.zData.filter(d),f.length&&(e=k(a.options.zMin,Math.min(e,Math.max(r(f),!1===a.options.displayNegative?a.options.zThreshold:-Number.MAX_VALUE))),l=k(a.options.zMax,
+Math.max(l,t(f)))))});c=e===l?[{value:l}]:[{value:e},{value:(e+l)/2},{value:l,autoRanges:!0}];h.length&&h[0].radius&&c.reverse();c.forEach(function(a,d){h&&h[d]&&(c[d]=b(!1,h[d],a))});return c},predictBubbleSizes:function(){var a=this.chart,b=this.fontMetrics,c=a.legend.options,d="horizontal"===c.layout,h=d?a.legend.lastLineHeight:0,f=a.plotSizeX,e=a.plotSizeY,l=a.series[this.options.seriesIndex],a=Math.ceil(l.minPxSize),k=Math.ceil(l.maxPxSize),l=l.options.maxSize,r=Math.min(e,f);if(c.floating||
+!/%$/.test(l))b=k;else if(l=parseFloat(l),b=(r+h-b.h/2)*l/100/(l/100+1),d&&e-b>=f||!d&&f-b>=e)b=k;return[a,Math.ceil(b)]},updateRanges:function(a,b){var c=this.legend.options.bubbleLegend;c.minSize=a;c.maxSize=b;c.ranges=this.getRanges()},correctSizes:function(){var a=this.legend,b=this.chart.series[this.options.seriesIndex];1<Math.abs(Math.ceil(b.maxPxSize)-this.options.maxSize)&&(this.updateRanges(this.options.minSize,b.maxPxSize),a.render())}};m(a.Legend,"afterGetAllItems",function(b){var c=this.bubbleLegend,
+d=this.options,g=d.bubbleLegend,h=this.chart.getVisibleBubbleSeriesIndex();c&&c.ranges&&c.ranges.length&&(g.ranges.length&&(g.autoRanges=g.ranges[0].autoRanges?!0:!1),this.destroyItem(c));0<=h&&d.enabled&&g.enabled&&(g.seriesIndex=h,this.bubbleLegend=new a.BubbleLegend(g,this),this.bubbleLegend.addToLegend(b.allItems))});e.prototype.getVisibleBubbleSeriesIndex=function(){for(var a=this.series,b=0;b<a.length;){if(a[b]&&a[b].isBubble&&a[b].visible&&a[b].zData.length)return b;b++}return-1};w.prototype.getLinesHeights=
+function(){var a=this.allItems,b=[],c,d=a.length,h,f=0;for(h=0;h<d;h++)if(a[h].legendItemHeight&&(a[h].itemHeight=a[h].legendItemHeight),a[h]===a[d-1]||a[h+1]&&a[h]._legendItemPos[1]!==a[h+1]._legendItemPos[1]){b.push({height:0});c=b[b.length-1];for(f;f<=h;f++)a[f].itemHeight>c.height&&(c.height=a[f].itemHeight);c.step=h}return b};w.prototype.retranslateItems=function(a){var b,c,d,h=this.options.rtl,f=0;this.allItems.forEach(function(g,e){b=g.legendGroup.translateX;c=g._legendItemPos[1];if((d=g.movementX)||
+h&&g.ranges)d=h?b-g.options.maxSize/2:b+d,g.legendGroup.attr({translateX:d});e>a[f].step&&f++;g.legendGroup.attr({translateY:Math.round(c+a[f].height/2)});g._legendItemPos[1]=c+a[f].height/2})};m(v,"legendItemClick",function(){var a=this.chart,b=this.visible,c=this.chart.legend;c&&c.bubbleLegend&&(this.visible=!b,this.ignoreSeries=b,a=0<=a.getVisibleBubbleSeriesIndex(),c.bubbleLegend.visible!==a&&(c.update({bubbleLegend:{enabled:a}}),c.bubbleLegend.visible=a),this.visible=b)});u(e.prototype,"drawChartBox",
+function(a,b,c){var d=this.legend,h=0<=this.getVisibleBubbleSeriesIndex(),f;d&&d.options.enabled&&d.bubbleLegend&&d.options.bubbleLegend.autoRanges&&h?(f=d.bubbleLegend.options,h=d.bubbleLegend.predictBubbleSizes(),d.bubbleLegend.updateRanges(h[0],h[1]),f.placed||(d.group.placed=!1,d.allItems.forEach(function(a){a.legendGroup.translateY=null})),d.render(),this.getMargins(),this.axes.forEach(function(a){a.render();f.placed||(a.setScale(),a.updateNames(),n(a.ticks,function(a){a.isNew=!0;a.isNewLabel=
+!0}))}),f.placed=!0,this.getMargins(),a.call(this,b,c),d.bubbleLegend.correctSizes(),d.retranslateItems(d.getLinesHeights())):(a.call(this,b,c),d&&d.options.enabled&&d.bubbleLegend&&(d.render(),d.retranslateItems(d.getLinesHeights())))})})(y);(function(a){var v=a.arrayMax,w=a.arrayMin,e=a.Axis,m=a.color,u=a.isNumber,q=a.noop,d=a.pick,c=a.pInt,n=a.Point,b=a.Series,l=a.seriesType,k=a.seriesTypes;l("bubble","scatter",{dataLabels:{formatter:function(){return this.point.z},inside:!0,verticalAlign:"middle"},
+animationLimit:250,marker:{lineColor:null,lineWidth:1,fillOpacity:.5,radius:null,states:{hover:{radiusPlus:0}},symbol:"circle"},minSize:8,maxSize:"20%",softThreshold:!1,states:{hover:{halo:{size:5}}},tooltip:{pointFormat:"({point.x}, {point.y}), Size: {point.z}"},turboThreshold:0,zThreshold:0,zoneAxis:"z"},{pointArrayMap:["y","z"],parallelArrays:["x","y","z"],trackerGroups:["group","dataLabelsGroup"],specialGroup:"group",bubblePadding:!0,zoneAxis:"z",directTouch:!0,isBubble:!0,pointAttribs:function(a,
+c){var d=this.options.marker.fillOpacity;a=b.prototype.pointAttribs.call(this,a,c);1!==d&&(a.fill=m(a.fill).setOpacity(d).get("rgba"));return a},getRadii:function(a,b,c){var d,h=this.zData,f=c.minPxSize,e=c.maxPxSize,l=[],k;d=0;for(c=h.length;d<c;d++)k=h[d],l.push(this.getRadius(a,b,f,e,k));this.radii=l},getRadius:function(a,b,c,d,e){var h=this.options,f="width"!==h.sizeBy,g=h.zThreshold,l=b-a;h.sizeByAbsoluteValue&&null!==e&&(e=Math.abs(e-g),l=Math.max(b-g,Math.abs(a-g)),a=0);u(e)?e<a?c=c/2-1:(a=
+0<l?(e-a)/l:.5,f&&0<=a&&(a=Math.sqrt(a)),c=Math.ceil(c+a*(d-c))/2):c=null;return c},animate:function(a){!a&&this.points.length<this.options.animationLimit&&(this.points.forEach(function(a){var b=a.graphic,c;b&&b.width&&(c={x:b.x,y:b.y,width:b.width,height:b.height},b.attr({x:a.plotX,y:a.plotY,width:1,height:1}),b.animate(c,this.options.animation))},this),this.animate=null)},translate:function(){var b,c=this.data,d,e,g=this.radii;k.scatter.prototype.translate.call(this);for(b=c.length;b--;)d=c[b],
+e=g?g[b]:0,u(e)&&e>=this.minPxSize/2?(d.marker=a.extend(d.marker,{radius:e,width:2*e,height:2*e}),d.dlBox={x:d.plotX-e,y:d.plotY-e,width:2*e,height:2*e}):d.shapeArgs=d.plotY=d.dlBox=void 0},alignDataLabel:k.column.prototype.alignDataLabel,buildKDTree:q,applyZones:q},{haloPath:function(a){return n.prototype.haloPath.call(this,0===a?0:(this.marker?this.marker.radius||0:0)+a)},ttBelow:!1});e.prototype.beforePadding=function(){var b=this,e=this.len,l=this.chart,k=0,g=e,n=this.isXAxis,m=n?"xData":"yData",
+q=this.min,y={},B=Math.min(l.plotWidth,l.plotHeight),z=Number.MAX_VALUE,A=-Number.MAX_VALUE,I=this.max-q,C=e/I,D=[];this.series.forEach(function(e){var f=e.options;!e.bubblePadding||!e.visible&&l.options.chart.ignoreHiddenSeries||(b.allowZoomOutside=!0,D.push(e),n&&(["minSize","maxSize"].forEach(function(a){var b=f[a],d=/%$/.test(b),b=c(b);y[a]=d?B*b/100:b}),e.minPxSize=y.minSize,e.maxPxSize=Math.max(y.maxSize,y.minSize),e=e.zData.filter(a.isNumber),e.length&&(z=d(f.zMin,Math.min(z,Math.max(w(e),
+!1===f.displayNegative?f.zThreshold:-Number.MAX_VALUE))),A=d(f.zMax,Math.max(A,v(e))))))});D.forEach(function(a){var c=a[m],d=c.length,e;n&&a.getRadii(z,A,a);if(0<I)for(;d--;)u(c[d])&&b.dataMin<=c[d]&&c[d]<=b.dataMax&&(e=a.radii[d],k=Math.min((c[d]-q)*C-e,k),g=Math.max((c[d]-q)*C+e,g))});D.length&&0<I&&!this.isLog&&(g-=e,C*=(e+Math.max(0,k)-Math.min(g,e))/e,[["min","userMin",k],["max","userMax",g]].forEach(function(a){void 0===d(b.options[a[0]],b[a[1]])&&(b[a[0]]+=a[2]/C)}))}})(y);(function(a){var v=
+a.seriesType,w=a.defined;v("packedbubble","bubble",{minSize:"10%",maxSize:"100%",sizeBy:"radius",zoneAxis:"y",tooltip:{pointFormat:"Value: {point.value}"}},{pointArrayMap:["value"],pointValKey:"value",isCartesian:!1,axisTypes:[],accumulateAllPoints:function(a){var e=a.chart,u=[],q,d;for(q=0;q<e.series.length;q++)if(a=e.series[q],a.visible||!e.options.chart.ignoreHiddenSeries)for(d=0;d<a.yData.length;d++)u.push([null,null,a.yData[d],a.index,d]);return u},translate:function(){var e,m=this.chart,u=this.data,
+q=this.index,d,c,n;this.processedXData=this.xData;this.generatePoints();w(m.allDataPoints)||(m.allDataPoints=this.accumulateAllPoints(this),this.getPointRadius());e=this.placeBubbles(m.allDataPoints);for(n=0;n<e.length;n++)e[n][3]===q&&(d=u[e[n][4]],c=e[n][2],d.plotX=e[n][0]-m.plotLeft+m.diffX,d.plotY=e[n][1]-m.plotTop+m.diffY,d.marker=a.extend(d.marker,{radius:c,width:2*c,height:2*c}))},checkOverlap:function(a,m){var e=a[0]-m[0],q=a[1]-m[1];return-.001>Math.sqrt(e*e+q*q)-Math.abs(a[2]+m[2])},positionBubble:function(a,
+m,u){var e=Math.sqrt,d=Math.asin,c=Math.acos,n=Math.pow,b=Math.abs,e=e(n(a[0]-m[0],2)+n(a[1]-m[1],2)),c=c((n(e,2)+n(u[2]+m[2],2)-n(u[2]+a[2],2))/(2*(u[2]+m[2])*e)),d=d(b(a[0]-m[0])/e);a=(0>a[1]-m[1]?0:Math.PI)+c+d*(0>(a[0]-m[0])*(a[1]-m[1])?1:-1);return[m[0]+(m[2]+u[2])*Math.sin(a),m[1]-(m[2]+u[2])*Math.cos(a),u[2],u[3],u[4]]},placeBubbles:function(a){var e=this.checkOverlap,u=this.positionBubble,q=[],d=1,c=0,n=0,b,l;b=a.sort(function(a,b){return b[2]-a[2]});if(!b.length)return[];if(2>b.length)return[0,
+0,b[0][0],b[0][1],b[0][2]];q.push([[0,0,b[0][2],b[0][3],b[0][4]]]);q.push([[0,0-b[1][2]-b[0][2],b[1][2],b[1][3],b[1][4]]]);for(l=2;l<b.length;l++)b[l][2]=b[l][2]||1,a=u(q[d][c],q[d-1][n],b[l]),e(a,q[d][0])?(q.push([]),n=0,q[d+1].push(u(q[d][c],q[d][0],b[l])),d++,c=0):1<d&&q[d-1][n+1]&&e(a,q[d-1][n+1])?(n++,q[d].push(u(q[d][c],q[d-1][n],b[l])),c++):(c++,q[d].push(a));this.chart.stages=q;this.chart.rawPositions=[].concat.apply([],q);this.resizeRadius();return this.chart.rawPositions},resizeRadius:function(){var a=
+this.chart,m=a.rawPositions,u=Math.min,q=Math.max,d=a.plotLeft,c=a.plotTop,n=a.plotHeight,b=a.plotWidth,l,k,h,f,r,t;l=h=Number.POSITIVE_INFINITY;k=f=Number.NEGATIVE_INFINITY;for(t=0;t<m.length;t++)r=m[t][2],l=u(l,m[t][0]-r),k=q(k,m[t][0]+r),h=u(h,m[t][1]-r),f=q(f,m[t][1]+r);t=[k-l,f-h];u=u.apply([],[(b-d)/t[0],(n-c)/t[1]]);if(1e-10<Math.abs(u-1)){for(t=0;t<m.length;t++)m[t][2]*=u;this.placeBubbles(m)}else a.diffY=n/2+c-h-(f-h)/2,a.diffX=b/2+d-l-(k-l)/2},getPointRadius:function(){var a=this,m=a.chart,
+u=a.options,q=Math.min(m.plotWidth,m.plotHeight),d={},c=[],n=m.allDataPoints,b,l,k,h;["minSize","maxSize"].forEach(function(a){var b=parseInt(u[a],10),c=/%$/.test(b);d[a]=c?q*b/100:b});m.minRadius=b=d.minSize;m.maxRadius=l=d.maxSize;(n||[]).forEach(function(d,e){k=d[2];h=a.getRadius(b,l,b,l,k);0===k&&(h=null);n[e][2]=h;c.push(h)});this.radii=c},alignDataLabel:a.Series.prototype.alignDataLabel});a.addEvent(a.seriesTypes.packedbubble,"updatedData",function(){var a=this;this.chart.series.forEach(function(e){e.type===
+a.type&&(e.isDirty=!0)})});a.addEvent(a.Chart,"beforeRedraw",function(){this.allDataPoints&&delete this.allDataPoints})})(y);(function(a){var v=a.pick,w=a.Series,e=a.seriesTypes,m=a.wrap,u=w.prototype,q=a.Pointer.prototype;a.polarExtended||(a.polarExtended=!0,u.searchPointByAngle=function(a){var c=this.chart,d=this.xAxis.pane.center;return this.searchKDTree({clientX:180+-180/Math.PI*Math.atan2(a.chartX-d[0]-c.plotLeft,a.chartY-d[1]-c.plotTop)})},u.getConnectors=function(a,c,e,b){var d,k,h,f,n,m,g,
+p;k=b?1:0;d=0<=c&&c<=a.length-1?c:0>c?a.length-1+c:0;c=0>d-1?a.length-(1+k):d-1;k=d+1>a.length-1?k:d+1;h=a[c];k=a[k];f=h.plotX;h=h.plotY;n=k.plotX;m=k.plotY;k=a[d].plotX;d=a[d].plotY;f=(1.5*k+f)/2.5;h=(1.5*d+h)/2.5;n=(1.5*k+n)/2.5;g=(1.5*d+m)/2.5;m=Math.sqrt(Math.pow(f-k,2)+Math.pow(h-d,2));p=Math.sqrt(Math.pow(n-k,2)+Math.pow(g-d,2));f=Math.atan2(h-d,f-k);g=Math.PI/2+(f+Math.atan2(g-d,n-k))/2;Math.abs(f-g)>Math.PI/2&&(g-=Math.PI);f=k+Math.cos(g)*m;h=d+Math.sin(g)*m;n=k+Math.cos(Math.PI+g)*p;g=d+
+Math.sin(Math.PI+g)*p;k={rightContX:n,rightContY:g,leftContX:f,leftContY:h,plotX:k,plotY:d};e&&(k.prevPointCont=this.getConnectors(a,c,!1,b));return k},m(u,"buildKDTree",function(a){this.chart.polar&&(this.kdByAngle?this.searchPoint=this.searchPointByAngle:this.options.findNearestPointBy="xy");a.apply(this)}),u.toXY=function(a){var c,d=this.chart,b=a.plotX;c=a.plotY;a.rectPlotX=b;a.rectPlotY=c;c=this.xAxis.postTranslate(a.plotX,this.yAxis.len-c);a.plotX=a.polarPlotX=c.x-d.plotLeft;a.plotY=a.polarPlotY=
+c.y-d.plotTop;this.kdByAngle?(d=(b/Math.PI*180+this.xAxis.pane.options.startAngle)%360,0>d&&(d+=360),a.clientX=d):a.clientX=a.plotX},e.spline&&(m(e.spline.prototype,"getPointSpline",function(a,c,e,b){this.chart.polar?b?(a=this.getConnectors(c,b,!0,this.connectEnds),a=["C",a.prevPointCont.rightContX,a.prevPointCont.rightContY,a.leftContX,a.leftContY,a.plotX,a.plotY]):a=["M",e.plotX,e.plotY]:a=a.call(this,c,e,b);return a}),e.areasplinerange&&(e.areasplinerange.prototype.getPointSpline=e.spline.prototype.getPointSpline)),
+a.addEvent(w,"afterTranslate",function(){var d=this.chart,c,e;if(d.polar){this.kdByAngle=d.tooltip&&d.tooltip.shared;if(!this.preventPostTranslate)for(c=this.points,e=c.length;e--;)this.toXY(c[e]);this.hasClipCircleSetter||(this.hasClipCircleSetter=!!a.addEvent(this,"afterRender",function(){var b;d.polar&&(b=this.yAxis.center,this.group.clip(d.renderer.clipCircle(b[0],b[1],b[2]/2)),this.setClip=a.noop)}))}},{order:2}),m(u,"getGraphPath",function(a,c){var d=this,b,e,k;if(this.chart.polar){c=c||this.points;
+for(b=0;b<c.length;b++)if(!c[b].isNull){e=b;break}!1!==this.options.connectEnds&&void 0!==e&&(this.connectEnds=!0,c.splice(c.length,0,c[e]),k=!0);c.forEach(function(a){void 0===a.polarPlotY&&d.toXY(a)})}b=a.apply(this,[].slice.call(arguments,1));k&&c.pop();return b}),w=function(a,c){var d=this.chart,b=this.options.animation,e=this.group,k=this.markerGroup,h=this.xAxis.center,f=d.plotLeft,m=d.plotTop;d.polar?d.renderer.isSVG&&(!0===b&&(b={}),c?(a={translateX:h[0]+f,translateY:h[1]+m,scaleX:.001,scaleY:.001},
+e.attr(a),k&&k.attr(a)):(a={translateX:f,translateY:m,scaleX:1,scaleY:1},e.animate(a,b),k&&k.animate(a,b),this.animate=null)):a.call(this,c)},m(u,"animate",w),e.column&&(e=e.column.prototype,e.polarArc=function(a,c,e,b){var d=this.xAxis.center,k=this.yAxis.len;return this.chart.renderer.symbols.arc(d[0],d[1],k-c,null,{start:e,end:b,innerR:k-v(a,k)})},m(e,"animate",w),m(e,"translate",function(a){var c=this.xAxis,d=c.startAngleRad,b,e,k;this.preventPostTranslate=!0;a.call(this);if(c.isRadial)for(b=
+this.points,k=b.length;k--;)e=b[k],a=e.barX+d,e.shapeType="path",e.shapeArgs={d:this.polarArc(e.yBottom,e.plotY,a,a+e.pointWidth)},this.toXY(e),e.tooltipPos=[e.plotX,e.plotY],e.ttBelow=e.plotY>c.center[1]}),m(e,"alignDataLabel",function(a,c,e,b,l,k){this.chart.polar?(a=c.rectPlotX/Math.PI*180,null===b.align&&(b.align=20<a&&160>a?"left":200<a&&340>a?"right":"center"),null===b.verticalAlign&&(b.verticalAlign=45>a||315<a?"bottom":135<a&&225>a?"top":"middle"),u.alignDataLabel.call(this,c,e,b,l,k)):a.call(this,
+c,e,b,l,k)})),m(q,"getCoordinates",function(a,c){var d=this.chart,b={xAxis:[],yAxis:[]};d.polar?d.axes.forEach(function(a){var e=a.isXAxis,h=a.center,f=c.chartX-h[0]-d.plotLeft,h=c.chartY-h[1]-d.plotTop;b[e?"xAxis":"yAxis"].push({axis:a,value:a.translate(e?Math.PI-Math.atan2(f,h):Math.sqrt(Math.pow(f,2)+Math.pow(h,2)),!0)})}):b=a.call(this,c);return b}),a.SVGRenderer.prototype.clipCircle=function(d,c,e){var b=a.uniqueKey(),l=this.createElement("clipPath").attr({id:b}).add(this.defs);d=this.circle(d,
+c,e).add(l);d.id=b;d.clipPath=l;return d},a.addEvent(a.Chart,"getAxes",function(){this.pane||(this.pane=[]);a.splat(this.options.pane).forEach(function(d){new a.Pane(d,this)},this)}),a.addEvent(a.Chart,"afterDrawChartBox",function(){this.pane.forEach(function(a){a.render()})}),m(a.Chart.prototype,"get",function(d,c){return a.find(this.pane,function(a){return a.options.id===c})||d.call(this,c)}))})(y)});
+//# sourceMappingURL=highcharts-more.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+ Highstock as a plugin for Highcharts
+
+ (c) 2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(H){"object"===typeof module&&module.exports?module.exports=H:"function"===typeof define&&define.amd?define(function(){return H}):H("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(H){(function(b){var D=b.addEvent,n=b.Axis,E=b.Chart,p=b.css,C=b.defined,G=b.extend,B=b.noop,w=b.pick,A=b.timeUnits,z=b.wrap;z(b.Series.prototype,"init",function(b){var e;b.apply(this,Array.prototype.slice.call(arguments,1));(e=this.xAxis)&&e.options.ordinal&&D(this,"updatedData",function(){delete e.ordinalIndex})});
+z(n.prototype,"getTimeTicks",function(b,e,d,l,a,f,u,m){var c=0,k,q,h={},y,r,x,g=[],t=-Number.MAX_VALUE,v=this.options.tickPixelInterval,K=this.chart.time;if(!this.options.ordinal&&!this.options.breaks||!f||3>f.length||void 0===d)return b.call(this,e,d,l,a);r=f.length;for(k=0;k<r;k++){x=k&&f[k-1]>l;f[k]<d&&(c=k);if(k===r-1||f[k+1]-f[k]>5*u||x){if(f[k]>t){for(q=b.call(this,e,f[c],f[k],a);q.length&&q[0]<=t;)q.shift();q.length&&(t=q[q.length-1]);g=g.concat(q)}c=k+1}if(x)break}b=q.info;if(m&&b.unitRange<=
+A.hour){k=g.length-1;for(c=1;c<k;c++)K.dateFormat("%d",g[c])!==K.dateFormat("%d",g[c-1])&&(h[g[c]]="day",y=!0);y&&(h[g[0]]="day");b.higherRanks=h}g.info=b;if(m&&C(v)){m=K=g.length;k=[];var I;for(y=[];m--;)c=this.translate(g[m]),I&&(y[m]=I-c),k[m]=I=c;y.sort();y=y[Math.floor(y.length/2)];y<.6*v&&(y=null);m=g[K-1]>l?K-1:K;for(I=void 0;m--;)c=k[m],l=Math.abs(I-c),I&&l<.8*v&&(null===y||l<.8*y)?(h[g[m]]&&!h[g[m+1]]?(l=m+1,I=c):l=m,g.splice(l,1)):I=c}return g});G(n.prototype,{beforeSetTickPositions:function(){var b,
+e=[],d,l=!1,a,f=this.getExtremes(),u=f.min,m=f.max,c,k=this.isXAxis&&!!this.options.breaks,f=this.options.ordinal,q=Number.MAX_VALUE,h=this.chart.options.chart.ignoreHiddenSeries,y;if(f||k){this.series.forEach(function(a,c){d=[];if(!(h&&!1===a.visible||!1===a.takeOrdinalPosition&&!k)&&(e=e.concat(a.processedXData),b=e.length,e.sort(function(g,a){return g-a}),q=Math.min(q,w(a.closestPointRange,q)),b)){for(c=0;c<b-1;)e[c]!==e[c+1]&&d.push(e[c+1]),c++;d[0]!==e[0]&&d.unshift(e[0]);e=d}a.isSeriesBoosting&&
+(y=!0)});y&&(e.length=0);b=e.length;if(2<b){a=e[1]-e[0];for(c=b-1;c--&&!l;)e[c+1]-e[c]!==a&&(l=!0);!this.options.keepOrdinalPadding&&(e[0]-u>a||m-e[e.length-1]>a)&&(l=!0)}else this.options.overscroll&&(2===b?q=e[1]-e[0]:1===b?(q=this.options.overscroll,e=[e[0],e[0]+q]):q=this.overscrollPointsRange);l?(this.options.overscroll&&(this.overscrollPointsRange=q,e=e.concat(this.getOverscrollPositions())),this.ordinalPositions=e,a=this.ordinal2lin(Math.max(u,e[0]),!0),c=Math.max(this.ordinal2lin(Math.min(m,
+e[e.length-1]),!0),1),this.ordinalSlope=m=(m-u)/(c-a),this.ordinalOffset=u-a*m):(this.overscrollPointsRange=w(this.closestPointRange,this.overscrollPointsRange),this.ordinalPositions=this.ordinalSlope=this.ordinalOffset=void 0)}this.isOrdinal=f&&l;this.groupIntervalFactor=null},val2lin:function(b,e){var d=this.ordinalPositions;if(d){var l=d.length,a,f;for(a=l;a--;)if(d[a]===b){f=a;break}for(a=l-1;a--;)if(b>d[a]||0===a){b=(b-d[a])/(d[a+1]-d[a]);f=a+b;break}e=e?f:this.ordinalSlope*(f||0)+this.ordinalOffset}else e=
+b;return e},lin2val:function(b,e){var d=this.ordinalPositions;if(d){var l=this.ordinalSlope,a=this.ordinalOffset,f=d.length-1,u;if(e)0>b?b=d[0]:b>f?b=d[f]:(f=Math.floor(b),u=b-f);else for(;f--;)if(e=l*f+a,b>=e){l=l*(f+1)+a;u=(b-e)/(l-e);break}return void 0!==u&&void 0!==d[f]?d[f]+(u?u*(d[f+1]-d[f]):0):b}return b},getExtendedPositions:function(){var b=this,e=b.chart,d=b.series[0].currentDataGrouping,l=b.ordinalIndex,a=d?d.count+d.unitName:"raw",f=b.options.overscroll,u=b.getExtremes(),m,c;l||(l=b.ordinalIndex=
+{});l[a]||(m={series:[],chart:e,getExtremes:function(){return{min:u.dataMin,max:u.dataMax+f}},options:{ordinal:!0},val2lin:n.prototype.val2lin,ordinal2lin:n.prototype.ordinal2lin},b.series.forEach(function(a){c={xAxis:m,xData:a.xData.slice(),chart:e,destroyGroupedData:B};c.xData=c.xData.concat(b.getOverscrollPositions());c.options={dataGrouping:d?{enabled:!0,forced:!0,approximation:"open",units:[[d.unitName,[d.count]]]}:{enabled:!1}};a.processData.apply(c);m.series.push(c)}),b.beforeSetTickPositions.apply(m),
+l[a]=m.ordinalPositions);return l[a]},getOverscrollPositions:function(){var F=this.options.overscroll,e=this.overscrollPointsRange,d=[],l=this.dataMax;if(b.defined(e))for(d.push(l);l<=this.dataMax+F;)l+=e,d.push(l);return d},getGroupIntervalFactor:function(b,e,d){var l;d=d.processedXData;var a=d.length,f=[];l=this.groupIntervalFactor;if(!l){for(l=0;l<a-1;l++)f[l]=d[l+1]-d[l];f.sort(function(a,f){return a-f});f=f[Math.floor(a/2)];b=Math.max(b,d[0]);e=Math.min(e,d[a-1]);this.groupIntervalFactor=l=a*
+f/(e-b)}return l},postProcessTickInterval:function(b){var e=this.ordinalSlope;return e?this.options.breaks?this.closestPointRange||b:b/(e/this.closestPointRange):b}});n.prototype.ordinal2lin=n.prototype.val2lin;z(E.prototype,"pan",function(b,e){var d=this.xAxis[0],l=d.options.overscroll,a=e.chartX,f=!1;if(d.options.ordinal&&d.series.length){var u=this.mouseDownX,m=d.getExtremes(),c=m.dataMax,k=m.min,q=m.max,h=this.hoverPoints,y=d.closestPointRange||d.overscrollPointsRange,u=(u-a)/(d.translationSlope*
+(d.ordinalSlope||y)),r={ordinalPositions:d.getExtendedPositions()},y=d.lin2val,x=d.val2lin,g;r.ordinalPositions?1<Math.abs(u)&&(h&&h.forEach(function(g){g.setState()}),0>u?(h=r,g=d.ordinalPositions?d:r):(h=d.ordinalPositions?d:r,g=r),r=g.ordinalPositions,c>r[r.length-1]&&r.push(c),this.fixedRange=q-k,u=d.toFixedRange(null,null,y.apply(h,[x.apply(h,[k,!0])+u,!0]),y.apply(g,[x.apply(g,[q,!0])+u,!0])),u.min>=Math.min(m.dataMin,k)&&u.max<=Math.max(c,q)+l&&d.setExtremes(u.min,u.max,!0,!1,{trigger:"pan"}),
+this.mouseDownX=a,p(this.container,{cursor:"move"})):f=!0}else f=!0;f&&(l&&(d.max=d.dataMax+l),b.apply(this,Array.prototype.slice.call(arguments,1)))});D(n,"foundExtremes",function(){this.isXAxis&&C(this.options.overscroll)&&this.max===this.dataMax&&(!this.chart.mouseIsDown||this.isInternal)&&(!this.eventArgs||this.eventArgs&&"navigator"!==this.eventArgs.trigger)&&(this.max+=this.options.overscroll,!this.isInternal&&C(this.userMin)&&(this.min+=this.options.overscroll))})})(H);(function(b){function D(){return Array.prototype.slice.call(arguments,
+1)}function n(b){b.apply(this);this.drawBreaks(this.xAxis,["x"]);this.drawBreaks(this.yAxis,p(this.pointArrayMap,["y"]))}var E=b.addEvent,p=b.pick,C=b.wrap,G=b.extend,B=b.isArray,w=b.fireEvent,A=b.Axis,z=b.Series;G(A.prototype,{isInBreak:function(b,e){var d=b.repeat||Infinity,l=b.from,a=b.to-b.from;e=e>=l?(e-l)%d:d-(l-e)%d;return b.inclusive?e<=a:e<a&&0!==e},isInAnyBreak:function(b,e){var d=this.options.breaks,l=d&&d.length,a,f,u;if(l){for(;l--;)this.isInBreak(d[l],b)&&(a=!0,f||(f=p(d[l].showPoints,
+this.isXAxis?!1:!0)));u=a&&e?a&&!f:a}return u}});E(A,"afterInit",function(){"function"===typeof this.setBreaks&&this.setBreaks(this.options.breaks,!1)});E(A,"afterSetTickPositions",function(){if(this.isBroken){var b=this.tickPositions,e=this.tickPositions.info,d=[],l;for(l=0;l<b.length;l++)this.isInAnyBreak(b[l])||d.push(b[l]);this.tickPositions=d;this.tickPositions.info=e}});E(A,"afterSetOptions",function(){this.isBroken&&(this.options.ordinal=!1)});A.prototype.setBreaks=function(b,e){function d(b){var f=
+b,c,k;for(k=0;k<a.breakArray.length;k++)if(c=a.breakArray[k],c.to<=b)f-=c.len;else if(c.from>=b)break;else if(a.isInBreak(c,b)){f-=b-c.from;break}return f}function l(b){var f,c;for(c=0;c<a.breakArray.length&&!(f=a.breakArray[c],f.from>=b);c++)f.to<b?b+=f.len:a.isInBreak(f,b)&&(b+=f.len);return b}var a=this,f=B(b)&&!!b.length;a.isDirty=a.isBroken!==f;a.isBroken=f;a.options.breaks=a.userOptions.breaks=b;a.forceRedraw=!0;f||a.val2lin!==d||(delete a.val2lin,delete a.lin2val);f&&(a.userOptions.ordinal=
+!1,a.val2lin=d,a.lin2val=l,a.setExtremes=function(a,b,c,f,q){if(this.isBroken){for(;this.isInAnyBreak(a);)a-=this.closestPointRange;for(;this.isInAnyBreak(b);)b-=this.closestPointRange}A.prototype.setExtremes.call(this,a,b,c,f,q)},a.setAxisTranslation=function(b){A.prototype.setAxisTranslation.call(this,b);this.unitLength=null;if(this.isBroken){b=a.options.breaks;var f=[],c=[],k=0,q,h,y=a.userMin||a.min,r=a.userMax||a.max,x=p(a.pointRangePadding,0),g,t;b.forEach(function(g){h=g.repeat||Infinity;a.isInBreak(g,
+y)&&(y+=g.to%h-y%h);a.isInBreak(g,r)&&(r-=r%h-g.from%h)});b.forEach(function(a){g=a.from;for(h=a.repeat||Infinity;g-h>y;)g-=h;for(;g<y;)g+=h;for(t=g;t<r;t+=h)f.push({value:t,move:"in"}),f.push({value:t+(a.to-a.from),move:"out",size:a.breakSize})});f.sort(function(g,a){return g.value===a.value?("in"===g.move?0:1)-("in"===a.move?0:1):g.value-a.value});q=0;g=y;f.forEach(function(a){q+="in"===a.move?1:-1;1===q&&"in"===a.move&&(g=a.value);0===q&&(c.push({from:g,to:a.value,len:a.value-g-(a.size||0)}),k+=
+a.value-g-(a.size||0))});a.breakArray=c;a.unitLength=r-y-k+x;w(a,"afterBreaks");a.staticScale?a.transA=a.staticScale:a.unitLength&&(a.transA*=(r-a.min+x)/a.unitLength);x&&(a.minPixelPadding=a.transA*a.minPointOffset);a.min=y;a.max=r}});p(e,!0)&&this.chart.redraw()};C(z.prototype,"generatePoints",function(b){b.apply(this,D(arguments));var e=this.xAxis,d=this.yAxis,l=this.points,a,f=l.length,u=this.options.connectNulls,m;if(e&&d&&(e.options.breaks||d.options.breaks))for(;f--;)a=l[f],m=null===a.y&&!1===
+u,m||!e.isInAnyBreak(a.x,!0)&&!d.isInAnyBreak(a.y,!0)||(l.splice(f,1),this.data[f]&&this.data[f].destroyElements())});b.Series.prototype.drawBreaks=function(b,e){var d=this,l=d.points,a,f,u,m;b&&e.forEach(function(c){a=b.breakArray||[];f=b.isXAxis?b.min:p(d.options.threshold,b.min);l.forEach(function(k){m=p(k["stack"+c.toUpperCase()],k[c]);a.forEach(function(a){u=!1;if(f<a.from&&m>a.to||f>a.from&&m<a.from)u="pointBreak";else if(f<a.from&&m>a.from&&m<a.to||f>a.from&&m>a.to&&m<a.from)u="pointInBreak";
+u&&w(b,u,{point:k,brk:a})})})})};b.Series.prototype.gappedPath=function(){var p=this.currentDataGrouping,e=p&&p.totalRange,p=this.options.gapSize,d=this.points.slice(),l=d.length-1,a=this.yAxis;if(p&&0<l)for("value"!==this.options.gapUnit&&(p*=this.closestPointRange),e&&e>p&&(p=e);l--;)d[l+1].x-d[l].x>p&&(e=(d[l].x+d[l+1].x)/2,d.splice(l+1,0,{isNull:!0,x:e}),this.options.stacking&&(e=a.stacks[this.stackKey][e]=new b.StackItem(a,a.options.stackLabels,!1,e,this.stack),e.total=0));return this.getGraphPath(d)};
+C(b.seriesTypes.column.prototype,"drawPoints",n);C(b.Series.prototype,"drawPoints",n)})(H);(function(b){var D=b.addEvent,n=b.arrayMax,E=b.arrayMin,p=b.Axis,C=b.defaultPlotOptions,G=b.defined,B=b.extend,w=b.format,A=b.isNumber,z=b.merge,F=b.pick,e=b.Point,d=b.Series,l=b.Tooltip,a=b.wrap,f=d.prototype,u=f.processData,m=f.generatePoints,c={approximation:"average",groupPixelWidth:2,dateTimeLabelFormats:{millisecond:["%A, %b %e, %H:%M:%S.%L","%A, %b %e, %H:%M:%S.%L","-%H:%M:%S.%L"],second:["%A, %b %e, %H:%M:%S",
+"%A, %b %e, %H:%M:%S","-%H:%M:%S"],minute:["%A, %b %e, %H:%M","%A, %b %e, %H:%M","-%H:%M"],hour:["%A, %b %e, %H:%M","%A, %b %e, %H:%M","-%H:%M"],day:["%A, %b %e, %Y","%A, %b %e","-%A, %b %e, %Y"],week:["Week from %A, %b %e, %Y","%A, %b %e","-%A, %b %e, %Y"],month:["%B %Y","%B","-%B %Y"],year:["%Y","%Y","-%Y"]}},k={line:{},spline:{},area:{},areaspline:{},column:{approximation:"sum",groupPixelWidth:10},arearange:{approximation:"range"},areasplinerange:{approximation:"range"},columnrange:{approximation:"range",
+groupPixelWidth:10},candlestick:{approximation:"ohlc",groupPixelWidth:10},ohlc:{approximation:"ohlc",groupPixelWidth:5}},q=b.defaultDataGroupingUnits=[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1]],["week",[1]],["month",[1,3,6]],["year",null]],h=b.approximations={sum:function(a){var c=a.length,b;if(!c&&a.hasNulls)b=null;else if(c)for(b=0;c--;)b+=a[c];return b},average:function(a){var c=a.length;a=h.sum(a);
+A(a)&&c&&(a/=c);return a},averages:function(){var a=[];[].forEach.call(arguments,function(c){a.push(h.average(c))});return void 0===a[0]?void 0:a},open:function(a){return a.length?a[0]:a.hasNulls?null:void 0},high:function(a){return a.length?n(a):a.hasNulls?null:void 0},low:function(a){return a.length?E(a):a.hasNulls?null:void 0},close:function(a){return a.length?a[a.length-1]:a.hasNulls?null:void 0},ohlc:function(a,c,b,g){a=h.open(a);c=h.high(c);b=h.low(b);g=h.close(g);if(A(a)||A(c)||A(b)||A(g))return[a,
+c,b,g]},range:function(a,c){a=h.low(a);c=h.high(c);if(A(a)||A(c))return[a,c];if(null===a&&null===c)return null}};f.groupData=function(a,b,f,g){var t=this,v=t.data,r=t.options.data,I=[],y=[],q=[],d=a.length,x,l,u=!!b,m=[];g="function"===typeof g?g:h[g]||k[t.type]&&h[k[t.type].approximation]||h[c.approximation];var e=t.pointArrayMap,p=e&&e.length,w=["x"].concat(e||["y"]),n=0,C=0,B,J;p?e.forEach(function(){m.push([])}):m.push([]);B=p||1;for(J=0;J<=d&&!(a[J]>=f[0]);J++);for(J;J<=d;J++){for(;void 0!==
+f[n+1]&&a[J]>=f[n+1]||J===d;){x=f[n];t.dataGroupInfo={start:C,length:m[0].length};l=g.apply(t,m);G(t.dataGroupInfo.options)||(t.dataGroupInfo.options=z(t.pointClass.prototype.optionsToObject.call({series:t},t.options.data[C])),w.forEach(function(a){delete t.dataGroupInfo.options[a]}));void 0!==l&&(I.push(x),y.push(l),q.push(t.dataGroupInfo));C=J;for(x=0;x<B;x++)m[x].length=0,m[x].hasNulls=!1;n+=1;if(J===d)break}if(J===d)break;if(e){x=t.cropStart+J;l=v&&v[x]||t.pointClass.prototype.applyOptions.apply({series:t},
+[r[x]]);var F;for(x=0;x<p;x++)F=l[e[x]],A(F)?m[x].push(F):null===F&&(m[x].hasNulls=!0)}else x=u?b[J]:null,A(x)?m[0].push(x):null===x&&(m[0].hasNulls=!0)}return[I,y,q]};f.processData=function(){var a=this.chart,c=this.options.dataGrouping,b=!1!==this.allowDG&&c&&F(c.enabled,a.options.isStock),g=this.visible||!a.options.chart.ignoreHiddenSeries,t,v=this.currentDataGrouping,k;this.forceCrop=b;this.groupPixelWidth=null;this.hasProcessed=!0;if(!1!==u.apply(this,arguments)&&b){this.destroyGroupedData();
+var I,h=c.groupAll?this.xData:this.processedXData,d=c.groupAll?this.yData:this.processedYData,m=a.plotSizeX,a=this.xAxis,l=a.options.ordinal,e=this.groupPixelWidth=a.getGroupPixelWidth&&a.getGroupPixelWidth();if(e){this.isDirty=t=!0;this.points=null;b=a.getExtremes();k=b.min;b=b.max;l=l&&a.getGroupIntervalFactor(k,b,this)||1;e=e*(b-k)/m*l;m=a.getTimeTicks(a.normalizeTimeTickInterval(e,c.units||q),Math.min(k,h[0]),Math.max(b,h[h.length-1]),a.options.startOfWeek,h,this.closestPointRange);d=f.groupData.apply(this,
+[h,d,m,c.approximation]);h=d[0];l=d[1];if(c.smoothed&&h.length){I=h.length-1;for(h[I]=Math.min(h[I],b);I--&&0<I;)h[I]+=e/2;h[0]=Math.max(h[0],k)}k=m.info;this.closestPointRange=m.info.totalRange;this.groupMap=d[2];if(G(h[0])&&h[0]<a.dataMin&&g){if(!G(a.options.min)&&a.min<=a.dataMin||a.min===a.dataMin)a.min=h[0];a.dataMin=h[0]}c.groupAll&&(c=this.cropData(h,l,a.min,a.max,1),h=c.xData,l=c.yData);this.processedXData=h;this.processedYData=l}else this.groupMap=null;this.hasGroupedData=t;this.currentDataGrouping=
+k;this.preventGraphAnimation=(v&&v.totalRange)!==(k&&k.totalRange)}};f.destroyGroupedData=function(){var a=this.groupedData;(a||[]).forEach(function(c,b){c&&(a[b]=c.destroy?c.destroy():null)});this.groupedData=null};f.generatePoints=function(){m.apply(this);this.destroyGroupedData();this.groupedData=this.hasGroupedData?this.points:null};D(e,"update",function(){if(this.dataGroup)return b.error(24,!1,this.series.chart),!1});a(l.prototype,"tooltipFooterHeaderFormatter",function(a,c,b){var g=this.chart.time,
+t=c.series,v=t.tooltipOptions,f=t.options.dataGrouping,h=v.xDateFormat,k,r=t.xAxis,d=v[(b?"footer":"header")+"Format"];return r&&"datetime"===r.options.type&&f&&A(c.key)?(a=t.currentDataGrouping,f=f.dateTimeLabelFormats,a?(v=f[a.unitName],1===a.count?h=v[0]:(h=v[1],k=v[2])):!h&&f&&(h=this.getXDateFormat(c,v,r)),h=g.dateFormat(h,c.key),k&&(h+=g.dateFormat(k,c.key+a.totalRange-1)),t.chart.styledMode&&(d=this.styledModeFormat(d)),w(d,{point:B(c.point,{key:h}),series:t},g)):a.call(this,c,b)});D(d,"destroy",
+f.destroyGroupedData);D(d,"afterSetOptions",function(a){a=a.options;var b=this.type,f=this.chart.options.plotOptions,g=C[b].dataGrouping,t=this.useCommonDataGrouping&&c;if(k[b]||t)g||(g=z(c,k[b])),a.dataGrouping=z(t,g,f.series&&f.series.dataGrouping,f[b].dataGrouping,this.userOptions.dataGrouping);this.chart.options.isStock&&(this.requireSorting=!0)});D(p,"afterSetScale",function(){this.series.forEach(function(a){a.hasProcessed=!1})});p.prototype.getGroupPixelWidth=function(){var a=this.series,c=
+a.length,b,g=0,t=!1,f;for(b=c;b--;)(f=a[b].options.dataGrouping)&&(g=Math.max(g,f.groupPixelWidth));for(b=c;b--;)(f=a[b].options.dataGrouping)&&a[b].hasProcessed&&(c=(a[b].processedXData||a[b].data).length,a[b].groupPixelWidth||c>this.chart.plotSizeX/g||c&&f.forced)&&(t=!0);return t?g:0};p.prototype.setDataGrouping=function(a,c){var b;c=F(c,!0);a||(a={forced:!1,units:null});if(this instanceof p)for(b=this.series.length;b--;)this.series[b].update({dataGrouping:a},!1);else this.chart.options.series.forEach(function(g){g.dataGrouping=
+a},!1);this.ordinalSlope=null;c&&this.chart.redraw()}})(H);(function(b){var D=b.Point,n=b.seriesType,E=b.seriesTypes;n("ohlc","column",{lineWidth:1,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eOpen: {point.open}\x3cbr/\x3eHigh: {point.high}\x3cbr/\x3eLow: {point.low}\x3cbr/\x3eClose: {point.close}\x3cbr/\x3e'},threshold:null,states:{hover:{lineWidth:3}},stickyTracking:!0},{directTouch:!1,pointArrayMap:["open","high",
+"low","close"],toYData:function(b){return[b.open,b.high,b.low,b.close]},pointValKey:"close",pointAttrToOptions:{stroke:"color","stroke-width":"lineWidth"},init:function(){E.column.prototype.init.apply(this,arguments);this.options.stacking=!1},pointAttribs:function(b,n){n=E.column.prototype.pointAttribs.call(this,b,n);var p=this.options;delete n.fill;!b.options.color&&p.upColor&&b.open<b.close&&(n.stroke=p.upColor);return n},translate:function(){var b=this,n=b.yAxis,G=!!b.modifyValue,B=["plotOpen",
+"plotHigh","plotLow","plotClose","yBottom"];E.column.prototype.translate.apply(b);b.points.forEach(function(p){[p.open,p.high,p.low,p.close,p.low].forEach(function(w,z){null!==w&&(G&&(w=b.modifyValue(w)),p[B[z]]=n.toPixels(w,!0))});p.tooltipPos[1]=p.plotHigh+n.pos-b.chart.plotTop})},drawPoints:function(){var b=this,n=b.chart;b.points.forEach(function(p){var B,w,A,z,C=p.graphic,e,d=!C;void 0!==p.plotY&&(C||(p.graphic=C=n.renderer.path().add(b.group)),n.styledMode||C.attr(b.pointAttribs(p,p.selected&&
+"select")),w=C.strokeWidth()%2/2,e=Math.round(p.plotX)-w,A=Math.round(p.shapeArgs.width/2),z=["M",e,Math.round(p.yBottom),"L",e,Math.round(p.plotHigh)],null!==p.open&&(B=Math.round(p.plotOpen)+w,z.push("M",e,B,"L",e-A,B)),null!==p.close&&(B=Math.round(p.plotClose)+w,z.push("M",e,B,"L",e+A,B)),C[d?"attr":"animate"]({d:z}).addClass(p.getClassName(),!0))})},animate:null},{getClassName:function(){return D.prototype.getClassName.call(this)+(this.open<this.close?" highcharts-point-up":" highcharts-point-down")}})})(H);
+(function(b){var D=b.defaultPlotOptions,n=b.merge,E=b.seriesType,p=b.seriesTypes;E("candlestick","ohlc",n(D.column,{states:{hover:{lineWidth:2}},tooltip:D.ohlc.tooltip,threshold:null,lineColor:"#000000",lineWidth:1,upColor:"#ffffff",stickyTracking:!0}),{pointAttribs:function(b,n){var B=p.column.prototype.pointAttribs.call(this,b,n),w=this.options,A=b.open<b.close,z=w.lineColor||this.color;B["stroke-width"]=w.lineWidth;B.fill=b.options.color||(A?w.upColor||this.color:this.color);B.stroke=b.lineColor||
+(A?w.upLineColor||z:z);n&&(b=w.states[n],B.fill=b.color||B.fill,B.stroke=b.lineColor||B.stroke,B["stroke-width"]=b.lineWidth||B["stroke-width"]);return B},drawPoints:function(){var b=this,p=b.chart,n=b.yAxis.reversed;b.points.forEach(function(w){var A=w.graphic,z,B,e,d,l,a,f,u=!A;void 0!==w.plotY&&(A||(w.graphic=A=p.renderer.path().add(b.group)),b.chart.styledMode||A.attr(b.pointAttribs(w,w.selected&&"select")).shadow(b.options.shadow),l=A.strokeWidth()%2/2,a=Math.round(w.plotX)-l,z=w.plotOpen,B=
+w.plotClose,e=Math.min(z,B),z=Math.max(z,B),f=Math.round(w.shapeArgs.width/2),B=n?z!==w.yBottom:Math.round(e)!==Math.round(w.plotHigh),d=n?Math.round(e)!==Math.round(w.plotHigh):z!==w.yBottom,e=Math.round(e)+l,z=Math.round(z)+l,l=[],l.push("M",a-f,z,"L",a-f,e,"L",a+f,e,"L",a+f,z,"Z","M",a,e,"L",a,B?Math.round(n?w.yBottom:w.plotHigh):e,"M",a,z,"L",a,d?Math.round(n?w.plotHigh:w.yBottom):z),A[u?"attr":"animate"]({d:l}).addClass(w.getClassName(),!0))})}})})(H);var U=function(b){var D=b.defined,n=b.seriesTypes,
+E=b.stableSort;return{getPlotBox:function(){return b.Series.prototype.getPlotBox.call(this.options.onSeries&&this.chart.get(this.options.onSeries)||this)},translate:function(){n.column.prototype.translate.apply(this);var b=this.options,C=this.chart,G=this.points,B=G.length-1,w,A,z=b.onSeries,z=z&&C.get(z),b=b.onKey||"y",F=z&&z.options.step,e=z&&z.points,d=e&&e.length,l=C.inverted,a=this.xAxis,f=this.yAxis,u=0,m,c,k,q;if(z&&z.visible&&d)for(u=(z.pointXOffset||0)+(z.barW||0)/2,w=z.currentDataGrouping,
+c=e[d-1].x+(w?w.totalRange:0),E(G,function(a,b){return a.x-b.x}),b="plot"+b[0].toUpperCase()+b.substr(1);d--&&G[B]&&!(m=e[d],w=G[B],w.y=m.y,m.x<=w.x&&void 0!==m[b]&&(w.x<=c&&(w.plotY=m[b],m.x<w.x&&!F&&(k=e[d+1])&&void 0!==k[b]&&(q=(w.x-m.x)/(k.x-m.x),w.plotY+=q*(k[b]-m[b]),w.y+=q*(k.y-m.y))),B--,d++,0>B)););G.forEach(function(b,c){var k;b.plotX+=u;if(void 0===b.plotY||l)0<=b.plotX&&b.plotX<=a.len?l?(b.plotY=a.translate(b.x,0,1,0,1),b.plotX=D(b.y)?f.translate(b.y,0,0,0,1):0):b.plotY=C.chartHeight-
+a.bottom-(a.opposite?a.height:0)+a.offset-f.top:b.shapeArgs={};(A=G[c-1])&&A.plotX===b.plotX&&(void 0===A.stackIndex&&(A.stackIndex=0),k=A.stackIndex+1);b.stackIndex=k});this.onSeries=z}}}(H);(function(b,D){function n(b){e[b+"pin"]=function(d,a,f,u,m){var c=m&&m.anchorX;m=m&&m.anchorY;"circle"===b&&u>f&&(d-=Math.round((u-f)/2),f=u);d=e[b](d,a,f,u);c&&m&&(d.push("M","circle"===b?d[1]-d[4]:d[1]+d[4]/2,a>m?a:a+u,"L",c,m),d=d.concat(e.circle(c-1,m-1,2,2)));return d}}var E=b.addEvent,p=b.merge,C=b.noop,
+G=b.defined,B=b.Renderer,w=b.Series,A=b.seriesType,z=b.TrackerMixin,F=b.VMLRenderer,e=b.SVGRenderer.prototype.symbols;A("flags","column",{pointRange:0,allowOverlapX:!1,shape:"flag",stackDistance:12,textAlign:"center",tooltip:{pointFormat:"{point.text}\x3cbr/\x3e"},threshold:null,y:-30,fillColor:"#ffffff",lineWidth:1,states:{hover:{lineColor:"#000000",fillColor:"#ccd6eb"}},style:{fontSize:"11px",fontWeight:"bold"}},{sorted:!1,noSharedTooltip:!0,allowDG:!1,takeOrdinalPosition:!1,trackerGroups:["markerGroup"],
+forceCrop:!0,init:w.prototype.init,pointAttribs:function(b,e){var a=this.options,f=b&&b.color||this.color,d=a.lineColor,m=b&&b.lineWidth;b=b&&b.fillColor||a.fillColor;e&&(b=a.states[e].fillColor,d=a.states[e].lineColor,m=a.states[e].lineWidth);return{fill:b||f,stroke:d||f,"stroke-width":m||a.lineWidth||0}},translate:D.translate,getPlotBox:D.getPlotBox,drawPoints:function(){var d=this.points,e=this.chart,a=e.renderer,f,u,m=e.inverted,c=this.options,k=c.y,q,h,y,r,x,g,t=this.yAxis,v={},K=[];for(h=d.length;h--;)y=
+d[h],g=(m?y.plotY:y.plotX)>this.xAxis.len,f=y.plotX,r=y.stackIndex,q=y.options.shape||c.shape,u=y.plotY,void 0!==u&&(u=y.plotY+k-(void 0!==r&&r*c.stackDistance)),y.anchorX=r?void 0:y.plotX,x=r?void 0:y.plotY,r=y.graphic,void 0!==u&&0<=f&&!g?(r||(r=y.graphic=a.label("",null,null,q,null,null,c.useHTML),e.styledMode||r.attr(this.pointAttribs(y)).css(p(c.style,y.style)),r.attr({align:"flag"===q?"left":"center",width:c.width,height:c.height,"text-align":c.textAlign}).addClass("highcharts-point").add(this.markerGroup),
+y.graphic.div&&(y.graphic.div.point=y),e.styledMode||r.shadow(c.shadow),r.isNew=!0),0<f&&(f-=r.strokeWidth()%2),q={y:u,anchorY:x},c.allowOverlapX&&(q.x=f,q.anchorX=y.anchorX),r.attr({text:y.options.title||c.title||"A"})[r.isNew?"attr":"animate"](q),c.allowOverlapX||(v[y.plotX]?v[y.plotX].size=Math.max(v[y.plotX].size,r.width):v[y.plotX]={align:0,size:r.width,target:f,anchorX:f}),y.tooltipPos=[f,u+t.pos-e.plotTop]):r&&(y.graphic=r.destroy());c.allowOverlapX||(b.objectEach(v,function(a){a.plotX=a.anchorX;
+K.push(a)}),b.distribute(K,m?t.len:this.xAxis.len,100),d.forEach(function(a){var b=a.graphic&&v[a.plotX];b&&(a.graphic[a.graphic.isNew?"attr":"animate"]({x:b.pos,anchorX:a.anchorX}),G(b.pos)?a.graphic.isNew=!1:(a.graphic.attr({x:-9999,anchorX:-9999}),a.graphic.isNew=!0))}));c.useHTML&&b.wrap(this.markerGroup,"on",function(a){return b.SVGElement.prototype.on.apply(a.apply(this,[].slice.call(arguments,1)),[].slice.call(arguments,1))})},drawTracker:function(){var b=this.points;z.drawTrackerPoint.apply(this);
+b.forEach(function(d){var a=d.graphic;a&&E(a.element,"mouseover",function(){0<d.stackIndex&&!d.raised&&(d._y=a.y,a.attr({y:d._y-8}),d.raised=!0);b.forEach(function(a){a!==d&&a.raised&&a.graphic&&(a.graphic.attr({y:a._y}),a.raised=!1)})})})},animate:function(b){b?this.setClip():this.animate=null},setClip:function(){w.prototype.setClip.apply(this,arguments);!1!==this.options.clip&&this.sharedClipKey&&this.markerGroup.clip(this.chart[this.sharedClipKey])},buildKDTree:C,invertGroups:C});e.flag=function(b,
+l,a,f,u){var d=u&&u.anchorX||b;u=u&&u.anchorY||l;return e.circle(d-1,u-1,2,2).concat(["M",d,u,"L",b,l+f,b,l,b+a,l,b+a,l+f,b,l+f,"Z"])};n("circle");n("square");B===F&&["flag","circlepin","squarepin"].forEach(function(b){F.prototype.symbols[b]=e[b]})})(H,U);(function(b){function D(a,b,d){this.init(a,b,d)}var n=b.addEvent,E=b.Axis,p=b.correctFloat,C=b.defaultOptions,G=b.defined,B=b.destroyObjectProperties,w=b.fireEvent,A=b.hasTouch,z=b.merge,F=b.pick,e=b.removeEvent,d,l={height:b.isTouchDevice?20:14,
+barBorderRadius:0,buttonBorderRadius:0,liveRedraw:void 0,margin:10,minWidth:6,step:.2,zIndex:3,barBackgroundColor:"#cccccc",barBorderWidth:1,barBorderColor:"#cccccc",buttonArrowColor:"#333333",buttonBackgroundColor:"#e6e6e6",buttonBorderColor:"#cccccc",buttonBorderWidth:1,rifleColor:"#333333",trackBackgroundColor:"#f2f2f2",trackBorderColor:"#f2f2f2",trackBorderWidth:1};C.scrollbar=z(!0,l,C.scrollbar);b.swapXY=d=function(a,b){var f=a.length,d;if(b)for(b=0;b<f;b+=3)d=a[b+1],a[b+1]=a[b+2],a[b+2]=d;return a};
+D.prototype={init:function(a,b,d){this.scrollbarButtons=[];this.renderer=a;this.userOptions=b;this.options=z(l,b);this.chart=d;this.size=F(this.options.size,this.options.height);b.enabled&&(this.render(),this.initEvents(),this.addEvents())},render:function(){var a=this.renderer,b=this.options,e=this.size,m=this.chart.styledMode,c;this.group=c=a.g("scrollbar").attr({zIndex:b.zIndex,translateY:-99999}).add();this.track=a.rect().addClass("highcharts-scrollbar-track").attr({x:0,r:b.trackBorderRadius||
+0,height:e,width:e}).add(c);m||this.track.attr({fill:b.trackBackgroundColor,stroke:b.trackBorderColor,"stroke-width":b.trackBorderWidth});this.trackBorderWidth=this.track.strokeWidth();this.track.attr({y:-this.trackBorderWidth%2/2});this.scrollbarGroup=a.g().add(c);this.scrollbar=a.rect().addClass("highcharts-scrollbar-thumb").attr({height:e,width:e,r:b.barBorderRadius||0}).add(this.scrollbarGroup);this.scrollbarRifles=a.path(d(["M",-3,e/4,"L",-3,2*e/3,"M",0,e/4,"L",0,2*e/3,"M",3,e/4,"L",3,2*e/3],
+b.vertical)).addClass("highcharts-scrollbar-rifles").add(this.scrollbarGroup);m||(this.scrollbar.attr({fill:b.barBackgroundColor,stroke:b.barBorderColor,"stroke-width":b.barBorderWidth}),this.scrollbarRifles.attr({stroke:b.rifleColor,"stroke-width":1}));this.scrollbarStrokeWidth=this.scrollbar.strokeWidth();this.scrollbarGroup.translate(-this.scrollbarStrokeWidth%2/2,-this.scrollbarStrokeWidth%2/2);this.drawScrollbarButton(0);this.drawScrollbarButton(1)},position:function(a,b,d,e){var c=this.options.vertical,
+f=0,q=this.rendered?"animate":"attr";this.x=a;this.y=b+this.trackBorderWidth;this.width=d;this.xOffset=this.height=e;this.yOffset=f;c?(this.width=this.yOffset=d=f=this.size,this.xOffset=b=0,this.barWidth=e-2*d,this.x=a+=this.options.margin):(this.height=this.xOffset=e=b=this.size,this.barWidth=d-2*e,this.y+=this.options.margin);this.group[q]({translateX:a,translateY:this.y});this.track[q]({width:d,height:e});this.scrollbarButtons[1][q]({translateX:c?0:d-b,translateY:c?e-f:0})},drawScrollbarButton:function(a){var b=
+this.renderer,e=this.scrollbarButtons,m=this.options,c=this.size,k;k=b.g().add(this.group);e.push(k);k=b.rect().addClass("highcharts-scrollbar-button").add(k);this.chart.styledMode||k.attr({stroke:m.buttonBorderColor,"stroke-width":m.buttonBorderWidth,fill:m.buttonBackgroundColor});k.attr(k.crisp({x:-.5,y:-.5,width:c+1,height:c+1,r:m.buttonBorderRadius},k.strokeWidth()));k=b.path(d(["M",c/2+(a?-1:1),c/2-3,"L",c/2+(a?-1:1),c/2+3,"L",c/2+(a?2:-2),c/2],m.vertical)).addClass("highcharts-scrollbar-arrow").add(e[a]);
+this.chart.styledMode||k.attr({fill:m.buttonArrowColor})},setRange:function(a,b){var f=this.options,d=f.vertical,c=f.minWidth,k=this.barWidth,e,h,y=!this.rendered||this.hasDragged||this.chart.navigator&&this.chart.navigator.hasDragged?"attr":"animate";G(k)&&(a=Math.max(a,0),e=Math.ceil(k*a),this.calculatedWidth=h=p(k*Math.min(b,1)-e),h<c&&(e=(k-c+h)*a,h=c),c=Math.floor(e+this.xOffset+this.yOffset),k=h/2-.5,this.from=a,this.to=b,d?(this.scrollbarGroup[y]({translateY:c}),this.scrollbar[y]({height:h}),
+this.scrollbarRifles[y]({translateY:k}),this.scrollbarTop=c,this.scrollbarLeft=0):(this.scrollbarGroup[y]({translateX:c}),this.scrollbar[y]({width:h}),this.scrollbarRifles[y]({translateX:k}),this.scrollbarLeft=c,this.scrollbarTop=0),12>=h?this.scrollbarRifles.hide():this.scrollbarRifles.show(!0),!1===f.showFull&&(0>=a&&1<=b?this.group.hide():this.group.show()),this.rendered=!0)},initEvents:function(){var a=this;a.mouseMoveHandler=function(b){var f=a.chart.pointer.normalize(b),e=a.options.vertical?
+"chartY":"chartX",c=a.initPositions;!a.grabbedCenter||b.touches&&0===b.touches[0][e]||(f=a.cursorToScrollbarPosition(f)[e],e=a[e],e=f-e,a.hasDragged=!0,a.updatePosition(c[0]+e,c[1]+e),a.hasDragged&&w(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b}))};a.mouseUpHandler=function(b){a.hasDragged&&w(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b});a.grabbedCenter=a.hasDragged=a.chartX=a.chartY=null};a.mouseDownHandler=function(b){b=a.chart.pointer.normalize(b);
+b=a.cursorToScrollbarPosition(b);a.chartX=b.chartX;a.chartY=b.chartY;a.initPositions=[a.from,a.to];a.grabbedCenter=!0};a.buttonToMinClick=function(b){var f=p(a.to-a.from)*a.options.step;a.updatePosition(p(a.from-f),p(a.to-f));w(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.buttonToMaxClick=function(b){var f=(a.to-a.from)*a.options.step;a.updatePosition(a.from+f,a.to+f);w(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.trackClick=function(b){var f=a.chart.pointer.normalize(b),
+e=a.to-a.from,c=a.y+a.scrollbarTop,k=a.x+a.scrollbarLeft;a.options.vertical&&f.chartY>c||!a.options.vertical&&f.chartX>k?a.updatePosition(a.from+e,a.to+e):a.updatePosition(a.from-e,a.to-e);w(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})}},cursorToScrollbarPosition:function(a){var b=this.options,b=b.minWidth>this.calculatedWidth?b.minWidth:0;return{chartX:(a.chartX-this.x-this.xOffset)/(this.barWidth-b),chartY:(a.chartY-this.y-this.yOffset)/(this.barWidth-b)}},updatePosition:function(a,
+b){1<b&&(a=p(1-p(b-a)),b=1);0>a&&(b=p(b-a),a=0);this.from=a;this.to=b},update:function(a){this.destroy();this.init(this.chart.renderer,z(!0,this.options,a),this.chart)},addEvents:function(){var a=this.options.inverted?[1,0]:[0,1],b=this.scrollbarButtons,e=this.scrollbarGroup.element,d=this.mouseDownHandler,c=this.mouseMoveHandler,k=this.mouseUpHandler,a=[[b[a[0]].element,"click",this.buttonToMinClick],[b[a[1]].element,"click",this.buttonToMaxClick],[this.track.element,"click",this.trackClick],[e,
+"mousedown",d],[e.ownerDocument,"mousemove",c],[e.ownerDocument,"mouseup",k]];A&&a.push([e,"touchstart",d],[e.ownerDocument,"touchmove",c],[e.ownerDocument,"touchend",k]);a.forEach(function(a){n.apply(null,a)});this._events=a},removeEvents:function(){this._events.forEach(function(a){e.apply(null,a)});this._events.length=0},destroy:function(){var a=this.chart.scroller;this.removeEvents();["track","scrollbarRifles","scrollbar","scrollbarGroup","group"].forEach(function(a){this[a]&&this[a].destroy&&
+(this[a]=this[a].destroy())},this);a&&this===a.scrollbar&&(a.scrollbar=null,B(a.scrollbarButtons))}};n(E,"afterInit",function(){var a=this;a.options&&a.options.scrollbar&&a.options.scrollbar.enabled&&(a.options.scrollbar.vertical=!a.horiz,a.options.startOnTick=a.options.endOnTick=!1,a.scrollbar=new D(a.chart.renderer,a.options.scrollbar,a.chart),n(a.scrollbar,"changed",function(b){var e=Math.min(F(a.options.min,a.min),a.min,a.dataMin),d=Math.max(F(a.options.max,a.max),a.max,a.dataMax)-e,c;a.horiz&&
+!a.reversed||!a.horiz&&a.reversed?(c=e+d*this.to,e+=d*this.from):(c=e+d*(1-this.from),e+=d*(1-this.to));a.setExtremes(e,c,!0,!1,b)}))});n(E,"afterRender",function(){var a=Math.min(F(this.options.min,this.min),this.min,F(this.dataMin,this.min)),b=Math.max(F(this.options.max,this.max),this.max,F(this.dataMax,this.max)),e=this.scrollbar,d=this.titleOffset||0;if(e){this.horiz?(e.position(this.left,this.top+this.height+2+this.chart.scrollbarsOffsets[1]+(this.opposite?0:d+this.axisTitleMargin+this.offset),
+this.width,this.height),d=1):(e.position(this.left+this.width+2+this.chart.scrollbarsOffsets[0]+(this.opposite?d+this.axisTitleMargin+this.offset:0),this.top,this.width,this.height),d=0);if(!this.opposite&&!this.horiz||this.opposite&&this.horiz)this.chart.scrollbarsOffsets[d]+=this.scrollbar.size+this.scrollbar.options.margin;isNaN(a)||isNaN(b)||!G(this.min)||!G(this.max)?e.setRange(0,0):(d=(this.min-a)/(b-a),a=(this.max-a)/(b-a),this.horiz&&!this.reversed||!this.horiz&&this.reversed?e.setRange(d,
+a):e.setRange(1-a,1-d))}});n(E,"afterGetOffset",function(){var a=this.horiz?2:1,b=this.scrollbar;b&&(this.chart.scrollbarsOffsets=[0,0],this.chart.axisOffset[a]+=b.size+b.options.margin)});b.Scrollbar=D})(H);(function(b){function D(a){this.init(a)}var n=b.addEvent,E=b.Axis,p=b.Chart,C=b.color,G=b.defaultOptions,B=b.defined,w=b.destroyObjectProperties,A=b.erase,z=b.error,F=b.extend,e=b.hasTouch,d=b.isArray,l=b.isNumber,a=b.isObject,f=b.isTouchDevice,u=b.merge,m=b.pick,c=b.removeEvent,k=b.Scrollbar,
+q=b.Series,h=b.seriesTypes,y=b.wrap,r=[].concat(b.defaultDataGroupingUnits),x=function(a){var b=[].filter.call(arguments,l);if(b.length)return Math[a].apply(0,b)};r[4]=["day",[1,2,3,4]];r[5]=["week",[1,2,3]];h=void 0===h.areaspline?"line":"areaspline";F(G,{navigator:{height:40,margin:25,maskInside:!0,handles:{width:7,height:15,symbols:["navigator-handle","navigator-handle"],enabled:!0,lineWidth:1,backgroundColor:"#f2f2f2",borderColor:"#999999"},maskFill:C("#6685c2").setOpacity(.3).get(),outlineColor:"#cccccc",
+outlineWidth:1,series:{type:h,fillOpacity:.05,lineWidth:1,compare:null,dataGrouping:{approximation:"average",enabled:!0,groupPixelWidth:2,smoothed:!0,units:r},dataLabels:{enabled:!1,zIndex:2},id:"highcharts-navigator-series",className:"highcharts-navigator-series",lineColor:null,marker:{enabled:!1},pointRange:0,threshold:null},xAxis:{overscroll:0,className:"highcharts-navigator-xaxis",tickLength:0,lineWidth:0,gridLineColor:"#e6e6e6",gridLineWidth:1,tickPixelInterval:200,labels:{align:"left",style:{color:"#999999"},
+x:3,y:-4},crosshair:!1},yAxis:{className:"highcharts-navigator-yaxis",gridLineWidth:0,startOnTick:!1,endOnTick:!1,minPadding:.1,maxPadding:.1,labels:{enabled:!1},crosshair:!1,title:{text:null},tickLength:0,tickWidth:0}}});b.Renderer.prototype.symbols["navigator-handle"]=function(a,b,c,e,d){a=d.width/2;b=Math.round(a/3)+.5;d=d.height;return["M",-a-1,.5,"L",a,.5,"L",a,d+.5,"L",-a-1,d+.5,"L",-a-1,.5,"M",-b,4,"L",-b,d-3,"M",b-1,4,"L",b-1,d-3]};D.prototype={drawHandle:function(a,b,c,e){var g=this.navigatorOptions.handles.height;
+this.handles[b][e](c?{translateX:Math.round(this.left+this.height/2),translateY:Math.round(this.top+parseInt(a,10)+.5-g)}:{translateX:Math.round(this.left+parseInt(a,10)),translateY:Math.round(this.top+this.height/2-g/2-1)})},drawOutline:function(a,b,c,e){var g=this.navigatorOptions.maskInside,t=this.outline.strokeWidth(),v=t/2,t=t%2/2,d=this.outlineHeight,k=this.scrollbarHeight,h=this.size,f=this.left-k,q=this.top;c?(f-=v,c=q+b+t,b=q+a+t,a=["M",f+d,q-k-t,"L",f+d,c,"L",f,c,"L",f,b,"L",f+d,b,"L",f+
+d,q+h+k].concat(g?["M",f+d,c-v,"L",f+d,b+v]:[])):(a+=f+k-t,b+=f+k-t,q+=v,a=["M",f,q,"L",a,q,"L",a,q+d,"L",b,q+d,"L",b,q,"L",f+h+2*k,q].concat(g?["M",a-v,q,"L",b+v,q]:[]));this.outline[e]({d:a})},drawMasks:function(a,b,c,e){var g=this.left,t=this.top,v=this.height,d,k,h,f;c?(h=[g,g,g],f=[t,t+a,t+b],k=[v,v,v],d=[a,b-a,this.size-b]):(h=[g,g+a,g+b],f=[t,t,t],k=[a,b-a,this.size-b],d=[v,v,v]);this.shades.forEach(function(a,b){a[e]({x:h[b],y:f[b],width:k[b],height:d[b]})})},renderElements:function(){var a=
+this,b=a.navigatorOptions,c=b.maskInside,e=a.chart,d=e.renderer,k,h={cursor:e.inverted?"ns-resize":"ew-resize"};a.navigatorGroup=k=d.g("navigator").attr({zIndex:8,visibility:"hidden"}).add();[!c,c,!c].forEach(function(g,c){a.shades[c]=d.rect().addClass("highcharts-navigator-mask"+(1===c?"-inside":"-outside")).add(k);e.styledMode||a.shades[c].attr({fill:g?b.maskFill:"rgba(0,0,0,0)"}).css(1===c&&h)});a.outline=d.path().addClass("highcharts-navigator-outline").add(k);e.styledMode||a.outline.attr({"stroke-width":b.outlineWidth,
+stroke:b.outlineColor});b.handles.enabled&&[0,1].forEach(function(c){b.handles.inverted=e.inverted;a.handles[c]=d.symbol(b.handles.symbols[c],-b.handles.width/2-1,0,b.handles.width,b.handles.height,b.handles);a.handles[c].attr({zIndex:7-c}).addClass("highcharts-navigator-handle highcharts-navigator-handle-"+["left","right"][c]).add(k);if(!e.styledMode){var g=b.handles;a.handles[c].attr({fill:g.backgroundColor,stroke:g.borderColor,"stroke-width":g.lineWidth}).css(h)}})},update:function(b){(this.series||
+[]).forEach(function(b){b.baseSeries&&delete b.baseSeries.navigatorSeries});this.destroy();u(!0,this.chart.options.navigator,this.options,b);this.init(this.chart)},render:function(a,c,e,d){var g=this.chart,t,v,k=this.scrollbarHeight,h,f=this.xAxis;t=f.fake?g.xAxis[0]:f;var q=this.navigatorEnabled,r,x=this.rendered;v=g.inverted;var y,K=g.xAxis[0].minRange,n=g.xAxis[0].options.maxRange;if(!this.hasDragged||B(e)){if(!l(a)||!l(c))if(x)e=0,d=m(f.width,t.width);else return;this.left=m(f.left,g.plotLeft+
+k+(v?g.plotWidth:0));this.size=r=h=m(f.len,(v?g.plotHeight:g.plotWidth)-2*k);g=v?k:h+2*k;e=m(e,f.toPixels(a,!0));d=m(d,f.toPixels(c,!0));l(e)&&Infinity!==Math.abs(e)||(e=0,d=g);a=f.toValue(e,!0);c=f.toValue(d,!0);y=Math.abs(b.correctFloat(c-a));y<K?this.grabbedLeft?e=f.toPixels(c-K,!0):this.grabbedRight&&(d=f.toPixels(a+K,!0)):B(n)&&y>n&&(this.grabbedLeft?e=f.toPixels(c-n,!0):this.grabbedRight&&(d=f.toPixels(a+n,!0)));this.zoomedMax=Math.min(Math.max(e,d,0),r);this.zoomedMin=Math.min(Math.max(this.fixedWidth?
+this.zoomedMax-this.fixedWidth:Math.min(e,d),0),r);this.range=this.zoomedMax-this.zoomedMin;r=Math.round(this.zoomedMax);e=Math.round(this.zoomedMin);q&&(this.navigatorGroup.attr({visibility:"visible"}),x=x&&!this.hasDragged?"animate":"attr",this.drawMasks(e,r,v,x),this.drawOutline(e,r,v,x),this.navigatorOptions.handles.enabled&&(this.drawHandle(e,0,v,x),this.drawHandle(r,1,v,x)));this.scrollbar&&(v?(v=this.top-k,t=this.left-k+(q||!t.opposite?0:(t.titleOffset||0)+t.axisTitleMargin),k=h+2*k):(v=this.top+
+(q?this.height:-k),t=this.left-k),this.scrollbar.position(t,v,g,k),this.scrollbar.setRange(this.zoomedMin/(h||1),this.zoomedMax/(h||1)));this.rendered=!0}},addMouseEvents:function(){var a=this,b=a.chart,c=b.container,d=[],k,f;a.mouseMoveHandler=k=function(b){a.onMouseMove(b)};a.mouseUpHandler=f=function(b){a.onMouseUp(b)};d=a.getPartsEvents("mousedown");d.push(n(c,"mousemove",k),n(c.ownerDocument,"mouseup",f));e&&(d.push(n(c,"touchmove",k),n(c.ownerDocument,"touchend",f)),d.concat(a.getPartsEvents("touchstart")));
+a.eventsToUnbind=d;a.series&&a.series[0]&&d.push(n(a.series[0].xAxis,"foundExtremes",function(){b.navigator.modifyNavigatorAxisExtremes()}))},getPartsEvents:function(a){var b=this,c=[];["shades","handles"].forEach(function(g){b[g].forEach(function(e,d){c.push(n(e.element,a,function(a){b[g+"Mousedown"](a,d)}))})});return c},shadesMousedown:function(a,b){a=this.chart.pointer.normalize(a);var c=this.chart,g=this.xAxis,e=this.zoomedMin,d=this.left,t=this.size,k=this.range,f=a.chartX,h,q;c.inverted&&(f=
+a.chartY,d=this.top);1===b?(this.grabbedCenter=f,this.fixedWidth=k,this.dragOffset=f-e):(a=f-d-k/2,0===b?a=Math.max(0,a):2===b&&a+k>=t&&(a=t-k,this.reversedExtremes?(a-=k,q=this.getUnionExtremes().dataMin):h=this.getUnionExtremes().dataMax),a!==e&&(this.fixedWidth=k,b=g.toFixedRange(a,a+k,q,h),B(b.min)&&c.xAxis[0].setExtremes(Math.min(b.min,b.max),Math.max(b.min,b.max),!0,null,{trigger:"navigator"})))},handlesMousedown:function(a,b){this.chart.pointer.normalize(a);a=this.chart;var c=a.xAxis[0],g=
+this.reversedExtremes;0===b?(this.grabbedLeft=!0,this.otherHandlePos=this.zoomedMax,this.fixedExtreme=g?c.min:c.max):(this.grabbedRight=!0,this.otherHandlePos=this.zoomedMin,this.fixedExtreme=g?c.max:c.min);a.fixedRange=null},onMouseMove:function(a){var c=this,g=c.chart,e=c.left,d=c.navigatorSize,k=c.range,h=c.dragOffset,q=g.inverted;a.touches&&0===a.touches[0].pageX||(a=g.pointer.normalize(a),g=a.chartX,q&&(e=c.top,g=a.chartY),c.grabbedLeft?(c.hasDragged=!0,c.render(0,0,g-e,c.otherHandlePos)):c.grabbedRight?
+(c.hasDragged=!0,c.render(0,0,c.otherHandlePos,g-e)):c.grabbedCenter&&(c.hasDragged=!0,g<h?g=h:g>d+h-k&&(g=d+h-k),c.render(0,0,g-h,g-h+k)),c.hasDragged&&c.scrollbar&&m(c.scrollbar.options.liveRedraw,b.svg&&!f&&!this.chart.isBoosting)&&(a.DOMType=a.type,setTimeout(function(){c.onMouseUp(a)},0)))},onMouseUp:function(a){var b=this.chart,c=this.xAxis,g=this.scrollbar,e,d,k=a.DOMEvent||a;(!this.hasDragged||g&&g.hasDragged)&&"scrollbar"!==a.trigger||(g=this.getUnionExtremes(),this.zoomedMin===this.otherHandlePos?
+e=this.fixedExtreme:this.zoomedMax===this.otherHandlePos&&(d=this.fixedExtreme),this.zoomedMax===this.size&&(d=this.reversedExtremes?g.dataMin:g.dataMax),0===this.zoomedMin&&(e=this.reversedExtremes?g.dataMax:g.dataMin),c=c.toFixedRange(this.zoomedMin,this.zoomedMax,e,d),B(c.min)&&b.xAxis[0].setExtremes(Math.min(c.min,c.max),Math.max(c.min,c.max),!0,this.hasDragged?!1:null,{trigger:"navigator",triggerOp:"navigator-drag",DOMEvent:k}));"mousemove"!==a.DOMType&&(this.grabbedLeft=this.grabbedRight=this.grabbedCenter=
+this.fixedWidth=this.fixedExtreme=this.otherHandlePos=this.hasDragged=this.dragOffset=null)},removeEvents:function(){this.eventsToUnbind&&(this.eventsToUnbind.forEach(function(a){a()}),this.eventsToUnbind=void 0);this.removeBaseSeriesEvents()},removeBaseSeriesEvents:function(){var a=this.baseSeries||[];this.navigatorEnabled&&a[0]&&(!1!==this.navigatorOptions.adaptToUpdatedData&&a.forEach(function(a){c(a,"updatedData",this.updatedDataHandler)},this),a[0].xAxis&&c(a[0].xAxis,"foundExtremes",this.modifyBaseAxisExtremes))},
+init:function(a){var b=a.options,c=b.navigator,g=c.enabled,e=b.scrollbar,d=e.enabled,b=g?c.height:0,f=d?e.height:0;this.handles=[];this.shades=[];this.chart=a;this.setBaseSeries();this.height=b;this.scrollbarHeight=f;this.scrollbarEnabled=d;this.navigatorEnabled=g;this.navigatorOptions=c;this.scrollbarOptions=e;this.outlineHeight=b+f;this.opposite=m(c.opposite,!g&&a.inverted);var h=this,g=h.baseSeries,e=a.xAxis.length,d=a.yAxis.length,q=g&&g[0]&&g[0].xAxis||a.xAxis[0]||{options:{}};a.isDirtyBox=!0;
+h.navigatorEnabled?(h.xAxis=new E(a,u({breaks:q.options.breaks,ordinal:q.options.ordinal},c.xAxis,{id:"navigator-x-axis",yAxis:"navigator-y-axis",isX:!0,type:"datetime",index:e,isInternal:!0,offset:0,keepOrdinalPadding:!0,startOnTick:!1,endOnTick:!1,minPadding:0,maxPadding:0,zoomEnabled:!1},a.inverted?{offsets:[f,0,-f,0],width:b}:{offsets:[0,-f,0,f],height:b})),h.yAxis=new E(a,u(c.yAxis,{id:"navigator-y-axis",alignTicks:!1,offset:0,index:d,isInternal:!0,zoomEnabled:!1},a.inverted?{width:b}:{height:b})),
+g||c.series.data?h.updateNavigatorSeries(!1):0===a.series.length&&(h.unbindRedraw=n(a,"beforeRedraw",function(){0<a.series.length&&!h.series&&(h.setBaseSeries(),h.unbindRedraw())})),h.reversedExtremes=a.inverted&&!h.xAxis.reversed||!a.inverted&&h.xAxis.reversed,h.renderElements(),h.addMouseEvents()):h.xAxis={translate:function(b,c){var g=a.xAxis[0],e=g.getExtremes(),d=g.len-2*f,h=x("min",g.options.min,e.dataMin),g=x("max",g.options.max,e.dataMax)-h;return c?b*g/d+h:d*(b-h)/g},toPixels:function(a){return this.translate(a)},
+toValue:function(a){return this.translate(a,!0)},toFixedRange:E.prototype.toFixedRange,fake:!0};a.options.scrollbar.enabled&&(a.scrollbar=h.scrollbar=new k(a.renderer,u(a.options.scrollbar,{margin:h.navigatorEnabled?0:10,vertical:a.inverted}),a),n(h.scrollbar,"changed",function(b){var c=h.size,g=c*this.to,c=c*this.from;h.hasDragged=h.scrollbar.hasDragged;h.render(0,0,c,g);(a.options.scrollbar.liveRedraw||"mousemove"!==b.DOMType&&"touchmove"!==b.DOMType)&&setTimeout(function(){h.onMouseUp(b)})}));
+h.addBaseSeriesEvents();h.addChartEvents()},getUnionExtremes:function(a){var b=this.chart.xAxis[0],c=this.xAxis,g=c.options,e=b.options,d;a&&null===b.dataMin||(d={dataMin:m(g&&g.min,x("min",e.min,b.dataMin,c.dataMin,c.min)),dataMax:m(g&&g.max,x("max",e.max,b.dataMax,c.dataMax,c.max))});return d},setBaseSeries:function(a,b){var c=this.chart,g=this.baseSeries=[];a=a||c.options&&c.options.navigator.baseSeries||0;(c.series||[]).forEach(function(b,c){b.options.isInternal||!b.options.showInNavigator&&(c!==
+a&&b.options.id!==a||!1===b.options.showInNavigator)||g.push(b)});this.xAxis&&!this.xAxis.fake&&this.updateNavigatorSeries(!0,b)},updateNavigatorSeries:function(a,e){var g=this,h=g.chart,k=g.baseSeries,f,q,t=g.navigatorOptions.series,r,x={enableMouseTracking:!1,index:null,linkedTo:null,group:"nav",padXAxis:!1,xAxis:"navigator-x-axis",yAxis:"navigator-y-axis",showInLegend:!1,stacking:!1,isInternal:!0},y=g.series=(g.series||[]).filter(function(a){var b=a.baseSeries;return 0>k.indexOf(b)?(b&&(c(b,"updatedData",
+g.updatedDataHandler),delete b.navigatorSeries),a.chart&&a.destroy(),!1):!0});k&&k.length&&k.forEach(function(a){var b=a.navigatorSeries,c=F({color:a.color,visible:a.visible},d(t)?G.navigator.series:t);b&&!1===g.navigatorOptions.adaptToUpdatedData||(x.name="Navigator "+k.length,f=a.options||{},r=f.navigatorOptions||{},q=u(f,x,c,r),c=r.data||c.data,g.hasNavigatorData=g.hasNavigatorData||!!c,q.data=c||f.data&&f.data.slice(0),b&&b.options?b.update(q,e):(a.navigatorSeries=h.initSeries(q),a.navigatorSeries.baseSeries=
+a,y.push(a.navigatorSeries)))});if(t.data&&(!k||!k.length)||d(t))g.hasNavigatorData=!1,t=b.splat(t),t.forEach(function(a,b){x.name="Navigator "+(y.length+1);q=u(G.navigator.series,{color:h.series[b]&&!h.series[b].options.isInternal&&h.series[b].color||h.options.colors[b]||h.options.colors[0]},x,a);q.data=a.data;q.data&&(g.hasNavigatorData=!0,y.push(h.initSeries(q)))});a&&this.addBaseSeriesEvents()},addBaseSeriesEvents:function(){var a=this,b=a.baseSeries||[];b[0]&&b[0].xAxis&&n(b[0].xAxis,"foundExtremes",
+this.modifyBaseAxisExtremes);b.forEach(function(b){n(b,"show",function(){this.navigatorSeries&&this.navigatorSeries.setVisible(!0,!1)});n(b,"hide",function(){this.navigatorSeries&&this.navigatorSeries.setVisible(!1,!1)});!1!==this.navigatorOptions.adaptToUpdatedData&&b.xAxis&&n(b,"updatedData",this.updatedDataHandler);n(b,"remove",function(){this.navigatorSeries&&(A(a.series,this.navigatorSeries),B(this.navigatorSeries.options)&&this.navigatorSeries.remove(!1),delete this.navigatorSeries)})},this)},
+getBaseSeriesMin:function(a){return this.baseSeries.reduce(function(a,b){return Math.min(a,b.xData[0])},a)},modifyNavigatorAxisExtremes:function(){var a=this.xAxis,b;a.getExtremes&&(!(b=this.getUnionExtremes(!0))||b.dataMin===a.min&&b.dataMax===a.max||(a.min=b.dataMin,a.max=b.dataMax))},modifyBaseAxisExtremes:function(){var a=this.chart.navigator,b=this.getExtremes(),c=b.dataMin,e=b.dataMax,b=b.max-b.min,d=a.stickToMin,h=a.stickToMax,k=m(this.options.overscroll,0),f,q,r=a.series&&a.series[0],x=!!this.setExtremes;
+this.eventArgs&&"rangeSelectorButton"===this.eventArgs.trigger||(d&&(q=c,f=q+b),h&&(f=e+k,d||(q=Math.max(f-b,a.getBaseSeriesMin(r&&r.xData?r.xData[0]:-Number.MAX_VALUE)))),x&&(d||h)&&l(q)&&(this.min=this.userMin=q,this.max=this.userMax=f));a.stickToMin=a.stickToMax=null},updatedDataHandler:function(){var a=this.chart.navigator,b=this.navigatorSeries,c=a.getBaseSeriesMin(this.xData[0]);a.stickToMax=a.reversedExtremes?0===Math.round(a.zoomedMin):Math.round(a.zoomedMax)>=Math.round(a.size);a.stickToMin=
+l(this.xAxis.min)&&this.xAxis.min<=c&&(!this.chart.fixedRange||!a.stickToMax);b&&!a.hasNavigatorData&&(b.options.pointStart=this.xData[0],b.setData(this.options.data,!1,null,!1))},addChartEvents:function(){this.eventsToUnbind||(this.eventsToUnbind=[]);this.eventsToUnbind.push(n(this.chart,"redraw",function(){var a=this.navigator,b=a&&(a.baseSeries&&a.baseSeries[0]&&a.baseSeries[0].xAxis||a.scrollbar&&this.xAxis[0]);b&&a.render(b.min,b.max)}),n(this.chart,"getMargins",function(){var a=this.navigator,
+b=a.opposite?"plotTop":"marginBottom";this.inverted&&(b=a.opposite?"marginRight":"plotLeft");this[b]=(this[b]||0)+(a.navigatorEnabled||!this.inverted?a.outlineHeight:0)+a.navigatorOptions.margin}))},destroy:function(){this.removeEvents();this.xAxis&&(A(this.chart.xAxis,this.xAxis),A(this.chart.axes,this.xAxis));this.yAxis&&(A(this.chart.yAxis,this.yAxis),A(this.chart.axes,this.yAxis));(this.series||[]).forEach(function(a){a.destroy&&a.destroy()});"series xAxis yAxis shades outline scrollbarTrack scrollbarRifles scrollbarGroup scrollbar navigatorGroup rendered".split(" ").forEach(function(a){this[a]&&
+this[a].destroy&&this[a].destroy();this[a]=null},this);[this.handles].forEach(function(a){w(a)},this)}};b.Navigator=D;y(E.prototype,"zoom",function(a,b,c){var e=this.chart.options,d=e.chart.zoomType,g=e.chart.pinchType,h=e.navigator,e=e.rangeSelector,k;this.isXAxis&&(h&&h.enabled||e&&e.enabled)&&("y"===d?k=!1:(!f&&"xy"===d||f&&"xy"===g)&&this.options.range&&(d=this.previousZoom,B(b)?this.previousZoom=[this.min,this.max]:d&&(b=d[0],c=d[1],delete this.previousZoom)));return void 0!==k?k:a.call(this,
+b,c)});n(p,"beforeShowResetZoom",function(){var a=this.options,b=a.navigator,c=a.rangeSelector;if((b&&b.enabled||c&&c.enabled)&&(!f&&"x"===a.chart.zoomType||f&&"x"===a.chart.pinchType))return!1});n(p,"beforeRender",function(){var a=this.options;if(a.navigator.enabled||a.scrollbar.enabled)this.scroller=this.navigator=new D(this)});n(p,"afterSetChartSize",function(){var a=this.legend,b=this.navigator,c,e,d,h;b&&(e=a&&a.options,d=b.xAxis,h=b.yAxis,c=b.scrollbarHeight,this.inverted?(b.left=b.opposite?
+this.chartWidth-c-b.height:this.spacing[3]+c,b.top=this.plotTop+c):(b.left=this.plotLeft+c,b.top=b.navigatorOptions.top||this.chartHeight-b.height-c-this.spacing[2]-(this.rangeSelector&&this.extraBottomMargin?this.rangeSelector.getHeight():0)-(e&&"bottom"===e.verticalAlign&&e.enabled&&!e.floating?a.legendHeight+m(e.margin,10):0)),d&&h&&(this.inverted?d.options.left=h.options.left=b.left:d.options.top=h.options.top=b.top,d.setAxisSize(),h.setAxisSize()))});n(p,"update",function(a){var b=a.options.navigator||
+{},c=a.options.scrollbar||{};this.navigator||this.scroller||!b.enabled&&!c.enabled||(u(!0,this.options.navigator,b),u(!0,this.options.scrollbar,c),delete a.options.navigator,delete a.options.scrollbar)});n(p,"afterUpdate",function(){this.navigator||this.scroller||!this.options.navigator.enabled&&!this.options.scrollbar.enabled||(this.scroller=this.navigator=new D(this))});y(q.prototype,"addPoint",function(b,c,e,d,h){var g=this.options.turboThreshold;g&&this.xData.length>g&&a(c,!0)&&this.chart.navigator&&
+z(20,!0,this.chart);b.call(this,c,e,d,h)});n(p,"afterAddSeries",function(){this.navigator&&this.navigator.setBaseSeries(null,!1)});n(q,"afterUpdate",function(){this.chart.navigator&&!this.options.isInternal&&this.chart.navigator.setBaseSeries(null,!1)});p.prototype.callbacks.push(function(a){var b=a.navigator;b&&a.xAxis[0]&&(a=a.xAxis[0].getExtremes(),b.render(a.min,a.max))})})(H);(function(b){function D(a){this.init(a)}var n=b.addEvent,E=b.Axis,p=b.Chart,C=b.css,G=b.createElement,B=b.defaultOptions,
+w=b.defined,A=b.destroyObjectProperties,z=b.discardElement,F=b.extend,e=b.fireEvent,d=b.isNumber,l=b.merge,a=b.pick,f=b.pInt,u=b.splat,m=b.wrap;F(B,{rangeSelector:{verticalAlign:"top",buttonTheme:{width:28,height:18,padding:2,zIndex:7},floating:!1,x:0,y:0,height:void 0,inputPosition:{align:"right",x:0,y:0},buttonPosition:{align:"left",x:0,y:0},labelStyle:{color:"#666666"}}});B.lang=l(B.lang,{rangeSelectorZoom:"Zoom",rangeSelectorFrom:"From",rangeSelectorTo:"To"});D.prototype={clickButton:function(b,
+e){var c=this,h=c.chart,k=c.buttonOptions[b],f=h.xAxis[0],x=h.scroller&&h.scroller.getUnionExtremes()||f||{},g=x.dataMin,t=x.dataMax,v,l=f&&Math.round(Math.min(f.max,a(t,f.max))),m=k.type,p,x=k._range,w,z,B,A=k.dataGrouping;if(null!==g&&null!==t){h.fixedRange=x;A&&(this.forcedDataGrouping=!0,E.prototype.setDataGrouping.call(f||{chart:this.chart},A,!1),this.frozenStates=k.preserveDataGrouping);if("month"===m||"year"===m)f?(m={range:k,max:l,chart:h,dataMin:g,dataMax:t},v=f.minFromRange.call(m),d(m.newMax)&&
+(l=m.newMax)):x=k;else if(x)v=Math.max(l-x,g),l=Math.min(v+x,t);else if("ytd"===m)if(f)void 0===t&&(g=Number.MAX_VALUE,t=Number.MIN_VALUE,h.series.forEach(function(a){a=a.xData;g=Math.min(a[0],g);t=Math.max(a[a.length-1],t)}),e=!1),l=c.getYTDExtremes(t,g,h.time.useUTC),v=w=l.min,l=l.max;else{n(h,"beforeRender",function(){c.clickButton(b)});return}else"all"===m&&f&&(v=g,l=t);v+=k._offsetMin;l+=k._offsetMax;c.setSelected(b);f?f.setExtremes(v,l,a(e,1),null,{trigger:"rangeSelectorButton",rangeSelectorButton:k}):
+(p=u(h.options.xAxis)[0],B=p.range,p.range=x,z=p.min,p.min=w,n(h,"load",function(){p.range=B;p.min=z}))}},setSelected:function(a){this.selected=this.options.selected=a},defaultButtons:[{type:"month",count:1,text:"1m"},{type:"month",count:3,text:"3m"},{type:"month",count:6,text:"6m"},{type:"ytd",text:"YTD"},{type:"year",count:1,text:"1y"},{type:"all",text:"All"}],init:function(a){var b=this,c=a.options.rangeSelector,d=c.buttons||[].concat(b.defaultButtons),f=c.selected,r=function(){var a=b.minInput,
+c=b.maxInput;a&&a.blur&&e(a,"blur");c&&c.blur&&e(c,"blur")};b.chart=a;b.options=c;b.buttons=[];a.extraTopMargin=c.height;b.buttonOptions=d;this.unMouseDown=n(a.container,"mousedown",r);this.unResize=n(a,"resize",r);d.forEach(b.computeButtonRange);void 0!==f&&d[f]&&this.clickButton(f,!1);n(a,"load",function(){a.xAxis&&a.xAxis[0]&&n(a.xAxis[0],"setExtremes",function(c){this.max-this.min!==a.fixedRange&&"rangeSelectorButton"!==c.trigger&&"updatedData"!==c.trigger&&b.forcedDataGrouping&&!b.frozenStates&&
+this.setDataGrouping(!1,!1)})})},updateButtonStates:function(){var a=this,b=this.chart,e=b.xAxis[0],h=Math.round(e.max-e.min),f=!e.hasVisibleSeries,r=b.scroller&&b.scroller.getUnionExtremes()||e,x=r.dataMin,g=r.dataMax,b=a.getYTDExtremes(g,x,b.time.useUTC),l=b.min,v=b.max,m=a.selected,p=d(m),n=a.options.allButtonsEnabled,u=a.buttons;a.buttonOptions.forEach(function(b,c){var d=b._range,k=b.type,q=b.count||1,r=u[c],t=0;b=b._offsetMax-b._offsetMin;c=c===m;var y=d>g-x,w=d<e.minRange,I=!1,z=!1,d=d===h;
+("month"===k||"year"===k)&&h+36E5>=864E5*{month:28,year:365}[k]*q-b&&h-36E5<=864E5*{month:31,year:366}[k]*q+b?d=!0:"ytd"===k?(d=v-l+b===h,I=!c):"all"===k&&(d=e.max-e.min>=g-x,z=!c&&p&&d);k=!n&&(y||w||z||f);q=c&&d||d&&!p&&!I||c&&a.frozenStates;k?t=3:q&&(p=!0,t=2);r.state!==t&&r.setState(t)})},computeButtonRange:function(b){var c=b.type,e=b.count||1,d={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5};if(d[c])b._range=d[c]*e;else if("month"===c||"year"===c)b._range=864E5*{month:30,
+year:365}[c]*e;b._offsetMin=a(b.offsetMin,0);b._offsetMax=a(b.offsetMax,0);b._range+=b._offsetMax-b._offsetMin},setInputValue:function(a,b){var c=this.chart.options.rangeSelector,e=this.chart.time,d=this[a+"Input"];w(b)&&(d.previousValue=d.HCTime,d.HCTime=b);d.value=e.dateFormat(c.inputEditDateFormat||"%Y-%m-%d",d.HCTime);this[a+"DateBox"].attr({text:e.dateFormat(c.inputDateFormat||"%b %e, %Y",d.HCTime)})},showInput:function(a){var b=this.inputGroup,c=this[a+"DateBox"];C(this[a+"Input"],{left:b.translateX+
+c.x+"px",top:b.translateY+"px",width:c.width-2+"px",height:c.height-2+"px",border:"2px solid silver"})},hideInput:function(a){C(this[a+"Input"],{border:0,width:"1px",height:"1px"});this.setInputValue(a)},drawInput:function(a){function c(){var a=v.value,b=(x.inputDateParser||Date.parse)(a),c=h.xAxis[0],g=h.scroller&&h.scroller.xAxis?h.scroller.xAxis:c,k=g.dataMin,g=g.dataMax;b!==v.previousValue&&(v.previousValue=b,d(b)||(b=a.split("-"),b=Date.UTC(f(b[0]),f(b[1])-1,f(b[2]))),d(b)&&(h.time.useUTC||(b+=
+6E4*(new Date).getTimezoneOffset()),t?b>e.maxInput.HCTime?b=void 0:b<k&&(b=k):b<e.minInput.HCTime?b=void 0:b>g&&(b=g),void 0!==b&&c.setExtremes(t?b:c.min,t?c.max:b,void 0,void 0,{trigger:"rangeSelectorInput"})))}var e=this,h=e.chart,m=h.renderer.style||{},r=h.renderer,x=h.options.rangeSelector,g=e.div,t="min"===a,v,p,n=this.inputGroup;this[a+"Label"]=p=r.label(B.lang[t?"rangeSelectorFrom":"rangeSelectorTo"],this.inputGroup.offset).addClass("highcharts-range-label").attr({padding:2}).add(n);n.offset+=
+p.width+5;this[a+"DateBox"]=r=r.label("",n.offset).addClass("highcharts-range-input").attr({padding:2,width:x.inputBoxWidth||90,height:x.inputBoxHeight||17,"text-align":"center"}).on("click",function(){e.showInput(a);e[a+"Input"].focus()});h.styledMode||r.attr({stroke:x.inputBoxBorderColor||"#cccccc","stroke-width":1});r.add(n);n.offset+=r.width+(t?10:0);this[a+"Input"]=v=G("input",{name:a,className:"highcharts-range-selector",type:"text"},{top:h.plotTop+"px"},g);h.styledMode||(p.css(l(m,x.labelStyle)),
+r.css(l({color:"#333333"},m,x.inputStyle)),C(v,F({position:"absolute",border:0,width:"1px",height:"1px",padding:0,textAlign:"center",fontSize:m.fontSize,fontFamily:m.fontFamily,top:"-9999em"},x.inputStyle)));v.onfocus=function(){e.showInput(a)};v.onblur=function(){v===b.doc.activeElement&&(c(),e.hideInput(a))};v.onchange=c;v.onkeypress=function(a){13===a.keyCode&&c()}},getPosition:function(){var a=this.chart,b=a.options.rangeSelector,a="top"===b.verticalAlign?a.plotTop-a.axisOffset[0]:0;return{buttonTop:a+
+b.buttonPosition.y,inputTop:a+b.inputPosition.y-10}},getYTDExtremes:function(a,b,e){var c=this.chart.time,d=new c.Date(a),f=c.get("FullYear",d);e=e?c.Date.UTC(f,0,1):+new c.Date(f,0,1);b=Math.max(b||0,e);d=d.getTime();return{max:Math.min(a||d,d),min:b}},render:function(b,e){var c=this,d=c.chart,f=d.renderer,k=d.container,x=d.options,g=x.exporting&&!1!==x.exporting.enabled&&x.navigation&&x.navigation.buttonOptions,l=B.lang,v=c.div,m=x.rangeSelector,n=a(x.chart.style&&x.chart.style.zIndex,0)+1,x=m.floating,
+p=c.buttons,v=c.inputGroup,u=m.buttonTheme,w=m.buttonPosition,z=m.inputPosition,A=m.inputEnabled,C=u&&u.states,D=d.plotLeft,F,E=c.buttonGroup,H;H=c.rendered;var O=c.options.verticalAlign,Q=d.legend,R=Q&&Q.options,J=w.y,P=z.y,S=H||!1,T=S?"animate":"attr",N=0,L=0,M;if(!1!==m.enabled){H||(c.group=H=f.g("range-selector-group").attr({zIndex:7}).add(),c.buttonGroup=E=f.g("range-selector-buttons").add(H),c.zoomText=f.text(l.rangeSelectorZoom,0,15).add(E),d.styledMode||(c.zoomText.css(m.labelStyle),u["stroke-width"]=
+a(u["stroke-width"],0)),c.buttonOptions.forEach(function(a,b){p[b]=f.button(a.text,0,0,function(){var d=a.events&&a.events.click,e;d&&(e=d.call(a));!1!==e&&c.clickButton(b);c.isActive=!0},u,C&&C.hover,C&&C.select,C&&C.disabled).attr({"text-align":"center"}).add(E)}),!1!==A&&(c.div=v=G("div",null,{position:"relative",height:0,zIndex:n}),k.parentNode.insertBefore(v,k),c.inputGroup=v=f.g("input-group").add(H),v.offset=0,c.drawInput("min"),c.drawInput("max")));c.zoomText[T]({x:a(D+w.x,D)});F=a(D+w.x,
+D)+c.zoomText.getBBox().width+5;c.buttonOptions.forEach(function(b,c){p[c][T]({x:F});F+=p[c].width+a(m.buttonSpacing,5)});D=d.plotLeft-d.spacing[3];c.updateButtonStates();g&&this.titleCollision(d)&&"top"===O&&"right"===w.align&&w.y+E.getBBox().height-12<(g.y||0)+g.height&&(N=-40);"left"===w.align?M=w.x-d.spacing[3]:"right"===w.align&&(M=w.x+N-d.spacing[1]);E.align({y:w.y,width:E.getBBox().width,align:w.align,x:M},!0,d.spacingBox);c.group.placed=S;c.buttonGroup.placed=S;!1!==A&&(N=g&&this.titleCollision(d)&&
+"top"===O&&"right"===z.align&&z.y-v.getBBox().height-12<(g.y||0)+g.height+d.spacing[0]?-40:0,"left"===z.align?M=D:"right"===z.align&&(M=-Math.max(d.axisOffset[1],-N)),v.align({y:z.y,width:v.getBBox().width,align:z.align,x:z.x+M-2},!0,d.spacingBox),k=v.alignAttr.translateX+v.alignOptions.x-N+v.getBBox().x+2,g=v.alignOptions.width,l=E.alignAttr.translateX+E.getBBox().x,M=E.getBBox().width+20,(z.align===w.align||l+M>k&&k+g>l&&J<P+v.getBBox().height)&&v.attr({translateX:v.alignAttr.translateX+(d.axisOffset[1]>=
+-N?0:-N),translateY:v.alignAttr.translateY+E.getBBox().height+10}),c.setInputValue("min",b),c.setInputValue("max",e),c.inputGroup.placed=S);c.group.align({verticalAlign:O},!0,d.spacingBox);b=c.group.getBBox().height+20;e=c.group.alignAttr.translateY;"bottom"===O&&(Q=R&&"bottom"===R.verticalAlign&&R.enabled&&!R.floating?Q.legendHeight+a(R.margin,10):0,b=b+Q-20,L=e-b-(x?0:m.y)-10);if("top"===O)x&&(L=0),d.titleOffset&&(L=d.titleOffset+d.options.title.margin),L+=d.margin[0]-d.spacing[0]||0;else if("middle"===
+O)if(P===J)L=0>P?e+void 0:e;else if(P||J)L=0>P||0>J?L-Math.min(P,J):e-b+NaN;c.group.translate(m.x,m.y+Math.floor(L));!1!==A&&(c.minInput.style.marginTop=c.group.translateY+"px",c.maxInput.style.marginTop=c.group.translateY+"px");c.rendered=!0}},getHeight:function(){var a=this.options,b=this.group,d=a.y,e=a.buttonPosition.y,a=a.inputPosition.y,b=b?b.getBBox(!0).height+13+d:0,d=Math.min(a,e);if(0>a&&0>e||0<a&&0<e)b+=Math.abs(d);return b},titleCollision:function(a){return!(a.options.title.text||a.options.subtitle.text)},
+update:function(a){var b=this.chart;l(!0,b.options.rangeSelector,a);this.destroy();this.init(b);b.rangeSelector.render()},destroy:function(){var a=this,d=a.minInput,e=a.maxInput;a.unMouseDown();a.unResize();A(a.buttons);d&&(d.onfocus=d.onblur=d.onchange=null);e&&(e.onfocus=e.onblur=e.onchange=null);b.objectEach(a,function(b,c){b&&"chart"!==c&&(b.destroy?b.destroy():b.nodeType&&z(this[c]));b!==D.prototype[c]&&(a[c]=null)},this)}};E.prototype.toFixedRange=function(b,e,f,h){var c=this.chart&&this.chart.fixedRange;
+b=a(f,this.translate(b,!0,!this.horiz));e=a(h,this.translate(e,!0,!this.horiz));f=c&&(e-b)/c;.7<f&&1.3>f&&(h?b=e-c:e=b+c);d(b)&&d(e)||(b=e=void 0);return{min:b,max:e}};E.prototype.minFromRange=function(){var b=this.range,e={month:"Month",year:"FullYear"}[b.type],f,h=this.max,l,r,x=function(a,b){var c=new Date(a),d=c["get"+e]();c["set"+e](d+b);d===c["get"+e]()&&c.setDate(0);return c.getTime()-a};d(b)?(f=h-b,r=b):(f=h+x(h,-b.count),this.chart&&(this.chart.fixedRange=h-f));l=a(this.dataMin,Number.MIN_VALUE);
+d(f)||(f=l);f<=l&&(f=l,void 0===r&&(r=x(f,b.count)),this.newMax=Math.min(f+r,this.dataMax));d(h)||(f=void 0);return f};n(p,"afterGetContainer",function(){this.options.rangeSelector.enabled&&(this.rangeSelector=new D(this))});m(p.prototype,"render",function(a,b,e){var c=this.axes,d=this.rangeSelector;d&&(c.forEach(function(a){a.updateNames();a.setScale()}),this.getAxisMargins(),d.render(),c=d.options.verticalAlign,d.options.floating||("bottom"===c?this.extraBottomMargin=!0:"middle"!==c&&(this.extraTopMargin=
+!0)));a.call(this,b,e)});n(p,"update",function(a){var b=a.options.rangeSelector;a=this.rangeSelector;var c=this.extraBottomMargin,d=this.extraTopMargin;b&&b.enabled&&!w(a)&&(this.options.rangeSelector.enabled=!0,this.rangeSelector=new D(this));this.extraTopMargin=this.extraBottomMargin=!1;a&&(a.render(),b=b&&b.verticalAlign||a.options&&a.options.verticalAlign,a.options.floating||("bottom"===b?this.extraBottomMargin=!0:"middle"!==b&&(this.extraTopMargin=!0)),this.extraBottomMargin!==c||this.extraTopMargin!==
+d)&&(this.isDirtyBox=!0)});m(p.prototype,"redraw",function(a,b,d){var c=this.rangeSelector;c&&!c.options.floating&&(c.render(),c=c.options.verticalAlign,"bottom"===c?this.extraBottomMargin=!0:"middle"!==c&&(this.extraTopMargin=!0));a.call(this,b,d)});n(p,"getMargins",function(){var a=this.rangeSelector;a&&(a=a.getHeight(),this.extraTopMargin&&(this.plotTop+=a),this.extraBottomMargin&&(this.marginBottom+=a))});p.prototype.callbacks.push(function(a){function b(){c=a.xAxis[0].getExtremes();d(c.min)&&
+e.render(c.min,c.max)}var c,e=a.rangeSelector,f,r;e&&(r=n(a.xAxis[0],"afterSetExtremes",function(a){e.render(a.min,a.max)}),f=n(a,"redraw",b),b());n(a,"destroy",function(){e&&(f(),r())})});b.RangeSelector=D})(H);(function(b){var D=b.addEvent,n=b.arrayMax,E=b.arrayMin,p=b.Axis,C=b.Chart,G=b.defined,B=b.extend,w=b.format,A=b.isNumber,z=b.isString,F=b.merge,e=b.pick,d=b.Point,l=b.Renderer,a=b.Series,f=b.splat,u=b.SVGRenderer,m=b.VMLRenderer,c=b.wrap,k=a.prototype,q=k.init,h=k.processData,y=d.prototype.tooltipFormatter;
+b.StockChart=b.stockChart=function(a,c,d){var g=z(a)||a.nodeName,h=arguments[g?1:0],k=h,r=h.series,l=b.getOptions(),x,m=e(h.navigator&&h.navigator.enabled,l.navigator.enabled,!0),p=m?{startOnTick:!1,endOnTick:!1}:null,n={marker:{enabled:!1,radius:2}},q={shadow:!1,borderWidth:0};h.xAxis=f(h.xAxis||{}).map(function(a,b){return F({minPadding:0,maxPadding:0,overscroll:0,ordinal:!0,title:{text:null},labels:{overflow:"justify"},showLastLabel:!0},l.xAxis,l.xAxis&&l.xAxis[b],a,{type:"datetime",categories:null},
+p)});h.yAxis=f(h.yAxis||{}).map(function(a,b){x=e(a.opposite,!0);return F({labels:{y:-2},opposite:x,showLastLabel:!(!a.categories&&"category"!==a.type),title:{text:null}},l.yAxis,l.yAxis&&l.yAxis[b],a)});h.series=null;h=F({chart:{panning:!0,pinchType:"x"},navigator:{enabled:m},scrollbar:{enabled:e(l.scrollbar.enabled,!0)},rangeSelector:{enabled:e(l.rangeSelector.enabled,!0)},title:{text:null},tooltip:{split:e(l.tooltip.split,!0),crosshairs:!0},legend:{enabled:!1},plotOptions:{line:n,spline:n,area:n,
+areaspline:n,arearange:n,areasplinerange:n,column:q,columnrange:q,candlestick:q,ohlc:q}},h,{isStock:!0});h.series=k.series=r;return g?new C(a,h,d):new C(h,c)};c(p.prototype,"autoLabelAlign",function(a){var b=this.chart,c=this.options,b=b._labelPanes=b._labelPanes||{},d=this.options.labels;return this.chart.options.isStock&&"yAxis"===this.coll&&(c=c.top+","+c.height,!b[c]&&d.enabled)?(15===d.x&&(d.x=0),void 0===d.align&&(d.align="right"),b[c]=this,"right"):a.apply(this,[].slice.call(arguments,1))});
+D(p,"destroy",function(){var a=this.chart,b=this.options&&this.options.top+","+this.options.height;b&&a._labelPanes&&a._labelPanes[b]===this&&delete a._labelPanes[b]});c(p.prototype,"getPlotLinePath",function(a,c,d,f,h,k){var g=this,l=this.isLinked&&!this.series?this.linkedParent.series:this.series,r=g.chart,m=r.renderer,x=g.left,t=g.top,n,v,p,q,w=[],u=[],y,B;if("xAxis"!==g.coll&&"yAxis"!==g.coll)return a.apply(this,[].slice.call(arguments,1));u=function(a){var b="xAxis"===a?"yAxis":"xAxis";a=g.options[b];
+return A(a)?[r[b][a]]:z(a)?[r.get(a)]:l.map(function(a){return a[b]})}(g.coll);(g.isXAxis?r.yAxis:r.xAxis).forEach(function(a){if(G(a.options.id)?-1===a.options.id.indexOf("navigator"):1){var b=a.isXAxis?"yAxis":"xAxis",b=G(a.options[b])?r[b][a.options[b]]:r[b][0];g===b&&u.push(a)}});y=u.length?[]:[g.isXAxis?r.yAxis[0]:r.xAxis[0]];u.forEach(function(a){-1!==y.indexOf(a)||b.find(y,function(b){return b.pos===a.pos&&b.len===a.len})||y.push(a)});B=e(k,g.translate(c,null,null,f));A(B)&&(g.horiz?y.forEach(function(a){var b;
+v=a.pos;q=v+a.len;n=p=Math.round(B+g.transB);"pass"!==h&&(n<x||n>x+g.width)&&(h?n=p=Math.min(Math.max(x,n),x+g.width):b=!0);b||w.push("M",n,v,"L",p,q)}):y.forEach(function(a){var b;n=a.pos;p=n+a.len;v=q=Math.round(t+g.height-B);"pass"!==h&&(v<t||v>t+g.height)&&(h?v=q=Math.min(Math.max(t,v),g.top+g.height):b=!0);b||w.push("M",n,v,"L",p,q)}));return 0<w.length?m.crispPolyLine(w,d||1):null});u.prototype.crispPolyLine=function(a,b){var c;for(c=0;c<a.length;c+=6)a[c+1]===a[c+4]&&(a[c+1]=a[c+4]=Math.round(a[c+
+1])-b%2/2),a[c+2]===a[c+5]&&(a[c+2]=a[c+5]=Math.round(a[c+2])+b%2/2);return a};l===m&&(m.prototype.crispPolyLine=u.prototype.crispPolyLine);c(p.prototype,"hideCrosshair",function(a,b){a.call(this,b);this.crossLabel&&(this.crossLabel=this.crossLabel.hide())});D(p,"afterDrawCrosshair",function(a){var b,c;if(G(this.crosshair.label)&&this.crosshair.label.enabled&&this.cross){var d=this.chart,f=this.options.crosshair.label,h=this.horiz;b=this.opposite;c=this.left;var k=this.top,l=this.crossLabel,m=f.format,
+r="",n="inside"===this.options.tickPosition,p=!1!==this.crosshair.snap,q=0,u=a.e||this.cross&&this.cross.e,y=a.point;a=this.lin2log;var z,A;this.isLog?(z=a(this.min),A=a(this.max)):(z=this.min,A=this.max);a=h?"center":b?"right"===this.labelAlign?"right":"left":"left"===this.labelAlign?"left":"center";l||(l=this.crossLabel=d.renderer.label(null,null,null,f.shape||"callout").addClass("highcharts-crosshair-label"+(this.series[0]&&" highcharts-color-"+this.series[0].colorIndex)).attr({align:f.align||
+a,padding:e(f.padding,8),r:e(f.borderRadius,3),zIndex:2}).add(this.labelGroup),d.styledMode||l.attr({fill:f.backgroundColor||this.series[0]&&this.series[0].color||"#666666",stroke:f.borderColor||"","stroke-width":f.borderWidth||0}).css(B({color:"#ffffff",fontWeight:"normal",fontSize:"11px",textAlign:"center"},f.style)));h?(a=p?y.plotX+c:u.chartX,k+=b?0:this.height):(a=b?this.width+c:0,k=p?y.plotY+k:u.chartY);m||f.formatter||(this.isDatetimeAxis&&(r="%b %d, %Y"),m="{value"+(r?":"+r:"")+"}");r=p?y[this.isXAxis?
+"x":"y"]:this.toValue(h?u.chartX:u.chartY);l.attr({text:m?w(m,{value:r},d.time):f.formatter.call(this,r),x:a,y:k,visibility:r<z||r>A?"hidden":"visible"});f=l.getBBox();if(h){if(n&&!b||!n&&b)k=l.y-f.height}else k=l.y-f.height/2;h?(b=c-f.x,c=c+this.width-f.x):(b="left"===this.labelAlign?c:0,c="right"===this.labelAlign?c+this.width:d.chartWidth);l.translateX<b&&(q=b-l.translateX);l.translateX+f.width>=c&&(q=-(l.translateX+f.width-c));l.attr({x:a+q,y:k,anchorX:h?a:this.opposite?0:d.chartWidth,anchorY:h?
+this.opposite?d.chartHeight:0:k+f.height/2})}});k.init=function(){q.apply(this,arguments);this.setCompare(this.options.compare)};k.setCompare=function(a){this.modifyValue="value"===a||"percent"===a?function(b,c){var d=this.compareValue;if(void 0!==b&&void 0!==d)return b="value"===a?b-d:b/d*100-(100===this.options.compareBase?0:100),c&&(c.change=b),b}:null;this.userOptions.compare=a;this.chart.hasRendered&&(this.isDirty=!0)};k.processData=function(){var a,b=-1,c,d,e=!0===this.options.compareStart?
+0:1,f,k;h.apply(this,arguments);if(this.xAxis&&this.processedYData)for(c=this.processedXData,d=this.processedYData,f=d.length,this.pointArrayMap&&(b=this.pointArrayMap.indexOf("close"),-1===b&&(b=this.pointArrayMap.indexOf(this.pointValKey||"y"))),a=0;a<f-e;a++)if(k=d[a]&&-1<b?d[a][b]:d[a],A(k)&&c[a+e]>=this.xAxis.min&&0!==k){this.compareValue=k;break}};c(k,"getExtremes",function(a){var b;a.apply(this,[].slice.call(arguments,1));this.modifyValue&&(b=[this.modifyValue(this.dataMin),this.modifyValue(this.dataMax)],
+this.dataMin=E(b),this.dataMax=n(b))});p.prototype.setCompare=function(a,b){this.isXAxis||(this.series.forEach(function(b){b.setCompare(a)}),e(b,!0)&&this.chart.redraw())};d.prototype.tooltipFormatter=function(a){a=a.replace("{point.change}",(0<this.change?"+":"")+b.numberFormat(this.change,e(this.series.tooltipOptions.changeDecimals,2)));return y.apply(this,[a])};c(a.prototype,"render",function(a){var b;this.chart.is3d&&this.chart.is3d()||this.chart.polar||!this.xAxis||this.xAxis.isRadial||(b=this.yAxis.len-
+(this.xAxis.axisLine?Math.floor(this.xAxis.axisLine.strokeWidth()/2):0),!this.clipBox&&this.animate?(this.clipBox=F(this.chart.clipBox),this.clipBox.width=this.xAxis.len,this.clipBox.height=b):this.chart[this.sharedClipKey]?this.chart[this.sharedClipKey].attr({width:this.xAxis.len,height:b}):this.clipBox&&(this.clipBox.width=this.xAxis.len,this.clipBox.height=b));a.call(this)});c(C.prototype,"getSelectedPoints",function(a){var b=a.call(this);this.series.forEach(function(a){a.hasGroupedData&&(b=b.concat((a.points||
+[]).filter(function(a){return a.selected})))});return b});D(C,"update",function(a){a=a.options;"scrollbar"in a&&this.navigator&&(F(!0,this.options.scrollbar,a.scrollbar),this.navigator.update({},!1),delete a.scrollbar)})})(H)});
+//# sourceMappingURL=stock.js.map
+</script>
+<script>/*
+ Highmaps JS v7.0.1 (2018-12-19)
+ Highmaps as a plugin for Highcharts or Highstock.
+
+ (c) 2011-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(z){"object"===typeof module&&module.exports?module.exports=z:"function"===typeof define&&define.amd?define(function(){return z}):z("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(z){(function(a){var p=a.addEvent,h=a.Axis,n=a.pick;p(h,"getSeriesExtremes",function(){var a=[];this.isXAxis&&(this.series.forEach(function(e,r){e.useMapGeometry&&(a[r]=e.xData,e.xData=[])}),this.seriesXData=a)});p(h,"afterGetSeriesExtremes",function(){var a=this.seriesXData,e,t,h;this.isXAxis&&(e=
+n(this.dataMin,Number.MAX_VALUE),t=n(this.dataMax,-Number.MAX_VALUE),this.series.forEach(function(d,b){d.useMapGeometry&&(e=Math.min(e,n(d.minX,e)),t=Math.max(t,n(d.maxX,t)),d.xData=a[b],h=!0)}),h&&(this.dataMin=e,this.dataMax=t),delete this.seriesXData)});p(h,"afterSetAxisTranslation",function(){var a=this.chart,e;e=a.plotWidth/a.plotHeight;var a=a.xAxis[0],h;"yAxis"===this.coll&&void 0!==a.transA&&this.series.forEach(function(a){a.preserveAspectRatio&&(h=!0)});if(h&&(this.transA=a.transA=Math.min(this.transA,
+a.transA),e/=(a.max-a.min)/(this.max-this.min),e=1>e?this:a,a=(e.max-e.min)*e.transA,e.pixelPadding=e.len-a,e.minPixelPadding=e.pixelPadding/2,a=e.fixTo)){a=a[1]-e.toValue(a[0],!0);a*=e.transA;if(Math.abs(a)>e.minPixelPadding||e.min===e.dataMin&&e.max===e.dataMax)a=0;e.minPixelPadding-=a}});p(h,"render",function(){this.fixTo=null})})(z);(function(a){var p=a.addEvent,h=a.Axis,n=a.Chart,r=a.color,e,t=a.extend,y=a.isNumber,d=a.Legend,b=a.LegendSymbolMixin,f=a.noop,u=a.merge,q=a.pick;a.ColorAxis||(e=
+a.ColorAxis=function(){this.init.apply(this,arguments)},t(e.prototype,h.prototype),t(e.prototype,{defaultColorAxisOptions:{lineWidth:0,minPadding:0,maxPadding:0,gridLineWidth:1,tickPixelInterval:72,startOnTick:!0,endOnTick:!0,offset:0,marker:{animation:{duration:50},width:.01,color:"#999999"},labels:{overflow:"justify",rotation:0},minColor:"#e6ebf5",maxColor:"#003399",tickLength:5,showInLegend:!0},keepProps:["legendGroup","legendItemHeight","legendItemWidth","legendItem","legendSymbol"].concat(h.prototype.keepProps),
+init:function(c,l){var g="vertical"!==c.options.legend.layout,a;this.coll="colorAxis";a=u(this.defaultColorAxisOptions,{side:g?2:1,reversed:!g},l,{opposite:!g,showEmpty:!1,title:null,visible:c.options.legend.enabled});h.prototype.init.call(this,c,a);l.dataClasses&&this.initDataClasses(l);this.initStops();this.horiz=g;this.zoomEnabled=!1;this.defaultLegendLength=200},initDataClasses:function(c){var l=this.chart,g,a=0,k=l.options.chart.colorCount,m=this.options,b=c.dataClasses.length;this.dataClasses=
+g=[];this.legendItems=[];c.dataClasses.forEach(function(c,x){c=u(c);g.push(c);if(l.styledMode||!c.color)"category"===m.dataClassColor?(l.styledMode||(x=l.options.colors,k=x.length,c.color=x[a]),c.colorIndex=a,a++,a===k&&(a=0)):c.color=r(m.minColor).tweenTo(r(m.maxColor),2>b?.5:x/(b-1))})},setTickPositions:function(){if(!this.dataClasses)return h.prototype.setTickPositions.call(this)},initStops:function(){this.stops=this.options.stops||[[0,this.options.minColor],[1,this.options.maxColor]];this.stops.forEach(function(c){c.color=
+r(c[1])})},setOptions:function(c){h.prototype.setOptions.call(this,c);this.options.crosshair=this.options.marker},setAxisSize:function(){var c=this.legendSymbol,l=this.chart,g=l.options.legend||{},a,k;c?(this.left=g=c.attr("x"),this.top=a=c.attr("y"),this.width=k=c.attr("width"),this.height=c=c.attr("height"),this.right=l.chartWidth-g-k,this.bottom=l.chartHeight-a-c,this.len=this.horiz?k:c,this.pos=this.horiz?g:a):this.len=(this.horiz?g.symbolWidth:g.symbolHeight)||this.defaultLegendLength},normalizedValue:function(c){this.isLog&&
+(c=this.val2lin(c));return 1-(this.max-c)/(this.max-this.min||1)},toColor:function(c,l){var a=this.stops,b,k,m=this.dataClasses,x,v;if(m)for(v=m.length;v--;){if(x=m[v],b=x.from,a=x.to,(void 0===b||c>=b)&&(void 0===a||c<=a)){k=x.color;l&&(l.dataClass=v,l.colorIndex=x.colorIndex);break}}else{c=this.normalizedValue(c);for(v=a.length;v--&&!(c>a[v][0]););b=a[v]||a[v+1];a=a[v+1]||b;c=1-(a[0]-c)/(a[0]-b[0]||1);k=b.color.tweenTo(a.color,c)}return k},getOffset:function(){var c=this.legendGroup,a=this.chart.axisOffset[this.side];
+c&&(this.axisParent=c,h.prototype.getOffset.call(this),this.added||(this.added=!0,this.labelLeft=0,this.labelRight=this.width),this.chart.axisOffset[this.side]=a)},setLegendColor:function(){var c,a=this.reversed;c=a?1:0;a=a?0:1;c=this.horiz?[c,0,a,0]:[0,a,0,c];this.legendColor={linearGradient:{x1:c[0],y1:c[1],x2:c[2],y2:c[3]},stops:this.stops}},drawLegendSymbol:function(c,a){var l=c.padding,b=c.options,k=this.horiz,m=q(b.symbolWidth,k?this.defaultLegendLength:12),x=q(b.symbolHeight,k?12:this.defaultLegendLength),
+v=q(b.labelPadding,k?16:30),b=q(b.itemDistance,10);this.setLegendColor();a.legendSymbol=this.chart.renderer.rect(0,c.baseline-11,m,x).attr({zIndex:1}).add(a.legendGroup);this.legendItemWidth=m+l+(k?b:v);this.legendItemHeight=x+l+(k?v:0)},setState:function(c){this.series.forEach(function(a){a.setState(c)})},visible:!0,setVisible:f,getSeriesExtremes:function(){var c=this.series,a=c.length;this.dataMin=Infinity;for(this.dataMax=-Infinity;a--;)c[a].getExtremes(),void 0!==c[a].valueMin&&(this.dataMin=
+Math.min(this.dataMin,c[a].valueMin),this.dataMax=Math.max(this.dataMax,c[a].valueMax))},drawCrosshair:function(c,a){var b=a&&a.plotX,l=a&&a.plotY,k,m=this.pos,x=this.len;a&&(k=this.toPixels(a[a.series.colorKey]),k<m?k=m-2:k>m+x&&(k=m+x+2),a.plotX=k,a.plotY=this.len-k,h.prototype.drawCrosshair.call(this,c,a),a.plotX=b,a.plotY=l,this.cross&&!this.cross.addedToColorAxis&&this.legendGroup&&(this.cross.addClass("highcharts-coloraxis-marker").add(this.legendGroup),this.cross.addedToColorAxis=!0,this.chart.styledMode||
+this.cross.attr({fill:this.crosshair.color})))},getPlotLinePath:function(c,a,b,f,k){return y(k)?this.horiz?["M",k-4,this.top-6,"L",k+4,this.top-6,k,this.top,"Z"]:["M",this.left,k,"L",this.left-6,k+6,this.left-6,k-6,"Z"]:h.prototype.getPlotLinePath.call(this,c,a,b,f)},update:function(c,a){var b=this.chart,l=b.legend;this.series.forEach(function(c){c.isDirtyData=!0});c.dataClasses&&l.allItems&&(l.allItems.forEach(function(c){c.isDataClass&&c.legendGroup&&c.legendGroup.destroy()}),b.isDirtyLegend=!0);
+b.options[this.coll]=u(this.userOptions,c);h.prototype.update.call(this,c,a);this.legendItem&&(this.setLegendColor(),l.colorizeItem(this,!0))},remove:function(){this.legendItem&&this.chart.legend.destroyItem(this);h.prototype.remove.call(this)},getDataClassLegendSymbols:function(){var c=this,l=this.chart,g=this.legendItems,d=l.options.legend,k=d.valueDecimals,m=d.valueSuffix||"",x;g.length||this.dataClasses.forEach(function(v,d){var A=!0,e=v.from,u=v.to;x="";void 0===e?x="\x3c ":void 0===u&&(x="\x3e ");
+void 0!==e&&(x+=a.numberFormat(e,k)+m);void 0!==e&&void 0!==u&&(x+=" - ");void 0!==u&&(x+=a.numberFormat(u,k)+m);g.push(t({chart:l,name:x,options:{},drawLegendSymbol:b.drawRectangle,visible:!0,setState:f,isDataClass:!0,setVisible:function(){A=this.visible=!A;c.series.forEach(function(c){c.points.forEach(function(c){c.dataClass===d&&c.setVisible(A)})});l.legend.colorizeItem(this,A)}},v))});return g},name:""}),["fill","stroke"].forEach(function(c){a.Fx.prototype[c+"Setter"]=function(){this.elem.attr(c,
+r(this.start).tweenTo(r(this.end),this.pos),null,!0)}}),p(n,"afterGetAxes",function(){var c=this.options.colorAxis;this.colorAxis=[];c&&new e(this,c)}),p(d,"afterGetAllItems",function(c){var b=[],g=this.chart.colorAxis[0];g&&g.options&&g.options.showInLegend&&(g.options.dataClasses?b=g.getDataClassLegendSymbols():b.push(g),g.series.forEach(function(b){a.erase(c.allItems,b)}));for(g=b.length;g--;)c.allItems.unshift(b[g])}),p(d,"afterColorizeItem",function(c){c.visible&&c.item.legendColor&&c.item.legendSymbol.attr({fill:c.item.legendColor})}),
+p(d,"afterUpdate",function(c,a,b){this.chart.colorAxis[0]&&this.chart.colorAxis[0].update({},b)}))})(z);(function(a){var p=a.defined,h=a.noop,n=a.seriesTypes;a.colorPointMixin={isValid:function(){return null!==this.value&&Infinity!==this.value&&-Infinity!==this.value},setVisible:function(a){var e=this,r=a?"show":"hide";e.visible=!!a;["graphic","dataLabel"].forEach(function(a){if(e[a])e[a][r]()})},setState:function(r){a.Point.prototype.setState.call(this,r);this.graphic&&this.graphic.attr({zIndex:"hover"===
+r?1:0})}};a.colorSeriesMixin={pointArrayMap:["value"],axisTypes:["xAxis","yAxis","colorAxis"],optionalAxis:"colorAxis",trackerGroups:["group","markerGroup","dataLabelsGroup"],getSymbol:h,parallelArrays:["x","y","value"],colorKey:"value",pointAttribs:n.column.prototype.pointAttribs,translateColors:function(){var a=this,e=this.options.nullColor,h=this.colorAxis,n=this.colorKey;this.data.forEach(function(d){var b=d[n];if(b=d.options.color||(d.isNull?e:h&&void 0!==b?h.toColor(b,d):d.color||a.color))d.color=
+b})},colorAttribs:function(a){var e={};p(a.color)&&(e[this.colorProp||"fill"]=a.color);return e}}})(z);(function(a){function p(a){a&&(a.preventDefault&&a.preventDefault(),a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)}function h(a){this.init(a)}var n=a.addEvent,r=a.Chart,e=a.doc,t=a.extend,y=a.merge,d=a.pick;h.prototype.init=function(a){this.chart=a;a.mapNavButtons=[]};h.prototype.update=function(b){var f=this.chart,e=f.options.mapNavigation,q,c,l,g,w,k=function(c){this.handler.call(f,
+c);p(c)},m=f.mapNavButtons;b&&(e=f.options.mapNavigation=y(f.options.mapNavigation,b));for(;m.length;)m.pop().destroy();d(e.enableButtons,e.enabled)&&!f.renderer.forExport&&a.objectEach(e.buttons,function(a,b){q=y(e.buttonOptions,a);f.styledMode||(c=q.theme,c.style=y(q.theme.style,q.style),g=(l=c.states)&&l.hover,w=l&&l.select);a=f.renderer.button(q.text,0,0,k,c,g,w,0,"zoomIn"===b?"topbutton":"bottombutton").addClass("highcharts-map-navigation highcharts-"+{zoomIn:"zoom-in",zoomOut:"zoom-out"}[b]).attr({width:q.width,
+height:q.height,title:f.options.lang[b],padding:q.padding,zIndex:5}).add();a.handler=q.onclick;a.align(t(q,{width:a.width,height:2*a.height}),null,q.alignTo);n(a.element,"dblclick",p);m.push(a)});this.updateEvents(e)};h.prototype.updateEvents=function(a){var b=this.chart;d(a.enableDoubleClickZoom,a.enabled)||a.enableDoubleClickZoomTo?this.unbindDblClick=this.unbindDblClick||n(b.container,"dblclick",function(a){b.pointer.onContainerDblClick(a)}):this.unbindDblClick&&(this.unbindDblClick=this.unbindDblClick());
+d(a.enableMouseWheelZoom,a.enabled)?this.unbindMouseWheel=this.unbindMouseWheel||n(b.container,void 0===e.onmousewheel?"DOMMouseScroll":"mousewheel",function(a){b.pointer.onContainerMouseWheel(a);p(a);return!1}):this.unbindMouseWheel&&(this.unbindMouseWheel=this.unbindMouseWheel())};t(r.prototype,{fitToBox:function(a,f){[["x","width"],["y","height"]].forEach(function(b){var e=b[0];b=b[1];a[e]+a[b]>f[e]+f[b]&&(a[b]>f[b]?(a[b]=f[b],a[e]=f[e]):a[e]=f[e]+f[b]-a[b]);a[b]>f[b]&&(a[b]=f[b]);a[e]<f[e]&&(a[e]=
+f[e])});return a},mapZoom:function(a,f,e,r,c){var b=this.xAxis[0],g=b.max-b.min,w=d(f,b.min+g/2),k=g*a,g=this.yAxis[0],m=g.max-g.min,x=d(e,g.min+m/2),m=m*a,w=this.fitToBox({x:w-k*(r?(r-b.pos)/b.len:.5),y:x-m*(c?(c-g.pos)/g.len:.5),width:k,height:m},{x:b.dataMin,y:g.dataMin,width:b.dataMax-b.dataMin,height:g.dataMax-g.dataMin}),k=w.x<=b.dataMin&&w.width>=b.dataMax-b.dataMin&&w.y<=g.dataMin&&w.height>=g.dataMax-g.dataMin;r&&(b.fixTo=[r-b.pos,f]);c&&(g.fixTo=[c-g.pos,e]);void 0===a||k?(b.setExtremes(void 0,
+void 0,!1),g.setExtremes(void 0,void 0,!1)):(b.setExtremes(w.x,w.x+w.width,!1),g.setExtremes(w.y,w.y+w.height,!1));this.redraw()}});n(r,"beforeRender",function(){this.mapNavigation=new h(this);this.mapNavigation.update()});a.MapNavigation=h})(z);(function(a){var p=a.extend,h=a.pick,n=a.Pointer;a=a.wrap;p(n.prototype,{onContainerDblClick:function(a){var e=this.chart;a=this.normalize(a);e.options.mapNavigation.enableDoubleClickZoomTo?e.pointer.inClass(a.target,"highcharts-tracker")&&e.hoverPoint&&e.hoverPoint.zoomTo():
+e.isInsidePlot(a.chartX-e.plotLeft,a.chartY-e.plotTop)&&e.mapZoom(.5,e.xAxis[0].toValue(a.chartX),e.yAxis[0].toValue(a.chartY),a.chartX,a.chartY)},onContainerMouseWheel:function(a){var e=this.chart,h;a=this.normalize(a);h=a.detail||-(a.wheelDelta/120);e.isInsidePlot(a.chartX-e.plotLeft,a.chartY-e.plotTop)&&e.mapZoom(Math.pow(e.options.mapNavigation.mouseWheelSensitivity,h),e.xAxis[0].toValue(a.chartX),e.yAxis[0].toValue(a.chartY),a.chartX,a.chartY)}});a(n.prototype,"zoomOption",function(a){var e=
+this.chart.options.mapNavigation;h(e.enableTouchZoom,e.enabled)&&(this.chart.options.chart.pinchType="xy");a.apply(this,[].slice.call(arguments,1))});a(n.prototype,"pinchTranslate",function(a,e,h,n,d,b,f){a.call(this,e,h,n,d,b,f);"map"===this.chart.options.chart.type&&this.hasZoom&&(a=n.scaleX>n.scaleY,this.pinchTranslateDirection(!a,e,h,n,d,b,f,a?n.scaleX:n.scaleY))})})(z);(function(a){var p=a.colorPointMixin,h=a.extend,n=a.isNumber,r=a.merge,e=a.noop,t=a.pick,y=a.isArray,d=a.Point,b=a.Series,f=
+a.seriesType,u=a.seriesTypes,q=a.splat;f("map","scatter",{animation:!1,dataLabels:{crop:!1,formatter:function(){return this.point.value},inside:!0,overflow:!1,padding:0,verticalAlign:"middle"},marker:null,nullColor:"#f7f7f7",stickyTracking:!1,tooltip:{followPointer:!0,pointFormat:"{point.name}: {point.value}\x3cbr/\x3e"},turboThreshold:0,allAreas:!0,borderColor:"#cccccc",borderWidth:1,joinBy:"hc-key",states:{hover:{halo:null,brightness:.2},normal:{animation:!0},select:{color:"#cccccc"}}},r(a.colorSeriesMixin,
+{type:"map",getExtremesFromAll:!0,useMapGeometry:!0,forceDL:!0,searchPoint:e,directTouch:!0,preserveAspectRatio:!0,pointArrayMap:["value"],getBox:function(c){var b=Number.MAX_VALUE,g=-b,e=b,k=-b,m=b,x=b,v=this.xAxis,f=this.yAxis,d;(c||[]).forEach(function(c){if(c.path){"string"===typeof c.path&&(c.path=a.splitPath(c.path));var l=c.path||[],f=l.length,v=!1,A=-b,w=b,u=-b,h=b,q=c.properties;if(!c._foundBox){for(;f--;)n(l[f])&&(v?(A=Math.max(A,l[f]),w=Math.min(w,l[f])):(u=Math.max(u,l[f]),h=Math.min(h,
+l[f])),v=!v);c._midX=w+(A-w)*t(c.middleX,q&&q["hc-middle-x"],.5);c._midY=h+(u-h)*t(c.middleY,q&&q["hc-middle-y"],.5);c._maxX=A;c._minX=w;c._maxY=u;c._minY=h;c.labelrank=t(c.labelrank,(A-w)*(u-h));c._foundBox=!0}g=Math.max(g,c._maxX);e=Math.min(e,c._minX);k=Math.max(k,c._maxY);m=Math.min(m,c._minY);x=Math.min(c._maxX-c._minX,c._maxY-c._minY,x);d=!0}});d&&(this.minY=Math.min(m,t(this.minY,b)),this.maxY=Math.max(k,t(this.maxY,-b)),this.minX=Math.min(e,t(this.minX,b)),this.maxX=Math.max(g,t(this.maxX,
+-b)),v&&void 0===v.options.minRange&&(v.minRange=Math.min(5*x,(this.maxX-this.minX)/5,v.minRange||b)),f&&void 0===f.options.minRange&&(f.minRange=Math.min(5*x,(this.maxY-this.minY)/5,f.minRange||b)))},getExtremes:function(){b.prototype.getExtremes.call(this,this.valueData);this.chart.hasRendered&&this.isDirtyData&&this.getBox(this.options.data);this.valueMin=this.dataMin;this.valueMax=this.dataMax;this.dataMin=this.minY;this.dataMax=this.maxY},translatePath:function(a){var c=!1,b=this.xAxis,f=this.yAxis,
+k=b.min,m=b.transA,b=b.minPixelPadding,e=f.min,v=f.transA,f=f.minPixelPadding,d,h=[];if(a)for(d=a.length;d--;)n(a[d])?(h[d]=c?(a[d]-k)*m+b:(a[d]-e)*v+f,c=!c):h[d]=a[d];return h},setData:function(c,l,g,f){var k=this.options,m=this.chart.options.chart,e=m&&m.map,v=k.mapData,d=k.joinBy,w=null===d,h=k.keys||this.pointArrayMap,u=[],t={},p=this.chart.mapTransforms;!v&&e&&(v="string"===typeof e?a.maps[e]:e);w&&(d="_i");d=this.joinBy=q(d);d[1]||(d[1]=d[0]);c&&c.forEach(function(b,m){var g=0;if(n(b))c[m]=
+{value:b};else if(y(b)){c[m]={};!k.keys&&b.length>h.length&&"string"===typeof b[0]&&(c[m]["hc-key"]=b[0],++g);for(var d=0;d<h.length;++d,++g)h[d]&&void 0!==b[g]&&(0<h[d].indexOf(".")?a.Point.prototype.setNestedProperty(c[m],b[g],h[d]):c[m][h[d]]=b[g])}w&&(c[m]._i=m)});this.getBox(c);(this.chart.mapTransforms=p=m&&m.mapTransforms||v&&v["hc-transform"]||p)&&a.objectEach(p,function(a){a.rotation&&(a.cosAngle=Math.cos(a.rotation),a.sinAngle=Math.sin(a.rotation))});if(v){"FeatureCollection"===v.type&&
+(this.mapTitle=v.title,v=a.geojson(v,this.type,this));this.mapData=v;this.mapMap={};for(p=0;p<v.length;p++)m=v[p],e=m.properties,m._i=p,d[0]&&e&&e[d[0]]&&(m[d[0]]=e[d[0]]),t[m[d[0]]]=m;this.mapMap=t;c&&d[1]&&c.forEach(function(a){t[a[d[1]]]&&u.push(t[a[d[1]]])});k.allAreas?(this.getBox(v),c=c||[],d[1]&&c.forEach(function(a){u.push(a[d[1]])}),u="|"+u.map(function(a){return a&&a[d[0]]}).join("|")+"|",v.forEach(function(a){d[0]&&-1!==u.indexOf("|"+a[d[0]]+"|")||(c.push(r(a,{value:null})),f=!1)})):this.getBox(u)}b.prototype.setData.call(this,
+c,l,g,f)},drawGraph:e,drawDataLabels:e,doFullTranslate:function(){return this.isDirtyData||this.chart.isResizing||this.chart.renderer.isVML||!this.baseTrans},translate:function(){var a=this,b=a.xAxis,g=a.yAxis,d=a.doFullTranslate();a.generatePoints();a.data.forEach(function(c){c.plotX=b.toPixels(c._midX,!0);c.plotY=g.toPixels(c._midY,!0);d&&(c.shapeType="path",c.shapeArgs={d:a.translatePath(c.path)})});a.translateColors()},pointAttribs:function(a,b){b=a.series.chart.styledMode?this.colorAttribs(a):
+u.column.prototype.pointAttribs.call(this,a,b);b["stroke-width"]=t(a.options[this.pointAttrToOptions&&this.pointAttrToOptions["stroke-width"]||"borderWidth"],"inherit");return b},drawPoints:function(){var a=this,b=a.xAxis,g=a.yAxis,d=a.group,k=a.chart,m=k.renderer,f,e,h,q,n=this.baseTrans,p,r,t,y,G;a.transformGroup||(a.transformGroup=m.g().attr({scaleX:1,scaleY:1}).add(d),a.transformGroup.survive=!0);a.doFullTranslate()?(k.hasRendered&&!k.styledMode&&a.points.forEach(function(c){c.shapeArgs&&(c.shapeArgs.fill=
+a.pointAttribs(c,c.state).fill)}),a.group=a.transformGroup,u.column.prototype.drawPoints.apply(a),a.group=d,a.points.forEach(function(c){c.graphic&&(c.name&&c.graphic.addClass("highcharts-name-"+c.name.replace(/ /g,"-").toLowerCase()),c.properties&&c.properties["hc-key"]&&c.graphic.addClass("highcharts-key-"+c.properties["hc-key"].toLowerCase()),k.styledMode&&c.graphic.css(a.pointAttribs(c,c.selected&&"select")))}),this.baseTrans={originX:b.min-b.minPixelPadding/b.transA,originY:g.min-g.minPixelPadding/
+g.transA+(g.reversed?0:g.len/g.transA),transAX:b.transA,transAY:g.transA},this.transformGroup.animate({translateX:0,translateY:0,scaleX:1,scaleY:1})):(f=b.transA/n.transAX,e=g.transA/n.transAY,h=b.toPixels(n.originX,!0),q=g.toPixels(n.originY,!0),.99<f&&1.01>f&&.99<e&&1.01>e&&(e=f=1,h=Math.round(h),q=Math.round(q)),p=this.transformGroup,k.renderer.globalAnimation?(r=p.attr("translateX"),t=p.attr("translateY"),y=p.attr("scaleX"),G=p.attr("scaleY"),p.attr({animator:0}).animate({animator:1},{step:function(a,
+c){p.attr({translateX:r+(h-r)*c.pos,translateY:t+(q-t)*c.pos,scaleX:y+(f-y)*c.pos,scaleY:G+(e-G)*c.pos})}})):p.attr({translateX:h,translateY:q,scaleX:f,scaleY:e}));k.styledMode||d.element.setAttribute("stroke-width",(a.options[a.pointAttrToOptions&&a.pointAttrToOptions["stroke-width"]||"borderWidth"]||1)/(f||1));this.drawMapDataLabels()},drawMapDataLabels:function(){b.prototype.drawDataLabels.call(this);this.dataLabelsGroup&&this.dataLabelsGroup.clip(this.chart.clipRect)},render:function(){var a=
+this,d=b.prototype.render;a.chart.renderer.isVML&&3E3<a.data.length?setTimeout(function(){d.call(a)}):d.call(a)},animate:function(a){var c=this.options.animation,b=this.group,d=this.xAxis,k=this.yAxis,m=d.pos,f=k.pos;this.chart.renderer.isSVG&&(!0===c&&(c={duration:1E3}),a?b.attr({translateX:m+d.len/2,translateY:f+k.len/2,scaleX:.001,scaleY:.001}):(b.animate({translateX:m,translateY:f,scaleX:1,scaleY:1},c),this.animate=null))},animateDrilldown:function(a){var c=this.chart.plotBox,b=this.chart.drilldownLevels[this.chart.drilldownLevels.length-
+1],d=b.bBox,k=this.chart.options.drilldown.animation;a||(a=Math.min(d.width/c.width,d.height/c.height),b.shapeArgs={scaleX:a,scaleY:a,translateX:d.x,translateY:d.y},this.points.forEach(function(a){a.graphic&&a.graphic.attr(b.shapeArgs).animate({scaleX:1,scaleY:1,translateX:0,translateY:0},k)}),this.animate=null)},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,animateDrillupFrom:function(a){u.column.prototype.animateDrillupFrom.call(this,a)},animateDrillupTo:function(a){u.column.prototype.animateDrillupTo.call(this,
+a)}}),h({applyOptions:function(a,b){a=d.prototype.applyOptions.call(this,a,b);b=this.series;var c=b.joinBy;b.mapData&&((c=void 0!==a[c[1]]&&b.mapMap[a[c[1]]])?(b.xyFromShape&&(a.x=c._midX,a.y=c._midY),h(a,c)):a.value=a.value||null);return a},onMouseOver:function(c){a.clearTimeout(this.colorInterval);if(null!==this.value||this.series.options.nullInteraction)d.prototype.onMouseOver.call(this,c);else this.series.onMouseOut(c)},zoomTo:function(){var a=this.series;a.xAxis.setExtremes(this._minX,this._maxX,
+!1);a.yAxis.setExtremes(this._minY,this._maxY,!1);a.chart.redraw()}},p))})(z);(function(a){var p=a.seriesType,h=a.seriesTypes;p("mapline","map",{lineWidth:1,fillColor:"none"},{type:"mapline",colorProp:"stroke",pointAttrToOptions:{stroke:"color","stroke-width":"lineWidth"},pointAttribs:function(a,p){a=h.map.prototype.pointAttribs.call(this,a,p);a.fill=this.options.fillColor;return a},drawLegendSymbol:h.line.prototype.drawLegendSymbol})})(z);(function(a){var p=a.merge,h=a.Point;a=a.seriesType;a("mappoint",
+"scatter",{dataLabels:{enabled:!0,formatter:function(){return this.point.name},crop:!1,defer:!1,overflow:!1,style:{color:"#000000"}}},{type:"mappoint",forceDL:!0},{applyOptions:function(a,r){a=void 0!==a.lat&&void 0!==a.lon?p(a,this.series.chart.fromLatLonToPoint(a)):a;return h.prototype.applyOptions.call(this,a,r)}})})(z);(function(a){var p=a.Series,h=a.Legend,n=a.Chart,r=a.addEvent,e=a.wrap,t=a.color,y=a.isNumber,d=a.numberFormat,b=a.objectEach,f=a.merge,u=a.noop,q=a.pick,c=a.stableSort,l=a.setOptions,
+g=a.arrayMin,w=a.arrayMax;l({legend:{bubbleLegend:{borderColor:void 0,borderWidth:2,className:void 0,color:void 0,connectorClassName:void 0,connectorColor:void 0,connectorDistance:60,connectorWidth:1,enabled:!1,labels:{className:void 0,allowOverlap:!1,format:"",formatter:void 0,align:"right",style:{fontSize:10,color:void 0},x:0,y:0},maxSize:60,minSize:10,legendIndex:0,ranges:{value:void 0,borderColor:void 0,color:void 0,connectorColor:void 0},sizeBy:"area",sizeByAbsoluteValue:!1,zIndex:1,zThreshold:0}}});
+a.BubbleLegend=function(a,c){this.init(a,c)};a.BubbleLegend.prototype={init:function(a,c){this.options=a;this.visible=!0;this.chart=c.chart;this.legend=c},setState:u,addToLegend:function(a){a.splice(this.options.legendIndex,0,this)},drawLegendSymbol:function(a){var b=this.chart,k=this.options,d=q(a.options.itemDistance,20),f,g=k.ranges;f=k.connectorDistance;this.fontMetrics=b.renderer.fontMetrics(k.labels.style.fontSize.toString()+"px");g&&g.length&&y(g[0].value)?(c(g,function(a,c){return c.value-
+a.value}),this.ranges=g,this.setOptions(),this.render(),b=this.getMaxLabelSize(),g=this.ranges[0].radius,a=2*g,f=f-g+b.width,f=0<f?f:0,this.maxLabel=b,this.movementX="left"===k.labels.align?f:0,this.legendItemWidth=a+f+d,this.legendItemHeight=a+this.fontMetrics.h/2):a.options.bubbleLegend.autoRanges=!0},setOptions:function(){var a=this,c=a.ranges,b=a.options,d=a.chart.series[b.seriesIndex],g=a.legend.baseline,e={"z-index":b.zIndex,"stroke-width":b.borderWidth},l={"z-index":b.zIndex,"stroke-width":b.connectorWidth},
+h=a.getLabelStyles(),u=d.options.marker.fillOpacity,w=a.chart.styledMode;c.forEach(function(k,m){w||(e.stroke=q(k.borderColor,b.borderColor,d.color),e.fill=q(k.color,b.color,1!==u?t(d.color).setOpacity(u).get("rgba"):d.color),l.stroke=q(k.connectorColor,b.connectorColor,d.color));c[m].radius=a.getRangeRadius(k.value);c[m]=f(c[m],{center:c[0].radius-c[m].radius+g});w||f(!0,c[m],{bubbleStyle:f(!1,e),connectorStyle:f(!1,l),labelStyle:h})})},getLabelStyles:function(){var a=this.options,c={},d="left"===
+a.labels.align,g=this.legend.options.rtl;b(a.labels.style,function(a,b){"color"!==b&&"fontSize"!==b&&"z-index"!==b&&(c[b]=a)});return f(!1,c,{"font-size":a.labels.style.fontSize,fill:q(a.labels.style.color,"#000000"),"z-index":a.zIndex,align:g||d?"right":"left"})},getRangeRadius:function(a){var c=this.options;return this.chart.series[this.options.seriesIndex].getRadius.call(this,c.ranges[c.ranges.length-1].value,c.ranges[0].value,c.minSize,c.maxSize,a)},render:function(){var a=this,c=a.chart.renderer,
+b=a.options.zThreshold;a.symbols||(a.symbols={connectors:[],bubbleItems:[],labels:[]});a.legendSymbol=c.g("bubble-legend");a.legendItem=c.g("bubble-legend-item");a.legendSymbol.translateX=0;a.legendSymbol.translateY=0;a.ranges.forEach(function(c){c.value>=b&&a.renderRange(c)});a.legendSymbol.add(a.legendItem);a.legendItem.add(a.legendGroup);a.hideOverlappingLabels()},renderRange:function(a){var c=this.options,b=c.labels,d=this.chart.renderer,k=this.symbols,g=k.labels,f=a.center,e=Math.abs(a.radius),
+l=c.connectorDistance,h=b.align,u=b.style.fontSize,l=this.legend.options.rtl||"left"===h?-l:l,b=c.connectorWidth,w=this.ranges[0].radius,q=f-e-c.borderWidth/2+b/2,p,u=u/2-(this.fontMetrics.h-u)/2,n=d.styledMode;"center"===h&&(l=0,c.connectorDistance=0,a.labelStyle.align="center");h=q+c.labels.y;p=w+l+c.labels.x;k.bubbleItems.push(d.circle(w,f+((q%1?1:.5)-(b%2?0:.5)),e).attr(n?{}:a.bubbleStyle).addClass((n?"highcharts-color-"+this.options.seriesIndex+" ":"")+"highcharts-bubble-legend-symbol "+(c.className||
+"")).add(this.legendSymbol));k.connectors.push(d.path(d.crispLine(["M",w,q,"L",w+l,q],c.connectorWidth)).attr(n?{}:a.connectorStyle).addClass((n?"highcharts-color-"+this.options.seriesIndex+" ":"")+"highcharts-bubble-legend-connectors "+(c.connectorClassName||"")).add(this.legendSymbol));a=d.text(this.formatLabel(a),p,h+u).attr(n?{}:a.labelStyle).addClass("highcharts-bubble-legend-labels "+(c.labels.className||"")).add(this.legendSymbol);g.push(a);a.placed=!0;a.alignAttr={x:p,y:h+u}},getMaxLabelSize:function(){var a,
+c;this.symbols.labels.forEach(function(b){c=b.getBBox(!0);a=a?c.width>a.width?c:a:c});return a||{}},formatLabel:function(c){var b=this.options,g=b.labels.formatter;return(b=b.labels.format)?a.format(b,c):g?g.call(c):d(c.value,1)},hideOverlappingLabels:function(){var a=this.chart,c=this.symbols;!this.options.labels.allowOverlap&&c&&(a.hideOverlappingLabels(c.labels),c.labels.forEach(function(a,b){a.newOpacity?a.newOpacity!==a.oldOpacity&&c.connectors[b].show():c.connectors[b].hide()}))},getRanges:function(){var a=
+this.legend.bubbleLegend,c,b=a.options.ranges,d,e=Number.MAX_VALUE,l=-Number.MAX_VALUE;a.chart.series.forEach(function(a){a.isBubble&&!a.ignoreSeries&&(d=a.zData.filter(y),d.length&&(e=q(a.options.zMin,Math.min(e,Math.max(g(d),!1===a.options.displayNegative?a.options.zThreshold:-Number.MAX_VALUE))),l=q(a.options.zMax,Math.max(l,w(d)))))});c=e===l?[{value:l}]:[{value:e},{value:(e+l)/2},{value:l,autoRanges:!0}];b.length&&b[0].radius&&c.reverse();c.forEach(function(a,d){b&&b[d]&&(c[d]=f(!1,b[d],a))});
+return c},predictBubbleSizes:function(){var a=this.chart,c=this.fontMetrics,b=a.legend.options,d="horizontal"===b.layout,g=d?a.legend.lastLineHeight:0,f=a.plotSizeX,e=a.plotSizeY,l=a.series[this.options.seriesIndex],a=Math.ceil(l.minPxSize),h=Math.ceil(l.maxPxSize),l=l.options.maxSize,u=Math.min(e,f);if(b.floating||!/%$/.test(l))c=h;else if(l=parseFloat(l),c=(u+g-c.h/2)*l/100/(l/100+1),d&&e-c>=f||!d&&f-c>=e)c=h;return[a,Math.ceil(c)]},updateRanges:function(a,c){var b=this.legend.options.bubbleLegend;
+b.minSize=a;b.maxSize=c;b.ranges=this.getRanges()},correctSizes:function(){var a=this.legend,c=this.chart.series[this.options.seriesIndex];1<Math.abs(Math.ceil(c.maxPxSize)-this.options.maxSize)&&(this.updateRanges(this.options.minSize,c.maxPxSize),a.render())}};r(a.Legend,"afterGetAllItems",function(c){var b=this.bubbleLegend,d=this.options,g=d.bubbleLegend,f=this.chart.getVisibleBubbleSeriesIndex();b&&b.ranges&&b.ranges.length&&(g.ranges.length&&(g.autoRanges=g.ranges[0].autoRanges?!0:!1),this.destroyItem(b));
+0<=f&&d.enabled&&g.enabled&&(g.seriesIndex=f,this.bubbleLegend=new a.BubbleLegend(g,this),this.bubbleLegend.addToLegend(c.allItems))});n.prototype.getVisibleBubbleSeriesIndex=function(){for(var a=this.series,c=0;c<a.length;){if(a[c]&&a[c].isBubble&&a[c].visible&&a[c].zData.length)return c;c++}return-1};h.prototype.getLinesHeights=function(){var a=this.allItems,c=[],b,d=a.length,g,f=0;for(g=0;g<d;g++)if(a[g].legendItemHeight&&(a[g].itemHeight=a[g].legendItemHeight),a[g]===a[d-1]||a[g+1]&&a[g]._legendItemPos[1]!==
+a[g+1]._legendItemPos[1]){c.push({height:0});b=c[c.length-1];for(f;f<=g;f++)a[f].itemHeight>b.height&&(b.height=a[f].itemHeight);b.step=g}return c};h.prototype.retranslateItems=function(a){var c,b,d,g=this.options.rtl,f=0;this.allItems.forEach(function(e,l){c=e.legendGroup.translateX;b=e._legendItemPos[1];if((d=e.movementX)||g&&e.ranges)d=g?c-e.options.maxSize/2:c+d,e.legendGroup.attr({translateX:d});l>a[f].step&&f++;e.legendGroup.attr({translateY:Math.round(b+a[f].height/2)});e._legendItemPos[1]=
+b+a[f].height/2})};r(p,"legendItemClick",function(){var a=this.chart,c=this.visible,b=this.chart.legend;b&&b.bubbleLegend&&(this.visible=!c,this.ignoreSeries=c,a=0<=a.getVisibleBubbleSeriesIndex(),b.bubbleLegend.visible!==a&&(b.update({bubbleLegend:{enabled:a}}),b.bubbleLegend.visible=a),this.visible=c)});e(n.prototype,"drawChartBox",function(a,c,d){var g=this.legend,f=0<=this.getVisibleBubbleSeriesIndex(),e;g&&g.options.enabled&&g.bubbleLegend&&g.options.bubbleLegend.autoRanges&&f?(e=g.bubbleLegend.options,
+f=g.bubbleLegend.predictBubbleSizes(),g.bubbleLegend.updateRanges(f[0],f[1]),e.placed||(g.group.placed=!1,g.allItems.forEach(function(a){a.legendGroup.translateY=null})),g.render(),this.getMargins(),this.axes.forEach(function(a){a.render();e.placed||(a.setScale(),a.updateNames(),b(a.ticks,function(a){a.isNew=!0;a.isNewLabel=!0}))}),e.placed=!0,this.getMargins(),a.call(this,c,d),g.bubbleLegend.correctSizes(),g.retranslateItems(g.getLinesHeights())):(a.call(this,c,d),g&&g.options.enabled&&g.bubbleLegend&&
+(g.render(),g.retranslateItems(g.getLinesHeights())))})})(z);(function(a){var p=a.arrayMax,h=a.arrayMin,n=a.Axis,r=a.color,e=a.isNumber,t=a.noop,y=a.pick,d=a.pInt,b=a.Point,f=a.Series,u=a.seriesType,q=a.seriesTypes;u("bubble","scatter",{dataLabels:{formatter:function(){return this.point.z},inside:!0,verticalAlign:"middle"},animationLimit:250,marker:{lineColor:null,lineWidth:1,fillOpacity:.5,radius:null,states:{hover:{radiusPlus:0}},symbol:"circle"},minSize:8,maxSize:"20%",softThreshold:!1,states:{hover:{halo:{size:5}}},
+tooltip:{pointFormat:"({point.x}, {point.y}), Size: {point.z}"},turboThreshold:0,zThreshold:0,zoneAxis:"z"},{pointArrayMap:["y","z"],parallelArrays:["x","y","z"],trackerGroups:["group","dataLabelsGroup"],specialGroup:"group",bubblePadding:!0,zoneAxis:"z",directTouch:!0,isBubble:!0,pointAttribs:function(a,b){var c=this.options.marker.fillOpacity;a=f.prototype.pointAttribs.call(this,a,b);1!==c&&(a.fill=r(a.fill).setOpacity(c).get("rgba"));return a},getRadii:function(a,b,g){var c,d=this.zData,f=g.minPxSize,
+e=g.maxPxSize,l=[],h;c=0;for(g=d.length;c<g;c++)h=d[c],l.push(this.getRadius(a,b,f,e,h));this.radii=l},getRadius:function(a,b,d,f,k){var c=this.options,g="width"!==c.sizeBy,l=c.zThreshold,h=b-a;c.sizeByAbsoluteValue&&null!==k&&(k=Math.abs(k-l),h=Math.max(b-l,Math.abs(a-l)),a=0);e(k)?k<a?d=d/2-1:(a=0<h?(k-a)/h:.5,g&&0<=a&&(a=Math.sqrt(a)),d=Math.ceil(d+a*(f-d))/2):d=null;return d},animate:function(a){!a&&this.points.length<this.options.animationLimit&&(this.points.forEach(function(a){var c=a.graphic,
+b;c&&c.width&&(b={x:c.x,y:c.y,width:c.width,height:c.height},c.attr({x:a.plotX,y:a.plotY,width:1,height:1}),c.animate(b,this.options.animation))},this),this.animate=null)},translate:function(){var c,b=this.data,d,f,k=this.radii;q.scatter.prototype.translate.call(this);for(c=b.length;c--;)d=b[c],f=k?k[c]:0,e(f)&&f>=this.minPxSize/2?(d.marker=a.extend(d.marker,{radius:f,width:2*f,height:2*f}),d.dlBox={x:d.plotX-f,y:d.plotY-f,width:2*f,height:2*f}):d.shapeArgs=d.plotY=d.dlBox=void 0},alignDataLabel:q.column.prototype.alignDataLabel,
+buildKDTree:t,applyZones:t},{haloPath:function(a){return b.prototype.haloPath.call(this,0===a?0:(this.marker?this.marker.radius||0:0)+a)},ttBelow:!1});n.prototype.beforePadding=function(){var c=this,b=this.len,f=this.chart,u=0,k=b,q=this.isXAxis,n=q?"xData":"yData",r=this.min,t={},z=Math.min(f.plotWidth,f.plotHeight),C=Number.MAX_VALUE,D=-Number.MAX_VALUE,E=this.max-r,B=b/E,F=[];this.series.forEach(function(b){var g=b.options;!b.bubblePadding||!b.visible&&f.options.chart.ignoreHiddenSeries||(c.allowZoomOutside=
+!0,F.push(b),q&&(["minSize","maxSize"].forEach(function(a){var c=g[a],b=/%$/.test(c),c=d(c);t[a]=b?z*c/100:c}),b.minPxSize=t.minSize,b.maxPxSize=Math.max(t.maxSize,t.minSize),b=b.zData.filter(a.isNumber),b.length&&(C=y(g.zMin,Math.min(C,Math.max(h(b),!1===g.displayNegative?g.zThreshold:-Number.MAX_VALUE))),D=y(g.zMax,Math.max(D,p(b))))))});F.forEach(function(a){var b=a[n],d=b.length,f;q&&a.getRadii(C,D,a);if(0<E)for(;d--;)e(b[d])&&c.dataMin<=b[d]&&b[d]<=c.dataMax&&(f=a.radii[d],u=Math.min((b[d]-r)*
+B-f,u),k=Math.max((b[d]-r)*B+f,k))});F.length&&0<E&&!this.isLog&&(k-=b,B*=(b+Math.max(0,u)-Math.min(k,b))/b,[["min","userMin",u],["max","userMax",k]].forEach(function(a){void 0===y(c.options[a[0]],c[a[1]])&&(c[a[0]]+=a[2]/B)}))}})(z);(function(a){var p=a.merge,h=a.Point,n=a.seriesType,r=a.seriesTypes;r.bubble&&n("mapbubble","bubble",{animationLimit:500,tooltip:{pointFormat:"{point.name}: {point.z}"}},{xyFromShape:!0,type:"mapbubble",pointArrayMap:["z"],getMapData:r.map.prototype.getMapData,getBox:r.map.prototype.getBox,
+setData:r.map.prototype.setData},{applyOptions:function(a,n){return a&&void 0!==a.lat&&void 0!==a.lon?h.prototype.applyOptions.call(this,p(a,this.series.chart.fromLatLonToPoint(a)),n):r.map.prototype.pointClass.prototype.applyOptions.call(this,a,n)},isValid:function(){return"number"===typeof this.z},ttBelow:!1})})(z);(function(a){var p=a.colorPointMixin,h=a.merge,n=a.noop,r=a.pick,e=a.Series,t=a.seriesType,y=a.seriesTypes;t("heatmap","scatter",{animation:!1,borderWidth:0,nullColor:"#f7f7f7",dataLabels:{formatter:function(){return this.point.value},
+inside:!0,verticalAlign:"middle",crop:!1,overflow:!1,padding:0},marker:null,pointRange:null,tooltip:{pointFormat:"{point.x}, {point.y}: {point.value}\x3cbr/\x3e"},states:{hover:{halo:!1,brightness:.2}}},h(a.colorSeriesMixin,{pointArrayMap:["y","value"],hasPointSpecificOptions:!0,getExtremesFromAll:!0,directTouch:!0,init:function(){var a;y.scatter.prototype.init.apply(this,arguments);a=this.options;a.pointRange=r(a.pointRange,a.colsize||1);this.yAxis.axisPointRange=a.rowsize||1},translate:function(){var a=
+this.options,b=this.xAxis,f=this.yAxis,e=a.pointPadding||0,h=function(a,b,d){return Math.min(Math.max(b,a),d)};this.generatePoints();this.points.forEach(function(c){var d=(a.colsize||1)/2,g=(a.rowsize||1)/2,u=h(Math.round(b.len-b.translate(c.x-d,0,1,0,1)),-b.len,2*b.len),d=h(Math.round(b.len-b.translate(c.x+d,0,1,0,1)),-b.len,2*b.len),k=h(Math.round(f.translate(c.y-g,0,1,0,1)),-f.len,2*f.len),g=h(Math.round(f.translate(c.y+g,0,1,0,1)),-f.len,2*f.len),q=r(c.pointPadding,e);c.plotX=c.clientX=(u+d)/
+2;c.plotY=(k+g)/2;c.shapeType="rect";c.shapeArgs={x:Math.min(u,d)+q,y:Math.min(k,g)+q,width:Math.abs(d-u)-2*q,height:Math.abs(g-k)-2*q}});this.translateColors()},drawPoints:function(){var a=this.chart.styledMode?"css":"attr";y.column.prototype.drawPoints.call(this);this.points.forEach(function(b){b.graphic[a](this.colorAttribs(b))},this)},animate:n,getBox:n,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,alignDataLabel:y.column.prototype.alignDataLabel,getExtremes:function(){e.prototype.getExtremes.call(this,
+this.valueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;e.prototype.getExtremes.call(this)}}),a.extend({haloPath:function(a){if(!a)return[];var b=this.shapeArgs;return["M",b.x-a,b.y-a,"L",b.x-a,b.y+b.height+a,b.x+b.width+a,b.y+b.height+a,b.x+b.width+a,b.y-a,"Z"]}},p))})(z);(function(a){function p(a,b){var d,e,h,c=!1,l=a.x,g=a.y;a=0;for(d=b.length-1;a<b.length;d=a++)e=b[a][1]>g,h=b[d][1]>g,e!==h&&l<(b[d][0]-b[a][0])*(g-b[a][1])/(b[d][1]-b[a][1])+b[a][0]&&(c=!c);return c}var h=a.Chart,
+n=a.extend,r=a.format,e=a.merge,t=a.win,y=a.wrap;h.prototype.transformFromLatLon=function(d,b){if(void 0===t.proj4)return a.error(21,!1,this),{x:0,y:null};d=t.proj4(b.crs,[d.lon,d.lat]);var f=b.cosAngle||b.rotation&&Math.cos(b.rotation),e=b.sinAngle||b.rotation&&Math.sin(b.rotation);d=b.rotation?[d[0]*f+d[1]*e,-d[0]*e+d[1]*f]:d;return{x:((d[0]-(b.xoffset||0))*(b.scale||1)+(b.xpan||0))*(b.jsonres||1)+(b.jsonmarginX||0),y:(((b.yoffset||0)-d[1])*(b.scale||1)+(b.ypan||0))*(b.jsonres||1)-(b.jsonmarginY||
+0)}};h.prototype.transformToLatLon=function(d,b){if(void 0===t.proj4)a.error(21,!1,this);else{d={x:((d.x-(b.jsonmarginX||0))/(b.jsonres||1)-(b.xpan||0))/(b.scale||1)+(b.xoffset||0),y:((-d.y-(b.jsonmarginY||0))/(b.jsonres||1)+(b.ypan||0))/(b.scale||1)+(b.yoffset||0)};var f=b.cosAngle||b.rotation&&Math.cos(b.rotation),e=b.sinAngle||b.rotation&&Math.sin(b.rotation);b=t.proj4(b.crs,"WGS84",b.rotation?{x:d.x*f+d.y*-e,y:d.x*e+d.y*f}:d);return{lat:b.y,lon:b.x}}};h.prototype.fromPointToLatLon=function(d){var b=
+this.mapTransforms,f;if(b){for(f in b)if(b.hasOwnProperty(f)&&b[f].hitZone&&p({x:d.x,y:-d.y},b[f].hitZone.coordinates[0]))return this.transformToLatLon(d,b[f]);return this.transformToLatLon(d,b["default"])}a.error(22,!1,this)};h.prototype.fromLatLonToPoint=function(d){var b=this.mapTransforms,f,e;if(!b)return a.error(22,!1,this),{x:0,y:null};for(f in b)if(b.hasOwnProperty(f)&&b[f].hitZone&&(e=this.transformFromLatLon(d,b[f]),p({x:e.x,y:-e.y},b[f].hitZone.coordinates[0])))return e;return this.transformFromLatLon(d,
+b["default"])};a.geojson=function(a,b,f){var d=[],e=[],c=function(a){var c,b=a.length;e.push("M");for(c=0;c<b;c++)1===c&&e.push("L"),e.push(a[c][0],-a[c][1])};b=b||"map";a.features.forEach(function(a){var f=a.geometry,h=f.type,f=f.coordinates;a=a.properties;var k;e=[];"map"===b||"mapbubble"===b?("Polygon"===h?(f.forEach(c),e.push("Z")):"MultiPolygon"===h&&(f.forEach(function(a){a.forEach(c)}),e.push("Z")),e.length&&(k={path:e})):"mapline"===b?("LineString"===h?c(f):"MultiLineString"===h&&f.forEach(c),
+e.length&&(k={path:e})):"mappoint"===b&&"Point"===h&&(k={x:f[0],y:-f[1]});k&&d.push(n(k,{name:a.name||a.NAME,properties:a}))});f&&a.copyrightShort&&(f.chart.mapCredits=r(f.chart.options.credits.mapText,{geojson:a}),f.chart.mapCreditsFull=r(f.chart.options.credits.mapTextFull,{geojson:a}));return d};y(h.prototype,"addCredits",function(a,b){b=e(!0,this.options.credits,b);this.mapCredits&&(b.href=null);a.call(this,b);this.credits&&this.mapCreditsFull&&this.credits.attr({title:this.mapCreditsFull})})})(z);
+(function(a){function p(a,b,d,c,e,g,h,k){return["M",a+e,b,"L",a+d-g,b,"C",a+d-g/2,b,a+d,b+g/2,a+d,b+g,"L",a+d,b+c-h,"C",a+d,b+c-h/2,a+d-h/2,b+c,a+d-h,b+c,"L",a+k,b+c,"C",a+k/2,b+c,a,b+c-k/2,a,b+c-k,"L",a,b+e,"C",a,b+e/2,a+e/2,b,a+e,b,"Z"]}var h=a.Chart,n=a.defaultOptions,r=a.extend,e=a.merge,t=a.pick,y=a.Renderer,d=a.SVGRenderer,b=a.VMLRenderer;r(n.lang,{zoomIn:"Zoom in",zoomOut:"Zoom out"});n.mapNavigation={buttonOptions:{alignTo:"plotBox",align:"left",verticalAlign:"top",x:0,width:18,height:18,
+padding:5,style:{fontSize:"15px",fontWeight:"bold"},theme:{"stroke-width":1,"text-align":"center"}},buttons:{zoomIn:{onclick:function(){this.mapZoom(.5)},text:"+",y:0},zoomOut:{onclick:function(){this.mapZoom(2)},text:"-",y:28}},mouseWheelSensitivity:1.1};a.splitPath=function(a){var b;a=a.replace(/([A-Za-z])/g," $1 ");a=a.replace(/^\s*/,"").replace(/\s*$/,"");a=a.split(/[ ,]+/);for(b=0;b<a.length;b++)/[a-zA-Z]/.test(a[b])||(a[b]=parseFloat(a[b]));return a};a.maps={};d.prototype.symbols.topbutton=
+function(a,b,d,c,e){return p(a-1,b-1,d,c,e.r,e.r,0,0)};d.prototype.symbols.bottombutton=function(a,b,d,c,e){return p(a-1,b-1,d,c,0,0,e.r,e.r)};y===b&&["topbutton","bottombutton"].forEach(function(a){b.prototype.symbols[a]=d.prototype.symbols[a]});a.Map=a.mapChart=function(b,d,p){var c="string"===typeof b||b.nodeName,f=arguments[c?1:0],g=f,n={endOnTick:!1,visible:!1,minPadding:0,maxPadding:0,startOnTick:!1},k,m=a.getOptions().credits;k=f.series;f.series=null;f=e({chart:{panning:"xy",type:"map"},credits:{mapText:t(m.mapText,
+' \u00a9 \x3ca href\x3d"{geojson.copyrightUrl}"\x3e{geojson.copyrightShort}\x3c/a\x3e'),mapTextFull:t(m.mapTextFull,"{geojson.copyright}")},tooltip:{followTouchMove:!1},xAxis:n,yAxis:e(n,{reversed:!0})},f,{chart:{inverted:!1,alignTicks:!1}});f.series=g.series=k;return c?new h(b,f,p):new h(f,d)}})(z)});
+//# sourceMappingURL=map.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+ Annotations module
+
+ (c) 2009-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(l){"object"===typeof module&&module.exports?module.exports=l:"function"===typeof define&&define.amd?define(function(){return l}):l("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(l){var B=function(a){return{addEvents:function(){var f=this;a.addEvent(f.graphic.element,"mousedown",function(d){f.onMouseDown(d)});a.objectEach(f.options.events,function(d,b){var c=function(c){"click"===b&&f.cancelClick||d.call(f,f.chart.pointer.normalize(c),f.target)};if("drag"!==b)f.graphic.on(b,
+c);else a.addEvent(f,"drag",c)});f.options.draggable&&(a.addEvent(f,"drag",f.onDrag),f.graphic.renderer.styledMode||f.graphic.css({cursor:{x:"ew-resize",y:"ns-resize",xy:"move"}[f.options.draggable]}))},removeDocEvents:function(){this.removeDrag&&(this.removeDrag=this.removeDrag());this.removeMouseUp&&(this.removeMouseUp=this.removeMouseUp())},onMouseDown:function(f){var d=this,b=d.chart.pointer,c,h;2!==f.button&&(f.stopPropagation(),f=b.normalize(f),c=f.chartX,h=f.chartY,d.cancelClick=!1,d.removeDrag=
+a.addEvent(a.doc,"mousemove",function(p){d.hasDragged=!0;p=b.normalize(p);p.prevChartX=c;p.prevChartY=h;a.fireEvent(d,"drag",p);c=p.chartX;h=p.chartY}),d.removeMouseUp=a.addEvent(a.doc,"mouseup",function(c){d.cancelClick=d.hasDragged;d.hasDragged=!1;d.onMouseUp(c)}))},onMouseUp:function(){this.removeDocEvents()},onDrag:function(a){if(this.chart.isInsidePlot(a.chartX-this.chart.plotLeft,a.chartY-this.chart.plotTop)){var d=this.mouseMoveToTranslation(a);"x"===this.options.draggable&&(d.y=0);"y"===this.options.draggable&&
+(d.x=0);this.points.length?this.translate(d.x,d.y):(this.shapes.forEach(function(b){b.translate(d.x,d.y)}),this.labels.forEach(function(b){b.translate(d.x,d.y)}));this.redraw(!1)}},mouseMoveToRadians:function(a,d,b){var c=a.prevChartY-b,h=a.prevChartX-d;b=a.chartY-b;a=a.chartX-d;this.chart.inverted&&(d=h,h=c,c=d,d=a,a=b,b=d);return Math.atan2(b,a)-Math.atan2(c,h)},mouseMoveToTranslation:function(a){var d=a.chartX-a.prevChartX;a=a.chartY-a.prevChartY;var b;this.chart.inverted&&(b=a,a=d,d=b);return{x:d,
+y:a}},mouseMoveToScale:function(a,d,b){d=(a.chartX-d||1)/(a.prevChartX-d||1);a=(a.chartY-b||1)/(a.prevChartY-b||1);this.chart.inverted&&(b=a,a=d,d=b);return{x:d,y:a}},destroy:function(){this.removeDocEvents();a.removeEvent(this);this.hcEvents=null}}}(l),C=function(a,f){function d(b,c,h,d){this.chart=b;this.target=c;this.options=h;this.index=a.pick(h.index,d)}a.extend(d.prototype,f);d.prototype.setVisibility=function(b){this.graphic.attr("visibility",b?"visible":"hidden");this.options.visible=b};d.prototype.render=
+function(){var b=this.chart,c=this.options;this.graphic=b.renderer.symbol(c.symbol,0,0,c.width,c.height).add(b.controlPointsGroup).css(c.style);this.setVisibility(c.visible);this.addEvents()};d.prototype.redraw=function(b){this.graphic[b?"animate":"attr"](this.options.positioner.call(this,this.target))};d.prototype.destroy=function(){f.destroy.call(this);this.graphic&&(this.graphic=this.graphic.destroy());this.options=this.target=this.chart=null};d.prototype.update=function(b){var c=this.chart,h=
+this.target,d=this.index;b=a.merge(!0,this.options,b);this.destroy();this.constructor(c,h,b,d);this.render(c.controlPointsGroup);this.redraw()};return d}(l,B),z=function(a){function f(d,b,c){this.series={visible:!0,chart:d,getPlotBox:a.Series.prototype.getPlotBox};this.target=b||null;this.options=c;this.applyOptions(this.getOptions())}f.fromPoint=function(a){return new f(a.series.chart,null,{x:a.x,y:a.y,xAxis:a.series.xAxis,yAxis:a.series.yAxis})};f.pointToPixels=function(a,b){var c=a.series,h=c.chart,
+d=a.plotX,g=a.plotY;h.inverted&&(a.mock?(d=a.plotY,g=a.plotX):(d=h.plotWidth-a.plotY,g=h.plotHeight-a.plotX));c&&!b&&(a=c.getPlotBox(),d+=a.translateX,g+=a.translateY);return{x:d,y:g}};f.pointToOptions=function(a){return{x:a.x,y:a.y,xAxis:a.series.xAxis,yAxis:a.series.yAxis}};a.extend(f.prototype,{mock:!0,hasDynamicOptions:function(){return"function"===typeof this.options},getOptions:function(){return this.hasDynamicOptions()?this.options.call(this,this.target):this.options},applyOptions:function(a){this.command=
+a.command;this.setAxis(a,"x");this.setAxis(a,"y");this.refresh()},setAxis:function(d,b){b+="Axis";d=d[b];var c=this.series.chart;this.series[b]=d instanceof a.Axis?d:a.defined(d)?c[b][d]||c.get(d):null},toAnchor:function(){var a=[this.plotX,this.plotY,0,0];this.series.chart.inverted&&(a[0]=this.plotY,a[1]=this.plotX);return a},getLabelConfig:function(){return{x:this.x,y:this.y,point:this}},isInsidePane:function(){var d=this.plotX,b=this.plotY,c=this.series.xAxis,h=this.series.yAxis,p=!0;c&&(p=a.defined(d)&&
+0<=d&&d<=c.len);h&&(p=p&&a.defined(b)&&0<=b&&b<=h.len);return p},refresh:function(){var a=this.series,b=a.xAxis,a=a.yAxis,c=this.getOptions();b?(this.x=c.x,this.plotX=b.toPixels(c.x,!0)):(this.x=null,this.plotX=c.x);a?(this.y=c.y,this.plotY=a.toPixels(c.y,!0)):(this.y=null,this.plotY=c.y);this.isInside=this.isInsidePane()},translate:function(a,b,c,h){this.hasDynamicOptions()||(this.plotX+=c,this.plotY+=h,this.refreshOptions())},scale:function(a,b,c,h){if(!this.hasDynamicOptions()){var d=this.plotY*
+h;this.plotX=(1-c)*a+this.plotX*c;this.plotY=(1-h)*b+d;this.refreshOptions()}},rotate:function(a,b,c){if(!this.hasDynamicOptions()){var h=Math.cos(c);c=Math.sin(c);var d=this.plotX,g=this.plotY,d=d-a,g=g-b;this.plotX=d*h-g*c+a;this.plotY=d*c+g*h+b;this.refreshOptions()}},refreshOptions:function(){var a=this.series,b=a.xAxis,a=a.yAxis;this.x=this.options.x=b?this.options.x=b.toValue(this.plotX,!0):this.plotX;this.y=this.options.y=a?a.toValue(this.plotY,!0):this.plotY}});return f}(l),u=function(a,f,
+d){return{init:function(a,c){this.annotation=a;this.chart=a.chart;this.options=c;this.points=[];this.controlPoints=[];this.linkPoints();this.addControlPoints()},attr:function(){this.graphic.attr.apply(this.graphic,arguments)},getPointsOptions:function(){var b=this.options;return b.points||b.point&&a.splat(b.point)},attrsFromOptions:function(a){var c=this.constructor.attrsMap,b={},d,g,f=this.chart.styledMode;for(d in a)g=c[d],!g||f&&-1!==["fill","stroke","stroke-width"].indexOf(g)||(b[g]=a[d]);return b},
+anchor:function(b){var c=b.series.getPlotBox();b=b.mock?b.toAnchor():a.Tooltip.prototype.getAnchor.call({chart:b.series.chart},b);b={x:b[0]+(this.options.x||0),y:b[1]+(this.options.y||0),height:b[2]||0,width:b[3]||0};return{relativePosition:b,absolutePosition:a.merge(b,{x:b.x+c.translateX,y:b.y+c.translateY})}},point:function(b,c){if(b&&b.series)return b;c&&null!==c.series||(a.isObject(b)?c=new d(this.chart,this,b):a.isString(b)?c=this.chart.get(b)||null:"function"===typeof b&&(c=b.call(c,this),c=
+c.series?c:new d(this.chart,this,b)));return c},linkPoints:function(){var a=this.getPointsOptions(),c=this.points,h=a&&a.length||0,d,g;for(d=0;d<h;d++){g=this.point(a[d],c[d]);if(!g){c.length=0;return}g.mock&&g.refresh();c[d]=g}return c},addControlPoints:function(){var b=this.options.controlPoints;(b||[]).forEach(function(c,h){c=a.merge(this.options.controlPointOptions,c);c.index||(c.index=h);b[h]=c;this.controlPoints.push(new f(this.chart,this,c))},this)},shouldBeDrawn:function(){return!!this.points.length},
+render:function(){this.controlPoints.forEach(function(a){a.render()})},redraw:function(a){this.controlPoints.forEach(function(c){c.redraw(a)})},transform:function(a,c,h,d,g){if(this.chart.inverted){var b=c;c=h;h=b}this.points.forEach(function(b,k){this.transformPoint(a,c,h,d,g,k)},this)},transformPoint:function(a,c,h,p,g,f){var b=this.points[f];b.mock||(b=this.points[f]=d.fromPoint(b));b[a](c,h,p,g)},translate:function(a,c){this.transform("translate",null,null,a,c)},translatePoint:function(a,c,h){this.transformPoint("translate",
+null,null,a,c,h)},rotate:function(a,c,h){this.transform("rotate",a,c,h)},scale:function(a,c,h,d){this.transform("scale",a,c,h,d)},setControlPointsVisibility:function(a){this.controlPoints.forEach(function(c){c.setVisibility(a)})},destroy:function(){this.graphic&&(this.graphic=this.graphic.destroy());this.tracker&&(this.tracker=this.tracker.destroy());this.controlPoints.forEach(function(a){a.destroy()});this.options=this.controlPoints=this.points=this.chart=null;this.annotation&&(this.annotation=null)},
+update:function(b){var c=this.annotation;b=a.merge(!0,this.options,b);var h=this.graphic.parentGroup;this.destroy();this.constructor(c,b);this.render(h);this.redraw()}}}(l,C,z),v=function(a){var f={arrow:{tagName:"marker",render:!1,id:"arrow",refY:5,refX:9,markerWidth:10,markerHeight:10,children:[{tagName:"path",d:"M 0 0 L 10 5 L 0 10 Z",strokeWidth:0}]},"reverse-arrow":{tagName:"marker",render:!1,id:"reverse-arrow",refY:5,refX:1,markerWidth:10,markerHeight:10,children:[{tagName:"path",d:"M 0 5 L 10 0 L 10 10 Z",
+strokeWidth:0}]}};a.SVGRenderer.prototype.addMarker=function(b,c){var h={id:b},d={stroke:c.color||"none",fill:c.color||"rgba(0, 0, 0, 0.75)"};h.children=c.children.map(function(c){return a.merge(d,c)});c=this.definition(a.merge(!0,{markerWidth:20,markerHeight:20,refX:0,refY:0,orient:"auto"},c,h));c.id=b;return c};var d=function(a){return function(c){this.attr(a,"url(#"+c+")")}},d={markerEndSetter:d("marker-end"),markerStartSetter:d("marker-start"),setItemMarkers:function(b){var c=b.options,h=b.chart,
+d=h.options.defs,g=c.fill,f=a.defined(g)&&"none"!==g?g:c.stroke;["markerStart","markerEnd"].forEach(function(g){var k=c[g],e,m,q;if(k){for(q in d)if(e=d[q],k===e.id&&"marker"===e.tagName){m=e;break}m&&(k=b[g]=h.renderer.addMarker((c.id||a.uniqueKey())+"-"+m.id,a.merge(m,{color:f})),b.attr(g,k.attr("id")))}})}};a.SVGRenderer.prototype.definition=function(b){function c(b,d){var g;a.splat(b).forEach(function(b){var k=h.createElement(b.tagName),e={};a.objectEach(b,function(a,c){"tagName"!==c&&"children"!==
+c&&"textContent"!==c&&(e[c]=a)});k.attr(e);k.add(d||h.defs);b.textContent&&k.element.appendChild(a.doc.createTextNode(b.textContent));c(b.children||[],k);g=k});return g}var h=this;return c(b)};a.addEvent(a.Chart,"afterGetContainer",function(){this.options.defs=a.merge(f,this.options.defs||{});a.objectEach(this.options.defs,function(a){"marker"===a.tagName&&!1!==a.render&&this.renderer.addMarker(a.id,a)},this)});return d}(l),v=function(a,f,d){function b(a,c){this.init(a,c)}var c="rgba(192,192,192,"+
+(a.svg?.0001:.002)+")";b.attrsMap={dashStyle:"dashstyle",strokeWidth:"stroke-width",stroke:"stroke",fill:"fill",zIndex:"zIndex"};a.merge(!0,b.prototype,f,{type:"path",setMarkers:d.setItemMarkers,toD:function(){var a=this.options.d;if(a)return"function"===typeof a?a.call(this):a;for(var c=this.points,b=c.length,d=b,f=c[0],k=d&&this.anchor(f).absolutePosition,e=0,m=2,a=k&&["M",k.x,k.y];++e<b&&d;)f=c[e],d=f.command||"L",k=this.anchor(f).absolutePosition,"Z"===d?a[++m]=d:(d!==c[e-1].command&&(a[++m]=
+d),a[++m]=k.x,a[++m]=k.y),d=f.series.visible;return d?this.chart.renderer.crispLine(a,this.graphic.strokeWidth()):null},shouldBeDrawn:function(){return f.shouldBeDrawn.call(this)||!!this.options.d},render:function(b){var h=this.options,g=this.attrsFromOptions(h);this.graphic=this.annotation.chart.renderer.path(["M",0,0]).attr(g).add(b);h.className&&this.graphic.addClass(h.className);this.tracker=this.annotation.chart.renderer.path(["M",0,0]).addClass("highcharts-tracker-line").attr({zIndex:2}).add(b);
+this.annotation.chart.styledMode||this.tracker.attr({"stroke-linejoin":"round",stroke:c,fill:c,"stroke-width":this.graphic.strokeWidth()+2*h.snap});f.render.call(this);a.extend(this.graphic,{markerStartSetter:d.markerStartSetter,markerEndSetter:d.markerEndSetter});this.setMarkers(this)},redraw:function(a){var c=this.toD(),b=a?"animate":"attr";c?(this.graphic[b]({d:c}),this.tracker[b]({d:c})):(this.graphic.attr({d:"M 0 -9000000000"}),this.tracker.attr({d:"M 0 -9000000000"}));this.graphic.placed=this.tracker.placed=
+!!c;f.redraw.call(this,a)}});return b}(l,u,v),F=function(a,f,d){function b(a,b){this.init(a,b)}b.attrsMap=a.merge(d.attrsMap,{width:"width",height:"height"});a.merge(!0,b.prototype,f,{type:"rect",render:function(a){var c=this.attrsFromOptions(this.options);this.graphic=this.annotation.chart.renderer.rect(0,-9E9,0,0).attr(c).add(a);f.render.call(this)},redraw:function(a){var c=this.anchor(this.points[0]).absolutePosition;if(c)this.graphic[a?"animate":"attr"]({x:c.x,y:c.y,width:this.options.width,height:this.options.height});
+else this.attr({x:0,y:-9E9});this.graphic.placed=!!c;f.redraw.call(this,a)},translate:function(a,b){this.translatePoint(a,b,0)}});return b}(l,u,v),G=function(a,f,d){function b(a,b){this.init(a,b)}b.attrsMap=a.merge(d.attrsMap,{r:"r"});a.merge(!0,b.prototype,f,{type:"circle",render:function(a){var c=this.attrsFromOptions(this.options);this.graphic=this.annotation.chart.renderer.circle(0,-9E9,0).attr(c).add(a);f.render.call(this)},redraw:function(a){var c=this.anchor(this.points[0]).absolutePosition;
+if(c)this.graphic[a?"animate":"attr"]({x:c.x,y:c.y,r:this.options.r});else this.graphic.attr({x:0,y:-9E9});this.graphic.placed=!!c;f.redraw.call(this,a)},translate:function(a,b){this.translatePoint(a,b,0)},setRadius:function(a){this.options.r=a}});return b}(l,u,v),D=function(a,f,d){function b(a,b){this.init(a,b)}b.shapesWithoutBackground=["connector"];b.alignedPosition=function(a,b){var c=a.align,d=a.verticalAlign,h=(b.x||0)+(a.x||0),f=(b.y||0)+(a.y||0),k,e;"right"===c?k=1:"center"===c&&(k=2);k&&
+(h+=(b.width-(a.width||0))/k);"bottom"===d?e=1:"middle"===d&&(e=2);e&&(f+=(b.height-(a.height||0))/e);return{x:Math.round(h),y:Math.round(f)}};b.justifiedOptions=function(a,b,d,g){var c=d.align,h=d.verticalAlign,k=b.box?0:b.padding||0,e=b.getBBox();b={align:c,verticalAlign:h,x:d.x,y:d.y,width:b.width,height:b.height};d=g.x-a.plotLeft;var m=g.y-a.plotTop;g=d+k;0>g&&("right"===c?b.align="left":b.x=-g);g=d+e.width-k;g>a.plotWidth&&("left"===c?b.align="right":b.x=a.plotWidth-g);g=m+k;0>g&&("bottom"===
+h?b.verticalAlign="top":b.y=-g);g=m+e.height-k;g>a.plotHeight&&("top"===h?b.verticalAlign="bottom":b.y=a.plotHeight-g);return b};b.attrsMap={backgroundColor:"fill",borderColor:"stroke",borderWidth:"stroke-width",zIndex:"zIndex",borderRadius:"r",padding:"padding"};a.merge(!0,b.prototype,f,{translatePoint:function(a,b){f.translatePoint.call(this,a,b,0)},translate:function(a,b){this.options.x+=a;this.options.y+=b},render:function(a){var c=this.options,d=this.attrsFromOptions(c),g=c.style;this.graphic=
+this.annotation.chart.renderer.label("",0,-9E9,c.shape,null,null,c.useHTML,null,"annotation-label").attr(d).add(a);this.annotation.chart.styledMode||("contrast"===g.color&&(g.color=this.annotation.chart.renderer.getContrast(-1<b.shapesWithoutBackground.indexOf(c.shape)?"#FFFFFF":c.backgroundColor)),this.graphic.css(c.style).shadow(c.shadow));c.className&&this.graphic.addClass(c.className);this.graphic.labelrank=c.labelrank;f.render.call(this)},redraw:function(c){var b=this.options,d=this.text||b.format||
+b.text,g=this.graphic,n=this.points[0];g.attr({text:d?a.format(d,n.getLabelConfig(),this.annotation.chart.time):b.formatter.call(n,this)});b=this.anchor(n);(d=this.position(b))?(g.alignAttr=d,d.anchorX=b.absolutePosition.x,d.anchorY=b.absolutePosition.y,g[c?"animate":"attr"](d)):g.attr({x:0,y:-9E9});g.placed=!!d;f.redraw.call(this,c)},anchor:function(){var a=f.anchor.apply(this,arguments),b=this.options.x||0,d=this.options.y||0;a.absolutePosition.x-=b;a.absolutePosition.y-=d;a.relativePosition.x-=
+b;a.relativePosition.y-=d;return a},position:function(c){var h=this.graphic,f=this.annotation.chart,g=this.points[0],n=this.options,l=c.absolutePosition,k=c.relativePosition,e;if(c=g.series.visible&&d.prototype.isInsidePane.call(g))n.distance?e=a.Tooltip.prototype.getPosition.call({chart:f,distance:a.pick(n.distance,16)},h.width,h.height,{plotX:k.x,plotY:k.y,negative:g.negative,ttBelow:g.ttBelow,h:k.height||k.width}):n.positioner?e=n.positioner.call(this):(g={x:l.x,y:l.y,width:0,height:0},e=b.alignedPosition(a.extend(n,
+{width:h.width,height:h.height}),g),"justify"===this.options.overflow&&(e=b.alignedPosition(b.justifiedOptions(f,h,n,e),g))),n.crop&&(n=e.x-f.plotLeft,g=e.y-f.plotTop,c=f.isInsidePlot(n,g)&&f.isInsidePlot(n+h.width,g+h.height));return c?e:null}});a.SVGRenderer.prototype.symbols.connector=function(b,d,f,g,n){var c=n&&n.anchorX;n=n&&n.anchorY;var k,e,m=f/2;a.isNumber(c)&&a.isNumber(n)&&(k=["M",c,n],e=d-n,0>e&&(e=-g-e),e<f&&(m=c<b+f/2?e:f-e),n>d+g?k.push("L",b+m,d+g):n<d?k.push("L",b+m,d):c<b?k.push("L",
+b,d+g/2):c>b+f&&k.push("L",b+f,d+g/2));return k||[]};return b}(l,u,z),H=function(a,f,d){function b(a,b){this.init(a,b)}b.attrsMap={width:"width",height:"height",zIndex:"zIndex"};a.merge(!0,b.prototype,f,{type:"image",render:function(a){var b=this.attrsFromOptions(this.options),c=this.options;this.graphic=this.annotation.chart.renderer.image(c.src,0,-9E9,c.width,c.height).attr(b).add(a);this.graphic.width=c.width;this.graphic.height=c.height;f.render.call(this)},redraw:function(a){var b=this.anchor(this.points[0]);
+if(b=d.prototype.position.call(this,b))this.graphic[a?"animate":"attr"]({x:b.x,y:b.y});else this.graphic.attr({x:0,y:-9E9});this.graphic.placed=!!b;f.redraw.call(this,a)},translate:function(a,b){this.translatePoint(a,b,0)}});return b}(l,u,D);(function(a,f,d,b,c,h,l,g,n,t){var k=a.merge,e=a.addEvent,m=a.defined,q=a.erase,w=a.find,A=a.isString,E=a.pick,y=a.reduce,p=a.splat,x=a.destroyObjectProperties,r=a.Annotation=function(a,b){var e;this.chart=a;this.points=[];this.controlPoints=[];this.coll="annotations";
+this.labels=[];this.shapes=[];this.options=b;this.userOptions=k(!0,{},b);e=this.getLabelsAndShapesOptions(this.userOptions,b);this.userOptions.labels=e.labels;this.userOptions.shapes=e.shapes;this.init(a,b)};k(!0,r.prototype,f,g,{defaultOptions:{visible:!0,draggable:"xy",labelOptions:{align:"center",allowOverlap:!1,backgroundColor:"rgba(0, 0, 0, 0.75)",borderColor:"black",borderRadius:3,borderWidth:1,className:"",crop:!1,formatter:function(){return m(this.y)?this.y:"Annotation label"},overflow:"justify",
+padding:5,shadow:!1,shape:"callout",style:{fontSize:"11px",fontWeight:"normal",color:"contrast"},useHTML:!1,verticalAlign:"bottom",x:0,y:-16},shapeOptions:{stroke:"rgba(0, 0, 0, 0.75)",strokeWidth:1,fill:"rgba(0, 0, 0, 0.75)",r:0,snap:2},controlPointOptions:{symbol:"circle",width:10,height:10,style:{stroke:"black","stroke-width":2,fill:"white"},visible:!1,events:{}},events:{},zIndex:6},init:function(){this.linkPoints();this.addControlPoints();this.addShapes();this.addLabels();this.addClipPaths();
+this.setLabelCollector()},getLabelsAndShapesOptions:function(a,b){var e={};["labels","shapes"].forEach(function(c){a[c]&&(e[c]=p(b[c]).map(function(b,e){return k(a[c][e],b)}))});return e},addShapes:function(){(this.options.shapes||[]).forEach(function(a,b){a=this.initShape(a);this.options.shapes[b]=a.options},this)},addLabels:function(){(this.options.labels||[]).forEach(function(a,b){a=this.initLabel(a);this.options.labels[b]=a.options},this)},addClipPaths:function(){this.setClipAxes();this.clipXAxis&&
+this.clipYAxis&&(this.clipRect=this.chart.renderer.clipRect(this.getClipBox()))},setClipAxes:function(){var a=this.chart.xAxis,b=this.chart.yAxis,e=y((this.options.labels||[]).concat(this.options.shapes||[]),function(e,c){return[a[c&&c.point&&c.point.xAxis]||e[0],b[c&&c.point&&c.point.yAxis]||e[1]]},[]);this.clipXAxis=e[0];this.clipYAxis=e[1]},getClipBox:function(){return{x:this.clipXAxis.left,y:this.clipYAxis.top,width:this.clipXAxis.width,height:this.clipYAxis.height}},setLabelCollector:function(){var a=
+this;a.labelCollector=function(){return a.labels.reduce(function(a,b){b.options.allowOverlap||a.push(b.graphic);return a},[])};a.chart.labelCollectors.push(a.labelCollector)},setOptions:function(a){this.options=k(this.defaultOptions,a)},redraw:function(a){this.linkPoints();this.graphic||this.render();this.clipRect&&this.clipRect.animate(this.getClipBox());this.redrawItems(this.shapes,a);this.redrawItems(this.labels,a);f.redraw.call(this,a)},redrawItems:function(a,b){for(var e=a.length;e--;)this.redrawItem(a[e],
+b)},render:function(){var a=this.chart.renderer;this.graphic=a.g("annotation").attr({zIndex:this.options.zIndex,visibility:this.options.visible?"visible":"hidden"}).add();this.shapesGroup=a.g("annotation-shapes").add(this.graphic).clip(this.chart.plotBoxClip);this.labelsGroup=a.g("annotation-labels").attr({translateX:0,translateY:0}).add(this.graphic);this.clipRect&&this.graphic.clip(this.clipRect);this.addEvents();f.render.call(this)},setVisibility:function(a){var b=this.options;a=E(a,!b.visible);
+this.graphic.attr("visibility",a?"visible":"hidden");a||this.setControlPointsVisibility(!1);b.visible=a},setControlPointsVisibility:function(a){var b=function(b){b.setControlPointsVisibility(a)};f.setControlPointsVisibility.call(this,a);this.shapes.forEach(b);this.labels.forEach(b)},destroy:function(){var a=this.chart,b=function(a){a.destroy()};this.labels.forEach(b);this.shapes.forEach(b);this.clipYAxis=this.clipXAxis=null;q(a.labelCollectors,this.labelCollector);g.destroy.call(this);f.destroy.call(this);
+x(this,a)},remove:function(){return this.destroy()},update:function(b){var e=this.chart,c=this.getLabelsAndShapesOptions(this.userOptions,b);b=a.merge(!0,this.userOptions,b);b.labels=c.labels;b.shapes=c.shapes;this.destroy();this.constructor(e,b);this.redraw()},initShape:function(a){a=k(this.options.shapeOptions,{controlPointOptions:this.options.controlPointOptions},a);a=new r.shapesMap[a.type](this,a);a.itemType="shape";this.shapes.push(a);return a},initLabel:function(a){a=k(this.options.labelOptions,
+{controlPointOptions:this.options.controlPointOptions},a);a=new l(this,a);a.itemType="label";this.labels.push(a);return a},redrawItem:function(b,e){b.linkPoints();b.shouldBeDrawn()?(b.graphic||this.renderItem(b),b.redraw(a.pick(e,!0)&&b.graphic.placed),b.points.length&&this.adjustVisibility(b)):this.destroyItem(b)},adjustVisibility:function(a){var b=!1,e=a.graphic;a.points.forEach(function(a){!1!==a.series.visible&&!1!==a.visible&&(b=!0)});b?"hidden"===e.visibility&&e.show():e.hide()},destroyItem:function(a){q(this[a.itemType+
+"s"],a);a.destroy()},renderItem:function(a){a.render("label"===a.itemType?this.labelsGroup:this.shapesGroup)}});r.shapesMap={rect:d,circle:b,path:c,image:h};r.types={};r.MockPoint=n;r.ControlPoint=t;a.extendAnnotation=function(a,b,e,c){b=b||r;k(!0,a.prototype,b.prototype,e);a.prototype.defaultOptions=k(a.prototype.defaultOptions,c||{})};a.Chart.prototype.collectionsWithUpdate.push("annotations");a.extend(a.Chart.prototype,{initAnnotation:function(b){var e=r.types[b.type]||r;b=a.merge(e.prototype.defaultOptions,
+b);e=new e(this,b);this.annotations.push(e);return e},addAnnotation:function(a,b){a=this.initAnnotation(a);this.options.annotations.push(a.options);E(b,!0)&&a.redraw();return a},removeAnnotation:function(a){var b=this.annotations,e=A(a)?w(b,function(b){return b.options.id===a}):a;e&&(q(this.options.annotations,e.options),q(b,e),e.destroy())},drawAnnotations:function(){this.plotBoxClip.attr(this.plotBox);this.annotations.forEach(function(a){a.redraw()})}});a.Chart.prototype.callbacks.push(function(a){a.annotations=
+[];a.options.annotations||(a.options.annotations=[]);a.plotBoxClip=this.renderer.clipRect(this.plotBox);a.controlPointsGroup=a.renderer.g("control-points").attr({zIndex:99}).clip(a.plotBoxClip).add();a.options.annotations.forEach(function(b,e){b=a.initAnnotation(b);a.options.annotations[e]=b.options});a.drawAnnotations();e(a,"redraw",a.drawAnnotations);e(a,"destroy",function(){a.plotBoxClip.destroy();a.controlPointsGroup.destroy()})})})(l,u,F,G,v,H,D,B,z,C);(function(a){function f(b){var e=b.prototype.defaultOptions.events&&
+b.prototype.defaultOptions.events.click;a.merge(!0,b.prototype.defaultOptions.events,{click:function(a){var b=this,c=b.chart.navigationBindings,d=c.activeAnnotation;e&&e.click.call(b,a);d!==b?(c.deselectAnnotation(),c.activeAnnotation=b,b.setControlPointsVisibility(!0),g(c,"showPopup",{annotation:b,formType:"annotation-toolbar",options:c.annotationToFields(b),onSubmit:function(a){var e={};"remove"===a.actionType?(c.activeAnnotation=!1,c.chart.removeAnnotation(b)):(c.fieldsToOptions(a.fields,e),c.deselectAnnotation(),
+a=e.typeOptions,"measure"===b.options.type&&(a.crosshairY.enabled=0!==a.crosshairY.strokeWidth,a.crosshairX.enabled=0!==a.crosshairX.strokeWidth),b.update(e))}})):(c.deselectAnnotation(),g(c,"closePopup"));a.activeAnnotation=!0}})}var d=a.doc,b=a.addEvent,c=a.pick,h=a.extend,l=a.isNumber,g=a.fireEvent,n=a.isArray,t=a.isObject,k=a.objectEach;a.NavigationBindings=function(a,b){this.chart=a;this.options=b;this.eventsToUnbind=[];this.container=d.getElementsByClassName(this.options.bindingsClassName)};
+a.NavigationBindings.annotationsEditable={nestedOptions:{labelOptions:["style","format","backgroundColor"],labels:["style"],label:["style"],style:["fontSize","color"],background:["fill","strokeWidth","stroke"],innerBackground:["fill","strokeWidth","stroke"],outerBackground:["fill","strokeWidth","stroke"],shapeOptions:["fill","strokeWidth","stroke"],shapes:["fill","strokeWidth","stroke"],line:["strokeWidth","stroke"],backgroundColors:[!0],connector:["fill","strokeWidth","stroke"],crosshairX:["strokeWidth",
+"stroke"],crosshairY:["strokeWidth","stroke"]},circle:["shapes"],verticalLine:[],label:["labelOptions"],measure:["background","crosshairY","crosshairX"],fibonacci:[],tunnel:["background","line","height"],pitchfork:["innerBackground","outerBackground"],rect:["shapes"],crookedLine:[]};a.NavigationBindings.annotationsNonEditable={rectangle:["crosshairX","crosshairY","label"]};h(a.NavigationBindings.prototype,{initEvents:function(){var a=this,c=a.chart,d=a.container,f=a.options;a.boundClassNames={};k(f.bindings,
+function(b){a.boundClassNames[b.className]=b});[].forEach.call(d,function(e){a.eventsToUnbind.push(b(e,"click",function(b){var e=a.getButtonEvents(d,b);e&&a.bindingsButtonClick(e.button,e.events,b)}))});k(f.events||{},function(e,c){a.eventsToUnbind.push(b(a,c,e))});a.eventsToUnbind.push(b(c.container,"click",function(b){!c.cancelClick&&c.isInsidePlot(b.chartX-c.plotLeft,b.chartY-c.plotTop)&&a.bindingsChartClick(this,b)}));a.eventsToUnbind.push(b(c.container,"mousemove",function(b){a.bindingsContainerMouseMove(this,
+b)}))},bindingsButtonClick:function(a,b,c){var e=this.chart;this.selectedButtonElement&&(g(this,"deselectButton",{button:this.selectedButtonElement}),this.nextEvent&&(this.currentUserDetails&&"annotations"===this.currentUserDetails.coll&&e.removeAnnotation(this.currentUserDetails),this.mouseMoveEvent=this.nextEvent=!1));this.selectedButton=b;this.selectedButtonElement=a;g(this,"selectButton",{button:a});b.init&&b.init.call(this,a,c);(b.start||b.steps)&&e.renderer.boxWrapper.addClass("highcharts-draw-mode")},
+bindingsChartClick:function(a,b){a=this.selectedButton;var c=this.chart.renderer.boxWrapper;this.activeAnnotation&&!b.activeAnnotation&&b.target.parentNode&&!b.target.closest(".highcharts-popup")&&(g(this,"closePopup"),this.deselectAnnotation());a&&a.start&&(this.nextEvent?(this.nextEvent.call(this,b,this.currentUserDetails),this.steps&&(this.stepIndex++,a.steps[this.stepIndex]?this.mouseMoveEvent=this.nextEvent=a.steps[this.stepIndex]:(g(this,"deselectButton",{button:this.selectedButtonElement}),
+c.removeClass("highcharts-draw-mode"),a.end&&a.end.call(this,b,this.currentUserDetails),this.mouseMoveEvent=this.nextEvent=!1,this.selectedButton=null))):(this.currentUserDetails=a.start.call(this,b),a.steps?(this.stepIndex=0,this.steps=!0,this.mouseMoveEvent=this.nextEvent=a.steps[this.stepIndex]):(g(this,"deselectButton",{button:this.selectedButtonElement}),c.removeClass("highcharts-draw-mode"),this.steps=!1,this.selectedButton=null,a.end&&a.end.call(this,b,this.currentUserDetails))))},bindingsContainerMouseMove:function(a,
+b){this.mouseMoveEvent&&this.mouseMoveEvent.call(this,b,this.currentUserDetails)},fieldsToOptions:function(a,b){k(a,function(a,e){var d=parseFloat(a),k=e.split("."),q=b,m=k.length-1;!l(d)||a.match(/px/g)||e.match(/format/g)||(a=d);""!==a&&"undefined"!==a&&k.forEach(function(b,e){var d=c(k[e+1],"");m===e?q[b]=a:(q[b]||(q[b]=d.match(/\d/g)?[]:{}),q=q[b])})});return b},deselectAnnotation:function(){this.activeAnnotation&&(this.activeAnnotation.setControlPointsVisibility(!1),this.activeAnnotation=!1)},
+annotationToFields:function(b){function e(c,d,q,f){var m;q&&-1===l.indexOf(d)&&(0<=(q.indexOf&&q.indexOf(d))||q[d]||!0===q)&&(n(c)?(f[d]=[],c.forEach(function(a,b){t(a)?(f[d][b]={},k(a,function(a,c){e(a,c,g[d],f[d][b])})):e(a,0,g[d],f[d])})):t(c)?(m={},n(f)?(f.push(m),m[d]={},m=m[d]):f[d]=m,k(c,function(a,b){e(a,b,0===d?q:g[d],m)})):"format"===d?f[d]=[a.format(c,b.labels[0].points[0]).toString(),"text"]:n(f)?f.push([c,h(c)]):f[d]=[c,h(c)])}var d=b.options,f=a.NavigationBindings.annotationsEditable,
+g=f.nestedOptions,h=this.utils.getFieldType,y=c(d.type,d.shapes&&d.shapes[0]&&d.shapes[0].type,d.labels&&d.labels[0]&&d.labels[0].itemType,"label"),l=a.NavigationBindings.annotationsNonEditable[d.langKey]||[],p={langKey:d.langKey,type:y};k(d,function(a,b){"typeOptions"===b?(p[b]={},k(d[b],function(a,c){e(a,c,g,p[b],!0)})):e(a,b,f[y],p)});return p},getClickedClassNames:function(b,c){var e=c.target;c=[];for(var d;e&&((d=a.attr(e,"class"))&&(c=c.concat(d.split(" ").map(function(a){return[a,e]}))),e=
+e.parentNode,e!==b););return c},getButtonEvents:function(a,b){var c=this,e;this.getClickedClassNames(a,b).forEach(function(a){c.boundClassNames[a[0]]&&!e&&(e={events:c.boundClassNames[a[0]],button:a[1]})});return e},update:function(){this.removeEvents();this.initEvents()},removeEvents:function(){this.eventsToUnbind.forEach(function(a){a()})},destroy:function(){this.removeEvents()},utils:{updateRectSize:function(a,b){var c=b.options.typeOptions,e=this.chart.xAxis[0].toPixels(c.point.x),c=this.chart.yAxis[0].toPixels(c.point.y);
+b.update({typeOptions:{background:{width:a.chartX-e+"px",height:a.chartY-c+"px"}}})},getFieldType:function(a){return{string:"text",number:"number","boolean":"checkbox"}[typeof a]}}});b(a.Chart,"load",function(){var b=this.options;b&&b.navigation&&b.navigation.bindings&&(this.navigationBindings=new a.NavigationBindings(this,b.navigation),this.navigationBindings.initEvents())});b(a.Chart,"destroy",function(){this.navigationBindings&&this.navigationBindings.destroy()});b(a.NavigationBindings,"deselectButton",
+function(){this.selectedButtonElement=null});a.Annotation&&(f(a.Annotation),a.objectEach(a.Annotation.types,function(a){f(a)}));a.setOptions({lang:{navigation:{popup:{simpleShapes:"Simple shapes",lines:"Lines",circle:"Circle",rectangle:"Rectangle",label:"Label",shapeOptions:"Shape options",typeOptions:"Details",fill:"Fill",format:"Text",strokeWidth:"Line width",stroke:"Line color",title:"Title",name:"Name",labelOptions:"Label options",labels:"Labels",backgroundColor:"Background color",backgroundColors:"Background colors",
+borderColor:"Border color",borderRadius:"Border radius",borderWidth:"Border width",style:"Style",padding:"Padding",fontSize:"Font size",color:"Color",height:"Height",shapes:"Shape options"}}},navigation:{bindingsClassName:"highcharts-bindings-wrapper",bindings:{circleAnnotation:{className:"highcharts-circle-annotation",start:function(b){var c=this.chart.xAxis[0].toValue(b.chartX);b=this.chart.yAxis[0].toValue(b.chartY);return this.chart.addAnnotation({langKey:"circle",shapes:[{type:"circle",point:{xAxis:0,
+yAxis:0,x:c,y:b},r:5,controlPoints:[{positioner:function(b){var c=a.Annotation.MockPoint.pointToPixels(b.points[0]);b=b.options.r;return{x:c.x+b*Math.cos(Math.PI/4)-this.graphic.width/2,y:c.y+b*Math.sin(Math.PI/4)-this.graphic.height/2}},events:{drag:function(a,b){a=this.mouseMoveToTranslation(a);b.setRadius(Math.max(b.options.r+a.y/Math.sin(Math.PI/4),5));b.redraw(!1)}}}]}]})},steps:[function(a,b){var c=b.options.shapes[0].point,d=this.chart.xAxis[0].toPixels(c.x),c=this.chart.yAxis[0].toPixels(c.y);
+b.update({shapes:[{r:Math.max(Math.sqrt(Math.pow(d-a.chartX,2)+Math.pow(c-a.chartY,2)),5)}]})}]},rectangleAnnotation:{className:"highcharts-rectangle-annotation",start:function(b){var c=this.chart.xAxis[0].toValue(b.chartX);b=this.chart.yAxis[0].toValue(b.chartY);return this.chart.addAnnotation({langKey:"rectangle",shapes:[{type:"rect",point:{x:c,y:b,xAxis:0,yAxis:0},width:5,height:5,controlPoints:[{positioner:function(b){var c=a.Annotation.MockPoint.pointToPixels(b.points[0]);return{x:c.x+b.options.width-
+4,y:c.y+b.options.height-4}},events:{drag:function(a,b){a=this.mouseMoveToTranslation(a);b.options.width=Math.max(b.options.width+a.x,5);b.options.height=Math.max(b.options.height+a.y,5);b.redraw(!1)}}}]}]})},steps:[function(a,b){var c=this.chart.yAxis[0],d=b.options.shapes[0].point,e=this.chart.xAxis[0].toPixels(d.x),c=c.toPixels(d.y);b.update({shapes:[{width:Math.max(a.chartX-e,5),height:Math.max(a.chartY-c,5),point:{x:d.x,y:d.y}}]})}]},labelAnnotation:{className:"highcharts-label-annotation",start:function(b){var c=
+this.chart.xAxis[0].toValue(b.chartX);b=this.chart.yAxis[0].toValue(b.chartY);this.chart.addAnnotation({langKey:"label",labelOptions:{format:"{y:.2f}"},labels:[{point:{x:c,y:b,xAxis:0,yAxis:0},controlPoints:[{symbol:"triangle-down",positioner:function(b){if(!b.graphic.placed)return{x:0,y:-9E7};b=a.Annotation.MockPoint.pointToPixels(b.points[0]);return{x:b.x-this.graphic.width/2,y:b.y-this.graphic.height/2}},events:{drag:function(a,b){a=this.mouseMoveToTranslation(a);b.translatePoint(a.x,a.y);b.redraw(!1)}}},
+{symbol:"square",positioner:function(a){return a.graphic.placed?{x:a.graphic.alignAttr.x-this.graphic.width/2,y:a.graphic.alignAttr.y-this.graphic.height/2}:{x:0,y:-9E7}},events:{drag:function(a,b){a=this.mouseMoveToTranslation(a);b.translate(a.x,a.y);b.redraw(!1)}}}],overflow:"none",crop:!0}]})}}},events:{}}})})(l);(function(a){var f=a.addEvent,d=a.createElement,b=a.objectEach,c=a.pick,h=a.wrap,l=a.isString,g=a.isObject,n=a.isArray,t=/\d/g;h(a.Pointer.prototype,"onContainerMouseDown",function(a,
+b){var c=b.target&&b.target.className;l(c)&&0<=c.indexOf("highcharts-popup-field")||a.apply(this,Array.prototype.slice.call(arguments,1))});a.Popup=function(a){this.init(a)};a.Popup.prototype={init:function(a){this.container=d("div",{className:"highcharts-popup"},null,a);this.lang=this.getLangpack();this.addCloseBtn.call(this)},addCloseBtn:function(){var a=this,b;b=d("div",{className:"highcharts-popup-close"},null,this.container);f(b,"click",function(){a.closePopup.call(a)})},addColsContainer:function(a){var b;
+b=d("div",{className:"highcharts-popup-lhs-col"},null,a);a=d("div",{className:"highcharts-popup-rhs-col"},null,a);d("div",{className:"highcharts-popup-rhs-col-wrapper"},null,a);return{lhsCol:b,rhsCol:a}},addInput:function(a,b,c,f){var e=a.split("."),e=e[e.length-1],k=this.lang;b="highcharts-"+b+"-"+e;b.match(t)||d("label",{innerHTML:k[e]||e,htmlFor:b},null,c);d("input",{name:b,value:f[0],type:f[1],className:"highcharts-popup-field"},null,c).setAttribute("highcharts-data-name",a)},addButton:function(a,
+b,c,g,h){var e=this,k=this.closePopup,m=this.getFields;a=d("button",{innerHTML:b},null,a);f(a,"click",function(){k.call(e);return g(m(h,c))});return a},getFields:function(a,b){var c=a.querySelectorAll("input"),d=a.querySelectorAll("#highcharts-select-series \x3e option:checked")[0];a=a.querySelectorAll("#highcharts-select-volume \x3e option:checked")[0];var e,k,f;f={actionType:b,linkedTo:d&&d.getAttribute("value"),fields:{}};c.forEach(function(a){k=a.getAttribute("highcharts-data-name");(e=a.getAttribute("highcharts-data-series-id"))?
+f.seriesId=a.value:k?f.fields[k]=a.value:f.type=a.value});a&&(f.fields["params.volumeSeriesID"]=a.getAttribute("value"));return f},showPopup:function(){var a=this.container,b=a.querySelectorAll(".highcharts-popup-close")[0];a.innerHTML="";0<=a.className.indexOf("highcharts-annotation-toolbar")&&(a.classList.remove("highcharts-annotation-toolbar"),a.removeAttribute("style"));a.appendChild(b);a.style.display="block"},closePopup:function(){this.popup.container.style.display="none"},showForm:function(a,
+b,c,d){this.popup=b.navigationBindings.popup;this.showPopup();"indicators"===a&&this.indicators.addForm.call(this,b,c,d);"annotation-toolbar"===a&&this.annotations.addToolbar.call(this,b,c,d);"annotation-edit"===a&&this.annotations.addForm.call(this,b,c,d);"flag"===a&&this.annotations.addForm.call(this,b,c,d,!0)},getLangpack:function(){return a.getOptions().lang.navigation.popup},annotations:{addToolbar:function(a,b,f){var e=this,k=this.lang,g=this.popup.container,h=this.showForm,m;-1===g.className.indexOf("highcharts-annotation-toolbar")&&
+(g.className+=" highcharts-annotation-toolbar");g.style.top=a.plotTop+10+"px";d("span",{innerHTML:c(k[b.langKey]||b.langKey,b.shapes&&b.shapes[0].type)},null,g);m=this.addButton.call(this,g,k.removeButton||"remove","remove",f,g);m.className+=" highcharts-annotation-remove-button";m=this.addButton.call(this,g,k.editButton||"edit","edit",function(){h.call(e,"annotation-edit",a,b,f)},g);m.className+=" highcharts-annotation-edit-button"},addForm:function(a,b,c,f){var e=this.popup.container,k=this.lang,
+g,h;d("h2",{innerHTML:k[b.langKey]||b.langKey,className:"highcharts-popup-main-title"},null,e);h=d("div",{className:"highcharts-popup-lhs-col highcharts-popup-lhs-full"},null,e);g=d("div",{className:"highcharts-popup-bottom-row"},null,e);this.annotations.addFormFields.call(this,h,a,"",b,[],!0);this.addButton.call(this,g,f?k.addButton||"add":k.saveButton||"save",f?"add":"save",c,e)},addFormFields:function(a,c,f,h,l,A){var e=this,k=this.annotations.addFormFields,m=this.addInput,q=this.lang,p,w;b(h,
+function(b,d){p=""!==f?f+"."+d:d;g(b)&&(!n(b)||n(b)&&g(b[0])?(w=q[d]||d,w.match(t)||l.push([!0,w,a]),k.call(e,a,c,p,b,l,!1)):l.push([e,p,"annotation",a,b]))});A&&(l=l.sort(function(a){return a[1].match(/format/g)?-1:1}),l.forEach(function(a){!0===a[0]?d("span",{className:"highcharts-annotation-title",innerHTML:a[1]},null,a[2]):m.apply(a[0],a.splice(1))}))}},indicators:{addForm:function(a,b,c){var d=this.indicators,e=this.lang,f;this.tabs.init.call(this,a);b=this.popup.container.querySelectorAll(".highcharts-tab-item-content");
+this.addColsContainer(b[0]);d.addIndicatorList.call(this,a,b[0],"add");f=b[0].querySelectorAll(".highcharts-popup-rhs-col")[0];this.addButton.call(this,f,e.addButton||"add","add",c,f);this.addColsContainer(b[1]);d.addIndicatorList.call(this,a,b[1],"edit");f=b[1].querySelectorAll(".highcharts-popup-rhs-col")[0];this.addButton.call(this,f,e.saveButton||"save","edit",c,f);this.addButton.call(this,f,e.removeButton||"remove","remove",c,f)},addIndicatorList:function(c,e,g){var k=this,h=e.querySelectorAll(".highcharts-popup-lhs-col")[0];
+e=e.querySelectorAll(".highcharts-popup-rhs-col")[0];var m=a.getOptions(),l="edit"===g,n=l?c.series:m.plotOptions,p=this.indicators.addFormFields,x,r,t;r=d("ul",{className:"highcharts-indicator-list"},null,h);x=e.querySelectorAll(".highcharts-popup-rhs-col-wrapper")[0];b(n,function(a,b){var e=a.options;if(a.params||e&&e.params){var g=k.indicators.getNameType(a,b);t=d("li",{className:"highcharts-indicator-list",innerHTML:g.name},null,r);f(t,"click",function(){p.call(k,c,l?a:n[g.type],g.type,x);l&&
+a.options&&d("input",{type:"hidden",name:"highcharts-id-"+g.type,value:a.options.id},null,x).setAttribute("highcharts-data-series-id",a.options.id)})}});0<r.childNodes.length&&r.childNodes[0].click()},getNameType:function(b,c){var d=b.options,e=a.seriesTypes,e=e[c]&&e[c].prototype.nameBase||c.toUpperCase();d&&d.type&&(c=b.options.type,e=b.name);return{name:e,type:c}},listAllSeries:function(a,b,c,f){a="highcharts-"+b+"-type-"+a;var e,g;d("label",{innerHTML:this.lang[b]||b,htmlFor:a},null,f);e=d("select",
+{name:a,className:"highcharts-popup-field"},null,f);e.setAttribute("id","highcharts-select-"+b);c.series.forEach(function(a){g=a.options;!g.params&&g.id&&"highcharts-navigator-series"!==g.id&&d("option",{innerHTML:g.name||g.id,value:g.id},null,e)})},addFormFields:function(a,b,c,f){var e=b.params||b.options.params,g=this.indicators.getNameType;f.innerHTML="";d("h3",{className:"highcharts-indicator-title",innerHTML:g(b,c).name},null,f);d("input",{type:"hidden",name:"highcharts-type-"+c,value:c},null,
+f);this.indicators.listAllSeries.call(this,c,"series",a,f);e.volumeSeriesID&&this.indicators.listAllSeries.call(this,c,"volume",a,f);this.indicators.addParamInputs.call(this,a,"params",e,c,f)},addParamInputs:function(a,c,d,f,h){var e=this,k=this.indicators.addParamInputs,m=this.addInput,l;b(d,function(b,d){l=c+"."+d;g(b)?k.call(e,a,l,b,f,h):"params.volumeSeriesID"!==l&&m.call(e,l,f,h,[b,"text"])})},getAmount:function(){var a=0;b(this.series,function(b){var c=b.options;(b.params||c&&c.params)&&a++});
+return a}},tabs:{init:function(a){var b=this.tabs;a=this.indicators.getAmount.call(a);var c;c=b.addMenuItem.call(this,"add");b.addMenuItem.call(this,"edit",a);b.addContentItem.call(this,"add");b.addContentItem.call(this,"edit");b.switchTabs.call(this,a);b.selectTab.call(this,c,0)},addMenuItem:function(a,b){var c=this.popup.container,e="highcharts-tab-item",f=this.lang;0===b&&(e+=" highcharts-tab-disabled");b=d("span",{innerHTML:f[a+"Button"]||a,className:e},null,c);b.setAttribute("highcharts-data-tab-type",
+a);return b},addContentItem:function(){return d("div",{className:"highcharts-tab-item-content"},null,this.popup.container)},switchTabs:function(a){var b=this,c;this.popup.container.querySelectorAll(".highcharts-tab-item").forEach(function(d,e){c=d.getAttribute("highcharts-data-tab-type");"edit"===c&&0===a||f(d,"click",function(){b.tabs.deselectAll.call(b);b.tabs.selectTab.call(b,this,e)})})},selectTab:function(a,b){var c=this.popup.container.querySelectorAll(".highcharts-tab-item-content");a.className+=
+" highcharts-tab-item-active";c[b].className+=" highcharts-tab-item-show"},deselectAll:function(){var a=this.popup.container,b=a.querySelectorAll(".highcharts-tab-item"),a=a.querySelectorAll(".highcharts-tab-item-content"),c;for(c=0;c<b.length;c++)b[c].classList.remove("highcharts-tab-item-active"),a[c].classList.remove("highcharts-tab-item-show")}}};f(a.NavigationBindings,"showPopup",function(b){this.popup||(this.popup=new a.Popup(this.chart.container));this.popup.showForm(b.formType,this.chart,
+b.options,b.onSubmit)});f(a.NavigationBindings,"closePopup",function(){this.popup&&this.popup.closePopup()})})(l)});
+//# sourceMappingURL=annotations.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+ Boost module
+
+ (c) 2010-2018 Highsoft AS
+ Author: Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(z){"object"===typeof module&&module.exports?module.exports=z:"function"===typeof define&&define.amd?define(function(){return z}):z("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(z){(function(l){function z(){var a=Array.prototype.slice.call(arguments),c=-Number.MAX_VALUE;a.forEach(function(a){if("undefined"!==typeof a&&null!==a&&"undefined"!==typeof a.length&&0<a.length)return c=a.length,!0});return c}function V(a){var c=0,d=0,f=G(a.options.boost&&a.options.boost.allowForce,
+!0),b;if("undefined"!==typeof a.boostForceChartBoost)return a.boostForceChartBoost;if(1<a.series.length)for(var l=0;l<a.series.length;l++)b=a.series[l],0!==b.options.boostThreshold&&!1!==b.visible&&"heatmap"!==b.type&&(H[b.type]&&++d,z(b.processedXData,b.options.data,b.points)>=(b.options.boostThreshold||Number.MAX_VALUE)&&++c);a.boostForceChartBoost=f&&(d===a.series.length&&0<c||5<c);return a.boostForceChartBoost}function P(a){return G(a&&a.options&&a.options.boost&&a.options.boost.enabled,!0)}function pa(a){function c(){k.length&&
+l.error("[highcharts boost] shader error - "+k.join("\n"))}function d(b,e){var c=a.createShader("vertex"===e?a.VERTEX_SHADER:a.FRAGMENT_SHADER);a.shaderSource(c,b);a.compileShader(c);return a.getShaderParameter(c,a.COMPILE_STATUS)?c:(k.push("when compiling "+e+" shader:\n"+a.getShaderInfoLog(c)),!1)}function f(){function b(b){return a.getUniformLocation(h,b)}var f=d("#version 100\nprecision highp float;\nattribute vec4 aVertexPosition;\nattribute vec4 aColor;\nvarying highp vec2 position;\nvarying highp vec4 vColor;\nuniform mat4 uPMatrix;\nuniform float pSize;\nuniform float translatedThreshold;\nuniform bool hasThreshold;\nuniform bool skipTranslation;\nuniform float plotHeight;\nuniform float xAxisTrans;\nuniform float xAxisMin;\nuniform float xAxisMinPad;\nuniform float xAxisPointRange;\nuniform float xAxisLen;\nuniform bool  xAxisPostTranslate;\nuniform float xAxisOrdinalSlope;\nuniform float xAxisOrdinalOffset;\nuniform float xAxisPos;\nuniform bool  xAxisCVSCoord;\nuniform float yAxisTrans;\nuniform float yAxisMin;\nuniform float yAxisMinPad;\nuniform float yAxisPointRange;\nuniform float yAxisLen;\nuniform bool  yAxisPostTranslate;\nuniform float yAxisOrdinalSlope;\nuniform float yAxisOrdinalOffset;\nuniform float yAxisPos;\nuniform bool  yAxisCVSCoord;\nuniform bool  isBubble;\nuniform bool  bubbleSizeByArea;\nuniform float bubbleZMin;\nuniform float bubbleZMax;\nuniform float bubbleZThreshold;\nuniform float bubbleMinSize;\nuniform float bubbleMaxSize;\nuniform bool  bubbleSizeAbs;\nuniform bool  isInverted;\nfloat bubbleRadius(){\nfloat value \x3d aVertexPosition.w;\nfloat zMax \x3d bubbleZMax;\nfloat zMin \x3d bubbleZMin;\nfloat radius \x3d 0.0;\nfloat pos \x3d 0.0;\nfloat zRange \x3d zMax - zMin;\nif (bubbleSizeAbs){\nvalue \x3d value - bubbleZThreshold;\nzMax \x3d max(zMax - bubbleZThreshold, zMin - bubbleZThreshold);\nzMin \x3d 0.0;\n}\nif (value \x3c zMin){\nradius \x3d bubbleZMin / 2.0 - 1.0;\n} else {\npos \x3d zRange \x3e 0.0 ? (value - zMin) / zRange : 0.5;\nif (bubbleSizeByArea \x26\x26 pos \x3e 0.0){\npos \x3d sqrt(pos);\n}\nradius \x3d ceil(bubbleMinSize + pos * (bubbleMaxSize - bubbleMinSize)) / 2.0;\n}\nreturn radius * 2.0;\n}\nfloat translate(float val,\nfloat pointPlacement,\nfloat localA,\nfloat localMin,\nfloat minPixelPadding,\nfloat pointRange,\nfloat len,\nbool  cvsCoord\n){\nfloat sign \x3d 1.0;\nfloat cvsOffset \x3d 0.0;\nif (cvsCoord) {\nsign *\x3d -1.0;\ncvsOffset \x3d len;\n}\nreturn sign * (val - localMin) * localA + cvsOffset + \n(sign * minPixelPadding);\n}\nfloat xToPixels(float value){\nif (skipTranslation){\nreturn value;// + xAxisPos;\n}\nreturn translate(value, 0.0, xAxisTrans, xAxisMin, xAxisMinPad, xAxisPointRange, xAxisLen, xAxisCVSCoord);// + xAxisPos;\n}\nfloat yToPixels(float value, float checkTreshold){\nfloat v;\nif (skipTranslation){\nv \x3d value;// + yAxisPos;\n} else {\nv \x3d translate(value, 0.0, yAxisTrans, yAxisMin, yAxisMinPad, yAxisPointRange, yAxisLen, yAxisCVSCoord);// + yAxisPos;\nif (v \x3e plotHeight) {\nv \x3d plotHeight;\n}\n}\nif (checkTreshold \x3e 0.0 \x26\x26 hasThreshold) {\nv \x3d min(v, translatedThreshold);\n}\nreturn v;\n}\nvoid main(void) {\nif (isBubble){\ngl_PointSize \x3d bubbleRadius();\n} else {\ngl_PointSize \x3d pSize;\n}\nvColor \x3d aColor;\nif (isInverted) {\ngl_Position \x3d uPMatrix * vec4(xToPixels(aVertexPosition.y) + yAxisPos, yToPixels(aVertexPosition.x, aVertexPosition.z) + xAxisPos, 0.0, 1.0);\n} else {\ngl_Position \x3d uPMatrix * vec4(xToPixels(aVertexPosition.x) + xAxisPos, yToPixels(aVertexPosition.y, aVertexPosition.z) + yAxisPos, 0.0, 1.0);\n}\n}",
+"vertex"),l=d("precision highp float;\nuniform vec4 fillColor;\nvarying highp vec2 position;\nvarying highp vec4 vColor;\nuniform sampler2D uSampler;\nuniform bool isCircle;\nuniform bool hasColor;\nvoid main(void) {\nvec4 col \x3d fillColor;\nvec4 tcol;\nif (hasColor) {\ncol \x3d vColor;\n}\nif (isCircle) {\ntcol \x3d texture2D(uSampler, gl_PointCoord.st);\ncol *\x3d tcol;\nif (tcol.r \x3c 0.0) {\ndiscard;\n} else {\ngl_FragColor \x3d col;\n}\n} else {\ngl_FragColor \x3d col;\n}\n}","fragment");
+if(!f||!l)return h=!1,c(),!1;h=a.createProgram();a.attachShader(h,f);a.attachShader(h,l);a.linkProgram(h);if(!a.getProgramParameter(h,a.LINK_STATUS))return k.push(a.getProgramInfoLog(h)),c(),h=!1;a.useProgram(h);a.bindAttribLocation(h,0,"aVertexPosition");m=b("uPMatrix");Q=b("pSize");n=b("fillColor");g=b("isBubble");A=b("bubbleSizeAbs");e=b("bubbleSizeByArea");I=b("uSampler");v=b("skipTranslation");F=b("isCircle");B=b("isInverted");p=b("plotHeight");return!0}function b(b,e){a&&h&&(b=N[b]=N[b]||a.getUniformLocation(h,
+b),a.uniform1f(b,e))}var N={},h,m,Q,n,g,A,e,v,F,B,p,k=[],I;return a&&!f()?!1:{psUniform:function(){return Q},pUniform:function(){return m},fillColorUniform:function(){return n},setPlotHeight:function(b){a&&h&&a.uniform1f(p,b)},setBubbleUniforms:function(c,d,f){var l=c.options,u=Number.MAX_VALUE,w=-Number.MAX_VALUE;a&&h&&"bubble"===c.type&&(u=G(l.zMin,Math.min(u,Math.max(d,!1===l.displayNegative?l.zThreshold:-Number.MAX_VALUE))),w=G(l.zMax,Math.max(w,f)),a.uniform1i(g,1),a.uniform1i(F,1),a.uniform1i(e,
+"width"!==c.options.sizeBy),a.uniform1i(A,c.options.sizeByAbsoluteValue),b("bubbleZMin",u),b("bubbleZMax",w),b("bubbleZThreshold",c.options.zThreshold),b("bubbleMinSize",c.minPxSize),b("bubbleMaxSize",c.maxPxSize))},bind:function(){a&&h&&a.useProgram(h)},program:function(){return h},create:f,setUniform:b,setPMatrix:function(b){a&&h&&a.uniformMatrix4fv(m,!1,b)},setColor:function(b){a&&h&&a.uniform4f(n,b[0]/255,b[1]/255,b[2]/255,b[3])},setPointSize:function(b){a&&h&&a.uniform1f(Q,b)},setSkipTranslation:function(b){a&&
+h&&a.uniform1i(v,!0===b?1:0)},setTexture:function(b){a&&h&&a.uniform1i(I,b)},setDrawAsCircle:function(b){a&&h&&a.uniform1i(F,b?1:0)},reset:function(){a&&h&&(a.uniform1i(g,0),a.uniform1i(F,0))},setInverted:function(b){a&&h&&a.uniform1i(B,b)},destroy:function(){a&&h&&(a.deleteProgram(h),h=!1)}}}function R(a,c,d){function f(){b&&(a.deleteBuffer(b),l=b=!1);k=0;h=d||2;n=[]}var b=!1,l=!1,h=d||2,m=!1,k=0,n;return{destroy:f,bind:function(){if(!b)return!1;a.vertexAttribPointer(l,h,a.FLOAT,!1,0,0)},data:n,
+build:function(d,A,e){var g;n=d||[];if(!(n&&0!==n.length||m))return f(),!1;h=e||h;b&&a.deleteBuffer(b);m||(g=new Float32Array(n));b=a.createBuffer();a.bindBuffer(a.ARRAY_BUFFER,b);a.bufferData(a.ARRAY_BUFFER,m||g,a.STATIC_DRAW);l=a.getAttribLocation(c.program(),A);a.enableVertexAttribArray(l);return!0},render:function(c,d,e){var g=m?m.length:n.length;if(!b||!g)return!1;if(!c||c>g||0>c)c=0;if(!d||d>g)d=g;a.drawArrays(a[(e||"points").toUpperCase()],c/h,(d-c)/h);return!0},allocate:function(a){k=-1;m=
+new Float32Array(4*a)},push:function(a,b,c,d){m&&(m[++k]=a,m[++k]=b,m[++k]=c,m[++k]=d)}}}function qa(a){function c(a){var b,c;return a.isSeriesBoosting?(b=!!a.options.stacking,c=a.xData||a.options.xData||a.processedXData,b=(b?a.data:c||a.options.data).length,"treemap"===a.type?b*=12:"heatmap"===a.type?b*=6:fa[a.type]&&(b*=2),b):0}function d(){e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}function f(a,b){function c(a){a&&(b.colorData.push(a[0]),b.colorData.push(a[1]),b.colorData.push(a[2]),b.colorData.push(a[3]))}
+function e(a,b,e,d,w){c(w);q.usePreallocated?A.push(a,b,e?1:0,d||1):(B.push(a),B.push(b),B.push(e?1:0),B.push(d||1))}function d(){b.segments.length&&(b.segments[b.segments.length-1].to=B.length)}function w(){b.segments.length&&b.segments[b.segments.length-1].from===B.length||(d(),b.segments.push({from:B.length}))}function g(a,b,d,w,g){c(g);e(a+d,b);c(g);e(a,b);c(g);e(a,b+w);c(g);e(a,b+w);c(g);e(a+d,b+w);c(g);e(a+d,b)}function ha(a,c){q.useGPUTranslations||(b.skipTranslation=!0,a.x=y.toPixels(a.x,
+!0),a.y=z.toPixels(a.y,!0));c?B=[a.x,a.y,0,2].concat(B):e(a.x,a.y,0,2)}var f=a.pointArrayMap&&"low,high"===a.pointArrayMap.join(","),h=a.chart,O=a.options,m=!!O.stacking,k=O.data,S=a.xAxis.getExtremes(),N=S.min,S=S.max,p=a.yAxis.getExtremes(),u=p.min,p=p.max,n=a.xData||O.xData||a.processedXData,F=a.yData||O.yData||a.processedYData,v=a.zData||O.zData||a.processedZData,z=a.yAxis,y=a.xAxis,E=a.chart.plotHeight,I=a.chart.plotWidth,G=!n||0===n.length,H=O.connectNulls,r=a.points||!1,Q=!1,J=!1,x,T,U,k=m?
+a.data:n||k,n={x:Number.MAX_VALUE,y:0},K={x:-Number.MAX_VALUE,y:0},L=0,M=!1,t,ca,D=-1,Z=!1,aa=!1,ba,W="undefined"===typeof h.index,X=!1,da=!1,V=fa[a.type],ea=!1,P=!0,ga=!0,R=O.threshold;if(!(O.boostData&&0<O.boostData.length)){h.inverted&&(E=a.chart.plotWidth,I=a.chart.plotHeight);a.closestPointRangePx=Number.MAX_VALUE;w();if(r&&0<r.length)b.skipTranslation=!0,b.drawMode="triangles",r[0].node&&r[0].node.levelDynamic&&r.sort(function(a,b){if(a.node){if(a.node.levelDynamic>b.node.levelDynamic)return 1;
+if(a.node.levelDynamic<b.node.levelDynamic)return-1}return 0}),r.forEach(function(b){var c=b.plotY,e;"undefined"===typeof c||isNaN(c)||null===b.y||(c=b.shapeArgs,e=h.styledMode?b.series.colorAttribs(b):e=b.series.pointAttribs(b),b=e["stroke-width"]||0,T=l.color(e.fill).rgba,T[0]/=255,T[1]/=255,T[2]/=255,"treemap"===a.type&&(b=b||1,U=l.color(e.stroke).rgba,U[0]/=255,U[1]/=255,U[2]/=255,g(c.x,c.y,c.width,c.height,U),b/=2),"heatmap"===a.type&&h.inverted&&(c.x=y.len-c.x,c.y=z.len-c.y,c.width=-c.width,
+c.height=-c.height),g(c.x+b,c.y+b,c.width-2*b,c.height-2*b,T))});else{for(;D<k.length-1;){x=k[++D];if(W)break;G?(r=x[0],t=x[1],k[D+1]&&(aa=k[D+1][0]),k[D-1]&&(Z=k[D-1][0]),3<=x.length&&(ca=x[2],x[2]>b.zMax&&(b.zMax=x[2]),x[2]<b.zMin&&(b.zMin=x[2]))):(r=x,t=F[D],k[D+1]&&(aa=k[D+1]),k[D-1]&&(Z=k[D-1]),v&&v.length&&(ca=v[D],v[D]>b.zMax&&(b.zMax=v[D]),v[D]<b.zMin&&(b.zMin=v[D])));if(H||null!==r&&null!==t){if(aa&&aa>=N&&aa<=S&&(X=!0),Z&&Z>=N&&Z<=S&&(da=!0),f?(G&&(t=x.slice(1,3)),ba=t[0],t=t[1]):m&&(r=
+x.x,t=x.stackY,ba=t-x.y),null!==u&&"undefined"!==typeof u&&null!==p&&"undefined"!==typeof p&&(P=t>=u&&t<=p),r>S&&K.x<S&&(K.x=r,K.y=t),r<N&&n.x>N&&(n.x=r,n.y=t),null!==t||!H)if(null!==t&&(P||X||da)){if(r>=N&&r<=S&&(ea=!0),ea||X||da){if(!q.useGPUTranslations&&(b.skipTranslation=!0,r=y.toPixels(r,!0),t=z.toPixels(t,!0),t>E&&(t=E),r>I&&"points"===b.drawMode))continue;if(V){x=ba;if(!1===ba||"undefined"===typeof ba)x=0>t?t:0;f||m||(x=Math.max(R,u));q.useGPUTranslations||(x=z.toPixels(x,!0));e(r,x,0,0,!1)}b.hasMarkers&&
+ea&&!1!==Q&&(a.closestPointRangePx=Math.min(a.closestPointRangePx,Math.abs(r-Q)));!q.useGPUTranslations&&!q.usePreallocated&&Q&&1>Math.abs(r-Q)&&J&&1>Math.abs(t-J)?q.debug.showSkipSummary&&++L:(O.step&&!ga&&e(r,J,0,2,!1),e(r,t,0,"bubble"===a.type?ca||1:2,!1),Q=r,J=t,M=!0,ga=!1)}}else w()}else w()}q.debug.showSkipSummary&&console.log("skipped points:",L);M||!1===H||"line_strip"!==a.drawMode||(n.x<Number.MAX_VALUE&&ha(n,!0),K.x>-Number.MAX_VALUE&&ha(K))}d()}}function b(){u=[];y.data=B=[];z=[];A&&A.destroy()}
+function k(a){g&&(g.setUniform("xAxisTrans",a.transA),g.setUniform("xAxisMin",a.min),g.setUniform("xAxisMinPad",a.minPixelPadding),g.setUniform("xAxisPointRange",a.pointRange),g.setUniform("xAxisLen",a.len),g.setUniform("xAxisPos",a.pos),g.setUniform("xAxisCVSCoord",!a.horiz))}function h(a){g&&(g.setUniform("yAxisTrans",a.transA),g.setUniform("yAxisMin",a.min),g.setUniform("yAxisMinPad",a.minPixelPadding),g.setUniform("yAxisPointRange",a.pointRange),g.setUniform("yAxisLen",a.len),g.setUniform("yAxisPos",
+a.pos),g.setUniform("yAxisCVSCoord",!a.horiz))}function m(a,b){g.setUniform("hasThreshold",a);g.setUniform("translatedThreshold",b)}function p(c){if(c)v=c.chartWidth||800,F=c.chartHeight||400;else return!1;if(!(e&&v&&F&&g))return!1;q.debug.timeRendering&&console.time("gl rendering");e.canvas.width=v;e.canvas.height=F;g.bind();e.viewport(0,0,v,F);g.setPMatrix([2/v,0,0,0,0,-(2/F),0,0,0,0,-2,0,-1,1,-1,1]);g.setPlotHeight(c.plotHeight);1<q.lineWidth&&!l.isMS&&e.lineWidth(q.lineWidth);A.build(y.data,"aVertexPosition",
+4);A.bind();g.setInverted(c.inverted);u.forEach(function(a,b){var d=a.series.options,f=d.marker,C;C="undefined"!==typeof d.lineWidth?d.lineWidth:1;var w=d.threshold,n=J(w),N=a.series.yAxis.getThreshold(w),w=G(d.marker?d.marker.enabled:null,a.series.xAxis.isRadial?!0:null,a.series.closestPointRangePx>2*((d.marker?d.marker.radius:10)||10)),f=E[f&&f.symbol||a.series.symbol]||E.circle;if(!(0===a.segments.length||a.segmentslength&&a.segments[0].from===a.segments[0].to)){f.isReady&&(e.bindTexture(e.TEXTURE_2D,
+f.handle),g.setTexture(f.handle));c.styledMode?f=a.series.markerGroup&&a.series.markerGroup.getStyle("fill"):(f=a.series.pointAttribs&&a.series.pointAttribs().fill||a.series.color,d.colorByPoint&&(f=a.series.chart.options.colors[b]));a.series.fillOpacity&&d.fillOpacity&&(f=(new ia(f)).setOpacity(G(d.fillOpacity,1)).get());f=l.color(f).rgba;q.useAlpha||(f[3]=1);"lines"===a.drawMode&&q.useAlpha&&1>f[3]&&(f[3]/=10);"add"===d.boostBlending?(e.blendFunc(e.SRC_ALPHA,e.ONE),e.blendEquation(e.FUNC_ADD)):
+"mult"===d.boostBlending?e.blendFunc(e.DST_COLOR,e.ZERO):"darken"===d.boostBlending?(e.blendFunc(e.ONE,e.ONE),e.blendEquation(e.FUNC_MIN)):e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA);g.reset();0<a.colorData.length&&(g.setUniform("hasColor",1),b=R(e,g),b.build(a.colorData,"aColor",4),b.bind());g.setColor(f);k(a.series.xAxis);h(a.series.yAxis);m(n,N);"points"===a.drawMode&&(d.marker&&d.marker.radius?g.setPointSize(2*d.marker.radius):g.setPointSize(1));g.setSkipTranslation(a.skipTranslation);
+"bubble"===a.series.type&&g.setBubbleUniforms(a.series,a.zMin,a.zMax);g.setDrawAsCircle(H[a.series.type]||!1);if(0<C||"line_strip"!==a.drawMode)for(C=0;C<a.segments.length;C++)A.render(a.segments[C].from,a.segments[C].to,a.drawMode);if(a.hasMarkers&&w)for(d.marker&&d.marker.radius?g.setPointSize(2*d.marker.radius):g.setPointSize(10),g.setDrawAsCircle(!0),C=0;C<a.segments.length;C++)A.render(a.segments[C].from,a.segments[C].to,"POINTS")}});q.debug.timeRendering&&console.timeEnd("gl rendering");a&&
+a();b()}function n(a){d();if(a.renderer.forExport)return p(a);I?p(a):setTimeout(function(){n(a)},1)}var g=!1,A=!1,e=!1,v=0,F=0,B=!1,z=!1,y={},I=!1,u=[],E={},fa={column:!0,columnrange:!0,bar:!0,area:!0,arearange:!0},H={scatter:!0,bubble:!0},q={pointSize:1,lineWidth:1,fillColor:"#AA00AA",useAlpha:!0,usePreallocated:!1,useGPUTranslations:!1,debug:{timeRendering:!1,timeSeriesProcessing:!1,timeSetup:!1,timeBufferCopy:!1,timeKDTree:!1,showSkipSummary:!1}};return y={allocateBufferForSingleSeries:function(a){var b=
+0;q.usePreallocated&&(a.isSeriesBoosting&&(b=c(a)),A.allocate(b))},pushSeries:function(a){0<u.length&&u[u.length-1].hasMarkers&&(u[u.length-1].markerTo=z.length);q.debug.timeSeriesProcessing&&console.time("building "+a.type+" series");u.push({segments:[],markerFrom:z.length,colorData:[],series:a,zMin:Number.MAX_VALUE,zMax:-Number.MAX_VALUE,hasMarkers:a.options.marker?!1!==a.options.marker.enabled:!1,showMarkers:!0,drawMode:{area:"lines",arearange:"lines",areaspline:"line_strip",column:"lines",columnrange:"lines",
+bar:"lines",line:"line_strip",scatter:"points",heatmap:"triangles",treemap:"triangles",bubble:"points"}[a.type]||"line_strip"});f(a,u[u.length-1]);q.debug.timeSeriesProcessing&&console.timeEnd("building "+a.type+" series")},setSize:function(a,b){v===a&&b===b||!g||(v=a,F=b,g.bind(),g.setPMatrix([2/v,0,0,0,0,-(2/F),0,0,0,0,-2,0,-1,1,-1,1]))},inited:function(){return I},setThreshold:m,init:function(a,c){function d(a,b){var c={isReady:!1,texture:K.createElement("canvas"),handle:e.createTexture()},d=c.texture.getContext("2d");
+E[a]=c;c.texture.width=512;c.texture.height=512;d.mozImageSmoothingEnabled=!1;d.webkitImageSmoothingEnabled=!1;d.msImageSmoothingEnabled=!1;d.imageSmoothingEnabled=!1;d.strokeStyle="rgba(255, 255, 255, 0)";d.fillStyle="#FFF";b(d);try{e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,c.handle),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,c.texture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,
+e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.bindTexture(e.TEXTURE_2D,null),c.isReady=!0}catch(xa){}}var f=0,h=["webgl","experimental-webgl","moz-webgl","webkit-3d"];I=!1;if(!a)return!1;for(q.debug.timeSetup&&console.time("gl setup");f<h.length&&!(e=a.getContext(h[f],{}));f++);if(e)c||b();else return!1;e.enable(e.BLEND);e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA);e.disable(e.DEPTH_TEST);e.depthFunc(e.LESS);g=pa(e);if(!g)return!1;A=R(e,g);d("circle",
+function(a){a.beginPath();a.arc(256,256,256,0,2*Math.PI);a.stroke();a.fill()});d("square",function(a){a.fillRect(0,0,512,512)});d("diamond",function(a){a.beginPath();a.moveTo(256,0);a.lineTo(512,256);a.lineTo(256,512);a.lineTo(0,256);a.lineTo(256,0);a.fill()});d("triangle",function(a){a.beginPath();a.moveTo(0,512);a.lineTo(256,0);a.lineTo(512,512);a.lineTo(0,512);a.fill()});d("triangle-down",function(a){a.beginPath();a.moveTo(0,0);a.lineTo(256,512);a.lineTo(512,0);a.lineTo(0,0);a.fill()});I=!0;q.debug.timeSetup&&
+console.timeEnd("gl setup");return!0},render:n,settings:q,valid:function(){return!1!==e},clear:d,flush:b,setXAxis:k,setYAxis:h,data:B,gl:function(){return e},allocateBuffer:function(a){var b=0;q.usePreallocated&&(a.series.forEach(function(a){a.isSeriesBoosting&&(b+=c(a))}),A.allocate(b))},destroy:function(){b();A.destroy();g.destroy();e&&(ra(E,function(a){E[a].handle&&e.deleteTexture(E[a].handle)}),e.canvas.width=1,e.canvas.height=1)},setOptions:function(a){sa(!0,q,a)}}}function ja(a,c){var d=a.chartWidth,
+f=a.chartHeight,b=a,k=a.seriesGroup||c.group,h=K.implementation.hasFeature("www.http://w3.org/TR/SVG11/feature#Extensibility","1.1"),b=a.isChartSeriesBoosting()?a:c,h=!1;b.renderTarget||(b.canvas=ta,a.renderer.forExport||!h?(b.renderTarget=a.renderer.image("",0,0,d,f).addClass("highcharts-boost-canvas").add(k),b.boostClear=function(){b.renderTarget.attr({href:""})},b.boostCopy=function(){b.boostResizeTarget();b.renderTarget.attr({href:b.canvas.toDataURL("image/png")})}):(b.renderTargetFo=a.renderer.createElement("foreignObject").add(k),
+b.renderTarget=K.createElement("canvas"),b.renderTargetCtx=b.renderTarget.getContext("2d"),b.renderTargetFo.element.appendChild(b.renderTarget),b.boostClear=function(){b.renderTarget.width=b.canvas.width;b.renderTarget.height=b.canvas.height},b.boostCopy=function(){b.renderTarget.width=b.canvas.width;b.renderTarget.height=b.canvas.height;b.renderTargetCtx.drawImage(b.canvas,0,0)}),b.boostResizeTarget=function(){d=a.chartWidth;f=a.chartHeight;(b.renderTargetFo||b.renderTarget).attr({x:0,y:0,width:d,
+height:f}).css({pointerEvents:"none",mixedBlendMode:"normal",opacity:1});b instanceof l.Chart&&b.markerGroup.translate(a.plotLeft,a.plotTop)},b.boostClipRect=a.renderer.clipRect(),(b.renderTargetFo||b.renderTarget).clip(b.boostClipRect),b instanceof l.Chart&&(b.markerGroup=b.renderer.g().add(k),b.markerGroup.translate(c.xAxis.pos,c.yAxis.pos)));b.canvas.width=d;b.canvas.height=f;b.boostClipRect.attr(a.getBoostClipRect(b));b.boostResizeTarget();b.boostClear();b.ogl||(b.ogl=qa(function(){b.ogl.settings.debug.timeBufferCopy&&
+console.time("buffer copy");b.boostCopy();b.ogl.settings.debug.timeBufferCopy&&console.timeEnd("buffer copy")}),b.ogl.init(b.canvas)||l.error("[highcharts boost] - unable to init WebGL renderer"),b.ogl.setOptions(a.options.boost||{}),b instanceof l.Chart&&b.ogl.allocateBuffer(a));b.ogl.setSize(d,f);return b.ogl}function ka(a,c,d){a&&c.renderTarget&&c.canvas&&!(d||c.chart).isChartSeriesBoosting()&&a.render(d||c.chart)}function la(a,c){a&&c.renderTarget&&c.canvas&&!c.chart.isChartSeriesBoosting()&&
+a.allocateBufferForSingleSeries(c)}function ua(a){var c=!0;this.chart.options&&this.chart.options.boost&&(c="undefined"===typeof this.chart.options.boost.enabled?!0:this.chart.options.boost.enabled);if(!c||!this.isSeriesBoosting)return a.call(this);this.chart.isBoosting=!0;if(a=ja(this.chart,this))la(a,this),a.pushSeries(this);ka(a,this)}var L=l.win,K=L.document,va=function(){},ma=l.Chart,ia=l.Color,p=l.Series,k=l.seriesTypes,ra=l.objectEach,na=l.extend,M=l.addEvent,wa=l.fireEvent,J=l.isNumber,sa=
+l.merge,G=l.pick,y=l.wrap,W=l.getOptions().plotOptions,ta=K.createElement("canvas"),X,oa="area arearange column columnrange bar line scatter heatmap bubble treemap".split(" "),H={};oa.forEach(function(a){H[a]=1});ia.prototype.names={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",
+chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",
+dimgray:"#696969",dodgerblue:"#1e90ff",feldspar:"#d19275",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",
+lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslateblue:"#8470ff",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",
+mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",
+purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",violetred:"#d02090",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",
+yellowgreen:"#9acd32"};ma.prototype.isChartSeriesBoosting=function(){return G(this.options.boost&&this.options.boost.seriesThreshold,50)<=this.series.length||V(this)};ma.prototype.getBoostClipRect=function(a){var c={x:this.plotLeft,y:this.plotTop,width:this.plotWidth,height:this.plotHeight};a===this&&this.yAxis.forEach(function(a){c.y=Math.min(a.pos,c.y);c.height=Math.max(a.pos-this.plotTop+a.len,c.height)},this);return c};l.eachAsync=function(a,c,d,f,b,k){b=b||0;f=f||3E4;for(var h=b+f,m=!0;m&&b<
+h&&b<a.length;)m=c(a[b],b),++b;m&&(b<a.length?k?l.eachAsync(a,c,d,f,b,k):L.requestAnimationFrame?L.requestAnimationFrame(function(){l.eachAsync(a,c,d,f,b)}):setTimeout(function(){l.eachAsync(a,c,d,f,b)}):d&&d())};p.prototype.getPoint=function(a){var c=a,d=this.xData||this.options.xData||this.processedXData||!1;!a||a instanceof this.pointClass||(c=(new this.pointClass).init(this,this.options.data[a.i],d?d[a.i]:void 0),c.category=c.x,c.dist=a.dist,c.distX=a.distX,c.plotX=a.plotX,c.plotY=a.plotY,c.index=
+a.i);return c};y(p.prototype,"searchPoint",function(a){return this.getPoint(a.apply(this,[].slice.call(arguments,1)))});M(p,"destroy",function(){var a=this,c=a.chart;c.markerGroup===a.markerGroup&&(a.markerGroup=null);c.hoverPoints&&(c.hoverPoints=c.hoverPoints.filter(function(c){return c.series===a}));c.hoverPoint&&c.hoverPoint.series===a&&(c.hoverPoint=null)});y(p.prototype,"getExtremes",function(a){if(!this.isSeriesBoosting||!this.hasExtremes||!this.hasExtremes())return a.apply(this,Array.prototype.slice.call(arguments,
+1))});oa.forEach(function(a){W[a]&&(W[a].boostThreshold=5E3,W[a].boostData=[],k[a].prototype.fillOpacity=!0)});["translate","generatePoints","drawTracker","drawPoints","render"].forEach(function(a){function c(c){var d=this.options.stacking&&("translate"===a||"generatePoints"===a);if(!this.isSeriesBoosting||d||!P(this.chart)||"heatmap"===this.type||"treemap"===this.type||!H[this.type]||0===this.options.boostThreshold)c.call(this);else if(this[a+"Canvas"])this[a+"Canvas"]()}y(p.prototype,a,c);"translate"===
+a&&"column bar arearange columnrange heatmap treemap".split(" ").forEach(function(d){k[d]&&y(k[d].prototype,a,c)})});y(p.prototype,"processData",function(a){function c(a){return d.chart.isChartSeriesBoosting()||(a?a.length:0)>=(d.options.boostThreshold||Number.MAX_VALUE)}var d=this,f=this.options.data;P(this.chart)&&H[this.type]?(c(f)&&"heatmap"!==this.type&&"treemap"!==this.type&&!this.options.stacking&&this.hasExtremes&&this.hasExtremes(!0)||(a.apply(this,Array.prototype.slice.call(arguments,1)),
+f=this.processedXData),(this.isSeriesBoosting=c(f))?this.enterBoost():this.exitBoost&&this.exitBoost()):a.apply(this,Array.prototype.slice.call(arguments,1))});M(p,"hide",function(){this.canvas&&this.renderTarget&&(this.ogl&&this.ogl.clear(),this.boostClear())});p.prototype.enterBoost=function(){this.alteredByBoost=[];["allowDG","directTouch","stickyTracking"].forEach(function(a){this.alteredByBoost.push({prop:a,val:this[a],own:this.hasOwnProperty(a)})},this);this.directTouch=this.allowDG=!1;this.stickyTracking=
+!0;this.animate=null;this.labelBySeries&&(this.labelBySeries=this.labelBySeries.destroy())};p.prototype.exitBoost=function(){(this.alteredByBoost||[]).forEach(function(a){a.own?this[a.prop]=a.val:delete this[a.prop]},this);this.boostClear&&this.boostClear()};p.prototype.hasExtremes=function(a){var c=this.options,d=this.xAxis&&this.xAxis.options,f=this.yAxis&&this.yAxis.options;return c.data.length>(c.boostThreshold||Number.MAX_VALUE)&&J(f.min)&&J(f.max)&&(!a||J(d.min)&&J(d.max))};p.prototype.destroyGraphics=
+function(){var a=this,c=this.points,d,f;if(c)for(f=0;f<c.length;f+=1)(d=c[f])&&d.destroyElements&&d.destroyElements();["graph","area","tracker"].forEach(function(b){a[b]&&(a[b]=a[b].destroy())})};l.hasWebGLSupport=function(){var a=0,c,d=["webgl","experimental-webgl","moz-webgl","webkit-3d"],f=!1;if("undefined"!==typeof L.WebGLRenderingContext)for(c=K.createElement("canvas");a<d.length;a++)try{if(f=c.getContext(d[a]),"undefined"!==typeof f&&null!==f)return!0}catch(b){}return!1};l.hasWebGLSupport()?
+(l.extend(p.prototype,{renderCanvas:function(){function a(a,b){var c,d,f=!1,g="undefined"===typeof k.index,l=!0;if(!g&&(J?(c=a[0],d=a[1]):(c=a,d=n[b]),G?(J&&(d=a.slice(1,3)),f=d[0],d=d[1]):H&&(c=a.x,d=a.stackY,f=d-a.y),w||(l=d>=v&&d<=z),null!==d&&c>=A&&c<=e&&l))if(a=h.toPixels(c,!0),K){if(void 0===Y||a===y){G||(f=d);if(void 0===C||d>M)M=d,C=b;if(void 0===Y||f<L)L=f,Y=b}a!==y&&(void 0!==Y&&(d=m.toPixels(M,!0),E=m.toPixels(L,!0),R(a,d,C),E!==d&&R(a,E,Y)),Y=C=void 0,y=a)}else d=Math.ceil(m.toPixels(d,
+!0)),R(a,d,b);return!g}function c(){wa(d,"renderedCanvas");delete d.buildKDTree;d.buildKDTree();P.debug.timeKDTree&&console.timeEnd("kd tree building")}var d=this,f=d.options||{},b=!1,k=d.chart,h=this.xAxis,m=this.yAxis,p=f.xData||d.processedXData,n=f.yData||d.processedYData,g=f.data,b=h.getExtremes(),A=b.min,e=b.max,b=m.getExtremes(),v=b.min,z=b.max,B={},y,K=!!d.sampling,I,u=!1!==f.enableMouseTracking,E=m.getThreshold(f.threshold),G=d.pointArrayMap&&"low,high"===d.pointArrayMap.join(","),H=!!f.stacking,
+q=d.cropStart||0,w=d.requireSorting,J=!p,L,M,Y,C,P,W="x"===f.findNearestPointBy,V=this.xData||this.options.xData||this.processedXData||!1,R=function(a,b,c){a=Math.ceil(a);X=W?a:a+","+b;u&&!B[X]&&(B[X]=!0,k.inverted&&(a=h.len-a,b=m.len-b),I.push({x:V?V[q+c]:!1,clientX:a,plotX:a,plotY:b,i:q+c}))},b=ja(k,d);k.isBoosting=!0;P=b.settings;if(this.visible){if(this.points||this.graph)this.animate=null,this.destroyGraphics();k.isChartSeriesBoosting()?(this.markerGroup=k.markerGroup,this.renderTarget&&(this.renderTarget=
+this.renderTarget.destroy())):this.markerGroup=d.plotGroup("markerGroup","markers",!0,1,k.seriesGroup);I=this.points=[];d.buildKDTree=va;b&&(la(b,this),b.pushSeries(d),ka(b,this,k));k.renderer.forExport||(P.debug.timeKDTree&&console.time("kd tree building"),l.eachAsync(H?d.data:p||g,a,c))}}}),["heatmap","treemap"].forEach(function(a){k[a]&&y(k[a].prototype,"drawPoints",ua)}),k.bubble&&(delete k.bubble.prototype.buildKDTree,y(k.bubble.prototype,"markerAttribs",function(a){return this.isSeriesBoosting?
+!1:a.apply(this,[].slice.call(arguments,1))})),k.scatter.prototype.fill=!0,na(k.area.prototype,{fill:!0,fillOpacity:!0,sampling:!0}),na(k.column.prototype,{fill:!0,sampling:!0}),l.Chart.prototype.callbacks.push(function(a){M(a,"predraw",function(){a.boostForceChartBoost=void 0;a.boostForceChartBoost=V(a);a.isBoosting=!1;!a.isChartSeriesBoosting()&&a.didBoost&&(a.didBoost=!1);a.boostClear&&a.boostClear();a.canvas&&a.ogl&&a.isChartSeriesBoosting()&&(a.didBoost=!0,a.ogl.allocateBuffer(a));a.markerGroup&&
+a.xAxis&&0<a.xAxis.length&&a.yAxis&&0<a.yAxis.length&&a.markerGroup.translate(a.xAxis[0].pos,a.yAxis[0].pos)});M(a,"render",function(){a.ogl&&a.isChartSeriesBoosting()&&a.ogl.render(a)})})):"undefined"!==typeof l.initCanvasBoost?l.initCanvasBoost():l.error(26)})(z)});
+//# sourceMappingURL=boost.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+ Data module
+
+ (c) 2012-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(q){"object"===typeof module&&module.exports?module.exports=q:"function"===typeof define&&define.amd?define(function(){return q}):q("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(q){(function(h){h.ajax=function(q){var n=h.merge(!0,{url:!1,type:"GET",dataType:"json",success:!1,error:!1,data:!1,headers:{}},q);q={json:"application/json",xml:"application/xml",text:"text/plain",octet:"application/octet-stream"};var p=new XMLHttpRequest;if(!n.url)return!1;p.open(n.type.toUpperCase(),
+n.url,!0);p.setRequestHeader("Content-Type",q[n.dataType]||q.text);h.objectEach(n.headers,function(h,n){p.setRequestHeader(n,h)});p.onreadystatechange=function(){var h;if(4===p.readyState){if(200===p.status){h=p.responseText;if("json"===n.dataType)try{h=JSON.parse(h)}catch(C){n.error&&n.error(p,C);return}return n.success&&n.success(h)}n.error&&n.error(p,p.responseText)}};try{n.data=JSON.stringify(n.data)}catch(D){}p.send(n.data||!0)}})(q);(function(h){var q=h.addEvent,n=h.Chart,p=h.win.document,D=
+h.objectEach,C=h.pick,E=h.isNumber,y=h.merge,G=h.splat,H=h.fireEvent,w,z=function(a,b,c){this.init(a,b,c)};h.extend(z.prototype,{init:function(a,b,c){var f=a.decimalPoint,e;b&&(this.chartOptions=b);c&&(this.chart=c);"."!==f&&","!==f&&(f=void 0);this.options=a;this.columns=a.columns||this.rowsToColumns(a.rows)||[];this.firstRowAsNames=C(a.firstRowAsNames,this.firstRowAsNames,!0);this.decimalRegex=f&&new RegExp("^(-?[0-9]+)"+f+"([0-9]+)$");this.rawColumns=[];this.columns.length&&(this.dataFound(),e=
+!0);e||(e=this.fetchLiveData());e||(e=!!this.parseCSV().length);e||(e=!!this.parseTable().length);e||(e=this.parseGoogleSpreadsheet());!e&&a.afterComplete&&a.afterComplete()},getColumnDistribution:function(){var a=this.chartOptions,b=this.options,c=[],f=function(a){return(h.seriesTypes[a||"line"].prototype.pointArrayMap||[0]).length},e=a&&a.chart&&a.chart.type,d=[],k=[],t=0,b=b&&b.seriesMapping||a&&a.series&&a.series.map(function(){return{x:0}})||[],g;(a&&a.series||[]).forEach(function(a){d.push(f(a.type||
+e))});b.forEach(function(a){c.push(a.x||0)});0===c.length&&c.push(0);b.forEach(function(b){var c=new w,A=d[t]||f(e),m=h.seriesTypes[((a&&a.series||[])[t]||{}).type||e||"line"].prototype.pointArrayMap||["y"];c.addColumnReader(b.x,"x");D(b,function(a,b){"x"!==b&&c.addColumnReader(a,b)});for(g=0;g<A;g++)c.hasReader(m[g])||c.addColumnReader(void 0,m[g]);k.push(c);t++});b=h.seriesTypes[e||"line"].prototype.pointArrayMap;void 0===b&&(b=["y"]);this.valueCount={global:f(e),xColumns:c,individual:d,seriesBuilders:k,
+globalPointArrayMap:b}},dataFound:function(){this.options.switchRowsAndColumns&&(this.columns=this.rowsToColumns(this.columns));this.getColumnDistribution();this.parseTypes();!1!==this.parsed()&&this.complete()},parseCSV:function(a){function b(a,b,c,d){function e(b){l=a[b];r=a[b-1];A=a[b+1]}function f(a){v.length<u+1&&v.push([a]);v[u][v[u].length-1]!==a&&v[u].push(a)}function g(){h>B||B>n?(++B,m=""):(!isNaN(parseFloat(m))&&isFinite(m)?(m=parseFloat(m),f("number")):isNaN(Date.parse(m))?f("string"):
+(m=m.replace(/\//g,"-"),f("date")),t.length<u+1&&t.push([]),c||(t[u][b]=m),m="",++u,++B)}var k=0,l="",r="",A="",m="",B=0,u=0;if(a.trim().length&&"#"!==a.trim()[0]){for(;k<a.length;k++){e(k);if("#"===l){g();return}if('"'===l)for(e(++k);k<a.length&&('"'!==l||'"'===r||'"'===A);){if('"'!==l||'"'===l&&'"'!==r)m+=l;e(++k)}else d&&d[l]?d[l](l,m)&&g():l===x?g():m+=l}g()}}function c(a){var b=0,c=0,f=!1;a.some(function(a,d){var e=!1,f,l,g="";if(13<d)return!0;for(var k=0;k<a.length;k++){d=a[k];f=a[k+1];l=a[k-
+1];if("#"===d)break;else if('"'===d)if(e){if('"'!==l&&'"'!==f){for(;" "===f&&k<a.length;)f=a[++k];"undefined"!==typeof u[f]&&u[f]++;e=!1}}else e=!0;else"undefined"!==typeof u[d]?(g=g.trim(),isNaN(Date.parse(g))?!isNaN(g)&&isFinite(g)||u[d]++:u[d]++,g=""):g+=d;","===d&&c++;"."===d&&b++}});f=u[";"]>u[","]?";":",";d.decimalPoint||(d.decimalPoint=b>c?".":",",e.decimalRegex=new RegExp("^(-?[0-9]+)"+d.decimalPoint+"([0-9]+)$"));return f}function f(a,b){var c,f,g=0,k=!1,m=[],t=[],l;if(!b||b>a.length)b=a.length;
+for(;g<b;g++)if("undefined"!==typeof a[g]&&a[g]&&a[g].length)for(c=a[g].trim().replace(/\//g," ").replace(/\-/g," ").replace(/\./g," ").split(" "),f=["","",""],l=0;l<c.length;l++)l<f.length&&(c[l]=parseInt(c[l],10),c[l]&&(t[l]=!t[l]||t[l]<c[l]?c[l]:t[l],"undefined"!==typeof m[l]?m[l]!==c[l]&&(m[l]=!1):m[l]=c[l],31<c[l]?f[l]=100>c[l]?"YY":"YYYY":12<c[l]&&31>=c[l]?(f[l]="dd",k=!0):f[l].length||(f[l]="mm")));if(k){for(l=0;l<m.length;l++)!1!==m[l]?12<t[l]&&"YY"!==f[l]&&"YYYY"!==f[l]&&(f[l]="YY"):12<t[l]&&
+"mm"===f[l]&&(f[l]="dd");3===f.length&&"dd"===f[1]&&"dd"===f[2]&&(f[2]="YY");a=f.join("/");return(d.dateFormats||e.dateFormats)[a]?a:(H("deduceDateFailed"),"YYYY/mm/dd")}return"YYYY/mm/dd"}var e=this,d=a||this.options,k=d.csv,t;a="undefined"!==typeof d.startRow&&d.startRow?d.startRow:0;var g=d.endRow||Number.MAX_VALUE,h="undefined"!==typeof d.startColumn&&d.startColumn?d.startColumn:0,n=d.endColumn||Number.MAX_VALUE,x,m=0,v=[],u={",":0,";":0,"\t":0};t=this.columns=[];k&&d.beforeParse&&(k=d.beforeParse.call(this,
+k));if(k){k=k.replace(/\r\n/g,"\n").replace(/\r/g,"\n").split(d.lineDelimiter||"\n");if(!a||0>a)a=0;if(!g||g>=k.length)g=k.length-1;d.itemDelimiter?x=d.itemDelimiter:(x=null,x=c(k));for(var F=0,m=a;m<=g;m++)"#"===k[m][0]?F++:b(k[m],m-a-F);d.columnTypes&&0!==d.columnTypes.length||!v.length||!v[0].length||"date"!==v[0][1]||d.dateFormat||(d.dateFormat=f(t[0]));this.dataFound()}return t},parseTable:function(){var a=this.options,b=a.table,c=this.columns,f=a.startRow||0,e=a.endRow||Number.MAX_VALUE,d=a.startColumn||
+0,k=a.endColumn||Number.MAX_VALUE;b&&("string"===typeof b&&(b=p.getElementById(b)),[].forEach.call(b.getElementsByTagName("tr"),function(a,b){b>=f&&b<=e&&[].forEach.call(a.children,function(a,e){("TD"===a.tagName||"TH"===a.tagName)&&e>=d&&e<=k&&(c[e-d]||(c[e-d]=[]),c[e-d][b-f]=a.innerHTML)})}),this.dataFound());return c},fetchLiveData:function(){function a(t){function g(g,k,x){function m(){e&&b.liveDataURL===g&&(b.liveDataTimeout=setTimeout(a,d))}if(!g||0!==g.indexOf("http"))return g&&c.error&&c.error("Invalid URL"),
+!1;t&&(clearTimeout(b.liveDataTimeout),b.liveDataURL=g);h.ajax({url:g,dataType:x||"json",success:function(a){b&&b.series&&k(a);m()},error:function(a,b){3>++f&&m();return c.error&&c.error(b,a)}});return!0}g(k.csvURL,function(a){b.update({data:{csv:a}})},"text")||g(k.rowsURL,function(a){b.update({data:{rows:a}})})||g(k.columnsURL,function(a){b.update({data:{columns:a}})})}var b=this.chart,c=this.options,f=0,e=c.enablePolling,d=1E3*(c.dataRefreshRate||2),k=y(c);if(!c||!c.csvURL&&!c.rowsURL&&!c.columnsURL)return!1;
+1E3>d&&(d=1E3);delete c.csvURL;delete c.rowsURL;delete c.columnsURL;a(!0);return c&&(c.csvURL||c.rowsURL||c.columnsURL)},parseGoogleSpreadsheet:function(){function a(b){var e=["https://spreadsheets.google.com/feeds/cells",f,d,"public/values?alt\x3djson"].join("/");h.ajax({url:e,dataType:"json",success:function(d){b(d);c.enablePolling&&setTimeout(function(){a(b)},c.dataRefreshRate)},error:function(a,b){return c.error&&c.error(b,a)}})}var b=this,c=this.options,f=c.googleSpreadsheetKey,e=this.chart,
+d=c.googleSpreadsheetWorksheet||1,k=c.startRow||0,t=c.endRow||Number.MAX_VALUE,g=c.startColumn||0,n=c.endColumn||Number.MAX_VALUE,q=1E3*(c.dataRefreshRate||2);4E3>q&&(q=4E3);f&&(delete c.googleSpreadsheetKey,a(function(a){var c=[];a=a.feed.entry;var d,f=(a||[]).length,h=0,q,p,r;if(!a||0===a.length)return!1;for(r=0;r<f;r++)d=a[r],h=Math.max(h,d.gs$cell.col);for(r=0;r<h;r++)r>=g&&r<=n&&(c[r-g]=[]);for(r=0;r<f;r++)d=a[r],h=d.gs$cell.row-1,q=d.gs$cell.col-1,q>=g&&q<=n&&h>=k&&h<=t&&(p=d.gs$cell||d.content,
+d=null,p.numericValue?d=0<=p.$t.indexOf("/")||0<=p.$t.indexOf("-")?p.$t:0<p.$t.indexOf("%")?100*parseFloat(p.numericValue):parseFloat(p.numericValue):p.$t&&p.$t.length&&(d=p.$t),c[q-g][h-k]=d);c.forEach(function(a){for(r=0;r<a.length;r++)void 0===a[r]&&(a[r]=null)});e&&e.series?e.update({data:{columns:c}}):(b.columns=c,b.dataFound())}));return!1},trim:function(a,b){"string"===typeof a&&(a=a.replace(/^\s+|\s+$/g,""),b&&/^[0-9\s]+$/.test(a)&&(a=a.replace(/\s/g,"")),this.decimalRegex&&(a=a.replace(this.decimalRegex,
+"$1.$2")));return a},parseTypes:function(){for(var a=this.columns,b=a.length;b--;)this.parseColumn(a[b],b)},parseColumn:function(a,b){var c=this.rawColumns,f=this.columns,e=a.length,d,k,h,g,p=this.firstRowAsNames,n=-1!==this.valueCount.xColumns.indexOf(b),q,m=[],v=this.chartOptions,u,w=(this.options.columnTypes||[])[b],v=n&&(v&&v.xAxis&&"category"===G(v.xAxis)[0].type||"string"===w);for(c[b]||(c[b]=[]);e--;)d=m[e]||a[e],h=this.trim(d),g=this.trim(d,!0),k=parseFloat(g),void 0===c[b][e]&&(c[b][e]=h),
+v||0===e&&p?a[e]=""+h:+g===k?(a[e]=k,31536E6<k&&"float"!==w?a.isDatetime=!0:a.isNumeric=!0,void 0!==a[e+1]&&(u=k>a[e+1])):(h&&h.length&&(q=this.parseDate(d)),n&&E(q)&&"float"!==w?(m[e]=d,a[e]=q,a.isDatetime=!0,void 0!==a[e+1]&&(d=q>a[e+1],d!==u&&void 0!==u&&(this.alternativeFormat?(this.dateFormat=this.alternativeFormat,e=a.length,this.alternativeFormat=this.dateFormats[this.dateFormat].alternative):a.unsorted=!0),u=d)):(a[e]=""===h?null:h,0!==e&&(a.isDatetime||a.isNumeric)&&(a.mixed=!0)));n&&a.mixed&&
+(f[b]=c[b]);if(n&&u&&this.options.sort)for(b=0;b<f.length;b++)f[b].reverse(),p&&f[b].unshift(f[b].pop())},dateFormats:{"YYYY/mm/dd":{regex:/^([0-9]{4})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{1,2})$/,parser:function(a){return Date.UTC(+a[1],a[2]-1,+a[3])}},"dd/mm/YYYY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{4})$/,parser:function(a){return Date.UTC(+a[3],a[2]-1,+a[1])},alternative:"mm/dd/YYYY"},"mm/dd/YYYY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{4})$/,parser:function(a){return Date.UTC(+a[3],
+a[1]-1,+a[2])}},"dd/mm/YY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{2})$/,parser:function(a){var b=+a[3],b=b>(new Date).getFullYear()-2E3?b+1900:b+2E3;return Date.UTC(b,a[2]-1,+a[1])},alternative:"mm/dd/YY"},"mm/dd/YY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{2})$/,parser:function(a){return Date.UTC(+a[3]+2E3,a[1]-1,+a[2])}}},parseDate:function(a){var b=this.options.parseDate,c,f,e=this.options.dateFormat||this.dateFormat,d;if(b)c=b(a);else if("string"===typeof a){if(e)(b=
+this.dateFormats[e])||(b=this.dateFormats["YYYY/mm/dd"]),(d=a.match(b.regex))&&(c=b.parser(d));else for(f in this.dateFormats)if(b=this.dateFormats[f],d=a.match(b.regex)){this.dateFormat=f;this.alternativeFormat=b.alternative;c=b.parser(d);break}d||(d=Date.parse(a),"object"===typeof d&&null!==d&&d.getTime?c=d.getTime()-6E4*d.getTimezoneOffset():E(d)&&(c=d-6E4*(new Date(d)).getTimezoneOffset()))}return c},rowsToColumns:function(a){var b,c,f,e,d;if(a)for(d=[],c=a.length,b=0;b<c;b++)for(e=a[b].length,
+f=0;f<e;f++)d[f]||(d[f]=[]),d[f][b]=a[b][f];return d},parsed:function(){if(this.options.parsed)return this.options.parsed.call(this,this.columns)},getFreeIndexes:function(a,b){var c,f=[],e=[],d;for(c=0;c<a;c+=1)f.push(!0);for(a=0;a<b.length;a+=1)for(d=b[a].getReferencedColumnIndexes(),c=0;c<d.length;c+=1)f[d[c]]=!1;for(c=0;c<f.length;c+=1)f[c]&&e.push(c);return e},complete:function(){var a=this.columns,b,c=this.options,f,e,d,k,h=[],g;if(c.complete||c.afterComplete){if(this.firstRowAsNames)for(d=0;d<
+a.length;d++)a[d].name=a[d].shift();f=[];e=this.getFreeIndexes(a.length,this.valueCount.seriesBuilders);for(d=0;d<this.valueCount.seriesBuilders.length;d++)g=this.valueCount.seriesBuilders[d],g.populateColumns(e)&&h.push(g);for(;0<e.length;){g=new w;g.addColumnReader(0,"x");d=e.indexOf(0);-1!==d&&e.splice(d,1);for(d=0;d<this.valueCount.global;d++)g.addColumnReader(void 0,this.valueCount.globalPointArrayMap[d]);g.populateColumns(e)&&h.push(g)}0<h.length&&0<h[0].readers.length&&(g=a[h[0].readers[0].columnIndex],
+void 0!==g&&(g.isDatetime?b="datetime":g.isNumeric||(b="category")));if("category"===b)for(d=0;d<h.length;d++)for(g=h[d],e=0;e<g.readers.length;e++)"x"===g.readers[e].configName&&(g.readers[e].configName="name");for(d=0;d<h.length;d++){g=h[d];e=[];for(k=0;k<a[0].length;k++)e[k]=g.read(a,k);f[d]={data:e};g.name&&(f[d].name=g.name);"category"===b&&(f[d].turboThreshold=0)}a={series:f};b&&(a.xAxis={type:b},"category"===b&&(a.xAxis.uniqueNames=!1));c.complete&&c.complete(a);c.afterComplete&&c.afterComplete(a)}},
+update:function(a,b){var c=this.chart;a&&(a.afterComplete=function(a){a.xAxis&&c.xAxis[0]&&a.xAxis.type===c.xAxis[0].options.type&&delete a.xAxis;c.update(a,b,!0)},y(!0,this.options,a),this.init(this.options))}});h.Data=z;h.data=function(a,b,c){return new z(a,b,c)};q(n,"init",function(a){var b=this,c=a.args[0],f=a.args[1];c&&c.data&&!b.hasDataDef&&(b.hasDataDef=!0,b.data=new z(h.extend(c.data,{afterComplete:function(a){var d,e;if(c.hasOwnProperty("series"))if("object"===typeof c.series)for(d=Math.max(c.series.length,
+a&&a.series?a.series.length:0);d--;)e=c.series[d]||{},c.series[d]=y(e,a&&a.series?a.series[d]:{});else delete c.series;c=y(a,c);b.init(c,f)}}),c,b),a.preventDefault())});w=function(){this.readers=[];this.pointIsArray=!0};w.prototype.populateColumns=function(a){var b=!0;this.readers.forEach(function(b){void 0===b.columnIndex&&(b.columnIndex=a.shift())});this.readers.forEach(function(a){void 0===a.columnIndex&&(b=!1)});return b};w.prototype.read=function(a,b){var c=this.pointIsArray,f=c?[]:{},e;this.readers.forEach(function(d){var e=
+a[d.columnIndex][b];c?f.push(e):0<d.configName.indexOf(".")?h.Point.prototype.setNestedProperty(f,e,d.configName):f[d.configName]=e});void 0===this.name&&2<=this.readers.length&&(e=this.getReferencedColumnIndexes(),2<=e.length&&(e.shift(),e.sort(function(a,b){return a-b}),this.name=a[e.shift()].name));return f};w.prototype.addColumnReader=function(a,b){this.readers.push({columnIndex:a,configName:b});"x"!==b&&"y"!==b&&void 0!==b&&(this.pointIsArray=!1)};w.prototype.getReferencedColumnIndexes=function(){var a,
+b=[],c;for(a=0;a<this.readers.length;a+=1)c=this.readers[a],void 0!==c.columnIndex&&b.push(c.columnIndex);return b};w.prototype.hasReader=function(a){var b,c;for(b=0;b<this.readers.length;b+=1)if(c=this.readers[b],c.configName===a)return!0}})(q)});
+//# sourceMappingURL=data.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+ Drag-panes module
+
+ (c) 2010-2018 Highsoft AS
+ Author: Kacper Madej
+
+ License: www.highcharts.com/license
+*/
+(function(g){"object"===typeof module&&module.exports?module.exports=g:"function"===typeof define&&define.amd?define(function(){return g}):g("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(g){(function(b){var g=b.hasTouch,x=b.merge,u=b.wrap,y=b.isNumber,e=b.addEvent,v=b.relativeLength,z=b.objectEach,m=b.Axis,w=b.Pointer;x(!0,m.prototype.defaultYAxisOptions,{minLength:"10%",maxLength:"100%",resize:{controlledAxis:{next:[],prev:[]},enabled:!1,cursor:"ns-resize",lineColor:"#cccccc",lineDashStyle:"Solid",
+lineWidth:4,x:0,y:0}});b.AxisResizer=function(a){this.init(a)};b.AxisResizer.prototype={init:function(a,c){this.axis=a;this.options=a.options.resize;this.render();c||this.addMouseEvents()},render:function(){var a=this.axis,c=a.chart,d=this.options,b=d.x,e=d.y,k=Math.min(Math.max(a.top+a.height+e,c.plotTop),c.plotTop+c.plotHeight),l={};c.styledMode||(l={cursor:d.cursor,stroke:d.lineColor,"stroke-width":d.lineWidth,dashstyle:d.lineDashStyle});this.lastPos=k-e;this.controlLine||(this.controlLine=c.renderer.path().addClass("highcharts-axis-resizer"));
+this.controlLine.add(a.axisGroup);d=c.styledMode?this.controlLine.strokeWidth():d.lineWidth;l.d=c.renderer.crispLine(["M",a.left+b,k,"L",a.left+a.width+b,k],d);this.controlLine.attr(l)},addMouseEvents:function(){var a=this,c=a.controlLine.element,d=a.axis.chart.container,b=[],t,k,l;a.mouseMoveHandler=t=function(c){a.onMouseMove(c)};a.mouseUpHandler=k=function(c){a.onMouseUp(c)};a.mouseDownHandler=l=function(c){a.onMouseDown(c)};b.push(e(d,"mousemove",t),e(d.ownerDocument,"mouseup",k),e(c,"mousedown",
+l));g&&b.push(e(d,"touchmove",t),e(d.ownerDocument,"touchend",k),e(c,"touchstart",l));a.eventsToUnbind=b},onMouseMove:function(a){a.touches&&0===a.touches[0].pageX||!this.grabbed||(this.hasDragged=!0,this.updateAxes(this.axis.chart.pointer.normalize(a).chartY-this.options.y))},onMouseUp:function(a){this.hasDragged&&this.updateAxes(this.axis.chart.pointer.normalize(a).chartY-this.options.y);this.grabbed=this.hasDragged=this.axis.chart.activeResizer=null},onMouseDown:function(){this.axis.chart.pointer.reset(!1,
+0);this.grabbed=this.axis.chart.activeResizer=!0},updateAxes:function(a){var c=this,d=c.axis.chart,b=c.options.controlledAxis,e=0===b.next.length?[d.yAxis.indexOf(c.axis)+1]:b.next,b=[c.axis].concat(b.prev),k=[],l=!1,g=d.plotTop,m=d.plotHeight,q=g+m,p;a=Math.max(Math.min(a,q),g);p=a-c.lastPos;1>p*p||([b,e].forEach(function(b,e){b.forEach(function(b,h){var f=(b=y(b)?d.yAxis[b]:e||h?d.get(b):b)&&b.options,n,r;f&&"navigator-y-axis"!==f.id&&(h=b.top,r=Math.round(v(f.minLength,m)),n=Math.round(v(f.maxLength,
+m)),e?(p=a-c.lastPos,f=Math.round(Math.min(Math.max(b.len-p,r),n)),h=b.top+p,h+f>q&&(n=q-f-h,a+=n,h+=n),h<g&&(h=g,h+f>q&&(f=m)),f===r&&(l=!0),k.push({axis:b,options:{top:Math.round(h),height:f}})):(f=Math.round(Math.min(Math.max(a-h,r),n)),f===n&&(l=!0),a=h+f,k.push({axis:b,options:{height:f}})))})}),l||(k.forEach(function(a){a.axis.update(a.options,!1)}),d.redraw(!1)))},destroy:function(){var a=this;delete a.axis.resizer;this.eventsToUnbind&&this.eventsToUnbind.forEach(function(a){a()});a.controlLine.destroy();
+z(a,function(b,d){a[d]=null})}};m.prototype.keepProps.push("resizer");e(m,"afterRender",function(){var a=this.resizer,c=this.options.resize;c&&(c=!1!==c.enabled,a?c?a.init(this,!0):a.destroy():c&&(this.resizer=new b.AxisResizer(this)))});e(m,"destroy",function(a){!a.keepEvents&&this.resizer&&this.resizer.destroy()});u(w.prototype,"runPointActions",function(a){this.chart.activeResizer||a.apply(this,Array.prototype.slice.call(arguments,1))});u(w.prototype,"drag",function(a){this.chart.activeResizer||
+a.apply(this,Array.prototype.slice.call(arguments,1))})})(g)});
+//# sourceMappingURL=drag-panes.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+ Highcharts Drilldown module
+
+ Author: Torstein Honsi
+ License: www.highcharts.com/license
+
+*/
+(function(n){"object"===typeof module&&module.exports?module.exports=n:"function"===typeof define&&define.amd?define(function(){return n}):n("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(n){(function(e){var n=e.animObject,w=e.noop,x=e.color,y=e.defaultOptions,r=e.extend,D=e.format,z=e.objectEach,t=e.pick,l=e.Chart,p=e.seriesTypes,A=p.pie,p=p.column,B=e.Tick,u=e.fireEvent,C=1;r(y.lang,{drillUpText:"\u25c1 Back to {series.name}"});y.drilldown={activeAxisLabelStyle:{cursor:"pointer",
+color:"#003399",fontWeight:"bold",textDecoration:"underline"},activeDataLabelStyle:{cursor:"pointer",color:"#003399",fontWeight:"bold",textDecoration:"underline"},animation:{duration:500},drillUpButton:{position:{align:"right",x:-10,y:10}}};e.SVGRenderer.prototype.Element.prototype.fadeIn=function(a){this.attr({opacity:.1,visibility:"inherit"}).animate({opacity:t(this.newOpacity,1)},a||{duration:250})};l.prototype.addSeriesAsDrilldown=function(a,b){this.addSingleSeriesAsDrilldown(a,b);this.applyDrilldown()};
+l.prototype.addSingleSeriesAsDrilldown=function(a,b){var c=a.series,d=c.xAxis,f=c.yAxis,h,g=[],m=[],k,q,l;l=this.styledMode?{colorIndex:t(a.colorIndex,c.colorIndex)}:{color:a.color||c.color};this.drilldownLevels||(this.drilldownLevels=[]);k=c.options._levelNumber||0;(q=this.drilldownLevels[this.drilldownLevels.length-1])&&q.levelNumber!==k&&(q=void 0);b=r(r({_ddSeriesId:C++},l),b);h=c.points.indexOf(a);c.chart.series.forEach(function(a){a.xAxis!==d||a.isDrilling||(a.options._ddSeriesId=a.options._ddSeriesId||
+C++,a.options._colorIndex=a.userOptions._colorIndex,a.options._levelNumber=a.options._levelNumber||k,q?(g=q.levelSeries,m=q.levelSeriesOptions):(g.push(a),m.push(a.options)))});a=r({levelNumber:k,seriesOptions:c.options,levelSeriesOptions:m,levelSeries:g,shapeArgs:a.shapeArgs,bBox:a.graphic?a.graphic.getBBox():{},color:a.isNull?(new e.Color(x)).setOpacity(0).get():x,lowerSeriesOptions:b,pointOptions:c.options.data[h],pointIndex:h,oldExtremes:{xMin:d&&d.userMin,xMax:d&&d.userMax,yMin:f&&f.userMin,
+yMax:f&&f.userMax},resetZoomButton:this.resetZoomButton},l);this.drilldownLevels.push(a);d&&d.names&&(d.names.length=0);b=a.lowerSeries=this.addSeries(b,!1);b.options._levelNumber=k+1;d&&(d.oldPos=d.pos,d.userMin=d.userMax=null,f.userMin=f.userMax=null);c.type===b.type&&(b.animate=b.animateDrilldown||w,b.options.animation=!0)};l.prototype.applyDrilldown=function(){var a=this.drilldownLevels,b;a&&0<a.length&&(b=a[a.length-1].levelNumber,this.drilldownLevels.forEach(function(a){a.levelNumber===b&&a.levelSeries.forEach(function(a){a.options&&
+a.options._levelNumber===b&&a.remove(!1)})}));this.resetZoomButton&&(this.resetZoomButton.hide(),delete this.resetZoomButton);this.pointer.reset();this.redraw();this.showDrillUpButton()};l.prototype.getDrilldownBackText=function(){var a=this.drilldownLevels;if(a&&0<a.length)return a=a[a.length-1],a.series=a.seriesOptions,D(this.options.lang.drillUpText,a)};l.prototype.showDrillUpButton=function(){var a=this,b=this.getDrilldownBackText(),c=a.options.drilldown.drillUpButton,d,f;this.drillUpButton?this.drillUpButton.attr({text:b}).align():
+(f=(d=c.theme)&&d.states,this.drillUpButton=this.renderer.button(b,null,null,function(){a.drillUp()},d,f&&f.hover,f&&f.select).addClass("highcharts-drillup-button").attr({align:c.position.align,zIndex:7}).add().align(c.position,!1,c.relativeTo||"plotBox"))};l.prototype.drillUp=function(){if(this.drilldownLevels&&0!==this.drilldownLevels.length){for(var a=this,b=a.drilldownLevels,c=b[b.length-1].levelNumber,d=b.length,f=a.series,h,g,e,k,q=function(b){var c;f.forEach(function(a){a.options._ddSeriesId===
+b._ddSeriesId&&(c=a)});c=c||a.addSeries(b,!1);c.type===e.type&&c.animateDrillupTo&&(c.animate=c.animateDrillupTo);b===g.seriesOptions&&(k=c)};d--;)if(g=b[d],g.levelNumber===c){b.pop();e=g.lowerSeries;if(!e.chart)for(h=f.length;h--;)if(f[h].options.id===g.lowerSeriesOptions.id&&f[h].options._levelNumber===c+1){e=f[h];break}e.xData=[];g.levelSeriesOptions.forEach(q);u(a,"drillup",{seriesOptions:g.seriesOptions});k.type===e.type&&(k.drilldownLevel=g,k.options.animation=a.options.drilldown.animation,
+e.animateDrillupFrom&&e.chart&&e.animateDrillupFrom(g));k.options._levelNumber=c;e.remove(!1);k.xAxis&&(h=g.oldExtremes,k.xAxis.setExtremes(h.xMin,h.xMax,!1),k.yAxis.setExtremes(h.yMin,h.yMax,!1));g.resetZoomButton&&(a.resetZoomButton=g.resetZoomButton,a.resetZoomButton.show())}u(a,"drillupall");this.redraw();0===this.drilldownLevels.length?this.drillUpButton=this.drillUpButton.destroy():this.drillUpButton.attr({text:this.getDrilldownBackText()}).align();this.ddDupes.length=[]}};l.prototype.callbacks.push(function(){var a=
+this;a.drilldown={update:function(b,c){e.merge(!0,a.options.drilldown,b);t(c,!0)&&a.redraw()}}});e.addEvent(l,"beforeShowResetZoom",function(){if(this.drillUpButton)return!1});e.addEvent(l,"render",function(){(this.xAxis||[]).forEach(function(a){a.ddPoints={};a.series.forEach(function(b){var c,d=b.xData||[],f=b.points,h;for(c=0;c<d.length;c++)h=b.options.data[c],"number"!==typeof h&&(h=b.pointClass.prototype.optionsToObject.call({series:b},h),h.drilldown&&(a.ddPoints[d[c]]||(a.ddPoints[d[c]]=[]),
+a.ddPoints[d[c]].push(f?f[c]:!0)))});z(a.ticks,B.prototype.drillable)})});p.prototype.animateDrillupTo=function(a){if(!a){var b=this,c=b.drilldownLevel;this.points.forEach(function(a){var b=a.dataLabel;a.graphic&&a.graphic.hide();b&&(b.hidden="hidden"===b.attr("visibility"),b.hidden||(b.hide(),a.connector&&a.connector.hide()))});e.syncTimeout(function(){b.points&&b.points.forEach(function(a,b){b=b===(c&&c.pointIndex)?"show":"fadeIn";var d="show"===b?!0:void 0,f=a.dataLabel;if(a.graphic)a.graphic[b](d);
+f&&!f.hidden&&(f.fadeIn(),a.connector&&a.connector.fadeIn())})},Math.max(this.chart.options.drilldown.animation.duration-50,0));this.animate=w}};p.prototype.animateDrilldown=function(a){var b=this,c=this.chart,d=c.drilldownLevels,f,e=n(c.options.drilldown.animation),g=this.xAxis,m=c.styledMode;a||(d.forEach(function(a){b.options._ddSeriesId===a.lowerSeriesOptions._ddSeriesId&&(f=a.shapeArgs,m||(f.fill=a.color))}),f.x+=t(g.oldPos,g.pos)-g.pos,this.points.forEach(function(a){var c=a.shapeArgs;m||(c.fill=
+a.color);a.graphic&&a.graphic.attr(f).animate(r(a.shapeArgs,{fill:a.color||b.color}),e);a.dataLabel&&a.dataLabel.fadeIn(e)}),this.animate=null)};p.prototype.animateDrillupFrom=function(a){var b=n(this.chart.options.drilldown.animation),c=this.group,d=c!==this.chart.columnGroup,f=this;f.trackerGroups.forEach(function(a){if(f[a])f[a].on("mouseover")});d&&delete this.group;this.points.forEach(function(h){var g=h.graphic,m=a.shapeArgs,k=function(){g.destroy();c&&d&&(c=c.destroy())};g&&(delete h.graphic,
+f.chart.styledMode||(m.fill=a.color),b.duration?g.animate(m,e.merge(b,{complete:k})):(g.attr(m),k()))})};A&&r(A.prototype,{animateDrillupTo:p.prototype.animateDrillupTo,animateDrillupFrom:p.prototype.animateDrillupFrom,animateDrilldown:function(a){var b=this.chart.drilldownLevels[this.chart.drilldownLevels.length-1],c=this.chart.options.drilldown.animation,d=b.shapeArgs,f=d.start,h=(d.end-f)/this.points.length,g=this.chart.styledMode;a||(this.points.forEach(function(a,k){var m=a.shapeArgs;g||(d.fill=
+b.color,m.fill=a.color);if(a.graphic)a.graphic.attr(e.merge(d,{start:f+k*h,end:f+(k+1)*h}))[c?"animate":"attr"](m,c)}),this.animate=null)}});e.Point.prototype.doDrilldown=function(a,b,c){var d=this.series.chart,f=d.options.drilldown,e=(f.series||[]).length,g;d.ddDupes||(d.ddDupes=[]);for(;e--&&!g;)f.series[e].id===this.drilldown&&-1===d.ddDupes.indexOf(this.drilldown)&&(g=f.series[e],d.ddDupes.push(this.drilldown));u(d,"drilldown",{point:this,seriesOptions:g,category:b,originalEvent:c,points:void 0!==
+b&&this.series.xAxis.getDDPoints(b).slice(0)},function(b){var c=b.point.series&&b.point.series.chart,d=b.seriesOptions;c&&d&&(a?c.addSingleSeriesAsDrilldown(b.point,d):c.addSeriesAsDrilldown(b.point,d))})};e.Axis.prototype.drilldownCategory=function(a,b){z(this.getDDPoints(a),function(c){c&&c.series&&c.series.visible&&c.doDrilldown&&c.doDrilldown(!0,a,b)});this.chart.applyDrilldown()};e.Axis.prototype.getDDPoints=function(a){return this.ddPoints&&this.ddPoints[a]};B.prototype.drillable=function(){var a=
+this.pos,b=this.label,c=this.axis,d="xAxis"===c.coll&&c.getDDPoints,f=d&&c.getDDPoints(a),h=c.chart.styledMode;d&&(b&&f&&f.length?(b.drillable=!0,b.basicStyles||h||(b.basicStyles=e.merge(b.styles)),b.addClass("highcharts-drilldown-axis-label").on("click",function(b){c.drilldownCategory(a,b)}),h||b.css(c.chart.options.drilldown.activeAxisLabelStyle)):b&&b.drillable&&(h||(b.styles={},b.css(b.basicStyles)),b.on("click",null),b.removeClass("highcharts-drilldown-axis-label")))};e.addEvent(e.Point,"afterInit",
+function(){var a=this,b=a.series;a.drilldown&&e.addEvent(a,"click",function(c){b.xAxis&&!1===b.chart.options.drilldown.allowPointDrilldown?b.xAxis.drilldownCategory(a.x,c):a.doDrilldown(void 0,void 0,c)});return a});e.addEvent(e.Series,"afterDrawDataLabels",function(){var a=this.chart.options.drilldown.activeDataLabelStyle,b=this.chart.renderer,c=this.chart.styledMode;this.points.forEach(function(d){var f=d.options.dataLabels,e=t(d.dlOptions,f&&f.style,{});d.drilldown&&d.dataLabel&&("contrast"!==
+a.color||c||(e.color=b.getContrast(d.color||this.color)),f&&f.color&&(e.color=f.color),d.dataLabel.addClass("highcharts-drilldown-data-label"),c||d.dataLabel.css(a).css(e))},this)});var v=function(a,b,c,d){a[c?"addClass":"removeClass"]("highcharts-drilldown-point");d||a.css({cursor:b})};e.addEvent(e.Series,"afterDrawTracker",function(){var a=this.chart.styledMode;this.points.forEach(function(b){b.drilldown&&b.graphic&&v(b.graphic,"pointer",!0,a)})});e.addEvent(e.Point,"afterSetState",function(){var a=
+this.series.chart.styledMode;this.drilldown&&this.series.halo&&"hover"===this.state?v(this.series.halo,"pointer",!0,a):this.series.halo&&v(this.series.halo,"auto",!1,a)})})(n)});
+//# sourceMappingURL=drilldown.js.map
+</script>
+<script>/*
+  Highcharts JS v7.0.1 (2018-12-19)
+
+ Item series type for Highcharts
+
+ (c) 2010-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(c){"object"===typeof module&&module.exports?module.exports=c:"function"===typeof define&&define.amd?define(function(){return c}):c("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(c){(function(f){var c=f.extend,u=f.pick,r=f.seriesType;r("item","column",{itemPadding:.2,marker:{symbol:"circle",states:{hover:{},select:{}}}},{drawPoints:function(){var b=this,v=b.chart.renderer,l=this.options.marker,m=this.yAxis.transA*b.options.itemPadding,n=this.borderWidth%2?.5:1;this.points.forEach(function(a){var d,
+e,g,h,k;d=a.marker||{};var w=d.symbol||l.symbol,r=u(d.radius,l.radius),p,t,x="rect"!==w,q;a.graphics=g=a.graphics||{};k=a.pointAttr?a.pointAttr[a.selected?"selected":""]||b.pointAttr[""]:b.pointAttribs(a,a.selected&&"select");delete k.r;b.chart.styledMode&&(delete k.stroke,delete k["stroke-width"]);if(null!==a.y)for(a.graphic||(a.graphic=v.g("point").add(b.group)),h=a.y,t=u(a.stackY,a.y),p=Math.min(a.pointWidth,b.yAxis.transA-m),d=t;d>t-a.y;d--)e=a.barX+(x?a.pointWidth/2-p/2:0),q=b.yAxis.toPixels(d,
+!0)+m/2,b.options.crisp&&(e=Math.round(e)-n,q=Math.round(q)+n),e={x:e,y:q,width:Math.round(x?p:a.pointWidth),height:Math.round(p),r:r},g[h]?g[h].animate(e):g[h]=v.symbol(w).attr(c(e,k)).add(a.graphic),g[h].isActive=!0,h--;f.objectEach(g,function(a,b){a.isActive?a.isActive=!1:(a.destroy(),delete a[b])})})}});f.SVGRenderer.prototype.symbols.rect=function(b,c,l,m,n){return f.SVGRenderer.prototype.symbols.callout(b,c,l,m,n)}})(c)});
+//# sourceMappingURL=item-series.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+ Client side exporting module
+
+ (c) 2015-2018 Torstein Honsi / Oystein Moseng
+
+ License: www.highcharts.com/license
+*/
+(function(h){"object"===typeof module&&module.exports?module.exports=h:"function"===typeof define&&define.amd?define(function(){return h}):h("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(h){(function(a){var b=a.win,h=b.navigator,n=b.document,d=b.URL||b.webkitURL||b,r=/Edge\/\d+/.test(h.userAgent);a.dataURLtoBlob=function(a){if((a=a.match(/data:([^;]*)(;base64)?,([0-9A-Za-z+/]+)/))&&3<a.length&&b.atob&&b.ArrayBuffer&&b.Uint8Array&&b.Blob&&d.createObjectURL){for(var g=b.atob(a[3]),e=
+new b.ArrayBuffer(g.length),e=new b.Uint8Array(e),h=0;h<e.length;++h)e[h]=g.charCodeAt(h);a=new b.Blob([e],{type:a[1]});return d.createObjectURL(a)}};a.downloadURL=function(g,d){var e=n.createElement("a"),x;if("string"===typeof g||g instanceof String||!h.msSaveOrOpenBlob){if(r||2E6<g.length)if(g=a.dataURLtoBlob(g),!g)throw"Failed to convert to blob";if(void 0!==e.download)e.href=g,e.download=d,n.body.appendChild(e),e.click(),n.body.removeChild(e);else try{if(x=b.open(g,"chart"),void 0===x||null===
+x)throw"Failed to open window";}catch(k){b.location.href=g}}else h.msSaveOrOpenBlob(g,d)}})(h);(function(a){function b(k,b){var f=g.getElementsByTagName("head")[0],c=g.createElement("script");c.type="text/javascript";c.src=k;c.onload=b;c.onerror=function(){a.error("Error loading script "+k)};f.appendChild(c)}var h=a.addEvent,n=a.merge,d=a.win,r=d.navigator,g=d.document,B=d.URL||d.webkitURL||d,e=/Edge\/|Trident\/|MSIE /.test(r.userAgent),x=e?150:0;a.CanVGRenderer={};a.svgToDataUrl=function(a){var k=
+-1<r.userAgent.indexOf("WebKit")&&0>r.userAgent.indexOf("Chrome");try{if(!k&&0>r.userAgent.toLowerCase().indexOf("firefox"))return B.createObjectURL(new d.Blob([a],{type:"image/svg+xml;charset-utf-16"}))}catch(f){}return"data:image/svg+xml;charset\x3dUTF-8,"+encodeURIComponent(a)};a.imageToDataUrl=function(a,b,f,c,h,e,q,t,p){var l=new d.Image,k,y=function(){setTimeout(function(){var d=g.createElement("canvas"),e=d.getContext&&d.getContext("2d"),z;try{if(e){d.height=l.height*c;d.width=l.width*c;e.drawImage(l,
+0,0,d.width,d.height);try{z=d.toDataURL(b),h(z,b,f,c)}catch(C){k(a,b,f,c)}}else q(a,b,f,c)}finally{p&&p(a,b,f,c)}},x)},u=function(){t(a,b,f,c);p&&p(a,b,f,c)};k=function(){l=new d.Image;k=e;l.crossOrigin="Anonymous";l.onload=y;l.onerror=u;l.src=a};l.onload=y;l.onerror=u;l.src=a};a.downloadSVGLocal=function(k,e,f,c){function h(a,c){c=new d.jsPDF("l","pt",[a.width.baseVal.value+2*c,a.height.baseVal.value+2*c]);[].forEach.call(a.querySelectorAll('*[visibility\x3d"hidden"]'),function(a){a.parentNode.removeChild(a)});
+d.svg2pdf(a,c,{removeInvalid:!0});return c.output("datauristring")}function u(){A.innerHTML=k;var b=A.getElementsByTagName("text"),d;[].forEach.call(b,function(a){["font-family","font-size"].forEach(function(c){for(var b=a;b&&b!==A;){if(b.style[c]){a.style[c]=b.style[c];break}b=b.parentNode}});a.style["font-family"]=a.style["font-family"]&&a.style["font-family"].split(" ").splice(-1);d=a.getElementsByTagName("title");[].forEach.call(d,function(c){a.removeChild(c)})});b=h(A.firstChild,0);try{a.downloadURL(b,
+v),c&&c()}catch(D){f(D)}}var q,t,p=!0,l,m=e.libURL||a.getOptions().exporting.libURL,A=g.createElement("div"),w=e.type||"image/png",v=(e.filename||"chart")+"."+("image/svg+xml"===w?"svg":w.split("/")[1]),n=e.scale||1,m="/"!==m.slice(-1)?m+"/":m;if("image/svg+xml"===w)try{r.msSaveOrOpenBlob?(t=new MSBlobBuilder,t.append(k),q=t.getBlob("image/svg+xml")):q=a.svgToDataUrl(k),a.downloadURL(q,v),c&&c()}catch(z){f(z)}else"application/pdf"===w?d.jsPDF&&d.svg2pdf?u():(p=!0,b(m+"jspdf.js",function(){b(m+"svg2pdf.js",
+function(){u()})})):(q=a.svgToDataUrl(k),l=function(){try{B.revokeObjectURL(q)}catch(z){}},a.imageToDataUrl(q,w,{},n,function(b){try{a.downloadURL(b,v),c&&c()}catch(C){f(C)}},function(){var e=g.createElement("canvas"),h=e.getContext("2d"),u=k.match(/^<svg[^>]*width\s*=\s*\"?(\d+)\"?[^>]*>/)[1]*n,y=k.match(/^<svg[^>]*height\s*=\s*\"?(\d+)\"?[^>]*>/)[1]*n,q=function(){h.drawSvg(k,0,0,u,y);try{a.downloadURL(r.msSaveOrOpenBlob?e.msToBlob():e.toDataURL(w),v),c&&c()}catch(E){f(E)}finally{l()}};e.width=
+u;e.height=y;d.canvg?q():(p=!0,b(m+"rgbcolor.js",function(){b(m+"canvg.js",function(){q()})}))},f,f,function(){p&&l()}))};a.Chart.prototype.getSVGForLocalExport=function(b,e,d,c){var f=this,g,k=0,t,p,l,m,n,r=function(a,b,d){++k;d.imageElement.setAttributeNS("http://www.w3.org/1999/xlink","href",a);k===g.length&&c(f.sanitizeSVG(t.innerHTML,p))};f.unbindGetSVG=h(f,"getSVG",function(a){p=a.chartCopy.options;t=a.chartCopy.container.cloneNode(!0)});f.getSVGForExport(b,e);g=t.getElementsByTagName("image");
+try{if(!g.length){c(f.sanitizeSVG(t.innerHTML,p));return}m=0;for(n=g.length;m<n;++m)l=g[m],a.imageToDataUrl(l.getAttributeNS("http://www.w3.org/1999/xlink","href"),"image/png",{imageElement:l},b.scale,r,d,d,d)}catch(v){d(v)}f.unbindGetSVG()};a.Chart.prototype.exportChartLocal=function(b,d){var f=this,c=a.merge(f.options.exporting,b),g=function(b){!1===c.fallbackToExportServer?c.error?c.error(c,b):a.error(28,!0):f.exportChart(c)};e&&f.styledMode&&(a.SVGRenderer.prototype.inlineWhitelist=[/^blockSize/,
+/^border/,/^caretColor/,/^color/,/^columnRule/,/^columnRuleColor/,/^cssFloat/,/^cursor/,/^fill$/,/^fillOpacity/,/^font/,/^inlineSize/,/^length/,/^lineHeight/,/^opacity/,/^outline/,/^parentRule/,/^rx$/,/^ry$/,/^stroke/,/^textAlign/,/^textAnchor/,/^textDecoration/,/^transform/,/^vectorEffect/,/^visibility/,/^x$/,/^y$/]);e&&("application/pdf"===c.type||f.container.getElementsByTagName("image").length&&"image/svg+xml"!==c.type)||"application/pdf"===c.type&&f.container.getElementsByTagName("image").length?
+g("Image type not supported for this chart/browser."):f.getSVGForLocalExport(c,d,g,function(b){-1<b.indexOf("\x3cforeignObject")&&"image/svg+xml"!==c.type?g("Image type not supported for charts with embedded HTML"):a.downloadSVGLocal(b,a.extend({filename:f.getFilename()},c),g)})};n(!0,a.getOptions().exporting,{libURL:"https://code.highcharts.com/7.0.1/lib/",menuItemDefinitions:{downloadPNG:{textKey:"downloadPNG",onclick:function(){this.exportChartLocal()}},downloadJPEG:{textKey:"downloadJPEG",onclick:function(){this.exportChartLocal({type:"image/jpeg"})}},
+downloadSVG:{textKey:"downloadSVG",onclick:function(){this.exportChartLocal({type:"image/svg+xml"})}},downloadPDF:{textKey:"downloadPDF",onclick:function(){this.exportChartLocal({type:"application/pdf"})}}}})})(h)});
+//# sourceMappingURL=offline-exporting.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+
+ (c) 2009-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(a){});
+//# sourceMappingURL=overlapping-datalabels.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+ Exporting module
+
+ (c) 2010-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(l){"object"===typeof module&&module.exports?module.exports=l:"function"===typeof define&&define.amd?define(function(){return l}):l("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(l){(function(g){var y=g.defaultOptions,z=g.doc,l=g.Chart,q=g.addEvent,I=g.removeEvent,C=g.fireEvent,t=g.createElement,D=g.discardElement,r=g.css,p=g.merge,u=g.pick,E=g.objectEach,x=g.extend,J=g.isTouchDevice,A=g.win,G=A.navigator.userAgent,F=g.SVGRenderer,H=g.Renderer.prototype.symbols,K=/Edge\/|Trident\/|MSIE /.test(G),
+L=/firefox/i.test(G);x(y.lang,{printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",contextButtonTitle:"Chart context menu"});y.navigation||(y.navigation={});p(!0,y.navigation,{buttonOptions:{theme:{},symbolSize:14,symbolX:12.5,symbolY:10.5,align:"right",buttonSpacing:3,height:22,verticalAlign:"top",width:24}});p(!0,y.navigation,{menuStyle:{border:"1px solid #999999",background:"#ffffff",
+padding:"5px 0"},menuItemStyle:{padding:"0.5em 1em",color:"#333333",background:"none",fontSize:J?"14px":"11px",transition:"background 250ms, color 250ms"},menuItemHoverStyle:{background:"#335cad",color:"#ffffff"},buttonOptions:{symbolFill:"#666666",symbolStroke:"#666666",symbolStrokeWidth:3,theme:{padding:5}}});y.exporting={type:"image/png",url:"https://export.highcharts.com/",printMaxWidth:780,scale:2,buttons:{contextButton:{className:"highcharts-contextbutton",menuClassName:"highcharts-contextmenu",
+symbol:"menu",titleKey:"contextButtonTitle",menuItems:"printChart separator downloadPNG downloadJPEG downloadPDF downloadSVG".split(" ")}},menuItemDefinitions:{printChart:{textKey:"printChart",onclick:function(){this.print()}},separator:{separator:!0},downloadPNG:{textKey:"downloadPNG",onclick:function(){this.exportChart()}},downloadJPEG:{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},downloadPDF:{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},
+downloadSVG:{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}}};g.post=function(b,a,d){var c=t("form",p({method:"post",action:b,enctype:"multipart/form-data"},d),{display:"none"},z.body);E(a,function(a,b){t("input",{type:"hidden",name:b,value:a},null,c)});c.submit();D(c)};x(l.prototype,{sanitizeSVG:function(b,a){if(a&&a.exporting&&a.exporting.allowHTML){var d=b.match(/<\/svg>(.*?$)/);d&&d[1]&&(d='\x3cforeignObject x\x3d"0" y\x3d"0" width\x3d"'+a.chart.width+'" height\x3d"'+
+a.chart.height+'"\x3e\x3cbody xmlns\x3d"http://www.w3.org/1999/xhtml"\x3e'+d[1]+"\x3c/body\x3e\x3c/foreignObject\x3e",b=b.replace("\x3c/svg\x3e",d+"\x3c/svg\x3e"))}b=b.replace(/zIndex="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\(("|&quot;)(\S+)("|&quot;)\)/g,"url($2)").replace(/url\([^#]+#/g,"url(#").replace(/<svg /,'\x3csvg xmlns:xlink\x3d"http://www.w3.org/1999/xlink" ').replace(/ (|NS[0-9]+\:)href=/g," xlink:href\x3d").replace(/\n/," ").replace(/<\/svg>.*?$/,
+"\x3c/svg\x3e").replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g,'$1\x3d"rgb($2)" $1-opacity\x3d"$3"').replace(/&nbsp;/g,"\u00a0").replace(/&shy;/g,"\u00ad");this.ieSanitizeSVG&&(b=this.ieSanitizeSVG(b));return b},getChartHTML:function(){this.styledMode&&this.inlineStyles();return this.container.innerHTML},getSVG:function(b){var a,d,c,w,m,h=p(this.options,b);d=t("div",null,{position:"absolute",top:"-9999em",width:this.chartWidth+"px",height:this.chartHeight+"px"},z.body);c=
+this.renderTo.style.width;m=this.renderTo.style.height;c=h.exporting.sourceWidth||h.chart.width||/px$/.test(c)&&parseInt(c,10)||(h.isGantt?800:600);m=h.exporting.sourceHeight||h.chart.height||/px$/.test(m)&&parseInt(m,10)||400;x(h.chart,{animation:!1,renderTo:d,forExport:!0,renderer:"SVGRenderer",width:c,height:m});h.exporting.enabled=!1;delete h.data;h.series=[];this.series.forEach(function(a){w=p(a.userOptions,{animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});w.isInternal||
+h.series.push(w)});this.axes.forEach(function(a){a.userOptions.internalKey||(a.userOptions.internalKey=g.uniqueKey())});a=new g.Chart(h,this.callback);b&&["xAxis","yAxis","series"].forEach(function(c){var d={};b[c]&&(d[c]=b[c],a.update(d))});this.axes.forEach(function(b){var c=g.find(a.axes,function(a){return a.options.internalKey===b.userOptions.internalKey}),d=b.getExtremes(),e=d.userMin,d=d.userMax;c&&(void 0!==e&&e!==c.min||void 0!==d&&d!==c.max)&&c.setExtremes(e,d,!0,!1)});c=a.getChartHTML();
+C(this,"getSVG",{chartCopy:a});c=this.sanitizeSVG(c,h);h=null;a.destroy();D(d);return c},getSVGForExport:function(b,a){var d=this.options.exporting;return this.getSVG(p({chart:{borderRadius:0}},d.chartOptions,a,{exporting:{sourceWidth:b&&b.sourceWidth||d.sourceWidth,sourceHeight:b&&b.sourceHeight||d.sourceHeight}}))},getFilename:function(){var b=this.userOptions.title&&this.userOptions.title.text,a=this.options.exporting.filename;if(a)return a;"string"===typeof b&&(a=b.toLowerCase().replace(/<\/?[^>]+(>|$)/g,
+"").replace(/[\s_]+/g,"-").replace(/[^a-z0-9\-]/g,"").replace(/^[\-]+/g,"").replace(/[\-]+/g,"-").substr(0,24).replace(/[\-]+$/g,""));if(!a||5>a.length)a="chart";return a},exportChart:function(b,a){a=this.getSVGForExport(b,a);b=p(this.options.exporting,b);g.post(b.url,{filename:b.filename||this.getFilename(),type:b.type,width:b.width||0,scale:b.scale,svg:a},b.formAttributes)},print:function(){function b(b){(a.fixedDiv?[a.fixedDiv,a.scrollingContainer]:[a.container]).forEach(function(a){b.appendChild(a)})}
+var a=this,d=[],c=z.body,g=c.childNodes,m=a.options.exporting.printMaxWidth,h,e;if(!a.isPrinting){a.isPrinting=!0;a.pointer.reset(null,0);C(a,"beforePrint");if(e=m&&a.chartWidth>m)h=[a.options.chart.width,void 0,!1],a.setSize(m,void 0,!1);g.forEach(function(a,b){1===a.nodeType&&(d[b]=a.style.display,a.style.display="none")});b(c);setTimeout(function(){A.focus();A.print();setTimeout(function(){b(a.renderTo);g.forEach(function(a,b){1===a.nodeType&&(a.style.display=d[b])});a.isPrinting=!1;e&&a.setSize.apply(a,
+h);C(a,"afterPrint")},1E3)},1)}},contextMenu:function(b,a,d,c,w,m,h){var e=this,n=e.options.navigation,k=e.chartWidth,v=e.chartHeight,l="cache-"+b,f=e[l],B=Math.max(w,m),p;f||(e.exportContextMenu=e[l]=f=t("div",{className:b},{position:"absolute",zIndex:1E3,padding:B+"px",pointerEvents:"auto"},e.fixedDiv||e.container),p=t("div",{className:"highcharts-menu"},null,f),e.styledMode||r(p,x({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},n.menuStyle)),
+f.hideMenu=function(){r(f,{display:"none"});h&&h.setState(0);e.openMenu=!1;g.clearTimeout(f.hideTimer)},e.exportEvents.push(q(f,"mouseleave",function(){f.hideTimer=setTimeout(f.hideMenu,500)}),q(f,"mouseenter",function(){g.clearTimeout(f.hideTimer)}),q(z,"mouseup",function(a){e.pointer.inClass(a.target,b)||f.hideMenu()}),q(f,"click",function(){e.openMenu&&f.hideMenu()})),a.forEach(function(a){"string"===typeof a&&(a=e.options.exporting.menuItemDefinitions[a]);if(g.isObject(a,!0)){var b;a.separator?
+b=t("hr",null,null,p):(b=t("div",{className:"highcharts-menu-item",onclick:function(b){b&&b.stopPropagation();f.hideMenu();a.onclick&&a.onclick.apply(e,arguments)},innerHTML:a.text||e.options.lang[a.textKey]},null,p),e.styledMode||(b.onmouseover=function(){r(this,n.menuItemHoverStyle)},b.onmouseout=function(){r(this,n.menuItemStyle)},r(b,x({cursor:"pointer"},n.menuItemStyle))));e.exportDivElements.push(b)}}),e.exportDivElements.push(p,f),e.exportMenuWidth=f.offsetWidth,e.exportMenuHeight=f.offsetHeight);
+a={display:"block"};d+e.exportMenuWidth>k?a.right=k-d-w-B+"px":a.left=d-B+"px";c+m+e.exportMenuHeight>v&&"top"!==h.alignOptions.verticalAlign?a.bottom=v-c-B+"px":a.top=c+m-B+"px";r(f,a);e.openMenu=!0},addButton:function(b){var a=this,d=a.renderer,c=p(a.options.navigation.buttonOptions,b),g=c.onclick,m=c.menuItems,h,e,n=c.symbolSize||12;a.btnCount||(a.btnCount=0);a.exportDivElements||(a.exportDivElements=[],a.exportSVGElements=[]);if(!1!==c.enabled){var k=c.theme,v=k.states,l=v&&v.hover,v=v&&v.select,
+f;a.styledMode||(k.fill=u(k.fill,"#ffffff"),k.stroke=u(k.stroke,"none"));delete k.states;g?f=function(b){b&&b.stopPropagation();g.call(a,b)}:m&&(f=function(b){b&&b.stopPropagation();a.contextMenu(e.menuClassName,m,e.translateX,e.translateY,e.width,e.height,e);e.setState(2)});c.text&&c.symbol?k.paddingLeft=u(k.paddingLeft,25):c.text||x(k,{width:c.width,height:c.height,padding:0});a.styledMode||(k["stroke-linecap"]="round",k.fill=u(k.fill,"#ffffff"),k.stroke=u(k.stroke,"none"));e=d.button(c.text,0,
+0,f,k,l,v).addClass(b.className).attr({title:u(a.options.lang[c._titleKey||c.titleKey],"")});e.menuClassName=b.menuClassName||"highcharts-menu-"+a.btnCount++;c.symbol&&(h=d.symbol(c.symbol,c.symbolX-n/2,c.symbolY-n/2,n,n,{width:n,height:n}).addClass("highcharts-button-symbol").attr({zIndex:1}).add(e),a.styledMode||h.attr({stroke:c.symbolStroke,fill:c.symbolFill,"stroke-width":c.symbolStrokeWidth||1}));e.add(a.exportingGroup).align(x(c,{width:e.width,x:u(c.x,a.buttonOffset)}),!0,"spacingBox");a.buttonOffset+=
+(e.width+c.buttonSpacing)*("right"===c.align?-1:1);a.exportSVGElements.push(e,h)}},destroyExport:function(b){var a=b?b.target:this;b=a.exportSVGElements;var d=a.exportDivElements,c=a.exportEvents,l;b&&(b.forEach(function(b,c){b&&(b.onclick=b.ontouchstart=null,l="cache-"+b.menuClassName,a[l]&&delete a[l],a.exportSVGElements[c]=b.destroy())}),b.length=0);a.exportingGroup&&(a.exportingGroup.destroy(),delete a.exportingGroup);d&&(d.forEach(function(b,c){g.clearTimeout(b.hideTimer);I(b,"mouseleave");a.exportDivElements[c]=
+b.onmouseout=b.onmouseover=b.ontouchstart=b.onclick=null;D(b)}),d.length=0);c&&(c.forEach(function(a){a()}),c.length=0)}});F.prototype.inlineToAttributes="fill stroke strokeLinecap strokeLinejoin strokeWidth textAnchor x y".split(" ");F.prototype.inlineBlacklist=[/-/,/^(clipPath|cssText|d|height|width)$/,/^font$/,/[lL]ogical(Width|Height)$/,/perspective/,/TapHighlightColor/,/^transition/,/^length$/];F.prototype.unstyledElements=["clipPath","defs","desc"];l.prototype.inlineStyles=function(){function b(a){return a.replace(/([A-Z])/g,
+function(a,b){return"-"+b.toLowerCase()})}function a(d){function m(a,f){q=t=!1;if(l){for(r=l.length;r--&&!t;)t=l[r].test(f);q=!t}"transform"===f&&"none"===a&&(q=!0);for(r=g.length;r--&&!q;)q=g[r].test(f)||"function"===typeof a;q||v[f]===a&&"svg"!==d.nodeName||e[d.nodeName][f]===a||(-1!==c.indexOf(f)?d.setAttribute(b(f),a):u+=b(f)+":"+a+";")}var f,v,u="",w,q,t,r;if(1===d.nodeType&&-1===h.indexOf(d.nodeName)){f=A.getComputedStyle(d,null);v="svg"===d.nodeName?{}:A.getComputedStyle(d.parentNode,null);
+e[d.nodeName]||(n=k.getElementsByTagName("svg")[0],w=k.createElementNS(d.namespaceURI,d.nodeName),n.appendChild(w),e[d.nodeName]=p(A.getComputedStyle(w,null)),"text"===d.nodeName&&delete e.text.fill,n.removeChild(w));if(L||K)for(var x in f)m(f[x],x);else E(f,m);u&&(f=d.getAttribute("style"),d.setAttribute("style",(f?f+";":"")+u));"svg"===d.nodeName&&d.setAttribute("stroke-width","1px");"text"!==d.nodeName&&[].forEach.call(d.children||d.childNodes,a)}}var d=this.renderer,c=d.inlineToAttributes,g=d.inlineBlacklist,
+l=d.inlineWhitelist,h=d.unstyledElements,e={},n,k,d=z.createElement("iframe");r(d,{width:"1px",height:"1px",visibility:"hidden"});z.body.appendChild(d);k=d.contentWindow.document;k.open();k.write('\x3csvg xmlns\x3d"http://www.w3.org/2000/svg"\x3e\x3c/svg\x3e');k.close();a(this.container.querySelector("svg"));n.parentNode.removeChild(n)};H.menu=function(b,a,d,c){return["M",b,a+2.5,"L",b+d,a+2.5,"M",b,a+c/2+.5,"L",b+d,a+c/2+.5,"M",b,a+c-1.5,"L",b+d,a+c-1.5]};H.menuball=function(b,a,d,c){b=[];c=c/3-
+2;return b=b.concat(this.circle(d-c,a,c,c),this.circle(d-c,a+c+4,c,c),this.circle(d-c,a+2*(c+4),c,c))};l.prototype.renderExporting=function(){var b=this,a=b.options.exporting,d=a.buttons,c=b.isDirtyExporting||!b.exportSVGElements;b.buttonOffset=0;b.isDirtyExporting&&b.destroyExport();c&&!1!==a.enabled&&(b.exportEvents=[],b.exportingGroup=b.exportingGroup||b.renderer.g("exporting-group").attr({zIndex:3}).add(),E(d,function(a){b.addButton(a)}),b.isDirtyExporting=!1);q(b,"destroy",b.destroyExport)};
+q(l,"init",function(){var b=this;["exporting","navigation"].forEach(function(a){b[a]={update:function(d,c){b.isDirtyExporting=!0;p(!0,b.options[a],d);u(c,!0)&&b.redraw()}}})});l.prototype.callbacks.push(function(b){b.renderExporting();q(b,"redraw",b.renderExporting)})})(l)});
+//# sourceMappingURL=exporting.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+ Exporting module
+
+ (c) 2010-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(m){"object"===typeof module&&module.exports?module.exports=m:"function"===typeof define&&define.amd?define(function(){return m}):m("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(m){(function(a){a.ajax=function(f){var b=a.merge(!0,{url:!1,type:"GET",dataType:"json",success:!1,error:!1,data:!1,headers:{}},f);f={json:"application/json",xml:"application/xml",text:"text/plain",octet:"application/octet-stream"};var c=new XMLHttpRequest;if(!b.url)return!1;c.open(b.type.toUpperCase(),
+b.url,!0);c.setRequestHeader("Content-Type",f[b.dataType]||f.text);a.objectEach(b.headers,function(a,f){c.setRequestHeader(f,a)});c.onreadystatechange=function(){var a;if(4===c.readyState){if(200===c.status){a=c.responseText;if("json"===b.dataType)try{a=JSON.parse(a)}catch(v){b.error&&b.error(c,v);return}return b.success&&b.success(a)}b.error&&b.error(c,c.responseText)}};try{b.data=JSON.stringify(b.data)}catch(k){}c.send(b.data||!0)}})(m);(function(a){var f=a.win,b=f.navigator,c=f.document,k=f.URL||
+f.webkitURL||f,v=/Edge\/\d+/.test(b.userAgent);a.dataURLtoBlob=function(a){if((a=a.match(/data:([^;]*)(;base64)?,([0-9A-Za-z+/]+)/))&&3<a.length&&f.atob&&f.ArrayBuffer&&f.Uint8Array&&f.Blob&&k.createObjectURL){for(var c=f.atob(a[3]),b=new f.ArrayBuffer(c.length),b=new f.Uint8Array(b),g=0;g<b.length;++g)b[g]=c.charCodeAt(g);a=new f.Blob([b],{type:a[1]});return k.createObjectURL(a)}};a.downloadURL=function(e,k){var q=c.createElement("a"),g;if("string"===typeof e||e instanceof String||!b.msSaveOrOpenBlob){if(v||
+2E6<e.length)if(e=a.dataURLtoBlob(e),!e)throw"Failed to convert to blob";if(void 0!==q.download)q.href=e,q.download=k,c.body.appendChild(q),q.click(),c.body.removeChild(q);else try{if(g=f.open(e,"chart"),void 0===g||null===g)throw"Failed to open window";}catch(B){f.location.href=e}}else b.msSaveOrOpenBlob(e,k)}})(m);(function(a){function f(a,b){if(k.Blob&&k.navigator.msSaveOrOpenBlob)return new k.Blob(["\ufeff"+a],{type:b})}var b=a.defined,c=a.pick,k=a.win,v=k.document,e=a.seriesTypes,m=a.downloadURL;
+a.setOptions({exporting:{csv:{columnHeaderFormatter:null,dateFormat:"%Y-%m-%d %H:%M:%S",decimalPoint:null,itemDelimiter:null,lineDelimiter:"\n"},showTable:!1,useMultiLevelHeaders:!0,useRowspanHeaders:!0},lang:{downloadCSV:"Download CSV",downloadXLS:"Download XLS",openInCloud:"Open in Highcharts Cloud",viewData:"View data table"}});a.addEvent(a.Chart,"render",function(){this.options&&this.options.exporting&&this.options.exporting.showTable&&this.viewData()});a.Chart.prototype.setUpKeyToAxis=function(){e.arearange&&
+(e.arearange.prototype.keyToAxis={low:"y",high:"y"});e.gantt&&(e.gantt.prototype.keyToAxis={start:"x",end:"x"})};a.Chart.prototype.getDataRows=function(g){var f=this.time,e=this.options.exporting&&this.options.exporting.csv||{},h,l=this.xAxis,t={},k=[],n,m=[],p=[],y,w,u,C=function(d,b,h){if(e.columnHeaderFormatter){var u=e.columnHeaderFormatter(d,b,h);if(!1!==u)return u}return d?d instanceof a.Axis?d.options.title&&d.options.title.text||(d.isDatetimeAxis?"DateTime":"Category"):g?{columnTitle:1<h?
+b:d.name,topLevelColumnTitle:d.name}:d.name+(1<h?" ("+b+")":""):"Category"},z=[];w=0;this.setUpKeyToAxis();this.series.forEach(function(d){var b=d.options.keys||d.pointArrayMap||["y"],h=b.length,u=!d.requireSorting&&{},x={},B={},n=l.indexOf(d.xAxis),k,r;b.forEach(function(a){var b=(d.keyToAxis&&d.keyToAxis[a]||a)+"Axis";x[a]=d[b]&&d[b].categories||[];B[a]=d[b]&&d[b].isDatetimeAxis});if(!1!==d.options.includeInCSVExport&&!d.options.isInternal&&!1!==d.visible){a.find(z,function(d){return d[0]===n})||
+z.push([n,w]);for(r=0;r<h;)y=C(d,b[r],b.length),p.push(y.columnTitle||y),g&&m.push(y.topLevelColumnTitle||y),r++;k={chart:d.chart,autoIncrement:d.autoIncrement,options:d.options,pointArrayMap:d.pointArrayMap};d.options.data.forEach(function(a,g){var l,p;p={series:k};d.pointClass.prototype.applyOptions.apply(p,[a]);a=p.x;l=d.data[g]&&d.data[g].name;u&&(u[a]&&(a+="|"+g),u[a]=!0);r=0;d.xAxis&&"name"!==d.exportKey||(a=l);t[a]||(t[a]=[],t[a].xValues=[]);t[a].x=p.x;t[a].name=l;for(t[a].xValues[n]=p.x;r<
+h;)g=b[r],l=p[g],t[a][w+r]=c(x[g][l],B[g]?f.dateFormat(e.dateFormat,l):null,l),r++});w+=r}});for(n in t)t.hasOwnProperty(n)&&k.push(t[n]);var x,A;n=g?[m,p]:[p];for(w=z.length;w--;)x=z[w][0],A=z[w][1],h=l[x],k.sort(function(a,b){return a.xValues[x]-b.xValues[x]}),u=C(h),n[0].splice(A,0,u),g&&n[1]&&n[1].splice(A,0,u),k.forEach(function(a){var d=a.name;h&&!b(d)&&(h.isDatetimeAxis?(a.x instanceof Date&&(a.x=a.x.getTime()),d=f.dateFormat(e.dateFormat,a.x)):d=h.categories?c(h.names[a.x],h.categories[a.x],
+a.x):a.x);a.splice(A,0,d)});n=n.concat(k);a.fireEvent(this,"exportData",{dataRows:n});return n};a.Chart.prototype.getCSV=function(a){var b="",g=this.getDataRows(),h=this.options.exporting.csv,f=c(h.decimalPoint,","!==h.itemDelimiter&&a?(1.1).toLocaleString()[1]:"."),e=c(h.itemDelimiter,","===f?";":","),k=h.lineDelimiter;g.forEach(function(a,h){for(var c,l=a.length;l--;)c=a[l],"string"===typeof c&&(c='"'+c+'"'),"number"===typeof c&&"."!==f&&(c=c.toString().replace(".",f)),a[l]=c;b+=a.join(e);h<g.length-
+1&&(b+=k)});return b};a.Chart.prototype.getTable=function(a){var b="\x3ctable\x3e",g=this.options,h=a?(1.1).toLocaleString()[1]:".",f=c(g.exporting.useMultiLevelHeaders,!0);a=this.getDataRows(f);var e=0,k=f?a.shift():null,n=a.shift(),m=function(a,b,g,f){var e=c(f,"");b="text"+(b?" "+b:"");"number"===typeof e?(e=e.toString(),","===h&&(e=e.replace(".",h)),b="number"):f||(b="empty");return"\x3c"+a+(g?" "+g:"")+' class\x3d"'+b+'"\x3e'+e+"\x3c/"+a+"\x3e"};!1!==g.exporting.tableCaption&&(b+='\x3ccaption class\x3d"highcharts-table-caption"\x3e'+
+c(g.exporting.tableCaption,g.title.text?g.title.text.replace(/&/g,"\x26amp;").replace(/</g,"\x26lt;").replace(/>/g,"\x26gt;").replace(/"/g,"\x26quot;").replace(/'/g,"\x26#x27;").replace(/\//g,"\x26#x2F;"):"Chart")+"\x3c/caption\x3e");for(var p=0,q=a.length;p<q;++p)a[p].length>e&&(e=a[p].length);b+=function(a,b,e){var h="\x3cthead\x3e",c=0;e=e||b&&b.length;var k,d,l=0;if(d=f&&a&&b){a:if(d=a.length,b.length===d){for(;d--;)if(a[d]!==b[d]){d=!1;break a}d=!0}else d=!1;d=!d}if(d){for(h+="\x3ctr\x3e";c<
+e;++c)d=a[c],k=a[c+1],d===k?++l:l?(h+=m("th","highcharts-table-topheading",'scope\x3d"col" colspan\x3d"'+(l+1)+'"',d),l=0):(d===b[c]?g.exporting.useRowspanHeaders?(k=2,delete b[c]):(k=1,b[c]=""):k=1,h+=m("th","highcharts-table-topheading",'scope\x3d"col"'+(1<k?' valign\x3d"top" rowspan\x3d"'+k+'"':""),d));h+="\x3c/tr\x3e"}if(b){h+="\x3ctr\x3e";c=0;for(e=b.length;c<e;++c)void 0!==b[c]&&(h+=m("th",null,'scope\x3d"col"',b[c]));h+="\x3c/tr\x3e"}return h+"\x3c/thead\x3e"}(k,n,Math.max(e,n.length));b+=
+"\x3ctbody\x3e";a.forEach(function(a){b+="\x3ctr\x3e";for(var c=0;c<e;c++)b+=m(c?"td":"th",null,c?"":'scope\x3d"row"',a[c]);b+="\x3c/tr\x3e"});return b+="\x3c/tbody\x3e\x3c/table\x3e"};a.Chart.prototype.downloadCSV=function(){var a=this.getCSV(!0);m(f(a,"text/csv")||"data:text/csv,\ufeff"+encodeURIComponent(a),this.getFilename()+".csv")};a.Chart.prototype.downloadXLS=function(){var a='\x3chtml xmlns:o\x3d"urn:schemas-microsoft-com:office:office" xmlns:x\x3d"urn:schemas-microsoft-com:office:excel" xmlns\x3d"http://www.w3.org/TR/REC-html40"\x3e\x3chead\x3e\x3c!--[if gte mso 9]\x3e\x3cxml\x3e\x3cx:ExcelWorkbook\x3e\x3cx:ExcelWorksheets\x3e\x3cx:ExcelWorksheet\x3e\x3cx:Name\x3eArk1\x3c/x:Name\x3e\x3cx:WorksheetOptions\x3e\x3cx:DisplayGridlines/\x3e\x3c/x:WorksheetOptions\x3e\x3c/x:ExcelWorksheet\x3e\x3c/x:ExcelWorksheets\x3e\x3c/x:ExcelWorkbook\x3e\x3c/xml\x3e\x3c![endif]--\x3e\x3cstyle\x3etd{border:none;font-family: Calibri, sans-serif;} .number{mso-number-format:"0.00";} .text{ mso-number-format:"@";}\x3c/style\x3e\x3cmeta name\x3dProgId content\x3dExcel.Sheet\x3e\x3cmeta charset\x3dUTF-8\x3e\x3c/head\x3e\x3cbody\x3e'+
+this.getTable(!0)+"\x3c/body\x3e\x3c/html\x3e";m(f(a,"application/vnd.ms-excel")||"data:application/vnd.ms-excel;base64,"+k.btoa(unescape(encodeURIComponent(a))),this.getFilename()+".xls")};a.Chart.prototype.viewData=function(){this.dataTableDiv||(this.dataTableDiv=v.createElement("div"),this.dataTableDiv.className="highcharts-data-table",this.renderTo.parentNode.insertBefore(this.dataTableDiv,this.renderTo.nextSibling));this.dataTableDiv.innerHTML=this.getTable()};a.Chart.prototype.openInCloud=function(){function b(c){Object.keys(c).forEach(function(e){"function"===
+typeof c[e]&&delete c[e];a.isObject(c[e])&&b(c[e])})}var c,e;c=a.merge(this.userOptions);b(c);c={name:c.title&&c.title.text||"Chart title",options:c,settings:{constructor:"Chart",dataProvider:{csv:this.getCSV()}}};e=JSON.stringify(c);(function(){var a=v.createElement("form");v.body.appendChild(a);a.method="post";a.action="https://cloud-api.highcharts.com/openincloud";a.target="_blank";var b=v.createElement("input");b.type="hidden";b.name="chart";b.value=e;a.appendChild(b);a.submit();v.body.removeChild(a)})()};
+var q=a.getOptions().exporting;q&&(a.extend(q.menuItemDefinitions,{downloadCSV:{textKey:"downloadCSV",onclick:function(){this.downloadCSV()}},downloadXLS:{textKey:"downloadXLS",onclick:function(){this.downloadXLS()}},viewData:{textKey:"viewData",onclick:function(){this.viewData()}},openInCloud:{textKey:"openInCloud",onclick:function(){this.openInCloud()}}}),q.buttons.contextButton.menuItems.push("separator","downloadCSV","downloadXLS","viewData","openInCloud"));e.map&&(e.map.prototype.exportKey="name");
+e.mapbubble&&(e.mapbubble.prototype.exportKey="name");e.treemap&&(e.treemap.prototype.exportKey="name")})(m)});
+//# sourceMappingURL=export-data.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+ Highcharts funnel module
+
+ (c) 2010-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(a){(function(a){var p=a.seriesType,D=a.seriesTypes,H=a.noop,E=a.pick;p("funnel","pie",{animation:!1,center:["50%","50%"],width:"90%",neckWidth:"30%",height:"100%",neckHeight:"25%",reversed:!1,size:!0,dataLabels:{connectorWidth:1},states:{select:{color:"#cccccc",borderColor:"#000000"}}},{animate:H,
+translate:function(){var d=function(b,a){return/%$/.test(b)?a*parseInt(b,10)/100:parseInt(b,10)},a=0,f=this.chart,e=this.options,c=e.reversed,v=e.ignoreHiddenPoint,t=f.plotWidth,f=f.plotHeight,q=0,p=e.center,g=d(p[0],t),r=d(p[1],f),D=d(e.width,t),k,w,l=d(e.height,f),x=d(e.neckWidth,t),F=d(e.neckHeight,f),y=r-l/2+l-F,d=this.data,A,B,E="left"===e.dataLabels.position?1:0,C,m,G,u,h,z,n;this.getWidthAt=w=function(b){var a=r-l/2;return b>y||l===F?x:x+(D-x)*(1-(b-a)/(l-F))};this.getX=function(b,a,d){return g+
+(a?-1:1)*(w(c?2*r-b:b)/2+d.labelDistance)};this.center=[g,r,l];this.centerX=g;d.forEach(function(b){v&&!1===b.visible||(a+=b.y)});d.forEach(function(b){n=null;B=a?b.y/a:0;m=r-l/2+q*l;h=m+B*l;k=w(m);C=g-k/2;G=C+k;k=w(h);u=g-k/2;z=u+k;m>y?(C=u=g-x/2,G=z=g+x/2):h>y&&(n=h,k=w(y),u=g-k/2,z=u+k,h=y);c&&(m=2*r-m,h=2*r-h,null!==n&&(n=2*r-n));A=["M",C,m,"L",G,m,z,h];null!==n&&A.push(z,n,u,n);A.push(u,h,"Z");b.shapeType="path";b.shapeArgs={d:A};b.percentage=100*B;b.plotX=g;b.plotY=(m+(n||h))/2;b.tooltipPos=
+[g,b.plotY];b.slice=H;b.half=E;v&&!1===b.visible||(q+=B)})},sortByAngle:function(a){a.sort(function(a,d){return a.plotY-d.plotY})},drawDataLabels:function(){var a=this.data,p=this.options.dataLabels.distance,f,e,c,v=a.length,t,q;for(this.center[2]-=2*p;v--;)c=a[v],e=(f=c.half)?1:-1,q=c.plotY,c.labelDistance=E(c.options.dataLabels&&c.options.dataLabels.distance,p),this.maxLabelDistance=Math.max(c.labelDistance,this.maxLabelDistance||0),t=this.getX(q,f,c),c.labelPosition={natural:{x:0,y:q},"final":{},
+alignment:f?"right":"left",connectorPosition:{breakAt:{x:t+(c.labelDistance-5)*e,y:q},touchingSliceAt:{x:t+c.labelDistance*e,y:q}}};D.pie.prototype.drawDataLabels.call(this)}});p("pyramid","funnel",{neckWidth:"0%",neckHeight:"0%",reversed:!0})})(a)});
+//# sourceMappingURL=funnel.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+
+ (c) 2009-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(m){"object"===typeof module&&module.exports?module.exports=m:"function"===typeof define&&define.amd?define(function(){return m}):m("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(m){(function(b){var r=b.addEvent,f=b.Axis,m=b.Chart,l=b.color,p,q=b.extend,n=b.isNumber,c=b.Legend,g=b.LegendSymbolMixin,w=b.noop,v=b.merge,u=b.pick;b.ColorAxis||(p=b.ColorAxis=function(){this.init.apply(this,arguments)},q(p.prototype,f.prototype),q(p.prototype,{defaultColorAxisOptions:{lineWidth:0,
+minPadding:0,maxPadding:0,gridLineWidth:1,tickPixelInterval:72,startOnTick:!0,endOnTick:!0,offset:0,marker:{animation:{duration:50},width:.01,color:"#999999"},labels:{overflow:"justify",rotation:0},minColor:"#e6ebf5",maxColor:"#003399",tickLength:5,showInLegend:!0},keepProps:["legendGroup","legendItemHeight","legendItemWidth","legendItem","legendSymbol"].concat(f.prototype.keepProps),init:function(a,d){var e="vertical"!==a.options.legend.layout,h;this.coll="colorAxis";h=v(this.defaultColorAxisOptions,
+{side:e?2:1,reversed:!e},d,{opposite:!e,showEmpty:!1,title:null,visible:a.options.legend.enabled});f.prototype.init.call(this,a,h);d.dataClasses&&this.initDataClasses(d);this.initStops();this.horiz=e;this.zoomEnabled=!1;this.defaultLegendLength=200},initDataClasses:function(a){var d=this.chart,e,h=0,k=d.options.chart.colorCount,b=this.options,c=a.dataClasses.length;this.dataClasses=e=[];this.legendItems=[];a.dataClasses.forEach(function(a,g){a=v(a);e.push(a);if(d.styledMode||!a.color)"category"===
+b.dataClassColor?(d.styledMode||(g=d.options.colors,k=g.length,a.color=g[h]),a.colorIndex=h,h++,h===k&&(h=0)):a.color=l(b.minColor).tweenTo(l(b.maxColor),2>c?.5:g/(c-1))})},setTickPositions:function(){if(!this.dataClasses)return f.prototype.setTickPositions.call(this)},initStops:function(){this.stops=this.options.stops||[[0,this.options.minColor],[1,this.options.maxColor]];this.stops.forEach(function(a){a.color=l(a[1])})},setOptions:function(a){f.prototype.setOptions.call(this,a);this.options.crosshair=
+this.options.marker},setAxisSize:function(){var a=this.legendSymbol,d=this.chart,e=d.options.legend||{},h,k;a?(this.left=e=a.attr("x"),this.top=h=a.attr("y"),this.width=k=a.attr("width"),this.height=a=a.attr("height"),this.right=d.chartWidth-e-k,this.bottom=d.chartHeight-h-a,this.len=this.horiz?k:a,this.pos=this.horiz?e:h):this.len=(this.horiz?e.symbolWidth:e.symbolHeight)||this.defaultLegendLength},normalizedValue:function(a){this.isLog&&(a=this.val2lin(a));return 1-(this.max-a)/(this.max-this.min||
+1)},toColor:function(a,d){var e=this.stops,h,k,b=this.dataClasses,g,c;if(b)for(c=b.length;c--;){if(g=b[c],h=g.from,e=g.to,(void 0===h||a>=h)&&(void 0===e||a<=e)){k=g.color;d&&(d.dataClass=c,d.colorIndex=g.colorIndex);break}}else{a=this.normalizedValue(a);for(c=e.length;c--&&!(a>e[c][0]););h=e[c]||e[c+1];e=e[c+1]||h;a=1-(e[0]-a)/(e[0]-h[0]||1);k=h.color.tweenTo(e.color,a)}return k},getOffset:function(){var a=this.legendGroup,d=this.chart.axisOffset[this.side];a&&(this.axisParent=a,f.prototype.getOffset.call(this),
+this.added||(this.added=!0,this.labelLeft=0,this.labelRight=this.width),this.chart.axisOffset[this.side]=d)},setLegendColor:function(){var a,d=this.reversed;a=d?1:0;d=d?0:1;a=this.horiz?[a,0,d,0]:[0,d,0,a];this.legendColor={linearGradient:{x1:a[0],y1:a[1],x2:a[2],y2:a[3]},stops:this.stops}},drawLegendSymbol:function(a,d){var e=a.padding,c=a.options,k=this.horiz,b=u(c.symbolWidth,k?this.defaultLegendLength:12),g=u(c.symbolHeight,k?12:this.defaultLegendLength),l=u(c.labelPadding,k?16:30),c=u(c.itemDistance,
+10);this.setLegendColor();d.legendSymbol=this.chart.renderer.rect(0,a.baseline-11,b,g).attr({zIndex:1}).add(d.legendGroup);this.legendItemWidth=b+e+(k?c:l);this.legendItemHeight=g+e+(k?l:0)},setState:function(a){this.series.forEach(function(d){d.setState(a)})},visible:!0,setVisible:w,getSeriesExtremes:function(){var a=this.series,d=a.length;this.dataMin=Infinity;for(this.dataMax=-Infinity;d--;)a[d].getExtremes(),void 0!==a[d].valueMin&&(this.dataMin=Math.min(this.dataMin,a[d].valueMin),this.dataMax=
+Math.max(this.dataMax,a[d].valueMax))},drawCrosshair:function(a,d){var e=d&&d.plotX,c=d&&d.plotY,b,g=this.pos,l=this.len;d&&(b=this.toPixels(d[d.series.colorKey]),b<g?b=g-2:b>g+l&&(b=g+l+2),d.plotX=b,d.plotY=this.len-b,f.prototype.drawCrosshair.call(this,a,d),d.plotX=e,d.plotY=c,this.cross&&!this.cross.addedToColorAxis&&this.legendGroup&&(this.cross.addClass("highcharts-coloraxis-marker").add(this.legendGroup),this.cross.addedToColorAxis=!0,this.chart.styledMode||this.cross.attr({fill:this.crosshair.color})))},
+getPlotLinePath:function(a,d,e,c,b){return n(b)?this.horiz?["M",b-4,this.top-6,"L",b+4,this.top-6,b,this.top,"Z"]:["M",this.left,b,"L",this.left-6,b+6,this.left-6,b-6,"Z"]:f.prototype.getPlotLinePath.call(this,a,d,e,c)},update:function(a,d){var e=this.chart,b=e.legend;this.series.forEach(function(a){a.isDirtyData=!0});a.dataClasses&&b.allItems&&(b.allItems.forEach(function(a){a.isDataClass&&a.legendGroup&&a.legendGroup.destroy()}),e.isDirtyLegend=!0);e.options[this.coll]=v(this.userOptions,a);f.prototype.update.call(this,
+a,d);this.legendItem&&(this.setLegendColor(),b.colorizeItem(this,!0))},remove:function(){this.legendItem&&this.chart.legend.destroyItem(this);f.prototype.remove.call(this)},getDataClassLegendSymbols:function(){var a=this,d=this.chart,e=this.legendItems,c=d.options.legend,l=c.valueDecimals,p=c.valueSuffix||"",f;e.length||this.dataClasses.forEach(function(c,h){var k=!0,n=c.from,m=c.to;f="";void 0===n?f="\x3c ":void 0===m&&(f="\x3e ");void 0!==n&&(f+=b.numberFormat(n,l)+p);void 0!==n&&void 0!==m&&(f+=
+" - ");void 0!==m&&(f+=b.numberFormat(m,l)+p);e.push(q({chart:d,name:f,options:{},drawLegendSymbol:g.drawRectangle,visible:!0,setState:w,isDataClass:!0,setVisible:function(){k=this.visible=!k;a.series.forEach(function(a){a.points.forEach(function(a){a.dataClass===h&&a.setVisible(k)})});d.legend.colorizeItem(this,k)}},c))});return e},name:""}),["fill","stroke"].forEach(function(a){b.Fx.prototype[a+"Setter"]=function(){this.elem.attr(a,l(this.start).tweenTo(l(this.end),this.pos),null,!0)}}),r(m,"afterGetAxes",
+function(){var a=this.options.colorAxis;this.colorAxis=[];a&&new p(this,a)}),r(c,"afterGetAllItems",function(a){var d=[],c=this.chart.colorAxis[0];c&&c.options&&c.options.showInLegend&&(c.options.dataClasses?d=c.getDataClassLegendSymbols():d.push(c),c.series.forEach(function(c){b.erase(a.allItems,c)}));for(c=d.length;c--;)a.allItems.unshift(d[c])}),r(c,"afterColorizeItem",function(a){a.visible&&a.item.legendColor&&a.item.legendSymbol.attr({fill:a.item.legendColor})}),r(c,"afterUpdate",function(a,
+c,b){this.chart.colorAxis[0]&&this.chart.colorAxis[0].update({},b)}))})(m);(function(b){var m=b.defined,f=b.noop,t=b.seriesTypes;b.colorPointMixin={isValid:function(){return null!==this.value&&Infinity!==this.value&&-Infinity!==this.value},setVisible:function(b){var l=this,f=b?"show":"hide";l.visible=!!b;["graphic","dataLabel"].forEach(function(b){if(l[b])l[b][f]()})},setState:function(l){b.Point.prototype.setState.call(this,l);this.graphic&&this.graphic.attr({zIndex:"hover"===l?1:0})}};b.colorSeriesMixin=
+{pointArrayMap:["value"],axisTypes:["xAxis","yAxis","colorAxis"],optionalAxis:"colorAxis",trackerGroups:["group","markerGroup","dataLabelsGroup"],getSymbol:f,parallelArrays:["x","y","value"],colorKey:"value",pointAttribs:t.column.prototype.pointAttribs,translateColors:function(){var b=this,f=this.options.nullColor,m=this.colorAxis,n=this.colorKey;this.data.forEach(function(c){var g=c[n];if(g=c.options.color||(c.isNull?f:m&&void 0!==g?m.toColor(g,c):c.color||b.color))c.color=g})},colorAttribs:function(b){var f=
+{};m(b.color)&&(f[this.colorProp||"fill"]=b.color);return f}}})(m);(function(b){var m=b.colorPointMixin,f=b.merge,t=b.noop,l=b.pick,p=b.Series,q=b.seriesType,n=b.seriesTypes;q("heatmap","scatter",{animation:!1,borderWidth:0,nullColor:"#f7f7f7",dataLabels:{formatter:function(){return this.point.value},inside:!0,verticalAlign:"middle",crop:!1,overflow:!1,padding:0},marker:null,pointRange:null,tooltip:{pointFormat:"{point.x}, {point.y}: {point.value}\x3cbr/\x3e"},states:{hover:{halo:!1,brightness:.2}}},
+f(b.colorSeriesMixin,{pointArrayMap:["y","value"],hasPointSpecificOptions:!0,getExtremesFromAll:!0,directTouch:!0,init:function(){var b;n.scatter.prototype.init.apply(this,arguments);b=this.options;b.pointRange=l(b.pointRange,b.colsize||1);this.yAxis.axisPointRange=b.rowsize||1},translate:function(){var b=this.options,g=this.xAxis,f=this.yAxis,m=b.pointPadding||0,n=function(a,b,c){return Math.min(Math.max(b,a),c)};this.generatePoints();this.points.forEach(function(a){var c=(b.colsize||1)/2,e=(b.rowsize||
+1)/2,h=n(Math.round(g.len-g.translate(a.x-c,0,1,0,1)),-g.len,2*g.len),c=n(Math.round(g.len-g.translate(a.x+c,0,1,0,1)),-g.len,2*g.len),k=n(Math.round(f.translate(a.y-e,0,1,0,1)),-f.len,2*f.len),e=n(Math.round(f.translate(a.y+e,0,1,0,1)),-f.len,2*f.len),p=l(a.pointPadding,m);a.plotX=a.clientX=(h+c)/2;a.plotY=(k+e)/2;a.shapeType="rect";a.shapeArgs={x:Math.min(h,c)+p,y:Math.min(k,e)+p,width:Math.abs(c-h)-2*p,height:Math.abs(e-k)-2*p}});this.translateColors()},drawPoints:function(){var b=this.chart.styledMode?
+"css":"attr";n.column.prototype.drawPoints.call(this);this.points.forEach(function(c){c.graphic[b](this.colorAttribs(c))},this)},animate:t,getBox:t,drawLegendSymbol:b.LegendSymbolMixin.drawRectangle,alignDataLabel:n.column.prototype.alignDataLabel,getExtremes:function(){p.prototype.getExtremes.call(this,this.valueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;p.prototype.getExtremes.call(this)}}),b.extend({haloPath:function(b){if(!b)return[];var c=this.shapeArgs;return["M",c.x-b,c.y-
+b,"L",c.x-b,c.y+c.height+b,c.x+c.width+b,c.y+c.height+b,c.x+c.width+b,c.y-b,"Z"]}},m))})(m)});
+//# sourceMappingURL=heatmap.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+
+ (c) 2014-2018 Highsoft AS
+ Authors: Jon Arild Nygard / Oystein Moseng
+
+ License: www.highcharts.com/license
+*/
+(function(p){"object"===typeof module&&module.exports?module.exports=p:"function"===typeof define&&define.amd?define(function(){return p}):p("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(p){var C=function(b){var y=b.extend,p=b.isArray,g=b.isObject,u=b.isNumber,B=b.merge,z=b.pick;return{getColor:function(q,l){var v=l.index,m=l.mapOptionsToLevel,g=l.parentColor,w=l.parentColorIndex,n=l.series,e=l.colors,y=l.siblings,h=n.points,u=n.chart.options.chart,A,p,a,c;if(q){h=h[q.i];q=m[q.level]||
+{};if(m=h&&q.colorByPoint)p=h.index%(e?e.length:u.colorCount),A=e&&e[p];if(!n.chart.styledMode){e=h&&h.options.color;u=q&&q.color;if(a=g)a=(a=q&&q.colorVariation)&&"brightness"===a.key?b.color(g).brighten(v/y*a.to).get():g;a=z(e,u,A,a,n.color)}c=z(h&&h.options.colorIndex,q&&q.colorIndex,p,w,l.colorIndex)}return{color:a,colorIndex:c}},getLevelOptions:function(b){var l=null,v,m,q,w;if(g(b))for(l={},q=u(b.from)?b.from:1,w=b.levels,m={},v=g(b.defaults)?b.defaults:{},p(w)&&(m=w.reduce(function(b,e){var l,
+h;g(e)&&u(e.level)&&(h=B({},e),l="boolean"===typeof h.levelIsConstant?h.levelIsConstant:v.levelIsConstant,delete h.levelIsConstant,delete h.level,e=e.level+(l?0:q-1),g(b[e])?y(b[e],h):b[e]=h);return b},{})),w=u(b.to)?b.to:1,b=0;b<=w;b++)l[b]=B({},v,g(m[b])?m[b]:{});return l},setTreeValues:function l(b,m){var g=m.before,v=m.idRoot,n=m.mapIdToNode[v],e=m.points[b.i],u=e&&e.options||{},h=0,p=[];y(b,{levelDynamic:b.level-(("boolean"===typeof m.levelIsConstant?m.levelIsConstant:1)?0:n.level),name:z(e&&
+e.name,""),visible:v===b.id||("boolean"===typeof m.visible?m.visible:!1)});"function"===typeof g&&(b=g(b,m));b.children.forEach(function(e,g){var a=y({},m);y(a,{index:g,siblings:b.children.length,visible:b.visible});e=l(e,a);p.push(e);e.visible&&(h+=e.val)});b.visible=0<h||b.visible;g=z(u.value,h);y(b,{children:p,childrenTotal:h,isLeaf:b.visible&&!h,val:g});return b},updateRootId:function(b){var l;g(b)&&(l=g(b.options)?b.options:{},l=z(b.rootNode,l.rootId,""),g(b.userOptions)&&(b.userOptions.rootId=
+l),b.rootNode=l);return l}}}(p);(function(b,p){var y=b.seriesType,g=b.seriesTypes,u=b.merge,B=b.extend,z=b.noop,q=p.getColor,l=p.getLevelOptions,v=b.isArray,m=b.isNumber,C=b.isObject,w=b.isString,n=b.pick,e=b.Series,E=b.stableSort,h=b.Color,F=function(a,c,d){d=d||this;b.objectEach(a,function(b,f){c.call(d,b,f,a)})},A=function(a,c,d){d=d||this;a=c.call(d,a);!1!==a&&A(a,c,d)},G=p.updateRootId;y("treemap","scatter",{showInLegend:!1,marker:!1,colorByPoint:!1,dataLabels:{enabled:!0,defer:!1,verticalAlign:"middle",
+formatter:function(){var a=this&&this.point?this.point:{};return w(a.name)?a.name:""},inside:!0},tooltip:{headerFormat:"",pointFormat:"\x3cb\x3e{point.name}\x3c/b\x3e: {point.value}\x3cbr/\x3e"},ignoreHiddenPoint:!0,layoutAlgorithm:"sliceAndDice",layoutStartingDirection:"vertical",alternateStartingDirection:!1,levelIsConstant:!0,drillUpButton:{position:{align:"right",x:-10,y:10}},borderColor:"#e6e6e6",borderWidth:1,opacity:.15,states:{hover:{borderColor:"#999999",brightness:g.heatmap?0:.1,halo:!1,
+opacity:.75,shadow:!1}}},{pointArrayMap:["value"],directTouch:!0,optionalAxis:"colorAxis",getSymbol:z,parallelArrays:["x","y","value","colorValue"],colorKey:"colorValue",trackerGroups:["group","dataLabelsGroup"],getListOfParents:function(a,c){a=v(a)?a:[];var d=v(c)?c:[];c=a.reduce(function(a,c,d){c=n(c.parent,"");void 0===a[c]&&(a[c]=[]);a[c].push(d);return a},{"":[]});F(c,function(a,c,b){""!==c&&-1===d.indexOf(c)&&(a.forEach(function(a){b[""].push(a)}),delete b[c])});return c},getTree:function(){var a=
+this.data.map(function(a){return a.id}),a=this.getListOfParents(this.data,a);this.nodeMap=[];return this.buildNode("",-1,0,a,null)},init:function(a,c){var d=b.colorSeriesMixin;b.colorSeriesMixin&&(this.translateColors=d.translateColors,this.colorAttribs=d.colorAttribs,this.axisTypes=d.axisTypes);e.prototype.init.call(this,a,c);this.options.allowDrillToNode&&b.addEvent(this,"click",this.onClickDrillToNode)},buildNode:function(a,c,d,b,f){var t=this,x=[],k=t.points[c],D=0,e;(b[a]||[]).forEach(function(c){e=
+t.buildNode(t.points[c].id,c,d+1,b,a);D=Math.max(e.height+1,D);x.push(e)});c={id:a,i:c,children:x,height:D,level:d,parent:f,visible:!1};t.nodeMap[c.id]=c;k&&(k.node=c);return c},setTreeValues:function(a){var c=this,d=c.options,b=c.nodeMap[c.rootNode],d="boolean"===typeof d.levelIsConstant?d.levelIsConstant:!0,f=0,r=[],x,k=c.points[a.i];a.children.forEach(function(a){a=c.setTreeValues(a);r.push(a);a.ignore||(f+=a.val)});E(r,function(a,c){return a.sortIndex-c.sortIndex});x=n(k&&k.options.value,f);k&&
+(k.value=x);B(a,{children:r,childrenTotal:f,ignore:!(n(k&&k.visible,!0)&&0<x),isLeaf:a.visible&&!f,levelDynamic:a.level-(d?0:b.level),name:n(k&&k.name,""),sortIndex:n(k&&k.sortIndex,-x),val:x});return a},calculateChildrenAreas:function(a,c){var d=this,b=d.options,f=d.mapOptionsToLevel[a.level+1],r=n(d[f&&f.layoutAlgorithm]&&f.layoutAlgorithm,b.layoutAlgorithm),x=b.alternateStartingDirection,k=[];a=a.children.filter(function(a){return!a.ignore});f&&f.layoutStartingDirection&&(c.direction="vertical"===
+f.layoutStartingDirection?0:1);k=d[r](c,a);a.forEach(function(a,b){b=k[b];a.values=u(b,{val:a.childrenTotal,direction:x?1-c.direction:c.direction});a.pointValues=u(b,{x:b.x/d.axisRatio,width:b.width/d.axisRatio});a.children.length&&d.calculateChildrenAreas(a,a.values)})},setPointValues:function(){var a=this,c=a.xAxis,d=a.yAxis;a.points.forEach(function(b){var f=b.node,r=f.pointValues,t,k,e=0;a.chart.styledMode||(e=(a.pointAttribs(b)["stroke-width"]||0)%2/2);r&&f.visible?(f=Math.round(c.translate(r.x,
+0,0,0,1))-e,t=Math.round(c.translate(r.x+r.width,0,0,0,1))-e,k=Math.round(d.translate(r.y,0,0,0,1))-e,r=Math.round(d.translate(r.y+r.height,0,0,0,1))-e,b.shapeType="rect",b.shapeArgs={x:Math.min(f,t),y:Math.min(k,r),width:Math.abs(t-f),height:Math.abs(r-k)},b.plotX=b.shapeArgs.x+b.shapeArgs.width/2,b.plotY=b.shapeArgs.y+b.shapeArgs.height/2):(delete b.plotX,delete b.plotY)})},setColorRecursive:function(a,c,d,b,f){var r=this,t=r&&r.chart,t=t&&t.options&&t.options.colors,k;if(a){k=q(a,{colors:t,index:b,
+mapOptionsToLevel:r.mapOptionsToLevel,parentColor:c,parentColorIndex:d,series:r,siblings:f});if(c=r.points[a.i])c.color=k.color,c.colorIndex=k.colorIndex;(a.children||[]).forEach(function(c,d){r.setColorRecursive(c,k.color,k.colorIndex,d,a.children.length)})}},algorithmGroup:function(a,c,d,b){this.height=a;this.width=c;this.plot=b;this.startDirection=this.direction=d;this.lH=this.nH=this.lW=this.nW=this.total=0;this.elArr=[];this.lP={total:0,lH:0,nH:0,lW:0,nW:0,nR:0,lR:0,aspectRatio:function(a,c){return Math.max(a/
+c,c/a)}};this.addElement=function(a){this.lP.total=this.elArr[this.elArr.length-1];this.total+=a;0===this.direction?(this.lW=this.nW,this.lP.lH=this.lP.total/this.lW,this.lP.lR=this.lP.aspectRatio(this.lW,this.lP.lH),this.nW=this.total/this.height,this.lP.nH=this.lP.total/this.nW,this.lP.nR=this.lP.aspectRatio(this.nW,this.lP.nH)):(this.lH=this.nH,this.lP.lW=this.lP.total/this.lH,this.lP.lR=this.lP.aspectRatio(this.lP.lW,this.lH),this.nH=this.total/this.width,this.lP.nW=this.lP.total/this.nH,this.lP.nR=
+this.lP.aspectRatio(this.lP.nW,this.nH));this.elArr.push(a)};this.reset=function(){this.lW=this.nW=0;this.elArr=[];this.total=0}},algorithmCalcPoints:function(a,c,d,b){var f,t,e,k,l=d.lW,h=d.lH,g=d.plot,m,p=0,n=d.elArr.length-1;c?(l=d.nW,h=d.nH):m=d.elArr[d.elArr.length-1];d.elArr.forEach(function(a){if(c||p<n)0===d.direction?(f=g.x,t=g.y,e=l,k=a/e):(f=g.x,t=g.y,k=h,e=a/k),b.push({x:f,y:t,width:e,height:k}),0===d.direction?g.y+=k:g.x+=e;p+=1});d.reset();0===d.direction?d.width-=l:d.height-=h;g.y=
+g.parent.y+(g.parent.height-d.height);g.x=g.parent.x+(g.parent.width-d.width);a&&(d.direction=1-d.direction);c||d.addElement(m)},algorithmLowAspectRatio:function(a,c,d){var b=[],f=this,e,g={x:c.x,y:c.y,parent:c},k=0,l=d.length-1,h=new this.algorithmGroup(c.height,c.width,c.direction,g);d.forEach(function(d){e=d.val/c.val*c.height*c.width;h.addElement(e);h.lP.nR>h.lP.lR&&f.algorithmCalcPoints(a,!1,h,b,g);k===l&&f.algorithmCalcPoints(a,!0,h,b,g);k+=1});return b},algorithmFill:function(a,c,d){var b=
+[],f,e=c.direction,g=c.x,k=c.y,h=c.width,l=c.height,m,p,n,q;d.forEach(function(d){f=d.val/c.val*c.height*c.width;m=g;p=k;0===e?(q=l,n=f/q,h-=n,g+=n):(n=h,q=f/n,l-=q,k+=q);b.push({x:m,y:p,width:n,height:q});a&&(e=1-e)});return b},strip:function(a,c){return this.algorithmLowAspectRatio(!1,a,c)},squarified:function(a,c){return this.algorithmLowAspectRatio(!0,a,c)},sliceAndDice:function(a,c){return this.algorithmFill(!0,a,c)},stripes:function(a,c){return this.algorithmFill(!1,a,c)},translate:function(){var a=
+this,c=a.options,d=G(a),b,f;e.prototype.translate.call(a);f=a.tree=a.getTree();b=a.nodeMap[d];a.mapOptionsToLevel=l({from:b.level+1,levels:c.levels,to:f.height,defaults:{levelIsConstant:a.options.levelIsConstant,colorByPoint:c.colorByPoint}});""===d||b&&b.children.length||(a.drillToNode("",!1),d=a.rootNode,b=a.nodeMap[d]);A(a.nodeMap[a.rootNode],function(c){var b=!1,d=c.parent;c.visible=!0;if(d||""===d)b=a.nodeMap[d];return b});A(a.nodeMap[a.rootNode].children,function(a){var c=!1;a.forEach(function(a){a.visible=
+!0;a.children.length&&(c=(c||[]).concat(a.children))});return c});a.setTreeValues(f);a.axisRatio=a.xAxis.len/a.yAxis.len;a.nodeMap[""].pointValues=d={x:0,y:0,width:100,height:100};a.nodeMap[""].values=d=u(d,{width:d.width*a.axisRatio,direction:"vertical"===c.layoutStartingDirection?0:1,val:f.val});a.calculateChildrenAreas(f,d);a.colorAxis?a.translateColors():c.colorByPoint||a.setColorRecursive(a.tree);c.allowDrillToNode&&(c=b.pointValues,a.xAxis.setExtremes(c.x,c.x+c.width,!1),a.yAxis.setExtremes(c.y,
+c.y+c.height,!1),a.xAxis.setScale(),a.yAxis.setScale());a.setPointValues()},drawDataLabels:function(){var a=this,c=a.mapOptionsToLevel,d,b;a.points.filter(function(a){return a.node.visible}).forEach(function(f){b=c[f.node.level];d={style:{}};f.node.isLeaf||(d.enabled=!1);b&&b.dataLabels&&(d=u(d,b.dataLabels),a._hasPointLabels=!0);f.shapeArgs&&(d.style.width=f.shapeArgs.width,f.dataLabel&&f.dataLabel.css({width:f.shapeArgs.width+"px"}));f.dlOptions=u(d,f.options.dataLabels)});e.prototype.drawDataLabels.call(this)},
+alignDataLabel:function(a){g.column.prototype.alignDataLabel.apply(this,arguments);a.dataLabel&&a.dataLabel.attr({zIndex:(a.node.zIndex||0)+1})},pointAttribs:function(a,c){var b=C(this.mapOptionsToLevel)?this.mapOptionsToLevel:{},e=a&&b[a.node.level]||{},b=this.options,f=c&&b.states[c]||{},g=a&&a.getClassName()||"";a={stroke:a&&a.borderColor||e.borderColor||f.borderColor||b.borderColor,"stroke-width":n(a&&a.borderWidth,e.borderWidth,f.borderWidth,b.borderWidth),dashstyle:a&&a.borderDashStyle||e.borderDashStyle||
+f.borderDashStyle||b.borderDashStyle,fill:a&&a.color||this.color};-1!==g.indexOf("highcharts-above-level")?(a.fill="none",a["stroke-width"]=0):-1!==g.indexOf("highcharts-internal-node-interactive")?(c=n(f.opacity,b.opacity),a.fill=h(a.fill).setOpacity(c).get(),a.cursor="pointer"):-1!==g.indexOf("highcharts-internal-node")?a.fill="none":c&&(a.fill=h(a.fill).brighten(f.brightness).get());return a},drawPoints:function(){var a=this,c=a.points.filter(function(a){return a.node.visible});c.forEach(function(c){var b=
+"level-group-"+c.node.levelDynamic;a[b]||(a[b]=a.chart.renderer.g(b).attr({zIndex:1E3-c.node.levelDynamic}).add(a.group));c.group=a[b]});g.column.prototype.drawPoints.call(this);this.colorAttribs&&a.chart.styledMode&&this.points.forEach(function(a){a.graphic&&a.graphic.css(this.colorAttribs(a))},this);a.options.allowDrillToNode&&c.forEach(function(c){c.graphic&&(c.drillId=a.options.interactByLeaf?a.drillToByLeaf(c):a.drillToByGroup(c))})},onClickDrillToNode:function(a){var c=(a=a.point)&&a.drillId;
+w(c)&&(a.setState(""),this.drillToNode(c))},drillToByGroup:function(a){var c=!1;1!==a.node.level-this.nodeMap[this.rootNode].level||a.node.isLeaf||(c=a.id);return c},drillToByLeaf:function(a){var c=!1;if(a.node.parent!==this.rootNode&&a.node.isLeaf)for(a=a.node;!c;)a=this.nodeMap[a.parent],a.parent===this.rootNode&&(c=a.id);return c},drillUp:function(){var a=this.nodeMap[this.rootNode];a&&w(a.parent)&&this.drillToNode(a.parent)},drillToNode:function(a,c){var b=this.nodeMap[a];this.idPreviousRoot=
+this.rootNode;this.rootNode=a;""===a?this.drillUpButton=this.drillUpButton.destroy():this.showDrillUpButton(b&&b.name||a);this.isDirty=!0;n(c,!0)&&this.chart.redraw()},showDrillUpButton:function(a){var c=this;a=a||"\x3c Back";var b=c.options.drillUpButton,e,f;b.text&&(a=b.text);this.drillUpButton?(this.drillUpButton.placed=!1,this.drillUpButton.attr({text:a}).align()):(f=(e=b.theme)&&e.states,this.drillUpButton=this.chart.renderer.button(a,null,null,function(){c.drillUp()},e,f&&f.hover,f&&f.select).addClass("highcharts-drillup-button").attr({align:b.position.align,
+zIndex:7}).add().align(b.position,!1,b.relativeTo||"plotBox"))},buildKDTree:z,drawLegendSymbol:b.LegendSymbolMixin.drawRectangle,getExtremes:function(){e.prototype.getExtremes.call(this,this.colorValueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;e.prototype.getExtremes.call(this)},getExtremesFromAll:!0,bindAxes:function(){var a={endOnTick:!1,gridLineWidth:0,lineWidth:0,min:0,dataMin:0,minPadding:0,max:100,dataMax:100,maxPadding:0,startOnTick:!1,title:null,tickPositions:[]};e.prototype.bindAxes.call(this);
+b.extend(this.yAxis.options,a);b.extend(this.xAxis.options,a)},utils:{recursive:A}},{getClassName:function(){var a=b.Point.prototype.getClassName.call(this),c=this.series,d=c.options;this.node.level<=c.nodeMap[c.rootNode].level?a+=" highcharts-above-level":this.node.isLeaf||n(d.interactByLeaf,!d.allowDrillToNode)?this.node.isLeaf||(a+=" highcharts-internal-node"):a+=" highcharts-internal-node-interactive";return a},isValid:function(){return this.id||m(this.value)},setState:function(a){b.Point.prototype.setState.call(this,
+a);this.graphic&&this.graphic.attr({zIndex:"hover"===a?1:0})},setVisible:g.pie.prototype.pointClass.prototype.setVisible})})(p,C)});
+//# sourceMappingURL=treemap.js.map
+</script>
+<script>/*
+  Highcharts JS v7.0.1 (2018-12-19)
+ Sankey diagram module
+
+ (c) 2010-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(g){"object"===typeof module&&module.exports?module.exports=g:"function"===typeof define&&define.amd?define(function(){return g}):g("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(g){(function(c){c.NodesMixin={createNode:function(g){function r(b,a){return c.find(b,function(b){return b.id===a})}var d=r(this.nodes,g),k=this.pointClass,b;d||(b=this.options.nodes&&r(this.options.nodes,g),d=(new k).init(this,c.extend({className:"highcharts-node",isNode:!0,id:g,y:1},b)),d.linksTo=
+[],d.linksFrom=[],d.formatPrefix="node",d.name=d.name||d.options.id,d.getSum=function(){var b=0,a=0;d.linksTo.forEach(function(a){b+=a.weight});d.linksFrom.forEach(function(b){a+=b.weight});return Math.max(b,a)},d.offset=function(b,a){for(var e=0,f=0;f<d[a].length;f++){if(d[a][f]===b)return e;e+=d[a][f].weight}},d.hasShape=function(){var b=0;d.linksTo.forEach(function(a){a.outgoing&&b++});return!d.linksTo.length||b!==d.linksTo.length},this.nodes.push(d));return d}}})(g);(function(c){var g=c.defined,
+r=c.seriesType,d=c.pick,k=c.Point;r("sankey","column",{colorByPoint:!0,curveFactor:.33,dataLabels:{enabled:!0,backgroundColor:"none",crop:!1,nodeFormat:void 0,nodeFormatter:function(){return this.point.name},format:void 0,formatter:function(){return""},inside:!0},linkOpacity:.5,nodeWidth:20,nodePadding:10,showInLegend:!1,states:{hover:{linkOpacity:1}},tooltip:{followPointer:!0,headerFormat:'\x3cspan style\x3d"font-size: 10px"\x3e{series.name}\x3c/span\x3e\x3cbr/\x3e',pointFormat:"{point.fromNode.name} \u2192 {point.toNode.name}: \x3cb\x3e{point.weight}\x3c/b\x3e\x3cbr/\x3e",
+nodeFormat:"{point.name}: \x3cb\x3e{point.sum}\x3c/b\x3e\x3cbr/\x3e"}},{isCartesian:!1,forceDL:!0,createNode:c.NodesMixin.createNode,createNodeColumn:function(){var b=this.chart,e=[],a=this.options.nodePadding;e.sum=function(){var a=0;this.forEach(function(b){a+=b.getSum()});return a};e.offset=function(b,d){for(var f=0,c=0;c<e.length;c++){if(e[c]===b)return f+(b.options.offset||0);f+=e[c].getSum()*d+a}};e.top=function(d){for(var f=0,c=0;c<e.length;c++)0<c&&(f+=a),f+=e[c].getSum()*d;return(b.plotSizeY-
+f)/2};return e},createNodeColumns:function(){var b=[];this.nodes.forEach(function(a){var e=-1,d,g;if(!c.defined(a.options.column))if(0===a.linksTo.length)a.column=0;else{for(d=0;d<a.linksTo.length;d++)g=a.linksTo[0],g.fromNode.column>e&&(e=g.fromNode.column);a.column=e+1}b[a.column]||(b[a.column]=this.createNodeColumn());b[a.column].push(a)},this);for(var e=0;e<b.length;e++)void 0===b[e]&&(b[e]=this.createNodeColumn());return b},pointAttribs:function(b,e){var a=this.options.linkOpacity,d=b.color;
+e&&(a=this.options.states[e].linkOpacity||a,d=this.options.states[e].color||b.color);return{fill:b.isNode?d:c.color(d).setOpacity(a).get()}},generatePoints:function(){var b={},e=this.chart;c.Series.prototype.generatePoints.call(this);this.nodes||(this.nodes=[]);this.colorCounter=0;this.nodes.forEach(function(a){a.linksFrom.length=0;a.linksTo.length=0});this.points.forEach(function(a){g(a.from)&&(b[a.from]||(b[a.from]=this.createNode(a.from)),b[a.from].linksFrom.push(a),a.fromNode=b[a.from],e.styledMode?
+a.colorIndex=d(a.options.colorIndex,b[a.from].colorIndex):a.color=a.options.color||b[a.from].color);g(a.to)&&(b[a.to]||(b[a.to]=this.createNode(a.to)),b[a.to].linksTo.push(a),a.toNode=b[a.to]);a.name=a.name||a.options.id},this)},translate:function(){this.processedXData||this.processData();this.generatePoints();this.nodeColumns=this.createNodeColumns();var b=this.chart,d=b.inverted,a=this.options,c=0,g=a.nodeWidth,r=this.nodeColumns,A=(b.plotSizeX-g)/(r.length-1),B=(d?-A:A)*a.curveFactor,m=Infinity;
+this.nodeColumns.forEach(function(d){m=Math.min(m,(b.plotSizeY-(d.length-1)*a.nodePadding)/d.sum())});this.nodeColumns.forEach(function(a){a.forEach(function(e){var f=e.getSum(),k=f*m,E=a.top(m)+a.offset(e,m),l=d?b.plotSizeX-c:c;e.sum=f;e.shapeType="rect";e.shapeArgs=d?{x:l-g,y:b.plotSizeY-E-k,width:g,height:k}:{x:l,y:E,width:g,height:k};e.shapeArgs.display=e.hasShape()?"":"none";e.plotY=1;e.linksFrom.forEach(function(a){var c=a.weight*m,f=e.offset(a,"linksFrom")*m,f=E+f,h=a.toNode,n=r[h.column].top(m)+
+h.offset(a,"linksTo")*m+r[h.column].offset(h,m),p=g,h=h.column*A,k=a.outgoing,q=h>l;d&&(f=b.plotSizeY-f,n=b.plotSizeY-n,h=b.plotSizeX-h,p=-p,c=-c,q=l>h);a.shapeType="path";if(q)a.shapeArgs={d:["M",l+p,f,"C",l+p+B,f,h-B,n,h,n,"L",h+(k?p:0),n+c/2,"L",h,n+c,"C",h-B,n+c,l+p+B,f+c,l+p,f+c,"z"]};else{var k=h-20-c,q=h-20,w=h,v=l+p,u=v+20,C=u+c,H=f,x=f+c,F=x+20,y=F+(b.plotHeight-f-c),t=y+20,D=t+c,G=n,z=G+c,I=z+20,J=t+.7*c,K=w-.7*c,L=v+.7*c;a.shapeArgs={d:["M",v,H,"C",L,H,C,x-.7*c,C,F,"L",C,y,"C",C,J,L,D,
+v,D,"L",w,D,"C",K,D,k,J,k,y,"L",k,I,"C",k,z-.7*c,K,G,w,G,"L",w,z,"C",q,z,q,z,q,I,"L",q,y,"C",q,t,q,t,w,t,"L",v,t,"C",u,t,u,t,u,y,"L",u,F,"C",u,x,u,x,v,x,"z"]}}a.dlBox={x:l+(h-l+p)/2,y:f+(n-f)/2,height:c,width:0};a.y=a.plotY=1;a.color||(a.color=e.color)})});c+=A},this)},render:function(){var b=this.points;this.points=this.points.concat(this.nodes);c.seriesTypes.column.prototype.render.call(this);this.points=b},animate:c.Series.prototype.animate,destroy:function(){this.data=[].concat(this.points,this.nodes);
+c.Series.prototype.destroy.call(this)}},{getClassName:function(){return(this.isNode?"highcharts-node ":"highcharts-link ")+k.prototype.getClassName.call(this)},isValid:function(){return this.isNode||"number"===typeof this.weight}})})(g)});
+//# sourceMappingURL=sankey.js.map
+</script>
+<script>/*
+  Highcharts JS v7.0.1 (2018-12-19)
+ Solid angular gauge module
+
+ (c) 2010-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(l){"object"===typeof module&&module.exports?module.exports=l:"function"===typeof define&&define.amd?define(function(){return l}):l("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(l){(function(f){var l=f.pInt,u=f.pick,q=f.isNumber,w=f.wrap,v;w(f.Renderer.prototype.symbols,"arc",function(a,g,d,c,f,b){a=a(g,d,c,f,b);b.rounded&&(c=((b.r||c)-b.innerR)/2,b=["A",c,c,0,1,1,a[12],a[13]],a.splice.apply(a,[a.length-1,0].concat(["A",c,c,0,1,1,a[1],a[2]])),a.splice.apply(a,[11,3].concat(b)));
+return a});v={initDataClasses:function(a){var g=this.chart,d,c=0,r=this.options;this.dataClasses=d=[];a.dataClasses.forEach(function(b,h){b=f.merge(b);d.push(b);b.color||("category"===r.dataClassColor?(h=g.options.colors,b.color=h[c++],c===h.length&&(c=0)):b.color=f.color(r.minColor).tweenTo(f.color(r.maxColor),h/(a.dataClasses.length-1)))})},initStops:function(a){this.stops=a.stops||[[0,this.options.minColor],[1,this.options.maxColor]];this.stops.forEach(function(a){a.color=f.color(a[1])})},toColor:function(a,
+g){var d=this.stops,c,f,b=this.dataClasses,h,e;if(b)for(e=b.length;e--;){if(h=b[e],c=h.from,d=h.to,(void 0===c||a>=c)&&(void 0===d||a<=d)){f=h.color;g&&(g.dataClass=e);break}}else{this.isLog&&(a=this.val2lin(a));a=1-(this.max-a)/(this.max-this.min);for(e=d.length;e--&&!(a>d[e][0]););c=d[e]||d[e+1];d=d[e+1]||c;a=1-(d[0]-a)/(d[0]-c[0]||1);f=c.color.tweenTo(d.color,a)}return f}};f.seriesType("solidgauge","gauge",{colorByPoint:!0},{translate:function(){var a=this.yAxis;f.extend(a,v);!a.dataClasses&&a.options.dataClasses&&
+a.initDataClasses(a.options);a.initStops(a.options);f.seriesTypes.gauge.prototype.translate.call(this)},drawPoints:function(){var a=this,g=a.yAxis,d=g.center,c=a.options,r=a.chart.renderer,b=c.overshoot,h=q(b)?b/180*Math.PI:0,e;q(c.threshold)&&(e=g.startAngleRad+g.translate(c.threshold,null,null,null,!0));this.thresholdAngleRad=u(e,g.startAngleRad);a.points.forEach(function(b){var e=b.graphic,k=g.startAngleRad+g.translate(b.y,null,null,null,!0),t=l(u(b.options.radius,c.radius,100))*d[2]/200,m=l(u(b.options.innerRadius,
+c.innerRadius,60))*d[2]/200,n=g.toColor(b.y,b),p=Math.min(g.startAngleRad,g.endAngleRad),q=Math.max(g.startAngleRad,g.endAngleRad);"none"===n&&(n=b.color||a.color||"none");"none"!==n&&(b.color=n);k=Math.max(p-h,Math.min(q+h,k));!1===c.wrap&&(k=Math.max(p,Math.min(q,k)));p=Math.min(k,a.thresholdAngleRad);k=Math.max(k,a.thresholdAngleRad);k-p>2*Math.PI&&(k=p+2*Math.PI);b.shapeArgs=m={x:d[0],y:d[1],r:t,innerR:m,start:p,end:k,rounded:c.rounded};b.startR=t;e?(t=m.d,e.animate(f.extend({fill:n},m)),t&&(m.d=
+t)):(b.graphic=e=r.arc(m).attr({fill:n,"sweep-flag":0}).add(a.group),a.chart.styledMode||("square"!==c.linecap&&e.attr({"stroke-linecap":"round","stroke-linejoin":"round"}),e.attr({stroke:c.borderColor||"none","stroke-width":c.borderWidth||0})));e&&e.addClass(b.getClassName(),!0)})},animate:function(a){a||(this.startAngleRad=this.thresholdAngleRad,f.seriesTypes.pie.prototype.animate.call(this,a))}})})(l)});
+//# sourceMappingURL=solid-gauge.js.map
+</script>
+<script>/*
+  Highcharts JS v7.0.1 (2018-12-19)
+ Streamgraph module
+
+ (c) 2010-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(a){(function(a){a=a.seriesType;a("streamgraph","areaspline",{fillOpacity:1,lineWidth:0,marker:{enabled:!1},stacking:"stream"},{negStacks:!1,streamStacker:function(a,b,c){a[0]-=b.total/2;a[1]-=b.total/2;this.stackedYData[c]=a}})})(a)});
+//# sourceMappingURL=streamgraph.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+
+ (c) 2016-2018 Highsoft AS
+ Authors: Jon Arild Nygard
+
+ License: www.highcharts.com/license
+*/
+(function(z){"object"===typeof module&&module.exports?module.exports=z:"function"===typeof define&&define.amd?define(function(){return z}):z("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(z){var N=function(){return function(c){var w=this,k=w.graphic,h=c.animatableAttribs,n=c.onComplete,B=c.css,y=c.renderer;w.shouldDraw()?(k||(w.graphic=k=y[c.shapeType](c.shapeArgs).add(c.group)),k.css(B).attr(c.attribs).animate(h,c.isNew?!1:void 0,n)):k&&k.animate(h,void 0,function(){w.graphic=k=k.destroy();
+"function"===typeof n&&n()});k&&k.addClass(w.getClassName(),!0)}}(),K=function(c){var w=c.extend,k=c.isArray,h=c.isObject,n=c.isNumber,B=c.merge,y=c.pick;return{getColor:function(t,l){var D=l.index,f=l.mapOptionsToLevel,h=l.parentColor,k=l.parentColorIndex,x=l.series,C=l.colors,w=l.siblings,p=x.points,n=x.chart.options.chart,E,B,a,b;if(t){p=p[t.i];t=f[t.level]||{};if(f=p&&t.colorByPoint)B=p.index%(C?C.length:n.colorCount),E=C&&C[B];if(!x.chart.styledMode){C=p&&p.options.color;n=t&&t.color;if(a=h)a=
+(a=t&&t.colorVariation)&&"brightness"===a.key?c.color(h).brighten(D/w*a.to).get():h;a=y(C,n,E,a,x.color)}b=y(p&&p.options.colorIndex,t&&t.colorIndex,B,k,l.colorIndex)}return{color:a,colorIndex:b}},getLevelOptions:function(c){var l=null,D,f,F,t;if(h(c))for(l={},F=n(c.from)?c.from:1,t=c.levels,f={},D=h(c.defaults)?c.defaults:{},k(t)&&(f=t.reduce(function(c,f){var l,p;h(f)&&n(f.level)&&(p=B({},f),l="boolean"===typeof p.levelIsConstant?p.levelIsConstant:D.levelIsConstant,delete p.levelIsConstant,delete p.level,
+f=f.level+(l?0:F-1),h(c[f])?w(c[f],p):c[f]=p);return c},{})),t=n(c.to)?c.to:1,c=0;c<=t;c++)l[c]=B({},D,h(f[c])?f[c]:{});return l},setTreeValues:function l(c,f){var h=f.before,n=f.idRoot,x=f.mapIdToNode[n],k=f.points[c.i],D=k&&k.options||{},p=0,B=[];w(c,{levelDynamic:c.level-(("boolean"===typeof f.levelIsConstant?f.levelIsConstant:1)?0:x.level),name:y(k&&k.name,""),visible:n===c.id||("boolean"===typeof f.visible?f.visible:!1)});"function"===typeof h&&(c=h(c,f));c.children.forEach(function(h,k){var a=
+w({},f);w(a,{index:k,siblings:c.children.length,visible:c.visible});h=l(h,a);B.push(h);h.visible&&(p+=h.val)});c.visible=0<p||c.visible;h=y(D.value,p);w(c,{children:B,childrenTotal:p,isLeaf:c.visible&&!p,val:h});return c},updateRootId:function(c){var k;h(c)&&(k=h(c.options)?c.options:{},k=y(c.rootNode,k.rootId,""),h(c.userOptions)&&(c.userOptions.rootId=k),c.rootNode=k);return k}}}(z);(function(c,w){var k=c.seriesType,h=c.seriesTypes,n=c.merge,B=c.extend,y=c.noop,t=w.getColor,l=w.getLevelOptions,
+D=c.isArray,f=c.isNumber,F=c.isObject,z=c.isString,x=c.pick,C=c.Series,L=c.stableSort,p=c.Color,H=function(a,b,d){d=d||this;c.objectEach(a,function(c,e){b.call(d,c,e,a)})},E=function(a,b,d){d=d||this;a=b.call(d,a);!1!==a&&E(a,b,d)},M=w.updateRootId;k("treemap","scatter",{showInLegend:!1,marker:!1,colorByPoint:!1,dataLabels:{enabled:!0,defer:!1,verticalAlign:"middle",formatter:function(){var a=this&&this.point?this.point:{};return z(a.name)?a.name:""},inside:!0},tooltip:{headerFormat:"",pointFormat:"\x3cb\x3e{point.name}\x3c/b\x3e: {point.value}\x3cbr/\x3e"},
+ignoreHiddenPoint:!0,layoutAlgorithm:"sliceAndDice",layoutStartingDirection:"vertical",alternateStartingDirection:!1,levelIsConstant:!0,drillUpButton:{position:{align:"right",x:-10,y:10}},borderColor:"#e6e6e6",borderWidth:1,opacity:.15,states:{hover:{borderColor:"#999999",brightness:h.heatmap?0:.1,halo:!1,opacity:.75,shadow:!1}}},{pointArrayMap:["value"],directTouch:!0,optionalAxis:"colorAxis",getSymbol:y,parallelArrays:["x","y","value","colorValue"],colorKey:"colorValue",trackerGroups:["group","dataLabelsGroup"],
+getListOfParents:function(a,b){a=D(a)?a:[];var d=D(b)?b:[];b=a.reduce(function(a,b,d){b=x(b.parent,"");void 0===a[b]&&(a[b]=[]);a[b].push(d);return a},{"":[]});H(b,function(a,b,c){""!==b&&-1===d.indexOf(b)&&(a.forEach(function(a){c[""].push(a)}),delete c[b])});return b},getTree:function(){var a=this.data.map(function(a){return a.id}),a=this.getListOfParents(this.data,a);this.nodeMap=[];return this.buildNode("",-1,0,a,null)},init:function(a,b){var d=c.colorSeriesMixin;c.colorSeriesMixin&&(this.translateColors=
+d.translateColors,this.colorAttribs=d.colorAttribs,this.axisTypes=d.axisTypes);C.prototype.init.call(this,a,b);this.options.allowDrillToNode&&c.addEvent(this,"click",this.onClickDrillToNode)},buildNode:function(a,b,d,c,e){var g=this,m=[],v=g.points[b],q=0,I;(c[a]||[]).forEach(function(b){I=g.buildNode(g.points[b].id,b,d+1,c,a);q=Math.max(I.height+1,q);m.push(I)});b={id:a,i:b,children:m,height:q,level:d,parent:e,visible:!1};g.nodeMap[b.id]=b;v&&(v.node=b);return b},setTreeValues:function(a){var b=
+this,d=b.options,c=b.nodeMap[b.rootNode],d="boolean"===typeof d.levelIsConstant?d.levelIsConstant:!0,e=0,g=[],m,u=b.points[a.i];a.children.forEach(function(a){a=b.setTreeValues(a);g.push(a);a.ignore||(e+=a.val)});L(g,function(a,b){return a.sortIndex-b.sortIndex});m=x(u&&u.options.value,e);u&&(u.value=m);B(a,{children:g,childrenTotal:e,ignore:!(x(u&&u.visible,!0)&&0<m),isLeaf:a.visible&&!e,levelDynamic:a.level-(d?0:c.level),name:x(u&&u.name,""),sortIndex:x(u&&u.sortIndex,-m),val:m});return a},calculateChildrenAreas:function(a,
+b){var d=this,c=d.options,e=d.mapOptionsToLevel[a.level+1],g=x(d[e&&e.layoutAlgorithm]&&e.layoutAlgorithm,c.layoutAlgorithm),m=c.alternateStartingDirection,u=[];a=a.children.filter(function(a){return!a.ignore});e&&e.layoutStartingDirection&&(b.direction="vertical"===e.layoutStartingDirection?0:1);u=d[g](b,a);a.forEach(function(a,c){c=u[c];a.values=n(c,{val:a.childrenTotal,direction:m?1-b.direction:b.direction});a.pointValues=n(c,{x:c.x/d.axisRatio,width:c.width/d.axisRatio});a.children.length&&d.calculateChildrenAreas(a,
+a.values)})},setPointValues:function(){var a=this,b=a.xAxis,d=a.yAxis;a.points.forEach(function(c){var e=c.node,g=e.pointValues,m,u,v=0;a.chart.styledMode||(v=(a.pointAttribs(c)["stroke-width"]||0)%2/2);g&&e.visible?(e=Math.round(b.translate(g.x,0,0,0,1))-v,m=Math.round(b.translate(g.x+g.width,0,0,0,1))-v,u=Math.round(d.translate(g.y,0,0,0,1))-v,g=Math.round(d.translate(g.y+g.height,0,0,0,1))-v,c.shapeType="rect",c.shapeArgs={x:Math.min(e,m),y:Math.min(u,g),width:Math.abs(m-e),height:Math.abs(g-u)},
+c.plotX=c.shapeArgs.x+c.shapeArgs.width/2,c.plotY=c.shapeArgs.y+c.shapeArgs.height/2):(delete c.plotX,delete c.plotY)})},setColorRecursive:function(a,b,d,c,e){var g=this,m=g&&g.chart,m=m&&m.options&&m.options.colors,v;if(a){v=t(a,{colors:m,index:c,mapOptionsToLevel:g.mapOptionsToLevel,parentColor:b,parentColorIndex:d,series:g,siblings:e});if(b=g.points[a.i])b.color=v.color,b.colorIndex=v.colorIndex;(a.children||[]).forEach(function(b,d){g.setColorRecursive(b,v.color,v.colorIndex,d,a.children.length)})}},
+algorithmGroup:function(a,b,d,c){this.height=a;this.width=b;this.plot=c;this.startDirection=this.direction=d;this.lH=this.nH=this.lW=this.nW=this.total=0;this.elArr=[];this.lP={total:0,lH:0,nH:0,lW:0,nW:0,nR:0,lR:0,aspectRatio:function(a,b){return Math.max(a/b,b/a)}};this.addElement=function(a){this.lP.total=this.elArr[this.elArr.length-1];this.total+=a;0===this.direction?(this.lW=this.nW,this.lP.lH=this.lP.total/this.lW,this.lP.lR=this.lP.aspectRatio(this.lW,this.lP.lH),this.nW=this.total/this.height,
+this.lP.nH=this.lP.total/this.nW,this.lP.nR=this.lP.aspectRatio(this.nW,this.lP.nH)):(this.lH=this.nH,this.lP.lW=this.lP.total/this.lH,this.lP.lR=this.lP.aspectRatio(this.lP.lW,this.lH),this.nH=this.total/this.width,this.lP.nW=this.lP.total/this.nH,this.lP.nR=this.lP.aspectRatio(this.lP.nW,this.nH));this.elArr.push(a)};this.reset=function(){this.lW=this.nW=0;this.elArr=[];this.total=0}},algorithmCalcPoints:function(a,b,d,c){var e,g,m,v,q=d.lW,f=d.lH,r=d.plot,h,k=0,p=d.elArr.length-1;b?(q=d.nW,f=d.nH):
+h=d.elArr[d.elArr.length-1];d.elArr.forEach(function(a){if(b||k<p)0===d.direction?(e=r.x,g=r.y,m=q,v=a/m):(e=r.x,g=r.y,v=f,m=a/v),c.push({x:e,y:g,width:m,height:v}),0===d.direction?r.y+=v:r.x+=m;k+=1});d.reset();0===d.direction?d.width-=q:d.height-=f;r.y=r.parent.y+(r.parent.height-d.height);r.x=r.parent.x+(r.parent.width-d.width);a&&(d.direction=1-d.direction);b||d.addElement(h)},algorithmLowAspectRatio:function(a,b,d){var c=[],e=this,g,m={x:b.x,y:b.y,parent:b},u=0,q=d.length-1,f=new this.algorithmGroup(b.height,
+b.width,b.direction,m);d.forEach(function(d){g=d.val/b.val*b.height*b.width;f.addElement(g);f.lP.nR>f.lP.lR&&e.algorithmCalcPoints(a,!1,f,c,m);u===q&&e.algorithmCalcPoints(a,!0,f,c,m);u+=1});return c},algorithmFill:function(a,b,d){var c=[],e,g=b.direction,m=b.x,u=b.y,q=b.width,f=b.height,r,h,k,p;d.forEach(function(d){e=d.val/b.val*b.height*b.width;r=m;h=u;0===g?(p=f,k=e/p,q-=k,m+=k):(k=q,p=e/k,f-=p,u+=p);c.push({x:r,y:h,width:k,height:p});a&&(g=1-g)});return c},strip:function(a,b){return this.algorithmLowAspectRatio(!1,
+a,b)},squarified:function(a,b){return this.algorithmLowAspectRatio(!0,a,b)},sliceAndDice:function(a,b){return this.algorithmFill(!0,a,b)},stripes:function(a,b){return this.algorithmFill(!1,a,b)},translate:function(){var a=this,b=a.options,d=M(a),c,e;C.prototype.translate.call(a);e=a.tree=a.getTree();c=a.nodeMap[d];a.mapOptionsToLevel=l({from:c.level+1,levels:b.levels,to:e.height,defaults:{levelIsConstant:a.options.levelIsConstant,colorByPoint:b.colorByPoint}});""===d||c&&c.children.length||(a.drillToNode("",
+!1),d=a.rootNode,c=a.nodeMap[d]);E(a.nodeMap[a.rootNode],function(b){var d=!1,c=b.parent;b.visible=!0;if(c||""===c)d=a.nodeMap[c];return d});E(a.nodeMap[a.rootNode].children,function(a){var b=!1;a.forEach(function(a){a.visible=!0;a.children.length&&(b=(b||[]).concat(a.children))});return b});a.setTreeValues(e);a.axisRatio=a.xAxis.len/a.yAxis.len;a.nodeMap[""].pointValues=d={x:0,y:0,width:100,height:100};a.nodeMap[""].values=d=n(d,{width:d.width*a.axisRatio,direction:"vertical"===b.layoutStartingDirection?
+0:1,val:e.val});a.calculateChildrenAreas(e,d);a.colorAxis?a.translateColors():b.colorByPoint||a.setColorRecursive(a.tree);b.allowDrillToNode&&(b=c.pointValues,a.xAxis.setExtremes(b.x,b.x+b.width,!1),a.yAxis.setExtremes(b.y,b.y+b.height,!1),a.xAxis.setScale(),a.yAxis.setScale());a.setPointValues()},drawDataLabels:function(){var a=this,b=a.mapOptionsToLevel,d,c;a.points.filter(function(a){return a.node.visible}).forEach(function(e){c=b[e.node.level];d={style:{}};e.node.isLeaf||(d.enabled=!1);c&&c.dataLabels&&
+(d=n(d,c.dataLabels),a._hasPointLabels=!0);e.shapeArgs&&(d.style.width=e.shapeArgs.width,e.dataLabel&&e.dataLabel.css({width:e.shapeArgs.width+"px"}));e.dlOptions=n(d,e.options.dataLabels)});C.prototype.drawDataLabels.call(this)},alignDataLabel:function(a){h.column.prototype.alignDataLabel.apply(this,arguments);a.dataLabel&&a.dataLabel.attr({zIndex:(a.node.zIndex||0)+1})},pointAttribs:function(a,b){var d=F(this.mapOptionsToLevel)?this.mapOptionsToLevel:{},c=a&&d[a.node.level]||{},d=this.options,e=
+b&&d.states[b]||{},g=a&&a.getClassName()||"";a={stroke:a&&a.borderColor||c.borderColor||e.borderColor||d.borderColor,"stroke-width":x(a&&a.borderWidth,c.borderWidth,e.borderWidth,d.borderWidth),dashstyle:a&&a.borderDashStyle||c.borderDashStyle||e.borderDashStyle||d.borderDashStyle,fill:a&&a.color||this.color};-1!==g.indexOf("highcharts-above-level")?(a.fill="none",a["stroke-width"]=0):-1!==g.indexOf("highcharts-internal-node-interactive")?(b=x(e.opacity,d.opacity),a.fill=p(a.fill).setOpacity(b).get(),
+a.cursor="pointer"):-1!==g.indexOf("highcharts-internal-node")?a.fill="none":b&&(a.fill=p(a.fill).brighten(e.brightness).get());return a},drawPoints:function(){var a=this,b=a.points.filter(function(a){return a.node.visible});b.forEach(function(b){var d="level-group-"+b.node.levelDynamic;a[d]||(a[d]=a.chart.renderer.g(d).attr({zIndex:1E3-b.node.levelDynamic}).add(a.group));b.group=a[d]});h.column.prototype.drawPoints.call(this);this.colorAttribs&&a.chart.styledMode&&this.points.forEach(function(a){a.graphic&&
+a.graphic.css(this.colorAttribs(a))},this);a.options.allowDrillToNode&&b.forEach(function(b){b.graphic&&(b.drillId=a.options.interactByLeaf?a.drillToByLeaf(b):a.drillToByGroup(b))})},onClickDrillToNode:function(a){var b=(a=a.point)&&a.drillId;z(b)&&(a.setState(""),this.drillToNode(b))},drillToByGroup:function(a){var b=!1;1!==a.node.level-this.nodeMap[this.rootNode].level||a.node.isLeaf||(b=a.id);return b},drillToByLeaf:function(a){var b=!1;if(a.node.parent!==this.rootNode&&a.node.isLeaf)for(a=a.node;!b;)a=
+this.nodeMap[a.parent],a.parent===this.rootNode&&(b=a.id);return b},drillUp:function(){var a=this.nodeMap[this.rootNode];a&&z(a.parent)&&this.drillToNode(a.parent)},drillToNode:function(a,b){var c=this.nodeMap[a];this.idPreviousRoot=this.rootNode;this.rootNode=a;""===a?this.drillUpButton=this.drillUpButton.destroy():this.showDrillUpButton(c&&c.name||a);this.isDirty=!0;x(b,!0)&&this.chart.redraw()},showDrillUpButton:function(a){var b=this;a=a||"\x3c Back";var c=b.options.drillUpButton,f,e;c.text&&
+(a=c.text);this.drillUpButton?(this.drillUpButton.placed=!1,this.drillUpButton.attr({text:a}).align()):(e=(f=c.theme)&&f.states,this.drillUpButton=this.chart.renderer.button(a,null,null,function(){b.drillUp()},f,e&&e.hover,e&&e.select).addClass("highcharts-drillup-button").attr({align:c.position.align,zIndex:7}).add().align(c.position,!1,c.relativeTo||"plotBox"))},buildKDTree:y,drawLegendSymbol:c.LegendSymbolMixin.drawRectangle,getExtremes:function(){C.prototype.getExtremes.call(this,this.colorValueData);
+this.valueMin=this.dataMin;this.valueMax=this.dataMax;C.prototype.getExtremes.call(this)},getExtremesFromAll:!0,bindAxes:function(){var a={endOnTick:!1,gridLineWidth:0,lineWidth:0,min:0,dataMin:0,minPadding:0,max:100,dataMax:100,maxPadding:0,startOnTick:!1,title:null,tickPositions:[]};C.prototype.bindAxes.call(this);c.extend(this.yAxis.options,a);c.extend(this.xAxis.options,a)},utils:{recursive:E}},{getClassName:function(){var a=c.Point.prototype.getClassName.call(this),b=this.series,d=b.options;
+this.node.level<=b.nodeMap[b.rootNode].level?a+=" highcharts-above-level":this.node.isLeaf||x(d.interactByLeaf,!d.allowDrillToNode)?this.node.isLeaf||(a+=" highcharts-internal-node"):a+=" highcharts-internal-node-interactive";return a},isValid:function(){return this.id||f(this.value)},setState:function(a){c.Point.prototype.setState.call(this,a);this.graphic&&this.graphic.attr({zIndex:"hover"===a?1:0})},setVisible:h.pie.prototype.pointClass.prototype.setVisible})})(z,K);(function(c,w,k){var h=c.CenteredSeriesMixin,
+n=c.Series,B=c.extend,y=h.getCenter,t=k.getColor,l=k.getLevelOptions,D=h.getStartAndEndRadians,f=c.isNumber,z=c.isObject,K=c.isString,x=c.merge,C=180/Math.PI,h=c.seriesType,L=k.setTreeValues,p=k.updateRootId,H=function(a,b){var c=[];if(f(a)&&f(b)&&a<=b)for(;a<=b;a++)c.push(a);return c},E=function(a,b){var c;b=z(b)?b:{};var k=0,e,g,m,u;z(a)&&(c=x({},a),a=f(b.from)?b.from:0,u=f(b.to)?b.to:0,g=H(a,u),a=Object.keys(c).filter(function(a){return-1===g.indexOf(+a)}),e=m=f(b.diffRadius)?b.diffRadius:0,g.forEach(function(a){a=
+c[a];var b=a.levelSize.unit,d=a.levelSize.value;"weight"===b?k+=d:"percentage"===b?(a.levelSize={unit:"pixels",value:d/100*e},m-=a.levelSize.value):"pixels"===b&&(m-=d)}),g.forEach(function(a){var b=c[a];"weight"===b.levelSize.unit&&(b=b.levelSize.value,c[a].levelSize={unit:"pixels",value:b/k*m})}),a.forEach(function(a){c[a].levelSize={value:0,unit:"pixels"}}));return c},M=function(a,b){var c=b.mapIdToNode[a.parent],f=b.series,e=f.chart,g=f.points[a.i],c=t(a,{colors:e&&e.options&&e.options.colors,
+colorIndex:f.colorIndex,index:b.index,mapOptionsToLevel:b.mapOptionsToLevel,parentColor:c&&c.color,parentColorIndex:c&&c.colorIndex,series:b.series,siblings:b.siblings});a.color=c.color;a.colorIndex=c.colorIndex;g&&(g.color=a.color,g.colorIndex=a.colorIndex,a.sliced=a.id!==b.idRoot?g.sliced:!1);return a};h("sunburst","treemap",{center:["50%","50%"],colorByPoint:!1,dataLabels:{allowOverlap:!0,defer:!0,style:{textOverflow:"ellipsis"},rotationMode:"auto"},rootId:void 0,levelIsConstant:!0,levelSize:{value:1,
+unit:"weight"},slicedOffset:10},{drawDataLabels:c.noop,drawPoints:function(){var a=this,b=a.mapOptionsToLevel,c=a.shapeRoot,k=a.group,e=a.hasRendered,g=a.rootNode,m=a.idPreviousRoot,u=a.nodeMap,h=u[m],p=h&&h.shapeArgs,h=a.points,r=a.startAndEndRadians,t=a.chart,l=t&&t.options&&t.options.chart||{},w="boolean"===typeof l.animation?l.animation:!0,y=a.center[3]/2,D=a.chart.renderer,E,F=!1,H=!1;if(l=!!(w&&e&&g!==m&&a.dataLabelsGroup))a.dataLabelsGroup.attr({opacity:0}),E=function(){F=!0;a.dataLabelsGroup&&
+a.dataLabelsGroup.animate({opacity:1,visibility:"visible"})};h.forEach(function(d){var h,v,q=d.node,l=b[q.level];h=d.shapeExisting||{};var n=q.shapeArgs||{},I,F=!(!q.visible||!q.shapeArgs);if(e&&w){var J={};v={end:n.end,start:n.start,innerR:n.innerR,r:n.r,x:n.x,y:n.y};F?!d.graphic&&p&&(J=g===d.id?{start:r.start,end:r.end}:p.end<=n.start?{start:r.end,end:r.end}:{start:r.start,end:r.start},J.innerR=J.r=y):d.graphic&&(m===d.id?v={innerR:y,r:y}:c&&(v=c.end<=h.start?{innerR:y,r:y,start:r.end,end:r.end}:
+{innerR:y,r:y,start:r.start,end:r.start}));h=J}else v=n,h={};var J=[n.plotX,n.plotY],A;d.node.isLeaf||(g===d.id?(A=u[g],A=A.parent):A=d.id);B(d,{shapeExisting:n,tooltipPos:J,drillId:A,name:""+(d.name||d.id||d.index),plotX:n.plotX,plotY:n.plotY,value:q.val,isNull:!F});A=d.options;q=z(n)?n:{};A=z(A)?A.dataLabels:{};var l=z(l)?l.dataLabels:{},l=x({style:{}},l,A),G;A=l.rotationMode;f(l.rotation)||("auto"===A&&(1>d.innerArcLength&&d.outerArcLength>q.radius?G=0:A=1<d.innerArcLength&&d.outerArcLength>1.5*
+q.radius?"parallel":"perpendicular"),"auto"!==A&&(G=q.end-(q.end-q.start)/2),l.style.width="parallel"===A?Math.min(2.5*q.radius,(d.outerArcLength+d.innerArcLength)/2):q.radius,"perpendicular"===A&&d.series.chart.renderer.fontMetrics(l.style.fontSize).h>d.outerArcLength&&(l.style.width=1),l.style.width=Math.max(l.style.width-2*(l.padding||0),1),G=G*C%180,"parallel"===A&&(G-=90),90<G?G-=180:-90>G&&(G+=180),l.rotation=G);0===l.rotation&&(l.rotation=.001);d.dlOptions=l;!H&&F&&(H=!0,I=E);d.draw({animatableAttribs:v,
+attribs:B(h,!t.styledMode&&a.pointAttribs(d,d.selected&&"select")),onComplete:I,group:k,renderer:D,shapeType:"arc",shapeArgs:n})});l&&H?(a.hasRendered=!1,a.options.dataLabels.defer=!0,n.prototype.drawDataLabels.call(a),a.hasRendered=!0,F&&E()):n.prototype.drawDataLabels.call(a)},pointAttribs:c.seriesTypes.column.prototype.pointAttribs,layoutAlgorithm:function(a,b,c){var d=a.start,e=a.end-d,g=a.val,m=a.x,h=a.y,k=c&&z(c.levelSize)&&f(c.levelSize.value)?c.levelSize.value:0,l=a.r,n=l+k,p=c&&f(c.slicedOffset)?
+c.slicedOffset:0;return(b||[]).reduce(function(a,b){var c=1/g*b.val*e,f=d+c/2,q=m+Math.cos(f)*p,f=h+Math.sin(f)*p;b={x:b.sliced?q:m,y:b.sliced?f:h,innerR:l,r:n,radius:k,start:d,end:d+c};a.push(b);d=b.end;return a},[])},setShapeArgs:function(a,b,c){var d=[],e=c[a.level+1];a=a.children.filter(function(a){return a.visible});d=this.layoutAlgorithm(b,a,e);a.forEach(function(a,b){b=d[b];var e=b.start+(b.end-b.start)/2,f=b.innerR+(b.r-b.innerR)/2,g=b.end-b.start,f=0===b.innerR&&6.28<g?{x:b.x,y:b.y}:{x:b.x+
+Math.cos(e)*f,y:b.y+Math.sin(e)*f},h=a.val?a.childrenTotal>a.val?a.childrenTotal:a.val:a.childrenTotal;this.points[a.i]&&(this.points[a.i].innerArcLength=g*b.innerR,this.points[a.i].outerArcLength=g*b.r);a.shapeArgs=x(b,{plotX:f.x,plotY:f.y+4*Math.abs(Math.cos(e))});a.values=x(b,{val:h});a.children.length&&this.setShapeArgs(a,a.values,c)},this)},translate:function(){var a=this.options,b=this.center=y.call(this),c=this.startAndEndRadians=D(a.startAngle,a.endAngle),f=b[3]/2,e=b[2]/2-f,g=p(this),h=this.nodeMap,
+k,q=h&&h[g],t,r;this.shapeRoot=q&&q.shapeArgs;n.prototype.translate.call(this);r=this.tree=this.getTree();h=this.nodeMap;q=h[g];k=K(q.parent)?q.parent:"";t=h[k];k=l({from:0<q.level?q.level:1,levels:this.options.levels,to:r.height,defaults:{colorByPoint:a.colorByPoint,dataLabels:a.dataLabels,levelIsConstant:a.levelIsConstant,levelSize:a.levelSize,slicedOffset:a.slicedOffset}});k=E(k,{diffRadius:e,from:0<q.level?q.level:1,to:r.height});L(r,{before:M,idRoot:g,levelIsConstant:a.levelIsConstant,mapOptionsToLevel:k,
+mapIdToNode:h,points:this.points,series:this});a=h[""].shapeArgs={end:c.end,r:f,start:c.start,val:q.val,x:b[0],y:b[1]};this.setShapeArgs(t,a,k);this.mapOptionsToLevel=k},animate:function(a){var b=this.chart,c=[b.plotWidth/2,b.plotHeight/2],f=b.plotLeft,e=b.plotTop,b=this.group;a?(a={translateX:c[0]+f,translateY:c[1]+e,scaleX:.001,scaleY:.001,rotation:10,opacity:.01},b.attr(a)):(a={translateX:f,translateY:e,scaleX:1,scaleY:1,rotation:0,opacity:1},b.animate(a,this.options.animation),this.animate=null)},
+utils:{calculateLevelSizes:E,range:H}},{draw:w,shouldDraw:function(){return!this.isNull}})})(z,N,K)});
+//# sourceMappingURL=sunburst.js.map
+</script>
+<script>/*
+  Highcharts JS v7.0.1 (2018-12-19)
+ Vector plot series module
+
+ (c) 2010-2018 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(c){"object"===typeof module&&module.exports?module.exports=c:"function"===typeof define&&define.amd?define(function(){return c}):c("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(c){(function(d){var c=d.seriesType;c("vector","scatter",{lineWidth:2,marker:null,rotationOrigin:"center",states:{hover:{lineWidthPlus:1}},tooltip:{pointFormat:"\x3cb\x3e[{point.x}, {point.y}]\x3c/b\x3e\x3cbr/\x3eLength: \x3cb\x3e{point.length}\x3c/b\x3e\x3cbr/\x3eDirection: \x3cb\x3e{point.direction}\u00b0\x3c/b\x3e\x3cbr/\x3e"},
+vectorLength:20},{pointArrayMap:["y","length","direction"],parallelArrays:["x","y","length","direction"],pointAttribs:function(a,b){var c=this.options;a=a.color||this.color;var d=this.options.lineWidth;b&&(a=c.states[b].color||a,d=(c.states[b].lineWidth||d)+(c.states[b].lineWidthPlus||0));return{stroke:a,"stroke-width":d}},markerAttribs:d.noop,getSymbol:d.noop,arrow:function(a){a=a.length/this.lengthMax*this.options.vectorLength/20;var b={start:10*a,center:0,end:-10*a}[this.options.rotationOrigin]||
+0;return["M",0,7*a+b,"L",-1.5*a,7*a+b,0,10*a+b,1.5*a,7*a+b,0,7*a+b,0,-10*a+b]},translate:function(){d.Series.prototype.translate.call(this);this.lengthMax=d.arrayMax(this.lengthData)},drawPoints:function(){var a=this.chart;this.points.forEach(function(b){var c=b.plotX,d=b.plotY;a.isInsidePlot(c,d,a.inverted)?(b.graphic||(b.graphic=this.chart.renderer.path().add(this.markerGroup)),b.graphic.attr({d:this.arrow(b),translateX:c,translateY:d,rotation:b.direction}).attr(this.pointAttribs(b))):b.graphic&&
+(b.graphic=b.graphic.destroy())},this)},drawGraph:d.noop,animate:function(a){a?this.markerGroup.attr({opacity:.01}):(this.markerGroup.animate({opacity:1},d.animObject(this.options.animation)),this.animate=null)}})})(c)});
+//# sourceMappingURL=vector.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+
+ (c) 2016-2018 Highsoft AS
+ Authors: Jon Arild Nygard
+
+ License: www.highcharts.com/license
+*/
+(function(h){"object"===typeof module&&module.exports?module.exports=h:"function"===typeof define&&define.amd?define(function(){return h}):h("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(h){var y=function(){return function(f){var v=this,k=v.graphic,h=f.animatableAttribs,t=f.onComplete,w=f.css,A=f.renderer;v.shouldDraw()?(k||(v.graphic=k=A[f.shapeType](f.shapeArgs).add(f.group)),k.css(w).attr(f.attribs).animate(h,f.isNew?!1:void 0,t)):k&&k.animate(h,void 0,function(){v.graphic=k=k.destroy();
+"function"===typeof t&&t()});k&&k.addClass(v.getClassName(),!0)}}(),C=function(f){var h=f.deg2rad,k=f.find,J=f.isArray,t=f.isNumber,w=function(a,d){d=t(d)?d:14;d=Math.pow(10,d);return Math.round(a*d)/d},A=function(a,d){var e=d[0]-a[0];a=d[1]-a[1];return[[-a,e],[a,-e]]},q=function(a,d){a=a.map(function(a){return a[0]*d[0]+a[1]*d[1]});return{min:Math.min.apply(this,a),max:Math.max.apply(this,a)}},E=function(a,d){var e=a[0];a=a[1];var m=h*-d;d=Math.cos(m);m=Math.sin(m);return[w(e*d-a*m),w(e*m+a*d)]},
+z=function(a,d,e){a=E([a[0]-d[0],a[1]-d[1]],e);return[a[0]+d[0],a[1]+d[1]]},B=function(a){var d,e=a.axes;J(e)||(e=[],d=d=a.concat([a[0]]),d.reduce(function(a,d){var m=A(a,d)[0];k(e,function(a){return a[0]===m[0]&&a[1]===m[1]})||e.push(m);return d}),a.axes=e);return e},G=function(a,d){a=B(a);d=B(d);return a.concat(d)};return{getBoundingBoxFromPolygon:function(a){return a.reduce(function(a,e){var d=e[0];e=e[1];a.left=Math.min(d,a.left);a.right=Math.max(d,a.right);a.bottom=Math.max(e,a.bottom);a.top=
+Math.min(e,a.top);return a},{left:Number.MAX_VALUE,right:-Number.MAX_VALUE,bottom:-Number.MAX_VALUE,top:Number.MAX_VALUE})},getPolygon:function(a,d,e,m,f){var k=[a,d],h=a-e/2;a+=e/2;e=d-m/2;d+=m/2;return[[h,e],[a,e],[a,d],[h,d]].map(function(a){return z(a,k,-f)})},isPolygonsColliding:function(a,d){var e=G(a,d);return!k(e,function(e){var f=q(a,e);e=q(d,e);return!!(e.min>f.max||e.max<f.min)})},movePolygon:function(a,d,e){return e.map(function(e){return[e[0]+a,e[1]+d]})},rotate2DToOrigin:E,rotate2DToPoint:z}}(h);
+(function(f,h,k){function v(g,c){var b=!1,a=g.rect,e=g.polygon,d=g.lastCollidedWith,f=function(c){var b;b=c.rect;(b=!(b.left>a.right||b.right<a.left||b.top>a.bottom||b.bottom<a.top))&&(g.rotation%90||c.roation%90)&&(b=D(e,c.polygon));return b};d&&((b=f(d))||delete g.lastCollidedWith);b||(b=!!C(c,function(c){var b=f(c);b&&(g.lastCollidedWith=c);return b}));return b}function t(g){var c=4*g,b=Math.ceil((Math.sqrt(c)-1)/2),a=2*b+1,d=Math.pow(a,2),e=!1,a=a-1;1E4>=g&&("boolean"===typeof e&&c>=d-a&&(e={x:b-
+(d-c),y:-b}),d-=a,"boolean"===typeof e&&c>=d-a&&(e={x:-b,y:-b+(d-c)}),d-=a,"boolean"===typeof e&&(e=c>=d-a?{x:-b+(d-c),y:b}:{x:b,y:b-(d-c-a)}),e.x*=5,e.y*=5);return e}function w(g,c,b){var a=2*Math.max(Math.abs(b.top),Math.abs(b.bottom));b=2*Math.max(Math.abs(b.left),Math.abs(b.right));return Math.min(0<b?1/b*g:1,0<a?1/a*c:1)}function A(a,c,b){b=b.reduce(function(a,c){c=c.dimensions;var b=Math.max(c.width,c.height);a.maxHeight=Math.max(a.maxHeight,c.height);a.maxWidth=Math.max(a.maxWidth,c.width);
+a.area+=b*b;return a},{maxHeight:0,maxWidth:0,area:0});b=Math.max(b.maxHeight,b.maxWidth,.85*Math.sqrt(b.area));var g=a>c?a/c:1;a=c>a?c/a:1;return{width:b*g,height:b*a,ratioX:g,ratioY:a}}function q(a,c,b,d){var g=!1;e(a)&&e(c)&&e(b)&&e(d)&&-1<a&&-1<c&&d>b&&(g=b+c%a*((d-b)/(a-1)));return g}function E(a,c){var b,g=[];for(b=1;1E4>b;b++)g.push(a(b,c));return function(a){return 1E4>=a?g[a-1]:!1}}function z(a,c){var b=c.width/2,g=-(c.height/2),d=c.height/2;return!(-(c.width/2)<a.left&&b>a.right&&g<a.top&&
+d>a.bottom)}function B(g,c){var b=c.placed,d=c.field,e=c.rectangle,f=c.polygon,k=c.spiral,h=1,p={x:0,y:0},n=g.rect=a({},e);g.polygon=f;for(g.rotation=c.rotation;!1!==p&&(v(g,b)||z(n,d));)p=k(h),m(p)&&(n.left=e.left+p.x,n.right=e.right+p.x,n.top=e.top+p.y,n.bottom=e.bottom+p.y,g.polygon=L(p.x,p.y,f)),h++;return p}function G(a,c){var b,g,d;m(a)&&m(c)&&(b=c.bottom-c.top,g=c.right-c.left,c=a.ratioX,d=a.ratioY,b=g*c>b*d?g:b,a=y(a,{width:a.width+b*c*2,height:a.height+b*d*2}));return a}var a=f.extend,d=
+f.isArray,e=f.isNumber,m=f.isObject,y=f.merge,F=f.noop,C=f.find,K=k.getBoundingBoxFromPolygon,M=k.getPolygon,D=k.isPolygonsColliding,L=k.movePolygon,I=f.Series;f.seriesType("wordcloud","column",{allowExtendPlayingField:!0,animation:{duration:500},borderWidth:0,clip:!1,colorByPoint:!0,minFontSize:1,maxFontSize:25,placementStrategy:"center",rotation:{from:0,orientations:2,to:90},showInLegend:!1,spiral:"rectangular",style:{fontFamily:"sans-serif",fontWeight:"900"},tooltip:{followPointer:!0,pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.weight}\x3c/b\x3e\x3cbr/\x3e'}},
+{animate:I.prototype.animate,animateDrilldown:F,animateDrillupFrom:F,bindAxes:function(){var g={endOnTick:!1,gridLineWidth:0,lineWidth:0,maxPadding:0,startOnTick:!1,title:null,tickPositions:[]};I.prototype.bindAxes.call(this);a(this.yAxis.options,g);a(this.xAxis.options,g)},deriveFontSize:function(a,c,b){a=e(a)?a:0;c=e(c)?c:1;b=e(b)?b:1;return Math.floor(Math.max(b,a*c))},drawPoints:function(){var d=this,c=d.hasRendered,b=d.xAxis,f=d.yAxis,k=d.group,h=d.options,t=h.animation,v=h.allowExtendPlayingField,
+p=d.chart.renderer,n=p.text().add(k),q=[],z=d.placementStrategy[h.placementStrategy],y,C=h.rotation,F=d.points.map(function(a){return a.weight}),D=Math.max.apply(null,F),H=d.points.sort(function(a,c){return c.weight-a.weight}),u;H.forEach(function(c){var b=d.deriveFontSize(1/D*c.weight,h.maxFontSize,h.minFontSize),b=a({fontSize:b+"px"},h.style);n.css(b).attr({x:0,y:0,text:c.name});b=n.getBBox(!0);c.dimensions={height:b.height,width:b.width}});u=A(b.len,f.len,H);y=E(d.spirals[h.spiral],{field:u});
+H.forEach(function(b){var g=d.deriveFontSize(1/D*b.weight,h.maxFontSize,h.minFontSize),g=a({fontSize:g+"px",fill:b.color},h.style),f=z(b,{data:H,field:u,placed:q,rotation:C}),r={align:"center","alignment-baseline":"middle",x:f.x,y:f.y,text:b.name,rotation:f.rotation},n=M(f.x,f.y,b.dimensions.width,b.dimensions.height,f.rotation),l=K(n),x=B(b,{rectangle:l,polygon:n,field:u,placed:q,spiral:y,rotation:f.rotation}),w;!x&&v&&(u=G(u,l),x=B(b,{rectangle:l,polygon:n,field:u,placed:q,spiral:y,rotation:f.rotation}));
+if(m(x)){r.x+=x.x;r.y+=x.y;l.left+=x.x;l.right+=x.x;l.top+=x.y;l.bottom+=x.y;f=u;if(!e(f.left)||f.left>l.left)f.left=l.left;if(!e(f.right)||f.right<l.right)f.right=l.right;if(!e(f.top)||f.top>l.top)f.top=l.top;if(!e(f.bottom)||f.bottom<l.bottom)f.bottom=l.bottom;u=f;q.push(b);b.isNull=!1}else b.isNull=!0;t&&(w={x:r.x,y:r.y},c?(delete r.x,delete r.y):(r.x=0,r.y=0));b.draw({animatableAttribs:w,attribs:r,css:g,group:k,renderer:p,shapeArgs:void 0,shapeType:"text"})});n=n.destroy();b=w(b.len,f.len,u);
+d.group.attr({scaleX:b,scaleY:b})},hasData:function(){return m(this)&&!0===this.visible&&d(this.points)&&0<this.points.length},placementStrategy:{random:function(a,c){var b=c.field;c=c.rotation;return{x:Math.round(b.width*(Math.random()+.5)/2)-b.width/2,y:Math.round(b.height*(Math.random()+.5)/2)-b.height/2,rotation:q(c.orientations,a.index,c.from,c.to)}},center:function(a,c){c=c.rotation;return{x:0,y:0,rotation:q(c.orientations,a.index,c.from,c.to)}}},pointArrayMap:["weight"],spirals:{archimedean:function(a,
+c){var b=c.field;c=!1;var b=b.width*b.width+b.height*b.height,d=.8*a;1E4>=a&&(c={x:d*Math.cos(d),y:d*Math.sin(d)},Math.min(Math.abs(c.x),Math.abs(c.y))<b||(c=!1));return c},rectangular:function(a,c){a=t(a,c);c=c.field;a&&(a.x*=c.ratioX,a.y*=c.ratioY);return a},square:t},utils:{extendPlayingField:G,getRotation:q,isPolygonsColliding:D,rotate2DToOrigin:k.rotate2DToOrigin,rotate2DToPoint:k.rotate2DToPoint},getPlotBox:function(){var a=this.chart,c=a.inverted,b=this[c?"yAxis":"xAxis"],c=this[c?"xAxis":
+"yAxis"];return{translateX:(b?b.left:a.plotLeft)+(b?b.len:a.plotWidth)/2,translateY:(c?c.top:a.plotTop)+(c?c.len:a.plotHeight)/2,scaleX:1,scaleY:1}}},{draw:h,shouldDraw:function(){return!this.isNull},weight:1})})(h,y,C)});
+//# sourceMappingURL=wordcloud.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+ X-range series
+
+ (c) 2010-2018 Torstein Honsi, Lars A. V. Cabrera
+
+ License: www.highcharts.com/license
+*/
+(function(g){"object"===typeof module&&module.exports?module.exports=g:"function"===typeof define&&define.amd?define(function(){return g}):g("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(g){(function(c){var g=c.addEvent,t=c.defined,x=c.Color,u=c.seriesTypes.column,y=c.correctFloat,v=c.isNumber,r=c.isObject,p=c.merge,n=c.pick,z=c.seriesType,A=c.Axis,f=c.Point,B=c.Series;z("xrange","column",{colorByPoint:!0,dataLabels:{verticalAlign:"middle",inside:!0,formatter:function(){var a=this.point.partialFill;
+r(a)&&(a=a.amount);t(a)||(a=0);return y(100*a)+"%"}},tooltip:{headerFormat:'\x3cspan style\x3d"font-size: 10px"\x3e{point.x} - {point.x2}\x3c/span\x3e\x3cbr/\x3e',pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.yCategory}\x3c/b\x3e\x3cbr/\x3e'},borderRadius:3,pointRange:0},{type:"xrange",parallelArrays:["x","x2","y"],requireSorting:!1,animate:c.seriesTypes.line.prototype.animate,cropShoulder:1,getExtremesFromAll:!0,autoIncrement:c.noop,getColumnMetrics:function(){function a(){d.series.forEach(function(a){var b=
+a.xAxis;a.xAxis=a.yAxis;a.yAxis=b})}var b,d=this.chart;a();b=u.prototype.getColumnMetrics.call(this);a();return b},cropData:function(a,b,d,e){b=B.prototype.cropData.call(this,this.x2Data,b,d,e);b.xData=a.slice(b.start,b.end);return b},translatePoint:function(a){var b=this.xAxis,d=this.yAxis,e=this.columnMetrics,l=this.options,c=l.minPointLength||0,m=a.plotX,k=n(a.x2,a.x+(a.len||0)),h=b.translate(k,0,0,0,1),k=Math.abs(h-m),w=this.chart.inverted,g=n(l.borderWidth,1)%2/2,q=e.offset,f=Math.round(e.width);
+c&&(c-=k,0>c&&(c=0),m-=c/2,h+=c/2);m=Math.max(m,-10);h=Math.min(Math.max(h,-10),b.len+10);t(a.options.pointWidth)&&(q-=(Math.ceil(a.options.pointWidth)-f)/2,f=Math.ceil(a.options.pointWidth));l.pointPlacement&&v(a.plotY)&&d.categories&&(a.plotY=d.translate(a.y,0,1,0,1,l.pointPlacement));a.shapeArgs={x:Math.floor(Math.min(m,h))+g,y:Math.floor(a.plotY+q)+g,width:Math.round(Math.abs(h-m)),height:f,r:this.options.borderRadius};d=a.shapeArgs.x;l=d+a.shapeArgs.width;0>d||l>b.len?(d=Math.min(b.len,Math.max(0,
+d)),l=Math.max(0,Math.min(l,b.len)),b=l-d,a.dlBox=p(a.shapeArgs,{x:d,width:l-d,centerX:b?b/2:null})):a.dlBox=null;a.tooltipPos[0]+=w?0:k/2;a.tooltipPos[1]-=w?-k/2:e.width/2;if(b=a.partialFill)r(b)&&(b=b.amount),v(b)||(b=0),e=a.shapeArgs,a.partShapeArgs={x:e.x,y:e.y,width:e.width,height:e.height,r:this.options.borderRadius},a.clipRectArgs={x:e.x,y:e.y,width:Math.max(Math.round(k*b+(a.plotX-m)),0),height:e.height}},translate:function(){u.prototype.translate.apply(this,arguments);this.points.forEach(function(a){this.translatePoint(a)},
+this)},drawPoint:function(a,b){var d=this.options,e=this.chart.renderer,c=a.graphic,g=a.shapeType,m=a.shapeArgs,k=a.partShapeArgs,h=a.clipRectArgs,f=a.partialFill,n=a.selected&&"select",q=d.stacking&&!d.borderRadius;if(a.isNull)c&&(a.graphic=c.destroy());else{if(c)a.graphicOriginal[b](p(m));else a.graphic=c=e.g("point").addClass(a.getClassName()).add(a.group||this.group),a.graphicOriginal=e[g](m).addClass(a.getClassName()).addClass("highcharts-partfill-original").add(c);k&&(a.graphicOverlay?(a.graphicOverlay[b](p(k)),
+a.clipRect.animate(p(h))):(a.clipRect=e.clipRect(h.x,h.y,h.width,h.height),a.graphicOverlay=e[g](k).addClass("highcharts-partfill-overlay").add(c).clip(a.clipRect)));this.chart.styledMode||(a.graphicOriginal.attr(this.pointAttribs(a,n)).shadow(d.shadow,null,q),k&&(r(f)||(f={}),r(d.partialFill)&&(f=p(f,d.partialFill)),b=f.fill||x(a.color||this.color).brighten(-.3).get(),a.graphicOverlay.attr(this.pointAttribs(a,n)).attr({fill:b}).shadow(d.shadow,null,q)))}},drawPoints:function(){var a=this,b=a.getAnimationVerb();
+a.points.forEach(function(d){a.drawPoint(d,b)})},getAnimationVerb:function(){return this.chart.pointCount<(this.options.animationLimit||250)?"animate":"attr"}},{applyOptions:function(){var a,b=f.prototype.applyOptions.apply(this,arguments),d=b.series;if(d.options.colorByPoint&&!b.options.color){a=d.options.colors||d.chart.options.colors;var c=b.y%(a?a.length:d.chart.options.chart.colorCount);a=a&&a[c];d.chart.styledMode||(b.color=a);b.options.colorIndex||(b.colorIndex=c)}return b},init:function(){f.prototype.init.apply(this,
+arguments);this.y||(this.y=0);return this},setState:function(){f.prototype.setState.apply(this,arguments);this.series.drawPoint(this,this.series.getAnimationVerb())},getLabelConfig:function(){var a=f.prototype.getLabelConfig.call(this),b=this.series.yAxis.categories;a.x2=this.x2;a.yCategory=this.yCategory=b&&b[this.y];return a},tooltipDateKeys:["x","x2"],isValid:function(){return"number"===typeof this.x&&"number"===typeof this.x2}});g(A,"afterGetSeriesExtremes",function(){var a=this.series,b,c;this.isXAxis&&
+(b=n(this.dataMax,-Number.MAX_VALUE),a.forEach(function(a){a.x2Data&&a.x2Data.forEach(function(a){a>b&&(b=a,c=!0)})}),c&&(this.dataMax=b))})})(g)});
+//# sourceMappingURL=xrange.js.map
+</script>
+<script>/*
+  Highcharts JS v7.0.1 (2018-12-19)
+ Tilemap module
+
+ (c) 2010-2018 Highsoft AS
+
+ License: www.highcharts.com/license
+*/
+(function(k){"object"===typeof module&&module.exports?module.exports=k:"function"===typeof define&&define.amd?define(function(){return k}):k("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(k){(function(d){var k=d.defined,v=d.noop,e=d.seriesTypes;d.colorPointMixin={isValid:function(){return null!==this.value&&Infinity!==this.value&&-Infinity!==this.value},setVisible:function(d){var a=this,b=d?"show":"hide";a.visible=!!d;["graphic","dataLabel"].forEach(function(c){if(a[c])a[c][b]()})},
+setState:function(e){d.Point.prototype.setState.call(this,e);this.graphic&&this.graphic.attr({zIndex:"hover"===e?1:0})}};d.colorSeriesMixin={pointArrayMap:["value"],axisTypes:["xAxis","yAxis","colorAxis"],optionalAxis:"colorAxis",trackerGroups:["group","markerGroup","dataLabelsGroup"],getSymbol:v,parallelArrays:["x","y","value"],colorKey:"value",pointAttribs:e.column.prototype.pointAttribs,translateColors:function(){var d=this,a=this.options.nullColor,b=this.colorAxis,c=this.colorKey;this.data.forEach(function(f){var g=
+f[c];if(g=f.options.color||(f.isNull?a:b&&void 0!==g?b.toColor(g,f):f.color||d.color))f.color=g})},colorAttribs:function(d){var a={};k(d.color)&&(a[this.colorProp||"fill"]=d.color);return a}}})(k);(function(d){var k=d.colorPointMixin,v=d.merge,e=d.noop,r=d.pick,a=d.Series,b=d.seriesType,c=d.seriesTypes;b("heatmap","scatter",{animation:!1,borderWidth:0,nullColor:"#f7f7f7",dataLabels:{formatter:function(){return this.point.value},inside:!0,verticalAlign:"middle",crop:!1,overflow:!1,padding:0},marker:null,
+pointRange:null,tooltip:{pointFormat:"{point.x}, {point.y}: {point.value}\x3cbr/\x3e"},states:{hover:{halo:!1,brightness:.2}}},v(d.colorSeriesMixin,{pointArrayMap:["y","value"],hasPointSpecificOptions:!0,getExtremesFromAll:!0,directTouch:!0,init:function(){var b;c.scatter.prototype.init.apply(this,arguments);b=this.options;b.pointRange=r(b.pointRange,b.colsize||1);this.yAxis.axisPointRange=b.rowsize||1},translate:function(){var b=this.options,a=this.xAxis,c=this.yAxis,d=b.pointPadding||0,l=function(b,
+a,c){return Math.min(Math.max(a,b),c)};this.generatePoints();this.points.forEach(function(g){var f=(b.colsize||1)/2,e=(b.rowsize||1)/2,u=l(Math.round(a.len-a.translate(g.x-f,0,1,0,1)),-a.len,2*a.len),f=l(Math.round(a.len-a.translate(g.x+f,0,1,0,1)),-a.len,2*a.len),m=l(Math.round(c.translate(g.y-e,0,1,0,1)),-c.len,2*c.len),e=l(Math.round(c.translate(g.y+e,0,1,0,1)),-c.len,2*c.len),h=r(g.pointPadding,d);g.plotX=g.clientX=(u+f)/2;g.plotY=(m+e)/2;g.shapeType="rect";g.shapeArgs={x:Math.min(u,f)+h,y:Math.min(m,
+e)+h,width:Math.abs(f-u)-2*h,height:Math.abs(e-m)-2*h}});this.translateColors()},drawPoints:function(){var b=this.chart.styledMode?"css":"attr";c.column.prototype.drawPoints.call(this);this.points.forEach(function(a){a.graphic[b](this.colorAttribs(a))},this)},animate:e,getBox:e,drawLegendSymbol:d.LegendSymbolMixin.drawRectangle,alignDataLabel:c.column.prototype.alignDataLabel,getExtremes:function(){a.prototype.getExtremes.call(this,this.valueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;
+a.prototype.getExtremes.call(this)}}),d.extend({haloPath:function(b){if(!b)return[];var a=this.shapeArgs;return["M",a.x-b,a.y-b,"L",a.x-b,a.y+a.height+b,a.x+a.width+b,a.y+a.height+b,a.x+a.width+b,a.y-b,"Z"]}},k))})(k);(function(d){var k=d.seriesType,v=d.pick,e=function(a,b,c){return Math.min(Math.max(b,a),c)},r=function(a,b,c){a=a.options;return{xPad:(a.colsize||1)/-b,yPad:(a.rowsize||1)/-c}};d.tileShapeTypes={hexagon:{alignDataLabel:d.seriesTypes.scatter.prototype.alignDataLabel,getSeriesPadding:function(a){return r(a,
+3,2)},haloPath:function(a){if(!a)return[];var b=this.tileEdges;return["M",b.x2-a,b.y1+a,"L",b.x3+a,b.y1+a,b.x4+1.5*a,b.y2,b.x3+a,b.y3-a,b.x2-a,b.y3-a,b.x1-1.5*a,b.y2,"Z"]},translate:function(){var a=this.options,b=this.xAxis,c=this.yAxis,d=a.pointPadding||0,g=(a.colsize||1)/3,k=(a.rowsize||1)/2,q;this.generatePoints();this.points.forEach(function(a){var l=e(Math.floor(b.len-b.translate(a.x-2*g,0,1,0,1)),-b.len,2*b.len),f=e(Math.floor(b.len-b.translate(a.x-g,0,1,0,1)),-b.len,2*b.len),t=e(Math.floor(b.len-
+b.translate(a.x+g,0,1,0,1)),-b.len,2*b.len),u=e(Math.floor(b.len-b.translate(a.x+2*g,0,1,0,1)),-b.len,2*b.len),m=e(Math.floor(c.translate(a.y-k,0,1,0,1)),-c.len,2*c.len),h=e(Math.floor(c.translate(a.y,0,1,0,1)),-c.len,2*c.len),n=e(Math.floor(c.translate(a.y+k,0,1,0,1)),-c.len,2*c.len),p=v(a.pointPadding,d),w=p*Math.abs(f-l)/Math.abs(n-h),w=b.reversed?-w:w,r=b.reversed?-p:p,p=c.reversed?-p:p;a.x%2&&(q=q||Math.round(Math.abs(n-m)/2)*(c.reversed?-1:1),m+=q,h+=q,n+=q);a.plotX=a.clientX=(f+t)/2;a.plotY=
+h;l+=w+r;f+=r;t-=r;u-=w+r;m-=p;n+=p;a.tileEdges={x1:l,x2:f,x3:t,x4:u,y1:m,y2:h,y3:n};a.shapeType="path";a.shapeArgs={d:["M",f,m,"L",t,m,u,h,t,n,f,n,l,h,"Z"]}});this.translateColors()}},diamond:{alignDataLabel:d.seriesTypes.scatter.prototype.alignDataLabel,getSeriesPadding:function(a){return r(a,2,2)},haloPath:function(a){if(!a)return[];var b=this.tileEdges;return["M",b.x2,b.y1+a,"L",b.x3+a,b.y2,b.x2,b.y3-a,b.x1-a,b.y2,"Z"]},translate:function(){var a=this.options,b=this.xAxis,c=this.yAxis,d=a.pointPadding||
+0,g=a.colsize||1,k=(a.rowsize||1)/2,q;this.generatePoints();this.points.forEach(function(a){var f=e(Math.round(b.len-b.translate(a.x-g,0,1,0,0)),-b.len,2*b.len),l=e(Math.round(b.len-b.translate(a.x,0,1,0,0)),-b.len,2*b.len),t=e(Math.round(b.len-b.translate(a.x+g,0,1,0,0)),-b.len,2*b.len),u=e(Math.round(c.translate(a.y-k,0,1,0,0)),-c.len,2*c.len),m=e(Math.round(c.translate(a.y,0,1,0,0)),-c.len,2*c.len),h=e(Math.round(c.translate(a.y+k,0,1,0,0)),-c.len,2*c.len),n=v(a.pointPadding,d),p=n*Math.abs(l-
+f)/Math.abs(h-m),p=b.reversed?-p:p,n=c.reversed?-n:n;a.x%2&&(q=Math.abs(h-u)/2*(c.reversed?-1:1),u+=q,m+=q,h+=q);a.plotX=a.clientX=l;a.plotY=m;f+=p;t-=p;u-=n;h+=n;a.tileEdges={x1:f,x2:l,x3:t,y1:u,y2:m,y3:h};a.shapeType="path";a.shapeArgs={d:["M",l,u,"L",t,m,l,h,f,m,"Z"]}});this.translateColors()}},circle:{alignDataLabel:d.seriesTypes.scatter.prototype.alignDataLabel,getSeriesPadding:function(a){return r(a,2,2)},haloPath:function(a){return d.seriesTypes.scatter.prototype.pointClass.prototype.haloPath.call(this,
+a+(a&&this.radius))},translate:function(){var a=this.options,b=this.xAxis,c=this.yAxis,d=a.pointPadding||0,g=(a.rowsize||1)/2,k=a.colsize||1,q,l,r,v,t=!1;this.generatePoints();this.points.forEach(function(a){var f=e(Math.round(b.len-b.translate(a.x,0,1,0,0)),-b.len,2*b.len),h=e(Math.round(c.translate(a.y,0,1,0,0)),-c.len,2*c.len),n=d,p=!1;void 0!==a.pointPadding&&(n=a.pointPadding,t=p=!0);if(!v||t)q=Math.abs(e(Math.floor(b.len-b.translate(a.x+k,0,1,0,0)),-b.len,2*b.len)-f),l=Math.abs(e(Math.floor(c.translate(a.y+
+g,0,1,0,0)),-c.len,2*c.len)-h),r=Math.floor(Math.sqrt(q*q+l*l)/2),v=Math.min(q,r,l)-n,t&&!p&&(t=!1);a.x%2&&(h+=l*(c.reversed?-1:1));a.plotX=a.clientX=f;a.plotY=h;a.radius=v;a.shapeType="circle";a.shapeArgs={x:f,y:h,r:v}});this.translateColors()}},square:{alignDataLabel:d.seriesTypes.heatmap.prototype.alignDataLabel,translate:d.seriesTypes.heatmap.prototype.translate,getSeriesPadding:function(){},haloPath:d.seriesTypes.heatmap.prototype.pointClass.prototype.haloPath}};d.wrap(d.Axis.prototype,"setAxisTranslation",
+function(a){a.apply(this,Array.prototype.slice.call(arguments,1));var b=this,c=b.series.map(function(a){return a.getSeriesPixelPadding&&a.getSeriesPixelPadding(b)}).reduce(function(a,b){return(a&&a.padding)>(b&&b.padding)?a:b},void 0)||{padding:0,axisLengthFactor:1},d=Math.round(c.padding*c.axisLengthFactor);c.padding&&(b.len-=d,a.apply(b,Array.prototype.slice.call(arguments,1)),b.minPixelPadding+=c.padding,b.len+=d)});k("tilemap","heatmap",{states:{hover:{halo:{enabled:!0,size:2,opacity:.5,attributes:{zIndex:3}}}},
+pointPadding:2,tileShape:"hexagon"},{setOptions:function(){var a=d.seriesTypes.heatmap.prototype.setOptions.apply(this,Array.prototype.slice.call(arguments));this.tileShape=d.tileShapeTypes[a.tileShape];return a},alignDataLabel:function(){return this.tileShape.alignDataLabel.apply(this,Array.prototype.slice.call(arguments))},getSeriesPixelPadding:function(a){var b=a.isXAxis,c=this.tileShape.getSeriesPadding(this),d;if(!c)return{padding:0,axisLengthFactor:1};d=Math.round(a.translate(b?2*c.xPad:c.yPad,
+0,1,0,1));a=Math.round(a.translate(b?c.xPad:0,0,1,0,1));return{padding:Math.abs(d-a)||0,axisLengthFactor:b?2:1.1}},translate:function(){return this.tileShape.translate.apply(this,Array.prototype.slice.call(arguments))}},d.extend({haloPath:function(){return this.series.tileShape.haloPath.apply(this,Array.prototype.slice.call(arguments))}},d.colorPointMixin))})(k)});
+//# sourceMappingURL=tilemap.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+
+ (c) 2017-2018 Highsoft AS
+ Authors: Jon Arild Nygard
+
+ License: www.highcharts.com/license
+*/
+(function(n){"object"===typeof module&&module.exports?module.exports=n:"function"===typeof define&&define.amd?define(function(){return n}):n("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(n){var A=function(){return function(f){var h=this,e=h.graphic,t=f.animatableAttribs,m=f.onComplete,w=f.css,u=f.renderer;h.shouldDraw()?(e||(h.graphic=e=u[f.shapeType](f.shapeArgs).add(f.group)),e.css(w).attr(f.attribs).animate(t,f.isNew?!1:void 0,m)):e&&e.animate(t,void 0,function(){h.graphic=e=e.destroy();
+"function"===typeof m&&m()});e&&e.addClass(h.getClassName(),!0)}}(),x=function(){return{getAngleBetweenPoints:function(f,h){return Math.atan2(h.x-f.x,h.y-f.y)},getCenterOfPoints:function(f){var h=f.reduce(function(e,f){e.x+=f.x;e.y+=f.y;return e},{x:0,y:0});return{x:h.x/f.length,y:h.y/f.length}},getDistanceBetweenPoints:function(f,h){return Math.sqrt(Math.pow(h.x-f.x,2)+Math.pow(h.y-f.y,2))}}}(),B=function(f){var h=f.getAngleBetweenPoints,e=f.getCenterOfPoints,t=f.getDistanceBetweenPoints,m=function(l,
+a){a=Math.pow(10,a);return Math.round(l*a)/a},w=function(l,a){var p=t(l,a),k=l.r,f=a.r,e=[];if(p<k+f&&p>Math.abs(k-f)){var k=k*k,h=(k-f*f+p*p)/(2*p),f=Math.sqrt(k-h*h),k=l.x,e=a.x;l=l.y;var y=a.y;a=k+h*(e-k)/p;h=l+h*(y-l)/p;l=f/p*-(y-l);p=f/p*-(e-k);e=[{x:m(a+l,14),y:m(h-p,14)},{x:m(a-l,14),y:m(h+p,14)}]}return e},u=function(f){return f.reduce(function(a,f,k,l){l=l.slice(k+1).reduce(function(a,l,p){var e=[k,p+k+1];return a.concat(w(f,l).map(function(a){a.indexes=e;return a}))},[]);return a.concat(l)},
+[])},n=function(f,a){return t(f,a)<=a.r+1e-10},z=function(f,a){return!a.some(function(a){return!n(f,a)})};return{getAreaOfIntersectionBetweenCircles:function(f){var a=u(f).filter(function(a){return z(a,f)}),p;if(1<a.length){var k=e(a),a=a.map(function(a){a.angle=h(k,a);return a}).sort(function(a,f){return f.angle-a.angle}),l=a[a.length-1],a=a.reduce(function(a,k){var p=a.startPoint,l=e([p,k]),m=k.indexes.filter(function(a){return-1<p.indexes.indexOf(a)}).reduce(function(a,e){e=f[e];var m=h(e,k),n=
+h(e,p),m=n-(n-m+(n<m?2*Math.PI:0))/2,m=t(l,{x:e.x+e.r*Math.sin(m),y:e.y+e.r*Math.cos(m)});e=e.r;m>2*e&&(m=2*e);if(!a||a.width>m)a={r:e,largeArc:m>e?1:0,width:m,x:k.x,y:k.y};return a},null);if(m){var n=m.r;a.arcs.push(["A",n,n,0,m.largeArc,1,m.x,m.y]);a.startPoint=k}return a},{startPoint:l,arcs:[]}).arcs;0!==a.length&&1!==a.length&&(a.unshift(["M",l.x,l.y]),p={center:k,d:a})}return p},getCircleCircleIntersection:w,getCirclesIntersectionPoints:u,getOverlapBetweenCircles:function(f,a,e){var k=0;if(e<
+f+a){var k=f*f,l=a*a;if(e<=Math.abs(a-f))k=Math.PI*Math.min(k,l);else{e=(k-l+e*e)/(2*e);var h=Math.sqrt(k-e*e),k=k*Math.asin(h/f)+l*Math.asin(h/a)-h*(e+Math.sqrt(e*e+l-k))}k=m(k,14)}return k},isPointInsideCircle:n,isPointInsideAllCircles:z,isPointOutsideAllCircles:function(e,a){return!a.some(function(a){return n(e,a)})},round:m}}(x);(function(f,h,e,n){var m=n.Color,t=n.extend,u=e.getAreaOfIntersectionBetweenCircles,x=e.getCircleCircleIntersection,z=h.getCenterOfPoints,l=h.getDistanceBetweenPoints,
+a=e.getOverlapBetweenCircles,p=n.isArray,k=n.isNumber,D=n.isObject,A=e.isPointInsideAllCircles,B=e.isPointOutsideAllCircles,y=n.isString,L=n.merge,M=e.round,P=n.seriesType,N=function(d){return Object.keys(d).map(function(b){return d[b]})},O=function(d){var b=0;2===d.length&&(b=d[0],d=d[1],b=a(b.r,d.r,l(b,d)));return b},E=function(d,b){return b.reduce(function(b,g){var c=0;1<g.sets.length&&(c=g.value,g=O(g.sets.map(function(c){return d[c]})),g=c-g,c=Math.round(g*g*1E11)/1E11);return b+c},0)},F=function(d,
+b,q){for(var g=0,c=d.length-1,a=Math.floor((g+c)/2),e;(e=q(d[a],b))!==b&&g<c;)b<e?c=a-1:g=a+1,a=Math.floor((g+c)/2);return e===b?a:-1},Q=function(d,b,q){var g=q||1;return Array.apply(0,Array(Math.round((d+b)/g))).map(function(d,b){return b*g})},C=function(d,b,q){var g=Q(0,d+b,.001),c=F(g,0,function(c){c=a(d,b,c);c=q-c;return.01>Math.abs(c)?0:c});return M(g[c],14)},v=function(d){return p(d.sets)&&1===d.sets.length},R=function(d,b){var q=function(c,d){return c.fx-d.fx},g=function(c,d,b,g){return d.map(function(d,
+a){return c*d+b*g[a]})},c=function(c,b){b.fx=d(b);c[c.length-1]=b;return c},a=function(c){var b=c[0];return c.map(function(c){c=g(.5,b,.5,c);c.fx=d(c);return c})},e=function(c){for(var d=c.slice(0,-1).length,b=[],g=function(c,d){c.sum+=d[c.i];return c},a=0;a<d;a++)b[a]=c.reduce(g,{sum:0,i:a}).sum/d;return b},f=function(c,b,a,q){c=g(a,c,q,b);c.fx=d(c);return c};b=function(c){var b=c.length,a=Array(b+1);a[0]=c;a[0].fx=d(c);for(var g=0;g<b;++g){var q=c.slice();q[g]=q[g]?1.05*q[g]:.001;q.fx=d(q);a[g+
+1]=q}return a}(b);for(var k=0;100>k;k++){b.sort(q);var r=b[b.length-1],h=e(b),l=f(h,r,2,-1);l.fx<b[0].fx?(r=f(h,r,3,-2),b=c(b,r.fx<l.fx?r:l)):l.fx>=b[b.length-2].fx?l.fx>r.fx?(h=f(h,r,.5,.5),b=h.fx<r.fx?c(b,h):a(b)):(h=f(h,r,1.5,-.5),b=h.fx<l.fx?c(b,h):a(b)):b=c(b,l)}return b[0]},G=function(d,b,a){b=b.reduce(function(b,c){c=c.r-l(d,c);return c<=b?c:b},Number.MAX_VALUE);return b=a.reduce(function(b,c){c=l(d,c)-c.r;return c<=b?c:b},b)},S=function(d,b){var a=d.reduce(function(a,c){var g=c.r/2;return[{x:c.x,
+y:c.y},{x:c.x+g,y:c.y},{x:c.x-g,y:c.y},{x:c.x,y:c.y+g},{x:c.x,y:c.y-g}].reduce(function(c,a){var g=G(a,d,b);c.margin<g&&(c.point=a,c.margin=g);return c},a)},{point:void 0,margin:-Number.MAX_VALUE}).point,a=R(function(a){return-G({x:a[0],y:a[1]},d,b)},[a.x,a.y]),a={x:a[0],y:a[1]};A(a,d)&&B(a,b)||(a=z(d));return a},T=function(a){var b=a.filter(v);return a.reduce(function(a,d){if(d.value){var c=d.sets;d=c.join();var g=b.reduce(function(a,b){var d=-1<c.indexOf(b.sets[0]);a[d?"internal":"external"].push(b.circle);
+return a},{internal:[],external:[]});a[d]=S(g.internal,g.external)}return a},{})},H=function(a){var b=a.filter(function(a){return 2===a.sets.length}).reduce(function(a,b){b.sets.forEach(function(c,d,g){D(a[c])||(a[c]={overlapping:{},totalOverlap:0});a[c].totalOverlap+=b.value;a[c].overlapping[g[1-d]]=b.value});return a},{});a.filter(v).forEach(function(a){t(a,b[a.sets[0]])});return a},I=function(a,b){return b.totalOverlap-a.totalOverlap},U=function(a){var b=[],d={};a.filter(function(a){return 1===
+a.sets.length}).forEach(function(a){d[a.sets[0]]=a.circle={x:Number.MAX_VALUE,y:Number.MAX_VALUE,r:Math.sqrt(a.value/Math.PI)}});var g=function(a,c){var d=a.circle;d.x=c.x;d.y=c.y;b.push(a)};H(a);var c=a.filter(v).sort(I);g(c.pop(),{x:0,y:0});var e=a.filter(function(a){return 2===a.sets.length});c.forEach(function(a){var c=a.circle,f=c.r,q=a.overlapping,k=b.reduce(function(a,g,k){var h=g.circle;g=C(f,h.r,q[g.sets[0]]);var l=[{x:h.x+g,y:h.y},{x:h.x-g,y:h.y},{x:h.x,y:h.y+g},{x:h.x,y:h.y-g}];b.slice(k+
+1).forEach(function(a){var c=a.circle;a=C(f,c.r,q[a.sets[0]]);l=l.concat(x({x:h.x,y:h.y,r:a},{x:c.x,y:c.y,r:a}))});l.forEach(function(b){c.x=b.x;c.y=b.y;var g=E(d,e);g<a.loss&&(a.loss=g,a.coordinates=b)});return a},{loss:Number.MAX_VALUE,coordinates:void 0});g(a,k.coordinates)});return d},V=function(a){var b={};0<a.length&&(b=U(a),a.filter(function(a){return!v(a)}).forEach(function(a){var d=a.sets;a=d.join();d=d.map(function(a){return b[a]});b[a]=u(d)}));return b},J=function(a){var b={};return D(a)&&
+k(a.value)&&-1<a.value&&p(a.sets)&&0<a.sets.length&&!a.sets.some(function(a){var d=!1;!b[a]&&y(a)?b[a]=!0:d=!0;return d})},K=function(a){a=p(a)?a:[];var b=a.reduce(function(a,c){J(c)&&v(c)&&0<c.value&&-1===a.indexOf(c.sets[0])&&a.push(c.sets[0]);return a},[]).sort(),d=a.reduce(function(a,c){J(c)&&!c.sets.some(function(a){return-1===b.indexOf(a)})&&(a[c.sets.sort().join()]=c);return a},{});b.reduce(function(a,c,b,d){d.slice(b+1).forEach(function(b){a.push(c+","+b)});return a},[]).forEach(function(a){if(!d[a]){var c=
+{sets:a.split(","),value:0};d[a]=c}});return N(d)},W=function(a,b,e){var d=e.bottom-e.top,c=e.right-e.left,d=Math.min(0<c?1/c*a:1,0<d?1/d*b:1);return{scale:d,centerX:a/2-(e.right+e.left)/2*d,centerY:b/2-(e.top+e.bottom)/2*d}};P("venn","scatter",{borderColor:"#cccccc",borderDashStyle:"solid",borderWidth:1,brighten:0,clip:!1,colorByPoint:!0,dataLabels:{enabled:!0,formatter:function(){return this.point.name}},marker:!1,opacity:.75,showInLegend:!1,states:{hover:{opacity:1,halo:!1,borderColor:"#333333"},
+select:{color:"#cccccc",borderColor:"#000000",animation:!1}},tooltip:{pointFormat:"{point.name}: {point.value}"}},{isCartesian:!1,axisTypes:[],directTouch:!0,translate:function(){var a=this.chart;this.processedXData=this.xData;this.generatePoints();var b=K(this.options.data),e=V(b),g=T(b),b=Object.keys(e).filter(function(a){return(a=e[a])&&k(a.r)}).reduce(function(a,c){var b=e[c];c=b.x-b.r;var d=b.x+b.r,f=b.y+b.r,b=b.y-b.r;if(!k(a.left)||a.left>c)a.left=c;if(!k(a.right)||a.right<d)a.right=d;if(!k(a.top)||
+a.top>b)a.top=b;if(!k(a.bottom)||a.bottom<f)a.bottom=f;return a},{top:0,bottom:0,left:0,right:0}),a=W(a.plotWidth,a.plotHeight,b),c=a.scale,f=a.centerX,h=a.centerY;this.points.forEach(function(a){var b=p(a.sets)?a.sets:[],d=b.join(),k=e[d],l,d=g[d];k&&(k.r?l={x:f+k.x*c,y:h+k.y*c,r:k.r*c}:k.d&&(l={d:k.d.reduce(function(a,b){"M"===b[0]?(b[1]=f+b[1]*c,b[2]=h+b[2]*c):"A"===b[0]&&(b[1]*=c,b[2]*=c,b[6]=f+b[6]*c,b[7]=h+b[7]*c);return a.concat(b)},[]).join(" ")}),d?(d.x=f+d.x*c,d.y=h+d.y*c):d={});a.shapeArgs=
+l;d&&l&&(a.plotX=d.x,a.plotY=d.y);a.name=a.options.name||b.join("\u2229")})},drawPoints:function(){var a=this,b=a.chart,e=a.group,f=b.renderer;(a.points||[]).forEach(function(c){var d,g=c.shapeArgs;b.styledMode||(d=a.pointAttribs(c,c.state));c.draw({isNew:!c.graphic,animatableAttribs:g,attribs:d,group:e,renderer:f,shapeType:g&&g.d?"path":"circle"})})},pointAttribs:function(a,b){var d=this.options||{};a=L(d,{color:a&&a.color},a&&a.options||{},b&&d.states[b]||{});return{fill:m(a.color).setOpacity(a.opacity).brighten(a.brightness).get(),
+stroke:a.borderColor,"stroke-width":a.borderWidth,dashstyle:a.borderDashStyle}},animate:function(a){if(!a){var b=n.animObject(this.options.animation);this.points.forEach(function(a){var d=a.shapeArgs;if(a.graphic&&d){var c={},e={};d.d?c.opacity=.001:(c.r=0,e.r=d.r);a.graphic.attr(c).animate(e,b);d.d&&setTimeout(function(){a&&a.graphic&&a.graphic.animate({opacity:1})},b.duration)}},this);this.animate=null}},utils:{addOverlapToSets:H,binarySearch:F,geometry:h,geometryCircles:e,getDistanceBetweenCirclesByOverlap:C,
+loss:E,processVennData:K,sortByTotalOverlap:I}},{draw:f,shouldDraw:function(){return!!this.shapeArgs},isValid:function(){return k(this.value)}})})(A,x,B,n)});
+//# sourceMappingURL=venn.js.map
+</script>
+<script>/*
+ Highcharts JS v7.0.1 (2018-12-19)
+ Gantt series
+
+ (c) 2016-2018 Lars A. V. Cabrera
+
+ License: www.highcharts.com/license
+*/
+(function(C){"object"===typeof module&&module.exports?module.exports=C:"function"===typeof define&&define.amd?define(function(){return C}):C("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(C){(function(c){var v=c.addEvent,x=c.PlotLineOrBand,k=c.merge,m={currentDateIndicator:!0,color:"#ccd6eb",width:2,label:{format:"%a, %b %d %Y, %H:%M",formatter:void 0,rotation:0,style:{fontSize:"10px"}}};v(c.Axis,"afterSetOptions",function(){var c=this.options,q=c.currentDateIndicator;q&&("object"===
+typeof q?(q.label&&q.label.format&&(q.label.formatter=void 0),q=k(m,q)):q=k(m),q.value=new Date,c.plotLines||(c.plotLines=[]),c.plotLines.push(q))});v(x,"render",function(){var k=this.options,q,n;k.currentDateIndicator&&k.label&&(q=k.label.format,n=k.label.formatter,k.value=new Date,k.label.text="function"===typeof n?n(this):c.dateFormat(q,new Date),this.label&&this.label.attr({text:k.label.text}))})})(C);(function(c){var v=function(a){return Array.prototype.slice.call(a,1)},x=c.dateFormat,k=c.defined,
+m=c.isArray,t=c.isNumber,q=function(a){return c.isObject(a,!0)},n=c.merge,B=c.pick,a=c.wrap,g=c.Axis,f=c.Tick,A={top:0,right:1,bottom:2,left:3,0:"top",1:"right",2:"bottom",3:"left"};g.prototype.isNavigatorAxis=function(){return/highcharts-navigator-[xy]axis/.test(this.options.className)};g.prototype.isOuterAxis=function(){var a=this,e=-1,b=!0;a.chart.axes.forEach(function(d,h){d.side!==a.side||d.isNavigatorAxis()||(d===a?e=h:0<=e&&h>e&&(b=!1))});return b};g.prototype.getMaxLabelDimensions=function(a,
+e){var b={width:0,height:0};e.forEach(function(d){d=a[d];var e;q(d)&&(e=q(d.label)?d.label:{},d=e.getBBox?e.getBBox().height:0,e=t(e.textPxLength)?e.textPxLength:0,b.height=Math.max(d,b.height),b.width=Math.max(e,b.width))});return b};c.dateFormats={W:function(a){a=new Date(a);var e;a.setHours(0,0,0,0);a.setDate(a.getDate()-(a.getDay()||7));e=new Date(a.getFullYear(),0,1);return Math.ceil(((a-e)/864E5+1)/7)},E:function(a){return x("%a",a,!0).charAt(0)}};a(g.prototype,"autoLabelAlign",function(a){return this.chart.isStock?
+"left":a.apply(this,v(arguments))});a(f.prototype,"getLabelPosition",function(a,e,b,d,h,l,f,c){var r=this.axis,w=r.reversed,u=r.chart,p=r.options,z=p&&q(p.grid)?p.grid:{},p=l.align,g=A[r.side],y=r.tickPositions,I=this.pos-f,J=t(y[c+1])?y[c+1]-f:r.max+f,G=r.tickSize("tick",!0),y=m(G)?G[0]:0,G=G&&G[1]/2,n;!0===z.enabled?("top"===g?(z=r.top+r.offset,n=z-y):"bottom"===g?(n=u.chartHeight-r.bottom+r.offset,z=n+y):(z=r.top+r.len-r.translate(w?J:I),n=r.top+r.len-r.translate(w?I:J)),"right"===g?(g=u.chartWidth-
+r.right+r.offset,w=g+y):"left"===g?(w=r.left+r.offset,g=w-y):(g=Math.round(r.left+r.translate(w?J:I))-G,w=Math.round(r.left+r.translate(w?I:J))-G),this.slotWidth=w-g,w={x:"left"===p?g:"right"===p?w:g+(w-g)/2,y:n+(z-n)/2},u=u.renderer.fontMetrics(l.style.fontSize,d.element),p=d.getBBox().height,l.useHTML?w.y+=u.b+-(p/2):(p=Math.round(p/u.h),w.y+=(u.b-(u.h-u.f))/2+-((p-1)*u.h/2)),w.x+=r.horiz&&l.x||0):w=a.apply(this,v(arguments));return w});a(g.prototype,"tickSize",function(a){var e=this.maxLabelDimensions,
+b=this.options,d=b&&q(b.grid)?b.grid:{},b=a.apply(this,v(arguments));!0===d.enabled&&(d=2*Math.abs(this.defaultLeftAxisOptions.labels.x),e=d+(this.horiz?e.height:e.width),m(b)?b[0]=e:b=[e]);return b});a(g.prototype,"getTitlePosition",function(a){var e=this.options;if(!0===(e&&q(e.grid)?e.grid:{}).enabled){var b=this.axisTitle,d=b&&b.getBBox().width,h=this.horiz,l=this.left,r=this.top,f=this.width,c=this.height,u=e.title,e=this.opposite,g=this.offset,p=this.tickSize()||[0],F=u.x||0,D=u.y||0,y=B(u.margin,
+h?5:10),b=this.chart.renderer.fontMetrics(u.style&&u.style.fontSize,b).f,p=(h?r+c:l)+p[0]/2*(e?-1:1)*(h?1:-1)+(this.side===A.bottom?b:0);return{x:h?l-d/2-y+F:p+(e?f:0)+g+F,y:h?p-(e?c:0)+(e?b:-b)/2+g+D:r-y+D}}return a.apply(this,v(arguments))});a(g.prototype,"unsquish",function(a){var e=this.options;return!0===(e&&q(e.grid)?e.grid:{}).enabled&&this.categories?this.tickInterval:a.apply(this,v(arguments))});c.addEvent(g,"afterSetOptions",function(a){var e=this.options;a=a.userOptions;var b,d=e&&q(e.grid)?
+e.grid:{};!0===d.enabled&&(b=n(!0,{className:"highcharts-grid-axis "+(a.className||""),dateTimeLabelFormats:{hour:{list:["%H:%M","%H"]},day:{list:["%A, %e. %B","%a, %e. %b","%E"]},week:{list:["Week %W","W%W"]},month:{list:["%B","%b","%o"]}},grid:{borderWidth:1},labels:{padding:2,style:{fontSize:"13px"}},title:{text:null,reserveSpace:!1,rotation:0},units:[["millisecond",[1,10,100]],["second",[1,10]],["minute",[1,5,15]],["hour",[1,6]],["day",[1]],["week",[1]],["month",[1]],["year",null]]},a),"xAxis"===
+this.coll&&(k(a.linkedTo)&&!k(a.tickPixelInterval)&&(b.tickPixelInterval=350),k(a.tickPixelInterval)||!k(a.linkedTo)||k(a.tickPositioner)||k(a.tickInterval)||(b.tickPositioner=function(d,e){var a=this.linkedParent&&this.linkedParent.tickPositions&&this.linkedParent.tickPositions.info;if(a){var h,l,f,g,p=b.units;for(g=0;g<p.length;g++)if(p[g][0]===a.unitName){h=g;break}if(p[h][1])return p[h+1]&&(f=p[h+1][0],l=(p[h+1][1]||[1])[0]),a=c.timeUnits[f],this.tickInterval=a*l,this.getTimeTicks({unitRange:a,
+count:l,unitName:f},d,e,this.options.startOfWeek)}})),n(!0,this.options,b),this.horiz&&(e.minPadding=B(a.minPadding,0),e.maxPadding=B(a.maxPadding,0)),t(e.grid.borderWidth)&&(e.tickWidth=e.lineWidth=d.borderWidth))});a(g.prototype,"setAxisTranslation",function(a){var e=this.options,b=e&&q(e.grid)?e.grid:{},d=this.tickPositions&&this.tickPositions.info,h=this.userOptions.labels||{};this.horiz&&(!0===b.enabled&&this.series.forEach(function(b){b.options.pointRange=0}),d&&(!1===e.dateTimeLabelFormats[d.unitName].range||
+1<d.count)&&!k(h.align)&&(e.labels.align="left",k(h.x)||(e.labels.x=3)));a.apply(this,v(arguments))});a(g.prototype,"trimTicks",function(a){var e=this.options,b=e&&q(e.grid)?e.grid:{},d=this.categories,h=this.tickPositions,l=h[0],f=h[h.length-1],c=this.linkedParent&&this.linkedParent.min||this.min,g=this.linkedParent&&this.linkedParent.max||this.max,u=this.tickInterval,A=l>c,p=f<g,l=l<c&&l+u>c,f=f>g&&f-u<g;!0!==b.enabled||d||!this.horiz&&!this.isLinked||(!A&&!l||e.startOnTick||(h[0]=c),!p&&!f||e.endOnTick||
+(h[h.length-1]=g));a.apply(this,v(arguments))});a(g.prototype,"render",function(a){var e=this.options,b=e&&q(e.grid)?e.grid:{},d,h,l,f,c,g=this.chart.renderer,w=this.horiz;if(!0===b.enabled){if(b=2*Math.abs(this.defaultLeftAxisOptions.labels.x),this.maxLabelDimensions=this.getMaxLabelDimensions(this.ticks,this.tickPositions),b=this.maxLabelDimensions.width+b,d=e.lineWidth,this.rightWall&&this.rightWall.destroy(),a.apply(this),a=this.axisGroup.getBBox(),this.isOuterAxis()&&this.axisLine&&(w&&(b=a.height-
+1),d)){a=this.getLinePath(d);f=a.indexOf("M")+1;c=a.indexOf("L")+1;h=a.indexOf("M")+2;l=a.indexOf("L")+2;if(this.side===A.top||this.side===A.left)b=-b;w?(a[h]+=b,a[l]+=b):(a[f]+=b,a[c]+=b);this.axisLineExtra?this.axisLineExtra.animate({d:a}):this.axisLineExtra=g.path(a).attr({stroke:e.lineColor,"stroke-width":d,zIndex:7}).addClass("highcharts-axis-line").add(this.axisGroup);this.axisLine[this.showAxis?"show":"hide"](!0)}}else a.apply(this)});a(g.prototype,"init",function(f,e,b){function d(b){var a=
+b.options,d=25/11,e=b.chart.renderer.fontMetrics(a.labels.style.fontSize);a.labels||(a.labels={});a.labels.align=B(a.labels.align,"center");b.categories||(a.showLastLabel=!1);b.horiz&&(a.tickLength=h.cellHeight||e.h*d);b.labelRotation=0;a.labels.rotation=0}var h=b&&q(b.grid)?b.grid:{},l,r,z;if(h.enabled)if(k(h.borderColor)&&(b.tickColor=b.lineColor=h.borderColor),m(h.columns))for(r=0,z=h.columns.length;z--;)l=n(b,h.columns[z],{type:"category"}),delete l.grid.columns,l=new g(e,l),l.isColumn=!0,l.columnIndex=
+r,a(l,"labelFormatter",function(b){var a=this.axis,d=a.tickPositions,e=this.value,h=e===d[0],d=e===d[d.length-1],f=c.find(a.series[0].options.data,function(b){return b[a.isXAxis?"x":"y"]===e});this.isFirst=h;this.isLast=d;this.point=f;return b.call(this)}),r++;else f.apply(this,v(arguments)),d(this);else f.apply(this,v(arguments))})})(C);(function(c){var v=c.Chart,x=c.pick;c.addEvent(c.Axis,"afterSetOptions",function(){this.horiz||!c.isNumber(this.options.staticScale)||this.chart.options.chart.height||
+(this.staticScale=this.options.staticScale)});v.prototype.adjustHeight=function(){"adjustHeight"!==this.redrawTrigger&&((this.axes||[]).forEach(function(k){var m=k.chart,v=!!m.initiatedScale&&m.options.animation,q=k.options.staticScale,n;k.staticScale&&c.defined(k.min)&&(n=x(k.unitLength,k.max+k.tickInterval-k.min)*q,n=Math.max(n,q),q=n-m.plotHeight,1<=Math.abs(q)&&(m.plotHeight=n,m.redrawTrigger="adjustHeight",m.setSize(void 0,m.chartHeight+q,v)),k.series.forEach(function(c){(c=c.sharedClipKey&&
+m[c.sharedClipKey])&&c.attr({height:m.plotHeight})}))}),this.initiatedScale=!0);this.redrawTrigger=null};c.addEvent(v,"render",v.prototype.adjustHeight)})(C);var K=function(c){var v=c.extend,x=c.isNumber,k=c.pick,m=function(c,n){var q=c.reduce(function(a,c){var f=k(c.parent,"");void 0===a[f]&&(a[f]=[]);a[f].push(c);return a},{});Object.keys(q).forEach(function(a,c){var f=q[a];""!==a&&-1===n.indexOf(a)&&(f.forEach(function(a){c[""].push(a)}),delete c[a])});return q},t=function(c,n,m,a,g,f){var A=0,
+u=0,e=f&&f.after,b=f&&f.before;n={data:a,depth:m-1,id:c,level:m,parent:n};var d,h;"function"===typeof b&&b(n,f);b=(g[c]||[]).map(function(b){var a=t(b.id,c,m+1,b,g,f),e=b.start;b=!0===b.milestone?e:b.end;d=!x(d)||e<d?e:d;h=!x(h)||b>h?b:h;A=A+1+a.descendants;u=Math.max(a.height+1,u);return a});a&&(a.start=k(a.start,d),a.end=k(a.end,h));v(n,{children:b,descendants:A,height:u});"function"===typeof e&&e(n,f);return n};return{getListOfParents:m,getNode:t,getTree:function(c,n){var k=c.map(function(a){return a.id});
+c=m(c,k);return t("",null,1,null,c,n)}}}(C),L=function(c){var v=c.extend,x=c.isArray,k=c.isObject,m=c.isNumber,t=c.merge,q=c.pick;return{getColor:function(n,k){var a=k.index,g=k.mapOptionsToLevel,f=k.parentColor,A=k.parentColorIndex,u=k.series,e=k.colors,b=k.siblings,d=u.points,h=u.chart.options.chart,l,r,z,E;if(n){d=d[n.i];n=g[n.level]||{};if(g=d&&n.colorByPoint)r=d.index%(e?e.length:h.colorCount),l=e&&e[r];if(!u.chart.styledMode){e=d&&d.options.color;h=n&&n.color;if(z=f)z=(z=n&&n.colorVariation)&&
+"brightness"===z.key?c.color(f).brighten(a/b*z.to).get():f;z=q(e,h,l,z,u.color)}E=q(d&&d.options.colorIndex,n&&n.colorIndex,r,A,k.colorIndex)}return{color:z,colorIndex:E}},getLevelOptions:function(c){var n=null,a,g,f,A;if(k(c))for(n={},f=m(c.from)?c.from:1,A=c.levels,g={},a=k(c.defaults)?c.defaults:{},x(A)&&(g=A.reduce(function(c,e){var b,d;k(e)&&m(e.level)&&(d=t({},e),b="boolean"===typeof d.levelIsConstant?d.levelIsConstant:a.levelIsConstant,delete d.levelIsConstant,delete d.level,e=e.level+(b?0:
+f-1),k(c[e])?v(c[e],d):c[e]=d);return c},{})),A=m(c.to)?c.to:1,c=0;c<=A;c++)n[c]=t({},a,k(g[c])?g[c]:{});return n},setTreeValues:function B(a,c){var f=c.before,g=c.idRoot,u=c.mapIdToNode[g],e=c.points[a.i],b=e&&e.options||{},d=0,h=[];v(a,{levelDynamic:a.level-(("boolean"===typeof c.levelIsConstant?c.levelIsConstant:1)?0:u.level),name:q(e&&e.name,""),visible:g===a.id||("boolean"===typeof c.visible?c.visible:!1)});"function"===typeof f&&(a=f(a,c));a.children.forEach(function(b,e){var f=v({},c);v(f,
+{index:e,siblings:a.children.length,visible:a.visible});b=B(b,f);h.push(b);b.visible&&(d+=b.val)});a.visible=0<d||a.visible;f=q(b.value,d);v(a,{children:h,childrenTotal:d,isLeaf:a.visible&&!d,val:f});return a},updateRootId:function(c){var a;k(c)&&(a=k(c.options)?c.options:{},a=q(c.rootNode,a.rootId,""),k(c.userOptions)&&(c.userOptions.rootId=a),c.rootNode=a);return a}}}(C);(function(c){function v(){return Array.prototype.slice.call(arguments,1)}function x(a){a.apply(this);this.drawBreaks(this.xAxis,
+["x"]);this.drawBreaks(this.yAxis,m(this.pointArrayMap,["y"]))}var k=c.addEvent,m=c.pick,t=c.wrap,q=c.extend,n=c.isArray,B=c.fireEvent,a=c.Axis,g=c.Series;q(a.prototype,{isInBreak:function(a,c){var f=a.repeat||Infinity,e=a.from,b=a.to-a.from;c=c>=e?(c-e)%f:f-(e-c)%f;return a.inclusive?c<=b:c<b&&0!==c},isInAnyBreak:function(a,c){var f=this.options.breaks,e=f&&f.length,b,d,h;if(e){for(;e--;)this.isInBreak(f[e],a)&&(b=!0,d||(d=m(f[e].showPoints,this.isXAxis?!1:!0)));h=b&&c?b&&!d:b}return h}});k(a,"afterInit",
+function(){"function"===typeof this.setBreaks&&this.setBreaks(this.options.breaks,!1)});k(a,"afterSetTickPositions",function(){if(this.isBroken){var a=this.tickPositions,c=this.tickPositions.info,g=[],e;for(e=0;e<a.length;e++)this.isInAnyBreak(a[e])||g.push(a[e]);this.tickPositions=g;this.tickPositions.info=c}});k(a,"afterSetOptions",function(){this.isBroken&&(this.options.ordinal=!1)});a.prototype.setBreaks=function(c,g){function f(a){var d=a,e,c;for(c=0;c<b.breakArray.length;c++)if(e=b.breakArray[c],
+e.to<=a)d-=e.len;else if(e.from>=a)break;else if(b.isInBreak(e,a)){d-=a-e.from;break}return d}function e(a){var d,e;for(e=0;e<b.breakArray.length&&!(d=b.breakArray[e],d.from>=a);e++)d.to<a?a+=d.len:b.isInBreak(d,a)&&(a+=d.len);return a}var b=this,d=n(c)&&!!c.length;b.isDirty=b.isBroken!==d;b.isBroken=d;b.options.breaks=b.userOptions.breaks=c;b.forceRedraw=!0;d||b.val2lin!==f||(delete b.val2lin,delete b.lin2val);d&&(b.userOptions.ordinal=!1,b.val2lin=f,b.lin2val=e,b.setExtremes=function(b,d,e,c,f){if(this.isBroken){for(;this.isInAnyBreak(b);)b-=
+this.closestPointRange;for(;this.isInAnyBreak(d);)d-=this.closestPointRange}a.prototype.setExtremes.call(this,b,d,e,c,f)},b.setAxisTranslation=function(d){a.prototype.setAxisTranslation.call(this,d);this.unitLength=null;if(this.isBroken){d=b.options.breaks;var e=[],c=[],h=0,f,g,k=b.userMin||b.min,p=b.userMax||b.max,F=m(b.pointRangePadding,0),D,y;d.forEach(function(a){g=a.repeat||Infinity;b.isInBreak(a,k)&&(k+=a.to%g-k%g);b.isInBreak(a,p)&&(p-=p%g-a.from%g)});d.forEach(function(b){D=b.from;for(g=b.repeat||
+Infinity;D-g>k;)D-=g;for(;D<k;)D+=g;for(y=D;y<p;y+=g)e.push({value:y,move:"in"}),e.push({value:y+(b.to-b.from),move:"out",size:b.breakSize})});e.sort(function(b,a){return b.value===a.value?("in"===b.move?0:1)-("in"===a.move?0:1):b.value-a.value});f=0;D=k;e.forEach(function(b){f+="in"===b.move?1:-1;1===f&&"in"===b.move&&(D=b.value);0===f&&(c.push({from:D,to:b.value,len:b.value-D-(b.size||0)}),h+=b.value-D-(b.size||0))});b.breakArray=c;b.unitLength=p-k-h+F;B(b,"afterBreaks");b.staticScale?b.transA=
+b.staticScale:b.unitLength&&(b.transA*=(p-b.min+F)/b.unitLength);F&&(b.minPixelPadding=b.transA*b.minPointOffset);b.min=k;b.max=p}});m(g,!0)&&this.chart.redraw()};t(g.prototype,"generatePoints",function(a){a.apply(this,v(arguments));var c=this.xAxis,f=this.yAxis,e=this.points,b,d=e.length,h=this.options.connectNulls,g;if(c&&f&&(c.options.breaks||f.options.breaks))for(;d--;)b=e[d],g=null===b.y&&!1===h,g||!c.isInAnyBreak(b.x,!0)&&!f.isInAnyBreak(b.y,!0)||(e.splice(d,1),this.data[d]&&this.data[d].destroyElements())});
+c.Series.prototype.drawBreaks=function(a,c){var f=this,e=f.points,b,d,h,g;a&&c.forEach(function(c){b=a.breakArray||[];d=a.isXAxis?a.min:m(f.options.threshold,a.min);e.forEach(function(e){g=m(e["stack"+c.toUpperCase()],e[c]);b.forEach(function(b){h=!1;if(d<b.from&&g>b.to||d>b.from&&g<b.from)h="pointBreak";else if(d<b.from&&g>b.from&&g<b.to||d>b.from&&g>b.to&&g<b.from)h="pointInBreak";h&&B(a,h,{point:e,brk:b})})})})};c.Series.prototype.gappedPath=function(){var a=this.currentDataGrouping,g=a&&a.totalRange,
+a=this.options.gapSize,k=this.points.slice(),e=k.length-1,b=this.yAxis;if(a&&0<e)for("value"!==this.options.gapUnit&&(a*=this.closestPointRange),g&&g>a&&(a=g);e--;)k[e+1].x-k[e].x>a&&(g=(k[e].x+k[e+1].x)/2,k.splice(e+1,0,{isNull:!0,x:g}),this.options.stacking&&(g=b.stacks[this.stackKey][g]=new c.StackItem(b,b.options.stackLabels,!1,g,this.stack),g.total=0));return this.getGraphPath(k)};t(c.seriesTypes.column.prototype,"drawPoints",x);t(c.Series.prototype,"drawPoints",x)})(C);(function(c,v,x){var k=
+function(b){return Array.prototype.slice.call(b,1)},m=c.defined,t=c.extend,q=c.find,n=c.fireEvent,B=x.getLevelOptions,a=c.merge,g=c.isNumber,f=function(b){return c.isObject(b,!0)},A=c.isString,u=c.pick,e=c.wrap;x=c.Axis;var b=c.Tick,d=function(b,a){var d,c;for(d in a)a.hasOwnProperty(d)&&(c=a[d],e(b,d,c))},h=function(b,a){var d=b.collapseStart;b=b.collapseEnd;b>=a&&(d-=.5);return{from:d,to:b,showPoints:!1}},l=function(b){return Object.keys(b.mapOfPosToGridNode).reduce(function(a,d){d=+d;b.min<=d&&
+b.max>=d&&!b.isInAnyBreak(d)&&a.push(d);return a},[])},r=function(b,a){var d=b.options.breaks||[],e=h(a,b.max);return d.some(function(b){return b.from===e.from&&b.to===e.to})},z=function(b,a){var d=b.options.breaks||[];b=h(a,b.max);d.push(b);return d},E=function(b,a){var d=b.options.breaks||[],e=h(a,b.max);return d.reduce(function(b,a){a.to===e.to&&a.from===e.from||b.push(a);return b},[])},w=function(b,a){var d=b.labelIcon,e=!d,h=a.renderer,g=a.xy,f=a.options,l=f.width,r=f.height,p=g.x-l/2-f.padding,
+g=g.y-r/2,k=a.collapsed?90:180,w=a.show&&c.isNumber(g);e&&(b.labelIcon=d=h.path(h.symbols[f.type](f.x,f.y,l,r)).addClass("highcharts-label-icon").add(a.group));w||d.attr({y:-9999});h.styledMode||d.attr({"stroke-width":1,fill:u(a.color,"#666666")}).css({cursor:"pointer",stroke:f.lineColor,strokeWidth:f.lineWidth});d[e?"attr":"animate"]({translateX:p,translateY:g,rotation:k})},H=function(b,a,d){var e=[],c=[],h={},g={},l=-1,r="boolean"===typeof a?a:!1;b=v.getTree(b,{after:function(b){b=g[b.pos];var a=
+0,d=0;b.children.forEach(function(b){d+=b.descendants+1;a=Math.max(b.height+1,a)});b.descendants=d;b.height=a;b.collapsed&&c.push(b)},before:function(b){var a=f(b.data)?b.data:{},d=A(a.name)?a.name:"",c=h[b.parent],c=f(c)?g[c.pos]:null,p=function(b){return b.name===d},k;r&&f(c)&&(k=q(c.children,p))?(p=k.pos,k.nodes.push(b)):p=l++;g[p]||(g[p]=k={depth:c?c.depth+1:0,name:d,nodes:[b],children:[],pos:p},-1!==p&&e.push(d),f(c)&&c.children.push(k));A(b.id)&&(h[b.id]=b);!0===a.collapsed&&(k.collapsed=!0);
+b.pos=p}});g=function(b,a){var d=function(b,e,c){var h=e+(-1===e?0:a-1),g=(h-e)/2,l=e+g;b.nodes.forEach(function(b){var a=b.data;f(a)&&(a.y=e+a.seriesIndex,delete a.seriesIndex);b.pos=l});c[l]=b;b.pos=l;b.tickmarkOffset=g+.5;b.collapseStart=h+.5;b.children.forEach(function(b){d(b,h+1,c);h=b.collapseEnd-.5});b.collapseEnd=h+.5;return c};return d(b["-1"],-1,{})}(g,d);return{categories:e,mapOfIdToNode:h,mapOfPosToGridNode:g,collapsedNodes:c,tree:b}};d(x.prototype,{init:function(b,d,e){var h=this,g,f=
+"treegrid"===e.type;f&&(e=a({grid:{enabled:!0},labels:{align:"left",levels:[{level:void 0},{level:1,style:{fontWeight:"bold"}}],symbol:{type:"triangle",x:-5,y:-5,height:10,width:10,padding:5}},uniqueNames:!1},e,{reversed:!0,grid:{columns:void 0}}));b.apply(h,[d,e]);f&&(c.addEvent(h.chart,"beforeRender",function(){var b=h.options&&h.options.labels;h.updateYNames();h.series.forEach(function(b){b.yData=b.options.data.map(function(b){return b.y})});h.mapOptionsToLevel=B({defaults:b,from:1,levels:b.levels,
+to:h.tree.height});g=c.addEvent(h,"foundExtremes",function(){h.collapsedNodes.forEach(function(b){b=z(h,b);h.setBreaks(b,!1)});g()})}),h.hasNames=!0,h.options.showLastLabel=!0)},getMaxLabelDimensions:function(b){var a=this.options,d=a&&a.labels,a=d&&g(d.indentation)?a.labels.indentation:0,d=b.apply(this,k(arguments)),e;"treegrid"===this.options.type&&(e=this.mapOfPosToGridNode[-1].height,d.width+=a*(e-1));return d},generateTick:function(a,d){var e=f(this.mapOptionsToLevel)?this.mapOptionsToLevel:
+{},c=this.ticks,h=c[d],g,l;"treegrid"===this.options.type?(l=this.mapOfPosToGridNode[d],(e=e[l.depth])&&(g={labels:e}),h?(h.parameters.category=l.name,h.options=g,h.addLabel()):c[d]=new b(this,d,null,void 0,{category:l.name,tickmarkOffset:l.tickmarkOffset,options:g})):a.apply(this,k(arguments))},setTickInterval:function(b){var a=this.options;"treegrid"===a.type?(this.min=u(this.userMin,a.min,this.dataMin),this.max=u(this.userMax,a.max,this.dataMax),n(this,"foundExtremes"),this.setAxisTranslation(!0),
+this.tickmarkOffset=.5,this.tickInterval=1,this.tickPositions=l(this)):b.apply(this,k(arguments))}});d(b.prototype,{getLabelPosition:function(b,a,d,e,c,h,l,r,k){var p=u(this.options&&this.options.labels,h);h=this.pos;var w=this.axis,z="treegrid"===w.options.type;b=b.apply(this,[a,d,e,c,p,l,r,k]);z&&(a=p&&f(p.symbol)?p.symbol:{},p=p&&g(p.indentation)?p.indentation:0,h=(h=(w=w.mapOfPosToGridNode)&&w[h])&&h.depth||1,b.x+=a.width+2*a.padding+(h-1)*p);return b},renderLabel:function(b){var a=this,d=a.pos,
+e=a.axis,h=a.label,g=e.mapOfPosToGridNode,l=e.options,p=u(a.options&&a.options.labels,l&&l.labels),z=p&&f(p.symbol)?p.symbol:{},n=(g=g&&g[d])&&g.depth,l="treegrid"===l.type,A=!(!h||!h.element),q=-1<e.tickPositions.indexOf(d),d=e.chart.styledMode;l&&g&&A&&h.addClass("highcharts-treegrid-node-level-"+n);b.apply(a,k(arguments));l&&g&&A&&0<g.descendants&&(e=r(e,g),w(a,{color:!d&&h.styles.color,collapsed:e,group:h.parentGroup,options:z,renderer:h.renderer,show:q,xy:h.xy}),z="highcharts-treegrid-node-"+
+(e?"expanded":"collapsed"),h.addClass("highcharts-treegrid-node-"+(e?"collapsed":"expanded")).removeClass(z),d||h.css({cursor:"pointer"}),[h,a.labelIcon].forEach(function(b){b.attachedTreeGridEvents||(c.addEvent(b.element,"mouseover",function(){var b=h;b.addClass("highcharts-treegrid-node-active");b.renderer.styledMode||b.css({textDecoration:"underline"})}),c.addEvent(b.element,"mouseout",function(){var b=h,a=p,a=m(a.style)?a.style:{};b.removeClass("highcharts-treegrid-node-active");b.renderer.styledMode||
+b.css({textDecoration:a.textDecoration})}),c.addEvent(b.element,"click",function(){a.toggleCollapse()}),b.attachedTreeGridEvents=!0)}))}});t(b.prototype,{collapse:function(b){var a=this.axis,d=z(a,a.mapOfPosToGridNode[this.pos]);a.setBreaks(d,u(b,!0))},expand:function(b){var a=this.axis,d=E(a,a.mapOfPosToGridNode[this.pos]);a.setBreaks(d,u(b,!0))},toggleCollapse:function(b){var a=this.axis,d;d=a.mapOfPosToGridNode[this.pos];d=r(a,d)?E(a,d):z(a,d);a.setBreaks(d,u(b,!0))}});x.prototype.updateYNames=
+function(){var b=this.options,a=b.uniqueNames,d=!this.isXAxis,e=this.series,c=0;"treegrid"===b.type&&d&&(b=e.reduce(function(b,d){d.visible&&(d.options.data.forEach(function(a){f(a)&&(a.seriesIndex=c,b.push(a))}),!0===a&&c++);return b},[]),b=H(b,a,!0===a?c:1),this.categories=b.categories,this.mapOfPosToGridNode=b.mapOfPosToGridNode,this.collapsedNodes=b.collapsedNodes,this.hasNames=!0,this.tree=b.tree)};x.prototype.utils={getNode:v.getNode}})(C,K,L);K=function(c){function v(a,c,f){f=f||0;var g=a.length-
+1;c-=1e-7;for(var k,e;f<=g;)if(k=g+f>>1,e=c-a[k].xMin,0<e)f=k+1;else if(0>e)g=k-1;else return k;return 0<f?f-1:0}function x(a,c){for(var g=v(a,c.x+1)+1;g--;){var k;if(k=a[g].xMax>=c.x)k=a[g],k=c.x<=k.xMax&&c.x>=k.xMin&&c.y<=k.yMax&&c.y>=k.yMin;if(k)return g}return-1}function k(a){var c=[];if(a.length){c.push("M",a[0].start.x,a[0].start.y);for(var f=0;f<a.length;++f)c.push("L",a[f].end.x,a[f].end.y)}return c}function m(a,c){a.yMin=q(a.yMin,c.yMin);a.yMax=t(a.yMax,c.yMax);a.xMin=q(a.xMin,c.xMin);a.xMax=
+t(a.xMax,c.xMax)}var t=Math.min,q=Math.max,n=Math.abs,B=c.pick;return{straight:function(a,c){return{path:["M",a.x,a.y,"L",c.x,c.y],obstacles:[{start:a,end:c}]}},simpleConnect:c.extend(function(a,c,f){function g(b,a,d,c,e){b={x:b.x,y:b.y};b[a]=d[c||a]+(e||0);return b}function m(b,a,d){var c=n(a[d]-b[d+"Min"])>n(a[d]-b[d+"Max"]);return g(a,d,b,d+(c?"Max":"Min"),c?1:-1)}var e=[],b,d=B(f.startDirectionX,n(c.x-a.x)>n(c.y-a.y))?"x":"y",h=f.chartObstacles,l=x(h,a);f=x(h,c);var r;-1<f?(b=h[f],f=m(b,c,d),
+b={start:f,end:c},r=f):r=c;-1<l&&(h=h[l],f=m(h,a,d),e.push({start:a,end:f}),f[d]>a[d]===f[d]>r[d]&&(d="y"===d?"x":"y",c=a[d]<c[d],e.push({start:f,end:g(f,d,h,d+(c?"Max":"Min"),c?1:-1)}),d="y"===d?"x":"y"));a=e.length?e[e.length-1].end:a;f=g(a,d,r);e.push({start:a,end:f});d=g(f,"y"===d?"x":"y",r);e.push({start:f,end:d});e.push(b);return{path:k(e),obstacles:e}},{requiresObstacles:!0}),fastAvoid:c.extend(function(a,c,f){function g(b,a,d){var c,e,h,g,f,l=b.x<a.x?1:-1;b.x<a.x?(c=b,e=a):(c=a,e=b);b.y<a.y?
+(g=b,h=a):(g=a,h=b);for(f=0>l?t(v(y,e.x),y.length-1):0;y[f]&&(0<l&&y[f].xMin<=e.x||0>l&&y[f].xMax>=c.x);){if(y[f].xMin<=e.x&&y[f].xMax>=c.x&&y[f].yMin<=h.y&&y[f].yMax>=g.y)return d?{y:b.y,x:b.x<a.x?y[f].xMin-1:y[f].xMax+1,obstacle:y[f]}:{x:b.x,y:b.y<a.y?y[f].yMin-1:y[f].yMax+1,obstacle:y[f]};f+=l}return a}function u(b,a,d,c,e){var h=e.soft,f=e.hard,l=c?"x":"y",r={x:a.x,y:a.y},k={x:a.x,y:a.y};e=b[l+"Max"]>=h[l+"Max"];var h=b[l+"Min"]<=h[l+"Min"],w=b[l+"Max"]>=f[l+"Max"],f=b[l+"Min"]<=f[l+"Min"],p=
+n(b[l+"Min"]-a[l]),z=n(b[l+"Max"]-a[l]);d=10>n(p-z)?a[l]<d[l]:z<p;k[l]=b[l+"Min"];r[l]=b[l+"Max"];b=g(a,k,c)[l]!==k[l];a=g(a,r,c)[l]!==r[l];d=b?a?d:!0:a?!1:d;d=h?e?d:!0:e?!1:d;return f?w?d:!0:w?!1:d}function e(b,a,d){if(b.x===a.x&&b.y===a.y)return[];var c=d?"x":"y",h,l,r,k,w=f.obstacleOptions.margin;h={soft:{xMin:H,xMax:p,yMin:F,yMax:D},hard:f.hardBounds};l=x(y,b);-1<l?(l=y[l],h=u(l,b,a,d,h),m(l,f.hardBounds),k=d?{y:b.y,x:l[h?"xMax":"xMin"]+(h?1:-1)}:{x:b.x,y:l[h?"yMax":"yMin"]+(h?1:-1)},r=x(y,k),
+-1<r&&(r=y[r],m(r,f.hardBounds),k[c]=h?q(l[c+"Max"]-w+1,(r[c+"Min"]+l[c+"Max"])/2):t(l[c+"Min"]+w-1,(r[c+"Max"]+l[c+"Min"])/2),b.x===k.x&&b.y===k.y?(E&&(k[c]=h?q(l[c+"Max"],r[c+"Max"])+1:t(l[c+"Min"],r[c+"Min"])-1),E=!E):E=!1),b=[{start:b,end:k}]):(c=g(b,{x:d?a.x:b.x,y:d?b.y:a.y},d),b=[{start:b,end:{x:c.x,y:c.y}}],c[d?"x":"y"]!==a[d?"x":"y"]&&(h=u(c.obstacle,c,a,!d,h),m(c.obstacle,f.hardBounds),h={x:d?c.x:c.obstacle[h?"xMax":"xMin"]+(h?1:-1),y:d?c.obstacle[h?"yMax":"yMin"]+(h?1:-1):c.y},d=!d,b=b.concat(e({x:c.x,
+y:c.y},h,d))));return b=b.concat(e(b[b.length-1].end,a,!d))}function b(b,a,d){var c=t(b.xMax-a.x,a.x-b.xMin)<t(b.yMax-a.y,a.y-b.yMin);d=u(b,a,d,c,{soft:f.hardBounds,hard:f.hardBounds});return c?{y:a.y,x:b[d?"xMax":"xMin"]+(d?1:-1)}:{x:a.x,y:b[d?"yMax":"yMin"]+(d?1:-1)}}var d=B(f.startDirectionX,n(c.x-a.x)>n(c.y-a.y)),h=d?"x":"y",l,r,z=[],E=!1,w=f.obstacleMetrics,H=t(a.x,c.x)-w.maxWidth-10,p=q(a.x,c.x)+w.maxWidth+10,F=t(a.y,c.y)-w.maxHeight-10,D=q(a.y,c.y)+w.maxHeight+10,y=f.chartObstacles;l=v(y,H);
+w=v(y,p);y=y.slice(l,w+1);-1<(w=x(y,c))&&(r=b(y[w],c,a),z.push({end:c,start:r}),c=r);for(;-1<(w=x(y,c));)l=0>c[h]-a[h],r={x:c.x,y:c.y},r[h]=y[w][l?h+"Max":h+"Min"]+(l?1:-1),z.push({end:c,start:r}),c=r;a=e(a,c,d);a=a.concat(z.reverse());return{path:k(a),obstacles:a}},{requiresObstacles:!0})}}(C);(function(c){c.SVGRenderer.prototype.symbols.arrow=function(c,x,k,m){return["M",c,x+m/2,"L",c+k,x,"L",c,x+m/2,"L",c+k,x+m]};c.SVGRenderer.prototype.symbols["arrow-half"]=function(v,x,k,m){return c.SVGRenderer.prototype.symbols.arrow(v,
+x,k/2,m)};c.SVGRenderer.prototype.symbols["triangle-left"]=function(c,x,k,m){return["M",c+k,x,"L",c,x+m/2,"L",c+k,x+m,"Z"]};c.SVGRenderer.prototype.symbols["arrow-filled"]=c.SVGRenderer.prototype.symbols["triangle-left"];c.SVGRenderer.prototype.symbols["triangle-left-half"]=function(v,x,k,m){return c.SVGRenderer.prototype.symbols["triangle-left"](v,x,k/2,m)};c.SVGRenderer.prototype.symbols["arrow-filled-half"]=c.SVGRenderer.prototype.symbols["triangle-left-half"]})(C);(function(c,v){function x(b){var a=
+b.shapeArgs;return a?{xMin:a.x,xMax:a.x+a.width,yMin:a.y,yMax:a.y+a.height}:(a=b.graphic&&b.graphic.getBBox())?{xMin:b.plotX-a.width/2,xMax:b.plotX+a.width/2,yMin:b.plotY-a.height/2,yMax:b.plotY+a.height/2}:null}function k(b){for(var a=b.length,c=0,f,g,k=[],n=function(b,a,c){c=A(c,10);var d=b.yMax+c>a.yMin-c&&b.yMin-c<a.yMax+c,h=b.xMax+c>a.xMin-c&&b.xMin-c<a.xMax+c,f=d?b.xMin>a.xMax?b.xMin-a.xMax:a.xMin-b.xMax:Infinity,l=h?b.yMin>a.yMax?b.yMin-a.yMax:a.yMin-b.yMax:Infinity;return h&&d?c?n(b,a,Math.floor(c/
+2)):Infinity:e(f,l)};c<a;++c)for(f=c+1;f<a;++f)g=n(b[c],b[f]),80>g&&k.push(g);k.push(80);return u(Math.floor(k.sort(function(b,a){return b-a})[Math.floor(k.length/10)]/2-1),1)}function m(b,a,c){this.init(b,a,c)}function t(b){this.init(b)}function q(b){if(b.options.pathfinder||b.series.reduce(function(b,a){a.options&&f(!0,a.options.connectors=a.options.connectors||{},a.options.pathfinder);return b||a.options&&a.options.pathfinder},!1))f(!0,b.options.connectors=b.options.connectors||{},b.options.pathfinder),
+c.error('WARNING: Pathfinder options have been renamed. Use "chart.connectors" or "series.connectors" instead.')}var n=c.defined,B=c.deg2rad,a=c.extend,g=c.addEvent,f=c.merge,A=c.pick,u=Math.max,e=Math.min;a(c.defaultOptions,{connectors:{type:"straight",lineWidth:1,marker:{enabled:!1,align:"center",verticalAlign:"middle",inside:!1,lineWidth:1},startMarker:{symbol:"diamond"},endMarker:{symbol:"arrow-filled"}}});m.prototype={init:function(b,a,c){this.fromPoint=b;this.toPoint=a;this.options=c;this.chart=
+b.series.chart;this.pathfinder=this.chart.pathfinder},renderPath:function(b,a,c){var d=this.chart,e=d.styledMode,h=d.pathfinder,f=!d.options.chart.forExport&&!1!==c,g=this.graphics&&this.graphics.path;h.group||(h.group=d.renderer.g().addClass("highcharts-pathfinder-group").attr({zIndex:-1}).add(d.seriesGroup));h.group.translate(d.plotLeft,d.plotTop);g&&g.renderer||(g=d.renderer.path().add(h.group),e||g.attr({opacity:0}));g.attr(a);b={d:b};e||(b.opacity=1);g[f?"animate":"attr"](b,c);this.graphics=
+this.graphics||{};this.graphics.path=g},addMarker:function(b,a,c){var d=this.fromPoint.series.chart,e=d.pathfinder,d=d.renderer,h="start"===b?this.fromPoint:this.toPoint,f=h.getPathfinderAnchorPoint(a),g,k;a.enabled&&(c="start"===b?{x:c[4],y:c[5]}:{x:c[c.length-5],y:c[c.length-4]},c=h.getRadiansToVector(c,f),f=h.getMarkerVector(c,a.radius,f),c=-c/B,a.width&&a.height?(g=a.width,k=a.height):g=k=2*a.radius,this.graphics=this.graphics||{},f={x:f.x-g/2,y:f.y-k/2,width:g,height:k,rotation:c,rotationOriginX:f.x,
+rotationOriginY:f.y},this.graphics[b]?this.graphics[b].animate(f):(this.graphics[b]=d.symbol(a.symbol).addClass("highcharts-point-connecting-path-"+b+"-marker").attr(f).add(e.group),d.styledMode||this.graphics[b].attr({fill:a.color||this.fromPoint.color,stroke:a.lineColor,"stroke-width":a.lineWidth,opacity:0}).animate({opacity:1},h.series.options.animation)))},getPath:function(b){var a=this.pathfinder,e=this.chart,g=a.algorithms[b.type],k=a.chartObstacles;if("function"!==typeof g)c.error('"'+b.type+
+'" is not a Pathfinder algorithm.');else return g.requiresObstacles&&!k&&(k=a.chartObstacles=a.getChartObstacles(b),e.options.connectors.algorithmMargin=b.algorithmMargin,a.chartObstacleMetrics=a.getObstacleMetrics(k)),g(this.fromPoint.getPathfinderAnchorPoint(b.startMarker),this.toPoint.getPathfinderAnchorPoint(b.endMarker),f({chartObstacles:k,lineObstacles:a.lineObstacles||[],obstacleMetrics:a.chartObstacleMetrics,hardBounds:{xMin:0,xMax:e.plotWidth,yMin:0,yMax:e.plotHeight},obstacleOptions:{margin:b.algorithmMargin},
+startDirectionX:a.getAlgorithmStartDirection(b.startMarker)},b))},render:function(){var b=this.fromPoint,a=b.series,c=a.chart,g=c.pathfinder,k=f(c.options.connectors,a.options.connectors,b.options.connectors,this.options),z={};c.styledMode||(z.stroke=k.lineColor||b.color,z["stroke-width"]=k.lineWidth,k.dashStyle&&(z.dashstyle=k.dashStyle));z.class="highcharts-point-connecting-path highcharts-color-"+b.colorIndex;k=f(z,k);n(k.marker.radius)||(k.marker.radius=e(u(Math.ceil((k.algorithmMargin||8)/2)-
+1,1),5));b=this.getPath(k);c=b.path;b.obstacles&&(g.lineObstacles=g.lineObstacles||[],g.lineObstacles=g.lineObstacles.concat(b.obstacles));this.renderPath(c,z,a.options.animation);this.addMarker("start",f(k.marker,k.startMarker),c);this.addMarker("end",f(k.marker,k.endMarker),c)},destroy:function(){this.graphics&&(c.objectEach(this.graphics,function(b){b.destroy()}),delete this.graphics)}};t.prototype={algorithms:v,init:function(b){this.chart=b;this.connections=[];g(b,"redraw",function(){this.pathfinder.update()})},
+update:function(b){var a=this.chart,e=this,f=e.connections;e.connections=[];a.series.forEach(function(b){b.visible&&b.points.forEach(function(b){var d,h=b.options&&b.options.connect&&c.splat(b.options.connect);b.visible&&!1!==b.isInside&&h&&h.forEach(function(h){d=a.get("string"===typeof h?h:h.to);d instanceof c.Point&&d.series.visible&&d.visible&&!1!==d.isInside&&e.connections.push(new m(b,d,"string"===typeof h?{}:h))})})});for(var g=0,k,n,w=f.length,q=e.connections.length;g<w;++g){n=!1;for(k=0;k<
+q;++k)if(f[g].fromPoint===e.connections[k].fromPoint&&f[g].toPoint===e.connections[k].toPoint){e.connections[k].graphics=f[g].graphics;n=!0;break}n||f[g].destroy()}delete this.chartObstacles;delete this.lineObstacles;e.renderConnections(b)},renderConnections:function(b){b?this.chart.series.forEach(function(b){var a=function(){var a=b.chart.pathfinder;(a&&a.connections||[]).forEach(function(a){a.fromPoint&&a.fromPoint.series===b&&a.render()});b.pathfinderRemoveRenderEvent&&(b.pathfinderRemoveRenderEvent(),
+delete b.pathfinderRemoveRenderEvent)};!1===b.options.animation?a():b.pathfinderRemoveRenderEvent=g(b,"afterAnimate",a)}):this.connections.forEach(function(b){b.render()})},getChartObstacles:function(b){for(var a=[],c=this.chart.series,e=A(b.algorithmMargin,0),f,g=0,m=c.length;g<m;++g)if(c[g].visible)for(var w=0,q=c[g].points.length,p;w<q;++w)p=c[g].points[w],p.visible&&(p=x(p))&&a.push({xMin:p.xMin-e,xMax:p.xMax+e,yMin:p.yMin-e,yMax:p.yMax+e});a=a.sort(function(b,a){return b.xMin-a.xMin});n(b.algorithmMargin)||
+(f=b.algorithmMargin=k(a),a.forEach(function(b){b.xMin-=f;b.xMax+=f;b.yMin-=f;b.yMax+=f}));return a},getObstacleMetrics:function(b){for(var a=0,c=0,e,f,g=b.length;g--;)e=b[g].xMax-b[g].xMin,f=b[g].yMax-b[g].yMin,a<e&&(a=e),c<f&&(c=f);return{maxHeight:c,maxWidth:a}},getAlgorithmStartDirection:function(b){var a="top"!==b.verticalAlign&&"bottom"!==b.verticalAlign;return"left"!==b.align&&"right"!==b.align?a?void 0:!1:a?!0:void 0}};c.Connection=m;c.Pathfinder=t;a(c.Point.prototype,{getPathfinderAnchorPoint:function(b){var a=
+x(this),c,e;switch(b.align){case "right":c="xMax";break;case "left":c="xMin"}switch(b.verticalAlign){case "top":e="yMin";break;case "bottom":e="yMax"}return{x:c?a[c]:(a.xMin+a.xMax)/2,y:e?a[e]:(a.yMin+a.yMax)/2}},getRadiansToVector:function(b,a){n(a)||(a=x(this),a={x:(a.xMin+a.xMax)/2,y:(a.yMin+a.yMax)/2});return Math.atan2(a.y-b.y,b.x-a.x)},getMarkerVector:function(b,a,c){for(var e=2*Math.PI,d=x(this),f=d.xMax-d.xMin,g=d.yMax-d.yMin,h=Math.atan2(g,f),k=!1,f=f/2,n=g/2,m=d.xMin+f,d=d.yMin+n,q=m,u=
+d,t={},v=1,A=1;b<-Math.PI;)b+=e;for(;b>Math.PI;)b-=e;e=Math.tan(b);b>-h&&b<=h?(A=-1,k=!0):b>h&&b<=Math.PI-h?A=-1:b>Math.PI-h||b<=-(Math.PI-h)?(v=-1,k=!0):v=-1;k?(q+=v*f,u+=A*f*e):(q+=g/(2*e)*v,u+=A*n);c.x!==m&&(q=c.x);c.y!==d&&(u=c.y);t.x=q+a*Math.cos(b);t.y=u-a*Math.sin(b);return t}});c.Chart.prototype.callbacks.push(function(b){!1!==b.options.connectors.enabled&&(q(b),this.pathfinder=new t(this),this.pathfinder.update(!0))})})(C,K);(function(c){var v=c.addEvent,x=c.defined,k=c.Color,m=c.seriesTypes.column,
+t=c.correctFloat,q=c.isNumber,n=c.isObject,B=c.merge,a=c.pick,g=c.seriesType,f=c.Axis,A=c.Point,u=c.Series;g("xrange","column",{colorByPoint:!0,dataLabels:{verticalAlign:"middle",inside:!0,formatter:function(){var a=this.point.partialFill;n(a)&&(a=a.amount);x(a)||(a=0);return t(100*a)+"%"}},tooltip:{headerFormat:'\x3cspan style\x3d"font-size: 10px"\x3e{point.x} - {point.x2}\x3c/span\x3e\x3cbr/\x3e',pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.yCategory}\x3c/b\x3e\x3cbr/\x3e'},
+borderRadius:3,pointRange:0},{type:"xrange",parallelArrays:["x","x2","y"],requireSorting:!1,animate:c.seriesTypes.line.prototype.animate,cropShoulder:1,getExtremesFromAll:!0,autoIncrement:c.noop,getColumnMetrics:function(){function a(){c.series.forEach(function(b){var a=b.xAxis;b.xAxis=b.yAxis;b.yAxis=a})}var b,c=this.chart;a();b=m.prototype.getColumnMetrics.call(this);a();return b},cropData:function(a,b,c,f){b=u.prototype.cropData.call(this,this.x2Data,b,c,f);b.xData=a.slice(b.start,b.end);return b},
+translatePoint:function(c){var b=this.xAxis,e=this.yAxis,f=this.columnMetrics,g=this.options,k=g.minPointLength||0,m=c.plotX,u=a(c.x2,c.x+(c.len||0)),w=b.translate(u,0,0,0,1),u=Math.abs(w-m),t=this.chart.inverted,p=a(g.borderWidth,1)%2/2,v=f.offset,A=Math.round(f.width);k&&(k-=u,0>k&&(k=0),m-=k/2,w+=k/2);m=Math.max(m,-10);w=Math.min(Math.max(w,-10),b.len+10);x(c.options.pointWidth)&&(v-=(Math.ceil(c.options.pointWidth)-A)/2,A=Math.ceil(c.options.pointWidth));g.pointPlacement&&q(c.plotY)&&e.categories&&
+(c.plotY=e.translate(c.y,0,1,0,1,g.pointPlacement));c.shapeArgs={x:Math.floor(Math.min(m,w))+p,y:Math.floor(c.plotY+v)+p,width:Math.round(Math.abs(w-m)),height:A,r:this.options.borderRadius};e=c.shapeArgs.x;g=e+c.shapeArgs.width;0>e||g>b.len?(e=Math.min(b.len,Math.max(0,e)),g=Math.max(0,Math.min(g,b.len)),b=g-e,c.dlBox=B(c.shapeArgs,{x:e,width:g-e,centerX:b?b/2:null})):c.dlBox=null;c.tooltipPos[0]+=t?0:u/2;c.tooltipPos[1]-=t?-u/2:f.width/2;if(b=c.partialFill)n(b)&&(b=b.amount),q(b)||(b=0),f=c.shapeArgs,
+c.partShapeArgs={x:f.x,y:f.y,width:f.width,height:f.height,r:this.options.borderRadius},c.clipRectArgs={x:f.x,y:f.y,width:Math.max(Math.round(u*b+(c.plotX-m)),0),height:f.height}},translate:function(){m.prototype.translate.apply(this,arguments);this.points.forEach(function(a){this.translatePoint(a)},this)},drawPoint:function(a,b){var c=this.options,e=this.chart.renderer,f=a.graphic,g=a.shapeType,m=a.shapeArgs,u=a.partShapeArgs,q=a.clipRectArgs,t=a.partialFill,p=a.selected&&"select",v=c.stacking&&
+!c.borderRadius;if(a.isNull)f&&(a.graphic=f.destroy());else{if(f)a.graphicOriginal[b](B(m));else a.graphic=f=e.g("point").addClass(a.getClassName()).add(a.group||this.group),a.graphicOriginal=e[g](m).addClass(a.getClassName()).addClass("highcharts-partfill-original").add(f);u&&(a.graphicOverlay?(a.graphicOverlay[b](B(u)),a.clipRect.animate(B(q))):(a.clipRect=e.clipRect(q.x,q.y,q.width,q.height),a.graphicOverlay=e[g](u).addClass("highcharts-partfill-overlay").add(f).clip(a.clipRect)));this.chart.styledMode||
+(a.graphicOriginal.attr(this.pointAttribs(a,p)).shadow(c.shadow,null,v),u&&(n(t)||(t={}),n(c.partialFill)&&(t=B(t,c.partialFill)),b=t.fill||k(a.color||this.color).brighten(-.3).get(),a.graphicOverlay.attr(this.pointAttribs(a,p)).attr({fill:b}).shadow(c.shadow,null,v)))}},drawPoints:function(){var a=this,b=a.getAnimationVerb();a.points.forEach(function(c){a.drawPoint(c,b)})},getAnimationVerb:function(){return this.chart.pointCount<(this.options.animationLimit||250)?"animate":"attr"}},{applyOptions:function(){var a,
+b=A.prototype.applyOptions.apply(this,arguments),c=b.series;if(c.options.colorByPoint&&!b.options.color){a=c.options.colors||c.chart.options.colors;var f=b.y%(a?a.length:c.chart.options.chart.colorCount);a=a&&a[f];c.chart.styledMode||(b.color=a);b.options.colorIndex||(b.colorIndex=f)}return b},init:function(){A.prototype.init.apply(this,arguments);this.y||(this.y=0);return this},setState:function(){A.prototype.setState.apply(this,arguments);this.series.drawPoint(this,this.series.getAnimationVerb())},
+getLabelConfig:function(){var a=A.prototype.getLabelConfig.call(this),b=this.series.yAxis.categories;a.x2=this.x2;a.yCategory=this.yCategory=b&&b[this.y];return a},tooltipDateKeys:["x","x2"],isValid:function(){return"number"===typeof this.x&&"number"===typeof this.x2}});v(f,"afterGetSeriesExtremes",function(){var c=this.series,b,d;this.isXAxis&&(b=a(this.dataMax,-Number.MAX_VALUE),c.forEach(function(a){a.x2Data&&a.x2Data.forEach(function(a){a>b&&(b=a,d=!0)})}),d&&(this.dataMax=b))})})(C);(function(c){var v=
+c.dateFormat,x=c.isObject,k=c.isNumber,m=c.merge,t=c.pick,q=c.seriesType,n=c.stop,B=c.seriesTypes.xrange;q("gantt","xrange",{grouping:!1,dataLabels:{enabled:!0,formatter:function(){var a=this.point.partialFill;x(a)&&(a=a.amount);if(k(a)&&0<a)return 100*a+"%"}},tooltip:{headerFormat:'\x3cspan style\x3d"font-size: 10px"\x3e{series.name}\x3c/span\x3e\x3cbr/\x3e',pointFormat:null,pointFormatter:function(){var a=this.series,g=a.chart.tooltip,f=a.xAxis,k=f.options.dateTimeLabelFormats,n=f.options.startOfWeek,
+e=a.tooltipOptions,b=e.xDateFormat,d=this.end?this.end-this.start:0,a=this.options.milestone,f="\x3cb\x3e"+(this.name||this.yCategory)+"\x3c/b\x3e";if(e.pointFormat)return this.tooltipFormatter(e.pointFormat);b||(b=c.splat(g.getDateFormat(d,this.start,n,k))[0]);g=v(b,this.start);k=v(b,this.end);f+="\x3cbr/\x3e";return a?f+("Date "+g+"\x3cbr/\x3e"):f+("Start: "+g+"\x3cbr/\x3e")+("End: "+k+"\x3cbr/\x3e")}},connectors:{type:"simpleConnect",animation:{reversed:!0},startMarker:{enabled:!0,symbol:"arrow-filled",
+radius:4,fill:"#fa0",align:"left"},endMarker:{enabled:!1,align:"right"}}},{pointArrayMap:["start","end","y"],keyboardMoveVertical:!1,translatePoint:function(a){var c,f;B.prototype.translatePoint.call(this,a);a.options.milestone&&(c=a.shapeArgs,f=c.height,a.shapeArgs={x:c.x-f/2,y:c.y,width:f,height:f})},drawPoint:function(a,c){var f=this.options,g=this.chart.renderer,m=a.shapeArgs,e=a.plotY,b=a.graphic,d=a.selected&&"select",h=f.stacking&&!f.borderRadius;a.options.milestone?k(e)&&null!==a.y?(m=g.symbols.diamond(m.x,
+m.y,m.width,m.height),b?(n(b),b[c]({d:m})):a.graphic=g.path(m).addClass(a.getClassName(),!0).add(a.group||this.group),this.chart.styledMode||a.graphic.attr(this.pointAttribs(a,d)).shadow(f.shadow,null,h)):b&&(a.graphic=b.destroy()):B.prototype.drawPoint.call(this,a,c)},setData:c.Series.prototype.setData,setGanttPointAliases:function(a){function c(c,g){void 0!==g&&(a[c]=g)}c("x",t(a.start,a.x));c("x2",t(a.end,a.x2));c("partialFill",t(a.completed,a.partialFill));c("connect",t(a.dependency,a.connect))}},
+m(B.prototype.pointClass.prototype,{applyOptions:function(a,g){a=m(a);c.seriesTypes.gantt.prototype.setGanttPointAliases(a);return a=B.prototype.pointClass.prototype.applyOptions.call(this,a,g)}}))})(C);(function(c){var v=c.merge,x=c.splat,k=c.Chart;c.ganttChart=function(m,t,q){var n="string"===typeof m||m.nodeName,B=t.series,a=c.getOptions(),g,f=t;t=arguments[n?1:0];c.isArray(t.xAxis)||(t.xAxis=[t.xAxis||{},{}]);t.xAxis=t.xAxis.map(function(c,f){1===f&&(g=0);return v(a.xAxis,{grid:{enabled:!0},opposite:!0,
+linkedTo:g},c,{type:"datetime"})});t.yAxis=x(t.yAxis||{}).map(function(c){return v(a.yAxis,{grid:{enabled:!0},staticScale:50,reversed:!0,type:c.categories?c.type:"treegrid"},c)});t.series=null;t=v(!0,{chart:{type:"gantt"},title:{text:null},legend:{enabled:!1}},t,{isGantt:!0});t.series=f.series=B;t.series.forEach(function(a){a.data.forEach(function(a){c.seriesTypes.gantt.prototype.setGanttPointAliases(a)})});return n?new k(m,t,q):new k(t,t)}})(C)});
+//# sourceMappingURL=gantt.js.map
+</script>
+<script>/*
+  Highcharts JS v7.0.1 (2018-12-19)
+ Timeline series
+
+ (c) 2010-2018 Highsoft AS
+ Author: Daniel Studencki
+
+ License: www.highcharts.com/license
+*/
+(function(l){"object"===typeof module&&module.exports?module.exports=l:"function"===typeof define&&define.amd?define(function(){return l}):l("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(l){(function(k){var l=k.addEvent,q=k.extend,r=k.defined,p=k.merge,m=k.pick,t=k.Point,n=k.Series,u=k.seriesType,v=k.wrap;u("timeline","line",{colorByPoint:!0,stickyTracking:!1,ignoreHiddenPoint:!0,legendType:"point",lineWidth:0,tooltip:{headerFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf \x3c/span\x3e\x3cspan style\x3d"font-weight: bold;"\x3e{point.point.date}\x3c/span\x3e\x3cbr/\x3e',
+pointFormat:"{point.description}"},states:{hover:{lineWidthPlus:5,halo:{size:0}}},dataLabels:{enabled:!0,allowOverlap:!0,connectorWidth:1,connectorColor:"#000000",backgroundColor:"#ffffff",formatter:function(){return this.series.chart.styledMode?"\x3cspan\x3e\u25cf \x3c/span\x3e\x3cspan\x3e"+(this.point.date||"")+"\x3c/span\x3e\x3cbr/\x3e"+(this.point.label||""):'\x3cspan style\x3d"color:'+this.point.color+'"\x3e\u25cf \x3c/span\x3e\x3cspan style\x3d"font-weight: bold;" \x3e '+(this.point.date||"")+
+"\x3c/span\x3e\x3cbr/\x3e"+(this.point.label||"")},borderWidth:1,borderColor:"#666666",distance:100,alternate:!0,verticalAlign:"middle",color:"#333333"},marker:{enabledThreshold:0,symbol:"square",height:15}},{requireSorting:!1,trackerGroups:["markerGroup","dataLabelsGroup"],drawLegendSymbol:k.LegendSymbolMixin.drawRectangle,drawTracker:k.TrackerMixin.drawTrackerPoint,init:function(){var a=this;n.prototype.init.apply(a,arguments);l(a,"drawDataLabels",function(){a.options.dataLabels.useHTML&&a.points.forEach(function(a){a.visible&&
+a.dataLabel&&delete a.dataLabel.text.oldTextWidth});a.distributeDL()});l(a,"afterDrawDataLabels",function(){var c=a.options,b=c.dataLabels,d=a.hasRendered||0,e=m(b.defer,!!c.animation),f=a.connectorsGroup,g,f=a.plotGroup("connectorsGroup","data-labels-connectors",e&&!d?"hidden":"visible",b.zIndex||5);a.points.forEach(function(a){if(g=a.dataLabel)return v(g,"animate",function(a,b){this.targetPosition&&(this.targetPosition=b);return a.apply(this,Array.prototype.slice.call(arguments,1))}),g.targetPosition||
+(g.targetPosition={}),a.connector?a.alignConnector():a.drawConnector()});e&&(f.attr({opacity:+d}),d||l(a,"afterAnimate",function(){a.visible&&f.show(!0);f[c.animation?"animate":"attr"]({opacity:1},{duration:200})}))})},alignDataLabel:function(a,c){var b=this.chart.inverted,d=this.visibilityMap.filter(function(a){return a}),e=this.visiblePointsCount,f=d.indexOf(a),d=this.options.dataLabels,g=a.userDLOptions||{},f=d.alternate?f&&f!==e-1?2:1.5:1,h,e=Math.floor(this.xAxis.len/e),k=c.padding;a.visible&&
+(h=Math.abs(g.x||a.options.dataLabels.x),b?(b=2*(h-k)-a.itemHeight/2,b={width:b,textOverflow:c.width/b*c.height/2>e*f?"ellipsis":"none"}):b={width:g.width||d.width||e*f-2*k},c.css(b),this.chart.styledMode||c.shadow({}));n.prototype.alignDataLabel.apply(this,arguments)},processData:function(){var a=this,c=[],b,d=0,e;a.visibilityMap=a.getVisibilityMap();a.visibilityMap.forEach(function(a){a&&d++});a.visiblePointsCount=d;b=a.xAxis.options.max/d;for(e=1;e<=d;e++)c.push(b*e-b/2);a.visibilityMap.forEach(function(b,
+d){b||c.splice(d,0,null===a.yData[d]?null:-99)});a.xData=c;a.yData=c.map(function(a){return r(a)?1:null});n.prototype.processData.call(this,arguments)},generatePoints:function(){var a=this;n.prototype.generatePoints.apply(a);a.points.forEach(function(c,b){c.applyOptions({x:a.xData[b]})})},getVisibilityMap:function(){return(this.data.length?this.data:this.userOptions.data).map(function(a){return a&&!1!==a.visible&&!a.isNull?a:!1})},distributeDL:function(){var a=this,c=a.options.dataLabels,b,d,e={},
+f=1,g=c.distance;a.points.forEach(function(h){h.visible&&!h.isNull&&(b=h.options,d=h.options.dataLabels,a.hasRendered||(h.userDLOptions=p({},d)),e[a.chart.inverted?"x":"y"]=c.alternate&&f%2?-g:g,b.dataLabels=p(e,h.userDLOptions),f++)})},markerAttribs:function(a,c){var b=this.options.marker,d=a.marker||{},e=d.symbol||b.symbol,f=m(d.width,b.width,this.xAxis.len/this.visiblePointsCount),g=m(d.height,b.height),h=0;c&&(b=b.states[c]||{},c=d.states&&d.states[c]||{},h=m(c.radius,b.radius,h+(b.radiusPlus||
+0)));a.hasImage=e&&0===e.indexOf("url");return{x:Math.floor(a.plotX)-f/2-h/2,y:a.plotY-g/2-h/2,width:f+h,height:g+h}},bindAxes:function(){n.prototype.bindAxes.call(this);q(this.xAxis.options,{gridLineWidth:0,lineWidth:0,min:0,dataMin:0,minPadding:0,max:100,dataMax:100,maxPadding:0,title:null,tickPositions:[]});q(this.yAxis.options,{gridLineWidth:0,min:.5,dataMin:.5,minPadding:0,max:1.5,dataMax:1.5,maxPadding:0,title:null,labels:{enabled:!1}})}},{init:function(){var a=t.prototype.init.apply(this,arguments);
+a.name=m(a.name,a.date,"Event");a.y=1;return a},setVisible:function(a,c){var b=this,d=b.series,e=d.chart,f=d.options.ignoreHiddenPoint;c=m(c,f);a!==b.visible&&(b.visible=b.options.visible=a=void 0===a?!b.visible:a,d.options.data[d.data.indexOf(b)]=b.options,["graphic","dataLabel","connector"].forEach(function(c){if(b[c])b[c][a?"show":"hide"](!0)}),b.legendItem&&e.legend.colorizeItem(b,a),a||"hover"!==b.state||b.setState(""),f&&(d.isDirty=!0),c&&e.redraw())},setState:function(){var a=n.prototype.pointClass.prototype.setState;
+this.isNull||a.apply(this,arguments)},getConnectorPath:function(){var a=this.series.chart,c=this.series.xAxis.len,b=a.inverted,d=b?"x2":"y2",e=this.dataLabel,f=e.targetPosition,g={x1:this.plotX,y1:this.plotY,x2:this.plotX,y2:f.y||e.y},h=g[d]<this.series.yAxis.len/2;b&&(g={x1:this.plotY,y1:c-this.plotX,x2:f.x||e.x,y2:c-this.plotX});h&&(g[d]+=e[b?"width":"height"]);return a.renderer.crispLine(["M",g.x1,g.y1,"L",g.x2,g.y2],e.options.connectorWidth||1)},drawConnector:function(){var a=this.series,c=this.dataLabel.options=
+p({},a.options.dataLabels,this.options.dataLabels);this.connector=a.chart.renderer.path(this.getConnectorPath()).add(a.connectorsGroup);a.chart.styledMode||this.connector.attr({stroke:c.connectorColor,"stroke-width":c.connectorWidth,opacity:this.dataLabel.opacity})},alignConnector:function(){var a=this.connector,c=0<a.getBBox().y;a[c?"animate":"attr"]({d:this.getConnectorPath()})}});l(k.Chart,"afterHideOverlappingLabels",function(){var a,c;this.series.forEach(function(b){b.points&&b.points.forEach(function(b){a=
+b.dataLabel;c=b.connector;a&&a.targetPosition&&c&&c.attr({opacity:a.targetPosition.opacity||a.newOpacity})})})})})(l)});
+//# sourceMappingURL=timeline.js.map
+</script>
+<script>/*
+  Highcharts JS v7.0.1 (2018-12-19)
+
+ Support for parallel coordinates in Highcharts
+
+ (c) 2010-2018 Pawel Fus
+
+ License: www.highcharts.com/license
+*/
+(function(e){"object"===typeof module&&module.exports?module.exports=e:"function"===typeof define&&define.amd?define(function(){return e}):e("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(e){(function(b){function e(a){var c=this.series&&this.series.chart,h=a.apply(this,Array.prototype.slice.call(arguments,1)),k,e,d;c&&c.hasParallelCoordinates&&!m(h.formattedValue)&&(d=c.yAxis[this.x],k=d.options,c=(e=q(k.tooltipValueFormat,k.labels.format))?b.format(e,n(this,{value:this.y}),c.time):
+d.isDatetimeAxis?c.time.dateFormat(c.time.resolveDTLFormat(k.dateTimeLabelFormats[d.tickPositions.info.unitName]).main,this.y):k.categories?k.categories[this.y]:this.y,h.formattedValue=h.point.formattedValue=c);return h}var r=b.Axis,p=b.Chart,x=b.Series.prototype,y=p.prototype,t=b.Axis.prototype,f=b.addEvent,q=b.pick,u=b.wrap,l=b.merge,z=b.erase,v=b.splat,n=b.extend,m=b.defined,A=b.arrayMin,B=b.arrayMax,w={lineWidth:0,tickLength:0,opposite:!0,type:"category"};b.setOptions({chart:{parallelCoordinates:!1,
+parallelAxes:{lineWidth:1,title:{text:"",reserveSpace:!1},labels:{x:0,y:4,align:"center",reserveSpace:!1},offset:0}}});f(p,"init",function(a){a=a.args[0];var c=v(a.yAxis||{}),h=c.length,b=[];if(this.hasParallelCoordinates=a.chart&&a.chart.parallelCoordinates){for(this.setParallelInfo(a);h<=this.parallelInfo.counter;h++)b.push({});a.legend||(a.legend={});void 0===a.legend.enabled&&(a.legend.enabled=!1);l(!0,a,{boost:{seriesThreshold:Number.MAX_VALUE},plotOptions:{series:{boostThreshold:Number.MAX_VALUE}}});
+a.yAxis=c.concat(b);a.xAxis=l(w,v(a.xAxis||{})[0])}});f(p,"update",function(a){a=a.options;a.chart&&(m(a.chart.parallelCoordinates)&&(this.hasParallelCoordinates=a.chart.parallelCoordinates),this.hasParallelCoordinates&&a.chart.parallelAxes&&(this.options.chart.parallelAxes=l(this.options.chart.parallelAxes,a.chart.parallelAxes),this.yAxis.forEach(function(a){a.update({},!1)})))});n(y,{setParallelInfo:function(a){var c=this;a=a.series;c.parallelInfo={counter:0};a.forEach(function(a){a.data&&(c.parallelInfo.counter=
+Math.max(c.parallelInfo.counter,a.data.length-1))})}});t.keepProps.push("parallelPosition");f(r,"afterSetOptions",function(a){var c=this.chart,b=["left","width","height","top"];c.hasParallelCoordinates&&(c.inverted&&(b=b.reverse()),this.isXAxis?this.options=l(this.options,w,a.userOptions):(this.options=l(this.options,this.chart.options.chart.parallelAxes,a.userOptions),this.parallelPosition=q(this.parallelPosition,c.yAxis.length),this.setParallelPosition(b,this.options)))});f(r,"getSeriesExtremes",
+function(a){if(this.chart&&this.chart.hasParallelCoordinates&&!this.isXAxis){var c=this.parallelPosition,b=[];this.series.forEach(function(a){a.visible&&m(a.yData[c])&&b.push(a.yData[c])});this.dataMin=A(b);this.dataMax=B(b);a.preventDefault()}});n(t,{setParallelPosition:function(a,c){var b=(this.parallelPosition+.5)/(this.chart.parallelInfo.counter+1);this.chart.polar?c.angle=360*b:(c[a[0]]=100*b+"%",this[a[1]]=c[a[1]]=0,this[a[2]]=c[a[2]]=null,this[a[3]]=c[a[3]]=null)}});u(x,"bindAxes",function(a){if(this.chart.hasParallelCoordinates){var c=
+this;this.chart.axes.forEach(function(a){c.insert(a.series);a.isDirty=!0});c.xAxis=this.chart.xAxis[0];c.yAxis=this.chart.yAxis[0]}else a.apply(this,Array.prototype.slice.call(arguments,1))});f(b.Series,"afterTranslate",function(){var a=this.chart,c=this.points,b=c&&c.length,e=Number.MAX_VALUE,f,d,g;if(this.chart.hasParallelCoordinates){for(g=0;g<b;g++)d=c[g],m(d.y)?(d.plotX=a.polar?a.yAxis[g].angleRad||0:a.inverted?a.plotHeight-a.yAxis[g].top+a.plotTop:a.yAxis[g].left-a.plotLeft,d.clientX=d.plotX,
+d.plotY=a.yAxis[g].translate(d.y,!1,!0,null,!0),void 0!==f&&(e=Math.min(e,Math.abs(d.plotX-f))),f=d.plotX,d.isInside=a.isInsidePlot(d.plotX,d.plotY,a.inverted)):d.isNull=!0;this.closestPointRangePx=e}},{order:1});b.addEvent(b.Series,"destroy",function(){this.chart.hasParallelCoordinates&&(this.chart.axes||[]).forEach(function(a){a&&a.series&&(z(a.series,this),a.isDirty=a.forceRedraw=!0)},this)});["line","spline"].forEach(function(a){u(b.seriesTypes[a].prototype.pointClass.prototype,"getLabelConfig",
+e)})})(e)});
+//# sourceMappingURL=parallel-coordinates.js.map
+</script>
+<script>/* global Highcharts module window:true */
+(function (factory) {
+	if (typeof module === 'object' && module.exports) {
+		module.exports = factory;
+	} else {
+		factory(Highcharts);
+	}
+}(function (HC) {
+	'use strict';
+	/**
+	 * Grouped Categories v1.1.3 (2017-03-27)
+	 *
+	 * (c) 2012-2016 Black Label
+	 *
+	 * License: Creative Commons Attribution (CC)
+	 */
+
+	/* jshint expr:true, boss:true */
+	var UNDEFINED = void 0,
+		mathRound = Math.round,
+		mathMin = Math.min,
+		mathMax = Math.max,
+		merge = HC.merge,
+		pick = HC.pick,
+		each = HC.each,
+		// #74, since Highcharts 4.1.10 HighchartsAdapter is only provided by the Highcharts Standalone Framework
+		inArray = (window.HighchartsAdapter && window.HighchartsAdapter.inArray) || HC.inArray,
+
+		// cache prototypes
+		axisProto = HC.Axis.prototype,
+		tickProto = HC.Tick.prototype,
+
+		// cache original methods
+		protoAxisInit = axisProto.init,
+		protoAxisRender = axisProto.render,
+		protoAxisSetCategories = axisProto.setCategories,
+		protoTickGetLabelSize = tickProto.getLabelSize,
+		protoTickAddLabel = tickProto.addLabel,
+		protoTickDestroy = tickProto.destroy,
+		protoTickRender = tickProto.render;
+
+	function deepClone(thing) {
+		return JSON.parse(JSON.stringify(thing));
+	}
+
+	function Category(obj, parent) {
+		this.userOptions = deepClone(obj);
+		this.name = obj.name || obj;
+		this.parent = parent;
+
+		return this;
+	}
+
+	Category.prototype.toString = function () {
+		var parts = [],
+			cat = this;
+
+		while (cat) {
+			parts.push(cat.name);
+			cat = cat.parent;
+		}
+
+		return parts.join(', ');
+	};
+
+	// returns sum of an array
+	function sum(arr) {
+		var l = arr.length,
+			x = 0;
+
+		while (l--) {
+			x += arr[l];
+		}
+
+		return x;
+	}
+
+	// Adds category leaf to array
+	function addLeaf(out, cat, parent) {
+		out.unshift(new Category(cat, parent));
+
+		while (parent) {
+			parent.leaves = parent.leaves ? (parent.leaves + 1) : 1;
+			parent = parent.parent;
+		}
+	}
+
+	// Builds reverse category tree
+	function buildTree(cats, out, options, parent, depth) {
+		var len = cats.length,
+			cat;
+
+		depth = depth ? depth : 0;
+		options.depth = options.depth ? options.depth : 0;
+
+		while (len--) {
+			cat = cats[len];
+			
+			if (cat.categories) {
+				if (parent) {
+					cat.parent = parent;
+				}
+				buildTree(cat.categories, out, options, cat, depth + 1);
+			} else {
+				addLeaf(out, cat, parent);
+			}
+		}
+		options.depth = mathMax(options.depth, depth);
+	}
+
+	// Pushes part of grid to path
+	function addGridPart(path, d, width) {
+		// Based on crispLine from HC (#65)
+		if (d[0] === d[2]) {
+			d[0] = d[2] = mathRound(d[0]) - (width % 2 / 2);
+		}
+		if (d[1] === d[3]) {
+			d[1] = d[3] = mathRound(d[1]) + (width % 2 / 2);
+		}
+
+		path.push(
+			'M',
+			d[0], d[1],
+			'L',
+			d[2], d[3]
+		);
+	}
+
+	// Returns tick position
+	function tickPosition(tick, pos) {
+		return tick.getPosition(tick.axis.horiz, pos, tick.axis.tickmarkOffset);
+	}
+
+	function walk(arr, key, fn) {
+		var l = arr.length,
+			children;
+
+		while (l--) {
+			children = arr[l][key];
+
+			if (children) {
+				walk(children, key, fn);
+			}
+			fn(arr[l]);
+		}
+	}
+
+	//
+	// Axis prototype
+	//
+
+	axisProto.init = function (chart, options) {
+		// default behaviour
+		protoAxisInit.call(this, chart, options);
+
+		if (typeof options === 'object' && options.categories) {
+			this.setupGroups(options);
+		}
+	};
+
+	// setup required axis options
+	axisProto.setupGroups = function (options) {
+		var categories = deepClone(options.categories),
+			reverseTree = [],
+			stats = {},
+			labelOptions = this.options.labels,
+			userAttr = labelOptions.groupedOptions,
+			css = labelOptions.style;
+
+		// build categories tree
+		buildTree(categories, reverseTree, stats);
+
+		// set axis properties
+		this.categoriesTree = categories;
+		this.categories = reverseTree;
+		this.isGrouped = stats.depth !== 0;
+		this.labelsDepth = stats.depth;
+		this.labelsSizes = [];
+		this.labelsGridPath = [];
+		this.tickLength = options.tickLength || this.tickLength || null;
+		// #66: tickWidth for x axis defaults to 1, for y to 0
+		this.tickWidth = pick(options.tickWidth, this.isXAxis ? 1 : 0);
+		this.directionFactor = [-1, 1, 1, -1][this.side];
+		this.options.lineWidth = pick(options.lineWidth, 1);
+		// #85: align labels vertically
+		this.groupFontHeights = [];
+		for (var i = 0; i <= stats.depth; i++) {
+			var hasOptions = userAttr && userAttr[i - 1],
+				mergedCSS = hasOptions && userAttr[i - 1].style ? merge(css, userAttr[i - 1].style) : css;
+			this.groupFontHeights[i] = Math.round(this.chart.renderer.fontMetrics(mergedCSS ? mergedCSS.fontSize : 0).b * 0.3);
+		}
+	};
+
+
+	axisProto.render = function () {
+		// clear grid path
+		if (this.isGrouped) {
+			this.labelsGridPath = [];
+		}
+
+		// cache original tick length
+		if (this.originalTickLength === UNDEFINED) {
+			this.originalTickLength = this.options.tickLength;
+		}
+
+		// use default tickLength for not-grouped axis
+		// and generate grid on grouped axes,
+		// use tiny number to force highcharts to hide tick
+		this.options.tickLength = this.isGrouped ? 0.001 : this.originalTickLength;
+
+		protoAxisRender.call(this);
+
+		if (!this.isGrouped) {
+			if (this.labelsGrid) {
+				this.labelsGrid.attr({
+					visibility: 'hidden'
+				});
+			}
+			return false;
+		}
+
+		var axis = this,
+			options = axis.options,
+			top = axis.top,
+			left = axis.left,
+			right = left + axis.width,
+			bottom = top + axis.height,
+			visible = axis.hasVisibleSeries || axis.hasData,
+			depth = axis.labelsDepth,
+			grid = axis.labelsGrid,
+			horiz = axis.horiz,
+			d = axis.labelsGridPath,
+			i = options.drawHorizontalBorders === false ? (depth + 1) : 0,
+			offset = axis.opposite ? (horiz ? top : right) : (horiz ? bottom : left),
+			tickWidth = axis.tickWidth,
+			part;
+
+		if (axis.userTickLength) {
+			depth -= 1;
+		}
+
+		// render grid path for the first time
+		if (!grid) {
+			grid = axis.labelsGrid = axis.chart.renderer.path()
+			.attr({
+				// #58: use tickWidth/tickColor instead of lineWidth/lineColor:
+				strokeWidth: tickWidth, // < 4.0.3
+				'stroke-width': tickWidth, // 4.0.3+ #30
+				stroke: options.tickColor || '' // for styled mode (tickColor === undefined)
+			})
+			.add(axis.axisGroup);
+			// for styled mode - add class
+			if (!options.tickColor) {
+				grid.addClass('highcharts-tick');
+			}
+		}
+
+		// go through every level and draw horizontal grid line
+		while (i <= depth) {
+			offset += axis.groupSize(i);
+
+			part = horiz ?
+				[left, offset, right, offset] :
+				[offset, top, offset, bottom];
+
+			addGridPart(d, part, tickWidth);
+			i++;
+		}
+
+		// draw grid path
+		grid.attr({
+			d: d,
+			visibility: visible ? 'visible' : 'hidden'
+		});
+
+		axis.labelGroup.attr({
+			visibility: visible ? 'visible' : 'hidden'
+		});
+
+
+		walk(axis.categoriesTree, 'categories', function (group) {
+			var tick = group.tick;
+
+			if (!tick) {
+				return false;
+			}
+			if (tick.startAt + tick.leaves - 1 < axis.min || tick.startAt > axis.max) {
+				tick.label.hide();
+				tick.destroyed = 0;
+			} else {
+				tick.label.attr({
+					visibility: visible ? 'visible' : 'hidden'
+				});
+			}
+			return true;
+		});
+		return true;
+	};
+
+	axisProto.setCategories = function (newCategories, doRedraw) {
+		if (this.categories) {
+			this.cleanGroups();
+		}
+		this.setupGroups({
+			categories: newCategories
+		});
+		this.categories = this.userOptions.categories = newCategories;
+		protoAxisSetCategories.call(this, this.categories, doRedraw);
+	};
+
+	// cleans old categories
+	axisProto.cleanGroups = function () {
+		var ticks = this.ticks,
+			n;
+
+		for (n in ticks) {
+			if (ticks[n].parent) {
+				delete ticks[n].parent;
+			}
+		}
+		walk(this.categoriesTree, 'categories', function (group) {
+			var tick = group.tick;
+			
+			if (!tick) {
+				return false;
+			}
+			tick.label.destroy();
+			
+			each(tick, function (v, i) {
+				delete tick[i];
+			});
+			delete group.tick;
+			
+			return true;
+		});
+		this.labelsGrid = null;
+	};
+
+	// keeps size of each categories level
+	axisProto.groupSize = function (level, position) {
+		var positions = this.labelsSizes,
+			direction = this.directionFactor,
+			groupedOptions = this.options.labels.groupedOptions ? this.options.labels.groupedOptions[level - 1] : false,
+			userXY = 0;
+
+		if (groupedOptions) {
+			if (direction === -1) {
+				userXY = groupedOptions.x ? groupedOptions.x : 0;
+			} else {
+				userXY = groupedOptions.y ? groupedOptions.y : 0;
+			}
+		}
+
+		if (position !== UNDEFINED) {
+			positions[level] = mathMax(positions[level] || 0, position + 10 + Math.abs(userXY));
+		}
+
+		if (level === true) {
+			return sum(positions) * direction;
+		} else if (positions[level]) {
+			return positions[level] * direction;
+		}
+
+		return 0;
+	};
+
+	//
+	// Tick prototype
+	//
+
+	// Override methods prototypes
+	tickProto.addLabel = function () {
+		var tick = this,
+			axis = tick.axis,
+			category;
+		
+		protoTickAddLabel.call(tick);
+		
+		if (!axis.categories || !(category = axis.categories[tick.pos])) {
+			return false;
+		}
+		
+		// set label text - but applied after formatter #46
+		if (tick.label) {
+			tick.label.attr('text', tick.axis.labelFormatter.call({
+				axis: axis,
+				chart: axis.chart,
+				isFirst: tick.isFirst,
+				isLast: tick.isLast,
+				value: category.name,
+				pos: tick.pos
+			}));
+		}
+		
+		// create elements for parent categories
+		if (axis.isGrouped && axis.options.labels.enabled) {
+			tick.addGroupedLabels(category);
+		}
+		return true;
+	};
+
+	// render ancestor label
+	tickProto.addGroupedLabels = function (category) {
+		var tick = this,
+			axis = this.axis,
+			chart = axis.chart,
+			options = axis.options.labels,
+			useHTML = options.useHTML,
+			css = options.style,
+			userAttr = options.groupedOptions,
+			attr = {
+				align: 'center',
+				rotation: options.rotation,
+				x: 0,
+				y: 0
+			},
+			size = axis.horiz ? 'height' : 'width',
+			depth = 0,
+			label;
+
+
+		while (tick) {
+			if (depth > 0 && !category.tick) {
+				// render label element
+				this.value = category.name;
+				var name = options.formatter ? options.formatter.call(this, category) : category.name,
+					hasOptions = userAttr && userAttr[depth - 1],
+					mergedAttrs = hasOptions ? merge(attr, userAttr[depth - 1]) : attr,
+					mergedCSS = hasOptions && userAttr[depth - 1].style ? merge(css, userAttr[depth - 1].style) : css;
+
+				// #63: style is passed in CSS and not as an attribute
+				delete mergedAttrs.style;
+
+				label = chart.renderer.text(name, 0, 0, useHTML)
+					.attr(mergedAttrs)
+					.css(mergedCSS)
+					.add(axis.labelGroup);
+
+				// tick properties
+				tick.startAt = this.pos;
+				tick.childCount = category.categories.length;
+				tick.leaves = category.leaves;
+				tick.visible = this.childCount;
+				tick.label = label;
+				tick.labelOffsets = {
+					x: mergedAttrs.x,
+					y: mergedAttrs.y
+				};
+
+				// link tick with category
+				category.tick = tick;
+			}
+
+			// set level size, #93
+			if (tick) {
+				axis.groupSize(depth, tick.label.getBBox()[size]);
+			}
+
+			// go up to the parent category
+			category = category.parent;
+
+			if (category) {
+				tick = tick.parent = category.tick || {};
+			} else {
+				tick = null;
+			}
+
+			depth++;
+		}
+	};
+
+	// set labels position & render categories grid
+	tickProto.render = function (index, old, opacity) {
+		protoTickRender.call(this, index, old, opacity);
+
+		var treeCat = this.axis.categories[this.pos];
+
+		if (!this.axis.isGrouped || !treeCat || this.pos > this.axis.max) {
+			return;
+		}
+
+		var tick = this,
+			group = tick,
+			axis = tick.axis,
+			tickPos = tick.pos,
+			isFirst = tick.isFirst,
+			max = axis.max,
+			min = axis.min,
+			horiz = axis.horiz,
+			grid = axis.labelsGridPath,
+			size = axis.groupSize(0),
+			tickWidth = axis.tickWidth,
+			xy = tickPosition(tick, tickPos),
+			start = horiz ? xy.y : xy.x,
+			baseLine = axis.chart.renderer.fontMetrics(axis.options.labels.style ? axis.options.labels.style.fontSize : 0).b,
+			depth = 1,
+			reverseCrisp = ((horiz && xy.x === axis.pos + axis.len) || (!horiz && xy.y === axis.pos)) ? -1 : 0, // adjust grid lines for edges
+			gridAttrs,
+			lvlSize,
+			minPos,
+			maxPos,
+			attrs,
+			bBox;
+
+		// render grid for "normal" categories (first-level), render left grid line only for the first category
+		if (isFirst) {
+			gridAttrs = horiz ?
+				[axis.left, xy.y, axis.left, xy.y + axis.groupSize(true)] : axis.isXAxis ?
+					[xy.x, axis.top, xy.x + axis.groupSize(true), axis.top] : [xy.x, axis.top + axis.len, xy.x + axis.groupSize(true), axis.top + axis.len];
+
+			addGridPart(grid, gridAttrs, tickWidth);
+		}
+
+		if (horiz && axis.left < xy.x) {
+			addGridPart(grid, [xy.x - reverseCrisp, xy.y, xy.x - reverseCrisp, xy.y + size], tickWidth);
+		} else if (!horiz && axis.top <= xy.y) {
+			addGridPart(grid, [xy.x, xy.y + reverseCrisp, xy.x + size, xy.y + reverseCrisp], tickWidth);
+		}
+
+		size = start + size;
+
+		function fixOffset(tCat) {
+			var ret = 0;
+			if (isFirst) {
+				ret = inArray(tCat.name, tCat.parent.categories);
+				ret = ret < 0 ? 0 : ret;
+				return ret;
+			}
+			return ret;
+		}
+
+
+		while (group.parent) {
+			group = group.parent;
+			
+			var fix = fixOffset(treeCat),
+				userX = group.labelOffsets.x,
+				userY = group.labelOffsets.y;
+			
+			minPos = tickPosition(tick, mathMax(group.startAt - 1, min - 1));
+			maxPos = tickPosition(tick, mathMin(group.startAt + group.leaves - 1 - fix, max));
+			bBox = group.label.getBBox(true);
+			lvlSize = axis.groupSize(depth);
+			// check if on the edge to adjust
+			reverseCrisp = ((horiz && maxPos.x === axis.pos + axis.len) || (!horiz && maxPos.y === axis.pos)) ? -1 : 0;
+			
+			attrs = horiz ? {
+				x: (minPos.x + maxPos.x) / 2 + userX,
+				y: size + axis.groupFontHeights[depth] + lvlSize / 2 + userY / 2
+			} : {
+				x: size + lvlSize / 2 + userX,
+				y: (minPos.y + maxPos.y - bBox.height) / 2 + baseLine + userY
+			};
+			
+			if (!isNaN(attrs.x) && !isNaN(attrs.y)) {
+				group.label.attr(attrs);
+
+				if (grid) {
+					if (horiz && axis.left < maxPos.x) {
+						addGridPart(grid, [maxPos.x - reverseCrisp, size, maxPos.x - reverseCrisp, size + lvlSize], tickWidth);
+					} else if (!horiz && axis.top <= maxPos.y) {
+						addGridPart(grid, [size, maxPos.y + reverseCrisp, size + lvlSize, maxPos.y + reverseCrisp], tickWidth);
+					}
+				}
+			}
+
+			size += lvlSize;
+			depth++;
+		}
+	};
+
+	tickProto.destroy = function () {
+		var group = this.parent;
+
+		while (group) {
+			group.destroyed = group.destroyed ? (group.destroyed + 1) : 1;
+			group = group.parent;
+		}
+
+		protoTickDestroy.call(this);
+	};
+
+	// return size of the label (height for horizontal, width for vertical axes)
+	tickProto.getLabelSize = function () {
+		if (this.axis.isGrouped === true) {
+			// #72, getBBox might need recalculating when chart is tall
+			var size = protoTickGetLabelSize.call(this) + 10,
+				topLabelSize = this.axis.labelsSizes[0];
+			if (topLabelSize < size) {
+				this.axis.labelsSizes[0] = size;
+			}
+			return sum(this.axis.labelsSizes);
+		}
+		return protoTickGetLabelSize.call(this);
+	};
+
+}));</script>
+<script>/**
+ * @license http://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
+ * @author  Lars Cabrera
+ * @version 1.0.9
+ */
+
+// JSLint options:
+/*global Highcharts, window*/
+
+(function (H) {
+    // Check if object is array
+    function isArray(obj) {
+        return Object.prototype.toString.call(obj) === '[object Array]';
+    }
+
+
+    // Sets up motion ready to use
+    function Motion(chart) {
+        var motion = this;
+
+        this.chart = chart;
+        this.paused = true;
+        this.options = H.merge(this.defaultOptions, this.chart.options.motion);
+        this.dataSeries = [];
+        this.dataLength = 0;
+        motion.options.series = H.splat(motion.options.series);
+        Highcharts.each(this.chart.series, function (series, index) {
+            if (motion.options.series.indexOf(index) >= 0) {
+                motion.dataSeries[index] = series;
+                for (var i = 0; i < series.data.length; i++) {
+                    if (series.data[i].sequence) {
+                        motion.dataLength = Math.max(motion.dataLength, series.data[i].sequence.length);
+                    }
+                }
+            }
+        });
+
+        // Play-controls HTML-div
+        this.playControls = H.createElement('div', {
+            id: 'play-controls'
+        }, null, this.chart.renderTo, null);
+
+        // Play/pause HTML-button
+        this.playPauseBtn = H.createElement('button', {
+            id: 'play-pause-button',
+            title: 'play'
+        }, null, this.playControls, null);
+        this.playPauseBtn.className = this.options.playIcon;
+
+        // Play-range HTML-input
+        this.playRange = H.createElement('input', {
+            id: 'play-range',
+            type: 'range',
+            min: 0,
+            max: this.dataLength - 1,
+            step: this.options.magnet.step
+        }, null, this.playControls, null);
+        // Important: max must be set before value in order to allow for
+        // higher numbers than 100.
+        this.playRange.value = H.pick(this.options.startIndex, this.dataLength - 1);
+
+        // Play-range HTML-output
+        this.playOutput = H.createElement('label', {
+            id: 'play-output',
+            name: this.options.axisLabel
+        }, null, this.playControls, null);
+        if (isArray(this.options.labels)) {
+            this.playOutput.innerHTML = this.options.labels[this.dataLength - 1] || '';
+        } else {
+            this.playOutput.innerHTML = this.dataLength - 1;
+        }
+
+        // Common key event handler function
+        function handleKeyEvents(e) {
+            e = e || window.event;
+            switch (e.which) {
+            case 32: // Space
+                motion.togglePlayPause();
+                break;
+            case 37: // Left
+                motion.playRange.value = motion.round(parseFloat(motion.playRange.value) - 1);
+                motion.updateChart(motion.playRange.value);
+                break;
+            case 39: // Right
+                motion.playRange.value = motion.round(parseFloat(motion.playRange.value) + 1);
+                motion.updateChart(motion.playRange.value);
+                break;
+            default:
+                return;
+            }
+            e.preventDefault();
+        }
+
+        // Bind controls to events
+        Highcharts.addEvent(this.playPauseBtn, 'click', function () {
+            motion.togglePlayPause();
+        });
+        Highcharts.addEvent(this.playRange, 'mouseup', function () {
+            motion.attractToStep();
+        });
+        Highcharts.addEvent(this.playRange, 'input', function () {
+            motion.updateChart(this.value);
+        });
+
+        // Request focus to the controls when clicking on controls div
+        Highcharts.addEvent(this.playControls, 'click', function () {
+            motion.playRange.focus();
+        });
+        // Bind keys to events
+        Highcharts.addEvent(this.playPauseBtn, 'keydown', handleKeyEvents);
+        Highcharts.addEvent(this.playRange, 'keydown', handleKeyEvents);
+
+        // Initial value
+        this.inputValue = parseFloat(this.playRange.value);
+
+        // Initial update
+        this.updateChart(this.inputValue);
+
+        // Auto-play
+        if (this.options.autoPlay) {
+            this.play();
+        }
+    }
+
+    // Default options for Motion
+    Motion.prototype.defaultOptions = {
+        enabled: true,
+        axisLabel: 'year',
+        autoPlay : false,
+        loop: false,
+        series: 0,
+        updateInterval: 10,
+        magnet: {
+            round: 'round',
+            step: 0.01
+        },
+        playIcon: "fa fa-play",
+        pauseIcon: "fa fa-pause"
+    };
+
+    // Toggles between Play and Pause states, and makes calls to changeButtonType()
+    // From http://www.creativebloq.com/html5/build-custom-html5-video-player-9134473
+    Motion.prototype.togglePlayPause = function () {
+        this[this.paused ? 'play' : 'pause']();
+    };
+
+    // Plays the motion, continuously updating the chart
+    Motion.prototype.play = function () {
+        var motion = this;
+        if (this.paused && parseFloat(this.playRange.value) === parseFloat(this.playRange.max)) {
+            this.reset();
+        }
+        this.changeButtonType('pause');
+        this.paused = false;
+        this.timer = setInterval(function () {
+            motion.playUpdate();
+        }, this.options.updateInterval);
+    };
+
+    // Pauses the motion, which stops updating the chart
+    Motion.prototype.pause = function () {
+        this.changeButtonType('play');
+        this.paused = true;
+        window.clearInterval(this.timer);
+        this.attractToStep();
+    };
+
+    // Resets the motion and updates the chart. Does not pause
+    Motion.prototype.reset = function () {
+        this.playRange.value = this.playRange.min;
+        this.updateChart(this.playRange.value);
+    };
+
+    // Updates a button's title, innerHTML and CSS class to a certain value
+    Motion.prototype.changeButtonType = function (value) {
+        this.playPauseBtn.title = value;
+        this.playPauseBtn.className = value + " ";
+        if (value == 'play') {
+            this.playPauseBtn.className += this.options.playIcon;
+        } else if (value == 'pause') {
+            this.playPauseBtn.className += this.options.pauseIcon;;
+        }
+    };
+
+    // Called continuously while playing
+    Motion.prototype.playUpdate = function () {
+        if (!this.paused) {
+            this.inputValue = parseFloat(this.playRange.value);
+            this.playRange.value = this.inputValue + this.options.magnet.step;
+            this.attractToStep();
+            this.updateChart(this.playRange.value); // Use playRange.value to get updated value
+            if (this.playRange.value >= parseFloat(this.playRange.max)) { // Auto-pause
+                if (this.options.loop) {
+                    this.reset();
+                } else {
+                    this.pause();
+                }
+            }
+        }
+    };
+
+    // Updates chart data and redraws the chart
+    Motion.prototype.updateChart = function (inputValue) {
+        var seriesKey,
+            series,
+            point,
+            roundedInput = this.round(inputValue),
+            i;
+        if (this.currentAxisValue !== roundedInput) {
+            this.currentAxisValue = roundedInput;
+            this.chart.options.motion.startIndex = roundedInput;
+            for (seriesKey in this.dataSeries) {
+                if (this.dataSeries.hasOwnProperty(seriesKey)) {
+                    series = this.dataSeries[seriesKey];
+                    for (i = 0; i < series.data.length; i++) {
+                        point = series.data[i];
+                        try {
+                            if (point.sequence) {
+                                point.update(point.sequence[roundedInput], false, false);
+                            }
+                        } catch (e) {
+                            console.error('Error:', e, ' \nat point:', point, ' \nwith new value:', point.sequence[roundedInput]);
+                        }
+                    }
+                }
+            }
+            this.chart.redraw();
+            this.attractToStep();
+        }
+    };
+
+    // Moves output value to data point
+    Motion.prototype.attractToStep = function () {
+        if (isArray(this.options.labels)) {
+            this.playOutput.innerHTML = this.options.labels[this.round(this.playRange.value)] || '';
+        } else {
+            this.playOutput.innerHTML = this.round(this.playRange.value);
+        }
+    };
+
+    // Returns an integer rounded up, down or even depending on
+    // motion.magnet.round options.
+    Motion.prototype.round = function (number) {
+        return Math[this.options.magnet.round](number);
+    };
+
+    // Initiates motion automatically if motion options object exists and
+    // is not disabled
+    H.Chart.prototype.callbacks.push(function (chart) {
+        if (chart.options.motion && chart.options.motion.enabled) {
+            chart.motion = new Motion(chart);
+        }
+    });
+
+    H.Motion = Motion;
+}(Highcharts));
+</script>
+<script>/**
+* Multicolor Series v2.2.4 (2018-03-27)
+*
+* (c) 2012-2016 Black Label
+*
+* License: Creative Commons Attribution (CC)
+*/
+/* global Highcharts window document module:true */
+/**
+ * @fileoverview
+ * @suppress {checkTypes}
+ */
+(function (factory) {
+	if (typeof module === 'object' && module.exports) {
+		module.exports = factory;
+	} else {
+		factory(Highcharts);
+	}
+}(function (H) {
+	var each = H.each,
+		seriesTypes = H.seriesTypes,
+		pick = H.pick,
+		UNDEFINED,
+		NORMAL_STATE = '',
+		VISIBLE = 'visible',
+		HIDDEN = 'hidden',
+		PREFIX = 'highcharts-',
+		NONE = 'none',
+		hasTouch = document.documentElement.ontouchstart !== UNDEFINED,
+		TRACKER_FILL = 'rgba(192,192,192,' + (H.hasSVG ? 0.0001 : 0.002) + ')', // invisible but clickable
+		M = 'M',
+		L = 'L';
+	
+	// handle unsorted data, throw error anyway
+	function error(code, stop) {
+		var msg = 'Highcharts error #' + code + ': www.highcharts.com/errors/' + code;
+		if (stop) {
+			throw msg;
+		} else if (window.console) {
+			console.log(msg); // eslint-disable-line
+		}
+	}
+	
+	/**
+	If replacing L and M in tracker will be necessary use that getPath():
+	
+	function getPath(arr){
+	var ret = [];
+	each(arr, function(el, ind) {
+	var len = el[0].length;
+	for(var i = 0; i < len; i++){
+	var p = el[0][i];
+	if(p == M && ind != 0 && i == 0) {
+	p = L;
+	}
+	ret.push(p);
+	}
+	});
+	return ret;
+	}
+	**/
+	
+	
+	function getPath(arr) {
+		var ret = [];
+		each(arr, function (el) {
+			ret = ret.concat(el[0]);
+		});
+		return ret;
+	}
+
+	/**
+	 * Return the graph path of a segment - compatibility with 4.2.3+
+	 * @param {Object} segment of the path
+	 * @returns {Array} Path (SVG)
+	 */
+	H.Series.prototype.getSegmentPath = function (segment) {
+		var series = this,
+			segmentPath = [],
+			step = series.options.step;
+
+		// build the segment line
+		each(segment, function (point, i) {
+			var plotX = point.plotX,
+				plotY = point.plotY,
+				lastPoint;
+
+			if (series.getPointSpline) {
+				// generate the spline as defined in the SplineSeries object
+				segmentPath.push.apply(segmentPath, series.getPointSpline(segment, point, i));
+			} else {
+				// moveTo or lineTo
+				segmentPath.push(i ? L : M);
+
+				// step line?
+				if (step && i) {
+					lastPoint = segment[i - 1];
+					if (step === 'right') {
+						segmentPath.push(
+							lastPoint.plotX,
+							plotY,
+							L
+						);
+					} else if (step === 'center') {
+						segmentPath.push(
+							(lastPoint.plotX + plotX) / 2,
+							lastPoint.plotY,
+							L,
+							(lastPoint.plotX + plotX) / 2,
+							plotY,
+							L
+						);
+					} else {
+						segmentPath.push(
+							plotX,
+							lastPoint.plotY,
+							L
+						);
+					}
+				}
+
+				// normal line to next point
+				segmentPath.push(
+					point.plotX,
+					point.plotY
+				);
+			}
+		});
+
+		return segmentPath;
+	};
+
+	/**
+	*
+	*   ColoredLine series type
+	*
+	**/
+	
+	seriesTypes.coloredline = H.extendClass(seriesTypes.line);
+	
+	H.seriesTypes.coloredline.prototype.processData = function (force) {
+		var series = this,
+			processedXData = series.xData, // copied during slice operation below
+			processedYData = series.yData,
+			cropStart = 0,
+			cropped,
+			distance,
+			closestPointRange,
+			xAxis = series.xAxis,
+			i, // loop variable
+			options = series.options,
+			isCartesian = series.isCartesian;
+		
+		// If the series data or axes haven't changed, don't go through this. Return false to pass
+		// the message on to override methods like in data grouping.
+		if (isCartesian && !series.isDirty && !xAxis.isDirty && !series.yAxis.isDirty && !force) {
+			return false;
+		}
+		
+		// Find the closest distance between processed points
+		for (i = processedXData.length - 1; i >= 0; i--) {
+			distance = processedXData[i] - processedXData[i - 1];
+			if (distance > 0 && (closestPointRange === UNDEFINED || distance < closestPointRange)) {
+				closestPointRange = distance;
+				
+				// Unsorted data is not supported by the line tooltip, as well as data grouping and
+				// navigation in Stock charts (#725) and width calculation of columns (#1900)
+			} else if (distance < 0 && series.requireSorting) {
+				error(15);
+			}
+		}
+		
+		// Record the properties
+		series.cropped = cropped; // undefined or true
+		series.cropStart = cropStart;
+		series.processedXData = processedXData;
+		series.processedYData = processedYData;
+		
+		if (options.pointRange === null) { // null means auto, as for columns, candlesticks and OHLC
+			series.pointRange = closestPointRange || 1;
+		}
+		series.closestPointRange = closestPointRange;
+		return true;
+	};
+	
+	H.seriesTypes.coloredline.prototype.drawTracker = function () {
+		var series = this,
+			options = series.options,
+			trackByArea = options.trackByArea,
+			trackerPath = [].concat(trackByArea ? series.areaPath : getPath(series.graphPath)),
+			trackerPathLength = trackerPath.length,
+			chart = series.chart,
+			pointer = chart.pointer,
+			renderer = chart.renderer,
+			snap = chart.options.tooltip.snap,
+			tracker = series.tracker,
+			cursor = options.cursor,
+			css = cursor && { cursor: cursor },
+			singlePoints = series.singlePoints,
+			singlePoint,
+			i,
+			onMouseOver;
+
+		onMouseOver = function () {
+			if (chart.hoverSeries !== series) {
+				series.onMouseOver();
+			}
+		};
+		// Extend end points. A better way would be to use round linecaps,
+		// but those are not clickable in VML.
+		if (trackerPathLength && !trackByArea) {
+			i = trackerPathLength + 1;
+			while (i--) {
+				if (trackerPath[i] === M) { // extend left side
+					trackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], L);
+				}
+				if ((i && trackerPath[i] === M) || i === trackerPathLength) { // extend right side
+					trackerPath.splice(i, 0, L, trackerPath[i - 2] + snap, trackerPath[i - 1]);
+				}
+			}
+		}
+		
+		// handle single points
+		for (i = 0; i < singlePoints.length; i++) {
+			singlePoint = singlePoints[i];
+			if (singlePoint.plotX && singlePoint.plotY) {
+				trackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY,
+					L, singlePoint.plotX + snap, singlePoint.plotY);
+			}
+		}
+		
+		// draw the tracker
+		if (tracker) {
+			tracker.attr({ d: trackerPath });
+		} else { // create
+			series.tracker = renderer.path(trackerPath)
+			.attr({
+				'stroke-linejoin': 'round', // #1225
+				visibility: series.visible ? VISIBLE : HIDDEN,
+				stroke: TRACKER_FILL,
+				fill: trackByArea ? TRACKER_FILL : NONE,
+				'stroke-width': options.lineWidth + (trackByArea ? 0 : 2 * snap),
+				zIndex: 2
+			})
+			.add(series.group);
+			
+			// The tracker is added to the series group, which is clipped, but is covered
+			// by the marker group. So the marker group also needs to capture events.
+			each([series.tracker, series.markerGroup], function (track) {
+				track.addClass(PREFIX + 'tracker')
+				.on('mouseover', onMouseOver)
+				.on('mouseout', function (e) { pointer.onTrackerMouseOut(e); })
+				.css(css);
+				
+				if (hasTouch) {
+					track.on('touchstart', onMouseOver);
+				}
+			});
+		}
+		
+	};
+	
+	H.seriesTypes.coloredline.prototype.setState = function (state) {
+		var series = this,
+			options = series.options,
+			graph = series.graph,
+			stateOptions = options.states,
+			lineWidth = options.lineWidth,
+			attribs;
+		
+		state = state || NORMAL_STATE;
+		
+		if (series.state !== state) {
+			series.state = state;
+			
+			if (stateOptions[state] && stateOptions[state].enabled === false) {
+				return;
+			}
+			
+			if (state) {
+				lineWidth = stateOptions[state].lineWidth || lineWidth + 1;
+			}
+			
+			if (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML
+				attribs = {
+					'stroke-width': lineWidth
+				};
+				// use attr because animate will cause any other animation on the graph to stop
+				each(graph, function (seg) {
+					seg.attr(attribs);
+				});
+			}
+		}
+	};
+	
+	/**
+	* The main change to get multi color isFinite changes segments array.
+	* From array of points to object with color and array of points.
+	* @returns {undefined}
+	**/
+	H.seriesTypes.coloredline.prototype.getSegments = function () {
+		var series = this,
+			lastColor = 0,
+			segments = [],
+			i,
+			points = series.points,
+			pointsLength = points.length;
+		
+		if (pointsLength) { // no action required for []
+			
+			// if connect nulls, just remove null points
+			if (series.options.connectNulls) {
+				// iterate backwars for secure point removal
+				for (i = pointsLength - 1; i >= 0; --i) {
+					if (points[i].y === null) {
+						points.splice(i, 1);
+					}
+				}
+				pointsLength = points.length;
+				
+				each(points, function (point, j) {
+					if (j > 0 && points[j].segmentColor !== points[j - 1].segmentColor) {
+						segments.push({
+							points: points.slice(lastColor, j + 1),
+							color: points[j - 1].segmentColor
+						});
+						lastColor = j;
+					}
+				});
+
+				if (pointsLength) {
+					// add the last segment (only single-point last segement is added)
+					if (lastColor !== pointsLength - 1) {
+						segments.push({
+							points: points.slice(lastColor, pointsLength),
+							color: points[pointsLength - 1].segmentColor
+						});
+					}
+				}
+				
+				if (points.length && segments.length === 0) {
+					segments = [points];
+				}
+				
+				// else, split on null points or different colors
+			} else {
+				var previousColor = null;
+				each(points, function (point, j) {
+					var colorChanged = j > 0 && (point.y === null || points[j - 1].y === null || (point.segmentColor !== points[j - 1].segmentColor && points[j].segmentColor !== previousColor)),
+						colorExists = points[j - 1] && points[j - 1].segmentColor && points[j - 1].y !== null ? true : false;
+					
+					if (colorChanged) {
+						var p = points.slice(lastColor, j + 1);
+						if (p.length > 0) {
+							// do not create segments with null ponits
+							each(p, function (pointObject, k) {
+								if (pointObject.y === null) {
+									// remove null points (might be on edges)
+									p.splice(k, 1);
+								}
+							});
+							
+							segments.push({
+								points: p,
+								color: colorExists ? points[j - 1].segmentColor : previousColor
+							});
+							lastColor = j;
+						}
+					} else if (j === pointsLength - 1) {
+						var next = j + 1;
+						if (point.y === null) {
+							next--;
+						}
+						p = points.slice(lastColor, next);
+						if (p.length > 0) {
+							// do not create segments with null ponits
+							each(p, function (pointObject, k) {
+								if (pointObject.y === null) {
+									// remove null points (might be on edges)
+									p.splice(k, 1);
+								}
+							});
+							segments.push({
+								points: p,
+								color: colorExists ? points[j - 1].segmentColor : previousColor
+							});
+							lastColor = j;
+						}
+						
+					}
+					
+					// store previous color
+					if (point) {
+						previousColor = point.segmentColor;
+					}
+				});
+			}
+		}
+		// register it
+		series.segments = segments;
+	};
+	
+	H.seriesTypes.coloredline.prototype.getGraphPath = function () {
+		// var ret = f.apply(this, Array.prototype.slice.call(arguments, 1));
+		var series = this,
+			graphPath = [],
+			segmentPath,
+			singlePoints = []; // used in drawTracker
+		// Divide into segments and build graph and area paths
+		each(series.segments, function (segment) {
+			segmentPath = series.getSegmentPath(segment.points);
+			// add the segment to the graph, or a single point for tracking
+			if (segment.points.length > 1) {
+				graphPath.push([segmentPath, segment.color]);
+			} else {
+				singlePoints.push(segment.points);
+			}
+		});
+		
+		// Record it for use in drawGraph and drawTracker, and return graphPath
+		series.singlePoints = singlePoints;
+		series.graphPath = graphPath;
+		
+		return graphPath;
+	};
+	
+	H.seriesTypes.coloredline.prototype.drawGraph = function () {
+		var series = this,
+			options = series.options,
+			props = [['graph', options.lineColor || series.color]],
+			lineWidth = options.lineWidth,
+			dashStyle = options.dashStyle,
+			roundCap = options.linecap !== 'square',
+			graphPath = series.getGraphPath(),
+			graphPathLength = graphPath.length,
+			graphSegmentsLength = 0;
+		
+		function getSegment(segment, prop, i) {
+			var attribs = {
+					stroke: prop[1],
+					'stroke-width': lineWidth,
+					fill: 'none',
+					zIndex: 1 // #1069
+				},
+				item;
+			if (dashStyle) {
+				attribs.dashstyle = dashStyle;
+			} else if (roundCap) {
+				attribs['stroke-linecap'] = attribs['stroke-linejoin'] = 'round';
+			}
+			if (segment[1]) {
+				attribs.stroke = segment[1];
+			}
+			
+			item = series.chart.renderer.path(segment[0])
+			.attr(attribs)
+			.add(series.group);
+
+
+			if (item.shadow) {
+				item.shadow(!i && options.shadow);
+			}
+			
+			return item;
+		}
+
+		// draw the graph
+		each(props, function (prop, i) {
+			var graphKey = prop[0],
+				graph = series[graphKey],
+				g;
+			
+			if (graph) { // cancel running animations, #459
+				// do we have animation
+				each(graphPath, function (segment, j) {
+					// update color and path
+					
+					if (series[graphKey][j]) {
+						series[graphKey][j].attr({ d: segment[0], stroke: segment[1] });
+					} else {
+						series[graphKey][j] = getSegment(segment, prop, i);
+					}
+				});
+				
+			} else if (graphPath.length) { // #1487
+				graph = [];
+				each(graphPath, function (segment, j) {
+					graph[j] = getSegment(segment, prop, i);
+				});
+				series[graphKey] = graph;
+				// add destroying elements
+				series[graphKey].destroy = function () {
+					for (g in series[graphKey]) {  // eslint-disable-line
+						var el = series[graphKey][g];
+						if (el && el.destroy) {
+							el.destroy();
+						}
+					}
+				};
+			}
+			// Checks if series.graph exists. #3
+			graphSegmentsLength = (series.graph && series.graph.length) || -1;
+			
+			for (var j = graphSegmentsLength; j >= graphPathLength; j--) {
+				if (series[graphKey][j]) {
+					series[graphKey][j].destroy();
+					series[graphKey].splice(j, 1);
+				}
+			}
+		});
+	};
+
+	H.wrap(seriesTypes.coloredline.prototype, 'translate', function (proceed) {
+		proceed.apply(this, [].slice.call(arguments, 1));
+		if (this.getSegments) {
+			this.getSegments();
+		}
+	});
+	
+	
+	
+	/**
+	*
+	*   ColoredArea series type
+	*
+	**/
+	seriesTypes.coloredarea = H.extendClass(seriesTypes.coloredline);
+	
+	H.seriesTypes.coloredarea.prototype.init = function (chart, options) {
+		options.threshold = options.threshold || null;
+		H.Series.prototype.init.call(this, chart, options);
+	};
+	
+	H.seriesTypes.coloredarea.prototype.closeSegment = function (path, segment, translatedThreshold) {
+		path.push(
+			L,
+			segment[segment.length - 1].plotX,
+			translatedThreshold,
+			L,
+			segment[0].plotX,
+			translatedThreshold
+		);
+	};
+	
+	H.seriesTypes.coloredarea.prototype.drawGraph = function (f) {
+		H.seriesTypes.coloredline.prototype.drawGraph.call(this, f);
+		var series = this,
+			options = this.options,
+			props = [['graph', options.lineColor || series.color]];
+
+		each(props, function (prop) {
+			var graphKey = prop[0],
+				graph = series[graphKey];
+			
+			if (graph) { // cancel running animations, #459
+				// do we have animation
+				each(series.graphPath, function (segment, j) {
+					// update color and path
+					
+					if (series[graphKey][j]) {
+						series[graphKey][j].attr({ fill: segment[1] });
+					}
+				});
+				
+			}
+		});
+	};
+
+	/**
+	* Extend the base Series getSegmentPath method by adding the path for the area.
+	* This path is pushed to the series.areaPath property.
+	* @param {Object} segment of the path
+	* @returns {Array} Path (SVG)
+	**/
+	H.seriesTypes.coloredarea.prototype.getSegmentPath = function (segment) {
+		var segmentPath = H.Series.prototype.getSegmentPath.call(this, segment), // call base method
+			areaSegmentPath = [].concat(segmentPath), // work on a copy for the area path
+			i,
+			options = this.options,
+			segLength = segmentPath.length,
+			translatedThreshold = this.yAxis.getThreshold(options.threshold), // #2181
+			yBottom;
+
+		if (segLength === 3) { // for animation from 1 to two points
+			areaSegmentPath.push(L, segmentPath[1], segmentPath[2]);
+		}
+		if (options.stacking && !this.closedStacks) {
+			for (i = segment.length - 1; i >= 0; i--) {
+
+				yBottom = pick(segment[i].yBottom, translatedThreshold);
+
+				// step line?
+				if (i < segment.length - 1 && options.step) {
+					areaSegmentPath.push(segment[i + 1].plotX, yBottom);
+				}
+				areaSegmentPath.push(segment[i].plotX, yBottom);
+			}
+		} else { // follow zero line back
+			this.closeSegment(areaSegmentPath, segment, translatedThreshold);
+		}
+		return areaSegmentPath;
+	};
+	
+	H.seriesTypes.coloredarea.prototype.getGraphPath = function () {
+		var series = this,
+			graphPath = [],
+			segmentPath,
+			singlePoints = []; // used in drawTracker
+		// Divide into segments and build graph and area paths
+		
+		this.areaPath = [];
+		each(series.segments, function (segment) {
+			segmentPath = series.getSegmentPath(segment.points);
+			// add the segment to the graph, or a single point for tracking
+			if (segment.points.length > 1) {
+				graphPath.push([segmentPath, segment.color]);
+			} else {
+				singlePoints.push(segment.points);
+			}
+		});
+		
+		// Record it for use in drawGraph and drawTracker, and return graphPath
+		series.singlePoints = singlePoints;
+		series.graphPath = graphPath;
+		return graphPath;
+	
+	};
+	
+	H.seriesTypes.coloredarea.prototype.drawLegendSymbol = H.LegendSymbolMixin.drawRectangle;
+}));</script>
+<script>var HCDefaults = $.extend(true, {}, Highcharts.getOptions(), {});
+
+function ResetHighchartsOptions() {
+    // Fortunately, Highcharts returns the reference to defaultOptions itself
+    // We can manipulate this and delete all the properties
+    var defaultOptions = Highcharts.getOptions();
+    for (var prop in defaultOptions) {
+        if (typeof defaultOptions[prop] !== 'function') delete defaultOptions[prop];
+    }
+    // Fall back to the defaults that we captured initially, this resets the theme
+    Highcharts.setOptions(HCDefaults);
+}
+</script>
+<script>(function (H) {
+  
+  // cross http://stackoverflow.com/a/25379352/829971
+  Highcharts.Renderer.prototype.symbols.cross = function (x, y, radius) {
+    var r = radius * 0.4,
+        e = r * 0.8,
+        a = e / Math.sqrt(2),
+        p = r / Math.sqrt(2);
+    return [
+        'M', x, y + a,
+        'L', x + p, y + a + p,
+        x, y + a + (2 * p),
+        x + a, y + (2 * a) + (2 * p),
+        x + a + p, y + (2 * a) + p,
+        x + a + (2 * p), y + (2 * a) + (2 * p),
+        x + (2 * a) + (2 * p), y + a + (2 * p),
+        x + (2 * a) + p, y + a + p,
+        x + (2 * a) + (2 * p), y + a,
+        x + a + (2 * p), y,
+        x + a + p, y + p,
+        x + a, y,
+        'Z'];
+    };
+
+  // plus http://stackoverflow.com/a/36270224/829971
+  Highcharts.SVGRenderer.prototype.symbols.plus = function (x, y, w, h) {
+    return [
+        'M', x, y + (5 * h) / 8,
+        'L', x, y + (3 * h) / 8,
+        'L', x + (3 * w) / 8, y + (3 * h) / 8,
+        'L', x + (3 * w) / 8, y,
+        'L', x + (5 * w) / 8, y,
+        'L', x + (5 * w) / 8, y + (3 * h) / 8,
+        'L', x + w, y + (3 * h) / 8,
+        'L', x + w, y + (5 * h) / 8,
+        'L', x + (5 * w) / 8, y + (5 * h) / 8,
+        'L', x + (5 * w) / 8, y + h,
+        'L', x + (3 * w) / 8, y + h,
+        'L', x + (3 * w) / 8, y + (5 * h) / 8,
+        'L', x, y + (5 * h) / 8,
+        'z'
+    ];
+  };
+  
+  
+}(Highcharts));
+</script>
+<script>/* Highcharts plugin to handle text symbols */
+(function (H) {
+    function symbolWrap(proceed, symbol, x, y, w, h, options) {
+        if (symbol.indexOf('text:') === 0) {
+            var text = unescape(JSON.parse('"\\u' + symbol.split(':')[1] + '"')),
+                svgElem = this.text(text, x, y)
+                  .attr({
+                    translateY: h,
+                    translateX: -1
+                  })
+                  .css({
+                    fontFamily: 'FontAwesome',
+                    fontSize: h * 2
+                  });
+                
+            if (svgElem.renderer.isVML) {
+                svgElem.fillSetter = function (value, key, element) {
+                    element.style.color = H.Color(value).get('rgb');
+                };
+            }
+            return svgElem;
+        }
+        return proceed.apply(this, [].slice.call(arguments, 1));
+    }
+    H.wrap(H.SVGRenderer.prototype, 'symbol', symbolWrap);
+    if (H.VMLRenderer) {
+        H.wrap(H.VMLRenderer.prototype, 'symbol', symbolWrap);
+    }
+    
+    // Load the font for SVG files also
+    /*
+    H.wrap(H.Chart.prototype, 'getSVG', function (proceed) {
+        var svg = proceed.call(this);
+        svg = '<?xml-stylesheet type="text/css" ' +
+            'href="http://netdna.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" ?>' + 
+            svg;
+        return svg;
+    });
+    */
+}(Highcharts));
+</script>
+<script>HTMLWidgets.widget({
+
+  name: 'highchart',
+
+  type: 'output',
+
+  initialize: function(el, width, height) {
+
+    return {
+      // TODO: add instance fields as required
+    };
+
+  },
+
+  renderValue: function(el, x, instance) {
+    
+    if(x.debug) {
+      window.xclone = JSON.parse(JSON.stringify(x));
+      window.elclone = $(el);
+      console.log(el);
+      console.log("hc_opts", x.hc_opts);
+      console.log("theme", x.theme);
+      console.log("conf_opts", x.conf_opts);
+    }
+
+    if(x.fonts !== undefined) {
+      
+      x.fonts = ((typeof(x.fonts) == "string") ? [x.fonts] : x.fonts);
+    
+      x.fonts.forEach(function(s){
+        /* http://stackoverflow.com/questions/4724606 */
+        var urlfont = 'https://fonts.googleapis.com/css?family=' + s;
+        if (!$("link[href='" + urlfont + "']").length) {
+          $('<link href="' + urlfont + '" rel="stylesheet" type="text/css">').appendTo("head");
+        }
+        
+      });
+      
+    }
+    
+    ResetHighchartsOptions();
+    
+    if(x.theme !== null) {
+      
+      if(x.debug) console.log("adding THEME");
+      
+      Highcharts.setOptions(x.theme);
+      
+    }
+    
+    if((x.theme && x.theme.chart.divBackgroundImage !== undefined) |
+         (x.hc_opts.chart  && x.hc_opts.chart.divBackgroundImage !== undefined)) {
+           
+      if(x.debug) console.log("adding BackgroundImage");     
+           
+      var bkgrnd = x.theme.chart.divBackgroundImage || x.hc_opts.chart.divBackgroundImage;
+      
+      Highcharts.wrap(Highcharts.Chart.prototype, "getContainer", function (proceed) {
+        
+        proceed.call(this);
+        
+        $("#" + el.id).css("background-image", "url(" + bkgrnd + ")");
+        $("#" + el.id).css("-webkit-background-size", "cover");
+        $("#" + el.id).css("-moz-background-size", "cover");
+        $("#" + el.id).css("-o-background-size", "cover");
+        $("#" + el.id).css("background-size", "cover");
+        
+      });
+      
+    }
+    
+    Highcharts.setOptions(x.conf_opts);
+    
+    if(x.type == "chart") {
+      if(x.debug) console.log("charting CHART");
+      $("#" + el.id).highcharts(x.hc_opts);
+    } else if (x.type == "stock") {
+      if(x.debug) console.log("charting STOCK");
+      $("#" + el.id).highcharts('StockChart', x.hc_opts);  
+    } else if (x.type == "map"){
+      if(x.debug) console.log("charting MAP");
+
+      x.hc_opts.series = x.hc_opts.series.map(function(e){
+        if(e.geojson === true) {
+          if(x.debug) console.log("geojson\n\t", e.type, "\n\t", typeof(e.series));
+          e.data = Highcharts.geojson(e.data, e.type);
+        }
+        return e;
+      });
+      
+      $("#" + el.id).highcharts('Map', x.hc_opts); 
+      
+      if(x.hc_opts.mapNavigation !== undefined && x.hc_opts.mapNavigation.enabled === true){
+        /* if have navigation option and enabled true: http://stackoverflow.com/questions/7600454 */
+        $("#" + el.id).bind( 'mousewheel DOMMouseScroll', function ( e ) {
+          var e0 = e.originalEvent,
+          delta = e0.wheelDelta || -e0.detail;
+          this.scrollTop += ( delta < 0 ? 1 : -1 ) * 30;
+          e.preventDefault();
+
+        });
+        
+      }
+      
+    }
+    
+    if(x.hc_opts.motion !== undefined) {
+      
+      $("#" + el.id).css({"position" : "relative" });
+      
+      if(x.debug) console.log("setting MOTION options");
+      
+      var pc = $($("#" + el.id).find("#play-controls")[0]);
+      
+      var ct = x.theme.chart;
+      
+      if(ct.backgroundColor !== undefined) $(pc.find("#play-pause-button")[0]).css({backgroundColor : x.theme.chart.backgroundColor});
+      if(ct.style !== undefined)  $(pc.find("#play-output")[0]).css(x.theme.chart.style);
+      if(ct.style !== undefined && ct.style.color !== undefined) $(pc.find("#play-pause-button")[0]).css({color : x.theme.chart.style.color});
+      
+      
+    } 
+    
+  },
+
+  resize: function(el, width, height, instance) {
+    
+    /* http://stackoverflow.com/questions/18445784/ */
+    var chart = $("#" +el.id).highcharts();
+    var w = chart.renderTo.clientWidth; 
+    var h = chart.renderTo.clientHeight; 
+    chart.setSize(w, h); 
+
+  }
+
+});
+</script>
+
+</head>
+<body>
+<div id="htmlwidget_container">
+  <div id="htmlwidget-c35f66576b27eaeac90f" style="width:100%;height:500px;" class="highchart html-widget"></div>
+</div>
+<script type="application/json" data-for="htmlwidget-c35f66576b27eaeac90f">{"x":{"hc_opts":{"title":{"text":null},"yAxis":{"title":{"text":""},"ceiling":100,"floor":0,"labels":{"format":"{value} %"}},"credits":{"enabled":true,"text":"KorAP R Client Pakckage","href":"//github.com/KorAP/RKorAPClient/"},"exporting":{"enabled":true},"plotOptions":{"series":{"label":{"enabled":false},"turboThreshold":0},"treemap":{"layoutAlgorithm":"squarified"},"line":{"cursor":"pointer","point":{"events":{"click":"function() { window.open(this.click, 'korap'); }"}}}},"chart":{"zoomType":"xy"},"xAxis":{"allowDecimals":false},"tooltip":{"formatter":"function (tooltip) {\n        var str = tooltip.defaultFormatter.call(this, tooltip);\n        if(Array.isArray(str))  {\n          str = str.join('');\n        }\n       for (var i = 0; i < this.points.length; i++) {\n         str = str.replace(/([0-9.,]+.?)%/, this.points[i].point.count+' ($1@)');\n       }\n       return str.replace(/@/g, '%')\n      } ","crosshairs":true,"valueDecimals":2,"shared":true,"valueSuffix":" %"},"series":[{"group":"group","data":[{"year":1980,"value":95,"count":19,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201980&ql=poliqarp","x":1980,"y":95},{"year":1981,"value":92.8571428571429,"count":26,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201981&ql=poliqarp","x":1981,"y":92.8571428571429},{"year":1982,"value":91.4285714285714,"count":32,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201982&ql=poliqarp","x":1982,"y":91.4285714285714},{"year":1983,"value":88.8888888888889,"count":24,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201983&ql=poliqarp","x":1983,"y":88.8888888888889},{"year":1984,"value":82.9268292682927,"count":34,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201984&ql=poliqarp","x":1984,"y":82.9268292682927},{"year":1985,"value":86.7924528301887,"count":46,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201985&ql=poliqarp","x":1985,"y":86.7924528301887},{"year":1986,"value":77.1428571428572,"count":27,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201986&ql=poliqarp","x":1986,"y":77.1428571428572},{"year":1987,"value":97.6744186046512,"count":42,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201987&ql=poliqarp","x":1987,"y":97.6744186046512},{"year":1988,"value":94.8717948717949,"count":37,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201988&ql=poliqarp","x":1988,"y":94.8717948717949},{"year":1989,"value":93.4426229508197,"count":57,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201989&ql=poliqarp","x":1989,"y":93.4426229508197},{"year":1990,"value":93.5897435897436,"count":73,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201990&ql=poliqarp","x":1990,"y":93.5897435897436},{"year":1991,"value":90.2173913043478,"count":83,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201991&ql=poliqarp","x":1991,"y":90.2173913043478},{"year":1992,"value":91.6129032258064,"count":142,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201992&ql=poliqarp","x":1992,"y":91.6129032258064},{"year":1993,"value":88.2352941176471,"count":180,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201993&ql=poliqarp","x":1993,"y":88.2352941176471},{"year":1994,"value":89.9521531100478,"count":188,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201994&ql=poliqarp","x":1994,"y":89.9521531100478},{"year":1995,"value":93.6395759717314,"count":265,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201995&ql=poliqarp","x":1995,"y":93.6395759717314},{"year":1996,"value":95.0664136622391,"count":501,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201996&ql=poliqarp","x":1996,"y":95.0664136622391},{"year":1997,"value":94.1446613088404,"count":820,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201997&ql=poliqarp","x":1997,"y":94.1446613088404},{"year":1998,"value":95.6093189964158,"count":1067,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201998&ql=poliqarp","x":1998,"y":95.6093189964158},{"year":1999,"value":94.410480349345,"count":1081,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201999&ql=poliqarp","x":1999,"y":94.410480349345},{"year":2000,"value":94.3931398416887,"count":1431,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202000&ql=poliqarp","x":2000,"y":94.3931398416887},{"year":2001,"value":93.3433059087509,"count":1248,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202001&ql=poliqarp","x":2001,"y":93.3433059087509},{"year":2002,"value":92.2088353413655,"count":1148,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202002&ql=poliqarp","x":2002,"y":92.2088353413655},{"year":2003,"value":93.6958234830575,"count":1189,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202003&ql=poliqarp","x":2003,"y":93.6958234830575},{"year":2004,"value":91.7331399564902,"count":1265,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202004&ql=poliqarp","x":2004,"y":91.7331399564902},{"year":2005,"value":91.3284132841328,"count":1485,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202005&ql=poliqarp","x":2005,"y":91.3284132841328},{"year":2006,"value":91.3741820345033,"count":1536,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202006&ql=poliqarp","x":2006,"y":91.3741820345033},{"year":2007,"value":91.7490118577075,"count":1857,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202007&ql=poliqarp","x":2007,"y":91.7490118577075},{"year":2008,"value":90.4109589041096,"count":1848,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202008&ql=poliqarp","x":2008,"y":90.4109589041096},{"year":2009,"value":88.5201793721973,"count":1974,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202009&ql=poliqarp","x":2009,"y":88.5201793721973},{"year":2010,"value":88.6103542234332,"count":1626,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202010&ql=poliqarp","x":2010,"y":88.6103542234332},{"year":2011,"value":85.5329949238579,"count":1685,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202011&ql=poliqarp","x":2011,"y":85.5329949238579},{"year":2012,"value":86.0191637630662,"count":1975,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202012&ql=poliqarp","x":2012,"y":86.0191637630662},{"year":2013,"value":85.4394175767031,"count":1643,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202013&ql=poliqarp","x":2013,"y":85.4394175767031},{"year":2014,"value":82.6344086021505,"count":1537,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202014&ql=poliqarp","x":2014,"y":82.6344086021505},{"year":2015,"value":81.692573402418,"count":1419,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202015&ql=poliqarp","x":2015,"y":81.692573402418},{"year":2016,"value":79.7794117647059,"count":1736,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202016&ql=poliqarp","x":2016,"y":79.7794117647059},{"year":2017,"value":76.7591674925669,"count":1549,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202017&ql=poliqarp","x":2017,"y":76.7591674925669},{"year":2018,"value":76.6076823478636,"count":1775,"click":"https://korap.ids-mannheim.de/?q=macht%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202018&ql=poliqarp","x":2018,"y":76.6076823478636}],"type":"line","marker":{"radius":2},"name":"macht []{0,3} Sinn","colorIndex":0,"zIndex":1},{"group":"group","data":[{"year":1980,"conf.low":73.0556254428533,"conf.high":99.7384444863308,"x":1980,"low":73.0556254428533,"high":99.7384444863308},{"year":1981,"conf.low":75.0416182995313,"conf.high":98.7530739684036,"x":1981,"low":75.0416182995313,"high":98.7530739684036},{"year":1982,"conf.low":75.8135574242256,"conf.high":97.7598332506547,"x":1982,"low":75.8135574242256,"high":97.7598332506547},{"year":1983,"conf.low":69.7033791207719,"conf.high":97.0855730276021,"x":1983,"low":69.7033791207719,"high":97.0855730276021},{"year":1984,"conf.low":67.3539788176602,"conf.high":92.3044226330955,"x":1984,"low":67.3539788176602,"high":92.3044226330955},{"year":1985,"conf.low":74.0470006283946,"conf.high":94.0862847303049,"x":1985,"low":74.0470006283946,"high":94.0862847303049},{"year":1986,"conf.low":59.4479825671614,"conf.high":88.9555988147557,"x":1986,"low":59.4479825671614,"high":88.9555988147557},{"year":1987,"conf.low":86.2041579742542,"conf.high":99.8784845682876,"x":1987,"low":86.2041579742542,"high":99.8784845682876},{"year":1988,"conf.low":81.3702907377942,"conf.high":99.1067618864895,"x":1988,"low":81.3702907377942,"high":99.1067618864895},{"year":1989,"conf.low":83.2526021667365,"conf.high":97.878478711837,"x":1989,"low":83.2526021667365,"high":97.878478711837},{"year":1990,"conf.low":85.0313310022991,"conf.high":97.6161203738943,"x":1990,"low":85.0313310022991,"high":97.6161203738943},{"year":1991,"conf.low":81.7874365227723,"conf.high":95.1503602743896,"x":1991,"low":81.7874365227723,"high":95.1503602743896},{"year":1992,"conf.low":85.7943864616299,"conf.high":95.2755127963722,"x":1992,"low":85.7943864616299,"high":95.2755127963722},{"year":1993,"conf.low":82.8131666172552,"conf.high":92.1674041087979,"x":1993,"low":82.8131666172552,"high":92.1674041087979},{"year":1994,"conf.low":84.8524475330347,"conf.high":93.5271280408146,"x":1994,"low":84.8524475330347,"high":93.5271280408146},{"year":1995,"conf.low":89.9617269742647,"conf.high":96.0779057390259,"x":1995,"low":89.9617269742647,"high":96.0779057390259},{"year":1996,"conf.low":92.7588248047252,"conf.high":96.6889139250739,"x":1996,"low":92.7588248047252,"high":96.6889139250739},{"year":1997,"conf.low":92.3187801516029,"conf.high":95.5687285190094,"x":1997,"low":92.3187801516029,"high":95.5687285190094},{"year":1998,"conf.low":94.1922884077845,"conf.high":96.7018917906517,"x":1998,"low":94.1922884077845,"high":96.7018917906517},{"year":1999,"conf.low":92.8770023729847,"conf.high":95.6372910917686,"x":1999,"low":92.8770023729847,"high":95.6372910917686},{"year":2000,"conf.low":93.0828461889237,"conf.high":95.4726693219818,"x":2000,"low":93.0828461889237,"high":95.4726693219818},{"year":2001,"conf.low":91.8383944966634,"conf.high":94.5929521984824,"x":2001,"low":91.8383944966634,"high":94.5929521984824},{"year":2002,"conf.low":90.5432680262243,"conf.high":93.6077652407648,"x":2002,"low":90.5432680262243,"high":93.6077652407648},{"year":2003,"conf.low":92.1791498893459,"conf.high":94.9410251899362,"x":2003,"low":92.1791498893459,"high":94.9410251899362},{"year":2004,"conf.low":90.1221252311976,"conf.high":93.1065320575451,"x":2004,"low":90.1221252311976,"high":93.1065320575451},{"year":2005,"conf.low":89.8284370349406,"conf.high":92.6292079103436,"x":2005,"low":89.8284370349406,"high":92.6292079103436},{"year":2006,"conf.low":89.9042340640674,"conf.high":92.6512963935937,"x":2006,"low":89.9042340640674,"high":92.6512963935937},{"year":2007,"conf.low":90.4435099893752,"conf.high":92.8930888163329,"x":2007,"low":90.4435099893752,"high":92.8930888163329},{"year":2008,"conf.low":89.0317811592721,"conf.high":91.6356286412622,"x":2008,"low":89.0317811592721,"high":91.6356286412622},{"year":2009,"conf.low":87.1068400158732,"conf.high":89.798794728802,"x":2009,"low":87.1068400158732,"high":89.798794728802},{"year":2010,"conf.low":87.0467359370189,"conf.high":90.0096371872936,"x":2010,"low":87.0467359370189,"high":90.0096371872936},{"year":2011,"conf.low":83.8839987194577,"conf.high":87.0414282239757,"x":2011,"low":83.8839987194577,"high":87.0414282239757},{"year":2012,"conf.low":84.5177569547539,"conf.high":87.3983998187093,"x":2012,"low":84.5177569547539,"high":87.3983998187093},{"year":2013,"conf.low":83.7652021049103,"conf.high":86.9699990356046,"x":2013,"low":83.7652021049103,"high":86.9699990356046},{"year":2014,"conf.low":80.8181948805348,"conf.high":84.314003652223,"x":2014,"low":80.8181948805348,"high":84.314003652223},{"year":2015,"conf.low":79.7748079995102,"conf.high":83.4682591055029,"x":2015,"low":79.7748079995102,"high":83.4682591055029},{"year":2016,"conf.low":78.0163863298564,"conf.high":81.4360515897676,"x":2016,"low":78.0163863298564,"high":81.4360515897676},{"year":2017,"conf.low":74.8411618656268,"conf.high":78.5741239916616,"x":2017,"low":74.8411618656268,"high":78.5741239916616},{"year":2018,"conf.low":74.8187262167962,"conf.high":78.3074548915808,"x":2018,"low":74.8187262167962,"high":78.3074548915808}],"type":"arearange","name":"ci","fillOpacity":0.3,"lineWidth":0,"marker":{"enabled":false},"enableMouseTracking":false,"linkedTo":":previous","colorIndex":0,"zIndex":0},{"group":"group","data":[{"year":1980,"value":5,"count":1,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201980&ql=poliqarp","x":1980,"y":5},{"year":1981,"value":7.14285714285714,"count":2,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201981&ql=poliqarp","x":1981,"y":7.14285714285714},{"year":1982,"value":8.57142857142857,"count":3,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201982&ql=poliqarp","x":1982,"y":8.57142857142857},{"year":1983,"value":11.1111111111111,"count":3,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201983&ql=poliqarp","x":1983,"y":11.1111111111111},{"year":1984,"value":17.0731707317073,"count":7,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201984&ql=poliqarp","x":1984,"y":17.0731707317073},{"year":1985,"value":13.2075471698113,"count":7,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201985&ql=poliqarp","x":1985,"y":13.2075471698113},{"year":1986,"value":22.8571428571429,"count":8,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201986&ql=poliqarp","x":1986,"y":22.8571428571429},{"year":1987,"value":2.32558139534884,"count":1,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201987&ql=poliqarp","x":1987,"y":2.32558139534884},{"year":1988,"value":5.12820512820513,"count":2,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201988&ql=poliqarp","x":1988,"y":5.12820512820513},{"year":1989,"value":6.55737704918033,"count":4,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201989&ql=poliqarp","x":1989,"y":6.55737704918033},{"year":1990,"value":6.41025641025641,"count":5,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201990&ql=poliqarp","x":1990,"y":6.41025641025641},{"year":1991,"value":9.78260869565217,"count":9,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201991&ql=poliqarp","x":1991,"y":9.78260869565217},{"year":1992,"value":8.38709677419355,"count":13,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201992&ql=poliqarp","x":1992,"y":8.38709677419355},{"year":1993,"value":11.7647058823529,"count":24,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201993&ql=poliqarp","x":1993,"y":11.7647058823529},{"year":1994,"value":10.0478468899522,"count":21,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201994&ql=poliqarp","x":1994,"y":10.0478468899522},{"year":1995,"value":6.36042402826855,"count":18,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201995&ql=poliqarp","x":1995,"y":6.36042402826855},{"year":1996,"value":4.93358633776091,"count":26,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201996&ql=poliqarp","x":1996,"y":4.93358633776091},{"year":1997,"value":5.85533869115959,"count":51,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201997&ql=poliqarp","x":1997,"y":5.85533869115959},{"year":1998,"value":4.39068100358423,"count":49,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201998&ql=poliqarp","x":1998,"y":4.39068100358423},{"year":1999,"value":5.58951965065502,"count":64,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%201999&ql=poliqarp","x":1999,"y":5.58951965065502},{"year":2000,"value":5.60686015831135,"count":85,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202000&ql=poliqarp","x":2000,"y":5.60686015831135},{"year":2001,"value":6.65669409124907,"count":89,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202001&ql=poliqarp","x":2001,"y":6.65669409124907},{"year":2002,"value":7.79116465863454,"count":97,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202002&ql=poliqarp","x":2002,"y":7.79116465863454},{"year":2003,"value":6.30417651694247,"count":80,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202003&ql=poliqarp","x":2003,"y":6.30417651694247},{"year":2004,"value":8.26686004350979,"count":114,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202004&ql=poliqarp","x":2004,"y":8.26686004350979},{"year":2005,"value":8.67158671586716,"count":141,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202005&ql=poliqarp","x":2005,"y":8.67158671586716},{"year":2006,"value":8.62581796549673,"count":145,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202006&ql=poliqarp","x":2006,"y":8.62581796549673},{"year":2007,"value":8.25098814229249,"count":167,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202007&ql=poliqarp","x":2007,"y":8.25098814229249},{"year":2008,"value":9.58904109589041,"count":196,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202008&ql=poliqarp","x":2008,"y":9.58904109589041},{"year":2009,"value":11.4798206278027,"count":256,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202009&ql=poliqarp","x":2009,"y":11.4798206278027},{"year":2010,"value":11.3896457765668,"count":209,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202010&ql=poliqarp","x":2010,"y":11.3896457765668},{"year":2011,"value":14.4670050761421,"count":285,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202011&ql=poliqarp","x":2011,"y":14.4670050761421},{"year":2012,"value":13.9808362369338,"count":321,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202012&ql=poliqarp","x":2012,"y":13.9808362369338},{"year":2013,"value":14.5605824232969,"count":280,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202013&ql=poliqarp","x":2013,"y":14.5605824232969},{"year":2014,"value":17.3655913978495,"count":323,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202014&ql=poliqarp","x":2014,"y":17.3655913978495},{"year":2015,"value":18.307426597582,"count":318,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202015&ql=poliqarp","x":2015,"y":18.307426597582},{"year":2016,"value":20.2205882352941,"count":440,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202016&ql=poliqarp","x":2016,"y":20.2205882352941},{"year":2017,"value":23.2408325074331,"count":469,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202017&ql=poliqarp","x":2017,"y":23.2408325074331},{"year":2018,"value":23.3923176521364,"count":542,"click":"https://korap.ids-mannheim.de/?q=ergibt%20%5B%5D%7B0%2C3%7D%20Sinn&cq=textType%20%3D%20%2FZeit.%2A%2F%20%26%20availability%21%3DQAO-NC-LOC%3Aids%20%26%20pubDate%20in%202018&ql=poliqarp","x":2018,"y":23.3923176521364}],"type":"line","marker":{"radius":2},"name":"ergibt []{0,3} Sinn","colorIndex":1,"zIndex":1},{"group":"group","data":[{"year":1980,"conf.low":0.261555513669134,"conf.high":26.9443745571467,"x":1980,"low":0.261555513669134,"high":26.9443745571467},{"year":1981,"conf.low":1.2469260315964,"conf.high":24.9583817004687,"x":1981,"low":1.2469260315964,"high":24.9583817004687},{"year":1982,"conf.low":2.24016674934531,"conf.high":24.1864425757744,"x":1982,"low":2.24016674934531,"high":24.1864425757744},{"year":1983,"conf.low":2.91442697239796,"conf.high":30.2966208792281,"x":1983,"low":2.91442697239796,"high":30.2966208792281},{"year":1984,"conf.low":7.69557736690451,"conf.high":32.6460211823398,"x":1984,"low":7.69557736690451,"high":32.6460211823398},{"year":1985,"conf.low":5.91371526969509,"conf.high":25.9529993716054,"x":1985,"low":5.91371526969509,"high":25.9529993716054},{"year":1986,"conf.low":11.0444011852443,"conf.high":40.5520174328386,"x":1986,"low":11.0444011852443,"high":40.5520174328386},{"year":1987,"conf.low":0.121515431712356,"conf.high":13.7958420257458,"x":1987,"low":0.121515431712356,"high":13.7958420257458},{"year":1988,"conf.low":0.893238113510509,"conf.high":18.6297092622058,"x":1988,"low":0.893238113510509,"high":18.6297092622058},{"year":1989,"conf.low":2.12152128816304,"conf.high":16.7473978332635,"x":1989,"low":2.12152128816304,"high":16.7473978332635},{"year":1990,"conf.low":2.3838796261057,"conf.high":14.9686689977009,"x":1990,"low":2.3838796261057,"high":14.9686689977009},{"year":1991,"conf.low":4.84963972561041,"conf.high":18.2125634772277,"x":1991,"low":4.84963972561041,"high":18.2125634772277},{"year":1992,"conf.low":4.72448720362782,"conf.high":14.2056135383702,"x":1992,"low":4.72448720362782,"high":14.2056135383702},{"year":1993,"conf.low":7.83259589120209,"conf.high":17.1868333827448,"x":1993,"low":7.83259589120209,"high":17.1868333827448},{"year":1994,"conf.low":6.4728719591854,"conf.high":15.1475524669653,"x":1994,"low":6.4728719591854,"high":15.1475524669653},{"year":1995,"conf.low":3.92209426097411,"conf.high":10.0382730257353,"x":1995,"low":3.92209426097411,"high":10.0382730257353},{"year":1996,"conf.low":3.31108607492606,"conf.high":7.24117519527483,"x":1996,"low":3.31108607492606,"high":7.24117519527483},{"year":1997,"conf.low":4.43127148099064,"conf.high":7.68121984839713,"x":1997,"low":4.43127148099064,"high":7.68121984839713},{"year":1998,"conf.low":3.29810820934828,"conf.high":5.80771159221546,"x":1998,"low":3.29810820934828,"high":5.80771159221546},{"year":1999,"conf.low":4.36270890823145,"conf.high":7.12299762701531,"x":1999,"low":4.36270890823145,"high":7.12299762701531},{"year":2000,"conf.low":4.52733067801824,"conf.high":6.91715381107628,"x":2000,"low":4.52733067801824,"high":6.91715381107628},{"year":2001,"conf.low":5.40704780151759,"conf.high":8.16160550333665,"x":2001,"low":5.40704780151759,"high":8.16160550333665},{"year":2002,"conf.low":6.3922347592352,"conf.high":9.45673197377574,"x":2002,"low":6.3922347592352,"high":9.45673197377574},{"year":2003,"conf.low":5.05897481006378,"conf.high":7.82085011065408,"x":2003,"low":5.05897481006378,"high":7.82085011065408},{"year":2004,"conf.low":6.89346794245487,"conf.high":9.87787476880238,"x":2004,"low":6.89346794245487,"high":9.87787476880238},{"year":2005,"conf.low":7.3707920896564,"conf.high":10.1715629650594,"x":2005,"low":7.3707920896564,"high":10.1715629650594},{"year":2006,"conf.low":7.34870360640627,"conf.high":10.0957659359326,"x":2006,"low":7.34870360640627,"high":10.0957659359326},{"year":2007,"conf.low":7.10691118366707,"conf.high":9.5564900106248,"x":2007,"low":7.10691118366707,"high":9.5564900106248},{"year":2008,"conf.low":8.36437135873775,"conf.high":10.9682188407279,"x":2008,"low":8.36437135873775,"high":10.9682188407279},{"year":2009,"conf.low":10.201205271198,"conf.high":12.8931599841268,"x":2009,"low":10.201205271198,"high":12.8931599841268},{"year":2010,"conf.low":9.99036281270643,"conf.high":12.9532640629811,"x":2010,"low":9.99036281270643,"high":12.9532640629811},{"year":2011,"conf.low":12.9585717760243,"conf.high":16.1160012805423,"x":2011,"low":12.9585717760243,"high":16.1160012805423},{"year":2012,"conf.low":12.6016001812907,"conf.high":15.4822430452461,"x":2012,"low":12.6016001812907,"high":15.4822430452461},{"year":2013,"conf.low":13.0300009643954,"conf.high":16.2347978950897,"x":2013,"low":13.0300009643954,"high":16.2347978950897},{"year":2014,"conf.low":15.685996347777,"conf.high":19.1818051194652,"x":2014,"low":15.685996347777,"high":19.1818051194652},{"year":2015,"conf.low":16.5317408944971,"conf.high":20.2251920004898,"x":2015,"low":16.5317408944971,"high":20.2251920004898},{"year":2016,"conf.low":18.5639484102324,"conf.high":21.9836136701436,"x":2016,"low":18.5639484102324,"high":21.9836136701436},{"year":2017,"conf.low":21.4258760083384,"conf.high":25.1588381343732,"x":2017,"low":21.4258760083384,"high":25.1588381343732},{"year":2018,"conf.low":21.6925451084192,"conf.high":25.1812737832038,"x":2018,"low":21.6925451084192,"high":25.1812737832038}],"type":"arearange","name":"ci","fillOpacity":0.3,"lineWidth":0,"marker":{"enabled":false},"enableMouseTracking":false,"linkedTo":":previous","colorIndex":1,"zIndex":0}]},"theme":{"colors":["#1F77B4","#FF7F0E","#2CA02C","#D62728","#9467BD","#8C564B","#E377C2","#7F7F7F","#BCBD22","#17BECF","#AEC7E8","#FFBB78","#98DF8A","#FF9896","#C5B0D5","#C49C94","#F7B6D2","#C7C7C7","#DBDB8D","#9EDAE5"],"chart":{"style":{"color":"#333","fontFamily":"Open Sans"}},"title":{"style":{"fontFamily":"Raleway","fontWeight":"100"}},"subtitle":{"style":{"fontFamily":"Raleway","fontWeight":"100"}},"legend":{"align":"right","verticalAlign":"bottom"},"xAxis":{"gridLineWidth":1,"gridLineColor":"#F3F3F3","lineColor":"#F3F3F3","minorGridLineColor":"#F3F3F3","tickColor":"#F3F3F3","tickWidth":1},"yAxis":{"gridLineColor":"#F3F3F3","lineColor":"#F3F3F3","minorGridLineColor":"#F3F3F3","tickColor":"#F3F3F3","tickWidth":1}},"conf_opts":{"global":{"Date":null,"VMLRadialGradientURL":"http =//code.highcharts.com/list(version)/gfx/vml-radial-gradient.png","canvasToolsURL":"http =//code.highcharts.com/list(version)/modules/canvas-tools.js","getTimezoneOffset":null,"timezoneOffset":0,"useUTC":true},"lang":{"contextButtonTitle":"Chart context menu","decimalPoint":".","downloadJPEG":"Download JPEG image","downloadPDF":"Download PDF document","downloadPNG":"Download PNG image","downloadSVG":"Download SVG vector image","drillUpText":"Back to {series.name}","invalidDate":null,"loading":"Loading...","months":["January","February","March","April","May","June","July","August","September","October","November","December"],"noData":"No data to display","numericSymbols":["k","M","G","T","P","E"],"printChart":"Print chart","resetZoom":"Reset zoom","resetZoomTitle":"Reset zoom level 1:1","shortMonths":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"thousandsSep":" ","weekdays":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]}},"type":"chart","fonts":["Open+Sans","Raleway"],"debug":false},"evals":["hc_opts.plotOptions.line.point.events.click","hc_opts.tooltip.formatter"],"jsHooks":[]}</script>
+<script type="application/htmlwidget-sizing" data-for="htmlwidget-c35f66576b27eaeac90f">{"viewer":{"width":"100%","height":350,"padding":0,"fill":true},"browser":{"width":"100%","height":500,"padding":0,"fill":true}}</script>
+</body>
+</html>
diff --git a/man/figures/Readme-Example-2.png b/man/figures/Readme-Example-2.png
new file mode 100644
index 0000000..3a9ed19
--- /dev/null
+++ b/man/figures/Readme-Example-2.png
Binary files differ
