text: /* Javascript plotting library for jQuery, version 0.8.1.
  
   Copyright (c) 2007-2013 IOLA and Ole Laursen.
   Licensed under the MIT license.
  
   */// first an inline dependency, jquery.colorhelpers.js, we inline it here
  // for convenience
  /* Plugin for jQuery for working with colors.
   *
   * Version 1.1.
   *
   * Inspiration from jQuery color animation plugin by John Resig.
   *
   * Released under the MIT license by Ole Laursen, October 2009.
   *
   * Examples:
   *
   *   $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
   *   var c = $.color.extract($("#mydiv"), 'background-color');
   *   console.log(c.r, c.g, c.b, c.a);
   *   $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
   *
   * Note that .scale() and .add() return the same modified object
   * instead of making a new one.
   *
   * V. 1.1: Fix error handling so e.g. parsing an empty string does
   * produce a color rather than just crashing.
   */
  (function (e) {
      e.color = {}, e.color.make = function (t, n, r, i) {
          var s = {};
          return s.r = t || 0, s.g = n || 0, s.b = r || 0, s.a = i != null ? i : 1, s.add = function (e, t) {
              for (var n = 0; n < e.length; ++n)s[e.charAt(n)] += t;
              return s.normalize()
          }, s.scale = function (e, t) {
              for (var n = 0; n < e.length; ++n)s[e.charAt(n)] *= t;
              return s.normalize()
          }, s.toString = function () {
              return s.a >= 1 ? "rgb(" + [s.r, s.g, s.b].join(",") + ")" : "rgba(" + [s.r, s.g, s.b, s.a].join(",") + ")"
          }, s.normalize = function () {
              function e(e, t, n) {
                  return t < e ? e : t > n ? n : t
              }
  
              return s.r = e(0, parseInt(s.r), 255), s.g = e(0, parseInt(s.g), 255), s.b = e(0, parseInt(s.b), 255), s.a = e(0, s.a, 1), s
          }, s.clone = function () {
              return e.color.make(s.r, s.b, s.g, s.a)
          }, s.normalize()
      }, e.color.extract = function (t, n) {
          var r;
          do {
              r = t.css(n).toLowerCase();
              if (r != "" && r != "transparent")break;
              t = t.parent()
          } while (!e.nodeName(t.get(0), "body"));
          return r == "rgba(0, 0, 0, 0)" && (r = "transparent"), e.color.parse(r)
      }, e.color.parse = function (n) {
          var r, i = e.color.make;
          if (r = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(n))return i(parseInt(r[1], 10), parseInt(r[2], 10), parseInt(r[3], 10));
          if (r = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseInt(r[1], 10), parseInt(r[2], 10), parseInt(r[3], 10), parseFloat(r[4]));
          if (r = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(n))return i(parseFloat(r[1]) * 2.55, parseFloat(r[2]) * 2.55, parseFloat(r[3]) * 2.55);
          if (r = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseFloat(r[1]) * 2.55, parseFloat(r[2]) * 2.55, parseFloat(r[3]) * 2.55, parseFloat(r[4]));
          if (r = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(n))return i(parseInt(r[1], 16), parseInt(r[2], 16), parseInt(r[3], 16));
          if (r = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(n))return i(parseInt(r[1] + r[1], 16), parseInt(r[2] + r[2], 16), parseInt(r[3] + r[3], 16));
          var s = e.trim(n).toLowerCase();
          return s == "transparent" ? i(255, 255, 255, 0) : (r = t[s] || [0, 0, 0], i(r[0], r[1], r[2]))
      };
      var t = {
          aqua: [0, 255, 255],
          azure: [240, 255, 255],
          beige: [245, 245, 220],
          black: [0, 0, 0],
          blue: [0, 0, 255],
          brown: [165, 42, 42],
          cyan: [0, 255, 255],
          darkblue: [0, 0, 139],
          darkcyan: [0, 139, 139],
          darkgrey: [169, 169, 169],
          darkgreen: [0, 100, 0],
          darkkhaki: [189, 183, 107],
          darkmagenta: [139, 0, 139],
          darkolivegreen: [85, 107, 47],
          darkorange: [255, 140, 0],
          darkorchid: [153, 50, 204],
          darkred: [139, 0, 0],
          darksalmon: [233, 150, 122],
          darkviolet: [148, 0, 211],
          fuchsia: [255, 0, 255],
          gold: [255, 215, 0],
          green: [0, 128, 0],
          indigo: [75, 0, 130],
          khaki: [240, 230, 140],
          lightblue: [173, 216, 230],
          lightcyan: [224, 255, 255],
          lightgreen: [144, 238, 144],
          lightgrey: [211, 211, 211],
          lightpink: [255, 182, 193],
          lightyellow: [255, 255, 224],
          lime: [0, 255, 0],
          magenta: [255, 0, 255],
          maroon: [128, 0, 0],
          navy: [0, 0, 128],
          olive: [128, 128, 0],
          orange: [255, 165, 0],
          pink: [255, 192, 203],
          purple: [128, 0, 128],
          violet: [128, 0, 128],
          red: [255, 0, 0],
          silver: [192, 192, 192],
          white: [255, 255, 255],
          yellow: [255, 255, 0]
      }
  })(jQuery), function (e) {
      function n(t, n) {
          var r = n.children("." + t)[0];
          if (r == null) {
              r = document.createElement("canvas"), r.className = t, e(r).css({
                  direction: "ltr",
                  position: "absolute",
                  left: 0,
                  top: 0
              }).appendTo(n);
              if (!r.getContext) {
                  if (!window.G_vmlCanvasManager)throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");
                  r = window.G_vmlCanvasManager.initElement(r)
              }
          }
          this.element = r;
          var i = this.context = r.getContext("2d"), s = window.devicePixelRatio || 1,
              o = i.webkitBackingStorePixelRatio || i.mozBackingStorePixelRatio || i.msBackingStorePixelRatio || i.oBackingStorePixelRatio || i.backingStorePixelRatio || 1;
          this.pixelRatio = s / o, this.resize(n.width(), n.height()), this.textContainer = null, this.text = {}, this._textCache = {}
      }
  
      function r(t, r, s, o) {
          function E(e, t) {
              t = [w].concat(t);
              for (var n = 0; n < e.length; ++n)e[n].apply(this, t)
          }
  
          function S() {
              var t = {Canvas: n};
              for (var r = 0; r < o.length; ++r) {
                  var i = o[r];
                  i.init(w, t), i.options && e.extend(!0, a, i.options)
              }
          }
  
          function x(n) {
              e.extend(!0, a, n), n && n.colors && (a.colors = n.colors), a.xaxis.color == null && (a.xaxis.color = e.color.parse(a.grid.color).scale("a", .22).toString()), a.yaxis.color == null && (a.yaxis.color = e.color.parse(a.grid.color).scale("a", .22).toString()), a.xaxis.tickColor == null && (a.xaxis.tickColor = a.grid.tickColor || a.xaxis.color), a.yaxis.tickColor == null && (a.yaxis.tickColor = a.grid.tickColor || a.yaxis.color), a.grid.borderColor == null && (a.grid.borderColor = a.grid.color), a.grid.tickColor == null && (a.grid.tickColor = e.color.parse(a.grid.color).scale("a", .22).toString());
              var r, i, s, o = {
                  style: t.css("font-style"),
                  size: Math.round(.8 * (+t.css("font-size").replace("px", "") || 13)),
                  variant: t.css("font-variant"),
                  weight: t.css("font-weight"),
                  family: t.css("font-family")
              };
              o.lineHeight = o.size * 1.15, s = a.xaxes.length || 1;
              for (r = 0; r < s; ++r)i = a.xaxes[r], i && !i.tickColor && (i.tickColor = i.color), i = e.extend(!0, {}, a.xaxis, i), a.xaxes[r] = i, i.font && (i.font = e.extend({}, o, i.font), i.font.color || (i.font.color = i.color));
              s = a.yaxes.length || 1;
              for (r = 0; r < s; ++r)i = a.yaxes[r], i && !i.tickColor && (i.tickColor = i.color), i = e.extend(!0, {}, a.yaxis, i), a.yaxes[r] = i, i.font && (i.font = e.extend({}, o, i.font), i.font.color || (i.font.color = i.color));
              a.xaxis.noTicks && a.xaxis.ticks == null && (a.xaxis.ticks = a.xaxis.noTicks), a.yaxis.noTicks && a.yaxis.ticks == null && (a.yaxis.ticks = a.yaxis.noTicks), a.x2axis && (a.xaxes[1] = e.extend(!0, {}, a.xaxis, a.x2axis), a.xaxes[1].position = "top"), a.y2axis && (a.yaxes[1] = e.extend(!0, {}, a.yaxis, a.y2axis), a.yaxes[1].position = "right"), a.grid.coloredAreas && (a.grid.markings = a.grid.coloredAreas), a.grid.coloredAreasColor && (a.grid.markingsColor = a.grid.coloredAreasColor), a.lines && e.extend(!0, a.series.lines, a.lines), a.points && e.extend(!0, a.series.points, a.points), a.bars && e.extend(!0, a.series.bars, a.bars), a.shadowSize != null && (a.series.shadowSize = a.shadowSize), a.highlightColor != null && (a.series.highlightColor = a.highlightColor);
              for (r = 0; r < a.xaxes.length; ++r)O(d, r + 1).options = a.xaxes[r];
              for (r = 0; r < a.yaxes.length; ++r)O(v, r + 1).options = a.yaxes[r];
              for (var u in b)a.hooks[u] && a.hooks[u].length && (b[u] = b[u].concat(a.hooks[u]));
              E(b.processOptions, [a])
          }
  
          function T(e) {
              u = N(e), M(), _()
          }
  
          function N(t) {
              var n = [];
              for (var r = 0; r < t.length; ++r) {
                  var i = e.extend(!0, {}, a.series);
                  t[r].data != null ? (i.data = t[r].data, delete t[r].data, e.extend(!0, i, t[r]), t[r].data = i.data) : i.data = t[r], n.push(i)
              }
              return n
          }
  
          function C(e, t) {
              var n = e[t + "axis"];
              return typeof n == "object" && (n = n.n), typeof n != "number" && (n = 1), n
          }
  
          function k() {
              return e.grep(d.concat(v), function (e) {
                  return e
              })
          }
  
          function L(e) {
              var t = {}, n, r;
              for (n = 0; n < d.length; ++n)r = d[n], r && r.used && (t["x" + r.n] = r.c2p(e.left));
              for (n = 0; n < v.length; ++n)r = v[n], r && r.used && (t["y" + r.n] = r.c2p(e.top));
              return t.x1 !== undefined && (t.x = t.x1), t.y1 !== undefined && (t.y = t.y1), t
          }
  
          function A(e) {
              var t = {}, n, r, i;
              for (n = 0; n < d.length; ++n) {
                  r = d[n];
                  if (r && r.used) {
                      i = "x" + r.n, e[i] == null && r.n == 1 && (i = "x");
                      if (e[i] != null) {
                          t.left = r.p2c(e[i]);
                          break
                      }
                  }
              }
              for (n = 0; n < v.length; ++n) {
                  r = v[n];
                  if (r && r.used) {
                      i = "y" + r.n, e[i] == null && r.n == 1 && (i = "y");
                      if (e[i] != null) {
                          t.top = r.p2c(e[i]);
                          break
                      }
                  }
              }
              return t
          }
  
          function O(t, n) {
              return t[n - 1] || (t[n - 1] = {
                  n: n,
                  direction: t == d ? "x" : "y",
                  options: e.extend(!0, {}, t == d ? a.xaxis : a.yaxis)
              }), t[n - 1]
          }
  
          function M() {
              var t = u.length, n = -1, r;
              for (r = 0; r < u.length; ++r) {
                  var i = u[r].color;
                  i != null && (t--, typeof i == "number" && i > n && (n = i))
              }
              t <= n && (t = n + 1);
              var s, o = [], f = a.colors, l = f.length, c = 0;
              for (r = 0; r < t; r++)s = e.color.parse(f[r % l] || "#666"), r % l == 0 && r && (c >= 0 ? c < .5 ? c = -c - .2 : c = 0 : c = -c), o[r] = s.scale("rgb", 1 + c);
              var h = 0, p;
              for (r = 0; r < u.length; ++r) {
                  p = u[r], p.color == null ? (p.color = o[h].toString(), ++h) : typeof p.color == "number" && (p.color = o[p.color].toString());
                  if (p.lines.show == null) {
                      var m, g = !0;
                      for (m in p)if (p[m] && p[m].show) {
                          g = !1;
                          break
                      }
                      g && (p.lines.show = !0)
                  }
                  p.lines.zero == null && (p.lines.zero = !!p.lines.fill), p.xaxis = O(d, C(p, "x")), p.yaxis = O(v, C(p, "y"))
              }
          }
  
          function _() {
              function x(e, t, n) {
                  t < e.datamin && t != -r && (e.datamin = t), n > e.datamax && n != r && (e.datamax = n)
              }
  
              var t = Number.POSITIVE_INFINITY, n = Number.NEGATIVE_INFINITY, r = Number.MAX_VALUE, i, s, o, a, f, l, c,
                  h, p, d, v, m, g, y, w, S;
              e.each(k(), function (e, r) {
                  r.datamin = t, r.datamax = n, r.used = !1
              });
              for (i = 0; i < u.length; ++i)l = u[i], l.datapoints = {points: []}, E(b.processRawData, [l, l.data, l.datapoints]);
              for (i = 0; i < u.length; ++i) {
                  l = u[i], w = l.data, S = l.datapoints.format;
                  if (!S) {
                      S = [], S.push({x: !0, number: !0, required: !0}), S.push({y: !0, number: !0, required: !0});
                      if (l.bars.show || l.lines.show && l.lines.fill) {
                          var T = !!(l.bars.show && l.bars.zero || l.lines.show && l.lines.zero);
                          S.push({
                              y: !0,
                              number: !0,
                              required: !1,
                              defaultValue: 0,
                              autoscale: T
                          }), l.bars.horizontal && (delete S[S.length - 1].y, S[S.length - 1].x = !0)
                      }
                      l.datapoints.format = S
                  }
                  if (l.datapoints.pointsize != null)continue;
                  l.datapoints.pointsize = S.length, h = l.datapoints.pointsize, c = l.datapoints.points;
                  var N = l.lines.show && l.lines.steps;
                  l.xaxis.used = l.yaxis.used = !0;
                  for (s = o = 0; s < w.length; ++s, o += h) {
                      y = w[s];
                      var C = y == null;
                      if (!C)for (a = 0; a < h; ++a)m = y[a], g = S[a], g && (g.number && m != null && (m = +m, isNaN(m) ? m = null : m == Infinity ? m = r : m == -Infinity && (m = -r)), m == null && (g.required && (C = !0), g.defaultValue != null && (m = g.defaultValue))), c[o + a] = m;
                      if (C)for (a = 0; a < h; ++a)m = c[o + a], m != null && (g = S[a], g.autoscale && (g.x && x(l.xaxis, m, m), g.y && x(l.yaxis, m, m))), c[o + a] = null; else if (N && o > 0 && c[o - h] != null && c[o - h] != c[o] && c[o - h + 1] != c[o + 1]) {
                          for (a = 0; a < h; ++a)c[o + h + a] = c[o + a];
                          c[o + 1] = c[o - h + 1], o += h
                      }
                  }
              }
              for (i = 0; i < u.length; ++i)l = u[i], E(b.processDatapoints, [l, l.datapoints]);
              for (i = 0; i < u.length; ++i) {
                  l = u[i], c = l.datapoints.points, h = l.datapoints.pointsize, S = l.datapoints.format;
                  var L = t, A = t, O = n, M = n;
                  for (s = 0; s < c.length; s += h) {
                      if (c[s] == null)continue;
                      for (a = 0; a < h; ++a) {
                          m = c[s + a], g = S[a];
                          if (!g || g.autoscale === !1 || m == r || m == -r)continue;
                          g.x && (m < L && (L = m), m > O && (O = m)), g.y && (m < A && (A = m), m > M && (M = m))
                      }
                  }
                  if (l.bars.show) {
                      var _;
                      switch (l.bars.align) {
                          case"left":
                              _ = 0;
                              break;
                          case"right":
                              _ = -l.bars.barWidth;
                              break;
                          case"center":
                              _ = -l.bars.barWidth / 2;
                              break;
                          default:
                              throw new Error("Invalid bar alignment: " + l.bars.align)
                      }
                      l.bars.horizontal ? (A += _, M += _ + l.bars.barWidth) : (L += _, O += _ + l.bars.barWidth)
                  }
                  x(l.xaxis, L, O), x(l.yaxis, A, M)
              }
              e.each(k(), function (e, r) {
                  r.datamin == t && (r.datamin = null), r.datamax == n && (r.datamax = null)
              })
          }
  
          function D() {
              t.css("padding", 0).children(":not(.flot-base,.flot-overlay)").remove(), t.css("position") == "static" && t.css("position", "relative"), f = new n("flot-base", t), l = new n("flot-overlay", t), h = f.context, p = l.context, c = e(l.element).unbind();
              var r = t.data("plot");
              r && (r.shutdown(), l.clear()), t.data("plot", w)
          }
  
          function P() {
              a.grid.hoverable && (c.mousemove(at), c.bind("mouseleave", ft)), a.grid.clickable && c.click(lt), E(b.bindEvents, [c])
          }
  
          function H() {
              ot && clearTimeout(ot), c.unbind("mousemove", at), c.unbind("mouseleave", ft), c.unbind("click", lt), E(b.shutdown, [c])
          }
  
          function B(e) {
              function t(e) {
                  return e
              }
  
              var n, r, i = e.options.transform || t, s = e.options.inverseTransform;
              e.direction == "x" ? (n = e.scale = g / Math.abs(i(e.max) - i(e.min)), r = Math.min(i(e.max), i(e.min))) : (n = e.scale = y / Math.abs(i(e.max) - i(e.min)), n = -n, r = Math.max(i(e.max), i(e.min))), i == t ? e.p2c = function (e) {
                  return (e - r) * n
              } : e.p2c = function (e) {
                  return (i(e) - r) * n
              }, s ? e.c2p = function (e) {
                  return s(r + e / n)
              } : e.c2p = function (e) {
                  return r + e / n
              }
          }
  
          function j(e) {
              var t = e.options, n = e.ticks || [], r = t.labelWidth || 0, i = t.labelHeight || 0,
                  s = r || e.direction == "x" ? Math.floor(f.width / (n.length || 1)) : null;
              legacyStyles = e.direction + "Axis " + e.direction + e.n + "Axis", layer = "flot-" + e.direction + "-axis flot-" + e.direction + e.n + "-axis " + legacyStyles, font = t.font || "flot-tick-label tickLabel";
              for (var o = 0; o < n.length; ++o) {
                  var u = n[o];
                  if (!u.label)continue;
                  var a = f.getTextInfo(layer, u.label, font, null, s);
                  r = Math.max(r, a.width), i = Math.max(i, a.height)
              }
              e.labelWidth = t.labelWidth || r, e.labelHeight = t.labelHeight || i
          }
  
          function F(t) {
              var n = t.labelWidth, r = t.labelHeight, i = t.options.position, s = t.options.tickLength,
                  o = a.grid.axisMargin, u = a.grid.labelMargin, l = t.direction == "x" ? d : v, c, h,
                  p = e.grep(l, function (e) {
                      return e && e.options.position == i && e.reserveSpace
                  });
              e.inArray(t, p) == p.length - 1 && (o = 0);
              if (s == null) {
                  var g = e.grep(l, function (e) {
                      return e && e.reserveSpace
                  });
                  h = e.inArray(t, g) == 0, h ? s = "full" : s = 5
              }
              isNaN(+s) || (u += +s), t.direction == "x" ? (r += u, i == "bottom" ? (m.bottom += r + o, t.box = {
                  top: f.height - m.bottom,
                  height: r
              }) : (t.box = {
                  top: m.top + o,
                  height: r
              }, m.top += r + o)) : (n += u, i == "left" ? (t.box = {
                  left: m.left + o,
                  width: n
              }, m.left += n + o) : (m.right += n + o, t.box = {
                  left: f.width - m.right,
                  width: n
              })), t.position = i, t.tickLength = s, t.box.padding = u, t.innermost = h
          }
  
          function I(e) {
              e.direction == "x" ? (e.box.left = m.left - e.labelWidth / 2, e.box.width = f.width - m.left - m.right + e.labelWidth) : (e.box.top = m.top - e.labelHeight / 2, e.box.height = f.height - m.bottom - m.top + e.labelHeight)
          }
  
          function q() {
              var t = a.grid.minBorderMargin, n = {x: 0, y: 0}, r, i;
              if (t == null) {
                  t = 0;
                  for (r = 0; r < u.length; ++r)t = Math.max(t, 2 * (u[r].points.radius + u[r].points.lineWidth / 2))
              }
              n.x = n.y = Math.ceil(t), e.each(k(), function (e, t) {
                  var r = t.direction;
                  t.reserveSpace && (n[r] = Math.ceil(Math.max(n[r], (r == "x" ? t.labelWidth : t.labelHeight) / 2)))
              }), m.left = Math.max(n.x, m.left), m.right = Math.max(n.x, m.right), m.top = Math.max(n.y, m.top), m.bottom = Math.max(n.y, m.bottom)
          }
  
          function R() {
              var t, n = k(), r = a.grid.show;
              for (var i in m) {
                  var s = a.grid.margin || 0;
                  m[i] = typeof s == "number" ? s : s[i] || 0
              }
              E(b.processOffset, [m]);
              for (var i in m)typeof a.grid.borderWidth == "object" ? m[i] += r ? a.grid.borderWidth[i] : 0 : m[i] += r ? a.grid.borderWidth : 0;
              e.each(n, function (e, t) {
                  t.show = t.options.show, t.show == null && (t.show = t.used), t.reserveSpace = t.show || t.options.reserveSpace, U(t)
              });
              if (r) {
                  var o = e.grep(n, function (e) {
                      return e.reserveSpace
                  });
                  e.each(o, function (e, t) {
                      z(t), W(t), X(t, t.ticks), j(t)
                  });
                  for (t = o.length - 1; t >= 0; --t)F(o[t]);
                  q(), e.each(o, function (e, t) {
                      I(t)
                  })
              }
              g = f.width - m.left - m.right, y = f.height - m.bottom - m.top, e.each(n, function (e, t) {
                  B(t)
              }), r && G(), it()
          }
  
          function U(e) {
              var t = e.options, n = +(t.min != null ? t.min : e.datamin), r = +(t.max != null ? t.max : e.datamax),
                  i = r - n;
              if (i == 0) {
                  var s = r == 0 ? 1 : .01;
                  t.min == null && (n -= s);
                  if (t.max == null || t.min != null) r += s
              } else {
                  var o = t.autoscaleMargin;
                  o != null && (t.min == null && (n -= i * o, n < 0 && e.datamin != null && e.datamin >= 0 && (n = 0)), t.max == null && (r += i * o, r > 0 && e.datamax != null && e.datamax <= 0 && (r = 0)))
              }
              e.min = n, e.max = r
          }
  
          function z(t) {
              var n = t.options, r;
              typeof n.ticks == "number" && n.ticks > 0 ? r = n.ticks : r = .3 * Math.sqrt(t.direction == "x" ? f.width : f.height);
              var s = (t.max - t.min) / r, o = -Math.floor(Math.log(s) / Math.LN10), u = n.tickDecimals;
              u != null && o > u && (o = u);
              var a = Math.pow(10, -o), l = s / a, c;
              l < 1.5 ? c = 1 : l < 3 ? (c = 2, l > 2.25 && (u == null || o + 1 <= u) && (c = 2.5, ++o)) : l < 7.5 ? c = 5 : c = 10, c *= a, n.minTickSize != null && c < n.minTickSize && (c = n.minTickSize), t.delta = s, t.tickDecimals = Math.max(0, u != null ? u : o), t.tickSize = n.tickSize || c;
              if (n.mode == "time" && !t.tickGenerator)throw new Error("Time mode requires the flot.time plugin.");
              t.tickGenerator || (t.tickGenerator = function (e) {
                  var t = [], n = i(e.min, e.tickSize), r = 0, s = Number.NaN, o;
                  do o = s, s = n + r * e.tickSize, t.push(s), ++r; while (s < e.max && s != o);
                  return t
              }, t.tickFormatter = function (e, t) {
                  var n = t.tickDecimals ? Math.pow(10, t.tickDecimals) : 1, r = "" + Math.round(e * n) / n;
                  if (t.tickDecimals != null) {
                      var i = r.indexOf("."), s = i == -1 ? 0 : r.length - i - 1;
                      if (s < t.tickDecimals)return (s ? r : r + ".") + ("" + n).substr(1, t.tickDecimals - s)
                  }
                  return r
              }), e.isFunction(n.tickFormatter) && (t.tickFormatter = function (e, t) {
                  return "" + n.tickFormatter(e, t)
              });
              if (n.alignTicksWithAxis != null) {
                  var h = (t.direction == "x" ? d : v)[n.alignTicksWithAxis - 1];
                  if (h && h.used && h != t) {
                      var p = t.tickGenerator(t);
                      p.length > 0 && (n.min == null && (t.min = Math.min(t.min, p[0])), n.max == null && p.length > 1 && (t.max = Math.max(t.max, p[p.length - 1]))), t.tickGenerator = function (e) {
                          var t = [], n, r;
                          for (r = 0; r < h.ticks.length; ++r)n = (h.ticks[r].v - h.min) / (h.max - h.min), n = e.min + n * (e.max - e.min), t.push(n);
                          return t
                      };
                      if (!t.mode && n.tickDecimals == null) {
                          var m = Math.max(0, -Math.floor(Math.log(t.delta) / Math.LN10) + 1), g = t.tickGenerator(t);
                          g.length > 1 && /\..*0$/.test((g[1] - g[0]).toFixed(m)) || (t.tickDecimals = m)
                      }
                  }
              }
          }
  
          function W(t) {
              var n = t.options.ticks, r = [];
              n == null || typeof n == "number" && n > 0 ? r = t.tickGenerator(t) : n && (e.isFunction(n) ? r = n(t) : r = n);
              var i, s;
              t.ticks = [];
              for (i = 0; i < r.length; ++i) {
                  var o = null, u = r[i];
                  typeof u == "object" ? (s = +u[0], u.length > 1 && (o = u[1])) : s = +u, o == null && (o = t.tickFormatter(s, t)), isNaN(s) || t.ticks.push({
                      v: s,
                      label: o
                  })
              }
          }
  
          function X(e, t) {
              e.options.autoscaleMargin && t.length > 0 && (e.options.min == null && (e.min = Math.min(e.min, t[0].v)), e.options.max == null && t.length > 1 && (e.max = Math.max(e.max, t[t.length - 1].v)))
          }
  
          function V() {
              f.clear(), E(b.drawBackground, [h]);
              var e = a.grid;
              e.show && e.backgroundColor && K(), e.show && !e.aboveData && Q();
              for (var t = 0; t < u.length; ++t)E(b.drawSeries, [h, u[t]]), Y(u[t]);
              E(b.draw, [h]), e.show && e.aboveData && Q(), f.render(), ht()
          }
  
          function J(e, t) {
              var n, r, i, s, o = k();
              for (var u = 0; u < o.length; ++u) {
                  n = o[u];
                  if (n.direction == t) {
                      s = t + n.n + "axis", !e[s] && n.n == 1 && (s = t + "axis");
                      if (e[s]) {
                          r = e[s].from, i = e[s].to;
                          break
                      }
                  }
              }
              e[s] || (n = t == "x" ? d[0] : v[0], r = e[t + "1"], i = e[t + "2"]);
              if (r != null && i != null && r > i) {
                  var a = r;
                  r = i, i = a
              }
              return {from: r, to: i, axis: n}
          }
  
          function K() {
              h.save(), h.translate(m.left, m.top), h.fillStyle = bt(a.grid.backgroundColor, y, 0, "rgba(255, 255, 255, 0)"), h.fillRect(0, 0, g, y), h.restore()
          }
  
          function Q() {
              var t, n, r, i;
              h.save(), h.translate(m.left, m.top);
              var s = a.grid.markings;
              if (s) {
                  e.isFunction(s) && (n = w.getAxes(), n.xmin = n.xaxis.min, n.xmax = n.xaxis.max, n.ymin = n.yaxis.min, n.ymax = n.yaxis.max, s = s(n));
                  for (t = 0; t < s.length; ++t) {
                      var o = s[t], u = J(o, "x"), f = J(o, "y");
                      u.from == null && (u.from = u.axis.min), u.to == null && (u.to = u.axis.max), f.from == null && (f.from = f.axis.min), f.to == null && (f.to = f.axis.max);
                      if (u.to < u.axis.min || u.from > u.axis.max || f.to < f.axis.min || f.from > f.axis.max)continue;
                      u.from = Math.max(u.from, u.axis.min), u.to = Math.min(u.to, u.axis.max), f.from = Math.max(f.from, f.axis.min), f.to = Math.min(f.to, f.axis.max);
                      if (u.from == u.to && f.from == f.to)continue;
                      u.from = u.axis.p2c(u.from), u.to = u.axis.p2c(u.to), f.from = f.axis.p2c(f.from), f.to = f.axis.p2c(f.to), u.from == u.to || f.from == f.to ? (h.beginPath(), h.strokeStyle = o.color || a.grid.markingsColor, h.lineWidth = o.lineWidth || a.grid.markingsLineWidth, h.moveTo(u.from, f.from), h.lineTo(u.to, f.to), h.stroke()) : (h.fillStyle = o.color || a.grid.markingsColor, h.fillRect(u.from, f.to, u.to - u.from, f.from - f.to))
                  }
              }
              n = k(), r = a.grid.borderWidth;
              for (var l = 0; l < n.length; ++l) {
                  var c = n[l], p = c.box, d = c.tickLength, v, b, E, S;
                  if (!c.show || c.ticks.length == 0)continue;
                  h.lineWidth = 1, c.direction == "x" ? (v = 0, d == "full" ? b = c.position == "top" ? 0 : y : b = p.top - m.top + (c.position == "top" ? p.height : 0)) : (b = 0, d == "full" ? v = c.position == "left" ? 0 : g : v = p.left - m.left + (c.position == "left" ? p.width : 0)), c.innermost || (h.strokeStyle = c.options.color, h.beginPath(), E = S = 0, c.direction == "x" ? E = g + 1 : S = y + 1, h.lineWidth == 1 && (c.direction == "x" ? b = Math.floor(b) + .5 : v = Math.floor(v) + .5), h.moveTo(v, b), h.lineTo(v + E, b + S), h.stroke()), h.strokeStyle = c.options.tickColor, h.beginPath();
                  for (t = 0; t < c.ticks.length; ++t) {
                      var x = c.ticks[t].v;
                      E = S = 0;
                      if (isNaN(x) || x < c.min || x > c.max || d == "full" && (typeof r == "object" && r[c.position] > 0 || r > 0) && (x == c.min || x == c.max))continue;
                      c.direction == "x" ? (v = c.p2c(x), S = d == "full" ? -y : d, c.position == "top" && (S = -S)) : (b = c.p2c(x), E = d == "full" ? -g : d, c.position == "left" && (E = -E)), h.lineWidth == 1 && (c.direction == "x" ? v = Math.floor(v) + .5 : b = Math.floor(b) + .5), h.moveTo(v, b), h.lineTo(v + E, b + S)
                  }
                  h.stroke()
              }
              r && (i = a.grid.borderColor, typeof r == "object" || typeof i == "object" ? (typeof r != "object" && (r = {
                  top: r,
                  right: r,
                  bottom: r,
                  left: r
              }), typeof i != "object" && (i = {
                  top: i,
                  right: i,
                  bottom: i,
                  left: i
              }), r.top > 0 && (h.strokeStyle = i.top, h.lineWidth = r.top, h.beginPath(), h.moveTo(0 - r.left, 0 - r.top / 2), h.lineTo(g, 0 - r.top / 2), h.stroke()), r.right > 0 && (h.strokeStyle = i.right, h.lineWidth = r.right, h.beginPath(), h.moveTo(g + r.right / 2, 0 - r.top), h.lineTo(g + r.right / 2, y), h.stroke()), r.bottom > 0 && (h.strokeStyle = i.bottom, h.lineWidth = r.bottom, h.beginPath(), h.moveTo(g + r.right, y + r.bottom / 2), h.lineTo(0, y + r.bottom / 2), h.stroke()), r.left > 0 && (h.strokeStyle = i.left, h.lineWidth = r.left, h.beginPath(), h.moveTo(0 - r.left / 2, y + r.bottom), h.lineTo(0 - r.left / 2, 0), h.stroke())) : (h.lineWidth = r, h.strokeStyle = a.grid.borderColor, h.strokeRect(-r / 2, -r / 2, g + r, y + r))), h.restore()
          }
  
          function G() {
              e.each(k(), function (e, t) {
                  if (!t.show || t.ticks.length == 0)return;
                  var n = t.box, r = t.direction + "Axis " + t.direction + t.n + "Axis",
                      i = "flot-" + t.direction + "-axis flot-" + t.direction + t.n + "-axis " + r,
                      s = t.options.font || "flot-tick-label tickLabel", o, u, a, l, c;
                  f.removeText(i);
                  for (var h = 0; h < t.ticks.length; ++h) {
                      o = t.ticks[h];
                      if (!o.label || o.v < t.min || o.v > t.max)continue;
                      t.direction == "x" ? (l = "center", u = m.left + t.p2c(o.v), t.position == "bottom" ? a = n.top + n.padding : (a = n.top + n.height - n.padding, c = "bottom")) : (c = "middle", a = m.top + t.p2c(o.v), t.position == "left" ? (u = n.left + n.width - n.padding, l = "right") : u = n.left + n.padding), f.addText(i, u, a, o.label, s, null, null, l, c)
                  }
              })
          }
  
          function Y(e) {
              e.lines.show && Z(e), e.bars.show && nt(e), e.points.show && et(e)
          }
  
          function Z(e) {
              function t(e, t, n, r, i) {
                  var s = e.points, o = e.pointsize, u = null, a = null;
                  h.beginPath();
                  for (var f = o; f < s.length; f += o) {
                      var l = s[f - o], c = s[f - o + 1], p = s[f], d = s[f + 1];
                      if (l == null || p == null)continue;
                      if (c <= d && c < i.min) {
                          if (d < i.min)continue;
                          l = (i.min - c) / (d - c) * (p - l) + l, c = i.min
                      } else if (d <= c && d < i.min) {
                          if (c < i.min)continue;
                          p = (i.min - c) / (d - c) * (p - l) + l, d = i.min
                      }
                      if (c >= d && c > i.max) {
                          if (d > i.max)continue;
                          l = (i.max - c) / (d - c) * (p - l) + l, c = i.max
                      } else if (d >= c && d > i.max) {
                          if (c > i.max)continue;
                          p = (i.max - c) / (d - c) * (p - l) + l, d = i.max
                      }
                      if (l <= p && l < r.min) {
                          if (p < r.min)continue;
                          c = (r.min - l) / (p - l) * (d - c) + c, l = r.min
                      } else if (p <= l && p < r.min) {
                          if (l < r.min)continue;
                          d = (r.min - l) / (p - l) * (d - c) + c, p = r.min
                      }
                      if (l >= p && l > r.max) {
                          if (p > r.max)continue;
                          c = (r.max - l) / (p - l) * (d - c) + c, l = r.max
                      } else if (p >= l && p > r.max) {
                          if (l > r.max)continue;
                          d = (r.max - l) / (p - l) * (d - c) + c, p = r.max
                      }
                      (l != u || c != a) && h.moveTo(r.p2c(l) + t, i.p2c(c) + n), u = p, a = d, h.lineTo(r.p2c(p) + t, i.p2c(d) + n)
                  }
                  h.stroke()
              }
  
              function n(e, t, n) {
                  var r = e.points, i = e.pointsize, s = Math.min(Math.max(0, n.min), n.max), o = 0, u, a = !1, f = 1,
                      l = 0, c = 0;
                  for (; ;) {
                      if (i > 0 && o > r.length + i)break;
                      o += i;
                      var p = r[o - i], d = r[o - i + f], v = r[o], m = r[o + f];
                      if (a) {
                          if (i > 0 && p != null && v == null) {
                              c = o, i = -i, f = 2;
                              continue
                          }
                          if (i < 0 && o == l + i) {
                              h.fill(), a = !1, i = -i, f = 1, o = l = c + i;
                              continue
                          }
                      }
                      if (p == null || v == null)continue;
                      if (p <= v && p < t.min) {
                          if (v < t.min)continue;
                          d = (t.min - p) / (v - p) * (m - d) + d, p = t.min
                      } else if (v <= p && v < t.min) {
                          if (p < t.min)continue;
                          m = (t.min - p) / (v - p) * (m - d) + d, v = t.min
                      }
                      if (p >= v && p > t.max) {
                          if (v > t.max)continue;
                          d = (t.max - p) / (v - p) * (m - d) + d, p = t.max
                      } else if (v >= p && v > t.max) {
                          if (p > t.max)continue;
                          m = (t.max - p) / (v - p) * (m - d) + d, v = t.max
                      }
                      a || (h.beginPath(), h.moveTo(t.p2c(p), n.p2c(s)), a = !0);
                      if (d >= n.max && m >= n.max) {
                          h.lineTo(t.p2c(p), n.p2c(n.max)), h.lineTo(t.p2c(v), n.p2c(n.max));
                          continue
                      }
                      if (d <= n.min && m <= n.min) {
                          h.lineTo(t.p2c(p), n.p2c(n.min)), h.lineTo(t.p2c(v), n.p2c(n.min));
                          continue
                      }
                      var g = p, y = v;
                      d <= m && d < n.min && m >= n.min ? (p = (n.min - d) / (m - d) * (v - p) + p, d = n.min) : m <= d && m < n.min && d >= n.min && (v = (n.min - d) / (m - d) * (v - p) + p, m = n.min), d >= m && d > n.max && m <= n.max ? (p = (n.max - d) / (m - d) * (v - p) + p, d = n.max) : m >= d && m > n.max && d <= n.max && (v = (n.max - d) / (m - d) * (v - p) + p, m = n.max), p != g && h.lineTo(t.p2c(g), n.p2c(d)), h.lineTo(t.p2c(p), n.p2c(d)), h.lineTo(t.p2c(v), n.p2c(m)), v != y && (h.lineTo(t.p2c(v), n.p2c(m)), h.lineTo(t.p2c(y), n.p2c(m)))
                  }
              }
  
              h.save(), h.translate(m.left, m.top), h.lineJoin = "round";
              var r = e.lines.lineWidth, i = e.shadowSize;
              if (r > 0 && i > 0) {
                  h.lineWidth = i, h.strokeStyle = "rgba(0,0,0,0.1)";
                  var s = Math.PI / 18;
                  t(e.datapoints, Math.sin(s) * (r / 2 + i / 2), Math.cos(s) * (r / 2 + i / 2), e.xaxis, e.yaxis), h.lineWidth = i / 2, t(e.datapoints, Math.sin(s) * (r / 2 + i / 4), Math.cos(s) * (r / 2 + i / 4), e.xaxis, e.yaxis)
              }
              h.lineWidth = r, h.strokeStyle = e.color;
              var o = rt(e.lines, e.color, 0, y);
              o && (h.fillStyle = o, n(e.datapoints, e.xaxis, e.yaxis)), r > 0 && t(e.datapoints, 0, 0, e.xaxis, e.yaxis), h.restore()
          }
  
          function et(e) {
              function t(e, t, n, r, i, s, o, u) {
                  var a = e.points, f = e.pointsize;
                  for (var l = 0; l < a.length; l += f) {
                      var c = a[l], p = a[l + 1];
                      if (c == null || c < s.min || c > s.max || p < o.min || p > o.max)continue;
                      h.beginPath(), c = s.p2c(c), p = o.p2c(p) + r, u == "circle" ? h.arc(c, p, t, 0, i ? Math.PI : Math.PI * 2, !1) : u(h, c, p, t, i), h.closePath(), n && (h.fillStyle = n, h.fill()), h.stroke()
                  }
              }
  
              h.save(), h.translate(m.left, m.top);
              var n = e.points.lineWidth, r = e.shadowSize, i = e.points.radius, s = e.points.symbol;
              n == 0 && (n = 1e-4);
              if (n > 0 && r > 0) {
                  var o = r / 2;
                  h.lineWidth = o, h.strokeStyle = "rgba(0,0,0,0.1)", t(e.datapoints, i, null, o + o / 2, !0, e.xaxis, e.yaxis, s), h.strokeStyle = "rgba(0,0,0,0.2)", t(e.datapoints, i, null, o / 2, !0, e.xaxis, e.yaxis, s)
              }
              h.lineWidth = n, h.strokeStyle = e.color, t(e.datapoints, i, rt(e.points, e.color), 0, !1, e.xaxis, e.yaxis, s), h.restore()
          }
  
          function tt(e, t, n, r, i, s, o, u, a, f, l, c) {
              var h, p, d, v, m, g, y, b, w;
              l ? (b = g = y = !0, m = !1, h = n, p = e, v = t + r, d = t + i, p < h && (w = p, p = h, h = w, m = !0, g = !1)) : (m = g = y = !0, b = !1, h = e + r, p = e + i, d = n, v = t, v < d && (w = v, v = d, d = w, b = !0, y = !1));
              if (p < u.min || h > u.max || v < a.min || d > a.max)return;
              h < u.min && (h = u.min, m = !1), p > u.max && (p = u.max, g = !1), d < a.min && (d = a.min, b = !1), v > a.max && (v = a.max, y = !1), h = u.p2c(h), d = a.p2c(d), p = u.p2c(p), v = a.p2c(v), o && (f.beginPath(), f.moveTo(h, d), f.lineTo(h, v), f.lineTo(p, v), f.lineTo(p, d), f.fillStyle = o(d, v), f.fill()), c > 0 && (m || g || y || b) && (f.beginPath(), f.moveTo(h, d + s), m ? f.lineTo(h, v + s) : f.moveTo(h, v + s), y ? f.lineTo(p, v + s) : f.moveTo(p, v + s), g ? f.lineTo(p, d + s) : f.moveTo(p, d + s), b ? f.lineTo(h, d + s) : f.moveTo(h, d + s), f.stroke())
          }
  
          function nt(e) {
              function t(t, n, r, i, s, o, u) {
                  var a = t.points, f = t.pointsize;
                  for (var l = 0; l < a.length; l += f) {
                      if (a[l] == null)continue;
                      tt(a[l], a[l + 1], a[l + 2], n, r, i, s, o, u, h, e.bars.horizontal, e.bars.lineWidth)
                  }
              }
  
              h.save(), h.translate(m.left, m.top), h.lineWidth = e.bars.lineWidth, h.strokeStyle = e.color;
              var n;
              switch (e.bars.align) {
                  case"left":
                      n = 0;
                      break;
                  case"right":
                      n = -e.bars.barWidth;
                      break;
                  case"center":
                      n = -e.bars.barWidth / 2;
                      break;
                  default:
                      throw new Error("Invalid bar alignment: " + e.bars.align)
              }
              var r = e.bars.fill ? function (t, n) {
                  return rt(e.bars, e.color, t, n)
              } : null;
              t(e.datapoints, n, n + e.bars.barWidth, 0, r, e.xaxis, e.yaxis), h.restore()
          }
  
          function rt(t, n, r, i) {
              var s = t.fill;
              if (!s)return null;
              if (t.fillColor)return bt(t.fillColor, r, i, n);
              var o = e.color.parse(n);
              return o.a = typeof s == "number" ? s : .4, o.normalize(), o.toString()
          }
  
          function it() {
              t.find(".legend").remove();
              if (!a.legend.show)return;
              var n = [], r = [], i = !1, s = a.legend.labelFormatter, o, f;
              for (var l = 0; l < u.length; ++l)o = u[l], o.label && (f = s ? s(o.label, o) : o.label, f && r.push({
                  label: f,
                  color: o.color
              }));
              if (a.legend.sorted)if (e.isFunction(a.legend.sorted)) r.sort(a.legend.sorted); else if (a.legend.sorted == "reverse") r.reverse(); else {
                  var c = a.legend.sorted != "descending";
                  r.sort(function (e, t) {
                      return e.label == t.label ? 0 : e.label < t.label != c ? 1 : -1
                  })
              }
              for (var l = 0; l < r.length; ++l) {
                  var h = r[l];
                  l % a.legend.noColumns == 0 && (i && n.push("</tr>"), n.push("<tr>"), i = !0), n.push('<td class="legendColorBox"><div style="border:1px solid ' + a.legend.labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + h.color + ';overflow:hidden"></div></div></td>' + '<td class="legendLabel">' + h.label + "</td>")
              }
              i && n.push("</tr>");
              if (n.length == 0)return;
              var p = '<table style="font-size:smaller;color:' + a.grid.color + '">' + n.join("") + "</table>";
              if (a.legend.container != null) e(a.legend.container).html(p); else {
                  var d = "", v = a.legend.position, g = a.legend.margin;
                  g[0] == null && (g = [g, g]), v.charAt(0) == "n" ? d += "top:" + (g[1] + m.top) + "px;" : v.charAt(0) == "s" && (d += "bottom:" + (g[1] + m.bottom) + "px;"), v.charAt(1) == "e" ? d += "right:" + (g[0] + m.right) + "px;" : v.charAt(1) == "w" && (d += "left:" + (g[0] + m.left) + "px;");
                  var y = e('<div class="legend">' + p.replace('style="', 'style="position:absolute;' + d + ";") + "</div>").appendTo(t);
                  if (a.legend.backgroundOpacity != 0) {
                      var b = a.legend.backgroundColor;
                      b == null && (b = a.grid.backgroundColor, b && typeof b == "string" ? b = e.color.parse(b) : b = e.color.extract(y, "background-color"), b.a = 1, b = b.toString());
                      var w = y.children();
                      e('<div style="position:absolute;width:' + w.width() + "px;height:" + w.height() + "px;" + d + "background-color:" + b + ';"> </div>').prependTo(y).css("opacity", a.legend.backgroundOpacity)
                  }
              }
          }
  
          function ut(e, t, n) {
              var r = a.grid.mouseActiveRadius, i = r * r + 1, s = null, o = !1, f, l, c;
              for (f = u.length - 1; f >= 0; --f) {
                  if (!n(u[f]))continue;
                  var h = u[f], p = h.xaxis, d = h.yaxis, v = h.datapoints.points, m = p.c2p(e), g = d.c2p(t),
                      y = r / p.scale, b = r / d.scale;
                  c = h.datapoints.pointsize, p.options.inverseTransform && (y = Number.MAX_VALUE), d.options.inverseTransform && (b = Number.MAX_VALUE);
                  if (h.lines.show || h.points.show)for (l = 0; l < v.length; l += c) {
                      var w = v[l], E = v[l + 1];
                      if (w == null)continue;
                      if (w - m > y || w - m < -y || E - g > b || E - g < -b)continue;
                      var S = Math.abs(p.p2c(w) - e), x = Math.abs(d.p2c(E) - t), T = S * S + x * x;
                      T < i && (i = T, s = [f, l / c])
                  }
                  if (h.bars.show && !s) {
                      var N = h.bars.align == "left" ? 0 : -h.bars.barWidth / 2, C = N + h.bars.barWidth;
                      for (l = 0; l < v.length; l += c) {
                          var w = v[l], E = v[l + 1], k = v[l + 2];
                          if (w == null)continue;
                          if (u[f].bars.horizontal ? m <= Math.max(k, w) && m >= Math.min(k, w) && g >= E + N && g <= E + C : m >= w + N && m <= w + C && g >= Math.min(k, E) && g <= Math.max(k, E)) s = [f, l / c]
                      }
                  }
              }
              return s ? (f = s[0], l = s[1], c = u[f].datapoints.pointsize, {
                  datapoint: u[f].datapoints.points.slice(l * c, (l + 1) * c),
                  dataIndex: l,
                  series: u[f],
                  seriesIndex: f
              }) : null
          }
  
          function at(e) {
              a.grid.hoverable && ct("plothover", e, function (e) {
                  return e["hoverable"] != 0
              })
          }
  
          function ft(e) {
              a.grid.hoverable && ct("plothover", e, function (e) {
                  return !1
              })
          }
  
          function lt(e) {
              ct("plotclick", e, function (e) {
                  return e["clickable"] != 0
              })
          }
  
          function ct(e, n, r) {
              var i = c.offset(), s = n.pageX - i.left - m.left, o = n.pageY - i.top - m.top, u = L({left: s, top: o});
              u.pageX = n.pageX, u.pageY = n.pageY;
              var f = ut(s, o, r);
              f && (f.pageX = parseInt(f.series.xaxis.p2c(f.datapoint[0]) + i.left + m.left, 10), f.pageY = parseInt(f.series.yaxis.p2c(f.datapoint[1]) + i.top + m.top, 10));
              if (a.grid.autoHighlight) {
                  for (var l = 0; l < st.length; ++l) {
                      var h = st[l];
                      h.auto == e && (!f || h.series != f.series || h.point[0] != f.datapoint[0] || h.point[1] != f.datapoint[1]) && vt(h.series, h.point)
                  }
                  f && dt(f.series, f.datapoint, e)
              }
              t.trigger(e, [u, f])
          }
  
          function ht() {
              var e = a.interaction.redrawOverlayInterval;
              if (e == -1) {
                  pt();
                  return
              }
              ot || (ot = setTimeout(pt, e))
          }
  
          function pt() {
              ot = null, p.save(), l.clear(), p.translate(m.left, m.top);
              var e, t;
              for (e = 0; e < st.length; ++e)t = st[e], t.series.bars.show ? yt(t.series, t.point) : gt(t.series, t.point);
              p.restore(), E(b.drawOverlay, [p])
          }
  
          function dt(e, t, n) {
              typeof e == "number" && (e = u[e]);
              if (typeof t == "number") {
                  var r = e.datapoints.pointsize;
                  t = e.datapoints.points.slice(r * t, r * (t + 1))
              }
              var i = mt(e, t);
              i == -1 ? (st.push({series: e, point: t, auto: n}), ht()) : n || (st[i].auto = !1)
          }
  
          function vt(e, t) {
              if (e == null && t == null) {
                  st = [], ht();
                  return
              }
              typeof e == "number" && (e = u[e]);
              if (typeof t == "number") {
                  var n = e.datapoints.pointsize;
                  t = e.datapoints.points.slice(n * t, n * (t + 1))
              }
              var r = mt(e, t);
              r != -1 && (st.splice(r, 1), ht())
          }
  
          function mt(e, t) {
              for (var n = 0; n < st.length; ++n) {
                  var r = st[n];
                  if (r.series == e && r.point[0] == t[0] && r.point[1] == t[1])return n
              }
              return -1
          }
  
          function gt(t, n) {
              var r = n[0], i = n[1], s = t.xaxis, o = t.yaxis,
                  u = typeof t.highlightColor == "string" ? t.highlightColor : e.color.parse(t.color).scale("a", .5).toString();
              if (r < s.min || r > s.max || i < o.min || i > o.max)return;
              var a = t.points.radius + t.points.lineWidth / 2;
              p.lineWidth = a, p.strokeStyle = u;
              var f = 1.5 * a;
              r = s.p2c(r), i = o.p2c(i), p.beginPath(), t.points.symbol == "circle" ? p.arc(r, i, f, 0, 2 * Math.PI, !1) : t.points.symbol(p, r, i, f, !1), p.closePath(), p.stroke()
          }
  
          function yt(t, n) {
              var r = typeof t.highlightColor == "string" ? t.highlightColor : e.color.parse(t.color).scale("a", .5).toString(),
                  i = r, s = t.bars.align == "left" ? 0 : -t.bars.barWidth / 2;
              p.lineWidth = t.bars.lineWidth, p.strokeStyle = r, tt(n[0], n[1], n[2] || 0, s, s + t.bars.barWidth, 0, function () {
                  return i
              }, t.xaxis, t.yaxis, p, t.bars.horizontal, t.bars.lineWidth)
          }
  
          function bt(t, n, r, i) {
              if (typeof t == "string")return t;
              var s = h.createLinearGradient(0, r, 0, n);
              for (var o = 0, u = t.colors.length; o < u; ++o) {
                  var a = t.colors[o];
                  if (typeof a != "string") {
                      var f = e.color.parse(i);
                      a.brightness != null && (f = f.scale("rgb", a.brightness)), a.opacity != null && (f.a *= a.opacity), a = f.toString()
                  }
                  s.addColorStop(o / (u - 1), a)
              }
              return s
          }
  
          var u = [], a = {
              colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"],
              legend: {
                  show: !0,
                  noColumns: 1,
                  labelFormatter: null,
                  labelBoxBorderColor: "#ccc",
                  container: null,
                  position: "ne",
                  margin: 5,
                  backgroundColor: null,
                  backgroundOpacity: .85,
                  sorted: null
              },
              xaxis: {
                  show: null,
                  position: "bottom",
                  mode: null,
                  font: null,
                  color: null,
                  tickColor: null,
                  transform: null,
                  inverseTransform: null,
                  min: null,
                  max: null,
                  autoscaleMargin: null,
                  ticks: null,
                  tickFormatter: null,
                  labelWidth: null,
                  labelHeight: null,
                  reserveSpace: null,
                  tickLength: null,
                  alignTicksWithAxis: null,
                  tickDecimals: null,
                  tickSize: null,
                  minTickSize: null
              },
              yaxis: {autoscaleMargin: .02, position: "left"},
              xaxes: [],
              yaxes: [],
              series: {
                  points: {show: !1, radius: 3, lineWidth: 2, fill: !0, fillColor: "#ffffff", symbol: "circle"},
                  lines: {lineWidth: 2, fill: !1, fillColor: null, steps: !1},
                  bars: {
                      show: !1,
                      lineWidth: 2,
                      barWidth: 1,
                      fill: !0,
                      fillColor: null,
                      align: "left",
                      horizontal: !1,
                      zero: !0
                  },
                  shadowSize: 3,
                  highlightColor: null
              },
              grid: {
                  show: !0,
                  aboveData: !1,
                  color: "#545454",
                  backgroundColor: null,
                  borderColor: null,
                  tickColor: null,
                  margin: 0,
                  labelMargin: 5,
                  axisMargin: 8,
                  borderWidth: 2,
                  minBorderMargin: null,
                  markings: null,
                  markingsColor: "#f4f4f4",
                  markingsLineWidth: 2,
                  clickable: !1,
                  hoverable: !1,
                  autoHighlight: !0,
                  mouseActiveRadius: 10
              },
              interaction: {redrawOverlayInterval: 1e3 / 60},
              hooks: {}
          }, f = null, l = null, c = null, h = null, p = null, d = [], v = [], m = {
              left: 0, right: 0, top: 0, bottom: 0
          }, g = 0, y = 0, b = {
              processOptions: [],
              processRawData: [],
              processDatapoints: [],
              processOffset: [],
              drawBackground: [],
              drawSeries: [],
              draw: [],
              bindEvents: [],
              drawOverlay: [],
              shutdown: []
          }, w = this;
          w.setData = T, w.setupGrid = R, w.draw = V, w.getPlaceholder = function () {
              return t
          }, w.getCanvas = function () {
              return f.element
          }, w.getPlotOffset = function () {
              return m
          }, w.width = function () {
              return g
          }, w.height = function () {
              return y
          }, w.offset = function () {
              var e = c.offset();
              return e.left += m.left, e.top += m.top, e
          }, w.getData = function () {
              return u
          }, w.getAxes = function () {
              var t = {}, n;
              return e.each(d.concat(v), function (e, n) {
                  n && (t[n.direction + (n.n != 1 ? n.n : "") + "axis"] = n)
              }), t
          }, w.getXAxes = function () {
              return d
          }, w.getYAxes = function () {
              return v
          }, w.c2p = L, w.p2c = A, w.getOptions = function () {
              return a
          }, w.highlight = dt, w.unhighlight = vt, w.triggerRedrawOverlay = ht, w.pointOffset = function (e) {
              return {
                  left: parseInt(d[C(e, "x") - 1].p2c(+e.x) + m.left, 10),
                  top: parseInt(v[C(e, "y") - 1].p2c(+e.y) + m.top, 10)
              }
          }, w.shutdown = H, w.resize = function () {
              var e = t.width(), n = t.height();
              f.resize(e, n), l.resize(e, n)
          }, w.hooks = b, S(w), x(s), D(), T(r), R(), V(), P();
          var st = [], ot = null
      }
  
      function i(e, t) {
          return t * Math.floor(e / t)
      }
  
      var t = Object.prototype.hasOwnProperty;
      n.prototype.resize = function (e, t) {
          if (e <= 0 || t <= 0)throw new Error("Invalid dimensions for plot, width = " + e + ", height = " + t);
          var n = this.element, r = this.context, i = this.pixelRatio;
          this.width != e && (n.width = e * i, n.style.width = e + "px", this.width = e), this.height != t && (n.height = t * i, n.style.height = t + "px", this.height = t), r.restore(), r.save(), r.scale(i, i)
      }, n.prototype.clear = function () {
          this.context.clearRect(0, 0, this.width, this.height)
      }, n.prototype.render = function () {
          var e = this._textCache;
          for (var n in e)if (t.call(e, n)) {
              var r = this.getTextLayer(n), i = e[n];
              r.hide();
              for (var s in i)if (t.call(i, s)) {
                  var o = i[s];
                  for (var u in o)if (t.call(o, u)) {
                      var a = o[u].positions;
                      for (var f = 0, l; l = a[f]; f++)l.active ? l.rendered || (r.append(l.element), l.rendered = !0) : (a.splice(f--, 1), l.rendered && l.element.detach());
                      a.length == 0 && delete o[u]
                  }
              }
              r.show()
          }
      }, n.prototype.getTextLayer = function (t) {
          var n = this.text[t];
          return n == null && (this.textContainer == null && (this.textContainer = e("<div class='flot-text'></div>").css({
              position: "absolute",
              top: 0,
              left: 0,
              bottom: 0,
              right: 0,
              "font-size": "smaller",
              color: "#545454"
          }).insertAfter(this.element)), n = this.text[t] = e("<div></div>").addClass(t).css({
              position: "absolute",
              top: 0,
              left: 0,
              bottom: 0,
              right: 0
          }).appendTo(this.textContainer)), n
      }, n.prototype.getTextInfo = function (t, n, r, i, s) {
          var o, u, a, f;
          n = "" + n, typeof r == "object" ? o = r.style + " " + r.variant + " " + r.weight + " " + r.size + "px/" + r.lineHeight + "px " + r.family : o = r, u = this._textCache[t], u == null && (u = this._textCache[t] = {}), a = u[o], a == null && (a = u[o] = {}), f = a[n];
          if (f == null) {
              var l = e("<div></div>").html(n).css({
                  position: "absolute",
                  "max-width": s,
                  top: -9999
              }).appendTo(this.getTextLayer(t));
              typeof r == "object" ? l.css({
                  font: o,
                  color: r.color
              }) : typeof r == "string" && l.addClass(r), f = a[n] = {
                  width: l.outerWidth(!0),
                  height: l.outerHeight(!0),
                  element: l,
                  positions: []
              }, l.detach()
          }
          return f
      }, n.prototype.addText = function (e, t, n, r, i, s, o, u, a) {
          var f = this.getTextInfo(e, r, i, s, o), l = f.positions;
          u == "center" ? t -= f.width / 2 : u == "right" && (t -= f.width), a == "middle" ? n -= f.height / 2 : a == "bottom" && (n -= f.height);
          for (var c = 0, h; h = l[c]; c++)if (h.x == t && h.y == n) {
              h.active = !0;
              return
          }
          h = {
              active: !0,
              rendered: !1,
              element: l.length ? f.element.clone() : f.element,
              x: t,
              y: n
          }, l.push(h), h.element.css({top: Math.round(n), left: Math.round(t), "text-align": u})
      }, n.prototype.removeText = function (e, n, r, i, s, o) {
          if (i == null) {
              var u = this._textCache[e];
              if (u != null)for (var a in u)if (t.call(u, a)) {
                  var f = u[a];
                  for (var l in f)if (t.call(f, l)) {
                      var c = f[l].positions;
                      for (var h = 0, p; p = c[h]; h++)p.active = !1
                  }
              }
          } else {
              var c = this.getTextInfo(e, i, s, o).positions;
              for (var h = 0, p; p = c[h]; h++)p.x == n && p.y == r && (p.active = !1)
          }
      }, e.plot = function (t, n, i) {
          var s = new r(e(t), n, i, e.plot.plugins);
          return s
      }, e.plot.version = "0.8.1", e.plot.plugins = [], e.fn.plot = function (t, n) {
          return this.each(function () {
              e.plot(this, t, n)
          })
      }
  }(jQuery);