83 lines
No EOL
1.6 MiB
Vendored
83 lines
No EOL
1.6 MiB
Vendored
/******/ (function(modules) { // webpackBootstrap
|
|
/******/ // The module cache
|
|
/******/ var installedModules = {};
|
|
/******/
|
|
/******/ // The require function
|
|
/******/ function __webpack_require__(moduleId) {
|
|
/******/
|
|
/******/ // Check if module is in cache
|
|
/******/ if(installedModules[moduleId]) {
|
|
/******/ return installedModules[moduleId].exports;
|
|
/******/ }
|
|
/******/ // Create a new module (and put it into the cache)
|
|
/******/ var module = installedModules[moduleId] = {
|
|
/******/ i: moduleId,
|
|
/******/ l: false,
|
|
/******/ exports: {}
|
|
/******/ };
|
|
/******/
|
|
/******/ // Execute the module function
|
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
/******/
|
|
/******/ // Flag the module as loaded
|
|
/******/ module.l = true;
|
|
/******/
|
|
/******/ // Return the exports of the module
|
|
/******/ return module.exports;
|
|
/******/ }
|
|
/******/
|
|
/******/
|
|
/******/ // expose the modules object (__webpack_modules__)
|
|
/******/ __webpack_require__.m = modules;
|
|
/******/
|
|
/******/ // expose the module cache
|
|
/******/ __webpack_require__.c = installedModules;
|
|
/******/
|
|
/******/ // define getter function for harmony exports
|
|
/******/ __webpack_require__.d = function(exports, name, getter) {
|
|
/******/ if(!__webpack_require__.o(exports, name)) {
|
|
/******/ Object.defineProperty(exports, name, {
|
|
/******/ configurable: false,
|
|
/******/ enumerable: true,
|
|
/******/ get: getter
|
|
/******/ });
|
|
/******/ }
|
|
/******/ };
|
|
/******/
|
|
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
/******/ __webpack_require__.n = function(module) {
|
|
/******/ var getter = module && module.__esModule ?
|
|
/******/ function getDefault() { return module['default']; } :
|
|
/******/ function getModuleExports() { return module; };
|
|
/******/ __webpack_require__.d(getter, 'a', getter);
|
|
/******/ return getter;
|
|
/******/ };
|
|
/******/
|
|
/******/ // Object.prototype.hasOwnProperty.call
|
|
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
|
/******/
|
|
/******/ // __webpack_public_path__
|
|
/******/ __webpack_require__.p = "/";
|
|
/******/
|
|
/******/ // Load entry module and return exports
|
|
/******/ return __webpack_require__(__webpack_require__.s = 6);
|
|
/******/ })
|
|
/************************************************************************/
|
|
/******/ ({
|
|
|
|
/***/ 6:
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
module.exports = __webpack_require__(7);
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 7:
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var require;var require;var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/*!\n * Chart.js\n * http://chartjs.org/\n * Version: 2.7.3\n *\n * Copyright 2018 Chart.js Contributors\n * Released under the MIT license\n * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md\n */\n(function (f) {\n\tif (( false ? \"undefined\" : _typeof(exports)) === \"object\" && typeof module !== \"undefined\") {\n\t\tmodule.exports = f();\n\t} else if (true) {\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (f),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else {\n\t\tvar g;if (typeof window !== \"undefined\") {\n\t\t\tg = window;\n\t\t} else if (typeof global !== \"undefined\") {\n\t\t\tg = global;\n\t\t} else if (typeof self !== \"undefined\") {\n\t\t\tg = self;\n\t\t} else {\n\t\t\tg = this;\n\t\t}g.Chart = f();\n\t}\n})(function () {\n\tvar define, module, exports;return function () {\n\t\tfunction r(e, n, t) {\n\t\t\tfunction o(i, f) {\n\t\t\t\tif (!n[i]) {\n\t\t\t\t\tif (!e[i]) {\n\t\t\t\t\t\tvar c = \"function\" == typeof require && require;if (!f && c) return require(i, !0);if (u) return u(i, !0);var a = new Error(\"Cannot find module '\" + i + \"'\");throw a.code = \"MODULE_NOT_FOUND\", a;\n\t\t\t\t\t}var p = n[i] = { exports: {} };e[i][0].call(p.exports, function (r) {\n\t\t\t\t\t\tvar n = e[i][1][r];return o(n || r);\n\t\t\t\t\t}, p, p.exports, r, e, n, t);\n\t\t\t\t}return n[i].exports;\n\t\t\t}for (var u = \"function\" == typeof require && require, i = 0; i < t.length; i++) {\n\t\t\t\to(t[i]);\n\t\t\t}return o;\n\t\t}return r;\n\t}()({ 1: [function (require, module, exports) {}, {}], 2: [function (require, module, exports) {\n\t\t\t/* MIT license */\n\t\t\tvar colorNames = require(6);\n\n\t\t\tmodule.exports = {\n\t\t\t\tgetRgba: getRgba,\n\t\t\t\tgetHsla: getHsla,\n\t\t\t\tgetRgb: getRgb,\n\t\t\t\tgetHsl: getHsl,\n\t\t\t\tgetHwb: getHwb,\n\t\t\t\tgetAlpha: getAlpha,\n\n\t\t\t\thexString: hexString,\n\t\t\t\trgbString: rgbString,\n\t\t\t\trgbaString: rgbaString,\n\t\t\t\tpercentString: percentString,\n\t\t\t\tpercentaString: percentaString,\n\t\t\t\thslString: hslString,\n\t\t\t\thslaString: hslaString,\n\t\t\t\thwbString: hwbString,\n\t\t\t\tkeyword: keyword\n\t\t\t};\n\n\t\t\tfunction getRgba(string) {\n\t\t\t\tif (!string) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar abbr = /^#([a-fA-F0-9]{3})$/i,\n\t\t\t\t hex = /^#([a-fA-F0-9]{6})$/i,\n\t\t\t\t rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n\t\t\t\t per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n\t\t\t\t keyword = /(\\w+)/;\n\n\t\t\t\tvar rgb = [0, 0, 0],\n\t\t\t\t a = 1,\n\t\t\t\t match = string.match(abbr);\n\t\t\t\tif (match) {\n\t\t\t\t\tmatch = match[1];\n\t\t\t\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\t\t\t\trgb[i] = parseInt(match[i] + match[i], 16);\n\t\t\t\t\t}\n\t\t\t\t} else if (match = string.match(hex)) {\n\t\t\t\t\tmatch = match[1];\n\t\t\t\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\t\t\t\trgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);\n\t\t\t\t\t}\n\t\t\t\t} else if (match = string.match(rgba)) {\n\t\t\t\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\t\t\t\trgb[i] = parseInt(match[i + 1]);\n\t\t\t\t\t}\n\t\t\t\t\ta = parseFloat(match[4]);\n\t\t\t\t} else if (match = string.match(per)) {\n\t\t\t\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\t\t\t\trgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n\t\t\t\t\t}\n\t\t\t\t\ta = parseFloat(match[4]);\n\t\t\t\t} else if (match = string.match(keyword)) {\n\t\t\t\t\tif (match[1] == \"transparent\") {\n\t\t\t\t\t\treturn [0, 0, 0, 0];\n\t\t\t\t\t}\n\t\t\t\t\trgb = colorNames[match[1]];\n\t\t\t\t\tif (!rgb) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\t\t\trgb[i] = scale(rgb[i], 0, 255);\n\t\t\t\t}\n\t\t\t\tif (!a && a != 0) {\n\t\t\t\t\ta = 1;\n\t\t\t\t} else {\n\t\t\t\t\ta = scale(a, 0, 1);\n\t\t\t\t}\n\t\t\t\trgb[3] = a;\n\t\t\t\treturn rgb;\n\t\t\t}\n\n\t\t\tfunction getHsla(string) {\n\t\t\t\tif (!string) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar hsl = /^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n\t\t\t\tvar match = string.match(hsl);\n\t\t\t\tif (match) {\n\t\t\t\t\tvar alpha = parseFloat(match[4]);\n\t\t\t\t\tvar h = scale(parseInt(match[1]), 0, 360),\n\t\t\t\t\t s = scale(parseFloat(match[2]), 0, 100),\n\t\t\t\t\t l = scale(parseFloat(match[3]), 0, 100),\n\t\t\t\t\t a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n\t\t\t\t\treturn [h, s, l, a];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction getHwb(string) {\n\t\t\t\tif (!string) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar hwb = /^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n\t\t\t\tvar match = string.match(hwb);\n\t\t\t\tif (match) {\n\t\t\t\t\tvar alpha = parseFloat(match[4]);\n\t\t\t\t\tvar h = scale(parseInt(match[1]), 0, 360),\n\t\t\t\t\t w = scale(parseFloat(match[2]), 0, 100),\n\t\t\t\t\t b = scale(parseFloat(match[3]), 0, 100),\n\t\t\t\t\t a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n\t\t\t\t\treturn [h, w, b, a];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction getRgb(string) {\n\t\t\t\tvar rgba = getRgba(string);\n\t\t\t\treturn rgba && rgba.slice(0, 3);\n\t\t\t}\n\n\t\t\tfunction getHsl(string) {\n\t\t\t\tvar hsla = getHsla(string);\n\t\t\t\treturn hsla && hsla.slice(0, 3);\n\t\t\t}\n\n\t\t\tfunction getAlpha(string) {\n\t\t\t\tvar vals = getRgba(string);\n\t\t\t\tif (vals) {\n\t\t\t\t\treturn vals[3];\n\t\t\t\t} else if (vals = getHsla(string)) {\n\t\t\t\t\treturn vals[3];\n\t\t\t\t} else if (vals = getHwb(string)) {\n\t\t\t\t\treturn vals[3];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// generators\n\t\t\tfunction hexString(rgb) {\n\t\t\t\treturn \"#\" + hexDouble(rgb[0]) + hexDouble(rgb[1]) + hexDouble(rgb[2]);\n\t\t\t}\n\n\t\t\tfunction rgbString(rgba, alpha) {\n\t\t\t\tif (alpha < 1 || rgba[3] && rgba[3] < 1) {\n\t\t\t\t\treturn rgbaString(rgba, alpha);\n\t\t\t\t}\n\t\t\t\treturn \"rgb(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \")\";\n\t\t\t}\n\n\t\t\tfunction rgbaString(rgba, alpha) {\n\t\t\t\tif (alpha === undefined) {\n\t\t\t\t\talpha = rgba[3] !== undefined ? rgba[3] : 1;\n\t\t\t\t}\n\t\t\t\treturn \"rgba(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \", \" + alpha + \")\";\n\t\t\t}\n\n\t\t\tfunction percentString(rgba, alpha) {\n\t\t\t\tif (alpha < 1 || rgba[3] && rgba[3] < 1) {\n\t\t\t\t\treturn percentaString(rgba, alpha);\n\t\t\t\t}\n\t\t\t\tvar r = Math.round(rgba[0] / 255 * 100),\n\t\t\t\t g = Math.round(rgba[1] / 255 * 100),\n\t\t\t\t b = Math.round(rgba[2] / 255 * 100);\n\n\t\t\t\treturn \"rgb(\" + r + \"%, \" + g + \"%, \" + b + \"%)\";\n\t\t\t}\n\n\t\t\tfunction percentaString(rgba, alpha) {\n\t\t\t\tvar r = Math.round(rgba[0] / 255 * 100),\n\t\t\t\t g = Math.round(rgba[1] / 255 * 100),\n\t\t\t\t b = Math.round(rgba[2] / 255 * 100);\n\t\t\t\treturn \"rgba(\" + r + \"%, \" + g + \"%, \" + b + \"%, \" + (alpha || rgba[3] || 1) + \")\";\n\t\t\t}\n\n\t\t\tfunction hslString(hsla, alpha) {\n\t\t\t\tif (alpha < 1 || hsla[3] && hsla[3] < 1) {\n\t\t\t\t\treturn hslaString(hsla, alpha);\n\t\t\t\t}\n\t\t\t\treturn \"hsl(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%)\";\n\t\t\t}\n\n\t\t\tfunction hslaString(hsla, alpha) {\n\t\t\t\tif (alpha === undefined) {\n\t\t\t\t\talpha = hsla[3] !== undefined ? hsla[3] : 1;\n\t\t\t\t}\n\t\t\t\treturn \"hsla(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%, \" + alpha + \")\";\n\t\t\t}\n\n\t\t\t// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n\t\t\t// (hwb have alpha optional & 1 is default value)\n\t\t\tfunction hwbString(hwb, alpha) {\n\t\t\t\tif (alpha === undefined) {\n\t\t\t\t\talpha = hwb[3] !== undefined ? hwb[3] : 1;\n\t\t\t\t}\n\t\t\t\treturn \"hwb(\" + hwb[0] + \", \" + hwb[1] + \"%, \" + hwb[2] + \"%\" + (alpha !== undefined && alpha !== 1 ? \", \" + alpha : \"\") + \")\";\n\t\t\t}\n\n\t\t\tfunction keyword(rgb) {\n\t\t\t\treturn reverseNames[rgb.slice(0, 3)];\n\t\t\t}\n\n\t\t\t// helpers\n\t\t\tfunction scale(num, min, max) {\n\t\t\t\treturn Math.min(Math.max(min, num), max);\n\t\t\t}\n\n\t\t\tfunction hexDouble(num) {\n\t\t\t\tvar str = num.toString(16).toUpperCase();\n\t\t\t\treturn str.length < 2 ? \"0\" + str : str;\n\t\t\t}\n\n\t\t\t//create a list of reverse color names\n\t\t\tvar reverseNames = {};\n\t\t\tfor (var name in colorNames) {\n\t\t\t\treverseNames[colorNames[name]] = name;\n\t\t\t}\n\t\t}, { \"6\": 6 }], 3: [function (require, module, exports) {\n\t\t\t/* MIT license */\n\t\t\tvar convert = require(5);\n\t\t\tvar string = require(2);\n\n\t\t\tvar Color = function Color(obj) {\n\t\t\t\tif (obj instanceof Color) {\n\t\t\t\t\treturn obj;\n\t\t\t\t}\n\t\t\t\tif (!(this instanceof Color)) {\n\t\t\t\t\treturn new Color(obj);\n\t\t\t\t}\n\n\t\t\t\tthis.valid = false;\n\t\t\t\tthis.values = {\n\t\t\t\t\trgb: [0, 0, 0],\n\t\t\t\t\thsl: [0, 0, 0],\n\t\t\t\t\thsv: [0, 0, 0],\n\t\t\t\t\thwb: [0, 0, 0],\n\t\t\t\t\tcmyk: [0, 0, 0, 0],\n\t\t\t\t\talpha: 1\n\t\t\t\t};\n\n\t\t\t\t// parse Color() argument\n\t\t\t\tvar vals;\n\t\t\t\tif (typeof obj === 'string') {\n\t\t\t\t\tvals = string.getRgba(obj);\n\t\t\t\t\tif (vals) {\n\t\t\t\t\t\tthis.setValues('rgb', vals);\n\t\t\t\t\t} else if (vals = string.getHsla(obj)) {\n\t\t\t\t\t\tthis.setValues('hsl', vals);\n\t\t\t\t\t} else if (vals = string.getHwb(obj)) {\n\t\t\t\t\t\tthis.setValues('hwb', vals);\n\t\t\t\t\t}\n\t\t\t\t} else if ((typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj)) === 'object') {\n\t\t\t\t\tvals = obj;\n\t\t\t\t\tif (vals.r !== undefined || vals.red !== undefined) {\n\t\t\t\t\t\tthis.setValues('rgb', vals);\n\t\t\t\t\t} else if (vals.l !== undefined || vals.lightness !== undefined) {\n\t\t\t\t\t\tthis.setValues('hsl', vals);\n\t\t\t\t\t} else if (vals.v !== undefined || vals.value !== undefined) {\n\t\t\t\t\t\tthis.setValues('hsv', vals);\n\t\t\t\t\t} else if (vals.w !== undefined || vals.whiteness !== undefined) {\n\t\t\t\t\t\tthis.setValues('hwb', vals);\n\t\t\t\t\t} else if (vals.c !== undefined || vals.cyan !== undefined) {\n\t\t\t\t\t\tthis.setValues('cmyk', vals);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tColor.prototype = {\n\t\t\t\tisValid: function isValid() {\n\t\t\t\t\treturn this.valid;\n\t\t\t\t},\n\t\t\t\trgb: function rgb() {\n\t\t\t\t\treturn this.setSpace('rgb', arguments);\n\t\t\t\t},\n\t\t\t\thsl: function hsl() {\n\t\t\t\t\treturn this.setSpace('hsl', arguments);\n\t\t\t\t},\n\t\t\t\thsv: function hsv() {\n\t\t\t\t\treturn this.setSpace('hsv', arguments);\n\t\t\t\t},\n\t\t\t\thwb: function hwb() {\n\t\t\t\t\treturn this.setSpace('hwb', arguments);\n\t\t\t\t},\n\t\t\t\tcmyk: function cmyk() {\n\t\t\t\t\treturn this.setSpace('cmyk', arguments);\n\t\t\t\t},\n\n\t\t\t\trgbArray: function rgbArray() {\n\t\t\t\t\treturn this.values.rgb;\n\t\t\t\t},\n\t\t\t\thslArray: function hslArray() {\n\t\t\t\t\treturn this.values.hsl;\n\t\t\t\t},\n\t\t\t\thsvArray: function hsvArray() {\n\t\t\t\t\treturn this.values.hsv;\n\t\t\t\t},\n\t\t\t\thwbArray: function hwbArray() {\n\t\t\t\t\tvar values = this.values;\n\t\t\t\t\tif (values.alpha !== 1) {\n\t\t\t\t\t\treturn values.hwb.concat([values.alpha]);\n\t\t\t\t\t}\n\t\t\t\t\treturn values.hwb;\n\t\t\t\t},\n\t\t\t\tcmykArray: function cmykArray() {\n\t\t\t\t\treturn this.values.cmyk;\n\t\t\t\t},\n\t\t\t\trgbaArray: function rgbaArray() {\n\t\t\t\t\tvar values = this.values;\n\t\t\t\t\treturn values.rgb.concat([values.alpha]);\n\t\t\t\t},\n\t\t\t\thslaArray: function hslaArray() {\n\t\t\t\t\tvar values = this.values;\n\t\t\t\t\treturn values.hsl.concat([values.alpha]);\n\t\t\t\t},\n\t\t\t\talpha: function alpha(val) {\n\t\t\t\t\tif (val === undefined) {\n\t\t\t\t\t\treturn this.values.alpha;\n\t\t\t\t\t}\n\t\t\t\t\tthis.setValues('alpha', val);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tred: function red(val) {\n\t\t\t\t\treturn this.setChannel('rgb', 0, val);\n\t\t\t\t},\n\t\t\t\tgreen: function green(val) {\n\t\t\t\t\treturn this.setChannel('rgb', 1, val);\n\t\t\t\t},\n\t\t\t\tblue: function blue(val) {\n\t\t\t\t\treturn this.setChannel('rgb', 2, val);\n\t\t\t\t},\n\t\t\t\thue: function hue(val) {\n\t\t\t\t\tif (val) {\n\t\t\t\t\t\tval %= 360;\n\t\t\t\t\t\tval = val < 0 ? 360 + val : val;\n\t\t\t\t\t}\n\t\t\t\t\treturn this.setChannel('hsl', 0, val);\n\t\t\t\t},\n\t\t\t\tsaturation: function saturation(val) {\n\t\t\t\t\treturn this.setChannel('hsl', 1, val);\n\t\t\t\t},\n\t\t\t\tlightness: function lightness(val) {\n\t\t\t\t\treturn this.setChannel('hsl', 2, val);\n\t\t\t\t},\n\t\t\t\tsaturationv: function saturationv(val) {\n\t\t\t\t\treturn this.setChannel('hsv', 1, val);\n\t\t\t\t},\n\t\t\t\twhiteness: function whiteness(val) {\n\t\t\t\t\treturn this.setChannel('hwb', 1, val);\n\t\t\t\t},\n\t\t\t\tblackness: function blackness(val) {\n\t\t\t\t\treturn this.setChannel('hwb', 2, val);\n\t\t\t\t},\n\t\t\t\tvalue: function value(val) {\n\t\t\t\t\treturn this.setChannel('hsv', 2, val);\n\t\t\t\t},\n\t\t\t\tcyan: function cyan(val) {\n\t\t\t\t\treturn this.setChannel('cmyk', 0, val);\n\t\t\t\t},\n\t\t\t\tmagenta: function magenta(val) {\n\t\t\t\t\treturn this.setChannel('cmyk', 1, val);\n\t\t\t\t},\n\t\t\t\tyellow: function yellow(val) {\n\t\t\t\t\treturn this.setChannel('cmyk', 2, val);\n\t\t\t\t},\n\t\t\t\tblack: function black(val) {\n\t\t\t\t\treturn this.setChannel('cmyk', 3, val);\n\t\t\t\t},\n\n\t\t\t\thexString: function hexString() {\n\t\t\t\t\treturn string.hexString(this.values.rgb);\n\t\t\t\t},\n\t\t\t\trgbString: function rgbString() {\n\t\t\t\t\treturn string.rgbString(this.values.rgb, this.values.alpha);\n\t\t\t\t},\n\t\t\t\trgbaString: function rgbaString() {\n\t\t\t\t\treturn string.rgbaString(this.values.rgb, this.values.alpha);\n\t\t\t\t},\n\t\t\t\tpercentString: function percentString() {\n\t\t\t\t\treturn string.percentString(this.values.rgb, this.values.alpha);\n\t\t\t\t},\n\t\t\t\thslString: function hslString() {\n\t\t\t\t\treturn string.hslString(this.values.hsl, this.values.alpha);\n\t\t\t\t},\n\t\t\t\thslaString: function hslaString() {\n\t\t\t\t\treturn string.hslaString(this.values.hsl, this.values.alpha);\n\t\t\t\t},\n\t\t\t\thwbString: function hwbString() {\n\t\t\t\t\treturn string.hwbString(this.values.hwb, this.values.alpha);\n\t\t\t\t},\n\t\t\t\tkeyword: function keyword() {\n\t\t\t\t\treturn string.keyword(this.values.rgb, this.values.alpha);\n\t\t\t\t},\n\n\t\t\t\trgbNumber: function rgbNumber() {\n\t\t\t\t\tvar rgb = this.values.rgb;\n\t\t\t\t\treturn rgb[0] << 16 | rgb[1] << 8 | rgb[2];\n\t\t\t\t},\n\n\t\t\t\tluminosity: function luminosity() {\n\t\t\t\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\t\t\t\tvar rgb = this.values.rgb;\n\t\t\t\t\tvar lum = [];\n\t\t\t\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\t\t\t\tvar chan = rgb[i] / 255;\n\t\t\t\t\t\tlum[i] = chan <= 0.03928 ? chan / 12.92 : Math.pow((chan + 0.055) / 1.055, 2.4);\n\t\t\t\t\t}\n\t\t\t\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t\t\t\t},\n\n\t\t\t\tcontrast: function contrast(color2) {\n\t\t\t\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\t\t\t\tvar lum1 = this.luminosity();\n\t\t\t\t\tvar lum2 = color2.luminosity();\n\t\t\t\t\tif (lum1 > lum2) {\n\t\t\t\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t\t\t\t}\n\t\t\t\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t\t\t\t},\n\n\t\t\t\tlevel: function level(color2) {\n\t\t\t\t\tvar contrastRatio = this.contrast(color2);\n\t\t\t\t\tif (contrastRatio >= 7.1) {\n\t\t\t\t\t\treturn 'AAA';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn contrastRatio >= 4.5 ? 'AA' : '';\n\t\t\t\t},\n\n\t\t\t\tdark: function dark() {\n\t\t\t\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\t\t\t\tvar rgb = this.values.rgb;\n\t\t\t\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\t\t\t\treturn yiq < 128;\n\t\t\t\t},\n\n\t\t\t\tlight: function light() {\n\t\t\t\t\treturn !this.dark();\n\t\t\t\t},\n\n\t\t\t\tnegate: function negate() {\n\t\t\t\t\tvar rgb = [];\n\t\t\t\t\tfor (var i = 0; i < 3; i++) {\n\t\t\t\t\t\trgb[i] = 255 - this.values.rgb[i];\n\t\t\t\t\t}\n\t\t\t\t\tthis.setValues('rgb', rgb);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tlighten: function lighten(ratio) {\n\t\t\t\t\tvar hsl = this.values.hsl;\n\t\t\t\t\thsl[2] += hsl[2] * ratio;\n\t\t\t\t\tthis.setValues('hsl', hsl);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tdarken: function darken(ratio) {\n\t\t\t\t\tvar hsl = this.values.hsl;\n\t\t\t\t\thsl[2] -= hsl[2] * ratio;\n\t\t\t\t\tthis.setValues('hsl', hsl);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tsaturate: function saturate(ratio) {\n\t\t\t\t\tvar hsl = this.values.hsl;\n\t\t\t\t\thsl[1] += hsl[1] * ratio;\n\t\t\t\t\tthis.setValues('hsl', hsl);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tdesaturate: function desaturate(ratio) {\n\t\t\t\t\tvar hsl = this.values.hsl;\n\t\t\t\t\thsl[1] -= hsl[1] * ratio;\n\t\t\t\t\tthis.setValues('hsl', hsl);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\twhiten: function whiten(ratio) {\n\t\t\t\t\tvar hwb = this.values.hwb;\n\t\t\t\t\thwb[1] += hwb[1] * ratio;\n\t\t\t\t\tthis.setValues('hwb', hwb);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tblacken: function blacken(ratio) {\n\t\t\t\t\tvar hwb = this.values.hwb;\n\t\t\t\t\thwb[2] += hwb[2] * ratio;\n\t\t\t\t\tthis.setValues('hwb', hwb);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tgreyscale: function greyscale() {\n\t\t\t\t\tvar rgb = this.values.rgb;\n\t\t\t\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\t\t\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\t\t\t\tthis.setValues('rgb', [val, val, val]);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tclearer: function clearer(ratio) {\n\t\t\t\t\tvar alpha = this.values.alpha;\n\t\t\t\t\tthis.setValues('alpha', alpha - alpha * ratio);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\topaquer: function opaquer(ratio) {\n\t\t\t\t\tvar alpha = this.values.alpha;\n\t\t\t\t\tthis.setValues('alpha', alpha + alpha * ratio);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\trotate: function rotate(degrees) {\n\t\t\t\t\tvar hsl = this.values.hsl;\n\t\t\t\t\tvar hue = (hsl[0] + degrees) % 360;\n\t\t\t\t\thsl[0] = hue < 0 ? 360 + hue : hue;\n\t\t\t\t\tthis.setValues('hsl', hsl);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Ported from sass implementation in C\n * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n */\n\t\t\t\tmix: function mix(mixinColor, weight) {\n\t\t\t\t\tvar color1 = this;\n\t\t\t\t\tvar color2 = mixinColor;\n\t\t\t\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\t\t\t\tvar w = 2 * p - 1;\n\t\t\t\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\t\t\t\tvar w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\t\t\t\tvar w2 = 1 - w1;\n\n\t\t\t\t\treturn this.rgb(w1 * color1.red() + w2 * color2.red(), w1 * color1.green() + w2 * color2.green(), w1 * color1.blue() + w2 * color2.blue()).alpha(color1.alpha() * p + color2.alpha() * (1 - p));\n\t\t\t\t},\n\n\t\t\t\ttoJSON: function toJSON() {\n\t\t\t\t\treturn this.rgb();\n\t\t\t\t},\n\n\t\t\t\tclone: function clone() {\n\t\t\t\t\t// NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n\t\t\t\t\t// making the final build way to big to embed in Chart.js. So let's do it manually,\n\t\t\t\t\t// assuming that values to clone are 1 dimension arrays containing only numbers,\n\t\t\t\t\t// except 'alpha' which is a number.\n\t\t\t\t\tvar result = new Color();\n\t\t\t\t\tvar source = this.values;\n\t\t\t\t\tvar target = result.values;\n\t\t\t\t\tvar value, type;\n\n\t\t\t\t\tfor (var prop in source) {\n\t\t\t\t\t\tif (source.hasOwnProperty(prop)) {\n\t\t\t\t\t\t\tvalue = source[prop];\n\t\t\t\t\t\t\ttype = {}.toString.call(value);\n\t\t\t\t\t\t\tif (type === '[object Array]') {\n\t\t\t\t\t\t\t\ttarget[prop] = value.slice(0);\n\t\t\t\t\t\t\t} else if (type === '[object Number]') {\n\t\t\t\t\t\t\t\ttarget[prop] = value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconsole.error('unexpected color value:', value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tColor.prototype.spaces = {\n\t\t\t\trgb: ['red', 'green', 'blue'],\n\t\t\t\thsl: ['hue', 'saturation', 'lightness'],\n\t\t\t\thsv: ['hue', 'saturation', 'value'],\n\t\t\t\thwb: ['hue', 'whiteness', 'blackness'],\n\t\t\t\tcmyk: ['cyan', 'magenta', 'yellow', 'black']\n\t\t\t};\n\n\t\t\tColor.prototype.maxes = {\n\t\t\t\trgb: [255, 255, 255],\n\t\t\t\thsl: [360, 100, 100],\n\t\t\t\thsv: [360, 100, 100],\n\t\t\t\thwb: [360, 100, 100],\n\t\t\t\tcmyk: [100, 100, 100, 100]\n\t\t\t};\n\n\t\t\tColor.prototype.getValues = function (space) {\n\t\t\t\tvar values = this.values;\n\t\t\t\tvar vals = {};\n\n\t\t\t\tfor (var i = 0; i < space.length; i++) {\n\t\t\t\t\tvals[space.charAt(i)] = values[space][i];\n\t\t\t\t}\n\n\t\t\t\tif (values.alpha !== 1) {\n\t\t\t\t\tvals.a = values.alpha;\n\t\t\t\t}\n\n\t\t\t\t// {r: 255, g: 255, b: 255, a: 0.4}\n\t\t\t\treturn vals;\n\t\t\t};\n\n\t\t\tColor.prototype.setValues = function (space, vals) {\n\t\t\t\tvar values = this.values;\n\t\t\t\tvar spaces = this.spaces;\n\t\t\t\tvar maxes = this.maxes;\n\t\t\t\tvar alpha = 1;\n\t\t\t\tvar i;\n\n\t\t\t\tthis.valid = true;\n\n\t\t\t\tif (space === 'alpha') {\n\t\t\t\t\talpha = vals;\n\t\t\t\t} else if (vals.length) {\n\t\t\t\t\t// [10, 10, 10]\n\t\t\t\t\tvalues[space] = vals.slice(0, space.length);\n\t\t\t\t\talpha = vals[space.length];\n\t\t\t\t} else if (vals[space.charAt(0)] !== undefined) {\n\t\t\t\t\t// {r: 10, g: 10, b: 10}\n\t\t\t\t\tfor (i = 0; i < space.length; i++) {\n\t\t\t\t\t\tvalues[space][i] = vals[space.charAt(i)];\n\t\t\t\t\t}\n\n\t\t\t\t\talpha = vals.a;\n\t\t\t\t} else if (vals[spaces[space][0]] !== undefined) {\n\t\t\t\t\t// {red: 10, green: 10, blue: 10}\n\t\t\t\t\tvar chans = spaces[space];\n\n\t\t\t\t\tfor (i = 0; i < space.length; i++) {\n\t\t\t\t\t\tvalues[space][i] = vals[chans[i]];\n\t\t\t\t\t}\n\n\t\t\t\t\talpha = vals.alpha;\n\t\t\t\t}\n\n\t\t\t\tvalues.alpha = Math.max(0, Math.min(1, alpha === undefined ? values.alpha : alpha));\n\n\t\t\t\tif (space === 'alpha') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tvar capped;\n\n\t\t\t\t// cap values of the space prior converting all values\n\t\t\t\tfor (i = 0; i < space.length; i++) {\n\t\t\t\t\tcapped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n\t\t\t\t\tvalues[space][i] = Math.round(capped);\n\t\t\t\t}\n\n\t\t\t\t// convert to all the other color spaces\n\t\t\t\tfor (var sname in spaces) {\n\t\t\t\t\tif (sname !== space) {\n\t\t\t\t\t\tvalues[sname] = convert[space][sname](values[space]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t};\n\n\t\t\tColor.prototype.setSpace = function (space, args) {\n\t\t\t\tvar vals = args[0];\n\n\t\t\t\tif (vals === undefined) {\n\t\t\t\t\t// color.rgb()\n\t\t\t\t\treturn this.getValues(space);\n\t\t\t\t}\n\n\t\t\t\t// color.rgb(10, 10, 10)\n\t\t\t\tif (typeof vals === 'number') {\n\t\t\t\t\tvals = Array.prototype.slice.call(args);\n\t\t\t\t}\n\n\t\t\t\tthis.setValues(space, vals);\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\tColor.prototype.setChannel = function (space, index, val) {\n\t\t\t\tvar svalues = this.values[space];\n\t\t\t\tif (val === undefined) {\n\t\t\t\t\t// color.red()\n\t\t\t\t\treturn svalues[index];\n\t\t\t\t} else if (val === svalues[index]) {\n\t\t\t\t\t// color.red(color.red())\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t\t// color.red(100)\n\t\t\t\tsvalues[index] = val;\n\t\t\t\tthis.setValues(space, svalues);\n\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\twindow.Color = Color;\n\t\t\t}\n\n\t\t\tmodule.exports = Color;\n\t\t}, { \"2\": 2, \"5\": 5 }], 4: [function (require, module, exports) {\n\t\t\t/* MIT license */\n\n\t\t\tmodule.exports = {\n\t\t\t\trgb2hsl: rgb2hsl,\n\t\t\t\trgb2hsv: rgb2hsv,\n\t\t\t\trgb2hwb: rgb2hwb,\n\t\t\t\trgb2cmyk: rgb2cmyk,\n\t\t\t\trgb2keyword: rgb2keyword,\n\t\t\t\trgb2xyz: rgb2xyz,\n\t\t\t\trgb2lab: rgb2lab,\n\t\t\t\trgb2lch: rgb2lch,\n\n\t\t\t\thsl2rgb: hsl2rgb,\n\t\t\t\thsl2hsv: hsl2hsv,\n\t\t\t\thsl2hwb: hsl2hwb,\n\t\t\t\thsl2cmyk: hsl2cmyk,\n\t\t\t\thsl2keyword: hsl2keyword,\n\n\t\t\t\thsv2rgb: hsv2rgb,\n\t\t\t\thsv2hsl: hsv2hsl,\n\t\t\t\thsv2hwb: hsv2hwb,\n\t\t\t\thsv2cmyk: hsv2cmyk,\n\t\t\t\thsv2keyword: hsv2keyword,\n\n\t\t\t\thwb2rgb: hwb2rgb,\n\t\t\t\thwb2hsl: hwb2hsl,\n\t\t\t\thwb2hsv: hwb2hsv,\n\t\t\t\thwb2cmyk: hwb2cmyk,\n\t\t\t\thwb2keyword: hwb2keyword,\n\n\t\t\t\tcmyk2rgb: cmyk2rgb,\n\t\t\t\tcmyk2hsl: cmyk2hsl,\n\t\t\t\tcmyk2hsv: cmyk2hsv,\n\t\t\t\tcmyk2hwb: cmyk2hwb,\n\t\t\t\tcmyk2keyword: cmyk2keyword,\n\n\t\t\t\tkeyword2rgb: keyword2rgb,\n\t\t\t\tkeyword2hsl: keyword2hsl,\n\t\t\t\tkeyword2hsv: keyword2hsv,\n\t\t\t\tkeyword2hwb: keyword2hwb,\n\t\t\t\tkeyword2cmyk: keyword2cmyk,\n\t\t\t\tkeyword2lab: keyword2lab,\n\t\t\t\tkeyword2xyz: keyword2xyz,\n\n\t\t\t\txyz2rgb: xyz2rgb,\n\t\t\t\txyz2lab: xyz2lab,\n\t\t\t\txyz2lch: xyz2lch,\n\n\t\t\t\tlab2xyz: lab2xyz,\n\t\t\t\tlab2rgb: lab2rgb,\n\t\t\t\tlab2lch: lab2lch,\n\n\t\t\t\tlch2lab: lch2lab,\n\t\t\t\tlch2xyz: lch2xyz,\n\t\t\t\tlch2rgb: lch2rgb\n\t\t\t};\n\n\t\t\tfunction rgb2hsl(rgb) {\n\t\t\t\tvar r = rgb[0] / 255,\n\t\t\t\t g = rgb[1] / 255,\n\t\t\t\t b = rgb[2] / 255,\n\t\t\t\t min = Math.min(r, g, b),\n\t\t\t\t max = Math.max(r, g, b),\n\t\t\t\t delta = max - min,\n\t\t\t\t h,\n\t\t\t\t s,\n\t\t\t\t l;\n\n\t\t\t\tif (max == min) h = 0;else if (r == max) h = (g - b) / delta;else if (g == max) h = 2 + (b - r) / delta;else if (b == max) h = 4 + (r - g) / delta;\n\n\t\t\t\th = Math.min(h * 60, 360);\n\n\t\t\t\tif (h < 0) h += 360;\n\n\t\t\t\tl = (min + max) / 2;\n\n\t\t\t\tif (max == min) s = 0;else if (l <= 0.5) s = delta / (max + min);else s = delta / (2 - max - min);\n\n\t\t\t\treturn [h, s * 100, l * 100];\n\t\t\t}\n\n\t\t\tfunction rgb2hsv(rgb) {\n\t\t\t\tvar r = rgb[0],\n\t\t\t\t g = rgb[1],\n\t\t\t\t b = rgb[2],\n\t\t\t\t min = Math.min(r, g, b),\n\t\t\t\t max = Math.max(r, g, b),\n\t\t\t\t delta = max - min,\n\t\t\t\t h,\n\t\t\t\t s,\n\t\t\t\t v;\n\n\t\t\t\tif (max == 0) s = 0;else s = delta / max * 1000 / 10;\n\n\t\t\t\tif (max == min) h = 0;else if (r == max) h = (g - b) / delta;else if (g == max) h = 2 + (b - r) / delta;else if (b == max) h = 4 + (r - g) / delta;\n\n\t\t\t\th = Math.min(h * 60, 360);\n\n\t\t\t\tif (h < 0) h += 360;\n\n\t\t\t\tv = max / 255 * 1000 / 10;\n\n\t\t\t\treturn [h, s, v];\n\t\t\t}\n\n\t\t\tfunction rgb2hwb(rgb) {\n\t\t\t\tvar r = rgb[0],\n\t\t\t\t g = rgb[1],\n\t\t\t\t b = rgb[2],\n\t\t\t\t h = rgb2hsl(rgb)[0],\n\t\t\t\t w = 1 / 255 * Math.min(r, Math.min(g, b)),\n\t\t\t\t b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\t\t\t\treturn [h, w * 100, b * 100];\n\t\t\t}\n\n\t\t\tfunction rgb2cmyk(rgb) {\n\t\t\t\tvar r = rgb[0] / 255,\n\t\t\t\t g = rgb[1] / 255,\n\t\t\t\t b = rgb[2] / 255,\n\t\t\t\t c,\n\t\t\t\t m,\n\t\t\t\t y,\n\t\t\t\t k;\n\n\t\t\t\tk = Math.min(1 - r, 1 - g, 1 - b);\n\t\t\t\tc = (1 - r - k) / (1 - k) || 0;\n\t\t\t\tm = (1 - g - k) / (1 - k) || 0;\n\t\t\t\ty = (1 - b - k) / (1 - k) || 0;\n\t\t\t\treturn [c * 100, m * 100, y * 100, k * 100];\n\t\t\t}\n\n\t\t\tfunction rgb2keyword(rgb) {\n\t\t\t\treturn reverseKeywords[JSON.stringify(rgb)];\n\t\t\t}\n\n\t\t\tfunction rgb2xyz(rgb) {\n\t\t\t\tvar r = rgb[0] / 255,\n\t\t\t\t g = rgb[1] / 255,\n\t\t\t\t b = rgb[2] / 255;\n\n\t\t\t\t// assume sRGB\n\t\t\t\tr = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n\t\t\t\tg = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n\t\t\t\tb = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n\t\t\t\tvar x = r * 0.4124 + g * 0.3576 + b * 0.1805;\n\t\t\t\tvar y = r * 0.2126 + g * 0.7152 + b * 0.0722;\n\t\t\t\tvar z = r * 0.0193 + g * 0.1192 + b * 0.9505;\n\n\t\t\t\treturn [x * 100, y * 100, z * 100];\n\t\t\t}\n\n\t\t\tfunction rgb2lab(rgb) {\n\t\t\t\tvar xyz = rgb2xyz(rgb),\n\t\t\t\t x = xyz[0],\n\t\t\t\t y = xyz[1],\n\t\t\t\t z = xyz[2],\n\t\t\t\t l,\n\t\t\t\t a,\n\t\t\t\t b;\n\n\t\t\t\tx /= 95.047;\n\t\t\t\ty /= 100;\n\t\t\t\tz /= 108.883;\n\n\t\t\t\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;\n\t\t\t\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;\n\t\t\t\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;\n\n\t\t\t\tl = 116 * y - 16;\n\t\t\t\ta = 500 * (x - y);\n\t\t\t\tb = 200 * (y - z);\n\n\t\t\t\treturn [l, a, b];\n\t\t\t}\n\n\t\t\tfunction rgb2lch(args) {\n\t\t\t\treturn lab2lch(rgb2lab(args));\n\t\t\t}\n\n\t\t\tfunction hsl2rgb(hsl) {\n\t\t\t\tvar h = hsl[0] / 360,\n\t\t\t\t s = hsl[1] / 100,\n\t\t\t\t l = hsl[2] / 100,\n\t\t\t\t t1,\n\t\t\t\t t2,\n\t\t\t\t t3,\n\t\t\t\t rgb,\n\t\t\t\t val;\n\n\t\t\t\tif (s == 0) {\n\t\t\t\t\tval = l * 255;\n\t\t\t\t\treturn [val, val, val];\n\t\t\t\t}\n\n\t\t\t\tif (l < 0.5) t2 = l * (1 + s);else t2 = l + s - l * s;\n\t\t\t\tt1 = 2 * l - t2;\n\n\t\t\t\trgb = [0, 0, 0];\n\t\t\t\tfor (var i = 0; i < 3; i++) {\n\t\t\t\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\t\t\t\tt3 < 0 && t3++;\n\t\t\t\t\tt3 > 1 && t3--;\n\n\t\t\t\t\tif (6 * t3 < 1) val = t1 + (t2 - t1) * 6 * t3;else if (2 * t3 < 1) val = t2;else if (3 * t3 < 2) val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;else val = t1;\n\n\t\t\t\t\trgb[i] = val * 255;\n\t\t\t\t}\n\n\t\t\t\treturn rgb;\n\t\t\t}\n\n\t\t\tfunction hsl2hsv(hsl) {\n\t\t\t\tvar h = hsl[0],\n\t\t\t\t s = hsl[1] / 100,\n\t\t\t\t l = hsl[2] / 100,\n\t\t\t\t sv,\n\t\t\t\t v;\n\n\t\t\t\tif (l === 0) {\n\t\t\t\t\t// no need to do calc on black\n\t\t\t\t\t// also avoids divide by 0 error\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tl *= 2;\n\t\t\t\ts *= l <= 1 ? l : 2 - l;\n\t\t\t\tv = (l + s) / 2;\n\t\t\t\tsv = 2 * s / (l + s);\n\t\t\t\treturn [h, sv * 100, v * 100];\n\t\t\t}\n\n\t\t\tfunction hsl2hwb(args) {\n\t\t\t\treturn rgb2hwb(hsl2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hsl2cmyk(args) {\n\t\t\t\treturn rgb2cmyk(hsl2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hsl2keyword(args) {\n\t\t\t\treturn rgb2keyword(hsl2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hsv2rgb(hsv) {\n\t\t\t\tvar h = hsv[0] / 60,\n\t\t\t\t s = hsv[1] / 100,\n\t\t\t\t v = hsv[2] / 100,\n\t\t\t\t hi = Math.floor(h) % 6;\n\n\t\t\t\tvar f = h - Math.floor(h),\n\t\t\t\t p = 255 * v * (1 - s),\n\t\t\t\t q = 255 * v * (1 - s * f),\n\t\t\t\t t = 255 * v * (1 - s * (1 - f)),\n\t\t\t\t v = 255 * v;\n\n\t\t\t\tswitch (hi) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\treturn [v, t, p];\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\treturn [q, v, p];\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\treturn [p, v, t];\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\treturn [p, q, v];\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\treturn [t, p, v];\n\t\t\t\t\tcase 5:\n\t\t\t\t\t\treturn [v, p, q];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction hsv2hsl(hsv) {\n\t\t\t\tvar h = hsv[0],\n\t\t\t\t s = hsv[1] / 100,\n\t\t\t\t v = hsv[2] / 100,\n\t\t\t\t sl,\n\t\t\t\t l;\n\n\t\t\t\tl = (2 - s) * v;\n\t\t\t\tsl = s * v;\n\t\t\t\tsl /= l <= 1 ? l : 2 - l;\n\t\t\t\tsl = sl || 0;\n\t\t\t\tl /= 2;\n\t\t\t\treturn [h, sl * 100, l * 100];\n\t\t\t}\n\n\t\t\tfunction hsv2hwb(args) {\n\t\t\t\treturn rgb2hwb(hsv2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hsv2cmyk(args) {\n\t\t\t\treturn rgb2cmyk(hsv2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hsv2keyword(args) {\n\t\t\t\treturn rgb2keyword(hsv2rgb(args));\n\t\t\t}\n\n\t\t\t// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\n\t\t\tfunction hwb2rgb(hwb) {\n\t\t\t\tvar h = hwb[0] / 360,\n\t\t\t\t wh = hwb[1] / 100,\n\t\t\t\t bl = hwb[2] / 100,\n\t\t\t\t ratio = wh + bl,\n\t\t\t\t i,\n\t\t\t\t v,\n\t\t\t\t f,\n\t\t\t\t n;\n\n\t\t\t\t// wh + bl cant be > 1\n\t\t\t\tif (ratio > 1) {\n\t\t\t\t\twh /= ratio;\n\t\t\t\t\tbl /= ratio;\n\t\t\t\t}\n\n\t\t\t\ti = Math.floor(6 * h);\n\t\t\t\tv = 1 - bl;\n\t\t\t\tf = 6 * h - i;\n\t\t\t\tif ((i & 0x01) != 0) {\n\t\t\t\t\tf = 1 - f;\n\t\t\t\t}\n\t\t\t\tn = wh + f * (v - wh); // linear interpolation\n\n\t\t\t\tswitch (i) {\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase 6:\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\tr = v;g = n;b = wh;break;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tr = n;g = v;b = wh;break;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\tr = wh;g = v;b = n;break;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\tr = wh;g = n;b = v;break;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\tr = n;g = wh;b = v;break;\n\t\t\t\t\tcase 5:\n\t\t\t\t\t\tr = v;g = wh;b = n;break;\n\t\t\t\t}\n\n\t\t\t\treturn [r * 255, g * 255, b * 255];\n\t\t\t}\n\n\t\t\tfunction hwb2hsl(args) {\n\t\t\t\treturn rgb2hsl(hwb2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hwb2hsv(args) {\n\t\t\t\treturn rgb2hsv(hwb2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hwb2cmyk(args) {\n\t\t\t\treturn rgb2cmyk(hwb2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hwb2keyword(args) {\n\t\t\t\treturn rgb2keyword(hwb2rgb(args));\n\t\t\t}\n\n\t\t\tfunction cmyk2rgb(cmyk) {\n\t\t\t\tvar c = cmyk[0] / 100,\n\t\t\t\t m = cmyk[1] / 100,\n\t\t\t\t y = cmyk[2] / 100,\n\t\t\t\t k = cmyk[3] / 100,\n\t\t\t\t r,\n\t\t\t\t g,\n\t\t\t\t b;\n\n\t\t\t\tr = 1 - Math.min(1, c * (1 - k) + k);\n\t\t\t\tg = 1 - Math.min(1, m * (1 - k) + k);\n\t\t\t\tb = 1 - Math.min(1, y * (1 - k) + k);\n\t\t\t\treturn [r * 255, g * 255, b * 255];\n\t\t\t}\n\n\t\t\tfunction cmyk2hsl(args) {\n\t\t\t\treturn rgb2hsl(cmyk2rgb(args));\n\t\t\t}\n\n\t\t\tfunction cmyk2hsv(args) {\n\t\t\t\treturn rgb2hsv(cmyk2rgb(args));\n\t\t\t}\n\n\t\t\tfunction cmyk2hwb(args) {\n\t\t\t\treturn rgb2hwb(cmyk2rgb(args));\n\t\t\t}\n\n\t\t\tfunction cmyk2keyword(args) {\n\t\t\t\treturn rgb2keyword(cmyk2rgb(args));\n\t\t\t}\n\n\t\t\tfunction xyz2rgb(xyz) {\n\t\t\t\tvar x = xyz[0] / 100,\n\t\t\t\t y = xyz[1] / 100,\n\t\t\t\t z = xyz[2] / 100,\n\t\t\t\t r,\n\t\t\t\t g,\n\t\t\t\t b;\n\n\t\t\t\tr = x * 3.2406 + y * -1.5372 + z * -0.4986;\n\t\t\t\tg = x * -0.9689 + y * 1.8758 + z * 0.0415;\n\t\t\t\tb = x * 0.0557 + y * -0.2040 + z * 1.0570;\n\n\t\t\t\t// assume sRGB\n\t\t\t\tr = r > 0.0031308 ? 1.055 * Math.pow(r, 1.0 / 2.4) - 0.055 : r = r * 12.92;\n\n\t\t\t\tg = g > 0.0031308 ? 1.055 * Math.pow(g, 1.0 / 2.4) - 0.055 : g = g * 12.92;\n\n\t\t\t\tb = b > 0.0031308 ? 1.055 * Math.pow(b, 1.0 / 2.4) - 0.055 : b = b * 12.92;\n\n\t\t\t\tr = Math.min(Math.max(0, r), 1);\n\t\t\t\tg = Math.min(Math.max(0, g), 1);\n\t\t\t\tb = Math.min(Math.max(0, b), 1);\n\n\t\t\t\treturn [r * 255, g * 255, b * 255];\n\t\t\t}\n\n\t\t\tfunction xyz2lab(xyz) {\n\t\t\t\tvar x = xyz[0],\n\t\t\t\t y = xyz[1],\n\t\t\t\t z = xyz[2],\n\t\t\t\t l,\n\t\t\t\t a,\n\t\t\t\t b;\n\n\t\t\t\tx /= 95.047;\n\t\t\t\ty /= 100;\n\t\t\t\tz /= 108.883;\n\n\t\t\t\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;\n\t\t\t\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;\n\t\t\t\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;\n\n\t\t\t\tl = 116 * y - 16;\n\t\t\t\ta = 500 * (x - y);\n\t\t\t\tb = 200 * (y - z);\n\n\t\t\t\treturn [l, a, b];\n\t\t\t}\n\n\t\t\tfunction xyz2lch(args) {\n\t\t\t\treturn lab2lch(xyz2lab(args));\n\t\t\t}\n\n\t\t\tfunction lab2xyz(lab) {\n\t\t\t\tvar l = lab[0],\n\t\t\t\t a = lab[1],\n\t\t\t\t b = lab[2],\n\t\t\t\t x,\n\t\t\t\t y,\n\t\t\t\t z,\n\t\t\t\t y2;\n\n\t\t\t\tif (l <= 8) {\n\t\t\t\t\ty = l * 100 / 903.3;\n\t\t\t\t\ty2 = 7.787 * (y / 100) + 16 / 116;\n\t\t\t\t} else {\n\t\t\t\t\ty = 100 * Math.pow((l + 16) / 116, 3);\n\t\t\t\t\ty2 = Math.pow(y / 100, 1 / 3);\n\t\t\t\t}\n\n\t\t\t\tx = x / 95.047 <= 0.008856 ? x = 95.047 * (a / 500 + y2 - 16 / 116) / 7.787 : 95.047 * Math.pow(a / 500 + y2, 3);\n\n\t\t\t\tz = z / 108.883 <= 0.008859 ? z = 108.883 * (y2 - b / 200 - 16 / 116) / 7.787 : 108.883 * Math.pow(y2 - b / 200, 3);\n\n\t\t\t\treturn [x, y, z];\n\t\t\t}\n\n\t\t\tfunction lab2lch(lab) {\n\t\t\t\tvar l = lab[0],\n\t\t\t\t a = lab[1],\n\t\t\t\t b = lab[2],\n\t\t\t\t hr,\n\t\t\t\t h,\n\t\t\t\t c;\n\n\t\t\t\thr = Math.atan2(b, a);\n\t\t\t\th = hr * 360 / 2 / Math.PI;\n\t\t\t\tif (h < 0) {\n\t\t\t\t\th += 360;\n\t\t\t\t}\n\t\t\t\tc = Math.sqrt(a * a + b * b);\n\t\t\t\treturn [l, c, h];\n\t\t\t}\n\n\t\t\tfunction lab2rgb(args) {\n\t\t\t\treturn xyz2rgb(lab2xyz(args));\n\t\t\t}\n\n\t\t\tfunction lch2lab(lch) {\n\t\t\t\tvar l = lch[0],\n\t\t\t\t c = lch[1],\n\t\t\t\t h = lch[2],\n\t\t\t\t a,\n\t\t\t\t b,\n\t\t\t\t hr;\n\n\t\t\t\thr = h / 360 * 2 * Math.PI;\n\t\t\t\ta = c * Math.cos(hr);\n\t\t\t\tb = c * Math.sin(hr);\n\t\t\t\treturn [l, a, b];\n\t\t\t}\n\n\t\t\tfunction lch2xyz(args) {\n\t\t\t\treturn lab2xyz(lch2lab(args));\n\t\t\t}\n\n\t\t\tfunction lch2rgb(args) {\n\t\t\t\treturn lab2rgb(lch2lab(args));\n\t\t\t}\n\n\t\t\tfunction keyword2rgb(keyword) {\n\t\t\t\treturn cssKeywords[keyword];\n\t\t\t}\n\n\t\t\tfunction keyword2hsl(args) {\n\t\t\t\treturn rgb2hsl(keyword2rgb(args));\n\t\t\t}\n\n\t\t\tfunction keyword2hsv(args) {\n\t\t\t\treturn rgb2hsv(keyword2rgb(args));\n\t\t\t}\n\n\t\t\tfunction keyword2hwb(args) {\n\t\t\t\treturn rgb2hwb(keyword2rgb(args));\n\t\t\t}\n\n\t\t\tfunction keyword2cmyk(args) {\n\t\t\t\treturn rgb2cmyk(keyword2rgb(args));\n\t\t\t}\n\n\t\t\tfunction keyword2lab(args) {\n\t\t\t\treturn rgb2lab(keyword2rgb(args));\n\t\t\t}\n\n\t\t\tfunction keyword2xyz(args) {\n\t\t\t\treturn rgb2xyz(keyword2rgb(args));\n\t\t\t}\n\n\t\t\tvar cssKeywords = {\n\t\t\t\taliceblue: [240, 248, 255],\n\t\t\t\tantiquewhite: [250, 235, 215],\n\t\t\t\taqua: [0, 255, 255],\n\t\t\t\taquamarine: [127, 255, 212],\n\t\t\t\tazure: [240, 255, 255],\n\t\t\t\tbeige: [245, 245, 220],\n\t\t\t\tbisque: [255, 228, 196],\n\t\t\t\tblack: [0, 0, 0],\n\t\t\t\tblanchedalmond: [255, 235, 205],\n\t\t\t\tblue: [0, 0, 255],\n\t\t\t\tblueviolet: [138, 43, 226],\n\t\t\t\tbrown: [165, 42, 42],\n\t\t\t\tburlywood: [222, 184, 135],\n\t\t\t\tcadetblue: [95, 158, 160],\n\t\t\t\tchartreuse: [127, 255, 0],\n\t\t\t\tchocolate: [210, 105, 30],\n\t\t\t\tcoral: [255, 127, 80],\n\t\t\t\tcornflowerblue: [100, 149, 237],\n\t\t\t\tcornsilk: [255, 248, 220],\n\t\t\t\tcrimson: [220, 20, 60],\n\t\t\t\tcyan: [0, 255, 255],\n\t\t\t\tdarkblue: [0, 0, 139],\n\t\t\t\tdarkcyan: [0, 139, 139],\n\t\t\t\tdarkgoldenrod: [184, 134, 11],\n\t\t\t\tdarkgray: [169, 169, 169],\n\t\t\t\tdarkgreen: [0, 100, 0],\n\t\t\t\tdarkgrey: [169, 169, 169],\n\t\t\t\tdarkkhaki: [189, 183, 107],\n\t\t\t\tdarkmagenta: [139, 0, 139],\n\t\t\t\tdarkolivegreen: [85, 107, 47],\n\t\t\t\tdarkorange: [255, 140, 0],\n\t\t\t\tdarkorchid: [153, 50, 204],\n\t\t\t\tdarkred: [139, 0, 0],\n\t\t\t\tdarksalmon: [233, 150, 122],\n\t\t\t\tdarkseagreen: [143, 188, 143],\n\t\t\t\tdarkslateblue: [72, 61, 139],\n\t\t\t\tdarkslategray: [47, 79, 79],\n\t\t\t\tdarkslategrey: [47, 79, 79],\n\t\t\t\tdarkturquoise: [0, 206, 209],\n\t\t\t\tdarkviolet: [148, 0, 211],\n\t\t\t\tdeeppink: [255, 20, 147],\n\t\t\t\tdeepskyblue: [0, 191, 255],\n\t\t\t\tdimgray: [105, 105, 105],\n\t\t\t\tdimgrey: [105, 105, 105],\n\t\t\t\tdodgerblue: [30, 144, 255],\n\t\t\t\tfirebrick: [178, 34, 34],\n\t\t\t\tfloralwhite: [255, 250, 240],\n\t\t\t\tforestgreen: [34, 139, 34],\n\t\t\t\tfuchsia: [255, 0, 255],\n\t\t\t\tgainsboro: [220, 220, 220],\n\t\t\t\tghostwhite: [248, 248, 255],\n\t\t\t\tgold: [255, 215, 0],\n\t\t\t\tgoldenrod: [218, 165, 32],\n\t\t\t\tgray: [128, 128, 128],\n\t\t\t\tgreen: [0, 128, 0],\n\t\t\t\tgreenyellow: [173, 255, 47],\n\t\t\t\tgrey: [128, 128, 128],\n\t\t\t\thoneydew: [240, 255, 240],\n\t\t\t\thotpink: [255, 105, 180],\n\t\t\t\tindianred: [205, 92, 92],\n\t\t\t\tindigo: [75, 0, 130],\n\t\t\t\tivory: [255, 255, 240],\n\t\t\t\tkhaki: [240, 230, 140],\n\t\t\t\tlavender: [230, 230, 250],\n\t\t\t\tlavenderblush: [255, 240, 245],\n\t\t\t\tlawngreen: [124, 252, 0],\n\t\t\t\tlemonchiffon: [255, 250, 205],\n\t\t\t\tlightblue: [173, 216, 230],\n\t\t\t\tlightcoral: [240, 128, 128],\n\t\t\t\tlightcyan: [224, 255, 255],\n\t\t\t\tlightgoldenrodyellow: [250, 250, 210],\n\t\t\t\tlightgray: [211, 211, 211],\n\t\t\t\tlightgreen: [144, 238, 144],\n\t\t\t\tlightgrey: [211, 211, 211],\n\t\t\t\tlightpink: [255, 182, 193],\n\t\t\t\tlightsalmon: [255, 160, 122],\n\t\t\t\tlightseagreen: [32, 178, 170],\n\t\t\t\tlightskyblue: [135, 206, 250],\n\t\t\t\tlightslategray: [119, 136, 153],\n\t\t\t\tlightslategrey: [119, 136, 153],\n\t\t\t\tlightsteelblue: [176, 196, 222],\n\t\t\t\tlightyellow: [255, 255, 224],\n\t\t\t\tlime: [0, 255, 0],\n\t\t\t\tlimegreen: [50, 205, 50],\n\t\t\t\tlinen: [250, 240, 230],\n\t\t\t\tmagenta: [255, 0, 255],\n\t\t\t\tmaroon: [128, 0, 0],\n\t\t\t\tmediumaquamarine: [102, 205, 170],\n\t\t\t\tmediumblue: [0, 0, 205],\n\t\t\t\tmediumorchid: [186, 85, 211],\n\t\t\t\tmediumpurple: [147, 112, 219],\n\t\t\t\tmediumseagreen: [60, 179, 113],\n\t\t\t\tmediumslateblue: [123, 104, 238],\n\t\t\t\tmediumspringgreen: [0, 250, 154],\n\t\t\t\tmediumturquoise: [72, 209, 204],\n\t\t\t\tmediumvioletred: [199, 21, 133],\n\t\t\t\tmidnightblue: [25, 25, 112],\n\t\t\t\tmintcream: [245, 255, 250],\n\t\t\t\tmistyrose: [255, 228, 225],\n\t\t\t\tmoccasin: [255, 228, 181],\n\t\t\t\tnavajowhite: [255, 222, 173],\n\t\t\t\tnavy: [0, 0, 128],\n\t\t\t\toldlace: [253, 245, 230],\n\t\t\t\tolive: [128, 128, 0],\n\t\t\t\tolivedrab: [107, 142, 35],\n\t\t\t\torange: [255, 165, 0],\n\t\t\t\torangered: [255, 69, 0],\n\t\t\t\torchid: [218, 112, 214],\n\t\t\t\tpalegoldenrod: [238, 232, 170],\n\t\t\t\tpalegreen: [152, 251, 152],\n\t\t\t\tpaleturquoise: [175, 238, 238],\n\t\t\t\tpalevioletred: [219, 112, 147],\n\t\t\t\tpapayawhip: [255, 239, 213],\n\t\t\t\tpeachpuff: [255, 218, 185],\n\t\t\t\tperu: [205, 133, 63],\n\t\t\t\tpink: [255, 192, 203],\n\t\t\t\tplum: [221, 160, 221],\n\t\t\t\tpowderblue: [176, 224, 230],\n\t\t\t\tpurple: [128, 0, 128],\n\t\t\t\trebeccapurple: [102, 51, 153],\n\t\t\t\tred: [255, 0, 0],\n\t\t\t\trosybrown: [188, 143, 143],\n\t\t\t\troyalblue: [65, 105, 225],\n\t\t\t\tsaddlebrown: [139, 69, 19],\n\t\t\t\tsalmon: [250, 128, 114],\n\t\t\t\tsandybrown: [244, 164, 96],\n\t\t\t\tseagreen: [46, 139, 87],\n\t\t\t\tseashell: [255, 245, 238],\n\t\t\t\tsienna: [160, 82, 45],\n\t\t\t\tsilver: [192, 192, 192],\n\t\t\t\tskyblue: [135, 206, 235],\n\t\t\t\tslateblue: [106, 90, 205],\n\t\t\t\tslategray: [112, 128, 144],\n\t\t\t\tslategrey: [112, 128, 144],\n\t\t\t\tsnow: [255, 250, 250],\n\t\t\t\tspringgreen: [0, 255, 127],\n\t\t\t\tsteelblue: [70, 130, 180],\n\t\t\t\ttan: [210, 180, 140],\n\t\t\t\tteal: [0, 128, 128],\n\t\t\t\tthistle: [216, 191, 216],\n\t\t\t\ttomato: [255, 99, 71],\n\t\t\t\tturquoise: [64, 224, 208],\n\t\t\t\tviolet: [238, 130, 238],\n\t\t\t\twheat: [245, 222, 179],\n\t\t\t\twhite: [255, 255, 255],\n\t\t\t\twhitesmoke: [245, 245, 245],\n\t\t\t\tyellow: [255, 255, 0],\n\t\t\t\tyellowgreen: [154, 205, 50]\n\t\t\t};\n\n\t\t\tvar reverseKeywords = {};\n\t\t\tfor (var key in cssKeywords) {\n\t\t\t\treverseKeywords[JSON.stringify(cssKeywords[key])] = key;\n\t\t\t}\n\t\t}, {}], 5: [function (require, module, exports) {\n\t\t\tvar conversions = require(4);\n\n\t\t\tvar convert = function convert() {\n\t\t\t\treturn new Converter();\n\t\t\t};\n\n\t\t\tfor (var func in conversions) {\n\t\t\t\t// export Raw versions\n\t\t\t\tconvert[func + \"Raw\"] = function (func) {\n\t\t\t\t\t// accept array or plain args\n\t\t\t\t\treturn function (arg) {\n\t\t\t\t\t\tif (typeof arg == \"number\") arg = Array.prototype.slice.call(arguments);\n\t\t\t\t\t\treturn conversions[func](arg);\n\t\t\t\t\t};\n\t\t\t\t}(func);\n\n\t\t\t\tvar pair = /(\\w+)2(\\w+)/.exec(func),\n\t\t\t\t from = pair[1],\n\t\t\t\t to = pair[2];\n\n\t\t\t\t// export rgb2hsl and [\"rgb\"][\"hsl\"]\n\t\t\t\tconvert[from] = convert[from] || {};\n\n\t\t\t\tconvert[from][to] = convert[func] = function (func) {\n\t\t\t\t\treturn function (arg) {\n\t\t\t\t\t\tif (typeof arg == \"number\") arg = Array.prototype.slice.call(arguments);\n\n\t\t\t\t\t\tvar val = conversions[func](arg);\n\t\t\t\t\t\tif (typeof val == \"string\" || val === undefined) return val; // keyword\n\n\t\t\t\t\t\tfor (var i = 0; i < val.length; i++) {\n\t\t\t\t\t\t\tval[i] = Math.round(val[i]);\n\t\t\t\t\t\t}return val;\n\t\t\t\t\t};\n\t\t\t\t}(func);\n\t\t\t}\n\n\t\t\t/* Converter does lazy conversion and caching */\n\t\t\tvar Converter = function Converter() {\n\t\t\t\tthis.convs = {};\n\t\t\t};\n\n\t\t\t/* Either get the values for a space or\n set the values for a space, depending on args */\n\t\t\tConverter.prototype.routeSpace = function (space, args) {\n\t\t\t\tvar values = args[0];\n\t\t\t\tif (values === undefined) {\n\t\t\t\t\t// color.rgb()\n\t\t\t\t\treturn this.getValues(space);\n\t\t\t\t}\n\t\t\t\t// color.rgb(10, 10, 10)\n\t\t\t\tif (typeof values == \"number\") {\n\t\t\t\t\tvalues = Array.prototype.slice.call(args);\n\t\t\t\t}\n\n\t\t\t\treturn this.setValues(space, values);\n\t\t\t};\n\n\t\t\t/* Set the values for a space, invalidating cache */\n\t\t\tConverter.prototype.setValues = function (space, values) {\n\t\t\t\tthis.space = space;\n\t\t\t\tthis.convs = {};\n\t\t\t\tthis.convs[space] = values;\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t/* Get the values for a space. If there's already\n a conversion for the space, fetch it, otherwise\n compute it */\n\t\t\tConverter.prototype.getValues = function (space) {\n\t\t\t\tvar vals = this.convs[space];\n\t\t\t\tif (!vals) {\n\t\t\t\t\tvar fspace = this.space,\n\t\t\t\t\t from = this.convs[fspace];\n\t\t\t\t\tvals = convert[fspace][space](from);\n\n\t\t\t\t\tthis.convs[space] = vals;\n\t\t\t\t}\n\t\t\t\treturn vals;\n\t\t\t};\n\n\t\t\t[\"rgb\", \"hsl\", \"hsv\", \"cmyk\", \"keyword\"].forEach(function (space) {\n\t\t\t\tConverter.prototype[space] = function (vals) {\n\t\t\t\t\treturn this.routeSpace(space, arguments);\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tmodule.exports = convert;\n\t\t}, { \"4\": 4 }], 6: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = {\n\t\t\t\t\"aliceblue\": [240, 248, 255],\n\t\t\t\t\"antiquewhite\": [250, 235, 215],\n\t\t\t\t\"aqua\": [0, 255, 255],\n\t\t\t\t\"aquamarine\": [127, 255, 212],\n\t\t\t\t\"azure\": [240, 255, 255],\n\t\t\t\t\"beige\": [245, 245, 220],\n\t\t\t\t\"bisque\": [255, 228, 196],\n\t\t\t\t\"black\": [0, 0, 0],\n\t\t\t\t\"blanchedalmond\": [255, 235, 205],\n\t\t\t\t\"blue\": [0, 0, 255],\n\t\t\t\t\"blueviolet\": [138, 43, 226],\n\t\t\t\t\"brown\": [165, 42, 42],\n\t\t\t\t\"burlywood\": [222, 184, 135],\n\t\t\t\t\"cadetblue\": [95, 158, 160],\n\t\t\t\t\"chartreuse\": [127, 255, 0],\n\t\t\t\t\"chocolate\": [210, 105, 30],\n\t\t\t\t\"coral\": [255, 127, 80],\n\t\t\t\t\"cornflowerblue\": [100, 149, 237],\n\t\t\t\t\"cornsilk\": [255, 248, 220],\n\t\t\t\t\"crimson\": [220, 20, 60],\n\t\t\t\t\"cyan\": [0, 255, 255],\n\t\t\t\t\"darkblue\": [0, 0, 139],\n\t\t\t\t\"darkcyan\": [0, 139, 139],\n\t\t\t\t\"darkgoldenrod\": [184, 134, 11],\n\t\t\t\t\"darkgray\": [169, 169, 169],\n\t\t\t\t\"darkgreen\": [0, 100, 0],\n\t\t\t\t\"darkgrey\": [169, 169, 169],\n\t\t\t\t\"darkkhaki\": [189, 183, 107],\n\t\t\t\t\"darkmagenta\": [139, 0, 139],\n\t\t\t\t\"darkolivegreen\": [85, 107, 47],\n\t\t\t\t\"darkorange\": [255, 140, 0],\n\t\t\t\t\"darkorchid\": [153, 50, 204],\n\t\t\t\t\"darkred\": [139, 0, 0],\n\t\t\t\t\"darksalmon\": [233, 150, 122],\n\t\t\t\t\"darkseagreen\": [143, 188, 143],\n\t\t\t\t\"darkslateblue\": [72, 61, 139],\n\t\t\t\t\"darkslategray\": [47, 79, 79],\n\t\t\t\t\"darkslategrey\": [47, 79, 79],\n\t\t\t\t\"darkturquoise\": [0, 206, 209],\n\t\t\t\t\"darkviolet\": [148, 0, 211],\n\t\t\t\t\"deeppink\": [255, 20, 147],\n\t\t\t\t\"deepskyblue\": [0, 191, 255],\n\t\t\t\t\"dimgray\": [105, 105, 105],\n\t\t\t\t\"dimgrey\": [105, 105, 105],\n\t\t\t\t\"dodgerblue\": [30, 144, 255],\n\t\t\t\t\"firebrick\": [178, 34, 34],\n\t\t\t\t\"floralwhite\": [255, 250, 240],\n\t\t\t\t\"forestgreen\": [34, 139, 34],\n\t\t\t\t\"fuchsia\": [255, 0, 255],\n\t\t\t\t\"gainsboro\": [220, 220, 220],\n\t\t\t\t\"ghostwhite\": [248, 248, 255],\n\t\t\t\t\"gold\": [255, 215, 0],\n\t\t\t\t\"goldenrod\": [218, 165, 32],\n\t\t\t\t\"gray\": [128, 128, 128],\n\t\t\t\t\"green\": [0, 128, 0],\n\t\t\t\t\"greenyellow\": [173, 255, 47],\n\t\t\t\t\"grey\": [128, 128, 128],\n\t\t\t\t\"honeydew\": [240, 255, 240],\n\t\t\t\t\"hotpink\": [255, 105, 180],\n\t\t\t\t\"indianred\": [205, 92, 92],\n\t\t\t\t\"indigo\": [75, 0, 130],\n\t\t\t\t\"ivory\": [255, 255, 240],\n\t\t\t\t\"khaki\": [240, 230, 140],\n\t\t\t\t\"lavender\": [230, 230, 250],\n\t\t\t\t\"lavenderblush\": [255, 240, 245],\n\t\t\t\t\"lawngreen\": [124, 252, 0],\n\t\t\t\t\"lemonchiffon\": [255, 250, 205],\n\t\t\t\t\"lightblue\": [173, 216, 230],\n\t\t\t\t\"lightcoral\": [240, 128, 128],\n\t\t\t\t\"lightcyan\": [224, 255, 255],\n\t\t\t\t\"lightgoldenrodyellow\": [250, 250, 210],\n\t\t\t\t\"lightgray\": [211, 211, 211],\n\t\t\t\t\"lightgreen\": [144, 238, 144],\n\t\t\t\t\"lightgrey\": [211, 211, 211],\n\t\t\t\t\"lightpink\": [255, 182, 193],\n\t\t\t\t\"lightsalmon\": [255, 160, 122],\n\t\t\t\t\"lightseagreen\": [32, 178, 170],\n\t\t\t\t\"lightskyblue\": [135, 206, 250],\n\t\t\t\t\"lightslategray\": [119, 136, 153],\n\t\t\t\t\"lightslategrey\": [119, 136, 153],\n\t\t\t\t\"lightsteelblue\": [176, 196, 222],\n\t\t\t\t\"lightyellow\": [255, 255, 224],\n\t\t\t\t\"lime\": [0, 255, 0],\n\t\t\t\t\"limegreen\": [50, 205, 50],\n\t\t\t\t\"linen\": [250, 240, 230],\n\t\t\t\t\"magenta\": [255, 0, 255],\n\t\t\t\t\"maroon\": [128, 0, 0],\n\t\t\t\t\"mediumaquamarine\": [102, 205, 170],\n\t\t\t\t\"mediumblue\": [0, 0, 205],\n\t\t\t\t\"mediumorchid\": [186, 85, 211],\n\t\t\t\t\"mediumpurple\": [147, 112, 219],\n\t\t\t\t\"mediumseagreen\": [60, 179, 113],\n\t\t\t\t\"mediumslateblue\": [123, 104, 238],\n\t\t\t\t\"mediumspringgreen\": [0, 250, 154],\n\t\t\t\t\"mediumturquoise\": [72, 209, 204],\n\t\t\t\t\"mediumvioletred\": [199, 21, 133],\n\t\t\t\t\"midnightblue\": [25, 25, 112],\n\t\t\t\t\"mintcream\": [245, 255, 250],\n\t\t\t\t\"mistyrose\": [255, 228, 225],\n\t\t\t\t\"moccasin\": [255, 228, 181],\n\t\t\t\t\"navajowhite\": [255, 222, 173],\n\t\t\t\t\"navy\": [0, 0, 128],\n\t\t\t\t\"oldlace\": [253, 245, 230],\n\t\t\t\t\"olive\": [128, 128, 0],\n\t\t\t\t\"olivedrab\": [107, 142, 35],\n\t\t\t\t\"orange\": [255, 165, 0],\n\t\t\t\t\"orangered\": [255, 69, 0],\n\t\t\t\t\"orchid\": [218, 112, 214],\n\t\t\t\t\"palegoldenrod\": [238, 232, 170],\n\t\t\t\t\"palegreen\": [152, 251, 152],\n\t\t\t\t\"paleturquoise\": [175, 238, 238],\n\t\t\t\t\"palevioletred\": [219, 112, 147],\n\t\t\t\t\"papayawhip\": [255, 239, 213],\n\t\t\t\t\"peachpuff\": [255, 218, 185],\n\t\t\t\t\"peru\": [205, 133, 63],\n\t\t\t\t\"pink\": [255, 192, 203],\n\t\t\t\t\"plum\": [221, 160, 221],\n\t\t\t\t\"powderblue\": [176, 224, 230],\n\t\t\t\t\"purple\": [128, 0, 128],\n\t\t\t\t\"rebeccapurple\": [102, 51, 153],\n\t\t\t\t\"red\": [255, 0, 0],\n\t\t\t\t\"rosybrown\": [188, 143, 143],\n\t\t\t\t\"royalblue\": [65, 105, 225],\n\t\t\t\t\"saddlebrown\": [139, 69, 19],\n\t\t\t\t\"salmon\": [250, 128, 114],\n\t\t\t\t\"sandybrown\": [244, 164, 96],\n\t\t\t\t\"seagreen\": [46, 139, 87],\n\t\t\t\t\"seashell\": [255, 245, 238],\n\t\t\t\t\"sienna\": [160, 82, 45],\n\t\t\t\t\"silver\": [192, 192, 192],\n\t\t\t\t\"skyblue\": [135, 206, 235],\n\t\t\t\t\"slateblue\": [106, 90, 205],\n\t\t\t\t\"slategray\": [112, 128, 144],\n\t\t\t\t\"slategrey\": [112, 128, 144],\n\t\t\t\t\"snow\": [255, 250, 250],\n\t\t\t\t\"springgreen\": [0, 255, 127],\n\t\t\t\t\"steelblue\": [70, 130, 180],\n\t\t\t\t\"tan\": [210, 180, 140],\n\t\t\t\t\"teal\": [0, 128, 128],\n\t\t\t\t\"thistle\": [216, 191, 216],\n\t\t\t\t\"tomato\": [255, 99, 71],\n\t\t\t\t\"turquoise\": [64, 224, 208],\n\t\t\t\t\"violet\": [238, 130, 238],\n\t\t\t\t\"wheat\": [245, 222, 179],\n\t\t\t\t\"white\": [255, 255, 255],\n\t\t\t\t\"whitesmoke\": [245, 245, 245],\n\t\t\t\t\"yellow\": [255, 255, 0],\n\t\t\t\t\"yellowgreen\": [154, 205, 50]\n\t\t\t};\n\t\t}, {}], 7: [function (require, module, exports) {\n\t\t\t/**\n * @namespace Chart\n */\n\t\t\tvar Chart = require(30)();\n\n\t\t\tChart.helpers = require(46);\n\n\t\t\t// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!\n\t\t\trequire(28)(Chart);\n\n\t\t\tChart.Animation = require(22);\n\t\t\tChart.animationService = require(23);\n\t\t\tChart.defaults = require(26);\n\t\t\tChart.Element = require(27);\n\t\t\tChart.elements = require(41);\n\t\t\tChart.Interaction = require(29);\n\t\t\tChart.layouts = require(31);\n\t\t\tChart.platform = require(49);\n\t\t\tChart.plugins = require(32);\n\t\t\tChart.Scale = require(33);\n\t\t\tChart.scaleService = require(34);\n\t\t\tChart.Ticks = require(35);\n\t\t\tChart.Tooltip = require(36);\n\n\t\t\trequire(24)(Chart);\n\t\t\trequire(25)(Chart);\n\n\t\t\trequire(56)(Chart);\n\t\t\trequire(54)(Chart);\n\t\t\trequire(55)(Chart);\n\t\t\trequire(57)(Chart);\n\t\t\trequire(58)(Chart);\n\t\t\trequire(59)(Chart);\n\n\t\t\t// Controllers must be loaded after elements\n\t\t\t// See Chart.core.datasetController.dataElementType\n\t\t\trequire(15)(Chart);\n\t\t\trequire(16)(Chart);\n\t\t\trequire(17)(Chart);\n\t\t\trequire(18)(Chart);\n\t\t\trequire(19)(Chart);\n\t\t\trequire(20)(Chart);\n\t\t\trequire(21)(Chart);\n\n\t\t\trequire(8)(Chart);\n\t\t\trequire(9)(Chart);\n\t\t\trequire(10)(Chart);\n\t\t\trequire(11)(Chart);\n\t\t\trequire(12)(Chart);\n\t\t\trequire(13)(Chart);\n\t\t\trequire(14)(Chart);\n\n\t\t\t// Loading built-in plugins\n\t\t\tvar plugins = require(50);\n\t\t\tfor (var k in plugins) {\n\t\t\t\tif (plugins.hasOwnProperty(k)) {\n\t\t\t\t\tChart.plugins.register(plugins[k]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tChart.platform.initialize();\n\n\t\t\tmodule.exports = Chart;\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\twindow.Chart = Chart;\n\t\t\t}\n\n\t\t\t// DEPRECATIONS\n\n\t\t\t/**\n * Provided for backward compatibility, not available anymore\n * @namespace Chart.Legend\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\n\t\t\tChart.Legend = plugins.legend._element;\n\n\t\t\t/**\n * Provided for backward compatibility, not available anymore\n * @namespace Chart.Title\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\n\t\t\tChart.Title = plugins.title._element;\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.plugins instead\n * @namespace Chart.pluginService\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\n\t\t\tChart.pluginService = Chart.plugins;\n\n\t\t\t/**\n * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\n * effect, instead simply create/register plugins via plain JavaScript objects.\n * @interface Chart.PluginBase\n * @deprecated since version 2.5.0\n * @todo remove at version 3\n * @private\n */\n\t\t\tChart.PluginBase = Chart.Element.extend({});\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.helpers.canvas instead.\n * @namespace Chart.canvasHelpers\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n\t\t\tChart.canvasHelpers = Chart.helpers.canvas;\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.layouts instead.\n * @namespace Chart.layoutService\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n * @private\n */\n\t\t\tChart.layoutService = Chart.layouts;\n\t\t}, { \"10\": 10, \"11\": 11, \"12\": 12, \"13\": 13, \"14\": 14, \"15\": 15, \"16\": 16, \"17\": 17, \"18\": 18, \"19\": 19, \"20\": 20, \"21\": 21, \"22\": 22, \"23\": 23, \"24\": 24, \"25\": 25, \"26\": 26, \"27\": 27, \"28\": 28, \"29\": 29, \"30\": 30, \"31\": 31, \"32\": 32, \"33\": 33, \"34\": 34, \"35\": 35, \"36\": 36, \"41\": 41, \"46\": 46, \"49\": 49, \"50\": 50, \"54\": 54, \"55\": 55, \"56\": 56, \"57\": 57, \"58\": 58, \"59\": 59, \"8\": 8, \"9\": 9 }], 8: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.Bar = function (context, config) {\n\t\t\t\t\tconfig.type = 'bar';\n\n\t\t\t\t\treturn new Chart(context, config);\n\t\t\t\t};\n\t\t\t};\n\t\t}, {}], 9: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.Bubble = function (context, config) {\n\t\t\t\t\tconfig.type = 'bubble';\n\t\t\t\t\treturn new Chart(context, config);\n\t\t\t\t};\n\t\t\t};\n\t\t}, {}], 10: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.Doughnut = function (context, config) {\n\t\t\t\t\tconfig.type = 'doughnut';\n\n\t\t\t\t\treturn new Chart(context, config);\n\t\t\t\t};\n\t\t\t};\n\t\t}, {}], 11: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.Line = function (context, config) {\n\t\t\t\t\tconfig.type = 'line';\n\n\t\t\t\t\treturn new Chart(context, config);\n\t\t\t\t};\n\t\t\t};\n\t\t}, {}], 12: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.PolarArea = function (context, config) {\n\t\t\t\t\tconfig.type = 'polarArea';\n\n\t\t\t\t\treturn new Chart(context, config);\n\t\t\t\t};\n\t\t\t};\n\t\t}, {}], 13: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.Radar = function (context, config) {\n\t\t\t\t\tconfig.type = 'radar';\n\n\t\t\t\t\treturn new Chart(context, config);\n\t\t\t\t};\n\t\t\t};\n\t\t}, {}], 14: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = function (Chart) {\n\t\t\t\tChart.Scatter = function (context, config) {\n\t\t\t\t\tconfig.type = 'scatter';\n\t\t\t\t\treturn new Chart(context, config);\n\t\t\t\t};\n\t\t\t};\n\t\t}, {}], 15: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar elements = require(41);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('bar', {\n\t\t\t\thover: {\n\t\t\t\t\tmode: 'label'\n\t\t\t\t},\n\n\t\t\t\tscales: {\n\t\t\t\t\txAxes: [{\n\t\t\t\t\t\ttype: 'category',\n\n\t\t\t\t\t\t// Specific to Bar Controller\n\t\t\t\t\t\tcategoryPercentage: 0.8,\n\t\t\t\t\t\tbarPercentage: 0.9,\n\n\t\t\t\t\t\t// offset settings\n\t\t\t\t\t\toffset: true,\n\n\t\t\t\t\t\t// grid line settings\n\t\t\t\t\t\tgridLines: {\n\t\t\t\t\t\t\toffsetGridLines: true\n\t\t\t\t\t\t}\n\t\t\t\t\t}],\n\n\t\t\t\t\tyAxes: [{\n\t\t\t\t\t\ttype: 'linear'\n\t\t\t\t\t}]\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdefaults._set('horizontalBar', {\n\t\t\t\thover: {\n\t\t\t\t\tmode: 'index',\n\t\t\t\t\taxis: 'y'\n\t\t\t\t},\n\n\t\t\t\tscales: {\n\t\t\t\t\txAxes: [{\n\t\t\t\t\t\ttype: 'linear',\n\t\t\t\t\t\tposition: 'bottom'\n\t\t\t\t\t}],\n\n\t\t\t\t\tyAxes: [{\n\t\t\t\t\t\tposition: 'left',\n\t\t\t\t\t\ttype: 'category',\n\n\t\t\t\t\t\t// Specific to Horizontal Bar Controller\n\t\t\t\t\t\tcategoryPercentage: 0.8,\n\t\t\t\t\t\tbarPercentage: 0.9,\n\n\t\t\t\t\t\t// offset settings\n\t\t\t\t\t\toffset: true,\n\n\t\t\t\t\t\t// grid line settings\n\t\t\t\t\t\tgridLines: {\n\t\t\t\t\t\t\toffsetGridLines: true\n\t\t\t\t\t\t}\n\t\t\t\t\t}]\n\t\t\t\t},\n\n\t\t\t\telements: {\n\t\t\t\t\trectangle: {\n\t\t\t\t\t\tborderSkipped: 'left'\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\ttooltips: {\n\t\t\t\t\tcallbacks: {\n\t\t\t\t\t\ttitle: function title(item, data) {\n\t\t\t\t\t\t\t// Pick first xLabel for now\n\t\t\t\t\t\t\tvar title = '';\n\n\t\t\t\t\t\t\tif (item.length > 0) {\n\t\t\t\t\t\t\t\tif (item[0].yLabel) {\n\t\t\t\t\t\t\t\t\ttitle = item[0].yLabel;\n\t\t\t\t\t\t\t\t} else if (data.labels.length > 0 && item[0].index < data.labels.length) {\n\t\t\t\t\t\t\t\t\ttitle = data.labels[item[0].index];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn title;\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tlabel: function label(item, data) {\n\t\t\t\t\t\t\tvar datasetLabel = data.datasets[item.datasetIndex].label || '';\n\t\t\t\t\t\t\treturn datasetLabel + ': ' + item.xLabel;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tmode: 'index',\n\t\t\t\t\taxis: 'y'\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\n\t\t\tfunction computeMinSampleSize(scale, pixels) {\n\t\t\t\tvar min = scale.isHorizontal() ? scale.width : scale.height;\n\t\t\t\tvar ticks = scale.getTicks();\n\t\t\t\tvar prev, curr, i, ilen;\n\n\t\t\t\tfor (i = 1, ilen = pixels.length; i < ilen; ++i) {\n\t\t\t\t\tmin = Math.min(min, pixels[i] - pixels[i - 1]);\n\t\t\t\t}\n\n\t\t\t\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\t\t\t\tcurr = scale.getPixelForTick(i);\n\t\t\t\t\tmin = i > 0 ? Math.min(min, curr - prev) : min;\n\t\t\t\t\tprev = curr;\n\t\t\t\t}\n\n\t\t\t\treturn min;\n\t\t\t}\n\n\t\t\t/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\n\t\t\tfunction computeFitCategoryTraits(index, ruler, options) {\n\t\t\t\tvar thickness = options.barThickness;\n\t\t\t\tvar count = ruler.stackCount;\n\t\t\t\tvar curr = ruler.pixels[index];\n\t\t\t\tvar size, ratio;\n\n\t\t\t\tif (helpers.isNullOrUndef(thickness)) {\n\t\t\t\t\tsize = ruler.min * options.categoryPercentage;\n\t\t\t\t\tratio = options.barPercentage;\n\t\t\t\t} else {\n\t\t\t\t\t// When bar thickness is enforced, category and bar percentages are ignored.\n\t\t\t\t\t// Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n\t\t\t\t\t// and deprecate barPercentage since this value is ignored when thickness is absolute.\n\t\t\t\t\tsize = thickness * count;\n\t\t\t\t\tratio = 1;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tchunk: size / count,\n\t\t\t\t\tratio: ratio,\n\t\t\t\t\tstart: curr - size / 2\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\n\t\t\tfunction computeFlexCategoryTraits(index, ruler, options) {\n\t\t\t\tvar pixels = ruler.pixels;\n\t\t\t\tvar curr = pixels[index];\n\t\t\t\tvar prev = index > 0 ? pixels[index - 1] : null;\n\t\t\t\tvar next = index < pixels.length - 1 ? pixels[index + 1] : null;\n\t\t\t\tvar percent = options.categoryPercentage;\n\t\t\t\tvar start, size;\n\n\t\t\t\tif (prev === null) {\n\t\t\t\t\t// first data: its size is double based on the next point or,\n\t\t\t\t\t// if it's also the last data, we use the scale end extremity.\n\t\t\t\t\tprev = curr - (next === null ? ruler.end - curr : next - curr);\n\t\t\t\t}\n\n\t\t\t\tif (next === null) {\n\t\t\t\t\t// last data: its size is also double based on the previous point.\n\t\t\t\t\tnext = curr + curr - prev;\n\t\t\t\t}\n\n\t\t\t\tstart = curr - (curr - prev) / 2 * percent;\n\t\t\t\tsize = (next - prev) / 2 * percent;\n\n\t\t\t\treturn {\n\t\t\t\t\tchunk: size / ruler.stackCount,\n\t\t\t\t\tratio: options.barPercentage,\n\t\t\t\t\tstart: start\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.controllers.bar = Chart.DatasetController.extend({\n\n\t\t\t\t\tdataElementType: elements.Rectangle,\n\n\t\t\t\t\tinitialize: function initialize() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta;\n\n\t\t\t\t\t\tChart.DatasetController.prototype.initialize.apply(me, arguments);\n\n\t\t\t\t\t\tmeta = me.getMeta();\n\t\t\t\t\t\tmeta.stack = me.getDataset().stack;\n\t\t\t\t\t\tmeta.bar = true;\n\t\t\t\t\t},\n\n\t\t\t\t\tupdate: function update(reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar rects = me.getMeta().data;\n\t\t\t\t\t\tvar i, ilen;\n\n\t\t\t\t\t\tme._ruler = me.getRuler();\n\n\t\t\t\t\t\tfor (i = 0, ilen = rects.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tme.updateElement(rects[i], i, reset);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tupdateElement: function updateElement(rectangle, index, reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar custom = rectangle.custom || {};\n\t\t\t\t\t\tvar rectangleOptions = chart.options.elements.rectangle;\n\n\t\t\t\t\t\trectangle._xScale = me.getScaleForId(meta.xAxisID);\n\t\t\t\t\t\trectangle._yScale = me.getScaleForId(meta.yAxisID);\n\t\t\t\t\t\trectangle._datasetIndex = me.index;\n\t\t\t\t\t\trectangle._index = index;\n\n\t\t\t\t\t\trectangle._model = {\n\t\t\t\t\t\t\tdatasetLabel: dataset.label,\n\t\t\t\t\t\t\tlabel: chart.data.labels[index],\n\t\t\t\t\t\t\tborderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped,\n\t\t\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor),\n\t\t\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor),\n\t\t\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth)\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tme.updateElementGeometry(rectangle, index, reset);\n\n\t\t\t\t\t\trectangle.pivot();\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tupdateElementGeometry: function updateElementGeometry(rectangle, index, reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar model = rectangle._model;\n\t\t\t\t\t\tvar vscale = me.getValueScale();\n\t\t\t\t\t\tvar base = vscale.getBasePixel();\n\t\t\t\t\t\tvar horizontal = vscale.isHorizontal();\n\t\t\t\t\t\tvar ruler = me._ruler || me.getRuler();\n\t\t\t\t\t\tvar vpixels = me.calculateBarValuePixels(me.index, index);\n\t\t\t\t\t\tvar ipixels = me.calculateBarIndexPixels(me.index, index, ruler);\n\n\t\t\t\t\t\tmodel.horizontal = horizontal;\n\t\t\t\t\t\tmodel.base = reset ? base : vpixels.base;\n\t\t\t\t\t\tmodel.x = horizontal ? reset ? base : vpixels.head : ipixels.center;\n\t\t\t\t\t\tmodel.y = horizontal ? ipixels.center : reset ? base : vpixels.head;\n\t\t\t\t\t\tmodel.height = horizontal ? ipixels.size : undefined;\n\t\t\t\t\t\tmodel.width = horizontal ? undefined : ipixels.size;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetValueScaleId: function getValueScaleId() {\n\t\t\t\t\t\treturn this.getMeta().yAxisID;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetIndexScaleId: function getIndexScaleId() {\n\t\t\t\t\t\treturn this.getMeta().xAxisID;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetValueScale: function getValueScale() {\n\t\t\t\t\t\treturn this.getScaleForId(this.getValueScaleId());\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetIndexScale: function getIndexScale() {\n\t\t\t\t\t\treturn this.getScaleForId(this.getIndexScaleId());\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Returns the stacks based on groups and bar visibility.\n * @param {Number} [last] - The dataset index\n * @returns {Array} The stack list\n * @private\n */\n\t\t\t\t\t_getStacks: function _getStacks(last) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar scale = me.getIndexScale();\n\t\t\t\t\t\tvar stacked = scale.options.stacked;\n\t\t\t\t\t\tvar ilen = last === undefined ? chart.data.datasets.length : last + 1;\n\t\t\t\t\t\tvar stacks = [];\n\t\t\t\t\t\tvar i, meta;\n\n\t\t\t\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\t\t\tif (meta.bar && chart.isDatasetVisible(i) && (stacked === false || stacked === true && stacks.indexOf(meta.stack) === -1 || stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1))) {\n\t\t\t\t\t\t\t\tstacks.push(meta.stack);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn stacks;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Returns the effective number of stacks based on groups and bar visibility.\n * @private\n */\n\t\t\t\t\tgetStackCount: function getStackCount() {\n\t\t\t\t\t\treturn this._getStacks().length;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Returns the stack index for the given dataset based on groups and bar visibility.\n * @param {Number} [datasetIndex] - The dataset index\n * @param {String} [name] - The stack name to find\n * @returns {Number} The stack index\n * @private\n */\n\t\t\t\t\tgetStackIndex: function getStackIndex(datasetIndex, name) {\n\t\t\t\t\t\tvar stacks = this._getStacks(datasetIndex);\n\t\t\t\t\t\tvar index = name !== undefined ? stacks.indexOf(name) : -1; // indexOf returns -1 if element is not present\n\n\t\t\t\t\t\treturn index === -1 ? stacks.length - 1 : index;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetRuler: function getRuler() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar scale = me.getIndexScale();\n\t\t\t\t\t\tvar stackCount = me.getStackCount();\n\t\t\t\t\t\tvar datasetIndex = me.index;\n\t\t\t\t\t\tvar isHorizontal = scale.isHorizontal();\n\t\t\t\t\t\tvar start = isHorizontal ? scale.left : scale.top;\n\t\t\t\t\t\tvar end = start + (isHorizontal ? scale.width : scale.height);\n\t\t\t\t\t\tvar pixels = [];\n\t\t\t\t\t\tvar i, ilen, min;\n\n\t\t\t\t\t\tfor (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tpixels.push(scale.getPixelForValue(null, i, datasetIndex));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmin = helpers.isNullOrUndef(scale.options.barThickness) ? computeMinSampleSize(scale, pixels) : -1;\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tmin: min,\n\t\t\t\t\t\t\tpixels: pixels,\n\t\t\t\t\t\t\tstart: start,\n\t\t\t\t\t\t\tend: end,\n\t\t\t\t\t\t\tstackCount: stackCount,\n\t\t\t\t\t\t\tscale: scale\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Note: pixel values are not clamped to the scale area.\n * @private\n */\n\t\t\t\t\tcalculateBarValuePixels: function calculateBarValuePixels(datasetIndex, index) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar scale = me.getValueScale();\n\t\t\t\t\t\tvar datasets = chart.data.datasets;\n\t\t\t\t\t\tvar value = scale.getRightValue(datasets[datasetIndex].data[index]);\n\t\t\t\t\t\tvar stacked = scale.options.stacked;\n\t\t\t\t\t\tvar stack = meta.stack;\n\t\t\t\t\t\tvar start = 0;\n\t\t\t\t\t\tvar i, imeta, ivalue, base, head, size;\n\n\t\t\t\t\t\tif (stacked || stacked === undefined && stack !== undefined) {\n\t\t\t\t\t\t\tfor (i = 0; i < datasetIndex; ++i) {\n\t\t\t\t\t\t\t\timeta = chart.getDatasetMeta(i);\n\n\t\t\t\t\t\t\t\tif (imeta.bar && imeta.stack === stack && imeta.controller.getValueScaleId() === scale.id && chart.isDatasetVisible(i)) {\n\n\t\t\t\t\t\t\t\t\tivalue = scale.getRightValue(datasets[i].data[index]);\n\t\t\t\t\t\t\t\t\tif (value < 0 && ivalue < 0 || value >= 0 && ivalue > 0) {\n\t\t\t\t\t\t\t\t\t\tstart += ivalue;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbase = scale.getPixelForValue(start);\n\t\t\t\t\t\thead = scale.getPixelForValue(start + value);\n\t\t\t\t\t\tsize = (head - base) / 2;\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tsize: size,\n\t\t\t\t\t\t\tbase: base,\n\t\t\t\t\t\t\thead: head,\n\t\t\t\t\t\t\tcenter: head + size / 2\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tcalculateBarIndexPixels: function calculateBarIndexPixels(datasetIndex, index, ruler) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar options = ruler.scale.options;\n\t\t\t\t\t\tvar range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options) : computeFitCategoryTraits(index, ruler, options);\n\n\t\t\t\t\t\tvar stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);\n\t\t\t\t\t\tvar center = range.start + range.chunk * stackIndex + range.chunk / 2;\n\t\t\t\t\t\tvar size = Math.min(helpers.valueOrDefault(options.maxBarThickness, Infinity), range.chunk * range.ratio);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tbase: center - size / 2,\n\t\t\t\t\t\t\thead: center + size / 2,\n\t\t\t\t\t\t\tcenter: center,\n\t\t\t\t\t\t\tsize: size\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\n\t\t\t\t\tdraw: function draw() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar scale = me.getValueScale();\n\t\t\t\t\t\tvar rects = me.getMeta().data;\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar ilen = rects.length;\n\t\t\t\t\t\tvar i = 0;\n\n\t\t\t\t\t\thelpers.canvas.clipArea(chart.ctx, chart.chartArea);\n\n\t\t\t\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\t\t\t\tif (!isNaN(scale.getRightValue(dataset.data[i]))) {\n\t\t\t\t\t\t\t\trects[i].draw();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.canvas.unclipArea(chart.ctx);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tChart.controllers.horizontalBar = Chart.controllers.bar.extend({\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetValueScaleId: function getValueScaleId() {\n\t\t\t\t\t\treturn this.getMeta().xAxisID;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetIndexScaleId: function getIndexScaleId() {\n\t\t\t\t\t\treturn this.getMeta().yAxisID;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}, { \"26\": 26, \"41\": 41, \"46\": 46 }], 16: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar elements = require(41);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('bubble', {\n\t\t\t\thover: {\n\t\t\t\t\tmode: 'single'\n\t\t\t\t},\n\n\t\t\t\tscales: {\n\t\t\t\t\txAxes: [{\n\t\t\t\t\t\ttype: 'linear', // bubble should probably use a linear scale by default\n\t\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\t\tid: 'x-axis-0' // need an ID so datasets can reference the scale\n\t\t\t\t\t}],\n\t\t\t\t\tyAxes: [{\n\t\t\t\t\t\ttype: 'linear',\n\t\t\t\t\t\tposition: 'left',\n\t\t\t\t\t\tid: 'y-axis-0'\n\t\t\t\t\t}]\n\t\t\t\t},\n\n\t\t\t\ttooltips: {\n\t\t\t\t\tcallbacks: {\n\t\t\t\t\t\ttitle: function title() {\n\t\t\t\t\t\t\t// Title doesn't make sense for scatter since we format the data as a point\n\t\t\t\t\t\t\treturn '';\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabel: function label(item, data) {\n\t\t\t\t\t\t\tvar datasetLabel = data.datasets[item.datasetIndex].label || '';\n\t\t\t\t\t\t\tvar dataPoint = data.datasets[item.datasetIndex].data[item.index];\n\t\t\t\t\t\t\treturn datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.controllers.bubble = Chart.DatasetController.extend({\n\t\t\t\t\t/**\n * @protected\n */\n\t\t\t\t\tdataElementType: elements.Point,\n\n\t\t\t\t\t/**\n * @protected\n */\n\t\t\t\t\tupdate: function update(reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar points = meta.data;\n\n\t\t\t\t\t\t// Update Points\n\t\t\t\t\t\thelpers.each(points, function (point, index) {\n\t\t\t\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @protected\n */\n\t\t\t\t\tupdateElement: function updateElement(point, index, reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar custom = point.custom || {};\n\t\t\t\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\t\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\t\t\t\tvar options = me._resolveElementOptions(point, index);\n\t\t\t\t\t\tvar data = me.getDataset().data[index];\n\t\t\t\t\t\tvar dsIndex = me.index;\n\n\t\t\t\t\t\tvar x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue((typeof data === \"undefined\" ? \"undefined\" : _typeof(data)) === 'object' ? data : NaN, index, dsIndex);\n\t\t\t\t\t\tvar y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);\n\n\t\t\t\t\t\tpoint._xScale = xScale;\n\t\t\t\t\t\tpoint._yScale = yScale;\n\t\t\t\t\t\tpoint._options = options;\n\t\t\t\t\t\tpoint._datasetIndex = dsIndex;\n\t\t\t\t\t\tpoint._index = index;\n\t\t\t\t\t\tpoint._model = {\n\t\t\t\t\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\t\t\t\t\tborderColor: options.borderColor,\n\t\t\t\t\t\t\tborderWidth: options.borderWidth,\n\t\t\t\t\t\t\thitRadius: options.hitRadius,\n\t\t\t\t\t\t\tpointStyle: options.pointStyle,\n\t\t\t\t\t\t\trotation: options.rotation,\n\t\t\t\t\t\t\tradius: reset ? 0 : options.radius,\n\t\t\t\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\ty: y\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tpoint.pivot();\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @protected\n */\n\t\t\t\t\tsetHoverStyle: function setHoverStyle(point) {\n\t\t\t\t\t\tvar model = point._model;\n\t\t\t\t\t\tvar options = point._options;\n\t\t\t\t\t\tpoint.$previousStyle = {\n\t\t\t\t\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\t\t\t\t\tborderColor: model.borderColor,\n\t\t\t\t\t\t\tborderWidth: model.borderWidth,\n\t\t\t\t\t\t\tradius: model.radius\n\t\t\t\t\t\t};\n\t\t\t\t\t\tmodel.backgroundColor = helpers.valueOrDefault(options.hoverBackgroundColor, helpers.getHoverColor(options.backgroundColor));\n\t\t\t\t\t\tmodel.borderColor = helpers.valueOrDefault(options.hoverBorderColor, helpers.getHoverColor(options.borderColor));\n\t\t\t\t\t\tmodel.borderWidth = helpers.valueOrDefault(options.hoverBorderWidth, options.borderWidth);\n\t\t\t\t\t\tmodel.radius = options.radius + options.hoverRadius;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\t_resolveElementOptions: function _resolveElementOptions(point, index) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar datasets = chart.data.datasets;\n\t\t\t\t\t\tvar dataset = datasets[me.index];\n\t\t\t\t\t\tvar custom = point.custom || {};\n\t\t\t\t\t\tvar options = chart.options.elements.point;\n\t\t\t\t\t\tvar resolve = helpers.options.resolve;\n\t\t\t\t\t\tvar data = dataset.data[index];\n\t\t\t\t\t\tvar values = {};\n\t\t\t\t\t\tvar i, ilen, key;\n\n\t\t\t\t\t\t// Scriptable options\n\t\t\t\t\t\tvar context = {\n\t\t\t\t\t\t\tchart: chart,\n\t\t\t\t\t\t\tdataIndex: index,\n\t\t\t\t\t\t\tdataset: dataset,\n\t\t\t\t\t\t\tdatasetIndex: me.index\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tvar keys = ['backgroundColor', 'borderColor', 'borderWidth', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth', 'hoverRadius', 'hitRadius', 'pointStyle', 'rotation'];\n\n\t\t\t\t\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tkey = keys[i];\n\t\t\t\t\t\t\tvalues[key] = resolve([custom[key], dataset[key], options[key]], context, index);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Custom radius resolution\n\t\t\t\t\t\tvalues.radius = resolve([custom.radius, data ? data.r : undefined, dataset.radius, options.radius], context, index);\n\t\t\t\t\t\treturn values;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}, { \"26\": 26, \"41\": 41, \"46\": 46 }], 17: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar elements = require(41);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('doughnut', {\n\t\t\t\tanimation: {\n\t\t\t\t\t// Boolean - Whether we animate the rotation of the Doughnut\n\t\t\t\t\tanimateRotate: true,\n\t\t\t\t\t// Boolean - Whether we animate scaling the Doughnut from the centre\n\t\t\t\t\tanimateScale: false\n\t\t\t\t},\n\t\t\t\thover: {\n\t\t\t\t\tmode: 'single'\n\t\t\t\t},\n\t\t\t\tlegendCallback: function legendCallback(chart) {\n\t\t\t\t\tvar text = [];\n\t\t\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\n\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\tvar datasets = data.datasets;\n\t\t\t\t\tvar labels = data.labels;\n\n\t\t\t\t\tif (datasets.length) {\n\t\t\t\t\t\tfor (var i = 0; i < datasets[0].data.length; ++i) {\n\t\t\t\t\t\t\ttext.push('<li><span style=\"background-color:' + datasets[0].backgroundColor[i] + '\"></span>');\n\t\t\t\t\t\t\tif (labels[i]) {\n\t\t\t\t\t\t\t\ttext.push(labels[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttext.push('</li>');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttext.push('</ul>');\n\t\t\t\t\treturn text.join('');\n\t\t\t\t},\n\t\t\t\tlegend: {\n\t\t\t\t\tlabels: {\n\t\t\t\t\t\tgenerateLabels: function generateLabels(chart) {\n\t\t\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\t\t\t\treturn data.labels.map(function (label, i) {\n\t\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\t\t\t\tvar custom = arc && arc.custom || {};\n\t\t\t\t\t\t\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tonClick: function onClick(e, legendItem) {\n\t\t\t\t\t\tvar index = legendItem.index;\n\t\t\t\t\t\tvar chart = this.chart;\n\t\t\t\t\t\tvar i, ilen, meta;\n\n\t\t\t\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\t\t\t// toggle visibility of index if exists\n\t\t\t\t\t\t\tif (meta.data[index]) {\n\t\t\t\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchart.update();\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// The percentage of the chart that we cut out of the middle.\n\t\t\t\tcutoutPercentage: 50,\n\n\t\t\t\t// The rotation of the chart, where the first data arc begins.\n\t\t\t\trotation: Math.PI * -0.5,\n\n\t\t\t\t// The total circumference of the chart.\n\t\t\t\tcircumference: Math.PI * 2.0,\n\n\t\t\t\t// Need to override these to give a nice default\n\t\t\t\ttooltips: {\n\t\t\t\t\tcallbacks: {\n\t\t\t\t\t\ttitle: function title() {\n\t\t\t\t\t\t\treturn '';\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabel: function label(tooltipItem, data) {\n\t\t\t\t\t\t\tvar dataLabel = data.labels[tooltipItem.index];\n\t\t\t\t\t\t\tvar value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\n\t\t\t\t\t\t\tif (helpers.isArray(dataLabel)) {\n\t\t\t\t\t\t\t\t// show value on first line of multiline label\n\t\t\t\t\t\t\t\t// need to clone because we are changing the value\n\t\t\t\t\t\t\t\tdataLabel = dataLabel.slice();\n\t\t\t\t\t\t\t\tdataLabel[0] += value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdataLabel += value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn dataLabel;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdefaults._set('pie', helpers.clone(defaults.doughnut));\n\t\t\tdefaults._set('pie', {\n\t\t\t\tcutoutPercentage: 0\n\t\t\t});\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({\n\n\t\t\t\t\tdataElementType: elements.Arc,\n\n\t\t\t\t\tlinkScales: helpers.noop,\n\n\t\t\t\t\t// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n\t\t\t\t\tgetRingIndex: function getRingIndex(datasetIndex) {\n\t\t\t\t\t\tvar ringIndex = 0;\n\n\t\t\t\t\t\tfor (var j = 0; j < datasetIndex; ++j) {\n\t\t\t\t\t\t\tif (this.chart.isDatasetVisible(j)) {\n\t\t\t\t\t\t\t\t++ringIndex;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn ringIndex;\n\t\t\t\t\t},\n\n\t\t\t\t\tupdate: function update(reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar chartArea = chart.chartArea;\n\t\t\t\t\t\tvar opts = chart.options;\n\t\t\t\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\t\t\t\tvar availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth;\n\t\t\t\t\t\tvar availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth;\n\t\t\t\t\t\tvar minSize = Math.min(availableWidth, availableHeight);\n\t\t\t\t\t\tvar offset = { x: 0, y: 0 };\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar cutoutPercentage = opts.cutoutPercentage;\n\t\t\t\t\t\tvar circumference = opts.circumference;\n\n\t\t\t\t\t\t// If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc\n\t\t\t\t\t\tif (circumference < Math.PI * 2.0) {\n\t\t\t\t\t\t\tvar startAngle = opts.rotation % (Math.PI * 2.0);\n\t\t\t\t\t\t\tstartAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);\n\t\t\t\t\t\t\tvar endAngle = startAngle + circumference;\n\t\t\t\t\t\t\tvar start = { x: Math.cos(startAngle), y: Math.sin(startAngle) };\n\t\t\t\t\t\t\tvar end = { x: Math.cos(endAngle), y: Math.sin(endAngle) };\n\t\t\t\t\t\t\tvar contains0 = startAngle <= 0 && endAngle >= 0 || startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle;\n\t\t\t\t\t\t\tvar contains90 = startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle || startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle;\n\t\t\t\t\t\t\tvar contains180 = startAngle <= -Math.PI && -Math.PI <= endAngle || startAngle <= Math.PI && Math.PI <= endAngle;\n\t\t\t\t\t\t\tvar contains270 = startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle || startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle;\n\t\t\t\t\t\t\tvar cutout = cutoutPercentage / 100.0;\n\t\t\t\t\t\t\tvar min = { x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout)) };\n\t\t\t\t\t\t\tvar max = { x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout)) };\n\t\t\t\t\t\t\tvar size = { width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5 };\n\t\t\t\t\t\t\tminSize = Math.min(availableWidth / size.width, availableHeight / size.height);\n\t\t\t\t\t\t\toffset = { x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5 };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchart.borderWidth = me.getMaxBorderWidth(meta.data);\n\t\t\t\t\t\tchart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);\n\t\t\t\t\t\tchart.innerRadius = Math.max(cutoutPercentage ? chart.outerRadius / 100 * cutoutPercentage : 0, 0);\n\t\t\t\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\t\t\t\t\t\tchart.offsetX = offset.x * chart.outerRadius;\n\t\t\t\t\t\tchart.offsetY = offset.y * chart.outerRadius;\n\n\t\t\t\t\t\tmeta.total = me.calculateTotal();\n\n\t\t\t\t\t\tme.outerRadius = chart.outerRadius - chart.radiusLength * me.getRingIndex(me.index);\n\t\t\t\t\t\tme.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0);\n\n\t\t\t\t\t\thelpers.each(meta.data, function (arc, index) {\n\t\t\t\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\n\t\t\t\t\tupdateElement: function updateElement(arc, index, reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar chartArea = chart.chartArea;\n\t\t\t\t\t\tvar opts = chart.options;\n\t\t\t\t\t\tvar animationOpts = opts.animation;\n\t\t\t\t\t\tvar centerX = (chartArea.left + chartArea.right) / 2;\n\t\t\t\t\t\tvar centerY = (chartArea.top + chartArea.bottom) / 2;\n\t\t\t\t\t\tvar startAngle = opts.rotation; // non reset case handled later\n\t\t\t\t\t\tvar endAngle = opts.rotation; // non reset case handled later\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));\n\t\t\t\t\t\tvar innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;\n\t\t\t\t\t\tvar outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;\n\t\t\t\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n\t\t\t\t\t\thelpers.extend(arc, {\n\t\t\t\t\t\t\t// Utility\n\t\t\t\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t\t\t\t_index: index,\n\n\t\t\t\t\t\t\t// Desired view properties\n\t\t\t\t\t\t\t_model: {\n\t\t\t\t\t\t\t\tx: centerX + chart.offsetX,\n\t\t\t\t\t\t\t\ty: centerY + chart.offsetY,\n\t\t\t\t\t\t\t\tstartAngle: startAngle,\n\t\t\t\t\t\t\t\tendAngle: endAngle,\n\t\t\t\t\t\t\t\tcircumference: circumference,\n\t\t\t\t\t\t\t\touterRadius: outerRadius,\n\t\t\t\t\t\t\t\tinnerRadius: innerRadius,\n\t\t\t\t\t\t\t\tlabel: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tvar model = arc._model;\n\n\t\t\t\t\t\t// Resets the visual styles\n\t\t\t\t\t\tvar custom = arc.custom || {};\n\t\t\t\t\t\tvar valueOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\tvar elementOpts = this.chart.options.elements.arc;\n\t\t\t\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);\n\t\t\t\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);\n\t\t\t\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);\n\n\t\t\t\t\t\t// Set correct angles if not resetting\n\t\t\t\t\t\tif (!reset || !animationOpts.animateRotate) {\n\t\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\t\tmodel.startAngle = opts.rotation;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tmodel.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tmodel.endAngle = model.startAngle + model.circumference;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tarc.pivot();\n\t\t\t\t\t},\n\n\t\t\t\t\tcalculateTotal: function calculateTotal() {\n\t\t\t\t\t\tvar dataset = this.getDataset();\n\t\t\t\t\t\tvar meta = this.getMeta();\n\t\t\t\t\t\tvar total = 0;\n\t\t\t\t\t\tvar value;\n\n\t\t\t\t\t\thelpers.each(meta.data, function (element, index) {\n\t\t\t\t\t\t\tvalue = dataset.data[index];\n\t\t\t\t\t\t\tif (!isNaN(value) && !element.hidden) {\n\t\t\t\t\t\t\t\ttotal += Math.abs(value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t/* if (total === 0) {\n \ttotal = NaN;\n }*/\n\n\t\t\t\t\t\treturn total;\n\t\t\t\t\t},\n\n\t\t\t\t\tcalculateCircumference: function calculateCircumference(value) {\n\t\t\t\t\t\tvar total = this.getMeta().total;\n\t\t\t\t\t\tif (total > 0 && !isNaN(value)) {\n\t\t\t\t\t\t\treturn Math.PI * 2.0 * (Math.abs(value) / total);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t},\n\n\t\t\t\t\t// gets the max border or hover width to properly scale pie charts\n\t\t\t\t\tgetMaxBorderWidth: function getMaxBorderWidth(arcs) {\n\t\t\t\t\t\tvar max = 0;\n\t\t\t\t\t\tvar index = this.index;\n\t\t\t\t\t\tvar length = arcs.length;\n\t\t\t\t\t\tvar borderWidth;\n\t\t\t\t\t\tvar hoverWidth;\n\n\t\t\t\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\t\t\t\tborderWidth = arcs[i]._model ? arcs[i]._model.borderWidth : 0;\n\t\t\t\t\t\t\thoverWidth = arcs[i]._chart ? arcs[i]._chart.config.data.datasets[index].hoverBorderWidth : 0;\n\n\t\t\t\t\t\t\tmax = borderWidth > max ? borderWidth : max;\n\t\t\t\t\t\t\tmax = hoverWidth > max ? hoverWidth : max;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn max;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}, { \"26\": 26, \"41\": 41, \"46\": 46 }], 18: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar elements = require(41);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('line', {\n\t\t\t\tshowLines: true,\n\t\t\t\tspanGaps: false,\n\n\t\t\t\thover: {\n\t\t\t\t\tmode: 'label'\n\t\t\t\t},\n\n\t\t\t\tscales: {\n\t\t\t\t\txAxes: [{\n\t\t\t\t\t\ttype: 'category',\n\t\t\t\t\t\tid: 'x-axis-0'\n\t\t\t\t\t}],\n\t\t\t\t\tyAxes: [{\n\t\t\t\t\t\ttype: 'linear',\n\t\t\t\t\t\tid: 'y-axis-0'\n\t\t\t\t\t}]\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tfunction lineEnabled(dataset, options) {\n\t\t\t\t\treturn helpers.valueOrDefault(dataset.showLine, options.showLines);\n\t\t\t\t}\n\n\t\t\t\tChart.controllers.line = Chart.DatasetController.extend({\n\n\t\t\t\t\tdatasetElementType: elements.Line,\n\n\t\t\t\t\tdataElementType: elements.Point,\n\n\t\t\t\t\tupdate: function update(reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar line = meta.dataset;\n\t\t\t\t\t\tvar points = meta.data || [];\n\t\t\t\t\t\tvar options = me.chart.options;\n\t\t\t\t\t\tvar lineElementOptions = options.elements.line;\n\t\t\t\t\t\tvar scale = me.getScaleForId(meta.yAxisID);\n\t\t\t\t\t\tvar i, ilen, custom;\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar showLine = lineEnabled(dataset, options);\n\n\t\t\t\t\t\t// Update Line\n\t\t\t\t\t\tif (showLine) {\n\t\t\t\t\t\t\tcustom = line.custom || {};\n\n\t\t\t\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\t\t\t\tif (dataset.tension !== undefined && dataset.lineTension === undefined) {\n\t\t\t\t\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Utility\n\t\t\t\t\t\t\tline._scale = scale;\n\t\t\t\t\t\t\tline._datasetIndex = me.index;\n\t\t\t\t\t\t\t// Data\n\t\t\t\t\t\t\tline._children = points;\n\t\t\t\t\t\t\t// Model\n\t\t\t\t\t\t\tline._model = {\n\t\t\t\t\t\t\t\t// Appearance\n\t\t\t\t\t\t\t\t// The default behavior of lines is to break at null values, according\n\t\t\t\t\t\t\t\t// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n\t\t\t\t\t\t\t\t// This option gives lines the ability to span gaps\n\t\t\t\t\t\t\t\tspanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps,\n\t\t\t\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : dataset.backgroundColor || lineElementOptions.backgroundColor,\n\t\t\t\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : dataset.borderWidth || lineElementOptions.borderWidth,\n\t\t\t\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : dataset.borderColor || lineElementOptions.borderColor,\n\t\t\t\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : dataset.borderCapStyle || lineElementOptions.borderCapStyle,\n\t\t\t\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : dataset.borderDash || lineElementOptions.borderDash,\n\t\t\t\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : dataset.borderDashOffset || lineElementOptions.borderDashOffset,\n\t\t\t\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : dataset.borderJoinStyle || lineElementOptions.borderJoinStyle,\n\t\t\t\t\t\t\t\tfill: custom.fill ? custom.fill : dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill,\n\t\t\t\t\t\t\t\tsteppedLine: custom.steppedLine ? custom.steppedLine : helpers.valueOrDefault(dataset.steppedLine, lineElementOptions.stepped),\n\t\t\t\t\t\t\t\tcubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.valueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode)\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tline.pivot();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update Points\n\t\t\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tme.updateElement(points[i], i, reset);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (showLine && line._model.tension !== 0) {\n\t\t\t\t\t\t\tme.updateBezierControlPoints();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Now pivot the point for animation\n\t\t\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tpoints[i].pivot();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tgetPointBackgroundColor: function getPointBackgroundColor(point, index) {\n\t\t\t\t\t\tvar backgroundColor = this.chart.options.elements.point.backgroundColor;\n\t\t\t\t\t\tvar dataset = this.getDataset();\n\t\t\t\t\t\tvar custom = point.custom || {};\n\n\t\t\t\t\t\tif (custom.backgroundColor) {\n\t\t\t\t\t\t\tbackgroundColor = custom.backgroundColor;\n\t\t\t\t\t\t} else if (dataset.pointBackgroundColor) {\n\t\t\t\t\t\t\tbackgroundColor = helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor);\n\t\t\t\t\t\t} else if (dataset.backgroundColor) {\n\t\t\t\t\t\t\tbackgroundColor = dataset.backgroundColor;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn backgroundColor;\n\t\t\t\t\t},\n\n\t\t\t\t\tgetPointBorderColor: function getPointBorderColor(point, index) {\n\t\t\t\t\t\tvar borderColor = this.chart.options.elements.point.borderColor;\n\t\t\t\t\t\tvar dataset = this.getDataset();\n\t\t\t\t\t\tvar custom = point.custom || {};\n\n\t\t\t\t\t\tif (custom.borderColor) {\n\t\t\t\t\t\t\tborderColor = custom.borderColor;\n\t\t\t\t\t\t} else if (dataset.pointBorderColor) {\n\t\t\t\t\t\t\tborderColor = helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor);\n\t\t\t\t\t\t} else if (dataset.borderColor) {\n\t\t\t\t\t\t\tborderColor = dataset.borderColor;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn borderColor;\n\t\t\t\t\t},\n\n\t\t\t\t\tgetPointBorderWidth: function getPointBorderWidth(point, index) {\n\t\t\t\t\t\tvar borderWidth = this.chart.options.elements.point.borderWidth;\n\t\t\t\t\t\tvar dataset = this.getDataset();\n\t\t\t\t\t\tvar custom = point.custom || {};\n\n\t\t\t\t\t\tif (!isNaN(custom.borderWidth)) {\n\t\t\t\t\t\t\tborderWidth = custom.borderWidth;\n\t\t\t\t\t\t} else if (!isNaN(dataset.pointBorderWidth) || helpers.isArray(dataset.pointBorderWidth)) {\n\t\t\t\t\t\t\tborderWidth = helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth);\n\t\t\t\t\t\t} else if (!isNaN(dataset.borderWidth)) {\n\t\t\t\t\t\t\tborderWidth = dataset.borderWidth;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn borderWidth;\n\t\t\t\t\t},\n\n\t\t\t\t\tgetPointRotation: function getPointRotation(point, index) {\n\t\t\t\t\t\tvar pointRotation = this.chart.options.elements.point.rotation;\n\t\t\t\t\t\tvar dataset = this.getDataset();\n\t\t\t\t\t\tvar custom = point.custom || {};\n\n\t\t\t\t\t\tif (!isNaN(custom.rotation)) {\n\t\t\t\t\t\t\tpointRotation = custom.rotation;\n\t\t\t\t\t\t} else if (!isNaN(dataset.pointRotation) || helpers.isArray(dataset.pointRotation)) {\n\t\t\t\t\t\t\tpointRotation = helpers.valueAtIndexOrDefault(dataset.pointRotation, index, pointRotation);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn pointRotation;\n\t\t\t\t\t},\n\n\t\t\t\t\tupdateElement: function updateElement(point, index, reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar custom = point.custom || {};\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar datasetIndex = me.index;\n\t\t\t\t\t\tvar value = dataset.data[index];\n\t\t\t\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\t\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\t\t\t\tvar pointOptions = me.chart.options.elements.point;\n\t\t\t\t\t\tvar x, y;\n\n\t\t\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\t\t\tif (dataset.radius !== undefined && dataset.pointRadius === undefined) {\n\t\t\t\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (dataset.hitRadius !== undefined && dataset.pointHitRadius === undefined) {\n\t\t\t\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tx = xScale.getPixelForValue((typeof value === \"undefined\" ? \"undefined\" : _typeof(value)) === 'object' ? value : NaN, index, datasetIndex);\n\t\t\t\t\t\ty = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n\t\t\t\t\t\t// Utility\n\t\t\t\t\t\tpoint._xScale = xScale;\n\t\t\t\t\t\tpoint._yScale = yScale;\n\t\t\t\t\t\tpoint._datasetIndex = datasetIndex;\n\t\t\t\t\t\tpoint._index = index;\n\n\t\t\t\t\t\t// Desired view properties\n\t\t\t\t\t\tpoint._model = {\n\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\t\t\t\t// Appearance\n\t\t\t\t\t\t\tradius: custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius),\n\t\t\t\t\t\t\tpointStyle: custom.pointStyle || helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle),\n\t\t\t\t\t\t\trotation: me.getPointRotation(point, index),\n\t\t\t\t\t\t\tbackgroundColor: me.getPointBackgroundColor(point, index),\n\t\t\t\t\t\t\tborderColor: me.getPointBorderColor(point, index),\n\t\t\t\t\t\t\tborderWidth: me.getPointBorderWidth(point, index),\n\t\t\t\t\t\t\ttension: meta.dataset._model ? meta.dataset._model.tension : 0,\n\t\t\t\t\t\t\tsteppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false,\n\t\t\t\t\t\t\t// Tooltip\n\t\t\t\t\t\t\thitRadius: custom.hitRadius || helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius)\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\n\t\t\t\t\tcalculatePointY: function calculatePointY(value, index, datasetIndex) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\t\t\t\tvar sumPos = 0;\n\t\t\t\t\t\tvar sumNeg = 0;\n\t\t\t\t\t\tvar i, ds, dsMeta;\n\n\t\t\t\t\t\tif (yScale.options.stacked) {\n\t\t\t\t\t\t\tfor (i = 0; i < datasetIndex; i++) {\n\t\t\t\t\t\t\t\tds = chart.data.datasets[i];\n\t\t\t\t\t\t\t\tdsMeta = chart.getDatasetMeta(i);\n\t\t\t\t\t\t\t\tif (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {\n\t\t\t\t\t\t\t\t\tvar stackedRightValue = Number(yScale.getRightValue(ds.data[index]));\n\t\t\t\t\t\t\t\t\tif (stackedRightValue < 0) {\n\t\t\t\t\t\t\t\t\t\tsumNeg += stackedRightValue || 0;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tsumPos += stackedRightValue || 0;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar rightValue = Number(yScale.getRightValue(value));\n\t\t\t\t\t\t\tif (rightValue < 0) {\n\t\t\t\t\t\t\t\treturn yScale.getPixelForValue(sumNeg + rightValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn yScale.getPixelForValue(sumPos + rightValue);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn yScale.getPixelForValue(value);\n\t\t\t\t\t},\n\n\t\t\t\t\tupdateBezierControlPoints: function updateBezierControlPoints() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar area = me.chart.chartArea;\n\t\t\t\t\t\tvar points = meta.data || [];\n\t\t\t\t\t\tvar i, ilen, point, model, controlPoints;\n\n\t\t\t\t\t\t// Only consider points that are drawn in case the spanGaps option is used\n\t\t\t\t\t\tif (meta.dataset._model.spanGaps) {\n\t\t\t\t\t\t\tpoints = points.filter(function (pt) {\n\t\t\t\t\t\t\t\treturn !pt._model.skip;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfunction capControlPoint(pt, min, max) {\n\t\t\t\t\t\t\treturn Math.max(Math.min(pt, max), min);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (meta.dataset._model.cubicInterpolationMode === 'monotone') {\n\t\t\t\t\t\t\thelpers.splineCurveMonotone(points);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\t\t\t\tpoint = points[i];\n\t\t\t\t\t\t\t\tmodel = point._model;\n\t\t\t\t\t\t\t\tcontrolPoints = helpers.splineCurve(helpers.previousItem(points, i)._model, model, helpers.nextItem(points, i)._model, meta.dataset._model.tension);\n\t\t\t\t\t\t\t\tmodel.controlPointPreviousX = controlPoints.previous.x;\n\t\t\t\t\t\t\t\tmodel.controlPointPreviousY = controlPoints.previous.y;\n\t\t\t\t\t\t\t\tmodel.controlPointNextX = controlPoints.next.x;\n\t\t\t\t\t\t\t\tmodel.controlPointNextY = controlPoints.next.y;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (me.chart.options.elements.line.capBezierPoints) {\n\t\t\t\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\t\t\t\tmodel = points[i]._model;\n\t\t\t\t\t\t\t\tmodel.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n\t\t\t\t\t\t\t\tmodel.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n\t\t\t\t\t\t\t\tmodel.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n\t\t\t\t\t\t\t\tmodel.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tdraw: function draw() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar points = meta.data || [];\n\t\t\t\t\t\tvar area = chart.chartArea;\n\t\t\t\t\t\tvar ilen = points.length;\n\t\t\t\t\t\tvar halfBorderWidth;\n\t\t\t\t\t\tvar i = 0;\n\n\t\t\t\t\t\tif (lineEnabled(me.getDataset(), chart.options)) {\n\t\t\t\t\t\t\thalfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2;\n\n\t\t\t\t\t\t\thelpers.canvas.clipArea(chart.ctx, {\n\t\t\t\t\t\t\t\tleft: area.left,\n\t\t\t\t\t\t\t\tright: area.right,\n\t\t\t\t\t\t\t\ttop: area.top - halfBorderWidth,\n\t\t\t\t\t\t\t\tbottom: area.bottom + halfBorderWidth\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tmeta.dataset.draw();\n\n\t\t\t\t\t\t\thelpers.canvas.unclipArea(chart.ctx);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Draw the points\n\t\t\t\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\t\t\t\tpoints[i].draw(area);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tsetHoverStyle: function setHoverStyle(element) {\n\t\t\t\t\t\t// Point\n\t\t\t\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\n\t\t\t\t\t\tvar index = element._index;\n\t\t\t\t\t\tvar custom = element.custom || {};\n\t\t\t\t\t\tvar model = element._model;\n\n\t\t\t\t\t\telement.$previousStyle = {\n\t\t\t\t\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\t\t\t\t\tborderColor: model.borderColor,\n\t\t\t\t\t\t\tborderWidth: model.borderWidth,\n\t\t\t\t\t\t\tradius: model.radius\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\t\t\t\tmodel.borderColor = custom.hoverBorderColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\t\t\t\tmodel.borderWidth = custom.hoverBorderWidth || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t\t\t\t\tmodel.radius = custom.hoverRadius || helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}, { \"26\": 26, \"41\": 41, \"46\": 46 }], 19: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar elements = require(41);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('polarArea', {\n\t\t\t\tscale: {\n\t\t\t\t\ttype: 'radialLinear',\n\t\t\t\t\tangleLines: {\n\t\t\t\t\t\tdisplay: false\n\t\t\t\t\t},\n\t\t\t\t\tgridLines: {\n\t\t\t\t\t\tcircular: true\n\t\t\t\t\t},\n\t\t\t\t\tpointLabels: {\n\t\t\t\t\t\tdisplay: false\n\t\t\t\t\t},\n\t\t\t\t\tticks: {\n\t\t\t\t\t\tbeginAtZero: true\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// Boolean - Whether to animate the rotation of the chart\n\t\t\t\tanimation: {\n\t\t\t\t\tanimateRotate: true,\n\t\t\t\t\tanimateScale: true\n\t\t\t\t},\n\n\t\t\t\tstartAngle: -0.5 * Math.PI,\n\t\t\t\tlegendCallback: function legendCallback(chart) {\n\t\t\t\t\tvar text = [];\n\t\t\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\n\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\tvar datasets = data.datasets;\n\t\t\t\t\tvar labels = data.labels;\n\n\t\t\t\t\tif (datasets.length) {\n\t\t\t\t\t\tfor (var i = 0; i < datasets[0].data.length; ++i) {\n\t\t\t\t\t\t\ttext.push('<li><span style=\"background-color:' + datasets[0].backgroundColor[i] + '\"></span>');\n\t\t\t\t\t\t\tif (labels[i]) {\n\t\t\t\t\t\t\t\ttext.push(labels[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttext.push('</li>');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttext.push('</ul>');\n\t\t\t\t\treturn text.join('');\n\t\t\t\t},\n\t\t\t\tlegend: {\n\t\t\t\t\tlabels: {\n\t\t\t\t\t\tgenerateLabels: function generateLabels(chart) {\n\t\t\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\t\t\t\treturn data.labels.map(function (label, i) {\n\t\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\t\t\t\tvar custom = arc.custom || {};\n\t\t\t\t\t\t\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tonClick: function onClick(e, legendItem) {\n\t\t\t\t\t\tvar index = legendItem.index;\n\t\t\t\t\t\tvar chart = this.chart;\n\t\t\t\t\t\tvar i, ilen, meta;\n\n\t\t\t\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchart.update();\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// Need to override these to give a nice default\n\t\t\t\ttooltips: {\n\t\t\t\t\tcallbacks: {\n\t\t\t\t\t\ttitle: function title() {\n\t\t\t\t\t\t\treturn '';\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabel: function label(item, data) {\n\t\t\t\t\t\t\treturn data.labels[item.index] + ': ' + item.yLabel;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.controllers.polarArea = Chart.DatasetController.extend({\n\n\t\t\t\t\tdataElementType: elements.Arc,\n\n\t\t\t\t\tlinkScales: helpers.noop,\n\n\t\t\t\t\tupdate: function update(reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar start = me.chart.options.startAngle || 0;\n\t\t\t\t\t\tvar starts = me._starts = [];\n\t\t\t\t\t\tvar angles = me._angles = [];\n\t\t\t\t\t\tvar i, ilen, angle;\n\n\t\t\t\t\t\tme._updateRadius();\n\n\t\t\t\t\t\tmeta.count = me.countVisibleElements();\n\n\t\t\t\t\t\tfor (i = 0, ilen = dataset.data.length; i < ilen; i++) {\n\t\t\t\t\t\t\tstarts[i] = start;\n\t\t\t\t\t\t\tangle = me._computeAngle(i);\n\t\t\t\t\t\t\tangles[i] = angle;\n\t\t\t\t\t\t\tstart += angle;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.each(meta.data, function (arc, index) {\n\t\t\t\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\t_updateRadius: function _updateRadius() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar chartArea = chart.chartArea;\n\t\t\t\t\t\tvar opts = chart.options;\n\t\t\t\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\t\t\t\tvar minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n\t\t\t\t\t\tchart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0);\n\t\t\t\t\t\tchart.innerRadius = Math.max(opts.cutoutPercentage ? chart.outerRadius / 100 * opts.cutoutPercentage : 1, 0);\n\t\t\t\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\n\t\t\t\t\t\tme.outerRadius = chart.outerRadius - chart.radiusLength * me.index;\n\t\t\t\t\t\tme.innerRadius = me.outerRadius - chart.radiusLength;\n\t\t\t\t\t},\n\n\t\t\t\t\tupdateElement: function updateElement(arc, index, reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar opts = chart.options;\n\t\t\t\t\t\tvar animationOpts = opts.animation;\n\t\t\t\t\t\tvar scale = chart.scale;\n\t\t\t\t\t\tvar labels = chart.data.labels;\n\n\t\t\t\t\t\tvar centerX = scale.xCenter;\n\t\t\t\t\t\tvar centerY = scale.yCenter;\n\n\t\t\t\t\t\t// var negHalfPI = -0.5 * Math.PI;\n\t\t\t\t\t\tvar datasetStartAngle = opts.startAngle;\n\t\t\t\t\t\tvar distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\t\t\t\t\t\tvar startAngle = me._starts[index];\n\t\t\t\t\t\tvar endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]);\n\n\t\t\t\t\t\tvar resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\n\t\t\t\t\t\thelpers.extend(arc, {\n\t\t\t\t\t\t\t// Utility\n\t\t\t\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t\t\t\t_index: index,\n\t\t\t\t\t\t\t_scale: scale,\n\n\t\t\t\t\t\t\t// Desired view properties\n\t\t\t\t\t\t\t_model: {\n\t\t\t\t\t\t\t\tx: centerX,\n\t\t\t\t\t\t\t\ty: centerY,\n\t\t\t\t\t\t\t\tinnerRadius: 0,\n\t\t\t\t\t\t\t\touterRadius: reset ? resetRadius : distance,\n\t\t\t\t\t\t\t\tstartAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n\t\t\t\t\t\t\t\tendAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n\t\t\t\t\t\t\t\tlabel: helpers.valueAtIndexOrDefault(labels, index, labels[index])\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Apply border and fill style\n\t\t\t\t\t\tvar elementOpts = this.chart.options.elements.arc;\n\t\t\t\t\t\tvar custom = arc.custom || {};\n\t\t\t\t\t\tvar valueOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\tvar model = arc._model;\n\n\t\t\t\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);\n\t\t\t\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);\n\t\t\t\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);\n\n\t\t\t\t\t\tarc.pivot();\n\t\t\t\t\t},\n\n\t\t\t\t\tcountVisibleElements: function countVisibleElements() {\n\t\t\t\t\t\tvar dataset = this.getDataset();\n\t\t\t\t\t\tvar meta = this.getMeta();\n\t\t\t\t\t\tvar count = 0;\n\n\t\t\t\t\t\thelpers.each(meta.data, function (element, index) {\n\t\t\t\t\t\t\tif (!isNaN(dataset.data[index]) && !element.hidden) {\n\t\t\t\t\t\t\t\tcount++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn count;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\t_computeAngle: function _computeAngle(index) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar count = this.getMeta().count;\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar meta = me.getMeta();\n\n\t\t\t\t\t\tif (isNaN(dataset.data[index]) || meta.data[index].hidden) {\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Scriptable options\n\t\t\t\t\t\tvar context = {\n\t\t\t\t\t\t\tchart: me.chart,\n\t\t\t\t\t\t\tdataIndex: index,\n\t\t\t\t\t\t\tdataset: dataset,\n\t\t\t\t\t\t\tdatasetIndex: me.index\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn helpers.options.resolve([me.chart.options.elements.arc.angle, 2 * Math.PI / count], context, index);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}, { \"26\": 26, \"41\": 41, \"46\": 46 }], 20: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar elements = require(41);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('radar', {\n\t\t\t\tscale: {\n\t\t\t\t\ttype: 'radialLinear'\n\t\t\t\t},\n\t\t\t\telements: {\n\t\t\t\t\tline: {\n\t\t\t\t\t\ttension: 0 // no bezier in radar\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.controllers.radar = Chart.DatasetController.extend({\n\n\t\t\t\t\tdatasetElementType: elements.Line,\n\n\t\t\t\t\tdataElementType: elements.Point,\n\n\t\t\t\t\tlinkScales: helpers.noop,\n\n\t\t\t\t\tupdate: function update(reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar line = meta.dataset;\n\t\t\t\t\t\tvar points = meta.data;\n\t\t\t\t\t\tvar custom = line.custom || {};\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar lineElementOptions = me.chart.options.elements.line;\n\t\t\t\t\t\tvar scale = me.chart.scale;\n\n\t\t\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\t\t\tif (dataset.tension !== undefined && dataset.lineTension === undefined) {\n\t\t\t\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.extend(meta.dataset, {\n\t\t\t\t\t\t\t// Utility\n\t\t\t\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t\t\t\t_scale: scale,\n\t\t\t\t\t\t\t// Data\n\t\t\t\t\t\t\t_children: points,\n\t\t\t\t\t\t\t_loop: true,\n\t\t\t\t\t\t\t// Model\n\t\t\t\t\t\t\t_model: {\n\t\t\t\t\t\t\t\t// Appearance\n\t\t\t\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : dataset.backgroundColor || lineElementOptions.backgroundColor,\n\t\t\t\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : dataset.borderWidth || lineElementOptions.borderWidth,\n\t\t\t\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : dataset.borderColor || lineElementOptions.borderColor,\n\t\t\t\t\t\t\t\tfill: custom.fill ? custom.fill : dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill,\n\t\t\t\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : dataset.borderCapStyle || lineElementOptions.borderCapStyle,\n\t\t\t\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : dataset.borderDash || lineElementOptions.borderDash,\n\t\t\t\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : dataset.borderDashOffset || lineElementOptions.borderDashOffset,\n\t\t\t\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : dataset.borderJoinStyle || lineElementOptions.borderJoinStyle\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tmeta.dataset.pivot();\n\n\t\t\t\t\t\t// Update Points\n\t\t\t\t\t\thelpers.each(points, function (point, index) {\n\t\t\t\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t\t\t\t}, me);\n\n\t\t\t\t\t\t// Update bezier control points\n\t\t\t\t\t\tme.updateBezierControlPoints();\n\t\t\t\t\t},\n\t\t\t\t\tupdateElement: function updateElement(point, index, reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar custom = point.custom || {};\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar scale = me.chart.scale;\n\t\t\t\t\t\tvar pointElementOptions = me.chart.options.elements.point;\n\t\t\t\t\t\tvar pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\n\t\t\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\t\t\tif (dataset.radius !== undefined && dataset.pointRadius === undefined) {\n\t\t\t\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (dataset.hitRadius !== undefined && dataset.pointHitRadius === undefined) {\n\t\t\t\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.extend(point, {\n\t\t\t\t\t\t\t// Utility\n\t\t\t\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t\t\t\t_index: index,\n\t\t\t\t\t\t\t_scale: scale,\n\n\t\t\t\t\t\t\t// Desired view properties\n\t\t\t\t\t\t\t_model: {\n\t\t\t\t\t\t\t\tx: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales\n\t\t\t\t\t\t\t\ty: reset ? scale.yCenter : pointPosition.y,\n\n\t\t\t\t\t\t\t\t// Appearance\n\t\t\t\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension),\n\t\t\t\t\t\t\t\tradius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),\n\t\t\t\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),\n\t\t\t\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),\n\t\t\t\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth),\n\t\t\t\t\t\t\t\tpointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle),\n\t\t\t\t\t\t\t\trotation: custom.rotation ? custom.rotation : helpers.valueAtIndexOrDefault(dataset.pointRotation, index, pointElementOptions.rotation),\n\n\t\t\t\t\t\t\t\t// Tooltip\n\t\t\t\t\t\t\t\thitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tpoint._model.skip = custom.skip ? custom.skip : isNaN(point._model.x) || isNaN(point._model.y);\n\t\t\t\t\t},\n\t\t\t\t\tupdateBezierControlPoints: function updateBezierControlPoints() {\n\t\t\t\t\t\tvar chartArea = this.chart.chartArea;\n\t\t\t\t\t\tvar meta = this.getMeta();\n\n\t\t\t\t\t\thelpers.each(meta.data, function (point, index) {\n\t\t\t\t\t\t\tvar model = point._model;\n\t\t\t\t\t\t\tvar controlPoints = helpers.splineCurve(helpers.previousItem(meta.data, index, true)._model, model, helpers.nextItem(meta.data, index, true)._model, model.tension);\n\n\t\t\t\t\t\t\t// Prevent the bezier going outside of the bounds of the graph\n\t\t\t\t\t\t\tmodel.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left);\n\t\t\t\t\t\t\tmodel.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\t\t\t\tmodel.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left);\n\t\t\t\t\t\t\tmodel.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\t\t\t\t// Now pivot the point for animation\n\t\t\t\t\t\t\tpoint.pivot();\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\n\t\t\t\t\tsetHoverStyle: function setHoverStyle(point) {\n\t\t\t\t\t\t// Point\n\t\t\t\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\t\t\t\tvar custom = point.custom || {};\n\t\t\t\t\t\tvar index = point._index;\n\t\t\t\t\t\tvar model = point._model;\n\n\t\t\t\t\t\tpoint.$previousStyle = {\n\t\t\t\t\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\t\t\t\t\tborderColor: model.borderColor,\n\t\t\t\t\t\t\tborderWidth: model.borderWidth,\n\t\t\t\t\t\t\tradius: model.radius\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmodel.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\t\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\t\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\t\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}, { \"26\": 26, \"41\": 41, \"46\": 46 }], 21: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\n\t\t\tdefaults._set('scatter', {\n\t\t\t\thover: {\n\t\t\t\t\tmode: 'single'\n\t\t\t\t},\n\n\t\t\t\tscales: {\n\t\t\t\t\txAxes: [{\n\t\t\t\t\t\tid: 'x-axis-1', // need an ID so datasets can reference the scale\n\t\t\t\t\t\ttype: 'linear', // scatter should not use a category axis\n\t\t\t\t\t\tposition: 'bottom'\n\t\t\t\t\t}],\n\t\t\t\t\tyAxes: [{\n\t\t\t\t\t\tid: 'y-axis-1',\n\t\t\t\t\t\ttype: 'linear',\n\t\t\t\t\t\tposition: 'left'\n\t\t\t\t\t}]\n\t\t\t\t},\n\n\t\t\t\tshowLines: false,\n\n\t\t\t\ttooltips: {\n\t\t\t\t\tcallbacks: {\n\t\t\t\t\t\ttitle: function title() {\n\t\t\t\t\t\t\treturn ''; // doesn't make sense for scatter since data are formatted as a point\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabel: function label(item) {\n\t\t\t\t\t\t\treturn '(' + item.xLabel + ', ' + item.yLabel + ')';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\t// Scatter charts use line controllers\n\t\t\t\tChart.controllers.scatter = Chart.controllers.line;\n\t\t\t};\n\t\t}, { \"26\": 26 }], 22: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar Element = require(27);\n\n\t\t\tvar exports = module.exports = Element.extend({\n\t\t\t\tchart: null, // the animation associated chart instance\n\t\t\t\tcurrentStep: 0, // the current animation step\n\t\t\t\tnumSteps: 60, // default number of steps\n\t\t\t\teasing: '', // the easing to use for this animation\n\t\t\t\trender: null, // render function used by the animation service\n\n\t\t\t\tonAnimationProgress: null, // user specified callback to fire on each step of the animation\n\t\t\t\tonAnimationComplete: null // user specified callback to fire when the animation finishes\n\t\t\t});\n\n\t\t\t// DEPRECATIONS\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.Animation instead\n * @prop Chart.Animation#animationObject\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n */\n\t\t\tObject.defineProperty(exports.prototype, 'animationObject', {\n\t\t\t\tget: function get() {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.Animation#chart instead\n * @prop Chart.Animation#chartInstance\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n */\n\t\t\tObject.defineProperty(exports.prototype, 'chartInstance', {\n\t\t\t\tget: function get() {\n\t\t\t\t\treturn this.chart;\n\t\t\t\t},\n\t\t\t\tset: function set(value) {\n\t\t\t\t\tthis.chart = value;\n\t\t\t\t}\n\t\t\t});\n\t\t}, { \"27\": 27 }], 23: [function (require, module, exports) {\n\t\t\t/* global window: false */\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('global', {\n\t\t\t\tanimation: {\n\t\t\t\t\tduration: 1000,\n\t\t\t\t\teasing: 'easeOutQuart',\n\t\t\t\t\tonProgress: helpers.noop,\n\t\t\t\t\tonComplete: helpers.noop\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = {\n\t\t\t\tframeDuration: 17,\n\t\t\t\tanimations: [],\n\t\t\t\tdropFrames: 0,\n\t\t\t\trequest: null,\n\n\t\t\t\t/**\n * @param {Chart} chart - The chart to animate.\n * @param {Chart.Animation} animation - The animation that we will animate.\n * @param {Number} duration - The animation duration in ms.\n * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\n */\n\t\t\t\taddAnimation: function addAnimation(chart, animation, duration, lazy) {\n\t\t\t\t\tvar animations = this.animations;\n\t\t\t\t\tvar i, ilen;\n\n\t\t\t\t\tanimation.chart = chart;\n\n\t\t\t\t\tif (!lazy) {\n\t\t\t\t\t\tchart.animating = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i = 0, ilen = animations.length; i < ilen; ++i) {\n\t\t\t\t\t\tif (animations[i].chart === chart) {\n\t\t\t\t\t\t\tanimations[i] = animation;\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tanimations.push(animation);\n\n\t\t\t\t\t// If there are no animations queued, manually kickstart a digest, for lack of a better word\n\t\t\t\t\tif (animations.length === 1) {\n\t\t\t\t\t\tthis.requestAnimationFrame();\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tcancelAnimation: function cancelAnimation(chart) {\n\t\t\t\t\tvar index = helpers.findIndex(this.animations, function (animation) {\n\t\t\t\t\t\treturn animation.chart === chart;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\tthis.animations.splice(index, 1);\n\t\t\t\t\t\tchart.animating = false;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\trequestAnimationFrame: function requestAnimationFrame() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tif (me.request === null) {\n\t\t\t\t\t\t// Skip animation frame requests until the active one is executed.\n\t\t\t\t\t\t// This can happen when processing mouse events, e.g. 'mousemove'\n\t\t\t\t\t\t// and 'mouseout' events will trigger multiple renders.\n\t\t\t\t\t\tme.request = helpers.requestAnimFrame.call(window, function () {\n\t\t\t\t\t\t\tme.request = null;\n\t\t\t\t\t\t\tme.startDigest();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * @private\n */\n\t\t\t\tstartDigest: function startDigest() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar startTime = Date.now();\n\t\t\t\t\tvar framesToDrop = 0;\n\n\t\t\t\t\tif (me.dropFrames > 1) {\n\t\t\t\t\t\tframesToDrop = Math.floor(me.dropFrames);\n\t\t\t\t\t\tme.dropFrames = me.dropFrames % 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tme.advance(1 + framesToDrop);\n\n\t\t\t\t\tvar endTime = Date.now();\n\n\t\t\t\t\tme.dropFrames += (endTime - startTime) / me.frameDuration;\n\n\t\t\t\t\t// Do we have more stuff to animate?\n\t\t\t\t\tif (me.animations.length > 0) {\n\t\t\t\t\t\tme.requestAnimationFrame();\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * @private\n */\n\t\t\t\tadvance: function advance(count) {\n\t\t\t\t\tvar animations = this.animations;\n\t\t\t\t\tvar animation, chart;\n\t\t\t\t\tvar i = 0;\n\n\t\t\t\t\twhile (i < animations.length) {\n\t\t\t\t\t\tanimation = animations[i];\n\t\t\t\t\t\tchart = animation.chart;\n\n\t\t\t\t\t\tanimation.currentStep = (animation.currentStep || 0) + count;\n\t\t\t\t\t\tanimation.currentStep = Math.min(animation.currentStep, animation.numSteps);\n\n\t\t\t\t\t\thelpers.callback(animation.render, [chart, animation], chart);\n\t\t\t\t\t\thelpers.callback(animation.onAnimationProgress, [animation], chart);\n\n\t\t\t\t\t\tif (animation.currentStep >= animation.numSteps) {\n\t\t\t\t\t\t\thelpers.callback(animation.onAnimationComplete, [animation], chart);\n\t\t\t\t\t\t\tchart.animating = false;\n\t\t\t\t\t\t\tanimations.splice(i, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t++i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"26\": 26, \"46\": 46 }], 24: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar Animation = require(22);\n\t\t\tvar animations = require(23);\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\t\t\tvar Interaction = require(29);\n\t\t\tvar layouts = require(31);\n\t\t\tvar platform = require(49);\n\t\t\tvar plugins = require(32);\n\t\t\tvar scaleService = require(34);\n\t\t\tvar Tooltip = require(36);\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\t// Create a dictionary of chart types, to allow for extension of existing types\n\t\t\t\tChart.types = {};\n\n\t\t\t\t// Store a reference to each instance - allowing us to globally resize chart instances on window resize.\n\t\t\t\t// Destroy method on the chart will remove the instance of the chart from this reference.\n\t\t\t\tChart.instances = {};\n\n\t\t\t\t// Controllers available for dataset visualization eg. bar, line, slice, etc.\n\t\t\t\tChart.controllers = {};\n\n\t\t\t\t/**\n * Initializes the given config with global and chart default values.\n */\n\t\t\t\tfunction initConfig(config) {\n\t\t\t\t\tconfig = config || {};\n\n\t\t\t\t\t// Do NOT use configMerge() for the data object because this method merges arrays\n\t\t\t\t\t// and so would change references to labels and datasets, preventing data updates.\n\t\t\t\t\tvar data = config.data = config.data || {};\n\t\t\t\t\tdata.datasets = data.datasets || [];\n\t\t\t\t\tdata.labels = data.labels || [];\n\n\t\t\t\t\tconfig.options = helpers.configMerge(defaults.global, defaults[config.type], config.options || {});\n\n\t\t\t\t\treturn config;\n\t\t\t\t}\n\n\t\t\t\t/**\n * Updates the config of the chart\n * @param chart {Chart} chart to update the options for\n */\n\t\t\t\tfunction updateConfig(chart) {\n\t\t\t\t\tvar newOptions = chart.options;\n\n\t\t\t\t\thelpers.each(chart.scales, function (scale) {\n\t\t\t\t\t\tlayouts.removeBox(chart, scale);\n\t\t\t\t\t});\n\n\t\t\t\t\tnewOptions = helpers.configMerge(Chart.defaults.global, Chart.defaults[chart.config.type], newOptions);\n\n\t\t\t\t\tchart.options = chart.config.options = newOptions;\n\t\t\t\t\tchart.ensureScalesHaveIDs();\n\t\t\t\t\tchart.buildOrUpdateScales();\n\t\t\t\t\t// Tooltip\n\t\t\t\t\tchart.tooltip._options = newOptions.tooltips;\n\t\t\t\t\tchart.tooltip.initialize();\n\t\t\t\t}\n\n\t\t\t\tfunction positionIsHorizontal(position) {\n\t\t\t\t\treturn position === 'top' || position === 'bottom';\n\t\t\t\t}\n\n\t\t\t\thelpers.extend(Chart.prototype, /** @lends Chart */{\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tconstruct: function construct(item, config) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tconfig = initConfig(config);\n\n\t\t\t\t\t\tvar context = platform.acquireContext(item, config);\n\t\t\t\t\t\tvar canvas = context && context.canvas;\n\t\t\t\t\t\tvar height = canvas && canvas.height;\n\t\t\t\t\t\tvar width = canvas && canvas.width;\n\n\t\t\t\t\t\tme.id = helpers.uid();\n\t\t\t\t\t\tme.ctx = context;\n\t\t\t\t\t\tme.canvas = canvas;\n\t\t\t\t\t\tme.config = config;\n\t\t\t\t\t\tme.width = width;\n\t\t\t\t\t\tme.height = height;\n\t\t\t\t\t\tme.aspectRatio = height ? width / height : null;\n\t\t\t\t\t\tme.options = config.options;\n\t\t\t\t\t\tme._bufferedRender = false;\n\n\t\t\t\t\t\t/**\n * Provided for backward compatibility, Chart and Chart.Controller have been merged,\n * the \"instance\" still need to be defined since it might be called from plugins.\n * @prop Chart#chart\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n\t\t\t\t\t\tme.chart = me;\n\t\t\t\t\t\tme.controller = me; // chart.chart.controller #inception\n\n\t\t\t\t\t\t// Add the chart instance to the global namespace\n\t\t\t\t\t\tChart.instances[me.id] = me;\n\n\t\t\t\t\t\t// Define alias to the config data: `chart.data === chart.config.data`\n\t\t\t\t\t\tObject.defineProperty(me, 'data', {\n\t\t\t\t\t\t\tget: function get() {\n\t\t\t\t\t\t\t\treturn me.config.data;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tset: function set(value) {\n\t\t\t\t\t\t\t\tme.config.data = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!context || !canvas) {\n\t\t\t\t\t\t\t// The given item is not a compatible context2d element, let's return before finalizing\n\t\t\t\t\t\t\t// the chart initialization but after setting basic chart / controller properties that\n\t\t\t\t\t\t\t// can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n\t\t\t\t\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\t\t\t\t\tconsole.error(\"Failed to create chart: can't acquire context from the given item\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.initialize();\n\t\t\t\t\t\tme.update();\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tinitialize: function initialize() {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\t// Before init plugin notification\n\t\t\t\t\t\tplugins.notify(me, 'beforeInit');\n\n\t\t\t\t\t\thelpers.retinaScale(me, me.options.devicePixelRatio);\n\n\t\t\t\t\t\tme.bindEvents();\n\n\t\t\t\t\t\tif (me.options.responsive) {\n\t\t\t\t\t\t\t// Initial resize before chart draws (must be silent to preserve initial animations).\n\t\t\t\t\t\t\tme.resize(true);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Make sure scales have IDs and are built before we build any controllers.\n\t\t\t\t\t\tme.ensureScalesHaveIDs();\n\t\t\t\t\t\tme.buildOrUpdateScales();\n\t\t\t\t\t\tme.initToolTip();\n\n\t\t\t\t\t\t// After init plugin notification\n\t\t\t\t\t\tplugins.notify(me, 'afterInit');\n\n\t\t\t\t\t\treturn me;\n\t\t\t\t\t},\n\n\t\t\t\t\tclear: function clear() {\n\t\t\t\t\t\thelpers.canvas.clear(this);\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t},\n\n\t\t\t\t\tstop: function stop() {\n\t\t\t\t\t\t// Stops any current animation loop occurring\n\t\t\t\t\t\tanimations.cancelAnimation(this);\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t},\n\n\t\t\t\t\tresize: function resize(silent) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar options = me.options;\n\t\t\t\t\t\tvar canvas = me.canvas;\n\t\t\t\t\t\tvar aspectRatio = options.maintainAspectRatio && me.aspectRatio || null;\n\n\t\t\t\t\t\t// the canvas render width and height will be casted to integers so make sure that\n\t\t\t\t\t\t// the canvas display style uses the same integer values to avoid blurring effect.\n\n\t\t\t\t\t\t// Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed\n\t\t\t\t\t\tvar newWidth = Math.max(0, Math.floor(helpers.getMaximumWidth(canvas)));\n\t\t\t\t\t\tvar newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas)));\n\n\t\t\t\t\t\tif (me.width === newWidth && me.height === newHeight) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcanvas.width = me.width = newWidth;\n\t\t\t\t\t\tcanvas.height = me.height = newHeight;\n\t\t\t\t\t\tcanvas.style.width = newWidth + 'px';\n\t\t\t\t\t\tcanvas.style.height = newHeight + 'px';\n\n\t\t\t\t\t\thelpers.retinaScale(me, options.devicePixelRatio);\n\n\t\t\t\t\t\tif (!silent) {\n\t\t\t\t\t\t\t// Notify any plugins about the resize\n\t\t\t\t\t\t\tvar newSize = { width: newWidth, height: newHeight };\n\t\t\t\t\t\t\tplugins.notify(me, 'resize', [newSize]);\n\n\t\t\t\t\t\t\t// Notify of resize\n\t\t\t\t\t\t\tif (me.options.onResize) {\n\t\t\t\t\t\t\t\tme.options.onResize(me, newSize);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tme.stop();\n\t\t\t\t\t\t\tme.update({\n\t\t\t\t\t\t\t\tduration: me.options.responsiveAnimationDuration\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tensureScalesHaveIDs: function ensureScalesHaveIDs() {\n\t\t\t\t\t\tvar options = this.options;\n\t\t\t\t\t\tvar scalesOptions = options.scales || {};\n\t\t\t\t\t\tvar scaleOptions = options.scale;\n\n\t\t\t\t\t\thelpers.each(scalesOptions.xAxes, function (xAxisOptions, index) {\n\t\t\t\t\t\t\txAxisOptions.id = xAxisOptions.id || 'x-axis-' + index;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\thelpers.each(scalesOptions.yAxes, function (yAxisOptions, index) {\n\t\t\t\t\t\t\tyAxisOptions.id = yAxisOptions.id || 'y-axis-' + index;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (scaleOptions) {\n\t\t\t\t\t\t\tscaleOptions.id = scaleOptions.id || 'scale';\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Builds a map of scale ID to scale object for future lookup.\n */\n\t\t\t\t\tbuildOrUpdateScales: function buildOrUpdateScales() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar options = me.options;\n\t\t\t\t\t\tvar scales = me.scales || {};\n\t\t\t\t\t\tvar items = [];\n\t\t\t\t\t\tvar updated = Object.keys(scales).reduce(function (obj, id) {\n\t\t\t\t\t\t\tobj[id] = false;\n\t\t\t\t\t\t\treturn obj;\n\t\t\t\t\t\t}, {});\n\n\t\t\t\t\t\tif (options.scales) {\n\t\t\t\t\t\t\titems = items.concat((options.scales.xAxes || []).map(function (xAxisOptions) {\n\t\t\t\t\t\t\t\treturn { options: xAxisOptions, dtype: 'category', dposition: 'bottom' };\n\t\t\t\t\t\t\t}), (options.scales.yAxes || []).map(function (yAxisOptions) {\n\t\t\t\t\t\t\t\treturn { options: yAxisOptions, dtype: 'linear', dposition: 'left' };\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (options.scale) {\n\t\t\t\t\t\t\titems.push({\n\t\t\t\t\t\t\t\toptions: options.scale,\n\t\t\t\t\t\t\t\tdtype: 'radialLinear',\n\t\t\t\t\t\t\t\tisDefault: true,\n\t\t\t\t\t\t\t\tdposition: 'chartArea'\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.each(items, function (item) {\n\t\t\t\t\t\t\tvar scaleOptions = item.options;\n\t\t\t\t\t\t\tvar id = scaleOptions.id;\n\t\t\t\t\t\t\tvar scaleType = helpers.valueOrDefault(scaleOptions.type, item.dtype);\n\n\t\t\t\t\t\t\tif (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {\n\t\t\t\t\t\t\t\tscaleOptions.position = item.dposition;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tupdated[id] = true;\n\t\t\t\t\t\t\tvar scale = null;\n\t\t\t\t\t\t\tif (id in scales && scales[id].type === scaleType) {\n\t\t\t\t\t\t\t\tscale = scales[id];\n\t\t\t\t\t\t\t\tscale.options = scaleOptions;\n\t\t\t\t\t\t\t\tscale.ctx = me.ctx;\n\t\t\t\t\t\t\t\tscale.chart = me;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tvar scaleClass = scaleService.getScaleConstructor(scaleType);\n\t\t\t\t\t\t\t\tif (!scaleClass) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tscale = new scaleClass({\n\t\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\t\ttype: scaleType,\n\t\t\t\t\t\t\t\t\toptions: scaleOptions,\n\t\t\t\t\t\t\t\t\tctx: me.ctx,\n\t\t\t\t\t\t\t\t\tchart: me\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tscales[scale.id] = scale;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tscale.mergeTicksOptions();\n\n\t\t\t\t\t\t\t// TODO(SB): I think we should be able to remove this custom case (options.scale)\n\t\t\t\t\t\t\t// and consider it as a regular scale part of the \"scales\"\" map only! This would\n\t\t\t\t\t\t\t// make the logic easier and remove some useless? custom code.\n\t\t\t\t\t\t\tif (item.isDefault) {\n\t\t\t\t\t\t\t\tme.scale = scale;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\t// clear up discarded scales\n\t\t\t\t\t\thelpers.each(updated, function (hasUpdated, id) {\n\t\t\t\t\t\t\tif (!hasUpdated) {\n\t\t\t\t\t\t\t\tdelete scales[id];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tme.scales = scales;\n\n\t\t\t\t\t\tscaleService.addScalesToLayout(this);\n\t\t\t\t\t},\n\n\t\t\t\t\tbuildOrUpdateControllers: function buildOrUpdateControllers() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar types = [];\n\t\t\t\t\t\tvar newControllers = [];\n\n\t\t\t\t\t\thelpers.each(me.data.datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\tvar meta = me.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\tvar type = dataset.type || me.config.type;\n\n\t\t\t\t\t\t\tif (meta.type && meta.type !== type) {\n\t\t\t\t\t\t\t\tme.destroyDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t\tmeta = me.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmeta.type = type;\n\n\t\t\t\t\t\t\ttypes.push(meta.type);\n\n\t\t\t\t\t\t\tif (meta.controller) {\n\t\t\t\t\t\t\t\tmeta.controller.updateIndex(datasetIndex);\n\t\t\t\t\t\t\t\tmeta.controller.linkScales();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tvar ControllerClass = Chart.controllers[meta.type];\n\t\t\t\t\t\t\t\tif (ControllerClass === undefined) {\n\t\t\t\t\t\t\t\t\tthrow new Error('\"' + meta.type + '\" is not a chart type.');\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tmeta.controller = new ControllerClass(me, datasetIndex);\n\t\t\t\t\t\t\t\tnewControllers.push(meta.controller);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, me);\n\n\t\t\t\t\t\treturn newControllers;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Reset the elements of all datasets\n * @private\n */\n\t\t\t\t\tresetElements: function resetElements() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\thelpers.each(me.data.datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\tme.getDatasetMeta(datasetIndex).controller.reset();\n\t\t\t\t\t\t}, me);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Resets the chart back to it's state before the initial animation\n */\n\t\t\t\t\treset: function reset() {\n\t\t\t\t\t\tthis.resetElements();\n\t\t\t\t\t\tthis.tooltip.initialize();\n\t\t\t\t\t},\n\n\t\t\t\t\tupdate: function update(config) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tif (!config || (typeof config === \"undefined\" ? \"undefined\" : _typeof(config)) !== 'object') {\n\t\t\t\t\t\t\t// backwards compatibility\n\t\t\t\t\t\t\tconfig = {\n\t\t\t\t\t\t\t\tduration: config,\n\t\t\t\t\t\t\t\tlazy: arguments[1]\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tupdateConfig(me);\n\n\t\t\t\t\t\t// plugins options references might have change, let's invalidate the cache\n\t\t\t\t\t\t// https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n\t\t\t\t\t\tplugins._invalidate(me);\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeUpdate') === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// In case the entire data object changed\n\t\t\t\t\t\tme.tooltip._data = me.data;\n\n\t\t\t\t\t\t// Make sure dataset controllers are updated and new controllers are reset\n\t\t\t\t\t\tvar newControllers = me.buildOrUpdateControllers();\n\n\t\t\t\t\t\t// Make sure all dataset controllers have correct meta data counts\n\t\t\t\t\t\thelpers.each(me.data.datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\tme.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\n\t\t\t\t\t\t}, me);\n\n\t\t\t\t\t\tme.updateLayout();\n\n\t\t\t\t\t\t// Can only reset the new controllers after the scales have been updated\n\t\t\t\t\t\tif (me.options.animation && me.options.animation.duration) {\n\t\t\t\t\t\t\thelpers.each(newControllers, function (controller) {\n\t\t\t\t\t\t\t\tcontroller.reset();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.updateDatasets();\n\n\t\t\t\t\t\t// Need to reset tooltip in case it is displayed with elements that are removed\n\t\t\t\t\t\t// after update.\n\t\t\t\t\t\tme.tooltip.initialize();\n\n\t\t\t\t\t\t// Last active contains items that were previously in the tooltip.\n\t\t\t\t\t\t// When we reset the tooltip, we need to clear it\n\t\t\t\t\t\tme.lastActive = [];\n\n\t\t\t\t\t\t// Do this before render so that any plugins that need final scale updates can use it\n\t\t\t\t\t\tplugins.notify(me, 'afterUpdate');\n\n\t\t\t\t\t\tif (me._bufferedRender) {\n\t\t\t\t\t\t\tme._bufferedRequest = {\n\t\t\t\t\t\t\t\tduration: config.duration,\n\t\t\t\t\t\t\t\teasing: config.easing,\n\t\t\t\t\t\t\t\tlazy: config.lazy\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tme.render(config);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n * hook, in which case, plugins will not be called on `afterLayout`.\n * @private\n */\n\t\t\t\t\tupdateLayout: function updateLayout() {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeLayout') === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlayouts.update(this, this.width, this.height);\n\n\t\t\t\t\t\t/**\n * Provided for backward compatibility, use `afterLayout` instead.\n * @method IPlugin#afterScaleUpdate\n * @deprecated since version 2.5.0\n * @todo remove at version 3\n * @private\n */\n\t\t\t\t\t\tplugins.notify(me, 'afterScaleUpdate');\n\t\t\t\t\t\tplugins.notify(me, 'afterLayout');\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n * @private\n */\n\t\t\t\t\tupdateDatasets: function updateDatasets() {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tme.updateDataset(i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tplugins.notify(me, 'afterDatasetsUpdate');\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n * @private\n */\n\t\t\t\t\tupdateDataset: function updateDataset(index) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getDatasetMeta(index);\n\t\t\t\t\t\tvar args = {\n\t\t\t\t\t\t\tmeta: meta,\n\t\t\t\t\t\t\tindex: index\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmeta.controller.update();\n\n\t\t\t\t\t\tplugins.notify(me, 'afterDatasetUpdate', [args]);\n\t\t\t\t\t},\n\n\t\t\t\t\trender: function render(config) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tif (!config || (typeof config === \"undefined\" ? \"undefined\" : _typeof(config)) !== 'object') {\n\t\t\t\t\t\t\t// backwards compatibility\n\t\t\t\t\t\t\tconfig = {\n\t\t\t\t\t\t\t\tduration: config,\n\t\t\t\t\t\t\t\tlazy: arguments[1]\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar duration = config.duration;\n\t\t\t\t\t\tvar lazy = config.lazy;\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeRender') === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar animationOptions = me.options.animation;\n\t\t\t\t\t\tvar onComplete = function onComplete(animation) {\n\t\t\t\t\t\t\tplugins.notify(me, 'afterRender');\n\t\t\t\t\t\t\thelpers.callback(animationOptions && animationOptions.onComplete, [animation], me);\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (animationOptions && (typeof duration !== 'undefined' && duration !== 0 || typeof duration === 'undefined' && animationOptions.duration !== 0)) {\n\t\t\t\t\t\t\tvar animation = new Animation({\n\t\t\t\t\t\t\t\tnumSteps: (duration || animationOptions.duration) / 16.66, // 60 fps\n\t\t\t\t\t\t\t\teasing: config.easing || animationOptions.easing,\n\n\t\t\t\t\t\t\t\trender: function render(chart, animationObject) {\n\t\t\t\t\t\t\t\t\tvar easingFunction = helpers.easing.effects[animationObject.easing];\n\t\t\t\t\t\t\t\t\tvar currentStep = animationObject.currentStep;\n\t\t\t\t\t\t\t\t\tvar stepDecimal = currentStep / animationObject.numSteps;\n\n\t\t\t\t\t\t\t\t\tchart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\tonAnimationProgress: animationOptions.onProgress,\n\t\t\t\t\t\t\t\tonAnimationComplete: onComplete\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tanimations.addAnimation(me, animation, duration, lazy);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tme.draw();\n\n\t\t\t\t\t\t\t// See https://github.com/chartjs/Chart.js/issues/3781\n\t\t\t\t\t\t\tonComplete(new Animation({ numSteps: 0, chart: me }));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn me;\n\t\t\t\t\t},\n\n\t\t\t\t\tdraw: function draw(easingValue) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tme.clear();\n\n\t\t\t\t\t\tif (helpers.isNullOrUndef(easingValue)) {\n\t\t\t\t\t\t\teasingValue = 1;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.transition(easingValue);\n\n\t\t\t\t\t\tif (me.width <= 0 || me.height <= 0) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Draw all the scales\n\t\t\t\t\t\thelpers.each(me.boxes, function (box) {\n\t\t\t\t\t\t\tbox.draw(me.chartArea);\n\t\t\t\t\t\t}, me);\n\n\t\t\t\t\t\tif (me.scale) {\n\t\t\t\t\t\t\tme.scale.draw();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.drawDatasets(easingValue);\n\t\t\t\t\t\tme._drawTooltip(easingValue);\n\n\t\t\t\t\t\tplugins.notify(me, 'afterDraw', [easingValue]);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\ttransition: function transition(easingValue) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tfor (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\t\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\t\t\t\t\tme.getDatasetMeta(i).controller.transition(easingValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.tooltip.transition(easingValue);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n * @private\n */\n\t\t\t\t\tdrawDatasets: function drawDatasets(easingValue) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Draw datasets reversed to support proper line stacking\n\t\t\t\t\t\tfor (var i = (me.data.datasets || []).length - 1; i >= 0; --i) {\n\t\t\t\t\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\t\t\t\t\tme.drawDataset(i, easingValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tplugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n * @private\n */\n\t\t\t\t\tdrawDataset: function drawDataset(index, easingValue) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getDatasetMeta(index);\n\t\t\t\t\t\tvar args = {\n\t\t\t\t\t\t\tmeta: meta,\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\teasingValue: easingValue\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmeta.controller.draw(easingValue);\n\n\t\t\t\t\t\tplugins.notify(me, 'afterDatasetDraw', [args]);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw`\n * hook, in which case, plugins will not be called on `afterTooltipDraw`.\n * @private\n */\n\t\t\t\t\t_drawTooltip: function _drawTooltip(easingValue) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar tooltip = me.tooltip;\n\t\t\t\t\t\tvar args = {\n\t\t\t\t\t\t\ttooltip: tooltip,\n\t\t\t\t\t\t\teasingValue: easingValue\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeTooltipDraw', [args]) === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttooltip.draw();\n\n\t\t\t\t\t\tplugins.notify(me, 'afterTooltipDraw', [args]);\n\t\t\t\t\t},\n\n\t\t\t\t\t// Get the single element that was clicked on\n\t\t\t\t\t// @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\n\t\t\t\t\tgetElementAtEvent: function getElementAtEvent(e) {\n\t\t\t\t\t\treturn Interaction.modes.single(this, e);\n\t\t\t\t\t},\n\n\t\t\t\t\tgetElementsAtEvent: function getElementsAtEvent(e) {\n\t\t\t\t\t\treturn Interaction.modes.label(this, e, { intersect: true });\n\t\t\t\t\t},\n\n\t\t\t\t\tgetElementsAtXAxis: function getElementsAtXAxis(e) {\n\t\t\t\t\t\treturn Interaction.modes['x-axis'](this, e, { intersect: true });\n\t\t\t\t\t},\n\n\t\t\t\t\tgetElementsAtEventForMode: function getElementsAtEventForMode(e, mode, options) {\n\t\t\t\t\t\tvar method = Interaction.modes[mode];\n\t\t\t\t\t\tif (typeof method === 'function') {\n\t\t\t\t\t\t\treturn method(this, e, options);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t},\n\n\t\t\t\t\tgetDatasetAtEvent: function getDatasetAtEvent(e) {\n\t\t\t\t\t\treturn Interaction.modes.dataset(this, e, { intersect: true });\n\t\t\t\t\t},\n\n\t\t\t\t\tgetDatasetMeta: function getDatasetMeta(datasetIndex) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar dataset = me.data.datasets[datasetIndex];\n\t\t\t\t\t\tif (!dataset._meta) {\n\t\t\t\t\t\t\tdataset._meta = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar meta = dataset._meta[me.id];\n\t\t\t\t\t\tif (!meta) {\n\t\t\t\t\t\t\tmeta = dataset._meta[me.id] = {\n\t\t\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\t\t\tdata: [],\n\t\t\t\t\t\t\t\tdataset: null,\n\t\t\t\t\t\t\t\tcontroller: null,\n\t\t\t\t\t\t\t\thidden: null, // See isDatasetVisible() comment\n\t\t\t\t\t\t\t\txAxisID: null,\n\t\t\t\t\t\t\t\tyAxisID: null\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn meta;\n\t\t\t\t\t},\n\n\t\t\t\t\tgetVisibleDatasetCount: function getVisibleDatasetCount() {\n\t\t\t\t\t\tvar count = 0;\n\t\t\t\t\t\tfor (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tif (this.isDatasetVisible(i)) {\n\t\t\t\t\t\t\t\tcount++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn count;\n\t\t\t\t\t},\n\n\t\t\t\t\tisDatasetVisible: function isDatasetVisible(datasetIndex) {\n\t\t\t\t\t\tvar meta = this.getDatasetMeta(datasetIndex);\n\n\t\t\t\t\t\t// meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n\t\t\t\t\t\t// the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n\t\t\t\t\t\treturn typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n\t\t\t\t\t},\n\n\t\t\t\t\tgenerateLegend: function generateLegend() {\n\t\t\t\t\t\treturn this.options.legendCallback(this);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tdestroyDatasetMeta: function destroyDatasetMeta(datasetIndex) {\n\t\t\t\t\t\tvar id = this.id;\n\t\t\t\t\t\tvar dataset = this.data.datasets[datasetIndex];\n\t\t\t\t\t\tvar meta = dataset._meta && dataset._meta[id];\n\n\t\t\t\t\t\tif (meta) {\n\t\t\t\t\t\t\tmeta.controller.destroy();\n\t\t\t\t\t\t\tdelete dataset._meta[id];\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tdestroy: function destroy() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar canvas = me.canvas;\n\t\t\t\t\t\tvar i, ilen;\n\n\t\t\t\t\t\tme.stop();\n\n\t\t\t\t\t\t// dataset controllers need to cleanup associated data\n\t\t\t\t\t\tfor (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tme.destroyDatasetMeta(i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (canvas) {\n\t\t\t\t\t\t\tme.unbindEvents();\n\t\t\t\t\t\t\thelpers.canvas.clear(me);\n\t\t\t\t\t\t\tplatform.releaseContext(me.ctx);\n\t\t\t\t\t\t\tme.canvas = null;\n\t\t\t\t\t\t\tme.ctx = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tplugins.notify(me, 'destroy');\n\n\t\t\t\t\t\tdelete Chart.instances[me.id];\n\t\t\t\t\t},\n\n\t\t\t\t\ttoBase64Image: function toBase64Image() {\n\t\t\t\t\t\treturn this.canvas.toDataURL.apply(this.canvas, arguments);\n\t\t\t\t\t},\n\n\t\t\t\t\tinitToolTip: function initToolTip() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tme.tooltip = new Tooltip({\n\t\t\t\t\t\t\t_chart: me,\n\t\t\t\t\t\t\t_chartInstance: me, // deprecated, backward compatibility\n\t\t\t\t\t\t\t_data: me.data,\n\t\t\t\t\t\t\t_options: me.options.tooltips\n\t\t\t\t\t\t}, me);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tbindEvents: function bindEvents() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar listeners = me._listeners = {};\n\t\t\t\t\t\tvar listener = function listener() {\n\t\t\t\t\t\t\tme.eventHandler.apply(me, arguments);\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\thelpers.each(me.options.events, function (type) {\n\t\t\t\t\t\t\tplatform.addEventListener(me, type, listener);\n\t\t\t\t\t\t\tlisteners[type] = listener;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Elements used to detect size change should not be injected for non responsive charts.\n\t\t\t\t\t\t// See https://github.com/chartjs/Chart.js/issues/2210\n\t\t\t\t\t\tif (me.options.responsive) {\n\t\t\t\t\t\t\tlistener = function listener() {\n\t\t\t\t\t\t\t\tme.resize();\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tplatform.addEventListener(me, 'resize', listener);\n\t\t\t\t\t\t\tlisteners.resize = listener;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tunbindEvents: function unbindEvents() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar listeners = me._listeners;\n\t\t\t\t\t\tif (!listeners) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdelete me._listeners;\n\t\t\t\t\t\thelpers.each(listeners, function (listener, type) {\n\t\t\t\t\t\t\tplatform.removeEventListener(me, type, listener);\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\n\t\t\t\t\tupdateHoverStyle: function updateHoverStyle(elements, mode, enabled) {\n\t\t\t\t\t\tvar method = enabled ? 'setHoverStyle' : 'removeHoverStyle';\n\t\t\t\t\t\tvar element, i, ilen;\n\n\t\t\t\t\t\tfor (i = 0, ilen = elements.length; i < ilen; ++i) {\n\t\t\t\t\t\t\telement = elements[i];\n\t\t\t\t\t\t\tif (element) {\n\t\t\t\t\t\t\t\tthis.getDatasetMeta(element._datasetIndex).controller[method](element);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\teventHandler: function eventHandler(e) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar tooltip = me.tooltip;\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeEvent', [e]) === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Buffer any update calls so that renders do not occur\n\t\t\t\t\t\tme._bufferedRender = true;\n\t\t\t\t\t\tme._bufferedRequest = null;\n\n\t\t\t\t\t\tvar changed = me.handleEvent(e);\n\t\t\t\t\t\t// for smooth tooltip animations issue #4989\n\t\t\t\t\t\t// the tooltip should be the source of change\n\t\t\t\t\t\t// Animation check workaround:\n\t\t\t\t\t\t// tooltip._start will be null when tooltip isn't animating\n\t\t\t\t\t\tif (tooltip) {\n\t\t\t\t\t\t\tchanged = tooltip._start ? tooltip.handleEvent(e) : changed | tooltip.handleEvent(e);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tplugins.notify(me, 'afterEvent', [e]);\n\n\t\t\t\t\t\tvar bufferedRequest = me._bufferedRequest;\n\t\t\t\t\t\tif (bufferedRequest) {\n\t\t\t\t\t\t\t// If we have an update that was triggered, we need to do a normal render\n\t\t\t\t\t\t\tme.render(bufferedRequest);\n\t\t\t\t\t\t} else if (changed && !me.animating) {\n\t\t\t\t\t\t\t// If entering, leaving, or changing elements, animate the change via pivot\n\t\t\t\t\t\t\tme.stop();\n\n\t\t\t\t\t\t\t// We only need to render at this point. Updating will cause scales to be\n\t\t\t\t\t\t\t// recomputed generating flicker & using more memory than necessary.\n\t\t\t\t\t\t\tme.render({\n\t\t\t\t\t\t\t\tduration: me.options.hover.animationDuration,\n\t\t\t\t\t\t\t\tlazy: true\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme._bufferedRender = false;\n\t\t\t\t\t\tme._bufferedRequest = null;\n\n\t\t\t\t\t\treturn me;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Handle an event\n * @private\n * @param {IEvent} event the event to handle\n * @return {Boolean} true if the chart needs to re-render\n */\n\t\t\t\t\thandleEvent: function handleEvent(e) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar options = me.options || {};\n\t\t\t\t\t\tvar hoverOptions = options.hover;\n\t\t\t\t\t\tvar changed = false;\n\n\t\t\t\t\t\tme.lastActive = me.lastActive || [];\n\n\t\t\t\t\t\t// Find Active Elements for hover and tooltips\n\t\t\t\t\t\tif (e.type === 'mouseout') {\n\t\t\t\t\t\t\tme.active = [];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tme.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Invoke onHover hook\n\t\t\t\t\t\t// Need to call with native event here to not break backwards compatibility\n\t\t\t\t\t\thelpers.callback(options.onHover || options.hover.onHover, [e.native, me.active], me);\n\n\t\t\t\t\t\tif (e.type === 'mouseup' || e.type === 'click') {\n\t\t\t\t\t\t\tif (options.onClick) {\n\t\t\t\t\t\t\t\t// Use e.native here for backwards compatibility\n\t\t\t\t\t\t\t\toptions.onClick.call(me, e.native, me.active);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Remove styling for last active (even if it may still be active)\n\t\t\t\t\t\tif (me.lastActive.length) {\n\t\t\t\t\t\t\tme.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Built in hover styling\n\t\t\t\t\t\tif (me.active.length && hoverOptions.mode) {\n\t\t\t\t\t\t\tme.updateHoverStyle(me.active, hoverOptions.mode, true);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchanged = !helpers.arrayEquals(me.active, me.lastActive);\n\n\t\t\t\t\t\t// Remember Last Actives\n\t\t\t\t\t\tme.lastActive = me.active;\n\n\t\t\t\t\t\treturn changed;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t/**\n * Provided for backward compatibility, use Chart instead.\n * @class Chart.Controller\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n\t\t\t\tChart.Controller = Chart;\n\t\t\t};\n\t\t}, { \"22\": 22, \"23\": 23, \"26\": 26, \"29\": 29, \"31\": 31, \"32\": 32, \"34\": 34, \"36\": 36, \"46\": 46, \"49\": 49 }], 25: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tvar arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\n\n\t\t\t\t/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\n */\n\t\t\t\tfunction listenArrayEvents(array, listener) {\n\t\t\t\t\tif (array._chartjs) {\n\t\t\t\t\t\tarray._chartjs.listeners.push(listener);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tObject.defineProperty(array, '_chartjs', {\n\t\t\t\t\t\tconfigurable: true,\n\t\t\t\t\t\tenumerable: false,\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\tlisteners: [listener]\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tarrayEvents.forEach(function (key) {\n\t\t\t\t\t\tvar method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n\t\t\t\t\t\tvar base = array[key];\n\n\t\t\t\t\t\tObject.defineProperty(array, key, {\n\t\t\t\t\t\t\tconfigurable: true,\n\t\t\t\t\t\t\tenumerable: false,\n\t\t\t\t\t\t\tvalue: function value() {\n\t\t\t\t\t\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\t\t\t\t\t\tvar res = base.apply(this, args);\n\n\t\t\t\t\t\t\t\thelpers.each(array._chartjs.listeners, function (object) {\n\t\t\t\t\t\t\t\t\tif (typeof object[method] === 'function') {\n\t\t\t\t\t\t\t\t\t\tobject[method].apply(object, args);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\treturn res;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\n\t\t\t\tfunction unlistenArrayEvents(array, listener) {\n\t\t\t\t\tvar stub = array._chartjs;\n\t\t\t\t\tif (!stub) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar listeners = stub.listeners;\n\t\t\t\t\tvar index = listeners.indexOf(listener);\n\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\tlisteners.splice(index, 1);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (listeners.length > 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tarrayEvents.forEach(function (key) {\n\t\t\t\t\t\tdelete array[key];\n\t\t\t\t\t});\n\n\t\t\t\t\tdelete array._chartjs;\n\t\t\t\t}\n\n\t\t\t\t// Base class for all dataset controllers (line, bar, etc)\n\t\t\t\tChart.DatasetController = function (chart, datasetIndex) {\n\t\t\t\t\tthis.initialize(chart, datasetIndex);\n\t\t\t\t};\n\n\t\t\t\thelpers.extend(Chart.DatasetController.prototype, {\n\n\t\t\t\t\t/**\n * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n * @type {Chart.core.element}\n */\n\t\t\t\t\tdatasetElementType: null,\n\n\t\t\t\t\t/**\n * Element type used to generate a meta data (e.g. Chart.element.Point).\n * @type {Chart.core.element}\n */\n\t\t\t\t\tdataElementType: null,\n\n\t\t\t\t\tinitialize: function initialize(chart, datasetIndex) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tme.chart = chart;\n\t\t\t\t\t\tme.index = datasetIndex;\n\t\t\t\t\t\tme.linkScales();\n\t\t\t\t\t\tme.addElements();\n\t\t\t\t\t},\n\n\t\t\t\t\tupdateIndex: function updateIndex(datasetIndex) {\n\t\t\t\t\t\tthis.index = datasetIndex;\n\t\t\t\t\t},\n\n\t\t\t\t\tlinkScales: function linkScales() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\n\t\t\t\t\t\tif (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) {\n\t\t\t\t\t\t\tmeta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) {\n\t\t\t\t\t\t\tmeta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tgetDataset: function getDataset() {\n\t\t\t\t\t\treturn this.chart.data.datasets[this.index];\n\t\t\t\t\t},\n\n\t\t\t\t\tgetMeta: function getMeta() {\n\t\t\t\t\t\treturn this.chart.getDatasetMeta(this.index);\n\t\t\t\t\t},\n\n\t\t\t\t\tgetScaleForId: function getScaleForId(scaleID) {\n\t\t\t\t\t\treturn this.chart.scales[scaleID];\n\t\t\t\t\t},\n\n\t\t\t\t\treset: function reset() {\n\t\t\t\t\t\tthis.update(true);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tdestroy: function destroy() {\n\t\t\t\t\t\tif (this._data) {\n\t\t\t\t\t\t\tunlistenArrayEvents(this._data, this);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tcreateMetaDataset: function createMetaDataset() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar type = me.datasetElementType;\n\t\t\t\t\t\treturn type && new type({\n\t\t\t\t\t\t\t_chart: me.chart,\n\t\t\t\t\t\t\t_datasetIndex: me.index\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\n\t\t\t\t\tcreateMetaData: function createMetaData(index) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar type = me.dataElementType;\n\t\t\t\t\t\treturn type && new type({\n\t\t\t\t\t\t\t_chart: me.chart,\n\t\t\t\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t\t\t\t_index: index\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\n\t\t\t\t\taddElements: function addElements() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar data = me.getDataset().data || [];\n\t\t\t\t\t\tvar metaData = meta.data;\n\t\t\t\t\t\tvar i, ilen;\n\n\t\t\t\t\t\tfor (i = 0, ilen = data.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tmetaData[i] = metaData[i] || me.createMetaData(i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmeta.dataset = meta.dataset || me.createMetaDataset();\n\t\t\t\t\t},\n\n\t\t\t\t\taddElementAndReset: function addElementAndReset(index) {\n\t\t\t\t\t\tvar element = this.createMetaData(index);\n\t\t\t\t\t\tthis.getMeta().data.splice(index, 0, element);\n\t\t\t\t\t\tthis.updateElement(element, index, true);\n\t\t\t\t\t},\n\n\t\t\t\t\tbuildOrUpdateElements: function buildOrUpdateElements() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar data = dataset.data || (dataset.data = []);\n\n\t\t\t\t\t\t// In order to correctly handle data addition/deletion animation (an thus simulate\n\t\t\t\t\t\t// real-time charts), we need to monitor these data modifications and synchronize\n\t\t\t\t\t\t// the internal meta data accordingly.\n\t\t\t\t\t\tif (me._data !== data) {\n\t\t\t\t\t\t\tif (me._data) {\n\t\t\t\t\t\t\t\t// This case happens when the user replaced the data array instance.\n\t\t\t\t\t\t\t\tunlistenArrayEvents(me._data, me);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlistenArrayEvents(data, me);\n\t\t\t\t\t\t\tme._data = data;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Re-sync meta data in case the user replaced the data array or if we missed\n\t\t\t\t\t\t// any updates and so make sure that we handle number of datapoints changing.\n\t\t\t\t\t\tme.resyncElements();\n\t\t\t\t\t},\n\n\t\t\t\t\tupdate: helpers.noop,\n\n\t\t\t\t\ttransition: function transition(easingValue) {\n\t\t\t\t\t\tvar meta = this.getMeta();\n\t\t\t\t\t\tvar elements = meta.data || [];\n\t\t\t\t\t\tvar ilen = elements.length;\n\t\t\t\t\t\tvar i = 0;\n\n\t\t\t\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\t\t\t\telements[i].transition(easingValue);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (meta.dataset) {\n\t\t\t\t\t\t\tmeta.dataset.transition(easingValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tdraw: function draw() {\n\t\t\t\t\t\tvar meta = this.getMeta();\n\t\t\t\t\t\tvar elements = meta.data || [];\n\t\t\t\t\t\tvar ilen = elements.length;\n\t\t\t\t\t\tvar i = 0;\n\n\t\t\t\t\t\tif (meta.dataset) {\n\t\t\t\t\t\t\tmeta.dataset.draw();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\t\t\t\telements[i].draw();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tremoveHoverStyle: function removeHoverStyle(element) {\n\t\t\t\t\t\thelpers.merge(element._model, element.$previousStyle || {});\n\t\t\t\t\t\tdelete element.$previousStyle;\n\t\t\t\t\t},\n\n\t\t\t\t\tsetHoverStyle: function setHoverStyle(element) {\n\t\t\t\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\n\t\t\t\t\t\tvar index = element._index;\n\t\t\t\t\t\tvar custom = element.custom || {};\n\t\t\t\t\t\tvar valueOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\tvar getHoverColor = helpers.getHoverColor;\n\t\t\t\t\t\tvar model = element._model;\n\n\t\t\t\t\t\telement.$previousStyle = {\n\t\t\t\t\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\t\t\t\t\tborderColor: model.borderColor,\n\t\t\t\t\t\t\tborderWidth: model.borderWidth\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor));\n\t\t\t\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));\n\t\t\t\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tresyncElements: function resyncElements() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar data = me.getDataset().data;\n\t\t\t\t\t\tvar numMeta = meta.data.length;\n\t\t\t\t\t\tvar numData = data.length;\n\n\t\t\t\t\t\tif (numData < numMeta) {\n\t\t\t\t\t\t\tmeta.data.splice(numData, numMeta - numData);\n\t\t\t\t\t\t} else if (numData > numMeta) {\n\t\t\t\t\t\t\tme.insertElements(numMeta, numData - numMeta);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tinsertElements: function insertElements(start, count) {\n\t\t\t\t\t\tfor (var i = 0; i < count; ++i) {\n\t\t\t\t\t\t\tthis.addElementAndReset(start + i);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tonDataPush: function onDataPush() {\n\t\t\t\t\t\tthis.insertElements(this.getDataset().data.length - 1, arguments.length);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tonDataPop: function onDataPop() {\n\t\t\t\t\t\tthis.getMeta().data.pop();\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tonDataShift: function onDataShift() {\n\t\t\t\t\t\tthis.getMeta().data.shift();\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tonDataSplice: function onDataSplice(start, count) {\n\t\t\t\t\t\tthis.getMeta().data.splice(start, count);\n\t\t\t\t\t\tthis.insertElements(start, arguments.length - 2);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tonDataUnshift: function onDataUnshift() {\n\t\t\t\t\t\tthis.insertElements(0, arguments.length);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tChart.DatasetController.extend = helpers.inherits;\n\t\t\t};\n\t\t}, { \"46\": 46 }], 26: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\n\t\t\tmodule.exports = {\n\t\t\t\t/**\n * @private\n */\n\t\t\t\t_set: function _set(scope, values) {\n\t\t\t\t\treturn helpers.merge(this[scope] || (this[scope] = {}), values);\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"46\": 46 }], 27: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar color = require(3);\n\t\t\tvar helpers = require(46);\n\n\t\t\tfunction interpolate(start, view, model, ease) {\n\t\t\t\tvar keys = Object.keys(model);\n\t\t\t\tvar i, ilen, key, actual, origin, target, type, c0, c1;\n\n\t\t\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\t\t\tkey = keys[i];\n\n\t\t\t\t\ttarget = model[key];\n\n\t\t\t\t\t// if a value is added to the model after pivot() has been called, the view\n\t\t\t\t\t// doesn't contain it, so let's initialize the view to the target value.\n\t\t\t\t\tif (!view.hasOwnProperty(key)) {\n\t\t\t\t\t\tview[key] = target;\n\t\t\t\t\t}\n\n\t\t\t\t\tactual = view[key];\n\n\t\t\t\t\tif (actual === target || key[0] === '_') {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!start.hasOwnProperty(key)) {\n\t\t\t\t\t\tstart[key] = actual;\n\t\t\t\t\t}\n\n\t\t\t\t\torigin = start[key];\n\n\t\t\t\t\ttype = typeof target === \"undefined\" ? \"undefined\" : _typeof(target);\n\n\t\t\t\t\tif (type === (typeof origin === \"undefined\" ? \"undefined\" : _typeof(origin))) {\n\t\t\t\t\t\tif (type === 'string') {\n\t\t\t\t\t\t\tc0 = color(origin);\n\t\t\t\t\t\t\tif (c0.valid) {\n\t\t\t\t\t\t\t\tc1 = color(target);\n\t\t\t\t\t\t\t\tif (c1.valid) {\n\t\t\t\t\t\t\t\t\tview[key] = c1.mix(c0, ease).rgbString();\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (type === 'number' && isFinite(origin) && isFinite(target)) {\n\t\t\t\t\t\t\tview[key] = origin + (target - origin) * ease;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tview[key] = target;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar Element = function Element(configuration) {\n\t\t\t\thelpers.extend(this, configuration);\n\t\t\t\tthis.initialize.apply(this, arguments);\n\t\t\t};\n\n\t\t\thelpers.extend(Element.prototype, {\n\n\t\t\t\tinitialize: function initialize() {\n\t\t\t\t\tthis.hidden = false;\n\t\t\t\t},\n\n\t\t\t\tpivot: function pivot() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tif (!me._view) {\n\t\t\t\t\t\tme._view = helpers.clone(me._model);\n\t\t\t\t\t}\n\t\t\t\t\tme._start = {};\n\t\t\t\t\treturn me;\n\t\t\t\t},\n\n\t\t\t\ttransition: function transition(ease) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar model = me._model;\n\t\t\t\t\tvar start = me._start;\n\t\t\t\t\tvar view = me._view;\n\n\t\t\t\t\t// No animation -> No Transition\n\t\t\t\t\tif (!model || ease === 1) {\n\t\t\t\t\t\tme._view = model;\n\t\t\t\t\t\tme._start = null;\n\t\t\t\t\t\treturn me;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!view) {\n\t\t\t\t\t\tview = me._view = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!start) {\n\t\t\t\t\t\tstart = me._start = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tinterpolate(start, view, model, ease);\n\n\t\t\t\t\treturn me;\n\t\t\t\t},\n\n\t\t\t\ttooltipPosition: function tooltipPosition() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: this._model.x,\n\t\t\t\t\t\ty: this._model.y\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\thasValue: function hasValue() {\n\t\t\t\t\treturn helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tElement.extend = helpers.inherits;\n\n\t\t\tmodule.exports = Element;\n\t\t}, { \"3\": 3, \"46\": 46 }], 28: [function (require, module, exports) {\n\t\t\t/* global window: false */\n\t\t\t/* global document: false */\n\t\t\t'use strict';\n\n\t\t\tvar color = require(3);\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\t\t\tvar scaleService = require(34);\n\n\t\t\tmodule.exports = function () {\n\n\t\t\t\t// -- Basic js utility methods\n\n\t\t\t\thelpers.configMerge = function () /* objects ... */{\n\t\t\t\t\treturn helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n\t\t\t\t\t\tmerger: function merger(key, target, source, options) {\n\t\t\t\t\t\t\tvar tval = target[key] || {};\n\t\t\t\t\t\t\tvar sval = source[key];\n\n\t\t\t\t\t\t\tif (key === 'scales') {\n\t\t\t\t\t\t\t\t// scale config merging is complex. Add our own function here for that\n\t\t\t\t\t\t\t\ttarget[key] = helpers.scaleMerge(tval, sval);\n\t\t\t\t\t\t\t} else if (key === 'scale') {\n\t\t\t\t\t\t\t\t// used in polar area & radar charts since there is only one scale\n\t\t\t\t\t\t\t\ttarget[key] = helpers.merge(tval, [scaleService.getScaleDefaults(sval.type), sval]);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\thelpers._merger(key, target, source, options);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\thelpers.scaleMerge = function () /* objects ... */{\n\t\t\t\t\treturn helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n\t\t\t\t\t\tmerger: function merger(key, target, source, options) {\n\t\t\t\t\t\t\tif (key === 'xAxes' || key === 'yAxes') {\n\t\t\t\t\t\t\t\tvar slen = source[key].length;\n\t\t\t\t\t\t\t\tvar i, type, scale;\n\n\t\t\t\t\t\t\t\tif (!target[key]) {\n\t\t\t\t\t\t\t\t\ttarget[key] = [];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tfor (i = 0; i < slen; ++i) {\n\t\t\t\t\t\t\t\t\tscale = source[key][i];\n\t\t\t\t\t\t\t\t\ttype = helpers.valueOrDefault(scale.type, key === 'xAxes' ? 'category' : 'linear');\n\n\t\t\t\t\t\t\t\t\tif (i >= target[key].length) {\n\t\t\t\t\t\t\t\t\t\ttarget[key].push({});\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (!target[key][i].type || scale.type && scale.type !== target[key][i].type) {\n\t\t\t\t\t\t\t\t\t\t// new/untyped scale or type changed: let's apply the new defaults\n\t\t\t\t\t\t\t\t\t\t// then merge source scale to correctly overwrite the defaults.\n\t\t\t\t\t\t\t\t\t\thelpers.merge(target[key][i], [scaleService.getScaleDefaults(type), scale]);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t// scales type are the same\n\t\t\t\t\t\t\t\t\t\thelpers.merge(target[key][i], scale);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\thelpers._merger(key, target, source, options);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\thelpers.where = function (collection, filterCallback) {\n\t\t\t\t\tif (helpers.isArray(collection) && Array.prototype.filter) {\n\t\t\t\t\t\treturn collection.filter(filterCallback);\n\t\t\t\t\t}\n\t\t\t\t\tvar filtered = [];\n\n\t\t\t\t\thelpers.each(collection, function (item) {\n\t\t\t\t\t\tif (filterCallback(item)) {\n\t\t\t\t\t\t\tfiltered.push(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn filtered;\n\t\t\t\t};\n\t\t\t\thelpers.findIndex = Array.prototype.findIndex ? function (array, callback, scope) {\n\t\t\t\t\treturn array.findIndex(callback, scope);\n\t\t\t\t} : function (array, callback, scope) {\n\t\t\t\t\tscope = scope === undefined ? array : scope;\n\t\t\t\t\tfor (var i = 0, ilen = array.length; i < ilen; ++i) {\n\t\t\t\t\t\tif (callback.call(scope, array[i], i, array)) {\n\t\t\t\t\t\t\treturn i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn -1;\n\t\t\t\t};\n\t\t\t\thelpers.findNextWhere = function (arrayToSearch, filterCallback, startIndex) {\n\t\t\t\t\t// Default to start of the array\n\t\t\t\t\tif (helpers.isNullOrUndef(startIndex)) {\n\t\t\t\t\t\tstartIndex = -1;\n\t\t\t\t\t}\n\t\t\t\t\tfor (var i = startIndex + 1; i < arrayToSearch.length; i++) {\n\t\t\t\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\t\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\t\t\t\treturn currentItem;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\thelpers.findPreviousWhere = function (arrayToSearch, filterCallback, startIndex) {\n\t\t\t\t\t// Default to end of the array\n\t\t\t\t\tif (helpers.isNullOrUndef(startIndex)) {\n\t\t\t\t\t\tstartIndex = arrayToSearch.length;\n\t\t\t\t\t}\n\t\t\t\t\tfor (var i = startIndex - 1; i >= 0; i--) {\n\t\t\t\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\t\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\t\t\t\treturn currentItem;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// -- Math methods\n\t\t\t\thelpers.isNumber = function (n) {\n\t\t\t\t\treturn !isNaN(parseFloat(n)) && isFinite(n);\n\t\t\t\t};\n\t\t\t\thelpers.almostEquals = function (x, y, epsilon) {\n\t\t\t\t\treturn Math.abs(x - y) < epsilon;\n\t\t\t\t};\n\t\t\t\thelpers.almostWhole = function (x, epsilon) {\n\t\t\t\t\tvar rounded = Math.round(x);\n\t\t\t\t\treturn rounded - epsilon < x && rounded + epsilon > x;\n\t\t\t\t};\n\t\t\t\thelpers.max = function (array) {\n\t\t\t\t\treturn array.reduce(function (max, value) {\n\t\t\t\t\t\tif (!isNaN(value)) {\n\t\t\t\t\t\t\treturn Math.max(max, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn max;\n\t\t\t\t\t}, Number.NEGATIVE_INFINITY);\n\t\t\t\t};\n\t\t\t\thelpers.min = function (array) {\n\t\t\t\t\treturn array.reduce(function (min, value) {\n\t\t\t\t\t\tif (!isNaN(value)) {\n\t\t\t\t\t\t\treturn Math.min(min, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn min;\n\t\t\t\t\t}, Number.POSITIVE_INFINITY);\n\t\t\t\t};\n\t\t\t\thelpers.sign = Math.sign ? function (x) {\n\t\t\t\t\treturn Math.sign(x);\n\t\t\t\t} : function (x) {\n\t\t\t\t\tx = +x; // convert to a number\n\t\t\t\t\tif (x === 0 || isNaN(x)) {\n\t\t\t\t\t\treturn x;\n\t\t\t\t\t}\n\t\t\t\t\treturn x > 0 ? 1 : -1;\n\t\t\t\t};\n\t\t\t\thelpers.log10 = Math.log10 ? function (x) {\n\t\t\t\t\treturn Math.log10(x);\n\t\t\t\t} : function (x) {\n\t\t\t\t\tvar exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10.\n\t\t\t\t\t// Check for whole powers of 10,\n\t\t\t\t\t// which due to floating point rounding error should be corrected.\n\t\t\t\t\tvar powerOf10 = Math.round(exponent);\n\t\t\t\t\tvar isPowerOf10 = x === Math.pow(10, powerOf10);\n\n\t\t\t\t\treturn isPowerOf10 ? powerOf10 : exponent;\n\t\t\t\t};\n\t\t\t\thelpers.toRadians = function (degrees) {\n\t\t\t\t\treturn degrees * (Math.PI / 180);\n\t\t\t\t};\n\t\t\t\thelpers.toDegrees = function (radians) {\n\t\t\t\t\treturn radians * (180 / Math.PI);\n\t\t\t\t};\n\t\t\t\t// Gets the angle from vertical upright to the point about a centre.\n\t\t\t\thelpers.getAngleFromPoint = function (centrePoint, anglePoint) {\n\t\t\t\t\tvar distanceFromXCenter = anglePoint.x - centrePoint.x;\n\t\t\t\t\tvar distanceFromYCenter = anglePoint.y - centrePoint.y;\n\t\t\t\t\tvar radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n\t\t\t\t\tvar angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n\t\t\t\t\tif (angle < -0.5 * Math.PI) {\n\t\t\t\t\t\tangle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tangle: angle,\n\t\t\t\t\t\tdistance: radialDistanceFromCenter\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\thelpers.distanceBetweenPoints = function (pt1, pt2) {\n\t\t\t\t\treturn Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n\t\t\t\t};\n\t\t\t\thelpers.aliasPixel = function (pixelWidth) {\n\t\t\t\t\treturn pixelWidth % 2 === 0 ? 0 : 0.5;\n\t\t\t\t};\n\t\t\t\thelpers.splineCurve = function (firstPoint, middlePoint, afterPoint, t) {\n\t\t\t\t\t// Props to Rob Spencer at scaled innovation for his post on splining between points\n\t\t\t\t\t// http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n\t\t\t\t\t// This function must also respect \"skipped\" points\n\n\t\t\t\t\tvar previous = firstPoint.skip ? middlePoint : firstPoint;\n\t\t\t\t\tvar current = middlePoint;\n\t\t\t\t\tvar next = afterPoint.skip ? middlePoint : afterPoint;\n\n\t\t\t\t\tvar d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n\t\t\t\t\tvar d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n\n\t\t\t\t\tvar s01 = d01 / (d01 + d12);\n\t\t\t\t\tvar s12 = d12 / (d01 + d12);\n\n\t\t\t\t\t// If all points are the same, s01 & s02 will be inf\n\t\t\t\t\ts01 = isNaN(s01) ? 0 : s01;\n\t\t\t\t\ts12 = isNaN(s12) ? 0 : s12;\n\n\t\t\t\t\tvar fa = t * s01; // scaling factor for triangle Ta\n\t\t\t\t\tvar fb = t * s12;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tprevious: {\n\t\t\t\t\t\t\tx: current.x - fa * (next.x - previous.x),\n\t\t\t\t\t\t\ty: current.y - fa * (next.y - previous.y)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnext: {\n\t\t\t\t\t\t\tx: current.x + fb * (next.x - previous.x),\n\t\t\t\t\t\t\ty: current.y + fb * (next.y - previous.y)\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\thelpers.EPSILON = Number.EPSILON || 1e-14;\n\t\t\t\thelpers.splineCurveMonotone = function (points) {\n\t\t\t\t\t// This function calculates Bézier control points in a similar way than |splineCurve|,\n\t\t\t\t\t// but preserves monotonicity of the provided data and ensures no local extremums are added\n\t\t\t\t\t// between the dataset discrete points due to the interpolation.\n\t\t\t\t\t// See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n\n\t\t\t\t\tvar pointsWithTangents = (points || []).map(function (point) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tmodel: point._model,\n\t\t\t\t\t\t\tdeltaK: 0,\n\t\t\t\t\t\t\tmK: 0\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\n\t\t\t\t\t// Calculate slopes (deltaK) and initialize tangents (mK)\n\t\t\t\t\tvar pointsLen = pointsWithTangents.length;\n\t\t\t\t\tvar i, pointBefore, pointCurrent, pointAfter;\n\t\t\t\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\t\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\t\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\t\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\t\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\t\t\t\tvar slopeDeltaX = pointAfter.model.x - pointCurrent.model.x;\n\n\t\t\t\t\t\t\t// In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n\t\t\t\t\t\t\tpointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!pointBefore || pointBefore.model.skip) {\n\t\t\t\t\t\t\tpointCurrent.mK = pointCurrent.deltaK;\n\t\t\t\t\t\t} else if (!pointAfter || pointAfter.model.skip) {\n\t\t\t\t\t\t\tpointCurrent.mK = pointBefore.deltaK;\n\t\t\t\t\t\t} else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\n\t\t\t\t\t\t\tpointCurrent.mK = 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Adjust tangents to ensure monotonic properties\n\t\t\t\t\tvar alphaK, betaK, tauK, squaredMagnitude;\n\t\t\t\t\tfor (i = 0; i < pointsLen - 1; ++i) {\n\t\t\t\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\t\t\t\tpointAfter = pointsWithTangents[i + 1];\n\t\t\t\t\t\tif (pointCurrent.model.skip || pointAfter.model.skip) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\n\t\t\t\t\t\t\tpointCurrent.mK = pointAfter.mK = 0;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\talphaK = pointCurrent.mK / pointCurrent.deltaK;\n\t\t\t\t\t\tbetaK = pointAfter.mK / pointCurrent.deltaK;\n\t\t\t\t\t\tsquaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n\t\t\t\t\t\tif (squaredMagnitude <= 9) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttauK = 3 / Math.sqrt(squaredMagnitude);\n\t\t\t\t\t\tpointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\n\t\t\t\t\t\tpointAfter.mK = betaK * tauK * pointCurrent.deltaK;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Compute control points\n\t\t\t\t\tvar deltaX;\n\t\t\t\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\t\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\t\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\t\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\t\t\t\tif (pointBefore && !pointBefore.model.skip) {\n\t\t\t\t\t\t\tdeltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\n\t\t\t\t\t\t\tpointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\n\t\t\t\t\t\t\tpointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\t\t\t\tdeltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\n\t\t\t\t\t\t\tpointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\n\t\t\t\t\t\t\tpointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\thelpers.nextItem = function (collection, index, loop) {\n\t\t\t\t\tif (loop) {\n\t\t\t\t\t\treturn index >= collection.length - 1 ? collection[0] : collection[index + 1];\n\t\t\t\t\t}\n\t\t\t\t\treturn index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\n\t\t\t\t};\n\t\t\t\thelpers.previousItem = function (collection, index, loop) {\n\t\t\t\t\tif (loop) {\n\t\t\t\t\t\treturn index <= 0 ? collection[collection.length - 1] : collection[index - 1];\n\t\t\t\t\t}\n\t\t\t\t\treturn index <= 0 ? collection[0] : collection[index - 1];\n\t\t\t\t};\n\t\t\t\t// Implementation of the nice number algorithm used in determining where axis labels will go\n\t\t\t\thelpers.niceNum = function (range, round) {\n\t\t\t\t\tvar exponent = Math.floor(helpers.log10(range));\n\t\t\t\t\tvar fraction = range / Math.pow(10, exponent);\n\t\t\t\t\tvar niceFraction;\n\n\t\t\t\t\tif (round) {\n\t\t\t\t\t\tif (fraction < 1.5) {\n\t\t\t\t\t\t\tniceFraction = 1;\n\t\t\t\t\t\t} else if (fraction < 3) {\n\t\t\t\t\t\t\tniceFraction = 2;\n\t\t\t\t\t\t} else if (fraction < 7) {\n\t\t\t\t\t\t\tniceFraction = 5;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tniceFraction = 10;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (fraction <= 1.0) {\n\t\t\t\t\t\tniceFraction = 1;\n\t\t\t\t\t} else if (fraction <= 2) {\n\t\t\t\t\t\tniceFraction = 2;\n\t\t\t\t\t} else if (fraction <= 5) {\n\t\t\t\t\t\tniceFraction = 5;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tniceFraction = 10;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn niceFraction * Math.pow(10, exponent);\n\t\t\t\t};\n\t\t\t\t// Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n\t\t\t\thelpers.requestAnimFrame = function () {\n\t\t\t\t\tif (typeof window === 'undefined') {\n\t\t\t\t\t\treturn function (callback) {\n\t\t\t\t\t\t\tcallback();\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {\n\t\t\t\t\t\treturn window.setTimeout(callback, 1000 / 60);\n\t\t\t\t\t};\n\t\t\t\t}();\n\t\t\t\t// -- DOM methods\n\t\t\t\thelpers.getRelativePosition = function (evt, chart) {\n\t\t\t\t\tvar mouseX, mouseY;\n\t\t\t\t\tvar e = evt.originalEvent || evt;\n\t\t\t\t\tvar canvas = evt.target || evt.srcElement;\n\t\t\t\t\tvar boundingRect = canvas.getBoundingClientRect();\n\n\t\t\t\t\tvar touches = e.touches;\n\t\t\t\t\tif (touches && touches.length > 0) {\n\t\t\t\t\t\tmouseX = touches[0].clientX;\n\t\t\t\t\t\tmouseY = touches[0].clientY;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmouseX = e.clientX;\n\t\t\t\t\t\tmouseY = e.clientY;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Scale mouse coordinates into canvas coordinates\n\t\t\t\t\t// by following the pattern laid out by 'jerryj' in the comments of\n\t\t\t\t\t// http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n\t\t\t\t\tvar paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left'));\n\t\t\t\t\tvar paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top'));\n\t\t\t\t\tvar paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right'));\n\t\t\t\t\tvar paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom'));\n\t\t\t\t\tvar width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\n\t\t\t\t\tvar height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;\n\n\t\t\t\t\t// We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\n\t\t\t\t\t// the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\n\t\t\t\t\tmouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / width * canvas.width / chart.currentDevicePixelRatio);\n\t\t\t\t\tmouseY = Math.round((mouseY - boundingRect.top - paddingTop) / height * canvas.height / chart.currentDevicePixelRatio);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: mouseX,\n\t\t\t\t\t\ty: mouseY\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Private helper function to convert max-width/max-height values that may be percentages into a number\n\t\t\t\tfunction parseMaxStyle(styleValue, node, parentProperty) {\n\t\t\t\t\tvar valueInPixels;\n\t\t\t\t\tif (typeof styleValue === 'string') {\n\t\t\t\t\t\tvalueInPixels = parseInt(styleValue, 10);\n\n\t\t\t\t\t\tif (styleValue.indexOf('%') !== -1) {\n\t\t\t\t\t\t\t// percentage * size in dimension\n\t\t\t\t\t\t\tvalueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueInPixels = styleValue;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn valueInPixels;\n\t\t\t\t}\n\n\t\t\t\t/**\n * Returns if the given value contains an effective constraint.\n * @private\n */\n\t\t\t\tfunction isConstrainedValue(value) {\n\t\t\t\t\treturn value !== undefined && value !== null && value !== 'none';\n\t\t\t\t}\n\n\t\t\t\t// Private helper to get a constraint dimension\n\t\t\t\t// @param domNode : the node to check the constraint on\n\t\t\t\t// @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight)\n\t\t\t\t// @param percentageProperty : property of parent to use when calculating width as a percentage\n\t\t\t\t// @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser\n\t\t\t\tfunction getConstraintDimension(domNode, maxStyle, percentageProperty) {\n\t\t\t\t\tvar view = document.defaultView;\n\t\t\t\t\tvar parentNode = helpers._getParentNode(domNode);\n\t\t\t\t\tvar constrainedNode = view.getComputedStyle(domNode)[maxStyle];\n\t\t\t\t\tvar constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\n\t\t\t\t\tvar hasCNode = isConstrainedValue(constrainedNode);\n\t\t\t\t\tvar hasCContainer = isConstrainedValue(constrainedContainer);\n\t\t\t\t\tvar infinity = Number.POSITIVE_INFINITY;\n\n\t\t\t\t\tif (hasCNode || hasCContainer) {\n\t\t\t\t\t\treturn Math.min(hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn 'none';\n\t\t\t\t}\n\t\t\t\t// returns Number or undefined if no constraint\n\t\t\t\thelpers.getConstraintWidth = function (domNode) {\n\t\t\t\t\treturn getConstraintDimension(domNode, 'max-width', 'clientWidth');\n\t\t\t\t};\n\t\t\t\t// returns Number or undefined if no constraint\n\t\t\t\thelpers.getConstraintHeight = function (domNode) {\n\t\t\t\t\treturn getConstraintDimension(domNode, 'max-height', 'clientHeight');\n\t\t\t\t};\n\t\t\t\t/**\n * @private\n \t */\n\t\t\t\thelpers._calculatePadding = function (container, padding, parentDimension) {\n\t\t\t\t\tpadding = helpers.getStyle(container, padding);\n\n\t\t\t\t\treturn padding.indexOf('%') > -1 ? parentDimension / parseInt(padding, 10) : parseInt(padding, 10);\n\t\t\t\t};\n\t\t\t\t/**\n * @private\n */\n\t\t\t\thelpers._getParentNode = function (domNode) {\n\t\t\t\t\tvar parent = domNode.parentNode;\n\t\t\t\t\tif (parent && parent.host) {\n\t\t\t\t\t\tparent = parent.host;\n\t\t\t\t\t}\n\t\t\t\t\treturn parent;\n\t\t\t\t};\n\t\t\t\thelpers.getMaximumWidth = function (domNode) {\n\t\t\t\t\tvar container = helpers._getParentNode(domNode);\n\t\t\t\t\tif (!container) {\n\t\t\t\t\t\treturn domNode.clientWidth;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar clientWidth = container.clientWidth;\n\t\t\t\t\tvar paddingLeft = helpers._calculatePadding(container, 'padding-left', clientWidth);\n\t\t\t\t\tvar paddingRight = helpers._calculatePadding(container, 'padding-right', clientWidth);\n\n\t\t\t\t\tvar w = clientWidth - paddingLeft - paddingRight;\n\t\t\t\t\tvar cw = helpers.getConstraintWidth(domNode);\n\t\t\t\t\treturn isNaN(cw) ? w : Math.min(w, cw);\n\t\t\t\t};\n\t\t\t\thelpers.getMaximumHeight = function (domNode) {\n\t\t\t\t\tvar container = helpers._getParentNode(domNode);\n\t\t\t\t\tif (!container) {\n\t\t\t\t\t\treturn domNode.clientHeight;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar clientHeight = container.clientHeight;\n\t\t\t\t\tvar paddingTop = helpers._calculatePadding(container, 'padding-top', clientHeight);\n\t\t\t\t\tvar paddingBottom = helpers._calculatePadding(container, 'padding-bottom', clientHeight);\n\n\t\t\t\t\tvar h = clientHeight - paddingTop - paddingBottom;\n\t\t\t\t\tvar ch = helpers.getConstraintHeight(domNode);\n\t\t\t\t\treturn isNaN(ch) ? h : Math.min(h, ch);\n\t\t\t\t};\n\t\t\t\thelpers.getStyle = function (el, property) {\n\t\t\t\t\treturn el.currentStyle ? el.currentStyle[property] : document.defaultView.getComputedStyle(el, null).getPropertyValue(property);\n\t\t\t\t};\n\t\t\t\thelpers.retinaScale = function (chart, forceRatio) {\n\t\t\t\t\tvar pixelRatio = chart.currentDevicePixelRatio = forceRatio || typeof window !== 'undefined' && window.devicePixelRatio || 1;\n\t\t\t\t\tif (pixelRatio === 1) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar canvas = chart.canvas;\n\t\t\t\t\tvar height = chart.height;\n\t\t\t\t\tvar width = chart.width;\n\n\t\t\t\t\tcanvas.height = height * pixelRatio;\n\t\t\t\t\tcanvas.width = width * pixelRatio;\n\t\t\t\t\tchart.ctx.scale(pixelRatio, pixelRatio);\n\n\t\t\t\t\t// If no style has been set on the canvas, the render size is used as display size,\n\t\t\t\t\t// making the chart visually bigger, so let's enforce it to the \"correct\" values.\n\t\t\t\t\t// See https://github.com/chartjs/Chart.js/issues/3575\n\t\t\t\t\tif (!canvas.style.height && !canvas.style.width) {\n\t\t\t\t\t\tcanvas.style.height = height + 'px';\n\t\t\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// -- Canvas methods\n\t\t\t\thelpers.fontString = function (pixelSize, fontStyle, fontFamily) {\n\t\t\t\t\treturn fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n\t\t\t\t};\n\t\t\t\thelpers.longestText = function (ctx, font, arrayOfThings, cache) {\n\t\t\t\t\tcache = cache || {};\n\t\t\t\t\tvar data = cache.data = cache.data || {};\n\t\t\t\t\tvar gc = cache.garbageCollect = cache.garbageCollect || [];\n\n\t\t\t\t\tif (cache.font !== font) {\n\t\t\t\t\t\tdata = cache.data = {};\n\t\t\t\t\t\tgc = cache.garbageCollect = [];\n\t\t\t\t\t\tcache.font = font;\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.font = font;\n\t\t\t\t\tvar longest = 0;\n\t\t\t\t\thelpers.each(arrayOfThings, function (thing) {\n\t\t\t\t\t\t// Undefined strings and arrays should not be measured\n\t\t\t\t\t\tif (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) {\n\t\t\t\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, thing);\n\t\t\t\t\t\t} else if (helpers.isArray(thing)) {\n\t\t\t\t\t\t\t// if it is an array lets measure each element\n\t\t\t\t\t\t\t// to do maybe simplify this function a bit so we can do this more recursively?\n\t\t\t\t\t\t\thelpers.each(thing, function (nestedThing) {\n\t\t\t\t\t\t\t\t// Undefined strings and arrays should not be measured\n\t\t\t\t\t\t\t\tif (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) {\n\t\t\t\t\t\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, nestedThing);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tvar gcLen = gc.length / 2;\n\t\t\t\t\tif (gcLen > arrayOfThings.length) {\n\t\t\t\t\t\tfor (var i = 0; i < gcLen; i++) {\n\t\t\t\t\t\t\tdelete data[gc[i]];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgc.splice(0, gcLen);\n\t\t\t\t\t}\n\t\t\t\t\treturn longest;\n\t\t\t\t};\n\t\t\t\thelpers.measureText = function (ctx, data, gc, longest, string) {\n\t\t\t\t\tvar textWidth = data[string];\n\t\t\t\t\tif (!textWidth) {\n\t\t\t\t\t\ttextWidth = data[string] = ctx.measureText(string).width;\n\t\t\t\t\t\tgc.push(string);\n\t\t\t\t\t}\n\t\t\t\t\tif (textWidth > longest) {\n\t\t\t\t\t\tlongest = textWidth;\n\t\t\t\t\t}\n\t\t\t\t\treturn longest;\n\t\t\t\t};\n\t\t\t\thelpers.numberOfLabelLines = function (arrayOfThings) {\n\t\t\t\t\tvar numberOfLines = 1;\n\t\t\t\t\thelpers.each(arrayOfThings, function (thing) {\n\t\t\t\t\t\tif (helpers.isArray(thing)) {\n\t\t\t\t\t\t\tif (thing.length > numberOfLines) {\n\t\t\t\t\t\t\t\tnumberOfLines = thing.length;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\treturn numberOfLines;\n\t\t\t\t};\n\n\t\t\t\thelpers.color = !color ? function (value) {\n\t\t\t\t\tconsole.error('Color.js not found!');\n\t\t\t\t\treturn value;\n\t\t\t\t} : function (value) {\n\t\t\t\t\t/* global CanvasGradient */\n\t\t\t\t\tif (value instanceof CanvasGradient) {\n\t\t\t\t\t\tvalue = defaults.global.defaultColor;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn color(value);\n\t\t\t\t};\n\n\t\t\t\thelpers.getHoverColor = function (colorValue) {\n\t\t\t\t\t/* global CanvasPattern */\n\t\t\t\t\treturn colorValue instanceof CanvasPattern ? colorValue : helpers.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n\t\t\t\t};\n\t\t\t};\n\t\t}, { \"26\": 26, \"3\": 3, \"34\": 34, \"46\": 46 }], 29: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\n\t\t\t/**\n * Helper function to get relative position for an event\n * @param {Event|IEvent} event - The event to get the position for\n * @param {Chart} chart - The chart\n * @returns {Point} the event position\n */\n\t\t\tfunction getRelativePosition(e, chart) {\n\t\t\t\tif (e.native) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: e.x,\n\t\t\t\t\t\ty: e.y\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn helpers.getRelativePosition(e, chart);\n\t\t\t}\n\n\t\t\t/**\n * Helper function to traverse all of the visible elements in the chart\n * @param chart {chart} the chart\n * @param handler {Function} the callback to execute for each visible item\n */\n\t\t\tfunction parseVisibleItems(chart, handler) {\n\t\t\t\tvar datasets = chart.data.datasets;\n\t\t\t\tvar meta, i, j, ilen, jlen;\n\n\t\t\t\tfor (i = 0, ilen = datasets.length; i < ilen; ++i) {\n\t\t\t\t\tif (!chart.isDatasetVisible(i)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\tfor (j = 0, jlen = meta.data.length; j < jlen; ++j) {\n\t\t\t\t\t\tvar element = meta.data[j];\n\t\t\t\t\t\tif (!element._view.skip) {\n\t\t\t\t\t\t\thandler(element);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n * Helper function to get the items that intersect the event position\n * @param items {ChartElement[]} elements to filter\n * @param position {Point} the point to be nearest to\n * @return {ChartElement[]} the nearest items\n */\n\t\t\tfunction getIntersectItems(chart, position) {\n\t\t\t\tvar elements = [];\n\n\t\t\t\tparseVisibleItems(chart, function (element) {\n\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\telements.push(element);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn elements;\n\t\t\t}\n\n\t\t\t/**\n * Helper function to get the items nearest to the event position considering all visible items in teh chart\n * @param chart {Chart} the chart to look at elements from\n * @param position {Point} the point to be nearest to\n * @param intersect {Boolean} if true, only consider items that intersect the position\n * @param distanceMetric {Function} function to provide the distance between points\n * @return {ChartElement[]} the nearest items\n */\n\t\t\tfunction getNearestItems(chart, position, intersect, distanceMetric) {\n\t\t\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\t\t\tvar nearestItems = [];\n\n\t\t\t\tparseVisibleItems(chart, function (element) {\n\t\t\t\t\tif (intersect && !element.inRange(position.x, position.y)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar center = element.getCenterPoint();\n\t\t\t\t\tvar distance = distanceMetric(position, center);\n\n\t\t\t\t\tif (distance < minDistance) {\n\t\t\t\t\t\tnearestItems = [element];\n\t\t\t\t\t\tminDistance = distance;\n\t\t\t\t\t} else if (distance === minDistance) {\n\t\t\t\t\t\t// Can have multiple items at the same distance in which case we sort by size\n\t\t\t\t\t\tnearestItems.push(element);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn nearestItems;\n\t\t\t}\n\n\t\t\t/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {String} axis the axis mode. x|y|xy\n */\n\t\t\tfunction getDistanceMetricForAxis(axis) {\n\t\t\t\tvar useX = axis.indexOf('x') !== -1;\n\t\t\t\tvar useY = axis.indexOf('y') !== -1;\n\n\t\t\t\treturn function (pt1, pt2) {\n\t\t\t\t\tvar deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n\t\t\t\t\tvar deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n\t\t\t\t\treturn Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfunction indexMode(chart, e, options) {\n\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\t// Default axis for index mode is 'x' to match old behaviour\n\t\t\t\toptions.axis = options.axis || 'x';\n\t\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\t\t\t\tvar elements = [];\n\n\t\t\t\tif (!items.length) {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\n\t\t\t\tchart.data.datasets.forEach(function (dataset, datasetIndex) {\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\tvar element = meta.data[items[0]._index];\n\n\t\t\t\t\t\t// don't count items that are skipped (null data)\n\t\t\t\t\t\tif (element && !element._view.skip) {\n\t\t\t\t\t\t\telements.push(element);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn elements;\n\t\t\t}\n\n\t\t\t/**\n * @interface IInteractionOptions\n */\n\t\t\t/**\n * If true, only consider items that intersect the point\n * @name IInterfaceOptions#boolean\n * @type Boolean\n */\n\n\t\t\t/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\n\t\t\tmodule.exports = {\n\t\t\t\t// Helper function for different modes\n\t\t\t\tmodes: {\n\t\t\t\t\tsingle: function single(chart, e) {\n\t\t\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\t\t\tvar elements = [];\n\n\t\t\t\t\t\tparseVisibleItems(chart, function (element) {\n\t\t\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\t\t\telements.push(element);\n\t\t\t\t\t\t\t\treturn elements;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn elements.slice(0, 1);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @function Chart.Interaction.modes.label\n * @deprecated since version 2.4.0\n * @todo remove at version 3\n * @private\n */\n\t\t\t\t\tlabel: indexMode,\n\n\t\t\t\t\t/**\n * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n * @function Chart.Interaction.modes.index\n * @since v2.4.0\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use during interaction\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n\t\t\t\t\tindex: indexMode,\n\n\t\t\t\t\t/**\n * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n * If the options.intersect is false, we find the nearest item and return the items in that dataset\n * @function Chart.Interaction.modes.dataset\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use during interaction\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n\t\t\t\t\tdataset: function dataset(chart, e, options) {\n\t\t\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\t\t\toptions.axis = options.axis || 'xy';\n\t\t\t\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\t\t\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\n\t\t\t\t\t\tif (items.length > 0) {\n\t\t\t\t\t\t\titems = chart.getDatasetMeta(items[0]._datasetIndex).data;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn items;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @function Chart.Interaction.modes.x-axis\n * @deprecated since version 2.4.0. Use index mode and intersect == true\n * @todo remove at version 3\n * @private\n */\n\t\t\t\t\t'x-axis': function xAxis(chart, e) {\n\t\t\t\t\t\treturn indexMode(chart, e, { intersect: false });\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Point mode returns all elements that hit test based on the event position\n * of the event\n * @function Chart.Interaction.modes.intersect\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n\t\t\t\t\tpoint: function point(chart, e) {\n\t\t\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\t\t\treturn getIntersectItems(chart, position);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * nearest mode returns the element closest to the point\n * @function Chart.Interaction.modes.intersect\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n\t\t\t\t\tnearest: function nearest(chart, e, options) {\n\t\t\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\t\t\toptions.axis = options.axis || 'xy';\n\t\t\t\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\t\t\t\tvar nearestItems = getNearestItems(chart, position, options.intersect, distanceMetric);\n\n\t\t\t\t\t\t// We have multiple items at the same distance from the event. Now sort by smallest\n\t\t\t\t\t\tif (nearestItems.length > 1) {\n\t\t\t\t\t\t\tnearestItems.sort(function (a, b) {\n\t\t\t\t\t\t\t\tvar sizeA = a.getArea();\n\t\t\t\t\t\t\t\tvar sizeB = b.getArea();\n\t\t\t\t\t\t\t\tvar ret = sizeA - sizeB;\n\n\t\t\t\t\t\t\t\tif (ret === 0) {\n\t\t\t\t\t\t\t\t\t// if equal sort by dataset index\n\t\t\t\t\t\t\t\t\tret = a._datasetIndex - b._datasetIndex;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn ret;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Return only 1 item\n\t\t\t\t\t\treturn nearestItems.slice(0, 1);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * x mode returns the elements that hit-test at the current x coordinate\n * @function Chart.Interaction.modes.x\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n\t\t\t\t\tx: function x(chart, e, options) {\n\t\t\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\t\t\tvar items = [];\n\t\t\t\t\t\tvar intersectsItem = false;\n\n\t\t\t\t\t\tparseVisibleItems(chart, function (element) {\n\t\t\t\t\t\t\tif (element.inXRange(position.x)) {\n\t\t\t\t\t\t\t\titems.push(element);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\t\t\tintersectsItem = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t\t\t\t// that intersect the position, return nothing\n\t\t\t\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\t\t\t\titems = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn items;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * y mode returns the elements that hit-test at the current y coordinate\n * @function Chart.Interaction.modes.y\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n\t\t\t\t\ty: function y(chart, e, options) {\n\t\t\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\t\t\tvar items = [];\n\t\t\t\t\t\tvar intersectsItem = false;\n\n\t\t\t\t\t\tparseVisibleItems(chart, function (element) {\n\t\t\t\t\t\t\tif (element.inYRange(position.y)) {\n\t\t\t\t\t\t\t\titems.push(element);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\t\t\tintersectsItem = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t\t\t\t// that intersect the position, return nothing\n\t\t\t\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\t\t\t\titems = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn items;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"46\": 46 }], 30: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\n\t\t\tdefaults._set('global', {\n\t\t\t\tresponsive: true,\n\t\t\t\tresponsiveAnimationDuration: 0,\n\t\t\t\tmaintainAspectRatio: true,\n\t\t\t\tevents: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\n\t\t\t\thover: {\n\t\t\t\t\tonHover: null,\n\t\t\t\t\tmode: 'nearest',\n\t\t\t\t\tintersect: true,\n\t\t\t\t\tanimationDuration: 400\n\t\t\t\t},\n\t\t\t\tonClick: null,\n\t\t\t\tdefaultColor: 'rgba(0,0,0,0.1)',\n\t\t\t\tdefaultFontColor: '#666',\n\t\t\t\tdefaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n\t\t\t\tdefaultFontSize: 12,\n\t\t\t\tdefaultFontStyle: 'normal',\n\t\t\t\tshowLines: true,\n\n\t\t\t\t// Element defaults defined in element extensions\n\t\t\t\telements: {},\n\n\t\t\t\t// Layout options such as padding\n\t\t\t\tlayout: {\n\t\t\t\t\tpadding: {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = function () {\n\n\t\t\t\t// Occupy the global variable of Chart, and create a simple base class\n\t\t\t\tvar Chart = function Chart(item, config) {\n\t\t\t\t\tthis.construct(item, config);\n\t\t\t\t\treturn this;\n\t\t\t\t};\n\n\t\t\t\tChart.Chart = Chart;\n\n\t\t\t\treturn Chart;\n\t\t\t};\n\t\t}, { \"26\": 26 }], 31: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\n\t\t\tfunction filterByPosition(array, position) {\n\t\t\t\treturn helpers.where(array, function (v) {\n\t\t\t\t\treturn v.position === position;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction sortByWeight(array, reverse) {\n\t\t\t\tarray.forEach(function (v, i) {\n\t\t\t\t\tv._tmpIndex_ = i;\n\t\t\t\t\treturn v;\n\t\t\t\t});\n\t\t\t\tarray.sort(function (a, b) {\n\t\t\t\t\tvar v0 = reverse ? b : a;\n\t\t\t\t\tvar v1 = reverse ? a : b;\n\t\t\t\t\treturn v0.weight === v1.weight ? v0._tmpIndex_ - v1._tmpIndex_ : v0.weight - v1.weight;\n\t\t\t\t});\n\t\t\t\tarray.forEach(function (v) {\n\t\t\t\t\tdelete v._tmpIndex_;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t/**\n * @interface ILayoutItem\n * @prop {String} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {Number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {Boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down\n * @prop {Function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {Function} update - Takes two parameters: width and height. Returns size of item\n * @prop {Function} getPadding - Returns an object with padding on the edges\n * @prop {Number} width - Width of item. Must be valid after update()\n * @prop {Number} height - Height of item. Must be valid after update()\n * @prop {Number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {Number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {Number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {Number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n\t\t\t// The layout service is very self explanatory. It's responsible for the layout within a chart.\n\t\t\t// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n\t\t\t// It is this service's responsibility of carrying out that layout.\n\t\t\tmodule.exports = {\n\t\t\t\tdefaults: {},\n\n\t\t\t\t/**\n * Register a box to a chart.\n * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n * @param {Chart} chart - the chart to use\n * @param {ILayoutItem} item - the item to add to be layed out\n */\n\t\t\t\taddBox: function addBox(chart, item) {\n\t\t\t\t\tif (!chart.boxes) {\n\t\t\t\t\t\tchart.boxes = [];\n\t\t\t\t\t}\n\n\t\t\t\t\t// initialize item with default values\n\t\t\t\t\titem.fullWidth = item.fullWidth || false;\n\t\t\t\t\titem.position = item.position || 'top';\n\t\t\t\t\titem.weight = item.weight || 0;\n\n\t\t\t\t\tchart.boxes.push(item);\n\t\t\t\t},\n\n\t\t\t\t/**\n * Remove a layoutItem from a chart\n * @param {Chart} chart - the chart to remove the box from\n * @param {Object} layoutItem - the item to remove from the layout\n */\n\t\t\t\tremoveBox: function removeBox(chart, layoutItem) {\n\t\t\t\t\tvar index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\tchart.boxes.splice(index, 1);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Sets (or updates) options on the given `item`.\n * @param {Chart} chart - the chart in which the item lives (or will be added to)\n * @param {Object} item - the item to configure with the given options\n * @param {Object} options - the new item options.\n */\n\t\t\t\tconfigure: function configure(chart, item, options) {\n\t\t\t\t\tvar props = ['fullWidth', 'position', 'weight'];\n\t\t\t\t\tvar ilen = props.length;\n\t\t\t\t\tvar i = 0;\n\t\t\t\t\tvar prop;\n\n\t\t\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\t\t\tprop = props[i];\n\t\t\t\t\t\tif (options.hasOwnProperty(prop)) {\n\t\t\t\t\t\t\titem[prop] = options[prop];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Fits boxes of the given chart into the given size by having each box measure itself\n * then running a fitting algorithm\n * @param {Chart} chart - the chart\n * @param {Number} width - the width to fit into\n * @param {Number} height - the height to fit into\n */\n\t\t\t\tupdate: function update(chart, width, height) {\n\t\t\t\t\tif (!chart) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar layoutOptions = chart.options.layout || {};\n\t\t\t\t\tvar padding = helpers.options.toPadding(layoutOptions.padding);\n\t\t\t\t\tvar leftPadding = padding.left;\n\t\t\t\t\tvar rightPadding = padding.right;\n\t\t\t\t\tvar topPadding = padding.top;\n\t\t\t\t\tvar bottomPadding = padding.bottom;\n\n\t\t\t\t\tvar leftBoxes = filterByPosition(chart.boxes, 'left');\n\t\t\t\t\tvar rightBoxes = filterByPosition(chart.boxes, 'right');\n\t\t\t\t\tvar topBoxes = filterByPosition(chart.boxes, 'top');\n\t\t\t\t\tvar bottomBoxes = filterByPosition(chart.boxes, 'bottom');\n\t\t\t\t\tvar chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea');\n\n\t\t\t\t\t// Sort boxes by weight. A higher weight is further away from the chart area\n\t\t\t\t\tsortByWeight(leftBoxes, true);\n\t\t\t\t\tsortByWeight(rightBoxes, false);\n\t\t\t\t\tsortByWeight(topBoxes, true);\n\t\t\t\t\tsortByWeight(bottomBoxes, false);\n\n\t\t\t\t\t// Essentially we now have any number of boxes on each of the 4 sides.\n\t\t\t\t\t// Our canvas looks like the following.\n\t\t\t\t\t// The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n\t\t\t\t\t// B1 is the bottom axis\n\t\t\t\t\t// There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n\t\t\t\t\t// These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n\t\t\t\t\t// an error will be thrown.\n\t\t\t\t\t//\n\t\t\t\t\t// |----------------------------------------------------|\n\t\t\t\t\t// | T1 (Full Width) |\n\t\t\t\t\t// |----------------------------------------------------|\n\t\t\t\t\t// | | | T2 | |\n\t\t\t\t\t// | |----|-------------------------------------|----|\n\t\t\t\t\t// | | | C1 | | C2 | |\n\t\t\t\t\t// | | |----| |----| |\n\t\t\t\t\t// | | | | |\n\t\t\t\t\t// | L1 | L2 | ChartArea (C0) | R1 |\n\t\t\t\t\t// | | | | |\n\t\t\t\t\t// | | |----| |----| |\n\t\t\t\t\t// | | | C3 | | C4 | |\n\t\t\t\t\t// | |----|-------------------------------------|----|\n\t\t\t\t\t// | | | B1 | |\n\t\t\t\t\t// |----------------------------------------------------|\n\t\t\t\t\t// | B2 (Full Width) |\n\t\t\t\t\t// |----------------------------------------------------|\n\t\t\t\t\t//\n\t\t\t\t\t// What we do to find the best sizing, we do the following\n\t\t\t\t\t// 1. Determine the minimum size of the chart area.\n\t\t\t\t\t// 2. Split the remaining width equally between each vertical axis\n\t\t\t\t\t// 3. Split the remaining height equally between each horizontal axis\n\t\t\t\t\t// 4. Give each layout the maximum size it can be. The layout will return it's minimum size\n\t\t\t\t\t// 5. Adjust the sizes of each axis based on it's minimum reported size.\n\t\t\t\t\t// 6. Refit each axis\n\t\t\t\t\t// 7. Position each axis in the final location\n\t\t\t\t\t// 8. Tell the chart the final location of the chart area\n\t\t\t\t\t// 9. Tell any axes that overlay the chart area the positions of the chart area\n\n\t\t\t\t\t// Step 1\n\t\t\t\t\tvar chartWidth = width - leftPadding - rightPadding;\n\t\t\t\t\tvar chartHeight = height - topPadding - bottomPadding;\n\t\t\t\t\tvar chartAreaWidth = chartWidth / 2; // min 50%\n\t\t\t\t\tvar chartAreaHeight = chartHeight / 2; // min 50%\n\n\t\t\t\t\t// Step 2\n\t\t\t\t\tvar verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length);\n\n\t\t\t\t\t// Step 3\n\t\t\t\t\tvar horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length);\n\n\t\t\t\t\t// Step 4\n\t\t\t\t\tvar maxChartAreaWidth = chartWidth;\n\t\t\t\t\tvar maxChartAreaHeight = chartHeight;\n\t\t\t\t\tvar minBoxSizes = [];\n\n\t\t\t\t\tfunction getMinimumBoxSize(box) {\n\t\t\t\t\t\tvar minSize;\n\t\t\t\t\t\tvar isHorizontal = box.isHorizontal();\n\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\tminSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight);\n\t\t\t\t\t\t\tmaxChartAreaHeight -= minSize.height;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tminSize = box.update(verticalBoxWidth, maxChartAreaHeight);\n\t\t\t\t\t\t\tmaxChartAreaWidth -= minSize.width;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tminBoxSizes.push({\n\t\t\t\t\t\t\thorizontal: isHorizontal,\n\t\t\t\t\t\t\tminSize: minSize,\n\t\t\t\t\t\t\tbox: box\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\thelpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize);\n\n\t\t\t\t\t// If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)\n\t\t\t\t\tvar maxHorizontalLeftPadding = 0;\n\t\t\t\t\tvar maxHorizontalRightPadding = 0;\n\t\t\t\t\tvar maxVerticalTopPadding = 0;\n\t\t\t\t\tvar maxVerticalBottomPadding = 0;\n\n\t\t\t\t\thelpers.each(topBoxes.concat(bottomBoxes), function (horizontalBox) {\n\t\t\t\t\t\tif (horizontalBox.getPadding) {\n\t\t\t\t\t\t\tvar boxPadding = horizontalBox.getPadding();\n\t\t\t\t\t\t\tmaxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left);\n\t\t\t\t\t\t\tmaxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\thelpers.each(leftBoxes.concat(rightBoxes), function (verticalBox) {\n\t\t\t\t\t\tif (verticalBox.getPadding) {\n\t\t\t\t\t\t\tvar boxPadding = verticalBox.getPadding();\n\t\t\t\t\t\t\tmaxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top);\n\t\t\t\t\t\t\tmaxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could\n\t\t\t\t\t// be if the axes are drawn at their minimum sizes.\n\t\t\t\t\t// Steps 5 & 6\n\t\t\t\t\tvar totalLeftBoxesWidth = leftPadding;\n\t\t\t\t\tvar totalRightBoxesWidth = rightPadding;\n\t\t\t\t\tvar totalTopBoxesHeight = topPadding;\n\t\t\t\t\tvar totalBottomBoxesHeight = bottomPadding;\n\n\t\t\t\t\t// Function to fit a box\n\t\t\t\t\tfunction fitBox(box) {\n\t\t\t\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function (minBox) {\n\t\t\t\t\t\t\treturn minBox.box === box;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (minBoxSize) {\n\t\t\t\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\t\t\t\tvar scaleMargin = {\n\t\t\t\t\t\t\t\t\tleft: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding),\n\t\t\t\t\t\t\t\t\tright: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding),\n\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\tbottom: 0\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t// Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends\n\t\t\t\t\t\t\t\t// on the margin. Sometimes they need to increase in size slightly\n\t\t\t\t\t\t\t\tbox.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update, and calculate the left and right margins for the horizontal boxes\n\t\t\t\t\thelpers.each(leftBoxes.concat(rightBoxes), fitBox);\n\n\t\t\t\t\thelpers.each(leftBoxes, function (box) {\n\t\t\t\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t\t\t\t});\n\n\t\t\t\t\thelpers.each(rightBoxes, function (box) {\n\t\t\t\t\t\ttotalRightBoxesWidth += box.width;\n\t\t\t\t\t});\n\n\t\t\t\t\t// Set the Left and Right margins for the horizontal boxes\n\t\t\t\t\thelpers.each(topBoxes.concat(bottomBoxes), fitBox);\n\n\t\t\t\t\t// Figure out how much margin is on the top and bottom of the vertical boxes\n\t\t\t\t\thelpers.each(topBoxes, function (box) {\n\t\t\t\t\t\ttotalTopBoxesHeight += box.height;\n\t\t\t\t\t});\n\n\t\t\t\t\thelpers.each(bottomBoxes, function (box) {\n\t\t\t\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t\t\t\t});\n\n\t\t\t\t\tfunction finalFitVerticalBox(box) {\n\t\t\t\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function (minSize) {\n\t\t\t\t\t\t\treturn minSize.box === box;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tvar scaleMargin = {\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\t\t\t\tbottom: totalBottomBoxesHeight\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (minBoxSize) {\n\t\t\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Let the left layout know the final margin\n\t\t\t\t\thelpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox);\n\n\t\t\t\t\t// Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)\n\t\t\t\t\ttotalLeftBoxesWidth = leftPadding;\n\t\t\t\t\ttotalRightBoxesWidth = rightPadding;\n\t\t\t\t\ttotalTopBoxesHeight = topPadding;\n\t\t\t\t\ttotalBottomBoxesHeight = bottomPadding;\n\n\t\t\t\t\thelpers.each(leftBoxes, function (box) {\n\t\t\t\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t\t\t\t});\n\n\t\t\t\t\thelpers.each(rightBoxes, function (box) {\n\t\t\t\t\t\ttotalRightBoxesWidth += box.width;\n\t\t\t\t\t});\n\n\t\t\t\t\thelpers.each(topBoxes, function (box) {\n\t\t\t\t\t\ttotalTopBoxesHeight += box.height;\n\t\t\t\t\t});\n\t\t\t\t\thelpers.each(bottomBoxes, function (box) {\n\t\t\t\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t\t\t\t});\n\n\t\t\t\t\t// We may be adding some padding to account for rotated x axis labels\n\t\t\t\t\tvar leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0);\n\t\t\t\t\ttotalLeftBoxesWidth += leftPaddingAddition;\n\t\t\t\t\ttotalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0);\n\n\t\t\t\t\tvar topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0);\n\t\t\t\t\ttotalTopBoxesHeight += topPaddingAddition;\n\t\t\t\t\ttotalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0);\n\n\t\t\t\t\t// Figure out if our chart area changed. This would occur if the dataset layout label rotation\n\t\t\t\t\t// changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do\n\t\t\t\t\t// without calling `fit` again\n\t\t\t\t\tvar newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight;\n\t\t\t\t\tvar newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth;\n\n\t\t\t\t\tif (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {\n\t\t\t\t\t\thelpers.each(leftBoxes, function (box) {\n\t\t\t\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\thelpers.each(rightBoxes, function (box) {\n\t\t\t\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\thelpers.each(topBoxes, function (box) {\n\t\t\t\t\t\t\tif (!box.fullWidth) {\n\t\t\t\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\thelpers.each(bottomBoxes, function (box) {\n\t\t\t\t\t\t\tif (!box.fullWidth) {\n\t\t\t\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tmaxChartAreaHeight = newMaxChartAreaHeight;\n\t\t\t\t\t\tmaxChartAreaWidth = newMaxChartAreaWidth;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Step 7 - Position the boxes\n\t\t\t\t\tvar left = leftPadding + leftPaddingAddition;\n\t\t\t\t\tvar top = topPadding + topPaddingAddition;\n\n\t\t\t\t\tfunction placeBox(box) {\n\t\t\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\t\t\tbox.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth;\n\t\t\t\t\t\t\tbox.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth;\n\t\t\t\t\t\t\tbox.top = top;\n\t\t\t\t\t\t\tbox.bottom = top + box.height;\n\n\t\t\t\t\t\t\t// Move to next point\n\t\t\t\t\t\t\ttop = box.bottom;\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tbox.left = left;\n\t\t\t\t\t\t\tbox.right = left + box.width;\n\t\t\t\t\t\t\tbox.top = totalTopBoxesHeight;\n\t\t\t\t\t\t\tbox.bottom = totalTopBoxesHeight + maxChartAreaHeight;\n\n\t\t\t\t\t\t\t// Move to next point\n\t\t\t\t\t\t\tleft = box.right;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\thelpers.each(leftBoxes.concat(topBoxes), placeBox);\n\n\t\t\t\t\t// Account for chart width and height\n\t\t\t\t\tleft += maxChartAreaWidth;\n\t\t\t\t\ttop += maxChartAreaHeight;\n\n\t\t\t\t\thelpers.each(rightBoxes, placeBox);\n\t\t\t\t\thelpers.each(bottomBoxes, placeBox);\n\n\t\t\t\t\t// Step 8\n\t\t\t\t\tchart.chartArea = {\n\t\t\t\t\t\tleft: totalLeftBoxesWidth,\n\t\t\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\t\t\tright: totalLeftBoxesWidth + maxChartAreaWidth,\n\t\t\t\t\t\tbottom: totalTopBoxesHeight + maxChartAreaHeight\n\t\t\t\t\t};\n\n\t\t\t\t\t// Step 9\n\t\t\t\t\thelpers.each(chartAreaBoxes, function (box) {\n\t\t\t\t\t\tbox.left = chart.chartArea.left;\n\t\t\t\t\t\tbox.top = chart.chartArea.top;\n\t\t\t\t\t\tbox.right = chart.chartArea.right;\n\t\t\t\t\t\tbox.bottom = chart.chartArea.bottom;\n\n\t\t\t\t\t\tbox.update(maxChartAreaWidth, maxChartAreaHeight);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"46\": 46 }], 32: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('global', {\n\t\t\t\tplugins: {}\n\t\t\t});\n\n\t\t\t/**\n * The plugin service singleton\n * @namespace Chart.plugins\n * @since 2.1.0\n */\n\t\t\tmodule.exports = {\n\t\t\t\t/**\n * Globally registered plugins.\n * @private\n */\n\t\t\t\t_plugins: [],\n\n\t\t\t\t/**\n * This identifier is used to invalidate the descriptors cache attached to each chart\n * when a global plugin is registered or unregistered. In this case, the cache ID is\n * incremented and descriptors are regenerated during following API calls.\n * @private\n */\n\t\t\t\t_cacheId: 0,\n\n\t\t\t\t/**\n * Registers the given plugin(s) if not already registered.\n * @param {Array|Object} plugins plugin instance(s).\n */\n\t\t\t\tregister: function register(plugins) {\n\t\t\t\t\tvar p = this._plugins;\n\t\t\t\t\t[].concat(plugins).forEach(function (plugin) {\n\t\t\t\t\t\tif (p.indexOf(plugin) === -1) {\n\t\t\t\t\t\t\tp.push(plugin);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tthis._cacheId++;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Unregisters the given plugin(s) only if registered.\n * @param {Array|Object} plugins plugin instance(s).\n */\n\t\t\t\tunregister: function unregister(plugins) {\n\t\t\t\t\tvar p = this._plugins;\n\t\t\t\t\t[].concat(plugins).forEach(function (plugin) {\n\t\t\t\t\t\tvar idx = p.indexOf(plugin);\n\t\t\t\t\t\tif (idx !== -1) {\n\t\t\t\t\t\t\tp.splice(idx, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tthis._cacheId++;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Remove all registered plugins.\n * @since 2.1.5\n */\n\t\t\t\tclear: function clear() {\n\t\t\t\t\tthis._plugins = [];\n\t\t\t\t\tthis._cacheId++;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns the number of registered plugins?\n * @returns {Number}\n * @since 2.1.5\n */\n\t\t\t\tcount: function count() {\n\t\t\t\t\treturn this._plugins.length;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns all registered plugin instances.\n * @returns {Array} array of plugin objects.\n * @since 2.1.5\n */\n\t\t\t\tgetAll: function getAll() {\n\t\t\t\t\treturn this._plugins;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Calls enabled plugins for `chart` on the specified hook and with the given args.\n * This method immediately returns as soon as a plugin explicitly returns false. The\n * returned value can be used, for instance, to interrupt the current action.\n * @param {Object} chart - The chart instance for which plugins should be called.\n * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n * @param {Array} [args] - Extra arguments to apply to the hook call.\n * @returns {Boolean} false if any of the plugins return false, else returns true.\n */\n\t\t\t\tnotify: function notify(chart, hook, args) {\n\t\t\t\t\tvar descriptors = this.descriptors(chart);\n\t\t\t\t\tvar ilen = descriptors.length;\n\t\t\t\t\tvar i, descriptor, plugin, params, method;\n\n\t\t\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\t\t\tdescriptor = descriptors[i];\n\t\t\t\t\t\tplugin = descriptor.plugin;\n\t\t\t\t\t\tmethod = plugin[hook];\n\t\t\t\t\t\tif (typeof method === 'function') {\n\t\t\t\t\t\t\tparams = [chart].concat(args || []);\n\t\t\t\t\t\t\tparams.push(descriptor.options);\n\t\t\t\t\t\t\tif (method.apply(plugin, params) === false) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns descriptors of enabled plugins for the given chart.\n * @returns {Array} [{ plugin, options }]\n * @private\n */\n\t\t\t\tdescriptors: function descriptors(chart) {\n\t\t\t\t\tvar cache = chart.$plugins || (chart.$plugins = {});\n\t\t\t\t\tif (cache.id === this._cacheId) {\n\t\t\t\t\t\treturn cache.descriptors;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar plugins = [];\n\t\t\t\t\tvar descriptors = [];\n\t\t\t\t\tvar config = chart && chart.config || {};\n\t\t\t\t\tvar options = config.options && config.options.plugins || {};\n\n\t\t\t\t\tthis._plugins.concat(config.plugins || []).forEach(function (plugin) {\n\t\t\t\t\t\tvar idx = plugins.indexOf(plugin);\n\t\t\t\t\t\tif (idx !== -1) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar id = plugin.id;\n\t\t\t\t\t\tvar opts = options[id];\n\t\t\t\t\t\tif (opts === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (opts === true) {\n\t\t\t\t\t\t\topts = helpers.clone(defaults.global.plugins[id]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tplugins.push(plugin);\n\t\t\t\t\t\tdescriptors.push({\n\t\t\t\t\t\t\tplugin: plugin,\n\t\t\t\t\t\t\toptions: opts || {}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\tcache.descriptors = descriptors;\n\t\t\t\t\tcache.id = this._cacheId;\n\t\t\t\t\treturn descriptors;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Invalidates cache for the given chart: descriptors hold a reference on plugin option,\n * but in some cases, this reference can be changed by the user when updating options.\n * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n * @private\n */\n\t\t\t\t_invalidate: function _invalidate(chart) {\n\t\t\t\t\tdelete chart.$plugins;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t/**\n * Plugin extension hooks.\n * @interface IPlugin\n * @since 2.1.0\n */\n\t\t\t/**\n * @method IPlugin#beforeInit\n * @desc Called before initializing `chart`.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#afterInit\n * @desc Called after `chart` has been initialized and before the first update.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeUpdate\n * @desc Called before updating `chart`. If any plugin returns `false`, the update\n * is cancelled (and thus subsequent render(s)) until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart update.\n */\n\t\t\t/**\n * @method IPlugin#afterUpdate\n * @desc Called after `chart` has been updated and before rendering. Note that this\n * hook will not be called if the chart update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeDatasetsUpdate\n * @desc Called before updating the `chart` datasets. If any plugin returns `false`,\n * the datasets update is cancelled until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} false to cancel the datasets update.\n * @since version 2.1.5\n */\n\t\t\t/**\n * @method IPlugin#afterDatasetsUpdate\n * @desc Called after the `chart` datasets have been updated. Note that this hook\n * will not be called if the datasets update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @since version 2.1.5\n */\n\t\t\t/**\n * @method IPlugin#beforeDatasetUpdate\n * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin\n * returns `false`, the datasets update is cancelled until another `update` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n\t\t\t/**\n * @method IPlugin#afterDatasetUpdate\n * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note\n * that this hook will not be called if the datasets update has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeLayout\n * @desc Called before laying out `chart`. If any plugin returns `false`,\n * the layout update is cancelled until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart layout.\n */\n\t\t\t/**\n * @method IPlugin#afterLayout\n * @desc Called after the `chart` has been layed out. Note that this hook will not\n * be called if the layout update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeRender\n * @desc Called before rendering `chart`. If any plugin returns `false`,\n * the rendering is cancelled until another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart rendering.\n */\n\t\t\t/**\n * @method IPlugin#afterRender\n * @desc Called after the `chart` has been fully rendered (and animation completed). Note\n * that this hook will not be called if the rendering has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeDraw\n * @desc Called before drawing `chart` at every animation frame specified by the given\n * easing value. If any plugin returns `false`, the frame drawing is cancelled until\n * another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart drawing.\n */\n\t\t\t/**\n * @method IPlugin#afterDraw\n * @desc Called after the `chart` has been drawn for the specific easing value. Note\n * that this hook will not be called if the drawing has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeDatasetsDraw\n * @desc Called before drawing the `chart` datasets. If any plugin returns `false`,\n * the datasets drawing is cancelled until another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n\t\t\t/**\n * @method IPlugin#afterDatasetsDraw\n * @desc Called after the `chart` datasets have been drawn. Note that this hook\n * will not be called if the datasets drawing has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeDatasetDraw\n * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets\n * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing\n * is cancelled until another `render` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n\t\t\t/**\n * @method IPlugin#afterDatasetDraw\n * @desc Called after the `chart` datasets at the given `args.index` have been drawn\n * (datasets are drawn in the reverse order). Note that this hook will not be called\n * if the datasets drawing has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeTooltipDraw\n * @desc Called before drawing the `tooltip`. If any plugin returns `false`,\n * the tooltip drawing is cancelled until another `render` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Object} args.tooltip - The tooltip.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart tooltip drawing.\n */\n\t\t\t/**\n * @method IPlugin#afterTooltipDraw\n * @desc Called after drawing the `tooltip`. Note that this hook will not\n * be called if the tooltip drawing has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Object} args.tooltip - The tooltip.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeEvent\n * @desc Called before processing the specified `event`. If any plugin returns `false`,\n * the event will be discarded.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {IEvent} event - The event object.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#afterEvent\n * @desc Called after the `event` has been consumed. Note that this hook\n * will not be called if the `event` has been previously discarded.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {IEvent} event - The event object.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#resize\n * @desc Called after the chart as been resized.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} size - The new canvas display size (eq. canvas.style width & height).\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#destroy\n * @desc Called after the chart as been destroyed.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\t\t}, { \"26\": 26, \"46\": 46 }], 33: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\t\t\tvar helpers = require(46);\n\t\t\tvar Ticks = require(35);\n\n\t\t\tdefaults._set('scale', {\n\t\t\t\tdisplay: true,\n\t\t\t\tposition: 'left',\n\t\t\t\toffset: false,\n\n\t\t\t\t// grid line settings\n\t\t\t\tgridLines: {\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tdrawBorder: true,\n\t\t\t\t\tdrawOnChartArea: true,\n\t\t\t\t\tdrawTicks: true,\n\t\t\t\t\ttickMarkLength: 10,\n\t\t\t\t\tzeroLineWidth: 1,\n\t\t\t\t\tzeroLineColor: 'rgba(0,0,0,0.25)',\n\t\t\t\t\tzeroLineBorderDash: [],\n\t\t\t\t\tzeroLineBorderDashOffset: 0.0,\n\t\t\t\t\toffsetGridLines: false,\n\t\t\t\t\tborderDash: [],\n\t\t\t\t\tborderDashOffset: 0.0\n\t\t\t\t},\n\n\t\t\t\t// scale label\n\t\t\t\tscaleLabel: {\n\t\t\t\t\t// display property\n\t\t\t\t\tdisplay: false,\n\n\t\t\t\t\t// actual label\n\t\t\t\t\tlabelString: '',\n\n\t\t\t\t\t// line height\n\t\t\t\t\tlineHeight: 1.2,\n\n\t\t\t\t\t// top/bottom padding\n\t\t\t\t\tpadding: {\n\t\t\t\t\t\ttop: 4,\n\t\t\t\t\t\tbottom: 4\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// label settings\n\t\t\t\tticks: {\n\t\t\t\t\tbeginAtZero: false,\n\t\t\t\t\tminRotation: 0,\n\t\t\t\t\tmaxRotation: 50,\n\t\t\t\t\tmirror: false,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\treverse: false,\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tautoSkip: true,\n\t\t\t\t\tautoSkipPadding: 0,\n\t\t\t\t\tlabelOffset: 0,\n\t\t\t\t\t// We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n\t\t\t\t\tcallback: Ticks.formatters.values,\n\t\t\t\t\tminor: {},\n\t\t\t\t\tmajor: {}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfunction labelsFromTicks(ticks) {\n\t\t\t\tvar labels = [];\n\t\t\t\tvar i, ilen;\n\n\t\t\t\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\t\t\t\tlabels.push(ticks[i].label);\n\t\t\t\t}\n\n\t\t\t\treturn labels;\n\t\t\t}\n\n\t\t\tfunction getLineValue(scale, index, offsetGridLines) {\n\t\t\t\tvar lineValue = scale.getPixelForTick(index);\n\n\t\t\t\tif (offsetGridLines) {\n\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\tlineValue -= (scale.getPixelForTick(1) - lineValue) / 2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn lineValue;\n\t\t\t}\n\n\t\t\tfunction computeTextSize(context, tick, font) {\n\t\t\t\treturn helpers.isArray(tick) ? helpers.longestText(context, font, tick) : context.measureText(tick).width;\n\t\t\t}\n\n\t\t\tfunction parseFontOptions(options) {\n\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\t\tvar globalDefaults = defaults.global;\n\t\t\t\tvar size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\tvar style = valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\tvar family = valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily);\n\n\t\t\t\treturn {\n\t\t\t\t\tsize: size,\n\t\t\t\t\tstyle: style,\n\t\t\t\t\tfamily: family,\n\t\t\t\t\tfont: helpers.fontString(size, style, family)\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfunction parseLineHeight(options) {\n\t\t\t\treturn helpers.options.toLineHeight(helpers.valueOrDefault(options.lineHeight, 1.2), helpers.valueOrDefault(options.fontSize, defaults.global.defaultFontSize));\n\t\t\t}\n\n\t\t\tmodule.exports = Element.extend({\n\t\t\t\t/**\n * Get the padding needed for the scale\n * @method getPadding\n * @private\n * @returns {Padding} the necessary padding\n */\n\t\t\t\tgetPadding: function getPadding() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tleft: me.paddingLeft || 0,\n\t\t\t\t\t\ttop: me.paddingTop || 0,\n\t\t\t\t\t\tright: me.paddingRight || 0,\n\t\t\t\t\t\tbottom: me.paddingBottom || 0\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns the scale tick objects ({label, major})\n * @since 2.7\n */\n\t\t\t\tgetTicks: function getTicks() {\n\t\t\t\t\treturn this._ticks;\n\t\t\t\t},\n\n\t\t\t\t// These methods are ordered by lifecyle. Utilities then follow.\n\t\t\t\t// Any function defined here is inherited by all scale types.\n\t\t\t\t// Any function can be extended by the scale type\n\n\t\t\t\tmergeTicksOptions: function mergeTicksOptions() {\n\t\t\t\t\tvar ticks = this.options.ticks;\n\t\t\t\t\tif (ticks.minor === false) {\n\t\t\t\t\t\tticks.minor = {\n\t\t\t\t\t\t\tdisplay: false\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tif (ticks.major === false) {\n\t\t\t\t\t\tticks.major = {\n\t\t\t\t\t\t\tdisplay: false\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tfor (var key in ticks) {\n\t\t\t\t\t\tif (key !== 'major' && key !== 'minor') {\n\t\t\t\t\t\t\tif (typeof ticks.minor[key] === 'undefined') {\n\t\t\t\t\t\t\t\tticks.minor[key] = ticks[key];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (typeof ticks.major[key] === 'undefined') {\n\t\t\t\t\t\t\t\tticks.major[key] = ticks[key];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tbeforeUpdate: function beforeUpdate() {\n\t\t\t\t\thelpers.callback(this.options.beforeUpdate, [this]);\n\t\t\t\t},\n\n\t\t\t\tupdate: function update(maxWidth, maxHeight, margins) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar i, ilen, labels, label, ticks, tick;\n\n\t\t\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\t\t\tme.beforeUpdate();\n\n\t\t\t\t\t// Absorb the master measurements\n\t\t\t\t\tme.maxWidth = maxWidth;\n\t\t\t\t\tme.maxHeight = maxHeight;\n\t\t\t\t\tme.margins = helpers.extend({\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tbottom: 0\n\t\t\t\t\t}, margins);\n\t\t\t\t\tme.longestTextCache = me.longestTextCache || {};\n\n\t\t\t\t\t// Dimensions\n\t\t\t\t\tme.beforeSetDimensions();\n\t\t\t\t\tme.setDimensions();\n\t\t\t\t\tme.afterSetDimensions();\n\n\t\t\t\t\t// Data min/max\n\t\t\t\t\tme.beforeDataLimits();\n\t\t\t\t\tme.determineDataLimits();\n\t\t\t\t\tme.afterDataLimits();\n\n\t\t\t\t\t// Ticks - `this.ticks` is now DEPRECATED!\n\t\t\t\t\t// Internal ticks are now stored as objects in the PRIVATE `this._ticks` member\n\t\t\t\t\t// and must not be accessed directly from outside this class. `this.ticks` being\n\t\t\t\t\t// around for long time and not marked as private, we can't change its structure\n\t\t\t\t\t// without unexpected breaking changes. If you need to access the scale ticks,\n\t\t\t\t\t// use scale.getTicks() instead.\n\n\t\t\t\t\tme.beforeBuildTicks();\n\n\t\t\t\t\t// New implementations should return an array of objects but for BACKWARD COMPAT,\n\t\t\t\t\t// we still support no return (`this.ticks` internally set by calling this method).\n\t\t\t\t\tticks = me.buildTicks() || [];\n\n\t\t\t\t\tme.afterBuildTicks();\n\n\t\t\t\t\tme.beforeTickToLabelConversion();\n\n\t\t\t\t\t// New implementations should return the formatted tick labels but for BACKWARD\n\t\t\t\t\t// COMPAT, we still support no return (`this.ticks` internally changed by calling\n\t\t\t\t\t// this method and supposed to contain only string values).\n\t\t\t\t\tlabels = me.convertTicksToLabels(ticks) || me.ticks;\n\n\t\t\t\t\tme.afterTickToLabelConversion();\n\n\t\t\t\t\tme.ticks = labels; // BACKWARD COMPATIBILITY\n\n\t\t\t\t\t// IMPORTANT: from this point, we consider that `this.ticks` will NEVER change!\n\n\t\t\t\t\t// BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)\n\t\t\t\t\tfor (i = 0, ilen = labels.length; i < ilen; ++i) {\n\t\t\t\t\t\tlabel = labels[i];\n\t\t\t\t\t\ttick = ticks[i];\n\t\t\t\t\t\tif (!tick) {\n\t\t\t\t\t\t\tticks.push(tick = {\n\t\t\t\t\t\t\t\tlabel: label,\n\t\t\t\t\t\t\t\tmajor: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttick.label = label;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tme._ticks = ticks;\n\n\t\t\t\t\t// Tick Rotation\n\t\t\t\t\tme.beforeCalculateTickRotation();\n\t\t\t\t\tme.calculateTickRotation();\n\t\t\t\t\tme.afterCalculateTickRotation();\n\t\t\t\t\t// Fit\n\t\t\t\t\tme.beforeFit();\n\t\t\t\t\tme.fit();\n\t\t\t\t\tme.afterFit();\n\t\t\t\t\t//\n\t\t\t\t\tme.afterUpdate();\n\n\t\t\t\t\treturn me.minSize;\n\t\t\t\t},\n\t\t\t\tafterUpdate: function afterUpdate() {\n\t\t\t\t\thelpers.callback(this.options.afterUpdate, [this]);\n\t\t\t\t},\n\n\t\t\t\t//\n\n\t\t\t\tbeforeSetDimensions: function beforeSetDimensions() {\n\t\t\t\t\thelpers.callback(this.options.beforeSetDimensions, [this]);\n\t\t\t\t},\n\t\t\t\tsetDimensions: function setDimensions() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t// Reset position before calculating rotation\n\t\t\t\t\t\tme.width = me.maxWidth;\n\t\t\t\t\t\tme.left = 0;\n\t\t\t\t\t\tme.right = me.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t\t\t// Reset position before calculating rotation\n\t\t\t\t\t\tme.top = 0;\n\t\t\t\t\t\tme.bottom = me.height;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Reset padding\n\t\t\t\t\tme.paddingLeft = 0;\n\t\t\t\t\tme.paddingTop = 0;\n\t\t\t\t\tme.paddingRight = 0;\n\t\t\t\t\tme.paddingBottom = 0;\n\t\t\t\t},\n\t\t\t\tafterSetDimensions: function afterSetDimensions() {\n\t\t\t\t\thelpers.callback(this.options.afterSetDimensions, [this]);\n\t\t\t\t},\n\n\t\t\t\t// Data limits\n\t\t\t\tbeforeDataLimits: function beforeDataLimits() {\n\t\t\t\t\thelpers.callback(this.options.beforeDataLimits, [this]);\n\t\t\t\t},\n\t\t\t\tdetermineDataLimits: helpers.noop,\n\t\t\t\tafterDataLimits: function afterDataLimits() {\n\t\t\t\t\thelpers.callback(this.options.afterDataLimits, [this]);\n\t\t\t\t},\n\n\t\t\t\t//\n\t\t\t\tbeforeBuildTicks: function beforeBuildTicks() {\n\t\t\t\t\thelpers.callback(this.options.beforeBuildTicks, [this]);\n\t\t\t\t},\n\t\t\t\tbuildTicks: helpers.noop,\n\t\t\t\tafterBuildTicks: function afterBuildTicks() {\n\t\t\t\t\thelpers.callback(this.options.afterBuildTicks, [this]);\n\t\t\t\t},\n\n\t\t\t\tbeforeTickToLabelConversion: function beforeTickToLabelConversion() {\n\t\t\t\t\thelpers.callback(this.options.beforeTickToLabelConversion, [this]);\n\t\t\t\t},\n\t\t\t\tconvertTicksToLabels: function convertTicksToLabels() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\t// Convert ticks to strings\n\t\t\t\t\tvar tickOpts = me.options.ticks;\n\t\t\t\t\tme.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);\n\t\t\t\t},\n\t\t\t\tafterTickToLabelConversion: function afterTickToLabelConversion() {\n\t\t\t\t\thelpers.callback(this.options.afterTickToLabelConversion, [this]);\n\t\t\t\t},\n\n\t\t\t\t//\n\n\t\t\t\tbeforeCalculateTickRotation: function beforeCalculateTickRotation() {\n\t\t\t\t\thelpers.callback(this.options.beforeCalculateTickRotation, [this]);\n\t\t\t\t},\n\t\t\t\tcalculateTickRotation: function calculateTickRotation() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar context = me.ctx;\n\t\t\t\t\tvar tickOpts = me.options.ticks;\n\t\t\t\t\tvar labels = labelsFromTicks(me._ticks);\n\n\t\t\t\t\t// Get the width of each grid by calculating the difference\n\t\t\t\t\t// between x offsets between 0 and 1.\n\t\t\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\t\t\tcontext.font = tickFont.font;\n\n\t\t\t\t\tvar labelRotation = tickOpts.minRotation || 0;\n\n\t\t\t\t\tif (labels.length && me.options.display && me.isHorizontal()) {\n\t\t\t\t\t\tvar originalLabelWidth = helpers.longestText(context, tickFont.font, labels, me.longestTextCache);\n\t\t\t\t\t\tvar labelWidth = originalLabelWidth;\n\t\t\t\t\t\tvar cosRotation, sinRotation;\n\n\t\t\t\t\t\t// Allow 3 pixels x2 padding either side for label readability\n\t\t\t\t\t\tvar tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\n\n\t\t\t\t\t\t// Max label rotation can be set or default to 90 - also act as a loop counter\n\t\t\t\t\t\twhile (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {\n\t\t\t\t\t\t\tvar angleRadians = helpers.toRadians(labelRotation);\n\t\t\t\t\t\t\tcosRotation = Math.cos(angleRadians);\n\t\t\t\t\t\t\tsinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\t\t\tif (sinRotation * originalLabelWidth > me.maxHeight) {\n\t\t\t\t\t\t\t\t// go back one step\n\t\t\t\t\t\t\t\tlabelRotation--;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlabelRotation++;\n\t\t\t\t\t\t\tlabelWidth = cosRotation * originalLabelWidth;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tme.labelRotation = labelRotation;\n\t\t\t\t},\n\t\t\t\tafterCalculateTickRotation: function afterCalculateTickRotation() {\n\t\t\t\t\thelpers.callback(this.options.afterCalculateTickRotation, [this]);\n\t\t\t\t},\n\n\t\t\t\t//\n\n\t\t\t\tbeforeFit: function beforeFit() {\n\t\t\t\t\thelpers.callback(this.options.beforeFit, [this]);\n\t\t\t\t},\n\t\t\t\tfit: function fit() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\t// Reset\n\t\t\t\t\tvar minSize = me.minSize = {\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0\n\t\t\t\t\t};\n\n\t\t\t\t\tvar labels = labelsFromTicks(me._ticks);\n\n\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\tvar tickOpts = opts.ticks;\n\t\t\t\t\tvar scaleLabelOpts = opts.scaleLabel;\n\t\t\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\t\t\tvar display = opts.display;\n\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\t\t\tvar tickMarkLength = opts.gridLines.tickMarkLength;\n\n\t\t\t\t\t// Width\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t// subtract the margins to line up with the chartArea if we are a full width scale\n\t\t\t\t\t\tminSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tminSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// height\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tminSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t\t\t}\n\n\t\t\t\t\t// Are we showing a title for the scale?\n\t\t\t\t\tif (scaleLabelOpts.display && display) {\n\t\t\t\t\t\tvar scaleLabelLineHeight = parseLineHeight(scaleLabelOpts);\n\t\t\t\t\t\tvar scaleLabelPadding = helpers.options.toPadding(scaleLabelOpts.padding);\n\t\t\t\t\t\tvar deltaHeight = scaleLabelLineHeight + scaleLabelPadding.height;\n\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\tminSize.height += deltaHeight;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tminSize.width += deltaHeight;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Don't bother fitting the ticks if we are not showing them\n\t\t\t\t\tif (tickOpts.display && display) {\n\t\t\t\t\t\tvar largestTextWidth = helpers.longestText(me.ctx, tickFont.font, labels, me.longestTextCache);\n\t\t\t\t\t\tvar tallestLabelHeightInLines = helpers.numberOfLabelLines(labels);\n\t\t\t\t\t\tvar lineSpace = tickFont.size * 0.5;\n\t\t\t\t\t\tvar tickPadding = me.options.ticks.padding;\n\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\t// A horizontal axis is more constrained by the height.\n\t\t\t\t\t\t\tme.longestLabelWidth = largestTextWidth;\n\n\t\t\t\t\t\t\tvar angleRadians = helpers.toRadians(me.labelRotation);\n\t\t\t\t\t\t\tvar cosRotation = Math.cos(angleRadians);\n\t\t\t\t\t\t\tvar sinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\t\t\t// TODO - improve this calculation\n\t\t\t\t\t\t\tvar labelHeight = sinRotation * largestTextWidth + tickFont.size * tallestLabelHeightInLines + lineSpace * (tallestLabelHeightInLines - 1) + lineSpace; // padding\n\n\t\t\t\t\t\t\tminSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n\n\t\t\t\t\t\t\tme.ctx.font = tickFont.font;\n\t\t\t\t\t\t\tvar firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.font);\n\t\t\t\t\t\t\tvar lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.font);\n\n\t\t\t\t\t\t\t// Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n\t\t\t\t\t\t\t// which means that the right padding is dominated by the font height\n\t\t\t\t\t\t\tif (me.labelRotation !== 0) {\n\t\t\t\t\t\t\t\tme.paddingLeft = opts.position === 'bottom' ? cosRotation * firstLabelWidth + 3 : cosRotation * lineSpace + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\t\t\tme.paddingRight = opts.position === 'bottom' ? cosRotation * lineSpace + 3 : cosRotation * lastLabelWidth + 3;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tme.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\t\t\tme.paddingRight = lastLabelWidth / 2 + 3;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// A vertical axis is more constrained by the width. Labels are the\n\t\t\t\t\t\t\t// dominant factor here, so get that length first and account for padding\n\t\t\t\t\t\t\tif (tickOpts.mirror) {\n\t\t\t\t\t\t\t\tlargestTextWidth = 0;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// use lineSpace for consistency with horizontal axis\n\t\t\t\t\t\t\t\t// tickPadding is not implemented for horizontal\n\t\t\t\t\t\t\t\tlargestTextWidth += tickPadding + lineSpace;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tminSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth);\n\n\t\t\t\t\t\t\tme.paddingTop = tickFont.size / 2;\n\t\t\t\t\t\t\tme.paddingBottom = tickFont.size / 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tme.handleMargins();\n\n\t\t\t\t\tme.width = minSize.width;\n\t\t\t\t\tme.height = minSize.height;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Handle margins and padding interactions\n * @private\n */\n\t\t\t\thandleMargins: function handleMargins() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tif (me.margins) {\n\t\t\t\t\t\tme.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\n\t\t\t\t\t\tme.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\n\t\t\t\t\t\tme.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\n\t\t\t\t\t\tme.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tafterFit: function afterFit() {\n\t\t\t\t\thelpers.callback(this.options.afterFit, [this]);\n\t\t\t\t},\n\n\t\t\t\t// Shared Methods\n\t\t\t\tisHorizontal: function isHorizontal() {\n\t\t\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t\t\t},\n\t\t\t\tisFullWidth: function isFullWidth() {\n\t\t\t\t\treturn this.options.fullWidth;\n\t\t\t\t},\n\n\t\t\t\t// Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\n\t\t\t\tgetRightValue: function getRightValue(rawValue) {\n\t\t\t\t\t// Null and undefined values first\n\t\t\t\t\tif (helpers.isNullOrUndef(rawValue)) {\n\t\t\t\t\t\treturn NaN;\n\t\t\t\t\t}\n\t\t\t\t\t// isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n\t\t\t\t\tif (typeof rawValue === 'number' && !isFinite(rawValue)) {\n\t\t\t\t\t\treturn NaN;\n\t\t\t\t\t}\n\t\t\t\t\t// If it is in fact an object, dive in one more level\n\t\t\t\t\tif (rawValue) {\n\t\t\t\t\t\tif (this.isHorizontal()) {\n\t\t\t\t\t\t\tif (rawValue.x !== undefined) {\n\t\t\t\t\t\t\t\treturn this.getRightValue(rawValue.x);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (rawValue.y !== undefined) {\n\t\t\t\t\t\t\treturn this.getRightValue(rawValue.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Value is good, return it\n\t\t\t\t\treturn rawValue;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Used to get the value to display in the tooltip for the data at the given index\n * @param index\n * @param datasetIndex\n */\n\t\t\t\tgetLabelForIndex: helpers.noop,\n\n\t\t\t\t/**\n * Returns the location of the given data point. Value can either be an index or a numerical value\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n * @param value\n * @param index\n * @param datasetIndex\n */\n\t\t\t\tgetPixelForValue: helpers.noop,\n\n\t\t\t\t/**\n * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n * @param pixel\n */\n\t\t\t\tgetValueForPixel: helpers.noop,\n\n\t\t\t\t/**\n * Returns the location of the tick at the given index\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n */\n\t\t\t\tgetPixelForTick: function getPixelForTick(index) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar offset = me.options.offset;\n\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\t\t\tvar tickWidth = innerWidth / Math.max(me._ticks.length - (offset ? 0 : 1), 1);\n\t\t\t\t\t\tvar pixel = tickWidth * index + me.paddingLeft;\n\n\t\t\t\t\t\tif (offset) {\n\t\t\t\t\t\t\tpixel += tickWidth / 2;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar finalVal = me.left + Math.round(pixel);\n\t\t\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\t\t\treturn finalVal;\n\t\t\t\t\t}\n\t\t\t\t\tvar innerHeight = me.height - (me.paddingTop + me.paddingBottom);\n\t\t\t\t\treturn me.top + index * (innerHeight / (me._ticks.length - 1));\n\t\t\t\t},\n\n\t\t\t\t/**\n * Utility for getting the pixel location of a percentage of scale\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n */\n\t\t\t\tgetPixelForDecimal: function getPixelForDecimal(decimal) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\t\t\tvar valueOffset = innerWidth * decimal + me.paddingLeft;\n\n\t\t\t\t\t\tvar finalVal = me.left + Math.round(valueOffset);\n\t\t\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\t\t\treturn finalVal;\n\t\t\t\t\t}\n\t\t\t\t\treturn me.top + decimal * me.height;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns the pixel for the minimum chart value\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n */\n\t\t\t\tgetBasePixel: function getBasePixel() {\n\t\t\t\t\treturn this.getPixelForValue(this.getBaseValue());\n\t\t\t\t},\n\n\t\t\t\tgetBaseValue: function getBaseValue() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar min = me.min;\n\t\t\t\t\tvar max = me.max;\n\n\t\t\t\t\treturn me.beginAtZero ? 0 : min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @private\n */\n\t\t\t\t_autoSkip: function _autoSkip(ticks) {\n\t\t\t\t\tvar skipRatio;\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\t\tvar optionTicks = me.options.ticks.minor;\n\t\t\t\t\tvar tickCount = ticks.length;\n\t\t\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\t\t\t\t\tvar cosRotation = Math.cos(labelRotationRadians);\n\t\t\t\t\tvar longestRotatedLabel = me.longestLabelWidth * cosRotation;\n\t\t\t\t\tvar result = [];\n\t\t\t\t\tvar i, tick, shouldSkip;\n\n\t\t\t\t\t// figure out the maximum number of gridlines to show\n\t\t\t\t\tvar maxTicks;\n\t\t\t\t\tif (optionTicks.maxTicksLimit) {\n\t\t\t\t\t\tmaxTicks = optionTicks.maxTicksLimit;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tskipRatio = false;\n\n\t\t\t\t\t\tif ((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount > me.width - (me.paddingLeft + me.paddingRight)) {\n\t\t\t\t\t\t\tskipRatio = 1 + Math.floor((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount / (me.width - (me.paddingLeft + me.paddingRight)));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// if they defined a max number of optionTicks,\n\t\t\t\t\t\t// increase skipRatio until that number is met\n\t\t\t\t\t\tif (maxTicks && tickCount > maxTicks) {\n\t\t\t\t\t\t\tskipRatio = Math.max(skipRatio, Math.floor(tickCount / maxTicks));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i = 0; i < tickCount; i++) {\n\t\t\t\t\t\ttick = ticks[i];\n\n\t\t\t\t\t\t// Since we always show the last tick,we need may need to hide the last shown one before\n\t\t\t\t\t\tshouldSkip = skipRatio > 1 && i % skipRatio > 0 || i % skipRatio === 0 && i + skipRatio >= tickCount;\n\t\t\t\t\t\tif (shouldSkip && i !== tickCount - 1) {\n\t\t\t\t\t\t\t// leave tick in place but make sure it's not displayed (#4635)\n\t\t\t\t\t\t\tdelete tick.label;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult.push(tick);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\n\t\t\t\t// Actually draw the scale on the canvas\n\t\t\t\t// @param {rectangle} chartArea : the area of the chart to draw full grid lines on\n\t\t\t\tdraw: function draw(chartArea) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar options = me.options;\n\t\t\t\t\tif (!options.display) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar context = me.ctx;\n\t\t\t\t\tvar globalDefaults = defaults.global;\n\t\t\t\t\tvar optionTicks = options.ticks.minor;\n\t\t\t\t\tvar optionMajorTicks = options.ticks.major || optionTicks;\n\t\t\t\t\tvar gridLines = options.gridLines;\n\t\t\t\t\tvar scaleLabel = options.scaleLabel;\n\n\t\t\t\t\tvar isRotated = me.labelRotation !== 0;\n\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\t\t\tvar ticks = optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks();\n\t\t\t\t\tvar tickFontColor = helpers.valueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\t\tvar tickFont = parseFontOptions(optionTicks);\n\t\t\t\t\tvar majorTickFontColor = helpers.valueOrDefault(optionMajorTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\t\tvar majorTickFont = parseFontOptions(optionMajorTicks);\n\n\t\t\t\t\tvar tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;\n\n\t\t\t\t\tvar scaleLabelFontColor = helpers.valueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\t\tvar scaleLabelFont = parseFontOptions(scaleLabel);\n\t\t\t\t\tvar scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding);\n\t\t\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\n\t\t\t\t\tvar itemsToDraw = [];\n\n\t\t\t\t\tvar axisWidth = me.options.gridLines.lineWidth;\n\t\t\t\t\tvar xTickStart = options.position === 'right' ? me.left : me.right - axisWidth - tl;\n\t\t\t\t\tvar xTickEnd = options.position === 'right' ? me.left + tl : me.right;\n\t\t\t\t\tvar yTickStart = options.position === 'bottom' ? me.top + axisWidth : me.bottom - tl - axisWidth;\n\t\t\t\t\tvar yTickEnd = options.position === 'bottom' ? me.top + axisWidth + tl : me.bottom + axisWidth;\n\n\t\t\t\t\thelpers.each(ticks, function (tick, index) {\n\t\t\t\t\t\t// autoskipper skipped this tick (#4635)\n\t\t\t\t\t\tif (helpers.isNullOrUndef(tick.label)) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar label = tick.label;\n\t\t\t\t\t\tvar lineWidth, lineColor, borderDash, borderDashOffset;\n\t\t\t\t\t\tif (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) {\n\t\t\t\t\t\t\t// Draw the first index specially\n\t\t\t\t\t\t\tlineWidth = gridLines.zeroLineWidth;\n\t\t\t\t\t\t\tlineColor = gridLines.zeroLineColor;\n\t\t\t\t\t\t\tborderDash = gridLines.zeroLineBorderDash;\n\t\t\t\t\t\t\tborderDashOffset = gridLines.zeroLineBorderDashOffset;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, index);\n\t\t\t\t\t\t\tlineColor = helpers.valueAtIndexOrDefault(gridLines.color, index);\n\t\t\t\t\t\t\tborderDash = helpers.valueOrDefault(gridLines.borderDash, globalDefaults.borderDash);\n\t\t\t\t\t\t\tborderDashOffset = helpers.valueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Common properties\n\t\t\t\t\t\tvar tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY;\n\t\t\t\t\t\tvar textAlign = 'middle';\n\t\t\t\t\t\tvar textBaseline = 'middle';\n\t\t\t\t\t\tvar tickPadding = optionTicks.padding;\n\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\tvar labelYOffset = tl + tickPadding;\n\n\t\t\t\t\t\t\tif (options.position === 'bottom') {\n\t\t\t\t\t\t\t\t// bottom\n\t\t\t\t\t\t\t\ttextBaseline = !isRotated ? 'top' : 'middle';\n\t\t\t\t\t\t\t\ttextAlign = !isRotated ? 'center' : 'right';\n\t\t\t\t\t\t\t\tlabelY = me.top + labelYOffset;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// top\n\t\t\t\t\t\t\t\ttextBaseline = !isRotated ? 'bottom' : 'middle';\n\t\t\t\t\t\t\t\ttextAlign = !isRotated ? 'center' : 'left';\n\t\t\t\t\t\t\t\tlabelY = me.bottom - labelYOffset;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar xLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n\t\t\t\t\t\t\tif (xLineValue < me.left) {\n\t\t\t\t\t\t\t\tlineColor = 'rgba(0,0,0,0)';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\txLineValue += helpers.aliasPixel(lineWidth);\n\n\t\t\t\t\t\t\tlabelX = me.getPixelForTick(index) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option)\n\n\t\t\t\t\t\t\ttx1 = tx2 = x1 = x2 = xLineValue;\n\t\t\t\t\t\t\tty1 = yTickStart;\n\t\t\t\t\t\t\tty2 = yTickEnd;\n\t\t\t\t\t\t\ty1 = chartArea.top;\n\t\t\t\t\t\t\ty2 = chartArea.bottom + axisWidth;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\t\t\tvar labelXOffset;\n\n\t\t\t\t\t\t\tif (optionTicks.mirror) {\n\t\t\t\t\t\t\t\ttextAlign = isLeft ? 'left' : 'right';\n\t\t\t\t\t\t\t\tlabelXOffset = tickPadding;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttextAlign = isLeft ? 'right' : 'left';\n\t\t\t\t\t\t\t\tlabelXOffset = tl + tickPadding;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlabelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset;\n\n\t\t\t\t\t\t\tvar yLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n\t\t\t\t\t\t\tif (yLineValue < me.top) {\n\t\t\t\t\t\t\t\tlineColor = 'rgba(0,0,0,0)';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tyLineValue += helpers.aliasPixel(lineWidth);\n\n\t\t\t\t\t\t\tlabelY = me.getPixelForTick(index) + optionTicks.labelOffset;\n\n\t\t\t\t\t\t\ttx1 = xTickStart;\n\t\t\t\t\t\t\ttx2 = xTickEnd;\n\t\t\t\t\t\t\tx1 = chartArea.left;\n\t\t\t\t\t\t\tx2 = chartArea.right + axisWidth;\n\t\t\t\t\t\t\tty1 = ty2 = y1 = y2 = yLineValue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\titemsToDraw.push({\n\t\t\t\t\t\t\ttx1: tx1,\n\t\t\t\t\t\t\tty1: ty1,\n\t\t\t\t\t\t\ttx2: tx2,\n\t\t\t\t\t\t\tty2: ty2,\n\t\t\t\t\t\t\tx1: x1,\n\t\t\t\t\t\t\ty1: y1,\n\t\t\t\t\t\t\tx2: x2,\n\t\t\t\t\t\t\ty2: y2,\n\t\t\t\t\t\t\tlabelX: labelX,\n\t\t\t\t\t\t\tlabelY: labelY,\n\t\t\t\t\t\t\tglWidth: lineWidth,\n\t\t\t\t\t\t\tglColor: lineColor,\n\t\t\t\t\t\t\tglBorderDash: borderDash,\n\t\t\t\t\t\t\tglBorderDashOffset: borderDashOffset,\n\t\t\t\t\t\t\trotation: -1 * labelRotationRadians,\n\t\t\t\t\t\t\tlabel: label,\n\t\t\t\t\t\t\tmajor: tick.major,\n\t\t\t\t\t\t\ttextBaseline: textBaseline,\n\t\t\t\t\t\t\ttextAlign: textAlign\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\t// Draw all of the tick labels, tick marks, and grid lines at the correct places\n\t\t\t\t\thelpers.each(itemsToDraw, function (itemToDraw) {\n\t\t\t\t\t\tif (gridLines.display) {\n\t\t\t\t\t\t\tcontext.save();\n\t\t\t\t\t\t\tcontext.lineWidth = itemToDraw.glWidth;\n\t\t\t\t\t\t\tcontext.strokeStyle = itemToDraw.glColor;\n\t\t\t\t\t\t\tif (context.setLineDash) {\n\t\t\t\t\t\t\t\tcontext.setLineDash(itemToDraw.glBorderDash);\n\t\t\t\t\t\t\t\tcontext.lineDashOffset = itemToDraw.glBorderDashOffset;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcontext.beginPath();\n\n\t\t\t\t\t\t\tif (gridLines.drawTicks) {\n\t\t\t\t\t\t\t\tcontext.moveTo(itemToDraw.tx1, itemToDraw.ty1);\n\t\t\t\t\t\t\t\tcontext.lineTo(itemToDraw.tx2, itemToDraw.ty2);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (gridLines.drawOnChartArea) {\n\t\t\t\t\t\t\t\tcontext.moveTo(itemToDraw.x1, itemToDraw.y1);\n\t\t\t\t\t\t\t\tcontext.lineTo(itemToDraw.x2, itemToDraw.y2);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcontext.stroke();\n\t\t\t\t\t\t\tcontext.restore();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (optionTicks.display) {\n\t\t\t\t\t\t\t// Make sure we draw text in the correct color and font\n\t\t\t\t\t\t\tcontext.save();\n\t\t\t\t\t\t\tcontext.translate(itemToDraw.labelX, itemToDraw.labelY);\n\t\t\t\t\t\t\tcontext.rotate(itemToDraw.rotation);\n\t\t\t\t\t\t\tcontext.font = itemToDraw.major ? majorTickFont.font : tickFont.font;\n\t\t\t\t\t\t\tcontext.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor;\n\t\t\t\t\t\t\tcontext.textBaseline = itemToDraw.textBaseline;\n\t\t\t\t\t\t\tcontext.textAlign = itemToDraw.textAlign;\n\n\t\t\t\t\t\t\tvar label = itemToDraw.label;\n\t\t\t\t\t\t\tif (helpers.isArray(label)) {\n\t\t\t\t\t\t\t\tvar lineCount = label.length;\n\t\t\t\t\t\t\t\tvar lineHeight = tickFont.size * 1.5;\n\t\t\t\t\t\t\t\tvar y = me.isHorizontal() ? 0 : -lineHeight * (lineCount - 1) / 2;\n\n\t\t\t\t\t\t\t\tfor (var i = 0; i < lineCount; ++i) {\n\t\t\t\t\t\t\t\t\t// We just make sure the multiline element is a string here..\n\t\t\t\t\t\t\t\t\tcontext.fillText('' + label[i], 0, y);\n\t\t\t\t\t\t\t\t\t// apply same lineSpacing as calculated @ L#320\n\t\t\t\t\t\t\t\t\ty += lineHeight;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcontext.fillText(label, 0, 0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontext.restore();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tif (scaleLabel.display) {\n\t\t\t\t\t\t// Draw the scale label\n\t\t\t\t\t\tvar scaleLabelX;\n\t\t\t\t\t\tvar scaleLabelY;\n\t\t\t\t\t\tvar rotation = 0;\n\t\t\t\t\t\tvar halfLineHeight = parseLineHeight(scaleLabel) / 2;\n\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\tscaleLabelX = me.left + (me.right - me.left) / 2; // midpoint of the width\n\t\t\t\t\t\t\tscaleLabelY = options.position === 'bottom' ? me.bottom - halfLineHeight - scaleLabelPadding.bottom : me.top + halfLineHeight + scaleLabelPadding.top;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\t\t\tscaleLabelX = isLeft ? me.left + halfLineHeight + scaleLabelPadding.top : me.right - halfLineHeight - scaleLabelPadding.top;\n\t\t\t\t\t\t\tscaleLabelY = me.top + (me.bottom - me.top) / 2;\n\t\t\t\t\t\t\trotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontext.save();\n\t\t\t\t\t\tcontext.translate(scaleLabelX, scaleLabelY);\n\t\t\t\t\t\tcontext.rotate(rotation);\n\t\t\t\t\t\tcontext.textAlign = 'center';\n\t\t\t\t\t\tcontext.textBaseline = 'middle';\n\t\t\t\t\t\tcontext.fillStyle = scaleLabelFontColor; // render in correct colour\n\t\t\t\t\t\tcontext.font = scaleLabelFont.font;\n\t\t\t\t\t\tcontext.fillText(scaleLabel.labelString, 0, 0);\n\t\t\t\t\t\tcontext.restore();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (gridLines.drawBorder) {\n\t\t\t\t\t\t// Draw the line at the edge of the axis\n\t\t\t\t\t\tcontext.lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, 0);\n\t\t\t\t\t\tcontext.strokeStyle = helpers.valueAtIndexOrDefault(gridLines.color, 0);\n\t\t\t\t\t\tvar x1 = me.left;\n\t\t\t\t\t\tvar x2 = me.right + axisWidth;\n\t\t\t\t\t\tvar y1 = me.top;\n\t\t\t\t\t\tvar y2 = me.bottom + axisWidth;\n\n\t\t\t\t\t\tvar aliasPixel = helpers.aliasPixel(context.lineWidth);\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\ty1 = y2 = options.position === 'top' ? me.bottom : me.top;\n\t\t\t\t\t\t\ty1 += aliasPixel;\n\t\t\t\t\t\t\ty2 += aliasPixel;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tx1 = x2 = options.position === 'left' ? me.right : me.left;\n\t\t\t\t\t\t\tx1 += aliasPixel;\n\t\t\t\t\t\t\tx2 += aliasPixel;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontext.beginPath();\n\t\t\t\t\t\tcontext.moveTo(x1, y1);\n\t\t\t\t\t\tcontext.lineTo(x2, y2);\n\t\t\t\t\t\tcontext.stroke();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, { \"26\": 26, \"27\": 27, \"35\": 35, \"46\": 46 }], 34: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\t\t\tvar layouts = require(31);\n\n\t\t\tmodule.exports = {\n\t\t\t\t// Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n\t\t\t\t// use the new chart options to grab the correct scale\n\t\t\t\tconstructors: {},\n\t\t\t\t// Use a registration function so that we can move to an ES6 map when we no longer need to support\n\t\t\t\t// old browsers\n\n\t\t\t\t// Scale config defaults\n\t\t\t\tdefaults: {},\n\t\t\t\tregisterScaleType: function registerScaleType(type, scaleConstructor, scaleDefaults) {\n\t\t\t\t\tthis.constructors[type] = scaleConstructor;\n\t\t\t\t\tthis.defaults[type] = helpers.clone(scaleDefaults);\n\t\t\t\t},\n\t\t\t\tgetScaleConstructor: function getScaleConstructor(type) {\n\t\t\t\t\treturn this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n\t\t\t\t},\n\t\t\t\tgetScaleDefaults: function getScaleDefaults(type) {\n\t\t\t\t\t// Return the scale defaults merged with the global settings so that we always use the latest ones\n\t\t\t\t\treturn this.defaults.hasOwnProperty(type) ? helpers.merge({}, [defaults.scale, this.defaults[type]]) : {};\n\t\t\t\t},\n\t\t\t\tupdateScaleDefaults: function updateScaleDefaults(type, additions) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tif (me.defaults.hasOwnProperty(type)) {\n\t\t\t\t\t\tme.defaults[type] = helpers.extend(me.defaults[type], additions);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\taddScalesToLayout: function addScalesToLayout(chart) {\n\t\t\t\t\t// Adds each scale to the chart.boxes array to be sized accordingly\n\t\t\t\t\thelpers.each(chart.scales, function (scale) {\n\t\t\t\t\t\t// Set ILayoutItem parameters for backwards compatibility\n\t\t\t\t\t\tscale.fullWidth = scale.options.fullWidth;\n\t\t\t\t\t\tscale.position = scale.options.position;\n\t\t\t\t\t\tscale.weight = scale.options.weight;\n\t\t\t\t\t\tlayouts.addBox(chart, scale);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"26\": 26, \"31\": 31, \"46\": 46 }], 35: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\n\t\t\t/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\n\t\t\tmodule.exports = {\n\t\t\t\t/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\n\t\t\t\tformatters: {\n\t\t\t\t\t/**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {String|Array} the label to display\n */\n\t\t\t\t\tvalues: function values(value) {\n\t\t\t\t\t\treturn helpers.isArray(value) ? value : '' + value;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Formatter for linear numeric ticks\n * @method Chart.Ticks.formatters.linear\n * @param tickValue {Number} the value to be formatted\n * @param index {Number} the position of the tickValue parameter in the ticks array\n * @param ticks {Array<Number>} the list of ticks being converted\n * @return {String} string representation of the tickValue parameter\n */\n\t\t\t\t\tlinear: function linear(tickValue, index, ticks) {\n\t\t\t\t\t\t// If we have lots of ticks, don't use the ones\n\t\t\t\t\t\tvar delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];\n\n\t\t\t\t\t\t// If we have a number like 2.5 as the delta, figure out how many decimal places we need\n\t\t\t\t\t\tif (Math.abs(delta) > 1) {\n\t\t\t\t\t\t\tif (tickValue !== Math.floor(tickValue)) {\n\t\t\t\t\t\t\t\t// not an integer\n\t\t\t\t\t\t\t\tdelta = tickValue - Math.floor(tickValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar logDelta = helpers.log10(Math.abs(delta));\n\t\t\t\t\t\tvar tickString = '';\n\n\t\t\t\t\t\tif (tickValue !== 0) {\n\t\t\t\t\t\t\tvar maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1]));\n\t\t\t\t\t\t\tif (maxTick < 1e-4) {\n\t\t\t\t\t\t\t\t// all ticks are small numbers; use scientific notation\n\t\t\t\t\t\t\t\tvar logTick = helpers.log10(Math.abs(tickValue));\n\t\t\t\t\t\t\t\ttickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tvar numDecimal = -1 * Math.floor(logDelta);\n\t\t\t\t\t\t\t\tnumDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n\t\t\t\t\t\t\t\ttickString = tickValue.toFixed(numDecimal);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttickString = '0'; // never show decimal places for 0\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn tickString;\n\t\t\t\t\t},\n\n\t\t\t\t\tlogarithmic: function logarithmic(tickValue, index, ticks) {\n\t\t\t\t\t\tvar remain = tickValue / Math.pow(10, Math.floor(helpers.log10(tickValue)));\n\n\t\t\t\t\t\tif (tickValue === 0) {\n\t\t\t\t\t\t\treturn '0';\n\t\t\t\t\t\t} else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\n\t\t\t\t\t\t\treturn tickValue.toExponential();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"46\": 46 }], 36: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('global', {\n\t\t\t\ttooltips: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tcustom: null,\n\t\t\t\t\tmode: 'nearest',\n\t\t\t\t\tposition: 'average',\n\t\t\t\t\tintersect: true,\n\t\t\t\t\tbackgroundColor: 'rgba(0,0,0,0.8)',\n\t\t\t\t\ttitleFontStyle: 'bold',\n\t\t\t\t\ttitleSpacing: 2,\n\t\t\t\t\ttitleMarginBottom: 6,\n\t\t\t\t\ttitleFontColor: '#fff',\n\t\t\t\t\ttitleAlign: 'left',\n\t\t\t\t\tbodySpacing: 2,\n\t\t\t\t\tbodyFontColor: '#fff',\n\t\t\t\t\tbodyAlign: 'left',\n\t\t\t\t\tfooterFontStyle: 'bold',\n\t\t\t\t\tfooterSpacing: 2,\n\t\t\t\t\tfooterMarginTop: 6,\n\t\t\t\t\tfooterFontColor: '#fff',\n\t\t\t\t\tfooterAlign: 'left',\n\t\t\t\t\tyPadding: 6,\n\t\t\t\t\txPadding: 6,\n\t\t\t\t\tcaretPadding: 2,\n\t\t\t\t\tcaretSize: 5,\n\t\t\t\t\tcornerRadius: 6,\n\t\t\t\t\tmultiKeyBackground: '#fff',\n\t\t\t\t\tdisplayColors: true,\n\t\t\t\t\tborderColor: 'rgba(0,0,0,0)',\n\t\t\t\t\tborderWidth: 0,\n\t\t\t\t\tcallbacks: {\n\t\t\t\t\t\t// Args are: (tooltipItems, data)\n\t\t\t\t\t\tbeforeTitle: helpers.noop,\n\t\t\t\t\t\ttitle: function title(tooltipItems, data) {\n\t\t\t\t\t\t\t// Pick first xLabel for now\n\t\t\t\t\t\t\tvar title = '';\n\t\t\t\t\t\t\tvar labels = data.labels;\n\t\t\t\t\t\t\tvar labelCount = labels ? labels.length : 0;\n\n\t\t\t\t\t\t\tif (tooltipItems.length > 0) {\n\t\t\t\t\t\t\t\tvar item = tooltipItems[0];\n\n\t\t\t\t\t\t\t\tif (item.xLabel) {\n\t\t\t\t\t\t\t\t\ttitle = item.xLabel;\n\t\t\t\t\t\t\t\t} else if (labelCount > 0 && item.index < labelCount) {\n\t\t\t\t\t\t\t\t\ttitle = labels[item.index];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn title;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tafterTitle: helpers.noop,\n\n\t\t\t\t\t\t// Args are: (tooltipItems, data)\n\t\t\t\t\t\tbeforeBody: helpers.noop,\n\n\t\t\t\t\t\t// Args are: (tooltipItem, data)\n\t\t\t\t\t\tbeforeLabel: helpers.noop,\n\t\t\t\t\t\tlabel: function label(tooltipItem, data) {\n\t\t\t\t\t\t\tvar label = data.datasets[tooltipItem.datasetIndex].label || '';\n\n\t\t\t\t\t\t\tif (label) {\n\t\t\t\t\t\t\t\tlabel += ': ';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlabel += tooltipItem.yLabel;\n\t\t\t\t\t\t\treturn label;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabelColor: function labelColor(tooltipItem, chart) {\n\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(tooltipItem.datasetIndex);\n\t\t\t\t\t\t\tvar activeElement = meta.data[tooltipItem.index];\n\t\t\t\t\t\t\tvar view = activeElement._view;\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tborderColor: view.borderColor,\n\t\t\t\t\t\t\t\tbackgroundColor: view.backgroundColor\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabelTextColor: function labelTextColor() {\n\t\t\t\t\t\t\treturn this._options.bodyFontColor;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tafterLabel: helpers.noop,\n\n\t\t\t\t\t\t// Args are: (tooltipItems, data)\n\t\t\t\t\t\tafterBody: helpers.noop,\n\n\t\t\t\t\t\t// Args are: (tooltipItems, data)\n\t\t\t\t\t\tbeforeFooter: helpers.noop,\n\t\t\t\t\t\tfooter: helpers.noop,\n\t\t\t\t\t\tafterFooter: helpers.noop\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar positioners = {\n\t\t\t\t/**\n * Average mode places the tooltip at the average position of the elements shown\n * @function Chart.Tooltip.positioners.average\n * @param elements {ChartElement[]} the elements being displayed in the tooltip\n * @returns {Point} tooltip position\n */\n\t\t\t\taverage: function average(elements) {\n\t\t\t\t\tif (!elements.length) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar i, len;\n\t\t\t\t\tvar x = 0;\n\t\t\t\t\tvar y = 0;\n\t\t\t\t\tvar count = 0;\n\n\t\t\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\t\t\tvar el = elements[i];\n\t\t\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\t\t\tvar pos = el.tooltipPosition();\n\t\t\t\t\t\t\tx += pos.x;\n\t\t\t\t\t\t\ty += pos.y;\n\t\t\t\t\t\t\t++count;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: Math.round(x / count),\n\t\t\t\t\t\ty: Math.round(y / count)\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\t/**\n * Gets the tooltip position nearest of the item nearest to the event position\n * @function Chart.Tooltip.positioners.nearest\n * @param elements {Chart.Element[]} the tooltip elements\n * @param eventPosition {Point} the position of the event in canvas coordinates\n * @returns {Point} the tooltip position\n */\n\t\t\t\tnearest: function nearest(elements, eventPosition) {\n\t\t\t\t\tvar x = eventPosition.x;\n\t\t\t\t\tvar y = eventPosition.y;\n\t\t\t\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\t\t\t\tvar i, len, nearestElement;\n\n\t\t\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\t\t\tvar el = elements[i];\n\t\t\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\t\t\tvar center = el.getCenterPoint();\n\t\t\t\t\t\t\tvar d = helpers.distanceBetweenPoints(eventPosition, center);\n\n\t\t\t\t\t\t\tif (d < minDistance) {\n\t\t\t\t\t\t\t\tminDistance = d;\n\t\t\t\t\t\t\t\tnearestElement = el;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (nearestElement) {\n\t\t\t\t\t\tvar tp = nearestElement.tooltipPosition();\n\t\t\t\t\t\tx = tp.x;\n\t\t\t\t\t\ty = tp.y;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: x,\n\t\t\t\t\t\ty: y\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t/**\n * Helper method to merge the opacity into a color\n */\n\t\t\tfunction mergeOpacity(colorString, opacity) {\n\t\t\t\tvar color = helpers.color(colorString);\n\t\t\t\treturn color.alpha(opacity * color.alpha()).rgbaString();\n\t\t\t}\n\n\t\t\t// Helper to push or concat based on if the 2nd parameter is an array or not\n\t\t\tfunction pushOrConcat(base, toPush) {\n\t\t\t\tif (toPush) {\n\t\t\t\t\tif (helpers.isArray(toPush)) {\n\t\t\t\t\t\t// base = base.concat(toPush);\n\t\t\t\t\t\tArray.prototype.push.apply(base, toPush);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbase.push(toPush);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn base;\n\t\t\t}\n\n\t\t\t/**\n * Returns array of strings split by newline\n * @param {String} value - The value to split by newline.\n * @returns {Array} value if newline present - Returned from String split() method\n * @function\n */\n\t\t\tfunction splitNewlines(str) {\n\t\t\t\tif ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n\t\t\t\t\treturn str.split('\\n');\n\t\t\t\t}\n\t\t\t\treturn str;\n\t\t\t}\n\n\t\t\t// Private helper to create a tooltip item model\n\t\t\t// @param element : the chart element (point, arc, bar) to create the tooltip item for\n\t\t\t// @return : new tooltip item\n\t\t\tfunction createTooltipItem(element) {\n\t\t\t\tvar xScale = element._xScale;\n\t\t\t\tvar yScale = element._yScale || element._scale; // handle radar || polarArea charts\n\t\t\t\tvar index = element._index;\n\t\t\t\tvar datasetIndex = element._datasetIndex;\n\n\t\t\t\treturn {\n\t\t\t\t\txLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\t\t\tyLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\t\t\tindex: index,\n\t\t\t\t\tdatasetIndex: datasetIndex,\n\t\t\t\t\tx: element._model.x,\n\t\t\t\t\ty: element._model.y\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/**\n * Helper to get the reset model for the tooltip\n * @param tooltipOpts {Object} the tooltip options\n */\n\t\t\tfunction getBaseModel(tooltipOpts) {\n\t\t\t\tvar globalDefaults = defaults.global;\n\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\t\t\treturn {\n\t\t\t\t\t// Positioning\n\t\t\t\t\txPadding: tooltipOpts.xPadding,\n\t\t\t\t\tyPadding: tooltipOpts.yPadding,\n\t\t\t\t\txAlign: tooltipOpts.xAlign,\n\t\t\t\t\tyAlign: tooltipOpts.yAlign,\n\n\t\t\t\t\t// Body\n\t\t\t\t\tbodyFontColor: tooltipOpts.bodyFontColor,\n\t\t\t\t\t_bodyFontFamily: valueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t\t\t_bodyFontStyle: valueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n\t\t\t\t\t_bodyAlign: tooltipOpts.bodyAlign,\n\t\t\t\t\tbodyFontSize: valueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n\t\t\t\t\tbodySpacing: tooltipOpts.bodySpacing,\n\n\t\t\t\t\t// Title\n\t\t\t\t\ttitleFontColor: tooltipOpts.titleFontColor,\n\t\t\t\t\t_titleFontFamily: valueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t\t\t_titleFontStyle: valueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n\t\t\t\t\ttitleFontSize: valueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n\t\t\t\t\t_titleAlign: tooltipOpts.titleAlign,\n\t\t\t\t\ttitleSpacing: tooltipOpts.titleSpacing,\n\t\t\t\t\ttitleMarginBottom: tooltipOpts.titleMarginBottom,\n\n\t\t\t\t\t// Footer\n\t\t\t\t\tfooterFontColor: tooltipOpts.footerFontColor,\n\t\t\t\t\t_footerFontFamily: valueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t\t\t_footerFontStyle: valueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n\t\t\t\t\tfooterFontSize: valueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n\t\t\t\t\t_footerAlign: tooltipOpts.footerAlign,\n\t\t\t\t\tfooterSpacing: tooltipOpts.footerSpacing,\n\t\t\t\t\tfooterMarginTop: tooltipOpts.footerMarginTop,\n\n\t\t\t\t\t// Appearance\n\t\t\t\t\tcaretSize: tooltipOpts.caretSize,\n\t\t\t\t\tcornerRadius: tooltipOpts.cornerRadius,\n\t\t\t\t\tbackgroundColor: tooltipOpts.backgroundColor,\n\t\t\t\t\topacity: 0,\n\t\t\t\t\tlegendColorBackground: tooltipOpts.multiKeyBackground,\n\t\t\t\t\tdisplayColors: tooltipOpts.displayColors,\n\t\t\t\t\tborderColor: tooltipOpts.borderColor,\n\t\t\t\t\tborderWidth: tooltipOpts.borderWidth\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/**\n * Get the size of the tooltip\n */\n\t\t\tfunction getTooltipSize(tooltip, model) {\n\t\t\t\tvar ctx = tooltip._chart.ctx;\n\n\t\t\t\tvar height = model.yPadding * 2; // Tooltip Padding\n\t\t\t\tvar width = 0;\n\n\t\t\t\t// Count of all lines in the body\n\t\t\t\tvar body = model.body;\n\t\t\t\tvar combinedBodyLength = body.reduce(function (count, bodyItem) {\n\t\t\t\t\treturn count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n\t\t\t\t}, 0);\n\t\t\t\tcombinedBodyLength += model.beforeBody.length + model.afterBody.length;\n\n\t\t\t\tvar titleLineCount = model.title.length;\n\t\t\t\tvar footerLineCount = model.footer.length;\n\t\t\t\tvar titleFontSize = model.titleFontSize;\n\t\t\t\tvar bodyFontSize = model.bodyFontSize;\n\t\t\t\tvar footerFontSize = model.footerFontSize;\n\n\t\t\t\theight += titleLineCount * titleFontSize; // Title Lines\n\t\t\t\theight += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n\t\t\t\theight += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n\t\t\t\theight += combinedBodyLength * bodyFontSize; // Body Lines\n\t\t\t\theight += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n\t\t\t\theight += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n\t\t\t\theight += footerLineCount * footerFontSize; // Footer Lines\n\t\t\t\theight += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n\n\t\t\t\t// Title width\n\t\t\t\tvar widthPadding = 0;\n\t\t\t\tvar maxLineWidth = function maxLineWidth(line) {\n\t\t\t\t\twidth = Math.max(width, ctx.measureText(line).width + widthPadding);\n\t\t\t\t};\n\n\t\t\t\tctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n\t\t\t\thelpers.each(model.title, maxLineWidth);\n\n\t\t\t\t// Body width\n\t\t\t\tctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n\t\t\t\thelpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\n\n\t\t\t\t// Body lines may include some extra width due to the color box\n\t\t\t\twidthPadding = model.displayColors ? bodyFontSize + 2 : 0;\n\t\t\t\thelpers.each(body, function (bodyItem) {\n\t\t\t\t\thelpers.each(bodyItem.before, maxLineWidth);\n\t\t\t\t\thelpers.each(bodyItem.lines, maxLineWidth);\n\t\t\t\t\thelpers.each(bodyItem.after, maxLineWidth);\n\t\t\t\t});\n\n\t\t\t\t// Reset back to 0\n\t\t\t\twidthPadding = 0;\n\n\t\t\t\t// Footer width\n\t\t\t\tctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n\t\t\t\thelpers.each(model.footer, maxLineWidth);\n\n\t\t\t\t// Add padding\n\t\t\t\twidth += 2 * model.xPadding;\n\n\t\t\t\treturn {\n\t\t\t\t\twidth: width,\n\t\t\t\t\theight: height\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/**\n * Helper to get the alignment of a tooltip given the size\n */\n\t\t\tfunction determineAlignment(tooltip, size) {\n\t\t\t\tvar model = tooltip._model;\n\t\t\t\tvar chart = tooltip._chart;\n\t\t\t\tvar chartArea = tooltip._chart.chartArea;\n\t\t\t\tvar xAlign = 'center';\n\t\t\t\tvar yAlign = 'center';\n\n\t\t\t\tif (model.y < size.height) {\n\t\t\t\t\tyAlign = 'top';\n\t\t\t\t} else if (model.y > chart.height - size.height) {\n\t\t\t\t\tyAlign = 'bottom';\n\t\t\t\t}\n\n\t\t\t\tvar lf, rf; // functions to determine left, right alignment\n\t\t\t\tvar olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n\t\t\t\tvar yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n\t\t\t\tvar midX = (chartArea.left + chartArea.right) / 2;\n\t\t\t\tvar midY = (chartArea.top + chartArea.bottom) / 2;\n\n\t\t\t\tif (yAlign === 'center') {\n\t\t\t\t\tlf = function lf(x) {\n\t\t\t\t\t\treturn x <= midX;\n\t\t\t\t\t};\n\t\t\t\t\trf = function rf(x) {\n\t\t\t\t\t\treturn x > midX;\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tlf = function lf(x) {\n\t\t\t\t\t\treturn x <= size.width / 2;\n\t\t\t\t\t};\n\t\t\t\t\trf = function rf(x) {\n\t\t\t\t\t\treturn x >= chart.width - size.width / 2;\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tolf = function olf(x) {\n\t\t\t\t\treturn x + size.width + model.caretSize + model.caretPadding > chart.width;\n\t\t\t\t};\n\t\t\t\torf = function orf(x) {\n\t\t\t\t\treturn x - size.width - model.caretSize - model.caretPadding < 0;\n\t\t\t\t};\n\t\t\t\tyf = function yf(y) {\n\t\t\t\t\treturn y <= midY ? 'top' : 'bottom';\n\t\t\t\t};\n\n\t\t\t\tif (lf(model.x)) {\n\t\t\t\t\txAlign = 'left';\n\n\t\t\t\t\t// Is tooltip too wide and goes over the right side of the chart.?\n\t\t\t\t\tif (olf(model.x)) {\n\t\t\t\t\t\txAlign = 'center';\n\t\t\t\t\t\tyAlign = yf(model.y);\n\t\t\t\t\t}\n\t\t\t\t} else if (rf(model.x)) {\n\t\t\t\t\txAlign = 'right';\n\n\t\t\t\t\t// Is tooltip too wide and goes outside left edge of canvas?\n\t\t\t\t\tif (orf(model.x)) {\n\t\t\t\t\t\txAlign = 'center';\n\t\t\t\t\t\tyAlign = yf(model.y);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar opts = tooltip._options;\n\t\t\t\treturn {\n\t\t\t\t\txAlign: opts.xAlign ? opts.xAlign : xAlign,\n\t\t\t\t\tyAlign: opts.yAlign ? opts.yAlign : yAlign\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\n\t\t\tfunction getBackgroundPoint(vm, size, alignment, chart) {\n\t\t\t\t// Background Position\n\t\t\t\tvar x = vm.x;\n\t\t\t\tvar y = vm.y;\n\n\t\t\t\tvar caretSize = vm.caretSize;\n\t\t\t\tvar caretPadding = vm.caretPadding;\n\t\t\t\tvar cornerRadius = vm.cornerRadius;\n\t\t\t\tvar xAlign = alignment.xAlign;\n\t\t\t\tvar yAlign = alignment.yAlign;\n\t\t\t\tvar paddingAndSize = caretSize + caretPadding;\n\t\t\t\tvar radiusAndPadding = cornerRadius + caretPadding;\n\n\t\t\t\tif (xAlign === 'right') {\n\t\t\t\t\tx -= size.width;\n\t\t\t\t} else if (xAlign === 'center') {\n\t\t\t\t\tx -= size.width / 2;\n\t\t\t\t\tif (x + size.width > chart.width) {\n\t\t\t\t\t\tx = chart.width - size.width;\n\t\t\t\t\t}\n\t\t\t\t\tif (x < 0) {\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (yAlign === 'top') {\n\t\t\t\t\ty += paddingAndSize;\n\t\t\t\t} else if (yAlign === 'bottom') {\n\t\t\t\t\ty -= size.height + paddingAndSize;\n\t\t\t\t} else {\n\t\t\t\t\ty -= size.height / 2;\n\t\t\t\t}\n\n\t\t\t\tif (yAlign === 'center') {\n\t\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\t\tx += paddingAndSize;\n\t\t\t\t\t} else if (xAlign === 'right') {\n\t\t\t\t\t\tx -= paddingAndSize;\n\t\t\t\t\t}\n\t\t\t\t} else if (xAlign === 'left') {\n\t\t\t\t\tx -= radiusAndPadding;\n\t\t\t\t} else if (xAlign === 'right') {\n\t\t\t\t\tx += radiusAndPadding;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tx: x,\n\t\t\t\t\ty: y\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/**\n * Helper to build before and after body lines\n */\n\t\t\tfunction getBeforeAfterBodyLines(callback) {\n\t\t\t\treturn pushOrConcat([], splitNewlines(callback));\n\t\t\t}\n\n\t\t\tvar exports = module.exports = Element.extend({\n\t\t\t\tinitialize: function initialize() {\n\t\t\t\t\tthis._model = getBaseModel(this._options);\n\t\t\t\t\tthis._lastActive = [];\n\t\t\t\t},\n\n\t\t\t\t// Get the title\n\t\t\t\t// Args are: (tooltipItem, data)\n\t\t\t\tgetTitle: function getTitle() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar opts = me._options;\n\t\t\t\t\tvar callbacks = opts.callbacks;\n\n\t\t\t\t\tvar beforeTitle = callbacks.beforeTitle.apply(me, arguments);\n\t\t\t\t\tvar title = callbacks.title.apply(me, arguments);\n\t\t\t\t\tvar afterTitle = callbacks.afterTitle.apply(me, arguments);\n\n\t\t\t\t\tvar lines = [];\n\t\t\t\t\tlines = pushOrConcat(lines, splitNewlines(beforeTitle));\n\t\t\t\t\tlines = pushOrConcat(lines, splitNewlines(title));\n\t\t\t\t\tlines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n\t\t\t\t\treturn lines;\n\t\t\t\t},\n\n\t\t\t\t// Args are: (tooltipItem, data)\n\t\t\t\tgetBeforeBody: function getBeforeBody() {\n\t\t\t\t\treturn getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments));\n\t\t\t\t},\n\n\t\t\t\t// Args are: (tooltipItem, data)\n\t\t\t\tgetBody: function getBody(tooltipItems, data) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar callbacks = me._options.callbacks;\n\t\t\t\t\tvar bodyItems = [];\n\n\t\t\t\t\thelpers.each(tooltipItems, function (tooltipItem) {\n\t\t\t\t\t\tvar bodyItem = {\n\t\t\t\t\t\t\tbefore: [],\n\t\t\t\t\t\t\tlines: [],\n\t\t\t\t\t\t\tafter: []\n\t\t\t\t\t\t};\n\t\t\t\t\t\tpushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data)));\n\t\t\t\t\t\tpushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n\t\t\t\t\t\tpushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data)));\n\n\t\t\t\t\t\tbodyItems.push(bodyItem);\n\t\t\t\t\t});\n\n\t\t\t\t\treturn bodyItems;\n\t\t\t\t},\n\n\t\t\t\t// Args are: (tooltipItem, data)\n\t\t\t\tgetAfterBody: function getAfterBody() {\n\t\t\t\t\treturn getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments));\n\t\t\t\t},\n\n\t\t\t\t// Get the footer and beforeFooter and afterFooter lines\n\t\t\t\t// Args are: (tooltipItem, data)\n\t\t\t\tgetFooter: function getFooter() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar callbacks = me._options.callbacks;\n\n\t\t\t\t\tvar beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n\t\t\t\t\tvar footer = callbacks.footer.apply(me, arguments);\n\t\t\t\t\tvar afterFooter = callbacks.afterFooter.apply(me, arguments);\n\n\t\t\t\t\tvar lines = [];\n\t\t\t\t\tlines = pushOrConcat(lines, splitNewlines(beforeFooter));\n\t\t\t\t\tlines = pushOrConcat(lines, splitNewlines(footer));\n\t\t\t\t\tlines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n\t\t\t\t\treturn lines;\n\t\t\t\t},\n\n\t\t\t\tupdate: function update(changed) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar opts = me._options;\n\n\t\t\t\t\t// Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\n\t\t\t\t\t// that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\n\t\t\t\t\t// which breaks any animations.\n\t\t\t\t\tvar existingModel = me._model;\n\t\t\t\t\tvar model = me._model = getBaseModel(opts);\n\t\t\t\t\tvar active = me._active;\n\n\t\t\t\t\tvar data = me._data;\n\n\t\t\t\t\t// In the case where active.length === 0 we need to keep these at existing values for good animations\n\t\t\t\t\tvar alignment = {\n\t\t\t\t\t\txAlign: existingModel.xAlign,\n\t\t\t\t\t\tyAlign: existingModel.yAlign\n\t\t\t\t\t};\n\t\t\t\t\tvar backgroundPoint = {\n\t\t\t\t\t\tx: existingModel.x,\n\t\t\t\t\t\ty: existingModel.y\n\t\t\t\t\t};\n\t\t\t\t\tvar tooltipSize = {\n\t\t\t\t\t\twidth: existingModel.width,\n\t\t\t\t\t\theight: existingModel.height\n\t\t\t\t\t};\n\t\t\t\t\tvar tooltipPosition = {\n\t\t\t\t\t\tx: existingModel.caretX,\n\t\t\t\t\t\ty: existingModel.caretY\n\t\t\t\t\t};\n\n\t\t\t\t\tvar i, len;\n\n\t\t\t\t\tif (active.length) {\n\t\t\t\t\t\tmodel.opacity = 1;\n\n\t\t\t\t\t\tvar labelColors = [];\n\t\t\t\t\t\tvar labelTextColors = [];\n\t\t\t\t\t\ttooltipPosition = positioners[opts.position].call(me, active, me._eventPosition);\n\n\t\t\t\t\t\tvar tooltipItems = [];\n\t\t\t\t\t\tfor (i = 0, len = active.length; i < len; ++i) {\n\t\t\t\t\t\t\ttooltipItems.push(createTooltipItem(active[i]));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If the user provided a filter function, use it to modify the tooltip items\n\t\t\t\t\t\tif (opts.filter) {\n\t\t\t\t\t\t\ttooltipItems = tooltipItems.filter(function (a) {\n\t\t\t\t\t\t\t\treturn opts.filter(a, data);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If the user provided a sorting function, use it to modify the tooltip items\n\t\t\t\t\t\tif (opts.itemSort) {\n\t\t\t\t\t\t\ttooltipItems = tooltipItems.sort(function (a, b) {\n\t\t\t\t\t\t\t\treturn opts.itemSort(a, b, data);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Determine colors for boxes\n\t\t\t\t\t\thelpers.each(tooltipItems, function (tooltipItem) {\n\t\t\t\t\t\t\tlabelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));\n\t\t\t\t\t\t\tlabelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Build the Text Lines\n\t\t\t\t\t\tmodel.title = me.getTitle(tooltipItems, data);\n\t\t\t\t\t\tmodel.beforeBody = me.getBeforeBody(tooltipItems, data);\n\t\t\t\t\t\tmodel.body = me.getBody(tooltipItems, data);\n\t\t\t\t\t\tmodel.afterBody = me.getAfterBody(tooltipItems, data);\n\t\t\t\t\t\tmodel.footer = me.getFooter(tooltipItems, data);\n\n\t\t\t\t\t\t// Initial positioning and colors\n\t\t\t\t\t\tmodel.x = Math.round(tooltipPosition.x);\n\t\t\t\t\t\tmodel.y = Math.round(tooltipPosition.y);\n\t\t\t\t\t\tmodel.caretPadding = opts.caretPadding;\n\t\t\t\t\t\tmodel.labelColors = labelColors;\n\t\t\t\t\t\tmodel.labelTextColors = labelTextColors;\n\n\t\t\t\t\t\t// data points\n\t\t\t\t\t\tmodel.dataPoints = tooltipItems;\n\n\t\t\t\t\t\t// We need to determine alignment of the tooltip\n\t\t\t\t\t\ttooltipSize = getTooltipSize(this, model);\n\t\t\t\t\t\talignment = determineAlignment(this, tooltipSize);\n\t\t\t\t\t\t// Final Size and Position\n\t\t\t\t\t\tbackgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmodel.opacity = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tmodel.xAlign = alignment.xAlign;\n\t\t\t\t\tmodel.yAlign = alignment.yAlign;\n\t\t\t\t\tmodel.x = backgroundPoint.x;\n\t\t\t\t\tmodel.y = backgroundPoint.y;\n\t\t\t\t\tmodel.width = tooltipSize.width;\n\t\t\t\t\tmodel.height = tooltipSize.height;\n\n\t\t\t\t\t// Point where the caret on the tooltip points to\n\t\t\t\t\tmodel.caretX = tooltipPosition.x;\n\t\t\t\t\tmodel.caretY = tooltipPosition.y;\n\n\t\t\t\t\tme._model = model;\n\n\t\t\t\t\tif (changed && opts.custom) {\n\t\t\t\t\t\topts.custom.call(me, model);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn me;\n\t\t\t\t},\n\n\t\t\t\tdrawCaret: function drawCaret(tooltipPoint, size) {\n\t\t\t\t\tvar ctx = this._chart.ctx;\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\tvar caretPosition = this.getCaretPosition(tooltipPoint, size, vm);\n\n\t\t\t\t\tctx.lineTo(caretPosition.x1, caretPosition.y1);\n\t\t\t\t\tctx.lineTo(caretPosition.x2, caretPosition.y2);\n\t\t\t\t\tctx.lineTo(caretPosition.x3, caretPosition.y3);\n\t\t\t\t},\n\t\t\t\tgetCaretPosition: function getCaretPosition(tooltipPoint, size, vm) {\n\t\t\t\t\tvar x1, x2, x3, y1, y2, y3;\n\t\t\t\t\tvar caretSize = vm.caretSize;\n\t\t\t\t\tvar cornerRadius = vm.cornerRadius;\n\t\t\t\t\tvar xAlign = vm.xAlign;\n\t\t\t\t\tvar yAlign = vm.yAlign;\n\t\t\t\t\tvar ptX = tooltipPoint.x;\n\t\t\t\t\tvar ptY = tooltipPoint.y;\n\t\t\t\t\tvar width = size.width;\n\t\t\t\t\tvar height = size.height;\n\n\t\t\t\t\tif (yAlign === 'center') {\n\t\t\t\t\t\ty2 = ptY + height / 2;\n\n\t\t\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\t\t\tx1 = ptX;\n\t\t\t\t\t\t\tx2 = x1 - caretSize;\n\t\t\t\t\t\t\tx3 = x1;\n\n\t\t\t\t\t\t\ty1 = y2 + caretSize;\n\t\t\t\t\t\t\ty3 = y2 - caretSize;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tx1 = ptX + width;\n\t\t\t\t\t\t\tx2 = x1 + caretSize;\n\t\t\t\t\t\t\tx3 = x1;\n\n\t\t\t\t\t\t\ty1 = y2 - caretSize;\n\t\t\t\t\t\t\ty3 = y2 + caretSize;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\t\t\tx2 = ptX + cornerRadius + caretSize;\n\t\t\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t\t\t} else if (xAlign === 'right') {\n\t\t\t\t\t\t\tx2 = ptX + width - cornerRadius - caretSize;\n\t\t\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tx2 = vm.caretX;\n\t\t\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (yAlign === 'top') {\n\t\t\t\t\t\t\ty1 = ptY;\n\t\t\t\t\t\t\ty2 = y1 - caretSize;\n\t\t\t\t\t\t\ty3 = y1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ty1 = ptY + height;\n\t\t\t\t\t\t\ty2 = y1 + caretSize;\n\t\t\t\t\t\t\ty3 = y1;\n\t\t\t\t\t\t\t// invert drawing order\n\t\t\t\t\t\t\tvar tmp = x3;\n\t\t\t\t\t\t\tx3 = x1;\n\t\t\t\t\t\t\tx1 = tmp;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn { x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3 };\n\t\t\t\t},\n\n\t\t\t\tdrawTitle: function drawTitle(pt, vm, ctx, opacity) {\n\t\t\t\t\tvar title = vm.title;\n\n\t\t\t\t\tif (title.length) {\n\t\t\t\t\t\tctx.textAlign = vm._titleAlign;\n\t\t\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\t\t\tvar titleFontSize = vm.titleFontSize;\n\t\t\t\t\t\tvar titleSpacing = vm.titleSpacing;\n\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity);\n\t\t\t\t\t\tctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n\n\t\t\t\t\t\tvar i, len;\n\t\t\t\t\t\tfor (i = 0, len = title.length; i < len; ++i) {\n\t\t\t\t\t\t\tctx.fillText(title[i], pt.x, pt.y);\n\t\t\t\t\t\t\tpt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n\t\t\t\t\t\t\tif (i + 1 === title.length) {\n\t\t\t\t\t\t\t\tpt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tdrawBody: function drawBody(pt, vm, ctx, opacity) {\n\t\t\t\t\tvar bodyFontSize = vm.bodyFontSize;\n\t\t\t\t\tvar bodySpacing = vm.bodySpacing;\n\t\t\t\t\tvar body = vm.body;\n\n\t\t\t\t\tctx.textAlign = vm._bodyAlign;\n\t\t\t\t\tctx.textBaseline = 'top';\n\t\t\t\t\tctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n\n\t\t\t\t\t// Before Body\n\t\t\t\t\tvar xLinePadding = 0;\n\t\t\t\t\tvar fillLineOfText = function fillLineOfText(line) {\n\t\t\t\t\t\tctx.fillText(line, pt.x + xLinePadding, pt.y);\n\t\t\t\t\t\tpt.y += bodyFontSize + bodySpacing;\n\t\t\t\t\t};\n\n\t\t\t\t\t// Before body lines\n\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.bodyFontColor, opacity);\n\t\t\t\t\thelpers.each(vm.beforeBody, fillLineOfText);\n\n\t\t\t\t\tvar drawColorBoxes = vm.displayColors;\n\t\t\t\t\txLinePadding = drawColorBoxes ? bodyFontSize + 2 : 0;\n\n\t\t\t\t\t// Draw body lines now\n\t\t\t\t\thelpers.each(body, function (bodyItem, i) {\n\t\t\t\t\t\tvar textColor = mergeOpacity(vm.labelTextColors[i], opacity);\n\t\t\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\t\t\thelpers.each(bodyItem.before, fillLineOfText);\n\n\t\t\t\t\t\thelpers.each(bodyItem.lines, function (line) {\n\t\t\t\t\t\t\t// Draw Legend-like boxes if needed\n\t\t\t\t\t\t\tif (drawColorBoxes) {\n\t\t\t\t\t\t\t\t// Fill a white rect so that colours merge nicely if the opacity is < 1\n\t\t\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity);\n\t\t\t\t\t\t\t\tctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t\t\t// Border\n\t\t\t\t\t\t\t\tctx.lineWidth = 1;\n\t\t\t\t\t\t\t\tctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity);\n\t\t\t\t\t\t\t\tctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t\t\t// Inner square\n\t\t\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity);\n\t\t\t\t\t\t\t\tctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n\t\t\t\t\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tfillLineOfText(line);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\thelpers.each(bodyItem.after, fillLineOfText);\n\t\t\t\t\t});\n\n\t\t\t\t\t// Reset back to 0 for after body\n\t\t\t\t\txLinePadding = 0;\n\n\t\t\t\t\t// After body lines\n\t\t\t\t\thelpers.each(vm.afterBody, fillLineOfText);\n\t\t\t\t\tpt.y -= bodySpacing; // Remove last body spacing\n\t\t\t\t},\n\n\t\t\t\tdrawFooter: function drawFooter(pt, vm, ctx, opacity) {\n\t\t\t\t\tvar footer = vm.footer;\n\n\t\t\t\t\tif (footer.length) {\n\t\t\t\t\t\tpt.y += vm.footerMarginTop;\n\n\t\t\t\t\t\tctx.textAlign = vm._footerAlign;\n\t\t\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity);\n\t\t\t\t\t\tctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n\n\t\t\t\t\t\thelpers.each(footer, function (line) {\n\t\t\t\t\t\t\tctx.fillText(line, pt.x, pt.y);\n\t\t\t\t\t\t\tpt.y += vm.footerFontSize + vm.footerSpacing;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tdrawBackground: function drawBackground(pt, vm, ctx, tooltipSize, opacity) {\n\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity);\n\t\t\t\t\tctx.strokeStyle = mergeOpacity(vm.borderColor, opacity);\n\t\t\t\t\tctx.lineWidth = vm.borderWidth;\n\t\t\t\t\tvar xAlign = vm.xAlign;\n\t\t\t\t\tvar yAlign = vm.yAlign;\n\t\t\t\t\tvar x = pt.x;\n\t\t\t\t\tvar y = pt.y;\n\t\t\t\t\tvar width = tooltipSize.width;\n\t\t\t\t\tvar height = tooltipSize.height;\n\t\t\t\t\tvar radius = vm.cornerRadius;\n\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(x + radius, y);\n\t\t\t\t\tif (yAlign === 'top') {\n\t\t\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t\t\t}\n\t\t\t\t\tctx.lineTo(x + width - radius, y);\n\t\t\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\t\t\t\t\tif (yAlign === 'center' && xAlign === 'right') {\n\t\t\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t\t\t}\n\t\t\t\t\tctx.lineTo(x + width, y + height - radius);\n\t\t\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\t\t\t\t\tif (yAlign === 'bottom') {\n\t\t\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t\t\t}\n\t\t\t\t\tctx.lineTo(x + radius, y + height);\n\t\t\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\t\t\t\t\tif (yAlign === 'center' && xAlign === 'left') {\n\t\t\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t\t\t}\n\t\t\t\t\tctx.lineTo(x, y + radius);\n\t\t\t\t\tctx.quadraticCurveTo(x, y, x + radius, y);\n\t\t\t\t\tctx.closePath();\n\n\t\t\t\t\tctx.fill();\n\n\t\t\t\t\tif (vm.borderWidth > 0) {\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tdraw: function draw() {\n\t\t\t\t\tvar ctx = this._chart.ctx;\n\t\t\t\t\tvar vm = this._view;\n\n\t\t\t\t\tif (vm.opacity === 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar tooltipSize = {\n\t\t\t\t\t\twidth: vm.width,\n\t\t\t\t\t\theight: vm.height\n\t\t\t\t\t};\n\t\t\t\t\tvar pt = {\n\t\t\t\t\t\tx: vm.x,\n\t\t\t\t\t\ty: vm.y\n\t\t\t\t\t};\n\n\t\t\t\t\t// IE11/Edge does not like very small opacities, so snap to 0\n\t\t\t\t\tvar opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\n\n\t\t\t\t\t// Truthy/falsey value for empty tooltip\n\t\t\t\t\tvar hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;\n\n\t\t\t\t\tif (this._options.enabled && hasTooltipContent) {\n\t\t\t\t\t\t// Draw Background\n\t\t\t\t\t\tthis.drawBackground(pt, vm, ctx, tooltipSize, opacity);\n\n\t\t\t\t\t\t// Draw Title, Body, and Footer\n\t\t\t\t\t\tpt.x += vm.xPadding;\n\t\t\t\t\t\tpt.y += vm.yPadding;\n\n\t\t\t\t\t\t// Titles\n\t\t\t\t\t\tthis.drawTitle(pt, vm, ctx, opacity);\n\n\t\t\t\t\t\t// Body\n\t\t\t\t\t\tthis.drawBody(pt, vm, ctx, opacity);\n\n\t\t\t\t\t\t// Footer\n\t\t\t\t\t\tthis.drawFooter(pt, vm, ctx, opacity);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Handle an event\n * @private\n * @param {IEvent} event - The event to handle\n * @returns {Boolean} true if the tooltip changed\n */\n\t\t\t\thandleEvent: function handleEvent(e) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar options = me._options;\n\t\t\t\t\tvar changed = false;\n\n\t\t\t\t\tme._lastActive = me._lastActive || [];\n\n\t\t\t\t\t// Find Active Elements for tooltips\n\t\t\t\t\tif (e.type === 'mouseout') {\n\t\t\t\t\t\tme._active = [];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme._active = me._chart.getElementsAtEventForMode(e, options.mode, options);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember Last Actives\n\t\t\t\t\tchanged = !helpers.arrayEquals(me._active, me._lastActive);\n\n\t\t\t\t\t// Only handle target event on tooltip change\n\t\t\t\t\tif (changed) {\n\t\t\t\t\t\tme._lastActive = me._active;\n\n\t\t\t\t\t\tif (options.enabled || options.custom) {\n\t\t\t\t\t\t\tme._eventPosition = {\n\t\t\t\t\t\t\t\tx: e.x,\n\t\t\t\t\t\t\t\ty: e.y\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tme.update(true);\n\t\t\t\t\t\t\tme.pivot();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn changed;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n * @namespace Chart.Tooltip.positioners\n */\n\t\t\texports.positioners = positioners;\n\t\t}, { \"26\": 26, \"27\": 27, \"46\": 46 }], 37: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('global', {\n\t\t\t\telements: {\n\t\t\t\t\tarc: {\n\t\t\t\t\t\tbackgroundColor: defaults.global.defaultColor,\n\t\t\t\t\t\tborderColor: '#fff',\n\t\t\t\t\t\tborderWidth: 2\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = Element.extend({\n\t\t\t\tinLabelRange: function inLabelRange(mouseX) {\n\t\t\t\t\tvar vm = this._view;\n\n\t\t\t\t\tif (vm) {\n\t\t\t\t\t\treturn Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\n\t\t\t\tinRange: function inRange(chartX, chartY) {\n\t\t\t\t\tvar vm = this._view;\n\n\t\t\t\t\tif (vm) {\n\t\t\t\t\t\tvar pointRelativePosition = helpers.getAngleFromPoint(vm, { x: chartX, y: chartY });\n\t\t\t\t\t\tvar angle = pointRelativePosition.angle;\n\t\t\t\t\t\tvar distance = pointRelativePosition.distance;\n\n\t\t\t\t\t\t// Sanitise angle range\n\t\t\t\t\t\tvar startAngle = vm.startAngle;\n\t\t\t\t\t\tvar endAngle = vm.endAngle;\n\t\t\t\t\t\twhile (endAngle < startAngle) {\n\t\t\t\t\t\t\tendAngle += 2.0 * Math.PI;\n\t\t\t\t\t\t}\n\t\t\t\t\t\twhile (angle > endAngle) {\n\t\t\t\t\t\t\tangle -= 2.0 * Math.PI;\n\t\t\t\t\t\t}\n\t\t\t\t\t\twhile (angle < startAngle) {\n\t\t\t\t\t\t\tangle += 2.0 * Math.PI;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check if within the range of the open/close angle\n\t\t\t\t\t\tvar betweenAngles = angle >= startAngle && angle <= endAngle;\n\t\t\t\t\t\tvar withinRadius = distance >= vm.innerRadius && distance <= vm.outerRadius;\n\n\t\t\t\t\t\treturn betweenAngles && withinRadius;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\n\t\t\t\tgetCenterPoint: function getCenterPoint() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\tvar halfAngle = (vm.startAngle + vm.endAngle) / 2;\n\t\t\t\t\tvar halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: vm.x + Math.cos(halfAngle) * halfRadius,\n\t\t\t\t\t\ty: vm.y + Math.sin(halfAngle) * halfRadius\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\tgetArea: function getArea() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\treturn Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\n\t\t\t\t},\n\n\t\t\t\ttooltipPosition: function tooltipPosition() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\tvar centreAngle = vm.startAngle + (vm.endAngle - vm.startAngle) / 2;\n\t\t\t\t\tvar rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: vm.x + Math.cos(centreAngle) * rangeFromCentre,\n\t\t\t\t\t\ty: vm.y + Math.sin(centreAngle) * rangeFromCentre\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\tdraw: function draw() {\n\t\t\t\t\tvar ctx = this._chart.ctx;\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\tvar sA = vm.startAngle;\n\t\t\t\t\tvar eA = vm.endAngle;\n\n\t\t\t\t\tctx.beginPath();\n\n\t\t\t\t\tctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);\n\t\t\t\t\tctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);\n\n\t\t\t\t\tctx.closePath();\n\t\t\t\t\tctx.strokeStyle = vm.borderColor;\n\t\t\t\t\tctx.lineWidth = vm.borderWidth;\n\n\t\t\t\t\tctx.fillStyle = vm.backgroundColor;\n\n\t\t\t\t\tctx.fill();\n\t\t\t\t\tctx.lineJoin = 'bevel';\n\n\t\t\t\t\tif (vm.borderWidth) {\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, { \"26\": 26, \"27\": 27, \"46\": 46 }], 38: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\t\t\tvar helpers = require(46);\n\n\t\t\tvar globalDefaults = defaults.global;\n\n\t\t\tdefaults._set('global', {\n\t\t\t\telements: {\n\t\t\t\t\tline: {\n\t\t\t\t\t\ttension: 0.4,\n\t\t\t\t\t\tbackgroundColor: globalDefaults.defaultColor,\n\t\t\t\t\t\tborderWidth: 3,\n\t\t\t\t\t\tborderColor: globalDefaults.defaultColor,\n\t\t\t\t\t\tborderCapStyle: 'butt',\n\t\t\t\t\t\tborderDash: [],\n\t\t\t\t\t\tborderDashOffset: 0.0,\n\t\t\t\t\t\tborderJoinStyle: 'miter',\n\t\t\t\t\t\tcapBezierPoints: true,\n\t\t\t\t\t\tfill: true // do we fill in the area between the line and its base axis\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = Element.extend({\n\t\t\t\tdraw: function draw() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar vm = me._view;\n\t\t\t\t\tvar ctx = me._chart.ctx;\n\t\t\t\t\tvar spanGaps = vm.spanGaps;\n\t\t\t\t\tvar points = me._children.slice(); // clone array\n\t\t\t\t\tvar globalOptionLineElements = globalDefaults.elements.line;\n\t\t\t\t\tvar lastDrawnIndex = -1;\n\t\t\t\t\tvar index, current, previous, currentVM;\n\n\t\t\t\t\t// If we are looping, adding the first point again\n\t\t\t\t\tif (me._loop && points.length) {\n\t\t\t\t\t\tpoints.push(points[0]);\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.save();\n\n\t\t\t\t\t// Stroke Line Options\n\t\t\t\t\tctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;\n\n\t\t\t\t\t// IE 9 and 10 do not support line dash\n\t\t\t\t\tif (ctx.setLineDash) {\n\t\t\t\t\t\tctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset;\n\t\t\t\t\tctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\n\t\t\t\t\tctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth;\n\t\t\t\t\tctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\n\n\t\t\t\t\t// Stroke Line\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tlastDrawnIndex = -1;\n\n\t\t\t\t\tfor (index = 0; index < points.length; ++index) {\n\t\t\t\t\t\tcurrent = points[index];\n\t\t\t\t\t\tprevious = helpers.previousItem(points, index);\n\t\t\t\t\t\tcurrentVM = current._view;\n\n\t\t\t\t\t\t// First point moves to it's starting position no matter what\n\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tprevious = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];\n\n\t\t\t\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\t\t\t\tif (lastDrawnIndex !== index - 1 && !spanGaps || lastDrawnIndex === -1) {\n\t\t\t\t\t\t\t\t\t// There was a gap and this is the first point after the gap\n\t\t\t\t\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// Line to next point\n\t\t\t\t\t\t\t\t\thelpers.canvas.lineTo(ctx, previous._view, current._view);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.stroke();\n\t\t\t\t\tctx.restore();\n\t\t\t\t}\n\t\t\t});\n\t\t}, { \"26\": 26, \"27\": 27, \"46\": 46 }], 39: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\t\t\tvar helpers = require(46);\n\n\t\t\tvar defaultColor = defaults.global.defaultColor;\n\n\t\t\tdefaults._set('global', {\n\t\t\t\telements: {\n\t\t\t\t\tpoint: {\n\t\t\t\t\t\tradius: 3,\n\t\t\t\t\t\tpointStyle: 'circle',\n\t\t\t\t\t\tbackgroundColor: defaultColor,\n\t\t\t\t\t\tborderColor: defaultColor,\n\t\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\t\t// Hover\n\t\t\t\t\t\thitRadius: 1,\n\t\t\t\t\t\thoverRadius: 4,\n\t\t\t\t\t\thoverBorderWidth: 1\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfunction xRange(mouseX) {\n\t\t\t\tvar vm = this._view;\n\t\t\t\treturn vm ? Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius : false;\n\t\t\t}\n\n\t\t\tfunction yRange(mouseY) {\n\t\t\t\tvar vm = this._view;\n\t\t\t\treturn vm ? Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius : false;\n\t\t\t}\n\n\t\t\tmodule.exports = Element.extend({\n\t\t\t\tinRange: function inRange(mouseX, mouseY) {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\treturn vm ? Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2) < Math.pow(vm.hitRadius + vm.radius, 2) : false;\n\t\t\t\t},\n\n\t\t\t\tinLabelRange: xRange,\n\t\t\t\tinXRange: xRange,\n\t\t\t\tinYRange: yRange,\n\n\t\t\t\tgetCenterPoint: function getCenterPoint() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: vm.x,\n\t\t\t\t\t\ty: vm.y\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\tgetArea: function getArea() {\n\t\t\t\t\treturn Math.PI * Math.pow(this._view.radius, 2);\n\t\t\t\t},\n\n\t\t\t\ttooltipPosition: function tooltipPosition() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: vm.x,\n\t\t\t\t\t\ty: vm.y,\n\t\t\t\t\t\tpadding: vm.radius + vm.borderWidth\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\tdraw: function draw(chartArea) {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\tvar model = this._model;\n\t\t\t\t\tvar ctx = this._chart.ctx;\n\t\t\t\t\tvar pointStyle = vm.pointStyle;\n\t\t\t\t\tvar rotation = vm.rotation;\n\t\t\t\t\tvar radius = vm.radius;\n\t\t\t\t\tvar x = vm.x;\n\t\t\t\t\tvar y = vm.y;\n\t\t\t\t\tvar errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.)\n\n\t\t\t\t\tif (vm.skip) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Clipping for Points.\n\t\t\t\t\tif (chartArea === undefined || model.x >= chartArea.left && chartArea.right * errMargin >= model.x && model.y >= chartArea.top && chartArea.bottom * errMargin >= model.y) {\n\t\t\t\t\t\tctx.strokeStyle = vm.borderColor || defaultColor;\n\t\t\t\t\t\tctx.lineWidth = helpers.valueOrDefault(vm.borderWidth, defaults.global.elements.point.borderWidth);\n\t\t\t\t\t\tctx.fillStyle = vm.backgroundColor || defaultColor;\n\t\t\t\t\t\thelpers.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, { \"26\": 26, \"27\": 27, \"46\": 46 }], 40: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\n\t\t\tdefaults._set('global', {\n\t\t\t\telements: {\n\t\t\t\t\trectangle: {\n\t\t\t\t\t\tbackgroundColor: defaults.global.defaultColor,\n\t\t\t\t\t\tborderColor: defaults.global.defaultColor,\n\t\t\t\t\t\tborderSkipped: 'bottom',\n\t\t\t\t\t\tborderWidth: 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfunction isVertical(bar) {\n\t\t\t\treturn bar._view.width !== undefined;\n\t\t\t}\n\n\t\t\t/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param bar {Chart.Element.Rectangle} the bar\n * @return {Bounds} bounds of the bar\n * @private\n */\n\t\t\tfunction getBarBounds(bar) {\n\t\t\t\tvar vm = bar._view;\n\t\t\t\tvar x1, x2, y1, y2;\n\n\t\t\t\tif (isVertical(bar)) {\n\t\t\t\t\t// vertical\n\t\t\t\t\tvar halfWidth = vm.width / 2;\n\t\t\t\t\tx1 = vm.x - halfWidth;\n\t\t\t\t\tx2 = vm.x + halfWidth;\n\t\t\t\t\ty1 = Math.min(vm.y, vm.base);\n\t\t\t\t\ty2 = Math.max(vm.y, vm.base);\n\t\t\t\t} else {\n\t\t\t\t\t// horizontal bar\n\t\t\t\t\tvar halfHeight = vm.height / 2;\n\t\t\t\t\tx1 = Math.min(vm.x, vm.base);\n\t\t\t\t\tx2 = Math.max(vm.x, vm.base);\n\t\t\t\t\ty1 = vm.y - halfHeight;\n\t\t\t\t\ty2 = vm.y + halfHeight;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tleft: x1,\n\t\t\t\t\ttop: y1,\n\t\t\t\t\tright: x2,\n\t\t\t\t\tbottom: y2\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tmodule.exports = Element.extend({\n\t\t\t\tdraw: function draw() {\n\t\t\t\t\tvar ctx = this._chart.ctx;\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\tvar left, right, top, bottom, signX, signY, borderSkipped;\n\t\t\t\t\tvar borderWidth = vm.borderWidth;\n\n\t\t\t\t\tif (!vm.horizontal) {\n\t\t\t\t\t\t// bar\n\t\t\t\t\t\tleft = vm.x - vm.width / 2;\n\t\t\t\t\t\tright = vm.x + vm.width / 2;\n\t\t\t\t\t\ttop = vm.y;\n\t\t\t\t\t\tbottom = vm.base;\n\t\t\t\t\t\tsignX = 1;\n\t\t\t\t\t\tsignY = bottom > top ? 1 : -1;\n\t\t\t\t\t\tborderSkipped = vm.borderSkipped || 'bottom';\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// horizontal bar\n\t\t\t\t\t\tleft = vm.base;\n\t\t\t\t\t\tright = vm.x;\n\t\t\t\t\t\ttop = vm.y - vm.height / 2;\n\t\t\t\t\t\tbottom = vm.y + vm.height / 2;\n\t\t\t\t\t\tsignX = right > left ? 1 : -1;\n\t\t\t\t\t\tsignY = 1;\n\t\t\t\t\t\tborderSkipped = vm.borderSkipped || 'left';\n\t\t\t\t\t}\n\n\t\t\t\t\t// Canvas doesn't allow us to stroke inside the width so we can\n\t\t\t\t\t// adjust the sizes to fit if we're setting a stroke on the line\n\t\t\t\t\tif (borderWidth) {\n\t\t\t\t\t\t// borderWidth shold be less than bar width and bar height.\n\t\t\t\t\t\tvar barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom));\n\t\t\t\t\t\tborderWidth = borderWidth > barSize ? barSize : borderWidth;\n\t\t\t\t\t\tvar halfStroke = borderWidth / 2;\n\t\t\t\t\t\t// Adjust borderWidth when bar top position is near vm.base(zero).\n\t\t\t\t\t\tvar borderLeft = left + (borderSkipped !== 'left' ? halfStroke * signX : 0);\n\t\t\t\t\t\tvar borderRight = right + (borderSkipped !== 'right' ? -halfStroke * signX : 0);\n\t\t\t\t\t\tvar borderTop = top + (borderSkipped !== 'top' ? halfStroke * signY : 0);\n\t\t\t\t\t\tvar borderBottom = bottom + (borderSkipped !== 'bottom' ? -halfStroke * signY : 0);\n\t\t\t\t\t\t// not become a vertical line?\n\t\t\t\t\t\tif (borderLeft !== borderRight) {\n\t\t\t\t\t\t\ttop = borderTop;\n\t\t\t\t\t\t\tbottom = borderBottom;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// not become a horizontal line?\n\t\t\t\t\t\tif (borderTop !== borderBottom) {\n\t\t\t\t\t\t\tleft = borderLeft;\n\t\t\t\t\t\t\tright = borderRight;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.fillStyle = vm.backgroundColor;\n\t\t\t\t\tctx.strokeStyle = vm.borderColor;\n\t\t\t\t\tctx.lineWidth = borderWidth;\n\n\t\t\t\t\t// Corner points, from bottom-left to bottom-right clockwise\n\t\t\t\t\t// | 1 2 |\n\t\t\t\t\t// | 0 3 |\n\t\t\t\t\tvar corners = [[left, bottom], [left, top], [right, top], [right, bottom]];\n\n\t\t\t\t\t// Find first (starting) corner with fallback to 'bottom'\n\t\t\t\t\tvar borders = ['bottom', 'left', 'top', 'right'];\n\t\t\t\t\tvar startCorner = borders.indexOf(borderSkipped, 0);\n\t\t\t\t\tif (startCorner === -1) {\n\t\t\t\t\t\tstartCorner = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tfunction cornerAt(index) {\n\t\t\t\t\t\treturn corners[(startCorner + index) % 4];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Draw rectangle from 'startCorner'\n\t\t\t\t\tvar corner = cornerAt(0);\n\t\t\t\t\tctx.moveTo(corner[0], corner[1]);\n\n\t\t\t\t\tfor (var i = 1; i < 4; i++) {\n\t\t\t\t\t\tcorner = cornerAt(i);\n\t\t\t\t\t\tctx.lineTo(corner[0], corner[1]);\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.fill();\n\t\t\t\t\tif (borderWidth) {\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\theight: function height() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\treturn vm.base - vm.y;\n\t\t\t\t},\n\n\t\t\t\tinRange: function inRange(mouseX, mouseY) {\n\t\t\t\t\tvar inRange = false;\n\n\t\t\t\t\tif (this._view) {\n\t\t\t\t\t\tvar bounds = getBarBounds(this);\n\t\t\t\t\t\tinRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn inRange;\n\t\t\t\t},\n\n\t\t\t\tinLabelRange: function inLabelRange(mouseX, mouseY) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tif (!me._view) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar inRange = false;\n\t\t\t\t\tvar bounds = getBarBounds(me);\n\n\t\t\t\t\tif (isVertical(me)) {\n\t\t\t\t\t\tinRange = mouseX >= bounds.left && mouseX <= bounds.right;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinRange = mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn inRange;\n\t\t\t\t},\n\n\t\t\t\tinXRange: function inXRange(mouseX) {\n\t\t\t\t\tvar bounds = getBarBounds(this);\n\t\t\t\t\treturn mouseX >= bounds.left && mouseX <= bounds.right;\n\t\t\t\t},\n\n\t\t\t\tinYRange: function inYRange(mouseY) {\n\t\t\t\t\tvar bounds = getBarBounds(this);\n\t\t\t\t\treturn mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t\t\t},\n\n\t\t\t\tgetCenterPoint: function getCenterPoint() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\tvar x, y;\n\t\t\t\t\tif (isVertical(this)) {\n\t\t\t\t\t\tx = vm.x;\n\t\t\t\t\t\ty = (vm.y + vm.base) / 2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tx = (vm.x + vm.base) / 2;\n\t\t\t\t\t\ty = vm.y;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn { x: x, y: y };\n\t\t\t\t},\n\n\t\t\t\tgetArea: function getArea() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\treturn vm.width * Math.abs(vm.y - vm.base);\n\t\t\t\t},\n\n\t\t\t\ttooltipPosition: function tooltipPosition() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: vm.x,\n\t\t\t\t\t\ty: vm.y\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t});\n\t\t}, { \"26\": 26, \"27\": 27 }], 41: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = {};\n\t\t\tmodule.exports.Arc = require(37);\n\t\t\tmodule.exports.Line = require(38);\n\t\t\tmodule.exports.Point = require(39);\n\t\t\tmodule.exports.Rectangle = require(40);\n\t\t}, { \"37\": 37, \"38\": 38, \"39\": 39, \"40\": 40 }], 42: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(43);\n\n\t\t\t/**\n * @namespace Chart.helpers.canvas\n */\n\t\t\tvar exports = module.exports = {\n\t\t\t\t/**\n * Clears the entire canvas associated to the given `chart`.\n * @param {Chart} chart - The chart for which to clear the canvas.\n */\n\t\t\t\tclear: function clear(chart) {\n\t\t\t\t\tchart.ctx.clearRect(0, 0, chart.width, chart.height);\n\t\t\t\t},\n\n\t\t\t\t/**\n * Creates a \"path\" for a rectangle with rounded corners at position (x, y) with a\n * given size (width, height) and the same `radius` for all corners.\n * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.\n * @param {Number} x - The x axis of the coordinate for the rectangle starting point.\n * @param {Number} y - The y axis of the coordinate for the rectangle starting point.\n * @param {Number} width - The rectangle's width.\n * @param {Number} height - The rectangle's height.\n * @param {Number} radius - The rounded amount (in pixels) for the four corners.\n * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?\n */\n\t\t\t\troundedRect: function roundedRect(ctx, x, y, width, height, radius) {\n\t\t\t\t\tif (radius) {\n\t\t\t\t\t\t// NOTE(SB) `epsilon` helps to prevent minor artifacts appearing\n\t\t\t\t\t\t// on Chrome when `r` is exactly half the height or the width.\n\t\t\t\t\t\tvar epsilon = 0.0000001;\n\t\t\t\t\t\tvar r = Math.min(radius, height / 2 - epsilon, width / 2 - epsilon);\n\n\t\t\t\t\t\tctx.moveTo(x + r, y);\n\t\t\t\t\t\tctx.lineTo(x + width - r, y);\n\t\t\t\t\t\tctx.arcTo(x + width, y, x + width, y + r, r);\n\t\t\t\t\t\tctx.lineTo(x + width, y + height - r);\n\t\t\t\t\t\tctx.arcTo(x + width, y + height, x + width - r, y + height, r);\n\t\t\t\t\t\tctx.lineTo(x + r, y + height);\n\t\t\t\t\t\tctx.arcTo(x, y + height, x, y + height - r, r);\n\t\t\t\t\t\tctx.lineTo(x, y + r);\n\t\t\t\t\t\tctx.arcTo(x, y, x + r, y, r);\n\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\tctx.moveTo(x, y);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tctx.rect(x, y, width, height);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tdrawPoint: function drawPoint(ctx, style, radius, x, y, rotation) {\n\t\t\t\t\tvar type, edgeLength, xOffset, yOffset, height, size;\n\t\t\t\t\trotation = rotation || 0;\n\n\t\t\t\t\tif (style && (typeof style === \"undefined\" ? \"undefined\" : _typeof(style)) === 'object') {\n\t\t\t\t\t\ttype = style.toString();\n\t\t\t\t\t\tif (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n\t\t\t\t\t\t\tctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isNaN(radius) || radius <= 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.save();\n\t\t\t\t\tctx.translate(x, y);\n\t\t\t\t\tctx.rotate(rotation * Math.PI / 180);\n\t\t\t\t\tctx.beginPath();\n\n\t\t\t\t\tswitch (style) {\n\t\t\t\t\t\t// Default includes circle\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tctx.arc(0, 0, radius, 0, Math.PI * 2);\n\t\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'triangle':\n\t\t\t\t\t\t\tedgeLength = 3 * radius / Math.sqrt(3);\n\t\t\t\t\t\t\theight = edgeLength * Math.sqrt(3) / 2;\n\t\t\t\t\t\t\tctx.moveTo(-edgeLength / 2, height / 3);\n\t\t\t\t\t\t\tctx.lineTo(edgeLength / 2, height / 3);\n\t\t\t\t\t\t\tctx.lineTo(0, -2 * height / 3);\n\t\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'rect':\n\t\t\t\t\t\t\tsize = 1 / Math.SQRT2 * radius;\n\t\t\t\t\t\t\tctx.rect(-size, -size, 2 * size, 2 * size);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'rectRounded':\n\t\t\t\t\t\t\tvar offset = radius / Math.SQRT2;\n\t\t\t\t\t\t\tvar leftX = -offset;\n\t\t\t\t\t\t\tvar topY = -offset;\n\t\t\t\t\t\t\tvar sideSize = Math.SQRT2 * radius;\n\n\t\t\t\t\t\t\t// NOTE(SB) the rounded rect implementation changed to use `arcTo`\n\t\t\t\t\t\t\t// instead of `quadraticCurveTo` since it generates better results\n\t\t\t\t\t\t\t// when rect is almost a circle. 0.425 (instead of 0.5) produces\n\t\t\t\t\t\t\t// results visually closer to the previous impl.\n\t\t\t\t\t\t\tthis.roundedRect(ctx, leftX, topY, sideSize, sideSize, radius * 0.425);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'rectRot':\n\t\t\t\t\t\t\tsize = 1 / Math.SQRT2 * radius;\n\t\t\t\t\t\t\tctx.moveTo(-size, 0);\n\t\t\t\t\t\t\tctx.lineTo(0, size);\n\t\t\t\t\t\t\tctx.lineTo(size, 0);\n\t\t\t\t\t\t\tctx.lineTo(0, -size);\n\t\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'cross':\n\t\t\t\t\t\t\tctx.moveTo(0, radius);\n\t\t\t\t\t\t\tctx.lineTo(0, -radius);\n\t\t\t\t\t\t\tctx.moveTo(-radius, 0);\n\t\t\t\t\t\t\tctx.lineTo(radius, 0);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'crossRot':\n\t\t\t\t\t\t\txOffset = Math.cos(Math.PI / 4) * radius;\n\t\t\t\t\t\t\tyOffset = Math.sin(Math.PI / 4) * radius;\n\t\t\t\t\t\t\tctx.moveTo(-xOffset, -yOffset);\n\t\t\t\t\t\t\tctx.lineTo(xOffset, yOffset);\n\t\t\t\t\t\t\tctx.moveTo(-xOffset, yOffset);\n\t\t\t\t\t\t\tctx.lineTo(xOffset, -yOffset);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'star':\n\t\t\t\t\t\t\tctx.moveTo(0, radius);\n\t\t\t\t\t\t\tctx.lineTo(0, -radius);\n\t\t\t\t\t\t\tctx.moveTo(-radius, 0);\n\t\t\t\t\t\t\tctx.lineTo(radius, 0);\n\t\t\t\t\t\t\txOffset = Math.cos(Math.PI / 4) * radius;\n\t\t\t\t\t\t\tyOffset = Math.sin(Math.PI / 4) * radius;\n\t\t\t\t\t\t\tctx.moveTo(-xOffset, -yOffset);\n\t\t\t\t\t\t\tctx.lineTo(xOffset, yOffset);\n\t\t\t\t\t\t\tctx.moveTo(-xOffset, yOffset);\n\t\t\t\t\t\t\tctx.lineTo(xOffset, -yOffset);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'line':\n\t\t\t\t\t\t\tctx.moveTo(-radius, 0);\n\t\t\t\t\t\t\tctx.lineTo(radius, 0);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'dash':\n\t\t\t\t\t\t\tctx.moveTo(0, 0);\n\t\t\t\t\t\t\tctx.lineTo(radius, 0);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.fill();\n\t\t\t\t\tctx.stroke();\n\t\t\t\t\tctx.restore();\n\t\t\t\t},\n\n\t\t\t\tclipArea: function clipArea(ctx, area) {\n\t\t\t\t\tctx.save();\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n\t\t\t\t\tctx.clip();\n\t\t\t\t},\n\n\t\t\t\tunclipArea: function unclipArea(ctx) {\n\t\t\t\t\tctx.restore();\n\t\t\t\t},\n\n\t\t\t\tlineTo: function lineTo(ctx, previous, target, flip) {\n\t\t\t\t\tif (target.steppedLine) {\n\t\t\t\t\t\tif (target.steppedLine === 'after' && !flip || target.steppedLine !== 'after' && flip) {\n\t\t\t\t\t\t\tctx.lineTo(previous.x, target.y);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tctx.lineTo(target.x, previous.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tctx.lineTo(target.x, target.y);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!target.tension) {\n\t\t\t\t\t\tctx.lineTo(target.x, target.y);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.bezierCurveTo(flip ? previous.controlPointPreviousX : previous.controlPointNextX, flip ? previous.controlPointPreviousY : previous.controlPointNextY, flip ? target.controlPointNextX : target.controlPointPreviousX, flip ? target.controlPointNextY : target.controlPointPreviousY, target.x, target.y);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// DEPRECATIONS\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.helpers.canvas.clear instead.\n * @namespace Chart.helpers.clear\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.clear = exports.clear;\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead.\n * @namespace Chart.helpers.drawRoundedRectangle\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.drawRoundedRectangle = function (ctx) {\n\t\t\t\tctx.beginPath();\n\t\t\t\texports.roundedRect.apply(exports, arguments);\n\t\t\t};\n\t\t}, { \"43\": 43 }], 43: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\t/**\n * @namespace Chart.helpers\n */\n\n\t\t\tvar helpers = {\n\t\t\t\t/**\n * An empty function that can be used, for example, for optional callback.\n */\n\t\t\t\tnoop: function noop() {},\n\n\t\t\t\t/**\n * Returns a unique id, sequentially generated from a global variable.\n * @returns {Number}\n * @function\n */\n\t\t\t\tuid: function () {\n\t\t\t\t\tvar id = 0;\n\t\t\t\t\treturn function () {\n\t\t\t\t\t\treturn id++;\n\t\t\t\t\t};\n\t\t\t\t}(),\n\n\t\t\t\t/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @since 2.7.0\n */\n\t\t\t\tisNullOrUndef: function isNullOrUndef(value) {\n\t\t\t\t\treturn value === null || typeof value === 'undefined';\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns true if `value` is an array, else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @function\n */\n\t\t\t\tisArray: Array.isArray ? Array.isArray : function (value) {\n\t\t\t\t\treturn Object.prototype.toString.call(value) === '[object Array]';\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @since 2.7.0\n */\n\t\t\t\tisObject: function isObject(value) {\n\t\t\t\t\treturn value !== null && Object.prototype.toString.call(value) === '[object Object]';\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param {*} value - The value to return if defined.\n * @param {*} defaultValue - The value to return if `value` is undefined.\n * @returns {*}\n */\n\t\t\t\tvalueOrDefault: function valueOrDefault(value, defaultValue) {\n\t\t\t\t\treturn typeof value === 'undefined' ? defaultValue : value;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns value at the given `index` in array if defined, else returns `defaultValue`.\n * @param {Array} value - The array to lookup for value at `index`.\n * @param {Number} index - The index in `value` to lookup for value.\n * @param {*} defaultValue - The value to return if `value[index]` is undefined.\n * @returns {*}\n */\n\t\t\t\tvalueAtIndexOrDefault: function valueAtIndexOrDefault(value, index, defaultValue) {\n\t\t\t\t\treturn helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);\n\t\t\t\t},\n\n\t\t\t\t/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param {Function} fn - The function to call.\n * @param {Array|undefined|null} args - The arguments with which `fn` should be called.\n * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\n * @returns {*}\n */\n\t\t\t\tcallback: function callback(fn, args, thisArg) {\n\t\t\t\t\tif (fn && typeof fn.call === 'function') {\n\t\t\t\t\t\treturn fn.apply(thisArg, args);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param {Object|Array} loopable - The object or array to be iterated.\n * @param {Function} fn - The function to call for each item.\n * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\n * @param {Boolean} [reverse] - If true, iterates backward on the loopable.\n */\n\t\t\t\teach: function each(loopable, fn, thisArg, reverse) {\n\t\t\t\t\tvar i, len, keys;\n\t\t\t\t\tif (helpers.isArray(loopable)) {\n\t\t\t\t\t\tlen = loopable.length;\n\t\t\t\t\t\tif (reverse) {\n\t\t\t\t\t\t\tfor (i = len - 1; i >= 0; i--) {\n\t\t\t\t\t\t\t\tfn.call(thisArg, loopable[i], i);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\t\t\t\tfn.call(thisArg, loopable[i], i);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (helpers.isObject(loopable)) {\n\t\t\t\t\t\tkeys = Object.keys(loopable);\n\t\t\t\t\t\tlen = keys.length;\n\t\t\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\t\t\tfn.call(thisArg, loopable[keys[i]], keys[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @see http://stackoverflow.com/a/14853974\n * @param {Array} a0 - The array to compare\n * @param {Array} a1 - The array to compare\n * @returns {Boolean}\n */\n\t\t\t\tarrayEquals: function arrayEquals(a0, a1) {\n\t\t\t\t\tvar i, ilen, v0, v1;\n\n\t\t\t\t\tif (!a0 || !a1 || a0.length !== a1.length) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i = 0, ilen = a0.length; i < ilen; ++i) {\n\t\t\t\t\t\tv0 = a0[i];\n\t\t\t\t\t\tv1 = a1[i];\n\n\t\t\t\t\t\tif (v0 instanceof Array && v1 instanceof Array) {\n\t\t\t\t\t\t\tif (!helpers.arrayEquals(v0, v1)) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (v0 !== v1) {\n\t\t\t\t\t\t\t// NOTE: two different object instances will never be equal: {x:20} != {x:20}\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param {*} source - The value to clone.\n * @returns {*}\n */\n\t\t\t\tclone: function clone(source) {\n\t\t\t\t\tif (helpers.isArray(source)) {\n\t\t\t\t\t\treturn source.map(helpers.clone);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (helpers.isObject(source)) {\n\t\t\t\t\t\tvar target = {};\n\t\t\t\t\t\tvar keys = Object.keys(source);\n\t\t\t\t\t\tvar klen = keys.length;\n\t\t\t\t\t\tvar k = 0;\n\n\t\t\t\t\t\tfor (; k < klen; ++k) {\n\t\t\t\t\t\t\ttarget[keys[k]] = helpers.clone(source[keys[k]]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn target;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn source;\n\t\t\t\t},\n\n\t\t\t\t/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): this method is also used by configMerge and scaleMerge as fallback.\n * @private\n */\n\t\t\t\t_merger: function _merger(key, target, source, options) {\n\t\t\t\t\tvar tval = target[key];\n\t\t\t\t\tvar sval = source[key];\n\n\t\t\t\t\tif (helpers.isObject(tval) && helpers.isObject(sval)) {\n\t\t\t\t\t\thelpers.merge(tval, sval, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget[key] = helpers.clone(sval);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\n\t\t\t\t_mergerIf: function _mergerIf(key, target, source) {\n\t\t\t\t\tvar tval = target[key];\n\t\t\t\t\tvar sval = source[key];\n\n\t\t\t\t\tif (helpers.isObject(tval) && helpers.isObject(sval)) {\n\t\t\t\t\t\thelpers.mergeIf(tval, sval);\n\t\t\t\t\t} else if (!target.hasOwnProperty(key)) {\n\t\t\t\t\t\ttarget[key] = helpers.clone(sval);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param {Object} target - The target object in which all sources are merged into.\n * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\n * @param {Object} [options] - Merging options:\n * @param {Function} [options.merger] - The merge method (key, target, source, options)\n * @returns {Object} The `target` object.\n */\n\t\t\t\tmerge: function merge(target, source, options) {\n\t\t\t\t\tvar sources = helpers.isArray(source) ? source : [source];\n\t\t\t\t\tvar ilen = sources.length;\n\t\t\t\t\tvar merge, i, keys, klen, k;\n\n\t\t\t\t\tif (!helpers.isObject(target)) {\n\t\t\t\t\t\treturn target;\n\t\t\t\t\t}\n\n\t\t\t\t\toptions = options || {};\n\t\t\t\t\tmerge = options.merger || helpers._merger;\n\n\t\t\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\t\t\tsource = sources[i];\n\t\t\t\t\t\tif (!helpers.isObject(source)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tkeys = Object.keys(source);\n\t\t\t\t\t\tfor (k = 0, klen = keys.length; k < klen; ++k) {\n\t\t\t\t\t\t\tmerge(keys[k], target, source, options);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn target;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param {Object} target - The target object in which all sources are merged into.\n * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\n * @returns {Object} The `target` object.\n */\n\t\t\t\tmergeIf: function mergeIf(target, source) {\n\t\t\t\t\treturn helpers.merge(target, source, { merger: helpers._mergerIf });\n\t\t\t\t},\n\n\t\t\t\t/**\n * Applies the contents of two or more objects together into the first object.\n * @param {Object} target - The target object in which all objects are merged into.\n * @param {Object} arg1 - Object containing additional properties to merge in target.\n * @param {Object} argN - Additional objects containing properties to merge in target.\n * @returns {Object} The `target` object.\n */\n\t\t\t\textend: function extend(target) {\n\t\t\t\t\tvar setFn = function setFn(value, key) {\n\t\t\t\t\t\ttarget[key] = value;\n\t\t\t\t\t};\n\t\t\t\t\tfor (var i = 1, ilen = arguments.length; i < ilen; ++i) {\n\t\t\t\t\t\thelpers.each(arguments[i], setFn);\n\t\t\t\t\t}\n\t\t\t\t\treturn target;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Basic javascript inheritance based on the model created in Backbone.js\n */\n\t\t\t\tinherits: function inherits(extensions) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar ChartElement = extensions && extensions.hasOwnProperty('constructor') ? extensions.constructor : function () {\n\t\t\t\t\t\treturn me.apply(this, arguments);\n\t\t\t\t\t};\n\n\t\t\t\t\tvar Surrogate = function Surrogate() {\n\t\t\t\t\t\tthis.constructor = ChartElement;\n\t\t\t\t\t};\n\n\t\t\t\t\tSurrogate.prototype = me.prototype;\n\t\t\t\t\tChartElement.prototype = new Surrogate();\n\t\t\t\t\tChartElement.extend = helpers.inherits;\n\n\t\t\t\t\tif (extensions) {\n\t\t\t\t\t\thelpers.extend(ChartElement.prototype, extensions);\n\t\t\t\t\t}\n\n\t\t\t\t\tChartElement.__super__ = me.prototype;\n\t\t\t\t\treturn ChartElement;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tmodule.exports = helpers;\n\n\t\t\t// DEPRECATIONS\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.helpers.callback instead.\n * @function Chart.helpers.callCallback\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.callCallback = helpers.callback;\n\n\t\t\t/**\n * Provided for backward compatibility, use Array.prototype.indexOf instead.\n * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+\n * @function Chart.helpers.indexOf\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.indexOf = function (array, item, fromIndex) {\n\t\t\t\treturn Array.prototype.indexOf.call(array, item, fromIndex);\n\t\t\t};\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead.\n * @function Chart.helpers.getValueOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.getValueOrDefault = helpers.valueOrDefault;\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead.\n * @function Chart.helpers.getValueAtIndexOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\t\t}, {}], 44: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(43);\n\n\t\t\t/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easingEffects\n * @see http://www.robertpenner.com/easing/\n */\n\t\t\tvar effects = {\n\t\t\t\tlinear: function linear(t) {\n\t\t\t\t\treturn t;\n\t\t\t\t},\n\n\t\t\t\teaseInQuad: function easeInQuad(t) {\n\t\t\t\t\treturn t * t;\n\t\t\t\t},\n\n\t\t\t\teaseOutQuad: function easeOutQuad(t) {\n\t\t\t\t\treturn -t * (t - 2);\n\t\t\t\t},\n\n\t\t\t\teaseInOutQuad: function easeInOutQuad(t) {\n\t\t\t\t\tif ((t /= 0.5) < 1) {\n\t\t\t\t\t\treturn 0.5 * t * t;\n\t\t\t\t\t}\n\t\t\t\t\treturn -0.5 * (--t * (t - 2) - 1);\n\t\t\t\t},\n\n\t\t\t\teaseInCubic: function easeInCubic(t) {\n\t\t\t\t\treturn t * t * t;\n\t\t\t\t},\n\n\t\t\t\teaseOutCubic: function easeOutCubic(t) {\n\t\t\t\t\treturn (t = t - 1) * t * t + 1;\n\t\t\t\t},\n\n\t\t\t\teaseInOutCubic: function easeInOutCubic(t) {\n\t\t\t\t\tif ((t /= 0.5) < 1) {\n\t\t\t\t\t\treturn 0.5 * t * t * t;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0.5 * ((t -= 2) * t * t + 2);\n\t\t\t\t},\n\n\t\t\t\teaseInQuart: function easeInQuart(t) {\n\t\t\t\t\treturn t * t * t * t;\n\t\t\t\t},\n\n\t\t\t\teaseOutQuart: function easeOutQuart(t) {\n\t\t\t\t\treturn -((t = t - 1) * t * t * t - 1);\n\t\t\t\t},\n\n\t\t\t\teaseInOutQuart: function easeInOutQuart(t) {\n\t\t\t\t\tif ((t /= 0.5) < 1) {\n\t\t\t\t\t\treturn 0.5 * t * t * t * t;\n\t\t\t\t\t}\n\t\t\t\t\treturn -0.5 * ((t -= 2) * t * t * t - 2);\n\t\t\t\t},\n\n\t\t\t\teaseInQuint: function easeInQuint(t) {\n\t\t\t\t\treturn t * t * t * t * t;\n\t\t\t\t},\n\n\t\t\t\teaseOutQuint: function easeOutQuint(t) {\n\t\t\t\t\treturn (t = t - 1) * t * t * t * t + 1;\n\t\t\t\t},\n\n\t\t\t\teaseInOutQuint: function easeInOutQuint(t) {\n\t\t\t\t\tif ((t /= 0.5) < 1) {\n\t\t\t\t\t\treturn 0.5 * t * t * t * t * t;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0.5 * ((t -= 2) * t * t * t * t + 2);\n\t\t\t\t},\n\n\t\t\t\teaseInSine: function easeInSine(t) {\n\t\t\t\t\treturn -Math.cos(t * (Math.PI / 2)) + 1;\n\t\t\t\t},\n\n\t\t\t\teaseOutSine: function easeOutSine(t) {\n\t\t\t\t\treturn Math.sin(t * (Math.PI / 2));\n\t\t\t\t},\n\n\t\t\t\teaseInOutSine: function easeInOutSine(t) {\n\t\t\t\t\treturn -0.5 * (Math.cos(Math.PI * t) - 1);\n\t\t\t\t},\n\n\t\t\t\teaseInExpo: function easeInExpo(t) {\n\t\t\t\t\treturn t === 0 ? 0 : Math.pow(2, 10 * (t - 1));\n\t\t\t\t},\n\n\t\t\t\teaseOutExpo: function easeOutExpo(t) {\n\t\t\t\t\treturn t === 1 ? 1 : -Math.pow(2, -10 * t) + 1;\n\t\t\t\t},\n\n\t\t\t\teaseInOutExpo: function easeInOutExpo(t) {\n\t\t\t\t\tif (t === 0) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (t === 1) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\tif ((t /= 0.5) < 1) {\n\t\t\t\t\t\treturn 0.5 * Math.pow(2, 10 * (t - 1));\n\t\t\t\t\t}\n\t\t\t\t\treturn 0.5 * (-Math.pow(2, -10 * --t) + 2);\n\t\t\t\t},\n\n\t\t\t\teaseInCirc: function easeInCirc(t) {\n\t\t\t\t\tif (t >= 1) {\n\t\t\t\t\t\treturn t;\n\t\t\t\t\t}\n\t\t\t\t\treturn -(Math.sqrt(1 - t * t) - 1);\n\t\t\t\t},\n\n\t\t\t\teaseOutCirc: function easeOutCirc(t) {\n\t\t\t\t\treturn Math.sqrt(1 - (t = t - 1) * t);\n\t\t\t\t},\n\n\t\t\t\teaseInOutCirc: function easeInOutCirc(t) {\n\t\t\t\t\tif ((t /= 0.5) < 1) {\n\t\t\t\t\t\treturn -0.5 * (Math.sqrt(1 - t * t) - 1);\n\t\t\t\t\t}\n\t\t\t\t\treturn 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n\t\t\t\t},\n\n\t\t\t\teaseInElastic: function easeInElastic(t) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\tvar p = 0;\n\t\t\t\t\tvar a = 1;\n\t\t\t\t\tif (t === 0) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (t === 1) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (!p) {\n\t\t\t\t\t\tp = 0.3;\n\t\t\t\t\t}\n\t\t\t\t\tif (a < 1) {\n\t\t\t\t\t\ta = 1;\n\t\t\t\t\t\ts = p / 4;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t\t\t}\n\t\t\t\t\treturn -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n\t\t\t\t},\n\n\t\t\t\teaseOutElastic: function easeOutElastic(t) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\tvar p = 0;\n\t\t\t\t\tvar a = 1;\n\t\t\t\t\tif (t === 0) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (t === 1) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (!p) {\n\t\t\t\t\t\tp = 0.3;\n\t\t\t\t\t}\n\t\t\t\t\tif (a < 1) {\n\t\t\t\t\t\ta = 1;\n\t\t\t\t\t\ts = p / 4;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t\t\t}\n\t\t\t\t\treturn a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;\n\t\t\t\t},\n\n\t\t\t\teaseInOutElastic: function easeInOutElastic(t) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\tvar p = 0;\n\t\t\t\t\tvar a = 1;\n\t\t\t\t\tif (t === 0) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tif ((t /= 0.5) === 2) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (!p) {\n\t\t\t\t\t\tp = 0.45;\n\t\t\t\t\t}\n\t\t\t\t\tif (a < 1) {\n\t\t\t\t\t\ta = 1;\n\t\t\t\t\t\ts = p / 4;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t\t\t}\n\t\t\t\t\tif (t < 1) {\n\t\t\t\t\t\treturn -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n\t\t\t\t\t}\n\t\t\t\t\treturn a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;\n\t\t\t\t},\n\t\t\t\teaseInBack: function easeInBack(t) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\treturn t * t * ((s + 1) * t - s);\n\t\t\t\t},\n\n\t\t\t\teaseOutBack: function easeOutBack(t) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\treturn (t = t - 1) * t * ((s + 1) * t + s) + 1;\n\t\t\t\t},\n\n\t\t\t\teaseInOutBack: function easeInOutBack(t) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\tif ((t /= 0.5) < 1) {\n\t\t\t\t\t\treturn 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));\n\t\t\t\t\t}\n\t\t\t\t\treturn 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);\n\t\t\t\t},\n\n\t\t\t\teaseInBounce: function easeInBounce(t) {\n\t\t\t\t\treturn 1 - effects.easeOutBounce(1 - t);\n\t\t\t\t},\n\n\t\t\t\teaseOutBounce: function easeOutBounce(t) {\n\t\t\t\t\tif (t < 1 / 2.75) {\n\t\t\t\t\t\treturn 7.5625 * t * t;\n\t\t\t\t\t}\n\t\t\t\t\tif (t < 2 / 2.75) {\n\t\t\t\t\t\treturn 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;\n\t\t\t\t\t}\n\t\t\t\t\tif (t < 2.5 / 2.75) {\n\t\t\t\t\t\treturn 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;\n\t\t\t\t\t}\n\t\t\t\t\treturn 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;\n\t\t\t\t},\n\n\t\t\t\teaseInOutBounce: function easeInOutBounce(t) {\n\t\t\t\t\tif (t < 0.5) {\n\t\t\t\t\t\treturn effects.easeInBounce(t * 2) * 0.5;\n\t\t\t\t\t}\n\t\t\t\t\treturn effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tmodule.exports = {\n\t\t\t\teffects: effects\n\t\t\t};\n\n\t\t\t// DEPRECATIONS\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.helpers.easing.effects instead.\n * @function Chart.helpers.easingEffects\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.easingEffects = effects;\n\t\t}, { \"43\": 43 }], 45: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(43);\n\n\t\t\t/**\n * @alias Chart.helpers.options\n * @namespace\n */\n\t\t\tmodule.exports = {\n\t\t\t\t/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param {Number|String} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param {Number} size - The font size (in pixels) used to resolve relative `value`.\n * @returns {Number} The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\n\t\t\t\ttoLineHeight: function toLineHeight(value, size) {\n\t\t\t\t\tvar matches = ('' + value).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\n\t\t\t\t\tif (!matches || matches[1] === 'normal') {\n\t\t\t\t\t\treturn size * 1.2;\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue = +matches[2];\n\n\t\t\t\t\tswitch (matches[3]) {\n\t\t\t\t\t\tcase 'px':\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\tcase '%':\n\t\t\t\t\t\t\tvalue /= 100;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn size * value;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param {Number|Object} value - If a number, set the value to all TRBL component,\n * else, if and object, use defined properties and sets undefined ones to 0.\n * @returns {Object} The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\n\t\t\t\ttoPadding: function toPadding(value) {\n\t\t\t\t\tvar t, r, b, l;\n\n\t\t\t\t\tif (helpers.isObject(value)) {\n\t\t\t\t\t\tt = +value.top || 0;\n\t\t\t\t\t\tr = +value.right || 0;\n\t\t\t\t\t\tb = +value.bottom || 0;\n\t\t\t\t\t\tl = +value.left || 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt = r = b = l = +value || 0;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttop: t,\n\t\t\t\t\t\tright: r,\n\t\t\t\t\t\tbottom: b,\n\t\t\t\t\t\tleft: l,\n\t\t\t\t\t\theight: t + b,\n\t\t\t\t\t\twidth: l + r\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\t/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param {Array[]} inputs - An array of values, falling back to the last value.\n * @param {Object} [context] - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param {Number} [index] - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @since 2.7.0\n */\n\t\t\t\tresolve: function resolve(inputs, context, index) {\n\t\t\t\t\tvar i, ilen, value;\n\n\t\t\t\t\tfor (i = 0, ilen = inputs.length; i < ilen; ++i) {\n\t\t\t\t\t\tvalue = inputs[i];\n\t\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (context !== undefined && typeof value === 'function') {\n\t\t\t\t\t\t\tvalue = value(context);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (index !== undefined && helpers.isArray(value)) {\n\t\t\t\t\t\t\tvalue = value[index];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"43\": 43 }], 46: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = require(43);\n\t\t\tmodule.exports.easing = require(44);\n\t\t\tmodule.exports.canvas = require(42);\n\t\t\tmodule.exports.options = require(45);\n\t\t}, { \"42\": 42, \"43\": 43, \"44\": 44, \"45\": 45 }], 47: [function (require, module, exports) {\n\t\t\t/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\n\t\t\tmodule.exports = {\n\t\t\t\tacquireContext: function acquireContext(item) {\n\t\t\t\t\tif (item && item.canvas) {\n\t\t\t\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\t\t\t\titem = item.canvas;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn item && item.getContext('2d') || null;\n\t\t\t\t}\n\t\t\t};\n\t\t}, {}], 48: [function (require, module, exports) {\n\t\t\t/**\n * Chart.Platform implementation for targeting a web browser\n */\n\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\n\t\t\tvar EXPANDO_KEY = '$chartjs';\n\t\t\tvar CSS_PREFIX = 'chartjs-';\n\t\t\tvar CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';\n\t\t\tvar CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';\n\t\t\tvar ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart'];\n\n\t\t\t/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\n\t\t\tvar EVENT_TYPES = {\n\t\t\t\ttouchstart: 'mousedown',\n\t\t\t\ttouchmove: 'mousemove',\n\t\t\t\ttouchend: 'mouseup',\n\t\t\t\tpointerenter: 'mouseenter',\n\t\t\t\tpointerdown: 'mousedown',\n\t\t\t\tpointermove: 'mousemove',\n\t\t\t\tpointerup: 'mouseup',\n\t\t\t\tpointerleave: 'mouseout',\n\t\t\t\tpointerout: 'mouseout'\n\t\t\t};\n\n\t\t\t/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns {Number} Size in pixels or undefined if unknown.\n */\n\t\t\tfunction readUsedSize(element, property) {\n\t\t\t\tvar value = helpers.getStyle(element, property);\n\t\t\t\tvar matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n\t\t\t\treturn matches ? Number(matches[1]) : undefined;\n\t\t\t}\n\n\t\t\t/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n */\n\t\t\tfunction initCanvas(canvas, config) {\n\t\t\t\tvar style = canvas.style;\n\n\t\t\t\t// NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n\t\t\t\t// returns null or '' if no explicit value has been set to the canvas attribute.\n\t\t\t\tvar renderHeight = canvas.getAttribute('height');\n\t\t\t\tvar renderWidth = canvas.getAttribute('width');\n\n\t\t\t\t// Chart.js modifies some canvas values that we want to restore on destroy\n\t\t\t\tcanvas[EXPANDO_KEY] = {\n\t\t\t\t\tinitial: {\n\t\t\t\t\t\theight: renderHeight,\n\t\t\t\t\t\twidth: renderWidth,\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\tdisplay: style.display,\n\t\t\t\t\t\t\theight: style.height,\n\t\t\t\t\t\t\twidth: style.width\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Force canvas to display as block to avoid extra space caused by inline\n\t\t\t\t// elements, which would interfere with the responsive resize process.\n\t\t\t\t// https://github.com/chartjs/Chart.js/issues/2538\n\t\t\t\tstyle.display = style.display || 'block';\n\n\t\t\t\tif (renderWidth === null || renderWidth === '') {\n\t\t\t\t\tvar displayWidth = readUsedSize(canvas, 'width');\n\t\t\t\t\tif (displayWidth !== undefined) {\n\t\t\t\t\t\tcanvas.width = displayWidth;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (renderHeight === null || renderHeight === '') {\n\t\t\t\t\tif (canvas.style.height === '') {\n\t\t\t\t\t\t// If no explicit render height and style height, let's apply the aspect ratio,\n\t\t\t\t\t\t// which one can be specified by the user but also by charts as default option\n\t\t\t\t\t\t// (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n\t\t\t\t\t\tcanvas.height = canvas.width / (config.options.aspectRatio || 2);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar displayHeight = readUsedSize(canvas, 'height');\n\t\t\t\t\t\tif (displayWidth !== undefined) {\n\t\t\t\t\t\t\tcanvas.height = displayHeight;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn canvas;\n\t\t\t}\n\n\t\t\t/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\n\t\t\tvar supportsEventListenerOptions = function () {\n\t\t\t\tvar supports = false;\n\t\t\t\ttry {\n\t\t\t\t\tvar options = Object.defineProperty({}, 'passive', {\n\t\t\t\t\t\tget: function get() {\n\t\t\t\t\t\t\tsupports = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\twindow.addEventListener('e', null, options);\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// continue regardless of error\n\t\t\t\t}\n\t\t\t\treturn supports;\n\t\t\t}();\n\n\t\t\t// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n\t\t\t// https://github.com/chartjs/Chart.js/issues/4287\n\t\t\tvar eventListenerOptions = supportsEventListenerOptions ? { passive: true } : false;\n\n\t\t\tfunction _addEventListener(node, type, listener) {\n\t\t\t\tnode.addEventListener(type, listener, eventListenerOptions);\n\t\t\t}\n\n\t\t\tfunction _removeEventListener(node, type, listener) {\n\t\t\t\tnode.removeEventListener(type, listener, eventListenerOptions);\n\t\t\t}\n\n\t\t\tfunction createEvent(type, chart, x, y, nativeEvent) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: type,\n\t\t\t\t\tchart: chart,\n\t\t\t\t\tnative: nativeEvent || null,\n\t\t\t\t\tx: x !== undefined ? x : null,\n\t\t\t\t\ty: y !== undefined ? y : null\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfunction fromNativeEvent(event, chart) {\n\t\t\t\tvar type = EVENT_TYPES[event.type] || event.type;\n\t\t\t\tvar pos = helpers.getRelativePosition(event, chart);\n\t\t\t\treturn createEvent(type, chart, pos.x, pos.y, event);\n\t\t\t}\n\n\t\t\tfunction throttled(fn, thisArg) {\n\t\t\t\tvar ticking = false;\n\t\t\t\tvar args = [];\n\n\t\t\t\treturn function () {\n\t\t\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t\t\t\tthisArg = thisArg || this;\n\n\t\t\t\t\tif (!ticking) {\n\t\t\t\t\t\tticking = true;\n\t\t\t\t\t\thelpers.requestAnimFrame.call(window, function () {\n\t\t\t\t\t\t\tticking = false;\n\t\t\t\t\t\t\tfn.apply(thisArg, args);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Implementation based on https://github.com/marcj/css-element-queries\n\t\t\tfunction createResizer(handler) {\n\t\t\t\tvar resizer = document.createElement('div');\n\t\t\t\tvar cls = CSS_PREFIX + 'size-monitor';\n\t\t\t\tvar maxSize = 1000000;\n\t\t\t\tvar style = 'position:absolute;' + 'left:0;' + 'top:0;' + 'right:0;' + 'bottom:0;' + 'overflow:hidden;' + 'pointer-events:none;' + 'visibility:hidden;' + 'z-index:-1;';\n\n\t\t\t\tresizer.style.cssText = style;\n\t\t\t\tresizer.className = cls;\n\t\t\t\tresizer.innerHTML = '<div class=\"' + cls + '-expand\" style=\"' + style + '\">' + '<div style=\"' + 'position:absolute;' + 'width:' + maxSize + 'px;' + 'height:' + maxSize + 'px;' + 'left:0;' + 'top:0\">' + '</div>' + '</div>' + '<div class=\"' + cls + '-shrink\" style=\"' + style + '\">' + '<div style=\"' + 'position:absolute;' + 'width:200%;' + 'height:200%;' + 'left:0; ' + 'top:0\">' + '</div>' + '</div>';\n\n\t\t\t\tvar expand = resizer.childNodes[0];\n\t\t\t\tvar shrink = resizer.childNodes[1];\n\n\t\t\t\tresizer._reset = function () {\n\t\t\t\t\texpand.scrollLeft = maxSize;\n\t\t\t\t\texpand.scrollTop = maxSize;\n\t\t\t\t\tshrink.scrollLeft = maxSize;\n\t\t\t\t\tshrink.scrollTop = maxSize;\n\t\t\t\t};\n\t\t\t\tvar onScroll = function onScroll() {\n\t\t\t\t\tresizer._reset();\n\t\t\t\t\thandler();\n\t\t\t\t};\n\n\t\t\t\t_addEventListener(expand, 'scroll', onScroll.bind(expand, 'expand'));\n\t\t\t\t_addEventListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));\n\n\t\t\t\treturn resizer;\n\t\t\t}\n\n\t\t\t// https://davidwalsh.name/detect-node-insertion\n\t\t\tfunction watchForRender(node, handler) {\n\t\t\t\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\t\t\t\tvar proxy = expando.renderProxy = function (e) {\n\t\t\t\t\tif (e.animationName === CSS_RENDER_ANIMATION) {\n\t\t\t\t\t\thandler();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\thelpers.each(ANIMATION_START_EVENTS, function (type) {\n\t\t\t\t\t_addEventListener(node, type, proxy);\n\t\t\t\t});\n\n\t\t\t\t// #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class\n\t\t\t\t// is removed then added back immediately (same animation frame?). Accessing the\n\t\t\t\t// `offsetParent` property will force a reflow and re-evaluate the CSS animation.\n\t\t\t\t// https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics\n\t\t\t\t// https://github.com/chartjs/Chart.js/issues/4737\n\t\t\t\texpando.reflow = !!node.offsetParent;\n\n\t\t\t\tnode.classList.add(CSS_RENDER_MONITOR);\n\t\t\t}\n\n\t\t\tfunction unwatchForRender(node) {\n\t\t\t\tvar expando = node[EXPANDO_KEY] || {};\n\t\t\t\tvar proxy = expando.renderProxy;\n\n\t\t\t\tif (proxy) {\n\t\t\t\t\thelpers.each(ANIMATION_START_EVENTS, function (type) {\n\t\t\t\t\t\t_removeEventListener(node, type, proxy);\n\t\t\t\t\t});\n\n\t\t\t\t\tdelete expando.renderProxy;\n\t\t\t\t}\n\n\t\t\t\tnode.classList.remove(CSS_RENDER_MONITOR);\n\t\t\t}\n\n\t\t\tfunction addResizeListener(node, listener, chart) {\n\t\t\t\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\n\t\t\t\t// Let's keep track of this added resizer and thus avoid DOM query when removing it.\n\t\t\t\tvar resizer = expando.resizer = createResizer(throttled(function () {\n\t\t\t\t\tif (expando.resizer) {\n\t\t\t\t\t\treturn listener(createEvent('resize', chart));\n\t\t\t\t\t}\n\t\t\t\t}));\n\n\t\t\t\t// The resizer needs to be attached to the node parent, so we first need to be\n\t\t\t\t// sure that `node` is attached to the DOM before injecting the resizer element.\n\t\t\t\twatchForRender(node, function () {\n\t\t\t\t\tif (expando.resizer) {\n\t\t\t\t\t\tvar container = node.parentNode;\n\t\t\t\t\t\tif (container && container !== resizer.parentNode) {\n\t\t\t\t\t\t\tcontainer.insertBefore(resizer, container.firstChild);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// The container size might have changed, let's reset the resizer state.\n\t\t\t\t\t\tresizer._reset();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction removeResizeListener(node) {\n\t\t\t\tvar expando = node[EXPANDO_KEY] || {};\n\t\t\t\tvar resizer = expando.resizer;\n\n\t\t\t\tdelete expando.resizer;\n\t\t\t\tunwatchForRender(node);\n\n\t\t\t\tif (resizer && resizer.parentNode) {\n\t\t\t\t\tresizer.parentNode.removeChild(resizer);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction injectCSS(platform, css) {\n\t\t\t\t// http://stackoverflow.com/q/3922139\n\t\t\t\tvar style = platform._style || document.createElement('style');\n\t\t\t\tif (!platform._style) {\n\t\t\t\t\tplatform._style = style;\n\t\t\t\t\tcss = '/* Chart.js */\\n' + css;\n\t\t\t\t\tstyle.setAttribute('type', 'text/css');\n\t\t\t\t\tdocument.getElementsByTagName('head')[0].appendChild(style);\n\t\t\t\t}\n\n\t\t\t\tstyle.appendChild(document.createTextNode(css));\n\t\t\t}\n\n\t\t\tmodule.exports = {\n\t\t\t\t/**\n * This property holds whether this platform is enabled for the current environment.\n * Currently used by platform.js to select the proper implementation.\n * @private\n */\n\t\t\t\t_enabled: typeof window !== 'undefined' && typeof document !== 'undefined',\n\n\t\t\t\tinitialize: function initialize() {\n\t\t\t\t\tvar keyframes = 'from{opacity:0.99}to{opacity:1}';\n\n\t\t\t\t\tinjectCSS(this,\n\t\t\t\t\t// DOM rendering detection\n\t\t\t\t\t// https://davidwalsh.name/detect-node-insertion\n\t\t\t\t\t'@-webkit-keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' + '@keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' + '.' + CSS_RENDER_MONITOR + '{' + '-webkit-animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' + 'animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' + '}');\n\t\t\t\t},\n\n\t\t\t\tacquireContext: function acquireContext(item, config) {\n\t\t\t\t\tif (typeof item === 'string') {\n\t\t\t\t\t\titem = document.getElementById(item);\n\t\t\t\t\t} else if (item.length) {\n\t\t\t\t\t\t// Support for array based queries (such as jQuery)\n\t\t\t\t\t\titem = item[0];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (item && item.canvas) {\n\t\t\t\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\t\t\t\titem = item.canvas;\n\t\t\t\t\t}\n\n\t\t\t\t\t// To prevent canvas fingerprinting, some add-ons undefine the getContext\n\t\t\t\t\t// method, for example: https://github.com/kkapsner/CanvasBlocker\n\t\t\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\t\t\tvar context = item && item.getContext && item.getContext('2d');\n\n\t\t\t\t\t// `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is\n\t\t\t\t\t// inside an iframe or when running in a protected environment. We could guess the\n\t\t\t\t\t// types from their toString() value but let's keep things flexible and assume it's\n\t\t\t\t\t// a sufficient condition if the item has a context2D which has item as `canvas`.\n\t\t\t\t\t// https://github.com/chartjs/Chart.js/issues/3887\n\t\t\t\t\t// https://github.com/chartjs/Chart.js/issues/4102\n\t\t\t\t\t// https://github.com/chartjs/Chart.js/issues/4152\n\t\t\t\t\tif (context && context.canvas === item) {\n\t\t\t\t\t\tinitCanvas(item, config);\n\t\t\t\t\t\treturn context;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t},\n\n\t\t\t\treleaseContext: function releaseContext(context) {\n\t\t\t\t\tvar canvas = context.canvas;\n\t\t\t\t\tif (!canvas[EXPANDO_KEY]) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar initial = canvas[EXPANDO_KEY].initial;\n\t\t\t\t\t['height', 'width'].forEach(function (prop) {\n\t\t\t\t\t\tvar value = initial[prop];\n\t\t\t\t\t\tif (helpers.isNullOrUndef(value)) {\n\t\t\t\t\t\t\tcanvas.removeAttribute(prop);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcanvas.setAttribute(prop, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\thelpers.each(initial.style || {}, function (value, key) {\n\t\t\t\t\t\tcanvas.style[key] = value;\n\t\t\t\t\t});\n\n\t\t\t\t\t// The canvas render size might have been changed (and thus the state stack discarded),\n\t\t\t\t\t// we can't use save() and restore() to restore the initial state. So make sure that at\n\t\t\t\t\t// least the canvas context is reset to the default state by setting the canvas width.\n\t\t\t\t\t// https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n\t\t\t\t\tcanvas.width = canvas.width;\n\n\t\t\t\t\tdelete canvas[EXPANDO_KEY];\n\t\t\t\t},\n\n\t\t\t\taddEventListener: function addEventListener(chart, type, listener) {\n\t\t\t\t\tvar canvas = chart.canvas;\n\t\t\t\t\tif (type === 'resize') {\n\t\t\t\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\t\t\t\taddResizeListener(canvas, listener, chart);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {});\n\t\t\t\t\tvar proxies = expando.proxies || (expando.proxies = {});\n\t\t\t\t\tvar proxy = proxies[chart.id + '_' + type] = function (event) {\n\t\t\t\t\t\tlistener(fromNativeEvent(event, chart));\n\t\t\t\t\t};\n\n\t\t\t\t\t_addEventListener(canvas, type, proxy);\n\t\t\t\t},\n\n\t\t\t\tremoveEventListener: function removeEventListener(chart, type, listener) {\n\t\t\t\t\tvar canvas = chart.canvas;\n\t\t\t\t\tif (type === 'resize') {\n\t\t\t\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\t\t\t\tremoveResizeListener(canvas, listener);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar expando = listener[EXPANDO_KEY] || {};\n\t\t\t\t\tvar proxies = expando.proxies || {};\n\t\t\t\t\tvar proxy = proxies[chart.id + '_' + type];\n\t\t\t\t\tif (!proxy) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t_removeEventListener(canvas, type, proxy);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// DEPRECATIONS\n\n\t\t\t/**\n * Provided for backward compatibility, use EventTarget.addEventListener instead.\n * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n * @function Chart.helpers.addEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.addEvent = _addEventListener;\n\n\t\t\t/**\n * Provided for backward compatibility, use EventTarget.removeEventListener instead.\n * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener\n * @function Chart.helpers.removeEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.removeEvent = _removeEventListener;\n\t\t}, { \"46\": 46 }], 49: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\t\t\tvar basic = require(47);\n\t\t\tvar dom = require(48);\n\n\t\t\t// @TODO Make possible to select another platform at build time.\n\t\t\tvar implementation = dom._enabled ? dom : basic;\n\n\t\t\t/**\n * @namespace Chart.platform\n * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\n * @since 2.4.0\n */\n\t\t\tmodule.exports = helpers.extend({\n\t\t\t\t/**\n * @since 2.7.0\n */\n\t\t\t\tinitialize: function initialize() {},\n\n\t\t\t\t/**\n * Called at chart construction time, returns a context2d instance implementing\n * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n * @param {*} item - The native item from which to acquire context (platform specific)\n * @param {Object} options - The chart options\n * @returns {CanvasRenderingContext2D} context2d instance\n */\n\t\t\t\tacquireContext: function acquireContext() {},\n\n\t\t\t\t/**\n * Called at chart destruction time, releases any resources associated to the context\n * previously returned by the acquireContext() method.\n * @param {CanvasRenderingContext2D} context - The context2d instance\n * @returns {Boolean} true if the method succeeded, else false\n */\n\t\t\t\treleaseContext: function releaseContext() {},\n\n\t\t\t\t/**\n * Registers the specified listener on the given chart.\n * @param {Chart} chart - Chart from which to listen for event\n * @param {String} type - The ({@link IEvent}) type to listen for\n * @param {Function} listener - Receives a notification (an object that implements\n * the {@link IEvent} interface) when an event of the specified type occurs.\n */\n\t\t\t\taddEventListener: function addEventListener() {},\n\n\t\t\t\t/**\n * Removes the specified listener previously registered with addEventListener.\n * @param {Chart} chart -Chart from which to remove the listener\n * @param {String} type - The ({@link IEvent}) type to remove\n * @param {Function} listener - The listener function to remove from the event target.\n */\n\t\t\t\tremoveEventListener: function removeEventListener() {}\n\n\t\t\t}, implementation);\n\n\t\t\t/**\n * @interface IPlatform\n * Allows abstracting platform dependencies away from the chart\n * @borrows Chart.platform.acquireContext as acquireContext\n * @borrows Chart.platform.releaseContext as releaseContext\n * @borrows Chart.platform.addEventListener as addEventListener\n * @borrows Chart.platform.removeEventListener as removeEventListener\n */\n\n\t\t\t/**\n * @interface IEvent\n * @prop {String} type - The event type name, possible values are:\n * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout',\n * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize'\n * @prop {*} native - The original native event (null for emulated events, e.g. 'resize')\n * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events)\n * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events)\n */\n\t\t}, { \"46\": 46, \"47\": 47, \"48\": 48 }], 50: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = {};\n\t\t\tmodule.exports.filler = require(51);\n\t\t\tmodule.exports.legend = require(52);\n\t\t\tmodule.exports.title = require(53);\n\t\t}, { \"51\": 51, \"52\": 52, \"53\": 53 }], 51: [function (require, module, exports) {\n\t\t\t/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar elements = require(41);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('global', {\n\t\t\t\tplugins: {\n\t\t\t\t\tfiller: {\n\t\t\t\t\t\tpropagate: true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar mappers = {\n\t\t\t\tdataset: function dataset(source) {\n\t\t\t\t\tvar index = source.fill;\n\t\t\t\t\tvar chart = source.chart;\n\t\t\t\t\tvar meta = chart.getDatasetMeta(index);\n\t\t\t\t\tvar visible = meta && chart.isDatasetVisible(index);\n\t\t\t\t\tvar points = visible && meta.dataset._children || [];\n\t\t\t\t\tvar length = points.length || 0;\n\n\t\t\t\t\treturn !length ? null : function (point, i) {\n\t\t\t\t\t\treturn i < length && points[i]._view || null;\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\tboundary: function boundary(source) {\n\t\t\t\t\tvar boundary = source.boundary;\n\t\t\t\t\tvar x = boundary ? boundary.x : null;\n\t\t\t\t\tvar y = boundary ? boundary.y : null;\n\n\t\t\t\t\treturn function (point) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tx: x === null ? point.x : x,\n\t\t\t\t\t\t\ty: y === null ? point.y : y\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// @todo if (fill[0] === '#')\n\t\t\tfunction decodeFill(el, index, count) {\n\t\t\t\tvar model = el._model || {};\n\t\t\t\tvar fill = model.fill;\n\t\t\t\tvar target;\n\n\t\t\t\tif (fill === undefined) {\n\t\t\t\t\tfill = !!model.backgroundColor;\n\t\t\t\t}\n\n\t\t\t\tif (fill === false || fill === null) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif (fill === true) {\n\t\t\t\t\treturn 'origin';\n\t\t\t\t}\n\n\t\t\t\ttarget = parseFloat(fill, 10);\n\t\t\t\tif (isFinite(target) && Math.floor(target) === target) {\n\t\t\t\t\tif (fill[0] === '-' || fill[0] === '+') {\n\t\t\t\t\t\ttarget = index + target;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (target === index || target < 0 || target >= count) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn target;\n\t\t\t\t}\n\n\t\t\t\tswitch (fill) {\n\t\t\t\t\t// compatibility\n\t\t\t\t\tcase 'bottom':\n\t\t\t\t\t\treturn 'start';\n\t\t\t\t\tcase 'top':\n\t\t\t\t\t\treturn 'end';\n\t\t\t\t\tcase 'zero':\n\t\t\t\t\t\treturn 'origin';\n\t\t\t\t\t// supported boundaries\n\t\t\t\t\tcase 'origin':\n\t\t\t\t\tcase 'start':\n\t\t\t\t\tcase 'end':\n\t\t\t\t\t\treturn fill;\n\t\t\t\t\t// invalid fill values\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction computeBoundary(source) {\n\t\t\t\tvar model = source.el._model || {};\n\t\t\t\tvar scale = source.el._scale || {};\n\t\t\t\tvar fill = source.fill;\n\t\t\t\tvar target = null;\n\t\t\t\tvar horizontal;\n\n\t\t\t\tif (isFinite(fill)) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\t// Backward compatibility: until v3, we still need to support boundary values set on\n\t\t\t\t// the model (scaleTop, scaleBottom and scaleZero) because some external plugins and\n\t\t\t\t// controllers might still use it (e.g. the Smith chart).\n\n\t\t\t\tif (fill === 'start') {\n\t\t\t\t\ttarget = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom;\n\t\t\t\t} else if (fill === 'end') {\n\t\t\t\t\ttarget = model.scaleTop === undefined ? scale.top : model.scaleTop;\n\t\t\t\t} else if (model.scaleZero !== undefined) {\n\t\t\t\t\ttarget = model.scaleZero;\n\t\t\t\t} else if (scale.getBasePosition) {\n\t\t\t\t\ttarget = scale.getBasePosition();\n\t\t\t\t} else if (scale.getBasePixel) {\n\t\t\t\t\ttarget = scale.getBasePixel();\n\t\t\t\t}\n\n\t\t\t\tif (target !== undefined && target !== null) {\n\t\t\t\t\tif (target.x !== undefined && target.y !== undefined) {\n\t\t\t\t\t\treturn target;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (typeof target === 'number' && isFinite(target)) {\n\t\t\t\t\t\thorizontal = scale.isHorizontal();\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tx: horizontal ? target : null,\n\t\t\t\t\t\t\ty: horizontal ? null : target\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tfunction resolveTarget(sources, index, propagate) {\n\t\t\t\tvar source = sources[index];\n\t\t\t\tvar fill = source.fill;\n\t\t\t\tvar visited = [index];\n\t\t\t\tvar target;\n\n\t\t\t\tif (!propagate) {\n\t\t\t\t\treturn fill;\n\t\t\t\t}\n\n\t\t\t\twhile (fill !== false && visited.indexOf(fill) === -1) {\n\t\t\t\t\tif (!isFinite(fill)) {\n\t\t\t\t\t\treturn fill;\n\t\t\t\t\t}\n\n\t\t\t\t\ttarget = sources[fill];\n\t\t\t\t\tif (!target) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (target.visible) {\n\t\t\t\t\t\treturn fill;\n\t\t\t\t\t}\n\n\t\t\t\t\tvisited.push(fill);\n\t\t\t\t\tfill = target.fill;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfunction createMapper(source) {\n\t\t\t\tvar fill = source.fill;\n\t\t\t\tvar type = 'dataset';\n\n\t\t\t\tif (fill === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tif (!isFinite(fill)) {\n\t\t\t\t\ttype = 'boundary';\n\t\t\t\t}\n\n\t\t\t\treturn mappers[type](source);\n\t\t\t}\n\n\t\t\tfunction isDrawable(point) {\n\t\t\t\treturn point && !point.skip;\n\t\t\t}\n\n\t\t\tfunction drawArea(ctx, curve0, curve1, len0, len1) {\n\t\t\t\tvar i;\n\n\t\t\t\tif (!len0 || !len1) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// building first area curve (normal)\n\t\t\t\tctx.moveTo(curve0[0].x, curve0[0].y);\n\t\t\t\tfor (i = 1; i < len0; ++i) {\n\t\t\t\t\thelpers.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);\n\t\t\t\t}\n\n\t\t\t\t// joining the two area curves\n\t\t\t\tctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);\n\n\t\t\t\t// building opposite area curve (reverse)\n\t\t\t\tfor (i = len1 - 1; i > 0; --i) {\n\t\t\t\t\thelpers.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction doFill(ctx, points, mapper, view, color, loop) {\n\t\t\t\tvar count = points.length;\n\t\t\t\tvar span = view.spanGaps;\n\t\t\t\tvar curve0 = [];\n\t\t\t\tvar curve1 = [];\n\t\t\t\tvar len0 = 0;\n\t\t\t\tvar len1 = 0;\n\t\t\t\tvar i, ilen, index, p0, p1, d0, d1;\n\n\t\t\t\tctx.beginPath();\n\n\t\t\t\tfor (i = 0, ilen = count + !!loop; i < ilen; ++i) {\n\t\t\t\t\tindex = i % count;\n\t\t\t\t\tp0 = points[index]._view;\n\t\t\t\t\tp1 = mapper(p0, index, view);\n\t\t\t\t\td0 = isDrawable(p0);\n\t\t\t\t\td1 = isDrawable(p1);\n\n\t\t\t\t\tif (d0 && d1) {\n\t\t\t\t\t\tlen0 = curve0.push(p0);\n\t\t\t\t\t\tlen1 = curve1.push(p1);\n\t\t\t\t\t} else if (len0 && len1) {\n\t\t\t\t\t\tif (!span) {\n\t\t\t\t\t\t\tdrawArea(ctx, curve0, curve1, len0, len1);\n\t\t\t\t\t\t\tlen0 = len1 = 0;\n\t\t\t\t\t\t\tcurve0 = [];\n\t\t\t\t\t\t\tcurve1 = [];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (d0) {\n\t\t\t\t\t\t\t\tcurve0.push(p0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (d1) {\n\t\t\t\t\t\t\t\tcurve1.push(p1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tdrawArea(ctx, curve0, curve1, len0, len1);\n\n\t\t\t\tctx.closePath();\n\t\t\t\tctx.fillStyle = color;\n\t\t\t\tctx.fill();\n\t\t\t}\n\n\t\t\tmodule.exports = {\n\t\t\t\tid: 'filler',\n\n\t\t\t\tafterDatasetsUpdate: function afterDatasetsUpdate(chart, options) {\n\t\t\t\t\tvar count = (chart.data.datasets || []).length;\n\t\t\t\t\tvar propagate = options.propagate;\n\t\t\t\t\tvar sources = [];\n\t\t\t\t\tvar meta, i, el, source;\n\n\t\t\t\t\tfor (i = 0; i < count; ++i) {\n\t\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\t\tel = meta.dataset;\n\t\t\t\t\t\tsource = null;\n\n\t\t\t\t\t\tif (el && el._model && el instanceof elements.Line) {\n\t\t\t\t\t\t\tsource = {\n\t\t\t\t\t\t\t\tvisible: chart.isDatasetVisible(i),\n\t\t\t\t\t\t\t\tfill: decodeFill(el, i, count),\n\t\t\t\t\t\t\t\tchart: chart,\n\t\t\t\t\t\t\t\tel: el\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmeta.$filler = source;\n\t\t\t\t\t\tsources.push(source);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i = 0; i < count; ++i) {\n\t\t\t\t\t\tsource = sources[i];\n\t\t\t\t\t\tif (!source) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsource.fill = resolveTarget(sources, i, propagate);\n\t\t\t\t\t\tsource.boundary = computeBoundary(source);\n\t\t\t\t\t\tsource.mapper = createMapper(source);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tbeforeDatasetDraw: function beforeDatasetDraw(chart, args) {\n\t\t\t\t\tvar meta = args.meta.$filler;\n\t\t\t\t\tif (!meta) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar ctx = chart.ctx;\n\t\t\t\t\tvar el = meta.el;\n\t\t\t\t\tvar view = el._view;\n\t\t\t\t\tvar points = el._children || [];\n\t\t\t\t\tvar mapper = meta.mapper;\n\t\t\t\t\tvar color = view.backgroundColor || defaults.global.defaultColor;\n\n\t\t\t\t\tif (mapper && color && points.length) {\n\t\t\t\t\t\thelpers.canvas.clipArea(ctx, chart.chartArea);\n\t\t\t\t\t\tdoFill(ctx, points, mapper, view, color, el._loop);\n\t\t\t\t\t\thelpers.canvas.unclipArea(ctx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"26\": 26, \"41\": 41, \"46\": 46 }], 52: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\t\t\tvar helpers = require(46);\n\t\t\tvar layouts = require(31);\n\n\t\t\tvar noop = helpers.noop;\n\n\t\t\tdefaults._set('global', {\n\t\t\t\tlegend: {\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\tfullWidth: true,\n\t\t\t\t\treverse: false,\n\t\t\t\t\tweight: 1000,\n\n\t\t\t\t\t// a callback that will handle\n\t\t\t\t\tonClick: function onClick(e, legendItem) {\n\t\t\t\t\t\tvar index = legendItem.datasetIndex;\n\t\t\t\t\t\tvar ci = this.chart;\n\t\t\t\t\t\tvar meta = ci.getDatasetMeta(index);\n\n\t\t\t\t\t\t// See controller.isDatasetVisible comment\n\t\t\t\t\t\tmeta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;\n\n\t\t\t\t\t\t// We hid a dataset ... rerender the chart\n\t\t\t\t\t\tci.update();\n\t\t\t\t\t},\n\n\t\t\t\t\tonHover: null,\n\n\t\t\t\t\tlabels: {\n\t\t\t\t\t\tboxWidth: 40,\n\t\t\t\t\t\tpadding: 10,\n\t\t\t\t\t\t// Generates labels shown in the legend\n\t\t\t\t\t\t// Valid properties to return:\n\t\t\t\t\t\t// text : text to display\n\t\t\t\t\t\t// fillStyle : fill of coloured box\n\t\t\t\t\t\t// strokeStyle: stroke of coloured box\n\t\t\t\t\t\t// hidden : if this legend item refers to a hidden item\n\t\t\t\t\t\t// lineCap : cap style for line\n\t\t\t\t\t\t// lineDash\n\t\t\t\t\t\t// lineDashOffset :\n\t\t\t\t\t\t// lineJoin :\n\t\t\t\t\t\t// lineWidth :\n\t\t\t\t\t\tgenerateLabels: function generateLabels(chart) {\n\t\t\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\t\t\treturn helpers.isArray(data.datasets) ? data.datasets.map(function (dataset, i) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttext: dataset.label,\n\t\t\t\t\t\t\t\t\tfillStyle: !helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0],\n\t\t\t\t\t\t\t\t\thidden: !chart.isDatasetVisible(i),\n\t\t\t\t\t\t\t\t\tlineCap: dataset.borderCapStyle,\n\t\t\t\t\t\t\t\t\tlineDash: dataset.borderDash,\n\t\t\t\t\t\t\t\t\tlineDashOffset: dataset.borderDashOffset,\n\t\t\t\t\t\t\t\t\tlineJoin: dataset.borderJoinStyle,\n\t\t\t\t\t\t\t\t\tlineWidth: dataset.borderWidth,\n\t\t\t\t\t\t\t\t\tstrokeStyle: dataset.borderColor,\n\t\t\t\t\t\t\t\t\tpointStyle: dataset.pointStyle,\n\n\t\t\t\t\t\t\t\t\t// Below is extra data used for toggling the datasets\n\t\t\t\t\t\t\t\t\tdatasetIndex: i\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}, this) : [];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tlegendCallback: function legendCallback(chart) {\n\t\t\t\t\tvar text = [];\n\t\t\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\t\t\t\t\tfor (var i = 0; i < chart.data.datasets.length; i++) {\n\t\t\t\t\t\ttext.push('<li><span style=\"background-color:' + chart.data.datasets[i].backgroundColor + '\"></span>');\n\t\t\t\t\t\tif (chart.data.datasets[i].label) {\n\t\t\t\t\t\t\ttext.push(chart.data.datasets[i].label);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttext.push('</li>');\n\t\t\t\t\t}\n\t\t\t\t\ttext.push('</ul>');\n\t\t\t\t\treturn text.join('');\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n * Helper function to get the box width based on the usePointStyle option\n * @param labelopts {Object} the label options on the legend\n * @param fontSize {Number} the label font size\n * @return {Number} width of the color box area\n */\n\t\t\tfunction getBoxWidth(labelOpts, fontSize) {\n\t\t\t\treturn labelOpts.usePointStyle ? fontSize * Math.SQRT2 : labelOpts.boxWidth;\n\t\t\t}\n\n\t\t\t/**\n * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\n */\n\t\t\tvar Legend = Element.extend({\n\n\t\t\t\tinitialize: function initialize(config) {\n\t\t\t\t\thelpers.extend(this, config);\n\n\t\t\t\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\t\t\t\tthis.legendHitBoxes = [];\n\n\t\t\t\t\t// Are we in doughnut mode which has a different data type\n\t\t\t\t\tthis.doughnutMode = false;\n\t\t\t\t},\n\n\t\t\t\t// These methods are ordered by lifecycle. Utilities then follow.\n\t\t\t\t// Any function defined here is inherited by all legend types.\n\t\t\t\t// Any function can be extended by the legend type\n\n\t\t\t\tbeforeUpdate: noop,\n\t\t\t\tupdate: function update(maxWidth, maxHeight, margins) {\n\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\t\t\tme.beforeUpdate();\n\n\t\t\t\t\t// Absorb the master measurements\n\t\t\t\t\tme.maxWidth = maxWidth;\n\t\t\t\t\tme.maxHeight = maxHeight;\n\t\t\t\t\tme.margins = margins;\n\n\t\t\t\t\t// Dimensions\n\t\t\t\t\tme.beforeSetDimensions();\n\t\t\t\t\tme.setDimensions();\n\t\t\t\t\tme.afterSetDimensions();\n\t\t\t\t\t// Labels\n\t\t\t\t\tme.beforeBuildLabels();\n\t\t\t\t\tme.buildLabels();\n\t\t\t\t\tme.afterBuildLabels();\n\n\t\t\t\t\t// Fit\n\t\t\t\t\tme.beforeFit();\n\t\t\t\t\tme.fit();\n\t\t\t\t\tme.afterFit();\n\t\t\t\t\t//\n\t\t\t\t\tme.afterUpdate();\n\n\t\t\t\t\treturn me.minSize;\n\t\t\t\t},\n\t\t\t\tafterUpdate: noop,\n\n\t\t\t\t//\n\n\t\t\t\tbeforeSetDimensions: noop,\n\t\t\t\tsetDimensions: function setDimensions() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t// Reset position before calculating rotation\n\t\t\t\t\t\tme.width = me.maxWidth;\n\t\t\t\t\t\tme.left = 0;\n\t\t\t\t\t\tme.right = me.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t\t\t// Reset position before calculating rotation\n\t\t\t\t\t\tme.top = 0;\n\t\t\t\t\t\tme.bottom = me.height;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Reset padding\n\t\t\t\t\tme.paddingLeft = 0;\n\t\t\t\t\tme.paddingTop = 0;\n\t\t\t\t\tme.paddingRight = 0;\n\t\t\t\t\tme.paddingBottom = 0;\n\n\t\t\t\t\t// Reset minSize\n\t\t\t\t\tme.minSize = {\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tafterSetDimensions: noop,\n\n\t\t\t\t//\n\n\t\t\t\tbeforeBuildLabels: noop,\n\t\t\t\tbuildLabels: function buildLabels() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar labelOpts = me.options.labels || {};\n\t\t\t\t\tvar legendItems = helpers.callback(labelOpts.generateLabels, [me.chart], me) || [];\n\n\t\t\t\t\tif (labelOpts.filter) {\n\t\t\t\t\t\tlegendItems = legendItems.filter(function (item) {\n\t\t\t\t\t\t\treturn labelOpts.filter(item, me.chart.data);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (me.options.reverse) {\n\t\t\t\t\t\tlegendItems.reverse();\n\t\t\t\t\t}\n\n\t\t\t\t\tme.legendItems = legendItems;\n\t\t\t\t},\n\t\t\t\tafterBuildLabels: noop,\n\n\t\t\t\t//\n\n\t\t\t\tbeforeFit: noop,\n\t\t\t\tfit: function fit() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\tvar labelOpts = opts.labels;\n\t\t\t\t\tvar display = opts.display;\n\n\t\t\t\t\tvar ctx = me.ctx;\n\n\t\t\t\t\tvar globalDefault = defaults.global;\n\t\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\t\t\tvar fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n\t\t\t\t\tvar fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n\t\t\t\t\tvar fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n\t\t\t\t\tvar labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\t\t\t\t// Reset hit boxes\n\t\t\t\t\tvar hitboxes = me.legendHitBoxes = [];\n\n\t\t\t\t\tvar minSize = me.minSize;\n\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\t\t\t\tminSize.height = display ? 10 : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tminSize.width = display ? 10 : 0;\n\t\t\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t\t\t}\n\n\t\t\t\t\t// Increase sizes here\n\t\t\t\t\tif (display) {\n\t\t\t\t\t\tctx.font = labelFont;\n\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\t// Labels\n\n\t\t\t\t\t\t\t// Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n\t\t\t\t\t\t\tvar lineWidths = me.lineWidths = [0];\n\t\t\t\t\t\t\tvar totalHeight = me.legendItems.length ? fontSize + labelOpts.padding : 0;\n\n\t\t\t\t\t\t\tctx.textAlign = 'left';\n\t\t\t\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\t\t\t\thelpers.each(me.legendItems, function (legendItem, i) {\n\t\t\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\t\t\tvar width = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t\t\t\tif (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) {\n\t\t\t\t\t\t\t\t\ttotalHeight += fontSize + labelOpts.padding;\n\t\t\t\t\t\t\t\t\tlineWidths[lineWidths.length] = me.left;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tlineWidths[lineWidths.length - 1] += width + labelOpts.padding;\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tminSize.height += totalHeight;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar vPadding = labelOpts.padding;\n\t\t\t\t\t\t\tvar columnWidths = me.columnWidths = [];\n\t\t\t\t\t\t\tvar totalWidth = labelOpts.padding;\n\t\t\t\t\t\t\tvar currentColWidth = 0;\n\t\t\t\t\t\t\tvar currentColHeight = 0;\n\t\t\t\t\t\t\tvar itemHeight = fontSize + vPadding;\n\n\t\t\t\t\t\t\thelpers.each(me.legendItems, function (legendItem, i) {\n\t\t\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\t\t\tvar itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t\t\t\t// If too tall, go to new column\n\t\t\t\t\t\t\t\tif (currentColHeight + itemHeight > minSize.height) {\n\t\t\t\t\t\t\t\t\ttotalWidth += currentColWidth + labelOpts.padding;\n\t\t\t\t\t\t\t\t\tcolumnWidths.push(currentColWidth); // previous column width\n\n\t\t\t\t\t\t\t\t\tcurrentColWidth = 0;\n\t\t\t\t\t\t\t\t\tcurrentColHeight = 0;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Get max width\n\t\t\t\t\t\t\t\tcurrentColWidth = Math.max(currentColWidth, itemWidth);\n\t\t\t\t\t\t\t\tcurrentColHeight += itemHeight;\n\n\t\t\t\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\twidth: itemWidth,\n\t\t\t\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\ttotalWidth += currentColWidth;\n\t\t\t\t\t\t\tcolumnWidths.push(currentColWidth);\n\t\t\t\t\t\t\tminSize.width += totalWidth;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tme.width = minSize.width;\n\t\t\t\t\tme.height = minSize.height;\n\t\t\t\t},\n\t\t\t\tafterFit: noop,\n\n\t\t\t\t// Shared Methods\n\t\t\t\tisHorizontal: function isHorizontal() {\n\t\t\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t\t\t},\n\n\t\t\t\t// Actually draw the legend on the canvas\n\t\t\t\tdraw: function draw() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\tvar labelOpts = opts.labels;\n\t\t\t\t\tvar globalDefault = defaults.global;\n\t\t\t\t\tvar lineDefault = globalDefault.elements.line;\n\t\t\t\t\tvar legendWidth = me.width;\n\t\t\t\t\tvar lineWidths = me.lineWidths;\n\n\t\t\t\t\tif (opts.display) {\n\t\t\t\t\t\tvar ctx = me.ctx;\n\t\t\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\t\t\t\tvar fontColor = valueOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor);\n\t\t\t\t\t\tvar fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n\t\t\t\t\t\tvar fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n\t\t\t\t\t\tvar fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n\t\t\t\t\t\tvar labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\t\t\t\t\t\tvar cursor;\n\n\t\t\t\t\t\t// Canvas setup\n\t\t\t\t\t\tctx.textAlign = 'left';\n\t\t\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\t\t\tctx.lineWidth = 0.5;\n\t\t\t\t\t\tctx.strokeStyle = fontColor; // for strikethrough effect\n\t\t\t\t\t\tctx.fillStyle = fontColor; // render in correct colour\n\t\t\t\t\t\tctx.font = labelFont;\n\n\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\tvar hitboxes = me.legendHitBoxes;\n\n\t\t\t\t\t\t// current position\n\t\t\t\t\t\tvar drawLegendBox = function drawLegendBox(x, y, legendItem) {\n\t\t\t\t\t\t\tif (isNaN(boxWidth) || boxWidth <= 0) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Set the ctx for the box\n\t\t\t\t\t\t\tctx.save();\n\n\t\t\t\t\t\t\tctx.fillStyle = valueOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\n\t\t\t\t\t\t\tctx.lineCap = valueOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\n\t\t\t\t\t\t\tctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\n\t\t\t\t\t\t\tctx.lineJoin = valueOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\n\t\t\t\t\t\t\tctx.lineWidth = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\n\t\t\t\t\t\t\tctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\n\t\t\t\t\t\t\tvar isLineWidthZero = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0;\n\n\t\t\t\t\t\t\tif (ctx.setLineDash) {\n\t\t\t\t\t\t\t\t// IE 9 and 10 do not support line dash\n\t\t\t\t\t\t\t\tctx.setLineDash(valueOrDefault(legendItem.lineDash, lineDefault.borderDash));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (opts.labels && opts.labels.usePointStyle) {\n\t\t\t\t\t\t\t\t// Recalculate x and y for drawPoint() because its expecting\n\t\t\t\t\t\t\t\t// x and y to be center of figure (instead of top left)\n\t\t\t\t\t\t\t\tvar radius = fontSize * Math.SQRT2 / 2;\n\t\t\t\t\t\t\t\tvar offSet = radius / Math.SQRT2;\n\t\t\t\t\t\t\t\tvar centerX = x + offSet;\n\t\t\t\t\t\t\t\tvar centerY = y + offSet;\n\n\t\t\t\t\t\t\t\t// Draw pointStyle as legend symbol\n\t\t\t\t\t\t\t\thelpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Draw box as legend symbol\n\t\t\t\t\t\t\t\tif (!isLineWidthZero) {\n\t\t\t\t\t\t\t\t\tctx.strokeRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tctx.fillRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t};\n\t\t\t\t\t\tvar fillText = function fillText(x, y, legendItem, textWidth) {\n\t\t\t\t\t\t\tvar halfFontSize = fontSize / 2;\n\t\t\t\t\t\t\tvar xLeft = boxWidth + halfFontSize + x;\n\t\t\t\t\t\t\tvar yMiddle = y + halfFontSize;\n\n\t\t\t\t\t\t\tctx.fillText(legendItem.text, xLeft, yMiddle);\n\n\t\t\t\t\t\t\tif (legendItem.hidden) {\n\t\t\t\t\t\t\t\t// Strikethrough the text if hidden\n\t\t\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\t\t\tctx.lineWidth = 2;\n\t\t\t\t\t\t\t\tctx.moveTo(xLeft, yMiddle);\n\t\t\t\t\t\t\t\tctx.lineTo(xLeft + textWidth, yMiddle);\n\t\t\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Horizontal\n\t\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\tcursor = {\n\t\t\t\t\t\t\t\tx: me.left + (legendWidth - lineWidths[0]) / 2,\n\t\t\t\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\t\t\t\tline: 0\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcursor = {\n\t\t\t\t\t\t\t\tx: me.left + labelOpts.padding,\n\t\t\t\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\t\t\t\tline: 0\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar itemHeight = fontSize + labelOpts.padding;\n\t\t\t\t\t\thelpers.each(me.legendItems, function (legendItem, i) {\n\t\t\t\t\t\t\tvar textWidth = ctx.measureText(legendItem.text).width;\n\t\t\t\t\t\t\tvar width = boxWidth + fontSize / 2 + textWidth;\n\t\t\t\t\t\t\tvar x = cursor.x;\n\t\t\t\t\t\t\tvar y = cursor.y;\n\n\t\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\t\tif (x + width >= legendWidth) {\n\t\t\t\t\t\t\t\t\ty = cursor.y += itemHeight;\n\t\t\t\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t\t\t\t\tx = cursor.x = me.left + (legendWidth - lineWidths[cursor.line]) / 2;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (y + itemHeight > me.bottom) {\n\t\t\t\t\t\t\t\tx = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\n\t\t\t\t\t\t\t\ty = cursor.y = me.top + labelOpts.padding;\n\t\t\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tdrawLegendBox(x, y, legendItem);\n\n\t\t\t\t\t\t\thitboxes[i].left = x;\n\t\t\t\t\t\t\thitboxes[i].top = y;\n\n\t\t\t\t\t\t\t// Fill the actual label\n\t\t\t\t\t\t\tfillText(x, y, legendItem, textWidth);\n\n\t\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\t\tcursor.x += width + labelOpts.padding;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcursor.y += itemHeight;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Handle an event\n * @private\n * @param {IEvent} event - The event to handle\n * @return {Boolean} true if a change occured\n */\n\t\t\t\thandleEvent: function handleEvent(e) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\tvar type = e.type === 'mouseup' ? 'click' : e.type;\n\t\t\t\t\tvar changed = false;\n\n\t\t\t\t\tif (type === 'mousemove') {\n\t\t\t\t\t\tif (!opts.onHover) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (type === 'click') {\n\t\t\t\t\t\tif (!opts.onClick) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Chart event already has relative position in it\n\t\t\t\t\tvar x = e.x;\n\t\t\t\t\tvar y = e.y;\n\n\t\t\t\t\tif (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n\t\t\t\t\t\t// See if we are touching one of the dataset boxes\n\t\t\t\t\t\tvar lh = me.legendHitBoxes;\n\t\t\t\t\t\tfor (var i = 0; i < lh.length; ++i) {\n\t\t\t\t\t\t\tvar hitBox = lh[i];\n\n\t\t\t\t\t\t\tif (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n\t\t\t\t\t\t\t\t// Touching an element\n\t\t\t\t\t\t\t\tif (type === 'click') {\n\t\t\t\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\t\t\t\topts.onClick.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t} else if (type === 'mousemove') {\n\t\t\t\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\t\t\t\topts.onHover.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn changed;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfunction createNewLegendAndAttach(chart, legendOpts) {\n\t\t\t\tvar legend = new Legend({\n\t\t\t\t\tctx: chart.ctx,\n\t\t\t\t\toptions: legendOpts,\n\t\t\t\t\tchart: chart\n\t\t\t\t});\n\n\t\t\t\tlayouts.configure(chart, legend, legendOpts);\n\t\t\t\tlayouts.addBox(chart, legend);\n\t\t\t\tchart.legend = legend;\n\t\t\t}\n\n\t\t\tmodule.exports = {\n\t\t\t\tid: 'legend',\n\n\t\t\t\t/**\n * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making\n * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of\n * the plugin, which one will be re-exposed in the chart.js file.\n * https://github.com/chartjs/Chart.js/pull/2640\n * @private\n */\n\t\t\t\t_element: Legend,\n\n\t\t\t\tbeforeInit: function beforeInit(chart) {\n\t\t\t\t\tvar legendOpts = chart.options.legend;\n\n\t\t\t\t\tif (legendOpts) {\n\t\t\t\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tbeforeUpdate: function beforeUpdate(chart) {\n\t\t\t\t\tvar legendOpts = chart.options.legend;\n\t\t\t\t\tvar legend = chart.legend;\n\n\t\t\t\t\tif (legendOpts) {\n\t\t\t\t\t\thelpers.mergeIf(legendOpts, defaults.global.legend);\n\n\t\t\t\t\t\tif (legend) {\n\t\t\t\t\t\t\tlayouts.configure(chart, legend, legendOpts);\n\t\t\t\t\t\t\tlegend.options = legendOpts;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (legend) {\n\t\t\t\t\t\tlayouts.removeBox(chart, legend);\n\t\t\t\t\t\tdelete chart.legend;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tafterEvent: function afterEvent(chart, e) {\n\t\t\t\t\tvar legend = chart.legend;\n\t\t\t\t\tif (legend) {\n\t\t\t\t\t\tlegend.handleEvent(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"26\": 26, \"27\": 27, \"31\": 31, \"46\": 46 }], 53: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\t\t\tvar helpers = require(46);\n\t\t\tvar layouts = require(31);\n\n\t\t\tvar noop = helpers.noop;\n\n\t\t\tdefaults._set('global', {\n\t\t\t\ttitle: {\n\t\t\t\t\tdisplay: false,\n\t\t\t\t\tfontStyle: 'bold',\n\t\t\t\t\tfullWidth: true,\n\t\t\t\t\tlineHeight: 1.2,\n\t\t\t\t\tpadding: 10,\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\ttext: '',\n\t\t\t\t\tweight: 2000 // by default greater than legend (1000) to be above\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\n */\n\t\t\tvar Title = Element.extend({\n\t\t\t\tinitialize: function initialize(config) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\thelpers.extend(me, config);\n\n\t\t\t\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\t\t\t\tme.legendHitBoxes = [];\n\t\t\t\t},\n\n\t\t\t\t// These methods are ordered by lifecycle. Utilities then follow.\n\n\t\t\t\tbeforeUpdate: noop,\n\t\t\t\tupdate: function update(maxWidth, maxHeight, margins) {\n\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\t\t\tme.beforeUpdate();\n\n\t\t\t\t\t// Absorb the master measurements\n\t\t\t\t\tme.maxWidth = maxWidth;\n\t\t\t\t\tme.maxHeight = maxHeight;\n\t\t\t\t\tme.margins = margins;\n\n\t\t\t\t\t// Dimensions\n\t\t\t\t\tme.beforeSetDimensions();\n\t\t\t\t\tme.setDimensions();\n\t\t\t\t\tme.afterSetDimensions();\n\t\t\t\t\t// Labels\n\t\t\t\t\tme.beforeBuildLabels();\n\t\t\t\t\tme.buildLabels();\n\t\t\t\t\tme.afterBuildLabels();\n\n\t\t\t\t\t// Fit\n\t\t\t\t\tme.beforeFit();\n\t\t\t\t\tme.fit();\n\t\t\t\t\tme.afterFit();\n\t\t\t\t\t//\n\t\t\t\t\tme.afterUpdate();\n\n\t\t\t\t\treturn me.minSize;\n\t\t\t\t},\n\t\t\t\tafterUpdate: noop,\n\n\t\t\t\t//\n\n\t\t\t\tbeforeSetDimensions: noop,\n\t\t\t\tsetDimensions: function setDimensions() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t// Reset position before calculating rotation\n\t\t\t\t\t\tme.width = me.maxWidth;\n\t\t\t\t\t\tme.left = 0;\n\t\t\t\t\t\tme.right = me.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t\t\t// Reset position before calculating rotation\n\t\t\t\t\t\tme.top = 0;\n\t\t\t\t\t\tme.bottom = me.height;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Reset padding\n\t\t\t\t\tme.paddingLeft = 0;\n\t\t\t\t\tme.paddingTop = 0;\n\t\t\t\t\tme.paddingRight = 0;\n\t\t\t\t\tme.paddingBottom = 0;\n\n\t\t\t\t\t// Reset minSize\n\t\t\t\t\tme.minSize = {\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tafterSetDimensions: noop,\n\n\t\t\t\t//\n\n\t\t\t\tbeforeBuildLabels: noop,\n\t\t\t\tbuildLabels: noop,\n\t\t\t\tafterBuildLabels: noop,\n\n\t\t\t\t//\n\n\t\t\t\tbeforeFit: noop,\n\t\t\t\tfit: function fit() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\tvar display = opts.display;\n\t\t\t\t\tvar fontSize = valueOrDefault(opts.fontSize, defaults.global.defaultFontSize);\n\t\t\t\t\tvar minSize = me.minSize;\n\t\t\t\t\tvar lineCount = helpers.isArray(opts.text) ? opts.text.length : 1;\n\t\t\t\t\tvar lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n\t\t\t\t\tvar textSize = display ? lineCount * lineHeight + opts.padding * 2 : 0;\n\n\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\t\t\t\tminSize.height = textSize;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tminSize.width = textSize;\n\t\t\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t\t\t}\n\n\t\t\t\t\tme.width = minSize.width;\n\t\t\t\t\tme.height = minSize.height;\n\t\t\t\t},\n\t\t\t\tafterFit: noop,\n\n\t\t\t\t// Shared Methods\n\t\t\t\tisHorizontal: function isHorizontal() {\n\t\t\t\t\tvar pos = this.options.position;\n\t\t\t\t\treturn pos === 'top' || pos === 'bottom';\n\t\t\t\t},\n\n\t\t\t\t// Actually draw the title block on the canvas\n\t\t\t\tdraw: function draw() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar ctx = me.ctx;\n\t\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\tvar globalDefaults = defaults.global;\n\n\t\t\t\t\tif (opts.display) {\n\t\t\t\t\t\tvar fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\t\t\tvar fontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\t\t\tvar fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\t\t\t\tvar titleFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\t\t\t\t\t\tvar lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n\t\t\t\t\t\tvar offset = lineHeight / 2 + opts.padding;\n\t\t\t\t\t\tvar rotation = 0;\n\t\t\t\t\t\tvar top = me.top;\n\t\t\t\t\t\tvar left = me.left;\n\t\t\t\t\t\tvar bottom = me.bottom;\n\t\t\t\t\t\tvar right = me.right;\n\t\t\t\t\t\tvar maxWidth, titleX, titleY;\n\n\t\t\t\t\t\tctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour\n\t\t\t\t\t\tctx.font = titleFont;\n\n\t\t\t\t\t\t// Horizontal\n\t\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t\ttitleX = left + (right - left) / 2; // midpoint of the width\n\t\t\t\t\t\t\ttitleY = top + offset;\n\t\t\t\t\t\t\tmaxWidth = right - left;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttitleX = opts.position === 'left' ? left + offset : right - offset;\n\t\t\t\t\t\t\ttitleY = top + (bottom - top) / 2;\n\t\t\t\t\t\t\tmaxWidth = bottom - top;\n\t\t\t\t\t\t\trotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\tctx.translate(titleX, titleY);\n\t\t\t\t\t\tctx.rotate(rotation);\n\t\t\t\t\t\tctx.textAlign = 'center';\n\t\t\t\t\t\tctx.textBaseline = 'middle';\n\n\t\t\t\t\t\tvar text = opts.text;\n\t\t\t\t\t\tif (helpers.isArray(text)) {\n\t\t\t\t\t\t\tvar y = 0;\n\t\t\t\t\t\t\tfor (var i = 0; i < text.length; ++i) {\n\t\t\t\t\t\t\t\tctx.fillText(text[i], 0, y, maxWidth);\n\t\t\t\t\t\t\t\ty += lineHeight;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tctx.fillText(text, 0, 0, maxWidth);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfunction createNewTitleBlockAndAttach(chart, titleOpts) {\n\t\t\t\tvar title = new Title({\n\t\t\t\t\tctx: chart.ctx,\n\t\t\t\t\toptions: titleOpts,\n\t\t\t\t\tchart: chart\n\t\t\t\t});\n\n\t\t\t\tlayouts.configure(chart, title, titleOpts);\n\t\t\t\tlayouts.addBox(chart, title);\n\t\t\t\tchart.titleBlock = title;\n\t\t\t}\n\n\t\t\tmodule.exports = {\n\t\t\t\tid: 'title',\n\n\t\t\t\t/**\n * Backward compatibility: since 2.1.5, the title is registered as a plugin, making\n * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of\n * the plugin, which one will be re-exposed in the chart.js file.\n * https://github.com/chartjs/Chart.js/pull/2640\n * @private\n */\n\t\t\t\t_element: Title,\n\n\t\t\t\tbeforeInit: function beforeInit(chart) {\n\t\t\t\t\tvar titleOpts = chart.options.title;\n\n\t\t\t\t\tif (titleOpts) {\n\t\t\t\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tbeforeUpdate: function beforeUpdate(chart) {\n\t\t\t\t\tvar titleOpts = chart.options.title;\n\t\t\t\t\tvar titleBlock = chart.titleBlock;\n\n\t\t\t\t\tif (titleOpts) {\n\t\t\t\t\t\thelpers.mergeIf(titleOpts, defaults.global.title);\n\n\t\t\t\t\t\tif (titleBlock) {\n\t\t\t\t\t\t\tlayouts.configure(chart, titleBlock, titleOpts);\n\t\t\t\t\t\t\ttitleBlock.options = titleOpts;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (titleBlock) {\n\t\t\t\t\t\tlayouts.removeBox(chart, titleBlock);\n\t\t\t\t\t\tdelete chart.titleBlock;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"26\": 26, \"27\": 27, \"31\": 31, \"46\": 46 }], 54: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar Scale = require(33);\n\t\t\tvar scaleService = require(34);\n\n\t\t\tmodule.exports = function () {\n\n\t\t\t\t// Default config for a category scale\n\t\t\t\tvar defaultConfig = {\n\t\t\t\t\tposition: 'bottom'\n\t\t\t\t};\n\n\t\t\t\tvar DatasetScale = Scale.extend({\n\t\t\t\t\t/**\n * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those\n * else fall back to data.labels\n * @private\n */\n\t\t\t\t\tgetLabels: function getLabels() {\n\t\t\t\t\t\tvar data = this.chart.data;\n\t\t\t\t\t\treturn this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;\n\t\t\t\t\t},\n\n\t\t\t\t\tdetermineDataLimits: function determineDataLimits() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar labels = me.getLabels();\n\t\t\t\t\t\tme.minIndex = 0;\n\t\t\t\t\t\tme.maxIndex = labels.length - 1;\n\t\t\t\t\t\tvar findIndex;\n\n\t\t\t\t\t\tif (me.options.ticks.min !== undefined) {\n\t\t\t\t\t\t\t// user specified min value\n\t\t\t\t\t\t\tfindIndex = labels.indexOf(me.options.ticks.min);\n\t\t\t\t\t\t\tme.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (me.options.ticks.max !== undefined) {\n\t\t\t\t\t\t\t// user specified max value\n\t\t\t\t\t\t\tfindIndex = labels.indexOf(me.options.ticks.max);\n\t\t\t\t\t\t\tme.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.min = labels[me.minIndex];\n\t\t\t\t\t\tme.max = labels[me.maxIndex];\n\t\t\t\t\t},\n\n\t\t\t\t\tbuildTicks: function buildTicks() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar labels = me.getLabels();\n\t\t\t\t\t\t// If we are viewing some subset of labels, slice the original array\n\t\t\t\t\t\tme.ticks = me.minIndex === 0 && me.maxIndex === labels.length - 1 ? labels : labels.slice(me.minIndex, me.maxIndex + 1);\n\t\t\t\t\t},\n\n\t\t\t\t\tgetLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar data = me.chart.data;\n\t\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\t\t\t\tif (data.yLabels && !isHorizontal) {\n\t\t\t\t\t\t\treturn me.getRightValue(data.datasets[datasetIndex].data[index]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn me.ticks[index - me.minIndex];\n\t\t\t\t\t},\n\n\t\t\t\t\t// Used to get data value locations. Value can either be an index or a numerical value\n\t\t\t\t\tgetPixelForValue: function getPixelForValue(value, index) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar offset = me.options.offset;\n\t\t\t\t\t\t// 1 is added because we need the length but we have the indexes\n\t\t\t\t\t\tvar offsetAmt = Math.max(me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1), 1);\n\n\t\t\t\t\t\t// If value is a data object, then index is the index in the data array,\n\t\t\t\t\t\t// not the index of the scale. We need to change that.\n\t\t\t\t\t\tvar valueCategory;\n\t\t\t\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\t\t\t\tvalueCategory = me.isHorizontal() ? value.x : value.y;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (valueCategory !== undefined || value !== undefined && isNaN(index)) {\n\t\t\t\t\t\t\tvar labels = me.getLabels();\n\t\t\t\t\t\t\tvalue = valueCategory || value;\n\t\t\t\t\t\t\tvar idx = labels.indexOf(value);\n\t\t\t\t\t\t\tindex = idx !== -1 ? idx : index;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t\tvar valueWidth = me.width / offsetAmt;\n\t\t\t\t\t\t\tvar widthOffset = valueWidth * (index - me.minIndex);\n\n\t\t\t\t\t\t\tif (offset) {\n\t\t\t\t\t\t\t\twidthOffset += valueWidth / 2;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn me.left + Math.round(widthOffset);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar valueHeight = me.height / offsetAmt;\n\t\t\t\t\t\tvar heightOffset = valueHeight * (index - me.minIndex);\n\n\t\t\t\t\t\tif (offset) {\n\t\t\t\t\t\t\theightOffset += valueHeight / 2;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn me.top + Math.round(heightOffset);\n\t\t\t\t\t},\n\t\t\t\t\tgetPixelForTick: function getPixelForTick(index) {\n\t\t\t\t\t\treturn this.getPixelForValue(this.ticks[index], index + this.minIndex, null);\n\t\t\t\t\t},\n\t\t\t\t\tgetValueForPixel: function getValueForPixel(pixel) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar offset = me.options.offset;\n\t\t\t\t\t\tvar value;\n\t\t\t\t\t\tvar offsetAmt = Math.max(me._ticks.length - (offset ? 0 : 1), 1);\n\t\t\t\t\t\tvar horz = me.isHorizontal();\n\t\t\t\t\t\tvar valueDimension = (horz ? me.width : me.height) / offsetAmt;\n\n\t\t\t\t\t\tpixel -= horz ? me.left : me.top;\n\n\t\t\t\t\t\tif (offset) {\n\t\t\t\t\t\t\tpixel -= valueDimension / 2;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (pixel <= 0) {\n\t\t\t\t\t\t\tvalue = 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalue = Math.round(pixel / valueDimension);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn value + me.minIndex;\n\t\t\t\t\t},\n\t\t\t\t\tgetBasePixel: function getBasePixel() {\n\t\t\t\t\t\treturn this.bottom;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tscaleService.registerScaleType('category', DatasetScale, defaultConfig);\n\t\t\t};\n\t\t}, { \"33\": 33, \"34\": 34 }], 55: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\t\t\tvar scaleService = require(34);\n\t\t\tvar Ticks = require(35);\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tvar defaultConfig = {\n\t\t\t\t\tposition: 'left',\n\t\t\t\t\tticks: {\n\t\t\t\t\t\tcallback: Ticks.formatters.linear\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tvar LinearScale = Chart.LinearScaleBase.extend({\n\n\t\t\t\t\tdetermineDataLimits: function determineDataLimits() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\t\tvar datasets = data.datasets;\n\t\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\t\t\tvar DEFAULT_MIN = 0;\n\t\t\t\t\t\tvar DEFAULT_MAX = 1;\n\n\t\t\t\t\t\tfunction IDMatches(meta) {\n\t\t\t\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// First Calculate the range\n\t\t\t\t\t\tme.min = null;\n\t\t\t\t\t\tme.max = null;\n\n\t\t\t\t\t\tvar hasStacks = opts.stacked;\n\t\t\t\t\t\tif (hasStacks === undefined) {\n\t\t\t\t\t\t\thelpers.each(datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && meta.stack !== undefined) {\n\t\t\t\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\t\t\t\thelpers.each(datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t\tvar key = [meta.type,\n\t\t\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t\t\topts.stacked === undefined && meta.stack === undefined ? datasetIndex : '', meta.stack].join('.');\n\n\t\t\t\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\t\t\t\tvaluesPerStack[key] = {\n\t\t\t\t\t\t\t\t\t\tpositiveValues: [],\n\t\t\t\t\t\t\t\t\t\tnegativeValues: []\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Store these per type\n\t\t\t\t\t\t\t\tvar positiveValues = valuesPerStack[key].positiveValues;\n\t\t\t\t\t\t\t\tvar negativeValues = valuesPerStack[key].negativeValues;\n\n\t\t\t\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\t\t\t\thelpers.each(dataset.data, function (rawValue, index) {\n\t\t\t\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tpositiveValues[index] = positiveValues[index] || 0;\n\t\t\t\t\t\t\t\t\t\tnegativeValues[index] = negativeValues[index] || 0;\n\n\t\t\t\t\t\t\t\t\t\tif (opts.relativePoints) {\n\t\t\t\t\t\t\t\t\t\t\tpositiveValues[index] = 100;\n\t\t\t\t\t\t\t\t\t\t} else if (value < 0) {\n\t\t\t\t\t\t\t\t\t\t\tnegativeValues[index] += value;\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tpositiveValues[index] += value;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\thelpers.each(valuesPerStack, function (valuesForType) {\n\t\t\t\t\t\t\t\tvar values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\n\t\t\t\t\t\t\t\tvar minVal = helpers.min(values);\n\t\t\t\t\t\t\t\tvar maxVal = helpers.max(values);\n\t\t\t\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thelpers.each(datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\t\t\t\thelpers.each(dataset.data, function (rawValue, index) {\n\t\t\t\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;\n\t\t\t\t\t\tme.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;\n\n\t\t\t\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\t\t\t\tthis.handleTickRangeOptions();\n\t\t\t\t\t},\n\t\t\t\t\tgetTickLimit: function getTickLimit() {\n\t\t\t\t\t\tvar maxTicks;\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar tickOpts = me.options.ticks;\n\n\t\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// The factor of 2 used to scale the font size has been experimentally determined.\n\t\t\t\t\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, defaults.global.defaultFontSize);\n\t\t\t\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn maxTicks;\n\t\t\t\t\t},\n\t\t\t\t\t// Called after the ticks are built. We need\n\t\t\t\t\thandleDirectionalChanges: function handleDirectionalChanges() {\n\t\t\t\t\t\tif (!this.isHorizontal()) {\n\t\t\t\t\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\n\t\t\t\t\t\t\tthis.ticks.reverse();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tgetLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n\t\t\t\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t\t\t\t},\n\t\t\t\t\t// Utils\n\t\t\t\t\tgetPixelForValue: function getPixelForValue(value) {\n\t\t\t\t\t\t// This must be called after fit has been run so that\n\t\t\t\t\t\t// this.left, this.top, this.right, and this.bottom have been defined\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar start = me.start;\n\n\t\t\t\t\t\tvar rightValue = +me.getRightValue(value);\n\t\t\t\t\t\tvar pixel;\n\t\t\t\t\t\tvar range = me.end - start;\n\n\t\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t\tpixel = me.left + me.width / range * (rightValue - start);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpixel = me.bottom - me.height / range * (rightValue - start);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn pixel;\n\t\t\t\t\t},\n\t\t\t\t\tgetValueForPixel: function getValueForPixel(pixel) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\t\t\tvar innerDimension = isHorizontal ? me.width : me.height;\n\t\t\t\t\t\tvar offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;\n\t\t\t\t\t\treturn me.start + (me.end - me.start) * offset;\n\t\t\t\t\t},\n\t\t\t\t\tgetPixelForTick: function getPixelForTick(index) {\n\t\t\t\t\t\treturn this.getPixelForValue(this.ticksAsNumbers[index]);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tscaleService.registerScaleType('linear', LinearScale, defaultConfig);\n\t\t\t};\n\t\t}, { \"26\": 26, \"34\": 34, \"35\": 35, \"46\": 46 }], 56: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\t\t\tvar Scale = require(33);\n\n\t\t\t/**\n * Generate a set of linear ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {Array<Number>} array of tick values\n */\n\t\t\tfunction generateTicks(generationOptions, dataRange) {\n\t\t\t\tvar ticks = [];\n\t\t\t\t// To get a \"nice\" value for the tick spacing, we will use the appropriately named\n\t\t\t\t// \"nice number\" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n\t\t\t\t// for details.\n\n\t\t\t\tvar factor;\n\t\t\t\tvar precision;\n\t\t\t\tvar spacing;\n\n\t\t\t\tif (generationOptions.stepSize && generationOptions.stepSize > 0) {\n\t\t\t\t\tspacing = generationOptions.stepSize;\n\t\t\t\t} else {\n\t\t\t\t\tvar niceRange = helpers.niceNum(dataRange.max - dataRange.min, false);\n\t\t\t\t\tspacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true);\n\n\t\t\t\t\tprecision = generationOptions.precision;\n\t\t\t\t\tif (precision !== undefined) {\n\t\t\t\t\t\t// If the user specified a precision, round to that number of decimal places\n\t\t\t\t\t\tfactor = Math.pow(10, precision);\n\t\t\t\t\t\tspacing = Math.ceil(spacing * factor) / factor;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar niceMin = Math.floor(dataRange.min / spacing) * spacing;\n\t\t\t\tvar niceMax = Math.ceil(dataRange.max / spacing) * spacing;\n\n\t\t\t\t// If min, max and stepSize is set and they make an evenly spaced scale use it.\n\t\t\t\tif (!helpers.isNullOrUndef(generationOptions.min) && !helpers.isNullOrUndef(generationOptions.max) && generationOptions.stepSize) {\n\t\t\t\t\t// If very close to our whole number, use it.\n\t\t\t\t\tif (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) {\n\t\t\t\t\t\tniceMin = generationOptions.min;\n\t\t\t\t\t\tniceMax = generationOptions.max;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar numSpaces = (niceMax - niceMin) / spacing;\n\t\t\t\t// If very close to our rounded value, use it.\n\t\t\t\tif (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n\t\t\t\t\tnumSpaces = Math.round(numSpaces);\n\t\t\t\t} else {\n\t\t\t\t\tnumSpaces = Math.ceil(numSpaces);\n\t\t\t\t}\n\n\t\t\t\tprecision = 1;\n\t\t\t\tif (spacing < 1) {\n\t\t\t\t\tprecision = Math.pow(10, 1 - Math.floor(helpers.log10(spacing)));\n\t\t\t\t\tniceMin = Math.round(niceMin * precision) / precision;\n\t\t\t\t\tniceMax = Math.round(niceMax * precision) / precision;\n\t\t\t\t}\n\t\t\t\tticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin);\n\t\t\t\tfor (var j = 1; j < numSpaces; ++j) {\n\t\t\t\t\tticks.push(Math.round((niceMin + j * spacing) * precision) / precision);\n\t\t\t\t}\n\t\t\t\tticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax);\n\n\t\t\t\treturn ticks;\n\t\t\t}\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tvar noop = helpers.noop;\n\n\t\t\t\tChart.LinearScaleBase = Scale.extend({\n\t\t\t\t\tgetRightValue: function getRightValue(value) {\n\t\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\t\treturn +value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn Scale.prototype.getRightValue.call(this, value);\n\t\t\t\t\t},\n\n\t\t\t\t\thandleTickRangeOptions: function handleTickRangeOptions() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t\t\t\t// If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\n\t\t\t\t\t\t// do nothing since that would make the chart weird. If the user really wants a weird chart\n\t\t\t\t\t\t// axis, they can manually override it\n\t\t\t\t\t\tif (tickOpts.beginAtZero) {\n\t\t\t\t\t\t\tvar minSign = helpers.sign(me.min);\n\t\t\t\t\t\t\tvar maxSign = helpers.sign(me.max);\n\n\t\t\t\t\t\t\tif (minSign < 0 && maxSign < 0) {\n\t\t\t\t\t\t\t\t// move the top up to 0\n\t\t\t\t\t\t\t\tme.max = 0;\n\t\t\t\t\t\t\t} else if (minSign > 0 && maxSign > 0) {\n\t\t\t\t\t\t\t\t// move the bottom down to 0\n\t\t\t\t\t\t\t\tme.min = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined;\n\t\t\t\t\t\tvar setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined;\n\n\t\t\t\t\t\tif (tickOpts.min !== undefined) {\n\t\t\t\t\t\t\tme.min = tickOpts.min;\n\t\t\t\t\t\t} else if (tickOpts.suggestedMin !== undefined) {\n\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\tme.min = tickOpts.suggestedMin;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tme.min = Math.min(me.min, tickOpts.suggestedMin);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (tickOpts.max !== undefined) {\n\t\t\t\t\t\t\tme.max = tickOpts.max;\n\t\t\t\t\t\t} else if (tickOpts.suggestedMax !== undefined) {\n\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\tme.max = tickOpts.suggestedMax;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tme.max = Math.max(me.max, tickOpts.suggestedMax);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (setMin !== setMax) {\n\t\t\t\t\t\t\t// We set the min or the max but not both.\n\t\t\t\t\t\t\t// So ensure that our range is good\n\t\t\t\t\t\t\t// Inverted or 0 length range can happen when\n\t\t\t\t\t\t\t// ticks.min is set, and no datasets are visible\n\t\t\t\t\t\t\tif (me.min >= me.max) {\n\t\t\t\t\t\t\t\tif (setMin) {\n\t\t\t\t\t\t\t\t\tme.max = me.min + 1;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tme.min = me.max - 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (me.min === me.max) {\n\t\t\t\t\t\t\tme.max++;\n\n\t\t\t\t\t\t\tif (!tickOpts.beginAtZero) {\n\t\t\t\t\t\t\t\tme.min--;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tgetTickLimit: noop,\n\t\t\t\t\thandleDirectionalChanges: noop,\n\n\t\t\t\t\tbuildTicks: function buildTicks() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t\t\t\t// the graph. Make sure we always have at least 2 ticks\n\t\t\t\t\t\tvar maxTicks = me.getTickLimit();\n\t\t\t\t\t\tmaxTicks = Math.max(2, maxTicks);\n\n\t\t\t\t\t\tvar numericGeneratorOptions = {\n\t\t\t\t\t\t\tmaxTicks: maxTicks,\n\t\t\t\t\t\t\tmin: tickOpts.min,\n\t\t\t\t\t\t\tmax: tickOpts.max,\n\t\t\t\t\t\t\tprecision: tickOpts.precision,\n\t\t\t\t\t\t\tstepSize: helpers.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\n\t\t\t\t\t\t};\n\t\t\t\t\t\tvar ticks = me.ticks = generateTicks(numericGeneratorOptions, me);\n\n\t\t\t\t\t\tme.handleDirectionalChanges();\n\n\t\t\t\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t\t\t\t// range of the scale\n\t\t\t\t\t\tme.max = helpers.max(ticks);\n\t\t\t\t\t\tme.min = helpers.min(ticks);\n\n\t\t\t\t\t\tif (tickOpts.reverse) {\n\t\t\t\t\t\t\tticks.reverse();\n\n\t\t\t\t\t\t\tme.start = me.max;\n\t\t\t\t\t\t\tme.end = me.min;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tme.start = me.min;\n\t\t\t\t\t\t\tme.end = me.max;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tconvertTicksToLabels: function convertTicksToLabels() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tme.ticksAsNumbers = me.ticks.slice();\n\t\t\t\t\t\tme.zeroLineIndex = me.ticks.indexOf(0);\n\n\t\t\t\t\t\tScale.prototype.convertTicksToLabels.call(me);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}, { \"33\": 33, \"46\": 46 }], 57: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\t\t\tvar Scale = require(33);\n\t\t\tvar scaleService = require(34);\n\t\t\tvar Ticks = require(35);\n\n\t\t\t/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {Array<Number>} array of tick values\n */\n\t\t\tfunction generateTicks(generationOptions, dataRange) {\n\t\t\t\tvar ticks = [];\n\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t\t// the graph\n\t\t\t\tvar tickVal = valueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min))));\n\n\t\t\t\tvar endExp = Math.floor(helpers.log10(dataRange.max));\n\t\t\t\tvar endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n\t\t\t\tvar exp, significand;\n\n\t\t\t\tif (tickVal === 0) {\n\t\t\t\t\texp = Math.floor(helpers.log10(dataRange.minNotZero));\n\t\t\t\t\tsignificand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\n\n\t\t\t\t\tticks.push(tickVal);\n\t\t\t\t\ttickVal = significand * Math.pow(10, exp);\n\t\t\t\t} else {\n\t\t\t\t\texp = Math.floor(helpers.log10(tickVal));\n\t\t\t\t\tsignificand = Math.floor(tickVal / Math.pow(10, exp));\n\t\t\t\t}\n\t\t\t\tvar precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n\n\t\t\t\tdo {\n\t\t\t\t\tticks.push(tickVal);\n\n\t\t\t\t\t++significand;\n\t\t\t\t\tif (significand === 10) {\n\t\t\t\t\t\tsignificand = 1;\n\t\t\t\t\t\t++exp;\n\t\t\t\t\t\tprecision = exp >= 0 ? 1 : precision;\n\t\t\t\t\t}\n\n\t\t\t\t\ttickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;\n\t\t\t\t} while (exp < endExp || exp === endExp && significand < endSignificand);\n\n\t\t\t\tvar lastTick = valueOrDefault(generationOptions.max, tickVal);\n\t\t\t\tticks.push(lastTick);\n\n\t\t\t\treturn ticks;\n\t\t\t}\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tvar defaultConfig = {\n\t\t\t\t\tposition: 'left',\n\n\t\t\t\t\t// label settings\n\t\t\t\t\tticks: {\n\t\t\t\t\t\tcallback: Ticks.formatters.logarithmic\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tvar LogarithmicScale = Scale.extend({\n\t\t\t\t\tdetermineDataLimits: function determineDataLimits() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\t\tvar datasets = data.datasets;\n\t\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\t\t\tfunction IDMatches(meta) {\n\t\t\t\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Calculate Range\n\t\t\t\t\t\tme.min = null;\n\t\t\t\t\t\tme.max = null;\n\t\t\t\t\t\tme.minNotZero = null;\n\n\t\t\t\t\t\tvar hasStacks = opts.stacked;\n\t\t\t\t\t\tif (hasStacks === undefined) {\n\t\t\t\t\t\t\thelpers.each(datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && meta.stack !== undefined) {\n\t\t\t\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\t\t\t\thelpers.each(datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t\tvar key = [meta.type,\n\t\t\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t\t\topts.stacked === undefined && meta.stack === undefined ? datasetIndex : '', meta.stack].join('.');\n\n\t\t\t\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\t\t\t\t\tvaluesPerStack[key] = [];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\thelpers.each(dataset.data, function (rawValue, index) {\n\t\t\t\t\t\t\t\t\t\tvar values = valuesPerStack[key];\n\t\t\t\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\t\t\t\t// invalid, hidden and negative values are ignored\n\t\t\t\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden || value < 0) {\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tvalues[index] = values[index] || 0;\n\t\t\t\t\t\t\t\t\t\tvalues[index] += value;\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\thelpers.each(valuesPerStack, function (valuesForType) {\n\t\t\t\t\t\t\t\tif (valuesForType.length > 0) {\n\t\t\t\t\t\t\t\t\tvar minVal = helpers.min(valuesForType);\n\t\t\t\t\t\t\t\t\tvar maxVal = helpers.max(valuesForType);\n\t\t\t\t\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thelpers.each(datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\t\t\t\thelpers.each(dataset.data, function (rawValue, index) {\n\t\t\t\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\t\t\t\t// invalid, hidden and negative values are ignored\n\t\t\t\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden || value < 0) {\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {\n\t\t\t\t\t\t\t\t\t\t\tme.minNotZero = value;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Common base implementation to handle ticks.min, ticks.max\n\t\t\t\t\t\tthis.handleTickRangeOptions();\n\t\t\t\t\t},\n\t\t\t\t\thandleTickRangeOptions: function handleTickRangeOptions() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar tickOpts = opts.ticks;\n\t\t\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\t\t\t\tvar DEFAULT_MIN = 1;\n\t\t\t\t\t\tvar DEFAULT_MAX = 10;\n\n\t\t\t\t\t\tme.min = valueOrDefault(tickOpts.min, me.min);\n\t\t\t\t\t\tme.max = valueOrDefault(tickOpts.max, me.max);\n\n\t\t\t\t\t\tif (me.min === me.max) {\n\t\t\t\t\t\t\tif (me.min !== 0 && me.min !== null) {\n\t\t\t\t\t\t\t\tme.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1);\n\t\t\t\t\t\t\t\tme.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tme.min = DEFAULT_MIN;\n\t\t\t\t\t\t\t\tme.max = DEFAULT_MAX;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\tme.min = Math.pow(10, Math.floor(helpers.log10(me.max)) - 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\tme.max = me.min !== 0 ? Math.pow(10, Math.floor(helpers.log10(me.min)) + 1) : DEFAULT_MAX;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (me.minNotZero === null) {\n\t\t\t\t\t\t\tif (me.min > 0) {\n\t\t\t\t\t\t\t\tme.minNotZero = me.min;\n\t\t\t\t\t\t\t} else if (me.max < 1) {\n\t\t\t\t\t\t\t\tme.minNotZero = Math.pow(10, Math.floor(helpers.log10(me.max)));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tme.minNotZero = DEFAULT_MIN;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tbuildTicks: function buildTicks() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar tickOpts = opts.ticks;\n\t\t\t\t\t\tvar reverse = !me.isHorizontal();\n\n\t\t\t\t\t\tvar generationOptions = {\n\t\t\t\t\t\t\tmin: tickOpts.min,\n\t\t\t\t\t\t\tmax: tickOpts.max\n\t\t\t\t\t\t};\n\t\t\t\t\t\tvar ticks = me.ticks = generateTicks(generationOptions, me);\n\n\t\t\t\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t\t\t\t// range of the scale\n\t\t\t\t\t\tme.max = helpers.max(ticks);\n\t\t\t\t\t\tme.min = helpers.min(ticks);\n\n\t\t\t\t\t\tif (tickOpts.reverse) {\n\t\t\t\t\t\t\treverse = !reverse;\n\t\t\t\t\t\t\tme.start = me.max;\n\t\t\t\t\t\t\tme.end = me.min;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tme.start = me.min;\n\t\t\t\t\t\t\tme.end = me.max;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (reverse) {\n\t\t\t\t\t\t\tticks.reverse();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tconvertTicksToLabels: function convertTicksToLabels() {\n\t\t\t\t\t\tthis.tickValues = this.ticks.slice();\n\n\t\t\t\t\t\tScale.prototype.convertTicksToLabels.call(this);\n\t\t\t\t\t},\n\t\t\t\t\t// Get the correct tooltip label\n\t\t\t\t\tgetLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n\t\t\t\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t\t\t\t},\n\t\t\t\t\tgetPixelForTick: function getPixelForTick(index) {\n\t\t\t\t\t\treturn this.getPixelForValue(this.tickValues[index]);\n\t\t\t\t\t},\n\t\t\t\t\t/**\n * Returns the value of the first tick.\n * @param {Number} value - The minimum not zero value.\n * @return {Number} The first tick value.\n * @private\n */\n\t\t\t\t\t_getFirstTickValue: function _getFirstTickValue(value) {\n\t\t\t\t\t\tvar exp = Math.floor(helpers.log10(value));\n\t\t\t\t\t\tvar significand = Math.floor(value / Math.pow(10, exp));\n\n\t\t\t\t\t\treturn significand * Math.pow(10, exp);\n\t\t\t\t\t},\n\t\t\t\t\tgetPixelForValue: function getPixelForValue(value) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar reverse = me.options.ticks.reverse;\n\t\t\t\t\t\tvar log10 = helpers.log10;\n\t\t\t\t\t\tvar firstTickValue = me._getFirstTickValue(me.minNotZero);\n\t\t\t\t\t\tvar offset = 0;\n\t\t\t\t\t\tvar innerDimension, pixel, start, end, sign;\n\n\t\t\t\t\t\tvalue = +me.getRightValue(value);\n\t\t\t\t\t\tif (reverse) {\n\t\t\t\t\t\t\tstart = me.end;\n\t\t\t\t\t\t\tend = me.start;\n\t\t\t\t\t\t\tsign = -1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstart = me.start;\n\t\t\t\t\t\t\tend = me.end;\n\t\t\t\t\t\t\tsign = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t\tinnerDimension = me.width;\n\t\t\t\t\t\t\tpixel = reverse ? me.right : me.left;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinnerDimension = me.height;\n\t\t\t\t\t\t\tsign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0)\n\t\t\t\t\t\t\tpixel = reverse ? me.top : me.bottom;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value !== start) {\n\t\t\t\t\t\t\tif (start === 0) {\n\t\t\t\t\t\t\t\t// include zero tick\n\t\t\t\t\t\t\t\toffset = helpers.getValueOrDefault(me.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);\n\t\t\t\t\t\t\t\tinnerDimension -= offset;\n\t\t\t\t\t\t\t\tstart = firstTickValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (value !== 0) {\n\t\t\t\t\t\t\t\toffset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpixel += sign * offset;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn pixel;\n\t\t\t\t\t},\n\t\t\t\t\tgetValueForPixel: function getValueForPixel(pixel) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar reverse = me.options.ticks.reverse;\n\t\t\t\t\t\tvar log10 = helpers.log10;\n\t\t\t\t\t\tvar firstTickValue = me._getFirstTickValue(me.minNotZero);\n\t\t\t\t\t\tvar innerDimension, start, end, value;\n\n\t\t\t\t\t\tif (reverse) {\n\t\t\t\t\t\t\tstart = me.end;\n\t\t\t\t\t\t\tend = me.start;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstart = me.start;\n\t\t\t\t\t\t\tend = me.end;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t\tinnerDimension = me.width;\n\t\t\t\t\t\t\tvalue = reverse ? me.right - pixel : pixel - me.left;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinnerDimension = me.height;\n\t\t\t\t\t\t\tvalue = reverse ? pixel - me.top : me.bottom - pixel;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value !== start) {\n\t\t\t\t\t\t\tif (start === 0) {\n\t\t\t\t\t\t\t\t// include zero tick\n\t\t\t\t\t\t\t\tvar offset = helpers.getValueOrDefault(me.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);\n\t\t\t\t\t\t\t\tvalue -= offset;\n\t\t\t\t\t\t\t\tinnerDimension -= offset;\n\t\t\t\t\t\t\t\tstart = firstTickValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvalue *= log10(end) - log10(start);\n\t\t\t\t\t\t\tvalue /= innerDimension;\n\t\t\t\t\t\t\tvalue = Math.pow(10, log10(start) + value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tscaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig);\n\t\t\t};\n\t\t}, { \"33\": 33, \"34\": 34, \"35\": 35, \"46\": 46 }], 58: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\t\t\tvar scaleService = require(34);\n\t\t\tvar Ticks = require(35);\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tvar globalDefaults = defaults.global;\n\n\t\t\t\tvar defaultConfig = {\n\t\t\t\t\tdisplay: true,\n\n\t\t\t\t\t// Boolean - Whether to animate scaling the chart from the centre\n\t\t\t\t\tanimate: true,\n\t\t\t\t\tposition: 'chartArea',\n\n\t\t\t\t\tangleLines: {\n\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\t\t\t\t\tlineWidth: 1\n\t\t\t\t\t},\n\n\t\t\t\t\tgridLines: {\n\t\t\t\t\t\tcircular: false\n\t\t\t\t\t},\n\n\t\t\t\t\t// label settings\n\t\t\t\t\tticks: {\n\t\t\t\t\t\t// Boolean - Show a backdrop to the scale label\n\t\t\t\t\t\tshowLabelBackdrop: true,\n\n\t\t\t\t\t\t// String - The colour of the label backdrop\n\t\t\t\t\t\tbackdropColor: 'rgba(255,255,255,0.75)',\n\n\t\t\t\t\t\t// Number - The backdrop padding above & below the label in pixels\n\t\t\t\t\t\tbackdropPaddingY: 2,\n\n\t\t\t\t\t\t// Number - The backdrop padding to the side of the label in pixels\n\t\t\t\t\t\tbackdropPaddingX: 2,\n\n\t\t\t\t\t\tcallback: Ticks.formatters.linear\n\t\t\t\t\t},\n\n\t\t\t\t\tpointLabels: {\n\t\t\t\t\t\t// Boolean - if true, show point labels\n\t\t\t\t\t\tdisplay: true,\n\n\t\t\t\t\t\t// Number - Point label font size in pixels\n\t\t\t\t\t\tfontSize: 10,\n\n\t\t\t\t\t\t// Function - Used to convert point labels\n\t\t\t\t\t\tcallback: function callback(label) {\n\t\t\t\t\t\t\treturn label;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tfunction getValueCount(scale) {\n\t\t\t\t\tvar opts = scale.options;\n\t\t\t\t\treturn opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0;\n\t\t\t\t}\n\n\t\t\t\tfunction getPointLabelFontOptions(scale) {\n\t\t\t\t\tvar pointLabelOptions = scale.options.pointLabels;\n\t\t\t\t\tvar fontSize = helpers.valueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\t\tvar fontStyle = helpers.valueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\t\tvar fontFamily = helpers.valueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\t\t\tvar font = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsize: fontSize,\n\t\t\t\t\t\tstyle: fontStyle,\n\t\t\t\t\t\tfamily: fontFamily,\n\t\t\t\t\t\tfont: font\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tfunction measureLabelSize(ctx, fontSize, label) {\n\t\t\t\t\tif (helpers.isArray(label)) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tw: helpers.longestText(ctx, ctx.font, label),\n\t\t\t\t\t\t\th: label.length * fontSize + (label.length - 1) * 1.5 * fontSize\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tw: ctx.measureText(label).width,\n\t\t\t\t\t\th: fontSize\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tfunction determineLimits(angle, pos, size, min, max) {\n\t\t\t\t\tif (angle === min || angle === max) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstart: pos - size / 2,\n\t\t\t\t\t\t\tend: pos + size / 2\n\t\t\t\t\t\t};\n\t\t\t\t\t} else if (angle < min || angle > max) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstart: pos - size - 5,\n\t\t\t\t\t\t\tend: pos\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstart: pos,\n\t\t\t\t\t\tend: pos + size + 5\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t/**\n * Helper function to fit a radial linear scale with point labels\n */\n\t\t\t\tfunction fitWithPointLabels(scale) {\n\t\t\t\t\t/*\n * Right, this is really confusing and there is a lot of maths going on here\n * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n *\n * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n *\n * Solution:\n *\n * We assume the radius of the polygon is half the size of the canvas at first\n * at each index we check if the text overlaps.\n *\n * Where it does, we store that angle and that index.\n *\n * After finding the largest index and angle we calculate how much we need to remove\n * from the shape radius to move the point inwards by that x.\n *\n * We average the left and right distances to get the maximum shape radius that can fit in the box\n * along with labels.\n *\n * Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n * on each side, removing that from the size, halving it and adding the left x protrusion width.\n *\n * This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n * and position it in the most space efficient manner\n *\n * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n */\n\n\t\t\t\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\t\t\t\t// Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n\t\t\t\t\t// Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n\t\t\t\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\t\t\t\tvar furthestLimits = {\n\t\t\t\t\t\tr: scale.width,\n\t\t\t\t\t\tl: 0,\n\t\t\t\t\t\tt: scale.height,\n\t\t\t\t\t\tb: 0\n\t\t\t\t\t};\n\t\t\t\t\tvar furthestAngles = {};\n\t\t\t\t\tvar i, textSize, pointPosition;\n\n\t\t\t\t\tscale.ctx.font = plFont.font;\n\t\t\t\t\tscale._pointLabelSizes = [];\n\n\t\t\t\t\tvar valueCount = getValueCount(scale);\n\t\t\t\t\tfor (i = 0; i < valueCount; i++) {\n\t\t\t\t\t\tpointPosition = scale.getPointPosition(i, largestPossibleRadius);\n\t\t\t\t\t\ttextSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || '');\n\t\t\t\t\t\tscale._pointLabelSizes[i] = textSize;\n\n\t\t\t\t\t\t// Add quarter circle to make degree 0 mean top of circle\n\t\t\t\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\t\t\t\tvar angle = helpers.toDegrees(angleRadians) % 360;\n\t\t\t\t\t\tvar hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n\t\t\t\t\t\tvar vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n\n\t\t\t\t\t\tif (hLimits.start < furthestLimits.l) {\n\t\t\t\t\t\t\tfurthestLimits.l = hLimits.start;\n\t\t\t\t\t\t\tfurthestAngles.l = angleRadians;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (hLimits.end > furthestLimits.r) {\n\t\t\t\t\t\t\tfurthestLimits.r = hLimits.end;\n\t\t\t\t\t\t\tfurthestAngles.r = angleRadians;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (vLimits.start < furthestLimits.t) {\n\t\t\t\t\t\t\tfurthestLimits.t = vLimits.start;\n\t\t\t\t\t\t\tfurthestAngles.t = angleRadians;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (vLimits.end > furthestLimits.b) {\n\t\t\t\t\t\t\tfurthestLimits.b = vLimits.end;\n\t\t\t\t\t\t\tfurthestAngles.b = angleRadians;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tscale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles);\n\t\t\t\t}\n\n\t\t\t\t/**\n * Helper function to fit a radial linear scale with no point labels\n */\n\t\t\t\tfunction _fit(scale) {\n\t\t\t\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\t\t\t\tscale.drawingArea = Math.round(largestPossibleRadius);\n\t\t\t\t\tscale.setCenterPoint(0, 0, 0, 0);\n\t\t\t\t}\n\n\t\t\t\tfunction getTextAlignForAngle(angle) {\n\t\t\t\t\tif (angle === 0 || angle === 180) {\n\t\t\t\t\t\treturn 'center';\n\t\t\t\t\t} else if (angle < 180) {\n\t\t\t\t\t\treturn 'left';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn 'right';\n\t\t\t\t}\n\n\t\t\t\tfunction fillText(ctx, text, position, fontSize) {\n\t\t\t\t\tif (helpers.isArray(text)) {\n\t\t\t\t\t\tvar y = position.y;\n\t\t\t\t\t\tvar spacing = 1.5 * fontSize;\n\n\t\t\t\t\t\tfor (var i = 0; i < text.length; ++i) {\n\t\t\t\t\t\t\tctx.fillText(text[i], position.x, y);\n\t\t\t\t\t\t\ty += spacing;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tctx.fillText(text, position.x, position.y);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction adjustPointPositionForLabelHeight(angle, textSize, position) {\n\t\t\t\t\tif (angle === 90 || angle === 270) {\n\t\t\t\t\t\tposition.y -= textSize.h / 2;\n\t\t\t\t\t} else if (angle > 270 || angle < 90) {\n\t\t\t\t\t\tposition.y -= textSize.h;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction drawPointLabels(scale) {\n\t\t\t\t\tvar ctx = scale.ctx;\n\t\t\t\t\tvar opts = scale.options;\n\t\t\t\t\tvar angleLineOpts = opts.angleLines;\n\t\t\t\t\tvar pointLabelOpts = opts.pointLabels;\n\n\t\t\t\t\tctx.lineWidth = angleLineOpts.lineWidth;\n\t\t\t\t\tctx.strokeStyle = angleLineOpts.color;\n\n\t\t\t\t\tvar outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n\n\t\t\t\t\t// Point Label Font\n\t\t\t\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\t\tfor (var i = getValueCount(scale) - 1; i >= 0; i--) {\n\t\t\t\t\t\tif (angleLineOpts.display) {\n\t\t\t\t\t\t\tvar outerPosition = scale.getPointPosition(i, outerDistance);\n\t\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\t\tctx.moveTo(scale.xCenter, scale.yCenter);\n\t\t\t\t\t\t\tctx.lineTo(outerPosition.x, outerPosition.y);\n\t\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (pointLabelOpts.display) {\n\t\t\t\t\t\t\t// Extra 3px out for some label spacing\n\t\t\t\t\t\t\tvar pointLabelPosition = scale.getPointPosition(i, outerDistance + 5);\n\n\t\t\t\t\t\t\t// Keep this in loop since we may support array properties here\n\t\t\t\t\t\t\tvar pointLabelFontColor = helpers.valueAtIndexOrDefault(pointLabelOpts.fontColor, i, globalDefaults.defaultFontColor);\n\t\t\t\t\t\t\tctx.font = plFont.font;\n\t\t\t\t\t\t\tctx.fillStyle = pointLabelFontColor;\n\n\t\t\t\t\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\t\t\t\t\tvar angle = helpers.toDegrees(angleRadians);\n\t\t\t\t\t\t\tctx.textAlign = getTextAlignForAngle(angle);\n\t\t\t\t\t\t\tadjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\n\t\t\t\t\t\t\tfillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction drawRadiusLine(scale, gridLineOpts, radius, index) {\n\t\t\t\t\tvar ctx = scale.ctx;\n\t\t\t\t\tctx.strokeStyle = helpers.valueAtIndexOrDefault(gridLineOpts.color, index - 1);\n\t\t\t\t\tctx.lineWidth = helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1);\n\n\t\t\t\t\tif (scale.options.gridLines.circular) {\n\t\t\t\t\t\t// Draw circular arcs between the points\n\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\tctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\n\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Draw straight lines connecting each index\n\t\t\t\t\t\tvar valueCount = getValueCount(scale);\n\n\t\t\t\t\t\tif (valueCount === 0) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\tvar pointPosition = scale.getPointPosition(0, radius);\n\t\t\t\t\t\tctx.moveTo(pointPosition.x, pointPosition.y);\n\n\t\t\t\t\t\tfor (var i = 1; i < valueCount; i++) {\n\t\t\t\t\t\t\tpointPosition = scale.getPointPosition(i, radius);\n\t\t\t\t\t\t\tctx.lineTo(pointPosition.x, pointPosition.y);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction numberOrZero(param) {\n\t\t\t\t\treturn helpers.isNumber(param) ? param : 0;\n\t\t\t\t}\n\n\t\t\t\tvar LinearRadialScale = Chart.LinearScaleBase.extend({\n\t\t\t\t\tsetDimensions: function setDimensions() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar tickOpts = opts.ticks;\n\t\t\t\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\t\t\t\tme.width = me.maxWidth;\n\t\t\t\t\t\tme.height = me.maxHeight;\n\t\t\t\t\t\tme.xCenter = Math.round(me.width / 2);\n\t\t\t\t\t\tme.yCenter = Math.round(me.height / 2);\n\n\t\t\t\t\t\tvar minSize = helpers.min([me.height, me.width]);\n\t\t\t\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\t\t\tme.drawingArea = opts.display ? minSize / 2 - (tickFontSize / 2 + tickOpts.backdropPaddingY) : minSize / 2;\n\t\t\t\t\t},\n\t\t\t\t\tdetermineDataLimits: function determineDataLimits() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar min = Number.POSITIVE_INFINITY;\n\t\t\t\t\t\tvar max = Number.NEGATIVE_INFINITY;\n\n\t\t\t\t\t\thelpers.each(chart.data.datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\n\t\t\t\t\t\t\t\thelpers.each(dataset.data, function (rawValue, index) {\n\t\t\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tmin = Math.min(value, min);\n\t\t\t\t\t\t\t\t\tmax = Math.max(value, max);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tme.min = min === Number.POSITIVE_INFINITY ? 0 : min;\n\t\t\t\t\t\tme.max = max === Number.NEGATIVE_INFINITY ? 0 : max;\n\n\t\t\t\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\t\t\t\tme.handleTickRangeOptions();\n\t\t\t\t\t},\n\t\t\t\t\tgetTickLimit: function getTickLimit() {\n\t\t\t\t\t\tvar tickOpts = this.options.ticks;\n\t\t\t\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\t\t\treturn Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\n\t\t\t\t\t},\n\t\t\t\t\tconvertTicksToLabels: function convertTicksToLabels() {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tChart.LinearScaleBase.prototype.convertTicksToLabels.call(me);\n\n\t\t\t\t\t\t// Point labels\n\t\t\t\t\t\tme.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\n\t\t\t\t\t},\n\t\t\t\t\tgetLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n\t\t\t\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t\t\t\t},\n\t\t\t\t\tfit: function fit() {\n\t\t\t\t\t\tif (this.options.pointLabels.display) {\n\t\t\t\t\t\t\tfitWithPointLabels(this);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t_fit(this);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t/**\n * Set radius reductions and determine new radius and center point\n * @private\n */\n\t\t\t\t\tsetReductions: function setReductions(largestPossibleRadius, furthestLimits, furthestAngles) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n\t\t\t\t\t\tvar radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n\t\t\t\t\t\tvar radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n\t\t\t\t\t\tvar radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b);\n\n\t\t\t\t\t\tradiusReductionLeft = numberOrZero(radiusReductionLeft);\n\t\t\t\t\t\tradiusReductionRight = numberOrZero(radiusReductionRight);\n\t\t\t\t\t\tradiusReductionTop = numberOrZero(radiusReductionTop);\n\t\t\t\t\t\tradiusReductionBottom = numberOrZero(radiusReductionBottom);\n\n\t\t\t\t\t\tme.drawingArea = Math.min(Math.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), Math.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\n\t\t\t\t\t\tme.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n\t\t\t\t\t},\n\t\t\t\t\tsetCenterPoint: function setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar maxRight = me.width - rightMovement - me.drawingArea;\n\t\t\t\t\t\tvar maxLeft = leftMovement + me.drawingArea;\n\t\t\t\t\t\tvar maxTop = topMovement + me.drawingArea;\n\t\t\t\t\t\tvar maxBottom = me.height - bottomMovement - me.drawingArea;\n\n\t\t\t\t\t\tme.xCenter = Math.round((maxLeft + maxRight) / 2 + me.left);\n\t\t\t\t\t\tme.yCenter = Math.round((maxTop + maxBottom) / 2 + me.top);\n\t\t\t\t\t},\n\n\t\t\t\t\tgetIndexAngle: function getIndexAngle(index) {\n\t\t\t\t\t\tvar angleMultiplier = Math.PI * 2 / getValueCount(this);\n\t\t\t\t\t\tvar startAngle = this.chart.options && this.chart.options.startAngle ? this.chart.options.startAngle : 0;\n\n\t\t\t\t\t\tvar startAngleRadians = startAngle * Math.PI * 2 / 360;\n\n\t\t\t\t\t\t// Start from the top instead of right, so remove a quarter of the circle\n\t\t\t\t\t\treturn index * angleMultiplier + startAngleRadians;\n\t\t\t\t\t},\n\t\t\t\t\tgetDistanceFromCenterForValue: function getDistanceFromCenterForValue(value) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tif (value === null) {\n\t\t\t\t\t\t\treturn 0; // null always in center\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Take into account half font size + the yPadding of the top value\n\t\t\t\t\t\tvar scalingFactor = me.drawingArea / (me.max - me.min);\n\t\t\t\t\t\tif (me.options.ticks.reverse) {\n\t\t\t\t\t\t\treturn (me.max - value) * scalingFactor;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn (value - me.min) * scalingFactor;\n\t\t\t\t\t},\n\t\t\t\t\tgetPointPosition: function getPointPosition(index, distanceFromCenter) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar thisAngle = me.getIndexAngle(index) - Math.PI / 2;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tx: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter,\n\t\t\t\t\t\t\ty: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t\tgetPointPositionForValue: function getPointPositionForValue(index, value) {\n\t\t\t\t\t\treturn this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n\t\t\t\t\t},\n\n\t\t\t\t\tgetBasePosition: function getBasePosition() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar min = me.min;\n\t\t\t\t\t\tvar max = me.max;\n\n\t\t\t\t\t\treturn me.getPointPositionForValue(0, me.beginAtZero ? 0 : min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0);\n\t\t\t\t\t},\n\n\t\t\t\t\tdraw: function draw() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\t\t\t\tvar tickOpts = opts.ticks;\n\t\t\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\t\t\t\t\tif (opts.display) {\n\t\t\t\t\t\t\tvar ctx = me.ctx;\n\t\t\t\t\t\t\tvar startAngle = this.getIndexAngle(0);\n\n\t\t\t\t\t\t\t// Tick Font\n\t\t\t\t\t\t\tvar tickFontSize = valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\t\t\t\tvar tickFontStyle = valueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\t\t\t\tvar tickFontFamily = valueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\t\t\t\t\tvar tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\n\n\t\t\t\t\t\t\thelpers.each(me.ticks, function (label, index) {\n\t\t\t\t\t\t\t\t// Don't draw a centre value (if it is minimum)\n\t\t\t\t\t\t\t\tif (index > 0 || tickOpts.reverse) {\n\t\t\t\t\t\t\t\t\tvar yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n\n\t\t\t\t\t\t\t\t\t// Draw circular lines around the scale\n\t\t\t\t\t\t\t\t\tif (gridLineOpts.display && index !== 0) {\n\t\t\t\t\t\t\t\t\t\tdrawRadiusLine(me, gridLineOpts, yCenterOffset, index);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (tickOpts.display) {\n\t\t\t\t\t\t\t\t\t\tvar tickFontColor = valueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\t\t\t\t\t\t\tctx.font = tickLabelFont;\n\n\t\t\t\t\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\t\t\t\t\tctx.translate(me.xCenter, me.yCenter);\n\t\t\t\t\t\t\t\t\t\tctx.rotate(startAngle);\n\n\t\t\t\t\t\t\t\t\t\tif (tickOpts.showLabelBackdrop) {\n\t\t\t\t\t\t\t\t\t\t\tvar labelWidth = ctx.measureText(label).width;\n\t\t\t\t\t\t\t\t\t\t\tctx.fillStyle = tickOpts.backdropColor;\n\t\t\t\t\t\t\t\t\t\t\tctx.fillRect(-labelWidth / 2 - tickOpts.backdropPaddingX, -yCenterOffset - tickFontSize / 2 - tickOpts.backdropPaddingY, labelWidth + tickOpts.backdropPaddingX * 2, tickFontSize + tickOpts.backdropPaddingY * 2);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tctx.textAlign = 'center';\n\t\t\t\t\t\t\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\t\t\t\t\t\t\tctx.fillStyle = tickFontColor;\n\t\t\t\t\t\t\t\t\t\tctx.fillText(label, 0, -yCenterOffset);\n\t\t\t\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (opts.angleLines.display || opts.pointLabels.display) {\n\t\t\t\t\t\t\t\tdrawPointLabels(me);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tscaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig);\n\t\t\t};\n\t\t}, { \"26\": 26, \"34\": 34, \"35\": 35, \"46\": 46 }], 59: [function (require, module, exports) {\n\t\t\t/* global window: false */\n\t\t\t'use strict';\n\n\t\t\tvar moment = require(1);\n\t\t\tmoment = typeof moment === 'function' ? moment : window.moment;\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\t\t\tvar Scale = require(33);\n\t\t\tvar scaleService = require(34);\n\n\t\t\t// Integer constants are from the ES6 spec.\n\t\t\tvar MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\n\t\t\tvar MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n\n\t\t\tvar INTERVALS = {\n\t\t\t\tmillisecond: {\n\t\t\t\t\tcommon: true,\n\t\t\t\t\tsize: 1,\n\t\t\t\t\tsteps: [1, 2, 5, 10, 20, 50, 100, 250, 500]\n\t\t\t\t},\n\t\t\t\tsecond: {\n\t\t\t\t\tcommon: true,\n\t\t\t\t\tsize: 1000,\n\t\t\t\t\tsteps: [1, 2, 5, 10, 15, 30]\n\t\t\t\t},\n\t\t\t\tminute: {\n\t\t\t\t\tcommon: true,\n\t\t\t\t\tsize: 60000,\n\t\t\t\t\tsteps: [1, 2, 5, 10, 15, 30]\n\t\t\t\t},\n\t\t\t\thour: {\n\t\t\t\t\tcommon: true,\n\t\t\t\t\tsize: 3600000,\n\t\t\t\t\tsteps: [1, 2, 3, 6, 12]\n\t\t\t\t},\n\t\t\t\tday: {\n\t\t\t\t\tcommon: true,\n\t\t\t\t\tsize: 86400000,\n\t\t\t\t\tsteps: [1, 2, 5]\n\t\t\t\t},\n\t\t\t\tweek: {\n\t\t\t\t\tcommon: false,\n\t\t\t\t\tsize: 604800000,\n\t\t\t\t\tsteps: [1, 2, 3, 4]\n\t\t\t\t},\n\t\t\t\tmonth: {\n\t\t\t\t\tcommon: true,\n\t\t\t\t\tsize: 2.628e9,\n\t\t\t\t\tsteps: [1, 2, 3]\n\t\t\t\t},\n\t\t\t\tquarter: {\n\t\t\t\t\tcommon: false,\n\t\t\t\t\tsize: 7.884e9,\n\t\t\t\t\tsteps: [1, 2, 3, 4]\n\t\t\t\t},\n\t\t\t\tyear: {\n\t\t\t\t\tcommon: true,\n\t\t\t\t\tsize: 3.154e10\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar UNITS = Object.keys(INTERVALS);\n\n\t\t\tfunction sorter(a, b) {\n\t\t\t\treturn a - b;\n\t\t\t}\n\n\t\t\tfunction arrayUnique(items) {\n\t\t\t\tvar hash = {};\n\t\t\t\tvar out = [];\n\t\t\t\tvar i, ilen, item;\n\n\t\t\t\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\n\t\t\t\t\titem = items[i];\n\t\t\t\t\tif (!hash[item]) {\n\t\t\t\t\t\thash[item] = true;\n\t\t\t\t\t\tout.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn out;\n\t\t\t}\n\n\t\t\t/**\n * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n * extremity (left + width or top + height). Note that it would be more optimized to directly\n * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n *\n * @param {Number[]} timestamps - timestamps sorted from lowest to highest.\n * @param {String} distribution - If 'linear', timestamps will be spread linearly along the min\n * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}.\n * If 'series', timestamps will be positioned at the same distance from each other. In this\n * case, only timestamps that break the time linearity are registered, meaning that in the\n * best case, all timestamps are linear, the table contains only min and max.\n */\n\t\t\tfunction buildLookupTable(timestamps, min, max, distribution) {\n\t\t\t\tif (distribution === 'linear' || !timestamps.length) {\n\t\t\t\t\treturn [{ time: min, pos: 0 }, { time: max, pos: 1 }];\n\t\t\t\t}\n\n\t\t\t\tvar table = [];\n\t\t\t\tvar items = [min];\n\t\t\t\tvar i, ilen, prev, curr, next;\n\n\t\t\t\tfor (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n\t\t\t\t\tcurr = timestamps[i];\n\t\t\t\t\tif (curr > min && curr < max) {\n\t\t\t\t\t\titems.push(curr);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\titems.push(max);\n\n\t\t\t\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\n\t\t\t\t\tnext = items[i + 1];\n\t\t\t\t\tprev = items[i - 1];\n\t\t\t\t\tcurr = items[i];\n\n\t\t\t\t\t// only add points that breaks the scale linearity\n\t\t\t\t\tif (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) {\n\t\t\t\t\t\ttable.push({ time: curr, pos: i / (ilen - 1) });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn table;\n\t\t\t}\n\n\t\t\t// @see adapted from http://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/\n\t\t\tfunction lookup(table, key, value) {\n\t\t\t\tvar lo = 0;\n\t\t\t\tvar hi = table.length - 1;\n\t\t\t\tvar mid, i0, i1;\n\n\t\t\t\twhile (lo >= 0 && lo <= hi) {\n\t\t\t\t\tmid = lo + hi >> 1;\n\t\t\t\t\ti0 = table[mid - 1] || null;\n\t\t\t\t\ti1 = table[mid];\n\n\t\t\t\t\tif (!i0) {\n\t\t\t\t\t\t// given value is outside table (before first item)\n\t\t\t\t\t\treturn { lo: null, hi: i1 };\n\t\t\t\t\t} else if (i1[key] < value) {\n\t\t\t\t\t\tlo = mid + 1;\n\t\t\t\t\t} else if (i0[key] > value) {\n\t\t\t\t\t\thi = mid - 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn { lo: i0, hi: i1 };\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// given value is outside table (after last item)\n\t\t\t\treturn { lo: i1, hi: null };\n\t\t\t}\n\n\t\t\t/**\n * Linearly interpolates the given source `value` using the table items `skey` values and\n * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos')\n * returns the position for a timestamp equal to 42. If value is out of bounds, values at\n * index [0, 1] or [n - 1, n] are used for the interpolation.\n */\n\t\t\tfunction interpolate(table, skey, sval, tkey) {\n\t\t\t\tvar range = lookup(table, skey, sval);\n\n\t\t\t\t// Note: the lookup table ALWAYS contains at least 2 items (min and max)\n\t\t\t\tvar prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo;\n\t\t\t\tvar next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi;\n\n\t\t\t\tvar span = next[skey] - prev[skey];\n\t\t\t\tvar ratio = span ? (sval - prev[skey]) / span : 0;\n\t\t\t\tvar offset = (next[tkey] - prev[tkey]) * ratio;\n\n\t\t\t\treturn prev[tkey] + offset;\n\t\t\t}\n\n\t\t\t/**\n * Convert the given value to a moment object using the given time options.\n * @see http://momentjs.com/docs/#/parsing/\n */\n\t\t\tfunction momentify(value, options) {\n\t\t\t\tvar parser = options.parser;\n\t\t\t\tvar format = options.parser || options.format;\n\n\t\t\t\tif (typeof parser === 'function') {\n\t\t\t\t\treturn parser(value);\n\t\t\t\t}\n\n\t\t\t\tif (typeof value === 'string' && typeof format === 'string') {\n\t\t\t\t\treturn moment(value, format);\n\t\t\t\t}\n\n\t\t\t\tif (!(value instanceof moment)) {\n\t\t\t\t\tvalue = moment(value);\n\t\t\t\t}\n\n\t\t\t\tif (value.isValid()) {\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\n\t\t\t\t// Labels are in an incompatible moment format and no `parser` has been provided.\n\t\t\t\t// The user might still use the deprecated `format` option to convert his inputs.\n\t\t\t\tif (typeof format === 'function') {\n\t\t\t\t\treturn format(value);\n\t\t\t\t}\n\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tfunction parse(input, scale) {\n\t\t\t\tif (helpers.isNullOrUndef(input)) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tvar options = scale.options.time;\n\t\t\t\tvar value = momentify(scale.getRightValue(input), options);\n\t\t\t\tif (!value.isValid()) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tif (options.round) {\n\t\t\t\t\tvalue.startOf(options.round);\n\t\t\t\t}\n\n\t\t\t\treturn value.valueOf();\n\t\t\t}\n\n\t\t\t/**\n * Returns the number of unit to skip to be able to display up to `capacity` number of ticks\n * in `unit` for the given `min` / `max` range and respecting the interval steps constraints.\n */\n\t\t\tfunction determineStepSize(min, max, unit, capacity) {\n\t\t\t\tvar range = max - min;\n\t\t\t\tvar interval = INTERVALS[unit];\n\t\t\t\tvar milliseconds = interval.size;\n\t\t\t\tvar steps = interval.steps;\n\t\t\t\tvar i, ilen, factor;\n\n\t\t\t\tif (!steps) {\n\t\t\t\t\treturn Math.ceil(range / (capacity * milliseconds));\n\t\t\t\t}\n\n\t\t\t\tfor (i = 0, ilen = steps.length; i < ilen; ++i) {\n\t\t\t\t\tfactor = steps[i];\n\t\t\t\t\tif (Math.ceil(range / (milliseconds * factor)) <= capacity) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn factor;\n\t\t\t}\n\n\t\t\t/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n */\n\t\t\tfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n\t\t\t\tvar ilen = UNITS.length;\n\t\t\t\tvar i, interval, factor;\n\n\t\t\t\tfor (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n\t\t\t\t\tinterval = INTERVALS[UNITS[i]];\n\t\t\t\t\tfactor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER;\n\n\t\t\t\t\tif (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n\t\t\t\t\t\treturn UNITS[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn UNITS[ilen - 1];\n\t\t\t}\n\n\t\t\t/**\n * Figures out what unit to format a set of ticks with\n */\n\t\t\tfunction determineUnitForFormatting(ticks, minUnit, min, max) {\n\t\t\t\tvar duration = moment.duration(moment(max).diff(moment(min)));\n\t\t\t\tvar ilen = UNITS.length;\n\t\t\t\tvar i, unit;\n\n\t\t\t\tfor (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) {\n\t\t\t\t\tunit = UNITS[i];\n\t\t\t\t\tif (INTERVALS[unit].common && duration.as(unit) >= ticks.length) {\n\t\t\t\t\t\treturn unit;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n\t\t\t}\n\n\t\t\tfunction determineMajorUnit(unit) {\n\t\t\t\tfor (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n\t\t\t\t\tif (INTERVALS[UNITS[i]].common) {\n\t\t\t\t\t\treturn UNITS[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n * `minor` unit, aligned on the `major` unit and using the given scale time `options`.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n */\n\t\t\tfunction generate(min, max, capacity, options) {\n\t\t\t\tvar timeOpts = options.time;\n\t\t\t\tvar minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity);\n\t\t\t\tvar major = determineMajorUnit(minor);\n\t\t\t\tvar stepSize = helpers.valueOrDefault(timeOpts.stepSize, timeOpts.unitStepSize);\n\t\t\t\tvar weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n\t\t\t\tvar majorTicksEnabled = options.ticks.major.enabled;\n\t\t\t\tvar interval = INTERVALS[minor];\n\t\t\t\tvar first = moment(min);\n\t\t\t\tvar last = moment(max);\n\t\t\t\tvar ticks = [];\n\t\t\t\tvar time;\n\n\t\t\t\tif (!stepSize) {\n\t\t\t\t\tstepSize = determineStepSize(min, max, minor, capacity);\n\t\t\t\t}\n\n\t\t\t\t// For 'week' unit, handle the first day of week option\n\t\t\t\tif (weekday) {\n\t\t\t\t\tfirst = first.isoWeekday(weekday);\n\t\t\t\t\tlast = last.isoWeekday(weekday);\n\t\t\t\t}\n\n\t\t\t\t// Align first/last ticks on unit\n\t\t\t\tfirst = first.startOf(weekday ? 'day' : minor);\n\t\t\t\tlast = last.startOf(weekday ? 'day' : minor);\n\n\t\t\t\t// Make sure that the last tick include max\n\t\t\t\tif (last < max) {\n\t\t\t\t\tlast.add(1, minor);\n\t\t\t\t}\n\n\t\t\t\ttime = moment(first);\n\n\t\t\t\tif (majorTicksEnabled && major && !weekday && !timeOpts.round) {\n\t\t\t\t\t// Align the first tick on the previous `minor` unit aligned on the `major` unit:\n\t\t\t\t\t// we first aligned time on the previous `major` unit then add the number of full\n\t\t\t\t\t// stepSize there is between first and the previous major time.\n\t\t\t\t\ttime.startOf(major);\n\t\t\t\t\ttime.add(~~((first - time) / (interval.size * stepSize)) * stepSize, minor);\n\t\t\t\t}\n\n\t\t\t\tfor (; time < last; time.add(stepSize, minor)) {\n\t\t\t\t\tticks.push(+time);\n\t\t\t\t}\n\n\t\t\t\tticks.push(+time);\n\n\t\t\t\treturn ticks;\n\t\t\t}\n\n\t\t\t/**\n * Returns the right and left offsets from edges in the form of {left, right}.\n * Offsets are added when the `offset` option is true.\n */\n\t\t\tfunction computeOffsets(table, ticks, min, max, options) {\n\t\t\t\tvar left = 0;\n\t\t\t\tvar right = 0;\n\t\t\t\tvar upper, lower;\n\n\t\t\t\tif (options.offset && ticks.length) {\n\t\t\t\t\tif (!options.time.min) {\n\t\t\t\t\t\tupper = ticks.length > 1 ? ticks[1] : max;\n\t\t\t\t\t\tlower = ticks[0];\n\t\t\t\t\t\tleft = (interpolate(table, 'time', upper, 'pos') - interpolate(table, 'time', lower, 'pos')) / 2;\n\t\t\t\t\t}\n\t\t\t\t\tif (!options.time.max) {\n\t\t\t\t\t\tupper = ticks[ticks.length - 1];\n\t\t\t\t\t\tlower = ticks.length > 1 ? ticks[ticks.length - 2] : min;\n\t\t\t\t\t\tright = (interpolate(table, 'time', upper, 'pos') - interpolate(table, 'time', lower, 'pos')) / 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn { left: left, right: right };\n\t\t\t}\n\n\t\t\tfunction ticksFromTimestamps(values, majorUnit) {\n\t\t\t\tvar ticks = [];\n\t\t\t\tvar i, ilen, value, major;\n\n\t\t\t\tfor (i = 0, ilen = values.length; i < ilen; ++i) {\n\t\t\t\t\tvalue = values[i];\n\t\t\t\t\tmajor = majorUnit ? value === +moment(value).startOf(majorUnit) : false;\n\n\t\t\t\t\tticks.push({\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tmajor: major\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn ticks;\n\t\t\t}\n\n\t\t\tfunction determineLabelFormat(data, timeOpts) {\n\t\t\t\tvar i, momentDate, hasTime;\n\t\t\t\tvar ilen = data.length;\n\n\t\t\t\t// find the label with the most parts (milliseconds, minutes, etc.)\n\t\t\t\t// format all labels with the same level of detail as the most specific label\n\t\t\t\tfor (i = 0; i < ilen; i++) {\n\t\t\t\t\tmomentDate = momentify(data[i], timeOpts);\n\t\t\t\t\tif (momentDate.millisecond() !== 0) {\n\t\t\t\t\t\treturn 'MMM D, YYYY h:mm:ss.SSS a';\n\t\t\t\t\t}\n\t\t\t\t\tif (momentDate.second() !== 0 || momentDate.minute() !== 0 || momentDate.hour() !== 0) {\n\t\t\t\t\t\thasTime = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (hasTime) {\n\t\t\t\t\treturn 'MMM D, YYYY h:mm:ss a';\n\t\t\t\t}\n\t\t\t\treturn 'MMM D, YYYY';\n\t\t\t}\n\n\t\t\tmodule.exports = function () {\n\n\t\t\t\tvar defaultConfig = {\n\t\t\t\t\tposition: 'bottom',\n\n\t\t\t\t\t/**\n * Data distribution along the scale:\n * - 'linear': data are spread according to their time (distances can vary),\n * - 'series': data are spread at the same distance from each other.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n\t\t\t\t\tdistribution: 'linear',\n\n\t\t\t\t\t/**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n\t\t\t\t\tbounds: 'data',\n\n\t\t\t\t\ttime: {\n\t\t\t\t\t\tparser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\n\t\t\t\t\t\tformat: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/\n\t\t\t\t\t\tunit: false, // false == automatic or override with week, month, year, etc.\n\t\t\t\t\t\tround: false, // none, or override with week, month, year, etc.\n\t\t\t\t\t\tdisplayFormat: false, // DEPRECATED\n\t\t\t\t\t\tisoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/\n\t\t\t\t\t\tminUnit: 'millisecond',\n\n\t\t\t\t\t\t// defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/\n\t\t\t\t\t\tdisplayFormats: {\n\t\t\t\t\t\t\tmillisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM,\n\t\t\t\t\t\t\tsecond: 'h:mm:ss a', // 11:20:01 AM\n\t\t\t\t\t\t\tminute: 'h:mm a', // 11:20 AM\n\t\t\t\t\t\t\thour: 'hA', // 5PM\n\t\t\t\t\t\t\tday: 'MMM D', // Sep 4\n\t\t\t\t\t\t\tweek: 'll', // Week 46, or maybe \"[W]WW - YYYY\" ?\n\t\t\t\t\t\t\tmonth: 'MMM YYYY', // Sept 2015\n\t\t\t\t\t\t\tquarter: '[Q]Q - YYYY', // Q3\n\t\t\t\t\t\t\tyear: 'YYYY' // 2015\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tticks: {\n\t\t\t\t\t\tautoSkip: false,\n\n\t\t\t\t\t\t/**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n\t\t\t\t\t\tsource: 'auto',\n\n\t\t\t\t\t\tmajor: {\n\t\t\t\t\t\t\tenabled: false\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tvar TimeScale = Scale.extend({\n\t\t\t\t\tinitialize: function initialize() {\n\t\t\t\t\t\tif (!moment) {\n\t\t\t\t\t\t\tthrow new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.mergeTicksOptions();\n\n\t\t\t\t\t\tScale.prototype.initialize.call(this);\n\t\t\t\t\t},\n\n\t\t\t\t\tupdate: function update() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar options = me.options;\n\n\t\t\t\t\t\t// DEPRECATIONS: output a message only one time per update\n\t\t\t\t\t\tif (options.time && options.time.format) {\n\t\t\t\t\t\t\tconsole.warn('options.time.format is deprecated and replaced by options.time.parser.');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn Scale.prototype.update.apply(me, arguments);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Allows data to be referenced via 't' attribute\n */\n\t\t\t\t\tgetRightValue: function getRightValue(rawValue) {\n\t\t\t\t\t\tif (rawValue && rawValue.t !== undefined) {\n\t\t\t\t\t\t\trawValue = rawValue.t;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn Scale.prototype.getRightValue.call(this, rawValue);\n\t\t\t\t\t},\n\n\t\t\t\t\tdetermineDataLimits: function determineDataLimits() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar timeOpts = me.options.time;\n\t\t\t\t\t\tvar unit = timeOpts.unit || 'day';\n\t\t\t\t\t\tvar min = MAX_INTEGER;\n\t\t\t\t\t\tvar max = MIN_INTEGER;\n\t\t\t\t\t\tvar timestamps = [];\n\t\t\t\t\t\tvar datasets = [];\n\t\t\t\t\t\tvar labels = [];\n\t\t\t\t\t\tvar i, j, ilen, jlen, data, timestamp;\n\n\t\t\t\t\t\t// Convert labels to timestamps\n\t\t\t\t\t\tfor (i = 0, ilen = chart.data.labels.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tlabels.push(parse(chart.data.labels[i], me));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Convert data to timestamps\n\t\t\t\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\t\t\t\tif (chart.isDatasetVisible(i)) {\n\t\t\t\t\t\t\t\tdata = chart.data.datasets[i].data;\n\n\t\t\t\t\t\t\t\t// Let's consider that all data have the same format.\n\t\t\t\t\t\t\t\tif (helpers.isObject(data[0])) {\n\t\t\t\t\t\t\t\t\tdatasets[i] = [];\n\n\t\t\t\t\t\t\t\t\tfor (j = 0, jlen = data.length; j < jlen; ++j) {\n\t\t\t\t\t\t\t\t\t\ttimestamp = parse(data[j], me);\n\t\t\t\t\t\t\t\t\t\ttimestamps.push(timestamp);\n\t\t\t\t\t\t\t\t\t\tdatasets[i][j] = timestamp;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\ttimestamps.push.apply(timestamps, labels);\n\t\t\t\t\t\t\t\t\tdatasets[i] = labels.slice(0);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdatasets[i] = [];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (labels.length) {\n\t\t\t\t\t\t\t// Sort labels **after** data have been converted\n\t\t\t\t\t\t\tlabels = arrayUnique(labels).sort(sorter);\n\t\t\t\t\t\t\tmin = Math.min(min, labels[0]);\n\t\t\t\t\t\t\tmax = Math.max(max, labels[labels.length - 1]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (timestamps.length) {\n\t\t\t\t\t\t\ttimestamps = arrayUnique(timestamps).sort(sorter);\n\t\t\t\t\t\t\tmin = Math.min(min, timestamps[0]);\n\t\t\t\t\t\t\tmax = Math.max(max, timestamps[timestamps.length - 1]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmin = parse(timeOpts.min, me) || min;\n\t\t\t\t\t\tmax = parse(timeOpts.max, me) || max;\n\n\t\t\t\t\t\t// In case there is no valid min/max, set limits based on unit time option\n\t\t\t\t\t\tmin = min === MAX_INTEGER ? +moment().startOf(unit) : min;\n\t\t\t\t\t\tmax = max === MIN_INTEGER ? +moment().endOf(unit) + 1 : max;\n\n\t\t\t\t\t\t// Make sure that max is strictly higher than min (required by the lookup table)\n\t\t\t\t\t\tme.min = Math.min(min, max);\n\t\t\t\t\t\tme.max = Math.max(min + 1, max);\n\n\t\t\t\t\t\t// PRIVATE\n\t\t\t\t\t\tme._horizontal = me.isHorizontal();\n\t\t\t\t\t\tme._table = [];\n\t\t\t\t\t\tme._timestamps = {\n\t\t\t\t\t\t\tdata: timestamps,\n\t\t\t\t\t\t\tdatasets: datasets,\n\t\t\t\t\t\t\tlabels: labels\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\n\t\t\t\t\tbuildTicks: function buildTicks() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar min = me.min;\n\t\t\t\t\t\tvar max = me.max;\n\t\t\t\t\t\tvar options = me.options;\n\t\t\t\t\t\tvar timeOpts = options.time;\n\t\t\t\t\t\tvar timestamps = [];\n\t\t\t\t\t\tvar ticks = [];\n\t\t\t\t\t\tvar i, ilen, timestamp;\n\n\t\t\t\t\t\tswitch (options.ticks.source) {\n\t\t\t\t\t\t\tcase 'data':\n\t\t\t\t\t\t\t\ttimestamps = me._timestamps.data;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'labels':\n\t\t\t\t\t\t\t\ttimestamps = me._timestamps.labels;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'auto':\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\ttimestamps = generate(min, max, me.getLabelCapacity(min), options);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (options.bounds === 'ticks' && timestamps.length) {\n\t\t\t\t\t\t\tmin = timestamps[0];\n\t\t\t\t\t\t\tmax = timestamps[timestamps.length - 1];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Enforce limits with user min/max options\n\t\t\t\t\t\tmin = parse(timeOpts.min, me) || min;\n\t\t\t\t\t\tmax = parse(timeOpts.max, me) || max;\n\n\t\t\t\t\t\t// Remove ticks outside the min/max range\n\t\t\t\t\t\tfor (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n\t\t\t\t\t\t\ttimestamp = timestamps[i];\n\t\t\t\t\t\t\tif (timestamp >= min && timestamp <= max) {\n\t\t\t\t\t\t\t\tticks.push(timestamp);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.min = min;\n\t\t\t\t\t\tme.max = max;\n\n\t\t\t\t\t\t// PRIVATE\n\t\t\t\t\t\tme._unit = timeOpts.unit || determineUnitForFormatting(ticks, timeOpts.minUnit, me.min, me.max);\n\t\t\t\t\t\tme._majorUnit = determineMajorUnit(me._unit);\n\t\t\t\t\t\tme._table = buildLookupTable(me._timestamps.data, min, max, options.distribution);\n\t\t\t\t\t\tme._offsets = computeOffsets(me._table, ticks, min, max, options);\n\t\t\t\t\t\tme._labelFormat = determineLabelFormat(me._timestamps.data, timeOpts);\n\n\t\t\t\t\t\treturn ticksFromTimestamps(ticks, me._majorUnit);\n\t\t\t\t\t},\n\n\t\t\t\t\tgetLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar data = me.chart.data;\n\t\t\t\t\t\tvar timeOpts = me.options.time;\n\t\t\t\t\t\tvar label = data.labels && index < data.labels.length ? data.labels[index] : '';\n\t\t\t\t\t\tvar value = data.datasets[datasetIndex].data[index];\n\n\t\t\t\t\t\tif (helpers.isObject(value)) {\n\t\t\t\t\t\t\tlabel = me.getRightValue(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (timeOpts.tooltipFormat) {\n\t\t\t\t\t\t\treturn momentify(label, timeOpts).format(timeOpts.tooltipFormat);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof label === 'string') {\n\t\t\t\t\t\t\treturn label;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn momentify(label, timeOpts).format(me._labelFormat);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Function to format an individual tick mark\n * @private\n */\n\t\t\t\t\ttickFormatFunction: function tickFormatFunction(tick, index, ticks, formatOverride) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar options = me.options;\n\t\t\t\t\t\tvar time = tick.valueOf();\n\t\t\t\t\t\tvar formats = options.time.displayFormats;\n\t\t\t\t\t\tvar minorFormat = formats[me._unit];\n\t\t\t\t\t\tvar majorUnit = me._majorUnit;\n\t\t\t\t\t\tvar majorFormat = formats[majorUnit];\n\t\t\t\t\t\tvar majorTime = tick.clone().startOf(majorUnit).valueOf();\n\t\t\t\t\t\tvar majorTickOpts = options.ticks.major;\n\t\t\t\t\t\tvar major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime;\n\t\t\t\t\t\tvar label = tick.format(formatOverride ? formatOverride : major ? majorFormat : minorFormat);\n\t\t\t\t\t\tvar tickOpts = major ? majorTickOpts : options.ticks.minor;\n\t\t\t\t\t\tvar formatter = helpers.valueOrDefault(tickOpts.callback, tickOpts.userCallback);\n\n\t\t\t\t\t\treturn formatter ? formatter(label, index, ticks) : label;\n\t\t\t\t\t},\n\n\t\t\t\t\tconvertTicksToLabels: function convertTicksToLabels(ticks) {\n\t\t\t\t\t\tvar labels = [];\n\t\t\t\t\t\tvar i, ilen;\n\n\t\t\t\t\t\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tlabels.push(this.tickFormatFunction(moment(ticks[i].value), i, ticks));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn labels;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetPixelForOffset: function getPixelForOffset(time) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar size = me._horizontal ? me.width : me.height;\n\t\t\t\t\t\tvar start = me._horizontal ? me.left : me.top;\n\t\t\t\t\t\tvar pos = interpolate(me._table, 'time', time, 'pos');\n\n\t\t\t\t\t\treturn start + size * (me._offsets.left + pos) / (me._offsets.left + 1 + me._offsets.right);\n\t\t\t\t\t},\n\n\t\t\t\t\tgetPixelForValue: function getPixelForValue(value, index, datasetIndex) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar time = null;\n\n\t\t\t\t\t\tif (index !== undefined && datasetIndex !== undefined) {\n\t\t\t\t\t\t\ttime = me._timestamps.datasets[datasetIndex][index];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (time === null) {\n\t\t\t\t\t\t\ttime = parse(value, me);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (time !== null) {\n\t\t\t\t\t\t\treturn me.getPixelForOffset(time);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tgetPixelForTick: function getPixelForTick(index) {\n\t\t\t\t\t\tvar ticks = this.getTicks();\n\t\t\t\t\t\treturn index >= 0 && index < ticks.length ? this.getPixelForOffset(ticks[index].value) : null;\n\t\t\t\t\t},\n\n\t\t\t\t\tgetValueForPixel: function getValueForPixel(pixel) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar size = me._horizontal ? me.width : me.height;\n\t\t\t\t\t\tvar start = me._horizontal ? me.left : me.top;\n\t\t\t\t\t\tvar pos = (size ? (pixel - start) / size : 0) * (me._offsets.left + 1 + me._offsets.left) - me._offsets.right;\n\t\t\t\t\t\tvar time = interpolate(me._table, 'pos', pos, 'time');\n\n\t\t\t\t\t\treturn moment(time);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Crude approximation of what the label width might be\n * @private\n */\n\t\t\t\t\tgetLabelWidth: function getLabelWidth(label) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar ticksOpts = me.options.ticks;\n\t\t\t\t\t\tvar tickLabelWidth = me.ctx.measureText(label).width;\n\t\t\t\t\t\tvar angle = helpers.toRadians(ticksOpts.maxRotation);\n\t\t\t\t\t\tvar cosRotation = Math.cos(angle);\n\t\t\t\t\t\tvar sinRotation = Math.sin(angle);\n\t\t\t\t\t\tvar tickFontSize = helpers.valueOrDefault(ticksOpts.fontSize, defaults.global.defaultFontSize);\n\n\t\t\t\t\t\treturn tickLabelWidth * cosRotation + tickFontSize * sinRotation;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetLabelCapacity: function getLabelCapacity(exampleTime) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tvar formatOverride = me.options.time.displayFormats.millisecond; // Pick the longest format for guestimation\n\n\t\t\t\t\t\tvar exampleLabel = me.tickFormatFunction(moment(exampleTime), 0, [], formatOverride);\n\t\t\t\t\t\tvar tickLabelWidth = me.getLabelWidth(exampleLabel);\n\t\t\t\t\t\tvar innerWidth = me.isHorizontal() ? me.width : me.height;\n\n\t\t\t\t\t\tvar capacity = Math.floor(innerWidth / tickLabelWidth);\n\t\t\t\t\t\treturn capacity > 0 ? capacity : 1;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tscaleService.registerScaleType('time', TimeScale, defaultConfig);\n\t\t\t};\n\t\t}, { \"1\": 1, \"26\": 26, \"33\": 33, \"34\": 34, \"46\": 46 }] }, {}, [7])(7);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvQ2hhcnQuanM/NDA0ZSJdLCJuYW1lcyI6WyJmIiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImciLCJ3aW5kb3ciLCJnbG9iYWwiLCJzZWxmIiwiQ2hhcnQiLCJyIiwiZSIsIm4iLCJ0IiwibyIsImkiLCJjIiwicmVxdWlyZSIsInUiLCJhIiwiRXJyb3IiLCJjb2RlIiwicCIsImNhbGwiLCJsZW5ndGgiLCJjb2xvck5hbWVzIiwiZ2V0UmdiYSIsImdldEhzbGEiLCJnZXRSZ2IiLCJnZXRIc2wiLCJnZXRId2IiLCJnZXRBbHBoYSIsImhleFN0cmluZyIsInJnYlN0cmluZyIsInJnYmFTdHJpbmciLCJwZXJjZW50U3RyaW5nIiwicGVyY2VudGFTdHJpbmciLCJoc2xTdHJpbmciLCJoc2xhU3RyaW5nIiwiaHdiU3RyaW5nIiwia2V5d29yZCIsInN0cmluZyIsImFiYnIiLCJoZXgiLCJyZ2JhIiwicGVyIiwicmdiIiwibWF0Y2giLCJwYXJzZUludCIsInNsaWNlIiwicGFyc2VGbG9hdCIsIk1hdGgiLCJyb3VuZCIsInNjYWxlIiwiaHNsIiwiYWxwaGEiLCJoIiwicyIsImwiLCJpc05hTiIsImh3YiIsInciLCJiIiwiaHNsYSIsInZhbHMiLCJoZXhEb3VibGUiLCJ1bmRlZmluZWQiLCJyZXZlcnNlTmFtZXMiLCJudW0iLCJtaW4iLCJtYXgiLCJzdHIiLCJ0b1N0cmluZyIsInRvVXBwZXJDYXNlIiwibmFtZSIsImNvbnZlcnQiLCJDb2xvciIsIm9iaiIsInZhbGlkIiwidmFsdWVzIiwiaHN2IiwiY215ayIsInNldFZhbHVlcyIsInJlZCIsImxpZ2h0bmVzcyIsInYiLCJ2YWx1ZSIsIndoaXRlbmVzcyIsImN5YW4iLCJwcm90b3R5cGUiLCJpc1ZhbGlkIiwic2V0U3BhY2UiLCJhcmd1bWVudHMiLCJyZ2JBcnJheSIsImhzbEFycmF5IiwiaHN2QXJyYXkiLCJod2JBcnJheSIsImNvbmNhdCIsImNteWtBcnJheSIsInJnYmFBcnJheSIsImhzbGFBcnJheSIsInZhbCIsInNldENoYW5uZWwiLCJncmVlbiIsImJsdWUiLCJodWUiLCJzYXR1cmF0aW9uIiwic2F0dXJhdGlvbnYiLCJibGFja25lc3MiLCJtYWdlbnRhIiwieWVsbG93IiwiYmxhY2siLCJyZ2JOdW1iZXIiLCJsdW1pbm9zaXR5IiwibHVtIiwiY2hhbiIsInBvdyIsImNvbnRyYXN0IiwiY29sb3IyIiwibHVtMSIsImx1bTIiLCJsZXZlbCIsImNvbnRyYXN0UmF0aW8iLCJkYXJrIiwieWlxIiwibGlnaHQiLCJuZWdhdGUiLCJsaWdodGVuIiwicmF0aW8iLCJkYXJrZW4iLCJzYXR1cmF0ZSIsImRlc2F0dXJhdGUiLCJ3aGl0ZW4iLCJibGFja2VuIiwiZ3JleXNjYWxlIiwiY2xlYXJlciIsIm9wYXF1ZXIiLCJyb3RhdGUiLCJkZWdyZWVzIiwibWl4IiwibWl4aW5Db2xvciIsIndlaWdodCIsImNvbG9yMSIsIncxIiwidzIiLCJ0b0pTT04iLCJjbG9uZSIsInJlc3VsdCIsInNvdXJjZSIsInRhcmdldCIsInR5cGUiLCJwcm9wIiwiaGFzT3duUHJvcGVydHkiLCJjb25zb2xlIiwiZXJyb3IiLCJzcGFjZXMiLCJtYXhlcyIsImdldFZhbHVlcyIsInNwYWNlIiwiY2hhckF0IiwiY2hhbnMiLCJjYXBwZWQiLCJzbmFtZSIsImFyZ3MiLCJBcnJheSIsImluZGV4Iiwic3ZhbHVlcyIsInJnYjJoc2wiLCJyZ2IyaHN2IiwicmdiMmh3YiIsInJnYjJjbXlrIiwicmdiMmtleXdvcmQiLCJyZ2IyeHl6IiwicmdiMmxhYiIsInJnYjJsY2giLCJoc2wycmdiIiwiaHNsMmhzdiIsImhzbDJod2IiLCJoc2wyY215ayIsImhzbDJrZXl3b3JkIiwiaHN2MnJnYiIsImhzdjJoc2wiLCJoc3YyaHdiIiwiaHN2MmNteWsiLCJoc3Yya2V5d29yZCIsImh3YjJyZ2IiLCJod2IyaHNsIiwiaHdiMmhzdiIsImh3YjJjbXlrIiwiaHdiMmtleXdvcmQiLCJjbXlrMnJnYiIsImNteWsyaHNsIiwiY215azJoc3YiLCJjbXlrMmh3YiIsImNteWsya2V5d29yZCIsImtleXdvcmQycmdiIiwia2V5d29yZDJoc2wiLCJrZXl3b3JkMmhzdiIsImtleXdvcmQyaHdiIiwia2V5d29yZDJjbXlrIiwia2V5d29yZDJsYWIiLCJrZXl3b3JkMnh5eiIsInh5ejJyZ2IiLCJ4eXoybGFiIiwieHl6MmxjaCIsImxhYjJ4eXoiLCJsYWIycmdiIiwibGFiMmxjaCIsImxjaDJsYWIiLCJsY2gyeHl6IiwibGNoMnJnYiIsImRlbHRhIiwibSIsInkiLCJrIiwicmV2ZXJzZUtleXdvcmRzIiwiSlNPTiIsInN0cmluZ2lmeSIsIngiLCJ6IiwieHl6IiwidDEiLCJ0MiIsInQzIiwic3YiLCJoaSIsImZsb29yIiwicSIsInNsIiwid2giLCJibCIsImxhYiIsInkyIiwiaHIiLCJhdGFuMiIsIlBJIiwic3FydCIsImxjaCIsImNvcyIsInNpbiIsImNzc0tleXdvcmRzIiwiYWxpY2VibHVlIiwiYW50aXF1ZXdoaXRlIiwiYXF1YSIsImFxdWFtYXJpbmUiLCJhenVyZSIsImJlaWdlIiwiYmlzcXVlIiwiYmxhbmNoZWRhbG1vbmQiLCJibHVldmlvbGV0IiwiYnJvd24iLCJidXJseXdvb2QiLCJjYWRldGJsdWUiLCJjaGFydHJldXNlIiwiY2hvY29sYXRlIiwiY29yYWwiLCJjb3JuZmxvd2VyYmx1ZSIsImNvcm5zaWxrIiwiY3JpbXNvbiIsImRhcmtibHVlIiwiZGFya2N5YW4iLCJkYXJrZ29sZGVucm9kIiwiZGFya2dyYXkiLCJkYXJrZ3JlZW4iLCJkYXJrZ3JleSIsImRhcmtraGFraSIsImRhcmttYWdlbnRhIiwiZGFya29saXZlZ3JlZW4iLCJkYXJrb3JhbmdlIiwiZGFya29yY2hpZCIsImRhcmtyZWQiLCJkYXJrc2FsbW9uIiwiZGFya3NlYWdyZWVuIiwiZGFya3NsYXRlYmx1ZSIsImRhcmtzbGF0ZWdyYXkiLCJkYXJrc2xhdGVncmV5IiwiZGFya3R1cnF1b2lzZSIsImRhcmt2aW9sZXQiLCJkZWVwcGluayIsImRlZXBza3libHVlIiwiZGltZ3JheSIsImRpbWdyZXkiLCJkb2RnZXJibHVlIiwiZmlyZWJyaWNrIiwiZmxvcmFsd2hpdGUiLCJmb3Jlc3RncmVlbiIsImZ1Y2hzaWEiLCJnYWluc2Jvcm8iLCJnaG9zdHdoaXRlIiwiZ29sZCIsImdvbGRlbnJvZCIsImdyYXkiLCJncmVlbnllbGxvdyIsImdyZXkiLCJob25leWRldyIsImhvdHBpbmsiLCJpbmRpYW5yZWQiLCJpbmRpZ28iLCJpdm9yeSIsImtoYWtpIiwibGF2ZW5kZXIiLCJsYXZlbmRlcmJsdXNoIiwibGF3bmdyZWVuIiwibGVtb25jaGlmZm9uIiwibGlnaHRibHVlIiwibGlnaHRjb3JhbCIsImxpZ2h0Y3lhbiIsImxpZ2h0Z29sZGVucm9keWVsbG93IiwibGlnaHRncmF5IiwibGlnaHRncmVlbiIsImxpZ2h0Z3JleSIsImxpZ2h0cGluayIsImxpZ2h0c2FsbW9uIiwibGlnaHRzZWFncmVlbiIsImxpZ2h0c2t5Ymx1ZSIsImxpZ2h0c2xhdGVncmF5IiwibGlnaHRzbGF0ZWdyZXkiLCJsaWdodHN0ZWVsYmx1ZSIsImxpZ2h0eWVsbG93IiwibGltZSIsImxpbWVncmVlbiIsImxpbmVuIiwibWFyb29uIiwibWVkaXVtYXF1YW1hcmluZSIsIm1lZGl1bWJsdWUiLCJtZWRpdW1vcmNoaWQiLCJtZWRpdW1wdXJwbGUiLCJtZWRpdW1zZWFncmVlbiIsIm1lZGl1bXNsYXRlYmx1ZSIsIm1lZGl1bXNwcmluZ2dyZWVuIiwibWVkaXVtdHVycXVvaXNlIiwibWVkaXVtdmlvbGV0cmVkIiwibWlkbmlnaHRibHVlIiwibWludGNyZWFtIiwibWlzdHlyb3NlIiwibW9jY2FzaW4iLCJuYXZham93aGl0ZSIsIm5hdnkiLCJvbGRsYWNlIiwib2xpdmUiLCJvbGl2ZWRyYWIiLCJvcmFuZ2UiLCJvcmFuZ2VyZWQiLCJvcmNoaWQiLCJwYWxlZ29sZGVucm9kIiwicGFsZWdyZWVuIiwicGFsZXR1cnF1b2lzZSIsInBhbGV2aW9sZXRyZWQiLCJwYXBheWF3aGlwIiwicGVhY2hwdWZmIiwicGVydSIsInBpbmsiLCJwbHVtIiwicG93ZGVyYmx1ZSIsInB1cnBsZSIsInJlYmVjY2FwdXJwbGUiLCJyb3N5YnJvd24iLCJyb3lhbGJsdWUiLCJzYWRkbGVicm93biIsInNhbG1vbiIsInNhbmR5YnJvd24iLCJzZWFncmVlbiIsInNlYXNoZWxsIiwic2llbm5hIiwic2lsdmVyIiwic2t5Ymx1ZSIsInNsYXRlYmx1ZSIsInNsYXRlZ3JheSIsInNsYXRlZ3JleSIsInNub3ciLCJzcHJpbmdncmVlbiIsInN0ZWVsYmx1ZSIsInRhbiIsInRlYWwiLCJ0aGlzdGxlIiwidG9tYXRvIiwidHVycXVvaXNlIiwidmlvbGV0Iiwid2hlYXQiLCJ3aGl0ZSIsIndoaXRlc21va2UiLCJ5ZWxsb3dncmVlbiIsImtleSIsImNvbnZlcnNpb25zIiwiQ29udmVydGVyIiwiZnVuYyIsImFyZyIsInBhaXIiLCJleGVjIiwiZnJvbSIsInRvIiwiY29udnMiLCJyb3V0ZVNwYWNlIiwiZnNwYWNlIiwiZm9yRWFjaCIsImhlbHBlcnMiLCJBbmltYXRpb24iLCJhbmltYXRpb25TZXJ2aWNlIiwiZGVmYXVsdHMiLCJFbGVtZW50IiwiZWxlbWVudHMiLCJJbnRlcmFjdGlvbiIsImxheW91dHMiLCJwbGF0Zm9ybSIsInBsdWdpbnMiLCJTY2FsZSIsInNjYWxlU2VydmljZSIsIlRpY2tzIiwiVG9vbHRpcCIsInJlZ2lzdGVyIiwiaW5pdGlhbGl6ZSIsIkxlZ2VuZCIsImxlZ2VuZCIsIl9lbGVtZW50IiwiVGl0bGUiLCJ0aXRsZSIsInBsdWdpblNlcnZpY2UiLCJQbHVnaW5CYXNlIiwiZXh0ZW5kIiwiY2FudmFzSGVscGVycyIsImNhbnZhcyIsImxheW91dFNlcnZpY2UiLCJCYXIiLCJjb250ZXh0IiwiY29uZmlnIiwiQnViYmxlIiwiRG91Z2hudXQiLCJMaW5lIiwiUG9sYXJBcmVhIiwiUmFkYXIiLCJTY2F0dGVyIiwiX3NldCIsImhvdmVyIiwibW9kZSIsInNjYWxlcyIsInhBeGVzIiwiY2F0ZWdvcnlQZXJjZW50YWdlIiwiYmFyUGVyY2VudGFnZSIsIm9mZnNldCIsImdyaWRMaW5lcyIsIm9mZnNldEdyaWRMaW5lcyIsInlBeGVzIiwiYXhpcyIsInBvc2l0aW9uIiwicmVjdGFuZ2xlIiwiYm9yZGVyU2tpcHBlZCIsInRvb2x0aXBzIiwiY2FsbGJhY2tzIiwiaXRlbSIsImRhdGEiLCJ5TGFiZWwiLCJsYWJlbHMiLCJsYWJlbCIsImRhdGFzZXRMYWJlbCIsImRhdGFzZXRzIiwiZGF0YXNldEluZGV4IiwieExhYmVsIiwiY29tcHV0ZU1pblNhbXBsZVNpemUiLCJwaXhlbHMiLCJpc0hvcml6b250YWwiLCJ3aWR0aCIsImhlaWdodCIsInRpY2tzIiwiZ2V0VGlja3MiLCJwcmV2IiwiY3VyciIsImlsZW4iLCJnZXRQaXhlbEZvclRpY2siLCJjb21wdXRlRml0Q2F0ZWdvcnlUcmFpdHMiLCJydWxlciIsIm9wdGlvbnMiLCJ0aGlja25lc3MiLCJiYXJUaGlja25lc3MiLCJjb3VudCIsInN0YWNrQ291bnQiLCJzaXplIiwiaXNOdWxsT3JVbmRlZiIsImNodW5rIiwic3RhcnQiLCJjb21wdXRlRmxleENhdGVnb3J5VHJhaXRzIiwibmV4dCIsInBlcmNlbnQiLCJlbmQiLCJjb250cm9sbGVycyIsImJhciIsIkRhdGFzZXRDb250cm9sbGVyIiwiZGF0YUVsZW1lbnRUeXBlIiwiUmVjdGFuZ2xlIiwibWUiLCJtZXRhIiwiYXBwbHkiLCJnZXRNZXRhIiwic3RhY2siLCJnZXREYXRhc2V0IiwidXBkYXRlIiwicmVzZXQiLCJyZWN0cyIsIl9ydWxlciIsImdldFJ1bGVyIiwidXBkYXRlRWxlbWVudCIsImNoYXJ0IiwiZGF0YXNldCIsImN1c3RvbSIsInJlY3RhbmdsZU9wdGlvbnMiLCJfeFNjYWxlIiwiZ2V0U2NhbGVGb3JJZCIsInhBeGlzSUQiLCJfeVNjYWxlIiwieUF4aXNJRCIsIl9kYXRhc2V0SW5kZXgiLCJfaW5kZXgiLCJfbW9kZWwiLCJiYWNrZ3JvdW5kQ29sb3IiLCJ2YWx1ZUF0SW5kZXhPckRlZmF1bHQiLCJib3JkZXJDb2xvciIsImJvcmRlcldpZHRoIiwidXBkYXRlRWxlbWVudEdlb21ldHJ5IiwicGl2b3QiLCJtb2RlbCIsInZzY2FsZSIsImdldFZhbHVlU2NhbGUiLCJiYXNlIiwiZ2V0QmFzZVBpeGVsIiwiaG9yaXpvbnRhbCIsInZwaXhlbHMiLCJjYWxjdWxhdGVCYXJWYWx1ZVBpeGVscyIsImlwaXhlbHMiLCJjYWxjdWxhdGVCYXJJbmRleFBpeGVscyIsImhlYWQiLCJjZW50ZXIiLCJnZXRWYWx1ZVNjYWxlSWQiLCJnZXRJbmRleFNjYWxlSWQiLCJnZXRJbmRleFNjYWxlIiwiX2dldFN0YWNrcyIsImxhc3QiLCJzdGFja2VkIiwic3RhY2tzIiwiZ2V0RGF0YXNldE1ldGEiLCJpc0RhdGFzZXRWaXNpYmxlIiwiaW5kZXhPZiIsInB1c2giLCJnZXRTdGFja0NvdW50IiwiZ2V0U3RhY2tJbmRleCIsImxlZnQiLCJ0b3AiLCJnZXRQaXhlbEZvclZhbHVlIiwiZ2V0UmlnaHRWYWx1ZSIsImltZXRhIiwiaXZhbHVlIiwiY29udHJvbGxlciIsImlkIiwicmFuZ2UiLCJzdGFja0luZGV4IiwidmFsdWVPckRlZmF1bHQiLCJtYXhCYXJUaGlja25lc3MiLCJJbmZpbml0eSIsImRyYXciLCJjbGlwQXJlYSIsImN0eCIsImNoYXJ0QXJlYSIsInVuY2xpcEFyZWEiLCJob3Jpem9udGFsQmFyIiwiZGF0YVBvaW50IiwiYnViYmxlIiwiUG9pbnQiLCJwb2ludHMiLCJlYWNoIiwicG9pbnQiLCJ4U2NhbGUiLCJ5U2NhbGUiLCJfcmVzb2x2ZUVsZW1lbnRPcHRpb25zIiwiZHNJbmRleCIsImdldFBpeGVsRm9yRGVjaW1hbCIsIk5hTiIsIl9vcHRpb25zIiwiaGl0UmFkaXVzIiwicG9pbnRTdHlsZSIsInJvdGF0aW9uIiwicmFkaXVzIiwic2tpcCIsInNldEhvdmVyU3R5bGUiLCIkcHJldmlvdXNTdHlsZSIsImhvdmVyQmFja2dyb3VuZENvbG9yIiwiZ2V0SG92ZXJDb2xvciIsImhvdmVyQm9yZGVyQ29sb3IiLCJob3ZlckJvcmRlcldpZHRoIiwiaG92ZXJSYWRpdXMiLCJyZXNvbHZlIiwiZGF0YUluZGV4Iiwia2V5cyIsImFuaW1hdGlvbiIsImFuaW1hdGVSb3RhdGUiLCJhbmltYXRlU2NhbGUiLCJsZWdlbmRDYWxsYmFjayIsInRleHQiLCJqb2luIiwiZ2VuZXJhdGVMYWJlbHMiLCJtYXAiLCJkcyIsImFyYyIsImFyY09wdHMiLCJmaWxsIiwic3Ryb2tlIiwiYnciLCJmaWxsU3R5bGUiLCJzdHJva2VTdHlsZSIsImxpbmVXaWR0aCIsImhpZGRlbiIsIm9uQ2xpY2siLCJsZWdlbmRJdGVtIiwiY3V0b3V0UGVyY2VudGFnZSIsImNpcmN1bWZlcmVuY2UiLCJ0b29sdGlwSXRlbSIsImRhdGFMYWJlbCIsImlzQXJyYXkiLCJkb3VnaG51dCIsInBpZSIsIkFyYyIsImxpbmtTY2FsZXMiLCJub29wIiwiZ2V0UmluZ0luZGV4IiwicmluZ0luZGV4IiwiaiIsIm9wdHMiLCJhdmFpbGFibGVXaWR0aCIsInJpZ2h0IiwiYXZhaWxhYmxlSGVpZ2h0IiwiYm90dG9tIiwibWluU2l6ZSIsInN0YXJ0QW5nbGUiLCJlbmRBbmdsZSIsImNvbnRhaW5zMCIsImNvbnRhaW5zOTAiLCJjb250YWluczE4MCIsImNvbnRhaW5zMjcwIiwiY3V0b3V0IiwiZ2V0TWF4Qm9yZGVyV2lkdGgiLCJvdXRlclJhZGl1cyIsImlubmVyUmFkaXVzIiwicmFkaXVzTGVuZ3RoIiwiZ2V0VmlzaWJsZURhdGFzZXRDb3VudCIsIm9mZnNldFgiLCJvZmZzZXRZIiwidG90YWwiLCJjYWxjdWxhdGVUb3RhbCIsImFuaW1hdGlvbk9wdHMiLCJjZW50ZXJYIiwiY2VudGVyWSIsImNhbGN1bGF0ZUNpcmN1bWZlcmVuY2UiLCJlbGVtZW50T3B0cyIsImVsZW1lbnQiLCJhYnMiLCJhcmNzIiwiaG92ZXJXaWR0aCIsIl9jaGFydCIsInNob3dMaW5lcyIsInNwYW5HYXBzIiwibGluZUVuYWJsZWQiLCJzaG93TGluZSIsImxpbmUiLCJkYXRhc2V0RWxlbWVudFR5cGUiLCJsaW5lRWxlbWVudE9wdGlvbnMiLCJ0ZW5zaW9uIiwibGluZVRlbnNpb24iLCJfc2NhbGUiLCJfY2hpbGRyZW4iLCJib3JkZXJDYXBTdHlsZSIsImJvcmRlckRhc2giLCJib3JkZXJEYXNoT2Zmc2V0IiwiYm9yZGVySm9pblN0eWxlIiwic3RlcHBlZExpbmUiLCJzdGVwcGVkIiwiY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSIsInVwZGF0ZUJlemllckNvbnRyb2xQb2ludHMiLCJnZXRQb2ludEJhY2tncm91bmRDb2xvciIsInBvaW50QmFja2dyb3VuZENvbG9yIiwiZ2V0UG9pbnRCb3JkZXJDb2xvciIsInBvaW50Qm9yZGVyQ29sb3IiLCJnZXRQb2ludEJvcmRlcldpZHRoIiwicG9pbnRCb3JkZXJXaWR0aCIsImdldFBvaW50Um90YXRpb24iLCJwb2ludFJvdGF0aW9uIiwicG9pbnRPcHRpb25zIiwicG9pbnRSYWRpdXMiLCJwb2ludEhpdFJhZGl1cyIsImNhbGN1bGF0ZVBvaW50WSIsInN1bVBvcyIsInN1bU5lZyIsImRzTWV0YSIsInN0YWNrZWRSaWdodFZhbHVlIiwiTnVtYmVyIiwicmlnaHRWYWx1ZSIsImFyZWEiLCJjb250cm9sUG9pbnRzIiwiZmlsdGVyIiwicHQiLCJjYXBDb250cm9sUG9pbnQiLCJzcGxpbmVDdXJ2ZU1vbm90b25lIiwic3BsaW5lQ3VydmUiLCJwcmV2aW91c0l0ZW0iLCJuZXh0SXRlbSIsImNvbnRyb2xQb2ludFByZXZpb3VzWCIsInByZXZpb3VzIiwiY29udHJvbFBvaW50UHJldmlvdXNZIiwiY29udHJvbFBvaW50TmV4dFgiLCJjb250cm9sUG9pbnROZXh0WSIsImNhcEJlemllclBvaW50cyIsImhhbGZCb3JkZXJXaWR0aCIsInBvaW50SG92ZXJCYWNrZ3JvdW5kQ29sb3IiLCJwb2ludEhvdmVyQm9yZGVyQ29sb3IiLCJwb2ludEhvdmVyQm9yZGVyV2lkdGgiLCJwb2ludEhvdmVyUmFkaXVzIiwiYW5nbGVMaW5lcyIsImRpc3BsYXkiLCJjaXJjdWxhciIsInBvaW50TGFiZWxzIiwiYmVnaW5BdFplcm8iLCJwb2xhckFyZWEiLCJzdGFydHMiLCJfc3RhcnRzIiwiYW5nbGVzIiwiX2FuZ2xlcyIsImFuZ2xlIiwiX3VwZGF0ZVJhZGl1cyIsImNvdW50VmlzaWJsZUVsZW1lbnRzIiwiX2NvbXB1dGVBbmdsZSIsInhDZW50ZXIiLCJ5Q2VudGVyIiwiZGF0YXNldFN0YXJ0QW5nbGUiLCJkaXN0YW5jZSIsImdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlIiwicmVzZXRSYWRpdXMiLCJyYWRhciIsIl9sb29wIiwicG9pbnRFbGVtZW50T3B0aW9ucyIsInBvaW50UG9zaXRpb24iLCJnZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUiLCJzY2F0dGVyIiwiY3VycmVudFN0ZXAiLCJudW1TdGVwcyIsImVhc2luZyIsInJlbmRlciIsIm9uQW5pbWF0aW9uUHJvZ3Jlc3MiLCJvbkFuaW1hdGlvbkNvbXBsZXRlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXQiLCJzZXQiLCJkdXJhdGlvbiIsIm9uUHJvZ3Jlc3MiLCJvbkNvbXBsZXRlIiwiZnJhbWVEdXJhdGlvbiIsImFuaW1hdGlvbnMiLCJkcm9wRnJhbWVzIiwicmVxdWVzdCIsImFkZEFuaW1hdGlvbiIsImxhenkiLCJhbmltYXRpbmciLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjYW5jZWxBbmltYXRpb24iLCJmaW5kSW5kZXgiLCJzcGxpY2UiLCJyZXF1ZXN0QW5pbUZyYW1lIiwic3RhcnREaWdlc3QiLCJzdGFydFRpbWUiLCJEYXRlIiwibm93IiwiZnJhbWVzVG9Ecm9wIiwiYWR2YW5jZSIsImVuZFRpbWUiLCJjYWxsYmFjayIsInR5cGVzIiwiaW5zdGFuY2VzIiwiaW5pdENvbmZpZyIsImNvbmZpZ01lcmdlIiwidXBkYXRlQ29uZmlnIiwibmV3T3B0aW9ucyIsInJlbW92ZUJveCIsImVuc3VyZVNjYWxlc0hhdmVJRHMiLCJidWlsZE9yVXBkYXRlU2NhbGVzIiwidG9vbHRpcCIsInBvc2l0aW9uSXNIb3Jpem9udGFsIiwiY29uc3RydWN0IiwiYWNxdWlyZUNvbnRleHQiLCJ1aWQiLCJhc3BlY3RSYXRpbyIsIl9idWZmZXJlZFJlbmRlciIsIm5vdGlmeSIsInJldGluYVNjYWxlIiwiZGV2aWNlUGl4ZWxSYXRpbyIsImJpbmRFdmVudHMiLCJyZXNwb25zaXZlIiwicmVzaXplIiwiaW5pdFRvb2xUaXAiLCJjbGVhciIsInN0b3AiLCJzaWxlbnQiLCJtYWludGFpbkFzcGVjdFJhdGlvIiwibmV3V2lkdGgiLCJnZXRNYXhpbXVtV2lkdGgiLCJuZXdIZWlnaHQiLCJnZXRNYXhpbXVtSGVpZ2h0Iiwic3R5bGUiLCJuZXdTaXplIiwib25SZXNpemUiLCJyZXNwb25zaXZlQW5pbWF0aW9uRHVyYXRpb24iLCJzY2FsZXNPcHRpb25zIiwic2NhbGVPcHRpb25zIiwieEF4aXNPcHRpb25zIiwieUF4aXNPcHRpb25zIiwiaXRlbXMiLCJ1cGRhdGVkIiwicmVkdWNlIiwiZHR5cGUiLCJkcG9zaXRpb24iLCJpc0RlZmF1bHQiLCJzY2FsZVR5cGUiLCJzY2FsZUNsYXNzIiwiZ2V0U2NhbGVDb25zdHJ1Y3RvciIsIm1lcmdlVGlja3NPcHRpb25zIiwiaGFzVXBkYXRlZCIsImFkZFNjYWxlc1RvTGF5b3V0IiwiYnVpbGRPclVwZGF0ZUNvbnRyb2xsZXJzIiwibmV3Q29udHJvbGxlcnMiLCJkZXN0cm95RGF0YXNldE1ldGEiLCJ1cGRhdGVJbmRleCIsIkNvbnRyb2xsZXJDbGFzcyIsInJlc2V0RWxlbWVudHMiLCJfaW52YWxpZGF0ZSIsIl9kYXRhIiwiYnVpbGRPclVwZGF0ZUVsZW1lbnRzIiwidXBkYXRlTGF5b3V0IiwidXBkYXRlRGF0YXNldHMiLCJsYXN0QWN0aXZlIiwiX2J1ZmZlcmVkUmVxdWVzdCIsInVwZGF0ZURhdGFzZXQiLCJhbmltYXRpb25PcHRpb25zIiwiYW5pbWF0aW9uT2JqZWN0IiwiZWFzaW5nRnVuY3Rpb24iLCJlZmZlY3RzIiwic3RlcERlY2ltYWwiLCJlYXNpbmdWYWx1ZSIsInRyYW5zaXRpb24iLCJib3hlcyIsImJveCIsImRyYXdEYXRhc2V0cyIsIl9kcmF3VG9vbHRpcCIsImRyYXdEYXRhc2V0IiwiZ2V0RWxlbWVudEF0RXZlbnQiLCJtb2RlcyIsInNpbmdsZSIsImdldEVsZW1lbnRzQXRFdmVudCIsImludGVyc2VjdCIsImdldEVsZW1lbnRzQXRYQXhpcyIsImdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUiLCJtZXRob2QiLCJnZXREYXRhc2V0QXRFdmVudCIsIl9tZXRhIiwiZ2VuZXJhdGVMZWdlbmQiLCJkZXN0cm95IiwidW5iaW5kRXZlbnRzIiwicmVsZWFzZUNvbnRleHQiLCJ0b0Jhc2U2NEltYWdlIiwidG9EYXRhVVJMIiwiX2NoYXJ0SW5zdGFuY2UiLCJsaXN0ZW5lcnMiLCJfbGlzdGVuZXJzIiwibGlzdGVuZXIiLCJldmVudEhhbmRsZXIiLCJldmVudHMiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInVwZGF0ZUhvdmVyU3R5bGUiLCJlbmFibGVkIiwiY2hhbmdlZCIsImhhbmRsZUV2ZW50IiwiX3N0YXJ0IiwiYnVmZmVyZWRSZXF1ZXN0IiwiYW5pbWF0aW9uRHVyYXRpb24iLCJob3Zlck9wdGlvbnMiLCJhY3RpdmUiLCJvbkhvdmVyIiwibmF0aXZlIiwiYXJyYXlFcXVhbHMiLCJDb250cm9sbGVyIiwiYXJyYXlFdmVudHMiLCJsaXN0ZW5BcnJheUV2ZW50cyIsImFycmF5IiwiX2NoYXJ0anMiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwicmVzIiwib2JqZWN0IiwidW5saXN0ZW5BcnJheUV2ZW50cyIsInN0dWIiLCJhZGRFbGVtZW50cyIsInNjYWxlSUQiLCJjcmVhdGVNZXRhRGF0YXNldCIsImNyZWF0ZU1ldGFEYXRhIiwibWV0YURhdGEiLCJhZGRFbGVtZW50QW5kUmVzZXQiLCJyZXN5bmNFbGVtZW50cyIsInJlbW92ZUhvdmVyU3R5bGUiLCJtZXJnZSIsIm51bU1ldGEiLCJudW1EYXRhIiwiaW5zZXJ0RWxlbWVudHMiLCJvbkRhdGFQdXNoIiwib25EYXRhUG9wIiwicG9wIiwib25EYXRhU2hpZnQiLCJzaGlmdCIsIm9uRGF0YVNwbGljZSIsIm9uRGF0YVVuc2hpZnQiLCJpbmhlcml0cyIsInNjb3BlIiwiY29sb3IiLCJpbnRlcnBvbGF0ZSIsInZpZXciLCJlYXNlIiwiYWN0dWFsIiwib3JpZ2luIiwiYzAiLCJjMSIsImlzRmluaXRlIiwiY29uZmlndXJhdGlvbiIsIl92aWV3IiwidG9vbHRpcFBvc2l0aW9uIiwiaGFzVmFsdWUiLCJpc051bWJlciIsIm1lcmdlciIsInR2YWwiLCJzdmFsIiwic2NhbGVNZXJnZSIsImdldFNjYWxlRGVmYXVsdHMiLCJfbWVyZ2VyIiwic2xlbiIsIndoZXJlIiwiY29sbGVjdGlvbiIsImZpbHRlckNhbGxiYWNrIiwiZmlsdGVyZWQiLCJmaW5kTmV4dFdoZXJlIiwiYXJyYXlUb1NlYXJjaCIsInN0YXJ0SW5kZXgiLCJjdXJyZW50SXRlbSIsImZpbmRQcmV2aW91c1doZXJlIiwiYWxtb3N0RXF1YWxzIiwiZXBzaWxvbiIsImFsbW9zdFdob2xlIiwicm91bmRlZCIsIk5FR0FUSVZFX0lORklOSVRZIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJzaWduIiwibG9nMTAiLCJleHBvbmVudCIsImxvZyIsIkxPRzEwRSIsInBvd2VyT2YxMCIsImlzUG93ZXJPZjEwIiwidG9SYWRpYW5zIiwidG9EZWdyZWVzIiwicmFkaWFucyIsImdldEFuZ2xlRnJvbVBvaW50IiwiY2VudHJlUG9pbnQiLCJhbmdsZVBvaW50IiwiZGlzdGFuY2VGcm9tWENlbnRlciIsImRpc3RhbmNlRnJvbVlDZW50ZXIiLCJyYWRpYWxEaXN0YW5jZUZyb21DZW50ZXIiLCJkaXN0YW5jZUJldHdlZW5Qb2ludHMiLCJwdDEiLCJwdDIiLCJhbGlhc1BpeGVsIiwicGl4ZWxXaWR0aCIsImZpcnN0UG9pbnQiLCJtaWRkbGVQb2ludCIsImFmdGVyUG9pbnQiLCJjdXJyZW50IiwiZDAxIiwiZDEyIiwiczAxIiwiczEyIiwiZmEiLCJmYiIsIkVQU0lMT04iLCJwb2ludHNXaXRoVGFuZ2VudHMiLCJkZWx0YUsiLCJtSyIsInBvaW50c0xlbiIsInBvaW50QmVmb3JlIiwicG9pbnRDdXJyZW50IiwicG9pbnRBZnRlciIsInNsb3BlRGVsdGFYIiwiYWxwaGFLIiwiYmV0YUsiLCJ0YXVLIiwic3F1YXJlZE1hZ25pdHVkZSIsImRlbHRhWCIsImxvb3AiLCJuaWNlTnVtIiwiZnJhY3Rpb24iLCJuaWNlRnJhY3Rpb24iLCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJvUmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwibXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJzZXRUaW1lb3V0IiwiZ2V0UmVsYXRpdmVQb3NpdGlvbiIsImV2dCIsIm1vdXNlWCIsIm1vdXNlWSIsIm9yaWdpbmFsRXZlbnQiLCJzcmNFbGVtZW50IiwiYm91bmRpbmdSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwidG91Y2hlcyIsImNsaWVudFgiLCJjbGllbnRZIiwicGFkZGluZ0xlZnQiLCJnZXRTdHlsZSIsInBhZGRpbmdUb3AiLCJwYWRkaW5nUmlnaHQiLCJwYWRkaW5nQm90dG9tIiwiY3VycmVudERldmljZVBpeGVsUmF0aW8iLCJwYXJzZU1heFN0eWxlIiwic3R5bGVWYWx1ZSIsIm5vZGUiLCJwYXJlbnRQcm9wZXJ0eSIsInZhbHVlSW5QaXhlbHMiLCJwYXJlbnROb2RlIiwiaXNDb25zdHJhaW5lZFZhbHVlIiwiZ2V0Q29uc3RyYWludERpbWVuc2lvbiIsImRvbU5vZGUiLCJtYXhTdHlsZSIsInBlcmNlbnRhZ2VQcm9wZXJ0eSIsImRvY3VtZW50IiwiZGVmYXVsdFZpZXciLCJfZ2V0UGFyZW50Tm9kZSIsImNvbnN0cmFpbmVkTm9kZSIsImdldENvbXB1dGVkU3R5bGUiLCJjb25zdHJhaW5lZENvbnRhaW5lciIsImhhc0NOb2RlIiwiaGFzQ0NvbnRhaW5lciIsImluZmluaXR5IiwiZ2V0Q29uc3RyYWludFdpZHRoIiwiZ2V0Q29uc3RyYWludEhlaWdodCIsIl9jYWxjdWxhdGVQYWRkaW5nIiwiY29udGFpbmVyIiwicGFkZGluZyIsInBhcmVudERpbWVuc2lvbiIsInBhcmVudCIsImhvc3QiLCJjbGllbnRXaWR0aCIsImN3IiwiY2xpZW50SGVpZ2h0IiwiY2giLCJlbCIsInByb3BlcnR5IiwiY3VycmVudFN0eWxlIiwiZ2V0UHJvcGVydHlWYWx1ZSIsImZvcmNlUmF0aW8iLCJwaXhlbFJhdGlvIiwiZm9udFN0cmluZyIsInBpeGVsU2l6ZSIsImZvbnRTdHlsZSIsImZvbnRGYW1pbHkiLCJsb25nZXN0VGV4dCIsImZvbnQiLCJhcnJheU9mVGhpbmdzIiwiY2FjaGUiLCJnYyIsImdhcmJhZ2VDb2xsZWN0IiwibG9uZ2VzdCIsInRoaW5nIiwibWVhc3VyZVRleHQiLCJuZXN0ZWRUaGluZyIsImdjTGVuIiwidGV4dFdpZHRoIiwibnVtYmVyT2ZMYWJlbExpbmVzIiwibnVtYmVyT2ZMaW5lcyIsIkNhbnZhc0dyYWRpZW50IiwiZGVmYXVsdENvbG9yIiwiY29sb3JWYWx1ZSIsIkNhbnZhc1BhdHRlcm4iLCJwYXJzZVZpc2libGVJdGVtcyIsImhhbmRsZXIiLCJqbGVuIiwiZ2V0SW50ZXJzZWN0SXRlbXMiLCJpblJhbmdlIiwiZ2V0TmVhcmVzdEl0ZW1zIiwiZGlzdGFuY2VNZXRyaWMiLCJtaW5EaXN0YW5jZSIsIm5lYXJlc3RJdGVtcyIsImdldENlbnRlclBvaW50IiwiZ2V0RGlzdGFuY2VNZXRyaWNGb3JBeGlzIiwidXNlWCIsInVzZVkiLCJkZWx0YVkiLCJpbmRleE1vZGUiLCJuZWFyZXN0Iiwic29ydCIsInNpemVBIiwiZ2V0QXJlYSIsInNpemVCIiwicmV0IiwiaW50ZXJzZWN0c0l0ZW0iLCJpblhSYW5nZSIsImluWVJhbmdlIiwiZGVmYXVsdEZvbnRDb2xvciIsImRlZmF1bHRGb250RmFtaWx5IiwiZGVmYXVsdEZvbnRTaXplIiwiZGVmYXVsdEZvbnRTdHlsZSIsImxheW91dCIsImZpbHRlckJ5UG9zaXRpb24iLCJzb3J0QnlXZWlnaHQiLCJyZXZlcnNlIiwiX3RtcEluZGV4XyIsInYwIiwidjEiLCJhZGRCb3giLCJmdWxsV2lkdGgiLCJsYXlvdXRJdGVtIiwiY29uZmlndXJlIiwicHJvcHMiLCJsYXlvdXRPcHRpb25zIiwidG9QYWRkaW5nIiwibGVmdFBhZGRpbmciLCJyaWdodFBhZGRpbmciLCJ0b3BQYWRkaW5nIiwiYm90dG9tUGFkZGluZyIsImxlZnRCb3hlcyIsInJpZ2h0Qm94ZXMiLCJ0b3BCb3hlcyIsImJvdHRvbUJveGVzIiwiY2hhcnRBcmVhQm94ZXMiLCJjaGFydFdpZHRoIiwiY2hhcnRIZWlnaHQiLCJjaGFydEFyZWFXaWR0aCIsImNoYXJ0QXJlYUhlaWdodCIsInZlcnRpY2FsQm94V2lkdGgiLCJob3Jpem9udGFsQm94SGVpZ2h0IiwibWF4Q2hhcnRBcmVhV2lkdGgiLCJtYXhDaGFydEFyZWFIZWlnaHQiLCJtaW5Cb3hTaXplcyIsImdldE1pbmltdW1Cb3hTaXplIiwibWF4SG9yaXpvbnRhbExlZnRQYWRkaW5nIiwibWF4SG9yaXpvbnRhbFJpZ2h0UGFkZGluZyIsIm1heFZlcnRpY2FsVG9wUGFkZGluZyIsIm1heFZlcnRpY2FsQm90dG9tUGFkZGluZyIsImhvcml6b250YWxCb3giLCJnZXRQYWRkaW5nIiwiYm94UGFkZGluZyIsInZlcnRpY2FsQm94IiwidG90YWxMZWZ0Qm94ZXNXaWR0aCIsInRvdGFsUmlnaHRCb3hlc1dpZHRoIiwidG90YWxUb3BCb3hlc0hlaWdodCIsInRvdGFsQm90dG9tQm94ZXNIZWlnaHQiLCJmaXRCb3giLCJtaW5Cb3hTaXplIiwibWluQm94Iiwic2NhbGVNYXJnaW4iLCJmaW5hbEZpdFZlcnRpY2FsQm94IiwibGVmdFBhZGRpbmdBZGRpdGlvbiIsInRvcFBhZGRpbmdBZGRpdGlvbiIsIm5ld01heENoYXJ0QXJlYUhlaWdodCIsIm5ld01heENoYXJ0QXJlYVdpZHRoIiwicGxhY2VCb3giLCJfcGx1Z2lucyIsIl9jYWNoZUlkIiwicGx1Z2luIiwidW5yZWdpc3RlciIsImlkeCIsImdldEFsbCIsImhvb2siLCJkZXNjcmlwdG9ycyIsImRlc2NyaXB0b3IiLCJwYXJhbXMiLCIkcGx1Z2lucyIsImRyYXdCb3JkZXIiLCJkcmF3T25DaGFydEFyZWEiLCJkcmF3VGlja3MiLCJ0aWNrTWFya0xlbmd0aCIsInplcm9MaW5lV2lkdGgiLCJ6ZXJvTGluZUNvbG9yIiwiemVyb0xpbmVCb3JkZXJEYXNoIiwiemVyb0xpbmVCb3JkZXJEYXNoT2Zmc2V0Iiwic2NhbGVMYWJlbCIsImxhYmVsU3RyaW5nIiwibGluZUhlaWdodCIsIm1pblJvdGF0aW9uIiwibWF4Um90YXRpb24iLCJtaXJyb3IiLCJhdXRvU2tpcCIsImF1dG9Ta2lwUGFkZGluZyIsImxhYmVsT2Zmc2V0IiwiZm9ybWF0dGVycyIsIm1pbm9yIiwibWFqb3IiLCJsYWJlbHNGcm9tVGlja3MiLCJnZXRMaW5lVmFsdWUiLCJsaW5lVmFsdWUiLCJjb21wdXRlVGV4dFNpemUiLCJ0aWNrIiwicGFyc2VGb250T3B0aW9ucyIsImdsb2JhbERlZmF1bHRzIiwiZm9udFNpemUiLCJmYW1pbHkiLCJwYXJzZUxpbmVIZWlnaHQiLCJ0b0xpbmVIZWlnaHQiLCJfdGlja3MiLCJiZWZvcmVVcGRhdGUiLCJtYXhXaWR0aCIsIm1heEhlaWdodCIsIm1hcmdpbnMiLCJsb25nZXN0VGV4dENhY2hlIiwiYmVmb3JlU2V0RGltZW5zaW9ucyIsInNldERpbWVuc2lvbnMiLCJhZnRlclNldERpbWVuc2lvbnMiLCJiZWZvcmVEYXRhTGltaXRzIiwiZGV0ZXJtaW5lRGF0YUxpbWl0cyIsImFmdGVyRGF0YUxpbWl0cyIsImJlZm9yZUJ1aWxkVGlja3MiLCJidWlsZFRpY2tzIiwiYWZ0ZXJCdWlsZFRpY2tzIiwiYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uIiwiY29udmVydFRpY2tzVG9MYWJlbHMiLCJhZnRlclRpY2tUb0xhYmVsQ29udmVyc2lvbiIsImJlZm9yZUNhbGN1bGF0ZVRpY2tSb3RhdGlvbiIsImNhbGN1bGF0ZVRpY2tSb3RhdGlvbiIsImFmdGVyQ2FsY3VsYXRlVGlja1JvdGF0aW9uIiwiYmVmb3JlRml0IiwiZml0IiwiYWZ0ZXJGaXQiLCJhZnRlclVwZGF0ZSIsInRpY2tPcHRzIiwidXNlckNhbGxiYWNrIiwidGlja0ZvbnQiLCJsYWJlbFJvdGF0aW9uIiwib3JpZ2luYWxMYWJlbFdpZHRoIiwibGFiZWxXaWR0aCIsImNvc1JvdGF0aW9uIiwic2luUm90YXRpb24iLCJ0aWNrV2lkdGgiLCJhbmdsZVJhZGlhbnMiLCJzY2FsZUxhYmVsT3B0cyIsImdyaWRMaW5lT3B0cyIsImlzRnVsbFdpZHRoIiwic2NhbGVMYWJlbExpbmVIZWlnaHQiLCJzY2FsZUxhYmVsUGFkZGluZyIsImRlbHRhSGVpZ2h0IiwibGFyZ2VzdFRleHRXaWR0aCIsInRhbGxlc3RMYWJlbEhlaWdodEluTGluZXMiLCJsaW5lU3BhY2UiLCJ0aWNrUGFkZGluZyIsImxvbmdlc3RMYWJlbFdpZHRoIiwibGFiZWxIZWlnaHQiLCJmaXJzdExhYmVsV2lkdGgiLCJsYXN0TGFiZWxXaWR0aCIsImhhbmRsZU1hcmdpbnMiLCJyYXdWYWx1ZSIsImdldExhYmVsRm9ySW5kZXgiLCJnZXRWYWx1ZUZvclBpeGVsIiwiaW5uZXJXaWR0aCIsInBpeGVsIiwiZmluYWxWYWwiLCJpbm5lckhlaWdodCIsImRlY2ltYWwiLCJ2YWx1ZU9mZnNldCIsImdldEJhc2VWYWx1ZSIsIl9hdXRvU2tpcCIsInNraXBSYXRpbyIsIm9wdGlvblRpY2tzIiwidGlja0NvdW50IiwibGFiZWxSb3RhdGlvblJhZGlhbnMiLCJsb25nZXN0Um90YXRlZExhYmVsIiwic2hvdWxkU2tpcCIsIm1heFRpY2tzIiwibWF4VGlja3NMaW1pdCIsIm9wdGlvbk1ham9yVGlja3MiLCJpc1JvdGF0ZWQiLCJ0aWNrRm9udENvbG9yIiwiZm9udENvbG9yIiwibWFqb3JUaWNrRm9udENvbG9yIiwibWFqb3JUaWNrRm9udCIsInRsIiwic2NhbGVMYWJlbEZvbnRDb2xvciIsInNjYWxlTGFiZWxGb250IiwiaXRlbXNUb0RyYXciLCJheGlzV2lkdGgiLCJ4VGlja1N0YXJ0IiwieFRpY2tFbmQiLCJ5VGlja1N0YXJ0IiwieVRpY2tFbmQiLCJsaW5lQ29sb3IiLCJ6ZXJvTGluZUluZGV4IiwidHgxIiwidHkxIiwidHgyIiwidHkyIiwieDEiLCJ5MSIsIngyIiwibGFiZWxYIiwibGFiZWxZIiwidGV4dEFsaWduIiwidGV4dEJhc2VsaW5lIiwibGFiZWxZT2Zmc2V0IiwieExpbmVWYWx1ZSIsImlzTGVmdCIsImxhYmVsWE9mZnNldCIsInlMaW5lVmFsdWUiLCJnbFdpZHRoIiwiZ2xDb2xvciIsImdsQm9yZGVyRGFzaCIsImdsQm9yZGVyRGFzaE9mZnNldCIsIml0ZW1Ub0RyYXciLCJzYXZlIiwic2V0TGluZURhc2giLCJsaW5lRGFzaE9mZnNldCIsImJlZ2luUGF0aCIsIm1vdmVUbyIsImxpbmVUbyIsInJlc3RvcmUiLCJ0cmFuc2xhdGUiLCJsaW5lQ291bnQiLCJmaWxsVGV4dCIsInNjYWxlTGFiZWxYIiwic2NhbGVMYWJlbFkiLCJoYWxmTGluZUhlaWdodCIsImNvbnN0cnVjdG9ycyIsInJlZ2lzdGVyU2NhbGVUeXBlIiwic2NhbGVDb25zdHJ1Y3RvciIsInNjYWxlRGVmYXVsdHMiLCJ1cGRhdGVTY2FsZURlZmF1bHRzIiwiYWRkaXRpb25zIiwibGluZWFyIiwidGlja1ZhbHVlIiwibG9nRGVsdGEiLCJ0aWNrU3RyaW5nIiwibWF4VGljayIsImxvZ1RpY2siLCJ0b0V4cG9uZW50aWFsIiwibnVtRGVjaW1hbCIsInRvRml4ZWQiLCJsb2dhcml0aG1pYyIsInJlbWFpbiIsInRpdGxlRm9udFN0eWxlIiwidGl0bGVTcGFjaW5nIiwidGl0bGVNYXJnaW5Cb3R0b20iLCJ0aXRsZUZvbnRDb2xvciIsInRpdGxlQWxpZ24iLCJib2R5U3BhY2luZyIsImJvZHlGb250Q29sb3IiLCJib2R5QWxpZ24iLCJmb290ZXJGb250U3R5bGUiLCJmb290ZXJTcGFjaW5nIiwiZm9vdGVyTWFyZ2luVG9wIiwiZm9vdGVyRm9udENvbG9yIiwiZm9vdGVyQWxpZ24iLCJ5UGFkZGluZyIsInhQYWRkaW5nIiwiY2FyZXRQYWRkaW5nIiwiY2FyZXRTaXplIiwiY29ybmVyUmFkaXVzIiwibXVsdGlLZXlCYWNrZ3JvdW5kIiwiZGlzcGxheUNvbG9ycyIsImJlZm9yZVRpdGxlIiwidG9vbHRpcEl0ZW1zIiwibGFiZWxDb3VudCIsImFmdGVyVGl0bGUiLCJiZWZvcmVCb2R5IiwiYmVmb3JlTGFiZWwiLCJsYWJlbENvbG9yIiwiYWN0aXZlRWxlbWVudCIsImxhYmVsVGV4dENvbG9yIiwiYWZ0ZXJMYWJlbCIsImFmdGVyQm9keSIsImJlZm9yZUZvb3RlciIsImZvb3RlciIsImFmdGVyRm9vdGVyIiwicG9zaXRpb25lcnMiLCJhdmVyYWdlIiwibGVuIiwicG9zIiwiZXZlbnRQb3NpdGlvbiIsIm5lYXJlc3RFbGVtZW50IiwiZCIsInRwIiwibWVyZ2VPcGFjaXR5IiwiY29sb3JTdHJpbmciLCJvcGFjaXR5IiwicHVzaE9yQ29uY2F0IiwidG9QdXNoIiwic3BsaXROZXdsaW5lcyIsIlN0cmluZyIsInNwbGl0IiwiY3JlYXRlVG9vbHRpcEl0ZW0iLCJnZXRCYXNlTW9kZWwiLCJ0b29sdGlwT3B0cyIsInhBbGlnbiIsInlBbGlnbiIsIl9ib2R5Rm9udEZhbWlseSIsImJvZHlGb250RmFtaWx5IiwiX2JvZHlGb250U3R5bGUiLCJib2R5Rm9udFN0eWxlIiwiX2JvZHlBbGlnbiIsImJvZHlGb250U2l6ZSIsIl90aXRsZUZvbnRGYW1pbHkiLCJ0aXRsZUZvbnRGYW1pbHkiLCJfdGl0bGVGb250U3R5bGUiLCJ0aXRsZUZvbnRTaXplIiwiX3RpdGxlQWxpZ24iLCJfZm9vdGVyRm9udEZhbWlseSIsImZvb3RlckZvbnRGYW1pbHkiLCJfZm9vdGVyRm9udFN0eWxlIiwiZm9vdGVyRm9udFNpemUiLCJfZm9vdGVyQWxpZ24iLCJsZWdlbmRDb2xvckJhY2tncm91bmQiLCJnZXRUb29sdGlwU2l6ZSIsImJvZHkiLCJjb21iaW5lZEJvZHlMZW5ndGgiLCJib2R5SXRlbSIsImJlZm9yZSIsImxpbmVzIiwiYWZ0ZXIiLCJ0aXRsZUxpbmVDb3VudCIsImZvb3RlckxpbmVDb3VudCIsIndpZHRoUGFkZGluZyIsIm1heExpbmVXaWR0aCIsImRldGVybWluZUFsaWdubWVudCIsImxmIiwicmYiLCJvbGYiLCJvcmYiLCJ5ZiIsIm1pZFgiLCJtaWRZIiwiZ2V0QmFja2dyb3VuZFBvaW50Iiwidm0iLCJhbGlnbm1lbnQiLCJwYWRkaW5nQW5kU2l6ZSIsInJhZGl1c0FuZFBhZGRpbmciLCJnZXRCZWZvcmVBZnRlckJvZHlMaW5lcyIsIl9sYXN0QWN0aXZlIiwiZ2V0VGl0bGUiLCJnZXRCZWZvcmVCb2R5IiwiZ2V0Qm9keSIsImJvZHlJdGVtcyIsImdldEFmdGVyQm9keSIsImdldEZvb3RlciIsImV4aXN0aW5nTW9kZWwiLCJfYWN0aXZlIiwiYmFja2dyb3VuZFBvaW50IiwidG9vbHRpcFNpemUiLCJjYXJldFgiLCJjYXJldFkiLCJsYWJlbENvbG9ycyIsImxhYmVsVGV4dENvbG9ycyIsIl9ldmVudFBvc2l0aW9uIiwiaXRlbVNvcnQiLCJkYXRhUG9pbnRzIiwiZHJhd0NhcmV0IiwidG9vbHRpcFBvaW50IiwiY2FyZXRQb3NpdGlvbiIsImdldENhcmV0UG9zaXRpb24iLCJ4MyIsInkzIiwicHRYIiwicHRZIiwidG1wIiwiZHJhd1RpdGxlIiwiZHJhd0JvZHkiLCJ4TGluZVBhZGRpbmciLCJmaWxsTGluZU9mVGV4dCIsImRyYXdDb2xvckJveGVzIiwidGV4dENvbG9yIiwiZmlsbFJlY3QiLCJzdHJva2VSZWN0IiwiZHJhd0Zvb3RlciIsImRyYXdCYWNrZ3JvdW5kIiwicXVhZHJhdGljQ3VydmVUbyIsImNsb3NlUGF0aCIsImhhc1Rvb2x0aXBDb250ZW50IiwiaW5MYWJlbFJhbmdlIiwiY2hhcnRYIiwiY2hhcnRZIiwicG9pbnRSZWxhdGl2ZVBvc2l0aW9uIiwiYmV0d2VlbkFuZ2xlcyIsIndpdGhpblJhZGl1cyIsImhhbGZBbmdsZSIsImhhbGZSYWRpdXMiLCJjZW50cmVBbmdsZSIsInJhbmdlRnJvbUNlbnRyZSIsInNBIiwiZUEiLCJsaW5lSm9pbiIsImdsb2JhbE9wdGlvbkxpbmVFbGVtZW50cyIsImxhc3REcmF3bkluZGV4IiwiY3VycmVudFZNIiwibGluZUNhcCIsInhSYW5nZSIsInlSYW5nZSIsImVyck1hcmdpbiIsImRyYXdQb2ludCIsImlzVmVydGljYWwiLCJnZXRCYXJCb3VuZHMiLCJoYWxmV2lkdGgiLCJoYWxmSGVpZ2h0Iiwic2lnblgiLCJzaWduWSIsImJhclNpemUiLCJoYWxmU3Ryb2tlIiwiYm9yZGVyTGVmdCIsImJvcmRlclJpZ2h0IiwiYm9yZGVyVG9wIiwiYm9yZGVyQm90dG9tIiwiY29ybmVycyIsImJvcmRlcnMiLCJzdGFydENvcm5lciIsImNvcm5lckF0IiwiY29ybmVyIiwiYm91bmRzIiwiY2xlYXJSZWN0Iiwicm91bmRlZFJlY3QiLCJhcmNUbyIsInJlY3QiLCJlZGdlTGVuZ3RoIiwieE9mZnNldCIsInlPZmZzZXQiLCJkcmF3SW1hZ2UiLCJTUVJUMiIsImxlZnRYIiwidG9wWSIsInNpZGVTaXplIiwiY2xpcCIsImZsaXAiLCJiZXppZXJDdXJ2ZVRvIiwiZHJhd1JvdW5kZWRSZWN0YW5nbGUiLCJpc09iamVjdCIsImRlZmF1bHRWYWx1ZSIsImZuIiwidGhpc0FyZyIsImxvb3BhYmxlIiwiYTAiLCJhMSIsImtsZW4iLCJfbWVyZ2VySWYiLCJtZXJnZUlmIiwic291cmNlcyIsInNldEZuIiwiZXh0ZW5zaW9ucyIsIkNoYXJ0RWxlbWVudCIsImNvbnN0cnVjdG9yIiwiU3Vycm9nYXRlIiwiX19zdXBlcl9fIiwiY2FsbENhbGxiYWNrIiwiZnJvbUluZGV4IiwiZ2V0VmFsdWVPckRlZmF1bHQiLCJnZXRWYWx1ZUF0SW5kZXhPckRlZmF1bHQiLCJlYXNlSW5RdWFkIiwiZWFzZU91dFF1YWQiLCJlYXNlSW5PdXRRdWFkIiwiZWFzZUluQ3ViaWMiLCJlYXNlT3V0Q3ViaWMiLCJlYXNlSW5PdXRDdWJpYyIsImVhc2VJblF1YXJ0IiwiZWFzZU91dFF1YXJ0IiwiZWFzZUluT3V0UXVhcnQiLCJlYXNlSW5RdWludCIsImVhc2VPdXRRdWludCIsImVhc2VJbk91dFF1aW50IiwiZWFzZUluU2luZSIsImVhc2VPdXRTaW5lIiwiZWFzZUluT3V0U2luZSIsImVhc2VJbkV4cG8iLCJlYXNlT3V0RXhwbyIsImVhc2VJbk91dEV4cG8iLCJlYXNlSW5DaXJjIiwiZWFzZU91dENpcmMiLCJlYXNlSW5PdXRDaXJjIiwiZWFzZUluRWxhc3RpYyIsImFzaW4iLCJlYXNlT3V0RWxhc3RpYyIsImVhc2VJbk91dEVsYXN0aWMiLCJlYXNlSW5CYWNrIiwiZWFzZU91dEJhY2siLCJlYXNlSW5PdXRCYWNrIiwiZWFzZUluQm91bmNlIiwiZWFzZU91dEJvdW5jZSIsImVhc2VJbk91dEJvdW5jZSIsImVhc2luZ0VmZmVjdHMiLCJtYXRjaGVzIiwiaW5wdXRzIiwiZ2V0Q29udGV4dCIsIkVYUEFORE9fS0VZIiwiQ1NTX1BSRUZJWCIsIkNTU19SRU5ERVJfTU9OSVRPUiIsIkNTU19SRU5ERVJfQU5JTUFUSU9OIiwiQU5JTUFUSU9OX1NUQVJUX0VWRU5UUyIsIkVWRU5UX1RZUEVTIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIiwicG9pbnRlcmVudGVyIiwicG9pbnRlcmRvd24iLCJwb2ludGVybW92ZSIsInBvaW50ZXJ1cCIsInBvaW50ZXJsZWF2ZSIsInBvaW50ZXJvdXQiLCJyZWFkVXNlZFNpemUiLCJpbml0Q2FudmFzIiwicmVuZGVySGVpZ2h0IiwiZ2V0QXR0cmlidXRlIiwicmVuZGVyV2lkdGgiLCJpbml0aWFsIiwiZGlzcGxheVdpZHRoIiwiZGlzcGxheUhlaWdodCIsInN1cHBvcnRzRXZlbnRMaXN0ZW5lck9wdGlvbnMiLCJzdXBwb3J0cyIsImV2ZW50TGlzdGVuZXJPcHRpb25zIiwicGFzc2l2ZSIsImNyZWF0ZUV2ZW50IiwibmF0aXZlRXZlbnQiLCJmcm9tTmF0aXZlRXZlbnQiLCJldmVudCIsInRocm90dGxlZCIsInRpY2tpbmciLCJjcmVhdGVSZXNpemVyIiwicmVzaXplciIsImNyZWF0ZUVsZW1lbnQiLCJjbHMiLCJtYXhTaXplIiwiY3NzVGV4dCIsImNsYXNzTmFtZSIsImlubmVySFRNTCIsImV4cGFuZCIsImNoaWxkTm9kZXMiLCJzaHJpbmsiLCJfcmVzZXQiLCJzY3JvbGxMZWZ0Iiwic2Nyb2xsVG9wIiwib25TY3JvbGwiLCJiaW5kIiwid2F0Y2hGb3JSZW5kZXIiLCJleHBhbmRvIiwicHJveHkiLCJyZW5kZXJQcm94eSIsImFuaW1hdGlvbk5hbWUiLCJyZWZsb3ciLCJvZmZzZXRQYXJlbnQiLCJjbGFzc0xpc3QiLCJhZGQiLCJ1bndhdGNoRm9yUmVuZGVyIiwicmVtb3ZlIiwiYWRkUmVzaXplTGlzdGVuZXIiLCJpbnNlcnRCZWZvcmUiLCJmaXJzdENoaWxkIiwicmVtb3ZlUmVzaXplTGlzdGVuZXIiLCJyZW1vdmVDaGlsZCIsImluamVjdENTUyIsImNzcyIsIl9zdHlsZSIsInNldEF0dHJpYnV0ZSIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYXBwZW5kQ2hpbGQiLCJjcmVhdGVUZXh0Tm9kZSIsIl9lbmFibGVkIiwia2V5ZnJhbWVzIiwiZ2V0RWxlbWVudEJ5SWQiLCJyZW1vdmVBdHRyaWJ1dGUiLCJwcm94aWVzIiwiYWRkRXZlbnQiLCJyZW1vdmVFdmVudCIsImJhc2ljIiwiZG9tIiwiaW1wbGVtZW50YXRpb24iLCJmaWxsZXIiLCJwcm9wYWdhdGUiLCJtYXBwZXJzIiwidmlzaWJsZSIsImJvdW5kYXJ5IiwiZGVjb2RlRmlsbCIsImNvbXB1dGVCb3VuZGFyeSIsInNjYWxlQm90dG9tIiwic2NhbGVUb3AiLCJzY2FsZVplcm8iLCJnZXRCYXNlUG9zaXRpb24iLCJyZXNvbHZlVGFyZ2V0IiwidmlzaXRlZCIsImNyZWF0ZU1hcHBlciIsImlzRHJhd2FibGUiLCJkcmF3QXJlYSIsImN1cnZlMCIsImN1cnZlMSIsImxlbjAiLCJsZW4xIiwiZG9GaWxsIiwibWFwcGVyIiwic3BhbiIsInAwIiwicDEiLCJkMCIsImQxIiwiYWZ0ZXJEYXRhc2V0c1VwZGF0ZSIsIiRmaWxsZXIiLCJiZWZvcmVEYXRhc2V0RHJhdyIsImNpIiwiYm94V2lkdGgiLCJsaW5lRGFzaCIsImdldEJveFdpZHRoIiwibGFiZWxPcHRzIiwidXNlUG9pbnRTdHlsZSIsImxlZ2VuZEhpdEJveGVzIiwiZG91Z2hudXRNb2RlIiwiYmVmb3JlQnVpbGRMYWJlbHMiLCJidWlsZExhYmVscyIsImFmdGVyQnVpbGRMYWJlbHMiLCJsZWdlbmRJdGVtcyIsImdsb2JhbERlZmF1bHQiLCJsYWJlbEZvbnQiLCJoaXRib3hlcyIsImxpbmVXaWR0aHMiLCJ0b3RhbEhlaWdodCIsInZQYWRkaW5nIiwiY29sdW1uV2lkdGhzIiwidG90YWxXaWR0aCIsImN1cnJlbnRDb2xXaWR0aCIsImN1cnJlbnRDb2xIZWlnaHQiLCJpdGVtSGVpZ2h0IiwiaXRlbVdpZHRoIiwibGluZURlZmF1bHQiLCJsZWdlbmRXaWR0aCIsImN1cnNvciIsImRyYXdMZWdlbmRCb3giLCJpc0xpbmVXaWR0aFplcm8iLCJvZmZTZXQiLCJoYWxmRm9udFNpemUiLCJ4TGVmdCIsInlNaWRkbGUiLCJsaCIsImhpdEJveCIsImNyZWF0ZU5ld0xlZ2VuZEFuZEF0dGFjaCIsImxlZ2VuZE9wdHMiLCJiZWZvcmVJbml0IiwiYWZ0ZXJFdmVudCIsInRleHRTaXplIiwidGl0bGVGb250IiwidGl0bGVYIiwidGl0bGVZIiwiY3JlYXRlTmV3VGl0bGVCbG9ja0FuZEF0dGFjaCIsInRpdGxlT3B0cyIsInRpdGxlQmxvY2siLCJkZWZhdWx0Q29uZmlnIiwiRGF0YXNldFNjYWxlIiwiZ2V0TGFiZWxzIiwieExhYmVscyIsInlMYWJlbHMiLCJtaW5JbmRleCIsIm1heEluZGV4Iiwib2Zmc2V0QW10IiwidmFsdWVDYXRlZ29yeSIsInZhbHVlV2lkdGgiLCJ3aWR0aE9mZnNldCIsInZhbHVlSGVpZ2h0IiwiaGVpZ2h0T2Zmc2V0IiwiaG9yeiIsInZhbHVlRGltZW5zaW9uIiwiTGluZWFyU2NhbGUiLCJMaW5lYXJTY2FsZUJhc2UiLCJERUZBVUxUX01JTiIsIkRFRkFVTFRfTUFYIiwiSURNYXRjaGVzIiwiaGFzU3RhY2tzIiwidmFsdWVzUGVyU3RhY2siLCJwb3NpdGl2ZVZhbHVlcyIsIm5lZ2F0aXZlVmFsdWVzIiwicmVsYXRpdmVQb2ludHMiLCJ2YWx1ZXNGb3JUeXBlIiwibWluVmFsIiwibWF4VmFsIiwiaGFuZGxlVGlja1JhbmdlT3B0aW9ucyIsImdldFRpY2tMaW1pdCIsImNlaWwiLCJ0aWNrRm9udFNpemUiLCJoYW5kbGVEaXJlY3Rpb25hbENoYW5nZXMiLCJpbm5lckRpbWVuc2lvbiIsInRpY2tzQXNOdW1iZXJzIiwiZ2VuZXJhdGVUaWNrcyIsImdlbmVyYXRpb25PcHRpb25zIiwiZGF0YVJhbmdlIiwiZmFjdG9yIiwicHJlY2lzaW9uIiwic3BhY2luZyIsInN0ZXBTaXplIiwibmljZVJhbmdlIiwibmljZU1pbiIsIm5pY2VNYXgiLCJudW1TcGFjZXMiLCJtaW5TaWduIiwibWF4U2lnbiIsInNldE1pbiIsInN1Z2dlc3RlZE1pbiIsInNldE1heCIsInN1Z2dlc3RlZE1heCIsIm51bWVyaWNHZW5lcmF0b3JPcHRpb25zIiwiZml4ZWRTdGVwU2l6ZSIsInRpY2tWYWwiLCJlbmRFeHAiLCJlbmRTaWduaWZpY2FuZCIsImV4cCIsInNpZ25pZmljYW5kIiwibWluTm90WmVybyIsImxhc3RUaWNrIiwiTG9nYXJpdGhtaWNTY2FsZSIsInRpY2tWYWx1ZXMiLCJfZ2V0Rmlyc3RUaWNrVmFsdWUiLCJmaXJzdFRpY2tWYWx1ZSIsImFuaW1hdGUiLCJzaG93TGFiZWxCYWNrZHJvcCIsImJhY2tkcm9wQ29sb3IiLCJiYWNrZHJvcFBhZGRpbmdZIiwiYmFja2Ryb3BQYWRkaW5nWCIsImdldFZhbHVlQ291bnQiLCJnZXRQb2ludExhYmVsRm9udE9wdGlvbnMiLCJwb2ludExhYmVsT3B0aW9ucyIsIm1lYXN1cmVMYWJlbFNpemUiLCJkZXRlcm1pbmVMaW1pdHMiLCJmaXRXaXRoUG9pbnRMYWJlbHMiLCJwbEZvbnQiLCJsYXJnZXN0UG9zc2libGVSYWRpdXMiLCJmdXJ0aGVzdExpbWl0cyIsImZ1cnRoZXN0QW5nbGVzIiwiX3BvaW50TGFiZWxTaXplcyIsInZhbHVlQ291bnQiLCJnZXRQb2ludFBvc2l0aW9uIiwiZ2V0SW5kZXhBbmdsZSIsImhMaW1pdHMiLCJ2TGltaXRzIiwic2V0UmVkdWN0aW9ucyIsImRyYXdpbmdBcmVhIiwic2V0Q2VudGVyUG9pbnQiLCJnZXRUZXh0QWxpZ25Gb3JBbmdsZSIsImFkanVzdFBvaW50UG9zaXRpb25Gb3JMYWJlbEhlaWdodCIsImRyYXdQb2ludExhYmVscyIsImFuZ2xlTGluZU9wdHMiLCJwb2ludExhYmVsT3B0cyIsIm91dGVyRGlzdGFuY2UiLCJvdXRlclBvc2l0aW9uIiwicG9pbnRMYWJlbFBvc2l0aW9uIiwicG9pbnRMYWJlbEZvbnRDb2xvciIsImRyYXdSYWRpdXNMaW5lIiwibnVtYmVyT3JaZXJvIiwicGFyYW0iLCJMaW5lYXJSYWRpYWxTY2FsZSIsInJhZGl1c1JlZHVjdGlvbkxlZnQiLCJyYWRpdXNSZWR1Y3Rpb25SaWdodCIsInJhZGl1c1JlZHVjdGlvblRvcCIsInJhZGl1c1JlZHVjdGlvbkJvdHRvbSIsImxlZnRNb3ZlbWVudCIsInJpZ2h0TW92ZW1lbnQiLCJ0b3BNb3ZlbWVudCIsImJvdHRvbU1vdmVtZW50IiwibWF4UmlnaHQiLCJtYXhMZWZ0IiwibWF4VG9wIiwibWF4Qm90dG9tIiwiYW5nbGVNdWx0aXBsaWVyIiwic3RhcnRBbmdsZVJhZGlhbnMiLCJzY2FsaW5nRmFjdG9yIiwiZGlzdGFuY2VGcm9tQ2VudGVyIiwidGhpc0FuZ2xlIiwidGlja0ZvbnRTdHlsZSIsInRpY2tGb250RmFtaWx5IiwidGlja0xhYmVsRm9udCIsInlDZW50ZXJPZmZzZXQiLCJtb21lbnQiLCJNSU5fSU5URUdFUiIsIk1JTl9TQUZFX0lOVEVHRVIiLCJNQVhfSU5URUdFUiIsIk1BWF9TQUZFX0lOVEVHRVIiLCJJTlRFUlZBTFMiLCJtaWxsaXNlY29uZCIsImNvbW1vbiIsInN0ZXBzIiwic2Vjb25kIiwibWludXRlIiwiaG91ciIsImRheSIsIndlZWsiLCJtb250aCIsInF1YXJ0ZXIiLCJ5ZWFyIiwiVU5JVFMiLCJzb3J0ZXIiLCJhcnJheVVuaXF1ZSIsImhhc2giLCJvdXQiLCJidWlsZExvb2t1cFRhYmxlIiwidGltZXN0YW1wcyIsImRpc3RyaWJ1dGlvbiIsInRpbWUiLCJ0YWJsZSIsImxvb2t1cCIsImxvIiwibWlkIiwiaTAiLCJpMSIsInNrZXkiLCJ0a2V5IiwibW9tZW50aWZ5IiwicGFyc2VyIiwiZm9ybWF0IiwicGFyc2UiLCJpbnB1dCIsInN0YXJ0T2YiLCJ2YWx1ZU9mIiwiZGV0ZXJtaW5lU3RlcFNpemUiLCJ1bml0IiwiY2FwYWNpdHkiLCJpbnRlcnZhbCIsIm1pbGxpc2Vjb25kcyIsImRldGVybWluZVVuaXRGb3JBdXRvVGlja3MiLCJtaW5Vbml0IiwiZGV0ZXJtaW5lVW5pdEZvckZvcm1hdHRpbmciLCJkaWZmIiwiYXMiLCJkZXRlcm1pbmVNYWpvclVuaXQiLCJnZW5lcmF0ZSIsInRpbWVPcHRzIiwidW5pdFN0ZXBTaXplIiwid2Vla2RheSIsImlzb1dlZWtkYXkiLCJtYWpvclRpY2tzRW5hYmxlZCIsImZpcnN0IiwiY29tcHV0ZU9mZnNldHMiLCJ1cHBlciIsImxvd2VyIiwidGlja3NGcm9tVGltZXN0YW1wcyIsIm1ham9yVW5pdCIsImRldGVybWluZUxhYmVsRm9ybWF0IiwibW9tZW50RGF0ZSIsImhhc1RpbWUiLCJkaXNwbGF5Rm9ybWF0IiwiZGlzcGxheUZvcm1hdHMiLCJUaW1lU2NhbGUiLCJ3YXJuIiwidGltZXN0YW1wIiwiZW5kT2YiLCJfaG9yaXpvbnRhbCIsIl90YWJsZSIsIl90aW1lc3RhbXBzIiwiZ2V0TGFiZWxDYXBhY2l0eSIsIl91bml0IiwiX21ham9yVW5pdCIsIl9vZmZzZXRzIiwiX2xhYmVsRm9ybWF0IiwidG9vbHRpcEZvcm1hdCIsInRpY2tGb3JtYXRGdW5jdGlvbiIsImZvcm1hdE92ZXJyaWRlIiwiZm9ybWF0cyIsIm1pbm9yRm9ybWF0IiwibWFqb3JGb3JtYXQiLCJtYWpvclRpbWUiLCJtYWpvclRpY2tPcHRzIiwiZm9ybWF0dGVyIiwiZ2V0UGl4ZWxGb3JPZmZzZXQiLCJnZXRMYWJlbFdpZHRoIiwidGlja3NPcHRzIiwidGlja0xhYmVsV2lkdGgiLCJleGFtcGxlVGlt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QWtEaE0sYUFBbEQ7QUFDQSxJQXBXRDtBQXNXQyxHQW54QnVDLEVBbXhCdEMsRUFBQyxLQUFJLENBQUwsRUFBTyxNQUFLLEVBQVosRUFBZSxNQUFLLEVBQXBCLEVBQXVCLE1BQUssRUFBNUIsRUFBK0IsTUFBSyxFQUFwQyxFQW54QnNDLENBMTFhaXhCLEVBQTVjLEVBNm1jalUsRUE3bWNpVSxFQTZtYzlULENBQUMsQ0FBRCxDQTdtYzhULEVBNm1jelQsQ0E3bWN5VCxDQUFQO0FBOG1jclcsQ0E5bWNEIiwiZmlsZSI6IjcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIENoYXJ0LmpzXG4gKiBodHRwOi8vY2hhcnRqcy5vcmcvXG4gKiBWZXJzaW9uOiAyLjcuM1xuICpcbiAqIENvcHlyaWdodCAyMDE4IENoYXJ0LmpzIENvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9ibG9iL21hc3Rlci9MSUNFTlNFLm1kXG4gKi9cbihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PVwib2JqZWN0XCImJnR5cGVvZiBtb2R1bGUhPT1cInVuZGVmaW5lZFwiKXttb2R1bGUuZXhwb3J0cz1mKCl9ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09XCJmdW5jdGlvblwiJiZkZWZpbmUuYW1kKXtkZWZpbmUoW10sZil9ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIil7Zz13aW5kb3d9ZWxzZSBpZih0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIil7Zz1nbG9iYWx9ZWxzZSBpZih0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCIpe2c9c2VsZn1lbHNle2c9dGhpc31nLkNoYXJ0ID0gZigpfX0pKGZ1bmN0aW9uKCl7dmFyIGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cbn0se31dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuLyogTUlUIGxpY2Vuc2UgKi9cbnZhciBjb2xvck5hbWVzID0gcmVxdWlyZSg2KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICBnZXRSZ2JhOiBnZXRSZ2JhLFxuICAgZ2V0SHNsYTogZ2V0SHNsYSxcbiAgIGdldFJnYjogZ2V0UmdiLFxuICAgZ2V0SHNsOiBnZXRIc2wsXG4gICBnZXRId2I6IGdldEh3YixcbiAgIGdldEFscGhhOiBnZXRBbHBoYSxcblxuICAgaGV4U3RyaW5nOiBoZXhTdHJpbmcsXG4gICByZ2JTdHJpbmc6IHJnYlN0cmluZyxcbiAgIHJnYmFTdHJpbmc6IHJnYmFTdHJpbmcsXG4gICBwZXJjZW50U3RyaW5nOiBwZXJjZW50U3RyaW5nLFxuICAgcGVyY2VudGFTdHJpbmc6IHBlcmNlbnRhU3RyaW5nLFxuICAgaHNsU3RyaW5nOiBoc2xTdHJpbmcsXG4gICBoc2xhU3RyaW5nOiBoc2xhU3RyaW5nLFxuICAgaHdiU3RyaW5nOiBod2JTdHJpbmcsXG4gICBrZXl3b3JkOiBrZXl3b3JkXG59XG5cbmZ1bmN0aW9uIGdldFJnYmEoc3RyaW5nKSB7XG4gICBpZiAoIXN0cmluZykge1xuICAgICAgcmV0dXJuO1xuICAgfVxuICAgdmFyIGFiYnIgPSAgL14jKFthLWZBLUYwLTldezN9KSQvaSxcbiAgICAgICBoZXggPSAgL14jKFthLWZBLUYwLTldezZ9KSQvaSxcbiAgICAgICByZ2JhID0gL15yZ2JhP1xcKFxccyooWystXT9cXGQrKVxccyosXFxzKihbKy1dP1xcZCspXFxzKixcXHMqKFsrLV0/XFxkKylcXHMqKD86LFxccyooWystXT9bXFxkXFwuXSspXFxzKik/XFwpJC9pLFxuICAgICAgIHBlciA9IC9ecmdiYT9cXChcXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyosXFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqLFxccyooWystXT9bXFxkXFwuXSspXFwlXFxzKig/OixcXHMqKFsrLV0/W1xcZFxcLl0rKVxccyopP1xcKSQvaSxcbiAgICAgICBrZXl3b3JkID0gLyhcXHcrKS87XG5cbiAgIHZhciByZ2IgPSBbMCwgMCwgMF0sXG4gICAgICAgYSA9IDEsXG4gICAgICAgbWF0Y2ggPSBzdHJpbmcubWF0Y2goYWJicik7XG4gICBpZiAobWF0Y2gpIHtcbiAgICAgIG1hdGNoID0gbWF0Y2hbMV07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJnYi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgcmdiW2ldID0gcGFyc2VJbnQobWF0Y2hbaV0gKyBtYXRjaFtpXSwgMTYpO1xuICAgICAgfVxuICAgfVxuICAgZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goaGV4KSkge1xuICAgICAgbWF0Y2ggPSBtYXRjaFsxXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICByZ2JbaV0gPSBwYXJzZUludChtYXRjaC5zbGljZShpICogMiwgaSAqIDIgKyAyKSwgMTYpO1xuICAgICAgfVxuICAgfVxuICAgZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocmdiYSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICByZ2JbaV0gPSBwYXJzZUludChtYXRjaFtpICsgMV0pO1xuICAgICAgfVxuICAgICAgYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuICAgfVxuICAgZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocGVyKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZ2IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgIHJnYltpXSA9IE1hdGgucm91bmQocGFyc2VGbG9hdChtYXRjaFtpICsgMV0pICogMi41NSk7XG4gICAgICB9XG4gICAgICBhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG4gICB9XG4gICBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChrZXl3b3JkKSkge1xuICAgICAgaWYgKG1hdGNoWzFdID09IFwidHJhbnNwYXJlbnRcIikge1xuICAgICAgICAgcmV0dXJuIFswLCAwLCAwLCAwXTtcbiAgICAgIH1cbiAgICAgIHJnYiA9IGNvbG9yTmFtZXNbbWF0Y2hbMV1dO1xuICAgICAgaWYgKCFyZ2IpIHtcbiAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgIH1cblxuICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZ2IubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJnYltpXSA9IHNjYWxlKHJnYltpXSwgMCwgMjU1KTtcbiAgIH1cbiAgIGlmICghYSAmJiBhICE9IDApIHtcbiAgICAgIGEgPSAxO1xuICAgfVxuICAgZWxzZSB7XG4gICAgICBhID0gc2NhbGUoYSwgMCwgMSk7XG4gICB9XG4gICByZ2JbM10gPSBhO1xuICAgcmV0dXJuIHJnYjtcbn1cblxuZnVuY3Rpb24gZ2V0SHNsYShzdHJpbmcpIHtcbiAgIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm47XG4gICB9XG4gICB2YXIgaHNsID0gL15oc2xhP1xcKFxccyooWystXT9cXGQrKSg/OmRlZyk/XFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyooPzosXFxzKihbKy1dP1tcXGRcXC5dKylcXHMqKT9cXCkvO1xuICAgdmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGhzbCk7XG4gICBpZiAobWF0Y2gpIHtcbiAgICAgIHZhciBhbHBoYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuICAgICAgdmFyIGggPSBzY2FsZShwYXJzZUludChtYXRjaFsxXSksIDAsIDM2MCksXG4gICAgICAgICAgcyA9IHNjYWxlKHBhcnNlRmxvYXQobWF0Y2hbMl0pLCAwLCAxMDApLFxuICAgICAgICAgIGwgPSBzY2FsZShwYXJzZUZsb2F0KG1hdGNoWzNdKSwgMCwgMTAwKSxcbiAgICAgICAgICBhID0gc2NhbGUoaXNOYU4oYWxwaGEpID8gMSA6IGFscGhhLCAwLCAxKTtcbiAgICAgIHJldHVybiBbaCwgcywgbCwgYV07XG4gICB9XG59XG5cbmZ1bmN0aW9uIGdldEh3YihzdHJpbmcpIHtcbiAgIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm47XG4gICB9XG4gICB2YXIgaHdiID0gL15od2JcXChcXHMqKFsrLV0/XFxkKykoPzpkZWcpP1xccyosXFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqKD86LFxccyooWystXT9bXFxkXFwuXSspXFxzKik/XFwpLztcbiAgIHZhciBtYXRjaCA9IHN0cmluZy5tYXRjaChod2IpO1xuICAgaWYgKG1hdGNoKSB7XG4gICAgdmFyIGFscGhhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG4gICAgICB2YXIgaCA9IHNjYWxlKHBhcnNlSW50KG1hdGNoWzFdKSwgMCwgMzYwKSxcbiAgICAgICAgICB3ID0gc2NhbGUocGFyc2VGbG9hdChtYXRjaFsyXSksIDAsIDEwMCksXG4gICAgICAgICAgYiA9IHNjYWxlKHBhcnNlRmxvYXQobWF0Y2hbM10pLCAwLCAxMDApLFxuICAgICAgICAgIGEgPSBzY2FsZShpc05hTihhbHBoYSkgPyAxIDogYWxwaGEsIDAsIDEpO1xuICAgICAgcmV0dXJuIFtoLCB3LCBiLCBhXTtcbiAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmdiKHN0cmluZykge1xuICAgdmFyIHJnYmEgPSBnZXRSZ2JhKHN0cmluZyk7XG4gICByZXR1cm4gcmdiYSAmJiByZ2JhLnNsaWNlKDAsIDMpO1xufVxuXG5mdW5jdGlvbiBnZXRIc2woc3RyaW5nKSB7XG4gIHZhciBoc2xhID0gZ2V0SHNsYShzdHJpbmcpO1xuICByZXR1cm4gaHNsYSAmJiBoc2xhLnNsaWNlKDAsIDMpO1xufVxuXG5mdW5jdGlvbiBnZXRBbHBoYShzdHJpbmcpIHtcbiAgIHZhciB2YWxzID0gZ2V0UmdiYShzdHJpbmcpO1xuICAgaWYgKHZhbHMpIHtcbiAgICAgIHJldHVybiB2YWxzWzNdO1xuICAgfVxuICAgZWxzZSBpZiAodmFscyA9IGdldEhzbGEoc3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHZhbHNbM107XG4gICB9XG4gICBlbHNlIGlmICh2YWxzID0gZ2V0SHdiKHN0cmluZykpIHtcbiAgICAgIHJldHVybiB2YWxzWzNdO1xuICAgfVxufVxuXG4vLyBnZW5lcmF0b3JzXG5mdW5jdGlvbiBoZXhTdHJpbmcocmdiKSB7XG4gICByZXR1cm4gXCIjXCIgKyBoZXhEb3VibGUocmdiWzBdKSArIGhleERvdWJsZShyZ2JbMV0pXG4gICAgICAgICAgICAgICsgaGV4RG91YmxlKHJnYlsyXSk7XG59XG5cbmZ1bmN0aW9uIHJnYlN0cmluZyhyZ2JhLCBhbHBoYSkge1xuICAgaWYgKGFscGhhIDwgMSB8fCAocmdiYVszXSAmJiByZ2JhWzNdIDwgMSkpIHtcbiAgICAgIHJldHVybiByZ2JhU3RyaW5nKHJnYmEsIGFscGhhKTtcbiAgIH1cbiAgIHJldHVybiBcInJnYihcIiArIHJnYmFbMF0gKyBcIiwgXCIgKyByZ2JhWzFdICsgXCIsIFwiICsgcmdiYVsyXSArIFwiKVwiO1xufVxuXG5mdW5jdGlvbiByZ2JhU3RyaW5nKHJnYmEsIGFscGhhKSB7XG4gICBpZiAoYWxwaGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWxwaGEgPSAocmdiYVszXSAhPT0gdW5kZWZpbmVkID8gcmdiYVszXSA6IDEpO1xuICAgfVxuICAgcmV0dXJuIFwicmdiYShcIiArIHJnYmFbMF0gKyBcIiwgXCIgKyByZ2JhWzFdICsgXCIsIFwiICsgcmdiYVsyXVxuICAgICAgICAgICArIFwiLCBcIiArIGFscGhhICsgXCIpXCI7XG59XG5cbmZ1bmN0aW9uIHBlcmNlbnRTdHJpbmcocmdiYSwgYWxwaGEpIHtcbiAgIGlmIChhbHBoYSA8IDEgfHwgKHJnYmFbM10gJiYgcmdiYVszXSA8IDEpKSB7XG4gICAgICByZXR1cm4gcGVyY2VudGFTdHJpbmcocmdiYSwgYWxwaGEpO1xuICAgfVxuICAgdmFyIHIgPSBNYXRoLnJvdW5kKHJnYmFbMF0vMjU1ICogMTAwKSxcbiAgICAgICBnID0gTWF0aC5yb3VuZChyZ2JhWzFdLzI1NSAqIDEwMCksXG4gICAgICAgYiA9IE1hdGgucm91bmQocmdiYVsyXS8yNTUgKiAxMDApO1xuXG4gICByZXR1cm4gXCJyZ2IoXCIgKyByICsgXCIlLCBcIiArIGcgKyBcIiUsIFwiICsgYiArIFwiJSlcIjtcbn1cblxuZnVuY3Rpb24gcGVyY2VudGFTdHJpbmcocmdiYSwgYWxwaGEpIHtcbiAgIHZhciByID0gTWF0aC5yb3VuZChyZ2JhWzBdLzI1NSAqIDEwMCksXG4gICAgICAgZyA9IE1hdGgucm91bmQocmdiYVsxXS8yNTUgKiAxMDApLFxuICAgICAgIGIgPSBNYXRoLnJvdW5kKHJnYmFbMl0vMjU1ICogMTAwKTtcbiAgIHJldHVybiBcInJnYmEoXCIgKyByICsgXCIlLCBcIiArIGcgKyBcIiUsIFwiICsgYiArIFwiJSwgXCIgKyAoYWxwaGEgfHwgcmdiYVszXSB8fCAxKSArIFwiKVwiO1xufVxuXG5mdW5jdGlvbiBoc2xTdHJpbmcoaHNsYSwgYWxwaGEpIHtcbiAgIGlmIChhbHBoYSA8IDEgfHwgKGhzbGFbM10gJiYgaHNsYVszXSA8IDEpKSB7XG4gICAgICByZXR1cm4gaHNsYVN0cmluZyhoc2xhLCBhbHBoYSk7XG4gICB9XG4gICByZXR1cm4gXCJoc2woXCIgKyBoc2xhWzBdICsgXCIsIFwiICsgaHNsYVsxXSArIFwiJSwgXCIgKyBoc2xhWzJdICsgXCIlKVwiO1xufVxuXG5mdW5jdGlvbiBoc2xhU3RyaW5nKGhzbGEsIGFscGhhKSB7XG4gICBpZiAoYWxwaGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWxwaGEgPSAoaHNsYVszXSAhPT0gdW5kZWZpbmVkID8gaHNsYVszXSA6IDEpO1xuICAgfVxuICAgcmV0dXJuIFwiaHNsYShcIiArIGhzbGFbMF0gKyBcIiwgXCIgKyBoc2xhWzFdICsgXCIlLCBcIiArIGhzbGFbMl0gKyBcIiUsIFwiXG4gICAgICAgICAgICsgYWxwaGEgKyBcIilcIjtcbn1cblxuLy8gaHdiIGlzIGEgYml0IGRpZmZlcmVudCB0aGFuIHJnYihhKSAmIGhzbChhKSBzaW5jZSB0aGVyZSBpcyBubyBhbHBoYSBzcGVjaWZpYyBzeW50YXhcbi8vIChod2IgaGF2ZSBhbHBoYSBvcHRpb25hbCAmIDEgaXMgZGVmYXVsdCB2YWx1ZSlcbmZ1bmN0aW9uIGh3YlN0cmluZyhod2IsIGFscGhhKSB7XG4gICBpZiAoYWxwaGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWxwaGEgPSAoaHdiWzNdICE9PSB1bmRlZmluZWQgPyBod2JbM10gOiAxKTtcbiAgIH1cbiAgIHJldHVybiBcImh3YihcIiArIGh3YlswXSArIFwiLCBcIiArIGh3YlsxXSArIFwiJSwgXCIgKyBod2JbMl0gKyBcIiVcIlxuICAgICAgICAgICArIChhbHBoYSAhPT0gdW5kZWZpbmVkICYmIGFscGhhICE9PSAxID8gXCIsIFwiICsgYWxwaGEgOiBcIlwiKSArIFwiKVwiO1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkKHJnYikge1xuICByZXR1cm4gcmV2ZXJzZU5hbWVzW3JnYi5zbGljZSgwLCAzKV07XG59XG5cbi8vIGhlbHBlcnNcbmZ1bmN0aW9uIHNjYWxlKG51bSwgbWluLCBtYXgpIHtcbiAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChtaW4sIG51bSksIG1heCk7XG59XG5cbmZ1bmN0aW9uIGhleERvdWJsZShudW0pIHtcbiAgdmFyIHN0ciA9IG51bS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgcmV0dXJuIChzdHIubGVuZ3RoIDwgMikgPyBcIjBcIiArIHN0ciA6IHN0cjtcbn1cblxuXG4vL2NyZWF0ZSBhIGxpc3Qgb2YgcmV2ZXJzZSBjb2xvciBuYW1lc1xudmFyIHJldmVyc2VOYW1lcyA9IHt9O1xuZm9yICh2YXIgbmFtZSBpbiBjb2xvck5hbWVzKSB7XG4gICByZXZlcnNlTmFtZXNbY29sb3JOYW1lc1tuYW1lXV0gPSBuYW1lO1xufVxuXG59LHtcIjZcIjo2fV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4vKiBNSVQgbGljZW5zZSAqL1xudmFyIGNvbnZlcnQgPSByZXF1aXJlKDUpO1xudmFyIHN0cmluZyA9IHJlcXVpcmUoMik7XG5cbnZhciBDb2xvciA9IGZ1bmN0aW9uIChvYmopIHtcblx0aWYgKG9iaiBpbnN0YW5jZW9mIENvbG9yKSB7XG5cdFx0cmV0dXJuIG9iajtcblx0fVxuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgQ29sb3IpKSB7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcihvYmopO1xuXHR9XG5cblx0dGhpcy52YWxpZCA9IGZhbHNlO1xuXHR0aGlzLnZhbHVlcyA9IHtcblx0XHRyZ2I6IFswLCAwLCAwXSxcblx0XHRoc2w6IFswLCAwLCAwXSxcblx0XHRoc3Y6IFswLCAwLCAwXSxcblx0XHRod2I6IFswLCAwLCAwXSxcblx0XHRjbXlrOiBbMCwgMCwgMCwgMF0sXG5cdFx0YWxwaGE6IDFcblx0fTtcblxuXHQvLyBwYXJzZSBDb2xvcigpIGFyZ3VtZW50XG5cdHZhciB2YWxzO1xuXHRpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcblx0XHR2YWxzID0gc3RyaW5nLmdldFJnYmEob2JqKTtcblx0XHRpZiAodmFscykge1xuXHRcdFx0dGhpcy5zZXRWYWx1ZXMoJ3JnYicsIHZhbHMpO1xuXHRcdH0gZWxzZSBpZiAodmFscyA9IHN0cmluZy5nZXRIc2xhKG9iaikpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdoc2wnLCB2YWxzKTtcblx0XHR9IGVsc2UgaWYgKHZhbHMgPSBzdHJpbmcuZ2V0SHdiKG9iaikpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdod2InLCB2YWxzKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcblx0XHR2YWxzID0gb2JqO1xuXHRcdGlmICh2YWxzLnIgIT09IHVuZGVmaW5lZCB8fCB2YWxzLnJlZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnNldFZhbHVlcygncmdiJywgdmFscyk7XG5cdFx0fSBlbHNlIGlmICh2YWxzLmwgIT09IHVuZGVmaW5lZCB8fCB2YWxzLmxpZ2h0bmVzcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnNldFZhbHVlcygnaHNsJywgdmFscyk7XG5cdFx0fSBlbHNlIGlmICh2YWxzLnYgIT09IHVuZGVmaW5lZCB8fCB2YWxzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdoc3YnLCB2YWxzKTtcblx0XHR9IGVsc2UgaWYgKHZhbHMudyAhPT0gdW5kZWZpbmVkIHx8IHZhbHMud2hpdGVuZXNzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdod2InLCB2YWxzKTtcblx0XHR9IGVsc2UgaWYgKHZhbHMuYyAhPT0gdW5kZWZpbmVkIHx8IHZhbHMuY3lhbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnNldFZhbHVlcygnY215aycsIHZhbHMpO1xuXHRcdH1cblx0fVxufTtcblxuQ29sb3IucHJvdG90eXBlID0ge1xuXHRpc1ZhbGlkOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMudmFsaWQ7XG5cdH0sXG5cdHJnYjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnNldFNwYWNlKCdyZ2InLCBhcmd1bWVudHMpO1xuXHR9LFxuXHRoc2w6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRTcGFjZSgnaHNsJywgYXJndW1lbnRzKTtcblx0fSxcblx0aHN2OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0U3BhY2UoJ2hzdicsIGFyZ3VtZW50cyk7XG5cdH0sXG5cdGh3YjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnNldFNwYWNlKCdod2InLCBhcmd1bWVudHMpO1xuXHR9LFxuXHRjbXlrOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0U3BhY2UoJ2NteWsnLCBhcmd1bWVudHMpO1xuXHR9LFxuXG5cdHJnYkFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMudmFsdWVzLnJnYjtcblx0fSxcblx0aHNsQXJyYXk6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMuaHNsO1xuXHR9LFxuXHRoc3ZBcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnZhbHVlcy5oc3Y7XG5cdH0sXG5cdGh3YkFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuXHRcdGlmICh2YWx1ZXMuYWxwaGEgIT09IDEpIHtcblx0XHRcdHJldHVybiB2YWx1ZXMuaHdiLmNvbmNhdChbdmFsdWVzLmFscGhhXSk7XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZXMuaHdiO1xuXHR9LFxuXHRjbXlrQXJyYXk6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMuY215aztcblx0fSxcblx0cmdiYUFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuXHRcdHJldHVybiB2YWx1ZXMucmdiLmNvbmNhdChbdmFsdWVzLmFscGhhXSk7XG5cdH0sXG5cdGhzbGFBcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcblx0XHRyZXR1cm4gdmFsdWVzLmhzbC5jb25jYXQoW3ZhbHVlcy5hbHBoYV0pO1xuXHR9LFxuXHRhbHBoYTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMudmFsdWVzLmFscGhhO1xuXHRcdH1cblx0XHR0aGlzLnNldFZhbHVlcygnYWxwaGEnLCB2YWwpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlZDogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ3JnYicsIDAsIHZhbCk7XG5cdH0sXG5cdGdyZWVuOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgncmdiJywgMSwgdmFsKTtcblx0fSxcblx0Ymx1ZTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ3JnYicsIDIsIHZhbCk7XG5cdH0sXG5cdGh1ZTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmICh2YWwpIHtcblx0XHRcdHZhbCAlPSAzNjA7XG5cdFx0XHR2YWwgPSB2YWwgPCAwID8gMzYwICsgdmFsIDogdmFsO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdoc2wnLCAwLCB2YWwpO1xuXHR9LFxuXHRzYXR1cmF0aW9uOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnaHNsJywgMSwgdmFsKTtcblx0fSxcblx0bGlnaHRuZXNzOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnaHNsJywgMiwgdmFsKTtcblx0fSxcblx0c2F0dXJhdGlvbnY6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdoc3YnLCAxLCB2YWwpO1xuXHR9LFxuXHR3aGl0ZW5lc3M6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdod2InLCAxLCB2YWwpO1xuXHR9LFxuXHRibGFja25lc3M6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdod2InLCAyLCB2YWwpO1xuXHR9LFxuXHR2YWx1ZTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2hzdicsIDIsIHZhbCk7XG5cdH0sXG5cdGN5YW46IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdjbXlrJywgMCwgdmFsKTtcblx0fSxcblx0bWFnZW50YTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2NteWsnLCAxLCB2YWwpO1xuXHR9LFxuXHR5ZWxsb3c6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdjbXlrJywgMiwgdmFsKTtcblx0fSxcblx0YmxhY2s6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdjbXlrJywgMywgdmFsKTtcblx0fSxcblxuXHRoZXhTdHJpbmc6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gc3RyaW5nLmhleFN0cmluZyh0aGlzLnZhbHVlcy5yZ2IpO1xuXHR9LFxuXHRyZ2JTdHJpbmc6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gc3RyaW5nLnJnYlN0cmluZyh0aGlzLnZhbHVlcy5yZ2IsIHRoaXMudmFsdWVzLmFscGhhKTtcblx0fSxcblx0cmdiYVN0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBzdHJpbmcucmdiYVN0cmluZyh0aGlzLnZhbHVlcy5yZ2IsIHRoaXMudmFsdWVzLmFscGhhKTtcblx0fSxcblx0cGVyY2VudFN0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBzdHJpbmcucGVyY2VudFN0cmluZyh0aGlzLnZhbHVlcy5yZ2IsIHRoaXMudmFsdWVzLmFscGhhKTtcblx0fSxcblx0aHNsU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHN0cmluZy5oc2xTdHJpbmcodGhpcy52YWx1ZXMuaHNsLCB0aGlzLnZhbHVlcy5hbHBoYSk7XG5cdH0sXG5cdGhzbGFTdHJpbmc6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gc3RyaW5nLmhzbGFTdHJpbmcodGhpcy52YWx1ZXMuaHNsLCB0aGlzLnZhbHVlcy5hbHBoYSk7XG5cdH0sXG5cdGh3YlN0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBzdHJpbmcuaHdiU3RyaW5nKHRoaXMudmFsdWVzLmh3YiwgdGhpcy52YWx1ZXMuYWxwaGEpO1xuXHR9LFxuXHRrZXl3b3JkOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHN0cmluZy5rZXl3b3JkKHRoaXMudmFsdWVzLnJnYiwgdGhpcy52YWx1ZXMuYWxwaGEpO1xuXHR9LFxuXG5cdHJnYk51bWJlcjogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnZhbHVlcy5yZ2I7XG5cdFx0cmV0dXJuIChyZ2JbMF0gPDwgMTYpIHwgKHJnYlsxXSA8PCA4KSB8IHJnYlsyXTtcblx0fSxcblxuXHRsdW1pbm9zaXR5OiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuXHRcdHZhciByZ2IgPSB0aGlzLnZhbHVlcy5yZ2I7XG5cdFx0dmFyIGx1bSA9IFtdO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgY2hhbiA9IHJnYltpXSAvIDI1NTtcblx0XHRcdGx1bVtpXSA9IChjaGFuIDw9IDAuMDM5MjgpID8gY2hhbiAvIDEyLjkyIDogTWF0aC5wb3coKChjaGFuICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpO1xuXHRcdH1cblx0XHRyZXR1cm4gMC4yMTI2ICogbHVtWzBdICsgMC43MTUyICogbHVtWzFdICsgMC4wNzIyICogbHVtWzJdO1xuXHR9LFxuXG5cdGNvbnRyYXN0OiBmdW5jdGlvbiAoY29sb3IyKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNjb250cmFzdC1yYXRpb2RlZlxuXHRcdHZhciBsdW0xID0gdGhpcy5sdW1pbm9zaXR5KCk7XG5cdFx0dmFyIGx1bTIgPSBjb2xvcjIubHVtaW5vc2l0eSgpO1xuXHRcdGlmIChsdW0xID4gbHVtMikge1xuXHRcdFx0cmV0dXJuIChsdW0xICsgMC4wNSkgLyAobHVtMiArIDAuMDUpO1xuXHRcdH1cblx0XHRyZXR1cm4gKGx1bTIgKyAwLjA1KSAvIChsdW0xICsgMC4wNSk7XG5cdH0sXG5cblx0bGV2ZWw6IGZ1bmN0aW9uIChjb2xvcjIpIHtcblx0XHR2YXIgY29udHJhc3RSYXRpbyA9IHRoaXMuY29udHJhc3QoY29sb3IyKTtcblx0XHRpZiAoY29udHJhc3RSYXRpbyA+PSA3LjEpIHtcblx0XHRcdHJldHVybiAnQUFBJztcblx0XHR9XG5cblx0XHRyZXR1cm4gKGNvbnRyYXN0UmF0aW8gPj0gNC41KSA/ICdBQScgOiAnJztcblx0fSxcblxuXHRkYXJrOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gWUlRIGVxdWF0aW9uIGZyb20gaHR0cDovLzI0d2F5cy5vcmcvMjAxMC9jYWxjdWxhdGluZy1jb2xvci1jb250cmFzdFxuXHRcdHZhciByZ2IgPSB0aGlzLnZhbHVlcy5yZ2I7XG5cdFx0dmFyIHlpcSA9IChyZ2JbMF0gKiAyOTkgKyByZ2JbMV0gKiA1ODcgKyByZ2JbMl0gKiAxMTQpIC8gMTAwMDtcblx0XHRyZXR1cm4geWlxIDwgMTI4O1xuXHR9LFxuXG5cdGxpZ2h0OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuICF0aGlzLmRhcmsoKTtcblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gW107XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IDI1NSAtIHRoaXMudmFsdWVzLnJnYltpXTtcblx0XHR9XG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ3JnYicsIHJnYik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0bGlnaHRlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMudmFsdWVzLmhzbDtcblx0XHRoc2xbMl0gKz0gaHNsWzJdICogcmF0aW87XG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzbCcsIGhzbCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0ZGFya2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHNsID0gdGhpcy52YWx1ZXMuaHNsO1xuXHRcdGhzbFsyXSAtPSBoc2xbMl0gKiByYXRpbztcblx0XHR0aGlzLnNldFZhbHVlcygnaHNsJywgaHNsKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMudmFsdWVzLmhzbDtcblx0XHRoc2xbMV0gKz0gaHNsWzFdICogcmF0aW87XG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzbCcsIGhzbCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0ZGVzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMudmFsdWVzLmhzbDtcblx0XHRoc2xbMV0gLT0gaHNsWzFdICogcmF0aW87XG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzbCcsIGhzbCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d2hpdGVuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHdiID0gdGhpcy52YWx1ZXMuaHdiO1xuXHRcdGh3YlsxXSArPSBod2JbMV0gKiByYXRpbztcblx0XHR0aGlzLnNldFZhbHVlcygnaHdiJywgaHdiKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRibGFja2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHdiID0gdGhpcy52YWx1ZXMuaHdiO1xuXHRcdGh3YlsyXSArPSBod2JbMl0gKiByYXRpbztcblx0XHR0aGlzLnNldFZhbHVlcygnaHdiJywgaHdiKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRncmV5c2NhbGU6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy52YWx1ZXMucmdiO1xuXHRcdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR3JheXNjYWxlI0NvbnZlcnRpbmdfY29sb3JfdG9fZ3JheXNjYWxlXG5cdFx0dmFyIHZhbCA9IHJnYlswXSAqIDAuMyArIHJnYlsxXSAqIDAuNTkgKyByZ2JbMl0gKiAwLjExO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdyZ2InLCBbdmFsLCB2YWwsIHZhbF0pO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNsZWFyZXI6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBhbHBoYSA9IHRoaXMudmFsdWVzLmFscGhhO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdhbHBoYScsIGFscGhhIC0gKGFscGhhICogcmF0aW8pKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRvcGFxdWVyOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgYWxwaGEgPSB0aGlzLnZhbHVlcy5hbHBoYTtcblx0XHR0aGlzLnNldFZhbHVlcygnYWxwaGEnLCBhbHBoYSArIChhbHBoYSAqIHJhdGlvKSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cm90YXRlOiBmdW5jdGlvbiAoZGVncmVlcykge1xuXHRcdHZhciBoc2wgPSB0aGlzLnZhbHVlcy5oc2w7XG5cdFx0dmFyIGh1ZSA9IChoc2xbMF0gKyBkZWdyZWVzKSAlIDM2MDtcblx0XHRoc2xbMF0gPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdoc2wnLCBoc2wpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBQb3J0ZWQgZnJvbSBzYXNzIGltcGxlbWVudGF0aW9uIGluIENcblx0ICogaHR0cHM6Ly9naXRodWIuY29tL3Nhc3MvbGlic2Fzcy9ibG9iLzBlNmI0YTI4NTAwOTIzNTZhYTNlY2UwN2M2YjI0OWYwMjIxY2FjZWQvZnVuY3Rpb25zLmNwcCNMMjA5XG5cdCAqL1xuXHRtaXg6IGZ1bmN0aW9uIChtaXhpbkNvbG9yLCB3ZWlnaHQpIHtcblx0XHR2YXIgY29sb3IxID0gdGhpcztcblx0XHR2YXIgY29sb3IyID0gbWl4aW5Db2xvcjtcblx0XHR2YXIgcCA9IHdlaWdodCA9PT0gdW5kZWZpbmVkID8gMC41IDogd2VpZ2h0O1xuXG5cdFx0dmFyIHcgPSAyICogcCAtIDE7XG5cdFx0dmFyIGEgPSBjb2xvcjEuYWxwaGEoKSAtIGNvbG9yMi5hbHBoYSgpO1xuXG5cdFx0dmFyIHcxID0gKCgodyAqIGEgPT09IC0xKSA/IHcgOiAodyArIGEpIC8gKDEgKyB3ICogYSkpICsgMSkgLyAyLjA7XG5cdFx0dmFyIHcyID0gMSAtIHcxO1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5yZ2IoXG5cdFx0XHRcdHcxICogY29sb3IxLnJlZCgpICsgdzIgKiBjb2xvcjIucmVkKCksXG5cdFx0XHRcdHcxICogY29sb3IxLmdyZWVuKCkgKyB3MiAqIGNvbG9yMi5ncmVlbigpLFxuXHRcdFx0XHR3MSAqIGNvbG9yMS5ibHVlKCkgKyB3MiAqIGNvbG9yMi5ibHVlKClcblx0XHRcdClcblx0XHRcdC5hbHBoYShjb2xvcjEuYWxwaGEoKSAqIHAgKyBjb2xvcjIuYWxwaGEoKSAqICgxIC0gcCkpO1xuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnJnYigpO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gTk9URShTQik6IHVzaW5nIG5vZGUtY2xvbmUgY3JlYXRlcyBhIGRlcGVuZGVuY3kgdG8gQnVmZmVyIHdoZW4gdXNpbmcgYnJvd3NlcmlmeSxcblx0XHQvLyBtYWtpbmcgdGhlIGZpbmFsIGJ1aWxkIHdheSB0byBiaWcgdG8gZW1iZWQgaW4gQ2hhcnQuanMuIFNvIGxldCdzIGRvIGl0IG1hbnVhbGx5LFxuXHRcdC8vIGFzc3VtaW5nIHRoYXQgdmFsdWVzIHRvIGNsb25lIGFyZSAxIGRpbWVuc2lvbiBhcnJheXMgY29udGFpbmluZyBvbmx5IG51bWJlcnMsXG5cdFx0Ly8gZXhjZXB0ICdhbHBoYScgd2hpY2ggaXMgYSBudW1iZXIuXG5cdFx0dmFyIHJlc3VsdCA9IG5ldyBDb2xvcigpO1xuXHRcdHZhciBzb3VyY2UgPSB0aGlzLnZhbHVlcztcblx0XHR2YXIgdGFyZ2V0ID0gcmVzdWx0LnZhbHVlcztcblx0XHR2YXIgdmFsdWUsIHR5cGU7XG5cblx0XHRmb3IgKHZhciBwcm9wIGluIHNvdXJjZSkge1xuXHRcdFx0aWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuXHRcdFx0XHR2YWx1ZSA9IHNvdXJjZVtwcm9wXTtcblx0XHRcdFx0dHlwZSA9ICh7fSkudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cdFx0XHRcdGlmICh0eXBlID09PSAnW29iamVjdCBBcnJheV0nKSB7XG5cdFx0XHRcdFx0dGFyZ2V0W3Byb3BdID0gdmFsdWUuc2xpY2UoMCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgTnVtYmVyXScpIHtcblx0XHRcdFx0XHR0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNvbG9yIHZhbHVlOicsIHZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn07XG5cbkNvbG9yLnByb3RvdHlwZS5zcGFjZXMgPSB7XG5cdHJnYjogWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddLFxuXHRoc2w6IFsnaHVlJywgJ3NhdHVyYXRpb24nLCAnbGlnaHRuZXNzJ10sXG5cdGhzdjogWydodWUnLCAnc2F0dXJhdGlvbicsICd2YWx1ZSddLFxuXHRod2I6IFsnaHVlJywgJ3doaXRlbmVzcycsICdibGFja25lc3MnXSxcblx0Y215azogWydjeWFuJywgJ21hZ2VudGEnLCAneWVsbG93JywgJ2JsYWNrJ11cbn07XG5cbkNvbG9yLnByb3RvdHlwZS5tYXhlcyA9IHtcblx0cmdiOiBbMjU1LCAyNTUsIDI1NV0sXG5cdGhzbDogWzM2MCwgMTAwLCAxMDBdLFxuXHRoc3Y6IFszNjAsIDEwMCwgMTAwXSxcblx0aHdiOiBbMzYwLCAxMDAsIDEwMF0sXG5cdGNteWs6IFsxMDAsIDEwMCwgMTAwLCAxMDBdXG59O1xuXG5Db2xvci5wcm90b3R5cGUuZ2V0VmFsdWVzID0gZnVuY3Rpb24gKHNwYWNlKSB7XG5cdHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcblx0dmFyIHZhbHMgPSB7fTtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNwYWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFsc1tzcGFjZS5jaGFyQXQoaSldID0gdmFsdWVzW3NwYWNlXVtpXTtcblx0fVxuXG5cdGlmICh2YWx1ZXMuYWxwaGEgIT09IDEpIHtcblx0XHR2YWxzLmEgPSB2YWx1ZXMuYWxwaGE7XG5cdH1cblxuXHQvLyB7cjogMjU1LCBnOiAyNTUsIGI6IDI1NSwgYTogMC40fVxuXHRyZXR1cm4gdmFscztcbn07XG5cbkNvbG9yLnByb3RvdHlwZS5zZXRWYWx1ZXMgPSBmdW5jdGlvbiAoc3BhY2UsIHZhbHMpIHtcblx0dmFyIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuXHR2YXIgc3BhY2VzID0gdGhpcy5zcGFjZXM7XG5cdHZhciBtYXhlcyA9IHRoaXMubWF4ZXM7XG5cdHZhciBhbHBoYSA9IDE7XG5cdHZhciBpO1xuXG5cdHRoaXMudmFsaWQgPSB0cnVlO1xuXG5cdGlmIChzcGFjZSA9PT0gJ2FscGhhJykge1xuXHRcdGFscGhhID0gdmFscztcblx0fSBlbHNlIGlmICh2YWxzLmxlbmd0aCkge1xuXHRcdC8vIFsxMCwgMTAsIDEwXVxuXHRcdHZhbHVlc1tzcGFjZV0gPSB2YWxzLnNsaWNlKDAsIHNwYWNlLmxlbmd0aCk7XG5cdFx0YWxwaGEgPSB2YWxzW3NwYWNlLmxlbmd0aF07XG5cdH0gZWxzZSBpZiAodmFsc1tzcGFjZS5jaGFyQXQoMCldICE9PSB1bmRlZmluZWQpIHtcblx0XHQvLyB7cjogMTAsIGc6IDEwLCBiOiAxMH1cblx0XHRmb3IgKGkgPSAwOyBpIDwgc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhbHVlc1tzcGFjZV1baV0gPSB2YWxzW3NwYWNlLmNoYXJBdChpKV07XG5cdFx0fVxuXG5cdFx0YWxwaGEgPSB2YWxzLmE7XG5cdH0gZWxzZSBpZiAodmFsc1tzcGFjZXNbc3BhY2VdWzBdXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8ge3JlZDogMTAsIGdyZWVuOiAxMCwgYmx1ZTogMTB9XG5cdFx0dmFyIGNoYW5zID0gc3BhY2VzW3NwYWNlXTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFsdWVzW3NwYWNlXVtpXSA9IHZhbHNbY2hhbnNbaV1dO1xuXHRcdH1cblxuXHRcdGFscGhhID0gdmFscy5hbHBoYTtcblx0fVxuXG5cdHZhbHVlcy5hbHBoYSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChhbHBoYSA9PT0gdW5kZWZpbmVkID8gdmFsdWVzLmFscGhhIDogYWxwaGEpKSk7XG5cblx0aWYgKHNwYWNlID09PSAnYWxwaGEnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0dmFyIGNhcHBlZDtcblxuXHQvLyBjYXAgdmFsdWVzIG9mIHRoZSBzcGFjZSBwcmlvciBjb252ZXJ0aW5nIGFsbCB2YWx1ZXNcblx0Zm9yIChpID0gMDsgaSA8IHNwYWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y2FwcGVkID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obWF4ZXNbc3BhY2VdW2ldLCB2YWx1ZXNbc3BhY2VdW2ldKSk7XG5cdFx0dmFsdWVzW3NwYWNlXVtpXSA9IE1hdGgucm91bmQoY2FwcGVkKTtcblx0fVxuXG5cdC8vIGNvbnZlcnQgdG8gYWxsIHRoZSBvdGhlciBjb2xvciBzcGFjZXNcblx0Zm9yICh2YXIgc25hbWUgaW4gc3BhY2VzKSB7XG5cdFx0aWYgKHNuYW1lICE9PSBzcGFjZSkge1xuXHRcdFx0dmFsdWVzW3NuYW1lXSA9IGNvbnZlcnRbc3BhY2VdW3NuYW1lXSh2YWx1ZXNbc3BhY2VdKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn07XG5cbkNvbG9yLnByb3RvdHlwZS5zZXRTcGFjZSA9IGZ1bmN0aW9uIChzcGFjZSwgYXJncykge1xuXHR2YXIgdmFscyA9IGFyZ3NbMF07XG5cblx0aWYgKHZhbHMgPT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIGNvbG9yLnJnYigpXG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmFsdWVzKHNwYWNlKTtcblx0fVxuXG5cdC8vIGNvbG9yLnJnYigxMCwgMTAsIDEwKVxuXHRpZiAodHlwZW9mIHZhbHMgPT09ICdudW1iZXInKSB7XG5cdFx0dmFscyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MpO1xuXHR9XG5cblx0dGhpcy5zZXRWYWx1ZXMoc3BhY2UsIHZhbHMpO1xuXHRyZXR1cm4gdGhpcztcbn07XG5cbkNvbG9yLnByb3RvdHlwZS5zZXRDaGFubmVsID0gZnVuY3Rpb24gKHNwYWNlLCBpbmRleCwgdmFsKSB7XG5cdHZhciBzdmFsdWVzID0gdGhpcy52YWx1ZXNbc3BhY2VdO1xuXHRpZiAodmFsID09PSB1bmRlZmluZWQpIHtcblx0XHQvLyBjb2xvci5yZWQoKVxuXHRcdHJldHVybiBzdmFsdWVzW2luZGV4XTtcblx0fSBlbHNlIGlmICh2YWwgPT09IHN2YWx1ZXNbaW5kZXhdKSB7XG5cdFx0Ly8gY29sb3IucmVkKGNvbG9yLnJlZCgpKVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Ly8gY29sb3IucmVkKDEwMClcblx0c3ZhbHVlc1tpbmRleF0gPSB2YWw7XG5cdHRoaXMuc2V0VmFsdWVzKHNwYWNlLCBzdmFsdWVzKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuXHR3aW5kb3cuQ29sb3IgPSBDb2xvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb2xvcjtcblxufSx7XCIyXCI6MixcIjVcIjo1fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4vKiBNSVQgbGljZW5zZSAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcmdiMmhzbDogcmdiMmhzbCxcbiAgcmdiMmhzdjogcmdiMmhzdixcbiAgcmdiMmh3YjogcmdiMmh3YixcbiAgcmdiMmNteWs6IHJnYjJjbXlrLFxuICByZ2Iya2V5d29yZDogcmdiMmtleXdvcmQsXG4gIHJnYjJ4eXo6IHJnYjJ4eXosXG4gIHJnYjJsYWI6IHJnYjJsYWIsXG4gIHJnYjJsY2g6IHJnYjJsY2gsXG5cbiAgaHNsMnJnYjogaHNsMnJnYixcbiAgaHNsMmhzdjogaHNsMmhzdixcbiAgaHNsMmh3YjogaHNsMmh3YixcbiAgaHNsMmNteWs6IGhzbDJjbXlrLFxuICBoc2wya2V5d29yZDogaHNsMmtleXdvcmQsXG5cbiAgaHN2MnJnYjogaHN2MnJnYixcbiAgaHN2MmhzbDogaHN2MmhzbCxcbiAgaHN2Mmh3YjogaHN2Mmh3YixcbiAgaHN2MmNteWs6IGhzdjJjbXlrLFxuICBoc3Yya2V5d29yZDogaHN2MmtleXdvcmQsXG5cbiAgaHdiMnJnYjogaHdiMnJnYixcbiAgaHdiMmhzbDogaHdiMmhzbCxcbiAgaHdiMmhzdjogaHdiMmhzdixcbiAgaHdiMmNteWs6IGh3YjJjbXlrLFxuICBod2Iya2V5d29yZDogaHdiMmtleXdvcmQsXG5cbiAgY215azJyZ2I6IGNteWsycmdiLFxuICBjbXlrMmhzbDogY215azJoc2wsXG4gIGNteWsyaHN2OiBjbXlrMmhzdixcbiAgY215azJod2I6IGNteWsyaHdiLFxuICBjbXlrMmtleXdvcmQ6IGNteWsya2V5d29yZCxcblxuICBrZXl3b3JkMnJnYjoga2V5d29yZDJyZ2IsXG4gIGtleXdvcmQyaHNsOiBrZXl3b3JkMmhzbCxcbiAga2V5d29yZDJoc3Y6IGtleXdvcmQyaHN2LFxuICBrZXl3b3JkMmh3Yjoga2V5d29yZDJod2IsXG4gIGtleXdvcmQyY215azoga2V5d29yZDJjbXlrLFxuICBrZXl3b3JkMmxhYjoga2V5d29yZDJsYWIsXG4gIGtleXdvcmQyeHl6OiBrZXl3b3JkMnh5eixcblxuICB4eXoycmdiOiB4eXoycmdiLFxuICB4eXoybGFiOiB4eXoybGFiLFxuICB4eXoybGNoOiB4eXoybGNoLFxuXG4gIGxhYjJ4eXo6IGxhYjJ4eXosXG4gIGxhYjJyZ2I6IGxhYjJyZ2IsXG4gIGxhYjJsY2g6IGxhYjJsY2gsXG5cbiAgbGNoMmxhYjogbGNoMmxhYixcbiAgbGNoMnh5ejogbGNoMnh5eixcbiAgbGNoMnJnYjogbGNoMnJnYlxufVxuXG5cbmZ1bmN0aW9uIHJnYjJoc2wocmdiKSB7XG4gIHZhciByID0gcmdiWzBdLzI1NSxcbiAgICAgIGcgPSByZ2JbMV0vMjU1LFxuICAgICAgYiA9IHJnYlsyXS8yNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgZGVsdGEgPSBtYXggLSBtaW4sXG4gICAgICBoLCBzLCBsO1xuXG4gIGlmIChtYXggPT0gbWluKVxuICAgIGggPSAwO1xuICBlbHNlIGlmIChyID09IG1heClcbiAgICBoID0gKGcgLSBiKSAvIGRlbHRhO1xuICBlbHNlIGlmIChnID09IG1heClcbiAgICBoID0gMiArIChiIC0gcikgLyBkZWx0YTtcbiAgZWxzZSBpZiAoYiA9PSBtYXgpXG4gICAgaCA9IDQgKyAociAtIGcpLyBkZWx0YTtcblxuICBoID0gTWF0aC5taW4oaCAqIDYwLCAzNjApO1xuXG4gIGlmIChoIDwgMClcbiAgICBoICs9IDM2MDtcblxuICBsID0gKG1pbiArIG1heCkgLyAyO1xuXG4gIGlmIChtYXggPT0gbWluKVxuICAgIHMgPSAwO1xuICBlbHNlIGlmIChsIDw9IDAuNSlcbiAgICBzID0gZGVsdGEgLyAobWF4ICsgbWluKTtcbiAgZWxzZVxuICAgIHMgPSBkZWx0YSAvICgyIC0gbWF4IC0gbWluKTtcblxuICByZXR1cm4gW2gsIHMgKiAxMDAsIGwgKiAxMDBdO1xufVxuXG5mdW5jdGlvbiByZ2IyaHN2KHJnYikge1xuICB2YXIgciA9IHJnYlswXSxcbiAgICAgIGcgPSByZ2JbMV0sXG4gICAgICBiID0gcmdiWzJdLFxuICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksXG4gICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcbiAgICAgIGRlbHRhID0gbWF4IC0gbWluLFxuICAgICAgaCwgcywgdjtcblxuICBpZiAobWF4ID09IDApXG4gICAgcyA9IDA7XG4gIGVsc2VcbiAgICBzID0gKGRlbHRhL21heCAqIDEwMDApLzEwO1xuXG4gIGlmIChtYXggPT0gbWluKVxuICAgIGggPSAwO1xuICBlbHNlIGlmIChyID09IG1heClcbiAgICBoID0gKGcgLSBiKSAvIGRlbHRhO1xuICBlbHNlIGlmIChnID09IG1heClcbiAgICBoID0gMiArIChiIC0gcikgLyBkZWx0YTtcbiAgZWxzZSBpZiAoYiA9PSBtYXgpXG4gICAgaCA9IDQgKyAociAtIGcpIC8gZGVsdGE7XG5cbiAgaCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuICBpZiAoaCA8IDApXG4gICAgaCArPSAzNjA7XG5cbiAgdiA9ICgobWF4IC8gMjU1KSAqIDEwMDApIC8gMTA7XG5cbiAgcmV0dXJuIFtoLCBzLCB2XTtcbn1cblxuZnVuY3Rpb24gcmdiMmh3YihyZ2IpIHtcbiAgdmFyIHIgPSByZ2JbMF0sXG4gICAgICBnID0gcmdiWzFdLFxuICAgICAgYiA9IHJnYlsyXSxcbiAgICAgIGggPSByZ2IyaHNsKHJnYilbMF0sXG4gICAgICB3ID0gMS8yNTUgKiBNYXRoLm1pbihyLCBNYXRoLm1pbihnLCBiKSksXG4gICAgICBiID0gMSAtIDEvMjU1ICogTWF0aC5tYXgociwgTWF0aC5tYXgoZywgYikpO1xuXG4gIHJldHVybiBbaCwgdyAqIDEwMCwgYiAqIDEwMF07XG59XG5cbmZ1bmN0aW9uIHJnYjJjbXlrKHJnYikge1xuICB2YXIgciA9IHJnYlswXSAvIDI1NSxcbiAgICAgIGcgPSByZ2JbMV0gLyAyNTUsXG4gICAgICBiID0gcmdiWzJdIC8gMjU1LFxuICAgICAgYywgbSwgeSwgaztcblxuICBrID0gTWF0aC5taW4oMSAtIHIsIDEgLSBnLCAxIC0gYik7XG4gIGMgPSAoMSAtIHIgLSBrKSAvICgxIC0gaykgfHwgMDtcbiAgbSA9ICgxIC0gZyAtIGspIC8gKDEgLSBrKSB8fCAwO1xuICB5ID0gKDEgLSBiIC0gaykgLyAoMSAtIGspIHx8IDA7XG4gIHJldHVybiBbYyAqIDEwMCwgbSAqIDEwMCwgeSAqIDEwMCwgayAqIDEwMF07XG59XG5cbmZ1bmN0aW9uIHJnYjJrZXl3b3JkKHJnYikge1xuICByZXR1cm4gcmV2ZXJzZUtleXdvcmRzW0pTT04uc3RyaW5naWZ5KHJnYildO1xufVxuXG5mdW5jdGlvbiByZ2IyeHl6KHJnYikge1xuICB2YXIgciA9IHJnYlswXSAvIDI1NSxcbiAgICAgIGcgPSByZ2JbMV0gLyAyNTUsXG4gICAgICBiID0gcmdiWzJdIC8gMjU1O1xuXG4gIC8vIGFzc3VtZSBzUkdCXG4gIHIgPSByID4gMC4wNDA0NSA/IE1hdGgucG93KCgociArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChyIC8gMTIuOTIpO1xuICBnID0gZyA+IDAuMDQwNDUgPyBNYXRoLnBvdygoKGcgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCkgOiAoZyAvIDEyLjkyKTtcbiAgYiA9IGIgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKChiICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpIDogKGIgLyAxMi45Mik7XG5cbiAgdmFyIHggPSAociAqIDAuNDEyNCkgKyAoZyAqIDAuMzU3NikgKyAoYiAqIDAuMTgwNSk7XG4gIHZhciB5ID0gKHIgKiAwLjIxMjYpICsgKGcgKiAwLjcxNTIpICsgKGIgKiAwLjA3MjIpO1xuICB2YXIgeiA9IChyICogMC4wMTkzKSArIChnICogMC4xMTkyKSArIChiICogMC45NTA1KTtcblxuICByZXR1cm4gW3ggKiAxMDAsIHkgKjEwMCwgeiAqIDEwMF07XG59XG5cbmZ1bmN0aW9uIHJnYjJsYWIocmdiKSB7XG4gIHZhciB4eXogPSByZ2IyeHl6KHJnYiksXG4gICAgICAgIHggPSB4eXpbMF0sXG4gICAgICAgIHkgPSB4eXpbMV0sXG4gICAgICAgIHogPSB4eXpbMl0sXG4gICAgICAgIGwsIGEsIGI7XG5cbiAgeCAvPSA5NS4wNDc7XG4gIHkgLz0gMTAwO1xuICB6IC89IDEwOC44ODM7XG5cbiAgeCA9IHggPiAwLjAwODg1NiA/IE1hdGgucG93KHgsIDEvMykgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG4gIHkgPSB5ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh5LCAxLzMpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuICB6ID0geiA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeiwgMS8zKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcblxuICBsID0gKDExNiAqIHkpIC0gMTY7XG4gIGEgPSA1MDAgKiAoeCAtIHkpO1xuICBiID0gMjAwICogKHkgLSB6KTtcblxuICByZXR1cm4gW2wsIGEsIGJdO1xufVxuXG5mdW5jdGlvbiByZ2IybGNoKGFyZ3MpIHtcbiAgcmV0dXJuIGxhYjJsY2gocmdiMmxhYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGhzbDJyZ2IoaHNsKSB7XG4gIHZhciBoID0gaHNsWzBdIC8gMzYwLFxuICAgICAgcyA9IGhzbFsxXSAvIDEwMCxcbiAgICAgIGwgPSBoc2xbMl0gLyAxMDAsXG4gICAgICB0MSwgdDIsIHQzLCByZ2IsIHZhbDtcblxuICBpZiAocyA9PSAwKSB7XG4gICAgdmFsID0gbCAqIDI1NTtcbiAgICByZXR1cm4gW3ZhbCwgdmFsLCB2YWxdO1xuICB9XG5cbiAgaWYgKGwgPCAwLjUpXG4gICAgdDIgPSBsICogKDEgKyBzKTtcbiAgZWxzZVxuICAgIHQyID0gbCArIHMgLSBsICogcztcbiAgdDEgPSAyICogbCAtIHQyO1xuXG4gIHJnYiA9IFswLCAwLCAwXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICB0MyA9IGggKyAxIC8gMyAqIC0gKGkgLSAxKTtcbiAgICB0MyA8IDAgJiYgdDMrKztcbiAgICB0MyA+IDEgJiYgdDMtLTtcblxuICAgIGlmICg2ICogdDMgPCAxKVxuICAgICAgdmFsID0gdDEgKyAodDIgLSB0MSkgKiA2ICogdDM7XG4gICAgZWxzZSBpZiAoMiAqIHQzIDwgMSlcbiAgICAgIHZhbCA9IHQyO1xuICAgIGVsc2UgaWYgKDMgKiB0MyA8IDIpXG4gICAgICB2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG4gICAgZWxzZVxuICAgICAgdmFsID0gdDE7XG5cbiAgICByZ2JbaV0gPSB2YWwgKiAyNTU7XG4gIH1cblxuICByZXR1cm4gcmdiO1xufVxuXG5mdW5jdGlvbiBoc2wyaHN2KGhzbCkge1xuICB2YXIgaCA9IGhzbFswXSxcbiAgICAgIHMgPSBoc2xbMV0gLyAxMDAsXG4gICAgICBsID0gaHNsWzJdIC8gMTAwLFxuICAgICAgc3YsIHY7XG5cbiAgaWYobCA9PT0gMCkge1xuICAgICAgLy8gbm8gbmVlZCB0byBkbyBjYWxjIG9uIGJsYWNrXG4gICAgICAvLyBhbHNvIGF2b2lkcyBkaXZpZGUgYnkgMCBlcnJvclxuICAgICAgcmV0dXJuIFswLCAwLCAwXTtcbiAgfVxuXG4gIGwgKj0gMjtcbiAgcyAqPSAobCA8PSAxKSA/IGwgOiAyIC0gbDtcbiAgdiA9IChsICsgcykgLyAyO1xuICBzdiA9ICgyICogcykgLyAobCArIHMpO1xuICByZXR1cm4gW2gsIHN2ICogMTAwLCB2ICogMTAwXTtcbn1cblxuZnVuY3Rpb24gaHNsMmh3YihhcmdzKSB7XG4gIHJldHVybiByZ2IyaHdiKGhzbDJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBoc2wyY215ayhhcmdzKSB7XG4gIHJldHVybiByZ2IyY215ayhoc2wycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gaHNsMmtleXdvcmQoYXJncykge1xuICByZXR1cm4gcmdiMmtleXdvcmQoaHNsMnJnYihhcmdzKSk7XG59XG5cblxuZnVuY3Rpb24gaHN2MnJnYihoc3YpIHtcbiAgdmFyIGggPSBoc3ZbMF0gLyA2MCxcbiAgICAgIHMgPSBoc3ZbMV0gLyAxMDAsXG4gICAgICB2ID0gaHN2WzJdIC8gMTAwLFxuICAgICAgaGkgPSBNYXRoLmZsb29yKGgpICUgNjtcblxuICB2YXIgZiA9IGggLSBNYXRoLmZsb29yKGgpLFxuICAgICAgcCA9IDI1NSAqIHYgKiAoMSAtIHMpLFxuICAgICAgcSA9IDI1NSAqIHYgKiAoMSAtIChzICogZikpLFxuICAgICAgdCA9IDI1NSAqIHYgKiAoMSAtIChzICogKDEgLSBmKSkpLFxuICAgICAgdiA9IDI1NSAqIHY7XG5cbiAgc3dpdGNoKGhpKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIFt2LCB0LCBwXTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gW3EsIHYsIHBdO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBbcCwgdiwgdF07XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIFtwLCBxLCB2XTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gW3QsIHAsIHZdO1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiBbdiwgcCwgcV07XG4gIH1cbn1cblxuZnVuY3Rpb24gaHN2MmhzbChoc3YpIHtcbiAgdmFyIGggPSBoc3ZbMF0sXG4gICAgICBzID0gaHN2WzFdIC8gMTAwLFxuICAgICAgdiA9IGhzdlsyXSAvIDEwMCxcbiAgICAgIHNsLCBsO1xuXG4gIGwgPSAoMiAtIHMpICogdjtcbiAgc2wgPSBzICogdjtcbiAgc2wgLz0gKGwgPD0gMSkgPyBsIDogMiAtIGw7XG4gIHNsID0gc2wgfHwgMDtcbiAgbCAvPSAyO1xuICByZXR1cm4gW2gsIHNsICogMTAwLCBsICogMTAwXTtcbn1cblxuZnVuY3Rpb24gaHN2Mmh3YihhcmdzKSB7XG4gIHJldHVybiByZ2IyaHdiKGhzdjJyZ2IoYXJncykpXG59XG5cbmZ1bmN0aW9uIGhzdjJjbXlrKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJjbXlrKGhzdjJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBoc3Yya2V5d29yZChhcmdzKSB7XG4gIHJldHVybiByZ2Iya2V5d29yZChoc3YycmdiKGFyZ3MpKTtcbn1cblxuLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLWNvbG9yLyNod2ItdG8tcmdiXG5mdW5jdGlvbiBod2IycmdiKGh3Yikge1xuICB2YXIgaCA9IGh3YlswXSAvIDM2MCxcbiAgICAgIHdoID0gaHdiWzFdIC8gMTAwLFxuICAgICAgYmwgPSBod2JbMl0gLyAxMDAsXG4gICAgICByYXRpbyA9IHdoICsgYmwsXG4gICAgICBpLCB2LCBmLCBuO1xuXG4gIC8vIHdoICsgYmwgY2FudCBiZSA+IDFcbiAgaWYgKHJhdGlvID4gMSkge1xuICAgIHdoIC89IHJhdGlvO1xuICAgIGJsIC89IHJhdGlvO1xuICB9XG5cbiAgaSA9IE1hdGguZmxvb3IoNiAqIGgpO1xuICB2ID0gMSAtIGJsO1xuICBmID0gNiAqIGggLSBpO1xuICBpZiAoKGkgJiAweDAxKSAhPSAwKSB7XG4gICAgZiA9IDEgLSBmO1xuICB9XG4gIG4gPSB3aCArIGYgKiAodiAtIHdoKTsgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uXG5cbiAgc3dpdGNoIChpKSB7XG4gICAgZGVmYXVsdDpcbiAgICBjYXNlIDY6XG4gICAgY2FzZSAwOiByID0gdjsgZyA9IG47IGIgPSB3aDsgYnJlYWs7XG4gICAgY2FzZSAxOiByID0gbjsgZyA9IHY7IGIgPSB3aDsgYnJlYWs7XG4gICAgY2FzZSAyOiByID0gd2g7IGcgPSB2OyBiID0gbjsgYnJlYWs7XG4gICAgY2FzZSAzOiByID0gd2g7IGcgPSBuOyBiID0gdjsgYnJlYWs7XG4gICAgY2FzZSA0OiByID0gbjsgZyA9IHdoOyBiID0gdjsgYnJlYWs7XG4gICAgY2FzZSA1OiByID0gdjsgZyA9IHdoOyBiID0gbjsgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufVxuXG5mdW5jdGlvbiBod2IyaHNsKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJoc2woaHdiMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGh3YjJoc3YoYXJncykge1xuICByZXR1cm4gcmdiMmhzdihod2IycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gaHdiMmNteWsoYXJncykge1xuICByZXR1cm4gcmdiMmNteWsoaHdiMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGh3YjJrZXl3b3JkKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJrZXl3b3JkKGh3YjJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBjbXlrMnJnYihjbXlrKSB7XG4gIHZhciBjID0gY215a1swXSAvIDEwMCxcbiAgICAgIG0gPSBjbXlrWzFdIC8gMTAwLFxuICAgICAgeSA9IGNteWtbMl0gLyAxMDAsXG4gICAgICBrID0gY215a1szXSAvIDEwMCxcbiAgICAgIHIsIGcsIGI7XG5cbiAgciA9IDEgLSBNYXRoLm1pbigxLCBjICogKDEgLSBrKSArIGspO1xuICBnID0gMSAtIE1hdGgubWluKDEsIG0gKiAoMSAtIGspICsgayk7XG4gIGIgPSAxIC0gTWF0aC5taW4oMSwgeSAqICgxIC0gaykgKyBrKTtcbiAgcmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn1cblxuZnVuY3Rpb24gY215azJoc2woYXJncykge1xuICByZXR1cm4gcmdiMmhzbChjbXlrMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGNteWsyaHN2KGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJoc3YoY215azJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBjbXlrMmh3YihhcmdzKSB7XG4gIHJldHVybiByZ2IyaHdiKGNteWsycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gY215azJrZXl3b3JkKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJrZXl3b3JkKGNteWsycmdiKGFyZ3MpKTtcbn1cblxuXG5mdW5jdGlvbiB4eXoycmdiKHh5eikge1xuICB2YXIgeCA9IHh5elswXSAvIDEwMCxcbiAgICAgIHkgPSB4eXpbMV0gLyAxMDAsXG4gICAgICB6ID0geHl6WzJdIC8gMTAwLFxuICAgICAgciwgZywgYjtcblxuICByID0gKHggKiAzLjI0MDYpICsgKHkgKiAtMS41MzcyKSArICh6ICogLTAuNDk4Nik7XG4gIGcgPSAoeCAqIC0wLjk2ODkpICsgKHkgKiAxLjg3NTgpICsgKHogKiAwLjA0MTUpO1xuICBiID0gKHggKiAwLjA1NTcpICsgKHkgKiAtMC4yMDQwKSArICh6ICogMS4wNTcwKTtcblxuICAvLyBhc3N1bWUgc1JHQlxuICByID0gciA+IDAuMDAzMTMwOCA/ICgoMS4wNTUgKiBNYXRoLnBvdyhyLCAxLjAgLyAyLjQpKSAtIDAuMDU1KVxuICAgIDogciA9IChyICogMTIuOTIpO1xuXG4gIGcgPSBnID4gMC4wMDMxMzA4ID8gKCgxLjA1NSAqIE1hdGgucG93KGcsIDEuMCAvIDIuNCkpIC0gMC4wNTUpXG4gICAgOiBnID0gKGcgKiAxMi45Mik7XG5cbiAgYiA9IGIgPiAwLjAwMzEzMDggPyAoKDEuMDU1ICogTWF0aC5wb3coYiwgMS4wIC8gMi40KSkgLSAwLjA1NSlcbiAgICA6IGIgPSAoYiAqIDEyLjkyKTtcblxuICByID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgciksIDEpO1xuICBnID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgZyksIDEpO1xuICBiID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgYiksIDEpO1xuXG4gIHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59XG5cbmZ1bmN0aW9uIHh5ejJsYWIoeHl6KSB7XG4gIHZhciB4ID0geHl6WzBdLFxuICAgICAgeSA9IHh5elsxXSxcbiAgICAgIHogPSB4eXpbMl0sXG4gICAgICBsLCBhLCBiO1xuXG4gIHggLz0gOTUuMDQ3O1xuICB5IC89IDEwMDtcbiAgeiAvPSAxMDguODgzO1xuXG4gIHggPSB4ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh4LCAxLzMpIDogKDcuNzg3ICogeCkgKyAoMTYgLyAxMTYpO1xuICB5ID0geSA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeSwgMS8zKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcbiAgeiA9IHogPiAwLjAwODg1NiA/IE1hdGgucG93KHosIDEvMykgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cbiAgbCA9ICgxMTYgKiB5KSAtIDE2O1xuICBhID0gNTAwICogKHggLSB5KTtcbiAgYiA9IDIwMCAqICh5IC0geik7XG5cbiAgcmV0dXJuIFtsLCBhLCBiXTtcbn1cblxuZnVuY3Rpb24geHl6MmxjaChhcmdzKSB7XG4gIHJldHVybiBsYWIybGNoKHh5ejJsYWIoYXJncykpO1xufVxuXG5mdW5jdGlvbiBsYWIyeHl6KGxhYikge1xuICB2YXIgbCA9IGxhYlswXSxcbiAgICAgIGEgPSBsYWJbMV0sXG4gICAgICBiID0gbGFiWzJdLFxuICAgICAgeCwgeSwgeiwgeTI7XG5cbiAgaWYgKGwgPD0gOCkge1xuICAgIHkgPSAobCAqIDEwMCkgLyA5MDMuMztcbiAgICB5MiA9ICg3Ljc4NyAqICh5IC8gMTAwKSkgKyAoMTYgLyAxMTYpO1xuICB9IGVsc2Uge1xuICAgIHkgPSAxMDAgKiBNYXRoLnBvdygobCArIDE2KSAvIDExNiwgMyk7XG4gICAgeTIgPSBNYXRoLnBvdyh5IC8gMTAwLCAxLzMpO1xuICB9XG5cbiAgeCA9IHggLyA5NS4wNDcgPD0gMC4wMDg4NTYgPyB4ID0gKDk1LjA0NyAqICgoYSAvIDUwMCkgKyB5MiAtICgxNiAvIDExNikpKSAvIDcuNzg3IDogOTUuMDQ3ICogTWF0aC5wb3coKGEgLyA1MDApICsgeTIsIDMpO1xuXG4gIHogPSB6IC8gMTA4Ljg4MyA8PSAwLjAwODg1OSA/IHogPSAoMTA4Ljg4MyAqICh5MiAtIChiIC8gMjAwKSAtICgxNiAvIDExNikpKSAvIDcuNzg3IDogMTA4Ljg4MyAqIE1hdGgucG93KHkyIC0gKGIgLyAyMDApLCAzKTtcblxuICByZXR1cm4gW3gsIHksIHpdO1xufVxuXG5mdW5jdGlvbiBsYWIybGNoKGxhYikge1xuICB2YXIgbCA9IGxhYlswXSxcbiAgICAgIGEgPSBsYWJbMV0sXG4gICAgICBiID0gbGFiWzJdLFxuICAgICAgaHIsIGgsIGM7XG5cbiAgaHIgPSBNYXRoLmF0YW4yKGIsIGEpO1xuICBoID0gaHIgKiAzNjAgLyAyIC8gTWF0aC5QSTtcbiAgaWYgKGggPCAwKSB7XG4gICAgaCArPSAzNjA7XG4gIH1cbiAgYyA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTtcbiAgcmV0dXJuIFtsLCBjLCBoXTtcbn1cblxuZnVuY3Rpb24gbGFiMnJnYihhcmdzKSB7XG4gIHJldHVybiB4eXoycmdiKGxhYjJ4eXooYXJncykpO1xufVxuXG5mdW5jdGlvbiBsY2gybGFiKGxjaCkge1xuICB2YXIgbCA9IGxjaFswXSxcbiAgICAgIGMgPSBsY2hbMV0sXG4gICAgICBoID0gbGNoWzJdLFxuICAgICAgYSwgYiwgaHI7XG5cbiAgaHIgPSBoIC8gMzYwICogMiAqIE1hdGguUEk7XG4gIGEgPSBjICogTWF0aC5jb3MoaHIpO1xuICBiID0gYyAqIE1hdGguc2luKGhyKTtcbiAgcmV0dXJuIFtsLCBhLCBiXTtcbn1cblxuZnVuY3Rpb24gbGNoMnh5eihhcmdzKSB7XG4gIHJldHVybiBsYWIyeHl6KGxjaDJsYWIoYXJncykpO1xufVxuXG5mdW5jdGlvbiBsY2gycmdiKGFyZ3MpIHtcbiAgcmV0dXJuIGxhYjJyZ2IobGNoMmxhYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGtleXdvcmQycmdiKGtleXdvcmQpIHtcbiAgcmV0dXJuIGNzc0tleXdvcmRzW2tleXdvcmRdO1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkMmhzbChhcmdzKSB7XG4gIHJldHVybiByZ2IyaHNsKGtleXdvcmQycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24ga2V5d29yZDJoc3YoYXJncykge1xuICByZXR1cm4gcmdiMmhzdihrZXl3b3JkMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGtleXdvcmQyaHdiKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJod2Ioa2V5d29yZDJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkMmNteWsoYXJncykge1xuICByZXR1cm4gcmdiMmNteWsoa2V5d29yZDJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkMmxhYihhcmdzKSB7XG4gIHJldHVybiByZ2IybGFiKGtleXdvcmQycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24ga2V5d29yZDJ4eXooYXJncykge1xuICByZXR1cm4gcmdiMnh5eihrZXl3b3JkMnJnYihhcmdzKSk7XG59XG5cbnZhciBjc3NLZXl3b3JkcyA9IHtcbiAgYWxpY2VibHVlOiAgWzI0MCwyNDgsMjU1XSxcbiAgYW50aXF1ZXdoaXRlOiBbMjUwLDIzNSwyMTVdLFxuICBhcXVhOiBbMCwyNTUsMjU1XSxcbiAgYXF1YW1hcmluZTogWzEyNywyNTUsMjEyXSxcbiAgYXp1cmU6ICBbMjQwLDI1NSwyNTVdLFxuICBiZWlnZTogIFsyNDUsMjQ1LDIyMF0sXG4gIGJpc3F1ZTogWzI1NSwyMjgsMTk2XSxcbiAgYmxhY2s6ICBbMCwwLDBdLFxuICBibGFuY2hlZGFsbW9uZDogWzI1NSwyMzUsMjA1XSxcbiAgYmx1ZTogWzAsMCwyNTVdLFxuICBibHVldmlvbGV0OiBbMTM4LDQzLDIyNl0sXG4gIGJyb3duOiAgWzE2NSw0Miw0Ml0sXG4gIGJ1cmx5d29vZDogIFsyMjIsMTg0LDEzNV0sXG4gIGNhZGV0Ymx1ZTogIFs5NSwxNTgsMTYwXSxcbiAgY2hhcnRyZXVzZTogWzEyNywyNTUsMF0sXG4gIGNob2NvbGF0ZTogIFsyMTAsMTA1LDMwXSxcbiAgY29yYWw6ICBbMjU1LDEyNyw4MF0sXG4gIGNvcm5mbG93ZXJibHVlOiBbMTAwLDE0OSwyMzddLFxuICBjb3Juc2lsazogWzI1NSwyNDgsMjIwXSxcbiAgY3JpbXNvbjogIFsyMjAsMjAsNjBdLFxuICBjeWFuOiBbMCwyNTUsMjU1XSxcbiAgZGFya2JsdWU6IFswLDAsMTM5XSxcbiAgZGFya2N5YW46IFswLDEzOSwxMzldLFxuICBkYXJrZ29sZGVucm9kOiAgWzE4NCwxMzQsMTFdLFxuICBkYXJrZ3JheTogWzE2OSwxNjksMTY5XSxcbiAgZGFya2dyZWVuOiAgWzAsMTAwLDBdLFxuICBkYXJrZ3JleTogWzE2OSwxNjksMTY5XSxcbiAgZGFya2toYWtpOiAgWzE4OSwxODMsMTA3XSxcbiAgZGFya21hZ2VudGE6ICBbMTM5LDAsMTM5XSxcbiAgZGFya29saXZlZ3JlZW46IFs4NSwxMDcsNDddLFxuICBkYXJrb3JhbmdlOiBbMjU1LDE0MCwwXSxcbiAgZGFya29yY2hpZDogWzE1Myw1MCwyMDRdLFxuICBkYXJrcmVkOiAgWzEzOSwwLDBdLFxuICBkYXJrc2FsbW9uOiBbMjMzLDE1MCwxMjJdLFxuICBkYXJrc2VhZ3JlZW46IFsxNDMsMTg4LDE0M10sXG4gIGRhcmtzbGF0ZWJsdWU6ICBbNzIsNjEsMTM5XSxcbiAgZGFya3NsYXRlZ3JheTogIFs0Nyw3OSw3OV0sXG4gIGRhcmtzbGF0ZWdyZXk6ICBbNDcsNzksNzldLFxuICBkYXJrdHVycXVvaXNlOiAgWzAsMjA2LDIwOV0sXG4gIGRhcmt2aW9sZXQ6IFsxNDgsMCwyMTFdLFxuICBkZWVwcGluazogWzI1NSwyMCwxNDddLFxuICBkZWVwc2t5Ymx1ZTogIFswLDE5MSwyNTVdLFxuICBkaW1ncmF5OiAgWzEwNSwxMDUsMTA1XSxcbiAgZGltZ3JleTogIFsxMDUsMTA1LDEwNV0sXG4gIGRvZGdlcmJsdWU6IFszMCwxNDQsMjU1XSxcbiAgZmlyZWJyaWNrOiAgWzE3OCwzNCwzNF0sXG4gIGZsb3JhbHdoaXRlOiAgWzI1NSwyNTAsMjQwXSxcbiAgZm9yZXN0Z3JlZW46ICBbMzQsMTM5LDM0XSxcbiAgZnVjaHNpYTogIFsyNTUsMCwyNTVdLFxuICBnYWluc2Jvcm86ICBbMjIwLDIyMCwyMjBdLFxuICBnaG9zdHdoaXRlOiBbMjQ4LDI0OCwyNTVdLFxuICBnb2xkOiBbMjU1LDIxNSwwXSxcbiAgZ29sZGVucm9kOiAgWzIxOCwxNjUsMzJdLFxuICBncmF5OiBbMTI4LDEyOCwxMjhdLFxuICBncmVlbjogIFswLDEyOCwwXSxcbiAgZ3JlZW55ZWxsb3c6ICBbMTczLDI1NSw0N10sXG4gIGdyZXk6IFsxMjgsMTI4LDEyOF0sXG4gIGhvbmV5ZGV3OiBbMjQwLDI1NSwyNDBdLFxuICBob3RwaW5rOiAgWzI1NSwxMDUsMTgwXSxcbiAgaW5kaWFucmVkOiAgWzIwNSw5Miw5Ml0sXG4gIGluZGlnbzogWzc1LDAsMTMwXSxcbiAgaXZvcnk6ICBbMjU1LDI1NSwyNDBdLFxuICBraGFraTogIFsyNDAsMjMwLDE0MF0sXG4gIGxhdmVuZGVyOiBbMjMwLDIzMCwyNTBdLFxuICBsYXZlbmRlcmJsdXNoOiAgWzI1NSwyNDAsMjQ1XSxcbiAgbGF3bmdyZWVuOiAgWzEyNCwyNTIsMF0sXG4gIGxlbW9uY2hpZmZvbjogWzI1NSwyNTAsMjA1XSxcbiAgbGlnaHRibHVlOiAgWzE3MywyMTYsMjMwXSxcbiAgbGlnaHRjb3JhbDogWzI0MCwxMjgsMTI4XSxcbiAgbGlnaHRjeWFuOiAgWzIyNCwyNTUsMjU1XSxcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IFsyNTAsMjUwLDIxMF0sXG4gIGxpZ2h0Z3JheTogIFsyMTEsMjExLDIxMV0sXG4gIGxpZ2h0Z3JlZW46IFsxNDQsMjM4LDE0NF0sXG4gIGxpZ2h0Z3JleTogIFsyMTEsMjExLDIxMV0sXG4gIGxpZ2h0cGluazogIFsyNTUsMTgyLDE5M10sXG4gIGxpZ2h0c2FsbW9uOiAgWzI1NSwxNjAsMTIyXSxcbiAgbGlnaHRzZWFncmVlbjogIFszMiwxNzgsMTcwXSxcbiAgbGlnaHRza3libHVlOiBbMTM1LDIwNiwyNTBdLFxuICBsaWdodHNsYXRlZ3JheTogWzExOSwxMzYsMTUzXSxcbiAgbGlnaHRzbGF0ZWdyZXk6IFsxMTksMTM2LDE1M10sXG4gIGxpZ2h0c3RlZWxibHVlOiBbMTc2LDE5NiwyMjJdLFxuICBsaWdodHllbGxvdzogIFsyNTUsMjU1LDIyNF0sXG4gIGxpbWU6IFswLDI1NSwwXSxcbiAgbGltZWdyZWVuOiAgWzUwLDIwNSw1MF0sXG4gIGxpbmVuOiAgWzI1MCwyNDAsMjMwXSxcbiAgbWFnZW50YTogIFsyNTUsMCwyNTVdLFxuICBtYXJvb246IFsxMjgsMCwwXSxcbiAgbWVkaXVtYXF1YW1hcmluZTogWzEwMiwyMDUsMTcwXSxcbiAgbWVkaXVtYmx1ZTogWzAsMCwyMDVdLFxuICBtZWRpdW1vcmNoaWQ6IFsxODYsODUsMjExXSxcbiAgbWVkaXVtcHVycGxlOiBbMTQ3LDExMiwyMTldLFxuICBtZWRpdW1zZWFncmVlbjogWzYwLDE3OSwxMTNdLFxuICBtZWRpdW1zbGF0ZWJsdWU6ICBbMTIzLDEwNCwyMzhdLFxuICBtZWRpdW1zcHJpbmdncmVlbjogIFswLDI1MCwxNTRdLFxuICBtZWRpdW10dXJxdW9pc2U6ICBbNzIsMjA5LDIwNF0sXG4gIG1lZGl1bXZpb2xldHJlZDogIFsxOTksMjEsMTMzXSxcbiAgbWlkbmlnaHRibHVlOiBbMjUsMjUsMTEyXSxcbiAgbWludGNyZWFtOiAgWzI0NSwyNTUsMjUwXSxcbiAgbWlzdHlyb3NlOiAgWzI1NSwyMjgsMjI1XSxcbiAgbW9jY2FzaW46IFsyNTUsMjI4LDE4MV0sXG4gIG5hdmFqb3doaXRlOiAgWzI1NSwyMjIsMTczXSxcbiAgbmF2eTogWzAsMCwxMjhdLFxuICBvbGRsYWNlOiAgWzI1MywyNDUsMjMwXSxcbiAgb2xpdmU6ICBbMTI4LDEyOCwwXSxcbiAgb2xpdmVkcmFiOiAgWzEwNywxNDIsMzVdLFxuICBvcmFuZ2U6IFsyNTUsMTY1LDBdLFxuICBvcmFuZ2VyZWQ6ICBbMjU1LDY5LDBdLFxuICBvcmNoaWQ6IFsyMTgsMTEyLDIxNF0sXG4gIHBhbGVnb2xkZW5yb2Q6ICBbMjM4LDIzMiwxNzBdLFxuICBwYWxlZ3JlZW46ICBbMTUyLDI1MSwxNTJdLFxuICBwYWxldHVycXVvaXNlOiAgWzE3NSwyMzgsMjM4XSxcbiAgcGFsZXZpb2xldHJlZDogIFsyMTksMTEyLDE0N10sXG4gIHBhcGF5YXdoaXA6IFsyNTUsMjM5LDIxM10sXG4gIHBlYWNocHVmZjogIFsyNTUsMjE4LDE4NV0sXG4gIHBlcnU6IFsyMDUsMTMzLDYzXSxcbiAgcGluazogWzI1NSwxOTIsMjAzXSxcbiAgcGx1bTogWzIyMSwxNjAsMjIxXSxcbiAgcG93ZGVyYmx1ZTogWzE3NiwyMjQsMjMwXSxcbiAgcHVycGxlOiBbMTI4LDAsMTI4XSxcbiAgcmViZWNjYXB1cnBsZTogWzEwMiwgNTEsIDE1M10sXG4gIHJlZDogIFsyNTUsMCwwXSxcbiAgcm9zeWJyb3duOiAgWzE4OCwxNDMsMTQzXSxcbiAgcm95YWxibHVlOiAgWzY1LDEwNSwyMjVdLFxuICBzYWRkbGVicm93bjogIFsxMzksNjksMTldLFxuICBzYWxtb246IFsyNTAsMTI4LDExNF0sXG4gIHNhbmR5YnJvd246IFsyNDQsMTY0LDk2XSxcbiAgc2VhZ3JlZW46IFs0NiwxMzksODddLFxuICBzZWFzaGVsbDogWzI1NSwyNDUsMjM4XSxcbiAgc2llbm5hOiBbMTYwLDgyLDQ1XSxcbiAgc2lsdmVyOiBbMTkyLDE5MiwxOTJdLFxuICBza3libHVlOiAgWzEzNSwyMDYsMjM1XSxcbiAgc2xhdGVibHVlOiAgWzEwNiw5MCwyMDVdLFxuICBzbGF0ZWdyYXk6ICBbMTEyLDEyOCwxNDRdLFxuICBzbGF0ZWdyZXk6ICBbMTEyLDEyOCwxNDRdLFxuICBzbm93OiBbMjU1LDI1MCwyNTBdLFxuICBzcHJpbmdncmVlbjogIFswLDI1NSwxMjddLFxuICBzdGVlbGJsdWU6ICBbNzAsMTMwLDE4MF0sXG4gIHRhbjogIFsyMTAsMTgwLDE0MF0sXG4gIHRlYWw6IFswLDEyOCwxMjhdLFxuICB0aGlzdGxlOiAgWzIxNiwxOTEsMjE2XSxcbiAgdG9tYXRvOiBbMjU1LDk5LDcxXSxcbiAgdHVycXVvaXNlOiAgWzY0LDIyNCwyMDhdLFxuICB2aW9sZXQ6IFsyMzgsMTMwLDIzOF0sXG4gIHdoZWF0OiAgWzI0NSwyMjIsMTc5XSxcbiAgd2hpdGU6ICBbMjU1LDI1NSwyNTVdLFxuICB3aGl0ZXNtb2tlOiBbMjQ1LDI0NSwyNDVdLFxuICB5ZWxsb3c6IFsyNTUsMjU1LDBdLFxuICB5ZWxsb3dncmVlbjogIFsxNTQsMjA1LDUwXVxufTtcblxudmFyIHJldmVyc2VLZXl3b3JkcyA9IHt9O1xuZm9yICh2YXIga2V5IGluIGNzc0tleXdvcmRzKSB7XG4gIHJldmVyc2VLZXl3b3Jkc1tKU09OLnN0cmluZ2lmeShjc3NLZXl3b3Jkc1trZXldKV0gPSBrZXk7XG59XG5cbn0se31dLDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGNvbnZlcnNpb25zID0gcmVxdWlyZSg0KTtcblxudmFyIGNvbnZlcnQgPSBmdW5jdGlvbigpIHtcbiAgIHJldHVybiBuZXcgQ29udmVydGVyKCk7XG59XG5cbmZvciAodmFyIGZ1bmMgaW4gY29udmVyc2lvbnMpIHtcbiAgLy8gZXhwb3J0IFJhdyB2ZXJzaW9uc1xuICBjb252ZXJ0W2Z1bmMgKyBcIlJhd1wiXSA9ICAoZnVuY3Rpb24oZnVuYykge1xuICAgIC8vIGFjY2VwdCBhcnJheSBvciBwbGFpbiBhcmdzXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgICAgaWYgKHR5cGVvZiBhcmcgPT0gXCJudW1iZXJcIilcbiAgICAgICAgYXJnID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiBjb252ZXJzaW9uc1tmdW5jXShhcmcpO1xuICAgIH1cbiAgfSkoZnVuYyk7XG5cbiAgdmFyIHBhaXIgPSAvKFxcdyspMihcXHcrKS8uZXhlYyhmdW5jKSxcbiAgICAgIGZyb20gPSBwYWlyWzFdLFxuICAgICAgdG8gPSBwYWlyWzJdO1xuXG4gIC8vIGV4cG9ydCByZ2IyaHNsIGFuZCBbXCJyZ2JcIl1bXCJoc2xcIl1cbiAgY29udmVydFtmcm9tXSA9IGNvbnZlcnRbZnJvbV0gfHwge307XG5cbiAgY29udmVydFtmcm9tXVt0b10gPSBjb252ZXJ0W2Z1bmNdID0gKGZ1bmN0aW9uKGZ1bmMpIHsgXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgICAgaWYgKHR5cGVvZiBhcmcgPT0gXCJudW1iZXJcIilcbiAgICAgICAgYXJnID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgIFxuICAgICAgdmFyIHZhbCA9IGNvbnZlcnNpb25zW2Z1bmNdKGFyZyk7XG4gICAgICBpZiAodHlwZW9mIHZhbCA9PSBcInN0cmluZ1wiIHx8IHZhbCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdmFsOyAvLyBrZXl3b3JkXG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKVxuICAgICAgICB2YWxbaV0gPSBNYXRoLnJvdW5kKHZhbFtpXSk7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgfSkoZnVuYyk7XG59XG5cblxuLyogQ29udmVydGVyIGRvZXMgbGF6eSBjb252ZXJzaW9uIGFuZCBjYWNoaW5nICovXG52YXIgQ29udmVydGVyID0gZnVuY3Rpb24oKSB7XG4gICB0aGlzLmNvbnZzID0ge307XG59O1xuXG4vKiBFaXRoZXIgZ2V0IHRoZSB2YWx1ZXMgZm9yIGEgc3BhY2Ugb3JcbiAgc2V0IHRoZSB2YWx1ZXMgZm9yIGEgc3BhY2UsIGRlcGVuZGluZyBvbiBhcmdzICovXG5Db252ZXJ0ZXIucHJvdG90eXBlLnJvdXRlU3BhY2UgPSBmdW5jdGlvbihzcGFjZSwgYXJncykge1xuICAgdmFyIHZhbHVlcyA9IGFyZ3NbMF07XG4gICBpZiAodmFsdWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGNvbG9yLnJnYigpXG4gICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZXMoc3BhY2UpO1xuICAgfVxuICAgLy8gY29sb3IucmdiKDEwLCAxMCwgMTApXG4gICBpZiAodHlwZW9mIHZhbHVlcyA9PSBcIm51bWJlclwiKSB7XG4gICAgICB2YWx1ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzKTsgICAgICAgIFxuICAgfVxuXG4gICByZXR1cm4gdGhpcy5zZXRWYWx1ZXMoc3BhY2UsIHZhbHVlcyk7XG59O1xuICBcbi8qIFNldCB0aGUgdmFsdWVzIGZvciBhIHNwYWNlLCBpbnZhbGlkYXRpbmcgY2FjaGUgKi9cbkNvbnZlcnRlci5wcm90b3R5cGUuc2V0VmFsdWVzID0gZnVuY3Rpb24oc3BhY2UsIHZhbHVlcykge1xuICAgdGhpcy5zcGFjZSA9IHNwYWNlO1xuICAgdGhpcy5jb252cyA9IHt9O1xuICAgdGhpcy5jb252c1tzcGFjZV0gPSB2YWx1ZXM7XG4gICByZXR1cm4gdGhpcztcbn07XG5cbi8qIEdldCB0aGUgdmFsdWVzIGZvciBhIHNwYWNlLiBJZiB0aGVyZSdzIGFscmVhZHlcbiAgYSBjb252ZXJzaW9uIGZvciB0aGUgc3BhY2UsIGZldGNoIGl0LCBvdGhlcndpc2VcbiAgY29tcHV0ZSBpdCAqL1xuQ29udmVydGVyLnByb3RvdHlwZS5nZXRWYWx1ZXMgPSBmdW5jdGlvbihzcGFjZSkge1xuICAgdmFyIHZhbHMgPSB0aGlzLmNvbnZzW3NwYWNlXTtcbiAgIGlmICghdmFscykge1xuICAgICAgdmFyIGZzcGFjZSA9IHRoaXMuc3BhY2UsXG4gICAgICAgICAgZnJvbSA9IHRoaXMuY29udnNbZnNwYWNlXTtcbiAgICAgIHZhbHMgPSBjb252ZXJ0W2ZzcGFjZV1bc3BhY2VdKGZyb20pO1xuXG4gICAgICB0aGlzLmNvbnZzW3NwYWNlXSA9IHZhbHM7XG4gICB9XG4gIHJldHVybiB2YWxzO1xufTtcblxuW1wicmdiXCIsIFwiaHNsXCIsIFwiaHN2XCIsIFwiY215a1wiLCBcImtleXdvcmRcIl0uZm9yRWFjaChmdW5jdGlvbihzcGFjZSkge1xuICAgQ29udmVydGVyLnByb3RvdHlwZVtzcGFjZV0gPSBmdW5jdGlvbih2YWxzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb3V0ZVNwYWNlKHNwYWNlLCBhcmd1bWVudHMpO1xuICAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydDtcbn0se1wiNFwiOjR9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0XCJhbGljZWJsdWVcIjogWzI0MCwgMjQ4LCAyNTVdLFxuXHRcImFudGlxdWV3aGl0ZVwiOiBbMjUwLCAyMzUsIDIxNV0sXG5cdFwiYXF1YVwiOiBbMCwgMjU1LCAyNTVdLFxuXHRcImFxdWFtYXJpbmVcIjogWzEyNywgMjU1LCAyMTJdLFxuXHRcImF6dXJlXCI6IFsyNDAsIDI1NSwgMjU1XSxcblx0XCJiZWlnZVwiOiBbMjQ1LCAyNDUsIDIyMF0sXG5cdFwiYmlzcXVlXCI6IFsyNTUsIDIyOCwgMTk2XSxcblx0XCJibGFja1wiOiBbMCwgMCwgMF0sXG5cdFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwgMjM1LCAyMDVdLFxuXHRcImJsdWVcIjogWzAsIDAsIDI1NV0sXG5cdFwiYmx1ZXZpb2xldFwiOiBbMTM4LCA0MywgMjI2XSxcblx0XCJicm93blwiOiBbMTY1LCA0MiwgNDJdLFxuXHRcImJ1cmx5d29vZFwiOiBbMjIyLCAxODQsIDEzNV0sXG5cdFwiY2FkZXRibHVlXCI6IFs5NSwgMTU4LCAxNjBdLFxuXHRcImNoYXJ0cmV1c2VcIjogWzEyNywgMjU1LCAwXSxcblx0XCJjaG9jb2xhdGVcIjogWzIxMCwgMTA1LCAzMF0sXG5cdFwiY29yYWxcIjogWzI1NSwgMTI3LCA4MF0sXG5cdFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwgMTQ5LCAyMzddLFxuXHRcImNvcm5zaWxrXCI6IFsyNTUsIDI0OCwgMjIwXSxcblx0XCJjcmltc29uXCI6IFsyMjAsIDIwLCA2MF0sXG5cdFwiY3lhblwiOiBbMCwgMjU1LCAyNTVdLFxuXHRcImRhcmtibHVlXCI6IFswLCAwLCAxMzldLFxuXHRcImRhcmtjeWFuXCI6IFswLCAxMzksIDEzOV0sXG5cdFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LCAxMzQsIDExXSxcblx0XCJkYXJrZ3JheVwiOiBbMTY5LCAxNjksIDE2OV0sXG5cdFwiZGFya2dyZWVuXCI6IFswLCAxMDAsIDBdLFxuXHRcImRhcmtncmV5XCI6IFsxNjksIDE2OSwgMTY5XSxcblx0XCJkYXJra2hha2lcIjogWzE4OSwgMTgzLCAxMDddLFxuXHRcImRhcmttYWdlbnRhXCI6IFsxMzksIDAsIDEzOV0sXG5cdFwiZGFya29saXZlZ3JlZW5cIjogWzg1LCAxMDcsIDQ3XSxcblx0XCJkYXJrb3JhbmdlXCI6IFsyNTUsIDE0MCwgMF0sXG5cdFwiZGFya29yY2hpZFwiOiBbMTUzLCA1MCwgMjA0XSxcblx0XCJkYXJrcmVkXCI6IFsxMzksIDAsIDBdLFxuXHRcImRhcmtzYWxtb25cIjogWzIzMywgMTUwLCAxMjJdLFxuXHRcImRhcmtzZWFncmVlblwiOiBbMTQzLCAxODgsIDE0M10sXG5cdFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsIDYxLCAxMzldLFxuXHRcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LCA3OSwgNzldLFxuXHRcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LCA3OSwgNzldLFxuXHRcImRhcmt0dXJxdW9pc2VcIjogWzAsIDIwNiwgMjA5XSxcblx0XCJkYXJrdmlvbGV0XCI6IFsxNDgsIDAsIDIxMV0sXG5cdFwiZGVlcHBpbmtcIjogWzI1NSwgMjAsIDE0N10sXG5cdFwiZGVlcHNreWJsdWVcIjogWzAsIDE5MSwgMjU1XSxcblx0XCJkaW1ncmF5XCI6IFsxMDUsIDEwNSwgMTA1XSxcblx0XCJkaW1ncmV5XCI6IFsxMDUsIDEwNSwgMTA1XSxcblx0XCJkb2RnZXJibHVlXCI6IFszMCwgMTQ0LCAyNTVdLFxuXHRcImZpcmVicmlja1wiOiBbMTc4LCAzNCwgMzRdLFxuXHRcImZsb3JhbHdoaXRlXCI6IFsyNTUsIDI1MCwgMjQwXSxcblx0XCJmb3Jlc3RncmVlblwiOiBbMzQsIDEzOSwgMzRdLFxuXHRcImZ1Y2hzaWFcIjogWzI1NSwgMCwgMjU1XSxcblx0XCJnYWluc2Jvcm9cIjogWzIyMCwgMjIwLCAyMjBdLFxuXHRcImdob3N0d2hpdGVcIjogWzI0OCwgMjQ4LCAyNTVdLFxuXHRcImdvbGRcIjogWzI1NSwgMjE1LCAwXSxcblx0XCJnb2xkZW5yb2RcIjogWzIxOCwgMTY1LCAzMl0sXG5cdFwiZ3JheVwiOiBbMTI4LCAxMjgsIDEyOF0sXG5cdFwiZ3JlZW5cIjogWzAsIDEyOCwgMF0sXG5cdFwiZ3JlZW55ZWxsb3dcIjogWzE3MywgMjU1LCA0N10sXG5cdFwiZ3JleVwiOiBbMTI4LCAxMjgsIDEyOF0sXG5cdFwiaG9uZXlkZXdcIjogWzI0MCwgMjU1LCAyNDBdLFxuXHRcImhvdHBpbmtcIjogWzI1NSwgMTA1LCAxODBdLFxuXHRcImluZGlhbnJlZFwiOiBbMjA1LCA5MiwgOTJdLFxuXHRcImluZGlnb1wiOiBbNzUsIDAsIDEzMF0sXG5cdFwiaXZvcnlcIjogWzI1NSwgMjU1LCAyNDBdLFxuXHRcImtoYWtpXCI6IFsyNDAsIDIzMCwgMTQwXSxcblx0XCJsYXZlbmRlclwiOiBbMjMwLCAyMzAsIDI1MF0sXG5cdFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LCAyNDAsIDI0NV0sXG5cdFwibGF3bmdyZWVuXCI6IFsxMjQsIDI1MiwgMF0sXG5cdFwibGVtb25jaGlmZm9uXCI6IFsyNTUsIDI1MCwgMjA1XSxcblx0XCJsaWdodGJsdWVcIjogWzE3MywgMjE2LCAyMzBdLFxuXHRcImxpZ2h0Y29yYWxcIjogWzI0MCwgMTI4LCAxMjhdLFxuXHRcImxpZ2h0Y3lhblwiOiBbMjI0LCAyNTUsIDI1NV0sXG5cdFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwgMjUwLCAyMTBdLFxuXHRcImxpZ2h0Z3JheVwiOiBbMjExLCAyMTEsIDIxMV0sXG5cdFwibGlnaHRncmVlblwiOiBbMTQ0LCAyMzgsIDE0NF0sXG5cdFwibGlnaHRncmV5XCI6IFsyMTEsIDIxMSwgMjExXSxcblx0XCJsaWdodHBpbmtcIjogWzI1NSwgMTgyLCAxOTNdLFxuXHRcImxpZ2h0c2FsbW9uXCI6IFsyNTUsIDE2MCwgMTIyXSxcblx0XCJsaWdodHNlYWdyZWVuXCI6IFszMiwgMTc4LCAxNzBdLFxuXHRcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDI1MF0sXG5cdFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwgMTM2LCAxNTNdLFxuXHRcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksIDEzNiwgMTUzXSxcblx0XCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LCAxOTYsIDIyMl0sXG5cdFwibGlnaHR5ZWxsb3dcIjogWzI1NSwgMjU1LCAyMjRdLFxuXHRcImxpbWVcIjogWzAsIDI1NSwgMF0sXG5cdFwibGltZWdyZWVuXCI6IFs1MCwgMjA1LCA1MF0sXG5cdFwibGluZW5cIjogWzI1MCwgMjQwLCAyMzBdLFxuXHRcIm1hZ2VudGFcIjogWzI1NSwgMCwgMjU1XSxcblx0XCJtYXJvb25cIjogWzEyOCwgMCwgMF0sXG5cdFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLCAyMDUsIDE3MF0sXG5cdFwibWVkaXVtYmx1ZVwiOiBbMCwgMCwgMjA1XSxcblx0XCJtZWRpdW1vcmNoaWRcIjogWzE4NiwgODUsIDIxMV0sXG5cdFwibWVkaXVtcHVycGxlXCI6IFsxNDcsIDExMiwgMjE5XSxcblx0XCJtZWRpdW1zZWFncmVlblwiOiBbNjAsIDE3OSwgMTEzXSxcblx0XCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywgMTA0LCAyMzhdLFxuXHRcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLCAyNTAsIDE1NF0sXG5cdFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwgMjA5LCAyMDRdLFxuXHRcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LCAyMSwgMTMzXSxcblx0XCJtaWRuaWdodGJsdWVcIjogWzI1LCAyNSwgMTEyXSxcblx0XCJtaW50Y3JlYW1cIjogWzI0NSwgMjU1LCAyNTBdLFxuXHRcIm1pc3R5cm9zZVwiOiBbMjU1LCAyMjgsIDIyNV0sXG5cdFwibW9jY2FzaW5cIjogWzI1NSwgMjI4LCAxODFdLFxuXHRcIm5hdmFqb3doaXRlXCI6IFsyNTUsIDIyMiwgMTczXSxcblx0XCJuYXZ5XCI6IFswLCAwLCAxMjhdLFxuXHRcIm9sZGxhY2VcIjogWzI1MywgMjQ1LCAyMzBdLFxuXHRcIm9saXZlXCI6IFsxMjgsIDEyOCwgMF0sXG5cdFwib2xpdmVkcmFiXCI6IFsxMDcsIDE0MiwgMzVdLFxuXHRcIm9yYW5nZVwiOiBbMjU1LCAxNjUsIDBdLFxuXHRcIm9yYW5nZXJlZFwiOiBbMjU1LCA2OSwgMF0sXG5cdFwib3JjaGlkXCI6IFsyMTgsIDExMiwgMjE0XSxcblx0XCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsIDIzMiwgMTcwXSxcblx0XCJwYWxlZ3JlZW5cIjogWzE1MiwgMjUxLCAxNTJdLFxuXHRcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwgMjM4LCAyMzhdLFxuXHRcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwgMTEyLCAxNDddLFxuXHRcInBhcGF5YXdoaXBcIjogWzI1NSwgMjM5LCAyMTNdLFxuXHRcInBlYWNocHVmZlwiOiBbMjU1LCAyMTgsIDE4NV0sXG5cdFwicGVydVwiOiBbMjA1LCAxMzMsIDYzXSxcblx0XCJwaW5rXCI6IFsyNTUsIDE5MiwgMjAzXSxcblx0XCJwbHVtXCI6IFsyMjEsIDE2MCwgMjIxXSxcblx0XCJwb3dkZXJibHVlXCI6IFsxNzYsIDIyNCwgMjMwXSxcblx0XCJwdXJwbGVcIjogWzEyOCwgMCwgMTI4XSxcblx0XCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsIDUxLCAxNTNdLFxuXHRcInJlZFwiOiBbMjU1LCAwLCAwXSxcblx0XCJyb3N5YnJvd25cIjogWzE4OCwgMTQzLCAxNDNdLFxuXHRcInJveWFsYmx1ZVwiOiBbNjUsIDEwNSwgMjI1XSxcblx0XCJzYWRkbGVicm93blwiOiBbMTM5LCA2OSwgMTldLFxuXHRcInNhbG1vblwiOiBbMjUwLCAxMjgsIDExNF0sXG5cdFwic2FuZHlicm93blwiOiBbMjQ0LCAxNjQsIDk2XSxcblx0XCJzZWFncmVlblwiOiBbNDYsIDEzOSwgODddLFxuXHRcInNlYXNoZWxsXCI6IFsyNTUsIDI0NSwgMjM4XSxcblx0XCJzaWVubmFcIjogWzE2MCwgODIsIDQ1XSxcblx0XCJzaWx2ZXJcIjogWzE5MiwgMTkyLCAxOTJdLFxuXHRcInNreWJsdWVcIjogWzEzNSwgMjA2LCAyMzVdLFxuXHRcInNsYXRlYmx1ZVwiOiBbMTA2LCA5MCwgMjA1XSxcblx0XCJzbGF0ZWdyYXlcIjogWzExMiwgMTI4LCAxNDRdLFxuXHRcInNsYXRlZ3JleVwiOiBbMTEyLCAxMjgsIDE0NF0sXG5cdFwic25vd1wiOiBbMjU1LCAyNTAsIDI1MF0sXG5cdFwic3ByaW5nZ3JlZW5cIjogWzAsIDI1NSwgMTI3XSxcblx0XCJzdGVlbGJsdWVcIjogWzcwLCAxMzAsIDE4MF0sXG5cdFwidGFuXCI6IFsyMTAsIDE4MCwgMTQwXSxcblx0XCJ0ZWFsXCI6IFswLCAxMjgsIDEyOF0sXG5cdFwidGhpc3RsZVwiOiBbMjE2LCAxOTEsIDIxNl0sXG5cdFwidG9tYXRvXCI6IFsyNTUsIDk5LCA3MV0sXG5cdFwidHVycXVvaXNlXCI6IFs2NCwgMjI0LCAyMDhdLFxuXHRcInZpb2xldFwiOiBbMjM4LCAxMzAsIDIzOF0sXG5cdFwid2hlYXRcIjogWzI0NSwgMjIyLCAxNzldLFxuXHRcIndoaXRlXCI6IFsyNTUsIDI1NSwgMjU1XSxcblx0XCJ3aGl0ZXNtb2tlXCI6IFsyNDUsIDI0NSwgMjQ1XSxcblx0XCJ5ZWxsb3dcIjogWzI1NSwgMjU1LCAwXSxcblx0XCJ5ZWxsb3dncmVlblwiOiBbMTU0LCAyMDUsIDUwXVxufTtcblxufSx7fV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBuYW1lc3BhY2UgQ2hhcnRcbiAqL1xudmFyIENoYXJ0ID0gcmVxdWlyZSgzMCkoKTtcblxuQ2hhcnQuaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG4vLyBAdG9kbyBkaXNwYXRjaCB0aGVzZSBoZWxwZXJzIGludG8gYXBwcm9wcmlhdGVkIGhlbHBlcnMvaGVscGVycy4qIGZpbGUgYW5kIHdyaXRlIHVuaXQgdGVzdHMhXG5yZXF1aXJlKDI4KShDaGFydCk7XG5cbkNoYXJ0LkFuaW1hdGlvbiA9IHJlcXVpcmUoMjIpO1xuQ2hhcnQuYW5pbWF0aW9uU2VydmljZSA9IHJlcXVpcmUoMjMpO1xuQ2hhcnQuZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbkNoYXJ0LkVsZW1lbnQgPSByZXF1aXJlKDI3KTtcbkNoYXJ0LmVsZW1lbnRzID0gcmVxdWlyZSg0MSk7XG5DaGFydC5JbnRlcmFjdGlvbiA9IHJlcXVpcmUoMjkpO1xuQ2hhcnQubGF5b3V0cyA9IHJlcXVpcmUoMzEpO1xuQ2hhcnQucGxhdGZvcm0gPSByZXF1aXJlKDQ5KTtcbkNoYXJ0LnBsdWdpbnMgPSByZXF1aXJlKDMyKTtcbkNoYXJ0LlNjYWxlID0gcmVxdWlyZSgzMyk7XG5DaGFydC5zY2FsZVNlcnZpY2UgPSByZXF1aXJlKDM0KTtcbkNoYXJ0LlRpY2tzID0gcmVxdWlyZSgzNSk7XG5DaGFydC5Ub29sdGlwID0gcmVxdWlyZSgzNik7XG5cbnJlcXVpcmUoMjQpKENoYXJ0KTtcbnJlcXVpcmUoMjUpKENoYXJ0KTtcblxucmVxdWlyZSg1NikoQ2hhcnQpO1xucmVxdWlyZSg1NCkoQ2hhcnQpO1xucmVxdWlyZSg1NSkoQ2hhcnQpO1xucmVxdWlyZSg1NykoQ2hhcnQpO1xucmVxdWlyZSg1OCkoQ2hhcnQpO1xucmVxdWlyZSg1OSkoQ2hhcnQpO1xuXG4vLyBDb250cm9sbGVycyBtdXN0IGJlIGxvYWRlZCBhZnRlciBlbGVtZW50c1xuLy8gU2VlIENoYXJ0LmNvcmUuZGF0YXNldENvbnRyb2xsZXIuZGF0YUVsZW1lbnRUeXBlXG5yZXF1aXJlKDE1KShDaGFydCk7XG5yZXF1aXJlKDE2KShDaGFydCk7XG5yZXF1aXJlKDE3KShDaGFydCk7XG5yZXF1aXJlKDE4KShDaGFydCk7XG5yZXF1aXJlKDE5KShDaGFydCk7XG5yZXF1aXJlKDIwKShDaGFydCk7XG5yZXF1aXJlKDIxKShDaGFydCk7XG5cbnJlcXVpcmUoOCkoQ2hhcnQpO1xucmVxdWlyZSg5KShDaGFydCk7XG5yZXF1aXJlKDEwKShDaGFydCk7XG5yZXF1aXJlKDExKShDaGFydCk7XG5yZXF1aXJlKDEyKShDaGFydCk7XG5yZXF1aXJlKDEzKShDaGFydCk7XG5yZXF1aXJlKDE0KShDaGFydCk7XG5cbi8vIExvYWRpbmcgYnVpbHQtaW4gcGx1Z2luc1xudmFyIHBsdWdpbnMgPSByZXF1aXJlKDUwKTtcbmZvciAodmFyIGsgaW4gcGx1Z2lucykge1xuXHRpZiAocGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShrKSkge1xuXHRcdENoYXJ0LnBsdWdpbnMucmVnaXN0ZXIocGx1Z2luc1trXSk7XG5cdH1cbn1cblxuQ2hhcnQucGxhdGZvcm0uaW5pdGlhbGl6ZSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENoYXJ0O1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG5cdHdpbmRvdy5DaGFydCA9IENoYXJ0O1xufVxuXG4vLyBERVBSRUNBVElPTlNcblxuLyoqXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgbm90IGF2YWlsYWJsZSBhbnltb3JlXG4gKiBAbmFtZXNwYWNlIENoYXJ0LkxlZ2VuZFxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjEuNVxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuQ2hhcnQuTGVnZW5kID0gcGx1Z2lucy5sZWdlbmQuX2VsZW1lbnQ7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIG5vdCBhdmFpbGFibGUgYW55bW9yZVxuICogQG5hbWVzcGFjZSBDaGFydC5UaXRsZVxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjEuNVxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuQ2hhcnQuVGl0bGUgPSBwbHVnaW5zLnRpdGxlLl9lbGVtZW50O1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQucGx1Z2lucyBpbnN0ZWFkXG4gKiBAbmFtZXNwYWNlIENoYXJ0LnBsdWdpblNlcnZpY2VcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi4xLjVcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbkNoYXJ0LnBsdWdpblNlcnZpY2UgPSBDaGFydC5wbHVnaW5zO1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBpbmhlcml0aW5nIGZyb20gQ2hhcnQuUGx1Z2luZ0Jhc2UgaGFzIG5vXG4gKiBlZmZlY3QsIGluc3RlYWQgc2ltcGx5IGNyZWF0ZS9yZWdpc3RlciBwbHVnaW5zIHZpYSBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdHMuXG4gKiBAaW50ZXJmYWNlIENoYXJ0LlBsdWdpbkJhc2VcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi41LjBcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbkNoYXJ0LlBsdWdpbkJhc2UgPSBDaGFydC5FbGVtZW50LmV4dGVuZCh7fSk7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5oZWxwZXJzLmNhbnZhcyBpbnN0ZWFkLlxuICogQG5hbWVzcGFjZSBDaGFydC5jYW52YXNIZWxwZXJzXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNi4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5DaGFydC5jYW52YXNIZWxwZXJzID0gQ2hhcnQuaGVscGVycy5jYW52YXM7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5sYXlvdXRzIGluc3RlYWQuXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmxheW91dFNlcnZpY2VcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi44LjBcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbkNoYXJ0LmxheW91dFNlcnZpY2UgPSBDaGFydC5sYXlvdXRzO1xuXG59LHtcIjEwXCI6MTAsXCIxMVwiOjExLFwiMTJcIjoxMixcIjEzXCI6MTMsXCIxNFwiOjE0LFwiMTVcIjoxNSxcIjE2XCI6MTYsXCIxN1wiOjE3LFwiMThcIjoxOCxcIjE5XCI6MTksXCIyMFwiOjIwLFwiMjFcIjoyMSxcIjIyXCI6MjIsXCIyM1wiOjIzLFwiMjRcIjoyNCxcIjI1XCI6MjUsXCIyNlwiOjI2LFwiMjdcIjoyNyxcIjI4XCI6MjgsXCIyOVwiOjI5LFwiMzBcIjozMCxcIjMxXCI6MzEsXCIzMlwiOjMyLFwiMzNcIjozMyxcIjM0XCI6MzQsXCIzNVwiOjM1LFwiMzZcIjozNixcIjQxXCI6NDEsXCI0NlwiOjQ2LFwiNDlcIjo0OSxcIjUwXCI6NTAsXCI1NFwiOjU0LFwiNTVcIjo1NSxcIjU2XCI6NTYsXCI1N1wiOjU3LFwiNThcIjo1OCxcIjU5XCI6NTksXCI4XCI6OCxcIjlcIjo5fV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHRDaGFydC5CYXIgPSBmdW5jdGlvbihjb250ZXh0LCBjb25maWcpIHtcblx0XHRjb25maWcudHlwZSA9ICdiYXInO1xuXG5cdFx0cmV0dXJuIG5ldyBDaGFydChjb250ZXh0LCBjb25maWcpO1xuXHR9O1xuXG59O1xuXG59LHt9XSw5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xuXG5cdENoYXJ0LkJ1YmJsZSA9IGZ1bmN0aW9uKGNvbnRleHQsIGNvbmZpZykge1xuXHRcdGNvbmZpZy50eXBlID0gJ2J1YmJsZSc7XG5cdFx0cmV0dXJuIG5ldyBDaGFydChjb250ZXh0LCBjb25maWcpO1xuXHR9O1xuXG59O1xuXG59LHt9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHRDaGFydC5Eb3VnaG51dCA9IGZ1bmN0aW9uKGNvbnRleHQsIGNvbmZpZykge1xuXHRcdGNvbmZpZy50eXBlID0gJ2RvdWdobnV0JztcblxuXHRcdHJldHVybiBuZXcgQ2hhcnQoY29udGV4dCwgY29uZmlnKTtcblx0fTtcblxufTtcblxufSx7fV0sMTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0Q2hhcnQuTGluZSA9IGZ1bmN0aW9uKGNvbnRleHQsIGNvbmZpZykge1xuXHRcdGNvbmZpZy50eXBlID0gJ2xpbmUnO1xuXG5cdFx0cmV0dXJuIG5ldyBDaGFydChjb250ZXh0LCBjb25maWcpO1xuXHR9O1xuXG59O1xuXG59LHt9XSwxMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHRDaGFydC5Qb2xhckFyZWEgPSBmdW5jdGlvbihjb250ZXh0LCBjb25maWcpIHtcblx0XHRjb25maWcudHlwZSA9ICdwb2xhckFyZWEnO1xuXG5cdFx0cmV0dXJuIG5ldyBDaGFydChjb250ZXh0LCBjb25maWcpO1xuXHR9O1xuXG59O1xuXG59LHt9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHRDaGFydC5SYWRhciA9IGZ1bmN0aW9uKGNvbnRleHQsIGNvbmZpZykge1xuXHRcdGNvbmZpZy50eXBlID0gJ3JhZGFyJztcblxuXHRcdHJldHVybiBuZXcgQ2hhcnQoY29udGV4dCwgY29uZmlnKTtcblx0fTtcblxufTtcblxufSx7fV0sMTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cdENoYXJ0LlNjYXR0ZXIgPSBmdW5jdGlvbihjb250ZXh0LCBjb25maWcpIHtcblx0XHRjb25maWcudHlwZSA9ICdzY2F0dGVyJztcblx0XHRyZXR1cm4gbmV3IENoYXJ0KGNvbnRleHQsIGNvbmZpZyk7XG5cdH07XG59O1xuXG59LHt9XSwxNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIGVsZW1lbnRzID0gcmVxdWlyZSg0MSk7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG5kZWZhdWx0cy5fc2V0KCdiYXInLCB7XG5cdGhvdmVyOiB7XG5cdFx0bW9kZTogJ2xhYmVsJ1xuXHR9LFxuXG5cdHNjYWxlczoge1xuXHRcdHhBeGVzOiBbe1xuXHRcdFx0dHlwZTogJ2NhdGVnb3J5JyxcblxuXHRcdFx0Ly8gU3BlY2lmaWMgdG8gQmFyIENvbnRyb2xsZXJcblx0XHRcdGNhdGVnb3J5UGVyY2VudGFnZTogMC44LFxuXHRcdFx0YmFyUGVyY2VudGFnZTogMC45LFxuXG5cdFx0XHQvLyBvZmZzZXQgc2V0dGluZ3Ncblx0XHRcdG9mZnNldDogdHJ1ZSxcblxuXHRcdFx0Ly8gZ3JpZCBsaW5lIHNldHRpbmdzXG5cdFx0XHRncmlkTGluZXM6IHtcblx0XHRcdFx0b2Zmc2V0R3JpZExpbmVzOiB0cnVlXG5cdFx0XHR9XG5cdFx0fV0sXG5cblx0XHR5QXhlczogW3tcblx0XHRcdHR5cGU6ICdsaW5lYXInXG5cdFx0fV1cblx0fVxufSk7XG5cbmRlZmF1bHRzLl9zZXQoJ2hvcml6b250YWxCYXInLCB7XG5cdGhvdmVyOiB7XG5cdFx0bW9kZTogJ2luZGV4Jyxcblx0XHRheGlzOiAneSdcblx0fSxcblxuXHRzY2FsZXM6IHtcblx0XHR4QXhlczogW3tcblx0XHRcdHR5cGU6ICdsaW5lYXInLFxuXHRcdFx0cG9zaXRpb246ICdib3R0b20nXG5cdFx0fV0sXG5cblx0XHR5QXhlczogW3tcblx0XHRcdHBvc2l0aW9uOiAnbGVmdCcsXG5cdFx0XHR0eXBlOiAnY2F0ZWdvcnknLFxuXG5cdFx0XHQvLyBTcGVjaWZpYyB0byBIb3Jpem9udGFsIEJhciBDb250cm9sbGVyXG5cdFx0XHRjYXRlZ29yeVBlcmNlbnRhZ2U6IDAuOCxcblx0XHRcdGJhclBlcmNlbnRhZ2U6IDAuOSxcblxuXHRcdFx0Ly8gb2Zmc2V0IHNldHRpbmdzXG5cdFx0XHRvZmZzZXQ6IHRydWUsXG5cblx0XHRcdC8vIGdyaWQgbGluZSBzZXR0aW5nc1xuXHRcdFx0Z3JpZExpbmVzOiB7XG5cdFx0XHRcdG9mZnNldEdyaWRMaW5lczogdHJ1ZVxuXHRcdFx0fVxuXHRcdH1dXG5cdH0sXG5cblx0ZWxlbWVudHM6IHtcblx0XHRyZWN0YW5nbGU6IHtcblx0XHRcdGJvcmRlclNraXBwZWQ6ICdsZWZ0J1xuXHRcdH1cblx0fSxcblxuXHR0b29sdGlwczoge1xuXHRcdGNhbGxiYWNrczoge1xuXHRcdFx0dGl0bGU6IGZ1bmN0aW9uKGl0ZW0sIGRhdGEpIHtcblx0XHRcdFx0Ly8gUGljayBmaXJzdCB4TGFiZWwgZm9yIG5vd1xuXHRcdFx0XHR2YXIgdGl0bGUgPSAnJztcblxuXHRcdFx0XHRpZiAoaXRlbS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0aWYgKGl0ZW1bMF0ueUxhYmVsKSB7XG5cdFx0XHRcdFx0XHR0aXRsZSA9IGl0ZW1bMF0ueUxhYmVsO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoZGF0YS5sYWJlbHMubGVuZ3RoID4gMCAmJiBpdGVtWzBdLmluZGV4IDwgZGF0YS5sYWJlbHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHR0aXRsZSA9IGRhdGEubGFiZWxzW2l0ZW1bMF0uaW5kZXhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0aXRsZTtcblx0XHRcdH0sXG5cblx0XHRcdGxhYmVsOiBmdW5jdGlvbihpdGVtLCBkYXRhKSB7XG5cdFx0XHRcdHZhciBkYXRhc2V0TGFiZWwgPSBkYXRhLmRhdGFzZXRzW2l0ZW0uZGF0YXNldEluZGV4XS5sYWJlbCB8fCAnJztcblx0XHRcdFx0cmV0dXJuIGRhdGFzZXRMYWJlbCArICc6ICcgKyBpdGVtLnhMYWJlbDtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG1vZGU6ICdpbmRleCcsXG5cdFx0YXhpczogJ3knXG5cdH1cbn0pO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBcIm9wdGltYWxcIiBzYW1wbGUgc2l6ZSB0byBtYWludGFpbiBiYXJzIGVxdWFsbHkgc2l6ZWQgd2hpbGUgcHJldmVudGluZyBvdmVybGFwLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZU1pblNhbXBsZVNpemUoc2NhbGUsIHBpeGVscykge1xuXHR2YXIgbWluID0gc2NhbGUuaXNIb3Jpem9udGFsKCkgPyBzY2FsZS53aWR0aCA6IHNjYWxlLmhlaWdodDtcblx0dmFyIHRpY2tzID0gc2NhbGUuZ2V0VGlja3MoKTtcblx0dmFyIHByZXYsIGN1cnIsIGksIGlsZW47XG5cblx0Zm9yIChpID0gMSwgaWxlbiA9IHBpeGVscy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRtaW4gPSBNYXRoLm1pbihtaW4sIHBpeGVsc1tpXSAtIHBpeGVsc1tpIC0gMV0pO1xuXHR9XG5cblx0Zm9yIChpID0gMCwgaWxlbiA9IHRpY2tzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdGN1cnIgPSBzY2FsZS5nZXRQaXhlbEZvclRpY2soaSk7XG5cdFx0bWluID0gaSA+IDAgPyBNYXRoLm1pbihtaW4sIGN1cnIgLSBwcmV2KSA6IG1pbjtcblx0XHRwcmV2ID0gY3Vycjtcblx0fVxuXG5cdHJldHVybiBtaW47XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgYW4gXCJpZGVhbFwiIGNhdGVnb3J5IGJhc2VkIG9uIHRoZSBhYnNvbHV0ZSBiYXIgdGhpY2tuZXNzIG9yLCBpZiB1bmRlZmluZWQgb3IgbnVsbCxcbiAqIHVzZXMgdGhlIHNtYWxsZXN0IGludGVydmFsIChzZWUgY29tcHV0ZU1pblNhbXBsZVNpemUpIHRoYXQgcHJldmVudHMgYmFyIG92ZXJsYXBwaW5nLiBUaGlzXG4gKiBtb2RlIGN1cnJlbnRseSBhbHdheXMgZ2VuZXJhdGVzIGJhcnMgZXF1YWxseSBzaXplZCAodW50aWwgd2UgaW50cm9kdWNlIHNjcmlwdGFibGUgb3B0aW9ucz8pLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUZpdENhdGVnb3J5VHJhaXRzKGluZGV4LCBydWxlciwgb3B0aW9ucykge1xuXHR2YXIgdGhpY2tuZXNzID0gb3B0aW9ucy5iYXJUaGlja25lc3M7XG5cdHZhciBjb3VudCA9IHJ1bGVyLnN0YWNrQ291bnQ7XG5cdHZhciBjdXJyID0gcnVsZXIucGl4ZWxzW2luZGV4XTtcblx0dmFyIHNpemUsIHJhdGlvO1xuXG5cdGlmIChoZWxwZXJzLmlzTnVsbE9yVW5kZWYodGhpY2tuZXNzKSkge1xuXHRcdHNpemUgPSBydWxlci5taW4gKiBvcHRpb25zLmNhdGVnb3J5UGVyY2VudGFnZTtcblx0XHRyYXRpbyA9IG9wdGlvbnMuYmFyUGVyY2VudGFnZTtcblx0fSBlbHNlIHtcblx0XHQvLyBXaGVuIGJhciB0aGlja25lc3MgaXMgZW5mb3JjZWQsIGNhdGVnb3J5IGFuZCBiYXIgcGVyY2VudGFnZXMgYXJlIGlnbm9yZWQuXG5cdFx0Ly8gTm90ZShTQik6IHdlIGNvdWxkIGFkZCBzdXBwb3J0IGZvciByZWxhdGl2ZSBiYXIgdGhpY2tuZXNzIChlLmcuIGJhclRoaWNrbmVzczogJzUwJScpXG5cdFx0Ly8gYW5kIGRlcHJlY2F0ZSBiYXJQZXJjZW50YWdlIHNpbmNlIHRoaXMgdmFsdWUgaXMgaWdub3JlZCB3aGVuIHRoaWNrbmVzcyBpcyBhYnNvbHV0ZS5cblx0XHRzaXplID0gdGhpY2tuZXNzICogY291bnQ7XG5cdFx0cmF0aW8gPSAxO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRjaHVuazogc2l6ZSAvIGNvdW50LFxuXHRcdHJhdGlvOiByYXRpbyxcblx0XHRzdGFydDogY3VyciAtIChzaXplIC8gMilcblx0fTtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBhbiBcIm9wdGltYWxcIiBjYXRlZ29yeSB0aGF0IGdsb2JhbGx5IGFycmFuZ2VzIGJhcnMgc2lkZSBieSBzaWRlIChubyBnYXAgd2hlblxuICogcGVyY2VudGFnZSBvcHRpb25zIGFyZSAxKSwgYmFzZWQgb24gdGhlIHByZXZpb3VzIGFuZCBmb2xsb3dpbmcgY2F0ZWdvcmllcy4gVGhpcyBtb2RlXG4gKiBnZW5lcmF0ZXMgYmFycyB3aXRoIGRpZmZlcmVudCB3aWR0aHMgd2hlbiBkYXRhIGFyZSBub3QgZXZlbmx5IHNwYWNlZC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVGbGV4Q2F0ZWdvcnlUcmFpdHMoaW5kZXgsIHJ1bGVyLCBvcHRpb25zKSB7XG5cdHZhciBwaXhlbHMgPSBydWxlci5waXhlbHM7XG5cdHZhciBjdXJyID0gcGl4ZWxzW2luZGV4XTtcblx0dmFyIHByZXYgPSBpbmRleCA+IDAgPyBwaXhlbHNbaW5kZXggLSAxXSA6IG51bGw7XG5cdHZhciBuZXh0ID0gaW5kZXggPCBwaXhlbHMubGVuZ3RoIC0gMSA/IHBpeGVsc1tpbmRleCArIDFdIDogbnVsbDtcblx0dmFyIHBlcmNlbnQgPSBvcHRpb25zLmNhdGVnb3J5UGVyY2VudGFnZTtcblx0dmFyIHN0YXJ0LCBzaXplO1xuXG5cdGlmIChwcmV2ID09PSBudWxsKSB7XG5cdFx0Ly8gZmlyc3QgZGF0YTogaXRzIHNpemUgaXMgZG91YmxlIGJhc2VkIG9uIHRoZSBuZXh0IHBvaW50IG9yLFxuXHRcdC8vIGlmIGl0J3MgYWxzbyB0aGUgbGFzdCBkYXRhLCB3ZSB1c2UgdGhlIHNjYWxlIGVuZCBleHRyZW1pdHkuXG5cdFx0cHJldiA9IGN1cnIgLSAobmV4dCA9PT0gbnVsbCA/IHJ1bGVyLmVuZCAtIGN1cnIgOiBuZXh0IC0gY3Vycik7XG5cdH1cblxuXHRpZiAobmV4dCA9PT0gbnVsbCkge1xuXHRcdC8vIGxhc3QgZGF0YTogaXRzIHNpemUgaXMgYWxzbyBkb3VibGUgYmFzZWQgb24gdGhlIHByZXZpb3VzIHBvaW50LlxuXHRcdG5leHQgPSBjdXJyICsgY3VyciAtIHByZXY7XG5cdH1cblxuXHRzdGFydCA9IGN1cnIgLSAoKGN1cnIgLSBwcmV2KSAvIDIpICogcGVyY2VudDtcblx0c2l6ZSA9ICgobmV4dCAtIHByZXYpIC8gMikgKiBwZXJjZW50O1xuXG5cdHJldHVybiB7XG5cdFx0Y2h1bms6IHNpemUgLyBydWxlci5zdGFja0NvdW50LFxuXHRcdHJhdGlvOiBvcHRpb25zLmJhclBlcmNlbnRhZ2UsXG5cdFx0c3RhcnQ6IHN0YXJ0XG5cdH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHRDaGFydC5jb250cm9sbGVycy5iYXIgPSBDaGFydC5EYXRhc2V0Q29udHJvbGxlci5leHRlbmQoe1xuXG5cdFx0ZGF0YUVsZW1lbnRUeXBlOiBlbGVtZW50cy5SZWN0YW5nbGUsXG5cblx0XHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgbWV0YTtcblxuXHRcdFx0Q2hhcnQuRGF0YXNldENvbnRyb2xsZXIucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkobWUsIGFyZ3VtZW50cyk7XG5cblx0XHRcdG1ldGEgPSBtZS5nZXRNZXRhKCk7XG5cdFx0XHRtZXRhLnN0YWNrID0gbWUuZ2V0RGF0YXNldCgpLnN0YWNrO1xuXHRcdFx0bWV0YS5iYXIgPSB0cnVlO1xuXHRcdH0sXG5cblx0XHR1cGRhdGU6IGZ1bmN0aW9uKHJlc2V0KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIHJlY3RzID0gbWUuZ2V0TWV0YSgpLmRhdGE7XG5cdFx0XHR2YXIgaSwgaWxlbjtcblxuXHRcdFx0bWUuX3J1bGVyID0gbWUuZ2V0UnVsZXIoKTtcblxuXHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IHJlY3RzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRtZS51cGRhdGVFbGVtZW50KHJlY3RzW2ldLCBpLCByZXNldCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHVwZGF0ZUVsZW1lbnQ6IGZ1bmN0aW9uKHJlY3RhbmdsZSwgaW5kZXgsIHJlc2V0KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xuXHRcdFx0dmFyIGN1c3RvbSA9IHJlY3RhbmdsZS5jdXN0b20gfHwge307XG5cdFx0XHR2YXIgcmVjdGFuZ2xlT3B0aW9ucyA9IGNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucmVjdGFuZ2xlO1xuXG5cdFx0XHRyZWN0YW5nbGUuX3hTY2FsZSA9IG1lLmdldFNjYWxlRm9ySWQobWV0YS54QXhpc0lEKTtcblx0XHRcdHJlY3RhbmdsZS5feVNjYWxlID0gbWUuZ2V0U2NhbGVGb3JJZChtZXRhLnlBeGlzSUQpO1xuXHRcdFx0cmVjdGFuZ2xlLl9kYXRhc2V0SW5kZXggPSBtZS5pbmRleDtcblx0XHRcdHJlY3RhbmdsZS5faW5kZXggPSBpbmRleDtcblxuXHRcdFx0cmVjdGFuZ2xlLl9tb2RlbCA9IHtcblx0XHRcdFx0ZGF0YXNldExhYmVsOiBkYXRhc2V0LmxhYmVsLFxuXHRcdFx0XHRsYWJlbDogY2hhcnQuZGF0YS5sYWJlbHNbaW5kZXhdLFxuXHRcdFx0XHRib3JkZXJTa2lwcGVkOiBjdXN0b20uYm9yZGVyU2tpcHBlZCA/IGN1c3RvbS5ib3JkZXJTa2lwcGVkIDogcmVjdGFuZ2xlT3B0aW9ucy5ib3JkZXJTa2lwcGVkLFxuXHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgPyBjdXN0b20uYmFja2dyb3VuZENvbG9yIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IsIGluZGV4LCByZWN0YW5nbGVPcHRpb25zLmJhY2tncm91bmRDb2xvciksXG5cdFx0XHRcdGJvcmRlckNvbG9yOiBjdXN0b20uYm9yZGVyQ29sb3IgPyBjdXN0b20uYm9yZGVyQ29sb3IgOiBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LmJvcmRlckNvbG9yLCBpbmRleCwgcmVjdGFuZ2xlT3B0aW9ucy5ib3JkZXJDb2xvciksXG5cdFx0XHRcdGJvcmRlcldpZHRoOiBjdXN0b20uYm9yZGVyV2lkdGggPyBjdXN0b20uYm9yZGVyV2lkdGggOiBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LmJvcmRlcldpZHRoLCBpbmRleCwgcmVjdGFuZ2xlT3B0aW9ucy5ib3JkZXJXaWR0aClcblx0XHRcdH07XG5cblx0XHRcdG1lLnVwZGF0ZUVsZW1lbnRHZW9tZXRyeShyZWN0YW5nbGUsIGluZGV4LCByZXNldCk7XG5cblx0XHRcdHJlY3RhbmdsZS5waXZvdCgpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHVwZGF0ZUVsZW1lbnRHZW9tZXRyeTogZnVuY3Rpb24ocmVjdGFuZ2xlLCBpbmRleCwgcmVzZXQpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgbW9kZWwgPSByZWN0YW5nbGUuX21vZGVsO1xuXHRcdFx0dmFyIHZzY2FsZSA9IG1lLmdldFZhbHVlU2NhbGUoKTtcblx0XHRcdHZhciBiYXNlID0gdnNjYWxlLmdldEJhc2VQaXhlbCgpO1xuXHRcdFx0dmFyIGhvcml6b250YWwgPSB2c2NhbGUuaXNIb3Jpem9udGFsKCk7XG5cdFx0XHR2YXIgcnVsZXIgPSBtZS5fcnVsZXIgfHwgbWUuZ2V0UnVsZXIoKTtcblx0XHRcdHZhciB2cGl4ZWxzID0gbWUuY2FsY3VsYXRlQmFyVmFsdWVQaXhlbHMobWUuaW5kZXgsIGluZGV4KTtcblx0XHRcdHZhciBpcGl4ZWxzID0gbWUuY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMobWUuaW5kZXgsIGluZGV4LCBydWxlcik7XG5cblx0XHRcdG1vZGVsLmhvcml6b250YWwgPSBob3Jpem9udGFsO1xuXHRcdFx0bW9kZWwuYmFzZSA9IHJlc2V0ID8gYmFzZSA6IHZwaXhlbHMuYmFzZTtcblx0XHRcdG1vZGVsLnggPSBob3Jpem9udGFsID8gcmVzZXQgPyBiYXNlIDogdnBpeGVscy5oZWFkIDogaXBpeGVscy5jZW50ZXI7XG5cdFx0XHRtb2RlbC55ID0gaG9yaXpvbnRhbCA/IGlwaXhlbHMuY2VudGVyIDogcmVzZXQgPyBiYXNlIDogdnBpeGVscy5oZWFkO1xuXHRcdFx0bW9kZWwuaGVpZ2h0ID0gaG9yaXpvbnRhbCA/IGlwaXhlbHMuc2l6ZSA6IHVuZGVmaW5lZDtcblx0XHRcdG1vZGVsLndpZHRoID0gaG9yaXpvbnRhbCA/IHVuZGVmaW5lZCA6IGlwaXhlbHMuc2l6ZTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRnZXRWYWx1ZVNjYWxlSWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0TWV0YSgpLnlBeGlzSUQ7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Z2V0SW5kZXhTY2FsZUlkOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldE1ldGEoKS54QXhpc0lEO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGdldFZhbHVlU2NhbGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0U2NhbGVGb3JJZCh0aGlzLmdldFZhbHVlU2NhbGVJZCgpKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRnZXRJbmRleFNjYWxlOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldFNjYWxlRm9ySWQodGhpcy5nZXRJbmRleFNjYWxlSWQoKSk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybnMgdGhlIHN0YWNrcyBiYXNlZCBvbiBncm91cHMgYW5kIGJhciB2aXNpYmlsaXR5LlxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBbbGFzdF0gLSBUaGUgZGF0YXNldCBpbmRleFxuXHRcdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHN0YWNrIGxpc3Rcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdF9nZXRTdGFja3M6IGZ1bmN0aW9uKGxhc3QpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcblx0XHRcdHZhciBzY2FsZSA9IG1lLmdldEluZGV4U2NhbGUoKTtcblx0XHRcdHZhciBzdGFja2VkID0gc2NhbGUub3B0aW9ucy5zdGFja2VkO1xuXHRcdFx0dmFyIGlsZW4gPSBsYXN0ID09PSB1bmRlZmluZWQgPyBjaGFydC5kYXRhLmRhdGFzZXRzLmxlbmd0aCA6IGxhc3QgKyAxO1xuXHRcdFx0dmFyIHN0YWNrcyA9IFtdO1xuXHRcdFx0dmFyIGksIG1ldGE7XG5cblx0XHRcdGZvciAoaSA9IDA7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0bWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGkpO1xuXHRcdFx0XHRpZiAobWV0YS5iYXIgJiYgY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpKSAmJlxuXHRcdFx0XHRcdChzdGFja2VkID09PSBmYWxzZSB8fFxuXHRcdFx0XHRcdChzdGFja2VkID09PSB0cnVlICYmIHN0YWNrcy5pbmRleE9mKG1ldGEuc3RhY2spID09PSAtMSkgfHxcblx0XHRcdFx0XHQoc3RhY2tlZCA9PT0gdW5kZWZpbmVkICYmIChtZXRhLnN0YWNrID09PSB1bmRlZmluZWQgfHwgc3RhY2tzLmluZGV4T2YobWV0YS5zdGFjaykgPT09IC0xKSkpKSB7XG5cdFx0XHRcdFx0c3RhY2tzLnB1c2gobWV0YS5zdGFjayk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHN0YWNrcztcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogUmV0dXJucyB0aGUgZWZmZWN0aXZlIG51bWJlciBvZiBzdGFja3MgYmFzZWQgb24gZ3JvdXBzIGFuZCBiYXIgdmlzaWJpbGl0eS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGdldFN0YWNrQ291bnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldFN0YWNrcygpLmxlbmd0aDtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogUmV0dXJucyB0aGUgc3RhY2sgaW5kZXggZm9yIHRoZSBnaXZlbiBkYXRhc2V0IGJhc2VkIG9uIGdyb3VwcyBhbmQgYmFyIHZpc2liaWxpdHkuXG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9IFtkYXRhc2V0SW5kZXhdIC0gVGhlIGRhdGFzZXQgaW5kZXhcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW25hbWVdIC0gVGhlIHN0YWNrIG5hbWUgdG8gZmluZFxuXHRcdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBzdGFjayBpbmRleFxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Z2V0U3RhY2tJbmRleDogZnVuY3Rpb24oZGF0YXNldEluZGV4LCBuYW1lKSB7XG5cdFx0XHR2YXIgc3RhY2tzID0gdGhpcy5fZ2V0U3RhY2tzKGRhdGFzZXRJbmRleCk7XG5cdFx0XHR2YXIgaW5kZXggPSAobmFtZSAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0XHQ/IHN0YWNrcy5pbmRleE9mKG5hbWUpXG5cdFx0XHRcdDogLTE7IC8vIGluZGV4T2YgcmV0dXJucyAtMSBpZiBlbGVtZW50IGlzIG5vdCBwcmVzZW50XG5cblx0XHRcdHJldHVybiAoaW5kZXggPT09IC0xKVxuXHRcdFx0XHQ/IHN0YWNrcy5sZW5ndGggLSAxXG5cdFx0XHRcdDogaW5kZXg7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Z2V0UnVsZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBzY2FsZSA9IG1lLmdldEluZGV4U2NhbGUoKTtcblx0XHRcdHZhciBzdGFja0NvdW50ID0gbWUuZ2V0U3RhY2tDb3VudCgpO1xuXHRcdFx0dmFyIGRhdGFzZXRJbmRleCA9IG1lLmluZGV4O1xuXHRcdFx0dmFyIGlzSG9yaXpvbnRhbCA9IHNjYWxlLmlzSG9yaXpvbnRhbCgpO1xuXHRcdFx0dmFyIHN0YXJ0ID0gaXNIb3Jpem9udGFsID8gc2NhbGUubGVmdCA6IHNjYWxlLnRvcDtcblx0XHRcdHZhciBlbmQgPSBzdGFydCArIChpc0hvcml6b250YWwgPyBzY2FsZS53aWR0aCA6IHNjYWxlLmhlaWdodCk7XG5cdFx0XHR2YXIgcGl4ZWxzID0gW107XG5cdFx0XHR2YXIgaSwgaWxlbiwgbWluO1xuXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gbWUuZ2V0TWV0YSgpLmRhdGEubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdHBpeGVscy5wdXNoKHNjYWxlLmdldFBpeGVsRm9yVmFsdWUobnVsbCwgaSwgZGF0YXNldEluZGV4KSk7XG5cdFx0XHR9XG5cblx0XHRcdG1pbiA9IGhlbHBlcnMuaXNOdWxsT3JVbmRlZihzY2FsZS5vcHRpb25zLmJhclRoaWNrbmVzcylcblx0XHRcdFx0PyBjb21wdXRlTWluU2FtcGxlU2l6ZShzY2FsZSwgcGl4ZWxzKVxuXHRcdFx0XHQ6IC0xO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtaW46IG1pbixcblx0XHRcdFx0cGl4ZWxzOiBwaXhlbHMsXG5cdFx0XHRcdHN0YXJ0OiBzdGFydCxcblx0XHRcdFx0ZW5kOiBlbmQsXG5cdFx0XHRcdHN0YWNrQ291bnQ6IHN0YWNrQ291bnQsXG5cdFx0XHRcdHNjYWxlOiBzY2FsZVxuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogTm90ZTogcGl4ZWwgdmFsdWVzIGFyZSBub3QgY2xhbXBlZCB0byB0aGUgc2NhbGUgYXJlYS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGNhbGN1bGF0ZUJhclZhbHVlUGl4ZWxzOiBmdW5jdGlvbihkYXRhc2V0SW5kZXgsIGluZGV4KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHRcdHZhciBzY2FsZSA9IG1lLmdldFZhbHVlU2NhbGUoKTtcblx0XHRcdHZhciBkYXRhc2V0cyA9IGNoYXJ0LmRhdGEuZGF0YXNldHM7XG5cdFx0XHR2YXIgdmFsdWUgPSBzY2FsZS5nZXRSaWdodFZhbHVlKGRhdGFzZXRzW2RhdGFzZXRJbmRleF0uZGF0YVtpbmRleF0pO1xuXHRcdFx0dmFyIHN0YWNrZWQgPSBzY2FsZS5vcHRpb25zLnN0YWNrZWQ7XG5cdFx0XHR2YXIgc3RhY2sgPSBtZXRhLnN0YWNrO1xuXHRcdFx0dmFyIHN0YXJ0ID0gMDtcblx0XHRcdHZhciBpLCBpbWV0YSwgaXZhbHVlLCBiYXNlLCBoZWFkLCBzaXplO1xuXG5cdFx0XHRpZiAoc3RhY2tlZCB8fCAoc3RhY2tlZCA9PT0gdW5kZWZpbmVkICYmIHN0YWNrICE9PSB1bmRlZmluZWQpKSB7XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhc2V0SW5kZXg7ICsraSkge1xuXHRcdFx0XHRcdGltZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XG5cblx0XHRcdFx0XHRpZiAoaW1ldGEuYmFyICYmXG5cdFx0XHRcdFx0XHRpbWV0YS5zdGFjayA9PT0gc3RhY2sgJiZcblx0XHRcdFx0XHRcdGltZXRhLmNvbnRyb2xsZXIuZ2V0VmFsdWVTY2FsZUlkKCkgPT09IHNjYWxlLmlkICYmXG5cdFx0XHRcdFx0XHRjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpKSB7XG5cblx0XHRcdFx0XHRcdGl2YWx1ZSA9IHNjYWxlLmdldFJpZ2h0VmFsdWUoZGF0YXNldHNbaV0uZGF0YVtpbmRleF0pO1xuXHRcdFx0XHRcdFx0aWYgKCh2YWx1ZSA8IDAgJiYgaXZhbHVlIDwgMCkgfHwgKHZhbHVlID49IDAgJiYgaXZhbHVlID4gMCkpIHtcblx0XHRcdFx0XHRcdFx0c3RhcnQgKz0gaXZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRiYXNlID0gc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzdGFydCk7XG5cdFx0XHRoZWFkID0gc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzdGFydCArIHZhbHVlKTtcblx0XHRcdHNpemUgPSAoaGVhZCAtIGJhc2UpIC8gMjtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2l6ZTogc2l6ZSxcblx0XHRcdFx0YmFzZTogYmFzZSxcblx0XHRcdFx0aGVhZDogaGVhZCxcblx0XHRcdFx0Y2VudGVyOiBoZWFkICsgc2l6ZSAvIDJcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Y2FsY3VsYXRlQmFySW5kZXhQaXhlbHM6IGZ1bmN0aW9uKGRhdGFzZXRJbmRleCwgaW5kZXgsIHJ1bGVyKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG9wdGlvbnMgPSBydWxlci5zY2FsZS5vcHRpb25zO1xuXHRcdFx0dmFyIHJhbmdlID0gb3B0aW9ucy5iYXJUaGlja25lc3MgPT09ICdmbGV4J1xuXHRcdFx0XHQ/IGNvbXB1dGVGbGV4Q2F0ZWdvcnlUcmFpdHMoaW5kZXgsIHJ1bGVyLCBvcHRpb25zKVxuXHRcdFx0XHQ6IGNvbXB1dGVGaXRDYXRlZ29yeVRyYWl0cyhpbmRleCwgcnVsZXIsIG9wdGlvbnMpO1xuXG5cdFx0XHR2YXIgc3RhY2tJbmRleCA9IG1lLmdldFN0YWNrSW5kZXgoZGF0YXNldEluZGV4LCBtZS5nZXRNZXRhKCkuc3RhY2spO1xuXHRcdFx0dmFyIGNlbnRlciA9IHJhbmdlLnN0YXJ0ICsgKHJhbmdlLmNodW5rICogc3RhY2tJbmRleCkgKyAocmFuZ2UuY2h1bmsgLyAyKTtcblx0XHRcdHZhciBzaXplID0gTWF0aC5taW4oXG5cdFx0XHRcdGhlbHBlcnMudmFsdWVPckRlZmF1bHQob3B0aW9ucy5tYXhCYXJUaGlja25lc3MsIEluZmluaXR5KSxcblx0XHRcdFx0cmFuZ2UuY2h1bmsgKiByYW5nZS5yYXRpbyk7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGJhc2U6IGNlbnRlciAtIHNpemUgLyAyLFxuXHRcdFx0XHRoZWFkOiBjZW50ZXIgKyBzaXplIC8gMixcblx0XHRcdFx0Y2VudGVyOiBjZW50ZXIsXG5cdFx0XHRcdHNpemU6IHNpemVcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdGRyYXc6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdFx0dmFyIHNjYWxlID0gbWUuZ2V0VmFsdWVTY2FsZSgpO1xuXHRcdFx0dmFyIHJlY3RzID0gbWUuZ2V0TWV0YSgpLmRhdGE7XG5cdFx0XHR2YXIgZGF0YXNldCA9IG1lLmdldERhdGFzZXQoKTtcblx0XHRcdHZhciBpbGVuID0gcmVjdHMubGVuZ3RoO1xuXHRcdFx0dmFyIGkgPSAwO1xuXG5cdFx0XHRoZWxwZXJzLmNhbnZhcy5jbGlwQXJlYShjaGFydC5jdHgsIGNoYXJ0LmNoYXJ0QXJlYSk7XG5cblx0XHRcdGZvciAoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdGlmICghaXNOYU4oc2NhbGUuZ2V0UmlnaHRWYWx1ZShkYXRhc2V0LmRhdGFbaV0pKSkge1xuXHRcdFx0XHRcdHJlY3RzW2ldLmRyYXcoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRoZWxwZXJzLmNhbnZhcy51bmNsaXBBcmVhKGNoYXJ0LmN0eCk7XG5cdFx0fSxcblx0fSk7XG5cblx0Q2hhcnQuY29udHJvbGxlcnMuaG9yaXpvbnRhbEJhciA9IENoYXJ0LmNvbnRyb2xsZXJzLmJhci5leHRlbmQoe1xuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Z2V0VmFsdWVTY2FsZUlkOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldE1ldGEoKS54QXhpc0lEO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGdldEluZGV4U2NhbGVJZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRNZXRhKCkueUF4aXNJRDtcblx0XHR9XG5cdH0pO1xufTtcblxufSx7XCIyNlwiOjI2LFwiNDFcIjo0MSxcIjQ2XCI6NDZ9XSwxNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIGVsZW1lbnRzID0gcmVxdWlyZSg0MSk7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG5kZWZhdWx0cy5fc2V0KCdidWJibGUnLCB7XG5cdGhvdmVyOiB7XG5cdFx0bW9kZTogJ3NpbmdsZSdcblx0fSxcblxuXHRzY2FsZXM6IHtcblx0XHR4QXhlczogW3tcblx0XHRcdHR5cGU6ICdsaW5lYXInLCAvLyBidWJibGUgc2hvdWxkIHByb2JhYmx5IHVzZSBhIGxpbmVhciBzY2FsZSBieSBkZWZhdWx0XG5cdFx0XHRwb3NpdGlvbjogJ2JvdHRvbScsXG5cdFx0XHRpZDogJ3gtYXhpcy0wJyAvLyBuZWVkIGFuIElEIHNvIGRhdGFzZXRzIGNhbiByZWZlcmVuY2UgdGhlIHNjYWxlXG5cdFx0fV0sXG5cdFx0eUF4ZXM6IFt7XG5cdFx0XHR0eXBlOiAnbGluZWFyJyxcblx0XHRcdHBvc2l0aW9uOiAnbGVmdCcsXG5cdFx0XHRpZDogJ3ktYXhpcy0wJ1xuXHRcdH1dXG5cdH0sXG5cblx0dG9vbHRpcHM6IHtcblx0XHRjYWxsYmFja3M6IHtcblx0XHRcdHRpdGxlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0Ly8gVGl0bGUgZG9lc24ndCBtYWtlIHNlbnNlIGZvciBzY2F0dGVyIHNpbmNlIHdlIGZvcm1hdCB0aGUgZGF0YSBhcyBhIHBvaW50XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdH0sXG5cdFx0XHRsYWJlbDogZnVuY3Rpb24oaXRlbSwgZGF0YSkge1xuXHRcdFx0XHR2YXIgZGF0YXNldExhYmVsID0gZGF0YS5kYXRhc2V0c1tpdGVtLmRhdGFzZXRJbmRleF0ubGFiZWwgfHwgJyc7XG5cdFx0XHRcdHZhciBkYXRhUG9pbnQgPSBkYXRhLmRhdGFzZXRzW2l0ZW0uZGF0YXNldEluZGV4XS5kYXRhW2l0ZW0uaW5kZXhdO1xuXHRcdFx0XHRyZXR1cm4gZGF0YXNldExhYmVsICsgJzogKCcgKyBpdGVtLnhMYWJlbCArICcsICcgKyBpdGVtLnlMYWJlbCArICcsICcgKyBkYXRhUG9pbnQuciArICcpJztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHRDaGFydC5jb250cm9sbGVycy5idWJibGUgPSBDaGFydC5EYXRhc2V0Q29udHJvbGxlci5leHRlbmQoe1xuXHRcdC8qKlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHRkYXRhRWxlbWVudFR5cGU6IGVsZW1lbnRzLlBvaW50LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHVwZGF0ZTogZnVuY3Rpb24ocmVzZXQpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHRcdHZhciBwb2ludHMgPSBtZXRhLmRhdGE7XG5cblx0XHRcdC8vIFVwZGF0ZSBQb2ludHNcblx0XHRcdGhlbHBlcnMuZWFjaChwb2ludHMsIGZ1bmN0aW9uKHBvaW50LCBpbmRleCkge1xuXHRcdFx0XHRtZS51cGRhdGVFbGVtZW50KHBvaW50LCBpbmRleCwgcmVzZXQpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR1cGRhdGVFbGVtZW50OiBmdW5jdGlvbihwb2ludCwgaW5kZXgsIHJlc2V0KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XG5cdFx0XHR2YXIgY3VzdG9tID0gcG9pbnQuY3VzdG9tIHx8IHt9O1xuXHRcdFx0dmFyIHhTY2FsZSA9IG1lLmdldFNjYWxlRm9ySWQobWV0YS54QXhpc0lEKTtcblx0XHRcdHZhciB5U2NhbGUgPSBtZS5nZXRTY2FsZUZvcklkKG1ldGEueUF4aXNJRCk7XG5cdFx0XHR2YXIgb3B0aW9ucyA9IG1lLl9yZXNvbHZlRWxlbWVudE9wdGlvbnMocG9pbnQsIGluZGV4KTtcblx0XHRcdHZhciBkYXRhID0gbWUuZ2V0RGF0YXNldCgpLmRhdGFbaW5kZXhdO1xuXHRcdFx0dmFyIGRzSW5kZXggPSBtZS5pbmRleDtcblxuXHRcdFx0dmFyIHggPSByZXNldCA/IHhTY2FsZS5nZXRQaXhlbEZvckRlY2ltYWwoMC41KSA6IHhTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiBOYU4sIGluZGV4LCBkc0luZGV4KTtcblx0XHRcdHZhciB5ID0gcmVzZXQgPyB5U2NhbGUuZ2V0QmFzZVBpeGVsKCkgOiB5U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShkYXRhLCBpbmRleCwgZHNJbmRleCk7XG5cblx0XHRcdHBvaW50Ll94U2NhbGUgPSB4U2NhbGU7XG5cdFx0XHRwb2ludC5feVNjYWxlID0geVNjYWxlO1xuXHRcdFx0cG9pbnQuX29wdGlvbnMgPSBvcHRpb25zO1xuXHRcdFx0cG9pbnQuX2RhdGFzZXRJbmRleCA9IGRzSW5kZXg7XG5cdFx0XHRwb2ludC5faW5kZXggPSBpbmRleDtcblx0XHRcdHBvaW50Ll9tb2RlbCA9IHtcblx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcixcblx0XHRcdFx0Ym9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG5cdFx0XHRcdGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuXHRcdFx0XHRoaXRSYWRpdXM6IG9wdGlvbnMuaGl0UmFkaXVzLFxuXHRcdFx0XHRwb2ludFN0eWxlOiBvcHRpb25zLnBvaW50U3R5bGUsXG5cdFx0XHRcdHJvdGF0aW9uOiBvcHRpb25zLnJvdGF0aW9uLFxuXHRcdFx0XHRyYWRpdXM6IHJlc2V0ID8gMCA6IG9wdGlvbnMucmFkaXVzLFxuXHRcdFx0XHRza2lwOiBjdXN0b20uc2tpcCB8fCBpc05hTih4KSB8fCBpc05hTih5KSxcblx0XHRcdFx0eDogeCxcblx0XHRcdFx0eTogeSxcblx0XHRcdH07XG5cblx0XHRcdHBvaW50LnBpdm90KCk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHRzZXRIb3ZlclN0eWxlOiBmdW5jdGlvbihwb2ludCkge1xuXHRcdFx0dmFyIG1vZGVsID0gcG9pbnQuX21vZGVsO1xuXHRcdFx0dmFyIG9wdGlvbnMgPSBwb2ludC5fb3B0aW9ucztcblx0XHRcdHBvaW50LiRwcmV2aW91c1N0eWxlID0ge1xuXHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcblx0XHRcdFx0Ym9yZGVyQ29sb3I6IG1vZGVsLmJvcmRlckNvbG9yLFxuXHRcdFx0XHRib3JkZXJXaWR0aDogbW9kZWwuYm9yZGVyV2lkdGgsXG5cdFx0XHRcdHJhZGl1czogbW9kZWwucmFkaXVzXG5cdFx0XHR9O1xuXHRcdFx0bW9kZWwuYmFja2dyb3VuZENvbG9yID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdChvcHRpb25zLmhvdmVyQmFja2dyb3VuZENvbG9yLCBoZWxwZXJzLmdldEhvdmVyQ29sb3Iob3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IpKTtcblx0XHRcdG1vZGVsLmJvcmRlckNvbG9yID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdChvcHRpb25zLmhvdmVyQm9yZGVyQ29sb3IsIGhlbHBlcnMuZ2V0SG92ZXJDb2xvcihvcHRpb25zLmJvcmRlckNvbG9yKSk7XG5cdFx0XHRtb2RlbC5ib3JkZXJXaWR0aCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQob3B0aW9ucy5ob3ZlckJvcmRlcldpZHRoLCBvcHRpb25zLmJvcmRlcldpZHRoKTtcblx0XHRcdG1vZGVsLnJhZGl1cyA9IG9wdGlvbnMucmFkaXVzICsgb3B0aW9ucy5ob3ZlclJhZGl1cztcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRfcmVzb2x2ZUVsZW1lbnRPcHRpb25zOiBmdW5jdGlvbihwb2ludCwgaW5kZXgpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcblx0XHRcdHZhciBkYXRhc2V0cyA9IGNoYXJ0LmRhdGEuZGF0YXNldHM7XG5cdFx0XHR2YXIgZGF0YXNldCA9IGRhdGFzZXRzW21lLmluZGV4XTtcblx0XHRcdHZhciBjdXN0b20gPSBwb2ludC5jdXN0b20gfHwge307XG5cdFx0XHR2YXIgb3B0aW9ucyA9IGNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQ7XG5cdFx0XHR2YXIgcmVzb2x2ZSA9IGhlbHBlcnMub3B0aW9ucy5yZXNvbHZlO1xuXHRcdFx0dmFyIGRhdGEgPSBkYXRhc2V0LmRhdGFbaW5kZXhdO1xuXHRcdFx0dmFyIHZhbHVlcyA9IHt9O1xuXHRcdFx0dmFyIGksIGlsZW4sIGtleTtcblxuXHRcdFx0Ly8gU2NyaXB0YWJsZSBvcHRpb25zXG5cdFx0XHR2YXIgY29udGV4dCA9IHtcblx0XHRcdFx0Y2hhcnQ6IGNoYXJ0LFxuXHRcdFx0XHRkYXRhSW5kZXg6IGluZGV4LFxuXHRcdFx0XHRkYXRhc2V0OiBkYXRhc2V0LFxuXHRcdFx0XHRkYXRhc2V0SW5kZXg6IG1lLmluZGV4XG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIga2V5cyA9IFtcblx0XHRcdFx0J2JhY2tncm91bmRDb2xvcicsXG5cdFx0XHRcdCdib3JkZXJDb2xvcicsXG5cdFx0XHRcdCdib3JkZXJXaWR0aCcsXG5cdFx0XHRcdCdob3ZlckJhY2tncm91bmRDb2xvcicsXG5cdFx0XHRcdCdob3ZlckJvcmRlckNvbG9yJyxcblx0XHRcdFx0J2hvdmVyQm9yZGVyV2lkdGgnLFxuXHRcdFx0XHQnaG92ZXJSYWRpdXMnLFxuXHRcdFx0XHQnaGl0UmFkaXVzJyxcblx0XHRcdFx0J3BvaW50U3R5bGUnLFxuXHRcdFx0XHQncm90YXRpb24nXG5cdFx0XHRdO1xuXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0ga2V5cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0a2V5ID0ga2V5c1tpXTtcblx0XHRcdFx0dmFsdWVzW2tleV0gPSByZXNvbHZlKFtcblx0XHRcdFx0XHRjdXN0b21ba2V5XSxcblx0XHRcdFx0XHRkYXRhc2V0W2tleV0sXG5cdFx0XHRcdFx0b3B0aW9uc1trZXldXG5cdFx0XHRcdF0sIGNvbnRleHQsIGluZGV4KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ3VzdG9tIHJhZGl1cyByZXNvbHV0aW9uXG5cdFx0XHR2YWx1ZXMucmFkaXVzID0gcmVzb2x2ZShbXG5cdFx0XHRcdGN1c3RvbS5yYWRpdXMsXG5cdFx0XHRcdGRhdGEgPyBkYXRhLnIgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGRhdGFzZXQucmFkaXVzLFxuXHRcdFx0XHRvcHRpb25zLnJhZGl1c1xuXHRcdFx0XSwgY29udGV4dCwgaW5kZXgpO1xuXHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHR9XG5cdH0pO1xufTtcblxufSx7XCIyNlwiOjI2LFwiNDFcIjo0MSxcIjQ2XCI6NDZ9XSwxNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIGVsZW1lbnRzID0gcmVxdWlyZSg0MSk7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG5kZWZhdWx0cy5fc2V0KCdkb3VnaG51dCcsIHtcblx0YW5pbWF0aW9uOiB7XG5cdFx0Ly8gQm9vbGVhbiAtIFdoZXRoZXIgd2UgYW5pbWF0ZSB0aGUgcm90YXRpb24gb2YgdGhlIERvdWdobnV0XG5cdFx0YW5pbWF0ZVJvdGF0ZTogdHJ1ZSxcblx0XHQvLyBCb29sZWFuIC0gV2hldGhlciB3ZSBhbmltYXRlIHNjYWxpbmcgdGhlIERvdWdobnV0IGZyb20gdGhlIGNlbnRyZVxuXHRcdGFuaW1hdGVTY2FsZTogZmFsc2Vcblx0fSxcblx0aG92ZXI6IHtcblx0XHRtb2RlOiAnc2luZ2xlJ1xuXHR9LFxuXHRsZWdlbmRDYWxsYmFjazogZnVuY3Rpb24oY2hhcnQpIHtcblx0XHR2YXIgdGV4dCA9IFtdO1xuXHRcdHRleHQucHVzaCgnPHVsIGNsYXNzPVwiJyArIGNoYXJ0LmlkICsgJy1sZWdlbmRcIj4nKTtcblxuXHRcdHZhciBkYXRhID0gY2hhcnQuZGF0YTtcblx0XHR2YXIgZGF0YXNldHMgPSBkYXRhLmRhdGFzZXRzO1xuXHRcdHZhciBsYWJlbHMgPSBkYXRhLmxhYmVscztcblxuXHRcdGlmIChkYXRhc2V0cy5sZW5ndGgpIHtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YXNldHNbMF0uZGF0YS5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHR0ZXh0LnB1c2goJzxsaT48c3BhbiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6JyArIGRhdGFzZXRzWzBdLmJhY2tncm91bmRDb2xvcltpXSArICdcIj48L3NwYW4+Jyk7XG5cdFx0XHRcdGlmIChsYWJlbHNbaV0pIHtcblx0XHRcdFx0XHR0ZXh0LnB1c2gobGFiZWxzW2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0ZXh0LnB1c2goJzwvbGk+Jyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGV4dC5wdXNoKCc8L3VsPicpO1xuXHRcdHJldHVybiB0ZXh0LmpvaW4oJycpO1xuXHR9LFxuXHRsZWdlbmQ6IHtcblx0XHRsYWJlbHM6IHtcblx0XHRcdGdlbmVyYXRlTGFiZWxzOiBmdW5jdGlvbihjaGFydCkge1xuXHRcdFx0XHR2YXIgZGF0YSA9IGNoYXJ0LmRhdGE7XG5cdFx0XHRcdGlmIChkYXRhLmxhYmVscy5sZW5ndGggJiYgZGF0YS5kYXRhc2V0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YS5sYWJlbHMubWFwKGZ1bmN0aW9uKGxhYmVsLCBpKSB7XG5cdFx0XHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKDApO1xuXHRcdFx0XHRcdFx0dmFyIGRzID0gZGF0YS5kYXRhc2V0c1swXTtcblx0XHRcdFx0XHRcdHZhciBhcmMgPSBtZXRhLmRhdGFbaV07XG5cdFx0XHRcdFx0XHR2YXIgY3VzdG9tID0gYXJjICYmIGFyYy5jdXN0b20gfHwge307XG5cdFx0XHRcdFx0XHR2YXIgdmFsdWVBdEluZGV4T3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQ7XG5cdFx0XHRcdFx0XHR2YXIgYXJjT3B0cyA9IGNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMuYXJjO1xuXHRcdFx0XHRcdFx0dmFyIGZpbGwgPSBjdXN0b20uYmFja2dyb3VuZENvbG9yID8gY3VzdG9tLmJhY2tncm91bmRDb2xvciA6IHZhbHVlQXRJbmRleE9yRGVmYXVsdChkcy5iYWNrZ3JvdW5kQ29sb3IsIGksIGFyY09wdHMuYmFja2dyb3VuZENvbG9yKTtcblx0XHRcdFx0XHRcdHZhciBzdHJva2UgPSBjdXN0b20uYm9yZGVyQ29sb3IgPyBjdXN0b20uYm9yZGVyQ29sb3IgOiB2YWx1ZUF0SW5kZXhPckRlZmF1bHQoZHMuYm9yZGVyQ29sb3IsIGksIGFyY09wdHMuYm9yZGVyQ29sb3IpO1xuXHRcdFx0XHRcdFx0dmFyIGJ3ID0gY3VzdG9tLmJvcmRlcldpZHRoID8gY3VzdG9tLmJvcmRlcldpZHRoIDogdmFsdWVBdEluZGV4T3JEZWZhdWx0KGRzLmJvcmRlcldpZHRoLCBpLCBhcmNPcHRzLmJvcmRlcldpZHRoKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0dGV4dDogbGFiZWwsXG5cdFx0XHRcdFx0XHRcdGZpbGxTdHlsZTogZmlsbCxcblx0XHRcdFx0XHRcdFx0c3Ryb2tlU3R5bGU6IHN0cm9rZSxcblx0XHRcdFx0XHRcdFx0bGluZVdpZHRoOiBidyxcblx0XHRcdFx0XHRcdFx0aGlkZGVuOiBpc05hTihkcy5kYXRhW2ldKSB8fCBtZXRhLmRhdGFbaV0uaGlkZGVuLFxuXG5cdFx0XHRcdFx0XHRcdC8vIEV4dHJhIGRhdGEgdXNlZCBmb3IgdG9nZ2xpbmcgdGhlIGNvcnJlY3QgaXRlbVxuXHRcdFx0XHRcdFx0XHRpbmRleDogaVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdG9uQ2xpY2s6IGZ1bmN0aW9uKGUsIGxlZ2VuZEl0ZW0pIHtcblx0XHRcdHZhciBpbmRleCA9IGxlZ2VuZEl0ZW0uaW5kZXg7XG5cdFx0XHR2YXIgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuXHRcdFx0dmFyIGksIGlsZW4sIG1ldGE7XG5cblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSAoY2hhcnQuZGF0YS5kYXRhc2V0cyB8fCBbXSkubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpKTtcblx0XHRcdFx0Ly8gdG9nZ2xlIHZpc2liaWxpdHkgb2YgaW5kZXggaWYgZXhpc3RzXG5cdFx0XHRcdGlmIChtZXRhLmRhdGFbaW5kZXhdKSB7XG5cdFx0XHRcdFx0bWV0YS5kYXRhW2luZGV4XS5oaWRkZW4gPSAhbWV0YS5kYXRhW2luZGV4XS5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y2hhcnQudXBkYXRlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIFRoZSBwZXJjZW50YWdlIG9mIHRoZSBjaGFydCB0aGF0IHdlIGN1dCBvdXQgb2YgdGhlIG1pZGRsZS5cblx0Y3V0b3V0UGVyY2VudGFnZTogNTAsXG5cblx0Ly8gVGhlIHJvdGF0aW9uIG9mIHRoZSBjaGFydCwgd2hlcmUgdGhlIGZpcnN0IGRhdGEgYXJjIGJlZ2lucy5cblx0cm90YXRpb246IE1hdGguUEkgKiAtMC41LFxuXG5cdC8vIFRoZSB0b3RhbCBjaXJjdW1mZXJlbmNlIG9mIHRoZSBjaGFydC5cblx0Y2lyY3VtZmVyZW5jZTogTWF0aC5QSSAqIDIuMCxcblxuXHQvLyBOZWVkIHRvIG92ZXJyaWRlIHRoZXNlIHRvIGdpdmUgYSBuaWNlIGRlZmF1bHRcblx0dG9vbHRpcHM6IHtcblx0XHRjYWxsYmFja3M6IHtcblx0XHRcdHRpdGxlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fSxcblx0XHRcdGxhYmVsOiBmdW5jdGlvbih0b29sdGlwSXRlbSwgZGF0YSkge1xuXHRcdFx0XHR2YXIgZGF0YUxhYmVsID0gZGF0YS5sYWJlbHNbdG9vbHRpcEl0ZW0uaW5kZXhdO1xuXHRcdFx0XHR2YXIgdmFsdWUgPSAnOiAnICsgZGF0YS5kYXRhc2V0c1t0b29sdGlwSXRlbS5kYXRhc2V0SW5kZXhdLmRhdGFbdG9vbHRpcEl0ZW0uaW5kZXhdO1xuXG5cdFx0XHRcdGlmIChoZWxwZXJzLmlzQXJyYXkoZGF0YUxhYmVsKSkge1xuXHRcdFx0XHRcdC8vIHNob3cgdmFsdWUgb24gZmlyc3QgbGluZSBvZiBtdWx0aWxpbmUgbGFiZWxcblx0XHRcdFx0XHQvLyBuZWVkIHRvIGNsb25lIGJlY2F1c2Ugd2UgYXJlIGNoYW5naW5nIHRoZSB2YWx1ZVxuXHRcdFx0XHRcdGRhdGFMYWJlbCA9IGRhdGFMYWJlbC5zbGljZSgpO1xuXHRcdFx0XHRcdGRhdGFMYWJlbFswXSArPSB2YWx1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhTGFiZWwgKz0gdmFsdWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZGF0YUxhYmVsO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSk7XG5cbmRlZmF1bHRzLl9zZXQoJ3BpZScsIGhlbHBlcnMuY2xvbmUoZGVmYXVsdHMuZG91Z2hudXQpKTtcbmRlZmF1bHRzLl9zZXQoJ3BpZScsIHtcblx0Y3V0b3V0UGVyY2VudGFnZTogMFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHRDaGFydC5jb250cm9sbGVycy5kb3VnaG51dCA9IENoYXJ0LmNvbnRyb2xsZXJzLnBpZSA9IENoYXJ0LkRhdGFzZXRDb250cm9sbGVyLmV4dGVuZCh7XG5cblx0XHRkYXRhRWxlbWVudFR5cGU6IGVsZW1lbnRzLkFyYyxcblxuXHRcdGxpbmtTY2FsZXM6IGhlbHBlcnMubm9vcCxcblxuXHRcdC8vIEdldCBpbmRleCBvZiB0aGUgZGF0YXNldCBpbiByZWxhdGlvbiB0byB0aGUgdmlzaWJsZSBkYXRhc2V0cy4gVGhpcyBhbGxvd3MgZGV0ZXJtaW5pbmcgdGhlIGlubmVyIGFuZCBvdXRlciByYWRpdXMgY29ycmVjdGx5XG5cdFx0Z2V0UmluZ0luZGV4OiBmdW5jdGlvbihkYXRhc2V0SW5kZXgpIHtcblx0XHRcdHZhciByaW5nSW5kZXggPSAwO1xuXG5cdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFzZXRJbmRleDsgKytqKSB7XG5cdFx0XHRcdGlmICh0aGlzLmNoYXJ0LmlzRGF0YXNldFZpc2libGUoaikpIHtcblx0XHRcdFx0XHQrK3JpbmdJbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmluZ0luZGV4O1xuXHRcdH0sXG5cblx0XHR1cGRhdGU6IGZ1bmN0aW9uKHJlc2V0KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0XHR2YXIgY2hhcnRBcmVhID0gY2hhcnQuY2hhcnRBcmVhO1xuXHRcdFx0dmFyIG9wdHMgPSBjaGFydC5vcHRpb25zO1xuXHRcdFx0dmFyIGFyY09wdHMgPSBvcHRzLmVsZW1lbnRzLmFyYztcblx0XHRcdHZhciBhdmFpbGFibGVXaWR0aCA9IGNoYXJ0QXJlYS5yaWdodCAtIGNoYXJ0QXJlYS5sZWZ0IC0gYXJjT3B0cy5ib3JkZXJXaWR0aDtcblx0XHRcdHZhciBhdmFpbGFibGVIZWlnaHQgPSBjaGFydEFyZWEuYm90dG9tIC0gY2hhcnRBcmVhLnRvcCAtIGFyY09wdHMuYm9yZGVyV2lkdGg7XG5cdFx0XHR2YXIgbWluU2l6ZSA9IE1hdGgubWluKGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQpO1xuXHRcdFx0dmFyIG9mZnNldCA9IHt4OiAwLCB5OiAwfTtcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdFx0dmFyIGN1dG91dFBlcmNlbnRhZ2UgPSBvcHRzLmN1dG91dFBlcmNlbnRhZ2U7XG5cdFx0XHR2YXIgY2lyY3VtZmVyZW5jZSA9IG9wdHMuY2lyY3VtZmVyZW5jZTtcblxuXHRcdFx0Ly8gSWYgdGhlIGNoYXJ0J3MgY2lyY3VtZmVyZW5jZSBpc24ndCBhIGZ1bGwgY2lyY2xlLCBjYWxjdWxhdGUgbWluU2l6ZSBhcyBhIHJhdGlvIG9mIHRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIGFyY1xuXHRcdFx0aWYgKGNpcmN1bWZlcmVuY2UgPCBNYXRoLlBJICogMi4wKSB7XG5cdFx0XHRcdHZhciBzdGFydEFuZ2xlID0gb3B0cy5yb3RhdGlvbiAlIChNYXRoLlBJICogMi4wKTtcblx0XHRcdFx0c3RhcnRBbmdsZSArPSBNYXRoLlBJICogMi4wICogKHN0YXJ0QW5nbGUgPj0gTWF0aC5QSSA/IC0xIDogc3RhcnRBbmdsZSA8IC1NYXRoLlBJID8gMSA6IDApO1xuXHRcdFx0XHR2YXIgZW5kQW5nbGUgPSBzdGFydEFuZ2xlICsgY2lyY3VtZmVyZW5jZTtcblx0XHRcdFx0dmFyIHN0YXJ0ID0ge3g6IE1hdGguY29zKHN0YXJ0QW5nbGUpLCB5OiBNYXRoLnNpbihzdGFydEFuZ2xlKX07XG5cdFx0XHRcdHZhciBlbmQgPSB7eDogTWF0aC5jb3MoZW5kQW5nbGUpLCB5OiBNYXRoLnNpbihlbmRBbmdsZSl9O1xuXHRcdFx0XHR2YXIgY29udGFpbnMwID0gKHN0YXJ0QW5nbGUgPD0gMCAmJiBlbmRBbmdsZSA+PSAwKSB8fCAoc3RhcnRBbmdsZSA8PSBNYXRoLlBJICogMi4wICYmIE1hdGguUEkgKiAyLjAgPD0gZW5kQW5nbGUpO1xuXHRcdFx0XHR2YXIgY29udGFpbnM5MCA9IChzdGFydEFuZ2xlIDw9IE1hdGguUEkgKiAwLjUgJiYgTWF0aC5QSSAqIDAuNSA8PSBlbmRBbmdsZSkgfHwgKHN0YXJ0QW5nbGUgPD0gTWF0aC5QSSAqIDIuNSAmJiBNYXRoLlBJICogMi41IDw9IGVuZEFuZ2xlKTtcblx0XHRcdFx0dmFyIGNvbnRhaW5zMTgwID0gKHN0YXJ0QW5nbGUgPD0gLU1hdGguUEkgJiYgLU1hdGguUEkgPD0gZW5kQW5nbGUpIHx8IChzdGFydEFuZ2xlIDw9IE1hdGguUEkgJiYgTWF0aC5QSSA8PSBlbmRBbmdsZSk7XG5cdFx0XHRcdHZhciBjb250YWluczI3MCA9IChzdGFydEFuZ2xlIDw9IC1NYXRoLlBJICogMC41ICYmIC1NYXRoLlBJICogMC41IDw9IGVuZEFuZ2xlKSB8fCAoc3RhcnRBbmdsZSA8PSBNYXRoLlBJICogMS41ICYmIE1hdGguUEkgKiAxLjUgPD0gZW5kQW5nbGUpO1xuXHRcdFx0XHR2YXIgY3V0b3V0ID0gY3V0b3V0UGVyY2VudGFnZSAvIDEwMC4wO1xuXHRcdFx0XHR2YXIgbWluID0ge3g6IGNvbnRhaW5zMTgwID8gLTEgOiBNYXRoLm1pbihzdGFydC54ICogKHN0YXJ0LnggPCAwID8gMSA6IGN1dG91dCksIGVuZC54ICogKGVuZC54IDwgMCA/IDEgOiBjdXRvdXQpKSwgeTogY29udGFpbnMyNzAgPyAtMSA6IE1hdGgubWluKHN0YXJ0LnkgKiAoc3RhcnQueSA8IDAgPyAxIDogY3V0b3V0KSwgZW5kLnkgKiAoZW5kLnkgPCAwID8gMSA6IGN1dG91dCkpfTtcblx0XHRcdFx0dmFyIG1heCA9IHt4OiBjb250YWluczAgPyAxIDogTWF0aC5tYXgoc3RhcnQueCAqIChzdGFydC54ID4gMCA/IDEgOiBjdXRvdXQpLCBlbmQueCAqIChlbmQueCA+IDAgPyAxIDogY3V0b3V0KSksIHk6IGNvbnRhaW5zOTAgPyAxIDogTWF0aC5tYXgoc3RhcnQueSAqIChzdGFydC55ID4gMCA/IDEgOiBjdXRvdXQpLCBlbmQueSAqIChlbmQueSA+IDAgPyAxIDogY3V0b3V0KSl9O1xuXHRcdFx0XHR2YXIgc2l6ZSA9IHt3aWR0aDogKG1heC54IC0gbWluLngpICogMC41LCBoZWlnaHQ6IChtYXgueSAtIG1pbi55KSAqIDAuNX07XG5cdFx0XHRcdG1pblNpemUgPSBNYXRoLm1pbihhdmFpbGFibGVXaWR0aCAvIHNpemUud2lkdGgsIGF2YWlsYWJsZUhlaWdodCAvIHNpemUuaGVpZ2h0KTtcblx0XHRcdFx0b2Zmc2V0ID0ge3g6IChtYXgueCArIG1pbi54KSAqIC0wLjUsIHk6IChtYXgueSArIG1pbi55KSAqIC0wLjV9O1xuXHRcdFx0fVxuXG5cdFx0XHRjaGFydC5ib3JkZXJXaWR0aCA9IG1lLmdldE1heEJvcmRlcldpZHRoKG1ldGEuZGF0YSk7XG5cdFx0XHRjaGFydC5vdXRlclJhZGl1cyA9IE1hdGgubWF4KChtaW5TaXplIC0gY2hhcnQuYm9yZGVyV2lkdGgpIC8gMiwgMCk7XG5cdFx0XHRjaGFydC5pbm5lclJhZGl1cyA9IE1hdGgubWF4KGN1dG91dFBlcmNlbnRhZ2UgPyAoY2hhcnQub3V0ZXJSYWRpdXMgLyAxMDApICogKGN1dG91dFBlcmNlbnRhZ2UpIDogMCwgMCk7XG5cdFx0XHRjaGFydC5yYWRpdXNMZW5ndGggPSAoY2hhcnQub3V0ZXJSYWRpdXMgLSBjaGFydC5pbm5lclJhZGl1cykgLyBjaGFydC5nZXRWaXNpYmxlRGF0YXNldENvdW50KCk7XG5cdFx0XHRjaGFydC5vZmZzZXRYID0gb2Zmc2V0LnggKiBjaGFydC5vdXRlclJhZGl1cztcblx0XHRcdGNoYXJ0Lm9mZnNldFkgPSBvZmZzZXQueSAqIGNoYXJ0Lm91dGVyUmFkaXVzO1xuXG5cdFx0XHRtZXRhLnRvdGFsID0gbWUuY2FsY3VsYXRlVG90YWwoKTtcblxuXHRcdFx0bWUub3V0ZXJSYWRpdXMgPSBjaGFydC5vdXRlclJhZGl1cyAtIChjaGFydC5yYWRpdXNMZW5ndGggKiBtZS5nZXRSaW5nSW5kZXgobWUuaW5kZXgpKTtcblx0XHRcdG1lLmlubmVyUmFkaXVzID0gTWF0aC5tYXgobWUub3V0ZXJSYWRpdXMgLSBjaGFydC5yYWRpdXNMZW5ndGgsIDApO1xuXG5cdFx0XHRoZWxwZXJzLmVhY2gobWV0YS5kYXRhLCBmdW5jdGlvbihhcmMsIGluZGV4KSB7XG5cdFx0XHRcdG1lLnVwZGF0ZUVsZW1lbnQoYXJjLCBpbmRleCwgcmVzZXQpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdHVwZGF0ZUVsZW1lbnQ6IGZ1bmN0aW9uKGFyYywgaW5kZXgsIHJlc2V0KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0XHR2YXIgY2hhcnRBcmVhID0gY2hhcnQuY2hhcnRBcmVhO1xuXHRcdFx0dmFyIG9wdHMgPSBjaGFydC5vcHRpb25zO1xuXHRcdFx0dmFyIGFuaW1hdGlvbk9wdHMgPSBvcHRzLmFuaW1hdGlvbjtcblx0XHRcdHZhciBjZW50ZXJYID0gKGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLnJpZ2h0KSAvIDI7XG5cdFx0XHR2YXIgY2VudGVyWSA9IChjaGFydEFyZWEudG9wICsgY2hhcnRBcmVhLmJvdHRvbSkgLyAyO1xuXHRcdFx0dmFyIHN0YXJ0QW5nbGUgPSBvcHRzLnJvdGF0aW9uOyAvLyBub24gcmVzZXQgY2FzZSBoYW5kbGVkIGxhdGVyXG5cdFx0XHR2YXIgZW5kQW5nbGUgPSBvcHRzLnJvdGF0aW9uOyAvLyBub24gcmVzZXQgY2FzZSBoYW5kbGVkIGxhdGVyXG5cdFx0XHR2YXIgZGF0YXNldCA9IG1lLmdldERhdGFzZXQoKTtcblx0XHRcdHZhciBjaXJjdW1mZXJlbmNlID0gcmVzZXQgJiYgYW5pbWF0aW9uT3B0cy5hbmltYXRlUm90YXRlID8gMCA6IGFyYy5oaWRkZW4gPyAwIDogbWUuY2FsY3VsYXRlQ2lyY3VtZmVyZW5jZShkYXRhc2V0LmRhdGFbaW5kZXhdKSAqIChvcHRzLmNpcmN1bWZlcmVuY2UgLyAoMi4wICogTWF0aC5QSSkpO1xuXHRcdFx0dmFyIGlubmVyUmFkaXVzID0gcmVzZXQgJiYgYW5pbWF0aW9uT3B0cy5hbmltYXRlU2NhbGUgPyAwIDogbWUuaW5uZXJSYWRpdXM7XG5cdFx0XHR2YXIgb3V0ZXJSYWRpdXMgPSByZXNldCAmJiBhbmltYXRpb25PcHRzLmFuaW1hdGVTY2FsZSA/IDAgOiBtZS5vdXRlclJhZGl1cztcblx0XHRcdHZhciB2YWx1ZUF0SW5kZXhPckRlZmF1bHQgPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdDtcblxuXHRcdFx0aGVscGVycy5leHRlbmQoYXJjLCB7XG5cdFx0XHRcdC8vIFV0aWxpdHlcblx0XHRcdFx0X2RhdGFzZXRJbmRleDogbWUuaW5kZXgsXG5cdFx0XHRcdF9pbmRleDogaW5kZXgsXG5cblx0XHRcdFx0Ly8gRGVzaXJlZCB2aWV3IHByb3BlcnRpZXNcblx0XHRcdFx0X21vZGVsOiB7XG5cdFx0XHRcdFx0eDogY2VudGVyWCArIGNoYXJ0Lm9mZnNldFgsXG5cdFx0XHRcdFx0eTogY2VudGVyWSArIGNoYXJ0Lm9mZnNldFksXG5cdFx0XHRcdFx0c3RhcnRBbmdsZTogc3RhcnRBbmdsZSxcblx0XHRcdFx0XHRlbmRBbmdsZTogZW5kQW5nbGUsXG5cdFx0XHRcdFx0Y2lyY3VtZmVyZW5jZTogY2lyY3VtZmVyZW5jZSxcblx0XHRcdFx0XHRvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsXG5cdFx0XHRcdFx0aW5uZXJSYWRpdXM6IGlubmVyUmFkaXVzLFxuXHRcdFx0XHRcdGxhYmVsOiB2YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5sYWJlbCwgaW5kZXgsIGNoYXJ0LmRhdGEubGFiZWxzW2luZGV4XSlcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHZhciBtb2RlbCA9IGFyYy5fbW9kZWw7XG5cblx0XHRcdC8vIFJlc2V0cyB0aGUgdmlzdWFsIHN0eWxlc1xuXHRcdFx0dmFyIGN1c3RvbSA9IGFyYy5jdXN0b20gfHwge307XG5cdFx0XHR2YXIgdmFsdWVPckRlZmF1bHQgPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdDtcblx0XHRcdHZhciBlbGVtZW50T3B0cyA9IHRoaXMuY2hhcnQub3B0aW9ucy5lbGVtZW50cy5hcmM7XG5cdFx0XHRtb2RlbC5iYWNrZ3JvdW5kQ29sb3IgPSBjdXN0b20uYmFja2dyb3VuZENvbG9yID8gY3VzdG9tLmJhY2tncm91bmRDb2xvciA6IHZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuYmFja2dyb3VuZENvbG9yLCBpbmRleCwgZWxlbWVudE9wdHMuYmFja2dyb3VuZENvbG9yKTtcblx0XHRcdG1vZGVsLmJvcmRlckNvbG9yID0gY3VzdG9tLmJvcmRlckNvbG9yID8gY3VzdG9tLmJvcmRlckNvbG9yIDogdmFsdWVPckRlZmF1bHQoZGF0YXNldC5ib3JkZXJDb2xvciwgaW5kZXgsIGVsZW1lbnRPcHRzLmJvcmRlckNvbG9yKTtcblx0XHRcdG1vZGVsLmJvcmRlcldpZHRoID0gY3VzdG9tLmJvcmRlcldpZHRoID8gY3VzdG9tLmJvcmRlcldpZHRoIDogdmFsdWVPckRlZmF1bHQoZGF0YXNldC5ib3JkZXJXaWR0aCwgaW5kZXgsIGVsZW1lbnRPcHRzLmJvcmRlcldpZHRoKTtcblxuXHRcdFx0Ly8gU2V0IGNvcnJlY3QgYW5nbGVzIGlmIG5vdCByZXNldHRpbmdcblx0XHRcdGlmICghcmVzZXQgfHwgIWFuaW1hdGlvbk9wdHMuYW5pbWF0ZVJvdGF0ZSkge1xuXHRcdFx0XHRpZiAoaW5kZXggPT09IDApIHtcblx0XHRcdFx0XHRtb2RlbC5zdGFydEFuZ2xlID0gb3B0cy5yb3RhdGlvbjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtb2RlbC5zdGFydEFuZ2xlID0gbWUuZ2V0TWV0YSgpLmRhdGFbaW5kZXggLSAxXS5fbW9kZWwuZW5kQW5nbGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRtb2RlbC5lbmRBbmdsZSA9IG1vZGVsLnN0YXJ0QW5nbGUgKyBtb2RlbC5jaXJjdW1mZXJlbmNlO1xuXHRcdFx0fVxuXG5cdFx0XHRhcmMucGl2b3QoKTtcblx0XHR9LFxuXG5cdFx0Y2FsY3VsYXRlVG90YWw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRhdGFzZXQgPSB0aGlzLmdldERhdGFzZXQoKTtcblx0XHRcdHZhciBtZXRhID0gdGhpcy5nZXRNZXRhKCk7XG5cdFx0XHR2YXIgdG90YWwgPSAwO1xuXHRcdFx0dmFyIHZhbHVlO1xuXG5cdFx0XHRoZWxwZXJzLmVhY2gobWV0YS5kYXRhLCBmdW5jdGlvbihlbGVtZW50LCBpbmRleCkge1xuXHRcdFx0XHR2YWx1ZSA9IGRhdGFzZXQuZGF0YVtpbmRleF07XG5cdFx0XHRcdGlmICghaXNOYU4odmFsdWUpICYmICFlbGVtZW50LmhpZGRlbikge1xuXHRcdFx0XHRcdHRvdGFsICs9IE1hdGguYWJzKHZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdC8qIGlmICh0b3RhbCA9PT0gMCkge1xuXHRcdFx0XHR0b3RhbCA9IE5hTjtcblx0XHRcdH0qL1xuXG5cdFx0XHRyZXR1cm4gdG90YWw7XG5cdFx0fSxcblxuXHRcdGNhbGN1bGF0ZUNpcmN1bWZlcmVuY2U6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHR2YXIgdG90YWwgPSB0aGlzLmdldE1ldGEoKS50b3RhbDtcblx0XHRcdGlmICh0b3RhbCA+IDAgJiYgIWlzTmFOKHZhbHVlKSkge1xuXHRcdFx0XHRyZXR1cm4gKE1hdGguUEkgKiAyLjApICogKE1hdGguYWJzKHZhbHVlKSAvIHRvdGFsKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiAwO1xuXHRcdH0sXG5cblx0XHQvLyBnZXRzIHRoZSBtYXggYm9yZGVyIG9yIGhvdmVyIHdpZHRoIHRvIHByb3Blcmx5IHNjYWxlIHBpZSBjaGFydHNcblx0XHRnZXRNYXhCb3JkZXJXaWR0aDogZnVuY3Rpb24oYXJjcykge1xuXHRcdFx0dmFyIG1heCA9IDA7XG5cdFx0XHR2YXIgaW5kZXggPSB0aGlzLmluZGV4O1xuXHRcdFx0dmFyIGxlbmd0aCA9IGFyY3MubGVuZ3RoO1xuXHRcdFx0dmFyIGJvcmRlcldpZHRoO1xuXHRcdFx0dmFyIGhvdmVyV2lkdGg7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Ym9yZGVyV2lkdGggPSBhcmNzW2ldLl9tb2RlbCA/IGFyY3NbaV0uX21vZGVsLmJvcmRlcldpZHRoIDogMDtcblx0XHRcdFx0aG92ZXJXaWR0aCA9IGFyY3NbaV0uX2NoYXJ0ID8gYXJjc1tpXS5fY2hhcnQuY29uZmlnLmRhdGEuZGF0YXNldHNbaW5kZXhdLmhvdmVyQm9yZGVyV2lkdGggOiAwO1xuXG5cdFx0XHRcdG1heCA9IGJvcmRlcldpZHRoID4gbWF4ID8gYm9yZGVyV2lkdGggOiBtYXg7XG5cdFx0XHRcdG1heCA9IGhvdmVyV2lkdGggPiBtYXggPyBob3ZlcldpZHRoIDogbWF4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1heDtcblx0XHR9XG5cdH0pO1xufTtcblxufSx7XCIyNlwiOjI2LFwiNDFcIjo0MSxcIjQ2XCI6NDZ9XSwxODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIGVsZW1lbnRzID0gcmVxdWlyZSg0MSk7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG5kZWZhdWx0cy5fc2V0KCdsaW5lJywge1xuXHRzaG93TGluZXM6IHRydWUsXG5cdHNwYW5HYXBzOiBmYWxzZSxcblxuXHRob3Zlcjoge1xuXHRcdG1vZGU6ICdsYWJlbCdcblx0fSxcblxuXHRzY2FsZXM6IHtcblx0XHR4QXhlczogW3tcblx0XHRcdHR5cGU6ICdjYXRlZ29yeScsXG5cdFx0XHRpZDogJ3gtYXhpcy0wJ1xuXHRcdH1dLFxuXHRcdHlBeGVzOiBbe1xuXHRcdFx0dHlwZTogJ2xpbmVhcicsXG5cdFx0XHRpZDogJ3ktYXhpcy0wJ1xuXHRcdH1dXG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0ZnVuY3Rpb24gbGluZUVuYWJsZWQoZGF0YXNldCwgb3B0aW9ucykge1xuXHRcdHJldHVybiBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuc2hvd0xpbmUsIG9wdGlvbnMuc2hvd0xpbmVzKTtcblx0fVxuXG5cdENoYXJ0LmNvbnRyb2xsZXJzLmxpbmUgPSBDaGFydC5EYXRhc2V0Q29udHJvbGxlci5leHRlbmQoe1xuXG5cdFx0ZGF0YXNldEVsZW1lbnRUeXBlOiBlbGVtZW50cy5MaW5lLFxuXG5cdFx0ZGF0YUVsZW1lbnRUeXBlOiBlbGVtZW50cy5Qb2ludCxcblxuXHRcdHVwZGF0ZTogZnVuY3Rpb24ocmVzZXQpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHRcdHZhciBsaW5lID0gbWV0YS5kYXRhc2V0O1xuXHRcdFx0dmFyIHBvaW50cyA9IG1ldGEuZGF0YSB8fCBbXTtcblx0XHRcdHZhciBvcHRpb25zID0gbWUuY2hhcnQub3B0aW9ucztcblx0XHRcdHZhciBsaW5lRWxlbWVudE9wdGlvbnMgPSBvcHRpb25zLmVsZW1lbnRzLmxpbmU7XG5cdFx0XHR2YXIgc2NhbGUgPSBtZS5nZXRTY2FsZUZvcklkKG1ldGEueUF4aXNJRCk7XG5cdFx0XHR2YXIgaSwgaWxlbiwgY3VzdG9tO1xuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XG5cdFx0XHR2YXIgc2hvd0xpbmUgPSBsaW5lRW5hYmxlZChkYXRhc2V0LCBvcHRpb25zKTtcblxuXHRcdFx0Ly8gVXBkYXRlIExpbmVcblx0XHRcdGlmIChzaG93TGluZSkge1xuXHRcdFx0XHRjdXN0b20gPSBsaW5lLmN1c3RvbSB8fCB7fTtcblxuXHRcdFx0XHQvLyBDb21wYXRpYmlsaXR5OiBJZiB0aGUgcHJvcGVydGllcyBhcmUgZGVmaW5lZCB3aXRoIG9ubHkgdGhlIG9sZCBuYW1lLCB1c2UgdGhvc2UgdmFsdWVzXG5cdFx0XHRcdGlmICgoZGF0YXNldC50ZW5zaW9uICE9PSB1bmRlZmluZWQpICYmIChkYXRhc2V0LmxpbmVUZW5zaW9uID09PSB1bmRlZmluZWQpKSB7XG5cdFx0XHRcdFx0ZGF0YXNldC5saW5lVGVuc2lvbiA9IGRhdGFzZXQudGVuc2lvbjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFV0aWxpdHlcblx0XHRcdFx0bGluZS5fc2NhbGUgPSBzY2FsZTtcblx0XHRcdFx0bGluZS5fZGF0YXNldEluZGV4ID0gbWUuaW5kZXg7XG5cdFx0XHRcdC8vIERhdGFcblx0XHRcdFx0bGluZS5fY2hpbGRyZW4gPSBwb2ludHM7XG5cdFx0XHRcdC8vIE1vZGVsXG5cdFx0XHRcdGxpbmUuX21vZGVsID0ge1xuXHRcdFx0XHRcdC8vIEFwcGVhcmFuY2Vcblx0XHRcdFx0XHQvLyBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiBsaW5lcyBpcyB0byBicmVhayBhdCBudWxsIHZhbHVlcywgYWNjb3JkaW5nXG5cdFx0XHRcdFx0Ly8gdG8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzI0MzUjaXNzdWVjb21tZW50LTIxNjcxODE1OFxuXHRcdFx0XHRcdC8vIFRoaXMgb3B0aW9uIGdpdmVzIGxpbmVzIHRoZSBhYmlsaXR5IHRvIHNwYW4gZ2Fwc1xuXHRcdFx0XHRcdHNwYW5HYXBzOiBkYXRhc2V0LnNwYW5HYXBzID8gZGF0YXNldC5zcGFuR2FwcyA6IG9wdGlvbnMuc3BhbkdhcHMsXG5cdFx0XHRcdFx0dGVuc2lvbjogY3VzdG9tLnRlbnNpb24gPyBjdXN0b20udGVuc2lvbiA6IGhlbHBlcnMudmFsdWVPckRlZmF1bHQoZGF0YXNldC5saW5lVGVuc2lvbiwgbGluZUVsZW1lbnRPcHRpb25zLnRlbnNpb24pLFxuXHRcdFx0XHRcdGJhY2tncm91bmRDb2xvcjogY3VzdG9tLmJhY2tncm91bmRDb2xvciA/IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgOiAoZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IgfHwgbGluZUVsZW1lbnRPcHRpb25zLmJhY2tncm91bmRDb2xvciksXG5cdFx0XHRcdFx0Ym9yZGVyV2lkdGg6IGN1c3RvbS5ib3JkZXJXaWR0aCA/IGN1c3RvbS5ib3JkZXJXaWR0aCA6IChkYXRhc2V0LmJvcmRlcldpZHRoIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJXaWR0aCksXG5cdFx0XHRcdFx0Ym9yZGVyQ29sb3I6IGN1c3RvbS5ib3JkZXJDb2xvciA/IGN1c3RvbS5ib3JkZXJDb2xvciA6IChkYXRhc2V0LmJvcmRlckNvbG9yIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJDb2xvciksXG5cdFx0XHRcdFx0Ym9yZGVyQ2FwU3R5bGU6IGN1c3RvbS5ib3JkZXJDYXBTdHlsZSA/IGN1c3RvbS5ib3JkZXJDYXBTdHlsZSA6IChkYXRhc2V0LmJvcmRlckNhcFN0eWxlIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJDYXBTdHlsZSksXG5cdFx0XHRcdFx0Ym9yZGVyRGFzaDogY3VzdG9tLmJvcmRlckRhc2ggPyBjdXN0b20uYm9yZGVyRGFzaCA6IChkYXRhc2V0LmJvcmRlckRhc2ggfHwgbGluZUVsZW1lbnRPcHRpb25zLmJvcmRlckRhc2gpLFxuXHRcdFx0XHRcdGJvcmRlckRhc2hPZmZzZXQ6IGN1c3RvbS5ib3JkZXJEYXNoT2Zmc2V0ID8gY3VzdG9tLmJvcmRlckRhc2hPZmZzZXQgOiAoZGF0YXNldC5ib3JkZXJEYXNoT2Zmc2V0IHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJEYXNoT2Zmc2V0KSxcblx0XHRcdFx0XHRib3JkZXJKb2luU3R5bGU6IGN1c3RvbS5ib3JkZXJKb2luU3R5bGUgPyBjdXN0b20uYm9yZGVySm9pblN0eWxlIDogKGRhdGFzZXQuYm9yZGVySm9pblN0eWxlIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJKb2luU3R5bGUpLFxuXHRcdFx0XHRcdGZpbGw6IGN1c3RvbS5maWxsID8gY3VzdG9tLmZpbGwgOiAoZGF0YXNldC5maWxsICE9PSB1bmRlZmluZWQgPyBkYXRhc2V0LmZpbGwgOiBsaW5lRWxlbWVudE9wdGlvbnMuZmlsbCksXG5cdFx0XHRcdFx0c3RlcHBlZExpbmU6IGN1c3RvbS5zdGVwcGVkTGluZSA/IGN1c3RvbS5zdGVwcGVkTGluZSA6IGhlbHBlcnMudmFsdWVPckRlZmF1bHQoZGF0YXNldC5zdGVwcGVkTGluZSwgbGluZUVsZW1lbnRPcHRpb25zLnN0ZXBwZWQpLFxuXHRcdFx0XHRcdGN1YmljSW50ZXJwb2xhdGlvbk1vZGU6IGN1c3RvbS5jdWJpY0ludGVycG9sYXRpb25Nb2RlID8gY3VzdG9tLmN1YmljSW50ZXJwb2xhdGlvbk1vZGUgOiBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSwgbGluZUVsZW1lbnRPcHRpb25zLmN1YmljSW50ZXJwb2xhdGlvbk1vZGUpLFxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGxpbmUucGl2b3QoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIFBvaW50c1xuXHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0bWUudXBkYXRlRWxlbWVudChwb2ludHNbaV0sIGksIHJlc2V0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNob3dMaW5lICYmIGxpbmUuX21vZGVsLnRlbnNpb24gIT09IDApIHtcblx0XHRcdFx0bWUudXBkYXRlQmV6aWVyQ29udHJvbFBvaW50cygpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBOb3cgcGl2b3QgdGhlIHBvaW50IGZvciBhbmltYXRpb25cblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSBwb2ludHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdHBvaW50c1tpXS5waXZvdCgpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRnZXRQb2ludEJhY2tncm91bmRDb2xvcjogZnVuY3Rpb24ocG9pbnQsIGluZGV4KSB7XG5cdFx0XHR2YXIgYmFja2dyb3VuZENvbG9yID0gdGhpcy5jaGFydC5vcHRpb25zLmVsZW1lbnRzLnBvaW50LmJhY2tncm91bmRDb2xvcjtcblx0XHRcdHZhciBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KCk7XG5cdFx0XHR2YXIgY3VzdG9tID0gcG9pbnQuY3VzdG9tIHx8IHt9O1xuXG5cdFx0XHRpZiAoY3VzdG9tLmJhY2tncm91bmRDb2xvcikge1xuXHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3IgPSBjdXN0b20uYmFja2dyb3VuZENvbG9yO1xuXHRcdFx0fSBlbHNlIGlmIChkYXRhc2V0LnBvaW50QmFja2dyb3VuZENvbG9yKSB7XG5cdFx0XHRcdGJhY2tncm91bmRDb2xvciA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRCYWNrZ3JvdW5kQ29sb3IsIGluZGV4LCBiYWNrZ3JvdW5kQ29sb3IpO1xuXHRcdFx0fSBlbHNlIGlmIChkYXRhc2V0LmJhY2tncm91bmRDb2xvcikge1xuXHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3IgPSBkYXRhc2V0LmJhY2tncm91bmRDb2xvcjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGJhY2tncm91bmRDb2xvcjtcblx0XHR9LFxuXG5cdFx0Z2V0UG9pbnRCb3JkZXJDb2xvcjogZnVuY3Rpb24ocG9pbnQsIGluZGV4KSB7XG5cdFx0XHR2YXIgYm9yZGVyQ29sb3IgPSB0aGlzLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQuYm9yZGVyQ29sb3I7XG5cdFx0XHR2YXIgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldCgpO1xuXHRcdFx0dmFyIGN1c3RvbSA9IHBvaW50LmN1c3RvbSB8fCB7fTtcblxuXHRcdFx0aWYgKGN1c3RvbS5ib3JkZXJDb2xvcikge1xuXHRcdFx0XHRib3JkZXJDb2xvciA9IGN1c3RvbS5ib3JkZXJDb2xvcjtcblx0XHRcdH0gZWxzZSBpZiAoZGF0YXNldC5wb2ludEJvcmRlckNvbG9yKSB7XG5cdFx0XHRcdGJvcmRlckNvbG9yID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEJvcmRlckNvbG9yLCBpbmRleCwgYm9yZGVyQ29sb3IpO1xuXHRcdFx0fSBlbHNlIGlmIChkYXRhc2V0LmJvcmRlckNvbG9yKSB7XG5cdFx0XHRcdGJvcmRlckNvbG9yID0gZGF0YXNldC5ib3JkZXJDb2xvcjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGJvcmRlckNvbG9yO1xuXHRcdH0sXG5cblx0XHRnZXRQb2ludEJvcmRlcldpZHRoOiBmdW5jdGlvbihwb2ludCwgaW5kZXgpIHtcblx0XHRcdHZhciBib3JkZXJXaWR0aCA9IHRoaXMuY2hhcnQub3B0aW9ucy5lbGVtZW50cy5wb2ludC5ib3JkZXJXaWR0aDtcblx0XHRcdHZhciBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KCk7XG5cdFx0XHR2YXIgY3VzdG9tID0gcG9pbnQuY3VzdG9tIHx8IHt9O1xuXG5cdFx0XHRpZiAoIWlzTmFOKGN1c3RvbS5ib3JkZXJXaWR0aCkpIHtcblx0XHRcdFx0Ym9yZGVyV2lkdGggPSBjdXN0b20uYm9yZGVyV2lkdGg7XG5cdFx0XHR9IGVsc2UgaWYgKCFpc05hTihkYXRhc2V0LnBvaW50Qm9yZGVyV2lkdGgpIHx8IGhlbHBlcnMuaXNBcnJheShkYXRhc2V0LnBvaW50Qm9yZGVyV2lkdGgpKSB7XG5cdFx0XHRcdGJvcmRlcldpZHRoID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEJvcmRlcldpZHRoLCBpbmRleCwgYm9yZGVyV2lkdGgpO1xuXHRcdFx0fSBlbHNlIGlmICghaXNOYU4oZGF0YXNldC5ib3JkZXJXaWR0aCkpIHtcblx0XHRcdFx0Ym9yZGVyV2lkdGggPSBkYXRhc2V0LmJvcmRlcldpZHRoO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYm9yZGVyV2lkdGg7XG5cdFx0fSxcblxuXHRcdGdldFBvaW50Um90YXRpb246IGZ1bmN0aW9uKHBvaW50LCBpbmRleCkge1xuXHRcdFx0dmFyIHBvaW50Um90YXRpb24gPSB0aGlzLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQucm90YXRpb247XG5cdFx0XHR2YXIgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldCgpO1xuXHRcdFx0dmFyIGN1c3RvbSA9IHBvaW50LmN1c3RvbSB8fCB7fTtcblxuXHRcdFx0aWYgKCFpc05hTihjdXN0b20ucm90YXRpb24pKSB7XG5cdFx0XHRcdHBvaW50Um90YXRpb24gPSBjdXN0b20ucm90YXRpb247XG5cdFx0XHR9IGVsc2UgaWYgKCFpc05hTihkYXRhc2V0LnBvaW50Um90YXRpb24pIHx8IGhlbHBlcnMuaXNBcnJheShkYXRhc2V0LnBvaW50Um90YXRpb24pKSB7XG5cdFx0XHRcdHBvaW50Um90YXRpb24gPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50Um90YXRpb24sIGluZGV4LCBwb2ludFJvdGF0aW9uKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBwb2ludFJvdGF0aW9uO1xuXHRcdH0sXG5cblx0XHR1cGRhdGVFbGVtZW50OiBmdW5jdGlvbihwb2ludCwgaW5kZXgsIHJlc2V0KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XG5cdFx0XHR2YXIgY3VzdG9tID0gcG9pbnQuY3VzdG9tIHx8IHt9O1xuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XG5cdFx0XHR2YXIgZGF0YXNldEluZGV4ID0gbWUuaW5kZXg7XG5cdFx0XHR2YXIgdmFsdWUgPSBkYXRhc2V0LmRhdGFbaW5kZXhdO1xuXHRcdFx0dmFyIHlTY2FsZSA9IG1lLmdldFNjYWxlRm9ySWQobWV0YS55QXhpc0lEKTtcblx0XHRcdHZhciB4U2NhbGUgPSBtZS5nZXRTY2FsZUZvcklkKG1ldGEueEF4aXNJRCk7XG5cdFx0XHR2YXIgcG9pbnRPcHRpb25zID0gbWUuY2hhcnQub3B0aW9ucy5lbGVtZW50cy5wb2ludDtcblx0XHRcdHZhciB4LCB5O1xuXG5cdFx0XHQvLyBDb21wYXRpYmlsaXR5OiBJZiB0aGUgcHJvcGVydGllcyBhcmUgZGVmaW5lZCB3aXRoIG9ubHkgdGhlIG9sZCBuYW1lLCB1c2UgdGhvc2UgdmFsdWVzXG5cdFx0XHRpZiAoKGRhdGFzZXQucmFkaXVzICE9PSB1bmRlZmluZWQpICYmIChkYXRhc2V0LnBvaW50UmFkaXVzID09PSB1bmRlZmluZWQpKSB7XG5cdFx0XHRcdGRhdGFzZXQucG9pbnRSYWRpdXMgPSBkYXRhc2V0LnJhZGl1cztcblx0XHRcdH1cblx0XHRcdGlmICgoZGF0YXNldC5oaXRSYWRpdXMgIT09IHVuZGVmaW5lZCkgJiYgKGRhdGFzZXQucG9pbnRIaXRSYWRpdXMgPT09IHVuZGVmaW5lZCkpIHtcblx0XHRcdFx0ZGF0YXNldC5wb2ludEhpdFJhZGl1cyA9IGRhdGFzZXQuaGl0UmFkaXVzO1xuXHRcdFx0fVxuXG5cdFx0XHR4ID0geFNjYWxlLmdldFBpeGVsRm9yVmFsdWUodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlIDogTmFOLCBpbmRleCwgZGF0YXNldEluZGV4KTtcblx0XHRcdHkgPSByZXNldCA/IHlTY2FsZS5nZXRCYXNlUGl4ZWwoKSA6IG1lLmNhbGN1bGF0ZVBvaW50WSh2YWx1ZSwgaW5kZXgsIGRhdGFzZXRJbmRleCk7XG5cblx0XHRcdC8vIFV0aWxpdHlcblx0XHRcdHBvaW50Ll94U2NhbGUgPSB4U2NhbGU7XG5cdFx0XHRwb2ludC5feVNjYWxlID0geVNjYWxlO1xuXHRcdFx0cG9pbnQuX2RhdGFzZXRJbmRleCA9IGRhdGFzZXRJbmRleDtcblx0XHRcdHBvaW50Ll9pbmRleCA9IGluZGV4O1xuXG5cdFx0XHQvLyBEZXNpcmVkIHZpZXcgcHJvcGVydGllc1xuXHRcdFx0cG9pbnQuX21vZGVsID0ge1xuXHRcdFx0XHR4OiB4LFxuXHRcdFx0XHR5OiB5LFxuXHRcdFx0XHRza2lwOiBjdXN0b20uc2tpcCB8fCBpc05hTih4KSB8fCBpc05hTih5KSxcblx0XHRcdFx0Ly8gQXBwZWFyYW5jZVxuXHRcdFx0XHRyYWRpdXM6IGN1c3RvbS5yYWRpdXMgfHwgaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludFJhZGl1cywgaW5kZXgsIHBvaW50T3B0aW9ucy5yYWRpdXMpLFxuXHRcdFx0XHRwb2ludFN0eWxlOiBjdXN0b20ucG9pbnRTdHlsZSB8fCBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50U3R5bGUsIGluZGV4LCBwb2ludE9wdGlvbnMucG9pbnRTdHlsZSksXG5cdFx0XHRcdHJvdGF0aW9uOiBtZS5nZXRQb2ludFJvdGF0aW9uKHBvaW50LCBpbmRleCksXG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjogbWUuZ2V0UG9pbnRCYWNrZ3JvdW5kQ29sb3IocG9pbnQsIGluZGV4KSxcblx0XHRcdFx0Ym9yZGVyQ29sb3I6IG1lLmdldFBvaW50Qm9yZGVyQ29sb3IocG9pbnQsIGluZGV4KSxcblx0XHRcdFx0Ym9yZGVyV2lkdGg6IG1lLmdldFBvaW50Qm9yZGVyV2lkdGgocG9pbnQsIGluZGV4KSxcblx0XHRcdFx0dGVuc2lvbjogbWV0YS5kYXRhc2V0Ll9tb2RlbCA/IG1ldGEuZGF0YXNldC5fbW9kZWwudGVuc2lvbiA6IDAsXG5cdFx0XHRcdHN0ZXBwZWRMaW5lOiBtZXRhLmRhdGFzZXQuX21vZGVsID8gbWV0YS5kYXRhc2V0Ll9tb2RlbC5zdGVwcGVkTGluZSA6IGZhbHNlLFxuXHRcdFx0XHQvLyBUb29sdGlwXG5cdFx0XHRcdGhpdFJhZGl1czogY3VzdG9tLmhpdFJhZGl1cyB8fCBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50SGl0UmFkaXVzLCBpbmRleCwgcG9pbnRPcHRpb25zLmhpdFJhZGl1cylcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdGNhbGN1bGF0ZVBvaW50WTogZnVuY3Rpb24odmFsdWUsIGluZGV4LCBkYXRhc2V0SW5kZXgpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdFx0dmFyIHlTY2FsZSA9IG1lLmdldFNjYWxlRm9ySWQobWV0YS55QXhpc0lEKTtcblx0XHRcdHZhciBzdW1Qb3MgPSAwO1xuXHRcdFx0dmFyIHN1bU5lZyA9IDA7XG5cdFx0XHR2YXIgaSwgZHMsIGRzTWV0YTtcblxuXHRcdFx0aWYgKHlTY2FsZS5vcHRpb25zLnN0YWNrZWQpIHtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFzZXRJbmRleDsgaSsrKSB7XG5cdFx0XHRcdFx0ZHMgPSBjaGFydC5kYXRhLmRhdGFzZXRzW2ldO1xuXHRcdFx0XHRcdGRzTWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGkpO1xuXHRcdFx0XHRcdGlmIChkc01ldGEudHlwZSA9PT0gJ2xpbmUnICYmIGRzTWV0YS55QXhpc0lEID09PSB5U2NhbGUuaWQgJiYgY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpKSkge1xuXHRcdFx0XHRcdFx0dmFyIHN0YWNrZWRSaWdodFZhbHVlID0gTnVtYmVyKHlTY2FsZS5nZXRSaWdodFZhbHVlKGRzLmRhdGFbaW5kZXhdKSk7XG5cdFx0XHRcdFx0XHRpZiAoc3RhY2tlZFJpZ2h0VmFsdWUgPCAwKSB7XG5cdFx0XHRcdFx0XHRcdHN1bU5lZyArPSBzdGFja2VkUmlnaHRWYWx1ZSB8fCAwO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0c3VtUG9zICs9IHN0YWNrZWRSaWdodFZhbHVlIHx8IDA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHJpZ2h0VmFsdWUgPSBOdW1iZXIoeVNjYWxlLmdldFJpZ2h0VmFsdWUodmFsdWUpKTtcblx0XHRcdFx0aWYgKHJpZ2h0VmFsdWUgPCAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHN1bU5lZyArIHJpZ2h0VmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB5U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzdW1Qb3MgKyByaWdodFZhbHVlKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHZhbHVlKTtcblx0XHR9LFxuXG5cdFx0dXBkYXRlQmV6aWVyQ29udHJvbFBvaW50czogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XG5cdFx0XHR2YXIgYXJlYSA9IG1lLmNoYXJ0LmNoYXJ0QXJlYTtcblx0XHRcdHZhciBwb2ludHMgPSAobWV0YS5kYXRhIHx8IFtdKTtcblx0XHRcdHZhciBpLCBpbGVuLCBwb2ludCwgbW9kZWwsIGNvbnRyb2xQb2ludHM7XG5cblx0XHRcdC8vIE9ubHkgY29uc2lkZXIgcG9pbnRzIHRoYXQgYXJlIGRyYXduIGluIGNhc2UgdGhlIHNwYW5HYXBzIG9wdGlvbiBpcyB1c2VkXG5cdFx0XHRpZiAobWV0YS5kYXRhc2V0Ll9tb2RlbC5zcGFuR2Fwcykge1xuXHRcdFx0XHRwb2ludHMgPSBwb2ludHMuZmlsdGVyKGZ1bmN0aW9uKHB0KSB7XG5cdFx0XHRcdFx0cmV0dXJuICFwdC5fbW9kZWwuc2tpcDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGNhcENvbnRyb2xQb2ludChwdCwgbWluLCBtYXgpIHtcblx0XHRcdFx0cmV0dXJuIE1hdGgubWF4KE1hdGgubWluKHB0LCBtYXgpLCBtaW4pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWV0YS5kYXRhc2V0Ll9tb2RlbC5jdWJpY0ludGVycG9sYXRpb25Nb2RlID09PSAnbW9ub3RvbmUnKSB7XG5cdFx0XHRcdGhlbHBlcnMuc3BsaW5lQ3VydmVNb25vdG9uZShwb2ludHMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0XHRwb2ludCA9IHBvaW50c1tpXTtcblx0XHRcdFx0XHRtb2RlbCA9IHBvaW50Ll9tb2RlbDtcblx0XHRcdFx0XHRjb250cm9sUG9pbnRzID0gaGVscGVycy5zcGxpbmVDdXJ2ZShcblx0XHRcdFx0XHRcdGhlbHBlcnMucHJldmlvdXNJdGVtKHBvaW50cywgaSkuX21vZGVsLFxuXHRcdFx0XHRcdFx0bW9kZWwsXG5cdFx0XHRcdFx0XHRoZWxwZXJzLm5leHRJdGVtKHBvaW50cywgaSkuX21vZGVsLFxuXHRcdFx0XHRcdFx0bWV0YS5kYXRhc2V0Ll9tb2RlbC50ZW5zaW9uXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRtb2RlbC5jb250cm9sUG9pbnRQcmV2aW91c1ggPSBjb250cm9sUG9pbnRzLnByZXZpb3VzLng7XG5cdFx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNZID0gY29udHJvbFBvaW50cy5wcmV2aW91cy55O1xuXHRcdFx0XHRcdG1vZGVsLmNvbnRyb2xQb2ludE5leHRYID0gY29udHJvbFBvaW50cy5uZXh0Lng7XG5cdFx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50TmV4dFkgPSBjb250cm9sUG9pbnRzLm5leHQueTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWUuY2hhcnQub3B0aW9ucy5lbGVtZW50cy5saW5lLmNhcEJlemllclBvaW50cykge1xuXHRcdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRcdG1vZGVsID0gcG9pbnRzW2ldLl9tb2RlbDtcblx0XHRcdFx0XHRtb2RlbC5jb250cm9sUG9pbnRQcmV2aW91c1ggPSBjYXBDb250cm9sUG9pbnQobW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNYLCBhcmVhLmxlZnQsIGFyZWEucmlnaHQpO1xuXHRcdFx0XHRcdG1vZGVsLmNvbnRyb2xQb2ludFByZXZpb3VzWSA9IGNhcENvbnRyb2xQb2ludChtb2RlbC5jb250cm9sUG9pbnRQcmV2aW91c1ksIGFyZWEudG9wLCBhcmVhLmJvdHRvbSk7XG5cdFx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50TmV4dFggPSBjYXBDb250cm9sUG9pbnQobW9kZWwuY29udHJvbFBvaW50TmV4dFgsIGFyZWEubGVmdCwgYXJlYS5yaWdodCk7XG5cdFx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50TmV4dFkgPSBjYXBDb250cm9sUG9pbnQobW9kZWwuY29udHJvbFBvaW50TmV4dFksIGFyZWEudG9wLCBhcmVhLmJvdHRvbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0ZHJhdzogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHRcdHZhciBwb2ludHMgPSBtZXRhLmRhdGEgfHwgW107XG5cdFx0XHR2YXIgYXJlYSA9IGNoYXJ0LmNoYXJ0QXJlYTtcblx0XHRcdHZhciBpbGVuID0gcG9pbnRzLmxlbmd0aDtcblx0XHRcdHZhciBoYWxmQm9yZGVyV2lkdGg7XG5cdFx0XHR2YXIgaSA9IDA7XG5cblx0XHRcdGlmIChsaW5lRW5hYmxlZChtZS5nZXREYXRhc2V0KCksIGNoYXJ0Lm9wdGlvbnMpKSB7XG5cdFx0XHRcdGhhbGZCb3JkZXJXaWR0aCA9IChtZXRhLmRhdGFzZXQuX21vZGVsLmJvcmRlcldpZHRoIHx8IDApIC8gMjtcblxuXHRcdFx0XHRoZWxwZXJzLmNhbnZhcy5jbGlwQXJlYShjaGFydC5jdHgsIHtcblx0XHRcdFx0XHRsZWZ0OiBhcmVhLmxlZnQsXG5cdFx0XHRcdFx0cmlnaHQ6IGFyZWEucmlnaHQsXG5cdFx0XHRcdFx0dG9wOiBhcmVhLnRvcCAtIGhhbGZCb3JkZXJXaWR0aCxcblx0XHRcdFx0XHRib3R0b206IGFyZWEuYm90dG9tICsgaGFsZkJvcmRlcldpZHRoXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdG1ldGEuZGF0YXNldC5kcmF3KCk7XG5cblx0XHRcdFx0aGVscGVycy5jYW52YXMudW5jbGlwQXJlYShjaGFydC5jdHgpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEcmF3IHRoZSBwb2ludHNcblx0XHRcdGZvciAoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdHBvaW50c1tpXS5kcmF3KGFyZWEpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRzZXRIb3ZlclN0eWxlOiBmdW5jdGlvbihlbGVtZW50KSB7XG5cdFx0XHQvLyBQb2ludFxuXHRcdFx0dmFyIGRhdGFzZXQgPSB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbZWxlbWVudC5fZGF0YXNldEluZGV4XTtcblx0XHRcdHZhciBpbmRleCA9IGVsZW1lbnQuX2luZGV4O1xuXHRcdFx0dmFyIGN1c3RvbSA9IGVsZW1lbnQuY3VzdG9tIHx8IHt9O1xuXHRcdFx0dmFyIG1vZGVsID0gZWxlbWVudC5fbW9kZWw7XG5cblx0XHRcdGVsZW1lbnQuJHByZXZpb3VzU3R5bGUgPSB7XG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuXHRcdFx0XHRib3JkZXJDb2xvcjogbW9kZWwuYm9yZGVyQ29sb3IsXG5cdFx0XHRcdGJvcmRlcldpZHRoOiBtb2RlbC5ib3JkZXJXaWR0aCxcblx0XHRcdFx0cmFkaXVzOiBtb2RlbC5yYWRpdXNcblx0XHRcdH07XG5cblx0XHRcdG1vZGVsLmJhY2tncm91bmRDb2xvciA9IGN1c3RvbS5ob3ZlckJhY2tncm91bmRDb2xvciB8fCBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50SG92ZXJCYWNrZ3JvdW5kQ29sb3IsIGluZGV4LCBoZWxwZXJzLmdldEhvdmVyQ29sb3IobW9kZWwuYmFja2dyb3VuZENvbG9yKSk7XG5cdFx0XHRtb2RlbC5ib3JkZXJDb2xvciA9IGN1c3RvbS5ob3ZlckJvcmRlckNvbG9yIHx8IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRIb3ZlckJvcmRlckNvbG9yLCBpbmRleCwgaGVscGVycy5nZXRIb3ZlckNvbG9yKG1vZGVsLmJvcmRlckNvbG9yKSk7XG5cdFx0XHRtb2RlbC5ib3JkZXJXaWR0aCA9IGN1c3RvbS5ob3ZlckJvcmRlcldpZHRoIHx8IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRIb3ZlckJvcmRlcldpZHRoLCBpbmRleCwgbW9kZWwuYm9yZGVyV2lkdGgpO1xuXHRcdFx0bW9kZWwucmFkaXVzID0gY3VzdG9tLmhvdmVyUmFkaXVzIHx8IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRIb3ZlclJhZGl1cywgaW5kZXgsIHRoaXMuY2hhcnQub3B0aW9ucy5lbGVtZW50cy5wb2ludC5ob3ZlclJhZGl1cyk7XG5cdFx0fSxcblx0fSk7XG59O1xuXG59LHtcIjI2XCI6MjYsXCI0MVwiOjQxLFwiNDZcIjo0Nn1dLDE5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XG52YXIgZWxlbWVudHMgPSByZXF1aXJlKDQxKTtcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG5cbmRlZmF1bHRzLl9zZXQoJ3BvbGFyQXJlYScsIHtcblx0c2NhbGU6IHtcblx0XHR0eXBlOiAncmFkaWFsTGluZWFyJyxcblx0XHRhbmdsZUxpbmVzOiB7XG5cdFx0XHRkaXNwbGF5OiBmYWxzZVxuXHRcdH0sXG5cdFx0Z3JpZExpbmVzOiB7XG5cdFx0XHRjaXJjdWxhcjogdHJ1ZVxuXHRcdH0sXG5cdFx0cG9pbnRMYWJlbHM6IHtcblx0XHRcdGRpc3BsYXk6IGZhbHNlXG5cdFx0fSxcblx0XHR0aWNrczoge1xuXHRcdFx0YmVnaW5BdFplcm86IHRydWVcblx0XHR9XG5cdH0sXG5cblx0Ly8gQm9vbGVhbiAtIFdoZXRoZXIgdG8gYW5pbWF0ZSB0aGUgcm90YXRpb24gb2YgdGhlIGNoYXJ0XG5cdGFuaW1hdGlvbjoge1xuXHRcdGFuaW1hdGVSb3RhdGU6IHRydWUsXG5cdFx0YW5pbWF0ZVNjYWxlOiB0cnVlXG5cdH0sXG5cblx0c3RhcnRBbmdsZTogLTAuNSAqIE1hdGguUEksXG5cdGxlZ2VuZENhbGxiYWNrOiBmdW5jdGlvbihjaGFydCkge1xuXHRcdHZhciB0ZXh0ID0gW107XG5cdFx0dGV4dC5wdXNoKCc8dWwgY2xhc3M9XCInICsgY2hhcnQuaWQgKyAnLWxlZ2VuZFwiPicpO1xuXG5cdFx0dmFyIGRhdGEgPSBjaGFydC5kYXRhO1xuXHRcdHZhciBkYXRhc2V0cyA9IGRhdGEuZGF0YXNldHM7XG5cdFx0dmFyIGxhYmVscyA9IGRhdGEubGFiZWxzO1xuXG5cdFx0aWYgKGRhdGFzZXRzLmxlbmd0aCkge1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhc2V0c1swXS5kYXRhLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdHRleHQucHVzaCgnPGxpPjxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjonICsgZGF0YXNldHNbMF0uYmFja2dyb3VuZENvbG9yW2ldICsgJ1wiPjwvc3Bhbj4nKTtcblx0XHRcdFx0aWYgKGxhYmVsc1tpXSkge1xuXHRcdFx0XHRcdHRleHQucHVzaChsYWJlbHNbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRleHQucHVzaCgnPC9saT4nKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0ZXh0LnB1c2goJzwvdWw+Jyk7XG5cdFx0cmV0dXJuIHRleHQuam9pbignJyk7XG5cdH0sXG5cdGxlZ2VuZDoge1xuXHRcdGxhYmVsczoge1xuXHRcdFx0Z2VuZXJhdGVMYWJlbHM6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0XHRcdHZhciBkYXRhID0gY2hhcnQuZGF0YTtcblx0XHRcdFx0aWYgKGRhdGEubGFiZWxzLmxlbmd0aCAmJiBkYXRhLmRhdGFzZXRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhLmxhYmVscy5tYXAoZnVuY3Rpb24obGFiZWwsIGkpIHtcblx0XHRcdFx0XHRcdHZhciBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoMCk7XG5cdFx0XHRcdFx0XHR2YXIgZHMgPSBkYXRhLmRhdGFzZXRzWzBdO1xuXHRcdFx0XHRcdFx0dmFyIGFyYyA9IG1ldGEuZGF0YVtpXTtcblx0XHRcdFx0XHRcdHZhciBjdXN0b20gPSBhcmMuY3VzdG9tIHx8IHt9O1xuXHRcdFx0XHRcdFx0dmFyIHZhbHVlQXRJbmRleE9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0O1xuXHRcdFx0XHRcdFx0dmFyIGFyY09wdHMgPSBjaGFydC5vcHRpb25zLmVsZW1lbnRzLmFyYztcblx0XHRcdFx0XHRcdHZhciBmaWxsID0gY3VzdG9tLmJhY2tncm91bmRDb2xvciA/IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgOiB2YWx1ZUF0SW5kZXhPckRlZmF1bHQoZHMuYmFja2dyb3VuZENvbG9yLCBpLCBhcmNPcHRzLmJhY2tncm91bmRDb2xvcik7XG5cdFx0XHRcdFx0XHR2YXIgc3Ryb2tlID0gY3VzdG9tLmJvcmRlckNvbG9yID8gY3VzdG9tLmJvcmRlckNvbG9yIDogdmFsdWVBdEluZGV4T3JEZWZhdWx0KGRzLmJvcmRlckNvbG9yLCBpLCBhcmNPcHRzLmJvcmRlckNvbG9yKTtcblx0XHRcdFx0XHRcdHZhciBidyA9IGN1c3RvbS5ib3JkZXJXaWR0aCA/IGN1c3RvbS5ib3JkZXJXaWR0aCA6IHZhbHVlQXRJbmRleE9yRGVmYXVsdChkcy5ib3JkZXJXaWR0aCwgaSwgYXJjT3B0cy5ib3JkZXJXaWR0aCk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IGxhYmVsLFxuXHRcdFx0XHRcdFx0XHRmaWxsU3R5bGU6IGZpbGwsXG5cdFx0XHRcdFx0XHRcdHN0cm9rZVN0eWxlOiBzdHJva2UsXG5cdFx0XHRcdFx0XHRcdGxpbmVXaWR0aDogYncsXG5cdFx0XHRcdFx0XHRcdGhpZGRlbjogaXNOYU4oZHMuZGF0YVtpXSkgfHwgbWV0YS5kYXRhW2ldLmhpZGRlbixcblxuXHRcdFx0XHRcdFx0XHQvLyBFeHRyYSBkYXRhIHVzZWQgZm9yIHRvZ2dsaW5nIHRoZSBjb3JyZWN0IGl0ZW1cblx0XHRcdFx0XHRcdFx0aW5kZXg6IGlcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIFtdO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRvbkNsaWNrOiBmdW5jdGlvbihlLCBsZWdlbmRJdGVtKSB7XG5cdFx0XHR2YXIgaW5kZXggPSBsZWdlbmRJdGVtLmluZGV4O1xuXHRcdFx0dmFyIGNoYXJ0ID0gdGhpcy5jaGFydDtcblx0XHRcdHZhciBpLCBpbGVuLCBtZXRhO1xuXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gKGNoYXJ0LmRhdGEuZGF0YXNldHMgfHwgW10pLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XG5cdFx0XHRcdG1ldGEuZGF0YVtpbmRleF0uaGlkZGVuID0gIW1ldGEuZGF0YVtpbmRleF0uaGlkZGVuO1xuXHRcdFx0fVxuXG5cdFx0XHRjaGFydC51cGRhdGUoKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gTmVlZCB0byBvdmVycmlkZSB0aGVzZSB0byBnaXZlIGEgbmljZSBkZWZhdWx0XG5cdHRvb2x0aXBzOiB7XG5cdFx0Y2FsbGJhY2tzOiB7XG5cdFx0XHR0aXRsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdH0sXG5cdFx0XHRsYWJlbDogZnVuY3Rpb24oaXRlbSwgZGF0YSkge1xuXHRcdFx0XHRyZXR1cm4gZGF0YS5sYWJlbHNbaXRlbS5pbmRleF0gKyAnOiAnICsgaXRlbS55TGFiZWw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xuXG5cdENoYXJ0LmNvbnRyb2xsZXJzLnBvbGFyQXJlYSA9IENoYXJ0LkRhdGFzZXRDb250cm9sbGVyLmV4dGVuZCh7XG5cblx0XHRkYXRhRWxlbWVudFR5cGU6IGVsZW1lbnRzLkFyYyxcblxuXHRcdGxpbmtTY2FsZXM6IGhlbHBlcnMubm9vcCxcblxuXHRcdHVwZGF0ZTogZnVuY3Rpb24ocmVzZXQpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgZGF0YXNldCA9IG1lLmdldERhdGFzZXQoKTtcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdFx0dmFyIHN0YXJ0ID0gbWUuY2hhcnQub3B0aW9ucy5zdGFydEFuZ2xlIHx8IDA7XG5cdFx0XHR2YXIgc3RhcnRzID0gbWUuX3N0YXJ0cyA9IFtdO1xuXHRcdFx0dmFyIGFuZ2xlcyA9IG1lLl9hbmdsZXMgPSBbXTtcblx0XHRcdHZhciBpLCBpbGVuLCBhbmdsZTtcblxuXHRcdFx0bWUuX3VwZGF0ZVJhZGl1cygpO1xuXG5cdFx0XHRtZXRhLmNvdW50ID0gbWUuY291bnRWaXNpYmxlRWxlbWVudHMoKTtcblxuXHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IGRhdGFzZXQuZGF0YS5sZW5ndGg7IGkgPCBpbGVuOyBpKyspIHtcblx0XHRcdFx0c3RhcnRzW2ldID0gc3RhcnQ7XG5cdFx0XHRcdGFuZ2xlID0gbWUuX2NvbXB1dGVBbmdsZShpKTtcblx0XHRcdFx0YW5nbGVzW2ldID0gYW5nbGU7XG5cdFx0XHRcdHN0YXJ0ICs9IGFuZ2xlO1xuXHRcdFx0fVxuXG5cdFx0XHRoZWxwZXJzLmVhY2gobWV0YS5kYXRhLCBmdW5jdGlvbihhcmMsIGluZGV4KSB7XG5cdFx0XHRcdG1lLnVwZGF0ZUVsZW1lbnQoYXJjLCBpbmRleCwgcmVzZXQpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0X3VwZGF0ZVJhZGl1czogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0XHR2YXIgY2hhcnRBcmVhID0gY2hhcnQuY2hhcnRBcmVhO1xuXHRcdFx0dmFyIG9wdHMgPSBjaGFydC5vcHRpb25zO1xuXHRcdFx0dmFyIGFyY09wdHMgPSBvcHRzLmVsZW1lbnRzLmFyYztcblx0XHRcdHZhciBtaW5TaXplID0gTWF0aC5taW4oY2hhcnRBcmVhLnJpZ2h0IC0gY2hhcnRBcmVhLmxlZnQsIGNoYXJ0QXJlYS5ib3R0b20gLSBjaGFydEFyZWEudG9wKTtcblxuXHRcdFx0Y2hhcnQub3V0ZXJSYWRpdXMgPSBNYXRoLm1heCgobWluU2l6ZSAtIGFyY09wdHMuYm9yZGVyV2lkdGggLyAyKSAvIDIsIDApO1xuXHRcdFx0Y2hhcnQuaW5uZXJSYWRpdXMgPSBNYXRoLm1heChvcHRzLmN1dG91dFBlcmNlbnRhZ2UgPyAoY2hhcnQub3V0ZXJSYWRpdXMgLyAxMDApICogKG9wdHMuY3V0b3V0UGVyY2VudGFnZSkgOiAxLCAwKTtcblx0XHRcdGNoYXJ0LnJhZGl1c0xlbmd0aCA9IChjaGFydC5vdXRlclJhZGl1cyAtIGNoYXJ0LmlubmVyUmFkaXVzKSAvIGNoYXJ0LmdldFZpc2libGVEYXRhc2V0Q291bnQoKTtcblxuXHRcdFx0bWUub3V0ZXJSYWRpdXMgPSBjaGFydC5vdXRlclJhZGl1cyAtIChjaGFydC5yYWRpdXNMZW5ndGggKiBtZS5pbmRleCk7XG5cdFx0XHRtZS5pbm5lclJhZGl1cyA9IG1lLm91dGVyUmFkaXVzIC0gY2hhcnQucmFkaXVzTGVuZ3RoO1xuXHRcdH0sXG5cblx0XHR1cGRhdGVFbGVtZW50OiBmdW5jdGlvbihhcmMsIGluZGV4LCByZXNldCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XG5cdFx0XHR2YXIgb3B0cyA9IGNoYXJ0Lm9wdGlvbnM7XG5cdFx0XHR2YXIgYW5pbWF0aW9uT3B0cyA9IG9wdHMuYW5pbWF0aW9uO1xuXHRcdFx0dmFyIHNjYWxlID0gY2hhcnQuc2NhbGU7XG5cdFx0XHR2YXIgbGFiZWxzID0gY2hhcnQuZGF0YS5sYWJlbHM7XG5cblx0XHRcdHZhciBjZW50ZXJYID0gc2NhbGUueENlbnRlcjtcblx0XHRcdHZhciBjZW50ZXJZID0gc2NhbGUueUNlbnRlcjtcblxuXHRcdFx0Ly8gdmFyIG5lZ0hhbGZQSSA9IC0wLjUgKiBNYXRoLlBJO1xuXHRcdFx0dmFyIGRhdGFzZXRTdGFydEFuZ2xlID0gb3B0cy5zdGFydEFuZ2xlO1xuXHRcdFx0dmFyIGRpc3RhbmNlID0gYXJjLmhpZGRlbiA/IDAgOiBzY2FsZS5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZShkYXRhc2V0LmRhdGFbaW5kZXhdKTtcblx0XHRcdHZhciBzdGFydEFuZ2xlID0gbWUuX3N0YXJ0c1tpbmRleF07XG5cdFx0XHR2YXIgZW5kQW5nbGUgPSBzdGFydEFuZ2xlICsgKGFyYy5oaWRkZW4gPyAwIDogbWUuX2FuZ2xlc1tpbmRleF0pO1xuXG5cdFx0XHR2YXIgcmVzZXRSYWRpdXMgPSBhbmltYXRpb25PcHRzLmFuaW1hdGVTY2FsZSA/IDAgOiBzY2FsZS5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZShkYXRhc2V0LmRhdGFbaW5kZXhdKTtcblxuXHRcdFx0aGVscGVycy5leHRlbmQoYXJjLCB7XG5cdFx0XHRcdC8vIFV0aWxpdHlcblx0XHRcdFx0X2RhdGFzZXRJbmRleDogbWUuaW5kZXgsXG5cdFx0XHRcdF9pbmRleDogaW5kZXgsXG5cdFx0XHRcdF9zY2FsZTogc2NhbGUsXG5cblx0XHRcdFx0Ly8gRGVzaXJlZCB2aWV3IHByb3BlcnRpZXNcblx0XHRcdFx0X21vZGVsOiB7XG5cdFx0XHRcdFx0eDogY2VudGVyWCxcblx0XHRcdFx0XHR5OiBjZW50ZXJZLFxuXHRcdFx0XHRcdGlubmVyUmFkaXVzOiAwLFxuXHRcdFx0XHRcdG91dGVyUmFkaXVzOiByZXNldCA/IHJlc2V0UmFkaXVzIDogZGlzdGFuY2UsXG5cdFx0XHRcdFx0c3RhcnRBbmdsZTogcmVzZXQgJiYgYW5pbWF0aW9uT3B0cy5hbmltYXRlUm90YXRlID8gZGF0YXNldFN0YXJ0QW5nbGUgOiBzdGFydEFuZ2xlLFxuXHRcdFx0XHRcdGVuZEFuZ2xlOiByZXNldCAmJiBhbmltYXRpb25PcHRzLmFuaW1hdGVSb3RhdGUgPyBkYXRhc2V0U3RhcnRBbmdsZSA6IGVuZEFuZ2xlLFxuXHRcdFx0XHRcdGxhYmVsOiBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChsYWJlbHMsIGluZGV4LCBsYWJlbHNbaW5kZXhdKVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXBwbHkgYm9yZGVyIGFuZCBmaWxsIHN0eWxlXG5cdFx0XHR2YXIgZWxlbWVudE9wdHMgPSB0aGlzLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMuYXJjO1xuXHRcdFx0dmFyIGN1c3RvbSA9IGFyYy5jdXN0b20gfHwge307XG5cdFx0XHR2YXIgdmFsdWVPckRlZmF1bHQgPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdDtcblx0XHRcdHZhciBtb2RlbCA9IGFyYy5fbW9kZWw7XG5cblx0XHRcdG1vZGVsLmJhY2tncm91bmRDb2xvciA9IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgPyBjdXN0b20uYmFja2dyb3VuZENvbG9yIDogdmFsdWVPckRlZmF1bHQoZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IsIGluZGV4LCBlbGVtZW50T3B0cy5iYWNrZ3JvdW5kQ29sb3IpO1xuXHRcdFx0bW9kZWwuYm9yZGVyQ29sb3IgPSBjdXN0b20uYm9yZGVyQ29sb3IgPyBjdXN0b20uYm9yZGVyQ29sb3IgOiB2YWx1ZU9yRGVmYXVsdChkYXRhc2V0LmJvcmRlckNvbG9yLCBpbmRleCwgZWxlbWVudE9wdHMuYm9yZGVyQ29sb3IpO1xuXHRcdFx0bW9kZWwuYm9yZGVyV2lkdGggPSBjdXN0b20uYm9yZGVyV2lkdGggPyBjdXN0b20uYm9yZGVyV2lkdGggOiB2YWx1ZU9yRGVmYXVsdChkYXRhc2V0LmJvcmRlcldpZHRoLCBpbmRleCwgZWxlbWVudE9wdHMuYm9yZGVyV2lkdGgpO1xuXG5cdFx0XHRhcmMucGl2b3QoKTtcblx0XHR9LFxuXG5cdFx0Y291bnRWaXNpYmxlRWxlbWVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRhdGFzZXQgPSB0aGlzLmdldERhdGFzZXQoKTtcblx0XHRcdHZhciBtZXRhID0gdGhpcy5nZXRNZXRhKCk7XG5cdFx0XHR2YXIgY291bnQgPSAwO1xuXG5cdFx0XHRoZWxwZXJzLmVhY2gobWV0YS5kYXRhLCBmdW5jdGlvbihlbGVtZW50LCBpbmRleCkge1xuXHRcdFx0XHRpZiAoIWlzTmFOKGRhdGFzZXQuZGF0YVtpbmRleF0pICYmICFlbGVtZW50LmhpZGRlbikge1xuXHRcdFx0XHRcdGNvdW50Kys7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gY291bnQ7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0X2NvbXB1dGVBbmdsZTogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgY291bnQgPSB0aGlzLmdldE1ldGEoKS5jb3VudDtcblx0XHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XG5cblx0XHRcdGlmIChpc05hTihkYXRhc2V0LmRhdGFbaW5kZXhdKSB8fCBtZXRhLmRhdGFbaW5kZXhdLmhpZGRlbikge1xuXHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2NyaXB0YWJsZSBvcHRpb25zXG5cdFx0XHR2YXIgY29udGV4dCA9IHtcblx0XHRcdFx0Y2hhcnQ6IG1lLmNoYXJ0LFxuXHRcdFx0XHRkYXRhSW5kZXg6IGluZGV4LFxuXHRcdFx0XHRkYXRhc2V0OiBkYXRhc2V0LFxuXHRcdFx0XHRkYXRhc2V0SW5kZXg6IG1lLmluZGV4XG5cdFx0XHR9O1xuXG5cdFx0XHRyZXR1cm4gaGVscGVycy5vcHRpb25zLnJlc29sdmUoW1xuXHRcdFx0XHRtZS5jaGFydC5vcHRpb25zLmVsZW1lbnRzLmFyYy5hbmdsZSxcblx0XHRcdFx0KDIgKiBNYXRoLlBJKSAvIGNvdW50XG5cdFx0XHRdLCBjb250ZXh0LCBpbmRleCk7XG5cdFx0fVxuXHR9KTtcbn07XG5cbn0se1wiMjZcIjoyNixcIjQxXCI6NDEsXCI0NlwiOjQ2fV0sMjA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBlbGVtZW50cyA9IHJlcXVpcmUoNDEpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxuZGVmYXVsdHMuX3NldCgncmFkYXInLCB7XG5cdHNjYWxlOiB7XG5cdFx0dHlwZTogJ3JhZGlhbExpbmVhcidcblx0fSxcblx0ZWxlbWVudHM6IHtcblx0XHRsaW5lOiB7XG5cdFx0XHR0ZW5zaW9uOiAwIC8vIG5vIGJlemllciBpbiByYWRhclxuXHRcdH1cblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHRDaGFydC5jb250cm9sbGVycy5yYWRhciA9IENoYXJ0LkRhdGFzZXRDb250cm9sbGVyLmV4dGVuZCh7XG5cblx0XHRkYXRhc2V0RWxlbWVudFR5cGU6IGVsZW1lbnRzLkxpbmUsXG5cblx0XHRkYXRhRWxlbWVudFR5cGU6IGVsZW1lbnRzLlBvaW50LFxuXG5cdFx0bGlua1NjYWxlczogaGVscGVycy5ub29wLFxuXG5cdFx0dXBkYXRlOiBmdW5jdGlvbihyZXNldCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdFx0dmFyIGxpbmUgPSBtZXRhLmRhdGFzZXQ7XG5cdFx0XHR2YXIgcG9pbnRzID0gbWV0YS5kYXRhO1xuXHRcdFx0dmFyIGN1c3RvbSA9IGxpbmUuY3VzdG9tIHx8IHt9O1xuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XG5cdFx0XHR2YXIgbGluZUVsZW1lbnRPcHRpb25zID0gbWUuY2hhcnQub3B0aW9ucy5lbGVtZW50cy5saW5lO1xuXHRcdFx0dmFyIHNjYWxlID0gbWUuY2hhcnQuc2NhbGU7XG5cblx0XHRcdC8vIENvbXBhdGliaWxpdHk6IElmIHRoZSBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIHdpdGggb25seSB0aGUgb2xkIG5hbWUsIHVzZSB0aG9zZSB2YWx1ZXNcblx0XHRcdGlmICgoZGF0YXNldC50ZW5zaW9uICE9PSB1bmRlZmluZWQpICYmIChkYXRhc2V0LmxpbmVUZW5zaW9uID09PSB1bmRlZmluZWQpKSB7XG5cdFx0XHRcdGRhdGFzZXQubGluZVRlbnNpb24gPSBkYXRhc2V0LnRlbnNpb247XG5cdFx0XHR9XG5cblx0XHRcdGhlbHBlcnMuZXh0ZW5kKG1ldGEuZGF0YXNldCwge1xuXHRcdFx0XHQvLyBVdGlsaXR5XG5cdFx0XHRcdF9kYXRhc2V0SW5kZXg6IG1lLmluZGV4LFxuXHRcdFx0XHRfc2NhbGU6IHNjYWxlLFxuXHRcdFx0XHQvLyBEYXRhXG5cdFx0XHRcdF9jaGlsZHJlbjogcG9pbnRzLFxuXHRcdFx0XHRfbG9vcDogdHJ1ZSxcblx0XHRcdFx0Ly8gTW9kZWxcblx0XHRcdFx0X21vZGVsOiB7XG5cdFx0XHRcdFx0Ly8gQXBwZWFyYW5jZVxuXHRcdFx0XHRcdHRlbnNpb246IGN1c3RvbS50ZW5zaW9uID8gY3VzdG9tLnRlbnNpb24gOiBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KGRhdGFzZXQubGluZVRlbnNpb24sIGxpbmVFbGVtZW50T3B0aW9ucy50ZW5zaW9uKSxcblx0XHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgPyBjdXN0b20uYmFja2dyb3VuZENvbG9yIDogKGRhdGFzZXQuYmFja2dyb3VuZENvbG9yIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IpLFxuXHRcdFx0XHRcdGJvcmRlcldpZHRoOiBjdXN0b20uYm9yZGVyV2lkdGggPyBjdXN0b20uYm9yZGVyV2lkdGggOiAoZGF0YXNldC5ib3JkZXJXaWR0aCB8fCBsaW5lRWxlbWVudE9wdGlvbnMuYm9yZGVyV2lkdGgpLFxuXHRcdFx0XHRcdGJvcmRlckNvbG9yOiBjdXN0b20uYm9yZGVyQ29sb3IgPyBjdXN0b20uYm9yZGVyQ29sb3IgOiAoZGF0YXNldC5ib3JkZXJDb2xvciB8fCBsaW5lRWxlbWVudE9wdGlvbnMuYm9yZGVyQ29sb3IpLFxuXHRcdFx0XHRcdGZpbGw6IGN1c3RvbS5maWxsID8gY3VzdG9tLmZpbGwgOiAoZGF0YXNldC5maWxsICE9PSB1bmRlZmluZWQgPyBkYXRhc2V0LmZpbGwgOiBsaW5lRWxlbWVudE9wdGlvbnMuZmlsbCksXG5cdFx0XHRcdFx0Ym9yZGVyQ2FwU3R5bGU6IGN1c3RvbS5ib3JkZXJDYXBTdHlsZSA/IGN1c3RvbS5ib3JkZXJDYXBTdHlsZSA6IChkYXRhc2V0LmJvcmRlckNhcFN0eWxlIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJDYXBTdHlsZSksXG5cdFx0XHRcdFx0Ym9yZGVyRGFzaDogY3VzdG9tLmJvcmRlckRhc2ggPyBjdXN0b20uYm9yZGVyRGFzaCA6IChkYXRhc2V0LmJvcmRlckRhc2ggfHwgbGluZUVsZW1lbnRPcHRpb25zLmJvcmRlckRhc2gpLFxuXHRcdFx0XHRcdGJvcmRlckRhc2hPZmZzZXQ6IGN1c3RvbS5ib3JkZXJEYXNoT2Zmc2V0ID8gY3VzdG9tLmJvcmRlckRhc2hPZmZzZXQgOiAoZGF0YXNldC5ib3JkZXJEYXNoT2Zmc2V0IHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJEYXNoT2Zmc2V0KSxcblx0XHRcdFx0XHRib3JkZXJKb2luU3R5bGU6IGN1c3RvbS5ib3JkZXJKb2luU3R5bGUgPyBjdXN0b20uYm9yZGVySm9pblN0eWxlIDogKGRhdGFzZXQuYm9yZGVySm9pblN0eWxlIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJKb2luU3R5bGUpLFxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0bWV0YS5kYXRhc2V0LnBpdm90KCk7XG5cblx0XHRcdC8vIFVwZGF0ZSBQb2ludHNcblx0XHRcdGhlbHBlcnMuZWFjaChwb2ludHMsIGZ1bmN0aW9uKHBvaW50LCBpbmRleCkge1xuXHRcdFx0XHRtZS51cGRhdGVFbGVtZW50KHBvaW50LCBpbmRleCwgcmVzZXQpO1xuXHRcdFx0fSwgbWUpO1xuXG5cdFx0XHQvLyBVcGRhdGUgYmV6aWVyIGNvbnRyb2wgcG9pbnRzXG5cdFx0XHRtZS51cGRhdGVCZXppZXJDb250cm9sUG9pbnRzKCk7XG5cdFx0fSxcblx0XHR1cGRhdGVFbGVtZW50OiBmdW5jdGlvbihwb2ludCwgaW5kZXgsIHJlc2V0KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGN1c3RvbSA9IHBvaW50LmN1c3RvbSB8fCB7fTtcblx0XHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xuXHRcdFx0dmFyIHNjYWxlID0gbWUuY2hhcnQuc2NhbGU7XG5cdFx0XHR2YXIgcG9pbnRFbGVtZW50T3B0aW9ucyA9IG1lLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQ7XG5cdFx0XHR2YXIgcG9pbnRQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZShpbmRleCwgZGF0YXNldC5kYXRhW2luZGV4XSk7XG5cblx0XHRcdC8vIENvbXBhdGliaWxpdHk6IElmIHRoZSBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIHdpdGggb25seSB0aGUgb2xkIG5hbWUsIHVzZSB0aG9zZSB2YWx1ZXNcblx0XHRcdGlmICgoZGF0YXNldC5yYWRpdXMgIT09IHVuZGVmaW5lZCkgJiYgKGRhdGFzZXQucG9pbnRSYWRpdXMgPT09IHVuZGVmaW5lZCkpIHtcblx0XHRcdFx0ZGF0YXNldC5wb2ludFJhZGl1cyA9IGRhdGFzZXQucmFkaXVzO1xuXHRcdFx0fVxuXHRcdFx0aWYgKChkYXRhc2V0LmhpdFJhZGl1cyAhPT0gdW5kZWZpbmVkKSAmJiAoZGF0YXNldC5wb2ludEhpdFJhZGl1cyA9PT0gdW5kZWZpbmVkKSkge1xuXHRcdFx0XHRkYXRhc2V0LnBvaW50SGl0UmFkaXVzID0gZGF0YXNldC5oaXRSYWRpdXM7XG5cdFx0XHR9XG5cblx0XHRcdGhlbHBlcnMuZXh0ZW5kKHBvaW50LCB7XG5cdFx0XHRcdC8vIFV0aWxpdHlcblx0XHRcdFx0X2RhdGFzZXRJbmRleDogbWUuaW5kZXgsXG5cdFx0XHRcdF9pbmRleDogaW5kZXgsXG5cdFx0XHRcdF9zY2FsZTogc2NhbGUsXG5cblx0XHRcdFx0Ly8gRGVzaXJlZCB2aWV3IHByb3BlcnRpZXNcblx0XHRcdFx0X21vZGVsOiB7XG5cdFx0XHRcdFx0eDogcmVzZXQgPyBzY2FsZS54Q2VudGVyIDogcG9pbnRQb3NpdGlvbi54LCAvLyB2YWx1ZSBub3QgdXNlZCBpbiBkYXRhc2V0IHNjYWxlLCBidXQgd2Ugd2FudCBhIGNvbnNpc3RlbnQgQVBJIGJldHdlZW4gc2NhbGVzXG5cdFx0XHRcdFx0eTogcmVzZXQgPyBzY2FsZS55Q2VudGVyIDogcG9pbnRQb3NpdGlvbi55LFxuXG5cdFx0XHRcdFx0Ly8gQXBwZWFyYW5jZVxuXHRcdFx0XHRcdHRlbnNpb246IGN1c3RvbS50ZW5zaW9uID8gY3VzdG9tLnRlbnNpb24gOiBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KGRhdGFzZXQubGluZVRlbnNpb24sIG1lLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMubGluZS50ZW5zaW9uKSxcblx0XHRcdFx0XHRyYWRpdXM6IGN1c3RvbS5yYWRpdXMgPyBjdXN0b20ucmFkaXVzIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludFJhZGl1cywgaW5kZXgsIHBvaW50RWxlbWVudE9wdGlvbnMucmFkaXVzKSxcblx0XHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgPyBjdXN0b20uYmFja2dyb3VuZENvbG9yIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEJhY2tncm91bmRDb2xvciwgaW5kZXgsIHBvaW50RWxlbWVudE9wdGlvbnMuYmFja2dyb3VuZENvbG9yKSxcblx0XHRcdFx0XHRib3JkZXJDb2xvcjogY3VzdG9tLmJvcmRlckNvbG9yID8gY3VzdG9tLmJvcmRlckNvbG9yIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEJvcmRlckNvbG9yLCBpbmRleCwgcG9pbnRFbGVtZW50T3B0aW9ucy5ib3JkZXJDb2xvciksXG5cdFx0XHRcdFx0Ym9yZGVyV2lkdGg6IGN1c3RvbS5ib3JkZXJXaWR0aCA/IGN1c3RvbS5ib3JkZXJXaWR0aCA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRCb3JkZXJXaWR0aCwgaW5kZXgsIHBvaW50RWxlbWVudE9wdGlvbnMuYm9yZGVyV2lkdGgpLFxuXHRcdFx0XHRcdHBvaW50U3R5bGU6IGN1c3RvbS5wb2ludFN0eWxlID8gY3VzdG9tLnBvaW50U3R5bGUgOiBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50U3R5bGUsIGluZGV4LCBwb2ludEVsZW1lbnRPcHRpb25zLnBvaW50U3R5bGUpLFxuXHRcdFx0XHRcdHJvdGF0aW9uOiBjdXN0b20ucm90YXRpb24gPyBjdXN0b20ucm90YXRpb24gOiBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50Um90YXRpb24sIGluZGV4LCBwb2ludEVsZW1lbnRPcHRpb25zLnJvdGF0aW9uKSxcblxuXHRcdFx0XHRcdC8vIFRvb2x0aXBcblx0XHRcdFx0XHRoaXRSYWRpdXM6IGN1c3RvbS5oaXRSYWRpdXMgPyBjdXN0b20uaGl0UmFkaXVzIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEhpdFJhZGl1cywgaW5kZXgsIHBvaW50RWxlbWVudE9wdGlvbnMuaGl0UmFkaXVzKVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0cG9pbnQuX21vZGVsLnNraXAgPSBjdXN0b20uc2tpcCA/IGN1c3RvbS5za2lwIDogKGlzTmFOKHBvaW50Ll9tb2RlbC54KSB8fCBpc05hTihwb2ludC5fbW9kZWwueSkpO1xuXHRcdH0sXG5cdFx0dXBkYXRlQmV6aWVyQ29udHJvbFBvaW50czogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgY2hhcnRBcmVhID0gdGhpcy5jaGFydC5jaGFydEFyZWE7XG5cdFx0XHR2YXIgbWV0YSA9IHRoaXMuZ2V0TWV0YSgpO1xuXG5cdFx0XHRoZWxwZXJzLmVhY2gobWV0YS5kYXRhLCBmdW5jdGlvbihwb2ludCwgaW5kZXgpIHtcblx0XHRcdFx0dmFyIG1vZGVsID0gcG9pbnQuX21vZGVsO1xuXHRcdFx0XHR2YXIgY29udHJvbFBvaW50cyA9IGhlbHBlcnMuc3BsaW5lQ3VydmUoXG5cdFx0XHRcdFx0aGVscGVycy5wcmV2aW91c0l0ZW0obWV0YS5kYXRhLCBpbmRleCwgdHJ1ZSkuX21vZGVsLFxuXHRcdFx0XHRcdG1vZGVsLFxuXHRcdFx0XHRcdGhlbHBlcnMubmV4dEl0ZW0obWV0YS5kYXRhLCBpbmRleCwgdHJ1ZSkuX21vZGVsLFxuXHRcdFx0XHRcdG1vZGVsLnRlbnNpb25cblx0XHRcdFx0KTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IHRoZSBiZXppZXIgZ29pbmcgb3V0c2lkZSBvZiB0aGUgYm91bmRzIG9mIHRoZSBncmFwaFxuXHRcdFx0XHRtb2RlbC5jb250cm9sUG9pbnRQcmV2aW91c1ggPSBNYXRoLm1heChNYXRoLm1pbihjb250cm9sUG9pbnRzLnByZXZpb3VzLngsIGNoYXJ0QXJlYS5yaWdodCksIGNoYXJ0QXJlYS5sZWZ0KTtcblx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNZID0gTWF0aC5tYXgoTWF0aC5taW4oY29udHJvbFBvaW50cy5wcmV2aW91cy55LCBjaGFydEFyZWEuYm90dG9tKSwgY2hhcnRBcmVhLnRvcCk7XG5cblx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50TmV4dFggPSBNYXRoLm1heChNYXRoLm1pbihjb250cm9sUG9pbnRzLm5leHQueCwgY2hhcnRBcmVhLnJpZ2h0KSwgY2hhcnRBcmVhLmxlZnQpO1xuXHRcdFx0XHRtb2RlbC5jb250cm9sUG9pbnROZXh0WSA9IE1hdGgubWF4KE1hdGgubWluKGNvbnRyb2xQb2ludHMubmV4dC55LCBjaGFydEFyZWEuYm90dG9tKSwgY2hhcnRBcmVhLnRvcCk7XG5cblx0XHRcdFx0Ly8gTm93IHBpdm90IHRoZSBwb2ludCBmb3IgYW5pbWF0aW9uXG5cdFx0XHRcdHBvaW50LnBpdm90KCk7XG5cdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0c2V0SG92ZXJTdHlsZTogZnVuY3Rpb24ocG9pbnQpIHtcblx0XHRcdC8vIFBvaW50XG5cdFx0XHR2YXIgZGF0YXNldCA9IHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1twb2ludC5fZGF0YXNldEluZGV4XTtcblx0XHRcdHZhciBjdXN0b20gPSBwb2ludC5jdXN0b20gfHwge307XG5cdFx0XHR2YXIgaW5kZXggPSBwb2ludC5faW5kZXg7XG5cdFx0XHR2YXIgbW9kZWwgPSBwb2ludC5fbW9kZWw7XG5cblx0XHRcdHBvaW50LiRwcmV2aW91c1N0eWxlID0ge1xuXHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcblx0XHRcdFx0Ym9yZGVyQ29sb3I6IG1vZGVsLmJvcmRlckNvbG9yLFxuXHRcdFx0XHRib3JkZXJXaWR0aDogbW9kZWwuYm9yZGVyV2lkdGgsXG5cdFx0XHRcdHJhZGl1czogbW9kZWwucmFkaXVzXG5cdFx0XHR9O1xuXG5cdFx0XHRtb2RlbC5yYWRpdXMgPSBjdXN0b20uaG92ZXJSYWRpdXMgPyBjdXN0b20uaG92ZXJSYWRpdXMgOiBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50SG92ZXJSYWRpdXMsIGluZGV4LCB0aGlzLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQuaG92ZXJSYWRpdXMpO1xuXHRcdFx0bW9kZWwuYmFja2dyb3VuZENvbG9yID0gY3VzdG9tLmhvdmVyQmFja2dyb3VuZENvbG9yID8gY3VzdG9tLmhvdmVyQmFja2dyb3VuZENvbG9yIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEhvdmVyQmFja2dyb3VuZENvbG9yLCBpbmRleCwgaGVscGVycy5nZXRIb3ZlckNvbG9yKG1vZGVsLmJhY2tncm91bmRDb2xvcikpO1xuXHRcdFx0bW9kZWwuYm9yZGVyQ29sb3IgPSBjdXN0b20uaG92ZXJCb3JkZXJDb2xvciA/IGN1c3RvbS5ob3ZlckJvcmRlckNvbG9yIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEhvdmVyQm9yZGVyQ29sb3IsIGluZGV4LCBoZWxwZXJzLmdldEhvdmVyQ29sb3IobW9kZWwuYm9yZGVyQ29sb3IpKTtcblx0XHRcdG1vZGVsLmJvcmRlcldpZHRoID0gY3VzdG9tLmhvdmVyQm9yZGVyV2lkdGggPyBjdXN0b20uaG92ZXJCb3JkZXJXaWR0aCA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRIb3ZlckJvcmRlcldpZHRoLCBpbmRleCwgbW9kZWwuYm9yZGVyV2lkdGgpO1xuXHRcdH0sXG5cdH0pO1xufTtcblxufSx7XCIyNlwiOjI2LFwiNDFcIjo0MSxcIjQ2XCI6NDZ9XSwyMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xuXG5kZWZhdWx0cy5fc2V0KCdzY2F0dGVyJywge1xuXHRob3Zlcjoge1xuXHRcdG1vZGU6ICdzaW5nbGUnXG5cdH0sXG5cblx0c2NhbGVzOiB7XG5cdFx0eEF4ZXM6IFt7XG5cdFx0XHRpZDogJ3gtYXhpcy0xJywgICAgLy8gbmVlZCBhbiBJRCBzbyBkYXRhc2V0cyBjYW4gcmVmZXJlbmNlIHRoZSBzY2FsZVxuXHRcdFx0dHlwZTogJ2xpbmVhcicsICAgIC8vIHNjYXR0ZXIgc2hvdWxkIG5vdCB1c2UgYSBjYXRlZ29yeSBheGlzXG5cdFx0XHRwb3NpdGlvbjogJ2JvdHRvbSdcblx0XHR9XSxcblx0XHR5QXhlczogW3tcblx0XHRcdGlkOiAneS1heGlzLTEnLFxuXHRcdFx0dHlwZTogJ2xpbmVhcicsXG5cdFx0XHRwb3NpdGlvbjogJ2xlZnQnXG5cdFx0fV1cblx0fSxcblxuXHRzaG93TGluZXM6IGZhbHNlLFxuXG5cdHRvb2x0aXBzOiB7XG5cdFx0Y2FsbGJhY2tzOiB7XG5cdFx0XHR0aXRsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAnJzsgICAgIC8vIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igc2NhdHRlciBzaW5jZSBkYXRhIGFyZSBmb3JtYXR0ZWQgYXMgYSBwb2ludFxuXHRcdFx0fSxcblx0XHRcdGxhYmVsOiBmdW5jdGlvbihpdGVtKSB7XG5cdFx0XHRcdHJldHVybiAnKCcgKyBpdGVtLnhMYWJlbCArICcsICcgKyBpdGVtLnlMYWJlbCArICcpJztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0Ly8gU2NhdHRlciBjaGFydHMgdXNlIGxpbmUgY29udHJvbGxlcnNcblx0Q2hhcnQuY29udHJvbGxlcnMuc2NhdHRlciA9IENoYXJ0LmNvbnRyb2xsZXJzLmxpbmU7XG5cbn07XG5cbn0se1wiMjZcIjoyNn1dLDIyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIEVsZW1lbnQgPSByZXF1aXJlKDI3KTtcblxudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IEVsZW1lbnQuZXh0ZW5kKHtcblx0Y2hhcnQ6IG51bGwsIC8vIHRoZSBhbmltYXRpb24gYXNzb2NpYXRlZCBjaGFydCBpbnN0YW5jZVxuXHRjdXJyZW50U3RlcDogMCwgLy8gdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHN0ZXBcblx0bnVtU3RlcHM6IDYwLCAvLyBkZWZhdWx0IG51bWJlciBvZiBzdGVwc1xuXHRlYXNpbmc6ICcnLCAvLyB0aGUgZWFzaW5nIHRvIHVzZSBmb3IgdGhpcyBhbmltYXRpb25cblx0cmVuZGVyOiBudWxsLCAvLyByZW5kZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgYW5pbWF0aW9uIHNlcnZpY2VcblxuXHRvbkFuaW1hdGlvblByb2dyZXNzOiBudWxsLCAvLyB1c2VyIHNwZWNpZmllZCBjYWxsYmFjayB0byBmaXJlIG9uIGVhY2ggc3RlcCBvZiB0aGUgYW5pbWF0aW9uXG5cdG9uQW5pbWF0aW9uQ29tcGxldGU6IG51bGwsIC8vIHVzZXIgc3BlY2lmaWVkIGNhbGxiYWNrIHRvIGZpcmUgd2hlbiB0aGUgYW5pbWF0aW9uIGZpbmlzaGVzXG59KTtcblxuLy8gREVQUkVDQVRJT05TXG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5BbmltYXRpb24gaW5zdGVhZFxuICogQHByb3AgQ2hhcnQuQW5pbWF0aW9uI2FuaW1hdGlvbk9iamVjdFxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjYuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cy5wcm90b3R5cGUsICdhbmltYXRpb25PYmplY3QnLCB7XG5cdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQuQW5pbWF0aW9uI2NoYXJ0IGluc3RlYWRcbiAqIEBwcm9wIENoYXJ0LkFuaW1hdGlvbiNjaGFydEluc3RhbmNlXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNi4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLnByb3RvdHlwZSwgJ2NoYXJ0SW5zdGFuY2UnLCB7XG5cdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuY2hhcnQ7XG5cdH0sXG5cdHNldDogZnVuY3Rpb24odmFsdWUpIHtcblx0XHR0aGlzLmNoYXJ0ID0gdmFsdWU7XG5cdH1cbn0pO1xuXG59LHtcIjI3XCI6Mjd9XSwyMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4vKiBnbG9iYWwgd2luZG93OiBmYWxzZSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG5cbmRlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcblx0YW5pbWF0aW9uOiB7XG5cdFx0ZHVyYXRpb246IDEwMDAsXG5cdFx0ZWFzaW5nOiAnZWFzZU91dFF1YXJ0Jyxcblx0XHRvblByb2dyZXNzOiBoZWxwZXJzLm5vb3AsXG5cdFx0b25Db21wbGV0ZTogaGVscGVycy5ub29wXG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0ZnJhbWVEdXJhdGlvbjogMTcsXG5cdGFuaW1hdGlvbnM6IFtdLFxuXHRkcm9wRnJhbWVzOiAwLFxuXHRyZXF1ZXN0OiBudWxsLFxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIFRoZSBjaGFydCB0byBhbmltYXRlLlxuXHQgKiBAcGFyYW0ge0NoYXJ0LkFuaW1hdGlvbn0gYW5pbWF0aW9uIC0gVGhlIGFuaW1hdGlvbiB0aGF0IHdlIHdpbGwgYW5pbWF0ZS5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpbiBtcy5cblx0ICogQHBhcmFtIHtCb29sZWFufSBsYXp5IC0gaWYgdHJ1ZSwgdGhlIGNoYXJ0IGlzIG5vdCBtYXJrZWQgYXMgYW5pbWF0aW5nIHRvIGVuYWJsZSBtb3JlIHJlc3BvbnNpdmUgaW50ZXJhY3Rpb25zXG5cdCAqL1xuXHRhZGRBbmltYXRpb246IGZ1bmN0aW9uKGNoYXJ0LCBhbmltYXRpb24sIGR1cmF0aW9uLCBsYXp5KSB7XG5cdFx0dmFyIGFuaW1hdGlvbnMgPSB0aGlzLmFuaW1hdGlvbnM7XG5cdFx0dmFyIGksIGlsZW47XG5cblx0XHRhbmltYXRpb24uY2hhcnQgPSBjaGFydDtcblxuXHRcdGlmICghbGF6eSkge1xuXHRcdFx0Y2hhcnQuYW5pbWF0aW5nID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gYW5pbWF0aW9ucy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdGlmIChhbmltYXRpb25zW2ldLmNoYXJ0ID09PSBjaGFydCkge1xuXHRcdFx0XHRhbmltYXRpb25zW2ldID0gYW5pbWF0aW9uO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YW5pbWF0aW9ucy5wdXNoKGFuaW1hdGlvbik7XG5cblx0XHQvLyBJZiB0aGVyZSBhcmUgbm8gYW5pbWF0aW9ucyBxdWV1ZWQsIG1hbnVhbGx5IGtpY2tzdGFydCBhIGRpZ2VzdCwgZm9yIGxhY2sgb2YgYSBiZXR0ZXIgd29yZFxuXHRcdGlmIChhbmltYXRpb25zLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0dGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKTtcblx0XHR9XG5cdH0sXG5cblx0Y2FuY2VsQW5pbWF0aW9uOiBmdW5jdGlvbihjaGFydCkge1xuXHRcdHZhciBpbmRleCA9IGhlbHBlcnMuZmluZEluZGV4KHRoaXMuYW5pbWF0aW9ucywgZnVuY3Rpb24oYW5pbWF0aW9uKSB7XG5cdFx0XHRyZXR1cm4gYW5pbWF0aW9uLmNoYXJ0ID09PSBjaGFydDtcblx0XHR9KTtcblxuXHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdHRoaXMuYW5pbWF0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0Y2hhcnQuYW5pbWF0aW5nID0gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXG5cdHJlcXVlc3RBbmltYXRpb25GcmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHRpZiAobWUucmVxdWVzdCA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gU2tpcCBhbmltYXRpb24gZnJhbWUgcmVxdWVzdHMgdW50aWwgdGhlIGFjdGl2ZSBvbmUgaXMgZXhlY3V0ZWQuXG5cdFx0XHQvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBwcm9jZXNzaW5nIG1vdXNlIGV2ZW50cywgZS5nLiAnbW91c2Vtb3ZlJ1xuXHRcdFx0Ly8gYW5kICdtb3VzZW91dCcgZXZlbnRzIHdpbGwgdHJpZ2dlciBtdWx0aXBsZSByZW5kZXJzLlxuXHRcdFx0bWUucmVxdWVzdCA9IGhlbHBlcnMucmVxdWVzdEFuaW1GcmFtZS5jYWxsKHdpbmRvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdG1lLnJlcXVlc3QgPSBudWxsO1xuXHRcdFx0XHRtZS5zdGFydERpZ2VzdCgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0c3RhcnREaWdlc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cdFx0dmFyIGZyYW1lc1RvRHJvcCA9IDA7XG5cblx0XHRpZiAobWUuZHJvcEZyYW1lcyA+IDEpIHtcblx0XHRcdGZyYW1lc1RvRHJvcCA9IE1hdGguZmxvb3IobWUuZHJvcEZyYW1lcyk7XG5cdFx0XHRtZS5kcm9wRnJhbWVzID0gbWUuZHJvcEZyYW1lcyAlIDE7XG5cdFx0fVxuXG5cdFx0bWUuYWR2YW5jZSgxICsgZnJhbWVzVG9Ecm9wKTtcblxuXHRcdHZhciBlbmRUaW1lID0gRGF0ZS5ub3coKTtcblxuXHRcdG1lLmRyb3BGcmFtZXMgKz0gKGVuZFRpbWUgLSBzdGFydFRpbWUpIC8gbWUuZnJhbWVEdXJhdGlvbjtcblxuXHRcdC8vIERvIHdlIGhhdmUgbW9yZSBzdHVmZiB0byBhbmltYXRlP1xuXHRcdGlmIChtZS5hbmltYXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdG1lLnJlcXVlc3RBbmltYXRpb25GcmFtZSgpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFkdmFuY2U6IGZ1bmN0aW9uKGNvdW50KSB7XG5cdFx0dmFyIGFuaW1hdGlvbnMgPSB0aGlzLmFuaW1hdGlvbnM7XG5cdFx0dmFyIGFuaW1hdGlvbiwgY2hhcnQ7XG5cdFx0dmFyIGkgPSAwO1xuXG5cdFx0d2hpbGUgKGkgPCBhbmltYXRpb25zLmxlbmd0aCkge1xuXHRcdFx0YW5pbWF0aW9uID0gYW5pbWF0aW9uc1tpXTtcblx0XHRcdGNoYXJ0ID0gYW5pbWF0aW9uLmNoYXJ0O1xuXG5cdFx0XHRhbmltYXRpb24uY3VycmVudFN0ZXAgPSAoYW5pbWF0aW9uLmN1cnJlbnRTdGVwIHx8IDApICsgY291bnQ7XG5cdFx0XHRhbmltYXRpb24uY3VycmVudFN0ZXAgPSBNYXRoLm1pbihhbmltYXRpb24uY3VycmVudFN0ZXAsIGFuaW1hdGlvbi5udW1TdGVwcyk7XG5cblx0XHRcdGhlbHBlcnMuY2FsbGJhY2soYW5pbWF0aW9uLnJlbmRlciwgW2NoYXJ0LCBhbmltYXRpb25dLCBjaGFydCk7XG5cdFx0XHRoZWxwZXJzLmNhbGxiYWNrKGFuaW1hdGlvbi5vbkFuaW1hdGlvblByb2dyZXNzLCBbYW5pbWF0aW9uXSwgY2hhcnQpO1xuXG5cdFx0XHRpZiAoYW5pbWF0aW9uLmN1cnJlbnRTdGVwID49IGFuaW1hdGlvbi5udW1TdGVwcykge1xuXHRcdFx0XHRoZWxwZXJzLmNhbGxiYWNrKGFuaW1hdGlvbi5vbkFuaW1hdGlvbkNvbXBsZXRlLCBbYW5pbWF0aW9uXSwgY2hhcnQpO1xuXHRcdFx0XHRjaGFydC5hbmltYXRpbmcgPSBmYWxzZTtcblx0XHRcdFx0YW5pbWF0aW9ucy5zcGxpY2UoaSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQrK2k7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG59LHtcIjI2XCI6MjYsXCI0NlwiOjQ2fV0sMjQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQW5pbWF0aW9uID0gcmVxdWlyZSgyMik7XG52YXIgYW5pbWF0aW9ucyA9IHJlcXVpcmUoMjMpO1xudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xudmFyIEludGVyYWN0aW9uID0gcmVxdWlyZSgyOSk7XG52YXIgbGF5b3V0cyA9IHJlcXVpcmUoMzEpO1xudmFyIHBsYXRmb3JtID0gcmVxdWlyZSg0OSk7XG52YXIgcGx1Z2lucyA9IHJlcXVpcmUoMzIpO1xudmFyIHNjYWxlU2VydmljZSA9IHJlcXVpcmUoMzQpO1xudmFyIFRvb2x0aXAgPSByZXF1aXJlKDM2KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xuXG5cdC8vIENyZWF0ZSBhIGRpY3Rpb25hcnkgb2YgY2hhcnQgdHlwZXMsIHRvIGFsbG93IGZvciBleHRlbnNpb24gb2YgZXhpc3RpbmcgdHlwZXNcblx0Q2hhcnQudHlwZXMgPSB7fTtcblxuXHQvLyBTdG9yZSBhIHJlZmVyZW5jZSB0byBlYWNoIGluc3RhbmNlIC0gYWxsb3dpbmcgdXMgdG8gZ2xvYmFsbHkgcmVzaXplIGNoYXJ0IGluc3RhbmNlcyBvbiB3aW5kb3cgcmVzaXplLlxuXHQvLyBEZXN0cm95IG1ldGhvZCBvbiB0aGUgY2hhcnQgd2lsbCByZW1vdmUgdGhlIGluc3RhbmNlIG9mIHRoZSBjaGFydCBmcm9tIHRoaXMgcmVmZXJlbmNlLlxuXHRDaGFydC5pbnN0YW5jZXMgPSB7fTtcblxuXHQvLyBDb250cm9sbGVycyBhdmFpbGFibGUgZm9yIGRhdGFzZXQgdmlzdWFsaXphdGlvbiBlZy4gYmFyLCBsaW5lLCBzbGljZSwgZXRjLlxuXHRDaGFydC5jb250cm9sbGVycyA9IHt9O1xuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyB0aGUgZ2l2ZW4gY29uZmlnIHdpdGggZ2xvYmFsIGFuZCBjaGFydCBkZWZhdWx0IHZhbHVlcy5cblx0ICovXG5cdGZ1bmN0aW9uIGluaXRDb25maWcoY29uZmlnKSB7XG5cdFx0Y29uZmlnID0gY29uZmlnIHx8IHt9O1xuXG5cdFx0Ly8gRG8gTk9UIHVzZSBjb25maWdNZXJnZSgpIGZvciB0aGUgZGF0YSBvYmplY3QgYmVjYXVzZSB0aGlzIG1ldGhvZCBtZXJnZXMgYXJyYXlzXG5cdFx0Ly8gYW5kIHNvIHdvdWxkIGNoYW5nZSByZWZlcmVuY2VzIHRvIGxhYmVscyBhbmQgZGF0YXNldHMsIHByZXZlbnRpbmcgZGF0YSB1cGRhdGVzLlxuXHRcdHZhciBkYXRhID0gY29uZmlnLmRhdGEgPSBjb25maWcuZGF0YSB8fCB7fTtcblx0XHRkYXRhLmRhdGFzZXRzID0gZGF0YS5kYXRhc2V0cyB8fCBbXTtcblx0XHRkYXRhLmxhYmVscyA9IGRhdGEubGFiZWxzIHx8IFtdO1xuXG5cdFx0Y29uZmlnLm9wdGlvbnMgPSBoZWxwZXJzLmNvbmZpZ01lcmdlKFxuXHRcdFx0ZGVmYXVsdHMuZ2xvYmFsLFxuXHRcdFx0ZGVmYXVsdHNbY29uZmlnLnR5cGVdLFxuXHRcdFx0Y29uZmlnLm9wdGlvbnMgfHwge30pO1xuXG5cdFx0cmV0dXJuIGNvbmZpZztcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBjb25maWcgb2YgdGhlIGNoYXJ0XG5cdCAqIEBwYXJhbSBjaGFydCB7Q2hhcnR9IGNoYXJ0IHRvIHVwZGF0ZSB0aGUgb3B0aW9ucyBmb3Jcblx0ICovXG5cdGZ1bmN0aW9uIHVwZGF0ZUNvbmZpZyhjaGFydCkge1xuXHRcdHZhciBuZXdPcHRpb25zID0gY2hhcnQub3B0aW9ucztcblxuXHRcdGhlbHBlcnMuZWFjaChjaGFydC5zY2FsZXMsIGZ1bmN0aW9uKHNjYWxlKSB7XG5cdFx0XHRsYXlvdXRzLnJlbW92ZUJveChjaGFydCwgc2NhbGUpO1xuXHRcdH0pO1xuXG5cdFx0bmV3T3B0aW9ucyA9IGhlbHBlcnMuY29uZmlnTWVyZ2UoXG5cdFx0XHRDaGFydC5kZWZhdWx0cy5nbG9iYWwsXG5cdFx0XHRDaGFydC5kZWZhdWx0c1tjaGFydC5jb25maWcudHlwZV0sXG5cdFx0XHRuZXdPcHRpb25zKTtcblxuXHRcdGNoYXJ0Lm9wdGlvbnMgPSBjaGFydC5jb25maWcub3B0aW9ucyA9IG5ld09wdGlvbnM7XG5cdFx0Y2hhcnQuZW5zdXJlU2NhbGVzSGF2ZUlEcygpO1xuXHRcdGNoYXJ0LmJ1aWxkT3JVcGRhdGVTY2FsZXMoKTtcblx0XHQvLyBUb29sdGlwXG5cdFx0Y2hhcnQudG9vbHRpcC5fb3B0aW9ucyA9IG5ld09wdGlvbnMudG9vbHRpcHM7XG5cdFx0Y2hhcnQudG9vbHRpcC5pbml0aWFsaXplKCk7XG5cdH1cblxuXHRmdW5jdGlvbiBwb3NpdGlvbklzSG9yaXpvbnRhbChwb3NpdGlvbikge1xuXHRcdHJldHVybiBwb3NpdGlvbiA9PT0gJ3RvcCcgfHwgcG9zaXRpb24gPT09ICdib3R0b20nO1xuXHR9XG5cblx0aGVscGVycy5leHRlbmQoQ2hhcnQucHJvdG90eXBlLCAvKiogQGxlbmRzIENoYXJ0ICovIHtcblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGNvbnN0cnVjdDogZnVuY3Rpb24oaXRlbSwgY29uZmlnKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0XHRjb25maWcgPSBpbml0Q29uZmlnKGNvbmZpZyk7XG5cblx0XHRcdHZhciBjb250ZXh0ID0gcGxhdGZvcm0uYWNxdWlyZUNvbnRleHQoaXRlbSwgY29uZmlnKTtcblx0XHRcdHZhciBjYW52YXMgPSBjb250ZXh0ICYmIGNvbnRleHQuY2FudmFzO1xuXHRcdFx0dmFyIGhlaWdodCA9IGNhbnZhcyAmJiBjYW52YXMuaGVpZ2h0O1xuXHRcdFx0dmFyIHdpZHRoID0gY2FudmFzICYmIGNhbnZhcy53aWR0aDtcblxuXHRcdFx0bWUuaWQgPSBoZWxwZXJzLnVpZCgpO1xuXHRcdFx0bWUuY3R4ID0gY29udGV4dDtcblx0XHRcdG1lLmNhbnZhcyA9IGNhbnZhcztcblx0XHRcdG1lLmNvbmZpZyA9IGNvbmZpZztcblx0XHRcdG1lLndpZHRoID0gd2lkdGg7XG5cdFx0XHRtZS5oZWlnaHQgPSBoZWlnaHQ7XG5cdFx0XHRtZS5hc3BlY3RSYXRpbyA9IGhlaWdodCA/IHdpZHRoIC8gaGVpZ2h0IDogbnVsbDtcblx0XHRcdG1lLm9wdGlvbnMgPSBjb25maWcub3B0aW9ucztcblx0XHRcdG1lLl9idWZmZXJlZFJlbmRlciA9IGZhbHNlO1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBDaGFydCBhbmQgQ2hhcnQuQ29udHJvbGxlciBoYXZlIGJlZW4gbWVyZ2VkLFxuXHRcdFx0ICogdGhlIFwiaW5zdGFuY2VcIiBzdGlsbCBuZWVkIHRvIGJlIGRlZmluZWQgc2luY2UgaXQgbWlnaHQgYmUgY2FsbGVkIGZyb20gcGx1Z2lucy5cblx0XHRcdCAqIEBwcm9wIENoYXJ0I2NoYXJ0XG5cdFx0XHQgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNi4wXG5cdFx0XHQgKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdFx0XHRtZS5jaGFydCA9IG1lO1xuXHRcdFx0bWUuY29udHJvbGxlciA9IG1lOyAvLyBjaGFydC5jaGFydC5jb250cm9sbGVyICNpbmNlcHRpb25cblxuXHRcdFx0Ly8gQWRkIHRoZSBjaGFydCBpbnN0YW5jZSB0byB0aGUgZ2xvYmFsIG5hbWVzcGFjZVxuXHRcdFx0Q2hhcnQuaW5zdGFuY2VzW21lLmlkXSA9IG1lO1xuXG5cdFx0XHQvLyBEZWZpbmUgYWxpYXMgdG8gdGhlIGNvbmZpZyBkYXRhOiBgY2hhcnQuZGF0YSA9PT0gY2hhcnQuY29uZmlnLmRhdGFgXG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobWUsICdkYXRhJywge1xuXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBtZS5jb25maWcuZGF0YTtcblx0XHRcdFx0fSxcblx0XHRcdFx0c2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0XHRcdG1lLmNvbmZpZy5kYXRhID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoIWNvbnRleHQgfHwgIWNhbnZhcykge1xuXHRcdFx0XHQvLyBUaGUgZ2l2ZW4gaXRlbSBpcyBub3QgYSBjb21wYXRpYmxlIGNvbnRleHQyZCBlbGVtZW50LCBsZXQncyByZXR1cm4gYmVmb3JlIGZpbmFsaXppbmdcblx0XHRcdFx0Ly8gdGhlIGNoYXJ0IGluaXRpYWxpemF0aW9uIGJ1dCBhZnRlciBzZXR0aW5nIGJhc2ljIGNoYXJ0IC8gY29udHJvbGxlciBwcm9wZXJ0aWVzIHRoYXRcblx0XHRcdFx0Ly8gY2FuIGhlbHAgdG8gZmlndXJlIG91dCB0aGF0IHRoZSBjaGFydCBpcyBub3QgdmFsaWQgKGUuZyBjaGFydC5jYW52YXMgIT09IG51bGwpO1xuXHRcdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMjgwN1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNyZWF0ZSBjaGFydDogY2FuJ3QgYWNxdWlyZSBjb250ZXh0IGZyb20gdGhlIGdpdmVuIGl0ZW1cIik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0bWUuaW5pdGlhbGl6ZSgpO1xuXHRcdFx0bWUudXBkYXRlKCk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0XHQvLyBCZWZvcmUgaW5pdCBwbHVnaW4gbm90aWZpY2F0aW9uXG5cdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZUluaXQnKTtcblxuXHRcdFx0aGVscGVycy5yZXRpbmFTY2FsZShtZSwgbWUub3B0aW9ucy5kZXZpY2VQaXhlbFJhdGlvKTtcblxuXHRcdFx0bWUuYmluZEV2ZW50cygpO1xuXG5cdFx0XHRpZiAobWUub3B0aW9ucy5yZXNwb25zaXZlKSB7XG5cdFx0XHRcdC8vIEluaXRpYWwgcmVzaXplIGJlZm9yZSBjaGFydCBkcmF3cyAobXVzdCBiZSBzaWxlbnQgdG8gcHJlc2VydmUgaW5pdGlhbCBhbmltYXRpb25zKS5cblx0XHRcdFx0bWUucmVzaXplKHRydWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgc2NhbGVzIGhhdmUgSURzIGFuZCBhcmUgYnVpbHQgYmVmb3JlIHdlIGJ1aWxkIGFueSBjb250cm9sbGVycy5cblx0XHRcdG1lLmVuc3VyZVNjYWxlc0hhdmVJRHMoKTtcblx0XHRcdG1lLmJ1aWxkT3JVcGRhdGVTY2FsZXMoKTtcblx0XHRcdG1lLmluaXRUb29sVGlwKCk7XG5cblx0XHRcdC8vIEFmdGVyIGluaXQgcGx1Z2luIG5vdGlmaWNhdGlvblxuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdhZnRlckluaXQnKTtcblxuXHRcdFx0cmV0dXJuIG1lO1xuXHRcdH0sXG5cblx0XHRjbGVhcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRoZWxwZXJzLmNhbnZhcy5jbGVhcih0aGlzKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHRzdG9wOiBmdW5jdGlvbigpIHtcblx0XHRcdC8vIFN0b3BzIGFueSBjdXJyZW50IGFuaW1hdGlvbiBsb29wIG9jY3VycmluZ1xuXHRcdFx0YW5pbWF0aW9ucy5jYW5jZWxBbmltYXRpb24odGhpcyk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0cmVzaXplOiBmdW5jdGlvbihzaWxlbnQpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgb3B0aW9ucyA9IG1lLm9wdGlvbnM7XG5cdFx0XHR2YXIgY2FudmFzID0gbWUuY2FudmFzO1xuXHRcdFx0dmFyIGFzcGVjdFJhdGlvID0gKG9wdGlvbnMubWFpbnRhaW5Bc3BlY3RSYXRpbyAmJiBtZS5hc3BlY3RSYXRpbykgfHwgbnVsbDtcblxuXHRcdFx0Ly8gdGhlIGNhbnZhcyByZW5kZXIgd2lkdGggYW5kIGhlaWdodCB3aWxsIGJlIGNhc3RlZCB0byBpbnRlZ2VycyBzbyBtYWtlIHN1cmUgdGhhdFxuXHRcdFx0Ly8gdGhlIGNhbnZhcyBkaXNwbGF5IHN0eWxlIHVzZXMgdGhlIHNhbWUgaW50ZWdlciB2YWx1ZXMgdG8gYXZvaWQgYmx1cnJpbmcgZWZmZWN0LlxuXG5cdFx0XHQvLyBTZXQgdG8gMCBpbnN0ZWFkIG9mIGNhbnZhcy5zaXplIGJlY2F1c2UgdGhlIHNpemUgZGVmYXVsdHMgdG8gMzAweDE1MCBpZiB0aGUgZWxlbWVudCBpcyBjb2xsYXBzZWRcblx0XHRcdHZhciBuZXdXaWR0aCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoaGVscGVycy5nZXRNYXhpbXVtV2lkdGgoY2FudmFzKSkpO1xuXHRcdFx0dmFyIG5ld0hlaWdodCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoYXNwZWN0UmF0aW8gPyBuZXdXaWR0aCAvIGFzcGVjdFJhdGlvIDogaGVscGVycy5nZXRNYXhpbXVtSGVpZ2h0KGNhbnZhcykpKTtcblxuXHRcdFx0aWYgKG1lLndpZHRoID09PSBuZXdXaWR0aCAmJiBtZS5oZWlnaHQgPT09IG5ld0hlaWdodCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNhbnZhcy53aWR0aCA9IG1lLndpZHRoID0gbmV3V2lkdGg7XG5cdFx0XHRjYW52YXMuaGVpZ2h0ID0gbWUuaGVpZ2h0ID0gbmV3SGVpZ2h0O1xuXHRcdFx0Y2FudmFzLnN0eWxlLndpZHRoID0gbmV3V2lkdGggKyAncHgnO1xuXHRcdFx0Y2FudmFzLnN0eWxlLmhlaWdodCA9IG5ld0hlaWdodCArICdweCc7XG5cblx0XHRcdGhlbHBlcnMucmV0aW5hU2NhbGUobWUsIG9wdGlvbnMuZGV2aWNlUGl4ZWxSYXRpbyk7XG5cblx0XHRcdGlmICghc2lsZW50KSB7XG5cdFx0XHRcdC8vIE5vdGlmeSBhbnkgcGx1Z2lucyBhYm91dCB0aGUgcmVzaXplXG5cdFx0XHRcdHZhciBuZXdTaXplID0ge3dpZHRoOiBuZXdXaWR0aCwgaGVpZ2h0OiBuZXdIZWlnaHR9O1xuXHRcdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ3Jlc2l6ZScsIFtuZXdTaXplXSk7XG5cblx0XHRcdFx0Ly8gTm90aWZ5IG9mIHJlc2l6ZVxuXHRcdFx0XHRpZiAobWUub3B0aW9ucy5vblJlc2l6ZSkge1xuXHRcdFx0XHRcdG1lLm9wdGlvbnMub25SZXNpemUobWUsIG5ld1NpemUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bWUuc3RvcCgpO1xuXHRcdFx0XHRtZS51cGRhdGUoe1xuXHRcdFx0XHRcdGR1cmF0aW9uOiBtZS5vcHRpb25zLnJlc3BvbnNpdmVBbmltYXRpb25EdXJhdGlvblxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0ZW5zdXJlU2NhbGVzSGF2ZUlEczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblx0XHRcdHZhciBzY2FsZXNPcHRpb25zID0gb3B0aW9ucy5zY2FsZXMgfHwge307XG5cdFx0XHR2YXIgc2NhbGVPcHRpb25zID0gb3B0aW9ucy5zY2FsZTtcblxuXHRcdFx0aGVscGVycy5lYWNoKHNjYWxlc09wdGlvbnMueEF4ZXMsIGZ1bmN0aW9uKHhBeGlzT3B0aW9ucywgaW5kZXgpIHtcblx0XHRcdFx0eEF4aXNPcHRpb25zLmlkID0geEF4aXNPcHRpb25zLmlkIHx8ICgneC1heGlzLScgKyBpbmRleCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aGVscGVycy5lYWNoKHNjYWxlc09wdGlvbnMueUF4ZXMsIGZ1bmN0aW9uKHlBeGlzT3B0aW9ucywgaW5kZXgpIHtcblx0XHRcdFx0eUF4aXNPcHRpb25zLmlkID0geUF4aXNPcHRpb25zLmlkIHx8ICgneS1heGlzLScgKyBpbmRleCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKHNjYWxlT3B0aW9ucykge1xuXHRcdFx0XHRzY2FsZU9wdGlvbnMuaWQgPSBzY2FsZU9wdGlvbnMuaWQgfHwgJ3NjYWxlJztcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQnVpbGRzIGEgbWFwIG9mIHNjYWxlIElEIHRvIHNjYWxlIG9iamVjdCBmb3IgZnV0dXJlIGxvb2t1cC5cblx0XHQgKi9cblx0XHRidWlsZE9yVXBkYXRlU2NhbGVzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgb3B0aW9ucyA9IG1lLm9wdGlvbnM7XG5cdFx0XHR2YXIgc2NhbGVzID0gbWUuc2NhbGVzIHx8IHt9O1xuXHRcdFx0dmFyIGl0ZW1zID0gW107XG5cdFx0XHR2YXIgdXBkYXRlZCA9IE9iamVjdC5rZXlzKHNjYWxlcykucmVkdWNlKGZ1bmN0aW9uKG9iaiwgaWQpIHtcblx0XHRcdFx0b2JqW2lkXSA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm4gb2JqO1xuXHRcdFx0fSwge30pO1xuXG5cdFx0XHRpZiAob3B0aW9ucy5zY2FsZXMpIHtcblx0XHRcdFx0aXRlbXMgPSBpdGVtcy5jb25jYXQoXG5cdFx0XHRcdFx0KG9wdGlvbnMuc2NhbGVzLnhBeGVzIHx8IFtdKS5tYXAoZnVuY3Rpb24oeEF4aXNPcHRpb25zKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge29wdGlvbnM6IHhBeGlzT3B0aW9ucywgZHR5cGU6ICdjYXRlZ29yeScsIGRwb3NpdGlvbjogJ2JvdHRvbSd9O1xuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdChvcHRpb25zLnNjYWxlcy55QXhlcyB8fCBbXSkubWFwKGZ1bmN0aW9uKHlBeGlzT3B0aW9ucykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHtvcHRpb25zOiB5QXhpc09wdGlvbnMsIGR0eXBlOiAnbGluZWFyJywgZHBvc2l0aW9uOiAnbGVmdCd9O1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvcHRpb25zLnNjYWxlKSB7XG5cdFx0XHRcdGl0ZW1zLnB1c2goe1xuXHRcdFx0XHRcdG9wdGlvbnM6IG9wdGlvbnMuc2NhbGUsXG5cdFx0XHRcdFx0ZHR5cGU6ICdyYWRpYWxMaW5lYXInLFxuXHRcdFx0XHRcdGlzRGVmYXVsdDogdHJ1ZSxcblx0XHRcdFx0XHRkcG9zaXRpb246ICdjaGFydEFyZWEnXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRoZWxwZXJzLmVhY2goaXRlbXMsIGZ1bmN0aW9uKGl0ZW0pIHtcblx0XHRcdFx0dmFyIHNjYWxlT3B0aW9ucyA9IGl0ZW0ub3B0aW9ucztcblx0XHRcdFx0dmFyIGlkID0gc2NhbGVPcHRpb25zLmlkO1xuXHRcdFx0XHR2YXIgc2NhbGVUeXBlID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdChzY2FsZU9wdGlvbnMudHlwZSwgaXRlbS5kdHlwZSk7XG5cblx0XHRcdFx0aWYgKHBvc2l0aW9uSXNIb3Jpem9udGFsKHNjYWxlT3B0aW9ucy5wb3NpdGlvbikgIT09IHBvc2l0aW9uSXNIb3Jpem9udGFsKGl0ZW0uZHBvc2l0aW9uKSkge1xuXHRcdFx0XHRcdHNjYWxlT3B0aW9ucy5wb3NpdGlvbiA9IGl0ZW0uZHBvc2l0aW9uO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dXBkYXRlZFtpZF0gPSB0cnVlO1xuXHRcdFx0XHR2YXIgc2NhbGUgPSBudWxsO1xuXHRcdFx0XHRpZiAoaWQgaW4gc2NhbGVzICYmIHNjYWxlc1tpZF0udHlwZSA9PT0gc2NhbGVUeXBlKSB7XG5cdFx0XHRcdFx0c2NhbGUgPSBzY2FsZXNbaWRdO1xuXHRcdFx0XHRcdHNjYWxlLm9wdGlvbnMgPSBzY2FsZU9wdGlvbnM7XG5cdFx0XHRcdFx0c2NhbGUuY3R4ID0gbWUuY3R4O1xuXHRcdFx0XHRcdHNjYWxlLmNoYXJ0ID0gbWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIHNjYWxlQ2xhc3MgPSBzY2FsZVNlcnZpY2UuZ2V0U2NhbGVDb25zdHJ1Y3RvcihzY2FsZVR5cGUpO1xuXHRcdFx0XHRcdGlmICghc2NhbGVDbGFzcykge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzY2FsZSA9IG5ldyBzY2FsZUNsYXNzKHtcblx0XHRcdFx0XHRcdGlkOiBpZCxcblx0XHRcdFx0XHRcdHR5cGU6IHNjYWxlVHlwZSxcblx0XHRcdFx0XHRcdG9wdGlvbnM6IHNjYWxlT3B0aW9ucyxcblx0XHRcdFx0XHRcdGN0eDogbWUuY3R4LFxuXHRcdFx0XHRcdFx0Y2hhcnQ6IG1lXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0c2NhbGVzW3NjYWxlLmlkXSA9IHNjYWxlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NhbGUubWVyZ2VUaWNrc09wdGlvbnMoKTtcblxuXHRcdFx0XHQvLyBUT0RPKFNCKTogSSB0aGluayB3ZSBzaG91bGQgYmUgYWJsZSB0byByZW1vdmUgdGhpcyBjdXN0b20gY2FzZSAob3B0aW9ucy5zY2FsZSlcblx0XHRcdFx0Ly8gYW5kIGNvbnNpZGVyIGl0IGFzIGEgcmVndWxhciBzY2FsZSBwYXJ0IG9mIHRoZSBcInNjYWxlc1wiXCIgbWFwIG9ubHkhIFRoaXMgd291bGRcblx0XHRcdFx0Ly8gbWFrZSB0aGUgbG9naWMgZWFzaWVyIGFuZCByZW1vdmUgc29tZSB1c2VsZXNzPyBjdXN0b20gY29kZS5cblx0XHRcdFx0aWYgKGl0ZW0uaXNEZWZhdWx0KSB7XG5cdFx0XHRcdFx0bWUuc2NhbGUgPSBzY2FsZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHQvLyBjbGVhciB1cCBkaXNjYXJkZWQgc2NhbGVzXG5cdFx0XHRoZWxwZXJzLmVhY2godXBkYXRlZCwgZnVuY3Rpb24oaGFzVXBkYXRlZCwgaWQpIHtcblx0XHRcdFx0aWYgKCFoYXNVcGRhdGVkKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHNjYWxlc1tpZF07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRtZS5zY2FsZXMgPSBzY2FsZXM7XG5cblx0XHRcdHNjYWxlU2VydmljZS5hZGRTY2FsZXNUb0xheW91dCh0aGlzKTtcblx0XHR9LFxuXG5cdFx0YnVpbGRPclVwZGF0ZUNvbnRyb2xsZXJzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgdHlwZXMgPSBbXTtcblx0XHRcdHZhciBuZXdDb250cm9sbGVycyA9IFtdO1xuXG5cdFx0XHRoZWxwZXJzLmVhY2gobWUuZGF0YS5kYXRhc2V0cywgZnVuY3Rpb24oZGF0YXNldCwgZGF0YXNldEluZGV4KSB7XG5cdFx0XHRcdHZhciBtZXRhID0gbWUuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcblx0XHRcdFx0dmFyIHR5cGUgPSBkYXRhc2V0LnR5cGUgfHwgbWUuY29uZmlnLnR5cGU7XG5cblx0XHRcdFx0aWYgKG1ldGEudHlwZSAmJiBtZXRhLnR5cGUgIT09IHR5cGUpIHtcblx0XHRcdFx0XHRtZS5kZXN0cm95RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcblx0XHRcdFx0XHRtZXRhID0gbWUuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRtZXRhLnR5cGUgPSB0eXBlO1xuXG5cdFx0XHRcdHR5cGVzLnB1c2gobWV0YS50eXBlKTtcblxuXHRcdFx0XHRpZiAobWV0YS5jb250cm9sbGVyKSB7XG5cdFx0XHRcdFx0bWV0YS5jb250cm9sbGVyLnVwZGF0ZUluZGV4KGRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdFx0bWV0YS5jb250cm9sbGVyLmxpbmtTY2FsZXMoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YXIgQ29udHJvbGxlckNsYXNzID0gQ2hhcnQuY29udHJvbGxlcnNbbWV0YS50eXBlXTtcblx0XHRcdFx0XHRpZiAoQ29udHJvbGxlckNsYXNzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcignXCInICsgbWV0YS50eXBlICsgJ1wiIGlzIG5vdCBhIGNoYXJ0IHR5cGUuJyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bWV0YS5jb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXJDbGFzcyhtZSwgZGF0YXNldEluZGV4KTtcblx0XHRcdFx0XHRuZXdDb250cm9sbGVycy5wdXNoKG1ldGEuY29udHJvbGxlcik7XG5cdFx0XHRcdH1cblx0XHRcdH0sIG1lKTtcblxuXHRcdFx0cmV0dXJuIG5ld0NvbnRyb2xsZXJzO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBSZXNldCB0aGUgZWxlbWVudHMgb2YgYWxsIGRhdGFzZXRzXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRyZXNldEVsZW1lbnRzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHRoZWxwZXJzLmVhY2gobWUuZGF0YS5kYXRhc2V0cywgZnVuY3Rpb24oZGF0YXNldCwgZGF0YXNldEluZGV4KSB7XG5cdFx0XHRcdG1lLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCkuY29udHJvbGxlci5yZXNldCgpO1xuXHRcdFx0fSwgbWUpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQqIFJlc2V0cyB0aGUgY2hhcnQgYmFjayB0byBpdCdzIHN0YXRlIGJlZm9yZSB0aGUgaW5pdGlhbCBhbmltYXRpb25cblx0XHQqL1xuXHRcdHJlc2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMucmVzZXRFbGVtZW50cygpO1xuXHRcdFx0dGhpcy50b29sdGlwLmluaXRpYWxpemUoKTtcblx0XHR9LFxuXG5cdFx0dXBkYXRlOiBmdW5jdGlvbihjb25maWcpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHRcdGlmICghY29uZmlnIHx8IHR5cGVvZiBjb25maWcgIT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHRcdGNvbmZpZyA9IHtcblx0XHRcdFx0XHRkdXJhdGlvbjogY29uZmlnLFxuXHRcdFx0XHRcdGxhenk6IGFyZ3VtZW50c1sxXVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHR1cGRhdGVDb25maWcobWUpO1xuXG5cdFx0XHQvLyBwbHVnaW5zIG9wdGlvbnMgcmVmZXJlbmNlcyBtaWdodCBoYXZlIGNoYW5nZSwgbGV0J3MgaW52YWxpZGF0ZSB0aGUgY2FjaGVcblx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy81MTExI2lzc3VlY29tbWVudC0zNTU5MzQxNjdcblx0XHRcdHBsdWdpbnMuX2ludmFsaWRhdGUobWUpO1xuXG5cdFx0XHRpZiAocGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVVcGRhdGUnKSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbiBjYXNlIHRoZSBlbnRpcmUgZGF0YSBvYmplY3QgY2hhbmdlZFxuXHRcdFx0bWUudG9vbHRpcC5fZGF0YSA9IG1lLmRhdGE7XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSBkYXRhc2V0IGNvbnRyb2xsZXJzIGFyZSB1cGRhdGVkIGFuZCBuZXcgY29udHJvbGxlcnMgYXJlIHJlc2V0XG5cdFx0XHR2YXIgbmV3Q29udHJvbGxlcnMgPSBtZS5idWlsZE9yVXBkYXRlQ29udHJvbGxlcnMoKTtcblxuXHRcdFx0Ly8gTWFrZSBzdXJlIGFsbCBkYXRhc2V0IGNvbnRyb2xsZXJzIGhhdmUgY29ycmVjdCBtZXRhIGRhdGEgY291bnRzXG5cdFx0XHRoZWxwZXJzLmVhY2gobWUuZGF0YS5kYXRhc2V0cywgZnVuY3Rpb24oZGF0YXNldCwgZGF0YXNldEluZGV4KSB7XG5cdFx0XHRcdG1lLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCkuY29udHJvbGxlci5idWlsZE9yVXBkYXRlRWxlbWVudHMoKTtcblx0XHRcdH0sIG1lKTtcblxuXHRcdFx0bWUudXBkYXRlTGF5b3V0KCk7XG5cblx0XHRcdC8vIENhbiBvbmx5IHJlc2V0IHRoZSBuZXcgY29udHJvbGxlcnMgYWZ0ZXIgdGhlIHNjYWxlcyBoYXZlIGJlZW4gdXBkYXRlZFxuXHRcdFx0aWYgKG1lLm9wdGlvbnMuYW5pbWF0aW9uICYmIG1lLm9wdGlvbnMuYW5pbWF0aW9uLmR1cmF0aW9uKSB7XG5cdFx0XHRcdGhlbHBlcnMuZWFjaChuZXdDb250cm9sbGVycywgZnVuY3Rpb24oY29udHJvbGxlcikge1xuXHRcdFx0XHRcdGNvbnRyb2xsZXIucmVzZXQoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdG1lLnVwZGF0ZURhdGFzZXRzKCk7XG5cblx0XHRcdC8vIE5lZWQgdG8gcmVzZXQgdG9vbHRpcCBpbiBjYXNlIGl0IGlzIGRpc3BsYXllZCB3aXRoIGVsZW1lbnRzIHRoYXQgYXJlIHJlbW92ZWRcblx0XHRcdC8vIGFmdGVyIHVwZGF0ZS5cblx0XHRcdG1lLnRvb2x0aXAuaW5pdGlhbGl6ZSgpO1xuXG5cdFx0XHQvLyBMYXN0IGFjdGl2ZSBjb250YWlucyBpdGVtcyB0aGF0IHdlcmUgcHJldmlvdXNseSBpbiB0aGUgdG9vbHRpcC5cblx0XHRcdC8vIFdoZW4gd2UgcmVzZXQgdGhlIHRvb2x0aXAsIHdlIG5lZWQgdG8gY2xlYXIgaXRcblx0XHRcdG1lLmxhc3RBY3RpdmUgPSBbXTtcblxuXHRcdFx0Ly8gRG8gdGhpcyBiZWZvcmUgcmVuZGVyIHNvIHRoYXQgYW55IHBsdWdpbnMgdGhhdCBuZWVkIGZpbmFsIHNjYWxlIHVwZGF0ZXMgY2FuIHVzZSBpdFxuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdhZnRlclVwZGF0ZScpO1xuXG5cdFx0XHRpZiAobWUuX2J1ZmZlcmVkUmVuZGVyKSB7XG5cdFx0XHRcdG1lLl9idWZmZXJlZFJlcXVlc3QgPSB7XG5cdFx0XHRcdFx0ZHVyYXRpb246IGNvbmZpZy5kdXJhdGlvbixcblx0XHRcdFx0XHRlYXNpbmc6IGNvbmZpZy5lYXNpbmcsXG5cdFx0XHRcdFx0bGF6eTogY29uZmlnLmxhenlcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1lLnJlbmRlcihjb25maWcpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBVcGRhdGVzIHRoZSBjaGFydCBsYXlvdXQgdW5sZXNzIGEgcGx1Z2luIHJldHVybnMgYGZhbHNlYCB0byB0aGUgYGJlZm9yZUxheW91dGBcblx0XHQgKiBob29rLCBpbiB3aGljaCBjYXNlLCBwbHVnaW5zIHdpbGwgbm90IGJlIGNhbGxlZCBvbiBgYWZ0ZXJMYXlvdXRgLlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dXBkYXRlTGF5b3V0OiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHRcdGlmIChwbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZUxheW91dCcpID09PSBmYWxzZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGxheW91dHMudXBkYXRlKHRoaXMsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIGBhZnRlckxheW91dGAgaW5zdGVhZC5cblx0XHRcdCAqIEBtZXRob2QgSVBsdWdpbiNhZnRlclNjYWxlVXBkYXRlXG5cdFx0XHQgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNS4wXG5cdFx0XHQgKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyU2NhbGVVcGRhdGUnKTtcblx0XHRcdHBsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJMYXlvdXQnKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogVXBkYXRlcyBhbGwgZGF0YXNldHMgdW5sZXNzIGEgcGx1Z2luIHJldHVybnMgYGZhbHNlYCB0byB0aGUgYGJlZm9yZURhdGFzZXRzVXBkYXRlYFxuXHRcdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlckRhdGFzZXRzVXBkYXRlYC5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHVwZGF0ZURhdGFzZXRzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHRcdGlmIChwbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZURhdGFzZXRzVXBkYXRlJykgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGlsZW4gPSBtZS5kYXRhLmRhdGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRtZS51cGRhdGVEYXRhc2V0KGkpO1xuXHRcdFx0fVxuXG5cdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyRGF0YXNldHNVcGRhdGUnKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogVXBkYXRlcyBkYXRhc2V0IGF0IGluZGV4IHVubGVzcyBhIHBsdWdpbiByZXR1cm5zIGBmYWxzZWAgdG8gdGhlIGBiZWZvcmVEYXRhc2V0VXBkYXRlYFxuXHRcdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlckRhdGFzZXRVcGRhdGVgLlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dXBkYXRlRGF0YXNldDogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldERhdGFzZXRNZXRhKGluZGV4KTtcblx0XHRcdHZhciBhcmdzID0ge1xuXHRcdFx0XHRtZXRhOiBtZXRhLFxuXHRcdFx0XHRpbmRleDogaW5kZXhcblx0XHRcdH07XG5cblx0XHRcdGlmIChwbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZURhdGFzZXRVcGRhdGUnLCBbYXJnc10pID09PSBmYWxzZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdG1ldGEuY29udHJvbGxlci51cGRhdGUoKTtcblxuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdhZnRlckRhdGFzZXRVcGRhdGUnLCBbYXJnc10pO1xuXHRcdH0sXG5cblx0XHRyZW5kZXI6IGZ1bmN0aW9uKGNvbmZpZykge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblxuXHRcdFx0aWYgKCFjb25maWcgfHwgdHlwZW9mIGNvbmZpZyAhPT0gJ29iamVjdCcpIHtcblx0XHRcdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHRcdFx0Y29uZmlnID0ge1xuXHRcdFx0XHRcdGR1cmF0aW9uOiBjb25maWcsXG5cdFx0XHRcdFx0bGF6eTogYXJndW1lbnRzWzFdXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHZhciBkdXJhdGlvbiA9IGNvbmZpZy5kdXJhdGlvbjtcblx0XHRcdHZhciBsYXp5ID0gY29uZmlnLmxhenk7XG5cblx0XHRcdGlmIChwbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZVJlbmRlcicpID09PSBmYWxzZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHZhciBhbmltYXRpb25PcHRpb25zID0gbWUub3B0aW9ucy5hbmltYXRpb247XG5cdFx0XHR2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKGFuaW1hdGlvbikge1xuXHRcdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyUmVuZGVyJyk7XG5cdFx0XHRcdGhlbHBlcnMuY2FsbGJhY2soYW5pbWF0aW9uT3B0aW9ucyAmJiBhbmltYXRpb25PcHRpb25zLm9uQ29tcGxldGUsIFthbmltYXRpb25dLCBtZSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAoYW5pbWF0aW9uT3B0aW9ucyAmJiAoKHR5cGVvZiBkdXJhdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgZHVyYXRpb24gIT09IDApIHx8ICh0eXBlb2YgZHVyYXRpb24gPT09ICd1bmRlZmluZWQnICYmIGFuaW1hdGlvbk9wdGlvbnMuZHVyYXRpb24gIT09IDApKSkge1xuXHRcdFx0XHR2YXIgYW5pbWF0aW9uID0gbmV3IEFuaW1hdGlvbih7XG5cdFx0XHRcdFx0bnVtU3RlcHM6IChkdXJhdGlvbiB8fCBhbmltYXRpb25PcHRpb25zLmR1cmF0aW9uKSAvIDE2LjY2LCAvLyA2MCBmcHNcblx0XHRcdFx0XHRlYXNpbmc6IGNvbmZpZy5lYXNpbmcgfHwgYW5pbWF0aW9uT3B0aW9ucy5lYXNpbmcsXG5cblx0XHRcdFx0XHRyZW5kZXI6IGZ1bmN0aW9uKGNoYXJ0LCBhbmltYXRpb25PYmplY3QpIHtcblx0XHRcdFx0XHRcdHZhciBlYXNpbmdGdW5jdGlvbiA9IGhlbHBlcnMuZWFzaW5nLmVmZmVjdHNbYW5pbWF0aW9uT2JqZWN0LmVhc2luZ107XG5cdFx0XHRcdFx0XHR2YXIgY3VycmVudFN0ZXAgPSBhbmltYXRpb25PYmplY3QuY3VycmVudFN0ZXA7XG5cdFx0XHRcdFx0XHR2YXIgc3RlcERlY2ltYWwgPSBjdXJyZW50U3RlcCAvIGFuaW1hdGlvbk9iamVjdC5udW1TdGVwcztcblxuXHRcdFx0XHRcdFx0Y2hhcnQuZHJhdyhlYXNpbmdGdW5jdGlvbihzdGVwRGVjaW1hbCksIHN0ZXBEZWNpbWFsLCBjdXJyZW50U3RlcCk7XG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdG9uQW5pbWF0aW9uUHJvZ3Jlc3M6IGFuaW1hdGlvbk9wdGlvbnMub25Qcm9ncmVzcyxcblx0XHRcdFx0XHRvbkFuaW1hdGlvbkNvbXBsZXRlOiBvbkNvbXBsZXRlXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGFuaW1hdGlvbnMuYWRkQW5pbWF0aW9uKG1lLCBhbmltYXRpb24sIGR1cmF0aW9uLCBsYXp5KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1lLmRyYXcoKTtcblxuXHRcdFx0XHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzM3ODFcblx0XHRcdFx0b25Db21wbGV0ZShuZXcgQW5pbWF0aW9uKHtudW1TdGVwczogMCwgY2hhcnQ6IG1lfSkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWU7XG5cdFx0fSxcblxuXHRcdGRyYXc6IGZ1bmN0aW9uKGVhc2luZ1ZhbHVlKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0XHRtZS5jbGVhcigpO1xuXG5cdFx0XHRpZiAoaGVscGVycy5pc051bGxPclVuZGVmKGVhc2luZ1ZhbHVlKSkge1xuXHRcdFx0XHRlYXNpbmdWYWx1ZSA9IDE7XG5cdFx0XHR9XG5cblx0XHRcdG1lLnRyYW5zaXRpb24oZWFzaW5nVmFsdWUpO1xuXG5cdFx0XHRpZiAobWUud2lkdGggPD0gMCB8fCBtZS5oZWlnaHQgPD0gMCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZURyYXcnLCBbZWFzaW5nVmFsdWVdKSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEcmF3IGFsbCB0aGUgc2NhbGVzXG5cdFx0XHRoZWxwZXJzLmVhY2gobWUuYm94ZXMsIGZ1bmN0aW9uKGJveCkge1xuXHRcdFx0XHRib3guZHJhdyhtZS5jaGFydEFyZWEpO1xuXHRcdFx0fSwgbWUpO1xuXG5cdFx0XHRpZiAobWUuc2NhbGUpIHtcblx0XHRcdFx0bWUuc2NhbGUuZHJhdygpO1xuXHRcdFx0fVxuXG5cdFx0XHRtZS5kcmF3RGF0YXNldHMoZWFzaW5nVmFsdWUpO1xuXHRcdFx0bWUuX2RyYXdUb29sdGlwKGVhc2luZ1ZhbHVlKTtcblxuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdhZnRlckRyYXcnLCBbZWFzaW5nVmFsdWVdKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR0cmFuc2l0aW9uOiBmdW5jdGlvbihlYXNpbmdWYWx1ZSkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGlsZW4gPSAobWUuZGF0YS5kYXRhc2V0cyB8fCBbXSkubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdGlmIChtZS5pc0RhdGFzZXRWaXNpYmxlKGkpKSB7XG5cdFx0XHRcdFx0bWUuZ2V0RGF0YXNldE1ldGEoaSkuY29udHJvbGxlci50cmFuc2l0aW9uKGVhc2luZ1ZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRtZS50b29sdGlwLnRyYW5zaXRpb24oZWFzaW5nVmFsdWUpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBEcmF3cyBhbGwgZGF0YXNldHMgdW5sZXNzIGEgcGx1Z2luIHJldHVybnMgYGZhbHNlYCB0byB0aGUgYGJlZm9yZURhdGFzZXRzRHJhd2Bcblx0XHQgKiBob29rLCBpbiB3aGljaCBjYXNlLCBwbHVnaW5zIHdpbGwgbm90IGJlIGNhbGxlZCBvbiBgYWZ0ZXJEYXRhc2V0c0RyYXdgLlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0ZHJhd0RhdGFzZXRzOiBmdW5jdGlvbihlYXNpbmdWYWx1ZSkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblxuXHRcdFx0aWYgKHBsdWdpbnMubm90aWZ5KG1lLCAnYmVmb3JlRGF0YXNldHNEcmF3JywgW2Vhc2luZ1ZhbHVlXSkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRHJhdyBkYXRhc2V0cyByZXZlcnNlZCB0byBzdXBwb3J0IHByb3BlciBsaW5lIHN0YWNraW5nXG5cdFx0XHRmb3IgKHZhciBpID0gKG1lLmRhdGEuZGF0YXNldHMgfHwgW10pLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG5cdFx0XHRcdGlmIChtZS5pc0RhdGFzZXRWaXNpYmxlKGkpKSB7XG5cdFx0XHRcdFx0bWUuZHJhd0RhdGFzZXQoaSwgZWFzaW5nVmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHBsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJEYXRhc2V0c0RyYXcnLCBbZWFzaW5nVmFsdWVdKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogRHJhd3MgZGF0YXNldCBhdCBpbmRleCB1bmxlc3MgYSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgIHRvIHRoZSBgYmVmb3JlRGF0YXNldERyYXdgXG5cdFx0ICogaG9vaywgaW4gd2hpY2ggY2FzZSwgcGx1Z2lucyB3aWxsIG5vdCBiZSBjYWxsZWQgb24gYGFmdGVyRGF0YXNldERyYXdgLlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0ZHJhd0RhdGFzZXQ6IGZ1bmN0aW9uKGluZGV4LCBlYXNpbmdWYWx1ZSkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0RGF0YXNldE1ldGEoaW5kZXgpO1xuXHRcdFx0dmFyIGFyZ3MgPSB7XG5cdFx0XHRcdG1ldGE6IG1ldGEsXG5cdFx0XHRcdGluZGV4OiBpbmRleCxcblx0XHRcdFx0ZWFzaW5nVmFsdWU6IGVhc2luZ1ZhbHVlXG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAocGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVEYXRhc2V0RHJhdycsIFthcmdzXSkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0bWV0YS5jb250cm9sbGVyLmRyYXcoZWFzaW5nVmFsdWUpO1xuXG5cdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyRGF0YXNldERyYXcnLCBbYXJnc10pO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBEcmF3cyB0b29sdGlwIHVubGVzcyBhIHBsdWdpbiByZXR1cm5zIGBmYWxzZWAgdG8gdGhlIGBiZWZvcmVUb29sdGlwRHJhd2Bcblx0XHQgKiBob29rLCBpbiB3aGljaCBjYXNlLCBwbHVnaW5zIHdpbGwgbm90IGJlIGNhbGxlZCBvbiBgYWZ0ZXJUb29sdGlwRHJhd2AuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRfZHJhd1Rvb2x0aXA6IGZ1bmN0aW9uKGVhc2luZ1ZhbHVlKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIHRvb2x0aXAgPSBtZS50b29sdGlwO1xuXHRcdFx0dmFyIGFyZ3MgPSB7XG5cdFx0XHRcdHRvb2x0aXA6IHRvb2x0aXAsXG5cdFx0XHRcdGVhc2luZ1ZhbHVlOiBlYXNpbmdWYWx1ZVxuXHRcdFx0fTtcblxuXHRcdFx0aWYgKHBsdWdpbnMubm90aWZ5KG1lLCAnYmVmb3JlVG9vbHRpcERyYXcnLCBbYXJnc10pID09PSBmYWxzZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRvb2x0aXAuZHJhdygpO1xuXG5cdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyVG9vbHRpcERyYXcnLCBbYXJnc10pO1xuXHRcdH0sXG5cblx0XHQvLyBHZXQgdGhlIHNpbmdsZSBlbGVtZW50IHRoYXQgd2FzIGNsaWNrZWQgb25cblx0XHQvLyBAcmV0dXJuIDogQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRhdGFzZXQgaW5kZXggYW5kIGVsZW1lbnQgaW5kZXggb2YgdGhlIG1hdGNoaW5nIGVsZW1lbnQuIEFsc28gY29udGFpbnMgdGhlIHJlY3RhbmdsZSB0aGF0IHdhcyBkcmF3XG5cdFx0Z2V0RWxlbWVudEF0RXZlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdHJldHVybiBJbnRlcmFjdGlvbi5tb2Rlcy5zaW5nbGUodGhpcywgZSk7XG5cdFx0fSxcblxuXHRcdGdldEVsZW1lbnRzQXRFdmVudDogZnVuY3Rpb24oZSkge1xuXHRcdFx0cmV0dXJuIEludGVyYWN0aW9uLm1vZGVzLmxhYmVsKHRoaXMsIGUsIHtpbnRlcnNlY3Q6IHRydWV9KTtcblx0XHR9LFxuXG5cdFx0Z2V0RWxlbWVudHNBdFhBeGlzOiBmdW5jdGlvbihlKSB7XG5cdFx0XHRyZXR1cm4gSW50ZXJhY3Rpb24ubW9kZXNbJ3gtYXhpcyddKHRoaXMsIGUsIHtpbnRlcnNlY3Q6IHRydWV9KTtcblx0XHR9LFxuXG5cdFx0Z2V0RWxlbWVudHNBdEV2ZW50Rm9yTW9kZTogZnVuY3Rpb24oZSwgbW9kZSwgb3B0aW9ucykge1xuXHRcdFx0dmFyIG1ldGhvZCA9IEludGVyYWN0aW9uLm1vZGVzW21vZGVdO1xuXHRcdFx0aWYgKHR5cGVvZiBtZXRob2QgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0cmV0dXJuIG1ldGhvZCh0aGlzLCBlLCBvcHRpb25zKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH0sXG5cblx0XHRnZXREYXRhc2V0QXRFdmVudDogZnVuY3Rpb24oZSkge1xuXHRcdFx0cmV0dXJuIEludGVyYWN0aW9uLm1vZGVzLmRhdGFzZXQodGhpcywgZSwge2ludGVyc2VjdDogdHJ1ZX0pO1xuXHRcdH0sXG5cblx0XHRnZXREYXRhc2V0TWV0YTogZnVuY3Rpb24oZGF0YXNldEluZGV4KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF07XG5cdFx0XHRpZiAoIWRhdGFzZXQuX21ldGEpIHtcblx0XHRcdFx0ZGF0YXNldC5fbWV0YSA9IHt9O1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbWV0YSA9IGRhdGFzZXQuX21ldGFbbWUuaWRdO1xuXHRcdFx0aWYgKCFtZXRhKSB7XG5cdFx0XHRcdG1ldGEgPSBkYXRhc2V0Ll9tZXRhW21lLmlkXSA9IHtcblx0XHRcdFx0XHR0eXBlOiBudWxsLFxuXHRcdFx0XHRcdGRhdGE6IFtdLFxuXHRcdFx0XHRcdGRhdGFzZXQ6IG51bGwsXG5cdFx0XHRcdFx0Y29udHJvbGxlcjogbnVsbCxcblx0XHRcdFx0XHRoaWRkZW46IG51bGwsXHRcdFx0Ly8gU2VlIGlzRGF0YXNldFZpc2libGUoKSBjb21tZW50XG5cdFx0XHRcdFx0eEF4aXNJRDogbnVsbCxcblx0XHRcdFx0XHR5QXhpc0lEOiBudWxsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtZXRhO1xuXHRcdH0sXG5cblx0XHRnZXRWaXNpYmxlRGF0YXNldENvdW50OiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBjb3VudCA9IDA7XG5cdFx0XHRmb3IgKHZhciBpID0gMCwgaWxlbiA9IHRoaXMuZGF0YS5kYXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0aWYgKHRoaXMuaXNEYXRhc2V0VmlzaWJsZShpKSkge1xuXHRcdFx0XHRcdGNvdW50Kys7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBjb3VudDtcblx0XHR9LFxuXG5cdFx0aXNEYXRhc2V0VmlzaWJsZTogZnVuY3Rpb24oZGF0YXNldEluZGV4KSB7XG5cdFx0XHR2YXIgbWV0YSA9IHRoaXMuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcblxuXHRcdFx0Ly8gbWV0YS5oaWRkZW4gaXMgYSBwZXIgY2hhcnQgZGF0YXNldCBoaWRkZW4gZmxhZyBvdmVycmlkZSB3aXRoIDMgc3RhdGVzOiBpZiB0cnVlIG9yIGZhbHNlLFxuXHRcdFx0Ly8gdGhlIGRhdGFzZXQuaGlkZGVuIHZhbHVlIGlzIGlnbm9yZWQsIGVsc2UgaWYgbnVsbCwgdGhlIGRhdGFzZXQgaGlkZGVuIHN0YXRlIGlzIHJldHVybmVkLlxuXHRcdFx0cmV0dXJuIHR5cGVvZiBtZXRhLmhpZGRlbiA9PT0gJ2Jvb2xlYW4nID8gIW1ldGEuaGlkZGVuIDogIXRoaXMuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdLmhpZGRlbjtcblx0XHR9LFxuXG5cdFx0Z2VuZXJhdGVMZWdlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMub3B0aW9ucy5sZWdlbmRDYWxsYmFjayh0aGlzKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRkZXN0cm95RGF0YXNldE1ldGE6IGZ1bmN0aW9uKGRhdGFzZXRJbmRleCkge1xuXHRcdFx0dmFyIGlkID0gdGhpcy5pZDtcblx0XHRcdHZhciBkYXRhc2V0ID0gdGhpcy5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF07XG5cdFx0XHR2YXIgbWV0YSA9IGRhdGFzZXQuX21ldGEgJiYgZGF0YXNldC5fbWV0YVtpZF07XG5cblx0XHRcdGlmIChtZXRhKSB7XG5cdFx0XHRcdG1ldGEuY29udHJvbGxlci5kZXN0cm95KCk7XG5cdFx0XHRcdGRlbGV0ZSBkYXRhc2V0Ll9tZXRhW2lkXTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0ZGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGNhbnZhcyA9IG1lLmNhbnZhcztcblx0XHRcdHZhciBpLCBpbGVuO1xuXG5cdFx0XHRtZS5zdG9wKCk7XG5cblx0XHRcdC8vIGRhdGFzZXQgY29udHJvbGxlcnMgbmVlZCB0byBjbGVhbnVwIGFzc29jaWF0ZWQgZGF0YVxuXHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IG1lLmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdG1lLmRlc3Ryb3lEYXRhc2V0TWV0YShpKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNhbnZhcykge1xuXHRcdFx0XHRtZS51bmJpbmRFdmVudHMoKTtcblx0XHRcdFx0aGVscGVycy5jYW52YXMuY2xlYXIobWUpO1xuXHRcdFx0XHRwbGF0Zm9ybS5yZWxlYXNlQ29udGV4dChtZS5jdHgpO1xuXHRcdFx0XHRtZS5jYW52YXMgPSBudWxsO1xuXHRcdFx0XHRtZS5jdHggPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ2Rlc3Ryb3knKTtcblxuXHRcdFx0ZGVsZXRlIENoYXJ0Lmluc3RhbmNlc1ttZS5pZF07XG5cdFx0fSxcblxuXHRcdHRvQmFzZTY0SW1hZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuY2FudmFzLnRvRGF0YVVSTC5hcHBseSh0aGlzLmNhbnZhcywgYXJndW1lbnRzKTtcblx0XHR9LFxuXG5cdFx0aW5pdFRvb2xUaXA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdG1lLnRvb2x0aXAgPSBuZXcgVG9vbHRpcCh7XG5cdFx0XHRcdF9jaGFydDogbWUsXG5cdFx0XHRcdF9jaGFydEluc3RhbmNlOiBtZSwgLy8gZGVwcmVjYXRlZCwgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuXHRcdFx0XHRfZGF0YTogbWUuZGF0YSxcblx0XHRcdFx0X29wdGlvbnM6IG1lLm9wdGlvbnMudG9vbHRpcHNcblx0XHRcdH0sIG1lKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRiaW5kRXZlbnRzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgbGlzdGVuZXJzID0gbWUuX2xpc3RlbmVycyA9IHt9O1xuXHRcdFx0dmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdG1lLmV2ZW50SGFuZGxlci5hcHBseShtZSwgYXJndW1lbnRzKTtcblx0XHRcdH07XG5cblx0XHRcdGhlbHBlcnMuZWFjaChtZS5vcHRpb25zLmV2ZW50cywgZnVuY3Rpb24odHlwZSkge1xuXHRcdFx0XHRwbGF0Zm9ybS5hZGRFdmVudExpc3RlbmVyKG1lLCB0eXBlLCBsaXN0ZW5lcik7XG5cdFx0XHRcdGxpc3RlbmVyc1t0eXBlXSA9IGxpc3RlbmVyO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEVsZW1lbnRzIHVzZWQgdG8gZGV0ZWN0IHNpemUgY2hhbmdlIHNob3VsZCBub3QgYmUgaW5qZWN0ZWQgZm9yIG5vbiByZXNwb25zaXZlIGNoYXJ0cy5cblx0XHRcdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMjIxMFxuXHRcdFx0aWYgKG1lLm9wdGlvbnMucmVzcG9uc2l2ZSkge1xuXHRcdFx0XHRsaXN0ZW5lciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdG1lLnJlc2l6ZSgpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHBsYXRmb3JtLmFkZEV2ZW50TGlzdGVuZXIobWUsICdyZXNpemUnLCBsaXN0ZW5lcik7XG5cdFx0XHRcdGxpc3RlbmVycy5yZXNpemUgPSBsaXN0ZW5lcjtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR1bmJpbmRFdmVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBsaXN0ZW5lcnMgPSBtZS5fbGlzdGVuZXJzO1xuXHRcdFx0aWYgKCFsaXN0ZW5lcnMpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWxldGUgbWUuX2xpc3RlbmVycztcblx0XHRcdGhlbHBlcnMuZWFjaChsaXN0ZW5lcnMsIGZ1bmN0aW9uKGxpc3RlbmVyLCB0eXBlKSB7XG5cdFx0XHRcdHBsYXRmb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIobWUsIHR5cGUsIGxpc3RlbmVyKTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHR1cGRhdGVIb3ZlclN0eWxlOiBmdW5jdGlvbihlbGVtZW50cywgbW9kZSwgZW5hYmxlZCkge1xuXHRcdFx0dmFyIG1ldGhvZCA9IGVuYWJsZWQgPyAnc2V0SG92ZXJTdHlsZScgOiAncmVtb3ZlSG92ZXJTdHlsZSc7XG5cdFx0XHR2YXIgZWxlbWVudCwgaSwgaWxlbjtcblxuXHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRlbGVtZW50ID0gZWxlbWVudHNbaV07XG5cdFx0XHRcdGlmIChlbGVtZW50KSB7XG5cdFx0XHRcdFx0dGhpcy5nZXREYXRhc2V0TWV0YShlbGVtZW50Ll9kYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXJbbWV0aG9kXShlbGVtZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGV2ZW50SGFuZGxlcjogZnVuY3Rpb24oZSkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciB0b29sdGlwID0gbWUudG9vbHRpcDtcblxuXHRcdFx0aWYgKHBsdWdpbnMubm90aWZ5KG1lLCAnYmVmb3JlRXZlbnQnLCBbZV0pID09PSBmYWxzZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEJ1ZmZlciBhbnkgdXBkYXRlIGNhbGxzIHNvIHRoYXQgcmVuZGVycyBkbyBub3Qgb2NjdXJcblx0XHRcdG1lLl9idWZmZXJlZFJlbmRlciA9IHRydWU7XG5cdFx0XHRtZS5fYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuXHRcdFx0dmFyIGNoYW5nZWQgPSBtZS5oYW5kbGVFdmVudChlKTtcblx0XHRcdC8vIGZvciBzbW9vdGggdG9vbHRpcCBhbmltYXRpb25zIGlzc3VlICM0OTg5XG5cdFx0XHQvLyB0aGUgdG9vbHRpcCBzaG91bGQgYmUgdGhlIHNvdXJjZSBvZiBjaGFuZ2Vcblx0XHRcdC8vIEFuaW1hdGlvbiBjaGVjayB3b3JrYXJvdW5kOlxuXHRcdFx0Ly8gdG9vbHRpcC5fc3RhcnQgd2lsbCBiZSBudWxsIHdoZW4gdG9vbHRpcCBpc24ndCBhbmltYXRpbmdcblx0XHRcdGlmICh0b29sdGlwKSB7XG5cdFx0XHRcdGNoYW5nZWQgPSB0b29sdGlwLl9zdGFydFxuXHRcdFx0XHRcdD8gdG9vbHRpcC5oYW5kbGVFdmVudChlKVxuXHRcdFx0XHRcdDogY2hhbmdlZCB8IHRvb2x0aXAuaGFuZGxlRXZlbnQoZSk7XG5cdFx0XHR9XG5cblx0XHRcdHBsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJFdmVudCcsIFtlXSk7XG5cblx0XHRcdHZhciBidWZmZXJlZFJlcXVlc3QgPSBtZS5fYnVmZmVyZWRSZXF1ZXN0O1xuXHRcdFx0aWYgKGJ1ZmZlcmVkUmVxdWVzdCkge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGFuIHVwZGF0ZSB0aGF0IHdhcyB0cmlnZ2VyZWQsIHdlIG5lZWQgdG8gZG8gYSBub3JtYWwgcmVuZGVyXG5cdFx0XHRcdG1lLnJlbmRlcihidWZmZXJlZFJlcXVlc3QpO1xuXHRcdFx0fSBlbHNlIGlmIChjaGFuZ2VkICYmICFtZS5hbmltYXRpbmcpIHtcblx0XHRcdFx0Ly8gSWYgZW50ZXJpbmcsIGxlYXZpbmcsIG9yIGNoYW5naW5nIGVsZW1lbnRzLCBhbmltYXRlIHRoZSBjaGFuZ2UgdmlhIHBpdm90XG5cdFx0XHRcdG1lLnN0b3AoKTtcblxuXHRcdFx0XHQvLyBXZSBvbmx5IG5lZWQgdG8gcmVuZGVyIGF0IHRoaXMgcG9pbnQuIFVwZGF0aW5nIHdpbGwgY2F1c2Ugc2NhbGVzIHRvIGJlXG5cdFx0XHRcdC8vIHJlY29tcHV0ZWQgZ2VuZXJhdGluZyBmbGlja2VyICYgdXNpbmcgbW9yZSBtZW1vcnkgdGhhbiBuZWNlc3NhcnkuXG5cdFx0XHRcdG1lLnJlbmRlcih7XG5cdFx0XHRcdFx0ZHVyYXRpb246IG1lLm9wdGlvbnMuaG92ZXIuYW5pbWF0aW9uRHVyYXRpb24sXG5cdFx0XHRcdFx0bGF6eTogdHJ1ZVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0bWUuX2J1ZmZlcmVkUmVuZGVyID0gZmFsc2U7XG5cdFx0XHRtZS5fYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuXHRcdFx0cmV0dXJuIG1lO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBIYW5kbGUgYW4gZXZlbnRcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7SUV2ZW50fSBldmVudCB0aGUgZXZlbnQgdG8gaGFuZGxlXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgY2hhcnQgbmVlZHMgdG8gcmUtcmVuZGVyXG5cdFx0ICovXG5cdFx0aGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgb3B0aW9ucyA9IG1lLm9wdGlvbnMgfHwge307XG5cdFx0XHR2YXIgaG92ZXJPcHRpb25zID0gb3B0aW9ucy5ob3Zlcjtcblx0XHRcdHZhciBjaGFuZ2VkID0gZmFsc2U7XG5cblx0XHRcdG1lLmxhc3RBY3RpdmUgPSBtZS5sYXN0QWN0aXZlIHx8IFtdO1xuXG5cdFx0XHQvLyBGaW5kIEFjdGl2ZSBFbGVtZW50cyBmb3IgaG92ZXIgYW5kIHRvb2x0aXBzXG5cdFx0XHRpZiAoZS50eXBlID09PSAnbW91c2VvdXQnKSB7XG5cdFx0XHRcdG1lLmFjdGl2ZSA9IFtdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWUuYWN0aXZlID0gbWUuZ2V0RWxlbWVudHNBdEV2ZW50Rm9yTW9kZShlLCBob3Zlck9wdGlvbnMubW9kZSwgaG92ZXJPcHRpb25zKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSW52b2tlIG9uSG92ZXIgaG9va1xuXHRcdFx0Ly8gTmVlZCB0byBjYWxsIHdpdGggbmF0aXZlIGV2ZW50IGhlcmUgdG8gbm90IGJyZWFrIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHRoZWxwZXJzLmNhbGxiYWNrKG9wdGlvbnMub25Ib3ZlciB8fCBvcHRpb25zLmhvdmVyLm9uSG92ZXIsIFtlLm5hdGl2ZSwgbWUuYWN0aXZlXSwgbWUpO1xuXG5cdFx0XHRpZiAoZS50eXBlID09PSAnbW91c2V1cCcgfHwgZS50eXBlID09PSAnY2xpY2snKSB7XG5cdFx0XHRcdGlmIChvcHRpb25zLm9uQ2xpY2spIHtcblx0XHRcdFx0XHQvLyBVc2UgZS5uYXRpdmUgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHRcdFx0XHRvcHRpb25zLm9uQ2xpY2suY2FsbChtZSwgZS5uYXRpdmUsIG1lLmFjdGl2ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVtb3ZlIHN0eWxpbmcgZm9yIGxhc3QgYWN0aXZlIChldmVuIGlmIGl0IG1heSBzdGlsbCBiZSBhY3RpdmUpXG5cdFx0XHRpZiAobWUubGFzdEFjdGl2ZS5sZW5ndGgpIHtcblx0XHRcdFx0bWUudXBkYXRlSG92ZXJTdHlsZShtZS5sYXN0QWN0aXZlLCBob3Zlck9wdGlvbnMubW9kZSwgZmFsc2UpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCdWlsdCBpbiBob3ZlciBzdHlsaW5nXG5cdFx0XHRpZiAobWUuYWN0aXZlLmxlbmd0aCAmJiBob3Zlck9wdGlvbnMubW9kZSkge1xuXHRcdFx0XHRtZS51cGRhdGVIb3ZlclN0eWxlKG1lLmFjdGl2ZSwgaG92ZXJPcHRpb25zLm1vZGUsIHRydWUpO1xuXHRcdFx0fVxuXG5cdFx0XHRjaGFuZ2VkID0gIWhlbHBlcnMuYXJyYXlFcXVhbHMobWUuYWN0aXZlLCBtZS5sYXN0QWN0aXZlKTtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgTGFzdCBBY3RpdmVzXG5cdFx0XHRtZS5sYXN0QWN0aXZlID0gbWUuYWN0aXZlO1xuXG5cdFx0XHRyZXR1cm4gY2hhbmdlZDtcblx0XHR9XG5cdH0pO1xuXG5cdC8qKlxuXHQgKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIENoYXJ0IGluc3RlYWQuXG5cdCAqIEBjbGFzcyBDaGFydC5Db250cm9sbGVyXG5cdCAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi42LjBcblx0ICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Q2hhcnQuQ29udHJvbGxlciA9IENoYXJ0O1xufTtcblxufSx7XCIyMlwiOjIyLFwiMjNcIjoyMyxcIjI2XCI6MjYsXCIyOVwiOjI5LFwiMzFcIjozMSxcIjMyXCI6MzIsXCIzNFwiOjM0LFwiMzZcIjozNixcIjQ2XCI6NDYsXCI0OVwiOjQ5fV0sMjU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0dmFyIGFycmF5RXZlbnRzID0gWydwdXNoJywgJ3BvcCcsICdzaGlmdCcsICdzcGxpY2UnLCAndW5zaGlmdCddO1xuXG5cdC8qKlxuXHQgKiBIb29rcyB0aGUgYXJyYXkgbWV0aG9kcyB0aGF0IGFkZCBvciByZW1vdmUgdmFsdWVzICgncHVzaCcsIHBvcCcsICdzaGlmdCcsICdzcGxpY2UnLFxuXHQgKiAndW5zaGlmdCcpIGFuZCBub3RpZnkgdGhlIGxpc3RlbmVyIEFGVEVSIHRoZSBhcnJheSBoYXMgYmVlbiBhbHRlcmVkLiBMaXN0ZW5lcnMgYXJlXG5cdCAqIGNhbGxlZCBvbiB0aGUgJ29uRGF0YSonIGNhbGxiYWNrcyAoZS5nLiBvbkRhdGFQdXNoLCBldGMuKSB3aXRoIHNhbWUgYXJndW1lbnRzLlxuXHQgKi9cblx0ZnVuY3Rpb24gbGlzdGVuQXJyYXlFdmVudHMoYXJyYXksIGxpc3RlbmVyKSB7XG5cdFx0aWYgKGFycmF5Ll9jaGFydGpzKSB7XG5cdFx0XHRhcnJheS5fY2hhcnRqcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGFycmF5LCAnX2NoYXJ0anMnLCB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHRcdHZhbHVlOiB7XG5cdFx0XHRcdGxpc3RlbmVyczogW2xpc3RlbmVyXVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YXJyYXlFdmVudHMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcblx0XHRcdHZhciBtZXRob2QgPSAnb25EYXRhJyArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKTtcblx0XHRcdHZhciBiYXNlID0gYXJyYXlba2V5XTtcblxuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGFycmF5LCBrZXksIHtcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHRcdFx0dmFsdWU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0XHRcdFx0XHR2YXIgcmVzID0gYmFzZS5hcHBseSh0aGlzLCBhcmdzKTtcblxuXHRcdFx0XHRcdGhlbHBlcnMuZWFjaChhcnJheS5fY2hhcnRqcy5saXN0ZW5lcnMsIGZ1bmN0aW9uKG9iamVjdCkge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBvYmplY3RbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdFx0XHRvYmplY3RbbWV0aG9kXS5hcHBseShvYmplY3QsIGFyZ3MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHJlcztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgZ2l2ZW4gYXJyYXkgZXZlbnQgbGlzdGVuZXIgYW5kIGNsZWFudXAgZXh0cmEgYXR0YWNoZWQgcHJvcGVydGllcyAoc3VjaCBhc1xuXHQgKiB0aGUgX2NoYXJ0anMgc3R1YiBhbmQgb3ZlcnJpZGRlbiBtZXRob2RzKSBpZiBhcnJheSBkb2Vzbid0IGhhdmUgYW55IG1vcmUgbGlzdGVuZXJzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdW5saXN0ZW5BcnJheUV2ZW50cyhhcnJheSwgbGlzdGVuZXIpIHtcblx0XHR2YXIgc3R1YiA9IGFycmF5Ll9jaGFydGpzO1xuXHRcdGlmICghc3R1Yikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBsaXN0ZW5lcnMgPSBzdHViLmxpc3RlbmVycztcblx0XHR2YXIgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG5cdFx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdFx0bGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0fVxuXG5cdFx0aWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0YXJyYXlFdmVudHMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcblx0XHRcdGRlbGV0ZSBhcnJheVtrZXldO1xuXHRcdH0pO1xuXG5cdFx0ZGVsZXRlIGFycmF5Ll9jaGFydGpzO1xuXHR9XG5cblx0Ly8gQmFzZSBjbGFzcyBmb3IgYWxsIGRhdGFzZXQgY29udHJvbGxlcnMgKGxpbmUsIGJhciwgZXRjKVxuXHRDaGFydC5EYXRhc2V0Q29udHJvbGxlciA9IGZ1bmN0aW9uKGNoYXJ0LCBkYXRhc2V0SW5kZXgpIHtcblx0XHR0aGlzLmluaXRpYWxpemUoY2hhcnQsIGRhdGFzZXRJbmRleCk7XG5cdH07XG5cblx0aGVscGVycy5leHRlbmQoQ2hhcnQuRGF0YXNldENvbnRyb2xsZXIucHJvdG90eXBlLCB7XG5cblx0XHQvKipcblx0XHQgKiBFbGVtZW50IHR5cGUgdXNlZCB0byBnZW5lcmF0ZSBhIG1ldGEgZGF0YXNldCAoZS5nLiBDaGFydC5lbGVtZW50LkxpbmUpLlxuXHRcdCAqIEB0eXBlIHtDaGFydC5jb3JlLmVsZW1lbnR9XG5cdFx0ICovXG5cdFx0ZGF0YXNldEVsZW1lbnRUeXBlOiBudWxsLFxuXG5cdFx0LyoqXG5cdFx0ICogRWxlbWVudCB0eXBlIHVzZWQgdG8gZ2VuZXJhdGUgYSBtZXRhIGRhdGEgKGUuZy4gQ2hhcnQuZWxlbWVudC5Qb2ludCkuXG5cdFx0ICogQHR5cGUge0NoYXJ0LmNvcmUuZWxlbWVudH1cblx0XHQgKi9cblx0XHRkYXRhRWxlbWVudFR5cGU6IG51bGwsXG5cblx0XHRpbml0aWFsaXplOiBmdW5jdGlvbihjaGFydCwgZGF0YXNldEluZGV4KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0bWUuY2hhcnQgPSBjaGFydDtcblx0XHRcdG1lLmluZGV4ID0gZGF0YXNldEluZGV4O1xuXHRcdFx0bWUubGlua1NjYWxlcygpO1xuXHRcdFx0bWUuYWRkRWxlbWVudHMoKTtcblx0XHR9LFxuXG5cdFx0dXBkYXRlSW5kZXg6IGZ1bmN0aW9uKGRhdGFzZXRJbmRleCkge1xuXHRcdFx0dGhpcy5pbmRleCA9IGRhdGFzZXRJbmRleDtcblx0XHR9LFxuXG5cdFx0bGlua1NjYWxlczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XG5cdFx0XHR2YXIgZGF0YXNldCA9IG1lLmdldERhdGFzZXQoKTtcblxuXHRcdFx0aWYgKG1ldGEueEF4aXNJRCA9PT0gbnVsbCB8fCAhKG1ldGEueEF4aXNJRCBpbiBtZS5jaGFydC5zY2FsZXMpKSB7XG5cdFx0XHRcdG1ldGEueEF4aXNJRCA9IGRhdGFzZXQueEF4aXNJRCB8fCBtZS5jaGFydC5vcHRpb25zLnNjYWxlcy54QXhlc1swXS5pZDtcblx0XHRcdH1cblx0XHRcdGlmIChtZXRhLnlBeGlzSUQgPT09IG51bGwgfHwgIShtZXRhLnlBeGlzSUQgaW4gbWUuY2hhcnQuc2NhbGVzKSkge1xuXHRcdFx0XHRtZXRhLnlBeGlzSUQgPSBkYXRhc2V0LnlBeGlzSUQgfHwgbWUuY2hhcnQub3B0aW9ucy5zY2FsZXMueUF4ZXNbMF0uaWQ7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGdldERhdGFzZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1t0aGlzLmluZGV4XTtcblx0XHR9LFxuXG5cdFx0Z2V0TWV0YTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5jaGFydC5nZXREYXRhc2V0TWV0YSh0aGlzLmluZGV4KTtcblx0XHR9LFxuXG5cdFx0Z2V0U2NhbGVGb3JJZDogZnVuY3Rpb24oc2NhbGVJRCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuY2hhcnQuc2NhbGVzW3NjYWxlSURdO1xuXHRcdH0sXG5cblx0XHRyZXNldDogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLnVwZGF0ZSh0cnVlKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRkZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICh0aGlzLl9kYXRhKSB7XG5cdFx0XHRcdHVubGlzdGVuQXJyYXlFdmVudHModGhpcy5fZGF0YSwgdGhpcyk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGNyZWF0ZU1ldGFEYXRhc2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgdHlwZSA9IG1lLmRhdGFzZXRFbGVtZW50VHlwZTtcblx0XHRcdHJldHVybiB0eXBlICYmIG5ldyB0eXBlKHtcblx0XHRcdFx0X2NoYXJ0OiBtZS5jaGFydCxcblx0XHRcdFx0X2RhdGFzZXRJbmRleDogbWUuaW5kZXhcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHRjcmVhdGVNZXRhRGF0YTogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgdHlwZSA9IG1lLmRhdGFFbGVtZW50VHlwZTtcblx0XHRcdHJldHVybiB0eXBlICYmIG5ldyB0eXBlKHtcblx0XHRcdFx0X2NoYXJ0OiBtZS5jaGFydCxcblx0XHRcdFx0X2RhdGFzZXRJbmRleDogbWUuaW5kZXgsXG5cdFx0XHRcdF9pbmRleDogaW5kZXhcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHRhZGRFbGVtZW50czogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XG5cdFx0XHR2YXIgZGF0YSA9IG1lLmdldERhdGFzZXQoKS5kYXRhIHx8IFtdO1xuXHRcdFx0dmFyIG1ldGFEYXRhID0gbWV0YS5kYXRhO1xuXHRcdFx0dmFyIGksIGlsZW47XG5cblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSBkYXRhLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRtZXRhRGF0YVtpXSA9IG1ldGFEYXRhW2ldIHx8IG1lLmNyZWF0ZU1ldGFEYXRhKGkpO1xuXHRcdFx0fVxuXG5cdFx0XHRtZXRhLmRhdGFzZXQgPSBtZXRhLmRhdGFzZXQgfHwgbWUuY3JlYXRlTWV0YURhdGFzZXQoKTtcblx0XHR9LFxuXG5cdFx0YWRkRWxlbWVudEFuZFJlc2V0OiBmdW5jdGlvbihpbmRleCkge1xuXHRcdFx0dmFyIGVsZW1lbnQgPSB0aGlzLmNyZWF0ZU1ldGFEYXRhKGluZGV4KTtcblx0XHRcdHRoaXMuZ2V0TWV0YSgpLmRhdGEuc3BsaWNlKGluZGV4LCAwLCBlbGVtZW50KTtcblx0XHRcdHRoaXMudXBkYXRlRWxlbWVudChlbGVtZW50LCBpbmRleCwgdHJ1ZSk7XG5cdFx0fSxcblxuXHRcdGJ1aWxkT3JVcGRhdGVFbGVtZW50czogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XG5cdFx0XHR2YXIgZGF0YSA9IGRhdGFzZXQuZGF0YSB8fCAoZGF0YXNldC5kYXRhID0gW10pO1xuXG5cdFx0XHQvLyBJbiBvcmRlciB0byBjb3JyZWN0bHkgaGFuZGxlIGRhdGEgYWRkaXRpb24vZGVsZXRpb24gYW5pbWF0aW9uIChhbiB0aHVzIHNpbXVsYXRlXG5cdFx0XHQvLyByZWFsLXRpbWUgY2hhcnRzKSwgd2UgbmVlZCB0byBtb25pdG9yIHRoZXNlIGRhdGEgbW9kaWZpY2F0aW9ucyBhbmQgc3luY2hyb25pemVcblx0XHRcdC8vIHRoZSBpbnRlcm5hbCBtZXRhIGRhdGEgYWNjb3JkaW5nbHkuXG5cdFx0XHRpZiAobWUuX2RhdGEgIT09IGRhdGEpIHtcblx0XHRcdFx0aWYgKG1lLl9kYXRhKSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyBjYXNlIGhhcHBlbnMgd2hlbiB0aGUgdXNlciByZXBsYWNlZCB0aGUgZGF0YSBhcnJheSBpbnN0YW5jZS5cblx0XHRcdFx0XHR1bmxpc3RlbkFycmF5RXZlbnRzKG1lLl9kYXRhLCBtZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsaXN0ZW5BcnJheUV2ZW50cyhkYXRhLCBtZSk7XG5cdFx0XHRcdG1lLl9kYXRhID0gZGF0YTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmUtc3luYyBtZXRhIGRhdGEgaW4gY2FzZSB0aGUgdXNlciByZXBsYWNlZCB0aGUgZGF0YSBhcnJheSBvciBpZiB3ZSBtaXNzZWRcblx0XHRcdC8vIGFueSB1cGRhdGVzIGFuZCBzbyBtYWtlIHN1cmUgdGhhdCB3ZSBoYW5kbGUgbnVtYmVyIG9mIGRhdGFwb2ludHMgY2hhbmdpbmcuXG5cdFx0XHRtZS5yZXN5bmNFbGVtZW50cygpO1xuXHRcdH0sXG5cblx0XHR1cGRhdGU6IGhlbHBlcnMubm9vcCxcblxuXHRcdHRyYW5zaXRpb246IGZ1bmN0aW9uKGVhc2luZ1ZhbHVlKSB7XG5cdFx0XHR2YXIgbWV0YSA9IHRoaXMuZ2V0TWV0YSgpO1xuXHRcdFx0dmFyIGVsZW1lbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xuXHRcdFx0dmFyIGlsZW4gPSBlbGVtZW50cy5sZW5ndGg7XG5cdFx0XHR2YXIgaSA9IDA7XG5cblx0XHRcdGZvciAoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdGVsZW1lbnRzW2ldLnRyYW5zaXRpb24oZWFzaW5nVmFsdWUpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWV0YS5kYXRhc2V0KSB7XG5cdFx0XHRcdG1ldGEuZGF0YXNldC50cmFuc2l0aW9uKGVhc2luZ1ZhbHVlKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0ZHJhdzogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWV0YSA9IHRoaXMuZ2V0TWV0YSgpO1xuXHRcdFx0dmFyIGVsZW1lbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xuXHRcdFx0dmFyIGlsZW4gPSBlbGVtZW50cy5sZW5ndGg7XG5cdFx0XHR2YXIgaSA9IDA7XG5cblx0XHRcdGlmIChtZXRhLmRhdGFzZXQpIHtcblx0XHRcdFx0bWV0YS5kYXRhc2V0LmRyYXcoKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yICg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0ZWxlbWVudHNbaV0uZHJhdygpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRyZW1vdmVIb3ZlclN0eWxlOiBmdW5jdGlvbihlbGVtZW50KSB7XG5cdFx0XHRoZWxwZXJzLm1lcmdlKGVsZW1lbnQuX21vZGVsLCBlbGVtZW50LiRwcmV2aW91c1N0eWxlIHx8IHt9KTtcblx0XHRcdGRlbGV0ZSBlbGVtZW50LiRwcmV2aW91c1N0eWxlO1xuXHRcdH0sXG5cblx0XHRzZXRIb3ZlclN0eWxlOiBmdW5jdGlvbihlbGVtZW50KSB7XG5cdFx0XHR2YXIgZGF0YXNldCA9IHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1tlbGVtZW50Ll9kYXRhc2V0SW5kZXhdO1xuXHRcdFx0dmFyIGluZGV4ID0gZWxlbWVudC5faW5kZXg7XG5cdFx0XHR2YXIgY3VzdG9tID0gZWxlbWVudC5jdXN0b20gfHwge307XG5cdFx0XHR2YXIgdmFsdWVPckRlZmF1bHQgPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdDtcblx0XHRcdHZhciBnZXRIb3ZlckNvbG9yID0gaGVscGVycy5nZXRIb3ZlckNvbG9yO1xuXHRcdFx0dmFyIG1vZGVsID0gZWxlbWVudC5fbW9kZWw7XG5cblx0XHRcdGVsZW1lbnQuJHByZXZpb3VzU3R5bGUgPSB7XG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuXHRcdFx0XHRib3JkZXJDb2xvcjogbW9kZWwuYm9yZGVyQ29sb3IsXG5cdFx0XHRcdGJvcmRlcldpZHRoOiBtb2RlbC5ib3JkZXJXaWR0aFxuXHRcdFx0fTtcblxuXHRcdFx0bW9kZWwuYmFja2dyb3VuZENvbG9yID0gY3VzdG9tLmhvdmVyQmFja2dyb3VuZENvbG9yID8gY3VzdG9tLmhvdmVyQmFja2dyb3VuZENvbG9yIDogdmFsdWVPckRlZmF1bHQoZGF0YXNldC5ob3ZlckJhY2tncm91bmRDb2xvciwgaW5kZXgsIGdldEhvdmVyQ29sb3IobW9kZWwuYmFja2dyb3VuZENvbG9yKSk7XG5cdFx0XHRtb2RlbC5ib3JkZXJDb2xvciA9IGN1c3RvbS5ob3ZlckJvcmRlckNvbG9yID8gY3VzdG9tLmhvdmVyQm9yZGVyQ29sb3IgOiB2YWx1ZU9yRGVmYXVsdChkYXRhc2V0LmhvdmVyQm9yZGVyQ29sb3IsIGluZGV4LCBnZXRIb3ZlckNvbG9yKG1vZGVsLmJvcmRlckNvbG9yKSk7XG5cdFx0XHRtb2RlbC5ib3JkZXJXaWR0aCA9IGN1c3RvbS5ob3ZlckJvcmRlcldpZHRoID8gY3VzdG9tLmhvdmVyQm9yZGVyV2lkdGggOiB2YWx1ZU9yRGVmYXVsdChkYXRhc2V0LmhvdmVyQm9yZGVyV2lkdGgsIGluZGV4LCBtb2RlbC5ib3JkZXJXaWR0aCk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0cmVzeW5jRWxlbWVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdFx0dmFyIGRhdGEgPSBtZS5nZXREYXRhc2V0KCkuZGF0YTtcblx0XHRcdHZhciBudW1NZXRhID0gbWV0YS5kYXRhLmxlbmd0aDtcblx0XHRcdHZhciBudW1EYXRhID0gZGF0YS5sZW5ndGg7XG5cblx0XHRcdGlmIChudW1EYXRhIDwgbnVtTWV0YSkge1xuXHRcdFx0XHRtZXRhLmRhdGEuc3BsaWNlKG51bURhdGEsIG51bU1ldGEgLSBudW1EYXRhKTtcblx0XHRcdH0gZWxzZSBpZiAobnVtRGF0YSA+IG51bU1ldGEpIHtcblx0XHRcdFx0bWUuaW5zZXJ0RWxlbWVudHMobnVtTWV0YSwgbnVtRGF0YSAtIG51bU1ldGEpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGluc2VydEVsZW1lbnRzOiBmdW5jdGlvbihzdGFydCwgY291bnQpIHtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xuXHRcdFx0XHR0aGlzLmFkZEVsZW1lbnRBbmRSZXNldChzdGFydCArIGkpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdG9uRGF0YVB1c2g6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy5pbnNlcnRFbGVtZW50cyh0aGlzLmdldERhdGFzZXQoKS5kYXRhLmxlbmd0aCAtIDEsIGFyZ3VtZW50cy5sZW5ndGgpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdG9uRGF0YVBvcDogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmdldE1ldGEoKS5kYXRhLnBvcCgpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdG9uRGF0YVNoaWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuZ2V0TWV0YSgpLmRhdGEuc2hpZnQoKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRvbkRhdGFTcGxpY2U6IGZ1bmN0aW9uKHN0YXJ0LCBjb3VudCkge1xuXHRcdFx0dGhpcy5nZXRNZXRhKCkuZGF0YS5zcGxpY2Uoc3RhcnQsIGNvdW50KTtcblx0XHRcdHRoaXMuaW5zZXJ0RWxlbWVudHMoc3RhcnQsIGFyZ3VtZW50cy5sZW5ndGggLSAyKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRvbkRhdGFVbnNoaWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuaW5zZXJ0RWxlbWVudHMoMCwgYXJndW1lbnRzLmxlbmd0aCk7XG5cdFx0fVxuXHR9KTtcblxuXHRDaGFydC5EYXRhc2V0Q29udHJvbGxlci5leHRlbmQgPSBoZWxwZXJzLmluaGVyaXRzO1xufTtcblxufSx7XCI0NlwiOjQ2fV0sMjY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfc2V0OiBmdW5jdGlvbihzY29wZSwgdmFsdWVzKSB7XG5cdFx0cmV0dXJuIGhlbHBlcnMubWVyZ2UodGhpc1tzY29wZV0gfHwgKHRoaXNbc2NvcGVdID0ge30pLCB2YWx1ZXMpO1xuXHR9XG59O1xuXG59LHtcIjQ2XCI6NDZ9XSwyNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBjb2xvciA9IHJlcXVpcmUoMyk7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZShzdGFydCwgdmlldywgbW9kZWwsIGVhc2UpIHtcblx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyhtb2RlbCk7XG5cdHZhciBpLCBpbGVuLCBrZXksIGFjdHVhbCwgb3JpZ2luLCB0YXJnZXQsIHR5cGUsIGMwLCBjMTtcblxuXHRmb3IgKGkgPSAwLCBpbGVuID0ga2V5cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRrZXkgPSBrZXlzW2ldO1xuXG5cdFx0dGFyZ2V0ID0gbW9kZWxba2V5XTtcblxuXHRcdC8vIGlmIGEgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIG1vZGVsIGFmdGVyIHBpdm90KCkgaGFzIGJlZW4gY2FsbGVkLCB0aGUgdmlld1xuXHRcdC8vIGRvZXNuJ3QgY29udGFpbiBpdCwgc28gbGV0J3MgaW5pdGlhbGl6ZSB0aGUgdmlldyB0byB0aGUgdGFyZ2V0IHZhbHVlLlxuXHRcdGlmICghdmlldy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHR2aWV3W2tleV0gPSB0YXJnZXQ7XG5cdFx0fVxuXG5cdFx0YWN0dWFsID0gdmlld1trZXldO1xuXG5cdFx0aWYgKGFjdHVhbCA9PT0gdGFyZ2V0IHx8IGtleVswXSA9PT0gJ18nKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRpZiAoIXN0YXJ0Lmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdHN0YXJ0W2tleV0gPSBhY3R1YWw7XG5cdFx0fVxuXG5cdFx0b3JpZ2luID0gc3RhcnRba2V5XTtcblxuXHRcdHR5cGUgPSB0eXBlb2YgdGFyZ2V0O1xuXG5cdFx0aWYgKHR5cGUgPT09IHR5cGVvZiBvcmlnaW4pIHtcblx0XHRcdGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRjMCA9IGNvbG9yKG9yaWdpbik7XG5cdFx0XHRcdGlmIChjMC52YWxpZCkge1xuXHRcdFx0XHRcdGMxID0gY29sb3IodGFyZ2V0KTtcblx0XHRcdFx0XHRpZiAoYzEudmFsaWQpIHtcblx0XHRcdFx0XHRcdHZpZXdba2V5XSA9IGMxLm1peChjMCwgZWFzZSkucmdiU3RyaW5nKCk7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUob3JpZ2luKSAmJiBpc0Zpbml0ZSh0YXJnZXQpKSB7XG5cdFx0XHRcdHZpZXdba2V5XSA9IG9yaWdpbiArICh0YXJnZXQgLSBvcmlnaW4pICogZWFzZTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmlld1trZXldID0gdGFyZ2V0O1xuXHR9XG59XG5cbnZhciBFbGVtZW50ID0gZnVuY3Rpb24oY29uZmlndXJhdGlvbikge1xuXHRoZWxwZXJzLmV4dGVuZCh0aGlzLCBjb25maWd1cmF0aW9uKTtcblx0dGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5oZWxwZXJzLmV4dGVuZChFbGVtZW50LnByb3RvdHlwZSwge1xuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuaGlkZGVuID0gZmFsc2U7XG5cdH0sXG5cblx0cGl2b3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0aWYgKCFtZS5fdmlldykge1xuXHRcdFx0bWUuX3ZpZXcgPSBoZWxwZXJzLmNsb25lKG1lLl9tb2RlbCk7XG5cdFx0fVxuXHRcdG1lLl9zdGFydCA9IHt9O1xuXHRcdHJldHVybiBtZTtcblx0fSxcblxuXHR0cmFuc2l0aW9uOiBmdW5jdGlvbihlYXNlKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgbW9kZWwgPSBtZS5fbW9kZWw7XG5cdFx0dmFyIHN0YXJ0ID0gbWUuX3N0YXJ0O1xuXHRcdHZhciB2aWV3ID0gbWUuX3ZpZXc7XG5cblx0XHQvLyBObyBhbmltYXRpb24gLT4gTm8gVHJhbnNpdGlvblxuXHRcdGlmICghbW9kZWwgfHwgZWFzZSA9PT0gMSkge1xuXHRcdFx0bWUuX3ZpZXcgPSBtb2RlbDtcblx0XHRcdG1lLl9zdGFydCA9IG51bGw7XG5cdFx0XHRyZXR1cm4gbWU7XG5cdFx0fVxuXG5cdFx0aWYgKCF2aWV3KSB7XG5cdFx0XHR2aWV3ID0gbWUuX3ZpZXcgPSB7fTtcblx0XHR9XG5cblx0XHRpZiAoIXN0YXJ0KSB7XG5cdFx0XHRzdGFydCA9IG1lLl9zdGFydCA9IHt9O1xuXHRcdH1cblxuXHRcdGludGVycG9sYXRlKHN0YXJ0LCB2aWV3LCBtb2RlbCwgZWFzZSk7XG5cblx0XHRyZXR1cm4gbWU7XG5cdH0sXG5cblx0dG9vbHRpcFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0eDogdGhpcy5fbW9kZWwueCxcblx0XHRcdHk6IHRoaXMuX21vZGVsLnlcblx0XHR9O1xuXHR9LFxuXG5cdGhhc1ZhbHVlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gaGVscGVycy5pc051bWJlcih0aGlzLl9tb2RlbC54KSAmJiBoZWxwZXJzLmlzTnVtYmVyKHRoaXMuX21vZGVsLnkpO1xuXHR9XG59KTtcblxuRWxlbWVudC5leHRlbmQgPSBoZWxwZXJzLmluaGVyaXRzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVsZW1lbnQ7XG5cbn0se1wiM1wiOjMsXCI0NlwiOjQ2fV0sMjg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuLyogZ2xvYmFsIHdpbmRvdzogZmFsc2UgKi9cbi8qIGdsb2JhbCBkb2N1bWVudDogZmFsc2UgKi9cbid1c2Ugc3RyaWN0JztcblxudmFyIGNvbG9yID0gcmVxdWlyZSgzKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcbnZhciBzY2FsZVNlcnZpY2UgPSByZXF1aXJlKDM0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblxuXHQvLyAtLSBCYXNpYyBqcyB1dGlsaXR5IG1ldGhvZHNcblxuXHRoZWxwZXJzLmNvbmZpZ01lcmdlID0gZnVuY3Rpb24oLyogb2JqZWN0cyAuLi4gKi8pIHtcblx0XHRyZXR1cm4gaGVscGVycy5tZXJnZShoZWxwZXJzLmNsb25lKGFyZ3VtZW50c1swXSksIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwge1xuXHRcdFx0bWVyZ2VyOiBmdW5jdGlvbihrZXksIHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciB0dmFsID0gdGFyZ2V0W2tleV0gfHwge307XG5cdFx0XHRcdHZhciBzdmFsID0gc291cmNlW2tleV07XG5cblx0XHRcdFx0aWYgKGtleSA9PT0gJ3NjYWxlcycpIHtcblx0XHRcdFx0XHQvLyBzY2FsZSBjb25maWcgbWVyZ2luZyBpcyBjb21wbGV4LiBBZGQgb3VyIG93biBmdW5jdGlvbiBoZXJlIGZvciB0aGF0XG5cdFx0XHRcdFx0dGFyZ2V0W2tleV0gPSBoZWxwZXJzLnNjYWxlTWVyZ2UodHZhbCwgc3ZhbCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoa2V5ID09PSAnc2NhbGUnKSB7XG5cdFx0XHRcdFx0Ly8gdXNlZCBpbiBwb2xhciBhcmVhICYgcmFkYXIgY2hhcnRzIHNpbmNlIHRoZXJlIGlzIG9ubHkgb25lIHNjYWxlXG5cdFx0XHRcdFx0dGFyZ2V0W2tleV0gPSBoZWxwZXJzLm1lcmdlKHR2YWwsIFtzY2FsZVNlcnZpY2UuZ2V0U2NhbGVEZWZhdWx0cyhzdmFsLnR5cGUpLCBzdmFsXSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aGVscGVycy5fbWVyZ2VyKGtleSwgdGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH07XG5cblx0aGVscGVycy5zY2FsZU1lcmdlID0gZnVuY3Rpb24oLyogb2JqZWN0cyAuLi4gKi8pIHtcblx0XHRyZXR1cm4gaGVscGVycy5tZXJnZShoZWxwZXJzLmNsb25lKGFyZ3VtZW50c1swXSksIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwge1xuXHRcdFx0bWVyZ2VyOiBmdW5jdGlvbihrZXksIHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG5cdFx0XHRcdGlmIChrZXkgPT09ICd4QXhlcycgfHwga2V5ID09PSAneUF4ZXMnKSB7XG5cdFx0XHRcdFx0dmFyIHNsZW4gPSBzb3VyY2Vba2V5XS5sZW5ndGg7XG5cdFx0XHRcdFx0dmFyIGksIHR5cGUsIHNjYWxlO1xuXG5cdFx0XHRcdFx0aWYgKCF0YXJnZXRba2V5XSkge1xuXHRcdFx0XHRcdFx0dGFyZ2V0W2tleV0gPSBbXTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgc2xlbjsgKytpKSB7XG5cdFx0XHRcdFx0XHRzY2FsZSA9IHNvdXJjZVtrZXldW2ldO1xuXHRcdFx0XHRcdFx0dHlwZSA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQoc2NhbGUudHlwZSwga2V5ID09PSAneEF4ZXMnID8gJ2NhdGVnb3J5JyA6ICdsaW5lYXInKTtcblxuXHRcdFx0XHRcdFx0aWYgKGkgPj0gdGFyZ2V0W2tleV0ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldFtrZXldLnB1c2goe30pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoIXRhcmdldFtrZXldW2ldLnR5cGUgfHwgKHNjYWxlLnR5cGUgJiYgc2NhbGUudHlwZSAhPT0gdGFyZ2V0W2tleV1baV0udHlwZSkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gbmV3L3VudHlwZWQgc2NhbGUgb3IgdHlwZSBjaGFuZ2VkOiBsZXQncyBhcHBseSB0aGUgbmV3IGRlZmF1bHRzXG5cdFx0XHRcdFx0XHRcdC8vIHRoZW4gbWVyZ2Ugc291cmNlIHNjYWxlIHRvIGNvcnJlY3RseSBvdmVyd3JpdGUgdGhlIGRlZmF1bHRzLlxuXHRcdFx0XHRcdFx0XHRoZWxwZXJzLm1lcmdlKHRhcmdldFtrZXldW2ldLCBbc2NhbGVTZXJ2aWNlLmdldFNjYWxlRGVmYXVsdHModHlwZSksIHNjYWxlXSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBzY2FsZXMgdHlwZSBhcmUgdGhlIHNhbWVcblx0XHRcdFx0XHRcdFx0aGVscGVycy5tZXJnZSh0YXJnZXRba2V5XVtpXSwgc2NhbGUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRoZWxwZXJzLl9tZXJnZXIoa2V5LCB0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fTtcblxuXHRoZWxwZXJzLndoZXJlID0gZnVuY3Rpb24oY29sbGVjdGlvbiwgZmlsdGVyQ2FsbGJhY2spIHtcblx0XHRpZiAoaGVscGVycy5pc0FycmF5KGNvbGxlY3Rpb24pICYmIEFycmF5LnByb3RvdHlwZS5maWx0ZXIpIHtcblx0XHRcdHJldHVybiBjb2xsZWN0aW9uLmZpbHRlcihmaWx0ZXJDYWxsYmFjayk7XG5cdFx0fVxuXHRcdHZhciBmaWx0ZXJlZCA9IFtdO1xuXG5cdFx0aGVscGVycy5lYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKGl0ZW0pIHtcblx0XHRcdGlmIChmaWx0ZXJDYWxsYmFjayhpdGVtKSkge1xuXHRcdFx0XHRmaWx0ZXJlZC5wdXNoKGl0ZW0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGZpbHRlcmVkO1xuXHR9O1xuXHRoZWxwZXJzLmZpbmRJbmRleCA9IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXggP1xuXHRcdGZ1bmN0aW9uKGFycmF5LCBjYWxsYmFjaywgc2NvcGUpIHtcblx0XHRcdHJldHVybiBhcnJheS5maW5kSW5kZXgoY2FsbGJhY2ssIHNjb3BlKTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbihhcnJheSwgY2FsbGJhY2ssIHNjb3BlKSB7XG5cdFx0XHRzY29wZSA9IHNjb3BlID09PSB1bmRlZmluZWQgPyBhcnJheSA6IHNjb3BlO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGlsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0aWYgKGNhbGxiYWNrLmNhbGwoc2NvcGUsIGFycmF5W2ldLCBpLCBhcnJheSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH07XG5cdGhlbHBlcnMuZmluZE5leHRXaGVyZSA9IGZ1bmN0aW9uKGFycmF5VG9TZWFyY2gsIGZpbHRlckNhbGxiYWNrLCBzdGFydEluZGV4KSB7XG5cdFx0Ly8gRGVmYXVsdCB0byBzdGFydCBvZiB0aGUgYXJyYXlcblx0XHRpZiAoaGVscGVycy5pc051bGxPclVuZGVmKHN0YXJ0SW5kZXgpKSB7XG5cdFx0XHRzdGFydEluZGV4ID0gLTE7XG5cdFx0fVxuXHRcdGZvciAodmFyIGkgPSBzdGFydEluZGV4ICsgMTsgaSA8IGFycmF5VG9TZWFyY2gubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBjdXJyZW50SXRlbSA9IGFycmF5VG9TZWFyY2hbaV07XG5cdFx0XHRpZiAoZmlsdGVyQ2FsbGJhY2soY3VycmVudEl0ZW0pKSB7XG5cdFx0XHRcdHJldHVybiBjdXJyZW50SXRlbTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGhlbHBlcnMuZmluZFByZXZpb3VzV2hlcmUgPSBmdW5jdGlvbihhcnJheVRvU2VhcmNoLCBmaWx0ZXJDYWxsYmFjaywgc3RhcnRJbmRleCkge1xuXHRcdC8vIERlZmF1bHQgdG8gZW5kIG9mIHRoZSBhcnJheVxuXHRcdGlmIChoZWxwZXJzLmlzTnVsbE9yVW5kZWYoc3RhcnRJbmRleCkpIHtcblx0XHRcdHN0YXJ0SW5kZXggPSBhcnJheVRvU2VhcmNoLmxlbmd0aDtcblx0XHR9XG5cdFx0Zm9yICh2YXIgaSA9IHN0YXJ0SW5kZXggLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0dmFyIGN1cnJlbnRJdGVtID0gYXJyYXlUb1NlYXJjaFtpXTtcblx0XHRcdGlmIChmaWx0ZXJDYWxsYmFjayhjdXJyZW50SXRlbSkpIHtcblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRJdGVtO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHQvLyAtLSBNYXRoIG1ldGhvZHNcblx0aGVscGVycy5pc051bWJlciA9IGZ1bmN0aW9uKG4pIHtcblx0XHRyZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQobikpICYmIGlzRmluaXRlKG4pO1xuXHR9O1xuXHRoZWxwZXJzLmFsbW9zdEVxdWFscyA9IGZ1bmN0aW9uKHgsIHksIGVwc2lsb24pIHtcblx0XHRyZXR1cm4gTWF0aC5hYnMoeCAtIHkpIDwgZXBzaWxvbjtcblx0fTtcblx0aGVscGVycy5hbG1vc3RXaG9sZSA9IGZ1bmN0aW9uKHgsIGVwc2lsb24pIHtcblx0XHR2YXIgcm91bmRlZCA9IE1hdGgucm91bmQoeCk7XG5cdFx0cmV0dXJuICgoKHJvdW5kZWQgLSBlcHNpbG9uKSA8IHgpICYmICgocm91bmRlZCArIGVwc2lsb24pID4geCkpO1xuXHR9O1xuXHRoZWxwZXJzLm1heCA9IGZ1bmN0aW9uKGFycmF5KSB7XG5cdFx0cmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbihtYXgsIHZhbHVlKSB7XG5cdFx0XHRpZiAoIWlzTmFOKHZhbHVlKSkge1xuXHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgobWF4LCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF4O1xuXHRcdH0sIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk7XG5cdH07XG5cdGhlbHBlcnMubWluID0gZnVuY3Rpb24oYXJyYXkpIHtcblx0XHRyZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uKG1pbiwgdmFsdWUpIHtcblx0XHRcdGlmICghaXNOYU4odmFsdWUpKSB7XG5cdFx0XHRcdHJldHVybiBNYXRoLm1pbihtaW4sIHZhbHVlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtaW47XG5cdFx0fSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcblx0fTtcblx0aGVscGVycy5zaWduID0gTWF0aC5zaWduID9cblx0XHRmdW5jdGlvbih4KSB7XG5cdFx0XHRyZXR1cm4gTWF0aC5zaWduKHgpO1xuXHRcdH0gOlxuXHRcdGZ1bmN0aW9uKHgpIHtcblx0XHRcdHggPSAreDsgLy8gY29udmVydCB0byBhIG51bWJlclxuXHRcdFx0aWYgKHggPT09IDAgfHwgaXNOYU4oeCkpIHtcblx0XHRcdFx0cmV0dXJuIHg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4geCA+IDAgPyAxIDogLTE7XG5cdFx0fTtcblx0aGVscGVycy5sb2cxMCA9IE1hdGgubG9nMTAgP1xuXHRcdGZ1bmN0aW9uKHgpIHtcblx0XHRcdHJldHVybiBNYXRoLmxvZzEwKHgpO1xuXHRcdH0gOlxuXHRcdGZ1bmN0aW9uKHgpIHtcblx0XHRcdHZhciBleHBvbmVudCA9IE1hdGgubG9nKHgpICogTWF0aC5MT0cxMEU7IC8vIE1hdGguTE9HMTBFID0gMSAvIE1hdGguTE4xMC5cblx0XHRcdC8vIENoZWNrIGZvciB3aG9sZSBwb3dlcnMgb2YgMTAsXG5cdFx0XHQvLyB3aGljaCBkdWUgdG8gZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3Igc2hvdWxkIGJlIGNvcnJlY3RlZC5cblx0XHRcdHZhciBwb3dlck9mMTAgPSBNYXRoLnJvdW5kKGV4cG9uZW50KTtcblx0XHRcdHZhciBpc1Bvd2VyT2YxMCA9IHggPT09IE1hdGgucG93KDEwLCBwb3dlck9mMTApO1xuXG5cdFx0XHRyZXR1cm4gaXNQb3dlck9mMTAgPyBwb3dlck9mMTAgOiBleHBvbmVudDtcblx0XHR9O1xuXHRoZWxwZXJzLnRvUmFkaWFucyA9IGZ1bmN0aW9uKGRlZ3JlZXMpIHtcblx0XHRyZXR1cm4gZGVncmVlcyAqIChNYXRoLlBJIC8gMTgwKTtcblx0fTtcblx0aGVscGVycy50b0RlZ3JlZXMgPSBmdW5jdGlvbihyYWRpYW5zKSB7XG5cdFx0cmV0dXJuIHJhZGlhbnMgKiAoMTgwIC8gTWF0aC5QSSk7XG5cdH07XG5cdC8vIEdldHMgdGhlIGFuZ2xlIGZyb20gdmVydGljYWwgdXByaWdodCB0byB0aGUgcG9pbnQgYWJvdXQgYSBjZW50cmUuXG5cdGhlbHBlcnMuZ2V0QW5nbGVGcm9tUG9pbnQgPSBmdW5jdGlvbihjZW50cmVQb2ludCwgYW5nbGVQb2ludCkge1xuXHRcdHZhciBkaXN0YW5jZUZyb21YQ2VudGVyID0gYW5nbGVQb2ludC54IC0gY2VudHJlUG9pbnQueDtcblx0XHR2YXIgZGlzdGFuY2VGcm9tWUNlbnRlciA9IGFuZ2xlUG9pbnQueSAtIGNlbnRyZVBvaW50Lnk7XG5cdFx0dmFyIHJhZGlhbERpc3RhbmNlRnJvbUNlbnRlciA9IE1hdGguc3FydChkaXN0YW5jZUZyb21YQ2VudGVyICogZGlzdGFuY2VGcm9tWENlbnRlciArIGRpc3RhbmNlRnJvbVlDZW50ZXIgKiBkaXN0YW5jZUZyb21ZQ2VudGVyKTtcblxuXHRcdHZhciBhbmdsZSA9IE1hdGguYXRhbjIoZGlzdGFuY2VGcm9tWUNlbnRlciwgZGlzdGFuY2VGcm9tWENlbnRlcik7XG5cblx0XHRpZiAoYW5nbGUgPCAoLTAuNSAqIE1hdGguUEkpKSB7XG5cdFx0XHRhbmdsZSArPSAyLjAgKiBNYXRoLlBJOyAvLyBtYWtlIHN1cmUgdGhlIHJldHVybmVkIGFuZ2xlIGlzIGluIHRoZSByYW5nZSBvZiAoLVBJLzIsIDNQSS8yXVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRhbmdsZTogYW5nbGUsXG5cdFx0XHRkaXN0YW5jZTogcmFkaWFsRGlzdGFuY2VGcm9tQ2VudGVyXG5cdFx0fTtcblx0fTtcblx0aGVscGVycy5kaXN0YW5jZUJldHdlZW5Qb2ludHMgPSBmdW5jdGlvbihwdDEsIHB0Mikge1xuXHRcdHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cocHQyLnggLSBwdDEueCwgMikgKyBNYXRoLnBvdyhwdDIueSAtIHB0MS55LCAyKSk7XG5cdH07XG5cdGhlbHBlcnMuYWxpYXNQaXhlbCA9IGZ1bmN0aW9uKHBpeGVsV2lkdGgpIHtcblx0XHRyZXR1cm4gKHBpeGVsV2lkdGggJSAyID09PSAwKSA/IDAgOiAwLjU7XG5cdH07XG5cdGhlbHBlcnMuc3BsaW5lQ3VydmUgPSBmdW5jdGlvbihmaXJzdFBvaW50LCBtaWRkbGVQb2ludCwgYWZ0ZXJQb2ludCwgdCkge1xuXHRcdC8vIFByb3BzIHRvIFJvYiBTcGVuY2VyIGF0IHNjYWxlZCBpbm5vdmF0aW9uIGZvciBoaXMgcG9zdCBvbiBzcGxpbmluZyBiZXR3ZWVuIHBvaW50c1xuXHRcdC8vIGh0dHA6Ly9zY2FsZWRpbm5vdmF0aW9uLmNvbS9hbmFseXRpY3Mvc3BsaW5lcy9hYm91dFNwbGluZXMuaHRtbFxuXG5cdFx0Ly8gVGhpcyBmdW5jdGlvbiBtdXN0IGFsc28gcmVzcGVjdCBcInNraXBwZWRcIiBwb2ludHNcblxuXHRcdHZhciBwcmV2aW91cyA9IGZpcnN0UG9pbnQuc2tpcCA/IG1pZGRsZVBvaW50IDogZmlyc3RQb2ludDtcblx0XHR2YXIgY3VycmVudCA9IG1pZGRsZVBvaW50O1xuXHRcdHZhciBuZXh0ID0gYWZ0ZXJQb2ludC5za2lwID8gbWlkZGxlUG9pbnQgOiBhZnRlclBvaW50O1xuXG5cdFx0dmFyIGQwMSA9IE1hdGguc3FydChNYXRoLnBvdyhjdXJyZW50LnggLSBwcmV2aW91cy54LCAyKSArIE1hdGgucG93KGN1cnJlbnQueSAtIHByZXZpb3VzLnksIDIpKTtcblx0XHR2YXIgZDEyID0gTWF0aC5zcXJ0KE1hdGgucG93KG5leHQueCAtIGN1cnJlbnQueCwgMikgKyBNYXRoLnBvdyhuZXh0LnkgLSBjdXJyZW50LnksIDIpKTtcblxuXHRcdHZhciBzMDEgPSBkMDEgLyAoZDAxICsgZDEyKTtcblx0XHR2YXIgczEyID0gZDEyIC8gKGQwMSArIGQxMik7XG5cblx0XHQvLyBJZiBhbGwgcG9pbnRzIGFyZSB0aGUgc2FtZSwgczAxICYgczAyIHdpbGwgYmUgaW5mXG5cdFx0czAxID0gaXNOYU4oczAxKSA/IDAgOiBzMDE7XG5cdFx0czEyID0gaXNOYU4oczEyKSA/IDAgOiBzMTI7XG5cblx0XHR2YXIgZmEgPSB0ICogczAxOyAvLyBzY2FsaW5nIGZhY3RvciBmb3IgdHJpYW5nbGUgVGFcblx0XHR2YXIgZmIgPSB0ICogczEyO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHByZXZpb3VzOiB7XG5cdFx0XHRcdHg6IGN1cnJlbnQueCAtIGZhICogKG5leHQueCAtIHByZXZpb3VzLngpLFxuXHRcdFx0XHR5OiBjdXJyZW50LnkgLSBmYSAqIChuZXh0LnkgLSBwcmV2aW91cy55KVxuXHRcdFx0fSxcblx0XHRcdG5leHQ6IHtcblx0XHRcdFx0eDogY3VycmVudC54ICsgZmIgKiAobmV4dC54IC0gcHJldmlvdXMueCksXG5cdFx0XHRcdHk6IGN1cnJlbnQueSArIGZiICogKG5leHQueSAtIHByZXZpb3VzLnkpXG5cdFx0XHR9XG5cdFx0fTtcblx0fTtcblx0aGVscGVycy5FUFNJTE9OID0gTnVtYmVyLkVQU0lMT04gfHwgMWUtMTQ7XG5cdGhlbHBlcnMuc3BsaW5lQ3VydmVNb25vdG9uZSA9IGZ1bmN0aW9uKHBvaW50cykge1xuXHRcdC8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBCw6l6aWVyIGNvbnRyb2wgcG9pbnRzIGluIGEgc2ltaWxhciB3YXkgdGhhbiB8c3BsaW5lQ3VydmV8LFxuXHRcdC8vIGJ1dCBwcmVzZXJ2ZXMgbW9ub3RvbmljaXR5IG9mIHRoZSBwcm92aWRlZCBkYXRhIGFuZCBlbnN1cmVzIG5vIGxvY2FsIGV4dHJlbXVtcyBhcmUgYWRkZWRcblx0XHQvLyBiZXR3ZWVuIHRoZSBkYXRhc2V0IGRpc2NyZXRlIHBvaW50cyBkdWUgdG8gdGhlIGludGVycG9sYXRpb24uXG5cdFx0Ly8gU2VlIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9ub3RvbmVfY3ViaWNfaW50ZXJwb2xhdGlvblxuXG5cdFx0dmFyIHBvaW50c1dpdGhUYW5nZW50cyA9IChwb2ludHMgfHwgW10pLm1hcChmdW5jdGlvbihwb2ludCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bW9kZWw6IHBvaW50Ll9tb2RlbCxcblx0XHRcdFx0ZGVsdGFLOiAwLFxuXHRcdFx0XHRtSzogMFxuXHRcdFx0fTtcblx0XHR9KTtcblxuXHRcdC8vIENhbGN1bGF0ZSBzbG9wZXMgKGRlbHRhSykgYW5kIGluaXRpYWxpemUgdGFuZ2VudHMgKG1LKVxuXHRcdHZhciBwb2ludHNMZW4gPSBwb2ludHNXaXRoVGFuZ2VudHMubGVuZ3RoO1xuXHRcdHZhciBpLCBwb2ludEJlZm9yZSwgcG9pbnRDdXJyZW50LCBwb2ludEFmdGVyO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBwb2ludHNMZW47ICsraSkge1xuXHRcdFx0cG9pbnRDdXJyZW50ID0gcG9pbnRzV2l0aFRhbmdlbnRzW2ldO1xuXHRcdFx0aWYgKHBvaW50Q3VycmVudC5tb2RlbC5za2lwKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRwb2ludEJlZm9yZSA9IGkgPiAwID8gcG9pbnRzV2l0aFRhbmdlbnRzW2kgLSAxXSA6IG51bGw7XG5cdFx0XHRwb2ludEFmdGVyID0gaSA8IHBvaW50c0xlbiAtIDEgPyBwb2ludHNXaXRoVGFuZ2VudHNbaSArIDFdIDogbnVsbDtcblx0XHRcdGlmIChwb2ludEFmdGVyICYmICFwb2ludEFmdGVyLm1vZGVsLnNraXApIHtcblx0XHRcdFx0dmFyIHNsb3BlRGVsdGFYID0gKHBvaW50QWZ0ZXIubW9kZWwueCAtIHBvaW50Q3VycmVudC5tb2RlbC54KTtcblxuXHRcdFx0XHQvLyBJbiB0aGUgY2FzZSBvZiB0d28gcG9pbnRzIHRoYXQgYXBwZWFyIGF0IHRoZSBzYW1lIHggcGl4ZWwsIHNsb3BlRGVsdGFYIGlzIDBcblx0XHRcdFx0cG9pbnRDdXJyZW50LmRlbHRhSyA9IHNsb3BlRGVsdGFYICE9PSAwID8gKHBvaW50QWZ0ZXIubW9kZWwueSAtIHBvaW50Q3VycmVudC5tb2RlbC55KSAvIHNsb3BlRGVsdGFYIDogMDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFwb2ludEJlZm9yZSB8fCBwb2ludEJlZm9yZS5tb2RlbC5za2lwKSB7XG5cdFx0XHRcdHBvaW50Q3VycmVudC5tSyA9IHBvaW50Q3VycmVudC5kZWx0YUs7XG5cdFx0XHR9IGVsc2UgaWYgKCFwb2ludEFmdGVyIHx8IHBvaW50QWZ0ZXIubW9kZWwuc2tpcCkge1xuXHRcdFx0XHRwb2ludEN1cnJlbnQubUsgPSBwb2ludEJlZm9yZS5kZWx0YUs7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuc2lnbihwb2ludEJlZm9yZS5kZWx0YUspICE9PSB0aGlzLnNpZ24ocG9pbnRDdXJyZW50LmRlbHRhSykpIHtcblx0XHRcdFx0cG9pbnRDdXJyZW50Lm1LID0gMDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBvaW50Q3VycmVudC5tSyA9IChwb2ludEJlZm9yZS5kZWx0YUsgKyBwb2ludEN1cnJlbnQuZGVsdGFLKSAvIDI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRqdXN0IHRhbmdlbnRzIHRvIGVuc3VyZSBtb25vdG9uaWMgcHJvcGVydGllc1xuXHRcdHZhciBhbHBoYUssIGJldGFLLCB0YXVLLCBzcXVhcmVkTWFnbml0dWRlO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBwb2ludHNMZW4gLSAxOyArK2kpIHtcblx0XHRcdHBvaW50Q3VycmVudCA9IHBvaW50c1dpdGhUYW5nZW50c1tpXTtcblx0XHRcdHBvaW50QWZ0ZXIgPSBwb2ludHNXaXRoVGFuZ2VudHNbaSArIDFdO1xuXHRcdFx0aWYgKHBvaW50Q3VycmVudC5tb2RlbC5za2lwIHx8IHBvaW50QWZ0ZXIubW9kZWwuc2tpcCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGhlbHBlcnMuYWxtb3N0RXF1YWxzKHBvaW50Q3VycmVudC5kZWx0YUssIDAsIHRoaXMuRVBTSUxPTikpIHtcblx0XHRcdFx0cG9pbnRDdXJyZW50Lm1LID0gcG9pbnRBZnRlci5tSyA9IDA7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRhbHBoYUsgPSBwb2ludEN1cnJlbnQubUsgLyBwb2ludEN1cnJlbnQuZGVsdGFLO1xuXHRcdFx0YmV0YUsgPSBwb2ludEFmdGVyLm1LIC8gcG9pbnRDdXJyZW50LmRlbHRhSztcblx0XHRcdHNxdWFyZWRNYWduaXR1ZGUgPSBNYXRoLnBvdyhhbHBoYUssIDIpICsgTWF0aC5wb3coYmV0YUssIDIpO1xuXHRcdFx0aWYgKHNxdWFyZWRNYWduaXR1ZGUgPD0gOSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGF1SyA9IDMgLyBNYXRoLnNxcnQoc3F1YXJlZE1hZ25pdHVkZSk7XG5cdFx0XHRwb2ludEN1cnJlbnQubUsgPSBhbHBoYUsgKiB0YXVLICogcG9pbnRDdXJyZW50LmRlbHRhSztcblx0XHRcdHBvaW50QWZ0ZXIubUsgPSBiZXRhSyAqIHRhdUsgKiBwb2ludEN1cnJlbnQuZGVsdGFLO1xuXHRcdH1cblxuXHRcdC8vIENvbXB1dGUgY29udHJvbCBwb2ludHNcblx0XHR2YXIgZGVsdGFYO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBwb2ludHNMZW47ICsraSkge1xuXHRcdFx0cG9pbnRDdXJyZW50ID0gcG9pbnRzV2l0aFRhbmdlbnRzW2ldO1xuXHRcdFx0aWYgKHBvaW50Q3VycmVudC5tb2RlbC5za2lwKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRwb2ludEJlZm9yZSA9IGkgPiAwID8gcG9pbnRzV2l0aFRhbmdlbnRzW2kgLSAxXSA6IG51bGw7XG5cdFx0XHRwb2ludEFmdGVyID0gaSA8IHBvaW50c0xlbiAtIDEgPyBwb2ludHNXaXRoVGFuZ2VudHNbaSArIDFdIDogbnVsbDtcblx0XHRcdGlmIChwb2ludEJlZm9yZSAmJiAhcG9pbnRCZWZvcmUubW9kZWwuc2tpcCkge1xuXHRcdFx0XHRkZWx0YVggPSAocG9pbnRDdXJyZW50Lm1vZGVsLnggLSBwb2ludEJlZm9yZS5tb2RlbC54KSAvIDM7XG5cdFx0XHRcdHBvaW50Q3VycmVudC5tb2RlbC5jb250cm9sUG9pbnRQcmV2aW91c1ggPSBwb2ludEN1cnJlbnQubW9kZWwueCAtIGRlbHRhWDtcblx0XHRcdFx0cG9pbnRDdXJyZW50Lm1vZGVsLmNvbnRyb2xQb2ludFByZXZpb3VzWSA9IHBvaW50Q3VycmVudC5tb2RlbC55IC0gZGVsdGFYICogcG9pbnRDdXJyZW50Lm1LO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBvaW50QWZ0ZXIgJiYgIXBvaW50QWZ0ZXIubW9kZWwuc2tpcCkge1xuXHRcdFx0XHRkZWx0YVggPSAocG9pbnRBZnRlci5tb2RlbC54IC0gcG9pbnRDdXJyZW50Lm1vZGVsLngpIC8gMztcblx0XHRcdFx0cG9pbnRDdXJyZW50Lm1vZGVsLmNvbnRyb2xQb2ludE5leHRYID0gcG9pbnRDdXJyZW50Lm1vZGVsLnggKyBkZWx0YVg7XG5cdFx0XHRcdHBvaW50Q3VycmVudC5tb2RlbC5jb250cm9sUG9pbnROZXh0WSA9IHBvaW50Q3VycmVudC5tb2RlbC55ICsgZGVsdGFYICogcG9pbnRDdXJyZW50Lm1LO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aGVscGVycy5uZXh0SXRlbSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGluZGV4LCBsb29wKSB7XG5cdFx0aWYgKGxvb3ApIHtcblx0XHRcdHJldHVybiBpbmRleCA+PSBjb2xsZWN0aW9uLmxlbmd0aCAtIDEgPyBjb2xsZWN0aW9uWzBdIDogY29sbGVjdGlvbltpbmRleCArIDFdO1xuXHRcdH1cblx0XHRyZXR1cm4gaW5kZXggPj0gY29sbGVjdGlvbi5sZW5ndGggLSAxID8gY29sbGVjdGlvbltjb2xsZWN0aW9uLmxlbmd0aCAtIDFdIDogY29sbGVjdGlvbltpbmRleCArIDFdO1xuXHR9O1xuXHRoZWxwZXJzLnByZXZpb3VzSXRlbSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGluZGV4LCBsb29wKSB7XG5cdFx0aWYgKGxvb3ApIHtcblx0XHRcdHJldHVybiBpbmRleCA8PSAwID8gY29sbGVjdGlvbltjb2xsZWN0aW9uLmxlbmd0aCAtIDFdIDogY29sbGVjdGlvbltpbmRleCAtIDFdO1xuXHRcdH1cblx0XHRyZXR1cm4gaW5kZXggPD0gMCA/IGNvbGxlY3Rpb25bMF0gOiBjb2xsZWN0aW9uW2luZGV4IC0gMV07XG5cdH07XG5cdC8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBuaWNlIG51bWJlciBhbGdvcml0aG0gdXNlZCBpbiBkZXRlcm1pbmluZyB3aGVyZSBheGlzIGxhYmVscyB3aWxsIGdvXG5cdGhlbHBlcnMubmljZU51bSA9IGZ1bmN0aW9uKHJhbmdlLCByb3VuZCkge1xuXHRcdHZhciBleHBvbmVudCA9IE1hdGguZmxvb3IoaGVscGVycy5sb2cxMChyYW5nZSkpO1xuXHRcdHZhciBmcmFjdGlvbiA9IHJhbmdlIC8gTWF0aC5wb3coMTAsIGV4cG9uZW50KTtcblx0XHR2YXIgbmljZUZyYWN0aW9uO1xuXG5cdFx0aWYgKHJvdW5kKSB7XG5cdFx0XHRpZiAoZnJhY3Rpb24gPCAxLjUpIHtcblx0XHRcdFx0bmljZUZyYWN0aW9uID0gMTtcblx0XHRcdH0gZWxzZSBpZiAoZnJhY3Rpb24gPCAzKSB7XG5cdFx0XHRcdG5pY2VGcmFjdGlvbiA9IDI7XG5cdFx0XHR9IGVsc2UgaWYgKGZyYWN0aW9uIDwgNykge1xuXHRcdFx0XHRuaWNlRnJhY3Rpb24gPSA1O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bmljZUZyYWN0aW9uID0gMTA7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChmcmFjdGlvbiA8PSAxLjApIHtcblx0XHRcdG5pY2VGcmFjdGlvbiA9IDE7XG5cdFx0fSBlbHNlIGlmIChmcmFjdGlvbiA8PSAyKSB7XG5cdFx0XHRuaWNlRnJhY3Rpb24gPSAyO1xuXHRcdH0gZWxzZSBpZiAoZnJhY3Rpb24gPD0gNSkge1xuXHRcdFx0bmljZUZyYWN0aW9uID0gNTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmljZUZyYWN0aW9uID0gMTA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5pY2VGcmFjdGlvbiAqIE1hdGgucG93KDEwLCBleHBvbmVudCk7XG5cdH07XG5cdC8vIFJlcXVlc3QgYW5pbWF0aW9uIHBvbHlmaWxsIC0gaHR0cDovL3d3dy5wYXVsaXJpc2guY29tLzIwMTEvcmVxdWVzdGFuaW1hdGlvbmZyYW1lLWZvci1zbWFydC1hbmltYXRpbmcvXG5cdGhlbHBlcnMucmVxdWVzdEFuaW1GcmFtZSA9IChmdW5jdGlvbigpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykge1xuXHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHR3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG5cdFx0XHRcdHJldHVybiB3aW5kb3cuc2V0VGltZW91dChjYWxsYmFjaywgMTAwMCAvIDYwKTtcblx0XHRcdH07XG5cdH0oKSk7XG5cdC8vIC0tIERPTSBtZXRob2RzXG5cdGhlbHBlcnMuZ2V0UmVsYXRpdmVQb3NpdGlvbiA9IGZ1bmN0aW9uKGV2dCwgY2hhcnQpIHtcblx0XHR2YXIgbW91c2VYLCBtb3VzZVk7XG5cdFx0dmFyIGUgPSBldnQub3JpZ2luYWxFdmVudCB8fCBldnQ7XG5cdFx0dmFyIGNhbnZhcyA9IGV2dC50YXJnZXQgfHwgZXZ0LnNyY0VsZW1lbnQ7XG5cdFx0dmFyIGJvdW5kaW5nUmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdHZhciB0b3VjaGVzID0gZS50b3VjaGVzO1xuXHRcdGlmICh0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0bW91c2VYID0gdG91Y2hlc1swXS5jbGllbnRYO1xuXHRcdFx0bW91c2VZID0gdG91Y2hlc1swXS5jbGllbnRZO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1vdXNlWCA9IGUuY2xpZW50WDtcblx0XHRcdG1vdXNlWSA9IGUuY2xpZW50WTtcblx0XHR9XG5cblx0XHQvLyBTY2FsZSBtb3VzZSBjb29yZGluYXRlcyBpbnRvIGNhbnZhcyBjb29yZGluYXRlc1xuXHRcdC8vIGJ5IGZvbGxvd2luZyB0aGUgcGF0dGVybiBsYWlkIG91dCBieSAnamVycnlqJyBpbiB0aGUgY29tbWVudHMgb2Zcblx0XHQvLyBodHRwOi8vd3d3Lmh0bWw1Y2FudmFzdHV0b3JpYWxzLmNvbS9hZHZhbmNlZC9odG1sNS1jYW52YXMtbW91c2UtY29vcmRpbmF0ZXMvXG5cdFx0dmFyIHBhZGRpbmdMZWZ0ID0gcGFyc2VGbG9hdChoZWxwZXJzLmdldFN0eWxlKGNhbnZhcywgJ3BhZGRpbmctbGVmdCcpKTtcblx0XHR2YXIgcGFkZGluZ1RvcCA9IHBhcnNlRmxvYXQoaGVscGVycy5nZXRTdHlsZShjYW52YXMsICdwYWRkaW5nLXRvcCcpKTtcblx0XHR2YXIgcGFkZGluZ1JpZ2h0ID0gcGFyc2VGbG9hdChoZWxwZXJzLmdldFN0eWxlKGNhbnZhcywgJ3BhZGRpbmctcmlnaHQnKSk7XG5cdFx0dmFyIHBhZGRpbmdCb3R0b20gPSBwYXJzZUZsb2F0KGhlbHBlcnMuZ2V0U3R5bGUoY2FudmFzLCAncGFkZGluZy1ib3R0b20nKSk7XG5cdFx0dmFyIHdpZHRoID0gYm91bmRpbmdSZWN0LnJpZ2h0IC0gYm91bmRpbmdSZWN0LmxlZnQgLSBwYWRkaW5nTGVmdCAtIHBhZGRpbmdSaWdodDtcblx0XHR2YXIgaGVpZ2h0ID0gYm91bmRpbmdSZWN0LmJvdHRvbSAtIGJvdW5kaW5nUmVjdC50b3AgLSBwYWRkaW5nVG9wIC0gcGFkZGluZ0JvdHRvbTtcblxuXHRcdC8vIFdlIGRpdmlkZSBieSB0aGUgY3VycmVudCBkZXZpY2UgcGl4ZWwgcmF0aW8sIGJlY2F1c2UgdGhlIGNhbnZhcyBpcyBzY2FsZWQgdXAgYnkgdGhhdCBhbW91bnQgaW4gZWFjaCBkaXJlY3Rpb24uIEhvd2V2ZXJcblx0XHQvLyB0aGUgYmFja2VuZCBtb2RlbCBpcyBpbiB1bnNjYWxlZCBjb29yZGluYXRlcy4gU2luY2Ugd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aCBvdXIgbW9kZWwgY29vcmRpbmF0ZXMsIHdlIGdvIGJhY2sgaGVyZVxuXHRcdG1vdXNlWCA9IE1hdGgucm91bmQoKG1vdXNlWCAtIGJvdW5kaW5nUmVjdC5sZWZ0IC0gcGFkZGluZ0xlZnQpIC8gKHdpZHRoKSAqIGNhbnZhcy53aWR0aCAvIGNoYXJ0LmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvKTtcblx0XHRtb3VzZVkgPSBNYXRoLnJvdW5kKChtb3VzZVkgLSBib3VuZGluZ1JlY3QudG9wIC0gcGFkZGluZ1RvcCkgLyAoaGVpZ2h0KSAqIGNhbnZhcy5oZWlnaHQgLyBjaGFydC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0eDogbW91c2VYLFxuXHRcdFx0eTogbW91c2VZXG5cdFx0fTtcblxuXHR9O1xuXG5cdC8vIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgbWF4LXdpZHRoL21heC1oZWlnaHQgdmFsdWVzIHRoYXQgbWF5IGJlIHBlcmNlbnRhZ2VzIGludG8gYSBudW1iZXJcblx0ZnVuY3Rpb24gcGFyc2VNYXhTdHlsZShzdHlsZVZhbHVlLCBub2RlLCBwYXJlbnRQcm9wZXJ0eSkge1xuXHRcdHZhciB2YWx1ZUluUGl4ZWxzO1xuXHRcdGlmICh0eXBlb2Ygc3R5bGVWYWx1ZSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHZhbHVlSW5QaXhlbHMgPSBwYXJzZUludChzdHlsZVZhbHVlLCAxMCk7XG5cblx0XHRcdGlmIChzdHlsZVZhbHVlLmluZGV4T2YoJyUnKSAhPT0gLTEpIHtcblx0XHRcdFx0Ly8gcGVyY2VudGFnZSAqIHNpemUgaW4gZGltZW5zaW9uXG5cdFx0XHRcdHZhbHVlSW5QaXhlbHMgPSB2YWx1ZUluUGl4ZWxzIC8gMTAwICogbm9kZS5wYXJlbnROb2RlW3BhcmVudFByb3BlcnR5XTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFsdWVJblBpeGVscyA9IHN0eWxlVmFsdWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlSW5QaXhlbHM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBpZiB0aGUgZ2l2ZW4gdmFsdWUgY29udGFpbnMgYW4gZWZmZWN0aXZlIGNvbnN0cmFpbnQuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBpc0NvbnN0cmFpbmVkVmFsdWUodmFsdWUpIHtcblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gJ25vbmUnO1xuXHR9XG5cblx0Ly8gUHJpdmF0ZSBoZWxwZXIgdG8gZ2V0IGEgY29uc3RyYWludCBkaW1lbnNpb25cblx0Ly8gQHBhcmFtIGRvbU5vZGUgOiB0aGUgbm9kZSB0byBjaGVjayB0aGUgY29uc3RyYWludCBvblxuXHQvLyBAcGFyYW0gbWF4U3R5bGUgOiB0aGUgc3R5bGUgdGhhdCBkZWZpbmVzIHRoZSBtYXhpbXVtIGZvciB0aGUgZGlyZWN0aW9uIHdlIGFyZSB1c2luZyAobWF4V2lkdGggLyBtYXhIZWlnaHQpXG5cdC8vIEBwYXJhbSBwZXJjZW50YWdlUHJvcGVydHkgOiBwcm9wZXJ0eSBvZiBwYXJlbnQgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgd2lkdGggYXMgYSBwZXJjZW50YWdlXG5cdC8vIEBzZWUgaHR0cDovL3d3dy5uYXRoYW5hZWxqb25lcy5jb20vYmxvZy8yMDEzL3JlYWRpbmctbWF4LXdpZHRoLWNyb3NzLWJyb3dzZXJcblx0ZnVuY3Rpb24gZ2V0Q29uc3RyYWludERpbWVuc2lvbihkb21Ob2RlLCBtYXhTdHlsZSwgcGVyY2VudGFnZVByb3BlcnR5KSB7XG5cdFx0dmFyIHZpZXcgPSBkb2N1bWVudC5kZWZhdWx0Vmlldztcblx0XHR2YXIgcGFyZW50Tm9kZSA9IGhlbHBlcnMuX2dldFBhcmVudE5vZGUoZG9tTm9kZSk7XG5cdFx0dmFyIGNvbnN0cmFpbmVkTm9kZSA9IHZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShkb21Ob2RlKVttYXhTdHlsZV07XG5cdFx0dmFyIGNvbnN0cmFpbmVkQ29udGFpbmVyID0gdmlldy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudE5vZGUpW21heFN0eWxlXTtcblx0XHR2YXIgaGFzQ05vZGUgPSBpc0NvbnN0cmFpbmVkVmFsdWUoY29uc3RyYWluZWROb2RlKTtcblx0XHR2YXIgaGFzQ0NvbnRhaW5lciA9IGlzQ29uc3RyYWluZWRWYWx1ZShjb25zdHJhaW5lZENvbnRhaW5lcik7XG5cdFx0dmFyIGluZmluaXR5ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXG5cdFx0aWYgKGhhc0NOb2RlIHx8IGhhc0NDb250YWluZXIpIHtcblx0XHRcdHJldHVybiBNYXRoLm1pbihcblx0XHRcdFx0aGFzQ05vZGUgPyBwYXJzZU1heFN0eWxlKGNvbnN0cmFpbmVkTm9kZSwgZG9tTm9kZSwgcGVyY2VudGFnZVByb3BlcnR5KSA6IGluZmluaXR5LFxuXHRcdFx0XHRoYXNDQ29udGFpbmVyID8gcGFyc2VNYXhTdHlsZShjb25zdHJhaW5lZENvbnRhaW5lciwgcGFyZW50Tm9kZSwgcGVyY2VudGFnZVByb3BlcnR5KSA6IGluZmluaXR5KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gJ25vbmUnO1xuXHR9XG5cdC8vIHJldHVybnMgTnVtYmVyIG9yIHVuZGVmaW5lZCBpZiBubyBjb25zdHJhaW50XG5cdGhlbHBlcnMuZ2V0Q29uc3RyYWludFdpZHRoID0gZnVuY3Rpb24oZG9tTm9kZSkge1xuXHRcdHJldHVybiBnZXRDb25zdHJhaW50RGltZW5zaW9uKGRvbU5vZGUsICdtYXgtd2lkdGgnLCAnY2xpZW50V2lkdGgnKTtcblx0fTtcblx0Ly8gcmV0dXJucyBOdW1iZXIgb3IgdW5kZWZpbmVkIGlmIG5vIGNvbnN0cmFpbnRcblx0aGVscGVycy5nZXRDb25zdHJhaW50SGVpZ2h0ID0gZnVuY3Rpb24oZG9tTm9kZSkge1xuXHRcdHJldHVybiBnZXRDb25zdHJhaW50RGltZW5zaW9uKGRvbU5vZGUsICdtYXgtaGVpZ2h0JywgJ2NsaWVudEhlaWdodCcpO1xuXHR9O1xuXHQvKipcblx0ICogQHByaXZhdGVcbiBcdCAqL1xuXHRoZWxwZXJzLl9jYWxjdWxhdGVQYWRkaW5nID0gZnVuY3Rpb24oY29udGFpbmVyLCBwYWRkaW5nLCBwYXJlbnREaW1lbnNpb24pIHtcblx0XHRwYWRkaW5nID0gaGVscGVycy5nZXRTdHlsZShjb250YWluZXIsIHBhZGRpbmcpO1xuXG5cdFx0cmV0dXJuIHBhZGRpbmcuaW5kZXhPZignJScpID4gLTEgPyBwYXJlbnREaW1lbnNpb24gLyBwYXJzZUludChwYWRkaW5nLCAxMCkgOiBwYXJzZUludChwYWRkaW5nLCAxMCk7XG5cdH07XG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0aGVscGVycy5fZ2V0UGFyZW50Tm9kZSA9IGZ1bmN0aW9uKGRvbU5vZGUpIHtcblx0XHR2YXIgcGFyZW50ID0gZG9tTm9kZS5wYXJlbnROb2RlO1xuXHRcdGlmIChwYXJlbnQgJiYgcGFyZW50Lmhvc3QpIHtcblx0XHRcdHBhcmVudCA9IHBhcmVudC5ob3N0O1xuXHRcdH1cblx0XHRyZXR1cm4gcGFyZW50O1xuXHR9O1xuXHRoZWxwZXJzLmdldE1heGltdW1XaWR0aCA9IGZ1bmN0aW9uKGRvbU5vZGUpIHtcblx0XHR2YXIgY29udGFpbmVyID0gaGVscGVycy5fZ2V0UGFyZW50Tm9kZShkb21Ob2RlKTtcblx0XHRpZiAoIWNvbnRhaW5lcikge1xuXHRcdFx0cmV0dXJuIGRvbU5vZGUuY2xpZW50V2lkdGg7XG5cdFx0fVxuXG5cdFx0dmFyIGNsaWVudFdpZHRoID0gY29udGFpbmVyLmNsaWVudFdpZHRoO1xuXHRcdHZhciBwYWRkaW5nTGVmdCA9IGhlbHBlcnMuX2NhbGN1bGF0ZVBhZGRpbmcoY29udGFpbmVyLCAncGFkZGluZy1sZWZ0JywgY2xpZW50V2lkdGgpO1xuXHRcdHZhciBwYWRkaW5nUmlnaHQgPSBoZWxwZXJzLl9jYWxjdWxhdGVQYWRkaW5nKGNvbnRhaW5lciwgJ3BhZGRpbmctcmlnaHQnLCBjbGllbnRXaWR0aCk7XG5cblx0XHR2YXIgdyA9IGNsaWVudFdpZHRoIC0gcGFkZGluZ0xlZnQgLSBwYWRkaW5nUmlnaHQ7XG5cdFx0dmFyIGN3ID0gaGVscGVycy5nZXRDb25zdHJhaW50V2lkdGgoZG9tTm9kZSk7XG5cdFx0cmV0dXJuIGlzTmFOKGN3KSA/IHcgOiBNYXRoLm1pbih3LCBjdyk7XG5cdH07XG5cdGhlbHBlcnMuZ2V0TWF4aW11bUhlaWdodCA9IGZ1bmN0aW9uKGRvbU5vZGUpIHtcblx0XHR2YXIgY29udGFpbmVyID0gaGVscGVycy5fZ2V0UGFyZW50Tm9kZShkb21Ob2RlKTtcblx0XHRpZiAoIWNvbnRhaW5lcikge1xuXHRcdFx0cmV0dXJuIGRvbU5vZGUuY2xpZW50SGVpZ2h0O1xuXHRcdH1cblxuXHRcdHZhciBjbGllbnRIZWlnaHQgPSBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xuXHRcdHZhciBwYWRkaW5nVG9wID0gaGVscGVycy5fY2FsY3VsYXRlUGFkZGluZyhjb250YWluZXIsICdwYWRkaW5nLXRvcCcsIGNsaWVudEhlaWdodCk7XG5cdFx0dmFyIHBhZGRpbmdCb3R0b20gPSBoZWxwZXJzLl9jYWxjdWxhdGVQYWRkaW5nKGNvbnRhaW5lciwgJ3BhZGRpbmctYm90dG9tJywgY2xpZW50SGVpZ2h0KTtcblxuXHRcdHZhciBoID0gY2xpZW50SGVpZ2h0IC0gcGFkZGluZ1RvcCAtIHBhZGRpbmdCb3R0b207XG5cdFx0dmFyIGNoID0gaGVscGVycy5nZXRDb25zdHJhaW50SGVpZ2h0KGRvbU5vZGUpO1xuXHRcdHJldHVybiBpc05hTihjaCkgPyBoIDogTWF0aC5taW4oaCwgY2gpO1xuXHR9O1xuXHRoZWxwZXJzLmdldFN0eWxlID0gZnVuY3Rpb24oZWwsIHByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIGVsLmN1cnJlbnRTdHlsZSA/XG5cdFx0XHRlbC5jdXJyZW50U3R5bGVbcHJvcGVydHldIDpcblx0XHRcdGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHkpO1xuXHR9O1xuXHRoZWxwZXJzLnJldGluYVNjYWxlID0gZnVuY3Rpb24oY2hhcnQsIGZvcmNlUmF0aW8pIHtcblx0XHR2YXIgcGl4ZWxSYXRpbyA9IGNoYXJ0LmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvID0gZm9yY2VSYXRpbyB8fCAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8pIHx8IDE7XG5cdFx0aWYgKHBpeGVsUmF0aW8gPT09IDEpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgY2FudmFzID0gY2hhcnQuY2FudmFzO1xuXHRcdHZhciBoZWlnaHQgPSBjaGFydC5oZWlnaHQ7XG5cdFx0dmFyIHdpZHRoID0gY2hhcnQud2lkdGg7XG5cblx0XHRjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogcGl4ZWxSYXRpbztcblx0XHRjYW52YXMud2lkdGggPSB3aWR0aCAqIHBpeGVsUmF0aW87XG5cdFx0Y2hhcnQuY3R4LnNjYWxlKHBpeGVsUmF0aW8sIHBpeGVsUmF0aW8pO1xuXG5cdFx0Ly8gSWYgbm8gc3R5bGUgaGFzIGJlZW4gc2V0IG9uIHRoZSBjYW52YXMsIHRoZSByZW5kZXIgc2l6ZSBpcyB1c2VkIGFzIGRpc3BsYXkgc2l6ZSxcblx0XHQvLyBtYWtpbmcgdGhlIGNoYXJ0IHZpc3VhbGx5IGJpZ2dlciwgc28gbGV0J3MgZW5mb3JjZSBpdCB0byB0aGUgXCJjb3JyZWN0XCIgdmFsdWVzLlxuXHRcdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMzU3NVxuXHRcdGlmICghY2FudmFzLnN0eWxlLmhlaWdodCAmJiAhY2FudmFzLnN0eWxlLndpZHRoKSB7XG5cdFx0XHRjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4Jztcblx0XHRcdGNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4Jztcblx0XHR9XG5cdH07XG5cdC8vIC0tIENhbnZhcyBtZXRob2RzXG5cdGhlbHBlcnMuZm9udFN0cmluZyA9IGZ1bmN0aW9uKHBpeGVsU2l6ZSwgZm9udFN0eWxlLCBmb250RmFtaWx5KSB7XG5cdFx0cmV0dXJuIGZvbnRTdHlsZSArICcgJyArIHBpeGVsU2l6ZSArICdweCAnICsgZm9udEZhbWlseTtcblx0fTtcblx0aGVscGVycy5sb25nZXN0VGV4dCA9IGZ1bmN0aW9uKGN0eCwgZm9udCwgYXJyYXlPZlRoaW5ncywgY2FjaGUpIHtcblx0XHRjYWNoZSA9IGNhY2hlIHx8IHt9O1xuXHRcdHZhciBkYXRhID0gY2FjaGUuZGF0YSA9IGNhY2hlLmRhdGEgfHwge307XG5cdFx0dmFyIGdjID0gY2FjaGUuZ2FyYmFnZUNvbGxlY3QgPSBjYWNoZS5nYXJiYWdlQ29sbGVjdCB8fCBbXTtcblxuXHRcdGlmIChjYWNoZS5mb250ICE9PSBmb250KSB7XG5cdFx0XHRkYXRhID0gY2FjaGUuZGF0YSA9IHt9O1xuXHRcdFx0Z2MgPSBjYWNoZS5nYXJiYWdlQ29sbGVjdCA9IFtdO1xuXHRcdFx0Y2FjaGUuZm9udCA9IGZvbnQ7XG5cdFx0fVxuXG5cdFx0Y3R4LmZvbnQgPSBmb250O1xuXHRcdHZhciBsb25nZXN0ID0gMDtcblx0XHRoZWxwZXJzLmVhY2goYXJyYXlPZlRoaW5ncywgZnVuY3Rpb24odGhpbmcpIHtcblx0XHRcdC8vIFVuZGVmaW5lZCBzdHJpbmdzIGFuZCBhcnJheXMgc2hvdWxkIG5vdCBiZSBtZWFzdXJlZFxuXHRcdFx0aWYgKHRoaW5nICE9PSB1bmRlZmluZWQgJiYgdGhpbmcgIT09IG51bGwgJiYgaGVscGVycy5pc0FycmF5KHRoaW5nKSAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRsb25nZXN0ID0gaGVscGVycy5tZWFzdXJlVGV4dChjdHgsIGRhdGEsIGdjLCBsb25nZXN0LCB0aGluZyk7XG5cdFx0XHR9IGVsc2UgaWYgKGhlbHBlcnMuaXNBcnJheSh0aGluZykpIHtcblx0XHRcdFx0Ly8gaWYgaXQgaXMgYW4gYXJyYXkgbGV0cyBtZWFzdXJlIGVhY2ggZWxlbWVudFxuXHRcdFx0XHQvLyB0byBkbyBtYXliZSBzaW1wbGlmeSB0aGlzIGZ1bmN0aW9uIGEgYml0IHNvIHdlIGNhbiBkbyB0aGlzIG1vcmUgcmVjdXJzaXZlbHk/XG5cdFx0XHRcdGhlbHBlcnMuZWFjaCh0aGluZywgZnVuY3Rpb24obmVzdGVkVGhpbmcpIHtcblx0XHRcdFx0XHQvLyBVbmRlZmluZWQgc3RyaW5ncyBhbmQgYXJyYXlzIHNob3VsZCBub3QgYmUgbWVhc3VyZWRcblx0XHRcdFx0XHRpZiAobmVzdGVkVGhpbmcgIT09IHVuZGVmaW5lZCAmJiBuZXN0ZWRUaGluZyAhPT0gbnVsbCAmJiAhaGVscGVycy5pc0FycmF5KG5lc3RlZFRoaW5nKSkge1xuXHRcdFx0XHRcdFx0bG9uZ2VzdCA9IGhlbHBlcnMubWVhc3VyZVRleHQoY3R4LCBkYXRhLCBnYywgbG9uZ2VzdCwgbmVzdGVkVGhpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR2YXIgZ2NMZW4gPSBnYy5sZW5ndGggLyAyO1xuXHRcdGlmIChnY0xlbiA+IGFycmF5T2ZUaGluZ3MubGVuZ3RoKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGdjTGVuOyBpKyspIHtcblx0XHRcdFx0ZGVsZXRlIGRhdGFbZ2NbaV1dO1xuXHRcdFx0fVxuXHRcdFx0Z2Muc3BsaWNlKDAsIGdjTGVuKTtcblx0XHR9XG5cdFx0cmV0dXJuIGxvbmdlc3Q7XG5cdH07XG5cdGhlbHBlcnMubWVhc3VyZVRleHQgPSBmdW5jdGlvbihjdHgsIGRhdGEsIGdjLCBsb25nZXN0LCBzdHJpbmcpIHtcblx0XHR2YXIgdGV4dFdpZHRoID0gZGF0YVtzdHJpbmddO1xuXHRcdGlmICghdGV4dFdpZHRoKSB7XG5cdFx0XHR0ZXh0V2lkdGggPSBkYXRhW3N0cmluZ10gPSBjdHgubWVhc3VyZVRleHQoc3RyaW5nKS53aWR0aDtcblx0XHRcdGdjLnB1c2goc3RyaW5nKTtcblx0XHR9XG5cdFx0aWYgKHRleHRXaWR0aCA+IGxvbmdlc3QpIHtcblx0XHRcdGxvbmdlc3QgPSB0ZXh0V2lkdGg7XG5cdFx0fVxuXHRcdHJldHVybiBsb25nZXN0O1xuXHR9O1xuXHRoZWxwZXJzLm51bWJlck9mTGFiZWxMaW5lcyA9IGZ1bmN0aW9uKGFycmF5T2ZUaGluZ3MpIHtcblx0XHR2YXIgbnVtYmVyT2ZMaW5lcyA9IDE7XG5cdFx0aGVscGVycy5lYWNoKGFycmF5T2ZUaGluZ3MsIGZ1bmN0aW9uKHRoaW5nKSB7XG5cdFx0XHRpZiAoaGVscGVycy5pc0FycmF5KHRoaW5nKSkge1xuXHRcdFx0XHRpZiAodGhpbmcubGVuZ3RoID4gbnVtYmVyT2ZMaW5lcykge1xuXHRcdFx0XHRcdG51bWJlck9mTGluZXMgPSB0aGluZy5sZW5ndGg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gbnVtYmVyT2ZMaW5lcztcblx0fTtcblxuXHRoZWxwZXJzLmNvbG9yID0gIWNvbG9yID9cblx0XHRmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0Y29uc29sZS5lcnJvcignQ29sb3IuanMgbm90IGZvdW5kIScpO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH0gOlxuXHRcdGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHQvKiBnbG9iYWwgQ2FudmFzR3JhZGllbnQgKi9cblx0XHRcdGlmICh2YWx1ZSBpbnN0YW5jZW9mIENhbnZhc0dyYWRpZW50KSB7XG5cdFx0XHRcdHZhbHVlID0gZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRDb2xvcjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNvbG9yKHZhbHVlKTtcblx0XHR9O1xuXG5cdGhlbHBlcnMuZ2V0SG92ZXJDb2xvciA9IGZ1bmN0aW9uKGNvbG9yVmFsdWUpIHtcblx0XHQvKiBnbG9iYWwgQ2FudmFzUGF0dGVybiAqL1xuXHRcdHJldHVybiAoY29sb3JWYWx1ZSBpbnN0YW5jZW9mIENhbnZhc1BhdHRlcm4pID9cblx0XHRcdGNvbG9yVmFsdWUgOlxuXHRcdFx0aGVscGVycy5jb2xvcihjb2xvclZhbHVlKS5zYXR1cmF0ZSgwLjUpLmRhcmtlbigwLjEpLnJnYlN0cmluZygpO1xuXHR9O1xufTtcblxufSx7XCIyNlwiOjI2LFwiM1wiOjMsXCIzNFwiOjM0LFwiNDZcIjo0Nn1dLDI5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHJlbGF0aXZlIHBvc2l0aW9uIGZvciBhbiBldmVudFxuICogQHBhcmFtIHtFdmVudHxJRXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IHRvIGdldCB0aGUgcG9zaXRpb24gZm9yXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIFRoZSBjaGFydFxuICogQHJldHVybnMge1BvaW50fSB0aGUgZXZlbnQgcG9zaXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCkge1xuXHRpZiAoZS5uYXRpdmUpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0eDogZS54LFxuXHRcdFx0eTogZS55XG5cdFx0fTtcblx0fVxuXG5cdHJldHVybiBoZWxwZXJzLmdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byB0cmF2ZXJzZSBhbGwgb2YgdGhlIHZpc2libGUgZWxlbWVudHMgaW4gdGhlIGNoYXJ0XG4gKiBAcGFyYW0gY2hhcnQge2NoYXJ0fSB0aGUgY2hhcnRcbiAqIEBwYXJhbSBoYW5kbGVyIHtGdW5jdGlvbn0gdGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgZm9yIGVhY2ggdmlzaWJsZSBpdGVtXG4gKi9cbmZ1bmN0aW9uIHBhcnNlVmlzaWJsZUl0ZW1zKGNoYXJ0LCBoYW5kbGVyKSB7XG5cdHZhciBkYXRhc2V0cyA9IGNoYXJ0LmRhdGEuZGF0YXNldHM7XG5cdHZhciBtZXRhLCBpLCBqLCBpbGVuLCBqbGVuO1xuXG5cdGZvciAoaSA9IDAsIGlsZW4gPSBkYXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRpZiAoIWNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSkpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpKTtcblx0XHRmb3IgKGogPSAwLCBqbGVuID0gbWV0YS5kYXRhLmxlbmd0aDsgaiA8IGpsZW47ICsraikge1xuXHRcdFx0dmFyIGVsZW1lbnQgPSBtZXRhLmRhdGFbal07XG5cdFx0XHRpZiAoIWVsZW1lbnQuX3ZpZXcuc2tpcCkge1xuXHRcdFx0XHRoYW5kbGVyKGVsZW1lbnQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGl0ZW1zIHRoYXQgaW50ZXJzZWN0IHRoZSBldmVudCBwb3NpdGlvblxuICogQHBhcmFtIGl0ZW1zIHtDaGFydEVsZW1lbnRbXX0gZWxlbWVudHMgdG8gZmlsdGVyXG4gKiBAcGFyYW0gcG9zaXRpb24ge1BvaW50fSB0aGUgcG9pbnQgdG8gYmUgbmVhcmVzdCB0b1xuICogQHJldHVybiB7Q2hhcnRFbGVtZW50W119IHRoZSBuZWFyZXN0IGl0ZW1zXG4gKi9cbmZ1bmN0aW9uIGdldEludGVyc2VjdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbikge1xuXHR2YXIgZWxlbWVudHMgPSBbXTtcblxuXHRwYXJzZVZpc2libGVJdGVtcyhjaGFydCwgZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdGlmIChlbGVtZW50LmluUmFuZ2UocG9zaXRpb24ueCwgcG9zaXRpb24ueSkpIHtcblx0XHRcdGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gZWxlbWVudHM7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgaXRlbXMgbmVhcmVzdCB0byB0aGUgZXZlbnQgcG9zaXRpb24gY29uc2lkZXJpbmcgYWxsIHZpc2libGUgaXRlbXMgaW4gdGVoIGNoYXJ0XG4gKiBAcGFyYW0gY2hhcnQge0NoYXJ0fSB0aGUgY2hhcnQgdG8gbG9vayBhdCBlbGVtZW50cyBmcm9tXG4gKiBAcGFyYW0gcG9zaXRpb24ge1BvaW50fSB0aGUgcG9pbnQgdG8gYmUgbmVhcmVzdCB0b1xuICogQHBhcmFtIGludGVyc2VjdCB7Qm9vbGVhbn0gaWYgdHJ1ZSwgb25seSBjb25zaWRlciBpdGVtcyB0aGF0IGludGVyc2VjdCB0aGUgcG9zaXRpb25cbiAqIEBwYXJhbSBkaXN0YW5jZU1ldHJpYyB7RnVuY3Rpb259IGZ1bmN0aW9uIHRvIHByb3ZpZGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gcG9pbnRzXG4gKiBAcmV0dXJuIHtDaGFydEVsZW1lbnRbXX0gdGhlIG5lYXJlc3QgaXRlbXNcbiAqL1xuZnVuY3Rpb24gZ2V0TmVhcmVzdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgaW50ZXJzZWN0LCBkaXN0YW5jZU1ldHJpYykge1xuXHR2YXIgbWluRGlzdGFuY2UgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG5cdHZhciBuZWFyZXN0SXRlbXMgPSBbXTtcblxuXHRwYXJzZVZpc2libGVJdGVtcyhjaGFydCwgZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdGlmIChpbnRlcnNlY3QgJiYgIWVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55KSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBjZW50ZXIgPSBlbGVtZW50LmdldENlbnRlclBvaW50KCk7XG5cdFx0dmFyIGRpc3RhbmNlID0gZGlzdGFuY2VNZXRyaWMocG9zaXRpb24sIGNlbnRlcik7XG5cblx0XHRpZiAoZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSkge1xuXHRcdFx0bmVhcmVzdEl0ZW1zID0gW2VsZW1lbnRdO1xuXHRcdFx0bWluRGlzdGFuY2UgPSBkaXN0YW5jZTtcblx0XHR9IGVsc2UgaWYgKGRpc3RhbmNlID09PSBtaW5EaXN0YW5jZSkge1xuXHRcdFx0Ly8gQ2FuIGhhdmUgbXVsdGlwbGUgaXRlbXMgYXQgdGhlIHNhbWUgZGlzdGFuY2UgaW4gd2hpY2ggY2FzZSB3ZSBzb3J0IGJ5IHNpemVcblx0XHRcdG5lYXJlc3RJdGVtcy5wdXNoKGVsZW1lbnQpO1xuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIG5lYXJlc3RJdGVtcztcbn1cblxuLyoqXG4gKiBHZXQgYSBkaXN0YW5jZSBtZXRyaWMgZnVuY3Rpb24gZm9yIHR3byBwb2ludHMgYmFzZWQgb24gdGhlXG4gKiBheGlzIG1vZGUgc2V0dGluZ1xuICogQHBhcmFtIHtTdHJpbmd9IGF4aXMgdGhlIGF4aXMgbW9kZS4geHx5fHh5XG4gKi9cbmZ1bmN0aW9uIGdldERpc3RhbmNlTWV0cmljRm9yQXhpcyhheGlzKSB7XG5cdHZhciB1c2VYID0gYXhpcy5pbmRleE9mKCd4JykgIT09IC0xO1xuXHR2YXIgdXNlWSA9IGF4aXMuaW5kZXhPZigneScpICE9PSAtMTtcblxuXHRyZXR1cm4gZnVuY3Rpb24ocHQxLCBwdDIpIHtcblx0XHR2YXIgZGVsdGFYID0gdXNlWCA/IE1hdGguYWJzKHB0MS54IC0gcHQyLngpIDogMDtcblx0XHR2YXIgZGVsdGFZID0gdXNlWSA/IE1hdGguYWJzKHB0MS55IC0gcHQyLnkpIDogMDtcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KGRlbHRhWCwgMikgKyBNYXRoLnBvdyhkZWx0YVksIDIpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gaW5kZXhNb2RlKGNoYXJ0LCBlLCBvcHRpb25zKSB7XG5cdHZhciBwb3NpdGlvbiA9IGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xuXHQvLyBEZWZhdWx0IGF4aXMgZm9yIGluZGV4IG1vZGUgaXMgJ3gnIHRvIG1hdGNoIG9sZCBiZWhhdmlvdXJcblx0b3B0aW9ucy5heGlzID0gb3B0aW9ucy5heGlzIHx8ICd4Jztcblx0dmFyIGRpc3RhbmNlTWV0cmljID0gZ2V0RGlzdGFuY2VNZXRyaWNGb3JBeGlzKG9wdGlvbnMuYXhpcyk7XG5cdHZhciBpdGVtcyA9IG9wdGlvbnMuaW50ZXJzZWN0ID8gZ2V0SW50ZXJzZWN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uKSA6IGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGZhbHNlLCBkaXN0YW5jZU1ldHJpYyk7XG5cdHZhciBlbGVtZW50cyA9IFtdO1xuXG5cdGlmICghaXRlbXMubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0Y2hhcnQuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGRhdGFzZXRJbmRleCkpIHtcblx0XHRcdHZhciBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcblx0XHRcdHZhciBlbGVtZW50ID0gbWV0YS5kYXRhW2l0ZW1zWzBdLl9pbmRleF07XG5cblx0XHRcdC8vIGRvbid0IGNvdW50IGl0ZW1zIHRoYXQgYXJlIHNraXBwZWQgKG51bGwgZGF0YSlcblx0XHRcdGlmIChlbGVtZW50ICYmICFlbGVtZW50Ll92aWV3LnNraXApIHtcblx0XHRcdFx0ZWxlbWVudHMucHVzaChlbGVtZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBlbGVtZW50cztcbn1cblxuLyoqXG4gKiBAaW50ZXJmYWNlIElJbnRlcmFjdGlvbk9wdGlvbnNcbiAqL1xuLyoqXG4gKiBJZiB0cnVlLCBvbmx5IGNvbnNpZGVyIGl0ZW1zIHRoYXQgaW50ZXJzZWN0IHRoZSBwb2ludFxuICogQG5hbWUgSUludGVyZmFjZU9wdGlvbnMjYm9vbGVhblxuICogQHR5cGUgQm9vbGVhblxuICovXG5cbi8qKlxuICogQ29udGFpbnMgaW50ZXJhY3Rpb24gcmVsYXRlZCBmdW5jdGlvbnNcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuSW50ZXJhY3Rpb25cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSB7XG5cdC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgZGlmZmVyZW50IG1vZGVzXG5cdG1vZGVzOiB7XG5cdFx0c2luZ2xlOiBmdW5jdGlvbihjaGFydCwgZSkge1xuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG5cdFx0XHR2YXIgZWxlbWVudHMgPSBbXTtcblxuXHRcdFx0cGFyc2VWaXNpYmxlSXRlbXMoY2hhcnQsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHRcdFx0aWYgKGVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55KSkge1xuXHRcdFx0XHRcdGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW1lbnRzO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIGVsZW1lbnRzLnNsaWNlKDAsIDEpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMubGFiZWxcblx0XHQgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNC4wXG5cdFx0ICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0bGFiZWw6IGluZGV4TW9kZSxcblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybnMgaXRlbXMgYXQgdGhlIHNhbWUgaW5kZXguIElmIHRoZSBvcHRpb25zLmludGVyc2VjdCBwYXJhbWV0ZXIgaXMgdHJ1ZSwgd2Ugb25seSByZXR1cm4gaXRlbXMgaWYgd2UgaW50ZXJzZWN0IHNvbWV0aGluZ1xuXHRcdCAqIElmIHRoZSBvcHRpb25zLmludGVyc2VjdCBtb2RlIGlzIGZhbHNlLCB3ZSBmaW5kIHRoZSBuZWFyZXN0IGl0ZW0gYW5kIHJldHVybiB0aGUgaXRlbXMgYXQgdGhlIHNhbWUgaW5kZXggYXMgdGhhdCBpdGVtXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLmluZGV4XG5cdFx0ICogQHNpbmNlIHYyLjQuMFxuXHRcdCAqIEBwYXJhbSBjaGFydCB7Y2hhcnR9IHRoZSBjaGFydCB3ZSBhcmUgcmV0dXJuaW5nIGl0ZW1zIGZyb21cblx0XHQgKiBAcGFyYW0gZSB7RXZlbnR9IHRoZSBldmVudCB3ZSBhcmUgZmluZCB0aGluZ3MgYXRcblx0XHQgKiBAcGFyYW0gb3B0aW9ucyB7SUludGVyYWN0aW9uT3B0aW9uc30gb3B0aW9ucyB0byB1c2UgZHVyaW5nIGludGVyYWN0aW9uXG5cdFx0ICogQHJldHVybiB7Q2hhcnQuRWxlbWVudFtdfSBBcnJheSBvZiBlbGVtZW50cyB0aGF0IGFyZSB1bmRlciB0aGUgcG9pbnQuIElmIG5vbmUgYXJlIGZvdW5kLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZFxuXHRcdCAqL1xuXHRcdGluZGV4OiBpbmRleE1vZGUsXG5cblx0XHQvKipcblx0XHQgKiBSZXR1cm5zIGl0ZW1zIGluIHRoZSBzYW1lIGRhdGFzZXQuIElmIHRoZSBvcHRpb25zLmludGVyc2VjdCBwYXJhbWV0ZXIgaXMgdHJ1ZSwgd2Ugb25seSByZXR1cm4gaXRlbXMgaWYgd2UgaW50ZXJzZWN0IHNvbWV0aGluZ1xuXHRcdCAqIElmIHRoZSBvcHRpb25zLmludGVyc2VjdCBpcyBmYWxzZSwgd2UgZmluZCB0aGUgbmVhcmVzdCBpdGVtIGFuZCByZXR1cm4gdGhlIGl0ZW1zIGluIHRoYXQgZGF0YXNldFxuXHRcdCAqIEBmdW5jdGlvbiBDaGFydC5JbnRlcmFjdGlvbi5tb2Rlcy5kYXRhc2V0XG5cdFx0ICogQHBhcmFtIGNoYXJ0IHtjaGFydH0gdGhlIGNoYXJ0IHdlIGFyZSByZXR1cm5pbmcgaXRlbXMgZnJvbVxuXHRcdCAqIEBwYXJhbSBlIHtFdmVudH0gdGhlIGV2ZW50IHdlIGFyZSBmaW5kIHRoaW5ncyBhdFxuXHRcdCAqIEBwYXJhbSBvcHRpb25zIHtJSW50ZXJhY3Rpb25PcHRpb25zfSBvcHRpb25zIHRvIHVzZSBkdXJpbmcgaW50ZXJhY3Rpb25cblx0XHQgKiBAcmV0dXJuIHtDaGFydC5FbGVtZW50W119IEFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHVuZGVyIHRoZSBwb2ludC4gSWYgbm9uZSBhcmUgZm91bmQsIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkXG5cdFx0ICovXG5cdFx0ZGF0YXNldDogZnVuY3Rpb24oY2hhcnQsIGUsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBwb3NpdGlvbiA9IGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xuXHRcdFx0b3B0aW9ucy5heGlzID0gb3B0aW9ucy5heGlzIHx8ICd4eSc7XG5cdFx0XHR2YXIgZGlzdGFuY2VNZXRyaWMgPSBnZXREaXN0YW5jZU1ldHJpY0ZvckF4aXMob3B0aW9ucy5heGlzKTtcblx0XHRcdHZhciBpdGVtcyA9IG9wdGlvbnMuaW50ZXJzZWN0ID8gZ2V0SW50ZXJzZWN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uKSA6IGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGZhbHNlLCBkaXN0YW5jZU1ldHJpYyk7XG5cblx0XHRcdGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGl0ZW1zID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaXRlbXNbMF0uX2RhdGFzZXRJbmRleCkuZGF0YTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGl0ZW1zO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMueC1heGlzXG5cdFx0ICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjQuMC4gVXNlIGluZGV4IG1vZGUgYW5kIGludGVyc2VjdCA9PSB0cnVlXG5cdFx0ICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0J3gtYXhpcyc6IGZ1bmN0aW9uKGNoYXJ0LCBlKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhNb2RlKGNoYXJ0LCBlLCB7aW50ZXJzZWN0OiBmYWxzZX0pO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBQb2ludCBtb2RlIHJldHVybnMgYWxsIGVsZW1lbnRzIHRoYXQgaGl0IHRlc3QgYmFzZWQgb24gdGhlIGV2ZW50IHBvc2l0aW9uXG5cdFx0ICogb2YgdGhlIGV2ZW50XG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLmludGVyc2VjdFxuXHRcdCAqIEBwYXJhbSBjaGFydCB7Y2hhcnR9IHRoZSBjaGFydCB3ZSBhcmUgcmV0dXJuaW5nIGl0ZW1zIGZyb21cblx0XHQgKiBAcGFyYW0gZSB7RXZlbnR9IHRoZSBldmVudCB3ZSBhcmUgZmluZCB0aGluZ3MgYXRcblx0XHQgKiBAcmV0dXJuIHtDaGFydC5FbGVtZW50W119IEFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHVuZGVyIHRoZSBwb2ludC4gSWYgbm9uZSBhcmUgZm91bmQsIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkXG5cdFx0ICovXG5cdFx0cG9pbnQ6IGZ1bmN0aW9uKGNoYXJ0LCBlKSB7XG5cdFx0XHR2YXIgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcblx0XHRcdHJldHVybiBnZXRJbnRlcnNlY3RJdGVtcyhjaGFydCwgcG9zaXRpb24pO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBuZWFyZXN0IG1vZGUgcmV0dXJucyB0aGUgZWxlbWVudCBjbG9zZXN0IHRvIHRoZSBwb2ludFxuXHRcdCAqIEBmdW5jdGlvbiBDaGFydC5JbnRlcmFjdGlvbi5tb2Rlcy5pbnRlcnNlY3Rcblx0XHQgKiBAcGFyYW0gY2hhcnQge2NoYXJ0fSB0aGUgY2hhcnQgd2UgYXJlIHJldHVybmluZyBpdGVtcyBmcm9tXG5cdFx0ICogQHBhcmFtIGUge0V2ZW50fSB0aGUgZXZlbnQgd2UgYXJlIGZpbmQgdGhpbmdzIGF0XG5cdFx0ICogQHBhcmFtIG9wdGlvbnMge0lJbnRlcmFjdGlvbk9wdGlvbnN9IG9wdGlvbnMgdG8gdXNlXG5cdFx0ICogQHJldHVybiB7Q2hhcnQuRWxlbWVudFtdfSBBcnJheSBvZiBlbGVtZW50cyB0aGF0IGFyZSB1bmRlciB0aGUgcG9pbnQuIElmIG5vbmUgYXJlIGZvdW5kLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZFxuXHRcdCAqL1xuXHRcdG5lYXJlc3Q6IGZ1bmN0aW9uKGNoYXJ0LCBlLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcblx0XHRcdG9wdGlvbnMuYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCAneHknO1xuXHRcdFx0dmFyIGRpc3RhbmNlTWV0cmljID0gZ2V0RGlzdGFuY2VNZXRyaWNGb3JBeGlzKG9wdGlvbnMuYXhpcyk7XG5cdFx0XHR2YXIgbmVhcmVzdEl0ZW1zID0gZ2V0TmVhcmVzdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgb3B0aW9ucy5pbnRlcnNlY3QsIGRpc3RhbmNlTWV0cmljKTtcblxuXHRcdFx0Ly8gV2UgaGF2ZSBtdWx0aXBsZSBpdGVtcyBhdCB0aGUgc2FtZSBkaXN0YW5jZSBmcm9tIHRoZSBldmVudC4gTm93IHNvcnQgYnkgc21hbGxlc3Rcblx0XHRcdGlmIChuZWFyZXN0SXRlbXMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRuZWFyZXN0SXRlbXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG5cdFx0XHRcdFx0dmFyIHNpemVBID0gYS5nZXRBcmVhKCk7XG5cdFx0XHRcdFx0dmFyIHNpemVCID0gYi5nZXRBcmVhKCk7XG5cdFx0XHRcdFx0dmFyIHJldCA9IHNpemVBIC0gc2l6ZUI7XG5cblx0XHRcdFx0XHRpZiAocmV0ID09PSAwKSB7XG5cdFx0XHRcdFx0XHQvLyBpZiBlcXVhbCBzb3J0IGJ5IGRhdGFzZXQgaW5kZXhcblx0XHRcdFx0XHRcdHJldCA9IGEuX2RhdGFzZXRJbmRleCAtIGIuX2RhdGFzZXRJbmRleDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIG9ubHkgMSBpdGVtXG5cdFx0XHRyZXR1cm4gbmVhcmVzdEl0ZW1zLnNsaWNlKDAsIDEpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiB4IG1vZGUgcmV0dXJucyB0aGUgZWxlbWVudHMgdGhhdCBoaXQtdGVzdCBhdCB0aGUgY3VycmVudCB4IGNvb3JkaW5hdGVcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMueFxuXHRcdCAqIEBwYXJhbSBjaGFydCB7Y2hhcnR9IHRoZSBjaGFydCB3ZSBhcmUgcmV0dXJuaW5nIGl0ZW1zIGZyb21cblx0XHQgKiBAcGFyYW0gZSB7RXZlbnR9IHRoZSBldmVudCB3ZSBhcmUgZmluZCB0aGluZ3MgYXRcblx0XHQgKiBAcGFyYW0gb3B0aW9ucyB7SUludGVyYWN0aW9uT3B0aW9uc30gb3B0aW9ucyB0byB1c2Vcblx0XHQgKiBAcmV0dXJuIHtDaGFydC5FbGVtZW50W119IEFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHVuZGVyIHRoZSBwb2ludC4gSWYgbm9uZSBhcmUgZm91bmQsIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkXG5cdFx0ICovXG5cdFx0eDogZnVuY3Rpb24oY2hhcnQsIGUsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBwb3NpdGlvbiA9IGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xuXHRcdFx0dmFyIGl0ZW1zID0gW107XG5cdFx0XHR2YXIgaW50ZXJzZWN0c0l0ZW0gPSBmYWxzZTtcblxuXHRcdFx0cGFyc2VWaXNpYmxlSXRlbXMoY2hhcnQsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHRcdFx0aWYgKGVsZW1lbnQuaW5YUmFuZ2UocG9zaXRpb24ueCkpIHtcblx0XHRcdFx0XHRpdGVtcy5wdXNoKGVsZW1lbnQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55KSkge1xuXHRcdFx0XHRcdGludGVyc2VjdHNJdGVtID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIElmIHdlIHdhbnQgdG8gdHJpZ2dlciBvbiBhbiBpbnRlcnNlY3QgYW5kIHdlIGRvbid0IGhhdmUgYW55IGl0ZW1zXG5cdFx0XHQvLyB0aGF0IGludGVyc2VjdCB0aGUgcG9zaXRpb24sIHJldHVybiBub3RoaW5nXG5cdFx0XHRpZiAob3B0aW9ucy5pbnRlcnNlY3QgJiYgIWludGVyc2VjdHNJdGVtKSB7XG5cdFx0XHRcdGl0ZW1zID0gW107XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gaXRlbXM7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIHkgbW9kZSByZXR1cm5zIHRoZSBlbGVtZW50cyB0aGF0IGhpdC10ZXN0IGF0IHRoZSBjdXJyZW50IHkgY29vcmRpbmF0ZVxuXHRcdCAqIEBmdW5jdGlvbiBDaGFydC5JbnRlcmFjdGlvbi5tb2Rlcy55XG5cdFx0ICogQHBhcmFtIGNoYXJ0IHtjaGFydH0gdGhlIGNoYXJ0IHdlIGFyZSByZXR1cm5pbmcgaXRlbXMgZnJvbVxuXHRcdCAqIEBwYXJhbSBlIHtFdmVudH0gdGhlIGV2ZW50IHdlIGFyZSBmaW5kIHRoaW5ncyBhdFxuXHRcdCAqIEBwYXJhbSBvcHRpb25zIHtJSW50ZXJhY3Rpb25PcHRpb25zfSBvcHRpb25zIHRvIHVzZVxuXHRcdCAqIEByZXR1cm4ge0NoYXJ0LkVsZW1lbnRbXX0gQXJyYXkgb2YgZWxlbWVudHMgdGhhdCBhcmUgdW5kZXIgdGhlIHBvaW50LiBJZiBub25lIGFyZSBmb3VuZCwgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWRcblx0XHQgKi9cblx0XHR5OiBmdW5jdGlvbihjaGFydCwgZSwgb3B0aW9ucykge1xuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG5cdFx0XHR2YXIgaXRlbXMgPSBbXTtcblx0XHRcdHZhciBpbnRlcnNlY3RzSXRlbSA9IGZhbHNlO1xuXG5cdFx0XHRwYXJzZVZpc2libGVJdGVtcyhjaGFydCwgZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdFx0XHRpZiAoZWxlbWVudC5pbllSYW5nZShwb3NpdGlvbi55KSkge1xuXHRcdFx0XHRcdGl0ZW1zLnB1c2goZWxlbWVudCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZWxlbWVudC5pblJhbmdlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpKSB7XG5cdFx0XHRcdFx0aW50ZXJzZWN0c0l0ZW0gPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gSWYgd2Ugd2FudCB0byB0cmlnZ2VyIG9uIGFuIGludGVyc2VjdCBhbmQgd2UgZG9uJ3QgaGF2ZSBhbnkgaXRlbXNcblx0XHRcdC8vIHRoYXQgaW50ZXJzZWN0IHRoZSBwb3NpdGlvbiwgcmV0dXJuIG5vdGhpbmdcblx0XHRcdGlmIChvcHRpb25zLmludGVyc2VjdCAmJiAhaW50ZXJzZWN0c0l0ZW0pIHtcblx0XHRcdFx0aXRlbXMgPSBbXTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBpdGVtcztcblx0XHR9XG5cdH1cbn07XG5cbn0se1wiNDZcIjo0Nn1dLDMwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XG5cbmRlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcblx0cmVzcG9uc2l2ZTogdHJ1ZSxcblx0cmVzcG9uc2l2ZUFuaW1hdGlvbkR1cmF0aW9uOiAwLFxuXHRtYWludGFpbkFzcGVjdFJhdGlvOiB0cnVlLFxuXHRldmVudHM6IFsnbW91c2Vtb3ZlJywgJ21vdXNlb3V0JywgJ2NsaWNrJywgJ3RvdWNoc3RhcnQnLCAndG91Y2htb3ZlJ10sXG5cdGhvdmVyOiB7XG5cdFx0b25Ib3ZlcjogbnVsbCxcblx0XHRtb2RlOiAnbmVhcmVzdCcsXG5cdFx0aW50ZXJzZWN0OiB0cnVlLFxuXHRcdGFuaW1hdGlvbkR1cmF0aW9uOiA0MDBcblx0fSxcblx0b25DbGljazogbnVsbCxcblx0ZGVmYXVsdENvbG9yOiAncmdiYSgwLDAsMCwwLjEpJyxcblx0ZGVmYXVsdEZvbnRDb2xvcjogJyM2NjYnLFxuXHRkZWZhdWx0Rm9udEZhbWlseTogXCInSGVsdmV0aWNhIE5ldWUnLCAnSGVsdmV0aWNhJywgJ0FyaWFsJywgc2Fucy1zZXJpZlwiLFxuXHRkZWZhdWx0Rm9udFNpemU6IDEyLFxuXHRkZWZhdWx0Rm9udFN0eWxlOiAnbm9ybWFsJyxcblx0c2hvd0xpbmVzOiB0cnVlLFxuXG5cdC8vIEVsZW1lbnQgZGVmYXVsdHMgZGVmaW5lZCBpbiBlbGVtZW50IGV4dGVuc2lvbnNcblx0ZWxlbWVudHM6IHt9LFxuXG5cdC8vIExheW91dCBvcHRpb25zIHN1Y2ggYXMgcGFkZGluZ1xuXHRsYXlvdXQ6IHtcblx0XHRwYWRkaW5nOiB7XG5cdFx0XHR0b3A6IDAsXG5cdFx0XHRyaWdodDogMCxcblx0XHRcdGJvdHRvbTogMCxcblx0XHRcdGxlZnQ6IDBcblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuXG5cdC8vIE9jY3VweSB0aGUgZ2xvYmFsIHZhcmlhYmxlIG9mIENoYXJ0LCBhbmQgY3JlYXRlIGEgc2ltcGxlIGJhc2UgY2xhc3Ncblx0dmFyIENoYXJ0ID0gZnVuY3Rpb24oaXRlbSwgY29uZmlnKSB7XG5cdFx0dGhpcy5jb25zdHJ1Y3QoaXRlbSwgY29uZmlnKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRDaGFydC5DaGFydCA9IENoYXJ0O1xuXG5cdHJldHVybiBDaGFydDtcbn07XG5cbn0se1wiMjZcIjoyNn1dLDMxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxuZnVuY3Rpb24gZmlsdGVyQnlQb3NpdGlvbihhcnJheSwgcG9zaXRpb24pIHtcblx0cmV0dXJuIGhlbHBlcnMud2hlcmUoYXJyYXksIGZ1bmN0aW9uKHYpIHtcblx0XHRyZXR1cm4gdi5wb3NpdGlvbiA9PT0gcG9zaXRpb247XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBzb3J0QnlXZWlnaHQoYXJyYXksIHJldmVyc2UpIHtcblx0YXJyYXkuZm9yRWFjaChmdW5jdGlvbih2LCBpKSB7XG5cdFx0di5fdG1wSW5kZXhfID0gaTtcblx0XHRyZXR1cm4gdjtcblx0fSk7XG5cdGFycmF5LnNvcnQoZnVuY3Rpb24oYSwgYikge1xuXHRcdHZhciB2MCA9IHJldmVyc2UgPyBiIDogYTtcblx0XHR2YXIgdjEgPSByZXZlcnNlID8gYSA6IGI7XG5cdFx0cmV0dXJuIHYwLndlaWdodCA9PT0gdjEud2VpZ2h0ID9cblx0XHRcdHYwLl90bXBJbmRleF8gLSB2MS5fdG1wSW5kZXhfIDpcblx0XHRcdHYwLndlaWdodCAtIHYxLndlaWdodDtcblx0fSk7XG5cdGFycmF5LmZvckVhY2goZnVuY3Rpb24odikge1xuXHRcdGRlbGV0ZSB2Ll90bXBJbmRleF87XG5cdH0pO1xufVxuXG4vKipcbiAqIEBpbnRlcmZhY2UgSUxheW91dEl0ZW1cbiAqIEBwcm9wIHtTdHJpbmd9IHBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIGluIHRoZSBjaGFydCBsYXlvdXQuIFBvc3NpYmxlIHZhbHVlcyBhcmVcbiAqICdsZWZ0JywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCBhbmQgJ2NoYXJ0QXJlYSdcbiAqIEBwcm9wIHtOdW1iZXJ9IHdlaWdodCAtIFRoZSB3ZWlnaHQgdXNlZCB0byBzb3J0IHRoZSBpdGVtLiBIaWdoZXIgd2VpZ2h0cyBhcmUgZnVydGhlciBhd2F5IGZyb20gdGhlIGNoYXJ0IGFyZWFcbiAqIEBwcm9wIHtCb29sZWFufSBmdWxsV2lkdGggLSBpZiB0cnVlLCBhbmQgdGhlIGl0ZW0gaXMgaG9yaXpvbnRhbCwgdGhlbiBwdXNoIHZlcnRpY2FsIGJveGVzIGRvd25cbiAqIEBwcm9wIHtGdW5jdGlvbn0gaXNIb3Jpem9udGFsIC0gcmV0dXJucyB0cnVlIGlmIHRoZSBsYXlvdXQgaXRlbSBpcyBob3Jpem9udGFsIChpZS4gdG9wIG9yIGJvdHRvbSlcbiAqIEBwcm9wIHtGdW5jdGlvbn0gdXBkYXRlIC0gVGFrZXMgdHdvIHBhcmFtZXRlcnM6IHdpZHRoIGFuZCBoZWlnaHQuIFJldHVybnMgc2l6ZSBvZiBpdGVtXG4gKiBAcHJvcCB7RnVuY3Rpb259IGdldFBhZGRpbmcgLSAgUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBwYWRkaW5nIG9uIHRoZSBlZGdlc1xuICogQHByb3Age051bWJlcn0gd2lkdGggLSBXaWR0aCBvZiBpdGVtLiBNdXN0IGJlIHZhbGlkIGFmdGVyIHVwZGF0ZSgpXG4gKiBAcHJvcCB7TnVtYmVyfSBoZWlnaHQgLSBIZWlnaHQgb2YgaXRlbS4gTXVzdCBiZSB2YWxpZCBhZnRlciB1cGRhdGUoKVxuICogQHByb3Age051bWJlcn0gbGVmdCAtIExlZnQgZWRnZSBvZiB0aGUgaXRlbS4gU2V0IGJ5IGxheW91dCBzeXN0ZW0gYW5kIGNhbm5vdCBiZSB1c2VkIGluIHVwZGF0ZVxuICogQHByb3Age051bWJlcn0gdG9wIC0gVG9wIGVkZ2Ugb2YgdGhlIGl0ZW0uIFNldCBieSBsYXlvdXQgc3lzdGVtIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiB1cGRhdGVcbiAqIEBwcm9wIHtOdW1iZXJ9IHJpZ2h0IC0gUmlnaHQgZWRnZSBvZiB0aGUgaXRlbS4gU2V0IGJ5IGxheW91dCBzeXN0ZW0gYW5kIGNhbm5vdCBiZSB1c2VkIGluIHVwZGF0ZVxuICogQHByb3Age051bWJlcn0gYm90dG9tIC0gQm90dG9tIGVkZ2Ugb2YgdGhlIGl0ZW0uIFNldCBieSBsYXlvdXQgc3lzdGVtIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiB1cGRhdGVcbiAqL1xuXG4vLyBUaGUgbGF5b3V0IHNlcnZpY2UgaXMgdmVyeSBzZWxmIGV4cGxhbmF0b3J5LiAgSXQncyByZXNwb25zaWJsZSBmb3IgdGhlIGxheW91dCB3aXRoaW4gYSBjaGFydC5cbi8vIFNjYWxlcywgTGVnZW5kcyBhbmQgUGx1Z2lucyBhbGwgcmVseSBvbiB0aGUgbGF5b3V0IHNlcnZpY2UgYW5kIGNhbiBlYXNpbHkgcmVnaXN0ZXIgdG8gYmUgcGxhY2VkIGFueXdoZXJlIHRoZXkgbmVlZFxuLy8gSXQgaXMgdGhpcyBzZXJ2aWNlJ3MgcmVzcG9uc2liaWxpdHkgb2YgY2Fycnlpbmcgb3V0IHRoYXQgbGF5b3V0LlxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGRlZmF1bHRzOiB7fSxcblxuXHQvKipcblx0ICogUmVnaXN0ZXIgYSBib3ggdG8gYSBjaGFydC5cblx0ICogQSBib3ggaXMgc2ltcGx5IGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCB0aGF0IHJlcXVpcmVzIGxheW91dC4gZWcuIFNjYWxlcywgTGVnZW5kLCBUaXRsZS5cblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgdG8gdXNlXG5cdCAqIEBwYXJhbSB7SUxheW91dEl0ZW19IGl0ZW0gLSB0aGUgaXRlbSB0byBhZGQgdG8gYmUgbGF5ZWQgb3V0XG5cdCAqL1xuXHRhZGRCb3g6IGZ1bmN0aW9uKGNoYXJ0LCBpdGVtKSB7XG5cdFx0aWYgKCFjaGFydC5ib3hlcykge1xuXHRcdFx0Y2hhcnQuYm94ZXMgPSBbXTtcblx0XHR9XG5cblx0XHQvLyBpbml0aWFsaXplIGl0ZW0gd2l0aCBkZWZhdWx0IHZhbHVlc1xuXHRcdGl0ZW0uZnVsbFdpZHRoID0gaXRlbS5mdWxsV2lkdGggfHwgZmFsc2U7XG5cdFx0aXRlbS5wb3NpdGlvbiA9IGl0ZW0ucG9zaXRpb24gfHwgJ3RvcCc7XG5cdFx0aXRlbS53ZWlnaHQgPSBpdGVtLndlaWdodCB8fCAwO1xuXG5cdFx0Y2hhcnQuYm94ZXMucHVzaChpdGVtKTtcblx0fSxcblxuXHQvKipcblx0ICogUmVtb3ZlIGEgbGF5b3V0SXRlbSBmcm9tIGEgY2hhcnRcblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgdG8gcmVtb3ZlIHRoZSBib3ggZnJvbVxuXHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SXRlbSAtIHRoZSBpdGVtIHRvIHJlbW92ZSBmcm9tIHRoZSBsYXlvdXRcblx0ICovXG5cdHJlbW92ZUJveDogZnVuY3Rpb24oY2hhcnQsIGxheW91dEl0ZW0pIHtcblx0XHR2YXIgaW5kZXggPSBjaGFydC5ib3hlcyA/IGNoYXJ0LmJveGVzLmluZGV4T2YobGF5b3V0SXRlbSkgOiAtMTtcblx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHRjaGFydC5ib3hlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyAob3IgdXBkYXRlcykgb3B0aW9ucyBvbiB0aGUgZ2l2ZW4gYGl0ZW1gLlxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCBpbiB3aGljaCB0aGUgaXRlbSBsaXZlcyAob3Igd2lsbCBiZSBhZGRlZCB0bylcblx0ICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gLSB0aGUgaXRlbSB0byBjb25maWd1cmUgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9uc1xuXHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIHRoZSBuZXcgaXRlbSBvcHRpb25zLlxuXHQgKi9cblx0Y29uZmlndXJlOiBmdW5jdGlvbihjaGFydCwgaXRlbSwgb3B0aW9ucykge1xuXHRcdHZhciBwcm9wcyA9IFsnZnVsbFdpZHRoJywgJ3Bvc2l0aW9uJywgJ3dlaWdodCddO1xuXHRcdHZhciBpbGVuID0gcHJvcHMubGVuZ3RoO1xuXHRcdHZhciBpID0gMDtcblx0XHR2YXIgcHJvcDtcblxuXHRcdGZvciAoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRwcm9wID0gcHJvcHNbaV07XG5cdFx0XHRpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuXHRcdFx0XHRpdGVtW3Byb3BdID0gb3B0aW9uc1twcm9wXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZpdHMgYm94ZXMgb2YgdGhlIGdpdmVuIGNoYXJ0IGludG8gdGhlIGdpdmVuIHNpemUgYnkgaGF2aW5nIGVhY2ggYm94IG1lYXN1cmUgaXRzZWxmXG5cdCAqIHRoZW4gcnVubmluZyBhIGZpdHRpbmcgYWxnb3JpdGhtXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gdGhlIGNoYXJ0XG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIHRoZSB3aWR0aCB0byBmaXQgaW50b1xuXHQgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gdGhlIGhlaWdodCB0byBmaXQgaW50b1xuXHQgKi9cblx0dXBkYXRlOiBmdW5jdGlvbihjaGFydCwgd2lkdGgsIGhlaWdodCkge1xuXHRcdGlmICghY2hhcnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgbGF5b3V0T3B0aW9ucyA9IGNoYXJ0Lm9wdGlvbnMubGF5b3V0IHx8IHt9O1xuXHRcdHZhciBwYWRkaW5nID0gaGVscGVycy5vcHRpb25zLnRvUGFkZGluZyhsYXlvdXRPcHRpb25zLnBhZGRpbmcpO1xuXHRcdHZhciBsZWZ0UGFkZGluZyA9IHBhZGRpbmcubGVmdDtcblx0XHR2YXIgcmlnaHRQYWRkaW5nID0gcGFkZGluZy5yaWdodDtcblx0XHR2YXIgdG9wUGFkZGluZyA9IHBhZGRpbmcudG9wO1xuXHRcdHZhciBib3R0b21QYWRkaW5nID0gcGFkZGluZy5ib3R0b207XG5cblx0XHR2YXIgbGVmdEJveGVzID0gZmlsdGVyQnlQb3NpdGlvbihjaGFydC5ib3hlcywgJ2xlZnQnKTtcblx0XHR2YXIgcmlnaHRCb3hlcyA9IGZpbHRlckJ5UG9zaXRpb24oY2hhcnQuYm94ZXMsICdyaWdodCcpO1xuXHRcdHZhciB0b3BCb3hlcyA9IGZpbHRlckJ5UG9zaXRpb24oY2hhcnQuYm94ZXMsICd0b3AnKTtcblx0XHR2YXIgYm90dG9tQm94ZXMgPSBmaWx0ZXJCeVBvc2l0aW9uKGNoYXJ0LmJveGVzLCAnYm90dG9tJyk7XG5cdFx0dmFyIGNoYXJ0QXJlYUJveGVzID0gZmlsdGVyQnlQb3NpdGlvbihjaGFydC5ib3hlcywgJ2NoYXJ0QXJlYScpO1xuXG5cdFx0Ly8gU29ydCBib3hlcyBieSB3ZWlnaHQuIEEgaGlnaGVyIHdlaWdodCBpcyBmdXJ0aGVyIGF3YXkgZnJvbSB0aGUgY2hhcnQgYXJlYVxuXHRcdHNvcnRCeVdlaWdodChsZWZ0Qm94ZXMsIHRydWUpO1xuXHRcdHNvcnRCeVdlaWdodChyaWdodEJveGVzLCBmYWxzZSk7XG5cdFx0c29ydEJ5V2VpZ2h0KHRvcEJveGVzLCB0cnVlKTtcblx0XHRzb3J0QnlXZWlnaHQoYm90dG9tQm94ZXMsIGZhbHNlKTtcblxuXHRcdC8vIEVzc2VudGlhbGx5IHdlIG5vdyBoYXZlIGFueSBudW1iZXIgb2YgYm94ZXMgb24gZWFjaCBvZiB0aGUgNCBzaWRlcy5cblx0XHQvLyBPdXIgY2FudmFzIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZy5cblx0XHQvLyBUaGUgYXJlYXMgTDEgYW5kIEwyIGFyZSB0aGUgbGVmdCBheGVzLiBSMSBpcyB0aGUgcmlnaHQgYXhpcywgVDEgaXMgdGhlIHRvcCBheGlzIGFuZFxuXHRcdC8vIEIxIGlzIHRoZSBib3R0b20gYXhpc1xuXHRcdC8vIFRoZXJlIGFyZSBhbHNvIDQgcXVhZHJhbnQtbGlrZSBsb2NhdGlvbnMgKGxlZnQgdG8gcmlnaHQgaW5zdGVhZCBvZiBjbG9ja3dpc2UpIHJlc2VydmVkIGZvciBjaGFydCBvdmVybGF5c1xuXHRcdC8vIFRoZXNlIGxvY2F0aW9ucyBhcmUgc2luZ2xlLWJveCBsb2NhdGlvbnMgb25seSwgd2hlbiB0cnlpbmcgdG8gcmVnaXN0ZXIgYSBjaGFydEFyZWEgbG9jYXRpb24gdGhhdCBpcyBhbHJlYWR5IHRha2VuLFxuXHRcdC8vIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuXHRcdC8vXG5cdFx0Ly8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG5cdFx0Ly8gfCAgICAgICAgICAgICAgICAgIFQxIChGdWxsIFdpZHRoKSAgICAgICAgICAgICAgICAgICB8XG5cdFx0Ly8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG5cdFx0Ly8gfCAgICB8ICAgIHwgICAgICAgICAgICAgICAgIFQyICAgICAgICAgICAgICAgICAgfCAgICB8XG5cdFx0Ly8gfCAgICB8LS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS18XG5cdFx0Ly8gfCAgICB8ICAgIHwgQzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQzIgfCAgICB8XG5cdFx0Ly8gfCAgICB8ICAgIHwtLS0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tfCAgICB8XG5cdFx0Ly8gfCAgICB8ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8XG5cdFx0Ly8gfCBMMSB8IEwyIHwgICAgICAgICAgIENoYXJ0QXJlYSAoQzApICAgICAgICAgICAgfCBSMSB8XG5cdFx0Ly8gfCAgICB8ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8XG5cdFx0Ly8gfCAgICB8ICAgIHwtLS0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tfCAgICB8XG5cdFx0Ly8gfCAgICB8ICAgIHwgQzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQzQgfCAgICB8XG5cdFx0Ly8gfCAgICB8LS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS18XG5cdFx0Ly8gfCAgICB8ICAgIHwgICAgICAgICAgICAgICAgIEIxICAgICAgICAgICAgICAgICAgfCAgICB8XG5cdFx0Ly8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG5cdFx0Ly8gfCAgICAgICAgICAgICAgICAgIEIyIChGdWxsIFdpZHRoKSAgICAgICAgICAgICAgICAgICB8XG5cdFx0Ly8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG5cdFx0Ly9cblx0XHQvLyBXaGF0IHdlIGRvIHRvIGZpbmQgdGhlIGJlc3Qgc2l6aW5nLCB3ZSBkbyB0aGUgZm9sbG93aW5nXG5cdFx0Ly8gMS4gRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGNoYXJ0IGFyZWEuXG5cdFx0Ly8gMi4gU3BsaXQgdGhlIHJlbWFpbmluZyB3aWR0aCBlcXVhbGx5IGJldHdlZW4gZWFjaCB2ZXJ0aWNhbCBheGlzXG5cdFx0Ly8gMy4gU3BsaXQgdGhlIHJlbWFpbmluZyBoZWlnaHQgZXF1YWxseSBiZXR3ZWVuIGVhY2ggaG9yaXpvbnRhbCBheGlzXG5cdFx0Ly8gNC4gR2l2ZSBlYWNoIGxheW91dCB0aGUgbWF4aW11bSBzaXplIGl0IGNhbiBiZS4gVGhlIGxheW91dCB3aWxsIHJldHVybiBpdCdzIG1pbmltdW0gc2l6ZVxuXHRcdC8vIDUuIEFkanVzdCB0aGUgc2l6ZXMgb2YgZWFjaCBheGlzIGJhc2VkIG9uIGl0J3MgbWluaW11bSByZXBvcnRlZCBzaXplLlxuXHRcdC8vIDYuIFJlZml0IGVhY2ggYXhpc1xuXHRcdC8vIDcuIFBvc2l0aW9uIGVhY2ggYXhpcyBpbiB0aGUgZmluYWwgbG9jYXRpb25cblx0XHQvLyA4LiBUZWxsIHRoZSBjaGFydCB0aGUgZmluYWwgbG9jYXRpb24gb2YgdGhlIGNoYXJ0IGFyZWFcblx0XHQvLyA5LiBUZWxsIGFueSBheGVzIHRoYXQgb3ZlcmxheSB0aGUgY2hhcnQgYXJlYSB0aGUgcG9zaXRpb25zIG9mIHRoZSBjaGFydCBhcmVhXG5cblx0XHQvLyBTdGVwIDFcblx0XHR2YXIgY2hhcnRXaWR0aCA9IHdpZHRoIC0gbGVmdFBhZGRpbmcgLSByaWdodFBhZGRpbmc7XG5cdFx0dmFyIGNoYXJ0SGVpZ2h0ID0gaGVpZ2h0IC0gdG9wUGFkZGluZyAtIGJvdHRvbVBhZGRpbmc7XG5cdFx0dmFyIGNoYXJ0QXJlYVdpZHRoID0gY2hhcnRXaWR0aCAvIDI7IC8vIG1pbiA1MCVcblx0XHR2YXIgY2hhcnRBcmVhSGVpZ2h0ID0gY2hhcnRIZWlnaHQgLyAyOyAvLyBtaW4gNTAlXG5cblx0XHQvLyBTdGVwIDJcblx0XHR2YXIgdmVydGljYWxCb3hXaWR0aCA9ICh3aWR0aCAtIGNoYXJ0QXJlYVdpZHRoKSAvIChsZWZ0Qm94ZXMubGVuZ3RoICsgcmlnaHRCb3hlcy5sZW5ndGgpO1xuXG5cdFx0Ly8gU3RlcCAzXG5cdFx0dmFyIGhvcml6b250YWxCb3hIZWlnaHQgPSAoaGVpZ2h0IC0gY2hhcnRBcmVhSGVpZ2h0KSAvICh0b3BCb3hlcy5sZW5ndGggKyBib3R0b21Cb3hlcy5sZW5ndGgpO1xuXG5cdFx0Ly8gU3RlcCA0XG5cdFx0dmFyIG1heENoYXJ0QXJlYVdpZHRoID0gY2hhcnRXaWR0aDtcblx0XHR2YXIgbWF4Q2hhcnRBcmVhSGVpZ2h0ID0gY2hhcnRIZWlnaHQ7XG5cdFx0dmFyIG1pbkJveFNpemVzID0gW107XG5cblx0XHRmdW5jdGlvbiBnZXRNaW5pbXVtQm94U2l6ZShib3gpIHtcblx0XHRcdHZhciBtaW5TaXplO1xuXHRcdFx0dmFyIGlzSG9yaXpvbnRhbCA9IGJveC5pc0hvcml6b250YWwoKTtcblxuXHRcdFx0aWYgKGlzSG9yaXpvbnRhbCkge1xuXHRcdFx0XHRtaW5TaXplID0gYm94LnVwZGF0ZShib3guZnVsbFdpZHRoID8gY2hhcnRXaWR0aCA6IG1heENoYXJ0QXJlYVdpZHRoLCBob3Jpem9udGFsQm94SGVpZ2h0KTtcblx0XHRcdFx0bWF4Q2hhcnRBcmVhSGVpZ2h0IC09IG1pblNpemUuaGVpZ2h0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWluU2l6ZSA9IGJveC51cGRhdGUodmVydGljYWxCb3hXaWR0aCwgbWF4Q2hhcnRBcmVhSGVpZ2h0KTtcblx0XHRcdFx0bWF4Q2hhcnRBcmVhV2lkdGggLT0gbWluU2l6ZS53aWR0aDtcblx0XHRcdH1cblxuXHRcdFx0bWluQm94U2l6ZXMucHVzaCh7XG5cdFx0XHRcdGhvcml6b250YWw6IGlzSG9yaXpvbnRhbCxcblx0XHRcdFx0bWluU2l6ZTogbWluU2l6ZSxcblx0XHRcdFx0Ym94OiBib3gsXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRoZWxwZXJzLmVhY2gobGVmdEJveGVzLmNvbmNhdChyaWdodEJveGVzLCB0b3BCb3hlcywgYm90dG9tQm94ZXMpLCBnZXRNaW5pbXVtQm94U2l6ZSk7XG5cblx0XHQvLyBJZiBhIGhvcml6b250YWwgYm94IGhhcyBwYWRkaW5nLCB3ZSBtb3ZlIHRoZSBsZWZ0IGJveGVzIG92ZXIgdG8gYXZvaWQgdWdseSBjaGFydHMgKHNlZSBpc3N1ZSAjMjQ3OClcblx0XHR2YXIgbWF4SG9yaXpvbnRhbExlZnRQYWRkaW5nID0gMDtcblx0XHR2YXIgbWF4SG9yaXpvbnRhbFJpZ2h0UGFkZGluZyA9IDA7XG5cdFx0dmFyIG1heFZlcnRpY2FsVG9wUGFkZGluZyA9IDA7XG5cdFx0dmFyIG1heFZlcnRpY2FsQm90dG9tUGFkZGluZyA9IDA7XG5cblx0XHRoZWxwZXJzLmVhY2godG9wQm94ZXMuY29uY2F0KGJvdHRvbUJveGVzKSwgZnVuY3Rpb24oaG9yaXpvbnRhbEJveCkge1xuXHRcdFx0aWYgKGhvcml6b250YWxCb3guZ2V0UGFkZGluZykge1xuXHRcdFx0XHR2YXIgYm94UGFkZGluZyA9IGhvcml6b250YWxCb3guZ2V0UGFkZGluZygpO1xuXHRcdFx0XHRtYXhIb3Jpem9udGFsTGVmdFBhZGRpbmcgPSBNYXRoLm1heChtYXhIb3Jpem9udGFsTGVmdFBhZGRpbmcsIGJveFBhZGRpbmcubGVmdCk7XG5cdFx0XHRcdG1heEhvcml6b250YWxSaWdodFBhZGRpbmcgPSBNYXRoLm1heChtYXhIb3Jpem9udGFsUmlnaHRQYWRkaW5nLCBib3hQYWRkaW5nLnJpZ2h0KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGhlbHBlcnMuZWFjaChsZWZ0Qm94ZXMuY29uY2F0KHJpZ2h0Qm94ZXMpLCBmdW5jdGlvbih2ZXJ0aWNhbEJveCkge1xuXHRcdFx0aWYgKHZlcnRpY2FsQm94LmdldFBhZGRpbmcpIHtcblx0XHRcdFx0dmFyIGJveFBhZGRpbmcgPSB2ZXJ0aWNhbEJveC5nZXRQYWRkaW5nKCk7XG5cdFx0XHRcdG1heFZlcnRpY2FsVG9wUGFkZGluZyA9IE1hdGgubWF4KG1heFZlcnRpY2FsVG9wUGFkZGluZywgYm94UGFkZGluZy50b3ApO1xuXHRcdFx0XHRtYXhWZXJ0aWNhbEJvdHRvbVBhZGRpbmcgPSBNYXRoLm1heChtYXhWZXJ0aWNhbEJvdHRvbVBhZGRpbmcsIGJveFBhZGRpbmcuYm90dG9tKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEF0IHRoaXMgcG9pbnQsIG1heENoYXJ0QXJlYUhlaWdodCBhbmQgbWF4Q2hhcnRBcmVhV2lkdGggYXJlIHRoZSBzaXplIHRoZSBjaGFydCBhcmVhIGNvdWxkXG5cdFx0Ly8gYmUgaWYgdGhlIGF4ZXMgYXJlIGRyYXduIGF0IHRoZWlyIG1pbmltdW0gc2l6ZXMuXG5cdFx0Ly8gU3RlcHMgNSAmIDZcblx0XHR2YXIgdG90YWxMZWZ0Qm94ZXNXaWR0aCA9IGxlZnRQYWRkaW5nO1xuXHRcdHZhciB0b3RhbFJpZ2h0Qm94ZXNXaWR0aCA9IHJpZ2h0UGFkZGluZztcblx0XHR2YXIgdG90YWxUb3BCb3hlc0hlaWdodCA9IHRvcFBhZGRpbmc7XG5cdFx0dmFyIHRvdGFsQm90dG9tQm94ZXNIZWlnaHQgPSBib3R0b21QYWRkaW5nO1xuXG5cdFx0Ly8gRnVuY3Rpb24gdG8gZml0IGEgYm94XG5cdFx0ZnVuY3Rpb24gZml0Qm94KGJveCkge1xuXHRcdFx0dmFyIG1pbkJveFNpemUgPSBoZWxwZXJzLmZpbmROZXh0V2hlcmUobWluQm94U2l6ZXMsIGZ1bmN0aW9uKG1pbkJveCkge1xuXHRcdFx0XHRyZXR1cm4gbWluQm94LmJveCA9PT0gYm94O1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChtaW5Cb3hTaXplKSB7XG5cdFx0XHRcdGlmIChib3guaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdFx0XHR2YXIgc2NhbGVNYXJnaW4gPSB7XG5cdFx0XHRcdFx0XHRsZWZ0OiBNYXRoLm1heCh0b3RhbExlZnRCb3hlc1dpZHRoLCBtYXhIb3Jpem9udGFsTGVmdFBhZGRpbmcpLFxuXHRcdFx0XHRcdFx0cmlnaHQ6IE1hdGgubWF4KHRvdGFsUmlnaHRCb3hlc1dpZHRoLCBtYXhIb3Jpem9udGFsUmlnaHRQYWRkaW5nKSxcblx0XHRcdFx0XHRcdHRvcDogMCxcblx0XHRcdFx0XHRcdGJvdHRvbTogMFxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHQvLyBEb24ndCB1c2UgbWluIHNpemUgaGVyZSBiZWNhdXNlIG9mIGxhYmVsIHJvdGF0aW9uLiBXaGVuIHRoZSBsYWJlbHMgYXJlIHJvdGF0ZWQsIHRoZWlyIHJvdGF0aW9uIGhpZ2hseSBkZXBlbmRzXG5cdFx0XHRcdFx0Ly8gb24gdGhlIG1hcmdpbi4gU29tZXRpbWVzIHRoZXkgbmVlZCB0byBpbmNyZWFzZSBpbiBzaXplIHNsaWdodGx5XG5cdFx0XHRcdFx0Ym94LnVwZGF0ZShib3guZnVsbFdpZHRoID8gY2hhcnRXaWR0aCA6IG1heENoYXJ0QXJlYVdpZHRoLCBjaGFydEhlaWdodCAvIDIsIHNjYWxlTWFyZ2luKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRib3gudXBkYXRlKG1pbkJveFNpemUubWluU2l6ZS53aWR0aCwgbWF4Q2hhcnRBcmVhSGVpZ2h0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFVwZGF0ZSwgYW5kIGNhbGN1bGF0ZSB0aGUgbGVmdCBhbmQgcmlnaHQgbWFyZ2lucyBmb3IgdGhlIGhvcml6b250YWwgYm94ZXNcblx0XHRoZWxwZXJzLmVhY2gobGVmdEJveGVzLmNvbmNhdChyaWdodEJveGVzKSwgZml0Qm94KTtcblxuXHRcdGhlbHBlcnMuZWFjaChsZWZ0Qm94ZXMsIGZ1bmN0aW9uKGJveCkge1xuXHRcdFx0dG90YWxMZWZ0Qm94ZXNXaWR0aCArPSBib3gud2lkdGg7XG5cdFx0fSk7XG5cblx0XHRoZWxwZXJzLmVhY2gocmlnaHRCb3hlcywgZnVuY3Rpb24oYm94KSB7XG5cdFx0XHR0b3RhbFJpZ2h0Qm94ZXNXaWR0aCArPSBib3gud2lkdGg7XG5cdFx0fSk7XG5cblx0XHQvLyBTZXQgdGhlIExlZnQgYW5kIFJpZ2h0IG1hcmdpbnMgZm9yIHRoZSBob3Jpem9udGFsIGJveGVzXG5cdFx0aGVscGVycy5lYWNoKHRvcEJveGVzLmNvbmNhdChib3R0b21Cb3hlcyksIGZpdEJveCk7XG5cblx0XHQvLyBGaWd1cmUgb3V0IGhvdyBtdWNoIG1hcmdpbiBpcyBvbiB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIHZlcnRpY2FsIGJveGVzXG5cdFx0aGVscGVycy5lYWNoKHRvcEJveGVzLCBmdW5jdGlvbihib3gpIHtcblx0XHRcdHRvdGFsVG9wQm94ZXNIZWlnaHQgKz0gYm94LmhlaWdodDtcblx0XHR9KTtcblxuXHRcdGhlbHBlcnMuZWFjaChib3R0b21Cb3hlcywgZnVuY3Rpb24oYm94KSB7XG5cdFx0XHR0b3RhbEJvdHRvbUJveGVzSGVpZ2h0ICs9IGJveC5oZWlnaHQ7XG5cdFx0fSk7XG5cblx0XHRmdW5jdGlvbiBmaW5hbEZpdFZlcnRpY2FsQm94KGJveCkge1xuXHRcdFx0dmFyIG1pbkJveFNpemUgPSBoZWxwZXJzLmZpbmROZXh0V2hlcmUobWluQm94U2l6ZXMsIGZ1bmN0aW9uKG1pblNpemUpIHtcblx0XHRcdFx0cmV0dXJuIG1pblNpemUuYm94ID09PSBib3g7XG5cdFx0XHR9KTtcblxuXHRcdFx0dmFyIHNjYWxlTWFyZ2luID0ge1xuXHRcdFx0XHRsZWZ0OiAwLFxuXHRcdFx0XHRyaWdodDogMCxcblx0XHRcdFx0dG9wOiB0b3RhbFRvcEJveGVzSGVpZ2h0LFxuXHRcdFx0XHRib3R0b206IHRvdGFsQm90dG9tQm94ZXNIZWlnaHRcblx0XHRcdH07XG5cblx0XHRcdGlmIChtaW5Cb3hTaXplKSB7XG5cdFx0XHRcdGJveC51cGRhdGUobWluQm94U2l6ZS5taW5TaXplLndpZHRoLCBtYXhDaGFydEFyZWFIZWlnaHQsIHNjYWxlTWFyZ2luKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBMZXQgdGhlIGxlZnQgbGF5b3V0IGtub3cgdGhlIGZpbmFsIG1hcmdpblxuXHRcdGhlbHBlcnMuZWFjaChsZWZ0Qm94ZXMuY29uY2F0KHJpZ2h0Qm94ZXMpLCBmaW5hbEZpdFZlcnRpY2FsQm94KTtcblxuXHRcdC8vIFJlY2FsY3VsYXRlIGJlY2F1c2UgdGhlIHNpemUgb2YgZWFjaCBsYXlvdXQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHNsaWdodGx5IGR1ZSB0byB0aGUgbWFyZ2lucyAobGFiZWwgcm90YXRpb24gZm9yIGluc3RhbmNlKVxuXHRcdHRvdGFsTGVmdEJveGVzV2lkdGggPSBsZWZ0UGFkZGluZztcblx0XHR0b3RhbFJpZ2h0Qm94ZXNXaWR0aCA9IHJpZ2h0UGFkZGluZztcblx0XHR0b3RhbFRvcEJveGVzSGVpZ2h0ID0gdG9wUGFkZGluZztcblx0XHR0b3RhbEJvdHRvbUJveGVzSGVpZ2h0ID0gYm90dG9tUGFkZGluZztcblxuXHRcdGhlbHBlcnMuZWFjaChsZWZ0Qm94ZXMsIGZ1bmN0aW9uKGJveCkge1xuXHRcdFx0dG90YWxMZWZ0Qm94ZXNXaWR0aCArPSBib3gud2lkdGg7XG5cdFx0fSk7XG5cblx0XHRoZWxwZXJzLmVhY2gocmlnaHRCb3hlcywgZnVuY3Rpb24oYm94KSB7XG5cdFx0XHR0b3RhbFJpZ2h0Qm94ZXNXaWR0aCArPSBib3gud2lkdGg7XG5cdFx0fSk7XG5cblx0XHRoZWxwZXJzLmVhY2godG9wQm94ZXMsIGZ1bmN0aW9uKGJveCkge1xuXHRcdFx0dG90YWxUb3BCb3hlc0hlaWdodCArPSBib3guaGVpZ2h0O1xuXHRcdH0pO1xuXHRcdGhlbHBlcnMuZWFjaChib3R0b21Cb3hlcywgZnVuY3Rpb24oYm94KSB7XG5cdFx0XHR0b3RhbEJvdHRvbUJveGVzSGVpZ2h0ICs9IGJveC5oZWlnaHQ7XG5cdFx0fSk7XG5cblx0XHQvLyBXZSBtYXkgYmUgYWRkaW5nIHNvbWUgcGFkZGluZyB0byBhY2NvdW50IGZvciByb3RhdGVkIHggYXhpcyBsYWJlbHNcblx0XHR2YXIgbGVmdFBhZGRpbmdBZGRpdGlvbiA9IE1hdGgubWF4KG1heEhvcml6b250YWxMZWZ0UGFkZGluZyAtIHRvdGFsTGVmdEJveGVzV2lkdGgsIDApO1xuXHRcdHRvdGFsTGVmdEJveGVzV2lkdGggKz0gbGVmdFBhZGRpbmdBZGRpdGlvbjtcblx0XHR0b3RhbFJpZ2h0Qm94ZXNXaWR0aCArPSBNYXRoLm1heChtYXhIb3Jpem9udGFsUmlnaHRQYWRkaW5nIC0gdG90YWxSaWdodEJveGVzV2lkdGgsIDApO1xuXG5cdFx0dmFyIHRvcFBhZGRpbmdBZGRpdGlvbiA9IE1hdGgubWF4KG1heFZlcnRpY2FsVG9wUGFkZGluZyAtIHRvdGFsVG9wQm94ZXNIZWlnaHQsIDApO1xuXHRcdHRvdGFsVG9wQm94ZXNIZWlnaHQgKz0gdG9wUGFkZGluZ0FkZGl0aW9uO1xuXHRcdHRvdGFsQm90dG9tQm94ZXNIZWlnaHQgKz0gTWF0aC5tYXgobWF4VmVydGljYWxCb3R0b21QYWRkaW5nIC0gdG90YWxCb3R0b21Cb3hlc0hlaWdodCwgMCk7XG5cblx0XHQvLyBGaWd1cmUgb3V0IGlmIG91ciBjaGFydCBhcmVhIGNoYW5nZWQuIFRoaXMgd291bGQgb2NjdXIgaWYgdGhlIGRhdGFzZXQgbGF5b3V0IGxhYmVsIHJvdGF0aW9uXG5cdFx0Ly8gY2hhbmdlZCBkdWUgdG8gdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBtYXJnaW5zIGluIHN0ZXAgNi4gU2luY2Ugd2UgY2FuIG9ubHkgZ2V0IGJpZ2dlciwgdGhpcyBpcyBzYWZlIHRvIGRvXG5cdFx0Ly8gd2l0aG91dCBjYWxsaW5nIGBmaXRgIGFnYWluXG5cdFx0dmFyIG5ld01heENoYXJ0QXJlYUhlaWdodCA9IGhlaWdodCAtIHRvdGFsVG9wQm94ZXNIZWlnaHQgLSB0b3RhbEJvdHRvbUJveGVzSGVpZ2h0O1xuXHRcdHZhciBuZXdNYXhDaGFydEFyZWFXaWR0aCA9IHdpZHRoIC0gdG90YWxMZWZ0Qm94ZXNXaWR0aCAtIHRvdGFsUmlnaHRCb3hlc1dpZHRoO1xuXG5cdFx0aWYgKG5ld01heENoYXJ0QXJlYVdpZHRoICE9PSBtYXhDaGFydEFyZWFXaWR0aCB8fCBuZXdNYXhDaGFydEFyZWFIZWlnaHQgIT09IG1heENoYXJ0QXJlYUhlaWdodCkge1xuXHRcdFx0aGVscGVycy5lYWNoKGxlZnRCb3hlcywgZnVuY3Rpb24oYm94KSB7XG5cdFx0XHRcdGJveC5oZWlnaHQgPSBuZXdNYXhDaGFydEFyZWFIZWlnaHQ7XG5cdFx0XHR9KTtcblxuXHRcdFx0aGVscGVycy5lYWNoKHJpZ2h0Qm94ZXMsIGZ1bmN0aW9uKGJveCkge1xuXHRcdFx0XHRib3guaGVpZ2h0ID0gbmV3TWF4Q2hhcnRBcmVhSGVpZ2h0O1xuXHRcdFx0fSk7XG5cblx0XHRcdGhlbHBlcnMuZWFjaCh0b3BCb3hlcywgZnVuY3Rpb24oYm94KSB7XG5cdFx0XHRcdGlmICghYm94LmZ1bGxXaWR0aCkge1xuXHRcdFx0XHRcdGJveC53aWR0aCA9IG5ld01heENoYXJ0QXJlYVdpZHRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aGVscGVycy5lYWNoKGJvdHRvbUJveGVzLCBmdW5jdGlvbihib3gpIHtcblx0XHRcdFx0aWYgKCFib3guZnVsbFdpZHRoKSB7XG5cdFx0XHRcdFx0Ym94LndpZHRoID0gbmV3TWF4Q2hhcnRBcmVhV2lkdGg7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRtYXhDaGFydEFyZWFIZWlnaHQgPSBuZXdNYXhDaGFydEFyZWFIZWlnaHQ7XG5cdFx0XHRtYXhDaGFydEFyZWFXaWR0aCA9IG5ld01heENoYXJ0QXJlYVdpZHRoO1xuXHRcdH1cblxuXHRcdC8vIFN0ZXAgNyAtIFBvc2l0aW9uIHRoZSBib3hlc1xuXHRcdHZhciBsZWZ0ID0gbGVmdFBhZGRpbmcgKyBsZWZ0UGFkZGluZ0FkZGl0aW9uO1xuXHRcdHZhciB0b3AgPSB0b3BQYWRkaW5nICsgdG9wUGFkZGluZ0FkZGl0aW9uO1xuXG5cdFx0ZnVuY3Rpb24gcGxhY2VCb3goYm94KSB7XG5cdFx0XHRpZiAoYm94LmlzSG9yaXpvbnRhbCgpKSB7XG5cdFx0XHRcdGJveC5sZWZ0ID0gYm94LmZ1bGxXaWR0aCA/IGxlZnRQYWRkaW5nIDogdG90YWxMZWZ0Qm94ZXNXaWR0aDtcblx0XHRcdFx0Ym94LnJpZ2h0ID0gYm94LmZ1bGxXaWR0aCA/IHdpZHRoIC0gcmlnaHRQYWRkaW5nIDogdG90YWxMZWZ0Qm94ZXNXaWR0aCArIG1heENoYXJ0QXJlYVdpZHRoO1xuXHRcdFx0XHRib3gudG9wID0gdG9wO1xuXHRcdFx0XHRib3guYm90dG9tID0gdG9wICsgYm94LmhlaWdodDtcblxuXHRcdFx0XHQvLyBNb3ZlIHRvIG5leHQgcG9pbnRcblx0XHRcdFx0dG9wID0gYm94LmJvdHRvbTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRib3gubGVmdCA9IGxlZnQ7XG5cdFx0XHRcdGJveC5yaWdodCA9IGxlZnQgKyBib3gud2lkdGg7XG5cdFx0XHRcdGJveC50b3AgPSB0b3RhbFRvcEJveGVzSGVpZ2h0O1xuXHRcdFx0XHRib3guYm90dG9tID0gdG90YWxUb3BCb3hlc0hlaWdodCArIG1heENoYXJ0QXJlYUhlaWdodDtcblxuXHRcdFx0XHQvLyBNb3ZlIHRvIG5leHQgcG9pbnRcblx0XHRcdFx0bGVmdCA9IGJveC5yaWdodDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRoZWxwZXJzLmVhY2gobGVmdEJveGVzLmNvbmNhdCh0b3BCb3hlcyksIHBsYWNlQm94KTtcblxuXHRcdC8vIEFjY291bnQgZm9yIGNoYXJ0IHdpZHRoIGFuZCBoZWlnaHRcblx0XHRsZWZ0ICs9IG1heENoYXJ0QXJlYVdpZHRoO1xuXHRcdHRvcCArPSBtYXhDaGFydEFyZWFIZWlnaHQ7XG5cblx0XHRoZWxwZXJzLmVhY2gocmlnaHRCb3hlcywgcGxhY2VCb3gpO1xuXHRcdGhlbHBlcnMuZWFjaChib3R0b21Cb3hlcywgcGxhY2VCb3gpO1xuXG5cdFx0Ly8gU3RlcCA4XG5cdFx0Y2hhcnQuY2hhcnRBcmVhID0ge1xuXHRcdFx0bGVmdDogdG90YWxMZWZ0Qm94ZXNXaWR0aCxcblx0XHRcdHRvcDogdG90YWxUb3BCb3hlc0hlaWdodCxcblx0XHRcdHJpZ2h0OiB0b3RhbExlZnRCb3hlc1dpZHRoICsgbWF4Q2hhcnRBcmVhV2lkdGgsXG5cdFx0XHRib3R0b206IHRvdGFsVG9wQm94ZXNIZWlnaHQgKyBtYXhDaGFydEFyZWFIZWlnaHRcblx0XHR9O1xuXG5cdFx0Ly8gU3RlcCA5XG5cdFx0aGVscGVycy5lYWNoKGNoYXJ0QXJlYUJveGVzLCBmdW5jdGlvbihib3gpIHtcblx0XHRcdGJveC5sZWZ0ID0gY2hhcnQuY2hhcnRBcmVhLmxlZnQ7XG5cdFx0XHRib3gudG9wID0gY2hhcnQuY2hhcnRBcmVhLnRvcDtcblx0XHRcdGJveC5yaWdodCA9IGNoYXJ0LmNoYXJ0QXJlYS5yaWdodDtcblx0XHRcdGJveC5ib3R0b20gPSBjaGFydC5jaGFydEFyZWEuYm90dG9tO1xuXG5cdFx0XHRib3gudXBkYXRlKG1heENoYXJ0QXJlYVdpZHRoLCBtYXhDaGFydEFyZWFIZWlnaHQpO1xuXHRcdH0pO1xuXHR9XG59O1xuXG59LHtcIjQ2XCI6NDZ9XSwzMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxuZGVmYXVsdHMuX3NldCgnZ2xvYmFsJywge1xuXHRwbHVnaW5zOiB7fVxufSk7XG5cbi8qKlxuICogVGhlIHBsdWdpbiBzZXJ2aWNlIHNpbmdsZXRvblxuICogQG5hbWVzcGFjZSBDaGFydC5wbHVnaW5zXG4gKiBAc2luY2UgMi4xLjBcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSB7XG5cdC8qKlxuXHQgKiBHbG9iYWxseSByZWdpc3RlcmVkIHBsdWdpbnMuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfcGx1Z2luczogW10sXG5cblx0LyoqXG5cdCAqIFRoaXMgaWRlbnRpZmllciBpcyB1c2VkIHRvIGludmFsaWRhdGUgdGhlIGRlc2NyaXB0b3JzIGNhY2hlIGF0dGFjaGVkIHRvIGVhY2ggY2hhcnRcblx0ICogd2hlbiBhIGdsb2JhbCBwbHVnaW4gaXMgcmVnaXN0ZXJlZCBvciB1bnJlZ2lzdGVyZWQuIEluIHRoaXMgY2FzZSwgdGhlIGNhY2hlIElEIGlzXG5cdCAqIGluY3JlbWVudGVkIGFuZCBkZXNjcmlwdG9ycyBhcmUgcmVnZW5lcmF0ZWQgZHVyaW5nIGZvbGxvd2luZyBBUEkgY2FsbHMuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfY2FjaGVJZDogMCxcblxuXHQvKipcblx0ICogUmVnaXN0ZXJzIHRoZSBnaXZlbiBwbHVnaW4ocykgaWYgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC5cblx0ICogQHBhcmFtIHtBcnJheXxPYmplY3R9IHBsdWdpbnMgcGx1Z2luIGluc3RhbmNlKHMpLlxuXHQgKi9cblx0cmVnaXN0ZXI6IGZ1bmN0aW9uKHBsdWdpbnMpIHtcblx0XHR2YXIgcCA9IHRoaXMuX3BsdWdpbnM7XG5cdFx0KFtdKS5jb25jYXQocGx1Z2lucykuZm9yRWFjaChmdW5jdGlvbihwbHVnaW4pIHtcblx0XHRcdGlmIChwLmluZGV4T2YocGx1Z2luKSA9PT0gLTEpIHtcblx0XHRcdFx0cC5wdXNoKHBsdWdpbik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR0aGlzLl9jYWNoZUlkKys7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVucmVnaXN0ZXJzIHRoZSBnaXZlbiBwbHVnaW4ocykgb25seSBpZiByZWdpc3RlcmVkLlxuXHQgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gcGx1Z2lucyBwbHVnaW4gaW5zdGFuY2UocykuXG5cdCAqL1xuXHR1bnJlZ2lzdGVyOiBmdW5jdGlvbihwbHVnaW5zKSB7XG5cdFx0dmFyIHAgPSB0aGlzLl9wbHVnaW5zO1xuXHRcdChbXSkuY29uY2F0KHBsdWdpbnMpLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKSB7XG5cdFx0XHR2YXIgaWR4ID0gcC5pbmRleE9mKHBsdWdpbik7XG5cdFx0XHRpZiAoaWR4ICE9PSAtMSkge1xuXHRcdFx0XHRwLnNwbGljZShpZHgsIDEpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fY2FjaGVJZCsrO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYWxsIHJlZ2lzdGVyZWQgcGx1Z2lucy5cblx0ICogQHNpbmNlIDIuMS41XG5cdCAqL1xuXHRjbGVhcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5fcGx1Z2lucyA9IFtdO1xuXHRcdHRoaXMuX2NhY2hlSWQrKztcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgcGx1Z2lucz9cblx0ICogQHJldHVybnMge051bWJlcn1cblx0ICogQHNpbmNlIDIuMS41XG5cdCAqL1xuXHRjb3VudDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3BsdWdpbnMubGVuZ3RoO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCByZWdpc3RlcmVkIHBsdWdpbiBpbnN0YW5jZXMuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gYXJyYXkgb2YgcGx1Z2luIG9iamVjdHMuXG5cdCAqIEBzaW5jZSAyLjEuNVxuXHQgKi9cblx0Z2V0QWxsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5fcGx1Z2lucztcblx0fSxcblxuXHQvKipcblx0ICogQ2FsbHMgZW5hYmxlZCBwbHVnaW5zIGZvciBgY2hhcnRgIG9uIHRoZSBzcGVjaWZpZWQgaG9vayBhbmQgd2l0aCB0aGUgZ2l2ZW4gYXJncy5cblx0ICogVGhpcyBtZXRob2QgaW1tZWRpYXRlbHkgcmV0dXJucyBhcyBzb29uIGFzIGEgcGx1Z2luIGV4cGxpY2l0bHkgcmV0dXJucyBmYWxzZS4gVGhlXG5cdCAqIHJldHVybmVkIHZhbHVlIGNhbiBiZSB1c2VkLCBmb3IgaW5zdGFuY2UsIHRvIGludGVycnVwdCB0aGUgY3VycmVudCBhY3Rpb24uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZSBmb3Igd2hpY2ggcGx1Z2lucyBzaG91bGQgYmUgY2FsbGVkLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaG9vayAtIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gbWV0aG9kIHRvIGNhbGwgKGUuZy4gJ2JlZm9yZVVwZGF0ZScpLlxuXHQgKiBAcGFyYW0ge0FycmF5fSBbYXJnc10gLSBFeHRyYSBhcmd1bWVudHMgdG8gYXBwbHkgdG8gdGhlIGhvb2sgY2FsbC5cblx0ICogQHJldHVybnMge0Jvb2xlYW59IGZhbHNlIGlmIGFueSBvZiB0aGUgcGx1Z2lucyByZXR1cm4gZmFsc2UsIGVsc2UgcmV0dXJucyB0cnVlLlxuXHQgKi9cblx0bm90aWZ5OiBmdW5jdGlvbihjaGFydCwgaG9vaywgYXJncykge1xuXHRcdHZhciBkZXNjcmlwdG9ycyA9IHRoaXMuZGVzY3JpcHRvcnMoY2hhcnQpO1xuXHRcdHZhciBpbGVuID0gZGVzY3JpcHRvcnMubGVuZ3RoO1xuXHRcdHZhciBpLCBkZXNjcmlwdG9yLCBwbHVnaW4sIHBhcmFtcywgbWV0aG9kO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0ZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzW2ldO1xuXHRcdFx0cGx1Z2luID0gZGVzY3JpcHRvci5wbHVnaW47XG5cdFx0XHRtZXRob2QgPSBwbHVnaW5baG9va107XG5cdFx0XHRpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRwYXJhbXMgPSBbY2hhcnRdLmNvbmNhdChhcmdzIHx8IFtdKTtcblx0XHRcdFx0cGFyYW1zLnB1c2goZGVzY3JpcHRvci5vcHRpb25zKTtcblx0XHRcdFx0aWYgKG1ldGhvZC5hcHBseShwbHVnaW4sIHBhcmFtcykgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgZGVzY3JpcHRvcnMgb2YgZW5hYmxlZCBwbHVnaW5zIGZvciB0aGUgZ2l2ZW4gY2hhcnQuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gW3sgcGx1Z2luLCBvcHRpb25zIH1dXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRkZXNjcmlwdG9yczogZnVuY3Rpb24oY2hhcnQpIHtcblx0XHR2YXIgY2FjaGUgPSBjaGFydC4kcGx1Z2lucyB8fCAoY2hhcnQuJHBsdWdpbnMgPSB7fSk7XG5cdFx0aWYgKGNhY2hlLmlkID09PSB0aGlzLl9jYWNoZUlkKSB7XG5cdFx0XHRyZXR1cm4gY2FjaGUuZGVzY3JpcHRvcnM7XG5cdFx0fVxuXG5cdFx0dmFyIHBsdWdpbnMgPSBbXTtcblx0XHR2YXIgZGVzY3JpcHRvcnMgPSBbXTtcblx0XHR2YXIgY29uZmlnID0gKGNoYXJ0ICYmIGNoYXJ0LmNvbmZpZykgfHwge307XG5cdFx0dmFyIG9wdGlvbnMgPSAoY29uZmlnLm9wdGlvbnMgJiYgY29uZmlnLm9wdGlvbnMucGx1Z2lucykgfHwge307XG5cblx0XHR0aGlzLl9wbHVnaW5zLmNvbmNhdChjb25maWcucGx1Z2lucyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihwbHVnaW4pIHtcblx0XHRcdHZhciBpZHggPSBwbHVnaW5zLmluZGV4T2YocGx1Z2luKTtcblx0XHRcdGlmIChpZHggIT09IC0xKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGlkID0gcGx1Z2luLmlkO1xuXHRcdFx0dmFyIG9wdHMgPSBvcHRpb25zW2lkXTtcblx0XHRcdGlmIChvcHRzID09PSBmYWxzZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvcHRzID09PSB0cnVlKSB7XG5cdFx0XHRcdG9wdHMgPSBoZWxwZXJzLmNsb25lKGRlZmF1bHRzLmdsb2JhbC5wbHVnaW5zW2lkXSk7XG5cdFx0XHR9XG5cblx0XHRcdHBsdWdpbnMucHVzaChwbHVnaW4pO1xuXHRcdFx0ZGVzY3JpcHRvcnMucHVzaCh7XG5cdFx0XHRcdHBsdWdpbjogcGx1Z2luLFxuXHRcdFx0XHRvcHRpb25zOiBvcHRzIHx8IHt9XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdGNhY2hlLmRlc2NyaXB0b3JzID0gZGVzY3JpcHRvcnM7XG5cdFx0Y2FjaGUuaWQgPSB0aGlzLl9jYWNoZUlkO1xuXHRcdHJldHVybiBkZXNjcmlwdG9ycztcblx0fSxcblxuXHQvKipcblx0ICogSW52YWxpZGF0ZXMgY2FjaGUgZm9yIHRoZSBnaXZlbiBjaGFydDogZGVzY3JpcHRvcnMgaG9sZCBhIHJlZmVyZW5jZSBvbiBwbHVnaW4gb3B0aW9uLFxuXHQgKiBidXQgaW4gc29tZSBjYXNlcywgdGhpcyByZWZlcmVuY2UgY2FuIGJlIGNoYW5nZWQgYnkgdGhlIHVzZXIgd2hlbiB1cGRhdGluZyBvcHRpb25zLlxuXHQgKiBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNTExMSNpc3N1ZWNvbW1lbnQtMzU1OTM0MTY3XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfaW52YWxpZGF0ZTogZnVuY3Rpb24oY2hhcnQpIHtcblx0XHRkZWxldGUgY2hhcnQuJHBsdWdpbnM7XG5cdH1cbn07XG5cbi8qKlxuICogUGx1Z2luIGV4dGVuc2lvbiBob29rcy5cbiAqIEBpbnRlcmZhY2UgSVBsdWdpblxuICogQHNpbmNlIDIuMS4wXG4gKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI2JlZm9yZUluaXRcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGBjaGFydGAuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI2FmdGVySW5pdFxuICogQGRlc2MgQ2FsbGVkIGFmdGVyIGBjaGFydGAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdXBkYXRlLlxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNiZWZvcmVVcGRhdGVcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgdXBkYXRpbmcgYGNoYXJ0YC4gSWYgYW55IHBsdWdpbiByZXR1cm5zIGBmYWxzZWAsIHRoZSB1cGRhdGVcbiAqIGlzIGNhbmNlbGxlZCAoYW5kIHRodXMgc3Vic2VxdWVudCByZW5kZXIocykpIHVudGlsIGFub3RoZXIgYHVwZGF0ZWAgaXMgdHJpZ2dlcmVkLlxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICogQHJldHVybnMge0Jvb2xlYW59IGBmYWxzZWAgdG8gY2FuY2VsIHRoZSBjaGFydCB1cGRhdGUuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI2FmdGVyVXBkYXRlXG4gKiBAZGVzYyBDYWxsZWQgYWZ0ZXIgYGNoYXJ0YCBoYXMgYmVlbiB1cGRhdGVkIGFuZCBiZWZvcmUgcmVuZGVyaW5nLiBOb3RlIHRoYXQgdGhpc1xuICogaG9vayB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgdGhlIGNoYXJ0IHVwZGF0ZSBoYXMgYmVlbiBwcmV2aW91c2x5IGNhbmNlbGxlZC5cbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYmVmb3JlRGF0YXNldHNVcGRhdGVcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgdXBkYXRpbmcgdGhlIGBjaGFydGAgZGF0YXNldHMuIElmIGFueSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgLFxuICogdGhlIGRhdGFzZXRzIHVwZGF0ZSBpcyBjYW5jZWxsZWQgdW50aWwgYW5vdGhlciBgdXBkYXRlYCBpcyB0cmlnZ2VyZWQuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gZmFsc2UgdG8gY2FuY2VsIHRoZSBkYXRhc2V0cyB1cGRhdGUuXG4gKiBAc2luY2UgdmVyc2lvbiAyLjEuNVxuKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI2FmdGVyRGF0YXNldHNVcGRhdGVcbiAqIEBkZXNjIENhbGxlZCBhZnRlciB0aGUgYGNoYXJ0YCBkYXRhc2V0cyBoYXZlIGJlZW4gdXBkYXRlZC4gTm90ZSB0aGF0IHRoaXMgaG9va1xuICogd2lsbCBub3QgYmUgY2FsbGVkIGlmIHRoZSBkYXRhc2V0cyB1cGRhdGUgaGFzIGJlZW4gcHJldmlvdXNseSBjYW5jZWxsZWQuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKiBAc2luY2UgdmVyc2lvbiAyLjEuNVxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNiZWZvcmVEYXRhc2V0VXBkYXRlXG4gKiBAZGVzYyBDYWxsZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBgY2hhcnRgIGRhdGFzZXQgYXQgdGhlIGdpdmVuIGBhcmdzLmluZGV4YC4gSWYgYW55IHBsdWdpblxuICogcmV0dXJucyBgZmFsc2VgLCB0aGUgZGF0YXNldHMgdXBkYXRlIGlzIGNhbmNlbGxlZCB1bnRpbCBhbm90aGVyIGB1cGRhdGVgIGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBUaGUgY2FsbCBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge051bWJlcn0gYXJncy5pbmRleCAtIFRoZSBkYXRhc2V0IGluZGV4LlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MubWV0YSAtIFRoZSBkYXRhc2V0IG1ldGFkYXRhLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGNoYXJ0IGRhdGFzZXRzIGRyYXdpbmcuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI2FmdGVyRGF0YXNldFVwZGF0ZVxuICogQGRlc2MgQ2FsbGVkIGFmdGVyIHRoZSBgY2hhcnRgIGRhdGFzZXRzIGF0IHRoZSBnaXZlbiBgYXJncy5pbmRleGAgaGFzIGJlZW4gdXBkYXRlZC4gTm90ZVxuICogdGhhdCB0aGlzIGhvb2sgd2lsbCBub3QgYmUgY2FsbGVkIGlmIHRoZSBkYXRhc2V0cyB1cGRhdGUgaGFzIGJlZW4gcHJldmlvdXNseSBjYW5jZWxsZWQuXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gVGhlIGNhbGwgYXJndW1lbnRzLlxuICogQHBhcmFtIHtOdW1iZXJ9IGFyZ3MuaW5kZXggLSBUaGUgZGF0YXNldCBpbmRleC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzLm1ldGEgLSBUaGUgZGF0YXNldCBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNiZWZvcmVMYXlvdXRcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgbGF5aW5nIG91dCBgY2hhcnRgLiBJZiBhbnkgcGx1Z2luIHJldHVybnMgYGZhbHNlYCxcbiAqIHRoZSBsYXlvdXQgdXBkYXRlIGlzIGNhbmNlbGxlZCB1bnRpbCBhbm90aGVyIGB1cGRhdGVgIGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgZmFsc2VgIHRvIGNhbmNlbCB0aGUgY2hhcnQgbGF5b3V0LlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlckxheW91dFxuICogQGRlc2MgQ2FsbGVkIGFmdGVyIHRoZSBgY2hhcnRgIGhhcyBiZWVuIGxheWVkIG91dC4gTm90ZSB0aGF0IHRoaXMgaG9vayB3aWxsIG5vdFxuICogYmUgY2FsbGVkIGlmIHRoZSBsYXlvdXQgdXBkYXRlIGhhcyBiZWVuIHByZXZpb3VzbHkgY2FuY2VsbGVkLlxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNiZWZvcmVSZW5kZXJcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgcmVuZGVyaW5nIGBjaGFydGAuIElmIGFueSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgLFxuICogdGhlIHJlbmRlcmluZyBpcyBjYW5jZWxsZWQgdW50aWwgYW5vdGhlciBgcmVuZGVyYCBpcyB0cmlnZ2VyZWQuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGNoYXJ0IHJlbmRlcmluZy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYWZ0ZXJSZW5kZXJcbiAqIEBkZXNjIENhbGxlZCBhZnRlciB0aGUgYGNoYXJ0YCBoYXMgYmVlbiBmdWxseSByZW5kZXJlZCAoYW5kIGFuaW1hdGlvbiBjb21wbGV0ZWQpLiBOb3RlXG4gKiB0aGF0IHRoaXMgaG9vayB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgdGhlIHJlbmRlcmluZyBoYXMgYmVlbiBwcmV2aW91c2x5IGNhbmNlbGxlZC5cbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYmVmb3JlRHJhd1xuICogQGRlc2MgQ2FsbGVkIGJlZm9yZSBkcmF3aW5nIGBjaGFydGAgYXQgZXZlcnkgYW5pbWF0aW9uIGZyYW1lIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW5cbiAqIGVhc2luZyB2YWx1ZS4gSWYgYW55IHBsdWdpbiByZXR1cm5zIGBmYWxzZWAsIHRoZSBmcmFtZSBkcmF3aW5nIGlzIGNhbmNlbGxlZCB1bnRpbFxuICogYW5vdGhlciBgcmVuZGVyYCBpcyB0cmlnZ2VyZWQuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGVhc2luZ1ZhbHVlIC0gVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHZhbHVlLCBiZXR3ZWVuIDAuMCBhbmQgMS4wLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGNoYXJ0IGRyYXdpbmcuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI2FmdGVyRHJhd1xuICogQGRlc2MgQ2FsbGVkIGFmdGVyIHRoZSBgY2hhcnRgIGhhcyBiZWVuIGRyYXduIGZvciB0aGUgc3BlY2lmaWMgZWFzaW5nIHZhbHVlLiBOb3RlXG4gKiB0aGF0IHRoaXMgaG9vayB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgdGhlIGRyYXdpbmcgaGFzIGJlZW4gcHJldmlvdXNseSBjYW5jZWxsZWQuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGVhc2luZ1ZhbHVlIC0gVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHZhbHVlLCBiZXR3ZWVuIDAuMCBhbmQgMS4wLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI2JlZm9yZURhdGFzZXRzRHJhd1xuICogQGRlc2MgQ2FsbGVkIGJlZm9yZSBkcmF3aW5nIHRoZSBgY2hhcnRgIGRhdGFzZXRzLiBJZiBhbnkgcGx1Z2luIHJldHVybnMgYGZhbHNlYCxcbiAqIHRoZSBkYXRhc2V0cyBkcmF3aW5nIGlzIGNhbmNlbGxlZCB1bnRpbCBhbm90aGVyIGByZW5kZXJgIGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge051bWJlcn0gZWFzaW5nVmFsdWUgLSBUaGUgY3VycmVudCBhbmltYXRpb24gdmFsdWUsIGJldHdlZW4gMC4wIGFuZCAxLjAuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgZmFsc2VgIHRvIGNhbmNlbCB0aGUgY2hhcnQgZGF0YXNldHMgZHJhd2luZy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYWZ0ZXJEYXRhc2V0c0RyYXdcbiAqIEBkZXNjIENhbGxlZCBhZnRlciB0aGUgYGNoYXJ0YCBkYXRhc2V0cyBoYXZlIGJlZW4gZHJhd24uIE5vdGUgdGhhdCB0aGlzIGhvb2tcbiAqIHdpbGwgbm90IGJlIGNhbGxlZCBpZiB0aGUgZGF0YXNldHMgZHJhd2luZyBoYXMgYmVlbiBwcmV2aW91c2x5IGNhbmNlbGxlZC5cbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge051bWJlcn0gZWFzaW5nVmFsdWUgLSBUaGUgY3VycmVudCBhbmltYXRpb24gdmFsdWUsIGJldHdlZW4gMC4wIGFuZCAxLjAuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYmVmb3JlRGF0YXNldERyYXdcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgZHJhd2luZyB0aGUgYGNoYXJ0YCBkYXRhc2V0IGF0IHRoZSBnaXZlbiBgYXJncy5pbmRleGAgKGRhdGFzZXRzXG4gKiBhcmUgZHJhd24gaW4gdGhlIHJldmVyc2Ugb3JkZXIpLiBJZiBhbnkgcGx1Z2luIHJldHVybnMgYGZhbHNlYCwgdGhlIGRhdGFzZXRzIGRyYXdpbmdcbiAqIGlzIGNhbmNlbGxlZCB1bnRpbCBhbm90aGVyIGByZW5kZXJgIGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBUaGUgY2FsbCBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge051bWJlcn0gYXJncy5pbmRleCAtIFRoZSBkYXRhc2V0IGluZGV4LlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MubWV0YSAtIFRoZSBkYXRhc2V0IG1ldGFkYXRhLlxuICogQHBhcmFtIHtOdW1iZXJ9IGFyZ3MuZWFzaW5nVmFsdWUgLSBUaGUgY3VycmVudCBhbmltYXRpb24gdmFsdWUsIGJldHdlZW4gMC4wIGFuZCAxLjAuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgZmFsc2VgIHRvIGNhbmNlbCB0aGUgY2hhcnQgZGF0YXNldHMgZHJhd2luZy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYWZ0ZXJEYXRhc2V0RHJhd1xuICogQGRlc2MgQ2FsbGVkIGFmdGVyIHRoZSBgY2hhcnRgIGRhdGFzZXRzIGF0IHRoZSBnaXZlbiBgYXJncy5pbmRleGAgaGF2ZSBiZWVuIGRyYXduXG4gKiAoZGF0YXNldHMgYXJlIGRyYXduIGluIHRoZSByZXZlcnNlIG9yZGVyKS4gTm90ZSB0aGF0IHRoaXMgaG9vayB3aWxsIG5vdCBiZSBjYWxsZWRcbiAqIGlmIHRoZSBkYXRhc2V0cyBkcmF3aW5nIGhhcyBiZWVuIHByZXZpb3VzbHkgY2FuY2VsbGVkLlxuICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncyAtIFRoZSBjYWxsIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBhcmdzLmluZGV4IC0gVGhlIGRhdGFzZXQgaW5kZXguXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncy5tZXRhIC0gVGhlIGRhdGFzZXQgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge051bWJlcn0gYXJncy5lYXNpbmdWYWx1ZSAtIFRoZSBjdXJyZW50IGFuaW1hdGlvbiB2YWx1ZSwgYmV0d2VlbiAwLjAgYW5kIDEuMC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNiZWZvcmVUb29sdGlwRHJhd1xuICogQGRlc2MgQ2FsbGVkIGJlZm9yZSBkcmF3aW5nIHRoZSBgdG9vbHRpcGAuIElmIGFueSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgLFxuICogdGhlIHRvb2x0aXAgZHJhd2luZyBpcyBjYW5jZWxsZWQgdW50aWwgYW5vdGhlciBgcmVuZGVyYCBpcyB0cmlnZ2VyZWQuXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gVGhlIGNhbGwgYXJndW1lbnRzLlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MudG9vbHRpcCAtIFRoZSB0b29sdGlwLlxuICogQHBhcmFtIHtOdW1iZXJ9IGFyZ3MuZWFzaW5nVmFsdWUgLSBUaGUgY3VycmVudCBhbmltYXRpb24gdmFsdWUsIGJldHdlZW4gMC4wIGFuZCAxLjAuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgZmFsc2VgIHRvIGNhbmNlbCB0aGUgY2hhcnQgdG9vbHRpcCBkcmF3aW5nLlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlclRvb2x0aXBEcmF3XG4gKiBAZGVzYyBDYWxsZWQgYWZ0ZXIgZHJhd2luZyB0aGUgYHRvb2x0aXBgLiBOb3RlIHRoYXQgdGhpcyBob29rIHdpbGwgbm90XG4gKiBiZSBjYWxsZWQgaWYgdGhlIHRvb2x0aXAgZHJhd2luZyBoYXMgYmVlbiBwcmV2aW91c2x5IGNhbmNlbGxlZC5cbiAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBUaGUgY2FsbCBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncy50b29sdGlwIC0gVGhlIHRvb2x0aXAuXG4gKiBAcGFyYW0ge051bWJlcn0gYXJncy5lYXNpbmdWYWx1ZSAtIFRoZSBjdXJyZW50IGFuaW1hdGlvbiB2YWx1ZSwgYmV0d2VlbiAwLjAgYW5kIDEuMC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNiZWZvcmVFdmVudFxuICogQGRlc2MgQ2FsbGVkIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBzcGVjaWZpZWQgYGV2ZW50YC4gSWYgYW55IHBsdWdpbiByZXR1cm5zIGBmYWxzZWAsXG4gKiB0aGUgZXZlbnQgd2lsbCBiZSBkaXNjYXJkZWQuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtJRXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlckV2ZW50XG4gKiBAZGVzYyBDYWxsZWQgYWZ0ZXIgdGhlIGBldmVudGAgaGFzIGJlZW4gY29uc3VtZWQuIE5vdGUgdGhhdCB0aGlzIGhvb2tcbiAqIHdpbGwgbm90IGJlIGNhbGxlZCBpZiB0aGUgYGV2ZW50YCBoYXMgYmVlbiBwcmV2aW91c2x5IGRpc2NhcmRlZC5cbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge0lFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI3Jlc2l6ZVxuICogQGRlc2MgQ2FsbGVkIGFmdGVyIHRoZSBjaGFydCBhcyBiZWVuIHJlc2l6ZWQuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtOdW1iZXJ9IHNpemUgLSBUaGUgbmV3IGNhbnZhcyBkaXNwbGF5IHNpemUgKGVxLiBjYW52YXMuc3R5bGUgd2lkdGggJiBoZWlnaHQpLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI2Rlc3Ryb3lcbiAqIEBkZXNjIENhbGxlZCBhZnRlciB0aGUgY2hhcnQgYXMgYmVlbiBkZXN0cm95ZWQuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKi9cblxufSx7XCIyNlwiOjI2LFwiNDZcIjo0Nn1dLDMzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XG52YXIgRWxlbWVudCA9IHJlcXVpcmUoMjcpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcbnZhciBUaWNrcyA9IHJlcXVpcmUoMzUpO1xuXG5kZWZhdWx0cy5fc2V0KCdzY2FsZScsIHtcblx0ZGlzcGxheTogdHJ1ZSxcblx0cG9zaXRpb246ICdsZWZ0Jyxcblx0b2Zmc2V0OiBmYWxzZSxcblxuXHQvLyBncmlkIGxpbmUgc2V0dGluZ3Ncblx0Z3JpZExpbmVzOiB7XG5cdFx0ZGlzcGxheTogdHJ1ZSxcblx0XHRjb2xvcjogJ3JnYmEoMCwgMCwgMCwgMC4xKScsXG5cdFx0bGluZVdpZHRoOiAxLFxuXHRcdGRyYXdCb3JkZXI6IHRydWUsXG5cdFx0ZHJhd09uQ2hhcnRBcmVhOiB0cnVlLFxuXHRcdGRyYXdUaWNrczogdHJ1ZSxcblx0XHR0aWNrTWFya0xlbmd0aDogMTAsXG5cdFx0emVyb0xpbmVXaWR0aDogMSxcblx0XHR6ZXJvTGluZUNvbG9yOiAncmdiYSgwLDAsMCwwLjI1KScsXG5cdFx0emVyb0xpbmVCb3JkZXJEYXNoOiBbXSxcblx0XHR6ZXJvTGluZUJvcmRlckRhc2hPZmZzZXQ6IDAuMCxcblx0XHRvZmZzZXRHcmlkTGluZXM6IGZhbHNlLFxuXHRcdGJvcmRlckRhc2g6IFtdLFxuXHRcdGJvcmRlckRhc2hPZmZzZXQ6IDAuMFxuXHR9LFxuXG5cdC8vIHNjYWxlIGxhYmVsXG5cdHNjYWxlTGFiZWw6IHtcblx0XHQvLyBkaXNwbGF5IHByb3BlcnR5XG5cdFx0ZGlzcGxheTogZmFsc2UsXG5cblx0XHQvLyBhY3R1YWwgbGFiZWxcblx0XHRsYWJlbFN0cmluZzogJycsXG5cblx0XHQvLyBsaW5lIGhlaWdodFxuXHRcdGxpbmVIZWlnaHQ6IDEuMixcblxuXHRcdC8vIHRvcC9ib3R0b20gcGFkZGluZ1xuXHRcdHBhZGRpbmc6IHtcblx0XHRcdHRvcDogNCxcblx0XHRcdGJvdHRvbTogNFxuXHRcdH1cblx0fSxcblxuXHQvLyBsYWJlbCBzZXR0aW5nc1xuXHR0aWNrczoge1xuXHRcdGJlZ2luQXRaZXJvOiBmYWxzZSxcblx0XHRtaW5Sb3RhdGlvbjogMCxcblx0XHRtYXhSb3RhdGlvbjogNTAsXG5cdFx0bWlycm9yOiBmYWxzZSxcblx0XHRwYWRkaW5nOiAwLFxuXHRcdHJldmVyc2U6IGZhbHNlLFxuXHRcdGRpc3BsYXk6IHRydWUsXG5cdFx0YXV0b1NraXA6IHRydWUsXG5cdFx0YXV0b1NraXBQYWRkaW5nOiAwLFxuXHRcdGxhYmVsT2Zmc2V0OiAwLFxuXHRcdC8vIFdlIHBhc3MgdGhyb3VnaCBhcnJheXMgdG8gYmUgcmVuZGVyZWQgYXMgbXVsdGlsaW5lIGxhYmVscywgd2UgY29udmVydCBPdGhlcnMgdG8gc3RyaW5ncyBoZXJlLlxuXHRcdGNhbGxiYWNrOiBUaWNrcy5mb3JtYXR0ZXJzLnZhbHVlcyxcblx0XHRtaW5vcjoge30sXG5cdFx0bWFqb3I6IHt9XG5cdH1cbn0pO1xuXG5mdW5jdGlvbiBsYWJlbHNGcm9tVGlja3ModGlja3MpIHtcblx0dmFyIGxhYmVscyA9IFtdO1xuXHR2YXIgaSwgaWxlbjtcblxuXHRmb3IgKGkgPSAwLCBpbGVuID0gdGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0bGFiZWxzLnB1c2godGlja3NbaV0ubGFiZWwpO1xuXHR9XG5cblx0cmV0dXJuIGxhYmVscztcbn1cblxuZnVuY3Rpb24gZ2V0TGluZVZhbHVlKHNjYWxlLCBpbmRleCwgb2Zmc2V0R3JpZExpbmVzKSB7XG5cdHZhciBsaW5lVmFsdWUgPSBzY2FsZS5nZXRQaXhlbEZvclRpY2soaW5kZXgpO1xuXG5cdGlmIChvZmZzZXRHcmlkTGluZXMpIHtcblx0XHRpZiAoaW5kZXggPT09IDApIHtcblx0XHRcdGxpbmVWYWx1ZSAtPSAoc2NhbGUuZ2V0UGl4ZWxGb3JUaWNrKDEpIC0gbGluZVZhbHVlKSAvIDI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxpbmVWYWx1ZSAtPSAobGluZVZhbHVlIC0gc2NhbGUuZ2V0UGl4ZWxGb3JUaWNrKGluZGV4IC0gMSkpIC8gMjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGxpbmVWYWx1ZTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVRleHRTaXplKGNvbnRleHQsIHRpY2ssIGZvbnQpIHtcblx0cmV0dXJuIGhlbHBlcnMuaXNBcnJheSh0aWNrKSA/XG5cdFx0aGVscGVycy5sb25nZXN0VGV4dChjb250ZXh0LCBmb250LCB0aWNrKSA6XG5cdFx0Y29udGV4dC5tZWFzdXJlVGV4dCh0aWNrKS53aWR0aDtcbn1cblxuZnVuY3Rpb24gcGFyc2VGb250T3B0aW9ucyhvcHRpb25zKSB7XG5cdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQ7XG5cdHZhciBnbG9iYWxEZWZhdWx0cyA9IGRlZmF1bHRzLmdsb2JhbDtcblx0dmFyIHNpemUgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLmZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpO1xuXHR2YXIgc3R5bGUgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLmZvbnRTdHlsZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTdHlsZSk7XG5cdHZhciBmYW1pbHkgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLmZvbnRGYW1pbHksIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250RmFtaWx5KTtcblxuXHRyZXR1cm4ge1xuXHRcdHNpemU6IHNpemUsXG5cdFx0c3R5bGU6IHN0eWxlLFxuXHRcdGZhbWlseTogZmFtaWx5LFxuXHRcdGZvbnQ6IGhlbHBlcnMuZm9udFN0cmluZyhzaXplLCBzdHlsZSwgZmFtaWx5KVxuXHR9O1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpbmVIZWlnaHQob3B0aW9ucykge1xuXHRyZXR1cm4gaGVscGVycy5vcHRpb25zLnRvTGluZUhlaWdodChcblx0XHRoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KG9wdGlvbnMubGluZUhlaWdodCwgMS4yKSxcblx0XHRoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KG9wdGlvbnMuZm9udFNpemUsIGRlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Rm9udFNpemUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFbGVtZW50LmV4dGVuZCh7XG5cdC8qKlxuXHQgKiBHZXQgdGhlIHBhZGRpbmcgbmVlZGVkIGZvciB0aGUgc2NhbGVcblx0ICogQG1ldGhvZCBnZXRQYWRkaW5nXG5cdCAqIEBwcml2YXRlXG5cdCAqIEByZXR1cm5zIHtQYWRkaW5nfSB0aGUgbmVjZXNzYXJ5IHBhZGRpbmdcblx0ICovXG5cdGdldFBhZGRpbmc6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGxlZnQ6IG1lLnBhZGRpbmdMZWZ0IHx8IDAsXG5cdFx0XHR0b3A6IG1lLnBhZGRpbmdUb3AgfHwgMCxcblx0XHRcdHJpZ2h0OiBtZS5wYWRkaW5nUmlnaHQgfHwgMCxcblx0XHRcdGJvdHRvbTogbWUucGFkZGluZ0JvdHRvbSB8fCAwXG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgc2NhbGUgdGljayBvYmplY3RzICh7bGFiZWwsIG1ham9yfSlcblx0ICogQHNpbmNlIDIuN1xuXHQgKi9cblx0Z2V0VGlja3M6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLl90aWNrcztcblx0fSxcblxuXHQvLyBUaGVzZSBtZXRob2RzIGFyZSBvcmRlcmVkIGJ5IGxpZmVjeWxlLiBVdGlsaXRpZXMgdGhlbiBmb2xsb3cuXG5cdC8vIEFueSBmdW5jdGlvbiBkZWZpbmVkIGhlcmUgaXMgaW5oZXJpdGVkIGJ5IGFsbCBzY2FsZSB0eXBlcy5cblx0Ly8gQW55IGZ1bmN0aW9uIGNhbiBiZSBleHRlbmRlZCBieSB0aGUgc2NhbGUgdHlwZVxuXG5cdG1lcmdlVGlja3NPcHRpb25zOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdGlja3MgPSB0aGlzLm9wdGlvbnMudGlja3M7XG5cdFx0aWYgKHRpY2tzLm1pbm9yID09PSBmYWxzZSkge1xuXHRcdFx0dGlja3MubWlub3IgPSB7XG5cdFx0XHRcdGRpc3BsYXk6IGZhbHNlXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRpZiAodGlja3MubWFqb3IgPT09IGZhbHNlKSB7XG5cdFx0XHR0aWNrcy5tYWpvciA9IHtcblx0XHRcdFx0ZGlzcGxheTogZmFsc2Vcblx0XHRcdH07XG5cdFx0fVxuXHRcdGZvciAodmFyIGtleSBpbiB0aWNrcykge1xuXHRcdFx0aWYgKGtleSAhPT0gJ21ham9yJyAmJiBrZXkgIT09ICdtaW5vcicpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiB0aWNrcy5taW5vcltrZXldID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdHRpY2tzLm1pbm9yW2tleV0gPSB0aWNrc1trZXldO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0eXBlb2YgdGlja3MubWFqb3Jba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHR0aWNrcy5tYWpvcltrZXldID0gdGlja3Nba2V5XTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0YmVmb3JlVXBkYXRlOiBmdW5jdGlvbigpIHtcblx0XHRoZWxwZXJzLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5iZWZvcmVVcGRhdGUsIFt0aGlzXSk7XG5cdH0sXG5cblx0dXBkYXRlOiBmdW5jdGlvbihtYXhXaWR0aCwgbWF4SGVpZ2h0LCBtYXJnaW5zKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgaSwgaWxlbiwgbGFiZWxzLCBsYWJlbCwgdGlja3MsIHRpY2s7XG5cblx0XHQvLyBVcGRhdGUgTGlmZWN5Y2xlIC0gUHJvYmFibHkgZG9uJ3Qgd2FudCB0byBldmVyIGV4dGVuZCBvciBvdmVyd3JpdGUgdGhpcyBmdW5jdGlvbiA7KVxuXHRcdG1lLmJlZm9yZVVwZGF0ZSgpO1xuXG5cdFx0Ly8gQWJzb3JiIHRoZSBtYXN0ZXIgbWVhc3VyZW1lbnRzXG5cdFx0bWUubWF4V2lkdGggPSBtYXhXaWR0aDtcblx0XHRtZS5tYXhIZWlnaHQgPSBtYXhIZWlnaHQ7XG5cdFx0bWUubWFyZ2lucyA9IGhlbHBlcnMuZXh0ZW5kKHtcblx0XHRcdGxlZnQ6IDAsXG5cdFx0XHRyaWdodDogMCxcblx0XHRcdHRvcDogMCxcblx0XHRcdGJvdHRvbTogMFxuXHRcdH0sIG1hcmdpbnMpO1xuXHRcdG1lLmxvbmdlc3RUZXh0Q2FjaGUgPSBtZS5sb25nZXN0VGV4dENhY2hlIHx8IHt9O1xuXG5cdFx0Ly8gRGltZW5zaW9uc1xuXHRcdG1lLmJlZm9yZVNldERpbWVuc2lvbnMoKTtcblx0XHRtZS5zZXREaW1lbnNpb25zKCk7XG5cdFx0bWUuYWZ0ZXJTZXREaW1lbnNpb25zKCk7XG5cblx0XHQvLyBEYXRhIG1pbi9tYXhcblx0XHRtZS5iZWZvcmVEYXRhTGltaXRzKCk7XG5cdFx0bWUuZGV0ZXJtaW5lRGF0YUxpbWl0cygpO1xuXHRcdG1lLmFmdGVyRGF0YUxpbWl0cygpO1xuXG5cdFx0Ly8gVGlja3MgLSBgdGhpcy50aWNrc2AgaXMgbm93IERFUFJFQ0FURUQhXG5cdFx0Ly8gSW50ZXJuYWwgdGlja3MgYXJlIG5vdyBzdG9yZWQgYXMgb2JqZWN0cyBpbiB0aGUgUFJJVkFURSBgdGhpcy5fdGlja3NgIG1lbWJlclxuXHRcdC8vIGFuZCBtdXN0IG5vdCBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIG91dHNpZGUgdGhpcyBjbGFzcy4gYHRoaXMudGlja3NgIGJlaW5nXG5cdFx0Ly8gYXJvdW5kIGZvciBsb25nIHRpbWUgYW5kIG5vdCBtYXJrZWQgYXMgcHJpdmF0ZSwgd2UgY2FuJ3QgY2hhbmdlIGl0cyBzdHJ1Y3R1cmVcblx0XHQvLyB3aXRob3V0IHVuZXhwZWN0ZWQgYnJlYWtpbmcgY2hhbmdlcy4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzY2FsZSB0aWNrcyxcblx0XHQvLyB1c2Ugc2NhbGUuZ2V0VGlja3MoKSBpbnN0ZWFkLlxuXG5cdFx0bWUuYmVmb3JlQnVpbGRUaWNrcygpO1xuXG5cdFx0Ly8gTmV3IGltcGxlbWVudGF0aW9ucyBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIG9iamVjdHMgYnV0IGZvciBCQUNLV0FSRCBDT01QQVQsXG5cdFx0Ly8gd2Ugc3RpbGwgc3VwcG9ydCBubyByZXR1cm4gKGB0aGlzLnRpY2tzYCBpbnRlcm5hbGx5IHNldCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kKS5cblx0XHR0aWNrcyA9IG1lLmJ1aWxkVGlja3MoKSB8fCBbXTtcblxuXHRcdG1lLmFmdGVyQnVpbGRUaWNrcygpO1xuXG5cdFx0bWUuYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uKCk7XG5cblx0XHQvLyBOZXcgaW1wbGVtZW50YXRpb25zIHNob3VsZCByZXR1cm4gdGhlIGZvcm1hdHRlZCB0aWNrIGxhYmVscyBidXQgZm9yIEJBQ0tXQVJEXG5cdFx0Ly8gQ09NUEFULCB3ZSBzdGlsbCBzdXBwb3J0IG5vIHJldHVybiAoYHRoaXMudGlja3NgIGludGVybmFsbHkgY2hhbmdlZCBieSBjYWxsaW5nXG5cdFx0Ly8gdGhpcyBtZXRob2QgYW5kIHN1cHBvc2VkIHRvIGNvbnRhaW4gb25seSBzdHJpbmcgdmFsdWVzKS5cblx0XHRsYWJlbHMgPSBtZS5jb252ZXJ0VGlja3NUb0xhYmVscyh0aWNrcykgfHwgbWUudGlja3M7XG5cblx0XHRtZS5hZnRlclRpY2tUb0xhYmVsQ29udmVyc2lvbigpO1xuXG5cdFx0bWUudGlja3MgPSBsYWJlbHM7ICAgLy8gQkFDS1dBUkQgQ09NUEFUSUJJTElUWVxuXG5cdFx0Ly8gSU1QT1JUQU5UOiBmcm9tIHRoaXMgcG9pbnQsIHdlIGNvbnNpZGVyIHRoYXQgYHRoaXMudGlja3NgIHdpbGwgTkVWRVIgY2hhbmdlIVxuXG5cdFx0Ly8gQkFDS1dBUkQgQ09NUEFUOiBzeW5jaHJvbml6ZSBgX3RpY2tzYCB3aXRoIGxhYmVscyAoc28gcG90ZW50aWFsbHkgYHRoaXMudGlja3NgKVxuXHRcdGZvciAoaSA9IDAsIGlsZW4gPSBsYWJlbHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRsYWJlbCA9IGxhYmVsc1tpXTtcblx0XHRcdHRpY2sgPSB0aWNrc1tpXTtcblx0XHRcdGlmICghdGljaykge1xuXHRcdFx0XHR0aWNrcy5wdXNoKHRpY2sgPSB7XG5cdFx0XHRcdFx0bGFiZWw6IGxhYmVsLFxuXHRcdFx0XHRcdG1ham9yOiBmYWxzZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRpY2subGFiZWwgPSBsYWJlbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtZS5fdGlja3MgPSB0aWNrcztcblxuXHRcdC8vIFRpY2sgUm90YXRpb25cblx0XHRtZS5iZWZvcmVDYWxjdWxhdGVUaWNrUm90YXRpb24oKTtcblx0XHRtZS5jYWxjdWxhdGVUaWNrUm90YXRpb24oKTtcblx0XHRtZS5hZnRlckNhbGN1bGF0ZVRpY2tSb3RhdGlvbigpO1xuXHRcdC8vIEZpdFxuXHRcdG1lLmJlZm9yZUZpdCgpO1xuXHRcdG1lLmZpdCgpO1xuXHRcdG1lLmFmdGVyRml0KCk7XG5cdFx0Ly9cblx0XHRtZS5hZnRlclVwZGF0ZSgpO1xuXG5cdFx0cmV0dXJuIG1lLm1pblNpemU7XG5cblx0fSxcblx0YWZ0ZXJVcGRhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmFmdGVyVXBkYXRlLCBbdGhpc10pO1xuXHR9LFxuXG5cdC8vXG5cblx0YmVmb3JlU2V0RGltZW5zaW9uczogZnVuY3Rpb24oKSB7XG5cdFx0aGVscGVycy5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYmVmb3JlU2V0RGltZW5zaW9ucywgW3RoaXNdKTtcblx0fSxcblx0c2V0RGltZW5zaW9uczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHQvLyBTZXQgdGhlIHVuY29uc3RyYWluZWQgZGltZW5zaW9uIGJlZm9yZSBsYWJlbCByb3RhdGlvblxuXHRcdGlmIChtZS5pc0hvcml6b250YWwoKSkge1xuXHRcdFx0Ly8gUmVzZXQgcG9zaXRpb24gYmVmb3JlIGNhbGN1bGF0aW5nIHJvdGF0aW9uXG5cdFx0XHRtZS53aWR0aCA9IG1lLm1heFdpZHRoO1xuXHRcdFx0bWUubGVmdCA9IDA7XG5cdFx0XHRtZS5yaWdodCA9IG1lLndpZHRoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZS5oZWlnaHQgPSBtZS5tYXhIZWlnaHQ7XG5cblx0XHRcdC8vIFJlc2V0IHBvc2l0aW9uIGJlZm9yZSBjYWxjdWxhdGluZyByb3RhdGlvblxuXHRcdFx0bWUudG9wID0gMDtcblx0XHRcdG1lLmJvdHRvbSA9IG1lLmhlaWdodDtcblx0XHR9XG5cblx0XHQvLyBSZXNldCBwYWRkaW5nXG5cdFx0bWUucGFkZGluZ0xlZnQgPSAwO1xuXHRcdG1lLnBhZGRpbmdUb3AgPSAwO1xuXHRcdG1lLnBhZGRpbmdSaWdodCA9IDA7XG5cdFx0bWUucGFkZGluZ0JvdHRvbSA9IDA7XG5cdH0sXG5cdGFmdGVyU2V0RGltZW5zaW9uczogZnVuY3Rpb24oKSB7XG5cdFx0aGVscGVycy5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJTZXREaW1lbnNpb25zLCBbdGhpc10pO1xuXHR9LFxuXG5cdC8vIERhdGEgbGltaXRzXG5cdGJlZm9yZURhdGFMaW1pdHM6IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmJlZm9yZURhdGFMaW1pdHMsIFt0aGlzXSk7XG5cdH0sXG5cdGRldGVybWluZURhdGFMaW1pdHM6IGhlbHBlcnMubm9vcCxcblx0YWZ0ZXJEYXRhTGltaXRzOiBmdW5jdGlvbigpIHtcblx0XHRoZWxwZXJzLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5hZnRlckRhdGFMaW1pdHMsIFt0aGlzXSk7XG5cdH0sXG5cblx0Ly9cblx0YmVmb3JlQnVpbGRUaWNrczogZnVuY3Rpb24oKSB7XG5cdFx0aGVscGVycy5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYmVmb3JlQnVpbGRUaWNrcywgW3RoaXNdKTtcblx0fSxcblx0YnVpbGRUaWNrczogaGVscGVycy5ub29wLFxuXHRhZnRlckJ1aWxkVGlja3M6IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmFmdGVyQnVpbGRUaWNrcywgW3RoaXNdKTtcblx0fSxcblxuXHRiZWZvcmVUaWNrVG9MYWJlbENvbnZlcnNpb246IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmJlZm9yZVRpY2tUb0xhYmVsQ29udmVyc2lvbiwgW3RoaXNdKTtcblx0fSxcblx0Y29udmVydFRpY2tzVG9MYWJlbHM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0Ly8gQ29udmVydCB0aWNrcyB0byBzdHJpbmdzXG5cdFx0dmFyIHRpY2tPcHRzID0gbWUub3B0aW9ucy50aWNrcztcblx0XHRtZS50aWNrcyA9IG1lLnRpY2tzLm1hcCh0aWNrT3B0cy51c2VyQ2FsbGJhY2sgfHwgdGlja09wdHMuY2FsbGJhY2ssIHRoaXMpO1xuXHR9LFxuXHRhZnRlclRpY2tUb0xhYmVsQ29udmVyc2lvbjogZnVuY3Rpb24oKSB7XG5cdFx0aGVscGVycy5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb24sIFt0aGlzXSk7XG5cdH0sXG5cblx0Ly9cblxuXHRiZWZvcmVDYWxjdWxhdGVUaWNrUm90YXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmJlZm9yZUNhbGN1bGF0ZVRpY2tSb3RhdGlvbiwgW3RoaXNdKTtcblx0fSxcblx0Y2FsY3VsYXRlVGlja1JvdGF0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjb250ZXh0ID0gbWUuY3R4O1xuXHRcdHZhciB0aWNrT3B0cyA9IG1lLm9wdGlvbnMudGlja3M7XG5cdFx0dmFyIGxhYmVscyA9IGxhYmVsc0Zyb21UaWNrcyhtZS5fdGlja3MpO1xuXG5cdFx0Ly8gR2V0IHRoZSB3aWR0aCBvZiBlYWNoIGdyaWQgYnkgY2FsY3VsYXRpbmcgdGhlIGRpZmZlcmVuY2Vcblx0XHQvLyBiZXR3ZWVuIHggb2Zmc2V0cyBiZXR3ZWVuIDAgYW5kIDEuXG5cdFx0dmFyIHRpY2tGb250ID0gcGFyc2VGb250T3B0aW9ucyh0aWNrT3B0cyk7XG5cdFx0Y29udGV4dC5mb250ID0gdGlja0ZvbnQuZm9udDtcblxuXHRcdHZhciBsYWJlbFJvdGF0aW9uID0gdGlja09wdHMubWluUm90YXRpb24gfHwgMDtcblxuXHRcdGlmIChsYWJlbHMubGVuZ3RoICYmIG1lLm9wdGlvbnMuZGlzcGxheSAmJiBtZS5pc0hvcml6b250YWwoKSkge1xuXHRcdFx0dmFyIG9yaWdpbmFsTGFiZWxXaWR0aCA9IGhlbHBlcnMubG9uZ2VzdFRleHQoY29udGV4dCwgdGlja0ZvbnQuZm9udCwgbGFiZWxzLCBtZS5sb25nZXN0VGV4dENhY2hlKTtcblx0XHRcdHZhciBsYWJlbFdpZHRoID0gb3JpZ2luYWxMYWJlbFdpZHRoO1xuXHRcdFx0dmFyIGNvc1JvdGF0aW9uLCBzaW5Sb3RhdGlvbjtcblxuXHRcdFx0Ly8gQWxsb3cgMyBwaXhlbHMgeDIgcGFkZGluZyBlaXRoZXIgc2lkZSBmb3IgbGFiZWwgcmVhZGFiaWxpdHlcblx0XHRcdHZhciB0aWNrV2lkdGggPSBtZS5nZXRQaXhlbEZvclRpY2soMSkgLSBtZS5nZXRQaXhlbEZvclRpY2soMCkgLSA2O1xuXG5cdFx0XHQvLyBNYXggbGFiZWwgcm90YXRpb24gY2FuIGJlIHNldCBvciBkZWZhdWx0IHRvIDkwIC0gYWxzbyBhY3QgYXMgYSBsb29wIGNvdW50ZXJcblx0XHRcdHdoaWxlIChsYWJlbFdpZHRoID4gdGlja1dpZHRoICYmIGxhYmVsUm90YXRpb24gPCB0aWNrT3B0cy5tYXhSb3RhdGlvbikge1xuXHRcdFx0XHR2YXIgYW5nbGVSYWRpYW5zID0gaGVscGVycy50b1JhZGlhbnMobGFiZWxSb3RhdGlvbik7XG5cdFx0XHRcdGNvc1JvdGF0aW9uID0gTWF0aC5jb3MoYW5nbGVSYWRpYW5zKTtcblx0XHRcdFx0c2luUm90YXRpb24gPSBNYXRoLnNpbihhbmdsZVJhZGlhbnMpO1xuXG5cdFx0XHRcdGlmIChzaW5Sb3RhdGlvbiAqIG9yaWdpbmFsTGFiZWxXaWR0aCA+IG1lLm1heEhlaWdodCkge1xuXHRcdFx0XHRcdC8vIGdvIGJhY2sgb25lIHN0ZXBcblx0XHRcdFx0XHRsYWJlbFJvdGF0aW9uLS07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsYWJlbFJvdGF0aW9uKys7XG5cdFx0XHRcdGxhYmVsV2lkdGggPSBjb3NSb3RhdGlvbiAqIG9yaWdpbmFsTGFiZWxXaWR0aDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtZS5sYWJlbFJvdGF0aW9uID0gbGFiZWxSb3RhdGlvbjtcblx0fSxcblx0YWZ0ZXJDYWxjdWxhdGVUaWNrUm90YXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmFmdGVyQ2FsY3VsYXRlVGlja1JvdGF0aW9uLCBbdGhpc10pO1xuXHR9LFxuXG5cdC8vXG5cblx0YmVmb3JlRml0OiBmdW5jdGlvbigpIHtcblx0XHRoZWxwZXJzLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5iZWZvcmVGaXQsIFt0aGlzXSk7XG5cdH0sXG5cdGZpdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHQvLyBSZXNldFxuXHRcdHZhciBtaW5TaXplID0gbWUubWluU2l6ZSA9IHtcblx0XHRcdHdpZHRoOiAwLFxuXHRcdFx0aGVpZ2h0OiAwXG5cdFx0fTtcblxuXHRcdHZhciBsYWJlbHMgPSBsYWJlbHNGcm9tVGlja3MobWUuX3RpY2tzKTtcblxuXHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcblx0XHR2YXIgdGlja09wdHMgPSBvcHRzLnRpY2tzO1xuXHRcdHZhciBzY2FsZUxhYmVsT3B0cyA9IG9wdHMuc2NhbGVMYWJlbDtcblx0XHR2YXIgZ3JpZExpbmVPcHRzID0gb3B0cy5ncmlkTGluZXM7XG5cdFx0dmFyIGRpc3BsYXkgPSBvcHRzLmRpc3BsYXk7XG5cdFx0dmFyIGlzSG9yaXpvbnRhbCA9IG1lLmlzSG9yaXpvbnRhbCgpO1xuXG5cdFx0dmFyIHRpY2tGb250ID0gcGFyc2VGb250T3B0aW9ucyh0aWNrT3B0cyk7XG5cdFx0dmFyIHRpY2tNYXJrTGVuZ3RoID0gb3B0cy5ncmlkTGluZXMudGlja01hcmtMZW5ndGg7XG5cblx0XHQvLyBXaWR0aFxuXHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdC8vIHN1YnRyYWN0IHRoZSBtYXJnaW5zIHRvIGxpbmUgdXAgd2l0aCB0aGUgY2hhcnRBcmVhIGlmIHdlIGFyZSBhIGZ1bGwgd2lkdGggc2NhbGVcblx0XHRcdG1pblNpemUud2lkdGggPSBtZS5pc0Z1bGxXaWR0aCgpID8gbWUubWF4V2lkdGggLSBtZS5tYXJnaW5zLmxlZnQgLSBtZS5tYXJnaW5zLnJpZ2h0IDogbWUubWF4V2lkdGg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1pblNpemUud2lkdGggPSBkaXNwbGF5ICYmIGdyaWRMaW5lT3B0cy5kcmF3VGlja3MgPyB0aWNrTWFya0xlbmd0aCA6IDA7XG5cdFx0fVxuXG5cdFx0Ly8gaGVpZ2h0XG5cdFx0aWYgKGlzSG9yaXpvbnRhbCkge1xuXHRcdFx0bWluU2l6ZS5oZWlnaHQgPSBkaXNwbGF5ICYmIGdyaWRMaW5lT3B0cy5kcmF3VGlja3MgPyB0aWNrTWFya0xlbmd0aCA6IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1pblNpemUuaGVpZ2h0ID0gbWUubWF4SGVpZ2h0OyAvLyBmaWxsIGFsbCB0aGUgaGVpZ2h0XG5cdFx0fVxuXG5cdFx0Ly8gQXJlIHdlIHNob3dpbmcgYSB0aXRsZSBmb3IgdGhlIHNjYWxlP1xuXHRcdGlmIChzY2FsZUxhYmVsT3B0cy5kaXNwbGF5ICYmIGRpc3BsYXkpIHtcblx0XHRcdHZhciBzY2FsZUxhYmVsTGluZUhlaWdodCA9IHBhcnNlTGluZUhlaWdodChzY2FsZUxhYmVsT3B0cyk7XG5cdFx0XHR2YXIgc2NhbGVMYWJlbFBhZGRpbmcgPSBoZWxwZXJzLm9wdGlvbnMudG9QYWRkaW5nKHNjYWxlTGFiZWxPcHRzLnBhZGRpbmcpO1xuXHRcdFx0dmFyIGRlbHRhSGVpZ2h0ID0gc2NhbGVMYWJlbExpbmVIZWlnaHQgKyBzY2FsZUxhYmVsUGFkZGluZy5oZWlnaHQ7XG5cblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdFx0bWluU2l6ZS5oZWlnaHQgKz0gZGVsdGFIZWlnaHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtaW5TaXplLndpZHRoICs9IGRlbHRhSGVpZ2h0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIERvbid0IGJvdGhlciBmaXR0aW5nIHRoZSB0aWNrcyBpZiB3ZSBhcmUgbm90IHNob3dpbmcgdGhlbVxuXHRcdGlmICh0aWNrT3B0cy5kaXNwbGF5ICYmIGRpc3BsYXkpIHtcblx0XHRcdHZhciBsYXJnZXN0VGV4dFdpZHRoID0gaGVscGVycy5sb25nZXN0VGV4dChtZS5jdHgsIHRpY2tGb250LmZvbnQsIGxhYmVscywgbWUubG9uZ2VzdFRleHRDYWNoZSk7XG5cdFx0XHR2YXIgdGFsbGVzdExhYmVsSGVpZ2h0SW5MaW5lcyA9IGhlbHBlcnMubnVtYmVyT2ZMYWJlbExpbmVzKGxhYmVscyk7XG5cdFx0XHR2YXIgbGluZVNwYWNlID0gdGlja0ZvbnQuc2l6ZSAqIDAuNTtcblx0XHRcdHZhciB0aWNrUGFkZGluZyA9IG1lLm9wdGlvbnMudGlja3MucGFkZGluZztcblxuXHRcdFx0aWYgKGlzSG9yaXpvbnRhbCkge1xuXHRcdFx0XHQvLyBBIGhvcml6b250YWwgYXhpcyBpcyBtb3JlIGNvbnN0cmFpbmVkIGJ5IHRoZSBoZWlnaHQuXG5cdFx0XHRcdG1lLmxvbmdlc3RMYWJlbFdpZHRoID0gbGFyZ2VzdFRleHRXaWR0aDtcblxuXHRcdFx0XHR2YXIgYW5nbGVSYWRpYW5zID0gaGVscGVycy50b1JhZGlhbnMobWUubGFiZWxSb3RhdGlvbik7XG5cdFx0XHRcdHZhciBjb3NSb3RhdGlvbiA9IE1hdGguY29zKGFuZ2xlUmFkaWFucyk7XG5cdFx0XHRcdHZhciBzaW5Sb3RhdGlvbiA9IE1hdGguc2luKGFuZ2xlUmFkaWFucyk7XG5cblx0XHRcdFx0Ly8gVE9ETyAtIGltcHJvdmUgdGhpcyBjYWxjdWxhdGlvblxuXHRcdFx0XHR2YXIgbGFiZWxIZWlnaHQgPSAoc2luUm90YXRpb24gKiBsYXJnZXN0VGV4dFdpZHRoKVxuXHRcdFx0XHRcdCsgKHRpY2tGb250LnNpemUgKiB0YWxsZXN0TGFiZWxIZWlnaHRJbkxpbmVzKVxuXHRcdFx0XHRcdCsgKGxpbmVTcGFjZSAqICh0YWxsZXN0TGFiZWxIZWlnaHRJbkxpbmVzIC0gMSkpXG5cdFx0XHRcdFx0KyBsaW5lU3BhY2U7IC8vIHBhZGRpbmdcblxuXHRcdFx0XHRtaW5TaXplLmhlaWdodCA9IE1hdGgubWluKG1lLm1heEhlaWdodCwgbWluU2l6ZS5oZWlnaHQgKyBsYWJlbEhlaWdodCArIHRpY2tQYWRkaW5nKTtcblxuXHRcdFx0XHRtZS5jdHguZm9udCA9IHRpY2tGb250LmZvbnQ7XG5cdFx0XHRcdHZhciBmaXJzdExhYmVsV2lkdGggPSBjb21wdXRlVGV4dFNpemUobWUuY3R4LCBsYWJlbHNbMF0sIHRpY2tGb250LmZvbnQpO1xuXHRcdFx0XHR2YXIgbGFzdExhYmVsV2lkdGggPSBjb21wdXRlVGV4dFNpemUobWUuY3R4LCBsYWJlbHNbbGFiZWxzLmxlbmd0aCAtIDFdLCB0aWNrRm9udC5mb250KTtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhhdCBvdXIgdGlja3MgYXJlIGFsd2F5cyBpbnNpZGUgdGhlIGNhbnZhcy4gV2hlbiByb3RhdGVkLCB0aWNrcyBhcmUgcmlnaHQgYWxpZ25lZFxuXHRcdFx0XHQvLyB3aGljaCBtZWFucyB0aGF0IHRoZSByaWdodCBwYWRkaW5nIGlzIGRvbWluYXRlZCBieSB0aGUgZm9udCBoZWlnaHRcblx0XHRcdFx0aWYgKG1lLmxhYmVsUm90YXRpb24gIT09IDApIHtcblx0XHRcdFx0XHRtZS5wYWRkaW5nTGVmdCA9IG9wdHMucG9zaXRpb24gPT09ICdib3R0b20nID8gKGNvc1JvdGF0aW9uICogZmlyc3RMYWJlbFdpZHRoKSArIDMgOiAoY29zUm90YXRpb24gKiBsaW5lU3BhY2UpICsgMzsgLy8gYWRkIDMgcHggdG8gbW92ZSBhd2F5IGZyb20gY2FudmFzIGVkZ2VzXG5cdFx0XHRcdFx0bWUucGFkZGluZ1JpZ2h0ID0gb3B0cy5wb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyAoY29zUm90YXRpb24gKiBsaW5lU3BhY2UpICsgMyA6IChjb3NSb3RhdGlvbiAqIGxhc3RMYWJlbFdpZHRoKSArIDM7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bWUucGFkZGluZ0xlZnQgPSBmaXJzdExhYmVsV2lkdGggLyAyICsgMzsgLy8gYWRkIDMgcHggdG8gbW92ZSBhd2F5IGZyb20gY2FudmFzIGVkZ2VzXG5cdFx0XHRcdFx0bWUucGFkZGluZ1JpZ2h0ID0gbGFzdExhYmVsV2lkdGggLyAyICsgMztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gQSB2ZXJ0aWNhbCBheGlzIGlzIG1vcmUgY29uc3RyYWluZWQgYnkgdGhlIHdpZHRoLiBMYWJlbHMgYXJlIHRoZVxuXHRcdFx0XHQvLyBkb21pbmFudCBmYWN0b3IgaGVyZSwgc28gZ2V0IHRoYXQgbGVuZ3RoIGZpcnN0IGFuZCBhY2NvdW50IGZvciBwYWRkaW5nXG5cdFx0XHRcdGlmICh0aWNrT3B0cy5taXJyb3IpIHtcblx0XHRcdFx0XHRsYXJnZXN0VGV4dFdpZHRoID0gMDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB1c2UgbGluZVNwYWNlIGZvciBjb25zaXN0ZW5jeSB3aXRoIGhvcml6b250YWwgYXhpc1xuXHRcdFx0XHRcdC8vIHRpY2tQYWRkaW5nIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgaG9yaXpvbnRhbFxuXHRcdFx0XHRcdGxhcmdlc3RUZXh0V2lkdGggKz0gdGlja1BhZGRpbmcgKyBsaW5lU3BhY2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRtaW5TaXplLndpZHRoID0gTWF0aC5taW4obWUubWF4V2lkdGgsIG1pblNpemUud2lkdGggKyBsYXJnZXN0VGV4dFdpZHRoKTtcblxuXHRcdFx0XHRtZS5wYWRkaW5nVG9wID0gdGlja0ZvbnQuc2l6ZSAvIDI7XG5cdFx0XHRcdG1lLnBhZGRpbmdCb3R0b20gPSB0aWNrRm9udC5zaXplIC8gMjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtZS5oYW5kbGVNYXJnaW5zKCk7XG5cblx0XHRtZS53aWR0aCA9IG1pblNpemUud2lkdGg7XG5cdFx0bWUuaGVpZ2h0ID0gbWluU2l6ZS5oZWlnaHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEhhbmRsZSBtYXJnaW5zIGFuZCBwYWRkaW5nIGludGVyYWN0aW9uc1xuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0aGFuZGxlTWFyZ2luczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHRpZiAobWUubWFyZ2lucykge1xuXHRcdFx0bWUucGFkZGluZ0xlZnQgPSBNYXRoLm1heChtZS5wYWRkaW5nTGVmdCAtIG1lLm1hcmdpbnMubGVmdCwgMCk7XG5cdFx0XHRtZS5wYWRkaW5nVG9wID0gTWF0aC5tYXgobWUucGFkZGluZ1RvcCAtIG1lLm1hcmdpbnMudG9wLCAwKTtcblx0XHRcdG1lLnBhZGRpbmdSaWdodCA9IE1hdGgubWF4KG1lLnBhZGRpbmdSaWdodCAtIG1lLm1hcmdpbnMucmlnaHQsIDApO1xuXHRcdFx0bWUucGFkZGluZ0JvdHRvbSA9IE1hdGgubWF4KG1lLnBhZGRpbmdCb3R0b20gLSBtZS5tYXJnaW5zLmJvdHRvbSwgMCk7XG5cdFx0fVxuXHR9LFxuXG5cdGFmdGVyRml0OiBmdW5jdGlvbigpIHtcblx0XHRoZWxwZXJzLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5hZnRlckZpdCwgW3RoaXNdKTtcblx0fSxcblxuXHQvLyBTaGFyZWQgTWV0aG9kc1xuXHRpc0hvcml6b250YWw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm9wdGlvbnMucG9zaXRpb24gPT09ICd0b3AnIHx8IHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9PT0gJ2JvdHRvbSc7XG5cdH0sXG5cdGlzRnVsbFdpZHRoOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gKHRoaXMub3B0aW9ucy5mdWxsV2lkdGgpO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgY29ycmVjdCB2YWx1ZS4gTmFOIGJhZCBpbnB1dHMsIElmIHRoZSB2YWx1ZSB0eXBlIGlzIG9iamVjdCBnZXQgdGhlIHggb3IgeSBiYXNlZCBvbiB3aGV0aGVyIHdlIGFyZSBob3Jpem9udGFsIG9yIG5vdFxuXHRnZXRSaWdodFZhbHVlOiBmdW5jdGlvbihyYXdWYWx1ZSkge1xuXHRcdC8vIE51bGwgYW5kIHVuZGVmaW5lZCB2YWx1ZXMgZmlyc3Rcblx0XHRpZiAoaGVscGVycy5pc051bGxPclVuZGVmKHJhd1ZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIE5hTjtcblx0XHR9XG5cdFx0Ly8gaXNOYU4ob2JqZWN0KSByZXR1cm5zIHRydWUsIHNvIG1ha2Ugc3VyZSBOYU4gaXMgY2hlY2tpbmcgZm9yIGEgbnVtYmVyOyBEaXNjYXJkIEluZmluaXRlIHZhbHVlc1xuXHRcdGlmICh0eXBlb2YgcmF3VmFsdWUgPT09ICdudW1iZXInICYmICFpc0Zpbml0ZShyYXdWYWx1ZSkpIHtcblx0XHRcdHJldHVybiBOYU47XG5cdFx0fVxuXHRcdC8vIElmIGl0IGlzIGluIGZhY3QgYW4gb2JqZWN0LCBkaXZlIGluIG9uZSBtb3JlIGxldmVsXG5cdFx0aWYgKHJhd1ZhbHVlKSB7XG5cdFx0XHRpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuXHRcdFx0XHRpZiAocmF3VmFsdWUueCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0UmlnaHRWYWx1ZShyYXdWYWx1ZS54KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChyYXdWYWx1ZS55ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0UmlnaHRWYWx1ZShyYXdWYWx1ZS55KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBWYWx1ZSBpcyBnb29kLCByZXR1cm4gaXRcblx0XHRyZXR1cm4gcmF3VmFsdWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVzZWQgdG8gZ2V0IHRoZSB2YWx1ZSB0byBkaXNwbGF5IGluIHRoZSB0b29sdGlwIGZvciB0aGUgZGF0YSBhdCB0aGUgZ2l2ZW4gaW5kZXhcblx0ICogQHBhcmFtIGluZGV4XG5cdCAqIEBwYXJhbSBkYXRhc2V0SW5kZXhcblx0ICovXG5cdGdldExhYmVsRm9ySW5kZXg6IGhlbHBlcnMubm9vcCxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGdpdmVuIGRhdGEgcG9pbnQuIFZhbHVlIGNhbiBlaXRoZXIgYmUgYW4gaW5kZXggb3IgYSBudW1lcmljYWwgdmFsdWVcblx0ICogVGhlIGNvb3JkaW5hdGUgKDAsIDApIGlzIGF0IHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgY2FudmFzXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKiBAcGFyYW0gaW5kZXhcblx0ICogQHBhcmFtIGRhdGFzZXRJbmRleFxuXHQgKi9cblx0Z2V0UGl4ZWxGb3JWYWx1ZTogaGVscGVycy5ub29wLFxuXG5cdC8qKlxuXHQgKiBVc2VkIHRvIGdldCB0aGUgZGF0YSB2YWx1ZSBmcm9tIGEgZ2l2ZW4gcGl4ZWwuIFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgZ2V0UGl4ZWxGb3JWYWx1ZVxuXHQgKiBUaGUgY29vcmRpbmF0ZSAoMCwgMCkgaXMgYXQgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBjYW52YXNcblx0ICogQHBhcmFtIHBpeGVsXG5cdCAqL1xuXHRnZXRWYWx1ZUZvclBpeGVsOiBoZWxwZXJzLm5vb3AsXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSB0aWNrIGF0IHRoZSBnaXZlbiBpbmRleFxuXHQgKiBUaGUgY29vcmRpbmF0ZSAoMCwgMCkgaXMgYXQgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBjYW52YXNcblx0ICovXG5cdGdldFBpeGVsRm9yVGljazogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvZmZzZXQgPSBtZS5vcHRpb25zLm9mZnNldDtcblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdHZhciBpbm5lcldpZHRoID0gbWUud2lkdGggLSAobWUucGFkZGluZ0xlZnQgKyBtZS5wYWRkaW5nUmlnaHQpO1xuXHRcdFx0dmFyIHRpY2tXaWR0aCA9IGlubmVyV2lkdGggLyBNYXRoLm1heCgobWUuX3RpY2tzLmxlbmd0aCAtIChvZmZzZXQgPyAwIDogMSkpLCAxKTtcblx0XHRcdHZhciBwaXhlbCA9ICh0aWNrV2lkdGggKiBpbmRleCkgKyBtZS5wYWRkaW5nTGVmdDtcblxuXHRcdFx0aWYgKG9mZnNldCkge1xuXHRcdFx0XHRwaXhlbCArPSB0aWNrV2lkdGggLyAyO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZmluYWxWYWwgPSBtZS5sZWZ0ICsgTWF0aC5yb3VuZChwaXhlbCk7XG5cdFx0XHRmaW5hbFZhbCArPSBtZS5pc0Z1bGxXaWR0aCgpID8gbWUubWFyZ2lucy5sZWZ0IDogMDtcblx0XHRcdHJldHVybiBmaW5hbFZhbDtcblx0XHR9XG5cdFx0dmFyIGlubmVySGVpZ2h0ID0gbWUuaGVpZ2h0IC0gKG1lLnBhZGRpbmdUb3AgKyBtZS5wYWRkaW5nQm90dG9tKTtcblx0XHRyZXR1cm4gbWUudG9wICsgKGluZGV4ICogKGlubmVySGVpZ2h0IC8gKG1lLl90aWNrcy5sZW5ndGggLSAxKSkpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVdGlsaXR5IGZvciBnZXR0aW5nIHRoZSBwaXhlbCBsb2NhdGlvbiBvZiBhIHBlcmNlbnRhZ2Ugb2Ygc2NhbGVcblx0ICogVGhlIGNvb3JkaW5hdGUgKDAsIDApIGlzIGF0IHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgY2FudmFzXG5cdCAqL1xuXHRnZXRQaXhlbEZvckRlY2ltYWw6IGZ1bmN0aW9uKGRlY2ltYWwpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdGlmIChtZS5pc0hvcml6b250YWwoKSkge1xuXHRcdFx0dmFyIGlubmVyV2lkdGggPSBtZS53aWR0aCAtIChtZS5wYWRkaW5nTGVmdCArIG1lLnBhZGRpbmdSaWdodCk7XG5cdFx0XHR2YXIgdmFsdWVPZmZzZXQgPSAoaW5uZXJXaWR0aCAqIGRlY2ltYWwpICsgbWUucGFkZGluZ0xlZnQ7XG5cblx0XHRcdHZhciBmaW5hbFZhbCA9IG1lLmxlZnQgKyBNYXRoLnJvdW5kKHZhbHVlT2Zmc2V0KTtcblx0XHRcdGZpbmFsVmFsICs9IG1lLmlzRnVsbFdpZHRoKCkgPyBtZS5tYXJnaW5zLmxlZnQgOiAwO1xuXHRcdFx0cmV0dXJuIGZpbmFsVmFsO1xuXHRcdH1cblx0XHRyZXR1cm4gbWUudG9wICsgKGRlY2ltYWwgKiBtZS5oZWlnaHQpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBwaXhlbCBmb3IgdGhlIG1pbmltdW0gY2hhcnQgdmFsdWVcblx0ICogVGhlIGNvb3JkaW5hdGUgKDAsIDApIGlzIGF0IHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgY2FudmFzXG5cdCAqL1xuXHRnZXRCYXNlUGl4ZWw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFBpeGVsRm9yVmFsdWUodGhpcy5nZXRCYXNlVmFsdWUoKSk7XG5cdH0sXG5cblx0Z2V0QmFzZVZhbHVlOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBtaW4gPSBtZS5taW47XG5cdFx0dmFyIG1heCA9IG1lLm1heDtcblxuXHRcdHJldHVybiBtZS5iZWdpbkF0WmVybyA/IDAgOlxuXHRcdFx0bWluIDwgMCAmJiBtYXggPCAwID8gbWF4IDpcblx0XHRcdG1pbiA+IDAgJiYgbWF4ID4gMCA/IG1pbiA6XG5cdFx0XHQwO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgc3Vic2V0IG9mIHRpY2tzIHRvIGJlIHBsb3R0ZWQgdG8gYXZvaWQgb3ZlcmxhcHBpbmcgbGFiZWxzLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2F1dG9Ta2lwOiBmdW5jdGlvbih0aWNrcykge1xuXHRcdHZhciBza2lwUmF0aW87XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgaXNIb3Jpem9udGFsID0gbWUuaXNIb3Jpem9udGFsKCk7XG5cdFx0dmFyIG9wdGlvblRpY2tzID0gbWUub3B0aW9ucy50aWNrcy5taW5vcjtcblx0XHR2YXIgdGlja0NvdW50ID0gdGlja3MubGVuZ3RoO1xuXHRcdHZhciBsYWJlbFJvdGF0aW9uUmFkaWFucyA9IGhlbHBlcnMudG9SYWRpYW5zKG1lLmxhYmVsUm90YXRpb24pO1xuXHRcdHZhciBjb3NSb3RhdGlvbiA9IE1hdGguY29zKGxhYmVsUm90YXRpb25SYWRpYW5zKTtcblx0XHR2YXIgbG9uZ2VzdFJvdGF0ZWRMYWJlbCA9IG1lLmxvbmdlc3RMYWJlbFdpZHRoICogY29zUm90YXRpb247XG5cdFx0dmFyIHJlc3VsdCA9IFtdO1xuXHRcdHZhciBpLCB0aWNrLCBzaG91bGRTa2lwO1xuXG5cdFx0Ly8gZmlndXJlIG91dCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZ3JpZGxpbmVzIHRvIHNob3dcblx0XHR2YXIgbWF4VGlja3M7XG5cdFx0aWYgKG9wdGlvblRpY2tzLm1heFRpY2tzTGltaXQpIHtcblx0XHRcdG1heFRpY2tzID0gb3B0aW9uVGlja3MubWF4VGlja3NMaW1pdDtcblx0XHR9XG5cblx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XG5cdFx0XHRza2lwUmF0aW8gPSBmYWxzZTtcblxuXHRcdFx0aWYgKChsb25nZXN0Um90YXRlZExhYmVsICsgb3B0aW9uVGlja3MuYXV0b1NraXBQYWRkaW5nKSAqIHRpY2tDb3VudCA+IChtZS53aWR0aCAtIChtZS5wYWRkaW5nTGVmdCArIG1lLnBhZGRpbmdSaWdodCkpKSB7XG5cdFx0XHRcdHNraXBSYXRpbyA9IDEgKyBNYXRoLmZsb29yKCgobG9uZ2VzdFJvdGF0ZWRMYWJlbCArIG9wdGlvblRpY2tzLmF1dG9Ta2lwUGFkZGluZykgKiB0aWNrQ291bnQpIC8gKG1lLndpZHRoIC0gKG1lLnBhZGRpbmdMZWZ0ICsgbWUucGFkZGluZ1JpZ2h0KSkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBpZiB0aGV5IGRlZmluZWQgYSBtYXggbnVtYmVyIG9mIG9wdGlvblRpY2tzLFxuXHRcdFx0Ly8gaW5jcmVhc2Ugc2tpcFJhdGlvIHVudGlsIHRoYXQgbnVtYmVyIGlzIG1ldFxuXHRcdFx0aWYgKG1heFRpY2tzICYmIHRpY2tDb3VudCA+IG1heFRpY2tzKSB7XG5cdFx0XHRcdHNraXBSYXRpbyA9IE1hdGgubWF4KHNraXBSYXRpbywgTWF0aC5mbG9vcih0aWNrQ291bnQgLyBtYXhUaWNrcykpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoaSA9IDA7IGkgPCB0aWNrQ291bnQ7IGkrKykge1xuXHRcdFx0dGljayA9IHRpY2tzW2ldO1xuXG5cdFx0XHQvLyBTaW5jZSB3ZSBhbHdheXMgc2hvdyB0aGUgbGFzdCB0aWNrLHdlIG5lZWQgbWF5IG5lZWQgdG8gaGlkZSB0aGUgbGFzdCBzaG93biBvbmUgYmVmb3JlXG5cdFx0XHRzaG91bGRTa2lwID0gKHNraXBSYXRpbyA+IDEgJiYgaSAlIHNraXBSYXRpbyA+IDApIHx8IChpICUgc2tpcFJhdGlvID09PSAwICYmIGkgKyBza2lwUmF0aW8gPj0gdGlja0NvdW50KTtcblx0XHRcdGlmIChzaG91bGRTa2lwICYmIGkgIT09IHRpY2tDb3VudCAtIDEpIHtcblx0XHRcdFx0Ly8gbGVhdmUgdGljayBpbiBwbGFjZSBidXQgbWFrZSBzdXJlIGl0J3Mgbm90IGRpc3BsYXllZCAoIzQ2MzUpXG5cdFx0XHRcdGRlbGV0ZSB0aWNrLmxhYmVsO1xuXHRcdFx0fVxuXHRcdFx0cmVzdWx0LnB1c2godGljayk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0Ly8gQWN0dWFsbHkgZHJhdyB0aGUgc2NhbGUgb24gdGhlIGNhbnZhc1xuXHQvLyBAcGFyYW0ge3JlY3RhbmdsZX0gY2hhcnRBcmVhIDogdGhlIGFyZWEgb2YgdGhlIGNoYXJ0IHRvIGRyYXcgZnVsbCBncmlkIGxpbmVzIG9uXG5cdGRyYXc6IGZ1bmN0aW9uKGNoYXJ0QXJlYSkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG9wdGlvbnMgPSBtZS5vcHRpb25zO1xuXHRcdGlmICghb3B0aW9ucy5kaXNwbGF5KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGNvbnRleHQgPSBtZS5jdHg7XG5cdFx0dmFyIGdsb2JhbERlZmF1bHRzID0gZGVmYXVsdHMuZ2xvYmFsO1xuXHRcdHZhciBvcHRpb25UaWNrcyA9IG9wdGlvbnMudGlja3MubWlub3I7XG5cdFx0dmFyIG9wdGlvbk1ham9yVGlja3MgPSBvcHRpb25zLnRpY2tzLm1ham9yIHx8IG9wdGlvblRpY2tzO1xuXHRcdHZhciBncmlkTGluZXMgPSBvcHRpb25zLmdyaWRMaW5lcztcblx0XHR2YXIgc2NhbGVMYWJlbCA9IG9wdGlvbnMuc2NhbGVMYWJlbDtcblxuXHRcdHZhciBpc1JvdGF0ZWQgPSBtZS5sYWJlbFJvdGF0aW9uICE9PSAwO1xuXHRcdHZhciBpc0hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcblxuXHRcdHZhciB0aWNrcyA9IG9wdGlvblRpY2tzLmF1dG9Ta2lwID8gbWUuX2F1dG9Ta2lwKG1lLmdldFRpY2tzKCkpIDogbWUuZ2V0VGlja3MoKTtcblx0XHR2YXIgdGlja0ZvbnRDb2xvciA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQob3B0aW9uVGlja3MuZm9udENvbG9yLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udENvbG9yKTtcblx0XHR2YXIgdGlja0ZvbnQgPSBwYXJzZUZvbnRPcHRpb25zKG9wdGlvblRpY2tzKTtcblx0XHR2YXIgbWFqb3JUaWNrRm9udENvbG9yID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdChvcHRpb25NYWpvclRpY2tzLmZvbnRDb2xvciwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRDb2xvcik7XG5cdFx0dmFyIG1ham9yVGlja0ZvbnQgPSBwYXJzZUZvbnRPcHRpb25zKG9wdGlvbk1ham9yVGlja3MpO1xuXG5cdFx0dmFyIHRsID0gZ3JpZExpbmVzLmRyYXdUaWNrcyA/IGdyaWRMaW5lcy50aWNrTWFya0xlbmd0aCA6IDA7XG5cblx0XHR2YXIgc2NhbGVMYWJlbEZvbnRDb2xvciA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQoc2NhbGVMYWJlbC5mb250Q29sb3IsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250Q29sb3IpO1xuXHRcdHZhciBzY2FsZUxhYmVsRm9udCA9IHBhcnNlRm9udE9wdGlvbnMoc2NhbGVMYWJlbCk7XG5cdFx0dmFyIHNjYWxlTGFiZWxQYWRkaW5nID0gaGVscGVycy5vcHRpb25zLnRvUGFkZGluZyhzY2FsZUxhYmVsLnBhZGRpbmcpO1xuXHRcdHZhciBsYWJlbFJvdGF0aW9uUmFkaWFucyA9IGhlbHBlcnMudG9SYWRpYW5zKG1lLmxhYmVsUm90YXRpb24pO1xuXG5cdFx0dmFyIGl0ZW1zVG9EcmF3ID0gW107XG5cblx0XHR2YXIgYXhpc1dpZHRoID0gbWUub3B0aW9ucy5ncmlkTGluZXMubGluZVdpZHRoO1xuXHRcdHZhciB4VGlja1N0YXJ0ID0gb3B0aW9ucy5wb3NpdGlvbiA9PT0gJ3JpZ2h0JyA/IG1lLmxlZnQgOiBtZS5yaWdodCAtIGF4aXNXaWR0aCAtIHRsO1xuXHRcdHZhciB4VGlja0VuZCA9IG9wdGlvbnMucG9zaXRpb24gPT09ICdyaWdodCcgPyBtZS5sZWZ0ICsgdGwgOiBtZS5yaWdodDtcblx0XHR2YXIgeVRpY2tTdGFydCA9IG9wdGlvbnMucG9zaXRpb24gPT09ICdib3R0b20nID8gbWUudG9wICsgYXhpc1dpZHRoIDogbWUuYm90dG9tIC0gdGwgLSBheGlzV2lkdGg7XG5cdFx0dmFyIHlUaWNrRW5kID0gb3B0aW9ucy5wb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyBtZS50b3AgKyBheGlzV2lkdGggKyB0bCA6IG1lLmJvdHRvbSArIGF4aXNXaWR0aDtcblxuXHRcdGhlbHBlcnMuZWFjaCh0aWNrcywgZnVuY3Rpb24odGljaywgaW5kZXgpIHtcblx0XHRcdC8vIGF1dG9za2lwcGVyIHNraXBwZWQgdGhpcyB0aWNrICgjNDYzNSlcblx0XHRcdGlmIChoZWxwZXJzLmlzTnVsbE9yVW5kZWYodGljay5sYWJlbCkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbGFiZWwgPSB0aWNrLmxhYmVsO1xuXHRcdFx0dmFyIGxpbmVXaWR0aCwgbGluZUNvbG9yLCBib3JkZXJEYXNoLCBib3JkZXJEYXNoT2Zmc2V0O1xuXHRcdFx0aWYgKGluZGV4ID09PSBtZS56ZXJvTGluZUluZGV4ICYmIG9wdGlvbnMub2Zmc2V0ID09PSBncmlkTGluZXMub2Zmc2V0R3JpZExpbmVzKSB7XG5cdFx0XHRcdC8vIERyYXcgdGhlIGZpcnN0IGluZGV4IHNwZWNpYWxseVxuXHRcdFx0XHRsaW5lV2lkdGggPSBncmlkTGluZXMuemVyb0xpbmVXaWR0aDtcblx0XHRcdFx0bGluZUNvbG9yID0gZ3JpZExpbmVzLnplcm9MaW5lQ29sb3I7XG5cdFx0XHRcdGJvcmRlckRhc2ggPSBncmlkTGluZXMuemVyb0xpbmVCb3JkZXJEYXNoO1xuXHRcdFx0XHRib3JkZXJEYXNoT2Zmc2V0ID0gZ3JpZExpbmVzLnplcm9MaW5lQm9yZGVyRGFzaE9mZnNldDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGxpbmVXaWR0aCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGdyaWRMaW5lcy5saW5lV2lkdGgsIGluZGV4KTtcblx0XHRcdFx0bGluZUNvbG9yID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZ3JpZExpbmVzLmNvbG9yLCBpbmRleCk7XG5cdFx0XHRcdGJvcmRlckRhc2ggPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KGdyaWRMaW5lcy5ib3JkZXJEYXNoLCBnbG9iYWxEZWZhdWx0cy5ib3JkZXJEYXNoKTtcblx0XHRcdFx0Ym9yZGVyRGFzaE9mZnNldCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQoZ3JpZExpbmVzLmJvcmRlckRhc2hPZmZzZXQsIGdsb2JhbERlZmF1bHRzLmJvcmRlckRhc2hPZmZzZXQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb21tb24gcHJvcGVydGllc1xuXHRcdFx0dmFyIHR4MSwgdHkxLCB0eDIsIHR5MiwgeDEsIHkxLCB4MiwgeTIsIGxhYmVsWCwgbGFiZWxZO1xuXHRcdFx0dmFyIHRleHRBbGlnbiA9ICdtaWRkbGUnO1xuXHRcdFx0dmFyIHRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuXHRcdFx0dmFyIHRpY2tQYWRkaW5nID0gb3B0aW9uVGlja3MucGFkZGluZztcblxuXHRcdFx0aWYgKGlzSG9yaXpvbnRhbCkge1xuXHRcdFx0XHR2YXIgbGFiZWxZT2Zmc2V0ID0gdGwgKyB0aWNrUGFkZGluZztcblxuXHRcdFx0XHRpZiAob3B0aW9ucy5wb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcblx0XHRcdFx0XHQvLyBib3R0b21cblx0XHRcdFx0XHR0ZXh0QmFzZWxpbmUgPSAhaXNSb3RhdGVkID8gJ3RvcCcgOiAnbWlkZGxlJztcblx0XHRcdFx0XHR0ZXh0QWxpZ24gPSAhaXNSb3RhdGVkID8gJ2NlbnRlcicgOiAncmlnaHQnO1xuXHRcdFx0XHRcdGxhYmVsWSA9IG1lLnRvcCArIGxhYmVsWU9mZnNldDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB0b3Bcblx0XHRcdFx0XHR0ZXh0QmFzZWxpbmUgPSAhaXNSb3RhdGVkID8gJ2JvdHRvbScgOiAnbWlkZGxlJztcblx0XHRcdFx0XHR0ZXh0QWxpZ24gPSAhaXNSb3RhdGVkID8gJ2NlbnRlcicgOiAnbGVmdCc7XG5cdFx0XHRcdFx0bGFiZWxZID0gbWUuYm90dG9tIC0gbGFiZWxZT2Zmc2V0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHhMaW5lVmFsdWUgPSBnZXRMaW5lVmFsdWUobWUsIGluZGV4LCBncmlkTGluZXMub2Zmc2V0R3JpZExpbmVzICYmIHRpY2tzLmxlbmd0aCA+IDEpO1xuXHRcdFx0XHRpZiAoeExpbmVWYWx1ZSA8IG1lLmxlZnQpIHtcblx0XHRcdFx0XHRsaW5lQ29sb3IgPSAncmdiYSgwLDAsMCwwKSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0eExpbmVWYWx1ZSArPSBoZWxwZXJzLmFsaWFzUGl4ZWwobGluZVdpZHRoKTtcblxuXHRcdFx0XHRsYWJlbFggPSBtZS5nZXRQaXhlbEZvclRpY2soaW5kZXgpICsgb3B0aW9uVGlja3MubGFiZWxPZmZzZXQ7IC8vIHggdmFsdWVzIGZvciBvcHRpb25UaWNrcyAobmVlZCB0byBjb25zaWRlciBvZmZzZXRMYWJlbCBvcHRpb24pXG5cblx0XHRcdFx0dHgxID0gdHgyID0geDEgPSB4MiA9IHhMaW5lVmFsdWU7XG5cdFx0XHRcdHR5MSA9IHlUaWNrU3RhcnQ7XG5cdFx0XHRcdHR5MiA9IHlUaWNrRW5kO1xuXHRcdFx0XHR5MSA9IGNoYXJ0QXJlYS50b3A7XG5cdFx0XHRcdHkyID0gY2hhcnRBcmVhLmJvdHRvbSArIGF4aXNXaWR0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBpc0xlZnQgPSBvcHRpb25zLnBvc2l0aW9uID09PSAnbGVmdCc7XG5cdFx0XHRcdHZhciBsYWJlbFhPZmZzZXQ7XG5cblx0XHRcdFx0aWYgKG9wdGlvblRpY2tzLm1pcnJvcikge1xuXHRcdFx0XHRcdHRleHRBbGlnbiA9IGlzTGVmdCA/ICdsZWZ0JyA6ICdyaWdodCc7XG5cdFx0XHRcdFx0bGFiZWxYT2Zmc2V0ID0gdGlja1BhZGRpbmc7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGV4dEFsaWduID0gaXNMZWZ0ID8gJ3JpZ2h0JyA6ICdsZWZ0Jztcblx0XHRcdFx0XHRsYWJlbFhPZmZzZXQgPSB0bCArIHRpY2tQYWRkaW5nO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGFiZWxYID0gaXNMZWZ0ID8gbWUucmlnaHQgLSBsYWJlbFhPZmZzZXQgOiBtZS5sZWZ0ICsgbGFiZWxYT2Zmc2V0O1xuXG5cdFx0XHRcdHZhciB5TGluZVZhbHVlID0gZ2V0TGluZVZhbHVlKG1lLCBpbmRleCwgZ3JpZExpbmVzLm9mZnNldEdyaWRMaW5lcyAmJiB0aWNrcy5sZW5ndGggPiAxKTtcblx0XHRcdFx0aWYgKHlMaW5lVmFsdWUgPCBtZS50b3ApIHtcblx0XHRcdFx0XHRsaW5lQ29sb3IgPSAncmdiYSgwLDAsMCwwKSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0eUxpbmVWYWx1ZSArPSBoZWxwZXJzLmFsaWFzUGl4ZWwobGluZVdpZHRoKTtcblxuXHRcdFx0XHRsYWJlbFkgPSBtZS5nZXRQaXhlbEZvclRpY2soaW5kZXgpICsgb3B0aW9uVGlja3MubGFiZWxPZmZzZXQ7XG5cblx0XHRcdFx0dHgxID0geFRpY2tTdGFydDtcblx0XHRcdFx0dHgyID0geFRpY2tFbmQ7XG5cdFx0XHRcdHgxID0gY2hhcnRBcmVhLmxlZnQ7XG5cdFx0XHRcdHgyID0gY2hhcnRBcmVhLnJpZ2h0ICsgYXhpc1dpZHRoO1xuXHRcdFx0XHR0eTEgPSB0eTIgPSB5MSA9IHkyID0geUxpbmVWYWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0aXRlbXNUb0RyYXcucHVzaCh7XG5cdFx0XHRcdHR4MTogdHgxLFxuXHRcdFx0XHR0eTE6IHR5MSxcblx0XHRcdFx0dHgyOiB0eDIsXG5cdFx0XHRcdHR5MjogdHkyLFxuXHRcdFx0XHR4MTogeDEsXG5cdFx0XHRcdHkxOiB5MSxcblx0XHRcdFx0eDI6IHgyLFxuXHRcdFx0XHR5MjogeTIsXG5cdFx0XHRcdGxhYmVsWDogbGFiZWxYLFxuXHRcdFx0XHRsYWJlbFk6IGxhYmVsWSxcblx0XHRcdFx0Z2xXaWR0aDogbGluZVdpZHRoLFxuXHRcdFx0XHRnbENvbG9yOiBsaW5lQ29sb3IsXG5cdFx0XHRcdGdsQm9yZGVyRGFzaDogYm9yZGVyRGFzaCxcblx0XHRcdFx0Z2xCb3JkZXJEYXNoT2Zmc2V0OiBib3JkZXJEYXNoT2Zmc2V0LFxuXHRcdFx0XHRyb3RhdGlvbjogLTEgKiBsYWJlbFJvdGF0aW9uUmFkaWFucyxcblx0XHRcdFx0bGFiZWw6IGxhYmVsLFxuXHRcdFx0XHRtYWpvcjogdGljay5tYWpvcixcblx0XHRcdFx0dGV4dEJhc2VsaW5lOiB0ZXh0QmFzZWxpbmUsXG5cdFx0XHRcdHRleHRBbGlnbjogdGV4dEFsaWduXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdC8vIERyYXcgYWxsIG9mIHRoZSB0aWNrIGxhYmVscywgdGljayBtYXJrcywgYW5kIGdyaWQgbGluZXMgYXQgdGhlIGNvcnJlY3QgcGxhY2VzXG5cdFx0aGVscGVycy5lYWNoKGl0ZW1zVG9EcmF3LCBmdW5jdGlvbihpdGVtVG9EcmF3KSB7XG5cdFx0XHRpZiAoZ3JpZExpbmVzLmRpc3BsYXkpIHtcblx0XHRcdFx0Y29udGV4dC5zYXZlKCk7XG5cdFx0XHRcdGNvbnRleHQubGluZVdpZHRoID0gaXRlbVRvRHJhdy5nbFdpZHRoO1xuXHRcdFx0XHRjb250ZXh0LnN0cm9rZVN0eWxlID0gaXRlbVRvRHJhdy5nbENvbG9yO1xuXHRcdFx0XHRpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRcdGNvbnRleHQuc2V0TGluZURhc2goaXRlbVRvRHJhdy5nbEJvcmRlckRhc2gpO1xuXHRcdFx0XHRcdGNvbnRleHQubGluZURhc2hPZmZzZXQgPSBpdGVtVG9EcmF3LmdsQm9yZGVyRGFzaE9mZnNldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cblx0XHRcdFx0aWYgKGdyaWRMaW5lcy5kcmF3VGlja3MpIHtcblx0XHRcdFx0XHRjb250ZXh0Lm1vdmVUbyhpdGVtVG9EcmF3LnR4MSwgaXRlbVRvRHJhdy50eTEpO1xuXHRcdFx0XHRcdGNvbnRleHQubGluZVRvKGl0ZW1Ub0RyYXcudHgyLCBpdGVtVG9EcmF3LnR5Mik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZ3JpZExpbmVzLmRyYXdPbkNoYXJ0QXJlYSkge1xuXHRcdFx0XHRcdGNvbnRleHQubW92ZVRvKGl0ZW1Ub0RyYXcueDEsIGl0ZW1Ub0RyYXcueTEpO1xuXHRcdFx0XHRcdGNvbnRleHQubGluZVRvKGl0ZW1Ub0RyYXcueDIsIGl0ZW1Ub0RyYXcueTIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29udGV4dC5zdHJva2UoKTtcblx0XHRcdFx0Y29udGV4dC5yZXN0b3JlKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvcHRpb25UaWNrcy5kaXNwbGF5KSB7XG5cdFx0XHRcdC8vIE1ha2Ugc3VyZSB3ZSBkcmF3IHRleHQgaW4gdGhlIGNvcnJlY3QgY29sb3IgYW5kIGZvbnRcblx0XHRcdFx0Y29udGV4dC5zYXZlKCk7XG5cdFx0XHRcdGNvbnRleHQudHJhbnNsYXRlKGl0ZW1Ub0RyYXcubGFiZWxYLCBpdGVtVG9EcmF3LmxhYmVsWSk7XG5cdFx0XHRcdGNvbnRleHQucm90YXRlKGl0ZW1Ub0RyYXcucm90YXRpb24pO1xuXHRcdFx0XHRjb250ZXh0LmZvbnQgPSBpdGVtVG9EcmF3Lm1ham9yID8gbWFqb3JUaWNrRm9udC5mb250IDogdGlja0ZvbnQuZm9udDtcblx0XHRcdFx0Y29udGV4dC5maWxsU3R5bGUgPSBpdGVtVG9EcmF3Lm1ham9yID8gbWFqb3JUaWNrRm9udENvbG9yIDogdGlja0ZvbnRDb2xvcjtcblx0XHRcdFx0Y29udGV4dC50ZXh0QmFzZWxpbmUgPSBpdGVtVG9EcmF3LnRleHRCYXNlbGluZTtcblx0XHRcdFx0Y29udGV4dC50ZXh0QWxpZ24gPSBpdGVtVG9EcmF3LnRleHRBbGlnbjtcblxuXHRcdFx0XHR2YXIgbGFiZWwgPSBpdGVtVG9EcmF3LmxhYmVsO1xuXHRcdFx0XHRpZiAoaGVscGVycy5pc0FycmF5KGxhYmVsKSkge1xuXHRcdFx0XHRcdHZhciBsaW5lQ291bnQgPSBsYWJlbC5sZW5ndGg7XG5cdFx0XHRcdFx0dmFyIGxpbmVIZWlnaHQgPSB0aWNrRm9udC5zaXplICogMS41O1xuXHRcdFx0XHRcdHZhciB5ID0gbWUuaXNIb3Jpem9udGFsKCkgPyAwIDogLWxpbmVIZWlnaHQgKiAobGluZUNvdW50IC0gMSkgLyAyO1xuXG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lQ291bnQ7ICsraSkge1xuXHRcdFx0XHRcdFx0Ly8gV2UganVzdCBtYWtlIHN1cmUgdGhlIG11bHRpbGluZSBlbGVtZW50IGlzIGEgc3RyaW5nIGhlcmUuLlxuXHRcdFx0XHRcdFx0Y29udGV4dC5maWxsVGV4dCgnJyArIGxhYmVsW2ldLCAwLCB5KTtcblx0XHRcdFx0XHRcdC8vIGFwcGx5IHNhbWUgbGluZVNwYWNpbmcgYXMgY2FsY3VsYXRlZCBAIEwjMzIwXG5cdFx0XHRcdFx0XHR5ICs9IGxpbmVIZWlnaHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRleHQuZmlsbFRleHQobGFiZWwsIDAsIDApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRleHQucmVzdG9yZSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKHNjYWxlTGFiZWwuZGlzcGxheSkge1xuXHRcdFx0Ly8gRHJhdyB0aGUgc2NhbGUgbGFiZWxcblx0XHRcdHZhciBzY2FsZUxhYmVsWDtcblx0XHRcdHZhciBzY2FsZUxhYmVsWTtcblx0XHRcdHZhciByb3RhdGlvbiA9IDA7XG5cdFx0XHR2YXIgaGFsZkxpbmVIZWlnaHQgPSBwYXJzZUxpbmVIZWlnaHQoc2NhbGVMYWJlbCkgLyAyO1xuXG5cdFx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XG5cdFx0XHRcdHNjYWxlTGFiZWxYID0gbWUubGVmdCArICgobWUucmlnaHQgLSBtZS5sZWZ0KSAvIDIpOyAvLyBtaWRwb2ludCBvZiB0aGUgd2lkdGhcblx0XHRcdFx0c2NhbGVMYWJlbFkgPSBvcHRpb25zLnBvc2l0aW9uID09PSAnYm90dG9tJ1xuXHRcdFx0XHRcdD8gbWUuYm90dG9tIC0gaGFsZkxpbmVIZWlnaHQgLSBzY2FsZUxhYmVsUGFkZGluZy5ib3R0b21cblx0XHRcdFx0XHQ6IG1lLnRvcCArIGhhbGZMaW5lSGVpZ2h0ICsgc2NhbGVMYWJlbFBhZGRpbmcudG9wO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIGlzTGVmdCA9IG9wdGlvbnMucG9zaXRpb24gPT09ICdsZWZ0Jztcblx0XHRcdFx0c2NhbGVMYWJlbFggPSBpc0xlZnRcblx0XHRcdFx0XHQ/IG1lLmxlZnQgKyBoYWxmTGluZUhlaWdodCArIHNjYWxlTGFiZWxQYWRkaW5nLnRvcFxuXHRcdFx0XHRcdDogbWUucmlnaHQgLSBoYWxmTGluZUhlaWdodCAtIHNjYWxlTGFiZWxQYWRkaW5nLnRvcDtcblx0XHRcdFx0c2NhbGVMYWJlbFkgPSBtZS50b3AgKyAoKG1lLmJvdHRvbSAtIG1lLnRvcCkgLyAyKTtcblx0XHRcdFx0cm90YXRpb24gPSBpc0xlZnQgPyAtMC41ICogTWF0aC5QSSA6IDAuNSAqIE1hdGguUEk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnRleHQuc2F2ZSgpO1xuXHRcdFx0Y29udGV4dC50cmFuc2xhdGUoc2NhbGVMYWJlbFgsIHNjYWxlTGFiZWxZKTtcblx0XHRcdGNvbnRleHQucm90YXRlKHJvdGF0aW9uKTtcblx0XHRcdGNvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG5cdFx0XHRjb250ZXh0LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuXHRcdFx0Y29udGV4dC5maWxsU3R5bGUgPSBzY2FsZUxhYmVsRm9udENvbG9yOyAvLyByZW5kZXIgaW4gY29ycmVjdCBjb2xvdXJcblx0XHRcdGNvbnRleHQuZm9udCA9IHNjYWxlTGFiZWxGb250LmZvbnQ7XG5cdFx0XHRjb250ZXh0LmZpbGxUZXh0KHNjYWxlTGFiZWwubGFiZWxTdHJpbmcsIDAsIDApO1xuXHRcdFx0Y29udGV4dC5yZXN0b3JlKCk7XG5cdFx0fVxuXG5cdFx0aWYgKGdyaWRMaW5lcy5kcmF3Qm9yZGVyKSB7XG5cdFx0XHQvLyBEcmF3IHRoZSBsaW5lIGF0IHRoZSBlZGdlIG9mIHRoZSBheGlzXG5cdFx0XHRjb250ZXh0LmxpbmVXaWR0aCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGdyaWRMaW5lcy5saW5lV2lkdGgsIDApO1xuXHRcdFx0Y29udGV4dC5zdHJva2VTdHlsZSA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGdyaWRMaW5lcy5jb2xvciwgMCk7XG5cdFx0XHR2YXIgeDEgPSBtZS5sZWZ0O1xuXHRcdFx0dmFyIHgyID0gbWUucmlnaHQgKyBheGlzV2lkdGg7XG5cdFx0XHR2YXIgeTEgPSBtZS50b3A7XG5cdFx0XHR2YXIgeTIgPSBtZS5ib3R0b20gKyBheGlzV2lkdGg7XG5cblx0XHRcdHZhciBhbGlhc1BpeGVsID0gaGVscGVycy5hbGlhc1BpeGVsKGNvbnRleHQubGluZVdpZHRoKTtcblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdFx0eTEgPSB5MiA9IG9wdGlvbnMucG9zaXRpb24gPT09ICd0b3AnID8gbWUuYm90dG9tIDogbWUudG9wO1xuXHRcdFx0XHR5MSArPSBhbGlhc1BpeGVsO1xuXHRcdFx0XHR5MiArPSBhbGlhc1BpeGVsO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0eDEgPSB4MiA9IG9wdGlvbnMucG9zaXRpb24gPT09ICdsZWZ0JyA/IG1lLnJpZ2h0IDogbWUubGVmdDtcblx0XHRcdFx0eDEgKz0gYWxpYXNQaXhlbDtcblx0XHRcdFx0eDIgKz0gYWxpYXNQaXhlbDtcblx0XHRcdH1cblxuXHRcdFx0Y29udGV4dC5iZWdpblBhdGgoKTtcblx0XHRcdGNvbnRleHQubW92ZVRvKHgxLCB5MSk7XG5cdFx0XHRjb250ZXh0LmxpbmVUbyh4MiwgeTIpO1xuXHRcdFx0Y29udGV4dC5zdHJva2UoKTtcblx0XHR9XG5cdH1cbn0pO1xuXG59LHtcIjI2XCI6MjYsXCIyN1wiOjI3LFwiMzVcIjozNSxcIjQ2XCI6NDZ9XSwzNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcbnZhciBsYXlvdXRzID0gcmVxdWlyZSgzMSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHQvLyBTY2FsZSByZWdpc3RyYXRpb24gb2JqZWN0LiBFeHRlbnNpb25zIGNhbiByZWdpc3RlciBuZXcgc2NhbGUgdHlwZXMgKHN1Y2ggYXMgbG9nIG9yIERCIHNjYWxlcykgYW5kIHRoZW5cblx0Ly8gdXNlIHRoZSBuZXcgY2hhcnQgb3B0aW9ucyB0byBncmFiIHRoZSBjb3JyZWN0IHNjYWxlXG5cdGNvbnN0cnVjdG9yczoge30sXG5cdC8vIFVzZSBhIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBzbyB0aGF0IHdlIGNhbiBtb3ZlIHRvIGFuIEVTNiBtYXAgd2hlbiB3ZSBubyBsb25nZXIgbmVlZCB0byBzdXBwb3J0XG5cdC8vIG9sZCBicm93c2Vyc1xuXG5cdC8vIFNjYWxlIGNvbmZpZyBkZWZhdWx0c1xuXHRkZWZhdWx0czoge30sXG5cdHJlZ2lzdGVyU2NhbGVUeXBlOiBmdW5jdGlvbih0eXBlLCBzY2FsZUNvbnN0cnVjdG9yLCBzY2FsZURlZmF1bHRzKSB7XG5cdFx0dGhpcy5jb25zdHJ1Y3RvcnNbdHlwZV0gPSBzY2FsZUNvbnN0cnVjdG9yO1xuXHRcdHRoaXMuZGVmYXVsdHNbdHlwZV0gPSBoZWxwZXJzLmNsb25lKHNjYWxlRGVmYXVsdHMpO1xuXHR9LFxuXHRnZXRTY2FsZUNvbnN0cnVjdG9yOiBmdW5jdGlvbih0eXBlKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3JzLmhhc093blByb3BlcnR5KHR5cGUpID8gdGhpcy5jb25zdHJ1Y3RvcnNbdHlwZV0gOiB1bmRlZmluZWQ7XG5cdH0sXG5cdGdldFNjYWxlRGVmYXVsdHM6IGZ1bmN0aW9uKHR5cGUpIHtcblx0XHQvLyBSZXR1cm4gdGhlIHNjYWxlIGRlZmF1bHRzIG1lcmdlZCB3aXRoIHRoZSBnbG9iYWwgc2V0dGluZ3Mgc28gdGhhdCB3ZSBhbHdheXMgdXNlIHRoZSBsYXRlc3Qgb25lc1xuXHRcdHJldHVybiB0aGlzLmRlZmF1bHRzLmhhc093blByb3BlcnR5KHR5cGUpID8gaGVscGVycy5tZXJnZSh7fSwgW2RlZmF1bHRzLnNjYWxlLCB0aGlzLmRlZmF1bHRzW3R5cGVdXSkgOiB7fTtcblx0fSxcblx0dXBkYXRlU2NhbGVEZWZhdWx0czogZnVuY3Rpb24odHlwZSwgYWRkaXRpb25zKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHRpZiAobWUuZGVmYXVsdHMuaGFzT3duUHJvcGVydHkodHlwZSkpIHtcblx0XHRcdG1lLmRlZmF1bHRzW3R5cGVdID0gaGVscGVycy5leHRlbmQobWUuZGVmYXVsdHNbdHlwZV0sIGFkZGl0aW9ucyk7XG5cdFx0fVxuXHR9LFxuXHRhZGRTY2FsZXNUb0xheW91dDogZnVuY3Rpb24oY2hhcnQpIHtcblx0XHQvLyBBZGRzIGVhY2ggc2NhbGUgdG8gdGhlIGNoYXJ0LmJveGVzIGFycmF5IHRvIGJlIHNpemVkIGFjY29yZGluZ2x5XG5cdFx0aGVscGVycy5lYWNoKGNoYXJ0LnNjYWxlcywgZnVuY3Rpb24oc2NhbGUpIHtcblx0XHRcdC8vIFNldCBJTGF5b3V0SXRlbSBwYXJhbWV0ZXJzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdFx0c2NhbGUuZnVsbFdpZHRoID0gc2NhbGUub3B0aW9ucy5mdWxsV2lkdGg7XG5cdFx0XHRzY2FsZS5wb3NpdGlvbiA9IHNjYWxlLm9wdGlvbnMucG9zaXRpb247XG5cdFx0XHRzY2FsZS53ZWlnaHQgPSBzY2FsZS5vcHRpb25zLndlaWdodDtcblx0XHRcdGxheW91dHMuYWRkQm94KGNoYXJ0LCBzY2FsZSk7XG5cdFx0fSk7XG5cdH1cbn07XG5cbn0se1wiMjZcIjoyNixcIjMxXCI6MzEsXCI0NlwiOjQ2fV0sMzU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG4vKipcbiAqIE5hbWVzcGFjZSB0byBob2xkIHN0YXRpYyB0aWNrIGdlbmVyYXRpb24gZnVuY3Rpb25zXG4gKiBAbmFtZXNwYWNlIENoYXJ0LlRpY2tzXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuXHQvKipcblx0ICogTmFtZXNwYWNlIHRvIGhvbGQgZm9ybWF0dGVycyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHRpY2tzXG5cdCAqIEBuYW1lc3BhY2UgQ2hhcnQuVGlja3MuZm9ybWF0dGVyc1xuXHQgKi9cblx0Zm9ybWF0dGVyczoge1xuXHRcdC8qKlxuXHRcdCAqIEZvcm1hdHRlciBmb3IgdmFsdWUgbGFiZWxzXG5cdFx0ICogQG1ldGhvZCBDaGFydC5UaWNrcy5mb3JtYXR0ZXJzLnZhbHVlc1xuXHRcdCAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gZGlzcGxheVxuXHRcdCAqIEByZXR1cm4ge1N0cmluZ3xBcnJheX0gdGhlIGxhYmVsIHRvIGRpc3BsYXlcblx0XHQgKi9cblx0XHR2YWx1ZXM6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gaGVscGVycy5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogJycgKyB2YWx1ZTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogRm9ybWF0dGVyIGZvciBsaW5lYXIgbnVtZXJpYyB0aWNrc1xuXHRcdCAqIEBtZXRob2QgQ2hhcnQuVGlja3MuZm9ybWF0dGVycy5saW5lYXJcblx0XHQgKiBAcGFyYW0gdGlja1ZhbHVlIHtOdW1iZXJ9IHRoZSB2YWx1ZSB0byBiZSBmb3JtYXR0ZWRcblx0XHQgKiBAcGFyYW0gaW5kZXgge051bWJlcn0gdGhlIHBvc2l0aW9uIG9mIHRoZSB0aWNrVmFsdWUgcGFyYW1ldGVyIGluIHRoZSB0aWNrcyBhcnJheVxuXHRcdCAqIEBwYXJhbSB0aWNrcyB7QXJyYXk8TnVtYmVyPn0gdGhlIGxpc3Qgb2YgdGlja3MgYmVpbmcgY29udmVydGVkXG5cdFx0ICogQHJldHVybiB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRpY2tWYWx1ZSBwYXJhbWV0ZXJcblx0XHQgKi9cblx0XHRsaW5lYXI6IGZ1bmN0aW9uKHRpY2tWYWx1ZSwgaW5kZXgsIHRpY2tzKSB7XG5cdFx0XHQvLyBJZiB3ZSBoYXZlIGxvdHMgb2YgdGlja3MsIGRvbid0IHVzZSB0aGUgb25lc1xuXHRcdFx0dmFyIGRlbHRhID0gdGlja3MubGVuZ3RoID4gMyA/IHRpY2tzWzJdIC0gdGlja3NbMV0gOiB0aWNrc1sxXSAtIHRpY2tzWzBdO1xuXG5cdFx0XHQvLyBJZiB3ZSBoYXZlIGEgbnVtYmVyIGxpa2UgMi41IGFzIHRoZSBkZWx0YSwgZmlndXJlIG91dCBob3cgbWFueSBkZWNpbWFsIHBsYWNlcyB3ZSBuZWVkXG5cdFx0XHRpZiAoTWF0aC5hYnMoZGVsdGEpID4gMSkge1xuXHRcdFx0XHRpZiAodGlja1ZhbHVlICE9PSBNYXRoLmZsb29yKHRpY2tWYWx1ZSkpIHtcblx0XHRcdFx0XHQvLyBub3QgYW4gaW50ZWdlclxuXHRcdFx0XHRcdGRlbHRhID0gdGlja1ZhbHVlIC0gTWF0aC5mbG9vcih0aWNrVmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHZhciBsb2dEZWx0YSA9IGhlbHBlcnMubG9nMTAoTWF0aC5hYnMoZGVsdGEpKTtcblx0XHRcdHZhciB0aWNrU3RyaW5nID0gJyc7XG5cblx0XHRcdGlmICh0aWNrVmFsdWUgIT09IDApIHtcblx0XHRcdFx0dmFyIG1heFRpY2sgPSBNYXRoLm1heChNYXRoLmFicyh0aWNrc1swXSksIE1hdGguYWJzKHRpY2tzW3RpY2tzLmxlbmd0aCAtIDFdKSk7XG5cdFx0XHRcdGlmIChtYXhUaWNrIDwgMWUtNCkgeyAvLyBhbGwgdGlja3MgYXJlIHNtYWxsIG51bWJlcnM7IHVzZSBzY2llbnRpZmljIG5vdGF0aW9uXG5cdFx0XHRcdFx0dmFyIGxvZ1RpY2sgPSBoZWxwZXJzLmxvZzEwKE1hdGguYWJzKHRpY2tWYWx1ZSkpO1xuXHRcdFx0XHRcdHRpY2tTdHJpbmcgPSB0aWNrVmFsdWUudG9FeHBvbmVudGlhbChNYXRoLmZsb29yKGxvZ1RpY2spIC0gTWF0aC5mbG9vcihsb2dEZWx0YSkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhciBudW1EZWNpbWFsID0gLTEgKiBNYXRoLmZsb29yKGxvZ0RlbHRhKTtcblx0XHRcdFx0XHRudW1EZWNpbWFsID0gTWF0aC5tYXgoTWF0aC5taW4obnVtRGVjaW1hbCwgMjApLCAwKTsgLy8gdG9GaXhlZCBoYXMgYSBtYXggb2YgMjAgZGVjaW1hbCBwbGFjZXNcblx0XHRcdFx0XHR0aWNrU3RyaW5nID0gdGlja1ZhbHVlLnRvRml4ZWQobnVtRGVjaW1hbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRpY2tTdHJpbmcgPSAnMCc7IC8vIG5ldmVyIHNob3cgZGVjaW1hbCBwbGFjZXMgZm9yIDBcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRpY2tTdHJpbmc7XG5cdFx0fSxcblxuXHRcdGxvZ2FyaXRobWljOiBmdW5jdGlvbih0aWNrVmFsdWUsIGluZGV4LCB0aWNrcykge1xuXHRcdFx0dmFyIHJlbWFpbiA9IHRpY2tWYWx1ZSAvIChNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKHRpY2tWYWx1ZSkpKSk7XG5cblx0XHRcdGlmICh0aWNrVmFsdWUgPT09IDApIHtcblx0XHRcdFx0cmV0dXJuICcwJztcblx0XHRcdH0gZWxzZSBpZiAocmVtYWluID09PSAxIHx8IHJlbWFpbiA9PT0gMiB8fCByZW1haW4gPT09IDUgfHwgaW5kZXggPT09IDAgfHwgaW5kZXggPT09IHRpY2tzLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0cmV0dXJuIHRpY2tWYWx1ZS50b0V4cG9uZW50aWFsKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXHR9XG59O1xuXG59LHtcIjQ2XCI6NDZ9XSwzNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIEVsZW1lbnQgPSByZXF1aXJlKDI3KTtcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG5cbmRlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcblx0dG9vbHRpcHM6IHtcblx0XHRlbmFibGVkOiB0cnVlLFxuXHRcdGN1c3RvbTogbnVsbCxcblx0XHRtb2RlOiAnbmVhcmVzdCcsXG5cdFx0cG9zaXRpb246ICdhdmVyYWdlJyxcblx0XHRpbnRlcnNlY3Q6IHRydWUsXG5cdFx0YmFja2dyb3VuZENvbG9yOiAncmdiYSgwLDAsMCwwLjgpJyxcblx0XHR0aXRsZUZvbnRTdHlsZTogJ2JvbGQnLFxuXHRcdHRpdGxlU3BhY2luZzogMixcblx0XHR0aXRsZU1hcmdpbkJvdHRvbTogNixcblx0XHR0aXRsZUZvbnRDb2xvcjogJyNmZmYnLFxuXHRcdHRpdGxlQWxpZ246ICdsZWZ0Jyxcblx0XHRib2R5U3BhY2luZzogMixcblx0XHRib2R5Rm9udENvbG9yOiAnI2ZmZicsXG5cdFx0Ym9keUFsaWduOiAnbGVmdCcsXG5cdFx0Zm9vdGVyRm9udFN0eWxlOiAnYm9sZCcsXG5cdFx0Zm9vdGVyU3BhY2luZzogMixcblx0XHRmb290ZXJNYXJnaW5Ub3A6IDYsXG5cdFx0Zm9vdGVyRm9udENvbG9yOiAnI2ZmZicsXG5cdFx0Zm9vdGVyQWxpZ246ICdsZWZ0Jyxcblx0XHR5UGFkZGluZzogNixcblx0XHR4UGFkZGluZzogNixcblx0XHRjYXJldFBhZGRpbmc6IDIsXG5cdFx0Y2FyZXRTaXplOiA1LFxuXHRcdGNvcm5lclJhZGl1czogNixcblx0XHRtdWx0aUtleUJhY2tncm91bmQ6ICcjZmZmJyxcblx0XHRkaXNwbGF5Q29sb3JzOiB0cnVlLFxuXHRcdGJvcmRlckNvbG9yOiAncmdiYSgwLDAsMCwwKScsXG5cdFx0Ym9yZGVyV2lkdGg6IDAsXG5cdFx0Y2FsbGJhY2tzOiB7XG5cdFx0XHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtcywgZGF0YSlcblx0XHRcdGJlZm9yZVRpdGxlOiBoZWxwZXJzLm5vb3AsXG5cdFx0XHR0aXRsZTogZnVuY3Rpb24odG9vbHRpcEl0ZW1zLCBkYXRhKSB7XG5cdFx0XHRcdC8vIFBpY2sgZmlyc3QgeExhYmVsIGZvciBub3dcblx0XHRcdFx0dmFyIHRpdGxlID0gJyc7XG5cdFx0XHRcdHZhciBsYWJlbHMgPSBkYXRhLmxhYmVscztcblx0XHRcdFx0dmFyIGxhYmVsQ291bnQgPSBsYWJlbHMgPyBsYWJlbHMubGVuZ3RoIDogMDtcblxuXHRcdFx0XHRpZiAodG9vbHRpcEl0ZW1zLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHR2YXIgaXRlbSA9IHRvb2x0aXBJdGVtc1swXTtcblxuXHRcdFx0XHRcdGlmIChpdGVtLnhMYWJlbCkge1xuXHRcdFx0XHRcdFx0dGl0bGUgPSBpdGVtLnhMYWJlbDtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGxhYmVsQ291bnQgPiAwICYmIGl0ZW0uaW5kZXggPCBsYWJlbENvdW50KSB7XG5cdFx0XHRcdFx0XHR0aXRsZSA9IGxhYmVsc1tpdGVtLmluZGV4XTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdGl0bGU7XG5cdFx0XHR9LFxuXHRcdFx0YWZ0ZXJUaXRsZTogaGVscGVycy5ub29wLFxuXG5cdFx0XHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtcywgZGF0YSlcblx0XHRcdGJlZm9yZUJvZHk6IGhlbHBlcnMubm9vcCxcblxuXHRcdFx0Ly8gQXJncyBhcmU6ICh0b29sdGlwSXRlbSwgZGF0YSlcblx0XHRcdGJlZm9yZUxhYmVsOiBoZWxwZXJzLm5vb3AsXG5cdFx0XHRsYWJlbDogZnVuY3Rpb24odG9vbHRpcEl0ZW0sIGRhdGEpIHtcblx0XHRcdFx0dmFyIGxhYmVsID0gZGF0YS5kYXRhc2V0c1t0b29sdGlwSXRlbS5kYXRhc2V0SW5kZXhdLmxhYmVsIHx8ICcnO1xuXG5cdFx0XHRcdGlmIChsYWJlbCkge1xuXHRcdFx0XHRcdGxhYmVsICs9ICc6ICc7XG5cdFx0XHRcdH1cblx0XHRcdFx0bGFiZWwgKz0gdG9vbHRpcEl0ZW0ueUxhYmVsO1xuXHRcdFx0XHRyZXR1cm4gbGFiZWw7XG5cdFx0XHR9LFxuXHRcdFx0bGFiZWxDb2xvcjogZnVuY3Rpb24odG9vbHRpcEl0ZW0sIGNoYXJ0KSB7XG5cdFx0XHRcdHZhciBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEodG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4KTtcblx0XHRcdFx0dmFyIGFjdGl2ZUVsZW1lbnQgPSBtZXRhLmRhdGFbdG9vbHRpcEl0ZW0uaW5kZXhdO1xuXHRcdFx0XHR2YXIgdmlldyA9IGFjdGl2ZUVsZW1lbnQuX3ZpZXc7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0Ym9yZGVyQ29sb3I6IHZpZXcuYm9yZGVyQ29sb3IsXG5cdFx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiB2aWV3LmJhY2tncm91bmRDb2xvclxuXHRcdFx0XHR9O1xuXHRcdFx0fSxcblx0XHRcdGxhYmVsVGV4dENvbG9yOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX29wdGlvbnMuYm9keUZvbnRDb2xvcjtcblx0XHRcdH0sXG5cdFx0XHRhZnRlckxhYmVsOiBoZWxwZXJzLm5vb3AsXG5cblx0XHRcdC8vIEFyZ3MgYXJlOiAodG9vbHRpcEl0ZW1zLCBkYXRhKVxuXHRcdFx0YWZ0ZXJCb2R5OiBoZWxwZXJzLm5vb3AsXG5cblx0XHRcdC8vIEFyZ3MgYXJlOiAodG9vbHRpcEl0ZW1zLCBkYXRhKVxuXHRcdFx0YmVmb3JlRm9vdGVyOiBoZWxwZXJzLm5vb3AsXG5cdFx0XHRmb290ZXI6IGhlbHBlcnMubm9vcCxcblx0XHRcdGFmdGVyRm9vdGVyOiBoZWxwZXJzLm5vb3Bcblx0XHR9XG5cdH1cbn0pO1xuXG52YXIgcG9zaXRpb25lcnMgPSB7XG5cdC8qKlxuXHQgKiBBdmVyYWdlIG1vZGUgcGxhY2VzIHRoZSB0b29sdGlwIGF0IHRoZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50cyBzaG93blxuXHQgKiBAZnVuY3Rpb24gQ2hhcnQuVG9vbHRpcC5wb3NpdGlvbmVycy5hdmVyYWdlXG5cdCAqIEBwYXJhbSBlbGVtZW50cyB7Q2hhcnRFbGVtZW50W119IHRoZSBlbGVtZW50cyBiZWluZyBkaXNwbGF5ZWQgaW4gdGhlIHRvb2x0aXBcblx0ICogQHJldHVybnMge1BvaW50fSB0b29sdGlwIHBvc2l0aW9uXG5cdCAqL1xuXHRhdmVyYWdlOiBmdW5jdGlvbihlbGVtZW50cykge1xuXHRcdGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dmFyIGksIGxlbjtcblx0XHR2YXIgeCA9IDA7XG5cdFx0dmFyIHkgPSAwO1xuXHRcdHZhciBjb3VudCA9IDA7XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuXHRcdFx0dmFyIGVsID0gZWxlbWVudHNbaV07XG5cdFx0XHRpZiAoZWwgJiYgZWwuaGFzVmFsdWUoKSkge1xuXHRcdFx0XHR2YXIgcG9zID0gZWwudG9vbHRpcFBvc2l0aW9uKCk7XG5cdFx0XHRcdHggKz0gcG9zLng7XG5cdFx0XHRcdHkgKz0gcG9zLnk7XG5cdFx0XHRcdCsrY291bnQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IE1hdGgucm91bmQoeCAvIGNvdW50KSxcblx0XHRcdHk6IE1hdGgucm91bmQoeSAvIGNvdW50KVxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHRvb2x0aXAgcG9zaXRpb24gbmVhcmVzdCBvZiB0aGUgaXRlbSBuZWFyZXN0IHRvIHRoZSBldmVudCBwb3NpdGlvblxuXHQgKiBAZnVuY3Rpb24gQ2hhcnQuVG9vbHRpcC5wb3NpdGlvbmVycy5uZWFyZXN0XG5cdCAqIEBwYXJhbSBlbGVtZW50cyB7Q2hhcnQuRWxlbWVudFtdfSB0aGUgdG9vbHRpcCBlbGVtZW50c1xuXHQgKiBAcGFyYW0gZXZlbnRQb3NpdGlvbiB7UG9pbnR9IHRoZSBwb3NpdGlvbiBvZiB0aGUgZXZlbnQgaW4gY2FudmFzIGNvb3JkaW5hdGVzXG5cdCAqIEByZXR1cm5zIHtQb2ludH0gdGhlIHRvb2x0aXAgcG9zaXRpb25cblx0ICovXG5cdG5lYXJlc3Q6IGZ1bmN0aW9uKGVsZW1lbnRzLCBldmVudFBvc2l0aW9uKSB7XG5cdFx0dmFyIHggPSBldmVudFBvc2l0aW9uLng7XG5cdFx0dmFyIHkgPSBldmVudFBvc2l0aW9uLnk7XG5cdFx0dmFyIG1pbkRpc3RhbmNlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXHRcdHZhciBpLCBsZW4sIG5lYXJlc3RFbGVtZW50O1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcblx0XHRcdHZhciBlbCA9IGVsZW1lbnRzW2ldO1xuXHRcdFx0aWYgKGVsICYmIGVsLmhhc1ZhbHVlKCkpIHtcblx0XHRcdFx0dmFyIGNlbnRlciA9IGVsLmdldENlbnRlclBvaW50KCk7XG5cdFx0XHRcdHZhciBkID0gaGVscGVycy5kaXN0YW5jZUJldHdlZW5Qb2ludHMoZXZlbnRQb3NpdGlvbiwgY2VudGVyKTtcblxuXHRcdFx0XHRpZiAoZCA8IG1pbkRpc3RhbmNlKSB7XG5cdFx0XHRcdFx0bWluRGlzdGFuY2UgPSBkO1xuXHRcdFx0XHRcdG5lYXJlc3RFbGVtZW50ID0gZWw7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobmVhcmVzdEVsZW1lbnQpIHtcblx0XHRcdHZhciB0cCA9IG5lYXJlc3RFbGVtZW50LnRvb2x0aXBQb3NpdGlvbigpO1xuXHRcdFx0eCA9IHRwLng7XG5cdFx0XHR5ID0gdHAueTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0eDogeCxcblx0XHRcdHk6IHlcblx0XHR9O1xuXHR9XG59O1xuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgdG8gbWVyZ2UgdGhlIG9wYWNpdHkgaW50byBhIGNvbG9yXG4gKi9cbmZ1bmN0aW9uIG1lcmdlT3BhY2l0eShjb2xvclN0cmluZywgb3BhY2l0eSkge1xuXHR2YXIgY29sb3IgPSBoZWxwZXJzLmNvbG9yKGNvbG9yU3RyaW5nKTtcblx0cmV0dXJuIGNvbG9yLmFscGhhKG9wYWNpdHkgKiBjb2xvci5hbHBoYSgpKS5yZ2JhU3RyaW5nKCk7XG59XG5cbi8vIEhlbHBlciB0byBwdXNoIG9yIGNvbmNhdCBiYXNlZCBvbiBpZiB0aGUgMm5kIHBhcmFtZXRlciBpcyBhbiBhcnJheSBvciBub3RcbmZ1bmN0aW9uIHB1c2hPckNvbmNhdChiYXNlLCB0b1B1c2gpIHtcblx0aWYgKHRvUHVzaCkge1xuXHRcdGlmIChoZWxwZXJzLmlzQXJyYXkodG9QdXNoKSkge1xuXHRcdFx0Ly8gYmFzZSA9IGJhc2UuY29uY2F0KHRvUHVzaCk7XG5cdFx0XHRBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShiYXNlLCB0b1B1c2gpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRiYXNlLnB1c2godG9QdXNoKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYmFzZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IG9mIHN0cmluZ3Mgc3BsaXQgYnkgbmV3bGluZVxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNwbGl0IGJ5IG5ld2xpbmUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IHZhbHVlIGlmIG5ld2xpbmUgcHJlc2VudCAtIFJldHVybmVkIGZyb20gU3RyaW5nIHNwbGl0KCkgbWV0aG9kXG4gKiBAZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gc3BsaXROZXdsaW5lcyhzdHIpIHtcblx0aWYgKCh0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyB8fCBzdHIgaW5zdGFuY2VvZiBTdHJpbmcpICYmIHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIHN0ci5zcGxpdCgnXFxuJyk7XG5cdH1cblx0cmV0dXJuIHN0cjtcbn1cblxuXG4vLyBQcml2YXRlIGhlbHBlciB0byBjcmVhdGUgYSB0b29sdGlwIGl0ZW0gbW9kZWxcbi8vIEBwYXJhbSBlbGVtZW50IDogdGhlIGNoYXJ0IGVsZW1lbnQgKHBvaW50LCBhcmMsIGJhcikgdG8gY3JlYXRlIHRoZSB0b29sdGlwIGl0ZW0gZm9yXG4vLyBAcmV0dXJuIDogbmV3IHRvb2x0aXAgaXRlbVxuZnVuY3Rpb24gY3JlYXRlVG9vbHRpcEl0ZW0oZWxlbWVudCkge1xuXHR2YXIgeFNjYWxlID0gZWxlbWVudC5feFNjYWxlO1xuXHR2YXIgeVNjYWxlID0gZWxlbWVudC5feVNjYWxlIHx8IGVsZW1lbnQuX3NjYWxlOyAvLyBoYW5kbGUgcmFkYXIgfHwgcG9sYXJBcmVhIGNoYXJ0c1xuXHR2YXIgaW5kZXggPSBlbGVtZW50Ll9pbmRleDtcblx0dmFyIGRhdGFzZXRJbmRleCA9IGVsZW1lbnQuX2RhdGFzZXRJbmRleDtcblxuXHRyZXR1cm4ge1xuXHRcdHhMYWJlbDogeFNjYWxlID8geFNjYWxlLmdldExhYmVsRm9ySW5kZXgoaW5kZXgsIGRhdGFzZXRJbmRleCkgOiAnJyxcblx0XHR5TGFiZWw6IHlTY2FsZSA/IHlTY2FsZS5nZXRMYWJlbEZvckluZGV4KGluZGV4LCBkYXRhc2V0SW5kZXgpIDogJycsXG5cdFx0aW5kZXg6IGluZGV4LFxuXHRcdGRhdGFzZXRJbmRleDogZGF0YXNldEluZGV4LFxuXHRcdHg6IGVsZW1lbnQuX21vZGVsLngsXG5cdFx0eTogZWxlbWVudC5fbW9kZWwueVxuXHR9O1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgdGhlIHJlc2V0IG1vZGVsIGZvciB0aGUgdG9vbHRpcFxuICogQHBhcmFtIHRvb2x0aXBPcHRzIHtPYmplY3R9IHRoZSB0b29sdGlwIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gZ2V0QmFzZU1vZGVsKHRvb2x0aXBPcHRzKSB7XG5cdHZhciBnbG9iYWxEZWZhdWx0cyA9IGRlZmF1bHRzLmdsb2JhbDtcblx0dmFyIHZhbHVlT3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdDtcblxuXHRyZXR1cm4ge1xuXHRcdC8vIFBvc2l0aW9uaW5nXG5cdFx0eFBhZGRpbmc6IHRvb2x0aXBPcHRzLnhQYWRkaW5nLFxuXHRcdHlQYWRkaW5nOiB0b29sdGlwT3B0cy55UGFkZGluZyxcblx0XHR4QWxpZ246IHRvb2x0aXBPcHRzLnhBbGlnbixcblx0XHR5QWxpZ246IHRvb2x0aXBPcHRzLnlBbGlnbixcblxuXHRcdC8vIEJvZHlcblx0XHRib2R5Rm9udENvbG9yOiB0b29sdGlwT3B0cy5ib2R5Rm9udENvbG9yLFxuXHRcdF9ib2R5Rm9udEZhbWlseTogdmFsdWVPckRlZmF1bHQodG9vbHRpcE9wdHMuYm9keUZvbnRGYW1pbHksIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250RmFtaWx5KSxcblx0XHRfYm9keUZvbnRTdHlsZTogdmFsdWVPckRlZmF1bHQodG9vbHRpcE9wdHMuYm9keUZvbnRTdHlsZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTdHlsZSksXG5cdFx0X2JvZHlBbGlnbjogdG9vbHRpcE9wdHMuYm9keUFsaWduLFxuXHRcdGJvZHlGb250U2l6ZTogdmFsdWVPckRlZmF1bHQodG9vbHRpcE9wdHMuYm9keUZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpLFxuXHRcdGJvZHlTcGFjaW5nOiB0b29sdGlwT3B0cy5ib2R5U3BhY2luZyxcblxuXHRcdC8vIFRpdGxlXG5cdFx0dGl0bGVGb250Q29sb3I6IHRvb2x0aXBPcHRzLnRpdGxlRm9udENvbG9yLFxuXHRcdF90aXRsZUZvbnRGYW1pbHk6IHZhbHVlT3JEZWZhdWx0KHRvb2x0aXBPcHRzLnRpdGxlRm9udEZhbWlseSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRGYW1pbHkpLFxuXHRcdF90aXRsZUZvbnRTdHlsZTogdmFsdWVPckRlZmF1bHQodG9vbHRpcE9wdHMudGl0bGVGb250U3R5bGUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U3R5bGUpLFxuXHRcdHRpdGxlRm9udFNpemU6IHZhbHVlT3JEZWZhdWx0KHRvb2x0aXBPcHRzLnRpdGxlRm9udFNpemUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U2l6ZSksXG5cdFx0X3RpdGxlQWxpZ246IHRvb2x0aXBPcHRzLnRpdGxlQWxpZ24sXG5cdFx0dGl0bGVTcGFjaW5nOiB0b29sdGlwT3B0cy50aXRsZVNwYWNpbmcsXG5cdFx0dGl0bGVNYXJnaW5Cb3R0b206IHRvb2x0aXBPcHRzLnRpdGxlTWFyZ2luQm90dG9tLFxuXG5cdFx0Ly8gRm9vdGVyXG5cdFx0Zm9vdGVyRm9udENvbG9yOiB0b29sdGlwT3B0cy5mb290ZXJGb250Q29sb3IsXG5cdFx0X2Zvb3RlckZvbnRGYW1pbHk6IHZhbHVlT3JEZWZhdWx0KHRvb2x0aXBPcHRzLmZvb3RlckZvbnRGYW1pbHksIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250RmFtaWx5KSxcblx0XHRfZm9vdGVyRm9udFN0eWxlOiB2YWx1ZU9yRGVmYXVsdCh0b29sdGlwT3B0cy5mb290ZXJGb250U3R5bGUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U3R5bGUpLFxuXHRcdGZvb3RlckZvbnRTaXplOiB2YWx1ZU9yRGVmYXVsdCh0b29sdGlwT3B0cy5mb290ZXJGb250U2l6ZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTaXplKSxcblx0XHRfZm9vdGVyQWxpZ246IHRvb2x0aXBPcHRzLmZvb3RlckFsaWduLFxuXHRcdGZvb3RlclNwYWNpbmc6IHRvb2x0aXBPcHRzLmZvb3RlclNwYWNpbmcsXG5cdFx0Zm9vdGVyTWFyZ2luVG9wOiB0b29sdGlwT3B0cy5mb290ZXJNYXJnaW5Ub3AsXG5cblx0XHQvLyBBcHBlYXJhbmNlXG5cdFx0Y2FyZXRTaXplOiB0b29sdGlwT3B0cy5jYXJldFNpemUsXG5cdFx0Y29ybmVyUmFkaXVzOiB0b29sdGlwT3B0cy5jb3JuZXJSYWRpdXMsXG5cdFx0YmFja2dyb3VuZENvbG9yOiB0b29sdGlwT3B0cy5iYWNrZ3JvdW5kQ29sb3IsXG5cdFx0b3BhY2l0eTogMCxcblx0XHRsZWdlbmRDb2xvckJhY2tncm91bmQ6IHRvb2x0aXBPcHRzLm11bHRpS2V5QmFja2dyb3VuZCxcblx0XHRkaXNwbGF5Q29sb3JzOiB0b29sdGlwT3B0cy5kaXNwbGF5Q29sb3JzLFxuXHRcdGJvcmRlckNvbG9yOiB0b29sdGlwT3B0cy5ib3JkZXJDb2xvcixcblx0XHRib3JkZXJXaWR0aDogdG9vbHRpcE9wdHMuYm9yZGVyV2lkdGhcblx0fTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNpemUgb2YgdGhlIHRvb2x0aXBcbiAqL1xuZnVuY3Rpb24gZ2V0VG9vbHRpcFNpemUodG9vbHRpcCwgbW9kZWwpIHtcblx0dmFyIGN0eCA9IHRvb2x0aXAuX2NoYXJ0LmN0eDtcblxuXHR2YXIgaGVpZ2h0ID0gbW9kZWwueVBhZGRpbmcgKiAyOyAvLyBUb29sdGlwIFBhZGRpbmdcblx0dmFyIHdpZHRoID0gMDtcblxuXHQvLyBDb3VudCBvZiBhbGwgbGluZXMgaW4gdGhlIGJvZHlcblx0dmFyIGJvZHkgPSBtb2RlbC5ib2R5O1xuXHR2YXIgY29tYmluZWRCb2R5TGVuZ3RoID0gYm9keS5yZWR1Y2UoZnVuY3Rpb24oY291bnQsIGJvZHlJdGVtKSB7XG5cdFx0cmV0dXJuIGNvdW50ICsgYm9keUl0ZW0uYmVmb3JlLmxlbmd0aCArIGJvZHlJdGVtLmxpbmVzLmxlbmd0aCArIGJvZHlJdGVtLmFmdGVyLmxlbmd0aDtcblx0fSwgMCk7XG5cdGNvbWJpbmVkQm9keUxlbmd0aCArPSBtb2RlbC5iZWZvcmVCb2R5Lmxlbmd0aCArIG1vZGVsLmFmdGVyQm9keS5sZW5ndGg7XG5cblx0dmFyIHRpdGxlTGluZUNvdW50ID0gbW9kZWwudGl0bGUubGVuZ3RoO1xuXHR2YXIgZm9vdGVyTGluZUNvdW50ID0gbW9kZWwuZm9vdGVyLmxlbmd0aDtcblx0dmFyIHRpdGxlRm9udFNpemUgPSBtb2RlbC50aXRsZUZvbnRTaXplO1xuXHR2YXIgYm9keUZvbnRTaXplID0gbW9kZWwuYm9keUZvbnRTaXplO1xuXHR2YXIgZm9vdGVyRm9udFNpemUgPSBtb2RlbC5mb290ZXJGb250U2l6ZTtcblxuXHRoZWlnaHQgKz0gdGl0bGVMaW5lQ291bnQgKiB0aXRsZUZvbnRTaXplOyAvLyBUaXRsZSBMaW5lc1xuXHRoZWlnaHQgKz0gdGl0bGVMaW5lQ291bnQgPyAodGl0bGVMaW5lQ291bnQgLSAxKSAqIG1vZGVsLnRpdGxlU3BhY2luZyA6IDA7IC8vIFRpdGxlIExpbmUgU3BhY2luZ1xuXHRoZWlnaHQgKz0gdGl0bGVMaW5lQ291bnQgPyBtb2RlbC50aXRsZU1hcmdpbkJvdHRvbSA6IDA7IC8vIFRpdGxlJ3MgYm90dG9tIE1hcmdpblxuXHRoZWlnaHQgKz0gY29tYmluZWRCb2R5TGVuZ3RoICogYm9keUZvbnRTaXplOyAvLyBCb2R5IExpbmVzXG5cdGhlaWdodCArPSBjb21iaW5lZEJvZHlMZW5ndGggPyAoY29tYmluZWRCb2R5TGVuZ3RoIC0gMSkgKiBtb2RlbC5ib2R5U3BhY2luZyA6IDA7IC8vIEJvZHkgTGluZSBTcGFjaW5nXG5cdGhlaWdodCArPSBmb290ZXJMaW5lQ291bnQgPyBtb2RlbC5mb290ZXJNYXJnaW5Ub3AgOiAwOyAvLyBGb290ZXIgTWFyZ2luXG5cdGhlaWdodCArPSBmb290ZXJMaW5lQ291bnQgKiAoZm9vdGVyRm9udFNpemUpOyAvLyBGb290ZXIgTGluZXNcblx0aGVpZ2h0ICs9IGZvb3RlckxpbmVDb3VudCA/IChmb290ZXJMaW5lQ291bnQgLSAxKSAqIG1vZGVsLmZvb3RlclNwYWNpbmcgOiAwOyAvLyBGb290ZXIgTGluZSBTcGFjaW5nXG5cblx0Ly8gVGl0bGUgd2lkdGhcblx0dmFyIHdpZHRoUGFkZGluZyA9IDA7XG5cdHZhciBtYXhMaW5lV2lkdGggPSBmdW5jdGlvbihsaW5lKSB7XG5cdFx0d2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY3R4Lm1lYXN1cmVUZXh0KGxpbmUpLndpZHRoICsgd2lkdGhQYWRkaW5nKTtcblx0fTtcblxuXHRjdHguZm9udCA9IGhlbHBlcnMuZm9udFN0cmluZyh0aXRsZUZvbnRTaXplLCBtb2RlbC5fdGl0bGVGb250U3R5bGUsIG1vZGVsLl90aXRsZUZvbnRGYW1pbHkpO1xuXHRoZWxwZXJzLmVhY2gobW9kZWwudGl0bGUsIG1heExpbmVXaWR0aCk7XG5cblx0Ly8gQm9keSB3aWR0aFxuXHRjdHguZm9udCA9IGhlbHBlcnMuZm9udFN0cmluZyhib2R5Rm9udFNpemUsIG1vZGVsLl9ib2R5Rm9udFN0eWxlLCBtb2RlbC5fYm9keUZvbnRGYW1pbHkpO1xuXHRoZWxwZXJzLmVhY2gobW9kZWwuYmVmb3JlQm9keS5jb25jYXQobW9kZWwuYWZ0ZXJCb2R5KSwgbWF4TGluZVdpZHRoKTtcblxuXHQvLyBCb2R5IGxpbmVzIG1heSBpbmNsdWRlIHNvbWUgZXh0cmEgd2lkdGggZHVlIHRvIHRoZSBjb2xvciBib3hcblx0d2lkdGhQYWRkaW5nID0gbW9kZWwuZGlzcGxheUNvbG9ycyA/IChib2R5Rm9udFNpemUgKyAyKSA6IDA7XG5cdGhlbHBlcnMuZWFjaChib2R5LCBmdW5jdGlvbihib2R5SXRlbSkge1xuXHRcdGhlbHBlcnMuZWFjaChib2R5SXRlbS5iZWZvcmUsIG1heExpbmVXaWR0aCk7XG5cdFx0aGVscGVycy5lYWNoKGJvZHlJdGVtLmxpbmVzLCBtYXhMaW5lV2lkdGgpO1xuXHRcdGhlbHBlcnMuZWFjaChib2R5SXRlbS5hZnRlciwgbWF4TGluZVdpZHRoKTtcblx0fSk7XG5cblx0Ly8gUmVzZXQgYmFjayB0byAwXG5cdHdpZHRoUGFkZGluZyA9IDA7XG5cblx0Ly8gRm9vdGVyIHdpZHRoXG5cdGN0eC5mb250ID0gaGVscGVycy5mb250U3RyaW5nKGZvb3RlckZvbnRTaXplLCBtb2RlbC5fZm9vdGVyRm9udFN0eWxlLCBtb2RlbC5fZm9vdGVyRm9udEZhbWlseSk7XG5cdGhlbHBlcnMuZWFjaChtb2RlbC5mb290ZXIsIG1heExpbmVXaWR0aCk7XG5cblx0Ly8gQWRkIHBhZGRpbmdcblx0d2lkdGggKz0gMiAqIG1vZGVsLnhQYWRkaW5nO1xuXG5cdHJldHVybiB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0XG5cdH07XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCB0aGUgYWxpZ25tZW50IG9mIGEgdG9vbHRpcCBnaXZlbiB0aGUgc2l6ZVxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmVBbGlnbm1lbnQodG9vbHRpcCwgc2l6ZSkge1xuXHR2YXIgbW9kZWwgPSB0b29sdGlwLl9tb2RlbDtcblx0dmFyIGNoYXJ0ID0gdG9vbHRpcC5fY2hhcnQ7XG5cdHZhciBjaGFydEFyZWEgPSB0b29sdGlwLl9jaGFydC5jaGFydEFyZWE7XG5cdHZhciB4QWxpZ24gPSAnY2VudGVyJztcblx0dmFyIHlBbGlnbiA9ICdjZW50ZXInO1xuXG5cdGlmIChtb2RlbC55IDwgc2l6ZS5oZWlnaHQpIHtcblx0XHR5QWxpZ24gPSAndG9wJztcblx0fSBlbHNlIGlmIChtb2RlbC55ID4gKGNoYXJ0LmhlaWdodCAtIHNpemUuaGVpZ2h0KSkge1xuXHRcdHlBbGlnbiA9ICdib3R0b20nO1xuXHR9XG5cblx0dmFyIGxmLCByZjsgLy8gZnVuY3Rpb25zIHRvIGRldGVybWluZSBsZWZ0LCByaWdodCBhbGlnbm1lbnRcblx0dmFyIG9sZiwgb3JmOyAvLyBmdW5jdGlvbnMgdG8gZGV0ZXJtaW5lIGlmIGxlZnQvcmlnaHQgYWxpZ25tZW50IGNhdXNlcyB0b29sdGlwIHRvIGdvIG91dHNpZGUgY2hhcnRcblx0dmFyIHlmOyAvLyBmdW5jdGlvbiB0byBnZXQgdGhlIHkgYWxpZ25tZW50IGlmIHRoZSB0b29sdGlwIGdvZXMgb3V0c2lkZSBvZiB0aGUgbGVmdCBvciByaWdodCBlZGdlc1xuXHR2YXIgbWlkWCA9IChjaGFydEFyZWEubGVmdCArIGNoYXJ0QXJlYS5yaWdodCkgLyAyO1xuXHR2YXIgbWlkWSA9IChjaGFydEFyZWEudG9wICsgY2hhcnRBcmVhLmJvdHRvbSkgLyAyO1xuXG5cdGlmICh5QWxpZ24gPT09ICdjZW50ZXInKSB7XG5cdFx0bGYgPSBmdW5jdGlvbih4KSB7XG5cdFx0XHRyZXR1cm4geCA8PSBtaWRYO1xuXHRcdH07XG5cdFx0cmYgPSBmdW5jdGlvbih4KSB7XG5cdFx0XHRyZXR1cm4geCA+IG1pZFg7XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRsZiA9IGZ1bmN0aW9uKHgpIHtcblx0XHRcdHJldHVybiB4IDw9IChzaXplLndpZHRoIC8gMik7XG5cdFx0fTtcblx0XHRyZiA9IGZ1bmN0aW9uKHgpIHtcblx0XHRcdHJldHVybiB4ID49IChjaGFydC53aWR0aCAtIChzaXplLndpZHRoIC8gMikpO1xuXHRcdH07XG5cdH1cblxuXHRvbGYgPSBmdW5jdGlvbih4KSB7XG5cdFx0cmV0dXJuIHggKyBzaXplLndpZHRoICsgbW9kZWwuY2FyZXRTaXplICsgbW9kZWwuY2FyZXRQYWRkaW5nID4gY2hhcnQud2lkdGg7XG5cdH07XG5cdG9yZiA9IGZ1bmN0aW9uKHgpIHtcblx0XHRyZXR1cm4geCAtIHNpemUud2lkdGggLSBtb2RlbC5jYXJldFNpemUgLSBtb2RlbC5jYXJldFBhZGRpbmcgPCAwO1xuXHR9O1xuXHR5ZiA9IGZ1bmN0aW9uKHkpIHtcblx0XHRyZXR1cm4geSA8PSBtaWRZID8gJ3RvcCcgOiAnYm90dG9tJztcblx0fTtcblxuXHRpZiAobGYobW9kZWwueCkpIHtcblx0XHR4QWxpZ24gPSAnbGVmdCc7XG5cblx0XHQvLyBJcyB0b29sdGlwIHRvbyB3aWRlIGFuZCBnb2VzIG92ZXIgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNoYXJ0Lj9cblx0XHRpZiAob2xmKG1vZGVsLngpKSB7XG5cdFx0XHR4QWxpZ24gPSAnY2VudGVyJztcblx0XHRcdHlBbGlnbiA9IHlmKG1vZGVsLnkpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChyZihtb2RlbC54KSkge1xuXHRcdHhBbGlnbiA9ICdyaWdodCc7XG5cblx0XHQvLyBJcyB0b29sdGlwIHRvbyB3aWRlIGFuZCBnb2VzIG91dHNpZGUgbGVmdCBlZGdlIG9mIGNhbnZhcz9cblx0XHRpZiAob3JmKG1vZGVsLngpKSB7XG5cdFx0XHR4QWxpZ24gPSAnY2VudGVyJztcblx0XHRcdHlBbGlnbiA9IHlmKG1vZGVsLnkpO1xuXHRcdH1cblx0fVxuXG5cdHZhciBvcHRzID0gdG9vbHRpcC5fb3B0aW9ucztcblx0cmV0dXJuIHtcblx0XHR4QWxpZ246IG9wdHMueEFsaWduID8gb3B0cy54QWxpZ24gOiB4QWxpZ24sXG5cdFx0eUFsaWduOiBvcHRzLnlBbGlnbiA/IG9wdHMueUFsaWduIDogeUFsaWduXG5cdH07XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCB0aGUgbG9jYXRpb24gYSB0b29sdGlwIG5lZWRzIHRvIGJlIHBsYWNlZCBhdCBnaXZlbiB0aGUgaW5pdGlhbCBwb3NpdGlvbiAodmlhIHRoZSB2bSkgYW5kIHRoZSBzaXplIGFuZCBhbGlnbm1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0QmFja2dyb3VuZFBvaW50KHZtLCBzaXplLCBhbGlnbm1lbnQsIGNoYXJ0KSB7XG5cdC8vIEJhY2tncm91bmQgUG9zaXRpb25cblx0dmFyIHggPSB2bS54O1xuXHR2YXIgeSA9IHZtLnk7XG5cblx0dmFyIGNhcmV0U2l6ZSA9IHZtLmNhcmV0U2l6ZTtcblx0dmFyIGNhcmV0UGFkZGluZyA9IHZtLmNhcmV0UGFkZGluZztcblx0dmFyIGNvcm5lclJhZGl1cyA9IHZtLmNvcm5lclJhZGl1cztcblx0dmFyIHhBbGlnbiA9IGFsaWdubWVudC54QWxpZ247XG5cdHZhciB5QWxpZ24gPSBhbGlnbm1lbnQueUFsaWduO1xuXHR2YXIgcGFkZGluZ0FuZFNpemUgPSBjYXJldFNpemUgKyBjYXJldFBhZGRpbmc7XG5cdHZhciByYWRpdXNBbmRQYWRkaW5nID0gY29ybmVyUmFkaXVzICsgY2FyZXRQYWRkaW5nO1xuXG5cdGlmICh4QWxpZ24gPT09ICdyaWdodCcpIHtcblx0XHR4IC09IHNpemUud2lkdGg7XG5cdH0gZWxzZSBpZiAoeEFsaWduID09PSAnY2VudGVyJykge1xuXHRcdHggLT0gKHNpemUud2lkdGggLyAyKTtcblx0XHRpZiAoeCArIHNpemUud2lkdGggPiBjaGFydC53aWR0aCkge1xuXHRcdFx0eCA9IGNoYXJ0LndpZHRoIC0gc2l6ZS53aWR0aDtcblx0XHR9XG5cdFx0aWYgKHggPCAwKSB7XG5cdFx0XHR4ID0gMDtcblx0XHR9XG5cdH1cblxuXHRpZiAoeUFsaWduID09PSAndG9wJykge1xuXHRcdHkgKz0gcGFkZGluZ0FuZFNpemU7XG5cdH0gZWxzZSBpZiAoeUFsaWduID09PSAnYm90dG9tJykge1xuXHRcdHkgLT0gc2l6ZS5oZWlnaHQgKyBwYWRkaW5nQW5kU2l6ZTtcblx0fSBlbHNlIHtcblx0XHR5IC09IChzaXplLmhlaWdodCAvIDIpO1xuXHR9XG5cblx0aWYgKHlBbGlnbiA9PT0gJ2NlbnRlcicpIHtcblx0XHRpZiAoeEFsaWduID09PSAnbGVmdCcpIHtcblx0XHRcdHggKz0gcGFkZGluZ0FuZFNpemU7XG5cdFx0fSBlbHNlIGlmICh4QWxpZ24gPT09ICdyaWdodCcpIHtcblx0XHRcdHggLT0gcGFkZGluZ0FuZFNpemU7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKHhBbGlnbiA9PT0gJ2xlZnQnKSB7XG5cdFx0eCAtPSByYWRpdXNBbmRQYWRkaW5nO1xuXHR9IGVsc2UgaWYgKHhBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuXHRcdHggKz0gcmFkaXVzQW5kUGFkZGluZztcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0eDogeCxcblx0XHR5OiB5XG5cdH07XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGJ1aWxkIGJlZm9yZSBhbmQgYWZ0ZXIgYm9keSBsaW5lc1xuICovXG5mdW5jdGlvbiBnZXRCZWZvcmVBZnRlckJvZHlMaW5lcyhjYWxsYmFjaykge1xuXHRyZXR1cm4gcHVzaE9yQ29uY2F0KFtdLCBzcGxpdE5ld2xpbmVzKGNhbGxiYWNrKSk7XG59XG5cbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBFbGVtZW50LmV4dGVuZCh7XG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuX21vZGVsID0gZ2V0QmFzZU1vZGVsKHRoaXMuX29wdGlvbnMpO1xuXHRcdHRoaXMuX2xhc3RBY3RpdmUgPSBbXTtcblx0fSxcblxuXHQvLyBHZXQgdGhlIHRpdGxlXG5cdC8vIEFyZ3MgYXJlOiAodG9vbHRpcEl0ZW0sIGRhdGEpXG5cdGdldFRpdGxlOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRzID0gbWUuX29wdGlvbnM7XG5cdFx0dmFyIGNhbGxiYWNrcyA9IG9wdHMuY2FsbGJhY2tzO1xuXG5cdFx0dmFyIGJlZm9yZVRpdGxlID0gY2FsbGJhY2tzLmJlZm9yZVRpdGxlLmFwcGx5KG1lLCBhcmd1bWVudHMpO1xuXHRcdHZhciB0aXRsZSA9IGNhbGxiYWNrcy50aXRsZS5hcHBseShtZSwgYXJndW1lbnRzKTtcblx0XHR2YXIgYWZ0ZXJUaXRsZSA9IGNhbGxiYWNrcy5hZnRlclRpdGxlLmFwcGx5KG1lLCBhcmd1bWVudHMpO1xuXG5cdFx0dmFyIGxpbmVzID0gW107XG5cdFx0bGluZXMgPSBwdXNoT3JDb25jYXQobGluZXMsIHNwbGl0TmV3bGluZXMoYmVmb3JlVGl0bGUpKTtcblx0XHRsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyh0aXRsZSkpO1xuXHRcdGxpbmVzID0gcHVzaE9yQ29uY2F0KGxpbmVzLCBzcGxpdE5ld2xpbmVzKGFmdGVyVGl0bGUpKTtcblxuXHRcdHJldHVybiBsaW5lcztcblx0fSxcblxuXHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtLCBkYXRhKVxuXHRnZXRCZWZvcmVCb2R5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZ2V0QmVmb3JlQWZ0ZXJCb2R5TGluZXModGhpcy5fb3B0aW9ucy5jYWxsYmFja3MuYmVmb3JlQm9keS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcblx0fSxcblxuXHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtLCBkYXRhKVxuXHRnZXRCb2R5OiBmdW5jdGlvbih0b29sdGlwSXRlbXMsIGRhdGEpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjYWxsYmFja3MgPSBtZS5fb3B0aW9ucy5jYWxsYmFja3M7XG5cdFx0dmFyIGJvZHlJdGVtcyA9IFtdO1xuXG5cdFx0aGVscGVycy5lYWNoKHRvb2x0aXBJdGVtcywgZnVuY3Rpb24odG9vbHRpcEl0ZW0pIHtcblx0XHRcdHZhciBib2R5SXRlbSA9IHtcblx0XHRcdFx0YmVmb3JlOiBbXSxcblx0XHRcdFx0bGluZXM6IFtdLFxuXHRcdFx0XHRhZnRlcjogW11cblx0XHRcdH07XG5cdFx0XHRwdXNoT3JDb25jYXQoYm9keUl0ZW0uYmVmb3JlLCBzcGxpdE5ld2xpbmVzKGNhbGxiYWNrcy5iZWZvcmVMYWJlbC5jYWxsKG1lLCB0b29sdGlwSXRlbSwgZGF0YSkpKTtcblx0XHRcdHB1c2hPckNvbmNhdChib2R5SXRlbS5saW5lcywgY2FsbGJhY2tzLmxhYmVsLmNhbGwobWUsIHRvb2x0aXBJdGVtLCBkYXRhKSk7XG5cdFx0XHRwdXNoT3JDb25jYXQoYm9keUl0ZW0uYWZ0ZXIsIHNwbGl0TmV3bGluZXMoY2FsbGJhY2tzLmFmdGVyTGFiZWwuY2FsbChtZSwgdG9vbHRpcEl0ZW0sIGRhdGEpKSk7XG5cblx0XHRcdGJvZHlJdGVtcy5wdXNoKGJvZHlJdGVtKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBib2R5SXRlbXM7XG5cdH0sXG5cblx0Ly8gQXJncyBhcmU6ICh0b29sdGlwSXRlbSwgZGF0YSlcblx0Z2V0QWZ0ZXJCb2R5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZ2V0QmVmb3JlQWZ0ZXJCb2R5TGluZXModGhpcy5fb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXJCb2R5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgZm9vdGVyIGFuZCBiZWZvcmVGb290ZXIgYW5kIGFmdGVyRm9vdGVyIGxpbmVzXG5cdC8vIEFyZ3MgYXJlOiAodG9vbHRpcEl0ZW0sIGRhdGEpXG5cdGdldEZvb3RlcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgY2FsbGJhY2tzID0gbWUuX29wdGlvbnMuY2FsbGJhY2tzO1xuXG5cdFx0dmFyIGJlZm9yZUZvb3RlciA9IGNhbGxiYWNrcy5iZWZvcmVGb290ZXIuYXBwbHkobWUsIGFyZ3VtZW50cyk7XG5cdFx0dmFyIGZvb3RlciA9IGNhbGxiYWNrcy5mb290ZXIuYXBwbHkobWUsIGFyZ3VtZW50cyk7XG5cdFx0dmFyIGFmdGVyRm9vdGVyID0gY2FsbGJhY2tzLmFmdGVyRm9vdGVyLmFwcGx5KG1lLCBhcmd1bWVudHMpO1xuXG5cdFx0dmFyIGxpbmVzID0gW107XG5cdFx0bGluZXMgPSBwdXNoT3JDb25jYXQobGluZXMsIHNwbGl0TmV3bGluZXMoYmVmb3JlRm9vdGVyKSk7XG5cdFx0bGluZXMgPSBwdXNoT3JDb25jYXQobGluZXMsIHNwbGl0TmV3bGluZXMoZm9vdGVyKSk7XG5cdFx0bGluZXMgPSBwdXNoT3JDb25jYXQobGluZXMsIHNwbGl0TmV3bGluZXMoYWZ0ZXJGb290ZXIpKTtcblxuXHRcdHJldHVybiBsaW5lcztcblx0fSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uKGNoYW5nZWQpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRzID0gbWUuX29wdGlvbnM7XG5cblx0XHQvLyBOZWVkIHRvIHJlZ2VuZXJhdGUgdGhlIG1vZGVsIGJlY2F1c2UgaXRzIGZhc3RlciB0aGFuIHVzaW5nIGV4dGVuZCBhbmQgaXQgaXMgbmVjZXNzYXJ5IGR1ZSB0byB0aGUgb3B0aW1pemF0aW9uIGluIENoYXJ0LkVsZW1lbnQudHJhbnNpdGlvblxuXHRcdC8vIHRoYXQgZG9lcyBfdmlldyA9IF9tb2RlbCBpZiBlYXNlID09PSAxLiBUaGlzIGNhdXNlcyB0aGUgMm5kIHRvb2x0aXAgdXBkYXRlIHRvIHNldCBwcm9wZXJ0aWVzIGluIGJvdGggdGhlIHZpZXcgYW5kIG1vZGVsIGF0IHRoZSBzYW1lIHRpbWVcblx0XHQvLyB3aGljaCBicmVha3MgYW55IGFuaW1hdGlvbnMuXG5cdFx0dmFyIGV4aXN0aW5nTW9kZWwgPSBtZS5fbW9kZWw7XG5cdFx0dmFyIG1vZGVsID0gbWUuX21vZGVsID0gZ2V0QmFzZU1vZGVsKG9wdHMpO1xuXHRcdHZhciBhY3RpdmUgPSBtZS5fYWN0aXZlO1xuXG5cdFx0dmFyIGRhdGEgPSBtZS5fZGF0YTtcblxuXHRcdC8vIEluIHRoZSBjYXNlIHdoZXJlIGFjdGl2ZS5sZW5ndGggPT09IDAgd2UgbmVlZCB0byBrZWVwIHRoZXNlIGF0IGV4aXN0aW5nIHZhbHVlcyBmb3IgZ29vZCBhbmltYXRpb25zXG5cdFx0dmFyIGFsaWdubWVudCA9IHtcblx0XHRcdHhBbGlnbjogZXhpc3RpbmdNb2RlbC54QWxpZ24sXG5cdFx0XHR5QWxpZ246IGV4aXN0aW5nTW9kZWwueUFsaWduXG5cdFx0fTtcblx0XHR2YXIgYmFja2dyb3VuZFBvaW50ID0ge1xuXHRcdFx0eDogZXhpc3RpbmdNb2RlbC54LFxuXHRcdFx0eTogZXhpc3RpbmdNb2RlbC55XG5cdFx0fTtcblx0XHR2YXIgdG9vbHRpcFNpemUgPSB7XG5cdFx0XHR3aWR0aDogZXhpc3RpbmdNb2RlbC53aWR0aCxcblx0XHRcdGhlaWdodDogZXhpc3RpbmdNb2RlbC5oZWlnaHRcblx0XHR9O1xuXHRcdHZhciB0b29sdGlwUG9zaXRpb24gPSB7XG5cdFx0XHR4OiBleGlzdGluZ01vZGVsLmNhcmV0WCxcblx0XHRcdHk6IGV4aXN0aW5nTW9kZWwuY2FyZXRZXG5cdFx0fTtcblxuXHRcdHZhciBpLCBsZW47XG5cblx0XHRpZiAoYWN0aXZlLmxlbmd0aCkge1xuXHRcdFx0bW9kZWwub3BhY2l0eSA9IDE7XG5cblx0XHRcdHZhciBsYWJlbENvbG9ycyA9IFtdO1xuXHRcdFx0dmFyIGxhYmVsVGV4dENvbG9ycyA9IFtdO1xuXHRcdFx0dG9vbHRpcFBvc2l0aW9uID0gcG9zaXRpb25lcnNbb3B0cy5wb3NpdGlvbl0uY2FsbChtZSwgYWN0aXZlLCBtZS5fZXZlbnRQb3NpdGlvbik7XG5cblx0XHRcdHZhciB0b29sdGlwSXRlbXMgPSBbXTtcblx0XHRcdGZvciAoaSA9IDAsIGxlbiA9IGFjdGl2ZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuXHRcdFx0XHR0b29sdGlwSXRlbXMucHVzaChjcmVhdGVUb29sdGlwSXRlbShhY3RpdmVbaV0pKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgdGhlIHVzZXIgcHJvdmlkZWQgYSBmaWx0ZXIgZnVuY3Rpb24sIHVzZSBpdCB0byBtb2RpZnkgdGhlIHRvb2x0aXAgaXRlbXNcblx0XHRcdGlmIChvcHRzLmZpbHRlcikge1xuXHRcdFx0XHR0b29sdGlwSXRlbXMgPSB0b29sdGlwSXRlbXMuZmlsdGVyKGZ1bmN0aW9uKGEpIHtcblx0XHRcdFx0XHRyZXR1cm4gb3B0cy5maWx0ZXIoYSwgZGF0YSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGUgdXNlciBwcm92aWRlZCBhIHNvcnRpbmcgZnVuY3Rpb24sIHVzZSBpdCB0byBtb2RpZnkgdGhlIHRvb2x0aXAgaXRlbXNcblx0XHRcdGlmIChvcHRzLml0ZW1Tb3J0KSB7XG5cdFx0XHRcdHRvb2x0aXBJdGVtcyA9IHRvb2x0aXBJdGVtcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcblx0XHRcdFx0XHRyZXR1cm4gb3B0cy5pdGVtU29ydChhLCBiLCBkYXRhKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERldGVybWluZSBjb2xvcnMgZm9yIGJveGVzXG5cdFx0XHRoZWxwZXJzLmVhY2godG9vbHRpcEl0ZW1zLCBmdW5jdGlvbih0b29sdGlwSXRlbSkge1xuXHRcdFx0XHRsYWJlbENvbG9ycy5wdXNoKG9wdHMuY2FsbGJhY2tzLmxhYmVsQ29sb3IuY2FsbChtZSwgdG9vbHRpcEl0ZW0sIG1lLl9jaGFydCkpO1xuXHRcdFx0XHRsYWJlbFRleHRDb2xvcnMucHVzaChvcHRzLmNhbGxiYWNrcy5sYWJlbFRleHRDb2xvci5jYWxsKG1lLCB0b29sdGlwSXRlbSwgbWUuX2NoYXJ0KSk7XG5cdFx0XHR9KTtcblxuXG5cdFx0XHQvLyBCdWlsZCB0aGUgVGV4dCBMaW5lc1xuXHRcdFx0bW9kZWwudGl0bGUgPSBtZS5nZXRUaXRsZSh0b29sdGlwSXRlbXMsIGRhdGEpO1xuXHRcdFx0bW9kZWwuYmVmb3JlQm9keSA9IG1lLmdldEJlZm9yZUJvZHkodG9vbHRpcEl0ZW1zLCBkYXRhKTtcblx0XHRcdG1vZGVsLmJvZHkgPSBtZS5nZXRCb2R5KHRvb2x0aXBJdGVtcywgZGF0YSk7XG5cdFx0XHRtb2RlbC5hZnRlckJvZHkgPSBtZS5nZXRBZnRlckJvZHkodG9vbHRpcEl0ZW1zLCBkYXRhKTtcblx0XHRcdG1vZGVsLmZvb3RlciA9IG1lLmdldEZvb3Rlcih0b29sdGlwSXRlbXMsIGRhdGEpO1xuXG5cdFx0XHQvLyBJbml0aWFsIHBvc2l0aW9uaW5nIGFuZCBjb2xvcnNcblx0XHRcdG1vZGVsLnggPSBNYXRoLnJvdW5kKHRvb2x0aXBQb3NpdGlvbi54KTtcblx0XHRcdG1vZGVsLnkgPSBNYXRoLnJvdW5kKHRvb2x0aXBQb3NpdGlvbi55KTtcblx0XHRcdG1vZGVsLmNhcmV0UGFkZGluZyA9IG9wdHMuY2FyZXRQYWRkaW5nO1xuXHRcdFx0bW9kZWwubGFiZWxDb2xvcnMgPSBsYWJlbENvbG9ycztcblx0XHRcdG1vZGVsLmxhYmVsVGV4dENvbG9ycyA9IGxhYmVsVGV4dENvbG9ycztcblxuXHRcdFx0Ly8gZGF0YSBwb2ludHNcblx0XHRcdG1vZGVsLmRhdGFQb2ludHMgPSB0b29sdGlwSXRlbXM7XG5cblx0XHRcdC8vIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIGFsaWdubWVudCBvZiB0aGUgdG9vbHRpcFxuXHRcdFx0dG9vbHRpcFNpemUgPSBnZXRUb29sdGlwU2l6ZSh0aGlzLCBtb2RlbCk7XG5cdFx0XHRhbGlnbm1lbnQgPSBkZXRlcm1pbmVBbGlnbm1lbnQodGhpcywgdG9vbHRpcFNpemUpO1xuXHRcdFx0Ly8gRmluYWwgU2l6ZSBhbmQgUG9zaXRpb25cblx0XHRcdGJhY2tncm91bmRQb2ludCA9IGdldEJhY2tncm91bmRQb2ludChtb2RlbCwgdG9vbHRpcFNpemUsIGFsaWdubWVudCwgbWUuX2NoYXJ0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bW9kZWwub3BhY2l0eSA9IDA7XG5cdFx0fVxuXG5cdFx0bW9kZWwueEFsaWduID0gYWxpZ25tZW50LnhBbGlnbjtcblx0XHRtb2RlbC55QWxpZ24gPSBhbGlnbm1lbnQueUFsaWduO1xuXHRcdG1vZGVsLnggPSBiYWNrZ3JvdW5kUG9pbnQueDtcblx0XHRtb2RlbC55ID0gYmFja2dyb3VuZFBvaW50Lnk7XG5cdFx0bW9kZWwud2lkdGggPSB0b29sdGlwU2l6ZS53aWR0aDtcblx0XHRtb2RlbC5oZWlnaHQgPSB0b29sdGlwU2l6ZS5oZWlnaHQ7XG5cblx0XHQvLyBQb2ludCB3aGVyZSB0aGUgY2FyZXQgb24gdGhlIHRvb2x0aXAgcG9pbnRzIHRvXG5cdFx0bW9kZWwuY2FyZXRYID0gdG9vbHRpcFBvc2l0aW9uLng7XG5cdFx0bW9kZWwuY2FyZXRZID0gdG9vbHRpcFBvc2l0aW9uLnk7XG5cblx0XHRtZS5fbW9kZWwgPSBtb2RlbDtcblxuXHRcdGlmIChjaGFuZ2VkICYmIG9wdHMuY3VzdG9tKSB7XG5cdFx0XHRvcHRzLmN1c3RvbS5jYWxsKG1lLCBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1lO1xuXHR9LFxuXG5cdGRyYXdDYXJldDogZnVuY3Rpb24odG9vbHRpcFBvaW50LCBzaXplKSB7XG5cdFx0dmFyIGN0eCA9IHRoaXMuX2NoYXJ0LmN0eDtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHZhciBjYXJldFBvc2l0aW9uID0gdGhpcy5nZXRDYXJldFBvc2l0aW9uKHRvb2x0aXBQb2ludCwgc2l6ZSwgdm0pO1xuXG5cdFx0Y3R4LmxpbmVUbyhjYXJldFBvc2l0aW9uLngxLCBjYXJldFBvc2l0aW9uLnkxKTtcblx0XHRjdHgubGluZVRvKGNhcmV0UG9zaXRpb24ueDIsIGNhcmV0UG9zaXRpb24ueTIpO1xuXHRcdGN0eC5saW5lVG8oY2FyZXRQb3NpdGlvbi54MywgY2FyZXRQb3NpdGlvbi55Myk7XG5cdH0sXG5cdGdldENhcmV0UG9zaXRpb246IGZ1bmN0aW9uKHRvb2x0aXBQb2ludCwgc2l6ZSwgdm0pIHtcblx0XHR2YXIgeDEsIHgyLCB4MywgeTEsIHkyLCB5Mztcblx0XHR2YXIgY2FyZXRTaXplID0gdm0uY2FyZXRTaXplO1xuXHRcdHZhciBjb3JuZXJSYWRpdXMgPSB2bS5jb3JuZXJSYWRpdXM7XG5cdFx0dmFyIHhBbGlnbiA9IHZtLnhBbGlnbjtcblx0XHR2YXIgeUFsaWduID0gdm0ueUFsaWduO1xuXHRcdHZhciBwdFggPSB0b29sdGlwUG9pbnQueDtcblx0XHR2YXIgcHRZID0gdG9vbHRpcFBvaW50Lnk7XG5cdFx0dmFyIHdpZHRoID0gc2l6ZS53aWR0aDtcblx0XHR2YXIgaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XG5cblx0XHRpZiAoeUFsaWduID09PSAnY2VudGVyJykge1xuXHRcdFx0eTIgPSBwdFkgKyAoaGVpZ2h0IC8gMik7XG5cblx0XHRcdGlmICh4QWxpZ24gPT09ICdsZWZ0Jykge1xuXHRcdFx0XHR4MSA9IHB0WDtcblx0XHRcdFx0eDIgPSB4MSAtIGNhcmV0U2l6ZTtcblx0XHRcdFx0eDMgPSB4MTtcblxuXHRcdFx0XHR5MSA9IHkyICsgY2FyZXRTaXplO1xuXHRcdFx0XHR5MyA9IHkyIC0gY2FyZXRTaXplO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0eDEgPSBwdFggKyB3aWR0aDtcblx0XHRcdFx0eDIgPSB4MSArIGNhcmV0U2l6ZTtcblx0XHRcdFx0eDMgPSB4MTtcblxuXHRcdFx0XHR5MSA9IHkyIC0gY2FyZXRTaXplO1xuXHRcdFx0XHR5MyA9IHkyICsgY2FyZXRTaXplO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoeEFsaWduID09PSAnbGVmdCcpIHtcblx0XHRcdFx0eDIgPSBwdFggKyBjb3JuZXJSYWRpdXMgKyAoY2FyZXRTaXplKTtcblx0XHRcdFx0eDEgPSB4MiAtIGNhcmV0U2l6ZTtcblx0XHRcdFx0eDMgPSB4MiArIGNhcmV0U2l6ZTtcblx0XHRcdH0gZWxzZSBpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG5cdFx0XHRcdHgyID0gcHRYICsgd2lkdGggLSBjb3JuZXJSYWRpdXMgLSBjYXJldFNpemU7XG5cdFx0XHRcdHgxID0geDIgLSBjYXJldFNpemU7XG5cdFx0XHRcdHgzID0geDIgKyBjYXJldFNpemU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR4MiA9IHZtLmNhcmV0WDtcblx0XHRcdFx0eDEgPSB4MiAtIGNhcmV0U2l6ZTtcblx0XHRcdFx0eDMgPSB4MiArIGNhcmV0U2l6ZTtcblx0XHRcdH1cblx0XHRcdGlmICh5QWxpZ24gPT09ICd0b3AnKSB7XG5cdFx0XHRcdHkxID0gcHRZO1xuXHRcdFx0XHR5MiA9IHkxIC0gY2FyZXRTaXplO1xuXHRcdFx0XHR5MyA9IHkxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0eTEgPSBwdFkgKyBoZWlnaHQ7XG5cdFx0XHRcdHkyID0geTEgKyBjYXJldFNpemU7XG5cdFx0XHRcdHkzID0geTE7XG5cdFx0XHRcdC8vIGludmVydCBkcmF3aW5nIG9yZGVyXG5cdFx0XHRcdHZhciB0bXAgPSB4Mztcblx0XHRcdFx0eDMgPSB4MTtcblx0XHRcdFx0eDEgPSB0bXA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7eDE6IHgxLCB4MjogeDIsIHgzOiB4MywgeTE6IHkxLCB5MjogeTIsIHkzOiB5M307XG5cdH0sXG5cblx0ZHJhd1RpdGxlOiBmdW5jdGlvbihwdCwgdm0sIGN0eCwgb3BhY2l0eSkge1xuXHRcdHZhciB0aXRsZSA9IHZtLnRpdGxlO1xuXG5cdFx0aWYgKHRpdGxlLmxlbmd0aCkge1xuXHRcdFx0Y3R4LnRleHRBbGlnbiA9IHZtLl90aXRsZUFsaWduO1xuXHRcdFx0Y3R4LnRleHRCYXNlbGluZSA9ICd0b3AnO1xuXG5cdFx0XHR2YXIgdGl0bGVGb250U2l6ZSA9IHZtLnRpdGxlRm9udFNpemU7XG5cdFx0XHR2YXIgdGl0bGVTcGFjaW5nID0gdm0udGl0bGVTcGFjaW5nO1xuXG5cdFx0XHRjdHguZmlsbFN0eWxlID0gbWVyZ2VPcGFjaXR5KHZtLnRpdGxlRm9udENvbG9yLCBvcGFjaXR5KTtcblx0XHRcdGN0eC5mb250ID0gaGVscGVycy5mb250U3RyaW5nKHRpdGxlRm9udFNpemUsIHZtLl90aXRsZUZvbnRTdHlsZSwgdm0uX3RpdGxlRm9udEZhbWlseSk7XG5cblx0XHRcdHZhciBpLCBsZW47XG5cdFx0XHRmb3IgKGkgPSAwLCBsZW4gPSB0aXRsZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuXHRcdFx0XHRjdHguZmlsbFRleHQodGl0bGVbaV0sIHB0LngsIHB0LnkpO1xuXHRcdFx0XHRwdC55ICs9IHRpdGxlRm9udFNpemUgKyB0aXRsZVNwYWNpbmc7IC8vIExpbmUgSGVpZ2h0IGFuZCBzcGFjaW5nXG5cblx0XHRcdFx0aWYgKGkgKyAxID09PSB0aXRsZS5sZW5ndGgpIHtcblx0XHRcdFx0XHRwdC55ICs9IHZtLnRpdGxlTWFyZ2luQm90dG9tIC0gdGl0bGVTcGFjaW5nOyAvLyBJZiBMYXN0LCBhZGQgbWFyZ2luLCByZW1vdmUgc3BhY2luZ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdGRyYXdCb2R5OiBmdW5jdGlvbihwdCwgdm0sIGN0eCwgb3BhY2l0eSkge1xuXHRcdHZhciBib2R5Rm9udFNpemUgPSB2bS5ib2R5Rm9udFNpemU7XG5cdFx0dmFyIGJvZHlTcGFjaW5nID0gdm0uYm9keVNwYWNpbmc7XG5cdFx0dmFyIGJvZHkgPSB2bS5ib2R5O1xuXG5cdFx0Y3R4LnRleHRBbGlnbiA9IHZtLl9ib2R5QWxpZ247XG5cdFx0Y3R4LnRleHRCYXNlbGluZSA9ICd0b3AnO1xuXHRcdGN0eC5mb250ID0gaGVscGVycy5mb250U3RyaW5nKGJvZHlGb250U2l6ZSwgdm0uX2JvZHlGb250U3R5bGUsIHZtLl9ib2R5Rm9udEZhbWlseSk7XG5cblx0XHQvLyBCZWZvcmUgQm9keVxuXHRcdHZhciB4TGluZVBhZGRpbmcgPSAwO1xuXHRcdHZhciBmaWxsTGluZU9mVGV4dCA9IGZ1bmN0aW9uKGxpbmUpIHtcblx0XHRcdGN0eC5maWxsVGV4dChsaW5lLCBwdC54ICsgeExpbmVQYWRkaW5nLCBwdC55KTtcblx0XHRcdHB0LnkgKz0gYm9keUZvbnRTaXplICsgYm9keVNwYWNpbmc7XG5cdFx0fTtcblxuXHRcdC8vIEJlZm9yZSBib2R5IGxpbmVzXG5cdFx0Y3R4LmZpbGxTdHlsZSA9IG1lcmdlT3BhY2l0eSh2bS5ib2R5Rm9udENvbG9yLCBvcGFjaXR5KTtcblx0XHRoZWxwZXJzLmVhY2godm0uYmVmb3JlQm9keSwgZmlsbExpbmVPZlRleHQpO1xuXG5cdFx0dmFyIGRyYXdDb2xvckJveGVzID0gdm0uZGlzcGxheUNvbG9ycztcblx0XHR4TGluZVBhZGRpbmcgPSBkcmF3Q29sb3JCb3hlcyA/IChib2R5Rm9udFNpemUgKyAyKSA6IDA7XG5cblx0XHQvLyBEcmF3IGJvZHkgbGluZXMgbm93XG5cdFx0aGVscGVycy5lYWNoKGJvZHksIGZ1bmN0aW9uKGJvZHlJdGVtLCBpKSB7XG5cdFx0XHR2YXIgdGV4dENvbG9yID0gbWVyZ2VPcGFjaXR5KHZtLmxhYmVsVGV4dENvbG9yc1tpXSwgb3BhY2l0eSk7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gdGV4dENvbG9yO1xuXHRcdFx0aGVscGVycy5lYWNoKGJvZHlJdGVtLmJlZm9yZSwgZmlsbExpbmVPZlRleHQpO1xuXG5cdFx0XHRoZWxwZXJzLmVhY2goYm9keUl0ZW0ubGluZXMsIGZ1bmN0aW9uKGxpbmUpIHtcblx0XHRcdFx0Ly8gRHJhdyBMZWdlbmQtbGlrZSBib3hlcyBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKGRyYXdDb2xvckJveGVzKSB7XG5cdFx0XHRcdFx0Ly8gRmlsbCBhIHdoaXRlIHJlY3Qgc28gdGhhdCBjb2xvdXJzIG1lcmdlIG5pY2VseSBpZiB0aGUgb3BhY2l0eSBpcyA8IDFcblx0XHRcdFx0XHRjdHguZmlsbFN0eWxlID0gbWVyZ2VPcGFjaXR5KHZtLmxlZ2VuZENvbG9yQmFja2dyb3VuZCwgb3BhY2l0eSk7XG5cdFx0XHRcdFx0Y3R4LmZpbGxSZWN0KHB0LngsIHB0LnksIGJvZHlGb250U2l6ZSwgYm9keUZvbnRTaXplKTtcblxuXHRcdFx0XHRcdC8vIEJvcmRlclxuXHRcdFx0XHRcdGN0eC5saW5lV2lkdGggPSAxO1xuXHRcdFx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IG1lcmdlT3BhY2l0eSh2bS5sYWJlbENvbG9yc1tpXS5ib3JkZXJDb2xvciwgb3BhY2l0eSk7XG5cdFx0XHRcdFx0Y3R4LnN0cm9rZVJlY3QocHQueCwgcHQueSwgYm9keUZvbnRTaXplLCBib2R5Rm9udFNpemUpO1xuXG5cdFx0XHRcdFx0Ly8gSW5uZXIgc3F1YXJlXG5cdFx0XHRcdFx0Y3R4LmZpbGxTdHlsZSA9IG1lcmdlT3BhY2l0eSh2bS5sYWJlbENvbG9yc1tpXS5iYWNrZ3JvdW5kQ29sb3IsIG9wYWNpdHkpO1xuXHRcdFx0XHRcdGN0eC5maWxsUmVjdChwdC54ICsgMSwgcHQueSArIDEsIGJvZHlGb250U2l6ZSAtIDIsIGJvZHlGb250U2l6ZSAtIDIpO1xuXHRcdFx0XHRcdGN0eC5maWxsU3R5bGUgPSB0ZXh0Q29sb3I7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmaWxsTGluZU9mVGV4dChsaW5lKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRoZWxwZXJzLmVhY2goYm9keUl0ZW0uYWZ0ZXIsIGZpbGxMaW5lT2ZUZXh0KTtcblx0XHR9KTtcblxuXHRcdC8vIFJlc2V0IGJhY2sgdG8gMCBmb3IgYWZ0ZXIgYm9keVxuXHRcdHhMaW5lUGFkZGluZyA9IDA7XG5cblx0XHQvLyBBZnRlciBib2R5IGxpbmVzXG5cdFx0aGVscGVycy5lYWNoKHZtLmFmdGVyQm9keSwgZmlsbExpbmVPZlRleHQpO1xuXHRcdHB0LnkgLT0gYm9keVNwYWNpbmc7IC8vIFJlbW92ZSBsYXN0IGJvZHkgc3BhY2luZ1xuXHR9LFxuXG5cdGRyYXdGb290ZXI6IGZ1bmN0aW9uKHB0LCB2bSwgY3R4LCBvcGFjaXR5KSB7XG5cdFx0dmFyIGZvb3RlciA9IHZtLmZvb3RlcjtcblxuXHRcdGlmIChmb290ZXIubGVuZ3RoKSB7XG5cdFx0XHRwdC55ICs9IHZtLmZvb3Rlck1hcmdpblRvcDtcblxuXHRcdFx0Y3R4LnRleHRBbGlnbiA9IHZtLl9mb290ZXJBbGlnbjtcblx0XHRcdGN0eC50ZXh0QmFzZWxpbmUgPSAndG9wJztcblxuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9IG1lcmdlT3BhY2l0eSh2bS5mb290ZXJGb250Q29sb3IsIG9wYWNpdHkpO1xuXHRcdFx0Y3R4LmZvbnQgPSBoZWxwZXJzLmZvbnRTdHJpbmcodm0uZm9vdGVyRm9udFNpemUsIHZtLl9mb290ZXJGb250U3R5bGUsIHZtLl9mb290ZXJGb250RmFtaWx5KTtcblxuXHRcdFx0aGVscGVycy5lYWNoKGZvb3RlciwgZnVuY3Rpb24obGluZSkge1xuXHRcdFx0XHRjdHguZmlsbFRleHQobGluZSwgcHQueCwgcHQueSk7XG5cdFx0XHRcdHB0LnkgKz0gdm0uZm9vdGVyRm9udFNpemUgKyB2bS5mb290ZXJTcGFjaW5nO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdGRyYXdCYWNrZ3JvdW5kOiBmdW5jdGlvbihwdCwgdm0sIGN0eCwgdG9vbHRpcFNpemUsIG9wYWNpdHkpIHtcblx0XHRjdHguZmlsbFN0eWxlID0gbWVyZ2VPcGFjaXR5KHZtLmJhY2tncm91bmRDb2xvciwgb3BhY2l0eSk7XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gbWVyZ2VPcGFjaXR5KHZtLmJvcmRlckNvbG9yLCBvcGFjaXR5KTtcblx0XHRjdHgubGluZVdpZHRoID0gdm0uYm9yZGVyV2lkdGg7XG5cdFx0dmFyIHhBbGlnbiA9IHZtLnhBbGlnbjtcblx0XHR2YXIgeUFsaWduID0gdm0ueUFsaWduO1xuXHRcdHZhciB4ID0gcHQueDtcblx0XHR2YXIgeSA9IHB0Lnk7XG5cdFx0dmFyIHdpZHRoID0gdG9vbHRpcFNpemUud2lkdGg7XG5cdFx0dmFyIGhlaWdodCA9IHRvb2x0aXBTaXplLmhlaWdodDtcblx0XHR2YXIgcmFkaXVzID0gdm0uY29ybmVyUmFkaXVzO1xuXG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdGN0eC5tb3ZlVG8oeCArIHJhZGl1cywgeSk7XG5cdFx0aWYgKHlBbGlnbiA9PT0gJ3RvcCcpIHtcblx0XHRcdHRoaXMuZHJhd0NhcmV0KHB0LCB0b29sdGlwU2l6ZSk7XG5cdFx0fVxuXHRcdGN0eC5saW5lVG8oeCArIHdpZHRoIC0gcmFkaXVzLCB5KTtcblx0XHRjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHksIHggKyB3aWR0aCwgeSArIHJhZGl1cyk7XG5cdFx0aWYgKHlBbGlnbiA9PT0gJ2NlbnRlcicgJiYgeEFsaWduID09PSAncmlnaHQnKSB7XG5cdFx0XHR0aGlzLmRyYXdDYXJldChwdCwgdG9vbHRpcFNpemUpO1xuXHRcdH1cblx0XHRjdHgubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIHJhZGl1cyk7XG5cdFx0Y3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4ICsgd2lkdGggLSByYWRpdXMsIHkgKyBoZWlnaHQpO1xuXHRcdGlmICh5QWxpZ24gPT09ICdib3R0b20nKSB7XG5cdFx0XHR0aGlzLmRyYXdDYXJldChwdCwgdG9vbHRpcFNpemUpO1xuXHRcdH1cblx0XHRjdHgubGluZVRvKHggKyByYWRpdXMsIHkgKyBoZWlnaHQpO1xuXHRcdGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHkgKyBoZWlnaHQsIHgsIHkgKyBoZWlnaHQgLSByYWRpdXMpO1xuXHRcdGlmICh5QWxpZ24gPT09ICdjZW50ZXInICYmIHhBbGlnbiA9PT0gJ2xlZnQnKSB7XG5cdFx0XHR0aGlzLmRyYXdDYXJldChwdCwgdG9vbHRpcFNpemUpO1xuXHRcdH1cblx0XHRjdHgubGluZVRvKHgsIHkgKyByYWRpdXMpO1xuXHRcdGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHksIHggKyByYWRpdXMsIHkpO1xuXHRcdGN0eC5jbG9zZVBhdGgoKTtcblxuXHRcdGN0eC5maWxsKCk7XG5cblx0XHRpZiAodm0uYm9yZGVyV2lkdGggPiAwKSB7XG5cdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdGRyYXc6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBjdHggPSB0aGlzLl9jaGFydC5jdHg7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblxuXHRcdGlmICh2bS5vcGFjaXR5ID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIHRvb2x0aXBTaXplID0ge1xuXHRcdFx0d2lkdGg6IHZtLndpZHRoLFxuXHRcdFx0aGVpZ2h0OiB2bS5oZWlnaHRcblx0XHR9O1xuXHRcdHZhciBwdCA9IHtcblx0XHRcdHg6IHZtLngsXG5cdFx0XHR5OiB2bS55XG5cdFx0fTtcblxuXHRcdC8vIElFMTEvRWRnZSBkb2VzIG5vdCBsaWtlIHZlcnkgc21hbGwgb3BhY2l0aWVzLCBzbyBzbmFwIHRvIDBcblx0XHR2YXIgb3BhY2l0eSA9IE1hdGguYWJzKHZtLm9wYWNpdHkgPCAxZS0zKSA/IDAgOiB2bS5vcGFjaXR5O1xuXG5cdFx0Ly8gVHJ1dGh5L2ZhbHNleSB2YWx1ZSBmb3IgZW1wdHkgdG9vbHRpcFxuXHRcdHZhciBoYXNUb29sdGlwQ29udGVudCA9IHZtLnRpdGxlLmxlbmd0aCB8fCB2bS5iZWZvcmVCb2R5Lmxlbmd0aCB8fCB2bS5ib2R5Lmxlbmd0aCB8fCB2bS5hZnRlckJvZHkubGVuZ3RoIHx8IHZtLmZvb3Rlci5sZW5ndGg7XG5cblx0XHRpZiAodGhpcy5fb3B0aW9ucy5lbmFibGVkICYmIGhhc1Rvb2x0aXBDb250ZW50KSB7XG5cdFx0XHQvLyBEcmF3IEJhY2tncm91bmRcblx0XHRcdHRoaXMuZHJhd0JhY2tncm91bmQocHQsIHZtLCBjdHgsIHRvb2x0aXBTaXplLCBvcGFjaXR5KTtcblxuXHRcdFx0Ly8gRHJhdyBUaXRsZSwgQm9keSwgYW5kIEZvb3RlclxuXHRcdFx0cHQueCArPSB2bS54UGFkZGluZztcblx0XHRcdHB0LnkgKz0gdm0ueVBhZGRpbmc7XG5cblx0XHRcdC8vIFRpdGxlc1xuXHRcdFx0dGhpcy5kcmF3VGl0bGUocHQsIHZtLCBjdHgsIG9wYWNpdHkpO1xuXG5cdFx0XHQvLyBCb2R5XG5cdFx0XHR0aGlzLmRyYXdCb2R5KHB0LCB2bSwgY3R4LCBvcGFjaXR5KTtcblxuXHRcdFx0Ly8gRm9vdGVyXG5cdFx0XHR0aGlzLmRyYXdGb290ZXIocHQsIHZtLCBjdHgsIG9wYWNpdHkpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogSGFuZGxlIGFuIGV2ZW50XG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7SUV2ZW50fSBldmVudCAtIFRoZSBldmVudCB0byBoYW5kbGVcblx0ICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIHRvb2x0aXAgY2hhbmdlZFxuXHQgKi9cblx0aGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRpb25zID0gbWUuX29wdGlvbnM7XG5cdFx0dmFyIGNoYW5nZWQgPSBmYWxzZTtcblxuXHRcdG1lLl9sYXN0QWN0aXZlID0gbWUuX2xhc3RBY3RpdmUgfHwgW107XG5cblx0XHQvLyBGaW5kIEFjdGl2ZSBFbGVtZW50cyBmb3IgdG9vbHRpcHNcblx0XHRpZiAoZS50eXBlID09PSAnbW91c2VvdXQnKSB7XG5cdFx0XHRtZS5fYWN0aXZlID0gW107XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1lLl9hY3RpdmUgPSBtZS5fY2hhcnQuZ2V0RWxlbWVudHNBdEV2ZW50Rm9yTW9kZShlLCBvcHRpb25zLm1vZGUsIG9wdGlvbnMpO1xuXHRcdH1cblxuXHRcdC8vIFJlbWVtYmVyIExhc3QgQWN0aXZlc1xuXHRcdGNoYW5nZWQgPSAhaGVscGVycy5hcnJheUVxdWFscyhtZS5fYWN0aXZlLCBtZS5fbGFzdEFjdGl2ZSk7XG5cblx0XHQvLyBPbmx5IGhhbmRsZSB0YXJnZXQgZXZlbnQgb24gdG9vbHRpcCBjaGFuZ2Vcblx0XHRpZiAoY2hhbmdlZCkge1xuXHRcdFx0bWUuX2xhc3RBY3RpdmUgPSBtZS5fYWN0aXZlO1xuXG5cdFx0XHRpZiAob3B0aW9ucy5lbmFibGVkIHx8IG9wdGlvbnMuY3VzdG9tKSB7XG5cdFx0XHRcdG1lLl9ldmVudFBvc2l0aW9uID0ge1xuXHRcdFx0XHRcdHg6IGUueCxcblx0XHRcdFx0XHR5OiBlLnlcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRtZS51cGRhdGUodHJ1ZSk7XG5cdFx0XHRcdG1lLnBpdm90KCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNoYW5nZWQ7XG5cdH1cbn0pO1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuVG9vbHRpcC5wb3NpdGlvbmVyc1xuICovXG5leHBvcnRzLnBvc2l0aW9uZXJzID0gcG9zaXRpb25lcnM7XG5cblxufSx7XCIyNlwiOjI2LFwiMjdcIjoyNyxcIjQ2XCI6NDZ9XSwzNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIEVsZW1lbnQgPSByZXF1aXJlKDI3KTtcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG5cbmRlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcblx0ZWxlbWVudHM6IHtcblx0XHRhcmM6IHtcblx0XHRcdGJhY2tncm91bmRDb2xvcjogZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRDb2xvcixcblx0XHRcdGJvcmRlckNvbG9yOiAnI2ZmZicsXG5cdFx0XHRib3JkZXJXaWR0aDogMlxuXHRcdH1cblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRWxlbWVudC5leHRlbmQoe1xuXHRpbkxhYmVsUmFuZ2U6IGZ1bmN0aW9uKG1vdXNlWCkge1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cblx0XHRpZiAodm0pIHtcblx0XHRcdHJldHVybiAoTWF0aC5wb3cobW91c2VYIC0gdm0ueCwgMikgPCBNYXRoLnBvdyh2bS5yYWRpdXMgKyB2bS5ob3ZlclJhZGl1cywgMikpO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0aW5SYW5nZTogZnVuY3Rpb24oY2hhcnRYLCBjaGFydFkpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXG5cdFx0aWYgKHZtKSB7XG5cdFx0XHR2YXIgcG9pbnRSZWxhdGl2ZVBvc2l0aW9uID0gaGVscGVycy5nZXRBbmdsZUZyb21Qb2ludCh2bSwge3g6IGNoYXJ0WCwgeTogY2hhcnRZfSk7XG5cdFx0XHR2YXJcdGFuZ2xlID0gcG9pbnRSZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlO1xuXHRcdFx0dmFyIGRpc3RhbmNlID0gcG9pbnRSZWxhdGl2ZVBvc2l0aW9uLmRpc3RhbmNlO1xuXG5cdFx0XHQvLyBTYW5pdGlzZSBhbmdsZSByYW5nZVxuXHRcdFx0dmFyIHN0YXJ0QW5nbGUgPSB2bS5zdGFydEFuZ2xlO1xuXHRcdFx0dmFyIGVuZEFuZ2xlID0gdm0uZW5kQW5nbGU7XG5cdFx0XHR3aGlsZSAoZW5kQW5nbGUgPCBzdGFydEFuZ2xlKSB7XG5cdFx0XHRcdGVuZEFuZ2xlICs9IDIuMCAqIE1hdGguUEk7XG5cdFx0XHR9XG5cdFx0XHR3aGlsZSAoYW5nbGUgPiBlbmRBbmdsZSkge1xuXHRcdFx0XHRhbmdsZSAtPSAyLjAgKiBNYXRoLlBJO1xuXHRcdFx0fVxuXHRcdFx0d2hpbGUgKGFuZ2xlIDwgc3RhcnRBbmdsZSkge1xuXHRcdFx0XHRhbmdsZSArPSAyLjAgKiBNYXRoLlBJO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDaGVjayBpZiB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBvcGVuL2Nsb3NlIGFuZ2xlXG5cdFx0XHR2YXIgYmV0d2VlbkFuZ2xlcyA9IChhbmdsZSA+PSBzdGFydEFuZ2xlICYmIGFuZ2xlIDw9IGVuZEFuZ2xlKTtcblx0XHRcdHZhciB3aXRoaW5SYWRpdXMgPSAoZGlzdGFuY2UgPj0gdm0uaW5uZXJSYWRpdXMgJiYgZGlzdGFuY2UgPD0gdm0ub3V0ZXJSYWRpdXMpO1xuXG5cdFx0XHRyZXR1cm4gKGJldHdlZW5BbmdsZXMgJiYgd2l0aGluUmFkaXVzKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdGdldENlbnRlclBvaW50OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHZhciBoYWxmQW5nbGUgPSAodm0uc3RhcnRBbmdsZSArIHZtLmVuZEFuZ2xlKSAvIDI7XG5cdFx0dmFyIGhhbGZSYWRpdXMgPSAodm0uaW5uZXJSYWRpdXMgKyB2bS5vdXRlclJhZGl1cykgLyAyO1xuXHRcdHJldHVybiB7XG5cdFx0XHR4OiB2bS54ICsgTWF0aC5jb3MoaGFsZkFuZ2xlKSAqIGhhbGZSYWRpdXMsXG5cdFx0XHR5OiB2bS55ICsgTWF0aC5zaW4oaGFsZkFuZ2xlKSAqIGhhbGZSYWRpdXNcblx0XHR9O1xuXHR9LFxuXG5cdGdldEFyZWE6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdFx0cmV0dXJuIE1hdGguUEkgKiAoKHZtLmVuZEFuZ2xlIC0gdm0uc3RhcnRBbmdsZSkgLyAoMiAqIE1hdGguUEkpKSAqIChNYXRoLnBvdyh2bS5vdXRlclJhZGl1cywgMikgLSBNYXRoLnBvdyh2bS5pbm5lclJhZGl1cywgMikpO1xuXHR9LFxuXG5cdHRvb2x0aXBQb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHR2YXIgY2VudHJlQW5nbGUgPSB2bS5zdGFydEFuZ2xlICsgKCh2bS5lbmRBbmdsZSAtIHZtLnN0YXJ0QW5nbGUpIC8gMik7XG5cdFx0dmFyIHJhbmdlRnJvbUNlbnRyZSA9ICh2bS5vdXRlclJhZGl1cyAtIHZtLmlubmVyUmFkaXVzKSAvIDIgKyB2bS5pbm5lclJhZGl1cztcblxuXHRcdHJldHVybiB7XG5cdFx0XHR4OiB2bS54ICsgKE1hdGguY29zKGNlbnRyZUFuZ2xlKSAqIHJhbmdlRnJvbUNlbnRyZSksXG5cdFx0XHR5OiB2bS55ICsgKE1hdGguc2luKGNlbnRyZUFuZ2xlKSAqIHJhbmdlRnJvbUNlbnRyZSlcblx0XHR9O1xuXHR9LFxuXG5cdGRyYXc6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBjdHggPSB0aGlzLl9jaGFydC5jdHg7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHR2YXIgc0EgPSB2bS5zdGFydEFuZ2xlO1xuXHRcdHZhciBlQSA9IHZtLmVuZEFuZ2xlO1xuXG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXG5cdFx0Y3R4LmFyYyh2bS54LCB2bS55LCB2bS5vdXRlclJhZGl1cywgc0EsIGVBKTtcblx0XHRjdHguYXJjKHZtLngsIHZtLnksIHZtLmlubmVyUmFkaXVzLCBlQSwgc0EsIHRydWUpO1xuXG5cdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXHRcdGN0eC5zdHJva2VTdHlsZSA9IHZtLmJvcmRlckNvbG9yO1xuXHRcdGN0eC5saW5lV2lkdGggPSB2bS5ib3JkZXJXaWR0aDtcblxuXHRcdGN0eC5maWxsU3R5bGUgPSB2bS5iYWNrZ3JvdW5kQ29sb3I7XG5cblx0XHRjdHguZmlsbCgpO1xuXHRcdGN0eC5saW5lSm9pbiA9ICdiZXZlbCc7XG5cblx0XHRpZiAodm0uYm9yZGVyV2lkdGgpIHtcblx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHR9XG5cdH1cbn0pO1xuXG59LHtcIjI2XCI6MjYsXCIyN1wiOjI3LFwiNDZcIjo0Nn1dLDM4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XG52YXIgRWxlbWVudCA9IHJlcXVpcmUoMjcpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxudmFyIGdsb2JhbERlZmF1bHRzID0gZGVmYXVsdHMuZ2xvYmFsO1xuXG5kZWZhdWx0cy5fc2V0KCdnbG9iYWwnLCB7XG5cdGVsZW1lbnRzOiB7XG5cdFx0bGluZToge1xuXHRcdFx0dGVuc2lvbjogMC40LFxuXHRcdFx0YmFja2dyb3VuZENvbG9yOiBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Q29sb3IsXG5cdFx0XHRib3JkZXJXaWR0aDogMyxcblx0XHRcdGJvcmRlckNvbG9yOiBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Q29sb3IsXG5cdFx0XHRib3JkZXJDYXBTdHlsZTogJ2J1dHQnLFxuXHRcdFx0Ym9yZGVyRGFzaDogW10sXG5cdFx0XHRib3JkZXJEYXNoT2Zmc2V0OiAwLjAsXG5cdFx0XHRib3JkZXJKb2luU3R5bGU6ICdtaXRlcicsXG5cdFx0XHRjYXBCZXppZXJQb2ludHM6IHRydWUsXG5cdFx0XHRmaWxsOiB0cnVlLCAvLyBkbyB3ZSBmaWxsIGluIHRoZSBhcmVhIGJldHdlZW4gdGhlIGxpbmUgYW5kIGl0cyBiYXNlIGF4aXNcblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVsZW1lbnQuZXh0ZW5kKHtcblx0ZHJhdzogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgdm0gPSBtZS5fdmlldztcblx0XHR2YXIgY3R4ID0gbWUuX2NoYXJ0LmN0eDtcblx0XHR2YXIgc3BhbkdhcHMgPSB2bS5zcGFuR2Fwcztcblx0XHR2YXIgcG9pbnRzID0gbWUuX2NoaWxkcmVuLnNsaWNlKCk7IC8vIGNsb25lIGFycmF5XG5cdFx0dmFyIGdsb2JhbE9wdGlvbkxpbmVFbGVtZW50cyA9IGdsb2JhbERlZmF1bHRzLmVsZW1lbnRzLmxpbmU7XG5cdFx0dmFyIGxhc3REcmF3bkluZGV4ID0gLTE7XG5cdFx0dmFyIGluZGV4LCBjdXJyZW50LCBwcmV2aW91cywgY3VycmVudFZNO1xuXG5cdFx0Ly8gSWYgd2UgYXJlIGxvb3BpbmcsIGFkZGluZyB0aGUgZmlyc3QgcG9pbnQgYWdhaW5cblx0XHRpZiAobWUuX2xvb3AgJiYgcG9pbnRzLmxlbmd0aCkge1xuXHRcdFx0cG9pbnRzLnB1c2gocG9pbnRzWzBdKTtcblx0XHR9XG5cblx0XHRjdHguc2F2ZSgpO1xuXG5cdFx0Ly8gU3Ryb2tlIExpbmUgT3B0aW9uc1xuXHRcdGN0eC5saW5lQ2FwID0gdm0uYm9yZGVyQ2FwU3R5bGUgfHwgZ2xvYmFsT3B0aW9uTGluZUVsZW1lbnRzLmJvcmRlckNhcFN0eWxlO1xuXG5cdFx0Ly8gSUUgOSBhbmQgMTAgZG8gbm90IHN1cHBvcnQgbGluZSBkYXNoXG5cdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0Y3R4LnNldExpbmVEYXNoKHZtLmJvcmRlckRhc2ggfHwgZ2xvYmFsT3B0aW9uTGluZUVsZW1lbnRzLmJvcmRlckRhc2gpO1xuXHRcdH1cblxuXHRcdGN0eC5saW5lRGFzaE9mZnNldCA9IHZtLmJvcmRlckRhc2hPZmZzZXQgfHwgZ2xvYmFsT3B0aW9uTGluZUVsZW1lbnRzLmJvcmRlckRhc2hPZmZzZXQ7XG5cdFx0Y3R4LmxpbmVKb2luID0gdm0uYm9yZGVySm9pblN0eWxlIHx8IGdsb2JhbE9wdGlvbkxpbmVFbGVtZW50cy5ib3JkZXJKb2luU3R5bGU7XG5cdFx0Y3R4LmxpbmVXaWR0aCA9IHZtLmJvcmRlcldpZHRoIHx8IGdsb2JhbE9wdGlvbkxpbmVFbGVtZW50cy5ib3JkZXJXaWR0aDtcblx0XHRjdHguc3Ryb2tlU3R5bGUgPSB2bS5ib3JkZXJDb2xvciB8fCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Q29sb3I7XG5cblx0XHQvLyBTdHJva2UgTGluZVxuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRsYXN0RHJhd25JbmRleCA9IC0xO1xuXG5cdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IDwgcG9pbnRzLmxlbmd0aDsgKytpbmRleCkge1xuXHRcdFx0Y3VycmVudCA9IHBvaW50c1tpbmRleF07XG5cdFx0XHRwcmV2aW91cyA9IGhlbHBlcnMucHJldmlvdXNJdGVtKHBvaW50cywgaW5kZXgpO1xuXHRcdFx0Y3VycmVudFZNID0gY3VycmVudC5fdmlldztcblxuXHRcdFx0Ly8gRmlyc3QgcG9pbnQgbW92ZXMgdG8gaXQncyBzdGFydGluZyBwb3NpdGlvbiBubyBtYXR0ZXIgd2hhdFxuXHRcdFx0aWYgKGluZGV4ID09PSAwKSB7XG5cdFx0XHRcdGlmICghY3VycmVudFZNLnNraXApIHtcblx0XHRcdFx0XHRjdHgubW92ZVRvKGN1cnJlbnRWTS54LCBjdXJyZW50Vk0ueSk7XG5cdFx0XHRcdFx0bGFzdERyYXduSW5kZXggPSBpbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHJldmlvdXMgPSBsYXN0RHJhd25JbmRleCA9PT0gLTEgPyBwcmV2aW91cyA6IHBvaW50c1tsYXN0RHJhd25JbmRleF07XG5cblx0XHRcdFx0aWYgKCFjdXJyZW50Vk0uc2tpcCkge1xuXHRcdFx0XHRcdGlmICgobGFzdERyYXduSW5kZXggIT09IChpbmRleCAtIDEpICYmICFzcGFuR2FwcykgfHwgbGFzdERyYXduSW5kZXggPT09IC0xKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGVyZSB3YXMgYSBnYXAgYW5kIHRoaXMgaXMgdGhlIGZpcnN0IHBvaW50IGFmdGVyIHRoZSBnYXBcblx0XHRcdFx0XHRcdGN0eC5tb3ZlVG8oY3VycmVudFZNLngsIGN1cnJlbnRWTS55KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gTGluZSB0byBuZXh0IHBvaW50XG5cdFx0XHRcdFx0XHRoZWxwZXJzLmNhbnZhcy5saW5lVG8oY3R4LCBwcmV2aW91cy5fdmlldywgY3VycmVudC5fdmlldyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGxhc3REcmF3bkluZGV4ID0gaW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0Y3R4LnJlc3RvcmUoKTtcblx0fVxufSk7XG5cbn0se1wiMjZcIjoyNixcIjI3XCI6MjcsXCI0NlwiOjQ2fV0sMzk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBFbGVtZW50ID0gcmVxdWlyZSgyNyk7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG52YXIgZGVmYXVsdENvbG9yID0gZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRDb2xvcjtcblxuZGVmYXVsdHMuX3NldCgnZ2xvYmFsJywge1xuXHRlbGVtZW50czoge1xuXHRcdHBvaW50OiB7XG5cdFx0XHRyYWRpdXM6IDMsXG5cdFx0XHRwb2ludFN0eWxlOiAnY2lyY2xlJyxcblx0XHRcdGJhY2tncm91bmRDb2xvcjogZGVmYXVsdENvbG9yLFxuXHRcdFx0Ym9yZGVyQ29sb3I6IGRlZmF1bHRDb2xvcixcblx0XHRcdGJvcmRlcldpZHRoOiAxLFxuXHRcdFx0Ly8gSG92ZXJcblx0XHRcdGhpdFJhZGl1czogMSxcblx0XHRcdGhvdmVyUmFkaXVzOiA0LFxuXHRcdFx0aG92ZXJCb3JkZXJXaWR0aDogMVxuXHRcdH1cblx0fVxufSk7XG5cbmZ1bmN0aW9uIHhSYW5nZShtb3VzZVgpIHtcblx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0cmV0dXJuIHZtID8gKE1hdGguYWJzKG1vdXNlWCAtIHZtLngpIDwgdm0ucmFkaXVzICsgdm0uaGl0UmFkaXVzKSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB5UmFuZ2UobW91c2VZKSB7XG5cdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdHJldHVybiB2bSA/IChNYXRoLmFicyhtb3VzZVkgLSB2bS55KSA8IHZtLnJhZGl1cyArIHZtLmhpdFJhZGl1cykgOiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFbGVtZW50LmV4dGVuZCh7XG5cdGluUmFuZ2U6IGZ1bmN0aW9uKG1vdXNlWCwgbW91c2VZKSB7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHRyZXR1cm4gdm0gPyAoKE1hdGgucG93KG1vdXNlWCAtIHZtLngsIDIpICsgTWF0aC5wb3cobW91c2VZIC0gdm0ueSwgMikpIDwgTWF0aC5wb3codm0uaGl0UmFkaXVzICsgdm0ucmFkaXVzLCAyKSkgOiBmYWxzZTtcblx0fSxcblxuXHRpbkxhYmVsUmFuZ2U6IHhSYW5nZSxcblx0aW5YUmFuZ2U6IHhSYW5nZSxcblx0aW5ZUmFuZ2U6IHlSYW5nZSxcblxuXHRnZXRDZW50ZXJQb2ludDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHRyZXR1cm4ge1xuXHRcdFx0eDogdm0ueCxcblx0XHRcdHk6IHZtLnlcblx0XHR9O1xuXHR9LFxuXG5cdGdldEFyZWE6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBNYXRoLlBJICogTWF0aC5wb3codGhpcy5fdmlldy5yYWRpdXMsIDIpO1xuXHR9LFxuXG5cdHRvb2x0aXBQb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHRyZXR1cm4ge1xuXHRcdFx0eDogdm0ueCxcblx0XHRcdHk6IHZtLnksXG5cdFx0XHRwYWRkaW5nOiB2bS5yYWRpdXMgKyB2bS5ib3JkZXJXaWR0aFxuXHRcdH07XG5cdH0sXG5cblx0ZHJhdzogZnVuY3Rpb24oY2hhcnRBcmVhKSB7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHR2YXIgbW9kZWwgPSB0aGlzLl9tb2RlbDtcblx0XHR2YXIgY3R4ID0gdGhpcy5fY2hhcnQuY3R4O1xuXHRcdHZhciBwb2ludFN0eWxlID0gdm0ucG9pbnRTdHlsZTtcblx0XHR2YXIgcm90YXRpb24gPSB2bS5yb3RhdGlvbjtcblx0XHR2YXIgcmFkaXVzID0gdm0ucmFkaXVzO1xuXHRcdHZhciB4ID0gdm0ueDtcblx0XHR2YXIgeSA9IHZtLnk7XG5cdFx0dmFyIGVyck1hcmdpbiA9IDEuMDE7IC8vIDEuMDEgaXMgbWFyZ2luIGZvciBBY2N1bXVsYXRlZCBlcnJvci4gKEVzcGVjaWFsbHkgRWRnZSwgSUUuKVxuXG5cdFx0aWYgKHZtLnNraXApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDbGlwcGluZyBmb3IgUG9pbnRzLlxuXHRcdGlmIChjaGFydEFyZWEgPT09IHVuZGVmaW5lZCB8fCAobW9kZWwueCA+PSBjaGFydEFyZWEubGVmdCAmJiBjaGFydEFyZWEucmlnaHQgKiBlcnJNYXJnaW4gPj0gbW9kZWwueCAmJiBtb2RlbC55ID49IGNoYXJ0QXJlYS50b3AgJiYgY2hhcnRBcmVhLmJvdHRvbSAqIGVyck1hcmdpbiA+PSBtb2RlbC55KSkge1xuXHRcdFx0Y3R4LnN0cm9rZVN0eWxlID0gdm0uYm9yZGVyQ29sb3IgfHwgZGVmYXVsdENvbG9yO1xuXHRcdFx0Y3R4LmxpbmVXaWR0aCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQodm0uYm9yZGVyV2lkdGgsIGRlZmF1bHRzLmdsb2JhbC5lbGVtZW50cy5wb2ludC5ib3JkZXJXaWR0aCk7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gdm0uYmFja2dyb3VuZENvbG9yIHx8IGRlZmF1bHRDb2xvcjtcblx0XHRcdGhlbHBlcnMuY2FudmFzLmRyYXdQb2ludChjdHgsIHBvaW50U3R5bGUsIHJhZGl1cywgeCwgeSwgcm90YXRpb24pO1xuXHRcdH1cblx0fVxufSk7XG5cbn0se1wiMjZcIjoyNixcIjI3XCI6MjcsXCI0NlwiOjQ2fV0sNDA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBFbGVtZW50ID0gcmVxdWlyZSgyNyk7XG5cbmRlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcblx0ZWxlbWVudHM6IHtcblx0XHRyZWN0YW5nbGU6IHtcblx0XHRcdGJhY2tncm91bmRDb2xvcjogZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRDb2xvcixcblx0XHRcdGJvcmRlckNvbG9yOiBkZWZhdWx0cy5nbG9iYWwuZGVmYXVsdENvbG9yLFxuXHRcdFx0Ym9yZGVyU2tpcHBlZDogJ2JvdHRvbScsXG5cdFx0XHRib3JkZXJXaWR0aDogMFxuXHRcdH1cblx0fVxufSk7XG5cbmZ1bmN0aW9uIGlzVmVydGljYWwoYmFyKSB7XG5cdHJldHVybiBiYXIuX3ZpZXcud2lkdGggIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBib3VuZHMgb2YgdGhlIGJhciByZWdhcmRsZXNzIG9mIHRoZSBvcmllbnRhdGlvblxuICogQHBhcmFtIGJhciB7Q2hhcnQuRWxlbWVudC5SZWN0YW5nbGV9IHRoZSBiYXJcbiAqIEByZXR1cm4ge0JvdW5kc30gYm91bmRzIG9mIHRoZSBiYXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldEJhckJvdW5kcyhiYXIpIHtcblx0dmFyIHZtID0gYmFyLl92aWV3O1xuXHR2YXIgeDEsIHgyLCB5MSwgeTI7XG5cblx0aWYgKGlzVmVydGljYWwoYmFyKSkge1xuXHRcdC8vIHZlcnRpY2FsXG5cdFx0dmFyIGhhbGZXaWR0aCA9IHZtLndpZHRoIC8gMjtcblx0XHR4MSA9IHZtLnggLSBoYWxmV2lkdGg7XG5cdFx0eDIgPSB2bS54ICsgaGFsZldpZHRoO1xuXHRcdHkxID0gTWF0aC5taW4odm0ueSwgdm0uYmFzZSk7XG5cdFx0eTIgPSBNYXRoLm1heCh2bS55LCB2bS5iYXNlKTtcblx0fSBlbHNlIHtcblx0XHQvLyBob3Jpem9udGFsIGJhclxuXHRcdHZhciBoYWxmSGVpZ2h0ID0gdm0uaGVpZ2h0IC8gMjtcblx0XHR4MSA9IE1hdGgubWluKHZtLngsIHZtLmJhc2UpO1xuXHRcdHgyID0gTWF0aC5tYXgodm0ueCwgdm0uYmFzZSk7XG5cdFx0eTEgPSB2bS55IC0gaGFsZkhlaWdodDtcblx0XHR5MiA9IHZtLnkgKyBoYWxmSGVpZ2h0O1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRsZWZ0OiB4MSxcblx0XHR0b3A6IHkxLFxuXHRcdHJpZ2h0OiB4Mixcblx0XHRib3R0b206IHkyXG5cdH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRWxlbWVudC5leHRlbmQoe1xuXHRkcmF3OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY3R4ID0gdGhpcy5fY2hhcnQuY3R4O1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdFx0dmFyIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgc2lnblgsIHNpZ25ZLCBib3JkZXJTa2lwcGVkO1xuXHRcdHZhciBib3JkZXJXaWR0aCA9IHZtLmJvcmRlcldpZHRoO1xuXG5cdFx0aWYgKCF2bS5ob3Jpem9udGFsKSB7XG5cdFx0XHQvLyBiYXJcblx0XHRcdGxlZnQgPSB2bS54IC0gdm0ud2lkdGggLyAyO1xuXHRcdFx0cmlnaHQgPSB2bS54ICsgdm0ud2lkdGggLyAyO1xuXHRcdFx0dG9wID0gdm0ueTtcblx0XHRcdGJvdHRvbSA9IHZtLmJhc2U7XG5cdFx0XHRzaWduWCA9IDE7XG5cdFx0XHRzaWduWSA9IGJvdHRvbSA+IHRvcCA/IDEgOiAtMTtcblx0XHRcdGJvcmRlclNraXBwZWQgPSB2bS5ib3JkZXJTa2lwcGVkIHx8ICdib3R0b20nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBob3Jpem9udGFsIGJhclxuXHRcdFx0bGVmdCA9IHZtLmJhc2U7XG5cdFx0XHRyaWdodCA9IHZtLng7XG5cdFx0XHR0b3AgPSB2bS55IC0gdm0uaGVpZ2h0IC8gMjtcblx0XHRcdGJvdHRvbSA9IHZtLnkgKyB2bS5oZWlnaHQgLyAyO1xuXHRcdFx0c2lnblggPSByaWdodCA+IGxlZnQgPyAxIDogLTE7XG5cdFx0XHRzaWduWSA9IDE7XG5cdFx0XHRib3JkZXJTa2lwcGVkID0gdm0uYm9yZGVyU2tpcHBlZCB8fCAnbGVmdCc7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FudmFzIGRvZXNuJ3QgYWxsb3cgdXMgdG8gc3Ryb2tlIGluc2lkZSB0aGUgd2lkdGggc28gd2UgY2FuXG5cdFx0Ly8gYWRqdXN0IHRoZSBzaXplcyB0byBmaXQgaWYgd2UncmUgc2V0dGluZyBhIHN0cm9rZSBvbiB0aGUgbGluZVxuXHRcdGlmIChib3JkZXJXaWR0aCkge1xuXHRcdFx0Ly8gYm9yZGVyV2lkdGggc2hvbGQgYmUgbGVzcyB0aGFuIGJhciB3aWR0aCBhbmQgYmFyIGhlaWdodC5cblx0XHRcdHZhciBiYXJTaXplID0gTWF0aC5taW4oTWF0aC5hYnMobGVmdCAtIHJpZ2h0KSwgTWF0aC5hYnModG9wIC0gYm90dG9tKSk7XG5cdFx0XHRib3JkZXJXaWR0aCA9IGJvcmRlcldpZHRoID4gYmFyU2l6ZSA/IGJhclNpemUgOiBib3JkZXJXaWR0aDtcblx0XHRcdHZhciBoYWxmU3Ryb2tlID0gYm9yZGVyV2lkdGggLyAyO1xuXHRcdFx0Ly8gQWRqdXN0IGJvcmRlcldpZHRoIHdoZW4gYmFyIHRvcCBwb3NpdGlvbiBpcyBuZWFyIHZtLmJhc2UoemVybykuXG5cdFx0XHR2YXIgYm9yZGVyTGVmdCA9IGxlZnQgKyAoYm9yZGVyU2tpcHBlZCAhPT0gJ2xlZnQnID8gaGFsZlN0cm9rZSAqIHNpZ25YIDogMCk7XG5cdFx0XHR2YXIgYm9yZGVyUmlnaHQgPSByaWdodCArIChib3JkZXJTa2lwcGVkICE9PSAncmlnaHQnID8gLWhhbGZTdHJva2UgKiBzaWduWCA6IDApO1xuXHRcdFx0dmFyIGJvcmRlclRvcCA9IHRvcCArIChib3JkZXJTa2lwcGVkICE9PSAndG9wJyA/IGhhbGZTdHJva2UgKiBzaWduWSA6IDApO1xuXHRcdFx0dmFyIGJvcmRlckJvdHRvbSA9IGJvdHRvbSArIChib3JkZXJTa2lwcGVkICE9PSAnYm90dG9tJyA/IC1oYWxmU3Ryb2tlICogc2lnblkgOiAwKTtcblx0XHRcdC8vIG5vdCBiZWNvbWUgYSB2ZXJ0aWNhbCBsaW5lP1xuXHRcdFx0aWYgKGJvcmRlckxlZnQgIT09IGJvcmRlclJpZ2h0KSB7XG5cdFx0XHRcdHRvcCA9IGJvcmRlclRvcDtcblx0XHRcdFx0Ym90dG9tID0gYm9yZGVyQm90dG9tO1xuXHRcdFx0fVxuXHRcdFx0Ly8gbm90IGJlY29tZSBhIGhvcml6b250YWwgbGluZT9cblx0XHRcdGlmIChib3JkZXJUb3AgIT09IGJvcmRlckJvdHRvbSkge1xuXHRcdFx0XHRsZWZ0ID0gYm9yZGVyTGVmdDtcblx0XHRcdFx0cmlnaHQgPSBib3JkZXJSaWdodDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IHZtLmJhY2tncm91bmRDb2xvcjtcblx0XHRjdHguc3Ryb2tlU3R5bGUgPSB2bS5ib3JkZXJDb2xvcjtcblx0XHRjdHgubGluZVdpZHRoID0gYm9yZGVyV2lkdGg7XG5cblx0XHQvLyBDb3JuZXIgcG9pbnRzLCBmcm9tIGJvdHRvbS1sZWZ0IHRvIGJvdHRvbS1yaWdodCBjbG9ja3dpc2Vcblx0XHQvLyB8IDEgMiB8XG5cdFx0Ly8gfCAwIDMgfFxuXHRcdHZhciBjb3JuZXJzID0gW1xuXHRcdFx0W2xlZnQsIGJvdHRvbV0sXG5cdFx0XHRbbGVmdCwgdG9wXSxcblx0XHRcdFtyaWdodCwgdG9wXSxcblx0XHRcdFtyaWdodCwgYm90dG9tXVxuXHRcdF07XG5cblx0XHQvLyBGaW5kIGZpcnN0IChzdGFydGluZykgY29ybmVyIHdpdGggZmFsbGJhY2sgdG8gJ2JvdHRvbSdcblx0XHR2YXIgYm9yZGVycyA9IFsnYm90dG9tJywgJ2xlZnQnLCAndG9wJywgJ3JpZ2h0J107XG5cdFx0dmFyIHN0YXJ0Q29ybmVyID0gYm9yZGVycy5pbmRleE9mKGJvcmRlclNraXBwZWQsIDApO1xuXHRcdGlmIChzdGFydENvcm5lciA9PT0gLTEpIHtcblx0XHRcdHN0YXJ0Q29ybmVyID0gMDtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBjb3JuZXJBdChpbmRleCkge1xuXHRcdFx0cmV0dXJuIGNvcm5lcnNbKHN0YXJ0Q29ybmVyICsgaW5kZXgpICUgNF07XG5cdFx0fVxuXG5cdFx0Ly8gRHJhdyByZWN0YW5nbGUgZnJvbSAnc3RhcnRDb3JuZXInXG5cdFx0dmFyIGNvcm5lciA9IGNvcm5lckF0KDApO1xuXHRcdGN0eC5tb3ZlVG8oY29ybmVyWzBdLCBjb3JuZXJbMV0pO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDE7IGkgPCA0OyBpKyspIHtcblx0XHRcdGNvcm5lciA9IGNvcm5lckF0KGkpO1xuXHRcdFx0Y3R4LmxpbmVUbyhjb3JuZXJbMF0sIGNvcm5lclsxXSk7XG5cdFx0fVxuXG5cdFx0Y3R4LmZpbGwoKTtcblx0XHRpZiAoYm9yZGVyV2lkdGgpIHtcblx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHR9XG5cdH0sXG5cblx0aGVpZ2h0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHJldHVybiB2bS5iYXNlIC0gdm0ueTtcblx0fSxcblxuXHRpblJhbmdlOiBmdW5jdGlvbihtb3VzZVgsIG1vdXNlWSkge1xuXHRcdHZhciBpblJhbmdlID0gZmFsc2U7XG5cblx0XHRpZiAodGhpcy5fdmlldykge1xuXHRcdFx0dmFyIGJvdW5kcyA9IGdldEJhckJvdW5kcyh0aGlzKTtcblx0XHRcdGluUmFuZ2UgPSBtb3VzZVggPj0gYm91bmRzLmxlZnQgJiYgbW91c2VYIDw9IGJvdW5kcy5yaWdodCAmJiBtb3VzZVkgPj0gYm91bmRzLnRvcCAmJiBtb3VzZVkgPD0gYm91bmRzLmJvdHRvbTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaW5SYW5nZTtcblx0fSxcblxuXHRpbkxhYmVsUmFuZ2U6IGZ1bmN0aW9uKG1vdXNlWCwgbW91c2VZKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHRpZiAoIW1lLl92aWV3KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dmFyIGluUmFuZ2UgPSBmYWxzZTtcblx0XHR2YXIgYm91bmRzID0gZ2V0QmFyQm91bmRzKG1lKTtcblxuXHRcdGlmIChpc1ZlcnRpY2FsKG1lKSkge1xuXHRcdFx0aW5SYW5nZSA9IG1vdXNlWCA+PSBib3VuZHMubGVmdCAmJiBtb3VzZVggPD0gYm91bmRzLnJpZ2h0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpblJhbmdlID0gbW91c2VZID49IGJvdW5kcy50b3AgJiYgbW91c2VZIDw9IGJvdW5kcy5ib3R0b207XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGluUmFuZ2U7XG5cdH0sXG5cblx0aW5YUmFuZ2U6IGZ1bmN0aW9uKG1vdXNlWCkge1xuXHRcdHZhciBib3VuZHMgPSBnZXRCYXJCb3VuZHModGhpcyk7XG5cdFx0cmV0dXJuIG1vdXNlWCA+PSBib3VuZHMubGVmdCAmJiBtb3VzZVggPD0gYm91bmRzLnJpZ2h0O1xuXHR9LFxuXG5cdGluWVJhbmdlOiBmdW5jdGlvbihtb3VzZVkpIHtcblx0XHR2YXIgYm91bmRzID0gZ2V0QmFyQm91bmRzKHRoaXMpO1xuXHRcdHJldHVybiBtb3VzZVkgPj0gYm91bmRzLnRvcCAmJiBtb3VzZVkgPD0gYm91bmRzLmJvdHRvbTtcblx0fSxcblxuXHRnZXRDZW50ZXJQb2ludDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHR2YXIgeCwgeTtcblx0XHRpZiAoaXNWZXJ0aWNhbCh0aGlzKSkge1xuXHRcdFx0eCA9IHZtLng7XG5cdFx0XHR5ID0gKHZtLnkgKyB2bS5iYXNlKSAvIDI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHggPSAodm0ueCArIHZtLmJhc2UpIC8gMjtcblx0XHRcdHkgPSB2bS55O1xuXHRcdH1cblxuXHRcdHJldHVybiB7eDogeCwgeTogeX07XG5cdH0sXG5cblx0Z2V0QXJlYTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHRyZXR1cm4gdm0ud2lkdGggKiBNYXRoLmFicyh2bS55IC0gdm0uYmFzZSk7XG5cdH0sXG5cblx0dG9vbHRpcFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHJldHVybiB7XG5cdFx0XHR4OiB2bS54LFxuXHRcdFx0eTogdm0ueVxuXHRcdH07XG5cdH1cbn0pO1xuXG59LHtcIjI2XCI6MjYsXCIyN1wiOjI3fV0sNDE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHt9O1xubW9kdWxlLmV4cG9ydHMuQXJjID0gcmVxdWlyZSgzNyk7XG5tb2R1bGUuZXhwb3J0cy5MaW5lID0gcmVxdWlyZSgzOCk7XG5tb2R1bGUuZXhwb3J0cy5Qb2ludCA9IHJlcXVpcmUoMzkpO1xubW9kdWxlLmV4cG9ydHMuUmVjdGFuZ2xlID0gcmVxdWlyZSg0MCk7XG5cbn0se1wiMzdcIjozNyxcIjM4XCI6MzgsXCIzOVwiOjM5LFwiNDBcIjo0MH1dLDQyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQzKTtcblxuLyoqXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmhlbHBlcnMuY2FudmFzXG4gKi9cbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG5cdC8qKlxuXHQgKiBDbGVhcnMgdGhlIGVudGlyZSBjYW52YXMgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gYGNoYXJ0YC5cblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSBUaGUgY2hhcnQgZm9yIHdoaWNoIHRvIGNsZWFyIHRoZSBjYW52YXMuXG5cdCAqL1xuXHRjbGVhcjogZnVuY3Rpb24oY2hhcnQpIHtcblx0XHRjaGFydC5jdHguY2xlYXJSZWN0KDAsIDAsIGNoYXJ0LndpZHRoLCBjaGFydC5oZWlnaHQpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgXCJwYXRoXCIgZm9yIGEgcmVjdGFuZ2xlIHdpdGggcm91bmRlZCBjb3JuZXJzIGF0IHBvc2l0aW9uICh4LCB5KSB3aXRoIGFcblx0ICogZ2l2ZW4gc2l6ZSAod2lkdGgsIGhlaWdodCkgYW5kIHRoZSBzYW1lIGByYWRpdXNgIGZvciBhbGwgY29ybmVycy5cblx0ICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eCAtIFRoZSBjYW52YXMgMkQgQ29udGV4dC5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IHggLSBUaGUgeCBheGlzIG9mIHRoZSBjb29yZGluYXRlIGZvciB0aGUgcmVjdGFuZ2xlIHN0YXJ0aW5nIHBvaW50LlxuXHQgKiBAcGFyYW0ge051bWJlcn0geSAtIFRoZSB5IGF4aXMgb2YgdGhlIGNvb3JkaW5hdGUgZm9yIHRoZSByZWN0YW5nbGUgc3RhcnRpbmcgcG9pbnQuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSByZWN0YW5nbGUncyB3aWR0aC5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSByZWN0YW5nbGUncyBoZWlnaHQuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSByYWRpdXMgLSBUaGUgcm91bmRlZCBhbW91bnQgKGluIHBpeGVscykgZm9yIHRoZSBmb3VyIGNvcm5lcnMuXG5cdCAqIEB0b2RvIGhhbmRsZSBgcmFkaXVzYCBhcyB0b3AtbGVmdCwgdG9wLXJpZ2h0LCBib3R0b20tcmlnaHQsIGJvdHRvbS1sZWZ0IGFycmF5L29iamVjdD9cblx0ICovXG5cdHJvdW5kZWRSZWN0OiBmdW5jdGlvbihjdHgsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cykge1xuXHRcdGlmIChyYWRpdXMpIHtcblx0XHRcdC8vIE5PVEUoU0IpIGBlcHNpbG9uYCBoZWxwcyB0byBwcmV2ZW50IG1pbm9yIGFydGlmYWN0cyBhcHBlYXJpbmdcblx0XHRcdC8vIG9uIENocm9tZSB3aGVuIGByYCBpcyBleGFjdGx5IGhhbGYgdGhlIGhlaWdodCBvciB0aGUgd2lkdGguXG5cdFx0XHR2YXIgZXBzaWxvbiA9IDAuMDAwMDAwMTtcblx0XHRcdHZhciByID0gTWF0aC5taW4ocmFkaXVzLCAoaGVpZ2h0IC8gMikgLSBlcHNpbG9uLCAod2lkdGggLyAyKSAtIGVwc2lsb24pO1xuXG5cdFx0XHRjdHgubW92ZVRvKHggKyByLCB5KTtcblx0XHRcdGN0eC5saW5lVG8oeCArIHdpZHRoIC0gciwgeSk7XG5cdFx0XHRjdHguYXJjVG8oeCArIHdpZHRoLCB5LCB4ICsgd2lkdGgsIHkgKyByLCByKTtcblx0XHRcdGN0eC5saW5lVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0IC0gcik7XG5cdFx0XHRjdHguYXJjVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4ICsgd2lkdGggLSByLCB5ICsgaGVpZ2h0LCByKTtcblx0XHRcdGN0eC5saW5lVG8oeCArIHIsIHkgKyBoZWlnaHQpO1xuXHRcdFx0Y3R4LmFyY1RvKHgsIHkgKyBoZWlnaHQsIHgsIHkgKyBoZWlnaHQgLSByLCByKTtcblx0XHRcdGN0eC5saW5lVG8oeCwgeSArIHIpO1xuXHRcdFx0Y3R4LmFyY1RvKHgsIHksIHggKyByLCB5LCByKTtcblx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdGN0eC5tb3ZlVG8oeCwgeSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGN0eC5yZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuXHRcdH1cblx0fSxcblxuXHRkcmF3UG9pbnQ6IGZ1bmN0aW9uKGN0eCwgc3R5bGUsIHJhZGl1cywgeCwgeSwgcm90YXRpb24pIHtcblx0XHR2YXIgdHlwZSwgZWRnZUxlbmd0aCwgeE9mZnNldCwgeU9mZnNldCwgaGVpZ2h0LCBzaXplO1xuXHRcdHJvdGF0aW9uID0gcm90YXRpb24gfHwgMDtcblxuXHRcdGlmIChzdHlsZSAmJiB0eXBlb2Ygc3R5bGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHR0eXBlID0gc3R5bGUudG9TdHJpbmcoKTtcblx0XHRcdGlmICh0eXBlID09PSAnW29iamVjdCBIVE1MSW1hZ2VFbGVtZW50XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSFRNTENhbnZhc0VsZW1lbnRdJykge1xuXHRcdFx0XHRjdHguZHJhd0ltYWdlKHN0eWxlLCB4IC0gc3R5bGUud2lkdGggLyAyLCB5IC0gc3R5bGUuaGVpZ2h0IC8gMiwgc3R5bGUud2lkdGgsIHN0eWxlLmhlaWdodCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNOYU4ocmFkaXVzKSB8fCByYWRpdXMgPD0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGN0eC5zYXZlKCk7XG5cdFx0Y3R4LnRyYW5zbGF0ZSh4LCB5KTtcblx0XHRjdHgucm90YXRlKHJvdGF0aW9uICogTWF0aC5QSSAvIDE4MCk7XG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXG5cdFx0c3dpdGNoIChzdHlsZSkge1xuXHRcdC8vIERlZmF1bHQgaW5jbHVkZXMgY2lyY2xlXG5cdFx0ZGVmYXVsdDpcblx0XHRcdGN0eC5hcmMoMCwgMCwgcmFkaXVzLCAwLCBNYXRoLlBJICogMik7XG5cdFx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICd0cmlhbmdsZSc6XG5cdFx0XHRlZGdlTGVuZ3RoID0gMyAqIHJhZGl1cyAvIE1hdGguc3FydCgzKTtcblx0XHRcdGhlaWdodCA9IGVkZ2VMZW5ndGggKiBNYXRoLnNxcnQoMykgLyAyO1xuXHRcdFx0Y3R4Lm1vdmVUbygtZWRnZUxlbmd0aCAvIDIsIGhlaWdodCAvIDMpO1xuXHRcdFx0Y3R4LmxpbmVUbyhlZGdlTGVuZ3RoIC8gMiwgaGVpZ2h0IC8gMyk7XG5cdFx0XHRjdHgubGluZVRvKDAsIC0yICogaGVpZ2h0IC8gMyk7XG5cdFx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdyZWN0Jzpcblx0XHRcdHNpemUgPSAxIC8gTWF0aC5TUVJUMiAqIHJhZGl1cztcblx0XHRcdGN0eC5yZWN0KC1zaXplLCAtc2l6ZSwgMiAqIHNpemUsIDIgKiBzaXplKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ3JlY3RSb3VuZGVkJzpcblx0XHRcdHZhciBvZmZzZXQgPSByYWRpdXMgLyBNYXRoLlNRUlQyO1xuXHRcdFx0dmFyIGxlZnRYID0gLW9mZnNldDtcblx0XHRcdHZhciB0b3BZID0gLW9mZnNldDtcblx0XHRcdHZhciBzaWRlU2l6ZSA9IE1hdGguU1FSVDIgKiByYWRpdXM7XG5cblx0XHRcdC8vIE5PVEUoU0IpIHRoZSByb3VuZGVkIHJlY3QgaW1wbGVtZW50YXRpb24gY2hhbmdlZCB0byB1c2UgYGFyY1RvYFxuXHRcdFx0Ly8gaW5zdGVhZCBvZiBgcXVhZHJhdGljQ3VydmVUb2Agc2luY2UgaXQgZ2VuZXJhdGVzIGJldHRlciByZXN1bHRzXG5cdFx0XHQvLyB3aGVuIHJlY3QgaXMgYWxtb3N0IGEgY2lyY2xlLiAwLjQyNSAoaW5zdGVhZCBvZiAwLjUpIHByb2R1Y2VzXG5cdFx0XHQvLyByZXN1bHRzIHZpc3VhbGx5IGNsb3NlciB0byB0aGUgcHJldmlvdXMgaW1wbC5cblx0XHRcdHRoaXMucm91bmRlZFJlY3QoY3R4LCBsZWZ0WCwgdG9wWSwgc2lkZVNpemUsIHNpZGVTaXplLCByYWRpdXMgKiAwLjQyNSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdyZWN0Um90Jzpcblx0XHRcdHNpemUgPSAxIC8gTWF0aC5TUVJUMiAqIHJhZGl1cztcblx0XHRcdGN0eC5tb3ZlVG8oLXNpemUsIDApO1xuXHRcdFx0Y3R4LmxpbmVUbygwLCBzaXplKTtcblx0XHRcdGN0eC5saW5lVG8oc2l6ZSwgMCk7XG5cdFx0XHRjdHgubGluZVRvKDAsIC1zaXplKTtcblx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2Nyb3NzJzpcblx0XHRcdGN0eC5tb3ZlVG8oMCwgcmFkaXVzKTtcblx0XHRcdGN0eC5saW5lVG8oMCwgLXJhZGl1cyk7XG5cdFx0XHRjdHgubW92ZVRvKC1yYWRpdXMsIDApO1xuXHRcdFx0Y3R4LmxpbmVUbyhyYWRpdXMsIDApO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnY3Jvc3NSb3QnOlxuXHRcdFx0eE9mZnNldCA9IE1hdGguY29zKE1hdGguUEkgLyA0KSAqIHJhZGl1cztcblx0XHRcdHlPZmZzZXQgPSBNYXRoLnNpbihNYXRoLlBJIC8gNCkgKiByYWRpdXM7XG5cdFx0XHRjdHgubW92ZVRvKC14T2Zmc2V0LCAteU9mZnNldCk7XG5cdFx0XHRjdHgubGluZVRvKHhPZmZzZXQsIHlPZmZzZXQpO1xuXHRcdFx0Y3R4Lm1vdmVUbygteE9mZnNldCwgeU9mZnNldCk7XG5cdFx0XHRjdHgubGluZVRvKHhPZmZzZXQsIC15T2Zmc2V0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ3N0YXInOlxuXHRcdFx0Y3R4Lm1vdmVUbygwLCByYWRpdXMpO1xuXHRcdFx0Y3R4LmxpbmVUbygwLCAtcmFkaXVzKTtcblx0XHRcdGN0eC5tb3ZlVG8oLXJhZGl1cywgMCk7XG5cdFx0XHRjdHgubGluZVRvKHJhZGl1cywgMCk7XG5cdFx0XHR4T2Zmc2V0ID0gTWF0aC5jb3MoTWF0aC5QSSAvIDQpICogcmFkaXVzO1xuXHRcdFx0eU9mZnNldCA9IE1hdGguc2luKE1hdGguUEkgLyA0KSAqIHJhZGl1cztcblx0XHRcdGN0eC5tb3ZlVG8oLXhPZmZzZXQsIC15T2Zmc2V0KTtcblx0XHRcdGN0eC5saW5lVG8oeE9mZnNldCwgeU9mZnNldCk7XG5cdFx0XHRjdHgubW92ZVRvKC14T2Zmc2V0LCB5T2Zmc2V0KTtcblx0XHRcdGN0eC5saW5lVG8oeE9mZnNldCwgLXlPZmZzZXQpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnbGluZSc6XG5cdFx0XHRjdHgubW92ZVRvKC1yYWRpdXMsIDApO1xuXHRcdFx0Y3R4LmxpbmVUbyhyYWRpdXMsIDApO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnZGFzaCc6XG5cdFx0XHRjdHgubW92ZVRvKDAsIDApO1xuXHRcdFx0Y3R4LmxpbmVUbyhyYWRpdXMsIDApO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0Y3R4LmZpbGwoKTtcblx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0Y3R4LnJlc3RvcmUoKTtcblx0fSxcblxuXHRjbGlwQXJlYTogZnVuY3Rpb24oY3R4LCBhcmVhKSB7XG5cdFx0Y3R4LnNhdmUoKTtcblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4LnJlY3QoYXJlYS5sZWZ0LCBhcmVhLnRvcCwgYXJlYS5yaWdodCAtIGFyZWEubGVmdCwgYXJlYS5ib3R0b20gLSBhcmVhLnRvcCk7XG5cdFx0Y3R4LmNsaXAoKTtcblx0fSxcblxuXHR1bmNsaXBBcmVhOiBmdW5jdGlvbihjdHgpIHtcblx0XHRjdHgucmVzdG9yZSgpO1xuXHR9LFxuXG5cdGxpbmVUbzogZnVuY3Rpb24oY3R4LCBwcmV2aW91cywgdGFyZ2V0LCBmbGlwKSB7XG5cdFx0aWYgKHRhcmdldC5zdGVwcGVkTGluZSkge1xuXHRcdFx0aWYgKCh0YXJnZXQuc3RlcHBlZExpbmUgPT09ICdhZnRlcicgJiYgIWZsaXApIHx8ICh0YXJnZXQuc3RlcHBlZExpbmUgIT09ICdhZnRlcicgJiYgZmxpcCkpIHtcblx0XHRcdFx0Y3R4LmxpbmVUbyhwcmV2aW91cy54LCB0YXJnZXQueSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjdHgubGluZVRvKHRhcmdldC54LCBwcmV2aW91cy55KTtcblx0XHRcdH1cblx0XHRcdGN0eC5saW5lVG8odGFyZ2V0LngsIHRhcmdldC55KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIXRhcmdldC50ZW5zaW9uKSB7XG5cdFx0XHRjdHgubGluZVRvKHRhcmdldC54LCB0YXJnZXQueSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y3R4LmJlemllckN1cnZlVG8oXG5cdFx0XHRmbGlwID8gcHJldmlvdXMuY29udHJvbFBvaW50UHJldmlvdXNYIDogcHJldmlvdXMuY29udHJvbFBvaW50TmV4dFgsXG5cdFx0XHRmbGlwID8gcHJldmlvdXMuY29udHJvbFBvaW50UHJldmlvdXNZIDogcHJldmlvdXMuY29udHJvbFBvaW50TmV4dFksXG5cdFx0XHRmbGlwID8gdGFyZ2V0LmNvbnRyb2xQb2ludE5leHRYIDogdGFyZ2V0LmNvbnRyb2xQb2ludFByZXZpb3VzWCxcblx0XHRcdGZsaXAgPyB0YXJnZXQuY29udHJvbFBvaW50TmV4dFkgOiB0YXJnZXQuY29udHJvbFBvaW50UHJldmlvdXNZLFxuXHRcdFx0dGFyZ2V0LngsXG5cdFx0XHR0YXJnZXQueSk7XG5cdH1cbn07XG5cbi8vIERFUFJFQ0FUSU9OU1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQuaGVscGVycy5jYW52YXMuY2xlYXIgaW5zdGVhZC5cbiAqIEBuYW1lc3BhY2UgQ2hhcnQuaGVscGVycy5jbGVhclxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuaGVscGVycy5jbGVhciA9IGV4cG9ydHMuY2xlYXI7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5oZWxwZXJzLmNhbnZhcy5yb3VuZGVkUmVjdCBpbnN0ZWFkLlxuICogQG5hbWVzcGFjZSBDaGFydC5oZWxwZXJzLmRyYXdSb3VuZGVkUmVjdGFuZ2xlXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNy4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5oZWxwZXJzLmRyYXdSb3VuZGVkUmVjdGFuZ2xlID0gZnVuY3Rpb24oY3R4KSB7XG5cdGN0eC5iZWdpblBhdGgoKTtcblx0ZXhwb3J0cy5yb3VuZGVkUmVjdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xufTtcblxufSx7XCI0M1wiOjQzfV0sNDM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuaGVscGVyc1xuICovXG52YXIgaGVscGVycyA9IHtcblx0LyoqXG5cdCAqIEFuIGVtcHR5IGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCBmb3Igb3B0aW9uYWwgY2FsbGJhY2suXG5cdCAqL1xuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgdW5pcXVlIGlkLCBzZXF1ZW50aWFsbHkgZ2VuZXJhdGVkIGZyb20gYSBnbG9iYWwgdmFyaWFibGUuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9XG5cdCAqIEBmdW5jdGlvblxuXHQgKi9cblx0dWlkOiAoZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlkID0gMDtcblx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gaWQrKztcblx0XHR9O1xuXHR9KCkpLFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBuZWl0aGVyIG51bGwgbm9yIHVuZGVmaW5lZCwgZWxzZSByZXR1cm5zIGZhbHNlLlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHRlc3QuXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufVxuXHQgKiBAc2luY2UgMi43LjBcblx0ICovXG5cdGlzTnVsbE9yVW5kZWY6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0cmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIHJldHVybnMgZmFsc2UuXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cblx0ICogQHJldHVybnMge0Jvb2xlYW59XG5cdCAqIEBmdW5jdGlvblxuXHQgKi9cblx0aXNBcnJheTogQXJyYXkuaXNBcnJheSA/IEFycmF5LmlzQXJyYXkgOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QgKGV4Y2x1ZGluZyBudWxsKSwgZWxzZSByZXR1cm5zIGZhbHNlLlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHRlc3QuXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufVxuXHQgKiBAc2luY2UgMi43LjBcblx0ICovXG5cdGlzT2JqZWN0OiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJztcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyBgdmFsdWVgIGlmIGRlZmluZWQsIGVsc2UgcmV0dXJucyBgZGVmYXVsdFZhbHVlYC5cblx0ICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgZGVmaW5lZC5cblx0ICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGB2YWx1ZWAgaXMgdW5kZWZpbmVkLlxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICovXG5cdHZhbHVlT3JEZWZhdWx0OiBmdW5jdGlvbih2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB2YWx1ZSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBpbiBhcnJheSBpZiBkZWZpbmVkLCBlbHNlIHJldHVybnMgYGRlZmF1bHRWYWx1ZWAuXG5cdCAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlIC0gVGhlIGFycmF5IHRvIGxvb2t1cCBmb3IgdmFsdWUgYXQgYGluZGV4YC5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGluIGB2YWx1ZWAgdG8gbG9va3VwIGZvciB2YWx1ZS5cblx0ICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGB2YWx1ZVtpbmRleF1gIGlzIHVuZGVmaW5lZC5cblx0ICogQHJldHVybnMgeyp9XG5cdCAqL1xuXHR2YWx1ZUF0SW5kZXhPckRlZmF1bHQ6IGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgZGVmYXVsdFZhbHVlKSB7XG5cdFx0cmV0dXJuIGhlbHBlcnMudmFsdWVPckRlZmF1bHQoaGVscGVycy5pc0FycmF5KHZhbHVlKSA/IHZhbHVlW2luZGV4XSA6IHZhbHVlLCBkZWZhdWx0VmFsdWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxscyBgZm5gIHdpdGggdGhlIGdpdmVuIGBhcmdzYCBpbiB0aGUgc2NvcGUgZGVmaW5lZCBieSBgdGhpc0FyZ2AgYW5kIHJldHVybnMgdGhlXG5cdCAqIHZhbHVlIHJldHVybmVkIGJ5IGBmbmAuIElmIGBmbmAgaXMgbm90IGEgZnVuY3Rpb24sIHRoaXMgbWV0aG9kIHJldHVybnMgdW5kZWZpbmVkLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBjYWxsLlxuXHQgKiBAcGFyYW0ge0FycmF5fHVuZGVmaW5lZHxudWxsfSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB3aXRoIHdoaWNoIGBmbmAgc2hvdWxkIGJlIGNhbGxlZC5cblx0ICogQHBhcmFtIHtPYmplY3R9IFt0aGlzQXJnXSAtIFRoZSB2YWx1ZSBvZiBgdGhpc2AgcHJvdmlkZWQgZm9yIHRoZSBjYWxsIHRvIGBmbmAuXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKi9cblx0Y2FsbGJhY2s6IGZ1bmN0aW9uKGZuLCBhcmdzLCB0aGlzQXJnKSB7XG5cdFx0aWYgKGZuICYmIHR5cGVvZiBmbi5jYWxsID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRyZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncyk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBOb3RlKFNCKSBmb3IgcGVyZm9ybWFuY2Ugc2FrZSwgdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGxvb3BhYmxlIHR5cGVcblx0ICogaXMgdW5rbm93biBvciBpbiBub25lIGludGVuc2l2ZSBjb2RlIChub3QgY2FsbGVkIG9mdGVuIGFuZCBzbWFsbCBsb29wYWJsZSkuIEVsc2Vcblx0ICogaXQncyBwcmVmZXJhYmxlIHRvIHVzZSBhIHJlZ3VsYXIgZm9yKCkgbG9vcCBhbmQgc2F2ZSBleHRyYSBmdW5jdGlvbiBjYWxscy5cblx0ICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IGxvb3BhYmxlIC0gVGhlIG9iamVjdCBvciBhcnJheSB0byBiZSBpdGVyYXRlZC5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpdGVtLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3RoaXNBcmddIC0gVGhlIHZhbHVlIG9mIGB0aGlzYCBwcm92aWRlZCBmb3IgdGhlIGNhbGwgdG8gYGZuYC5cblx0ICogQHBhcmFtIHtCb29sZWFufSBbcmV2ZXJzZV0gLSBJZiB0cnVlLCBpdGVyYXRlcyBiYWNrd2FyZCBvbiB0aGUgbG9vcGFibGUuXG5cdCAqL1xuXHRlYWNoOiBmdW5jdGlvbihsb29wYWJsZSwgZm4sIHRoaXNBcmcsIHJldmVyc2UpIHtcblx0XHR2YXIgaSwgbGVuLCBrZXlzO1xuXHRcdGlmIChoZWxwZXJzLmlzQXJyYXkobG9vcGFibGUpKSB7XG5cdFx0XHRsZW4gPSBsb29wYWJsZS5sZW5ndGg7XG5cdFx0XHRpZiAocmV2ZXJzZSkge1xuXHRcdFx0XHRmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0XHRcdGZuLmNhbGwodGhpc0FyZywgbG9vcGFibGVbaV0sIGkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0XHRmbi5jYWxsKHRoaXNBcmcsIGxvb3BhYmxlW2ldLCBpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaGVscGVycy5pc09iamVjdChsb29wYWJsZSkpIHtcblx0XHRcdGtleXMgPSBPYmplY3Qua2V5cyhsb29wYWJsZSk7XG5cdFx0XHRsZW4gPSBrZXlzLmxlbmd0aDtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRmbi5jYWxsKHRoaXNBcmcsIGxvb3BhYmxlW2tleXNbaV1dLCBrZXlzW2ldKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYGEwYCBhbmQgYGExYCBhcnJheXMgaGF2ZSB0aGUgc2FtZSBjb250ZW50LCBlbHNlIHJldHVybnMgZmFsc2UuXG5cdCAqIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTQ4NTM5NzRcblx0ICogQHBhcmFtIHtBcnJheX0gYTAgLSBUaGUgYXJyYXkgdG8gY29tcGFyZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBhMSAtIFRoZSBhcnJheSB0byBjb21wYXJlXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufVxuXHQgKi9cblx0YXJyYXlFcXVhbHM6IGZ1bmN0aW9uKGEwLCBhMSkge1xuXHRcdHZhciBpLCBpbGVuLCB2MCwgdjE7XG5cblx0XHRpZiAoIWEwIHx8ICFhMSB8fCBhMC5sZW5ndGggIT09IGExLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGZvciAoaSA9IDAsIGlsZW4gPSBhMC5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdHYwID0gYTBbaV07XG5cdFx0XHR2MSA9IGExW2ldO1xuXG5cdFx0XHRpZiAodjAgaW5zdGFuY2VvZiBBcnJheSAmJiB2MSBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdFx0XHRcdGlmICghaGVscGVycy5hcnJheUVxdWFscyh2MCwgdjEpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHYwICE9PSB2MSkge1xuXHRcdFx0XHQvLyBOT1RFOiB0d28gZGlmZmVyZW50IG9iamVjdCBpbnN0YW5jZXMgd2lsbCBuZXZlciBiZSBlcXVhbDoge3g6MjB9ICE9IHt4OjIwfVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBkZWVwIGNvcHkgb2YgYHNvdXJjZWAgd2l0aG91dCBrZWVwaW5nIHJlZmVyZW5jZXMgb24gb2JqZWN0cyBhbmQgYXJyYXlzLlxuXHQgKiBAcGFyYW0geyp9IHNvdXJjZSAtIFRoZSB2YWx1ZSB0byBjbG9uZS5cblx0ICogQHJldHVybnMgeyp9XG5cdCAqL1xuXHRjbG9uZTogZnVuY3Rpb24oc291cmNlKSB7XG5cdFx0aWYgKGhlbHBlcnMuaXNBcnJheShzb3VyY2UpKSB7XG5cdFx0XHRyZXR1cm4gc291cmNlLm1hcChoZWxwZXJzLmNsb25lKTtcblx0XHR9XG5cblx0XHRpZiAoaGVscGVycy5pc09iamVjdChzb3VyY2UpKSB7XG5cdFx0XHR2YXIgdGFyZ2V0ID0ge307XG5cdFx0XHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG5cdFx0XHR2YXIga2xlbiA9IGtleXMubGVuZ3RoO1xuXHRcdFx0dmFyIGsgPSAwO1xuXG5cdFx0XHRmb3IgKDsgayA8IGtsZW47ICsraykge1xuXHRcdFx0XHR0YXJnZXRba2V5c1trXV0gPSBoZWxwZXJzLmNsb25lKHNvdXJjZVtrZXlzW2tdXSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNvdXJjZTtcblx0fSxcblxuXHQvKipcblx0ICogVGhlIGRlZmF1bHQgbWVyZ2VyIHdoZW4gQ2hhcnQuaGVscGVycy5tZXJnZSBpcyBjYWxsZWQgd2l0aG91dCBtZXJnZXIgb3B0aW9uLlxuXHQgKiBOb3RlKFNCKTogdGhpcyBtZXRob2QgaXMgYWxzbyB1c2VkIGJ5IGNvbmZpZ01lcmdlIGFuZCBzY2FsZU1lcmdlIGFzIGZhbGxiYWNrLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X21lcmdlcjogZnVuY3Rpb24oa2V5LCB0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuXHRcdHZhciB0dmFsID0gdGFyZ2V0W2tleV07XG5cdFx0dmFyIHN2YWwgPSBzb3VyY2Vba2V5XTtcblxuXHRcdGlmIChoZWxwZXJzLmlzT2JqZWN0KHR2YWwpICYmIGhlbHBlcnMuaXNPYmplY3Qoc3ZhbCkpIHtcblx0XHRcdGhlbHBlcnMubWVyZ2UodHZhbCwgc3ZhbCwgb3B0aW9ucyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRhcmdldFtrZXldID0gaGVscGVycy5jbG9uZShzdmFsKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1lcmdlcyBzb3VyY2Vba2V5XSBpbiB0YXJnZXRba2V5XSBvbmx5IGlmIHRhcmdldFtrZXldIGlzIHVuZGVmaW5lZC5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9tZXJnZXJJZjogZnVuY3Rpb24oa2V5LCB0YXJnZXQsIHNvdXJjZSkge1xuXHRcdHZhciB0dmFsID0gdGFyZ2V0W2tleV07XG5cdFx0dmFyIHN2YWwgPSBzb3VyY2Vba2V5XTtcblxuXHRcdGlmIChoZWxwZXJzLmlzT2JqZWN0KHR2YWwpICYmIGhlbHBlcnMuaXNPYmplY3Qoc3ZhbCkpIHtcblx0XHRcdGhlbHBlcnMubWVyZ2VJZih0dmFsLCBzdmFsKTtcblx0XHR9IGVsc2UgaWYgKCF0YXJnZXQuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0dGFyZ2V0W2tleV0gPSBoZWxwZXJzLmNsb25lKHN2YWwpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUmVjdXJzaXZlbHkgZGVlcCBjb3BpZXMgYHNvdXJjZWAgcHJvcGVydGllcyBpbnRvIGB0YXJnZXRgIHdpdGggdGhlIGdpdmVuIGBvcHRpb25zYC5cblx0ICogSU1QT1JUQU5UOiBgdGFyZ2V0YCBpcyBub3QgY2xvbmVkIGFuZCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCBgc291cmNlYCBwcm9wZXJ0aWVzLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgaW4gd2hpY2ggYWxsIHNvdXJjZXMgYXJlIG1lcmdlZCBpbnRvLlxuXHQgKiBAcGFyYW0ge09iamVjdHxBcnJheShPYmplY3QpfSBzb3VyY2UgLSBPYmplY3QocykgdG8gbWVyZ2UgaW50byBgdGFyZ2V0YC5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIE1lcmdpbmcgb3B0aW9uczpcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMubWVyZ2VyXSAtIFRoZSBtZXJnZSBtZXRob2QgKGtleSwgdGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBgdGFyZ2V0YCBvYmplY3QuXG5cdCAqL1xuXHRtZXJnZTogZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcblx0XHR2YXIgc291cmNlcyA9IGhlbHBlcnMuaXNBcnJheShzb3VyY2UpID8gc291cmNlIDogW3NvdXJjZV07XG5cdFx0dmFyIGlsZW4gPSBzb3VyY2VzLmxlbmd0aDtcblx0XHR2YXIgbWVyZ2UsIGksIGtleXMsIGtsZW4sIGs7XG5cblx0XHRpZiAoIWhlbHBlcnMuaXNPYmplY3QodGFyZ2V0KSkge1xuXHRcdFx0cmV0dXJuIHRhcmdldDtcblx0XHR9XG5cblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0XHRtZXJnZSA9IG9wdGlvbnMubWVyZ2VyIHx8IGhlbHBlcnMuX21lcmdlcjtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdHNvdXJjZSA9IHNvdXJjZXNbaV07XG5cdFx0XHRpZiAoIWhlbHBlcnMuaXNPYmplY3Qoc291cmNlKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0a2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG5cdFx0XHRmb3IgKGsgPSAwLCBrbGVuID0ga2V5cy5sZW5ndGg7IGsgPCBrbGVuOyArK2spIHtcblx0XHRcdFx0bWVyZ2Uoa2V5c1trXSwgdGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlY3Vyc2l2ZWx5IGRlZXAgY29waWVzIGBzb3VyY2VgIHByb3BlcnRpZXMgaW50byBgdGFyZ2V0YCAqb25seSogaWYgbm90IGRlZmluZWQgaW4gdGFyZ2V0LlxuXHQgKiBJTVBPUlRBTlQ6IGB0YXJnZXRgIGlzIG5vdCBjbG9uZWQgYW5kIHdpbGwgYmUgdXBkYXRlZCB3aXRoIGBzb3VyY2VgIHByb3BlcnRpZXMuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCBpbiB3aGljaCBhbGwgc291cmNlcyBhcmUgbWVyZ2VkIGludG8uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fEFycmF5KE9iamVjdCl9IHNvdXJjZSAtIE9iamVjdChzKSB0byBtZXJnZSBpbnRvIGB0YXJnZXRgLlxuXHQgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgYHRhcmdldGAgb2JqZWN0LlxuXHQgKi9cblx0bWVyZ2VJZjogZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHtcblx0XHRyZXR1cm4gaGVscGVycy5tZXJnZSh0YXJnZXQsIHNvdXJjZSwge21lcmdlcjogaGVscGVycy5fbWVyZ2VySWZ9KTtcblx0fSxcblxuXHQvKipcblx0ICogQXBwbGllcyB0aGUgY29udGVudHMgb2YgdHdvIG9yIG1vcmUgb2JqZWN0cyB0b2dldGhlciBpbnRvIHRoZSBmaXJzdCBvYmplY3QuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCBpbiB3aGljaCBhbGwgb2JqZWN0cyBhcmUgbWVyZ2VkIGludG8uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBhcmcxIC0gT2JqZWN0IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIG1lcmdlIGluIHRhcmdldC5cblx0ICogQHBhcmFtIHtPYmplY3R9IGFyZ04gLSBBZGRpdGlvbmFsIG9iamVjdHMgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRvIG1lcmdlIGluIHRhcmdldC5cblx0ICogQHJldHVybnMge09iamVjdH0gVGhlIGB0YXJnZXRgIG9iamVjdC5cblx0ICovXG5cdGV4dGVuZDogZnVuY3Rpb24odGFyZ2V0KSB7XG5cdFx0dmFyIHNldEZuID0gZnVuY3Rpb24odmFsdWUsIGtleSkge1xuXHRcdFx0dGFyZ2V0W2tleV0gPSB2YWx1ZTtcblx0XHR9O1xuXHRcdGZvciAodmFyIGkgPSAxLCBpbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0aGVscGVycy5lYWNoKGFyZ3VtZW50c1tpXSwgc2V0Rm4pO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBCYXNpYyBqYXZhc2NyaXB0IGluaGVyaXRhbmNlIGJhc2VkIG9uIHRoZSBtb2RlbCBjcmVhdGVkIGluIEJhY2tib25lLmpzXG5cdCAqL1xuXHRpbmhlcml0czogZnVuY3Rpb24oZXh0ZW5zaW9ucykge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIENoYXJ0RWxlbWVudCA9IChleHRlbnNpb25zICYmIGV4dGVuc2lvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnN0cnVjdG9yJykpID8gZXh0ZW5zaW9ucy5jb25zdHJ1Y3RvciA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIG1lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0fTtcblxuXHRcdHZhciBTdXJyb2dhdGUgPSBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuY29uc3RydWN0b3IgPSBDaGFydEVsZW1lbnQ7XG5cdFx0fTtcblxuXHRcdFN1cnJvZ2F0ZS5wcm90b3R5cGUgPSBtZS5wcm90b3R5cGU7XG5cdFx0Q2hhcnRFbGVtZW50LnByb3RvdHlwZSA9IG5ldyBTdXJyb2dhdGUoKTtcblx0XHRDaGFydEVsZW1lbnQuZXh0ZW5kID0gaGVscGVycy5pbmhlcml0cztcblxuXHRcdGlmIChleHRlbnNpb25zKSB7XG5cdFx0XHRoZWxwZXJzLmV4dGVuZChDaGFydEVsZW1lbnQucHJvdG90eXBlLCBleHRlbnNpb25zKTtcblx0XHR9XG5cblx0XHRDaGFydEVsZW1lbnQuX19zdXBlcl9fID0gbWUucHJvdG90eXBlO1xuXHRcdHJldHVybiBDaGFydEVsZW1lbnQ7XG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaGVscGVycztcblxuLy8gREVQUkVDQVRJT05TXG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5oZWxwZXJzLmNhbGxiYWNrIGluc3RlYWQuXG4gKiBAZnVuY3Rpb24gQ2hhcnQuaGVscGVycy5jYWxsQ2FsbGJhY2tcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi42LjBcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbmhlbHBlcnMuY2FsbENhbGxiYWNrID0gaGVscGVycy5jYWxsYmFjaztcblxuLyoqXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIEFycmF5LnByb3RvdHlwZS5pbmRleE9mIGluc3RlYWQuXG4gKiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiBjb21wYXRpYmlsaXR5OiBDaHJvbWUsIE9wZXJhLCBTYWZhcmksIEZGMS41KywgSUU5K1xuICogQGZ1bmN0aW9uIENoYXJ0LmhlbHBlcnMuaW5kZXhPZlxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuaGVscGVycy5pbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGZyb21JbmRleCkge1xuXHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChhcnJheSwgaXRlbSwgZnJvbUluZGV4KTtcbn07XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5oZWxwZXJzLnZhbHVlT3JEZWZhdWx0IGluc3RlYWQuXG4gKiBAZnVuY3Rpb24gQ2hhcnQuaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdFxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQ7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5oZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdCBpbnN0ZWFkLlxuICogQGZ1bmN0aW9uIENoYXJ0LmhlbHBlcnMuZ2V0VmFsdWVBdEluZGV4T3JEZWZhdWx0XG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNy4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5oZWxwZXJzLmdldFZhbHVlQXRJbmRleE9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0O1xuXG59LHt9XSw0NDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Myk7XG5cbi8qKlxuICogRWFzaW5nIGZ1bmN0aW9ucyBhZGFwdGVkIGZyb20gUm9iZXJ0IFBlbm5lcidzIGVhc2luZyBlcXVhdGlvbnMuXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmhlbHBlcnMuZWFzaW5nRWZmZWN0c1xuICogQHNlZSBodHRwOi8vd3d3LnJvYmVydHBlbm5lci5jb20vZWFzaW5nL1xuICovXG52YXIgZWZmZWN0cyA9IHtcblx0bGluZWFyOiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuIHQ7XG5cdH0sXG5cblx0ZWFzZUluUXVhZDogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiB0ICogdDtcblx0fSxcblxuXHRlYXNlT3V0UXVhZDogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiAtdCAqICh0IC0gMik7XG5cdH0sXG5cblx0ZWFzZUluT3V0UXVhZDogZnVuY3Rpb24odCkge1xuXHRcdGlmICgodCAvPSAwLjUpIDwgMSkge1xuXHRcdFx0cmV0dXJuIDAuNSAqIHQgKiB0O1xuXHRcdH1cblx0XHRyZXR1cm4gLTAuNSAqICgoLS10KSAqICh0IC0gMikgLSAxKTtcblx0fSxcblxuXHRlYXNlSW5DdWJpYzogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiB0ICogdCAqIHQ7XG5cdH0sXG5cblx0ZWFzZU91dEN1YmljOiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuICh0ID0gdCAtIDEpICogdCAqIHQgKyAxO1xuXHR9LFxuXG5cdGVhc2VJbk91dEN1YmljOiBmdW5jdGlvbih0KSB7XG5cdFx0aWYgKCh0IC89IDAuNSkgPCAxKSB7XG5cdFx0XHRyZXR1cm4gMC41ICogdCAqIHQgKiB0O1xuXHRcdH1cblx0XHRyZXR1cm4gMC41ICogKCh0IC09IDIpICogdCAqIHQgKyAyKTtcblx0fSxcblxuXHRlYXNlSW5RdWFydDogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiB0ICogdCAqIHQgKiB0O1xuXHR9LFxuXG5cdGVhc2VPdXRRdWFydDogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiAtKCh0ID0gdCAtIDEpICogdCAqIHQgKiB0IC0gMSk7XG5cdH0sXG5cblx0ZWFzZUluT3V0UXVhcnQ6IGZ1bmN0aW9uKHQpIHtcblx0XHRpZiAoKHQgLz0gMC41KSA8IDEpIHtcblx0XHRcdHJldHVybiAwLjUgKiB0ICogdCAqIHQgKiB0O1xuXHRcdH1cblx0XHRyZXR1cm4gLTAuNSAqICgodCAtPSAyKSAqIHQgKiB0ICogdCAtIDIpO1xuXHR9LFxuXG5cdGVhc2VJblF1aW50OiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuIHQgKiB0ICogdCAqIHQgKiB0O1xuXHR9LFxuXG5cdGVhc2VPdXRRdWludDogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiAodCA9IHQgLSAxKSAqIHQgKiB0ICogdCAqIHQgKyAxO1xuXHR9LFxuXG5cdGVhc2VJbk91dFF1aW50OiBmdW5jdGlvbih0KSB7XG5cdFx0aWYgKCh0IC89IDAuNSkgPCAxKSB7XG5cdFx0XHRyZXR1cm4gMC41ICogdCAqIHQgKiB0ICogdCAqIHQ7XG5cdFx0fVxuXHRcdHJldHVybiAwLjUgKiAoKHQgLT0gMikgKiB0ICogdCAqIHQgKiB0ICsgMik7XG5cdH0sXG5cblx0ZWFzZUluU2luZTogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiAtTWF0aC5jb3ModCAqIChNYXRoLlBJIC8gMikpICsgMTtcblx0fSxcblxuXHRlYXNlT3V0U2luZTogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiBNYXRoLnNpbih0ICogKE1hdGguUEkgLyAyKSk7XG5cdH0sXG5cblx0ZWFzZUluT3V0U2luZTogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiAtMC41ICogKE1hdGguY29zKE1hdGguUEkgKiB0KSAtIDEpO1xuXHR9LFxuXG5cdGVhc2VJbkV4cG86IGZ1bmN0aW9uKHQpIHtcblx0XHRyZXR1cm4gKHQgPT09IDApID8gMCA6IE1hdGgucG93KDIsIDEwICogKHQgLSAxKSk7XG5cdH0sXG5cblx0ZWFzZU91dEV4cG86IGZ1bmN0aW9uKHQpIHtcblx0XHRyZXR1cm4gKHQgPT09IDEpID8gMSA6IC1NYXRoLnBvdygyLCAtMTAgKiB0KSArIDE7XG5cdH0sXG5cblx0ZWFzZUluT3V0RXhwbzogZnVuY3Rpb24odCkge1xuXHRcdGlmICh0ID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cdFx0aWYgKHQgPT09IDEpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblx0XHRpZiAoKHQgLz0gMC41KSA8IDEpIHtcblx0XHRcdHJldHVybiAwLjUgKiBNYXRoLnBvdygyLCAxMCAqICh0IC0gMSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gMC41ICogKC1NYXRoLnBvdygyLCAtMTAgKiAtLXQpICsgMik7XG5cdH0sXG5cblx0ZWFzZUluQ2lyYzogZnVuY3Rpb24odCkge1xuXHRcdGlmICh0ID49IDEpIHtcblx0XHRcdHJldHVybiB0O1xuXHRcdH1cblx0XHRyZXR1cm4gLShNYXRoLnNxcnQoMSAtIHQgKiB0KSAtIDEpO1xuXHR9LFxuXG5cdGVhc2VPdXRDaXJjOiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuIE1hdGguc3FydCgxIC0gKHQgPSB0IC0gMSkgKiB0KTtcblx0fSxcblxuXHRlYXNlSW5PdXRDaXJjOiBmdW5jdGlvbih0KSB7XG5cdFx0aWYgKCh0IC89IDAuNSkgPCAxKSB7XG5cdFx0XHRyZXR1cm4gLTAuNSAqIChNYXRoLnNxcnQoMSAtIHQgKiB0KSAtIDEpO1xuXHRcdH1cblx0XHRyZXR1cm4gMC41ICogKE1hdGguc3FydCgxIC0gKHQgLT0gMikgKiB0KSArIDEpO1xuXHR9LFxuXG5cdGVhc2VJbkVsYXN0aWM6IGZ1bmN0aW9uKHQpIHtcblx0XHR2YXIgcyA9IDEuNzAxNTg7XG5cdFx0dmFyIHAgPSAwO1xuXHRcdHZhciBhID0gMTtcblx0XHRpZiAodCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXHRcdGlmICh0ID09PSAxKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cdFx0aWYgKCFwKSB7XG5cdFx0XHRwID0gMC4zO1xuXHRcdH1cblx0XHRpZiAoYSA8IDEpIHtcblx0XHRcdGEgPSAxO1xuXHRcdFx0cyA9IHAgLyA0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzID0gcCAvICgyICogTWF0aC5QSSkgKiBNYXRoLmFzaW4oMSAvIGEpO1xuXHRcdH1cblx0XHRyZXR1cm4gLShhICogTWF0aC5wb3coMiwgMTAgKiAodCAtPSAxKSkgKiBNYXRoLnNpbigodCAtIHMpICogKDIgKiBNYXRoLlBJKSAvIHApKTtcblx0fSxcblxuXHRlYXNlT3V0RWxhc3RpYzogZnVuY3Rpb24odCkge1xuXHRcdHZhciBzID0gMS43MDE1ODtcblx0XHR2YXIgcCA9IDA7XG5cdFx0dmFyIGEgPSAxO1xuXHRcdGlmICh0ID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cdFx0aWYgKHQgPT09IDEpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblx0XHRpZiAoIXApIHtcblx0XHRcdHAgPSAwLjM7XG5cdFx0fVxuXHRcdGlmIChhIDwgMSkge1xuXHRcdFx0YSA9IDE7XG5cdFx0XHRzID0gcCAvIDQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHMgPSBwIC8gKDIgKiBNYXRoLlBJKSAqIE1hdGguYXNpbigxIC8gYSk7XG5cdFx0fVxuXHRcdHJldHVybiBhICogTWF0aC5wb3coMiwgLTEwICogdCkgKiBNYXRoLnNpbigodCAtIHMpICogKDIgKiBNYXRoLlBJKSAvIHApICsgMTtcblx0fSxcblxuXHRlYXNlSW5PdXRFbGFzdGljOiBmdW5jdGlvbih0KSB7XG5cdFx0dmFyIHMgPSAxLjcwMTU4O1xuXHRcdHZhciBwID0gMDtcblx0XHR2YXIgYSA9IDE7XG5cdFx0aWYgKHQgPT09IDApIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblx0XHRpZiAoKHQgLz0gMC41KSA9PT0gMikge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXHRcdGlmICghcCkge1xuXHRcdFx0cCA9IDAuNDU7XG5cdFx0fVxuXHRcdGlmIChhIDwgMSkge1xuXHRcdFx0YSA9IDE7XG5cdFx0XHRzID0gcCAvIDQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHMgPSBwIC8gKDIgKiBNYXRoLlBJKSAqIE1hdGguYXNpbigxIC8gYSk7XG5cdFx0fVxuXHRcdGlmICh0IDwgMSkge1xuXHRcdFx0cmV0dXJuIC0wLjUgKiAoYSAqIE1hdGgucG93KDIsIDEwICogKHQgLT0gMSkpICogTWF0aC5zaW4oKHQgLSBzKSAqICgyICogTWF0aC5QSSkgLyBwKSk7XG5cdFx0fVxuXHRcdHJldHVybiBhICogTWF0aC5wb3coMiwgLTEwICogKHQgLT0gMSkpICogTWF0aC5zaW4oKHQgLSBzKSAqICgyICogTWF0aC5QSSkgLyBwKSAqIDAuNSArIDE7XG5cdH0sXG5cdGVhc2VJbkJhY2s6IGZ1bmN0aW9uKHQpIHtcblx0XHR2YXIgcyA9IDEuNzAxNTg7XG5cdFx0cmV0dXJuIHQgKiB0ICogKChzICsgMSkgKiB0IC0gcyk7XG5cdH0sXG5cblx0ZWFzZU91dEJhY2s6IGZ1bmN0aW9uKHQpIHtcblx0XHR2YXIgcyA9IDEuNzAxNTg7XG5cdFx0cmV0dXJuICh0ID0gdCAtIDEpICogdCAqICgocyArIDEpICogdCArIHMpICsgMTtcblx0fSxcblxuXHRlYXNlSW5PdXRCYWNrOiBmdW5jdGlvbih0KSB7XG5cdFx0dmFyIHMgPSAxLjcwMTU4O1xuXHRcdGlmICgodCAvPSAwLjUpIDwgMSkge1xuXHRcdFx0cmV0dXJuIDAuNSAqICh0ICogdCAqICgoKHMgKj0gKDEuNTI1KSkgKyAxKSAqIHQgLSBzKSk7XG5cdFx0fVxuXHRcdHJldHVybiAwLjUgKiAoKHQgLT0gMikgKiB0ICogKCgocyAqPSAoMS41MjUpKSArIDEpICogdCArIHMpICsgMik7XG5cdH0sXG5cblx0ZWFzZUluQm91bmNlOiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuIDEgLSBlZmZlY3RzLmVhc2VPdXRCb3VuY2UoMSAtIHQpO1xuXHR9LFxuXG5cdGVhc2VPdXRCb3VuY2U6IGZ1bmN0aW9uKHQpIHtcblx0XHRpZiAodCA8ICgxIC8gMi43NSkpIHtcblx0XHRcdHJldHVybiA3LjU2MjUgKiB0ICogdDtcblx0XHR9XG5cdFx0aWYgKHQgPCAoMiAvIDIuNzUpKSB7XG5cdFx0XHRyZXR1cm4gNy41NjI1ICogKHQgLT0gKDEuNSAvIDIuNzUpKSAqIHQgKyAwLjc1O1xuXHRcdH1cblx0XHRpZiAodCA8ICgyLjUgLyAyLjc1KSkge1xuXHRcdFx0cmV0dXJuIDcuNTYyNSAqICh0IC09ICgyLjI1IC8gMi43NSkpICogdCArIDAuOTM3NTtcblx0XHR9XG5cdFx0cmV0dXJuIDcuNTYyNSAqICh0IC09ICgyLjYyNSAvIDIuNzUpKSAqIHQgKyAwLjk4NDM3NTtcblx0fSxcblxuXHRlYXNlSW5PdXRCb3VuY2U6IGZ1bmN0aW9uKHQpIHtcblx0XHRpZiAodCA8IDAuNSkge1xuXHRcdFx0cmV0dXJuIGVmZmVjdHMuZWFzZUluQm91bmNlKHQgKiAyKSAqIDAuNTtcblx0XHR9XG5cdFx0cmV0dXJuIGVmZmVjdHMuZWFzZU91dEJvdW5jZSh0ICogMiAtIDEpICogMC41ICsgMC41O1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0ZWZmZWN0czogZWZmZWN0c1xufTtcblxuLy8gREVQUkVDQVRJT05TXG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5oZWxwZXJzLmVhc2luZy5lZmZlY3RzIGluc3RlYWQuXG4gKiBAZnVuY3Rpb24gQ2hhcnQuaGVscGVycy5lYXNpbmdFZmZlY3RzXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNy4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5oZWxwZXJzLmVhc2luZ0VmZmVjdHMgPSBlZmZlY3RzO1xuXG59LHtcIjQzXCI6NDN9XSw0NTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Myk7XG5cbi8qKlxuICogQGFsaWFzIENoYXJ0LmhlbHBlcnMub3B0aW9uc1xuICogQG5hbWVzcGFjZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0LyoqXG5cdCAqIENvbnZlcnRzIHRoZSBnaXZlbiBsaW5lIGhlaWdodCBgdmFsdWVgIGluIHBpeGVscyBmb3IgYSBzcGVjaWZpYyBmb250IGBzaXplYC5cblx0ICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSB2YWx1ZSAtIFRoZSBsaW5lSGVpZ2h0IHRvIHBhcnNlIChlZy4gMS42LCAnMTRweCcsICc3NSUnLCAnMS42ZW0nKS5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IHNpemUgLSBUaGUgZm9udCBzaXplIChpbiBwaXhlbHMpIHVzZWQgdG8gcmVzb2x2ZSByZWxhdGl2ZSBgdmFsdWVgLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgZWZmZWN0aXZlIGxpbmUgaGVpZ2h0IGluIHBpeGVscyAoc2l6ZSAqIDEuMiBpZiB2YWx1ZSBpcyBpbnZhbGlkKS5cblx0ICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvbGluZS1oZWlnaHRcblx0ICogQHNpbmNlIDIuNy4wXG5cdCAqL1xuXHR0b0xpbmVIZWlnaHQ6IGZ1bmN0aW9uKHZhbHVlLCBzaXplKSB7XG5cdFx0dmFyIG1hdGNoZXMgPSAoJycgKyB2YWx1ZSkubWF0Y2goL14obm9ybWFsfChcXGQrKD86XFwuXFxkKyk/KShweHxlbXwlKT8pJC8pO1xuXHRcdGlmICghbWF0Y2hlcyB8fCBtYXRjaGVzWzFdID09PSAnbm9ybWFsJykge1xuXHRcdFx0cmV0dXJuIHNpemUgKiAxLjI7XG5cdFx0fVxuXG5cdFx0dmFsdWUgPSArbWF0Y2hlc1syXTtcblxuXHRcdHN3aXRjaCAobWF0Y2hlc1szXSkge1xuXHRcdGNhc2UgJ3B4Jzpcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRjYXNlICclJzpcblx0XHRcdHZhbHVlIC89IDEwMDtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRyZXR1cm4gc2l6ZSAqIHZhbHVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhIHBhZGRpbmcgb2JqZWN0IHdpdGggcHJlLWNvbXB1dGVkIHdpZHRoL2hlaWdodC5cblx0ICogQHBhcmFtIHtOdW1iZXJ8T2JqZWN0fSB2YWx1ZSAtIElmIGEgbnVtYmVyLCBzZXQgdGhlIHZhbHVlIHRvIGFsbCBUUkJMIGNvbXBvbmVudCxcblx0ICogIGVsc2UsIGlmIGFuZCBvYmplY3QsIHVzZSBkZWZpbmVkIHByb3BlcnRpZXMgYW5kIHNldHMgdW5kZWZpbmVkIG9uZXMgdG8gMC5cblx0ICogQHJldHVybnMge09iamVjdH0gVGhlIHBhZGRpbmcgdmFsdWVzICh0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHdpZHRoLCBoZWlnaHQpXG5cdCAqIEBzaW5jZSAyLjcuMFxuXHQgKi9cblx0dG9QYWRkaW5nOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHZhciB0LCByLCBiLCBsO1xuXG5cdFx0aWYgKGhlbHBlcnMuaXNPYmplY3QodmFsdWUpKSB7XG5cdFx0XHR0ID0gK3ZhbHVlLnRvcCB8fCAwO1xuXHRcdFx0ciA9ICt2YWx1ZS5yaWdodCB8fCAwO1xuXHRcdFx0YiA9ICt2YWx1ZS5ib3R0b20gfHwgMDtcblx0XHRcdGwgPSArdmFsdWUubGVmdCB8fCAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0ID0gciA9IGIgPSBsID0gK3ZhbHVlIHx8IDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogdCxcblx0XHRcdHJpZ2h0OiByLFxuXHRcdFx0Ym90dG9tOiBiLFxuXHRcdFx0bGVmdDogbCxcblx0XHRcdGhlaWdodDogdCArIGIsXG5cdFx0XHR3aWR0aDogbCArIHJcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIGBpbnB1dHNgIHNlcXVlbnRpYWxseSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgZGVmaW5lZCB2YWx1ZS5cblx0ICogQHBhcmFtIHtBcnJheVtdfSBpbnB1dHMgLSBBbiBhcnJheSBvZiB2YWx1ZXMsIGZhbGxpbmcgYmFjayB0byB0aGUgbGFzdCB2YWx1ZS5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0XSAtIElmIGRlZmluZWQgYW5kIHRoZSBjdXJyZW50IHZhbHVlIGlzIGEgZnVuY3Rpb24sIHRoZSB2YWx1ZVxuXHQgKiBpcyBjYWxsZWQgd2l0aCBgY29udGV4dGAgYXMgZmlyc3QgYXJndW1lbnQgYW5kIHRoZSByZXN1bHQgYmVjb21lcyB0aGUgbmV3IGlucHV0LlxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2luZGV4XSAtIElmIGRlZmluZWQgYW5kIHRoZSBjdXJyZW50IHZhbHVlIGlzIGFuIGFycmF5LCB0aGUgdmFsdWVcblx0ICogYXQgYGluZGV4YCBiZWNvbWUgdGhlIG5ldyBpbnB1dC5cblx0ICogQHNpbmNlIDIuNy4wXG5cdCAqL1xuXHRyZXNvbHZlOiBmdW5jdGlvbihpbnB1dHMsIGNvbnRleHQsIGluZGV4KSB7XG5cdFx0dmFyIGksIGlsZW4sIHZhbHVlO1xuXG5cdFx0Zm9yIChpID0gMCwgaWxlbiA9IGlucHV0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdHZhbHVlID0gaW5wdXRzW2ldO1xuXHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoY29udGV4dCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlKGNvbnRleHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaGVscGVycy5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlW2luZGV4XTtcblx0XHRcdH1cblx0XHRcdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbn0se1wiNDNcIjo0M31dLDQ2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKDQzKTtcbm1vZHVsZS5leHBvcnRzLmVhc2luZyA9IHJlcXVpcmUoNDQpO1xubW9kdWxlLmV4cG9ydHMuY2FudmFzID0gcmVxdWlyZSg0Mik7XG5tb2R1bGUuZXhwb3J0cy5vcHRpb25zID0gcmVxdWlyZSg0NSk7XG5cbn0se1wiNDJcIjo0MixcIjQzXCI6NDMsXCI0NFwiOjQ0LFwiNDVcIjo0NX1dLDQ3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogUGxhdGZvcm0gZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gKG1pbmltYWwpLlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9wdWxsLzQ1OTEjaXNzdWVjb21tZW50LTMxOTU3NTkzOVxuICovXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRhY3F1aXJlQ29udGV4dDogZnVuY3Rpb24oaXRlbSkge1xuXHRcdGlmIChpdGVtICYmIGl0ZW0uY2FudmFzKSB7XG5cdFx0XHQvLyBTdXBwb3J0IGZvciBhbnkgb2JqZWN0IGFzc29jaWF0ZWQgdG8gYSBjYW52YXMgKGluY2x1ZGluZyBhIGNvbnRleHQyZClcblx0XHRcdGl0ZW0gPSBpdGVtLmNhbnZhcztcblx0XHR9XG5cblx0XHRyZXR1cm4gaXRlbSAmJiBpdGVtLmdldENvbnRleHQoJzJkJykgfHwgbnVsbDtcblx0fVxufTtcblxufSx7fV0sNDg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBDaGFydC5QbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbiBmb3IgdGFyZ2V0aW5nIGEgd2ViIGJyb3dzZXJcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG5cbnZhciBFWFBBTkRPX0tFWSA9ICckY2hhcnRqcyc7XG52YXIgQ1NTX1BSRUZJWCA9ICdjaGFydGpzLSc7XG52YXIgQ1NTX1JFTkRFUl9NT05JVE9SID0gQ1NTX1BSRUZJWCArICdyZW5kZXItbW9uaXRvcic7XG52YXIgQ1NTX1JFTkRFUl9BTklNQVRJT04gPSBDU1NfUFJFRklYICsgJ3JlbmRlci1hbmltYXRpb24nO1xudmFyIEFOSU1BVElPTl9TVEFSVF9FVkVOVFMgPSBbJ2FuaW1hdGlvbnN0YXJ0JywgJ3dlYmtpdEFuaW1hdGlvblN0YXJ0J107XG5cbi8qKlxuICogRE9NIGV2ZW50IHR5cGVzIC0+IENoYXJ0LmpzIGV2ZW50IHR5cGVzLlxuICogTm90ZTogb25seSBldmVudHMgd2l0aCBkaWZmZXJlbnQgdHlwZXMgYXJlIG1hcHBlZC5cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzXG4gKi9cbnZhciBFVkVOVF9UWVBFUyA9IHtcblx0dG91Y2hzdGFydDogJ21vdXNlZG93bicsXG5cdHRvdWNobW92ZTogJ21vdXNlbW92ZScsXG5cdHRvdWNoZW5kOiAnbW91c2V1cCcsXG5cdHBvaW50ZXJlbnRlcjogJ21vdXNlZW50ZXInLFxuXHRwb2ludGVyZG93bjogJ21vdXNlZG93bicsXG5cdHBvaW50ZXJtb3ZlOiAnbW91c2Vtb3ZlJyxcblx0cG9pbnRlcnVwOiAnbW91c2V1cCcsXG5cdHBvaW50ZXJsZWF2ZTogJ21vdXNlb3V0Jyxcblx0cG9pbnRlcm91dDogJ21vdXNlb3V0J1xufTtcblxuLyoqXG4gKiBUaGUgXCJ1c2VkXCIgc2l6ZSBpcyB0aGUgZmluYWwgdmFsdWUgb2YgYSBkaW1lbnNpb24gcHJvcGVydHkgYWZ0ZXIgYWxsIGNhbGN1bGF0aW9ucyBoYXZlXG4gKiBiZWVuIHBlcmZvcm1lZC4gVGhpcyBtZXRob2QgdXNlcyB0aGUgY29tcHV0ZWQgc3R5bGUgb2YgYGVsZW1lbnRgIGJ1dCByZXR1cm5zIHVuZGVmaW5lZFxuICogaWYgdGhlIGNvbXB1dGVkIHN0eWxlIGlzIG5vdCBleHByZXNzZWQgaW4gcGl4ZWxzLiBUaGF0IGNhbiBoYXBwZW4gaW4gc29tZSBjYXNlcyB3aGVyZVxuICogYGVsZW1lbnRgIGhhcyBhIHNpemUgcmVsYXRpdmUgdG8gaXRzIHBhcmVudCBhbmQgdGhpcyBsYXN0IG9uZSBpcyBub3QgeWV0IGRpc3BsYXllZCxcbiAqIGZvciBleGFtcGxlIGJlY2F1c2Ugb2YgYGRpc3BsYXk6IG5vbmVgIG9uIGEgcGFyZW50IG5vZGUuXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy91c2VkX3ZhbHVlXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBTaXplIGluIHBpeGVscyBvciB1bmRlZmluZWQgaWYgdW5rbm93bi5cbiAqL1xuZnVuY3Rpb24gcmVhZFVzZWRTaXplKGVsZW1lbnQsIHByb3BlcnR5KSB7XG5cdHZhciB2YWx1ZSA9IGhlbHBlcnMuZ2V0U3R5bGUoZWxlbWVudCwgcHJvcGVydHkpO1xuXHR2YXIgbWF0Y2hlcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKC9eKFxcZCspKFxcLlxcZCspP3B4JC8pO1xuXHRyZXR1cm4gbWF0Y2hlcyA/IE51bWJlcihtYXRjaGVzWzFdKSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgY2FudmFzIHN0eWxlIGFuZCByZW5kZXIgc2l6ZSB3aXRob3V0IG1vZGlmeWluZyB0aGUgY2FudmFzIGRpc3BsYXkgc2l6ZSxcbiAqIHNpbmNlIHJlc3BvbnNpdmVuZXNzIGlzIGhhbmRsZWQgYnkgdGhlIGNvbnRyb2xsZXIucmVzaXplKCkgbWV0aG9kLiBUaGUgY29uZmlnIGlzIHVzZWRcbiAqIHRvIGRldGVybWluZSB0aGUgYXNwZWN0IHJhdGlvIHRvIGFwcGx5IGluIGNhc2Ugbm8gZXhwbGljaXQgaGVpZ2h0IGhhcyBiZWVuIHNwZWNpZmllZC5cbiAqL1xuZnVuY3Rpb24gaW5pdENhbnZhcyhjYW52YXMsIGNvbmZpZykge1xuXHR2YXIgc3R5bGUgPSBjYW52YXMuc3R5bGU7XG5cblx0Ly8gTk9URShTQikgY2FudmFzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKSAhPT0gY2FudmFzLndpZHRoOiBpbiB0aGUgZmlyc3QgY2FzZSBpdFxuXHQvLyByZXR1cm5zIG51bGwgb3IgJycgaWYgbm8gZXhwbGljaXQgdmFsdWUgaGFzIGJlZW4gc2V0IHRvIHRoZSBjYW52YXMgYXR0cmlidXRlLlxuXHR2YXIgcmVuZGVySGVpZ2h0ID0gY2FudmFzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG5cdHZhciByZW5kZXJXaWR0aCA9IGNhbnZhcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyk7XG5cblx0Ly8gQ2hhcnQuanMgbW9kaWZpZXMgc29tZSBjYW52YXMgdmFsdWVzIHRoYXQgd2Ugd2FudCB0byByZXN0b3JlIG9uIGRlc3Ryb3lcblx0Y2FudmFzW0VYUEFORE9fS0VZXSA9IHtcblx0XHRpbml0aWFsOiB7XG5cdFx0XHRoZWlnaHQ6IHJlbmRlckhlaWdodCxcblx0XHRcdHdpZHRoOiByZW5kZXJXaWR0aCxcblx0XHRcdHN0eWxlOiB7XG5cdFx0XHRcdGRpc3BsYXk6IHN0eWxlLmRpc3BsYXksXG5cdFx0XHRcdGhlaWdodDogc3R5bGUuaGVpZ2h0LFxuXHRcdFx0XHR3aWR0aDogc3R5bGUud2lkdGhcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0Ly8gRm9yY2UgY2FudmFzIHRvIGRpc3BsYXkgYXMgYmxvY2sgdG8gYXZvaWQgZXh0cmEgc3BhY2UgY2F1c2VkIGJ5IGlubGluZVxuXHQvLyBlbGVtZW50cywgd2hpY2ggd291bGQgaW50ZXJmZXJlIHdpdGggdGhlIHJlc3BvbnNpdmUgcmVzaXplIHByb2Nlc3MuXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8yNTM4XG5cdHN0eWxlLmRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5IHx8ICdibG9jayc7XG5cblx0aWYgKHJlbmRlcldpZHRoID09PSBudWxsIHx8IHJlbmRlcldpZHRoID09PSAnJykge1xuXHRcdHZhciBkaXNwbGF5V2lkdGggPSByZWFkVXNlZFNpemUoY2FudmFzLCAnd2lkdGgnKTtcblx0XHRpZiAoZGlzcGxheVdpZHRoICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNhbnZhcy53aWR0aCA9IGRpc3BsYXlXaWR0aDtcblx0XHR9XG5cdH1cblxuXHRpZiAocmVuZGVySGVpZ2h0ID09PSBudWxsIHx8IHJlbmRlckhlaWdodCA9PT0gJycpIHtcblx0XHRpZiAoY2FudmFzLnN0eWxlLmhlaWdodCA9PT0gJycpIHtcblx0XHRcdC8vIElmIG5vIGV4cGxpY2l0IHJlbmRlciBoZWlnaHQgYW5kIHN0eWxlIGhlaWdodCwgbGV0J3MgYXBwbHkgdGhlIGFzcGVjdCByYXRpbyxcblx0XHRcdC8vIHdoaWNoIG9uZSBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGJ1dCBhbHNvIGJ5IGNoYXJ0cyBhcyBkZWZhdWx0IG9wdGlvblxuXHRcdFx0Ly8gKGkuZS4gb3B0aW9ucy5hc3BlY3RSYXRpbykuIElmIG5vdCBzcGVjaWZpZWQsIHVzZSBjYW52YXMgYXNwZWN0IHJhdGlvIG9mIDIuXG5cdFx0XHRjYW52YXMuaGVpZ2h0ID0gY2FudmFzLndpZHRoIC8gKGNvbmZpZy5vcHRpb25zLmFzcGVjdFJhdGlvIHx8IDIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgZGlzcGxheUhlaWdodCA9IHJlYWRVc2VkU2l6ZShjYW52YXMsICdoZWlnaHQnKTtcblx0XHRcdGlmIChkaXNwbGF5V2lkdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjYW52YXMuaGVpZ2h0ID0gZGlzcGxheUhlaWdodDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY2FudmFzO1xufVxuXG4vKipcbiAqIERldGVjdHMgc3VwcG9ydCBmb3Igb3B0aW9ucyBvYmplY3QgYXJndW1lbnQgaW4gYWRkRXZlbnRMaXN0ZW5lci5cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyI1NhZmVseV9kZXRlY3Rpbmdfb3B0aW9uX3N1cHBvcnRcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBzdXBwb3J0c0V2ZW50TGlzdGVuZXJPcHRpb25zID0gKGZ1bmN0aW9uKCkge1xuXHR2YXIgc3VwcG9ydHMgPSBmYWxzZTtcblx0dHJ5IHtcblx0XHR2YXIgb3B0aW9ucyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRzdXBwb3J0cyA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2UnLCBudWxsLCBvcHRpb25zKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3Jcblx0fVxuXHRyZXR1cm4gc3VwcG9ydHM7XG59KCkpO1xuXG4vLyBEZWZhdWx0IHBhc3NpdmUgdG8gdHJ1ZSBhcyBleHBlY3RlZCBieSBDaHJvbWUgZm9yICd0b3VjaHN0YXJ0JyBhbmQgJ3RvdWNoZW5kJyBldmVudHMuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNDI4N1xudmFyIGV2ZW50TGlzdGVuZXJPcHRpb25zID0gc3VwcG9ydHNFdmVudExpc3RlbmVyT3B0aW9ucyA/IHtwYXNzaXZlOiB0cnVlfSA6IGZhbHNlO1xuXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKG5vZGUsIHR5cGUsIGxpc3RlbmVyKSB7XG5cdG5vZGUuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgZXZlbnRMaXN0ZW5lck9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKG5vZGUsIHR5cGUsIGxpc3RlbmVyKSB7XG5cdG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgZXZlbnRMaXN0ZW5lck9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFdmVudCh0eXBlLCBjaGFydCwgeCwgeSwgbmF0aXZlRXZlbnQpIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlLFxuXHRcdGNoYXJ0OiBjaGFydCxcblx0XHRuYXRpdmU6IG5hdGl2ZUV2ZW50IHx8IG51bGwsXG5cdFx0eDogeCAhPT0gdW5kZWZpbmVkID8geCA6IG51bGwsXG5cdFx0eTogeSAhPT0gdW5kZWZpbmVkID8geSA6IG51bGwsXG5cdH07XG59XG5cbmZ1bmN0aW9uIGZyb21OYXRpdmVFdmVudChldmVudCwgY2hhcnQpIHtcblx0dmFyIHR5cGUgPSBFVkVOVF9UWVBFU1tldmVudC50eXBlXSB8fCBldmVudC50eXBlO1xuXHR2YXIgcG9zID0gaGVscGVycy5nZXRSZWxhdGl2ZVBvc2l0aW9uKGV2ZW50LCBjaGFydCk7XG5cdHJldHVybiBjcmVhdGVFdmVudCh0eXBlLCBjaGFydCwgcG9zLngsIHBvcy55LCBldmVudCk7XG59XG5cbmZ1bmN0aW9uIHRocm90dGxlZChmbiwgdGhpc0FyZykge1xuXHR2YXIgdGlja2luZyA9IGZhbHNlO1xuXHR2YXIgYXJncyA9IFtdO1xuXG5cdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0XHR0aGlzQXJnID0gdGhpc0FyZyB8fCB0aGlzO1xuXG5cdFx0aWYgKCF0aWNraW5nKSB7XG5cdFx0XHR0aWNraW5nID0gdHJ1ZTtcblx0XHRcdGhlbHBlcnMucmVxdWVzdEFuaW1GcmFtZS5jYWxsKHdpbmRvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHRpY2tpbmcgPSBmYWxzZTtcblx0XHRcdFx0Zm4uYXBwbHkodGhpc0FyZywgYXJncyk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG59XG5cbi8vIEltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJjai9jc3MtZWxlbWVudC1xdWVyaWVzXG5mdW5jdGlvbiBjcmVhdGVSZXNpemVyKGhhbmRsZXIpIHtcblx0dmFyIHJlc2l6ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0dmFyIGNscyA9IENTU19QUkVGSVggKyAnc2l6ZS1tb25pdG9yJztcblx0dmFyIG1heFNpemUgPSAxMDAwMDAwO1xuXHR2YXIgc3R5bGUgPVxuXHRcdCdwb3NpdGlvbjphYnNvbHV0ZTsnICtcblx0XHQnbGVmdDowOycgK1xuXHRcdCd0b3A6MDsnICtcblx0XHQncmlnaHQ6MDsnICtcblx0XHQnYm90dG9tOjA7JyArXG5cdFx0J292ZXJmbG93OmhpZGRlbjsnICtcblx0XHQncG9pbnRlci1ldmVudHM6bm9uZTsnICtcblx0XHQndmlzaWJpbGl0eTpoaWRkZW47JyArXG5cdFx0J3otaW5kZXg6LTE7JztcblxuXHRyZXNpemVyLnN0eWxlLmNzc1RleHQgPSBzdHlsZTtcblx0cmVzaXplci5jbGFzc05hbWUgPSBjbHM7XG5cdHJlc2l6ZXIuaW5uZXJIVE1MID1cblx0XHQnPGRpdiBjbGFzcz1cIicgKyBjbHMgKyAnLWV4cGFuZFwiIHN0eWxlPVwiJyArIHN0eWxlICsgJ1wiPicgK1xuXHRcdFx0JzxkaXYgc3R5bGU9XCInICtcblx0XHRcdFx0J3Bvc2l0aW9uOmFic29sdXRlOycgK1xuXHRcdFx0XHQnd2lkdGg6JyArIG1heFNpemUgKyAncHg7JyArXG5cdFx0XHRcdCdoZWlnaHQ6JyArIG1heFNpemUgKyAncHg7JyArXG5cdFx0XHRcdCdsZWZ0OjA7JyArXG5cdFx0XHRcdCd0b3A6MFwiPicgK1xuXHRcdFx0JzwvZGl2PicgK1xuXHRcdCc8L2Rpdj4nICtcblx0XHQnPGRpdiBjbGFzcz1cIicgKyBjbHMgKyAnLXNocmlua1wiIHN0eWxlPVwiJyArIHN0eWxlICsgJ1wiPicgK1xuXHRcdFx0JzxkaXYgc3R5bGU9XCInICtcblx0XHRcdFx0J3Bvc2l0aW9uOmFic29sdXRlOycgK1xuXHRcdFx0XHQnd2lkdGg6MjAwJTsnICtcblx0XHRcdFx0J2hlaWdodDoyMDAlOycgK1xuXHRcdFx0XHQnbGVmdDowOyAnICtcblx0XHRcdFx0J3RvcDowXCI+JyArXG5cdFx0XHQnPC9kaXY+JyArXG5cdFx0JzwvZGl2Pic7XG5cblx0dmFyIGV4cGFuZCA9IHJlc2l6ZXIuY2hpbGROb2Rlc1swXTtcblx0dmFyIHNocmluayA9IHJlc2l6ZXIuY2hpbGROb2Rlc1sxXTtcblxuXHRyZXNpemVyLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuXHRcdGV4cGFuZC5zY3JvbGxMZWZ0ID0gbWF4U2l6ZTtcblx0XHRleHBhbmQuc2Nyb2xsVG9wID0gbWF4U2l6ZTtcblx0XHRzaHJpbmsuc2Nyb2xsTGVmdCA9IG1heFNpemU7XG5cdFx0c2hyaW5rLnNjcm9sbFRvcCA9IG1heFNpemU7XG5cdH07XG5cdHZhciBvblNjcm9sbCA9IGZ1bmN0aW9uKCkge1xuXHRcdHJlc2l6ZXIuX3Jlc2V0KCk7XG5cdFx0aGFuZGxlcigpO1xuXHR9O1xuXG5cdGFkZEV2ZW50TGlzdGVuZXIoZXhwYW5kLCAnc2Nyb2xsJywgb25TY3JvbGwuYmluZChleHBhbmQsICdleHBhbmQnKSk7XG5cdGFkZEV2ZW50TGlzdGVuZXIoc2hyaW5rLCAnc2Nyb2xsJywgb25TY3JvbGwuYmluZChzaHJpbmssICdzaHJpbmsnKSk7XG5cblx0cmV0dXJuIHJlc2l6ZXI7XG59XG5cbi8vIGh0dHBzOi8vZGF2aWR3YWxzaC5uYW1lL2RldGVjdC1ub2RlLWluc2VydGlvblxuZnVuY3Rpb24gd2F0Y2hGb3JSZW5kZXIobm9kZSwgaGFuZGxlcikge1xuXHR2YXIgZXhwYW5kbyA9IG5vZGVbRVhQQU5ET19LRVldIHx8IChub2RlW0VYUEFORE9fS0VZXSA9IHt9KTtcblx0dmFyIHByb3h5ID0gZXhwYW5kby5yZW5kZXJQcm94eSA9IGZ1bmN0aW9uKGUpIHtcblx0XHRpZiAoZS5hbmltYXRpb25OYW1lID09PSBDU1NfUkVOREVSX0FOSU1BVElPTikge1xuXHRcdFx0aGFuZGxlcigpO1xuXHRcdH1cblx0fTtcblxuXHRoZWxwZXJzLmVhY2goQU5JTUFUSU9OX1NUQVJUX0VWRU5UUywgZnVuY3Rpb24odHlwZSkge1xuXHRcdGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgdHlwZSwgcHJveHkpO1xuXHR9KTtcblxuXHQvLyAjNDczNzogQ2hyb21lIG1pZ2h0IHNraXAgdGhlIENTUyBhbmltYXRpb24gd2hlbiB0aGUgQ1NTX1JFTkRFUl9NT05JVE9SIGNsYXNzXG5cdC8vIGlzIHJlbW92ZWQgdGhlbiBhZGRlZCBiYWNrIGltbWVkaWF0ZWx5IChzYW1lIGFuaW1hdGlvbiBmcmFtZT8pLiBBY2Nlc3NpbmcgdGhlXG5cdC8vIGBvZmZzZXRQYXJlbnRgIHByb3BlcnR5IHdpbGwgZm9yY2UgYSByZWZsb3cgYW5kIHJlLWV2YWx1YXRlIHRoZSBDU1MgYW5pbWF0aW9uLlxuXHQvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9wYXVsaXJpc2gvNWQ1MmZiMDgxYjM1NzBjODFlM2EjYm94LW1ldHJpY3Ncblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzQ3Mzdcblx0ZXhwYW5kby5yZWZsb3cgPSAhIW5vZGUub2Zmc2V0UGFyZW50O1xuXG5cdG5vZGUuY2xhc3NMaXN0LmFkZChDU1NfUkVOREVSX01PTklUT1IpO1xufVxuXG5mdW5jdGlvbiB1bndhdGNoRm9yUmVuZGVyKG5vZGUpIHtcblx0dmFyIGV4cGFuZG8gPSBub2RlW0VYUEFORE9fS0VZXSB8fCB7fTtcblx0dmFyIHByb3h5ID0gZXhwYW5kby5yZW5kZXJQcm94eTtcblxuXHRpZiAocHJveHkpIHtcblx0XHRoZWxwZXJzLmVhY2goQU5JTUFUSU9OX1NUQVJUX0VWRU5UUywgZnVuY3Rpb24odHlwZSkge1xuXHRcdFx0cmVtb3ZlRXZlbnRMaXN0ZW5lcihub2RlLCB0eXBlLCBwcm94eSk7XG5cdFx0fSk7XG5cblx0XHRkZWxldGUgZXhwYW5kby5yZW5kZXJQcm94eTtcblx0fVxuXG5cdG5vZGUuY2xhc3NMaXN0LnJlbW92ZShDU1NfUkVOREVSX01PTklUT1IpO1xufVxuXG5mdW5jdGlvbiBhZGRSZXNpemVMaXN0ZW5lcihub2RlLCBsaXN0ZW5lciwgY2hhcnQpIHtcblx0dmFyIGV4cGFuZG8gPSBub2RlW0VYUEFORE9fS0VZXSB8fCAobm9kZVtFWFBBTkRPX0tFWV0gPSB7fSk7XG5cblx0Ly8gTGV0J3Mga2VlcCB0cmFjayBvZiB0aGlzIGFkZGVkIHJlc2l6ZXIgYW5kIHRodXMgYXZvaWQgRE9NIHF1ZXJ5IHdoZW4gcmVtb3ZpbmcgaXQuXG5cdHZhciByZXNpemVyID0gZXhwYW5kby5yZXNpemVyID0gY3JlYXRlUmVzaXplcih0aHJvdHRsZWQoZnVuY3Rpb24oKSB7XG5cdFx0aWYgKGV4cGFuZG8ucmVzaXplcikge1xuXHRcdFx0cmV0dXJuIGxpc3RlbmVyKGNyZWF0ZUV2ZW50KCdyZXNpemUnLCBjaGFydCkpO1xuXHRcdH1cblx0fSkpO1xuXG5cdC8vIFRoZSByZXNpemVyIG5lZWRzIHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBub2RlIHBhcmVudCwgc28gd2UgZmlyc3QgbmVlZCB0byBiZVxuXHQvLyBzdXJlIHRoYXQgYG5vZGVgIGlzIGF0dGFjaGVkIHRvIHRoZSBET00gYmVmb3JlIGluamVjdGluZyB0aGUgcmVzaXplciBlbGVtZW50LlxuXHR3YXRjaEZvclJlbmRlcihub2RlLCBmdW5jdGlvbigpIHtcblx0XHRpZiAoZXhwYW5kby5yZXNpemVyKSB7XG5cdFx0XHR2YXIgY29udGFpbmVyID0gbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKGNvbnRhaW5lciAmJiBjb250YWluZXIgIT09IHJlc2l6ZXIucGFyZW50Tm9kZSkge1xuXHRcdFx0XHRjb250YWluZXIuaW5zZXJ0QmVmb3JlKHJlc2l6ZXIsIGNvbnRhaW5lci5maXJzdENoaWxkKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhlIGNvbnRhaW5lciBzaXplIG1pZ2h0IGhhdmUgY2hhbmdlZCwgbGV0J3MgcmVzZXQgdGhlIHJlc2l6ZXIgc3RhdGUuXG5cdFx0XHRyZXNpemVyLl9yZXNldCgpO1xuXHRcdH1cblx0fSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVJlc2l6ZUxpc3RlbmVyKG5vZGUpIHtcblx0dmFyIGV4cGFuZG8gPSBub2RlW0VYUEFORE9fS0VZXSB8fCB7fTtcblx0dmFyIHJlc2l6ZXIgPSBleHBhbmRvLnJlc2l6ZXI7XG5cblx0ZGVsZXRlIGV4cGFuZG8ucmVzaXplcjtcblx0dW53YXRjaEZvclJlbmRlcihub2RlKTtcblxuXHRpZiAocmVzaXplciAmJiByZXNpemVyLnBhcmVudE5vZGUpIHtcblx0XHRyZXNpemVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocmVzaXplcik7XG5cdH1cbn1cblxuZnVuY3Rpb24gaW5qZWN0Q1NTKHBsYXRmb3JtLCBjc3MpIHtcblx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3EvMzkyMjEzOVxuXHR2YXIgc3R5bGUgPSBwbGF0Zm9ybS5fc3R5bGUgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcblx0aWYgKCFwbGF0Zm9ybS5fc3R5bGUpIHtcblx0XHRwbGF0Zm9ybS5fc3R5bGUgPSBzdHlsZTtcblx0XHRjc3MgPSAnLyogQ2hhcnQuanMgKi9cXG4nICsgY3NzO1xuXHRcdHN0eWxlLnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2NzcycpO1xuXHRcdGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXHR9XG5cblx0c3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHQvKipcblx0ICogVGhpcyBwcm9wZXJ0eSBob2xkcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0gaXMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuXG5cdCAqIEN1cnJlbnRseSB1c2VkIGJ5IHBsYXRmb3JtLmpzIHRvIHNlbGVjdCB0aGUgcHJvcGVyIGltcGxlbWVudGF0aW9uLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2VuYWJsZWQ6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcsXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGtleWZyYW1lcyA9ICdmcm9te29wYWNpdHk6MC45OX10b3tvcGFjaXR5OjF9JztcblxuXHRcdGluamVjdENTUyh0aGlzLFxuXHRcdFx0Ly8gRE9NIHJlbmRlcmluZyBkZXRlY3Rpb25cblx0XHRcdC8vIGh0dHBzOi8vZGF2aWR3YWxzaC5uYW1lL2RldGVjdC1ub2RlLWluc2VydGlvblxuXHRcdFx0J0Atd2Via2l0LWtleWZyYW1lcyAnICsgQ1NTX1JFTkRFUl9BTklNQVRJT04gKyAneycgKyBrZXlmcmFtZXMgKyAnfScgK1xuXHRcdFx0J0BrZXlmcmFtZXMgJyArIENTU19SRU5ERVJfQU5JTUFUSU9OICsgJ3snICsga2V5ZnJhbWVzICsgJ30nICtcblx0XHRcdCcuJyArIENTU19SRU5ERVJfTU9OSVRPUiArICd7JyArXG5cdFx0XHRcdCctd2Via2l0LWFuaW1hdGlvbjonICsgQ1NTX1JFTkRFUl9BTklNQVRJT04gKyAnIDAuMDAxczsnICtcblx0XHRcdFx0J2FuaW1hdGlvbjonICsgQ1NTX1JFTkRFUl9BTklNQVRJT04gKyAnIDAuMDAxczsnICtcblx0XHRcdCd9J1xuXHRcdCk7XG5cdH0sXG5cblx0YWNxdWlyZUNvbnRleHQ6IGZ1bmN0aW9uKGl0ZW0sIGNvbmZpZykge1xuXHRcdGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGl0ZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpdGVtKTtcblx0XHR9IGVsc2UgaWYgKGl0ZW0ubGVuZ3RoKSB7XG5cdFx0XHQvLyBTdXBwb3J0IGZvciBhcnJheSBiYXNlZCBxdWVyaWVzIChzdWNoIGFzIGpRdWVyeSlcblx0XHRcdGl0ZW0gPSBpdGVtWzBdO1xuXHRcdH1cblxuXHRcdGlmIChpdGVtICYmIGl0ZW0uY2FudmFzKSB7XG5cdFx0XHQvLyBTdXBwb3J0IGZvciBhbnkgb2JqZWN0IGFzc29jaWF0ZWQgdG8gYSBjYW52YXMgKGluY2x1ZGluZyBhIGNvbnRleHQyZClcblx0XHRcdGl0ZW0gPSBpdGVtLmNhbnZhcztcblx0XHR9XG5cblx0XHQvLyBUbyBwcmV2ZW50IGNhbnZhcyBmaW5nZXJwcmludGluZywgc29tZSBhZGQtb25zIHVuZGVmaW5lIHRoZSBnZXRDb250ZXh0XG5cdFx0Ly8gbWV0aG9kLCBmb3IgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL2trYXBzbmVyL0NhbnZhc0Jsb2NrZXJcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMjgwN1xuXHRcdHZhciBjb250ZXh0ID0gaXRlbSAmJiBpdGVtLmdldENvbnRleHQgJiYgaXRlbS5nZXRDb250ZXh0KCcyZCcpO1xuXG5cdFx0Ly8gYGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEYCBmYWlscyB3aGVuIHRoZSBpdGVtIGlzXG5cdFx0Ly8gaW5zaWRlIGFuIGlmcmFtZSBvciB3aGVuIHJ1bm5pbmcgaW4gYSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQuIFdlIGNvdWxkIGd1ZXNzIHRoZVxuXHRcdC8vIHR5cGVzIGZyb20gdGhlaXIgdG9TdHJpbmcoKSB2YWx1ZSBidXQgbGV0J3Mga2VlcCB0aGluZ3MgZmxleGlibGUgYW5kIGFzc3VtZSBpdCdzXG5cdFx0Ly8gYSBzdWZmaWNpZW50IGNvbmRpdGlvbiBpZiB0aGUgaXRlbSBoYXMgYSBjb250ZXh0MkQgd2hpY2ggaGFzIGl0ZW0gYXMgYGNhbnZhc2AuXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzM4ODdcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNDEwMlxuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy80MTUyXG5cdFx0aWYgKGNvbnRleHQgJiYgY29udGV4dC5jYW52YXMgPT09IGl0ZW0pIHtcblx0XHRcdGluaXRDYW52YXMoaXRlbSwgY29uZmlnKTtcblx0XHRcdHJldHVybiBjb250ZXh0O1xuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXHR9LFxuXG5cdHJlbGVhc2VDb250ZXh0OiBmdW5jdGlvbihjb250ZXh0KSB7XG5cdFx0dmFyIGNhbnZhcyA9IGNvbnRleHQuY2FudmFzO1xuXHRcdGlmICghY2FudmFzW0VYUEFORE9fS0VZXSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBpbml0aWFsID0gY2FudmFzW0VYUEFORE9fS0VZXS5pbml0aWFsO1xuXHRcdFsnaGVpZ2h0JywgJ3dpZHRoJ10uZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG5cdFx0XHR2YXIgdmFsdWUgPSBpbml0aWFsW3Byb3BdO1xuXHRcdFx0aWYgKGhlbHBlcnMuaXNOdWxsT3JVbmRlZih2YWx1ZSkpIHtcblx0XHRcdFx0Y2FudmFzLnJlbW92ZUF0dHJpYnV0ZShwcm9wKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNhbnZhcy5zZXRBdHRyaWJ1dGUocHJvcCwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aGVscGVycy5lYWNoKGluaXRpYWwuc3R5bGUgfHwge30sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcblx0XHRcdGNhbnZhcy5zdHlsZVtrZXldID0gdmFsdWU7XG5cdFx0fSk7XG5cblx0XHQvLyBUaGUgY2FudmFzIHJlbmRlciBzaXplIG1pZ2h0IGhhdmUgYmVlbiBjaGFuZ2VkIChhbmQgdGh1cyB0aGUgc3RhdGUgc3RhY2sgZGlzY2FyZGVkKSxcblx0XHQvLyB3ZSBjYW4ndCB1c2Ugc2F2ZSgpIGFuZCByZXN0b3JlKCkgdG8gcmVzdG9yZSB0aGUgaW5pdGlhbCBzdGF0ZS4gU28gbWFrZSBzdXJlIHRoYXQgYXRcblx0XHQvLyBsZWFzdCB0aGUgY2FudmFzIGNvbnRleHQgaXMgcmVzZXQgdG8gdGhlIGRlZmF1bHQgc3RhdGUgYnkgc2V0dGluZyB0aGUgY2FudmFzIHdpZHRoLlxuXHRcdC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDExL1dELWh0bWw1LTIwMTEwNTI1L3RoZS1jYW52YXMtZWxlbWVudC5odG1sXG5cdFx0Y2FudmFzLndpZHRoID0gY2FudmFzLndpZHRoO1xuXG5cdFx0ZGVsZXRlIGNhbnZhc1tFWFBBTkRPX0tFWV07XG5cdH0sXG5cblx0YWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oY2hhcnQsIHR5cGUsIGxpc3RlbmVyKSB7XG5cdFx0dmFyIGNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcblx0XHRpZiAodHlwZSA9PT0gJ3Jlc2l6ZScpIHtcblx0XHRcdC8vIE5vdGU6IHRoZSByZXNpemUgZXZlbnQgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgYnJvd3NlcnMuXG5cdFx0XHRhZGRSZXNpemVMaXN0ZW5lcihjYW52YXMsIGxpc3RlbmVyLCBjaGFydCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGV4cGFuZG8gPSBsaXN0ZW5lcltFWFBBTkRPX0tFWV0gfHwgKGxpc3RlbmVyW0VYUEFORE9fS0VZXSA9IHt9KTtcblx0XHR2YXIgcHJveGllcyA9IGV4cGFuZG8ucHJveGllcyB8fCAoZXhwYW5kby5wcm94aWVzID0ge30pO1xuXHRcdHZhciBwcm94eSA9IHByb3hpZXNbY2hhcnQuaWQgKyAnXycgKyB0eXBlXSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0XHRsaXN0ZW5lcihmcm9tTmF0aXZlRXZlbnQoZXZlbnQsIGNoYXJ0KSk7XG5cdFx0fTtcblxuXHRcdGFkZEV2ZW50TGlzdGVuZXIoY2FudmFzLCB0eXBlLCBwcm94eSk7XG5cdH0sXG5cblx0cmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oY2hhcnQsIHR5cGUsIGxpc3RlbmVyKSB7XG5cdFx0dmFyIGNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcblx0XHRpZiAodHlwZSA9PT0gJ3Jlc2l6ZScpIHtcblx0XHRcdC8vIE5vdGU6IHRoZSByZXNpemUgZXZlbnQgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgYnJvd3NlcnMuXG5cdFx0XHRyZW1vdmVSZXNpemVMaXN0ZW5lcihjYW52YXMsIGxpc3RlbmVyKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgZXhwYW5kbyA9IGxpc3RlbmVyW0VYUEFORE9fS0VZXSB8fCB7fTtcblx0XHR2YXIgcHJveGllcyA9IGV4cGFuZG8ucHJveGllcyB8fCB7fTtcblx0XHR2YXIgcHJveHkgPSBwcm94aWVzW2NoYXJ0LmlkICsgJ18nICsgdHlwZV07XG5cdFx0aWYgKCFwcm94eSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHJlbW92ZUV2ZW50TGlzdGVuZXIoY2FudmFzLCB0eXBlLCBwcm94eSk7XG5cdH1cbn07XG5cbi8vIERFUFJFQ0FUSU9OU1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgRXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciBpbnN0ZWFkLlxuICogRXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciBjb21wYXRpYmlsaXR5OiBDaHJvbWUsIE9wZXJhIDcsIFNhZmFyaSwgRkYxLjUrLCBJRTkrXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyXG4gKiBAZnVuY3Rpb24gQ2hhcnQuaGVscGVycy5hZGRFdmVudFxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuaGVscGVycy5hZGRFdmVudCA9IGFkZEV2ZW50TGlzdGVuZXI7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBFdmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyIGluc3RlYWQuXG4gKiBFdmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyIGNvbXBhdGliaWxpdHk6IENocm9tZSwgT3BlcmEgNywgU2FmYXJpLCBGRjEuNSssIElFOStcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50VGFyZ2V0L3JlbW92ZUV2ZW50TGlzdGVuZXJcbiAqIEBmdW5jdGlvbiBDaGFydC5oZWxwZXJzLnJlbW92ZUV2ZW50XG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNy4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5oZWxwZXJzLnJlbW92ZUV2ZW50ID0gcmVtb3ZlRXZlbnRMaXN0ZW5lcjtcblxufSx7XCI0NlwiOjQ2fV0sNDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xudmFyIGJhc2ljID0gcmVxdWlyZSg0Nyk7XG52YXIgZG9tID0gcmVxdWlyZSg0OCk7XG5cbi8vIEBUT0RPIE1ha2UgcG9zc2libGUgdG8gc2VsZWN0IGFub3RoZXIgcGxhdGZvcm0gYXQgYnVpbGQgdGltZS5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IGRvbS5fZW5hYmxlZCA/IGRvbSA6IGJhc2ljO1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgQ2hhcnQucGxhdGZvcm1cbiAqIEBzZWUgaHR0cHM6Ly9jaGFydGpzLmdpdGJvb2tzLmlvL3Byb3Bvc2Fscy9jb250ZW50L1BsYXRmb3JtLmh0bWxcbiAqIEBzaW5jZSAyLjQuMFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGhlbHBlcnMuZXh0ZW5kKHtcblx0LyoqXG5cdCAqIEBzaW5jZSAyLjcuMFxuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7fSxcblxuXHQvKipcblx0ICogQ2FsbGVkIGF0IGNoYXJ0IGNvbnN0cnVjdGlvbiB0aW1lLCByZXR1cm5zIGEgY29udGV4dDJkIGluc3RhbmNlIGltcGxlbWVudGluZ1xuXHQgKiB0aGUgW1czQyBDYW52YXMgMkQgQ29udGV4dCBBUEkgc3RhbmRhcmRde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yZGNvbnRleHQvfS5cblx0ICogQHBhcmFtIHsqfSBpdGVtIC0gVGhlIG5hdGl2ZSBpdGVtIGZyb20gd2hpY2ggdG8gYWNxdWlyZSBjb250ZXh0IChwbGF0Zm9ybSBzcGVjaWZpYylcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgY2hhcnQgb3B0aW9uc1xuXHQgKiBAcmV0dXJucyB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjb250ZXh0MmQgaW5zdGFuY2Vcblx0ICovXG5cdGFjcXVpcmVDb250ZXh0OiBmdW5jdGlvbigpIHt9LFxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgYXQgY2hhcnQgZGVzdHJ1Y3Rpb24gdGltZSwgcmVsZWFzZXMgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0XG5cdCAqIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgdGhlIGFjcXVpcmVDb250ZXh0KCkgbWV0aG9kLlxuXHQgKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dCAtIFRoZSBjb250ZXh0MmQgaW5zdGFuY2Vcblx0ICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIG1ldGhvZCBzdWNjZWVkZWQsIGVsc2UgZmFsc2Vcblx0ICovXG5cdHJlbGVhc2VDb250ZXh0OiBmdW5jdGlvbigpIHt9LFxuXG5cdC8qKlxuXHQgKiBSZWdpc3RlcnMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBvbiB0aGUgZ2l2ZW4gY2hhcnQuXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gQ2hhcnQgZnJvbSB3aGljaCB0byBsaXN0ZW4gZm9yIGV2ZW50XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gVGhlICh7QGxpbmsgSUV2ZW50fSkgdHlwZSB0byBsaXN0ZW4gZm9yXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gUmVjZWl2ZXMgYSBub3RpZmljYXRpb24gKGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHNcblx0ICogdGhlIHtAbGluayBJRXZlbnR9IGludGVyZmFjZSkgd2hlbiBhbiBldmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgb2NjdXJzLlxuXHQgKi9cblx0YWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7fSxcblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIGFkZEV2ZW50TGlzdGVuZXIuXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC1DaGFydCBmcm9tIHdoaWNoIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXJcblx0ICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgKHtAbGluayBJRXZlbnR9KSB0eXBlIHRvIHJlbW92ZVxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUgZnJvbSB0aGUgZXZlbnQgdGFyZ2V0LlxuXHQgKi9cblx0cmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7fVxuXG59LCBpbXBsZW1lbnRhdGlvbik7XG5cbi8qKlxuICogQGludGVyZmFjZSBJUGxhdGZvcm1cbiAqIEFsbG93cyBhYnN0cmFjdGluZyBwbGF0Zm9ybSBkZXBlbmRlbmNpZXMgYXdheSBmcm9tIHRoZSBjaGFydFxuICogQGJvcnJvd3MgQ2hhcnQucGxhdGZvcm0uYWNxdWlyZUNvbnRleHQgYXMgYWNxdWlyZUNvbnRleHRcbiAqIEBib3Jyb3dzIENoYXJ0LnBsYXRmb3JtLnJlbGVhc2VDb250ZXh0IGFzIHJlbGVhc2VDb250ZXh0XG4gKiBAYm9ycm93cyBDaGFydC5wbGF0Zm9ybS5hZGRFdmVudExpc3RlbmVyIGFzIGFkZEV2ZW50TGlzdGVuZXJcbiAqIEBib3Jyb3dzIENoYXJ0LnBsYXRmb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIgYXMgcmVtb3ZlRXZlbnRMaXN0ZW5lclxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBJRXZlbnRcbiAqIEBwcm9wIHtTdHJpbmd9IHR5cGUgLSBUaGUgZXZlbnQgdHlwZSBuYW1lLCBwb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICogJ2NvbnRleHRtZW51JywgJ21vdXNlZW50ZXInLCAnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJywgJ21vdXNlb3V0JyxcbiAqICdjbGljaycsICdkYmxjbGljaycsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJyBhbmQgJ3Jlc2l6ZSdcbiAqIEBwcm9wIHsqfSBuYXRpdmUgLSBUaGUgb3JpZ2luYWwgbmF0aXZlIGV2ZW50IChudWxsIGZvciBlbXVsYXRlZCBldmVudHMsIGUuZy4gJ3Jlc2l6ZScpXG4gKiBAcHJvcCB7TnVtYmVyfSB4IC0gVGhlIG1vdXNlIHggcG9zaXRpb24sIHJlbGF0aXZlIHRvIHRoZSBjYW52YXMgKG51bGwgZm9yIGluY29tcGF0aWJsZSBldmVudHMpXG4gKiBAcHJvcCB7TnVtYmVyfSB5IC0gVGhlIG1vdXNlIHkgcG9zaXRpb24sIHJlbGF0aXZlIHRvIHRoZSBjYW52YXMgKG51bGwgZm9yIGluY29tcGF0aWJsZSBldmVudHMpXG4gKi9cblxufSx7XCI0NlwiOjQ2LFwiNDdcIjo0NyxcIjQ4XCI6NDh9XSw1MDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge307XG5tb2R1bGUuZXhwb3J0cy5maWxsZXIgPSByZXF1aXJlKDUxKTtcbm1vZHVsZS5leHBvcnRzLmxlZ2VuZCA9IHJlcXVpcmUoNTIpO1xubW9kdWxlLmV4cG9ydHMudGl0bGUgPSByZXF1aXJlKDUzKTtcblxufSx7XCI1MVwiOjUxLFwiNTJcIjo1MixcIjUzXCI6NTN9XSw1MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIFBsdWdpbiBiYXNlZCBvbiBkaXNjdXNzaW9uIGZyb20gdGhlIGZvbGxvd2luZyBDaGFydC5qcyBpc3N1ZXM6XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8yMzgwI2lzc3VlY29tbWVudC0yNzk5NjE1NjlcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzI0NDAjaXNzdWVjb21tZW50LTI1NjQ2MTg5N1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XG52YXIgZWxlbWVudHMgPSByZXF1aXJlKDQxKTtcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG5cbmRlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcblx0cGx1Z2luczoge1xuXHRcdGZpbGxlcjoge1xuXHRcdFx0cHJvcGFnYXRlOiB0cnVlXG5cdFx0fVxuXHR9XG59KTtcblxudmFyIG1hcHBlcnMgPSB7XG5cdGRhdGFzZXQ6IGZ1bmN0aW9uKHNvdXJjZSkge1xuXHRcdHZhciBpbmRleCA9IHNvdXJjZS5maWxsO1xuXHRcdHZhciBjaGFydCA9IHNvdXJjZS5jaGFydDtcblx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGluZGV4KTtcblx0XHR2YXIgdmlzaWJsZSA9IG1ldGEgJiYgY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpbmRleCk7XG5cdFx0dmFyIHBvaW50cyA9ICh2aXNpYmxlICYmIG1ldGEuZGF0YXNldC5fY2hpbGRyZW4pIHx8IFtdO1xuXHRcdHZhciBsZW5ndGggPSBwb2ludHMubGVuZ3RoIHx8IDA7XG5cblx0XHRyZXR1cm4gIWxlbmd0aCA/IG51bGwgOiBmdW5jdGlvbihwb2ludCwgaSkge1xuXHRcdFx0cmV0dXJuIChpIDwgbGVuZ3RoICYmIHBvaW50c1tpXS5fdmlldykgfHwgbnVsbDtcblx0XHR9O1xuXHR9LFxuXG5cdGJvdW5kYXJ5OiBmdW5jdGlvbihzb3VyY2UpIHtcblx0XHR2YXIgYm91bmRhcnkgPSBzb3VyY2UuYm91bmRhcnk7XG5cdFx0dmFyIHggPSBib3VuZGFyeSA/IGJvdW5kYXJ5LnggOiBudWxsO1xuXHRcdHZhciB5ID0gYm91bmRhcnkgPyBib3VuZGFyeS55IDogbnVsbDtcblxuXHRcdHJldHVybiBmdW5jdGlvbihwb2ludCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0eDogeCA9PT0gbnVsbCA/IHBvaW50LnggOiB4LFxuXHRcdFx0XHR5OiB5ID09PSBudWxsID8gcG9pbnQueSA6IHksXG5cdFx0XHR9O1xuXHRcdH07XG5cdH1cbn07XG5cbi8vIEB0b2RvIGlmIChmaWxsWzBdID09PSAnIycpXG5mdW5jdGlvbiBkZWNvZGVGaWxsKGVsLCBpbmRleCwgY291bnQpIHtcblx0dmFyIG1vZGVsID0gZWwuX21vZGVsIHx8IHt9O1xuXHR2YXIgZmlsbCA9IG1vZGVsLmZpbGw7XG5cdHZhciB0YXJnZXQ7XG5cblx0aWYgKGZpbGwgPT09IHVuZGVmaW5lZCkge1xuXHRcdGZpbGwgPSAhIW1vZGVsLmJhY2tncm91bmRDb2xvcjtcblx0fVxuXG5cdGlmIChmaWxsID09PSBmYWxzZSB8fCBmaWxsID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aWYgKGZpbGwgPT09IHRydWUpIHtcblx0XHRyZXR1cm4gJ29yaWdpbic7XG5cdH1cblxuXHR0YXJnZXQgPSBwYXJzZUZsb2F0KGZpbGwsIDEwKTtcblx0aWYgKGlzRmluaXRlKHRhcmdldCkgJiYgTWF0aC5mbG9vcih0YXJnZXQpID09PSB0YXJnZXQpIHtcblx0XHRpZiAoZmlsbFswXSA9PT0gJy0nIHx8IGZpbGxbMF0gPT09ICcrJykge1xuXHRcdFx0dGFyZ2V0ID0gaW5kZXggKyB0YXJnZXQ7XG5cdFx0fVxuXG5cdFx0aWYgKHRhcmdldCA9PT0gaW5kZXggfHwgdGFyZ2V0IDwgMCB8fCB0YXJnZXQgPj0gY291bnQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXHR9XG5cblx0c3dpdGNoIChmaWxsKSB7XG5cdC8vIGNvbXBhdGliaWxpdHlcblx0Y2FzZSAnYm90dG9tJzpcblx0XHRyZXR1cm4gJ3N0YXJ0Jztcblx0Y2FzZSAndG9wJzpcblx0XHRyZXR1cm4gJ2VuZCc7XG5cdGNhc2UgJ3plcm8nOlxuXHRcdHJldHVybiAnb3JpZ2luJztcblx0Ly8gc3VwcG9ydGVkIGJvdW5kYXJpZXNcblx0Y2FzZSAnb3JpZ2luJzpcblx0Y2FzZSAnc3RhcnQnOlxuXHRjYXNlICdlbmQnOlxuXHRcdHJldHVybiBmaWxsO1xuXHQvLyBpbnZhbGlkIGZpbGwgdmFsdWVzXG5cdGRlZmF1bHQ6XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVCb3VuZGFyeShzb3VyY2UpIHtcblx0dmFyIG1vZGVsID0gc291cmNlLmVsLl9tb2RlbCB8fCB7fTtcblx0dmFyIHNjYWxlID0gc291cmNlLmVsLl9zY2FsZSB8fCB7fTtcblx0dmFyIGZpbGwgPSBzb3VyY2UuZmlsbDtcblx0dmFyIHRhcmdldCA9IG51bGw7XG5cdHZhciBob3Jpem9udGFsO1xuXG5cdGlmIChpc0Zpbml0ZShmaWxsKSkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gQmFja3dhcmQgY29tcGF0aWJpbGl0eTogdW50aWwgdjMsIHdlIHN0aWxsIG5lZWQgdG8gc3VwcG9ydCBib3VuZGFyeSB2YWx1ZXMgc2V0IG9uXG5cdC8vIHRoZSBtb2RlbCAoc2NhbGVUb3AsIHNjYWxlQm90dG9tIGFuZCBzY2FsZVplcm8pIGJlY2F1c2Ugc29tZSBleHRlcm5hbCBwbHVnaW5zIGFuZFxuXHQvLyBjb250cm9sbGVycyBtaWdodCBzdGlsbCB1c2UgaXQgKGUuZy4gdGhlIFNtaXRoIGNoYXJ0KS5cblxuXHRpZiAoZmlsbCA9PT0gJ3N0YXJ0Jykge1xuXHRcdHRhcmdldCA9IG1vZGVsLnNjYWxlQm90dG9tID09PSB1bmRlZmluZWQgPyBzY2FsZS5ib3R0b20gOiBtb2RlbC5zY2FsZUJvdHRvbTtcblx0fSBlbHNlIGlmIChmaWxsID09PSAnZW5kJykge1xuXHRcdHRhcmdldCA9IG1vZGVsLnNjYWxlVG9wID09PSB1bmRlZmluZWQgPyBzY2FsZS50b3AgOiBtb2RlbC5zY2FsZVRvcDtcblx0fSBlbHNlIGlmIChtb2RlbC5zY2FsZVplcm8gIT09IHVuZGVmaW5lZCkge1xuXHRcdHRhcmdldCA9IG1vZGVsLnNjYWxlWmVybztcblx0fSBlbHNlIGlmIChzY2FsZS5nZXRCYXNlUG9zaXRpb24pIHtcblx0XHR0YXJnZXQgPSBzY2FsZS5nZXRCYXNlUG9zaXRpb24oKTtcblx0fSBlbHNlIGlmIChzY2FsZS5nZXRCYXNlUGl4ZWwpIHtcblx0XHR0YXJnZXQgPSBzY2FsZS5nZXRCYXNlUGl4ZWwoKTtcblx0fVxuXG5cdGlmICh0YXJnZXQgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQgIT09IG51bGwpIHtcblx0XHRpZiAodGFyZ2V0LnggIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQueSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh0YXJnZXQpKSB7XG5cdFx0XHRob3Jpem9udGFsID0gc2NhbGUuaXNIb3Jpem9udGFsKCk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR4OiBob3Jpem9udGFsID8gdGFyZ2V0IDogbnVsbCxcblx0XHRcdFx0eTogaG9yaXpvbnRhbCA/IG51bGwgOiB0YXJnZXRcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoc291cmNlcywgaW5kZXgsIHByb3BhZ2F0ZSkge1xuXHR2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07XG5cdHZhciBmaWxsID0gc291cmNlLmZpbGw7XG5cdHZhciB2aXNpdGVkID0gW2luZGV4XTtcblx0dmFyIHRhcmdldDtcblxuXHRpZiAoIXByb3BhZ2F0ZSkge1xuXHRcdHJldHVybiBmaWxsO1xuXHR9XG5cblx0d2hpbGUgKGZpbGwgIT09IGZhbHNlICYmIHZpc2l0ZWQuaW5kZXhPZihmaWxsKSA9PT0gLTEpIHtcblx0XHRpZiAoIWlzRmluaXRlKGZpbGwpKSB7XG5cdFx0XHRyZXR1cm4gZmlsbDtcblx0XHR9XG5cblx0XHR0YXJnZXQgPSBzb3VyY2VzW2ZpbGxdO1xuXHRcdGlmICghdGFyZ2V0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKHRhcmdldC52aXNpYmxlKSB7XG5cdFx0XHRyZXR1cm4gZmlsbDtcblx0XHR9XG5cblx0XHR2aXNpdGVkLnB1c2goZmlsbCk7XG5cdFx0ZmlsbCA9IHRhcmdldC5maWxsO1xuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXBwZXIoc291cmNlKSB7XG5cdHZhciBmaWxsID0gc291cmNlLmZpbGw7XG5cdHZhciB0eXBlID0gJ2RhdGFzZXQnO1xuXG5cdGlmIChmaWxsID09PSBmYWxzZSkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0aWYgKCFpc0Zpbml0ZShmaWxsKSkge1xuXHRcdHR5cGUgPSAnYm91bmRhcnknO1xuXHR9XG5cblx0cmV0dXJuIG1hcHBlcnNbdHlwZV0oc291cmNlKTtcbn1cblxuZnVuY3Rpb24gaXNEcmF3YWJsZShwb2ludCkge1xuXHRyZXR1cm4gcG9pbnQgJiYgIXBvaW50LnNraXA7XG59XG5cbmZ1bmN0aW9uIGRyYXdBcmVhKGN0eCwgY3VydmUwLCBjdXJ2ZTEsIGxlbjAsIGxlbjEpIHtcblx0dmFyIGk7XG5cblx0aWYgKCFsZW4wIHx8ICFsZW4xKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gYnVpbGRpbmcgZmlyc3QgYXJlYSBjdXJ2ZSAobm9ybWFsKVxuXHRjdHgubW92ZVRvKGN1cnZlMFswXS54LCBjdXJ2ZTBbMF0ueSk7XG5cdGZvciAoaSA9IDE7IGkgPCBsZW4wOyArK2kpIHtcblx0XHRoZWxwZXJzLmNhbnZhcy5saW5lVG8oY3R4LCBjdXJ2ZTBbaSAtIDFdLCBjdXJ2ZTBbaV0pO1xuXHR9XG5cblx0Ly8gam9pbmluZyB0aGUgdHdvIGFyZWEgY3VydmVzXG5cdGN0eC5saW5lVG8oY3VydmUxW2xlbjEgLSAxXS54LCBjdXJ2ZTFbbGVuMSAtIDFdLnkpO1xuXG5cdC8vIGJ1aWxkaW5nIG9wcG9zaXRlIGFyZWEgY3VydmUgKHJldmVyc2UpXG5cdGZvciAoaSA9IGxlbjEgLSAxOyBpID4gMDsgLS1pKSB7XG5cdFx0aGVscGVycy5jYW52YXMubGluZVRvKGN0eCwgY3VydmUxW2ldLCBjdXJ2ZTFbaSAtIDFdLCB0cnVlKTtcblx0fVxufVxuXG5mdW5jdGlvbiBkb0ZpbGwoY3R4LCBwb2ludHMsIG1hcHBlciwgdmlldywgY29sb3IsIGxvb3ApIHtcblx0dmFyIGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcblx0dmFyIHNwYW4gPSB2aWV3LnNwYW5HYXBzO1xuXHR2YXIgY3VydmUwID0gW107XG5cdHZhciBjdXJ2ZTEgPSBbXTtcblx0dmFyIGxlbjAgPSAwO1xuXHR2YXIgbGVuMSA9IDA7XG5cdHZhciBpLCBpbGVuLCBpbmRleCwgcDAsIHAxLCBkMCwgZDE7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXG5cdGZvciAoaSA9IDAsIGlsZW4gPSAoY291bnQgKyAhIWxvb3ApOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0aW5kZXggPSBpICUgY291bnQ7XG5cdFx0cDAgPSBwb2ludHNbaW5kZXhdLl92aWV3O1xuXHRcdHAxID0gbWFwcGVyKHAwLCBpbmRleCwgdmlldyk7XG5cdFx0ZDAgPSBpc0RyYXdhYmxlKHAwKTtcblx0XHRkMSA9IGlzRHJhd2FibGUocDEpO1xuXG5cdFx0aWYgKGQwICYmIGQxKSB7XG5cdFx0XHRsZW4wID0gY3VydmUwLnB1c2gocDApO1xuXHRcdFx0bGVuMSA9IGN1cnZlMS5wdXNoKHAxKTtcblx0XHR9IGVsc2UgaWYgKGxlbjAgJiYgbGVuMSkge1xuXHRcdFx0aWYgKCFzcGFuKSB7XG5cdFx0XHRcdGRyYXdBcmVhKGN0eCwgY3VydmUwLCBjdXJ2ZTEsIGxlbjAsIGxlbjEpO1xuXHRcdFx0XHRsZW4wID0gbGVuMSA9IDA7XG5cdFx0XHRcdGN1cnZlMCA9IFtdO1xuXHRcdFx0XHRjdXJ2ZTEgPSBbXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChkMCkge1xuXHRcdFx0XHRcdGN1cnZlMC5wdXNoKHAwKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZDEpIHtcblx0XHRcdFx0XHRjdXJ2ZTEucHVzaChwMSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRkcmF3QXJlYShjdHgsIGN1cnZlMCwgY3VydmUxLCBsZW4wLCBsZW4xKTtcblxuXHRjdHguY2xvc2VQYXRoKCk7XG5cdGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcblx0Y3R4LmZpbGwoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGlkOiAnZmlsbGVyJyxcblxuXHRhZnRlckRhdGFzZXRzVXBkYXRlOiBmdW5jdGlvbihjaGFydCwgb3B0aW9ucykge1xuXHRcdHZhciBjb3VudCA9IChjaGFydC5kYXRhLmRhdGFzZXRzIHx8IFtdKS5sZW5ndGg7XG5cdFx0dmFyIHByb3BhZ2F0ZSA9IG9wdGlvbnMucHJvcGFnYXRlO1xuXHRcdHZhciBzb3VyY2VzID0gW107XG5cdFx0dmFyIG1ldGEsIGksIGVsLCBzb3VyY2U7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xuXHRcdFx0bWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGkpO1xuXHRcdFx0ZWwgPSBtZXRhLmRhdGFzZXQ7XG5cdFx0XHRzb3VyY2UgPSBudWxsO1xuXG5cdFx0XHRpZiAoZWwgJiYgZWwuX21vZGVsICYmIGVsIGluc3RhbmNlb2YgZWxlbWVudHMuTGluZSkge1xuXHRcdFx0XHRzb3VyY2UgPSB7XG5cdFx0XHRcdFx0dmlzaWJsZTogY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpKSxcblx0XHRcdFx0XHRmaWxsOiBkZWNvZGVGaWxsKGVsLCBpLCBjb3VudCksXG5cdFx0XHRcdFx0Y2hhcnQ6IGNoYXJ0LFxuXHRcdFx0XHRcdGVsOiBlbFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRtZXRhLiRmaWxsZXIgPSBzb3VyY2U7XG5cdFx0XHRzb3VyY2VzLnB1c2goc291cmNlKTtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xuXHRcdFx0c291cmNlID0gc291cmNlc1tpXTtcblx0XHRcdGlmICghc291cmNlKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRzb3VyY2UuZmlsbCA9IHJlc29sdmVUYXJnZXQoc291cmNlcywgaSwgcHJvcGFnYXRlKTtcblx0XHRcdHNvdXJjZS5ib3VuZGFyeSA9IGNvbXB1dGVCb3VuZGFyeShzb3VyY2UpO1xuXHRcdFx0c291cmNlLm1hcHBlciA9IGNyZWF0ZU1hcHBlcihzb3VyY2UpO1xuXHRcdH1cblx0fSxcblxuXHRiZWZvcmVEYXRhc2V0RHJhdzogZnVuY3Rpb24oY2hhcnQsIGFyZ3MpIHtcblx0XHR2YXIgbWV0YSA9IGFyZ3MubWV0YS4kZmlsbGVyO1xuXHRcdGlmICghbWV0YSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBjdHggPSBjaGFydC5jdHg7XG5cdFx0dmFyIGVsID0gbWV0YS5lbDtcblx0XHR2YXIgdmlldyA9IGVsLl92aWV3O1xuXHRcdHZhciBwb2ludHMgPSBlbC5fY2hpbGRyZW4gfHwgW107XG5cdFx0dmFyIG1hcHBlciA9IG1ldGEubWFwcGVyO1xuXHRcdHZhciBjb2xvciA9IHZpZXcuYmFja2dyb3VuZENvbG9yIHx8IGRlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Q29sb3I7XG5cblx0XHRpZiAobWFwcGVyICYmIGNvbG9yICYmIHBvaW50cy5sZW5ndGgpIHtcblx0XHRcdGhlbHBlcnMuY2FudmFzLmNsaXBBcmVhKGN0eCwgY2hhcnQuY2hhcnRBcmVhKTtcblx0XHRcdGRvRmlsbChjdHgsIHBvaW50cywgbWFwcGVyLCB2aWV3LCBjb2xvciwgZWwuX2xvb3ApO1xuXHRcdFx0aGVscGVycy5jYW52YXMudW5jbGlwQXJlYShjdHgpO1xuXHRcdH1cblx0fVxufTtcblxufSx7XCIyNlwiOjI2LFwiNDFcIjo0MSxcIjQ2XCI6NDZ9XSw1MjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIEVsZW1lbnQgPSByZXF1aXJlKDI3KTtcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG52YXIgbGF5b3V0cyA9IHJlcXVpcmUoMzEpO1xuXG52YXIgbm9vcCA9IGhlbHBlcnMubm9vcDtcblxuZGVmYXVsdHMuX3NldCgnZ2xvYmFsJywge1xuXHRsZWdlbmQ6IHtcblx0XHRkaXNwbGF5OiB0cnVlLFxuXHRcdHBvc2l0aW9uOiAndG9wJyxcblx0XHRmdWxsV2lkdGg6IHRydWUsXG5cdFx0cmV2ZXJzZTogZmFsc2UsXG5cdFx0d2VpZ2h0OiAxMDAwLFxuXG5cdFx0Ly8gYSBjYWxsYmFjayB0aGF0IHdpbGwgaGFuZGxlXG5cdFx0b25DbGljazogZnVuY3Rpb24oZSwgbGVnZW5kSXRlbSkge1xuXHRcdFx0dmFyIGluZGV4ID0gbGVnZW5kSXRlbS5kYXRhc2V0SW5kZXg7XG5cdFx0XHR2YXIgY2kgPSB0aGlzLmNoYXJ0O1xuXHRcdFx0dmFyIG1ldGEgPSBjaS5nZXREYXRhc2V0TWV0YShpbmRleCk7XG5cblx0XHRcdC8vIFNlZSBjb250cm9sbGVyLmlzRGF0YXNldFZpc2libGUgY29tbWVudFxuXHRcdFx0bWV0YS5oaWRkZW4gPSBtZXRhLmhpZGRlbiA9PT0gbnVsbCA/ICFjaS5kYXRhLmRhdGFzZXRzW2luZGV4XS5oaWRkZW4gOiBudWxsO1xuXG5cdFx0XHQvLyBXZSBoaWQgYSBkYXRhc2V0IC4uLiByZXJlbmRlciB0aGUgY2hhcnRcblx0XHRcdGNpLnVwZGF0ZSgpO1xuXHRcdH0sXG5cblx0XHRvbkhvdmVyOiBudWxsLFxuXG5cdFx0bGFiZWxzOiB7XG5cdFx0XHRib3hXaWR0aDogNDAsXG5cdFx0XHRwYWRkaW5nOiAxMCxcblx0XHRcdC8vIEdlbmVyYXRlcyBsYWJlbHMgc2hvd24gaW4gdGhlIGxlZ2VuZFxuXHRcdFx0Ly8gVmFsaWQgcHJvcGVydGllcyB0byByZXR1cm46XG5cdFx0XHQvLyB0ZXh0IDogdGV4dCB0byBkaXNwbGF5XG5cdFx0XHQvLyBmaWxsU3R5bGUgOiBmaWxsIG9mIGNvbG91cmVkIGJveFxuXHRcdFx0Ly8gc3Ryb2tlU3R5bGU6IHN0cm9rZSBvZiBjb2xvdXJlZCBib3hcblx0XHRcdC8vIGhpZGRlbiA6IGlmIHRoaXMgbGVnZW5kIGl0ZW0gcmVmZXJzIHRvIGEgaGlkZGVuIGl0ZW1cblx0XHRcdC8vIGxpbmVDYXAgOiBjYXAgc3R5bGUgZm9yIGxpbmVcblx0XHRcdC8vIGxpbmVEYXNoXG5cdFx0XHQvLyBsaW5lRGFzaE9mZnNldCA6XG5cdFx0XHQvLyBsaW5lSm9pbiA6XG5cdFx0XHQvLyBsaW5lV2lkdGggOlxuXHRcdFx0Z2VuZXJhdGVMYWJlbHM6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0XHRcdHZhciBkYXRhID0gY2hhcnQuZGF0YTtcblx0XHRcdFx0cmV0dXJuIGhlbHBlcnMuaXNBcnJheShkYXRhLmRhdGFzZXRzKSA/IGRhdGEuZGF0YXNldHMubWFwKGZ1bmN0aW9uKGRhdGFzZXQsIGkpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0dGV4dDogZGF0YXNldC5sYWJlbCxcblx0XHRcdFx0XHRcdGZpbGxTdHlsZTogKCFoZWxwZXJzLmlzQXJyYXkoZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IpID8gZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IgOiBkYXRhc2V0LmJhY2tncm91bmRDb2xvclswXSksXG5cdFx0XHRcdFx0XHRoaWRkZW46ICFjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpLFxuXHRcdFx0XHRcdFx0bGluZUNhcDogZGF0YXNldC5ib3JkZXJDYXBTdHlsZSxcblx0XHRcdFx0XHRcdGxpbmVEYXNoOiBkYXRhc2V0LmJvcmRlckRhc2gsXG5cdFx0XHRcdFx0XHRsaW5lRGFzaE9mZnNldDogZGF0YXNldC5ib3JkZXJEYXNoT2Zmc2V0LFxuXHRcdFx0XHRcdFx0bGluZUpvaW46IGRhdGFzZXQuYm9yZGVySm9pblN0eWxlLFxuXHRcdFx0XHRcdFx0bGluZVdpZHRoOiBkYXRhc2V0LmJvcmRlcldpZHRoLFxuXHRcdFx0XHRcdFx0c3Ryb2tlU3R5bGU6IGRhdGFzZXQuYm9yZGVyQ29sb3IsXG5cdFx0XHRcdFx0XHRwb2ludFN0eWxlOiBkYXRhc2V0LnBvaW50U3R5bGUsXG5cblx0XHRcdFx0XHRcdC8vIEJlbG93IGlzIGV4dHJhIGRhdGEgdXNlZCBmb3IgdG9nZ2xpbmcgdGhlIGRhdGFzZXRzXG5cdFx0XHRcdFx0XHRkYXRhc2V0SW5kZXg6IGlcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9LCB0aGlzKSA6IFtdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRsZWdlbmRDYWxsYmFjazogZnVuY3Rpb24oY2hhcnQpIHtcblx0XHR2YXIgdGV4dCA9IFtdO1xuXHRcdHRleHQucHVzaCgnPHVsIGNsYXNzPVwiJyArIGNoYXJ0LmlkICsgJy1sZWdlbmRcIj4nKTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJ0LmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHRleHQucHVzaCgnPGxpPjxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjonICsgY2hhcnQuZGF0YS5kYXRhc2V0c1tpXS5iYWNrZ3JvdW5kQ29sb3IgKyAnXCI+PC9zcGFuPicpO1xuXHRcdFx0aWYgKGNoYXJ0LmRhdGEuZGF0YXNldHNbaV0ubGFiZWwpIHtcblx0XHRcdFx0dGV4dC5wdXNoKGNoYXJ0LmRhdGEuZGF0YXNldHNbaV0ubGFiZWwpO1xuXHRcdFx0fVxuXHRcdFx0dGV4dC5wdXNoKCc8L2xpPicpO1xuXHRcdH1cblx0XHR0ZXh0LnB1c2goJzwvdWw+Jyk7XG5cdFx0cmV0dXJuIHRleHQuam9pbignJyk7XG5cdH1cbn0pO1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGJveCB3aWR0aCBiYXNlZCBvbiB0aGUgdXNlUG9pbnRTdHlsZSBvcHRpb25cbiAqIEBwYXJhbSBsYWJlbG9wdHMge09iamVjdH0gdGhlIGxhYmVsIG9wdGlvbnMgb24gdGhlIGxlZ2VuZFxuICogQHBhcmFtIGZvbnRTaXplIHtOdW1iZXJ9IHRoZSBsYWJlbCBmb250IHNpemVcbiAqIEByZXR1cm4ge051bWJlcn0gd2lkdGggb2YgdGhlIGNvbG9yIGJveCBhcmVhXG4gKi9cbmZ1bmN0aW9uIGdldEJveFdpZHRoKGxhYmVsT3B0cywgZm9udFNpemUpIHtcblx0cmV0dXJuIGxhYmVsT3B0cy51c2VQb2ludFN0eWxlID9cblx0XHRmb250U2l6ZSAqIE1hdGguU1FSVDIgOlxuXHRcdGxhYmVsT3B0cy5ib3hXaWR0aDtcbn1cblxuLyoqXG4gKiBJTVBPUlRBTlQ6IHRoaXMgY2xhc3MgaXMgZXhwb3NlZCBwdWJsaWNseSBhcyBDaGFydC5MZWdlbmQsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVxdWlyZWQhXG4gKi9cbnZhciBMZWdlbmQgPSBFbGVtZW50LmV4dGVuZCh7XG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oY29uZmlnKSB7XG5cdFx0aGVscGVycy5leHRlbmQodGhpcywgY29uZmlnKTtcblxuXHRcdC8vIENvbnRhaW5zIGhpdCBib3hlcyBmb3IgZWFjaCBkYXRhc2V0IChpbiBkYXRhc2V0IG9yZGVyKVxuXHRcdHRoaXMubGVnZW5kSGl0Qm94ZXMgPSBbXTtcblxuXHRcdC8vIEFyZSB3ZSBpbiBkb3VnaG51dCBtb2RlIHdoaWNoIGhhcyBhIGRpZmZlcmVudCBkYXRhIHR5cGVcblx0XHR0aGlzLmRvdWdobnV0TW9kZSA9IGZhbHNlO1xuXHR9LFxuXG5cdC8vIFRoZXNlIG1ldGhvZHMgYXJlIG9yZGVyZWQgYnkgbGlmZWN5Y2xlLiBVdGlsaXRpZXMgdGhlbiBmb2xsb3cuXG5cdC8vIEFueSBmdW5jdGlvbiBkZWZpbmVkIGhlcmUgaXMgaW5oZXJpdGVkIGJ5IGFsbCBsZWdlbmQgdHlwZXMuXG5cdC8vIEFueSBmdW5jdGlvbiBjYW4gYmUgZXh0ZW5kZWQgYnkgdGhlIGxlZ2VuZCB0eXBlXG5cblx0YmVmb3JlVXBkYXRlOiBub29wLFxuXHR1cGRhdGU6IGZ1bmN0aW9uKG1heFdpZHRoLCBtYXhIZWlnaHQsIG1hcmdpbnMpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0Ly8gVXBkYXRlIExpZmVjeWNsZSAtIFByb2JhYmx5IGRvbid0IHdhbnQgdG8gZXZlciBleHRlbmQgb3Igb3ZlcndyaXRlIHRoaXMgZnVuY3Rpb24gOylcblx0XHRtZS5iZWZvcmVVcGRhdGUoKTtcblxuXHRcdC8vIEFic29yYiB0aGUgbWFzdGVyIG1lYXN1cmVtZW50c1xuXHRcdG1lLm1heFdpZHRoID0gbWF4V2lkdGg7XG5cdFx0bWUubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0O1xuXHRcdG1lLm1hcmdpbnMgPSBtYXJnaW5zO1xuXG5cdFx0Ly8gRGltZW5zaW9uc1xuXHRcdG1lLmJlZm9yZVNldERpbWVuc2lvbnMoKTtcblx0XHRtZS5zZXREaW1lbnNpb25zKCk7XG5cdFx0bWUuYWZ0ZXJTZXREaW1lbnNpb25zKCk7XG5cdFx0Ly8gTGFiZWxzXG5cdFx0bWUuYmVmb3JlQnVpbGRMYWJlbHMoKTtcblx0XHRtZS5idWlsZExhYmVscygpO1xuXHRcdG1lLmFmdGVyQnVpbGRMYWJlbHMoKTtcblxuXHRcdC8vIEZpdFxuXHRcdG1lLmJlZm9yZUZpdCgpO1xuXHRcdG1lLmZpdCgpO1xuXHRcdG1lLmFmdGVyRml0KCk7XG5cdFx0Ly9cblx0XHRtZS5hZnRlclVwZGF0ZSgpO1xuXG5cdFx0cmV0dXJuIG1lLm1pblNpemU7XG5cdH0sXG5cdGFmdGVyVXBkYXRlOiBub29wLFxuXG5cdC8vXG5cblx0YmVmb3JlU2V0RGltZW5zaW9uczogbm9vcCxcblx0c2V0RGltZW5zaW9uczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHQvLyBTZXQgdGhlIHVuY29uc3RyYWluZWQgZGltZW5zaW9uIGJlZm9yZSBsYWJlbCByb3RhdGlvblxuXHRcdGlmIChtZS5pc0hvcml6b250YWwoKSkge1xuXHRcdFx0Ly8gUmVzZXQgcG9zaXRpb24gYmVmb3JlIGNhbGN1bGF0aW5nIHJvdGF0aW9uXG5cdFx0XHRtZS53aWR0aCA9IG1lLm1heFdpZHRoO1xuXHRcdFx0bWUubGVmdCA9IDA7XG5cdFx0XHRtZS5yaWdodCA9IG1lLndpZHRoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZS5oZWlnaHQgPSBtZS5tYXhIZWlnaHQ7XG5cblx0XHRcdC8vIFJlc2V0IHBvc2l0aW9uIGJlZm9yZSBjYWxjdWxhdGluZyByb3RhdGlvblxuXHRcdFx0bWUudG9wID0gMDtcblx0XHRcdG1lLmJvdHRvbSA9IG1lLmhlaWdodDtcblx0XHR9XG5cblx0XHQvLyBSZXNldCBwYWRkaW5nXG5cdFx0bWUucGFkZGluZ0xlZnQgPSAwO1xuXHRcdG1lLnBhZGRpbmdUb3AgPSAwO1xuXHRcdG1lLnBhZGRpbmdSaWdodCA9IDA7XG5cdFx0bWUucGFkZGluZ0JvdHRvbSA9IDA7XG5cblx0XHQvLyBSZXNldCBtaW5TaXplXG5cdFx0bWUubWluU2l6ZSA9IHtcblx0XHRcdHdpZHRoOiAwLFxuXHRcdFx0aGVpZ2h0OiAwXG5cdFx0fTtcblx0fSxcblx0YWZ0ZXJTZXREaW1lbnNpb25zOiBub29wLFxuXG5cdC8vXG5cblx0YmVmb3JlQnVpbGRMYWJlbHM6IG5vb3AsXG5cdGJ1aWxkTGFiZWxzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBsYWJlbE9wdHMgPSBtZS5vcHRpb25zLmxhYmVscyB8fCB7fTtcblx0XHR2YXIgbGVnZW5kSXRlbXMgPSBoZWxwZXJzLmNhbGxiYWNrKGxhYmVsT3B0cy5nZW5lcmF0ZUxhYmVscywgW21lLmNoYXJ0XSwgbWUpIHx8IFtdO1xuXG5cdFx0aWYgKGxhYmVsT3B0cy5maWx0ZXIpIHtcblx0XHRcdGxlZ2VuZEl0ZW1zID0gbGVnZW5kSXRlbXMuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHtcblx0XHRcdFx0cmV0dXJuIGxhYmVsT3B0cy5maWx0ZXIoaXRlbSwgbWUuY2hhcnQuZGF0YSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAobWUub3B0aW9ucy5yZXZlcnNlKSB7XG5cdFx0XHRsZWdlbmRJdGVtcy5yZXZlcnNlKCk7XG5cdFx0fVxuXG5cdFx0bWUubGVnZW5kSXRlbXMgPSBsZWdlbmRJdGVtcztcblx0fSxcblx0YWZ0ZXJCdWlsZExhYmVsczogbm9vcCxcblxuXHQvL1xuXG5cdGJlZm9yZUZpdDogbm9vcCxcblx0Zml0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcblx0XHR2YXIgbGFiZWxPcHRzID0gb3B0cy5sYWJlbHM7XG5cdFx0dmFyIGRpc3BsYXkgPSBvcHRzLmRpc3BsYXk7XG5cblx0XHR2YXIgY3R4ID0gbWUuY3R4O1xuXG5cdFx0dmFyIGdsb2JhbERlZmF1bHQgPSBkZWZhdWx0cy5nbG9iYWw7XG5cdFx0dmFyIHZhbHVlT3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdDtcblx0XHR2YXIgZm9udFNpemUgPSB2YWx1ZU9yRGVmYXVsdChsYWJlbE9wdHMuZm9udFNpemUsIGdsb2JhbERlZmF1bHQuZGVmYXVsdEZvbnRTaXplKTtcblx0XHR2YXIgZm9udFN0eWxlID0gdmFsdWVPckRlZmF1bHQobGFiZWxPcHRzLmZvbnRTdHlsZSwgZ2xvYmFsRGVmYXVsdC5kZWZhdWx0Rm9udFN0eWxlKTtcblx0XHR2YXIgZm9udEZhbWlseSA9IHZhbHVlT3JEZWZhdWx0KGxhYmVsT3B0cy5mb250RmFtaWx5LCBnbG9iYWxEZWZhdWx0LmRlZmF1bHRGb250RmFtaWx5KTtcblx0XHR2YXIgbGFiZWxGb250ID0gaGVscGVycy5mb250U3RyaW5nKGZvbnRTaXplLCBmb250U3R5bGUsIGZvbnRGYW1pbHkpO1xuXG5cdFx0Ly8gUmVzZXQgaGl0IGJveGVzXG5cdFx0dmFyIGhpdGJveGVzID0gbWUubGVnZW5kSGl0Qm94ZXMgPSBbXTtcblxuXHRcdHZhciBtaW5TaXplID0gbWUubWluU2l6ZTtcblx0XHR2YXIgaXNIb3Jpem9udGFsID0gbWUuaXNIb3Jpem9udGFsKCk7XG5cblx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XG5cdFx0XHRtaW5TaXplLndpZHRoID0gbWUubWF4V2lkdGg7IC8vIGZpbGwgYWxsIHRoZSB3aWR0aFxuXHRcdFx0bWluU2l6ZS5oZWlnaHQgPSBkaXNwbGF5ID8gMTAgOiAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtaW5TaXplLndpZHRoID0gZGlzcGxheSA/IDEwIDogMDtcblx0XHRcdG1pblNpemUuaGVpZ2h0ID0gbWUubWF4SGVpZ2h0OyAvLyBmaWxsIGFsbCB0aGUgaGVpZ2h0XG5cdFx0fVxuXG5cdFx0Ly8gSW5jcmVhc2Ugc2l6ZXMgaGVyZVxuXHRcdGlmIChkaXNwbGF5KSB7XG5cdFx0XHRjdHguZm9udCA9IGxhYmVsRm9udDtcblxuXHRcdFx0aWYgKGlzSG9yaXpvbnRhbCkge1xuXHRcdFx0XHQvLyBMYWJlbHNcblxuXHRcdFx0XHQvLyBXaWR0aCBvZiBlYWNoIGxpbmUgb2YgbGVnZW5kIGJveGVzLiBMYWJlbHMgd3JhcCBvbnRvIG11bHRpcGxlIGxpbmVzIHdoZW4gdGhlcmUgYXJlIHRvbyBtYW55IHRvIGZpdCBvbiBvbmVcblx0XHRcdFx0dmFyIGxpbmVXaWR0aHMgPSBtZS5saW5lV2lkdGhzID0gWzBdO1xuXHRcdFx0XHR2YXIgdG90YWxIZWlnaHQgPSBtZS5sZWdlbmRJdGVtcy5sZW5ndGggPyBmb250U2l6ZSArIChsYWJlbE9wdHMucGFkZGluZykgOiAwO1xuXG5cdFx0XHRcdGN0eC50ZXh0QWxpZ24gPSAnbGVmdCc7XG5cdFx0XHRcdGN0eC50ZXh0QmFzZWxpbmUgPSAndG9wJztcblxuXHRcdFx0XHRoZWxwZXJzLmVhY2gobWUubGVnZW5kSXRlbXMsIGZ1bmN0aW9uKGxlZ2VuZEl0ZW0sIGkpIHtcblx0XHRcdFx0XHR2YXIgYm94V2lkdGggPSBnZXRCb3hXaWR0aChsYWJlbE9wdHMsIGZvbnRTaXplKTtcblx0XHRcdFx0XHR2YXIgd2lkdGggPSBib3hXaWR0aCArIChmb250U2l6ZSAvIDIpICsgY3R4Lm1lYXN1cmVUZXh0KGxlZ2VuZEl0ZW0udGV4dCkud2lkdGg7XG5cblx0XHRcdFx0XHRpZiAobGluZVdpZHRoc1tsaW5lV2lkdGhzLmxlbmd0aCAtIDFdICsgd2lkdGggKyBsYWJlbE9wdHMucGFkZGluZyA+PSBtZS53aWR0aCkge1xuXHRcdFx0XHRcdFx0dG90YWxIZWlnaHQgKz0gZm9udFNpemUgKyAobGFiZWxPcHRzLnBhZGRpbmcpO1xuXHRcdFx0XHRcdFx0bGluZVdpZHRoc1tsaW5lV2lkdGhzLmxlbmd0aF0gPSBtZS5sZWZ0O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFN0b3JlIHRoZSBoaXRib3ggd2lkdGggYW5kIGhlaWdodCBoZXJlLiBGaW5hbCBwb3NpdGlvbiB3aWxsIGJlIHVwZGF0ZWQgaW4gYGRyYXdgXG5cdFx0XHRcdFx0aGl0Ym94ZXNbaV0gPSB7XG5cdFx0XHRcdFx0XHRsZWZ0OiAwLFxuXHRcdFx0XHRcdFx0dG9wOiAwLFxuXHRcdFx0XHRcdFx0d2lkdGg6IHdpZHRoLFxuXHRcdFx0XHRcdFx0aGVpZ2h0OiBmb250U2l6ZVxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRsaW5lV2lkdGhzW2xpbmVXaWR0aHMubGVuZ3RoIC0gMV0gKz0gd2lkdGggKyBsYWJlbE9wdHMucGFkZGluZztcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0bWluU2l6ZS5oZWlnaHQgKz0gdG90YWxIZWlnaHQ7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciB2UGFkZGluZyA9IGxhYmVsT3B0cy5wYWRkaW5nO1xuXHRcdFx0XHR2YXIgY29sdW1uV2lkdGhzID0gbWUuY29sdW1uV2lkdGhzID0gW107XG5cdFx0XHRcdHZhciB0b3RhbFdpZHRoID0gbGFiZWxPcHRzLnBhZGRpbmc7XG5cdFx0XHRcdHZhciBjdXJyZW50Q29sV2lkdGggPSAwO1xuXHRcdFx0XHR2YXIgY3VycmVudENvbEhlaWdodCA9IDA7XG5cdFx0XHRcdHZhciBpdGVtSGVpZ2h0ID0gZm9udFNpemUgKyB2UGFkZGluZztcblxuXHRcdFx0XHRoZWxwZXJzLmVhY2gobWUubGVnZW5kSXRlbXMsIGZ1bmN0aW9uKGxlZ2VuZEl0ZW0sIGkpIHtcblx0XHRcdFx0XHR2YXIgYm94V2lkdGggPSBnZXRCb3hXaWR0aChsYWJlbE9wdHMsIGZvbnRTaXplKTtcblx0XHRcdFx0XHR2YXIgaXRlbVdpZHRoID0gYm94V2lkdGggKyAoZm9udFNpemUgLyAyKSArIGN0eC5tZWFzdXJlVGV4dChsZWdlbmRJdGVtLnRleHQpLndpZHRoO1xuXG5cdFx0XHRcdFx0Ly8gSWYgdG9vIHRhbGwsIGdvIHRvIG5ldyBjb2x1bW5cblx0XHRcdFx0XHRpZiAoY3VycmVudENvbEhlaWdodCArIGl0ZW1IZWlnaHQgPiBtaW5TaXplLmhlaWdodCkge1xuXHRcdFx0XHRcdFx0dG90YWxXaWR0aCArPSBjdXJyZW50Q29sV2lkdGggKyBsYWJlbE9wdHMucGFkZGluZztcblx0XHRcdFx0XHRcdGNvbHVtbldpZHRocy5wdXNoKGN1cnJlbnRDb2xXaWR0aCk7IC8vIHByZXZpb3VzIGNvbHVtbiB3aWR0aFxuXG5cdFx0XHRcdFx0XHRjdXJyZW50Q29sV2lkdGggPSAwO1xuXHRcdFx0XHRcdFx0Y3VycmVudENvbEhlaWdodCA9IDA7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gR2V0IG1heCB3aWR0aFxuXHRcdFx0XHRcdGN1cnJlbnRDb2xXaWR0aCA9IE1hdGgubWF4KGN1cnJlbnRDb2xXaWR0aCwgaXRlbVdpZHRoKTtcblx0XHRcdFx0XHRjdXJyZW50Q29sSGVpZ2h0ICs9IGl0ZW1IZWlnaHQ7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSB0aGUgaGl0Ym94IHdpZHRoIGFuZCBoZWlnaHQgaGVyZS4gRmluYWwgcG9zaXRpb24gd2lsbCBiZSB1cGRhdGVkIGluIGBkcmF3YFxuXHRcdFx0XHRcdGhpdGJveGVzW2ldID0ge1xuXHRcdFx0XHRcdFx0bGVmdDogMCxcblx0XHRcdFx0XHRcdHRvcDogMCxcblx0XHRcdFx0XHRcdHdpZHRoOiBpdGVtV2lkdGgsXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IGZvbnRTaXplXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dG90YWxXaWR0aCArPSBjdXJyZW50Q29sV2lkdGg7XG5cdFx0XHRcdGNvbHVtbldpZHRocy5wdXNoKGN1cnJlbnRDb2xXaWR0aCk7XG5cdFx0XHRcdG1pblNpemUud2lkdGggKz0gdG90YWxXaWR0aDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtZS53aWR0aCA9IG1pblNpemUud2lkdGg7XG5cdFx0bWUuaGVpZ2h0ID0gbWluU2l6ZS5oZWlnaHQ7XG5cdH0sXG5cdGFmdGVyRml0OiBub29wLFxuXG5cdC8vIFNoYXJlZCBNZXRob2RzXG5cdGlzSG9yaXpvbnRhbDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9PT0gJ3RvcCcgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9uID09PSAnYm90dG9tJztcblx0fSxcblxuXHQvLyBBY3R1YWxseSBkcmF3IHRoZSBsZWdlbmQgb24gdGhlIGNhbnZhc1xuXHRkcmF3OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcblx0XHR2YXIgbGFiZWxPcHRzID0gb3B0cy5sYWJlbHM7XG5cdFx0dmFyIGdsb2JhbERlZmF1bHQgPSBkZWZhdWx0cy5nbG9iYWw7XG5cdFx0dmFyIGxpbmVEZWZhdWx0ID0gZ2xvYmFsRGVmYXVsdC5lbGVtZW50cy5saW5lO1xuXHRcdHZhciBsZWdlbmRXaWR0aCA9IG1lLndpZHRoO1xuXHRcdHZhciBsaW5lV2lkdGhzID0gbWUubGluZVdpZHRocztcblxuXHRcdGlmIChvcHRzLmRpc3BsYXkpIHtcblx0XHRcdHZhciBjdHggPSBtZS5jdHg7XG5cdFx0XHR2YXIgdmFsdWVPckRlZmF1bHQgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0O1xuXHRcdFx0dmFyIGZvbnRDb2xvciA9IHZhbHVlT3JEZWZhdWx0KGxhYmVsT3B0cy5mb250Q29sb3IsIGdsb2JhbERlZmF1bHQuZGVmYXVsdEZvbnRDb2xvcik7XG5cdFx0XHR2YXIgZm9udFNpemUgPSB2YWx1ZU9yRGVmYXVsdChsYWJlbE9wdHMuZm9udFNpemUsIGdsb2JhbERlZmF1bHQuZGVmYXVsdEZvbnRTaXplKTtcblx0XHRcdHZhciBmb250U3R5bGUgPSB2YWx1ZU9yRGVmYXVsdChsYWJlbE9wdHMuZm9udFN0eWxlLCBnbG9iYWxEZWZhdWx0LmRlZmF1bHRGb250U3R5bGUpO1xuXHRcdFx0dmFyIGZvbnRGYW1pbHkgPSB2YWx1ZU9yRGVmYXVsdChsYWJlbE9wdHMuZm9udEZhbWlseSwgZ2xvYmFsRGVmYXVsdC5kZWZhdWx0Rm9udEZhbWlseSk7XG5cdFx0XHR2YXIgbGFiZWxGb250ID0gaGVscGVycy5mb250U3RyaW5nKGZvbnRTaXplLCBmb250U3R5bGUsIGZvbnRGYW1pbHkpO1xuXHRcdFx0dmFyIGN1cnNvcjtcblxuXHRcdFx0Ly8gQ2FudmFzIHNldHVwXG5cdFx0XHRjdHgudGV4dEFsaWduID0gJ2xlZnQnO1xuXHRcdFx0Y3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuXHRcdFx0Y3R4LmxpbmVXaWR0aCA9IDAuNTtcblx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IGZvbnRDb2xvcjsgLy8gZm9yIHN0cmlrZXRocm91Z2ggZWZmZWN0XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gZm9udENvbG9yOyAvLyByZW5kZXIgaW4gY29ycmVjdCBjb2xvdXJcblx0XHRcdGN0eC5mb250ID0gbGFiZWxGb250O1xuXG5cdFx0XHR2YXIgYm94V2lkdGggPSBnZXRCb3hXaWR0aChsYWJlbE9wdHMsIGZvbnRTaXplKTtcblx0XHRcdHZhciBoaXRib3hlcyA9IG1lLmxlZ2VuZEhpdEJveGVzO1xuXG5cdFx0XHQvLyBjdXJyZW50IHBvc2l0aW9uXG5cdFx0XHR2YXIgZHJhd0xlZ2VuZEJveCA9IGZ1bmN0aW9uKHgsIHksIGxlZ2VuZEl0ZW0pIHtcblx0XHRcdFx0aWYgKGlzTmFOKGJveFdpZHRoKSB8fCBib3hXaWR0aCA8PSAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBjdHggZm9yIHRoZSBib3hcblx0XHRcdFx0Y3R4LnNhdmUoKTtcblxuXHRcdFx0XHRjdHguZmlsbFN0eWxlID0gdmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5maWxsU3R5bGUsIGdsb2JhbERlZmF1bHQuZGVmYXVsdENvbG9yKTtcblx0XHRcdFx0Y3R4LmxpbmVDYXAgPSB2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVDYXAsIGxpbmVEZWZhdWx0LmJvcmRlckNhcFN0eWxlKTtcblx0XHRcdFx0Y3R4LmxpbmVEYXNoT2Zmc2V0ID0gdmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5saW5lRGFzaE9mZnNldCwgbGluZURlZmF1bHQuYm9yZGVyRGFzaE9mZnNldCk7XG5cdFx0XHRcdGN0eC5saW5lSm9pbiA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0ubGluZUpvaW4sIGxpbmVEZWZhdWx0LmJvcmRlckpvaW5TdHlsZSk7XG5cdFx0XHRcdGN0eC5saW5lV2lkdGggPSB2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVXaWR0aCwgbGluZURlZmF1bHQuYm9yZGVyV2lkdGgpO1xuXHRcdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSB2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLnN0cm9rZVN0eWxlLCBnbG9iYWxEZWZhdWx0LmRlZmF1bHRDb2xvcik7XG5cdFx0XHRcdHZhciBpc0xpbmVXaWR0aFplcm8gPSAodmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5saW5lV2lkdGgsIGxpbmVEZWZhdWx0LmJvcmRlcldpZHRoKSA9PT0gMCk7XG5cblx0XHRcdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRcdC8vIElFIDkgYW5kIDEwIGRvIG5vdCBzdXBwb3J0IGxpbmUgZGFzaFxuXHRcdFx0XHRcdGN0eC5zZXRMaW5lRGFzaCh2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVEYXNoLCBsaW5lRGVmYXVsdC5ib3JkZXJEYXNoKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob3B0cy5sYWJlbHMgJiYgb3B0cy5sYWJlbHMudXNlUG9pbnRTdHlsZSkge1xuXHRcdFx0XHRcdC8vIFJlY2FsY3VsYXRlIHggYW5kIHkgZm9yIGRyYXdQb2ludCgpIGJlY2F1c2UgaXRzIGV4cGVjdGluZ1xuXHRcdFx0XHRcdC8vIHggYW5kIHkgdG8gYmUgY2VudGVyIG9mIGZpZ3VyZSAoaW5zdGVhZCBvZiB0b3AgbGVmdClcblx0XHRcdFx0XHR2YXIgcmFkaXVzID0gZm9udFNpemUgKiBNYXRoLlNRUlQyIC8gMjtcblx0XHRcdFx0XHR2YXIgb2ZmU2V0ID0gcmFkaXVzIC8gTWF0aC5TUVJUMjtcblx0XHRcdFx0XHR2YXIgY2VudGVyWCA9IHggKyBvZmZTZXQ7XG5cdFx0XHRcdFx0dmFyIGNlbnRlclkgPSB5ICsgb2ZmU2V0O1xuXG5cdFx0XHRcdFx0Ly8gRHJhdyBwb2ludFN0eWxlIGFzIGxlZ2VuZCBzeW1ib2xcblx0XHRcdFx0XHRoZWxwZXJzLmNhbnZhcy5kcmF3UG9pbnQoY3R4LCBsZWdlbmRJdGVtLnBvaW50U3R5bGUsIHJhZGl1cywgY2VudGVyWCwgY2VudGVyWSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gRHJhdyBib3ggYXMgbGVnZW5kIHN5bWJvbFxuXHRcdFx0XHRcdGlmICghaXNMaW5lV2lkdGhaZXJvKSB7XG5cdFx0XHRcdFx0XHRjdHguc3Ryb2tlUmVjdCh4LCB5LCBib3hXaWR0aCwgZm9udFNpemUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjdHguZmlsbFJlY3QoeCwgeSwgYm94V2lkdGgsIGZvbnRTaXplKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGN0eC5yZXN0b3JlKCk7XG5cdFx0XHR9O1xuXHRcdFx0dmFyIGZpbGxUZXh0ID0gZnVuY3Rpb24oeCwgeSwgbGVnZW5kSXRlbSwgdGV4dFdpZHRoKSB7XG5cdFx0XHRcdHZhciBoYWxmRm9udFNpemUgPSBmb250U2l6ZSAvIDI7XG5cdFx0XHRcdHZhciB4TGVmdCA9IGJveFdpZHRoICsgaGFsZkZvbnRTaXplICsgeDtcblx0XHRcdFx0dmFyIHlNaWRkbGUgPSB5ICsgaGFsZkZvbnRTaXplO1xuXG5cdFx0XHRcdGN0eC5maWxsVGV4dChsZWdlbmRJdGVtLnRleHQsIHhMZWZ0LCB5TWlkZGxlKTtcblxuXHRcdFx0XHRpZiAobGVnZW5kSXRlbS5oaWRkZW4pIHtcblx0XHRcdFx0XHQvLyBTdHJpa2V0aHJvdWdoIHRoZSB0ZXh0IGlmIGhpZGRlblxuXHRcdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRjdHgubGluZVdpZHRoID0gMjtcblx0XHRcdFx0XHRjdHgubW92ZVRvKHhMZWZ0LCB5TWlkZGxlKTtcblx0XHRcdFx0XHRjdHgubGluZVRvKHhMZWZ0ICsgdGV4dFdpZHRoLCB5TWlkZGxlKTtcblx0XHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdC8vIEhvcml6b250YWxcblx0XHRcdHZhciBpc0hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdFx0Y3Vyc29yID0ge1xuXHRcdFx0XHRcdHg6IG1lLmxlZnQgKyAoKGxlZ2VuZFdpZHRoIC0gbGluZVdpZHRoc1swXSkgLyAyKSxcblx0XHRcdFx0XHR5OiBtZS50b3AgKyBsYWJlbE9wdHMucGFkZGluZyxcblx0XHRcdFx0XHRsaW5lOiAwXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjdXJzb3IgPSB7XG5cdFx0XHRcdFx0eDogbWUubGVmdCArIGxhYmVsT3B0cy5wYWRkaW5nLFxuXHRcdFx0XHRcdHk6IG1lLnRvcCArIGxhYmVsT3B0cy5wYWRkaW5nLFxuXHRcdFx0XHRcdGxpbmU6IDBcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGl0ZW1IZWlnaHQgPSBmb250U2l6ZSArIGxhYmVsT3B0cy5wYWRkaW5nO1xuXHRcdFx0aGVscGVycy5lYWNoKG1lLmxlZ2VuZEl0ZW1zLCBmdW5jdGlvbihsZWdlbmRJdGVtLCBpKSB7XG5cdFx0XHRcdHZhciB0ZXh0V2lkdGggPSBjdHgubWVhc3VyZVRleHQobGVnZW5kSXRlbS50ZXh0KS53aWR0aDtcblx0XHRcdFx0dmFyIHdpZHRoID0gYm94V2lkdGggKyAoZm9udFNpemUgLyAyKSArIHRleHRXaWR0aDtcblx0XHRcdFx0dmFyIHggPSBjdXJzb3IueDtcblx0XHRcdFx0dmFyIHkgPSBjdXJzb3IueTtcblxuXHRcdFx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XG5cdFx0XHRcdFx0aWYgKHggKyB3aWR0aCA+PSBsZWdlbmRXaWR0aCkge1xuXHRcdFx0XHRcdFx0eSA9IGN1cnNvci55ICs9IGl0ZW1IZWlnaHQ7XG5cdFx0XHRcdFx0XHRjdXJzb3IubGluZSsrO1xuXHRcdFx0XHRcdFx0eCA9IGN1cnNvci54ID0gbWUubGVmdCArICgobGVnZW5kV2lkdGggLSBsaW5lV2lkdGhzW2N1cnNvci5saW5lXSkgLyAyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoeSArIGl0ZW1IZWlnaHQgPiBtZS5ib3R0b20pIHtcblx0XHRcdFx0XHR4ID0gY3Vyc29yLnggPSB4ICsgbWUuY29sdW1uV2lkdGhzW2N1cnNvci5saW5lXSArIGxhYmVsT3B0cy5wYWRkaW5nO1xuXHRcdFx0XHRcdHkgPSBjdXJzb3IueSA9IG1lLnRvcCArIGxhYmVsT3B0cy5wYWRkaW5nO1xuXHRcdFx0XHRcdGN1cnNvci5saW5lKys7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkcmF3TGVnZW5kQm94KHgsIHksIGxlZ2VuZEl0ZW0pO1xuXG5cdFx0XHRcdGhpdGJveGVzW2ldLmxlZnQgPSB4O1xuXHRcdFx0XHRoaXRib3hlc1tpXS50b3AgPSB5O1xuXG5cdFx0XHRcdC8vIEZpbGwgdGhlIGFjdHVhbCBsYWJlbFxuXHRcdFx0XHRmaWxsVGV4dCh4LCB5LCBsZWdlbmRJdGVtLCB0ZXh0V2lkdGgpO1xuXG5cdFx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdFx0XHRjdXJzb3IueCArPSB3aWR0aCArIChsYWJlbE9wdHMucGFkZGluZyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3Vyc29yLnkgKz0gaXRlbUhlaWdodDtcblx0XHRcdFx0fVxuXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEhhbmRsZSBhbiBldmVudFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0lFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gaGFuZGxlXG5cdCAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgYSBjaGFuZ2Ugb2NjdXJlZFxuXHQgKi9cblx0aGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcblx0XHR2YXIgdHlwZSA9IGUudHlwZSA9PT0gJ21vdXNldXAnID8gJ2NsaWNrJyA6IGUudHlwZTtcblx0XHR2YXIgY2hhbmdlZCA9IGZhbHNlO1xuXG5cdFx0aWYgKHR5cGUgPT09ICdtb3VzZW1vdmUnKSB7XG5cdFx0XHRpZiAoIW9wdHMub25Ib3Zlcikge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSAnY2xpY2snKSB7XG5cdFx0XHRpZiAoIW9wdHMub25DbGljaykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDaGFydCBldmVudCBhbHJlYWR5IGhhcyByZWxhdGl2ZSBwb3NpdGlvbiBpbiBpdFxuXHRcdHZhciB4ID0gZS54O1xuXHRcdHZhciB5ID0gZS55O1xuXG5cdFx0aWYgKHggPj0gbWUubGVmdCAmJiB4IDw9IG1lLnJpZ2h0ICYmIHkgPj0gbWUudG9wICYmIHkgPD0gbWUuYm90dG9tKSB7XG5cdFx0XHQvLyBTZWUgaWYgd2UgYXJlIHRvdWNoaW5nIG9uZSBvZiB0aGUgZGF0YXNldCBib3hlc1xuXHRcdFx0dmFyIGxoID0gbWUubGVnZW5kSGl0Qm94ZXM7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxoLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdHZhciBoaXRCb3ggPSBsaFtpXTtcblxuXHRcdFx0XHRpZiAoeCA+PSBoaXRCb3gubGVmdCAmJiB4IDw9IGhpdEJveC5sZWZ0ICsgaGl0Qm94LndpZHRoICYmIHkgPj0gaGl0Qm94LnRvcCAmJiB5IDw9IGhpdEJveC50b3AgKyBoaXRCb3guaGVpZ2h0KSB7XG5cdFx0XHRcdFx0Ly8gVG91Y2hpbmcgYW4gZWxlbWVudFxuXHRcdFx0XHRcdGlmICh0eXBlID09PSAnY2xpY2snKSB7XG5cdFx0XHRcdFx0XHQvLyB1c2UgZS5uYXRpdmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHRcdFx0XHRvcHRzLm9uQ2xpY2suY2FsbChtZSwgZS5uYXRpdmUsIG1lLmxlZ2VuZEl0ZW1zW2ldKTtcblx0XHRcdFx0XHRcdGNoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlID09PSAnbW91c2Vtb3ZlJykge1xuXHRcdFx0XHRcdFx0Ly8gdXNlIGUubmF0aXZlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdFx0XHRcdFx0b3B0cy5vbkhvdmVyLmNhbGwobWUsIGUubmF0aXZlLCBtZS5sZWdlbmRJdGVtc1tpXSk7XG5cdFx0XHRcdFx0XHRjaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjaGFuZ2VkO1xuXHR9XG59KTtcblxuZnVuY3Rpb24gY3JlYXRlTmV3TGVnZW5kQW5kQXR0YWNoKGNoYXJ0LCBsZWdlbmRPcHRzKSB7XG5cdHZhciBsZWdlbmQgPSBuZXcgTGVnZW5kKHtcblx0XHRjdHg6IGNoYXJ0LmN0eCxcblx0XHRvcHRpb25zOiBsZWdlbmRPcHRzLFxuXHRcdGNoYXJ0OiBjaGFydFxuXHR9KTtcblxuXHRsYXlvdXRzLmNvbmZpZ3VyZShjaGFydCwgbGVnZW5kLCBsZWdlbmRPcHRzKTtcblx0bGF5b3V0cy5hZGRCb3goY2hhcnQsIGxlZ2VuZCk7XG5cdGNoYXJ0LmxlZ2VuZCA9IGxlZ2VuZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGlkOiAnbGVnZW5kJyxcblxuXHQvKipcblx0ICogQmFja3dhcmQgY29tcGF0aWJpbGl0eTogc2luY2UgMi4xLjUsIHRoZSBsZWdlbmQgaXMgcmVnaXN0ZXJlZCBhcyBhIHBsdWdpbiwgbWFraW5nXG5cdCAqIENoYXJ0LkxlZ2VuZCBvYnNvbGV0ZS4gVG8gYXZvaWQgYSBicmVha2luZyBjaGFuZ2UsIHdlIGV4cG9ydCB0aGUgTGVnZW5kIGFzIHBhcnQgb2Zcblx0ICogdGhlIHBsdWdpbiwgd2hpY2ggb25lIHdpbGwgYmUgcmUtZXhwb3NlZCBpbiB0aGUgY2hhcnQuanMgZmlsZS5cblx0ICogaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvcHVsbC8yNjQwXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZWxlbWVudDogTGVnZW5kLFxuXG5cdGJlZm9yZUluaXQ6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0dmFyIGxlZ2VuZE9wdHMgPSBjaGFydC5vcHRpb25zLmxlZ2VuZDtcblxuXHRcdGlmIChsZWdlbmRPcHRzKSB7XG5cdFx0XHRjcmVhdGVOZXdMZWdlbmRBbmRBdHRhY2goY2hhcnQsIGxlZ2VuZE9wdHMpO1xuXHRcdH1cblx0fSxcblxuXHRiZWZvcmVVcGRhdGU6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0dmFyIGxlZ2VuZE9wdHMgPSBjaGFydC5vcHRpb25zLmxlZ2VuZDtcblx0XHR2YXIgbGVnZW5kID0gY2hhcnQubGVnZW5kO1xuXG5cdFx0aWYgKGxlZ2VuZE9wdHMpIHtcblx0XHRcdGhlbHBlcnMubWVyZ2VJZihsZWdlbmRPcHRzLCBkZWZhdWx0cy5nbG9iYWwubGVnZW5kKTtcblxuXHRcdFx0aWYgKGxlZ2VuZCkge1xuXHRcdFx0XHRsYXlvdXRzLmNvbmZpZ3VyZShjaGFydCwgbGVnZW5kLCBsZWdlbmRPcHRzKTtcblx0XHRcdFx0bGVnZW5kLm9wdGlvbnMgPSBsZWdlbmRPcHRzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JlYXRlTmV3TGVnZW5kQW5kQXR0YWNoKGNoYXJ0LCBsZWdlbmRPcHRzKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGxlZ2VuZCkge1xuXHRcdFx0bGF5b3V0cy5yZW1vdmVCb3goY2hhcnQsIGxlZ2VuZCk7XG5cdFx0XHRkZWxldGUgY2hhcnQubGVnZW5kO1xuXHRcdH1cblx0fSxcblxuXHRhZnRlckV2ZW50OiBmdW5jdGlvbihjaGFydCwgZSkge1xuXHRcdHZhciBsZWdlbmQgPSBjaGFydC5sZWdlbmQ7XG5cdFx0aWYgKGxlZ2VuZCkge1xuXHRcdFx0bGVnZW5kLmhhbmRsZUV2ZW50KGUpO1xuXHRcdH1cblx0fVxufTtcblxufSx7XCIyNlwiOjI2LFwiMjdcIjoyNyxcIjMxXCI6MzEsXCI0NlwiOjQ2fV0sNTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBFbGVtZW50ID0gcmVxdWlyZSgyNyk7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xudmFyIGxheW91dHMgPSByZXF1aXJlKDMxKTtcblxudmFyIG5vb3AgPSBoZWxwZXJzLm5vb3A7XG5cbmRlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcblx0dGl0bGU6IHtcblx0XHRkaXNwbGF5OiBmYWxzZSxcblx0XHRmb250U3R5bGU6ICdib2xkJyxcblx0XHRmdWxsV2lkdGg6IHRydWUsXG5cdFx0bGluZUhlaWdodDogMS4yLFxuXHRcdHBhZGRpbmc6IDEwLFxuXHRcdHBvc2l0aW9uOiAndG9wJyxcblx0XHR0ZXh0OiAnJyxcblx0XHR3ZWlnaHQ6IDIwMDAgICAgICAgICAvLyBieSBkZWZhdWx0IGdyZWF0ZXIgdGhhbiBsZWdlbmQgKDEwMDApIHRvIGJlIGFib3ZlXG5cdH1cbn0pO1xuXG4vKipcbiAqIElNUE9SVEFOVDogdGhpcyBjbGFzcyBpcyBleHBvc2VkIHB1YmxpY2x5IGFzIENoYXJ0LkxlZ2VuZCwgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZXF1aXJlZCFcbiAqL1xudmFyIFRpdGxlID0gRWxlbWVudC5leHRlbmQoe1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbihjb25maWcpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdGhlbHBlcnMuZXh0ZW5kKG1lLCBjb25maWcpO1xuXG5cdFx0Ly8gQ29udGFpbnMgaGl0IGJveGVzIGZvciBlYWNoIGRhdGFzZXQgKGluIGRhdGFzZXQgb3JkZXIpXG5cdFx0bWUubGVnZW5kSGl0Qm94ZXMgPSBbXTtcblx0fSxcblxuXHQvLyBUaGVzZSBtZXRob2RzIGFyZSBvcmRlcmVkIGJ5IGxpZmVjeWNsZS4gVXRpbGl0aWVzIHRoZW4gZm9sbG93LlxuXG5cdGJlZm9yZVVwZGF0ZTogbm9vcCxcblx0dXBkYXRlOiBmdW5jdGlvbihtYXhXaWR0aCwgbWF4SGVpZ2h0LCBtYXJnaW5zKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblxuXHRcdC8vIFVwZGF0ZSBMaWZlY3ljbGUgLSBQcm9iYWJseSBkb24ndCB3YW50IHRvIGV2ZXIgZXh0ZW5kIG9yIG92ZXJ3cml0ZSB0aGlzIGZ1bmN0aW9uIDspXG5cdFx0bWUuYmVmb3JlVXBkYXRlKCk7XG5cblx0XHQvLyBBYnNvcmIgdGhlIG1hc3RlciBtZWFzdXJlbWVudHNcblx0XHRtZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdG1lLm1heEhlaWdodCA9IG1heEhlaWdodDtcblx0XHRtZS5tYXJnaW5zID0gbWFyZ2lucztcblxuXHRcdC8vIERpbWVuc2lvbnNcblx0XHRtZS5iZWZvcmVTZXREaW1lbnNpb25zKCk7XG5cdFx0bWUuc2V0RGltZW5zaW9ucygpO1xuXHRcdG1lLmFmdGVyU2V0RGltZW5zaW9ucygpO1xuXHRcdC8vIExhYmVsc1xuXHRcdG1lLmJlZm9yZUJ1aWxkTGFiZWxzKCk7XG5cdFx0bWUuYnVpbGRMYWJlbHMoKTtcblx0XHRtZS5hZnRlckJ1aWxkTGFiZWxzKCk7XG5cblx0XHQvLyBGaXRcblx0XHRtZS5iZWZvcmVGaXQoKTtcblx0XHRtZS5maXQoKTtcblx0XHRtZS5hZnRlckZpdCgpO1xuXHRcdC8vXG5cdFx0bWUuYWZ0ZXJVcGRhdGUoKTtcblxuXHRcdHJldHVybiBtZS5taW5TaXplO1xuXG5cdH0sXG5cdGFmdGVyVXBkYXRlOiBub29wLFxuXG5cdC8vXG5cblx0YmVmb3JlU2V0RGltZW5zaW9uczogbm9vcCxcblx0c2V0RGltZW5zaW9uczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHQvLyBTZXQgdGhlIHVuY29uc3RyYWluZWQgZGltZW5zaW9uIGJlZm9yZSBsYWJlbCByb3RhdGlvblxuXHRcdGlmIChtZS5pc0hvcml6b250YWwoKSkge1xuXHRcdFx0Ly8gUmVzZXQgcG9zaXRpb24gYmVmb3JlIGNhbGN1bGF0aW5nIHJvdGF0aW9uXG5cdFx0XHRtZS53aWR0aCA9IG1lLm1heFdpZHRoO1xuXHRcdFx0bWUubGVmdCA9IDA7XG5cdFx0XHRtZS5yaWdodCA9IG1lLndpZHRoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZS5oZWlnaHQgPSBtZS5tYXhIZWlnaHQ7XG5cblx0XHRcdC8vIFJlc2V0IHBvc2l0aW9uIGJlZm9yZSBjYWxjdWxhdGluZyByb3RhdGlvblxuXHRcdFx0bWUudG9wID0gMDtcblx0XHRcdG1lLmJvdHRvbSA9IG1lLmhlaWdodDtcblx0XHR9XG5cblx0XHQvLyBSZXNldCBwYWRkaW5nXG5cdFx0bWUucGFkZGluZ0xlZnQgPSAwO1xuXHRcdG1lLnBhZGRpbmdUb3AgPSAwO1xuXHRcdG1lLnBhZGRpbmdSaWdodCA9IDA7XG5cdFx0bWUucGFkZGluZ0JvdHRvbSA9IDA7XG5cblx0XHQvLyBSZXNldCBtaW5TaXplXG5cdFx0bWUubWluU2l6ZSA9IHtcblx0XHRcdHdpZHRoOiAwLFxuXHRcdFx0aGVpZ2h0OiAwXG5cdFx0fTtcblx0fSxcblx0YWZ0ZXJTZXREaW1lbnNpb25zOiBub29wLFxuXG5cdC8vXG5cblx0YmVmb3JlQnVpbGRMYWJlbHM6IG5vb3AsXG5cdGJ1aWxkTGFiZWxzOiBub29wLFxuXHRhZnRlckJ1aWxkTGFiZWxzOiBub29wLFxuXG5cdC8vXG5cblx0YmVmb3JlRml0OiBub29wLFxuXHRmaXQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIHZhbHVlT3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdDtcblx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XG5cdFx0dmFyIGRpc3BsYXkgPSBvcHRzLmRpc3BsYXk7XG5cdFx0dmFyIGZvbnRTaXplID0gdmFsdWVPckRlZmF1bHQob3B0cy5mb250U2l6ZSwgZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRGb250U2l6ZSk7XG5cdFx0dmFyIG1pblNpemUgPSBtZS5taW5TaXplO1xuXHRcdHZhciBsaW5lQ291bnQgPSBoZWxwZXJzLmlzQXJyYXkob3B0cy50ZXh0KSA/IG9wdHMudGV4dC5sZW5ndGggOiAxO1xuXHRcdHZhciBsaW5lSGVpZ2h0ID0gaGVscGVycy5vcHRpb25zLnRvTGluZUhlaWdodChvcHRzLmxpbmVIZWlnaHQsIGZvbnRTaXplKTtcblx0XHR2YXIgdGV4dFNpemUgPSBkaXNwbGF5ID8gKGxpbmVDb3VudCAqIGxpbmVIZWlnaHQpICsgKG9wdHMucGFkZGluZyAqIDIpIDogMDtcblxuXHRcdGlmIChtZS5pc0hvcml6b250YWwoKSkge1xuXHRcdFx0bWluU2l6ZS53aWR0aCA9IG1lLm1heFdpZHRoOyAvLyBmaWxsIGFsbCB0aGUgd2lkdGhcblx0XHRcdG1pblNpemUuaGVpZ2h0ID0gdGV4dFNpemU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1pblNpemUud2lkdGggPSB0ZXh0U2l6ZTtcblx0XHRcdG1pblNpemUuaGVpZ2h0ID0gbWUubWF4SGVpZ2h0OyAvLyBmaWxsIGFsbCB0aGUgaGVpZ2h0XG5cdFx0fVxuXG5cdFx0bWUud2lkdGggPSBtaW5TaXplLndpZHRoO1xuXHRcdG1lLmhlaWdodCA9IG1pblNpemUuaGVpZ2h0O1xuXG5cdH0sXG5cdGFmdGVyRml0OiBub29wLFxuXG5cdC8vIFNoYXJlZCBNZXRob2RzXG5cdGlzSG9yaXpvbnRhbDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHBvcyA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbjtcblx0XHRyZXR1cm4gcG9zID09PSAndG9wJyB8fCBwb3MgPT09ICdib3R0b20nO1xuXHR9LFxuXG5cdC8vIEFjdHVhbGx5IGRyYXcgdGhlIHRpdGxlIGJsb2NrIG9uIHRoZSBjYW52YXNcblx0ZHJhdzogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgY3R4ID0gbWUuY3R4O1xuXHRcdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQ7XG5cdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xuXHRcdHZhciBnbG9iYWxEZWZhdWx0cyA9IGRlZmF1bHRzLmdsb2JhbDtcblxuXHRcdGlmIChvcHRzLmRpc3BsYXkpIHtcblx0XHRcdHZhciBmb250U2l6ZSA9IHZhbHVlT3JEZWZhdWx0KG9wdHMuZm9udFNpemUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U2l6ZSk7XG5cdFx0XHR2YXIgZm9udFN0eWxlID0gdmFsdWVPckRlZmF1bHQob3B0cy5mb250U3R5bGUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U3R5bGUpO1xuXHRcdFx0dmFyIGZvbnRGYW1pbHkgPSB2YWx1ZU9yRGVmYXVsdChvcHRzLmZvbnRGYW1pbHksIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250RmFtaWx5KTtcblx0XHRcdHZhciB0aXRsZUZvbnQgPSBoZWxwZXJzLmZvbnRTdHJpbmcoZm9udFNpemUsIGZvbnRTdHlsZSwgZm9udEZhbWlseSk7XG5cdFx0XHR2YXIgbGluZUhlaWdodCA9IGhlbHBlcnMub3B0aW9ucy50b0xpbmVIZWlnaHQob3B0cy5saW5lSGVpZ2h0LCBmb250U2l6ZSk7XG5cdFx0XHR2YXIgb2Zmc2V0ID0gbGluZUhlaWdodCAvIDIgKyBvcHRzLnBhZGRpbmc7XG5cdFx0XHR2YXIgcm90YXRpb24gPSAwO1xuXHRcdFx0dmFyIHRvcCA9IG1lLnRvcDtcblx0XHRcdHZhciBsZWZ0ID0gbWUubGVmdDtcblx0XHRcdHZhciBib3R0b20gPSBtZS5ib3R0b207XG5cdFx0XHR2YXIgcmlnaHQgPSBtZS5yaWdodDtcblx0XHRcdHZhciBtYXhXaWR0aCwgdGl0bGVYLCB0aXRsZVk7XG5cblx0XHRcdGN0eC5maWxsU3R5bGUgPSB2YWx1ZU9yRGVmYXVsdChvcHRzLmZvbnRDb2xvciwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRDb2xvcik7IC8vIHJlbmRlciBpbiBjb3JyZWN0IGNvbG91clxuXHRcdFx0Y3R4LmZvbnQgPSB0aXRsZUZvbnQ7XG5cblx0XHRcdC8vIEhvcml6b250YWxcblx0XHRcdGlmIChtZS5pc0hvcml6b250YWwoKSkge1xuXHRcdFx0XHR0aXRsZVggPSBsZWZ0ICsgKChyaWdodCAtIGxlZnQpIC8gMik7IC8vIG1pZHBvaW50IG9mIHRoZSB3aWR0aFxuXHRcdFx0XHR0aXRsZVkgPSB0b3AgKyBvZmZzZXQ7XG5cdFx0XHRcdG1heFdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGl0bGVYID0gb3B0cy5wb3NpdGlvbiA9PT0gJ2xlZnQnID8gbGVmdCArIG9mZnNldCA6IHJpZ2h0IC0gb2Zmc2V0O1xuXHRcdFx0XHR0aXRsZVkgPSB0b3AgKyAoKGJvdHRvbSAtIHRvcCkgLyAyKTtcblx0XHRcdFx0bWF4V2lkdGggPSBib3R0b20gLSB0b3A7XG5cdFx0XHRcdHJvdGF0aW9uID0gTWF0aC5QSSAqIChvcHRzLnBvc2l0aW9uID09PSAnbGVmdCcgPyAtMC41IDogMC41KTtcblx0XHRcdH1cblxuXHRcdFx0Y3R4LnNhdmUoKTtcblx0XHRcdGN0eC50cmFuc2xhdGUodGl0bGVYLCB0aXRsZVkpO1xuXHRcdFx0Y3R4LnJvdGF0ZShyb3RhdGlvbik7XG5cdFx0XHRjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7XG5cdFx0XHRjdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG5cblx0XHRcdHZhciB0ZXh0ID0gb3B0cy50ZXh0O1xuXHRcdFx0aWYgKGhlbHBlcnMuaXNBcnJheSh0ZXh0KSkge1xuXHRcdFx0XHR2YXIgeSA9IDA7XG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHRcdGN0eC5maWxsVGV4dCh0ZXh0W2ldLCAwLCB5LCBtYXhXaWR0aCk7XG5cdFx0XHRcdFx0eSArPSBsaW5lSGVpZ2h0O1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjdHguZmlsbFRleHQodGV4dCwgMCwgMCwgbWF4V2lkdGgpO1xuXHRcdFx0fVxuXG5cdFx0XHRjdHgucmVzdG9yZSgpO1xuXHRcdH1cblx0fVxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZU5ld1RpdGxlQmxvY2tBbmRBdHRhY2goY2hhcnQsIHRpdGxlT3B0cykge1xuXHR2YXIgdGl0bGUgPSBuZXcgVGl0bGUoe1xuXHRcdGN0eDogY2hhcnQuY3R4LFxuXHRcdG9wdGlvbnM6IHRpdGxlT3B0cyxcblx0XHRjaGFydDogY2hhcnRcblx0fSk7XG5cblx0bGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIHRpdGxlLCB0aXRsZU9wdHMpO1xuXHRsYXlvdXRzLmFkZEJveChjaGFydCwgdGl0bGUpO1xuXHRjaGFydC50aXRsZUJsb2NrID0gdGl0bGU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRpZDogJ3RpdGxlJyxcblxuXHQvKipcblx0ICogQmFja3dhcmQgY29tcGF0aWJpbGl0eTogc2luY2UgMi4xLjUsIHRoZSB0aXRsZSBpcyByZWdpc3RlcmVkIGFzIGEgcGx1Z2luLCBtYWtpbmdcblx0ICogQ2hhcnQuVGl0bGUgb2Jzb2xldGUuIFRvIGF2b2lkIGEgYnJlYWtpbmcgY2hhbmdlLCB3ZSBleHBvcnQgdGhlIFRpdGxlIGFzIHBhcnQgb2Zcblx0ICogdGhlIHBsdWdpbiwgd2hpY2ggb25lIHdpbGwgYmUgcmUtZXhwb3NlZCBpbiB0aGUgY2hhcnQuanMgZmlsZS5cblx0ICogaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvcHVsbC8yNjQwXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZWxlbWVudDogVGl0bGUsXG5cblx0YmVmb3JlSW5pdDogZnVuY3Rpb24oY2hhcnQpIHtcblx0XHR2YXIgdGl0bGVPcHRzID0gY2hhcnQub3B0aW9ucy50aXRsZTtcblxuXHRcdGlmICh0aXRsZU9wdHMpIHtcblx0XHRcdGNyZWF0ZU5ld1RpdGxlQmxvY2tBbmRBdHRhY2goY2hhcnQsIHRpdGxlT3B0cyk7XG5cdFx0fVxuXHR9LFxuXG5cdGJlZm9yZVVwZGF0ZTogZnVuY3Rpb24oY2hhcnQpIHtcblx0XHR2YXIgdGl0bGVPcHRzID0gY2hhcnQub3B0aW9ucy50aXRsZTtcblx0XHR2YXIgdGl0bGVCbG9jayA9IGNoYXJ0LnRpdGxlQmxvY2s7XG5cblx0XHRpZiAodGl0bGVPcHRzKSB7XG5cdFx0XHRoZWxwZXJzLm1lcmdlSWYodGl0bGVPcHRzLCBkZWZhdWx0cy5nbG9iYWwudGl0bGUpO1xuXG5cdFx0XHRpZiAodGl0bGVCbG9jaykge1xuXHRcdFx0XHRsYXlvdXRzLmNvbmZpZ3VyZShjaGFydCwgdGl0bGVCbG9jaywgdGl0bGVPcHRzKTtcblx0XHRcdFx0dGl0bGVCbG9jay5vcHRpb25zID0gdGl0bGVPcHRzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JlYXRlTmV3VGl0bGVCbG9ja0FuZEF0dGFjaChjaGFydCwgdGl0bGVPcHRzKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHRpdGxlQmxvY2spIHtcblx0XHRcdGxheW91dHMucmVtb3ZlQm94KGNoYXJ0LCB0aXRsZUJsb2NrKTtcblx0XHRcdGRlbGV0ZSBjaGFydC50aXRsZUJsb2NrO1xuXHRcdH1cblx0fVxufTtcblxufSx7XCIyNlwiOjI2LFwiMjdcIjoyNyxcIjMxXCI6MzEsXCI0NlwiOjQ2fV0sNTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU2NhbGUgPSByZXF1aXJlKDMzKTtcbnZhciBzY2FsZVNlcnZpY2UgPSByZXF1aXJlKDM0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblxuXHQvLyBEZWZhdWx0IGNvbmZpZyBmb3IgYSBjYXRlZ29yeSBzY2FsZVxuXHR2YXIgZGVmYXVsdENvbmZpZyA9IHtcblx0XHRwb3NpdGlvbjogJ2JvdHRvbSdcblx0fTtcblxuXHR2YXIgRGF0YXNldFNjYWxlID0gU2NhbGUuZXh0ZW5kKHtcblx0XHQvKipcblx0XHQqIEludGVybmFsIGZ1bmN0aW9uIHRvIGdldCB0aGUgY29ycmVjdCBsYWJlbHMuIElmIGRhdGEueExhYmVscyBvciBkYXRhLnlMYWJlbHMgYXJlIGRlZmluZWQsIHVzZSB0aG9zZVxuXHRcdCogZWxzZSBmYWxsIGJhY2sgdG8gZGF0YS5sYWJlbHNcblx0XHQqIEBwcml2YXRlXG5cdFx0Ki9cblx0XHRnZXRMYWJlbHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRhdGEgPSB0aGlzLmNoYXJ0LmRhdGE7XG5cdFx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVscyB8fCAodGhpcy5pc0hvcml6b250YWwoKSA/IGRhdGEueExhYmVscyA6IGRhdGEueUxhYmVscykgfHwgZGF0YS5sYWJlbHM7XG5cdFx0fSxcblxuXHRcdGRldGVybWluZURhdGFMaW1pdHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBsYWJlbHMgPSBtZS5nZXRMYWJlbHMoKTtcblx0XHRcdG1lLm1pbkluZGV4ID0gMDtcblx0XHRcdG1lLm1heEluZGV4ID0gbGFiZWxzLmxlbmd0aCAtIDE7XG5cdFx0XHR2YXIgZmluZEluZGV4O1xuXG5cdFx0XHRpZiAobWUub3B0aW9ucy50aWNrcy5taW4gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQvLyB1c2VyIHNwZWNpZmllZCBtaW4gdmFsdWVcblx0XHRcdFx0ZmluZEluZGV4ID0gbGFiZWxzLmluZGV4T2YobWUub3B0aW9ucy50aWNrcy5taW4pO1xuXHRcdFx0XHRtZS5taW5JbmRleCA9IGZpbmRJbmRleCAhPT0gLTEgPyBmaW5kSW5kZXggOiBtZS5taW5JbmRleDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1lLm9wdGlvbnMudGlja3MubWF4ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly8gdXNlciBzcGVjaWZpZWQgbWF4IHZhbHVlXG5cdFx0XHRcdGZpbmRJbmRleCA9IGxhYmVscy5pbmRleE9mKG1lLm9wdGlvbnMudGlja3MubWF4KTtcblx0XHRcdFx0bWUubWF4SW5kZXggPSBmaW5kSW5kZXggIT09IC0xID8gZmluZEluZGV4IDogbWUubWF4SW5kZXg7XG5cdFx0XHR9XG5cblx0XHRcdG1lLm1pbiA9IGxhYmVsc1ttZS5taW5JbmRleF07XG5cdFx0XHRtZS5tYXggPSBsYWJlbHNbbWUubWF4SW5kZXhdO1xuXHRcdH0sXG5cblx0XHRidWlsZFRpY2tzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgbGFiZWxzID0gbWUuZ2V0TGFiZWxzKCk7XG5cdFx0XHQvLyBJZiB3ZSBhcmUgdmlld2luZyBzb21lIHN1YnNldCBvZiBsYWJlbHMsIHNsaWNlIHRoZSBvcmlnaW5hbCBhcnJheVxuXHRcdFx0bWUudGlja3MgPSAobWUubWluSW5kZXggPT09IDAgJiYgbWUubWF4SW5kZXggPT09IGxhYmVscy5sZW5ndGggLSAxKSA/IGxhYmVscyA6IGxhYmVscy5zbGljZShtZS5taW5JbmRleCwgbWUubWF4SW5kZXggKyAxKTtcblx0XHR9LFxuXG5cdFx0Z2V0TGFiZWxGb3JJbmRleDogZnVuY3Rpb24oaW5kZXgsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBkYXRhID0gbWUuY2hhcnQuZGF0YTtcblx0XHRcdHZhciBpc0hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcblxuXHRcdFx0aWYgKGRhdGEueUxhYmVscyAmJiAhaXNIb3Jpem9udGFsKSB7XG5cdFx0XHRcdHJldHVybiBtZS5nZXRSaWdodFZhbHVlKGRhdGEuZGF0YXNldHNbZGF0YXNldEluZGV4XS5kYXRhW2luZGV4XSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWUudGlja3NbaW5kZXggLSBtZS5taW5JbmRleF07XG5cdFx0fSxcblxuXHRcdC8vIFVzZWQgdG8gZ2V0IGRhdGEgdmFsdWUgbG9jYXRpb25zLiAgVmFsdWUgY2FuIGVpdGhlciBiZSBhbiBpbmRleCBvciBhIG51bWVyaWNhbCB2YWx1ZVxuXHRcdGdldFBpeGVsRm9yVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBvZmZzZXQgPSBtZS5vcHRpb25zLm9mZnNldDtcblx0XHRcdC8vIDEgaXMgYWRkZWQgYmVjYXVzZSB3ZSBuZWVkIHRoZSBsZW5ndGggYnV0IHdlIGhhdmUgdGhlIGluZGV4ZXNcblx0XHRcdHZhciBvZmZzZXRBbXQgPSBNYXRoLm1heCgobWUubWF4SW5kZXggKyAxIC0gbWUubWluSW5kZXggLSAob2Zmc2V0ID8gMCA6IDEpKSwgMSk7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZGF0YSBvYmplY3QsIHRoZW4gaW5kZXggaXMgdGhlIGluZGV4IGluIHRoZSBkYXRhIGFycmF5LFxuXHRcdFx0Ly8gbm90IHRoZSBpbmRleCBvZiB0aGUgc2NhbGUuIFdlIG5lZWQgdG8gY2hhbmdlIHRoYXQuXG5cdFx0XHR2YXIgdmFsdWVDYXRlZ29yeTtcblx0XHRcdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG5cdFx0XHRcdHZhbHVlQ2F0ZWdvcnkgPSBtZS5pc0hvcml6b250YWwoKSA/IHZhbHVlLnggOiB2YWx1ZS55O1xuXHRcdFx0fVxuXHRcdFx0aWYgKHZhbHVlQ2F0ZWdvcnkgIT09IHVuZGVmaW5lZCB8fCAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiBpc05hTihpbmRleCkpKSB7XG5cdFx0XHRcdHZhciBsYWJlbHMgPSBtZS5nZXRMYWJlbHMoKTtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZUNhdGVnb3J5IHx8IHZhbHVlO1xuXHRcdFx0XHR2YXIgaWR4ID0gbGFiZWxzLmluZGV4T2YodmFsdWUpO1xuXHRcdFx0XHRpbmRleCA9IGlkeCAhPT0gLTEgPyBpZHggOiBpbmRleDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1lLmlzSG9yaXpvbnRhbCgpKSB7XG5cdFx0XHRcdHZhciB2YWx1ZVdpZHRoID0gbWUud2lkdGggLyBvZmZzZXRBbXQ7XG5cdFx0XHRcdHZhciB3aWR0aE9mZnNldCA9ICh2YWx1ZVdpZHRoICogKGluZGV4IC0gbWUubWluSW5kZXgpKTtcblxuXHRcdFx0XHRpZiAob2Zmc2V0KSB7XG5cdFx0XHRcdFx0d2lkdGhPZmZzZXQgKz0gKHZhbHVlV2lkdGggLyAyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBtZS5sZWZ0ICsgTWF0aC5yb3VuZCh3aWR0aE9mZnNldCk7XG5cdFx0XHR9XG5cdFx0XHR2YXIgdmFsdWVIZWlnaHQgPSBtZS5oZWlnaHQgLyBvZmZzZXRBbXQ7XG5cdFx0XHR2YXIgaGVpZ2h0T2Zmc2V0ID0gKHZhbHVlSGVpZ2h0ICogKGluZGV4IC0gbWUubWluSW5kZXgpKTtcblxuXHRcdFx0aWYgKG9mZnNldCkge1xuXHRcdFx0XHRoZWlnaHRPZmZzZXQgKz0gKHZhbHVlSGVpZ2h0IC8gMik7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtZS50b3AgKyBNYXRoLnJvdW5kKGhlaWdodE9mZnNldCk7XG5cdFx0fSxcblx0XHRnZXRQaXhlbEZvclRpY2s6IGZ1bmN0aW9uKGluZGV4KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRQaXhlbEZvclZhbHVlKHRoaXMudGlja3NbaW5kZXhdLCBpbmRleCArIHRoaXMubWluSW5kZXgsIG51bGwpO1xuXHRcdH0sXG5cdFx0Z2V0VmFsdWVGb3JQaXhlbDogZnVuY3Rpb24ocGl4ZWwpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgb2Zmc2V0ID0gbWUub3B0aW9ucy5vZmZzZXQ7XG5cdFx0XHR2YXIgdmFsdWU7XG5cdFx0XHR2YXIgb2Zmc2V0QW10ID0gTWF0aC5tYXgoKG1lLl90aWNrcy5sZW5ndGggLSAob2Zmc2V0ID8gMCA6IDEpKSwgMSk7XG5cdFx0XHR2YXIgaG9yeiA9IG1lLmlzSG9yaXpvbnRhbCgpO1xuXHRcdFx0dmFyIHZhbHVlRGltZW5zaW9uID0gKGhvcnogPyBtZS53aWR0aCA6IG1lLmhlaWdodCkgLyBvZmZzZXRBbXQ7XG5cblx0XHRcdHBpeGVsIC09IGhvcnogPyBtZS5sZWZ0IDogbWUudG9wO1xuXG5cdFx0XHRpZiAob2Zmc2V0KSB7XG5cdFx0XHRcdHBpeGVsIC09ICh2YWx1ZURpbWVuc2lvbiAvIDIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocGl4ZWwgPD0gMCkge1xuXHRcdFx0XHR2YWx1ZSA9IDA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YWx1ZSA9IE1hdGgucm91bmQocGl4ZWwgLyB2YWx1ZURpbWVuc2lvbik7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZSArIG1lLm1pbkluZGV4O1xuXHRcdH0sXG5cdFx0Z2V0QmFzZVBpeGVsOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmJvdHRvbTtcblx0XHR9XG5cdH0pO1xuXG5cdHNjYWxlU2VydmljZS5yZWdpc3RlclNjYWxlVHlwZSgnY2F0ZWdvcnknLCBEYXRhc2V0U2NhbGUsIGRlZmF1bHRDb25maWcpO1xufTtcblxufSx7XCIzM1wiOjMzLFwiMzRcIjozNH1dLDU1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xudmFyIHNjYWxlU2VydmljZSA9IHJlcXVpcmUoMzQpO1xudmFyIFRpY2tzID0gcmVxdWlyZSgzNSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHR2YXIgZGVmYXVsdENvbmZpZyA9IHtcblx0XHRwb3NpdGlvbjogJ2xlZnQnLFxuXHRcdHRpY2tzOiB7XG5cdFx0XHRjYWxsYmFjazogVGlja3MuZm9ybWF0dGVycy5saW5lYXJcblx0XHR9XG5cdH07XG5cblx0dmFyIExpbmVhclNjYWxlID0gQ2hhcnQuTGluZWFyU2NhbGVCYXNlLmV4dGVuZCh7XG5cblx0XHRkZXRlcm1pbmVEYXRhTGltaXRzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XG5cdFx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcblx0XHRcdHZhciBkYXRhID0gY2hhcnQuZGF0YTtcblx0XHRcdHZhciBkYXRhc2V0cyA9IGRhdGEuZGF0YXNldHM7XG5cdFx0XHR2YXIgaXNIb3Jpem9udGFsID0gbWUuaXNIb3Jpem9udGFsKCk7XG5cdFx0XHR2YXIgREVGQVVMVF9NSU4gPSAwO1xuXHRcdFx0dmFyIERFRkFVTFRfTUFYID0gMTtcblxuXHRcdFx0ZnVuY3Rpb24gSURNYXRjaGVzKG1ldGEpIHtcblx0XHRcdFx0cmV0dXJuIGlzSG9yaXpvbnRhbCA/IG1ldGEueEF4aXNJRCA9PT0gbWUuaWQgOiBtZXRhLnlBeGlzSUQgPT09IG1lLmlkO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGaXJzdCBDYWxjdWxhdGUgdGhlIHJhbmdlXG5cdFx0XHRtZS5taW4gPSBudWxsO1xuXHRcdFx0bWUubWF4ID0gbnVsbDtcblxuXHRcdFx0dmFyIGhhc1N0YWNrcyA9IG9wdHMuc3RhY2tlZDtcblx0XHRcdGlmIChoYXNTdGFja3MgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRoZWxwZXJzLmVhY2goZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0XHRcdGlmIChoYXNTdGFja3MpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdFx0aWYgKGNoYXJ0LmlzRGF0YXNldFZpc2libGUoZGF0YXNldEluZGV4KSAmJiBJRE1hdGNoZXMobWV0YSkgJiZcblx0XHRcdFx0XHRcdG1ldGEuc3RhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0aGFzU3RhY2tzID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob3B0cy5zdGFja2VkIHx8IGhhc1N0YWNrcykge1xuXHRcdFx0XHR2YXIgdmFsdWVzUGVyU3RhY2sgPSB7fTtcblxuXHRcdFx0XHRoZWxwZXJzLmVhY2goZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0XHRcdHZhciBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcblx0XHRcdFx0XHR2YXIga2V5ID0gW1xuXHRcdFx0XHRcdFx0bWV0YS50eXBlLFxuXHRcdFx0XHRcdFx0Ly8gd2UgaGF2ZSBhIHNlcGFyYXRlIHN0YWNrIGZvciBzdGFjaz11bmRlZmluZWQgZGF0YXNldHMgd2hlbiB0aGUgb3B0cy5zdGFja2VkIGlzIHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0KChvcHRzLnN0YWNrZWQgPT09IHVuZGVmaW5lZCAmJiBtZXRhLnN0YWNrID09PSB1bmRlZmluZWQpID8gZGF0YXNldEluZGV4IDogJycpLFxuXHRcdFx0XHRcdFx0bWV0YS5zdGFja1xuXHRcdFx0XHRcdF0uam9pbignLicpO1xuXG5cdFx0XHRcdFx0aWYgKHZhbHVlc1BlclN0YWNrW2tleV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dmFsdWVzUGVyU3RhY2tba2V5XSA9IHtcblx0XHRcdFx0XHRcdFx0cG9zaXRpdmVWYWx1ZXM6IFtdLFxuXHRcdFx0XHRcdFx0XHRuZWdhdGl2ZVZhbHVlczogW11cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgdGhlc2UgcGVyIHR5cGVcblx0XHRcdFx0XHR2YXIgcG9zaXRpdmVWYWx1ZXMgPSB2YWx1ZXNQZXJTdGFja1trZXldLnBvc2l0aXZlVmFsdWVzO1xuXHRcdFx0XHRcdHZhciBuZWdhdGl2ZVZhbHVlcyA9IHZhbHVlc1BlclN0YWNrW2tleV0ubmVnYXRpdmVWYWx1ZXM7XG5cblx0XHRcdFx0XHRpZiAoY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShkYXRhc2V0SW5kZXgpICYmIElETWF0Y2hlcyhtZXRhKSkge1xuXHRcdFx0XHRcdFx0aGVscGVycy5lYWNoKGRhdGFzZXQuZGF0YSwgZnVuY3Rpb24ocmF3VmFsdWUsIGluZGV4KSB7XG5cdFx0XHRcdFx0XHRcdHZhciB2YWx1ZSA9ICttZS5nZXRSaWdodFZhbHVlKHJhd1ZhbHVlKTtcblx0XHRcdFx0XHRcdFx0aWYgKGlzTmFOKHZhbHVlKSB8fCBtZXRhLmRhdGFbaW5kZXhdLmhpZGRlbikge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHBvc2l0aXZlVmFsdWVzW2luZGV4XSA9IHBvc2l0aXZlVmFsdWVzW2luZGV4XSB8fCAwO1xuXHRcdFx0XHRcdFx0XHRuZWdhdGl2ZVZhbHVlc1tpbmRleF0gPSBuZWdhdGl2ZVZhbHVlc1tpbmRleF0gfHwgMDtcblxuXHRcdFx0XHRcdFx0XHRpZiAob3B0cy5yZWxhdGl2ZVBvaW50cykge1xuXHRcdFx0XHRcdFx0XHRcdHBvc2l0aXZlVmFsdWVzW2luZGV4XSA9IDEwMDtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICh2YWx1ZSA8IDApIHtcblx0XHRcdFx0XHRcdFx0XHRuZWdhdGl2ZVZhbHVlc1tpbmRleF0gKz0gdmFsdWU7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0cG9zaXRpdmVWYWx1ZXNbaW5kZXhdICs9IHZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGhlbHBlcnMuZWFjaCh2YWx1ZXNQZXJTdGFjaywgZnVuY3Rpb24odmFsdWVzRm9yVHlwZSkge1xuXHRcdFx0XHRcdHZhciB2YWx1ZXMgPSB2YWx1ZXNGb3JUeXBlLnBvc2l0aXZlVmFsdWVzLmNvbmNhdCh2YWx1ZXNGb3JUeXBlLm5lZ2F0aXZlVmFsdWVzKTtcblx0XHRcdFx0XHR2YXIgbWluVmFsID0gaGVscGVycy5taW4odmFsdWVzKTtcblx0XHRcdFx0XHR2YXIgbWF4VmFsID0gaGVscGVycy5tYXgodmFsdWVzKTtcblx0XHRcdFx0XHRtZS5taW4gPSBtZS5taW4gPT09IG51bGwgPyBtaW5WYWwgOiBNYXRoLm1pbihtZS5taW4sIG1pblZhbCk7XG5cdFx0XHRcdFx0bWUubWF4ID0gbWUubWF4ID09PSBudWxsID8gbWF4VmFsIDogTWF0aC5tYXgobWUubWF4LCBtYXhWYWwpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGVscGVycy5lYWNoKGRhdGFzZXRzLCBmdW5jdGlvbihkYXRhc2V0LCBkYXRhc2V0SW5kZXgpIHtcblx0XHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdFx0aWYgKGNoYXJ0LmlzRGF0YXNldFZpc2libGUoZGF0YXNldEluZGV4KSAmJiBJRE1hdGNoZXMobWV0YSkpIHtcblx0XHRcdFx0XHRcdGhlbHBlcnMuZWFjaChkYXRhc2V0LmRhdGEsIGZ1bmN0aW9uKHJhd1ZhbHVlLCBpbmRleCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdmFsdWUgPSArbWUuZ2V0UmlnaHRWYWx1ZShyYXdWYWx1ZSk7XG5cdFx0XHRcdFx0XHRcdGlmIChpc05hTih2YWx1ZSkgfHwgbWV0YS5kYXRhW2luZGV4XS5oaWRkZW4pIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAobWUubWluID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdFx0bWUubWluID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodmFsdWUgPCBtZS5taW4pIHtcblx0XHRcdFx0XHRcdFx0XHRtZS5taW4gPSB2YWx1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChtZS5tYXggPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0XHRtZS5tYXggPSB2YWx1ZTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICh2YWx1ZSA+IG1lLm1heCkge1xuXHRcdFx0XHRcdFx0XHRcdG1lLm1heCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRtZS5taW4gPSBpc0Zpbml0ZShtZS5taW4pICYmICFpc05hTihtZS5taW4pID8gbWUubWluIDogREVGQVVMVF9NSU47XG5cdFx0XHRtZS5tYXggPSBpc0Zpbml0ZShtZS5tYXgpICYmICFpc05hTihtZS5tYXgpID8gbWUubWF4IDogREVGQVVMVF9NQVg7XG5cblx0XHRcdC8vIENvbW1vbiBiYXNlIGltcGxlbWVudGF0aW9uIHRvIGhhbmRsZSB0aWNrcy5taW4sIHRpY2tzLm1heCwgdGlja3MuYmVnaW5BdFplcm9cblx0XHRcdHRoaXMuaGFuZGxlVGlja1JhbmdlT3B0aW9ucygpO1xuXHRcdH0sXG5cdFx0Z2V0VGlja0xpbWl0OiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtYXhUaWNrcztcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgdGlja09wdHMgPSBtZS5vcHRpb25zLnRpY2tzO1xuXG5cdFx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdFx0bWF4VGlja3MgPSBNYXRoLm1pbih0aWNrT3B0cy5tYXhUaWNrc0xpbWl0ID8gdGlja09wdHMubWF4VGlja3NMaW1pdCA6IDExLCBNYXRoLmNlaWwobWUud2lkdGggLyA1MCkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gVGhlIGZhY3RvciBvZiAyIHVzZWQgdG8gc2NhbGUgdGhlIGZvbnQgc2l6ZSBoYXMgYmVlbiBleHBlcmltZW50YWxseSBkZXRlcm1pbmVkLlxuXHRcdFx0XHR2YXIgdGlja0ZvbnRTaXplID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdCh0aWNrT3B0cy5mb250U2l6ZSwgZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRGb250U2l6ZSk7XG5cdFx0XHRcdG1heFRpY2tzID0gTWF0aC5taW4odGlja09wdHMubWF4VGlja3NMaW1pdCA/IHRpY2tPcHRzLm1heFRpY2tzTGltaXQgOiAxMSwgTWF0aC5jZWlsKG1lLmhlaWdodCAvICgyICogdGlja0ZvbnRTaXplKSkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF4VGlja3M7XG5cdFx0fSxcblx0XHQvLyBDYWxsZWQgYWZ0ZXIgdGhlIHRpY2tzIGFyZSBidWlsdC4gV2UgbmVlZFxuXHRcdGhhbmRsZURpcmVjdGlvbmFsQ2hhbmdlczogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIXRoaXMuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdFx0Ly8gV2UgYXJlIGluIGEgdmVydGljYWwgb3JpZW50YXRpb24uIFRoZSB0b3AgdmFsdWUgaXMgdGhlIGhpZ2hlc3QuIFNvIHJldmVyc2UgdGhlIGFycmF5XG5cdFx0XHRcdHRoaXMudGlja3MucmV2ZXJzZSgpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0TGFiZWxGb3JJbmRleDogZnVuY3Rpb24oaW5kZXgsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0cmV0dXJuICt0aGlzLmdldFJpZ2h0VmFsdWUodGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0uZGF0YVtpbmRleF0pO1xuXHRcdH0sXG5cdFx0Ly8gVXRpbHNcblx0XHRnZXRQaXhlbEZvclZhbHVlOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0Ly8gVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBmaXQgaGFzIGJlZW4gcnVuIHNvIHRoYXRcblx0XHRcdC8vIHRoaXMubGVmdCwgdGhpcy50b3AsIHRoaXMucmlnaHQsIGFuZCB0aGlzLmJvdHRvbSBoYXZlIGJlZW4gZGVmaW5lZFxuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBzdGFydCA9IG1lLnN0YXJ0O1xuXG5cdFx0XHR2YXIgcmlnaHRWYWx1ZSA9ICttZS5nZXRSaWdodFZhbHVlKHZhbHVlKTtcblx0XHRcdHZhciBwaXhlbDtcblx0XHRcdHZhciByYW5nZSA9IG1lLmVuZCAtIHN0YXJ0O1xuXG5cdFx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdFx0cGl4ZWwgPSBtZS5sZWZ0ICsgKG1lLndpZHRoIC8gcmFuZ2UgKiAocmlnaHRWYWx1ZSAtIHN0YXJ0KSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwaXhlbCA9IG1lLmJvdHRvbSAtIChtZS5oZWlnaHQgLyByYW5nZSAqIChyaWdodFZhbHVlIC0gc3RhcnQpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBwaXhlbDtcblx0XHR9LFxuXHRcdGdldFZhbHVlRm9yUGl4ZWw6IGZ1bmN0aW9uKHBpeGVsKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGlzSG9yaXpvbnRhbCA9IG1lLmlzSG9yaXpvbnRhbCgpO1xuXHRcdFx0dmFyIGlubmVyRGltZW5zaW9uID0gaXNIb3Jpem9udGFsID8gbWUud2lkdGggOiBtZS5oZWlnaHQ7XG5cdFx0XHR2YXIgb2Zmc2V0ID0gKGlzSG9yaXpvbnRhbCA/IHBpeGVsIC0gbWUubGVmdCA6IG1lLmJvdHRvbSAtIHBpeGVsKSAvIGlubmVyRGltZW5zaW9uO1xuXHRcdFx0cmV0dXJuIG1lLnN0YXJ0ICsgKChtZS5lbmQgLSBtZS5zdGFydCkgKiBvZmZzZXQpO1xuXHRcdH0sXG5cdFx0Z2V0UGl4ZWxGb3JUaWNrOiBmdW5jdGlvbihpbmRleCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0UGl4ZWxGb3JWYWx1ZSh0aGlzLnRpY2tzQXNOdW1iZXJzW2luZGV4XSk7XG5cdFx0fVxuXHR9KTtcblxuXHRzY2FsZVNlcnZpY2UucmVnaXN0ZXJTY2FsZVR5cGUoJ2xpbmVhcicsIExpbmVhclNjYWxlLCBkZWZhdWx0Q29uZmlnKTtcbn07XG5cbn0se1wiMjZcIjoyNixcIjM0XCI6MzQsXCIzNVwiOjM1LFwiNDZcIjo0Nn1dLDU2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcbnZhciBTY2FsZSA9IHJlcXVpcmUoMzMpO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgc2V0IG9mIGxpbmVhciB0aWNrc1xuICogQHBhcmFtIGdlbmVyYXRpb25PcHRpb25zIHRoZSBvcHRpb25zIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHRpY2tzXG4gKiBAcGFyYW0gZGF0YVJhbmdlIHRoZSByYW5nZSBvZiB0aGUgZGF0YVxuICogQHJldHVybnMge0FycmF5PE51bWJlcj59IGFycmF5IG9mIHRpY2sgdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlVGlja3MoZ2VuZXJhdGlvbk9wdGlvbnMsIGRhdGFSYW5nZSkge1xuXHR2YXIgdGlja3MgPSBbXTtcblx0Ly8gVG8gZ2V0IGEgXCJuaWNlXCIgdmFsdWUgZm9yIHRoZSB0aWNrIHNwYWNpbmcsIHdlIHdpbGwgdXNlIHRoZSBhcHByb3ByaWF0ZWx5IG5hbWVkXG5cdC8vIFwibmljZSBudW1iZXJcIiBhbGdvcml0aG0uIFNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg1MDY4ODEvbmljZS1sYWJlbC1hbGdvcml0aG0tZm9yLWNoYXJ0cy13aXRoLW1pbmltdW0tdGlja3Ncblx0Ly8gZm9yIGRldGFpbHMuXG5cblx0dmFyIGZhY3Rvcjtcblx0dmFyIHByZWNpc2lvbjtcblx0dmFyIHNwYWNpbmc7XG5cblx0aWYgKGdlbmVyYXRpb25PcHRpb25zLnN0ZXBTaXplICYmIGdlbmVyYXRpb25PcHRpb25zLnN0ZXBTaXplID4gMCkge1xuXHRcdHNwYWNpbmcgPSBnZW5lcmF0aW9uT3B0aW9ucy5zdGVwU2l6ZTtcblx0fSBlbHNlIHtcblx0XHR2YXIgbmljZVJhbmdlID0gaGVscGVycy5uaWNlTnVtKGRhdGFSYW5nZS5tYXggLSBkYXRhUmFuZ2UubWluLCBmYWxzZSk7XG5cdFx0c3BhY2luZyA9IGhlbHBlcnMubmljZU51bShuaWNlUmFuZ2UgLyAoZ2VuZXJhdGlvbk9wdGlvbnMubWF4VGlja3MgLSAxKSwgdHJ1ZSk7XG5cblx0XHRwcmVjaXNpb24gPSBnZW5lcmF0aW9uT3B0aW9ucy5wcmVjaXNpb247XG5cdFx0aWYgKHByZWNpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYSBwcmVjaXNpb24sIHJvdW5kIHRvIHRoYXQgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzXG5cdFx0XHRmYWN0b3IgPSBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKTtcblx0XHRcdHNwYWNpbmcgPSBNYXRoLmNlaWwoc3BhY2luZyAqIGZhY3RvcikgLyBmYWN0b3I7XG5cdFx0fVxuXHR9XG5cdHZhciBuaWNlTWluID0gTWF0aC5mbG9vcihkYXRhUmFuZ2UubWluIC8gc3BhY2luZykgKiBzcGFjaW5nO1xuXHR2YXIgbmljZU1heCA9IE1hdGguY2VpbChkYXRhUmFuZ2UubWF4IC8gc3BhY2luZykgKiBzcGFjaW5nO1xuXG5cdC8vIElmIG1pbiwgbWF4IGFuZCBzdGVwU2l6ZSBpcyBzZXQgYW5kIHRoZXkgbWFrZSBhbiBldmVubHkgc3BhY2VkIHNjYWxlIHVzZSBpdC5cblx0aWYgKCFoZWxwZXJzLmlzTnVsbE9yVW5kZWYoZ2VuZXJhdGlvbk9wdGlvbnMubWluKSAmJiAhaGVscGVycy5pc051bGxPclVuZGVmKGdlbmVyYXRpb25PcHRpb25zLm1heCkgJiYgZ2VuZXJhdGlvbk9wdGlvbnMuc3RlcFNpemUpIHtcblx0XHQvLyBJZiB2ZXJ5IGNsb3NlIHRvIG91ciB3aG9sZSBudW1iZXIsIHVzZSBpdC5cblx0XHRpZiAoaGVscGVycy5hbG1vc3RXaG9sZSgoZ2VuZXJhdGlvbk9wdGlvbnMubWF4IC0gZ2VuZXJhdGlvbk9wdGlvbnMubWluKSAvIGdlbmVyYXRpb25PcHRpb25zLnN0ZXBTaXplLCBzcGFjaW5nIC8gMTAwMCkpIHtcblx0XHRcdG5pY2VNaW4gPSBnZW5lcmF0aW9uT3B0aW9ucy5taW47XG5cdFx0XHRuaWNlTWF4ID0gZ2VuZXJhdGlvbk9wdGlvbnMubWF4O1xuXHRcdH1cblx0fVxuXG5cdHZhciBudW1TcGFjZXMgPSAobmljZU1heCAtIG5pY2VNaW4pIC8gc3BhY2luZztcblx0Ly8gSWYgdmVyeSBjbG9zZSB0byBvdXIgcm91bmRlZCB2YWx1ZSwgdXNlIGl0LlxuXHRpZiAoaGVscGVycy5hbG1vc3RFcXVhbHMobnVtU3BhY2VzLCBNYXRoLnJvdW5kKG51bVNwYWNlcyksIHNwYWNpbmcgLyAxMDAwKSkge1xuXHRcdG51bVNwYWNlcyA9IE1hdGgucm91bmQobnVtU3BhY2VzKTtcblx0fSBlbHNlIHtcblx0XHRudW1TcGFjZXMgPSBNYXRoLmNlaWwobnVtU3BhY2VzKTtcblx0fVxuXG5cdHByZWNpc2lvbiA9IDE7XG5cdGlmIChzcGFjaW5nIDwgMSkge1xuXHRcdHByZWNpc2lvbiA9IE1hdGgucG93KDEwLCAxIC0gTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKHNwYWNpbmcpKSk7XG5cdFx0bmljZU1pbiA9IE1hdGgucm91bmQobmljZU1pbiAqIHByZWNpc2lvbikgLyBwcmVjaXNpb247XG5cdFx0bmljZU1heCA9IE1hdGgucm91bmQobmljZU1heCAqIHByZWNpc2lvbikgLyBwcmVjaXNpb247XG5cdH1cblx0dGlja3MucHVzaChnZW5lcmF0aW9uT3B0aW9ucy5taW4gIT09IHVuZGVmaW5lZCA/IGdlbmVyYXRpb25PcHRpb25zLm1pbiA6IG5pY2VNaW4pO1xuXHRmb3IgKHZhciBqID0gMTsgaiA8IG51bVNwYWNlczsgKytqKSB7XG5cdFx0dGlja3MucHVzaChNYXRoLnJvdW5kKChuaWNlTWluICsgaiAqIHNwYWNpbmcpICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbik7XG5cdH1cblx0dGlja3MucHVzaChnZW5lcmF0aW9uT3B0aW9ucy5tYXggIT09IHVuZGVmaW5lZCA/IGdlbmVyYXRpb25PcHRpb25zLm1heCA6IG5pY2VNYXgpO1xuXG5cdHJldHVybiB0aWNrcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xuXG5cdHZhciBub29wID0gaGVscGVycy5ub29wO1xuXG5cdENoYXJ0LkxpbmVhclNjYWxlQmFzZSA9IFNjYWxlLmV4dGVuZCh7XG5cdFx0Z2V0UmlnaHRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdHJldHVybiArdmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gU2NhbGUucHJvdG90eXBlLmdldFJpZ2h0VmFsdWUuY2FsbCh0aGlzLCB2YWx1ZSk7XG5cdFx0fSxcblxuXHRcdGhhbmRsZVRpY2tSYW5nZU9wdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcblx0XHRcdHZhciB0aWNrT3B0cyA9IG9wdHMudGlja3M7XG5cblx0XHRcdC8vIElmIHdlIGFyZSBmb3JjaW5nIGl0IHRvIGJlZ2luIGF0IDAsIGJ1dCAwIHdpbGwgYWxyZWFkeSBiZSByZW5kZXJlZCBvbiB0aGUgY2hhcnQsXG5cdFx0XHQvLyBkbyBub3RoaW5nIHNpbmNlIHRoYXQgd291bGQgbWFrZSB0aGUgY2hhcnQgd2VpcmQuIElmIHRoZSB1c2VyIHJlYWxseSB3YW50cyBhIHdlaXJkIGNoYXJ0XG5cdFx0XHQvLyBheGlzLCB0aGV5IGNhbiBtYW51YWxseSBvdmVycmlkZSBpdFxuXHRcdFx0aWYgKHRpY2tPcHRzLmJlZ2luQXRaZXJvKSB7XG5cdFx0XHRcdHZhciBtaW5TaWduID0gaGVscGVycy5zaWduKG1lLm1pbik7XG5cdFx0XHRcdHZhciBtYXhTaWduID0gaGVscGVycy5zaWduKG1lLm1heCk7XG5cblx0XHRcdFx0aWYgKG1pblNpZ24gPCAwICYmIG1heFNpZ24gPCAwKSB7XG5cdFx0XHRcdFx0Ly8gbW92ZSB0aGUgdG9wIHVwIHRvIDBcblx0XHRcdFx0XHRtZS5tYXggPSAwO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG1pblNpZ24gPiAwICYmIG1heFNpZ24gPiAwKSB7XG5cdFx0XHRcdFx0Ly8gbW92ZSB0aGUgYm90dG9tIGRvd24gdG8gMFxuXHRcdFx0XHRcdG1lLm1pbiA9IDA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dmFyIHNldE1pbiA9IHRpY2tPcHRzLm1pbiAhPT0gdW5kZWZpbmVkIHx8IHRpY2tPcHRzLnN1Z2dlc3RlZE1pbiAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0dmFyIHNldE1heCA9IHRpY2tPcHRzLm1heCAhPT0gdW5kZWZpbmVkIHx8IHRpY2tPcHRzLnN1Z2dlc3RlZE1heCAhPT0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAodGlja09wdHMubWluICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0bWUubWluID0gdGlja09wdHMubWluO1xuXHRcdFx0fSBlbHNlIGlmICh0aWNrT3B0cy5zdWdnZXN0ZWRNaW4gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAobWUubWluID09PSBudWxsKSB7XG5cdFx0XHRcdFx0bWUubWluID0gdGlja09wdHMuc3VnZ2VzdGVkTWluO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1lLm1pbiA9IE1hdGgubWluKG1lLm1pbiwgdGlja09wdHMuc3VnZ2VzdGVkTWluKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGlja09wdHMubWF4ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0bWUubWF4ID0gdGlja09wdHMubWF4O1xuXHRcdFx0fSBlbHNlIGlmICh0aWNrT3B0cy5zdWdnZXN0ZWRNYXggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAobWUubWF4ID09PSBudWxsKSB7XG5cdFx0XHRcdFx0bWUubWF4ID0gdGlja09wdHMuc3VnZ2VzdGVkTWF4O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1lLm1heCA9IE1hdGgubWF4KG1lLm1heCwgdGlja09wdHMuc3VnZ2VzdGVkTWF4KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc2V0TWluICE9PSBzZXRNYXgpIHtcblx0XHRcdFx0Ly8gV2Ugc2V0IHRoZSBtaW4gb3IgdGhlIG1heCBidXQgbm90IGJvdGguXG5cdFx0XHRcdC8vIFNvIGVuc3VyZSB0aGF0IG91ciByYW5nZSBpcyBnb29kXG5cdFx0XHRcdC8vIEludmVydGVkIG9yIDAgbGVuZ3RoIHJhbmdlIGNhbiBoYXBwZW4gd2hlblxuXHRcdFx0XHQvLyB0aWNrcy5taW4gaXMgc2V0LCBhbmQgbm8gZGF0YXNldHMgYXJlIHZpc2libGVcblx0XHRcdFx0aWYgKG1lLm1pbiA+PSBtZS5tYXgpIHtcblx0XHRcdFx0XHRpZiAoc2V0TWluKSB7XG5cdFx0XHRcdFx0XHRtZS5tYXggPSBtZS5taW4gKyAxO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRtZS5taW4gPSBtZS5tYXggLSAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWUubWluID09PSBtZS5tYXgpIHtcblx0XHRcdFx0bWUubWF4Kys7XG5cblx0XHRcdFx0aWYgKCF0aWNrT3B0cy5iZWdpbkF0WmVybykge1xuXHRcdFx0XHRcdG1lLm1pbi0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRnZXRUaWNrTGltaXQ6IG5vb3AsXG5cdFx0aGFuZGxlRGlyZWN0aW9uYWxDaGFuZ2VzOiBub29wLFxuXG5cdFx0YnVpbGRUaWNrczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xuXHRcdFx0dmFyIHRpY2tPcHRzID0gb3B0cy50aWNrcztcblxuXHRcdFx0Ly8gRmlndXJlIG91dCB3aGF0IHRoZSBtYXggbnVtYmVyIG9mIHRpY2tzIHdlIGNhbiBzdXBwb3J0IGl0IGlzIGJhc2VkIG9uIHRoZSBzaXplIG9mXG5cdFx0XHQvLyB0aGUgYXhpcyBhcmVhLiBGb3Igbm93LCB3ZSBzYXkgdGhhdCB0aGUgbWluaW11bSB0aWNrIHNwYWNpbmcgaW4gcGl4ZWxzIG11c3QgYmUgNTBcblx0XHRcdC8vIFdlIGFsc28gbGltaXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpY2tzIHRvIDExIHdoaWNoIGdpdmVzIGEgbmljZSAxMCBzcXVhcmVzIG9uXG5cdFx0XHQvLyB0aGUgZ3JhcGguIE1ha2Ugc3VyZSB3ZSBhbHdheXMgaGF2ZSBhdCBsZWFzdCAyIHRpY2tzXG5cdFx0XHR2YXIgbWF4VGlja3MgPSBtZS5nZXRUaWNrTGltaXQoKTtcblx0XHRcdG1heFRpY2tzID0gTWF0aC5tYXgoMiwgbWF4VGlja3MpO1xuXG5cdFx0XHR2YXIgbnVtZXJpY0dlbmVyYXRvck9wdGlvbnMgPSB7XG5cdFx0XHRcdG1heFRpY2tzOiBtYXhUaWNrcyxcblx0XHRcdFx0bWluOiB0aWNrT3B0cy5taW4sXG5cdFx0XHRcdG1heDogdGlja09wdHMubWF4LFxuXHRcdFx0XHRwcmVjaXNpb246IHRpY2tPcHRzLnByZWNpc2lvbixcblx0XHRcdFx0c3RlcFNpemU6IGhlbHBlcnMudmFsdWVPckRlZmF1bHQodGlja09wdHMuZml4ZWRTdGVwU2l6ZSwgdGlja09wdHMuc3RlcFNpemUpXG5cdFx0XHR9O1xuXHRcdFx0dmFyIHRpY2tzID0gbWUudGlja3MgPSBnZW5lcmF0ZVRpY2tzKG51bWVyaWNHZW5lcmF0b3JPcHRpb25zLCBtZSk7XG5cblx0XHRcdG1lLmhhbmRsZURpcmVjdGlvbmFsQ2hhbmdlcygpO1xuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIHVwZGF0ZSBvdXIgbWF4IGFuZCBtaW4gZ2l2ZW4gdGhlIHRpY2sgdmFsdWVzIHNpbmNlIHdlIGhhdmUgZXhwYW5kZWQgdGhlXG5cdFx0XHQvLyByYW5nZSBvZiB0aGUgc2NhbGVcblx0XHRcdG1lLm1heCA9IGhlbHBlcnMubWF4KHRpY2tzKTtcblx0XHRcdG1lLm1pbiA9IGhlbHBlcnMubWluKHRpY2tzKTtcblxuXHRcdFx0aWYgKHRpY2tPcHRzLnJldmVyc2UpIHtcblx0XHRcdFx0dGlja3MucmV2ZXJzZSgpO1xuXG5cdFx0XHRcdG1lLnN0YXJ0ID0gbWUubWF4O1xuXHRcdFx0XHRtZS5lbmQgPSBtZS5taW47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtZS5zdGFydCA9IG1lLm1pbjtcblx0XHRcdFx0bWUuZW5kID0gbWUubWF4O1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Y29udmVydFRpY2tzVG9MYWJlbHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdG1lLnRpY2tzQXNOdW1iZXJzID0gbWUudGlja3Muc2xpY2UoKTtcblx0XHRcdG1lLnplcm9MaW5lSW5kZXggPSBtZS50aWNrcy5pbmRleE9mKDApO1xuXG5cdFx0XHRTY2FsZS5wcm90b3R5cGUuY29udmVydFRpY2tzVG9MYWJlbHMuY2FsbChtZSk7XG5cdFx0fVxuXHR9KTtcbn07XG5cbn0se1wiMzNcIjozMyxcIjQ2XCI6NDZ9XSw1NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG52YXIgU2NhbGUgPSByZXF1aXJlKDMzKTtcbnZhciBzY2FsZVNlcnZpY2UgPSByZXF1aXJlKDM0KTtcbnZhciBUaWNrcyA9IHJlcXVpcmUoMzUpO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgc2V0IG9mIGxvZ2FyaXRobWljIHRpY2tzXG4gKiBAcGFyYW0gZ2VuZXJhdGlvbk9wdGlvbnMgdGhlIG9wdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGlja3NcbiAqIEBwYXJhbSBkYXRhUmFuZ2UgdGhlIHJhbmdlIG9mIHRoZSBkYXRhXG4gKiBAcmV0dXJucyB7QXJyYXk8TnVtYmVyPn0gYXJyYXkgb2YgdGljayB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVUaWNrcyhnZW5lcmF0aW9uT3B0aW9ucywgZGF0YVJhbmdlKSB7XG5cdHZhciB0aWNrcyA9IFtdO1xuXHR2YXIgdmFsdWVPckRlZmF1bHQgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0O1xuXG5cdC8vIEZpZ3VyZSBvdXQgd2hhdCB0aGUgbWF4IG51bWJlciBvZiB0aWNrcyB3ZSBjYW4gc3VwcG9ydCBpdCBpcyBiYXNlZCBvbiB0aGUgc2l6ZSBvZlxuXHQvLyB0aGUgYXhpcyBhcmVhLiBGb3Igbm93LCB3ZSBzYXkgdGhhdCB0aGUgbWluaW11bSB0aWNrIHNwYWNpbmcgaW4gcGl4ZWxzIG11c3QgYmUgNTBcblx0Ly8gV2UgYWxzbyBsaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGlja3MgdG8gMTEgd2hpY2ggZ2l2ZXMgYSBuaWNlIDEwIHNxdWFyZXMgb25cblx0Ly8gdGhlIGdyYXBoXG5cdHZhciB0aWNrVmFsID0gdmFsdWVPckRlZmF1bHQoZ2VuZXJhdGlvbk9wdGlvbnMubWluLCBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKGRhdGFSYW5nZS5taW4pKSkpO1xuXG5cdHZhciBlbmRFeHAgPSBNYXRoLmZsb29yKGhlbHBlcnMubG9nMTAoZGF0YVJhbmdlLm1heCkpO1xuXHR2YXIgZW5kU2lnbmlmaWNhbmQgPSBNYXRoLmNlaWwoZGF0YVJhbmdlLm1heCAvIE1hdGgucG93KDEwLCBlbmRFeHApKTtcblx0dmFyIGV4cCwgc2lnbmlmaWNhbmQ7XG5cblx0aWYgKHRpY2tWYWwgPT09IDApIHtcblx0XHRleHAgPSBNYXRoLmZsb29yKGhlbHBlcnMubG9nMTAoZGF0YVJhbmdlLm1pbk5vdFplcm8pKTtcblx0XHRzaWduaWZpY2FuZCA9IE1hdGguZmxvb3IoZGF0YVJhbmdlLm1pbk5vdFplcm8gLyBNYXRoLnBvdygxMCwgZXhwKSk7XG5cblx0XHR0aWNrcy5wdXNoKHRpY2tWYWwpO1xuXHRcdHRpY2tWYWwgPSBzaWduaWZpY2FuZCAqIE1hdGgucG93KDEwLCBleHApO1xuXHR9IGVsc2Uge1xuXHRcdGV4cCA9IE1hdGguZmxvb3IoaGVscGVycy5sb2cxMCh0aWNrVmFsKSk7XG5cdFx0c2lnbmlmaWNhbmQgPSBNYXRoLmZsb29yKHRpY2tWYWwgLyBNYXRoLnBvdygxMCwgZXhwKSk7XG5cdH1cblx0dmFyIHByZWNpc2lvbiA9IGV4cCA8IDAgPyBNYXRoLnBvdygxMCwgTWF0aC5hYnMoZXhwKSkgOiAxO1xuXG5cdGRvIHtcblx0XHR0aWNrcy5wdXNoKHRpY2tWYWwpO1xuXG5cdFx0KytzaWduaWZpY2FuZDtcblx0XHRpZiAoc2lnbmlmaWNhbmQgPT09IDEwKSB7XG5cdFx0XHRzaWduaWZpY2FuZCA9IDE7XG5cdFx0XHQrK2V4cDtcblx0XHRcdHByZWNpc2lvbiA9IGV4cCA+PSAwID8gMSA6IHByZWNpc2lvbjtcblx0XHR9XG5cblx0XHR0aWNrVmFsID0gTWF0aC5yb3VuZChzaWduaWZpY2FuZCAqIE1hdGgucG93KDEwLCBleHApICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbjtcblx0fSB3aGlsZSAoZXhwIDwgZW5kRXhwIHx8IChleHAgPT09IGVuZEV4cCAmJiBzaWduaWZpY2FuZCA8IGVuZFNpZ25pZmljYW5kKSk7XG5cblx0dmFyIGxhc3RUaWNrID0gdmFsdWVPckRlZmF1bHQoZ2VuZXJhdGlvbk9wdGlvbnMubWF4LCB0aWNrVmFsKTtcblx0dGlja3MucHVzaChsYXN0VGljayk7XG5cblx0cmV0dXJuIHRpY2tzO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHR2YXIgZGVmYXVsdENvbmZpZyA9IHtcblx0XHRwb3NpdGlvbjogJ2xlZnQnLFxuXG5cdFx0Ly8gbGFiZWwgc2V0dGluZ3Ncblx0XHR0aWNrczoge1xuXHRcdFx0Y2FsbGJhY2s6IFRpY2tzLmZvcm1hdHRlcnMubG9nYXJpdGhtaWNcblx0XHR9XG5cdH07XG5cblx0dmFyIExvZ2FyaXRobWljU2NhbGUgPSBTY2FsZS5leHRlbmQoe1xuXHRcdGRldGVybWluZURhdGFMaW1pdHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcblx0XHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdFx0dmFyIGRhdGEgPSBjaGFydC5kYXRhO1xuXHRcdFx0dmFyIGRhdGFzZXRzID0gZGF0YS5kYXRhc2V0cztcblx0XHRcdHZhciBpc0hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcblx0XHRcdGZ1bmN0aW9uIElETWF0Y2hlcyhtZXRhKSB7XG5cdFx0XHRcdHJldHVybiBpc0hvcml6b250YWwgPyBtZXRhLnhBeGlzSUQgPT09IG1lLmlkIDogbWV0YS55QXhpc0lEID09PSBtZS5pZDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsY3VsYXRlIFJhbmdlXG5cdFx0XHRtZS5taW4gPSBudWxsO1xuXHRcdFx0bWUubWF4ID0gbnVsbDtcblx0XHRcdG1lLm1pbk5vdFplcm8gPSBudWxsO1xuXG5cdFx0XHR2YXIgaGFzU3RhY2tzID0gb3B0cy5zdGFja2VkO1xuXHRcdFx0aWYgKGhhc1N0YWNrcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGhlbHBlcnMuZWFjaChkYXRhc2V0cywgZnVuY3Rpb24oZGF0YXNldCwgZGF0YXNldEluZGV4KSB7XG5cdFx0XHRcdFx0aWYgKGhhc1N0YWNrcykge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcblx0XHRcdFx0XHRpZiAoY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShkYXRhc2V0SW5kZXgpICYmIElETWF0Y2hlcyhtZXRhKSAmJlxuXHRcdFx0XHRcdFx0bWV0YS5zdGFjayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRoYXNTdGFja3MgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvcHRzLnN0YWNrZWQgfHwgaGFzU3RhY2tzKSB7XG5cdFx0XHRcdHZhciB2YWx1ZXNQZXJTdGFjayA9IHt9O1xuXG5cdFx0XHRcdGhlbHBlcnMuZWFjaChkYXRhc2V0cywgZnVuY3Rpb24oZGF0YXNldCwgZGF0YXNldEluZGV4KSB7XG5cdFx0XHRcdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xuXHRcdFx0XHRcdHZhciBrZXkgPSBbXG5cdFx0XHRcdFx0XHRtZXRhLnR5cGUsXG5cdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGEgc2VwYXJhdGUgc3RhY2sgZm9yIHN0YWNrPXVuZGVmaW5lZCBkYXRhc2V0cyB3aGVuIHRoZSBvcHRzLnN0YWNrZWQgaXMgdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHQoKG9wdHMuc3RhY2tlZCA9PT0gdW5kZWZpbmVkICYmIG1ldGEuc3RhY2sgPT09IHVuZGVmaW5lZCkgPyBkYXRhc2V0SW5kZXggOiAnJyksXG5cdFx0XHRcdFx0XHRtZXRhLnN0YWNrXG5cdFx0XHRcdFx0XS5qb2luKCcuJyk7XG5cblx0XHRcdFx0XHRpZiAoY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShkYXRhc2V0SW5kZXgpICYmIElETWF0Y2hlcyhtZXRhKSkge1xuXHRcdFx0XHRcdFx0aWYgKHZhbHVlc1BlclN0YWNrW2tleV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHR2YWx1ZXNQZXJTdGFja1trZXldID0gW107XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGhlbHBlcnMuZWFjaChkYXRhc2V0LmRhdGEsIGZ1bmN0aW9uKHJhd1ZhbHVlLCBpbmRleCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdmFsdWVzID0gdmFsdWVzUGVyU3RhY2tba2V5XTtcblx0XHRcdFx0XHRcdFx0dmFyIHZhbHVlID0gK21lLmdldFJpZ2h0VmFsdWUocmF3VmFsdWUpO1xuXHRcdFx0XHRcdFx0XHQvLyBpbnZhbGlkLCBoaWRkZW4gYW5kIG5lZ2F0aXZlIHZhbHVlcyBhcmUgaWdub3JlZFxuXHRcdFx0XHRcdFx0XHRpZiAoaXNOYU4odmFsdWUpIHx8IG1ldGEuZGF0YVtpbmRleF0uaGlkZGVuIHx8IHZhbHVlIDwgMCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR2YWx1ZXNbaW5kZXhdID0gdmFsdWVzW2luZGV4XSB8fCAwO1xuXHRcdFx0XHRcdFx0XHR2YWx1ZXNbaW5kZXhdICs9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRoZWxwZXJzLmVhY2godmFsdWVzUGVyU3RhY2ssIGZ1bmN0aW9uKHZhbHVlc0ZvclR5cGUpIHtcblx0XHRcdFx0XHRpZiAodmFsdWVzRm9yVHlwZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHR2YXIgbWluVmFsID0gaGVscGVycy5taW4odmFsdWVzRm9yVHlwZSk7XG5cdFx0XHRcdFx0XHR2YXIgbWF4VmFsID0gaGVscGVycy5tYXgodmFsdWVzRm9yVHlwZSk7XG5cdFx0XHRcdFx0XHRtZS5taW4gPSBtZS5taW4gPT09IG51bGwgPyBtaW5WYWwgOiBNYXRoLm1pbihtZS5taW4sIG1pblZhbCk7XG5cdFx0XHRcdFx0XHRtZS5tYXggPSBtZS5tYXggPT09IG51bGwgPyBtYXhWYWwgOiBNYXRoLm1heChtZS5tYXgsIG1heFZhbCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGVscGVycy5lYWNoKGRhdGFzZXRzLCBmdW5jdGlvbihkYXRhc2V0LCBkYXRhc2V0SW5kZXgpIHtcblx0XHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdFx0aWYgKGNoYXJ0LmlzRGF0YXNldFZpc2libGUoZGF0YXNldEluZGV4KSAmJiBJRE1hdGNoZXMobWV0YSkpIHtcblx0XHRcdFx0XHRcdGhlbHBlcnMuZWFjaChkYXRhc2V0LmRhdGEsIGZ1bmN0aW9uKHJhd1ZhbHVlLCBpbmRleCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdmFsdWUgPSArbWUuZ2V0UmlnaHRWYWx1ZShyYXdWYWx1ZSk7XG5cdFx0XHRcdFx0XHRcdC8vIGludmFsaWQsIGhpZGRlbiBhbmQgbmVnYXRpdmUgdmFsdWVzIGFyZSBpZ25vcmVkXG5cdFx0XHRcdFx0XHRcdGlmIChpc05hTih2YWx1ZSkgfHwgbWV0YS5kYXRhW2luZGV4XS5oaWRkZW4gfHwgdmFsdWUgPCAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKG1lLm1pbiA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHRcdG1lLm1pbiA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHZhbHVlIDwgbWUubWluKSB7XG5cdFx0XHRcdFx0XHRcdFx0bWUubWluID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAobWUubWF4ID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdFx0bWUubWF4ID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodmFsdWUgPiBtZS5tYXgpIHtcblx0XHRcdFx0XHRcdFx0XHRtZS5tYXggPSB2YWx1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZSAhPT0gMCAmJiAobWUubWluTm90WmVybyA9PT0gbnVsbCB8fCB2YWx1ZSA8IG1lLm1pbk5vdFplcm8pKSB7XG5cdFx0XHRcdFx0XHRcdFx0bWUubWluTm90WmVybyA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb21tb24gYmFzZSBpbXBsZW1lbnRhdGlvbiB0byBoYW5kbGUgdGlja3MubWluLCB0aWNrcy5tYXhcblx0XHRcdHRoaXMuaGFuZGxlVGlja1JhbmdlT3B0aW9ucygpO1xuXHRcdH0sXG5cdFx0aGFuZGxlVGlja1JhbmdlT3B0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xuXHRcdFx0dmFyIHRpY2tPcHRzID0gb3B0cy50aWNrcztcblx0XHRcdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQ7XG5cdFx0XHR2YXIgREVGQVVMVF9NSU4gPSAxO1xuXHRcdFx0dmFyIERFRkFVTFRfTUFYID0gMTA7XG5cblx0XHRcdG1lLm1pbiA9IHZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLm1pbiwgbWUubWluKTtcblx0XHRcdG1lLm1heCA9IHZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLm1heCwgbWUubWF4KTtcblxuXHRcdFx0aWYgKG1lLm1pbiA9PT0gbWUubWF4KSB7XG5cdFx0XHRcdGlmIChtZS5taW4gIT09IDAgJiYgbWUubWluICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0bWUubWluID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoaGVscGVycy5sb2cxMChtZS5taW4pKSAtIDEpO1xuXHRcdFx0XHRcdG1lLm1heCA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKGhlbHBlcnMubG9nMTAobWUubWF4KSkgKyAxKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtZS5taW4gPSBERUZBVUxUX01JTjtcblx0XHRcdFx0XHRtZS5tYXggPSBERUZBVUxUX01BWDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG1lLm1pbiA9PT0gbnVsbCkge1xuXHRcdFx0XHRtZS5taW4gPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKG1lLm1heCkpIC0gMSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobWUubWF4ID09PSBudWxsKSB7XG5cdFx0XHRcdG1lLm1heCA9IG1lLm1pbiAhPT0gMFxuXHRcdFx0XHRcdD8gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoaGVscGVycy5sb2cxMChtZS5taW4pKSArIDEpXG5cdFx0XHRcdFx0OiBERUZBVUxUX01BWDtcblx0XHRcdH1cblx0XHRcdGlmIChtZS5taW5Ob3RaZXJvID09PSBudWxsKSB7XG5cdFx0XHRcdGlmIChtZS5taW4gPiAwKSB7XG5cdFx0XHRcdFx0bWUubWluTm90WmVybyA9IG1lLm1pbjtcblx0XHRcdFx0fSBlbHNlIGlmIChtZS5tYXggPCAxKSB7XG5cdFx0XHRcdFx0bWUubWluTm90WmVybyA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKGhlbHBlcnMubG9nMTAobWUubWF4KSkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1lLm1pbk5vdFplcm8gPSBERUZBVUxUX01JTjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0YnVpbGRUaWNrczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xuXHRcdFx0dmFyIHRpY2tPcHRzID0gb3B0cy50aWNrcztcblx0XHRcdHZhciByZXZlcnNlID0gIW1lLmlzSG9yaXpvbnRhbCgpO1xuXG5cdFx0XHR2YXIgZ2VuZXJhdGlvbk9wdGlvbnMgPSB7XG5cdFx0XHRcdG1pbjogdGlja09wdHMubWluLFxuXHRcdFx0XHRtYXg6IHRpY2tPcHRzLm1heFxuXHRcdFx0fTtcblx0XHRcdHZhciB0aWNrcyA9IG1lLnRpY2tzID0gZ2VuZXJhdGVUaWNrcyhnZW5lcmF0aW9uT3B0aW9ucywgbWUpO1xuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIHVwZGF0ZSBvdXIgbWF4IGFuZCBtaW4gZ2l2ZW4gdGhlIHRpY2sgdmFsdWVzIHNpbmNlIHdlIGhhdmUgZXhwYW5kZWQgdGhlXG5cdFx0XHQvLyByYW5nZSBvZiB0aGUgc2NhbGVcblx0XHRcdG1lLm1heCA9IGhlbHBlcnMubWF4KHRpY2tzKTtcblx0XHRcdG1lLm1pbiA9IGhlbHBlcnMubWluKHRpY2tzKTtcblxuXHRcdFx0aWYgKHRpY2tPcHRzLnJldmVyc2UpIHtcblx0XHRcdFx0cmV2ZXJzZSA9ICFyZXZlcnNlO1xuXHRcdFx0XHRtZS5zdGFydCA9IG1lLm1heDtcblx0XHRcdFx0bWUuZW5kID0gbWUubWluO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWUuc3RhcnQgPSBtZS5taW47XG5cdFx0XHRcdG1lLmVuZCA9IG1lLm1heDtcblx0XHRcdH1cblx0XHRcdGlmIChyZXZlcnNlKSB7XG5cdFx0XHRcdHRpY2tzLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGNvbnZlcnRUaWNrc1RvTGFiZWxzOiBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMudGlja1ZhbHVlcyA9IHRoaXMudGlja3Muc2xpY2UoKTtcblxuXHRcdFx0U2NhbGUucHJvdG90eXBlLmNvbnZlcnRUaWNrc1RvTGFiZWxzLmNhbGwodGhpcyk7XG5cdFx0fSxcblx0XHQvLyBHZXQgdGhlIGNvcnJlY3QgdG9vbHRpcCBsYWJlbFxuXHRcdGdldExhYmVsRm9ySW5kZXg6IGZ1bmN0aW9uKGluZGV4LCBkYXRhc2V0SW5kZXgpIHtcblx0XHRcdHJldHVybiArdGhpcy5nZXRSaWdodFZhbHVlKHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdLmRhdGFbaW5kZXhdKTtcblx0XHR9LFxuXHRcdGdldFBpeGVsRm9yVGljazogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldFBpeGVsRm9yVmFsdWUodGhpcy50aWNrVmFsdWVzW2luZGV4XSk7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgdGljay5cblx0XHQgKiBAcGFyYW0ge051bWJlcn0gdmFsdWUgLSBUaGUgbWluaW11bSBub3QgemVybyB2YWx1ZS5cblx0XHQgKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBmaXJzdCB0aWNrIHZhbHVlLlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0X2dldEZpcnN0VGlja1ZhbHVlOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0dmFyIGV4cCA9IE1hdGguZmxvb3IoaGVscGVycy5sb2cxMCh2YWx1ZSkpO1xuXHRcdFx0dmFyIHNpZ25pZmljYW5kID0gTWF0aC5mbG9vcih2YWx1ZSAvIE1hdGgucG93KDEwLCBleHApKTtcblxuXHRcdFx0cmV0dXJuIHNpZ25pZmljYW5kICogTWF0aC5wb3coMTAsIGV4cCk7XG5cdFx0fSxcblx0XHRnZXRQaXhlbEZvclZhbHVlOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciByZXZlcnNlID0gbWUub3B0aW9ucy50aWNrcy5yZXZlcnNlO1xuXHRcdFx0dmFyIGxvZzEwID0gaGVscGVycy5sb2cxMDtcblx0XHRcdHZhciBmaXJzdFRpY2tWYWx1ZSA9IG1lLl9nZXRGaXJzdFRpY2tWYWx1ZShtZS5taW5Ob3RaZXJvKTtcblx0XHRcdHZhciBvZmZzZXQgPSAwO1xuXHRcdFx0dmFyIGlubmVyRGltZW5zaW9uLCBwaXhlbCwgc3RhcnQsIGVuZCwgc2lnbjtcblxuXHRcdFx0dmFsdWUgPSArbWUuZ2V0UmlnaHRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHRpZiAocmV2ZXJzZSkge1xuXHRcdFx0XHRzdGFydCA9IG1lLmVuZDtcblx0XHRcdFx0ZW5kID0gbWUuc3RhcnQ7XG5cdFx0XHRcdHNpZ24gPSAtMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN0YXJ0ID0gbWUuc3RhcnQ7XG5cdFx0XHRcdGVuZCA9IG1lLmVuZDtcblx0XHRcdFx0c2lnbiA9IDE7XG5cdFx0XHR9XG5cdFx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdFx0aW5uZXJEaW1lbnNpb24gPSBtZS53aWR0aDtcblx0XHRcdFx0cGl4ZWwgPSByZXZlcnNlID8gbWUucmlnaHQgOiBtZS5sZWZ0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW5uZXJEaW1lbnNpb24gPSBtZS5oZWlnaHQ7XG5cdFx0XHRcdHNpZ24gKj0gLTE7IC8vIGludmVydCwgc2luY2UgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBjYW52YXMgaXMgYXQgcGl4ZWwgKDAsIDApXG5cdFx0XHRcdHBpeGVsID0gcmV2ZXJzZSA/IG1lLnRvcCA6IG1lLmJvdHRvbTtcblx0XHRcdH1cblx0XHRcdGlmICh2YWx1ZSAhPT0gc3RhcnQpIHtcblx0XHRcdFx0aWYgKHN0YXJ0ID09PSAwKSB7IC8vIGluY2x1ZGUgemVybyB0aWNrXG5cdFx0XHRcdFx0b2Zmc2V0ID0gaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdChcblx0XHRcdFx0XHRcdG1lLm9wdGlvbnMudGlja3MuZm9udFNpemUsXG5cdFx0XHRcdFx0XHRDaGFydC5kZWZhdWx0cy5nbG9iYWwuZGVmYXVsdEZvbnRTaXplXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRpbm5lckRpbWVuc2lvbiAtPSBvZmZzZXQ7XG5cdFx0XHRcdFx0c3RhcnQgPSBmaXJzdFRpY2tWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodmFsdWUgIT09IDApIHtcblx0XHRcdFx0XHRvZmZzZXQgKz0gaW5uZXJEaW1lbnNpb24gLyAobG9nMTAoZW5kKSAtIGxvZzEwKHN0YXJ0KSkgKiAobG9nMTAodmFsdWUpIC0gbG9nMTAoc3RhcnQpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwaXhlbCArPSBzaWduICogb2Zmc2V0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHBpeGVsO1xuXHRcdH0sXG5cdFx0Z2V0VmFsdWVGb3JQaXhlbDogZnVuY3Rpb24ocGl4ZWwpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgcmV2ZXJzZSA9IG1lLm9wdGlvbnMudGlja3MucmV2ZXJzZTtcblx0XHRcdHZhciBsb2cxMCA9IGhlbHBlcnMubG9nMTA7XG5cdFx0XHR2YXIgZmlyc3RUaWNrVmFsdWUgPSBtZS5fZ2V0Rmlyc3RUaWNrVmFsdWUobWUubWluTm90WmVybyk7XG5cdFx0XHR2YXIgaW5uZXJEaW1lbnNpb24sIHN0YXJ0LCBlbmQsIHZhbHVlO1xuXG5cdFx0XHRpZiAocmV2ZXJzZSkge1xuXHRcdFx0XHRzdGFydCA9IG1lLmVuZDtcblx0XHRcdFx0ZW5kID0gbWUuc3RhcnQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdGFydCA9IG1lLnN0YXJ0O1xuXHRcdFx0XHRlbmQgPSBtZS5lbmQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdFx0aW5uZXJEaW1lbnNpb24gPSBtZS53aWR0aDtcblx0XHRcdFx0dmFsdWUgPSByZXZlcnNlID8gbWUucmlnaHQgLSBwaXhlbCA6IHBpeGVsIC0gbWUubGVmdDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlubmVyRGltZW5zaW9uID0gbWUuaGVpZ2h0O1xuXHRcdFx0XHR2YWx1ZSA9IHJldmVyc2UgPyBwaXhlbCAtIG1lLnRvcCA6IG1lLmJvdHRvbSAtIHBpeGVsO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHZhbHVlICE9PSBzdGFydCkge1xuXHRcdFx0XHRpZiAoc3RhcnQgPT09IDApIHsgLy8gaW5jbHVkZSB6ZXJvIHRpY2tcblx0XHRcdFx0XHR2YXIgb2Zmc2V0ID0gaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdChcblx0XHRcdFx0XHRcdG1lLm9wdGlvbnMudGlja3MuZm9udFNpemUsXG5cdFx0XHRcdFx0XHRDaGFydC5kZWZhdWx0cy5nbG9iYWwuZGVmYXVsdEZvbnRTaXplXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR2YWx1ZSAtPSBvZmZzZXQ7XG5cdFx0XHRcdFx0aW5uZXJEaW1lbnNpb24gLT0gb2Zmc2V0O1xuXHRcdFx0XHRcdHN0YXJ0ID0gZmlyc3RUaWNrVmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0dmFsdWUgKj0gbG9nMTAoZW5kKSAtIGxvZzEwKHN0YXJ0KTtcblx0XHRcdFx0dmFsdWUgLz0gaW5uZXJEaW1lbnNpb247XG5cdFx0XHRcdHZhbHVlID0gTWF0aC5wb3coMTAsIGxvZzEwKHN0YXJ0KSArIHZhbHVlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cdH0pO1xuXG5cdHNjYWxlU2VydmljZS5yZWdpc3RlclNjYWxlVHlwZSgnbG9nYXJpdGhtaWMnLCBMb2dhcml0aG1pY1NjYWxlLCBkZWZhdWx0Q29uZmlnKTtcbn07XG5cbn0se1wiMzNcIjozMyxcIjM0XCI6MzQsXCIzNVwiOjM1LFwiNDZcIjo0Nn1dLDU4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xudmFyIHNjYWxlU2VydmljZSA9IHJlcXVpcmUoMzQpO1xudmFyIFRpY2tzID0gcmVxdWlyZSgzNSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHR2YXIgZ2xvYmFsRGVmYXVsdHMgPSBkZWZhdWx0cy5nbG9iYWw7XG5cblx0dmFyIGRlZmF1bHRDb25maWcgPSB7XG5cdFx0ZGlzcGxheTogdHJ1ZSxcblxuXHRcdC8vIEJvb2xlYW4gLSBXaGV0aGVyIHRvIGFuaW1hdGUgc2NhbGluZyB0aGUgY2hhcnQgZnJvbSB0aGUgY2VudHJlXG5cdFx0YW5pbWF0ZTogdHJ1ZSxcblx0XHRwb3NpdGlvbjogJ2NoYXJ0QXJlYScsXG5cblx0XHRhbmdsZUxpbmVzOiB7XG5cdFx0XHRkaXNwbGF5OiB0cnVlLFxuXHRcdFx0Y29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuMSknLFxuXHRcdFx0bGluZVdpZHRoOiAxXG5cdFx0fSxcblxuXHRcdGdyaWRMaW5lczoge1xuXHRcdFx0Y2lyY3VsYXI6IGZhbHNlXG5cdFx0fSxcblxuXHRcdC8vIGxhYmVsIHNldHRpbmdzXG5cdFx0dGlja3M6IHtcblx0XHRcdC8vIEJvb2xlYW4gLSBTaG93IGEgYmFja2Ryb3AgdG8gdGhlIHNjYWxlIGxhYmVsXG5cdFx0XHRzaG93TGFiZWxCYWNrZHJvcDogdHJ1ZSxcblxuXHRcdFx0Ly8gU3RyaW5nIC0gVGhlIGNvbG91ciBvZiB0aGUgbGFiZWwgYmFja2Ryb3Bcblx0XHRcdGJhY2tkcm9wQ29sb3I6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuNzUpJyxcblxuXHRcdFx0Ly8gTnVtYmVyIC0gVGhlIGJhY2tkcm9wIHBhZGRpbmcgYWJvdmUgJiBiZWxvdyB0aGUgbGFiZWwgaW4gcGl4ZWxzXG5cdFx0XHRiYWNrZHJvcFBhZGRpbmdZOiAyLFxuXG5cdFx0XHQvLyBOdW1iZXIgLSBUaGUgYmFja2Ryb3AgcGFkZGluZyB0byB0aGUgc2lkZSBvZiB0aGUgbGFiZWwgaW4gcGl4ZWxzXG5cdFx0XHRiYWNrZHJvcFBhZGRpbmdYOiAyLFxuXG5cdFx0XHRjYWxsYmFjazogVGlja3MuZm9ybWF0dGVycy5saW5lYXJcblx0XHR9LFxuXG5cdFx0cG9pbnRMYWJlbHM6IHtcblx0XHRcdC8vIEJvb2xlYW4gLSBpZiB0cnVlLCBzaG93IHBvaW50IGxhYmVsc1xuXHRcdFx0ZGlzcGxheTogdHJ1ZSxcblxuXHRcdFx0Ly8gTnVtYmVyIC0gUG9pbnQgbGFiZWwgZm9udCBzaXplIGluIHBpeGVsc1xuXHRcdFx0Zm9udFNpemU6IDEwLFxuXG5cdFx0XHQvLyBGdW5jdGlvbiAtIFVzZWQgdG8gY29udmVydCBwb2ludCBsYWJlbHNcblx0XHRcdGNhbGxiYWNrOiBmdW5jdGlvbihsYWJlbCkge1xuXHRcdFx0XHRyZXR1cm4gbGFiZWw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdGZ1bmN0aW9uIGdldFZhbHVlQ291bnQoc2NhbGUpIHtcblx0XHR2YXIgb3B0cyA9IHNjYWxlLm9wdGlvbnM7XG5cdFx0cmV0dXJuIG9wdHMuYW5nbGVMaW5lcy5kaXNwbGF5IHx8IG9wdHMucG9pbnRMYWJlbHMuZGlzcGxheSA/IHNjYWxlLmNoYXJ0LmRhdGEubGFiZWxzLmxlbmd0aCA6IDA7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRQb2ludExhYmVsRm9udE9wdGlvbnMoc2NhbGUpIHtcblx0XHR2YXIgcG9pbnRMYWJlbE9wdGlvbnMgPSBzY2FsZS5vcHRpb25zLnBvaW50TGFiZWxzO1xuXHRcdHZhciBmb250U2l6ZSA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQocG9pbnRMYWJlbE9wdGlvbnMuZm9udFNpemUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U2l6ZSk7XG5cdFx0dmFyIGZvbnRTdHlsZSA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQocG9pbnRMYWJlbE9wdGlvbnMuZm9udFN0eWxlLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFN0eWxlKTtcblx0XHR2YXIgZm9udEZhbWlseSA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQocG9pbnRMYWJlbE9wdGlvbnMuZm9udEZhbWlseSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRGYW1pbHkpO1xuXHRcdHZhciBmb250ID0gaGVscGVycy5mb250U3RyaW5nKGZvbnRTaXplLCBmb250U3R5bGUsIGZvbnRGYW1pbHkpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHNpemU6IGZvbnRTaXplLFxuXHRcdFx0c3R5bGU6IGZvbnRTdHlsZSxcblx0XHRcdGZhbWlseTogZm9udEZhbWlseSxcblx0XHRcdGZvbnQ6IGZvbnRcblx0XHR9O1xuXHR9XG5cblx0ZnVuY3Rpb24gbWVhc3VyZUxhYmVsU2l6ZShjdHgsIGZvbnRTaXplLCBsYWJlbCkge1xuXHRcdGlmIChoZWxwZXJzLmlzQXJyYXkobGFiZWwpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR3OiBoZWxwZXJzLmxvbmdlc3RUZXh0KGN0eCwgY3R4LmZvbnQsIGxhYmVsKSxcblx0XHRcdFx0aDogKGxhYmVsLmxlbmd0aCAqIGZvbnRTaXplKSArICgobGFiZWwubGVuZ3RoIC0gMSkgKiAxLjUgKiBmb250U2l6ZSlcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHc6IGN0eC5tZWFzdXJlVGV4dChsYWJlbCkud2lkdGgsXG5cdFx0XHRoOiBmb250U2l6ZVxuXHRcdH07XG5cdH1cblxuXHRmdW5jdGlvbiBkZXRlcm1pbmVMaW1pdHMoYW5nbGUsIHBvcywgc2l6ZSwgbWluLCBtYXgpIHtcblx0XHRpZiAoYW5nbGUgPT09IG1pbiB8fCBhbmdsZSA9PT0gbWF4KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzdGFydDogcG9zIC0gKHNpemUgLyAyKSxcblx0XHRcdFx0ZW5kOiBwb3MgKyAoc2l6ZSAvIDIpXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoYW5nbGUgPCBtaW4gfHwgYW5nbGUgPiBtYXgpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHN0YXJ0OiBwb3MgLSBzaXplIC0gNSxcblx0XHRcdFx0ZW5kOiBwb3Ncblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHN0YXJ0OiBwb3MsXG5cdFx0XHRlbmQ6IHBvcyArIHNpemUgKyA1XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZml0IGEgcmFkaWFsIGxpbmVhciBzY2FsZSB3aXRoIHBvaW50IGxhYmVsc1xuXHQgKi9cblx0ZnVuY3Rpb24gZml0V2l0aFBvaW50TGFiZWxzKHNjYWxlKSB7XG5cdFx0Lypcblx0XHQgKiBSaWdodCwgdGhpcyBpcyByZWFsbHkgY29uZnVzaW5nIGFuZCB0aGVyZSBpcyBhIGxvdCBvZiBtYXRocyBnb2luZyBvbiBoZXJlXG5cdFx0ICogVGhlIGdpc3Qgb2YgdGhlIHByb2JsZW0gaXMgaGVyZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vbm5uaWNrLzY5NmNjOWM1NWY0YjBiZWI4ZmU5XG5cdFx0ICpcblx0XHQgKiBSZWFjdGlvbjogaHR0cHM6Ly9kbC5kcm9wYm94dXNlcmNvbnRlbnQuY29tL3UvMzQ2MDEzNjMvdG9vbXVjaHNjaWVuY2UuZ2lmXG5cdFx0ICpcblx0XHQgKiBTb2x1dGlvbjpcblx0XHQgKlxuXHRcdCAqIFdlIGFzc3VtZSB0aGUgcmFkaXVzIG9mIHRoZSBwb2x5Z29uIGlzIGhhbGYgdGhlIHNpemUgb2YgdGhlIGNhbnZhcyBhdCBmaXJzdFxuXHRcdCAqIGF0IGVhY2ggaW5kZXggd2UgY2hlY2sgaWYgdGhlIHRleHQgb3ZlcmxhcHMuXG5cdFx0ICpcblx0XHQgKiBXaGVyZSBpdCBkb2VzLCB3ZSBzdG9yZSB0aGF0IGFuZ2xlIGFuZCB0aGF0IGluZGV4LlxuXHRcdCAqXG5cdFx0ICogQWZ0ZXIgZmluZGluZyB0aGUgbGFyZ2VzdCBpbmRleCBhbmQgYW5nbGUgd2UgY2FsY3VsYXRlIGhvdyBtdWNoIHdlIG5lZWQgdG8gcmVtb3ZlXG5cdFx0ICogZnJvbSB0aGUgc2hhcGUgcmFkaXVzIHRvIG1vdmUgdGhlIHBvaW50IGlud2FyZHMgYnkgdGhhdCB4LlxuXHRcdCAqXG5cdFx0ICogV2UgYXZlcmFnZSB0aGUgbGVmdCBhbmQgcmlnaHQgZGlzdGFuY2VzIHRvIGdldCB0aGUgbWF4aW11bSBzaGFwZSByYWRpdXMgdGhhdCBjYW4gZml0IGluIHRoZSBib3hcblx0XHQgKiBhbG9uZyB3aXRoIGxhYmVscy5cblx0XHQgKlxuXHRcdCAqIE9uY2Ugd2UgaGF2ZSB0aGF0LCB3ZSBjYW4gZmluZCB0aGUgY2VudHJlIHBvaW50IGZvciB0aGUgY2hhcnQsIGJ5IHRha2luZyB0aGUgeCB0ZXh0IHByb3RydXNpb25cblx0XHQgKiBvbiBlYWNoIHNpZGUsIHJlbW92aW5nIHRoYXQgZnJvbSB0aGUgc2l6ZSwgaGFsdmluZyBpdCBhbmQgYWRkaW5nIHRoZSBsZWZ0IHggcHJvdHJ1c2lvbiB3aWR0aC5cblx0XHQgKlxuXHRcdCAqIFRoaXMgd2lsbCBtZWFuIHdlIGhhdmUgYSBzaGFwZSBmaXR0ZWQgdG8gdGhlIGNhbnZhcywgYXMgbGFyZ2UgYXMgaXQgY2FuIGJlIHdpdGggdGhlIGxhYmVsc1xuXHRcdCAqIGFuZCBwb3NpdGlvbiBpdCBpbiB0aGUgbW9zdCBzcGFjZSBlZmZpY2llbnQgbWFubmVyXG5cdFx0ICpcblx0XHQgKiBodHRwczovL2RsLmRyb3Bib3h1c2VyY29udGVudC5jb20vdS8zNDYwMTM2My95ZWFoc2NpZW5jZS5naWZcblx0XHQgKi9cblxuXHRcdHZhciBwbEZvbnQgPSBnZXRQb2ludExhYmVsRm9udE9wdGlvbnMoc2NhbGUpO1xuXG5cdFx0Ly8gR2V0IG1heGltdW0gcmFkaXVzIG9mIHRoZSBwb2x5Z29uLiBFaXRoZXIgaGFsZiB0aGUgaGVpZ2h0IChtaW51cyB0aGUgdGV4dCB3aWR0aCkgb3IgaGFsZiB0aGUgd2lkdGguXG5cdFx0Ly8gVXNlIHRoaXMgdG8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgKyBjaGFuZ2UuIC0gTWFrZSBzdXJlIEwvUiBwcm90cnVzaW9uIGlzIGF0IGxlYXN0IDAgdG8gc3RvcCBpc3N1ZXMgd2l0aCBjZW50cmUgcG9pbnRzXG5cdFx0dmFyIGxhcmdlc3RQb3NzaWJsZVJhZGl1cyA9IE1hdGgubWluKHNjYWxlLmhlaWdodCAvIDIsIHNjYWxlLndpZHRoIC8gMik7XG5cdFx0dmFyIGZ1cnRoZXN0TGltaXRzID0ge1xuXHRcdFx0cjogc2NhbGUud2lkdGgsXG5cdFx0XHRsOiAwLFxuXHRcdFx0dDogc2NhbGUuaGVpZ2h0LFxuXHRcdFx0YjogMFxuXHRcdH07XG5cdFx0dmFyIGZ1cnRoZXN0QW5nbGVzID0ge307XG5cdFx0dmFyIGksIHRleHRTaXplLCBwb2ludFBvc2l0aW9uO1xuXG5cdFx0c2NhbGUuY3R4LmZvbnQgPSBwbEZvbnQuZm9udDtcblx0XHRzY2FsZS5fcG9pbnRMYWJlbFNpemVzID0gW107XG5cblx0XHR2YXIgdmFsdWVDb3VudCA9IGdldFZhbHVlQ291bnQoc2NhbGUpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCB2YWx1ZUNvdW50OyBpKyspIHtcblx0XHRcdHBvaW50UG9zaXRpb24gPSBzY2FsZS5nZXRQb2ludFBvc2l0aW9uKGksIGxhcmdlc3RQb3NzaWJsZVJhZGl1cyk7XG5cdFx0XHR0ZXh0U2l6ZSA9IG1lYXN1cmVMYWJlbFNpemUoc2NhbGUuY3R4LCBwbEZvbnQuc2l6ZSwgc2NhbGUucG9pbnRMYWJlbHNbaV0gfHwgJycpO1xuXHRcdFx0c2NhbGUuX3BvaW50TGFiZWxTaXplc1tpXSA9IHRleHRTaXplO1xuXG5cdFx0XHQvLyBBZGQgcXVhcnRlciBjaXJjbGUgdG8gbWFrZSBkZWdyZWUgMCBtZWFuIHRvcCBvZiBjaXJjbGVcblx0XHRcdHZhciBhbmdsZVJhZGlhbnMgPSBzY2FsZS5nZXRJbmRleEFuZ2xlKGkpO1xuXHRcdFx0dmFyIGFuZ2xlID0gaGVscGVycy50b0RlZ3JlZXMoYW5nbGVSYWRpYW5zKSAlIDM2MDtcblx0XHRcdHZhciBoTGltaXRzID0gZGV0ZXJtaW5lTGltaXRzKGFuZ2xlLCBwb2ludFBvc2l0aW9uLngsIHRleHRTaXplLncsIDAsIDE4MCk7XG5cdFx0XHR2YXIgdkxpbWl0cyA9IGRldGVybWluZUxpbWl0cyhhbmdsZSwgcG9pbnRQb3NpdGlvbi55LCB0ZXh0U2l6ZS5oLCA5MCwgMjcwKTtcblxuXHRcdFx0aWYgKGhMaW1pdHMuc3RhcnQgPCBmdXJ0aGVzdExpbWl0cy5sKSB7XG5cdFx0XHRcdGZ1cnRoZXN0TGltaXRzLmwgPSBoTGltaXRzLnN0YXJ0O1xuXHRcdFx0XHRmdXJ0aGVzdEFuZ2xlcy5sID0gYW5nbGVSYWRpYW5zO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaExpbWl0cy5lbmQgPiBmdXJ0aGVzdExpbWl0cy5yKSB7XG5cdFx0XHRcdGZ1cnRoZXN0TGltaXRzLnIgPSBoTGltaXRzLmVuZDtcblx0XHRcdFx0ZnVydGhlc3RBbmdsZXMuciA9IGFuZ2xlUmFkaWFucztcblx0XHRcdH1cblxuXHRcdFx0aWYgKHZMaW1pdHMuc3RhcnQgPCBmdXJ0aGVzdExpbWl0cy50KSB7XG5cdFx0XHRcdGZ1cnRoZXN0TGltaXRzLnQgPSB2TGltaXRzLnN0YXJ0O1xuXHRcdFx0XHRmdXJ0aGVzdEFuZ2xlcy50ID0gYW5nbGVSYWRpYW5zO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodkxpbWl0cy5lbmQgPiBmdXJ0aGVzdExpbWl0cy5iKSB7XG5cdFx0XHRcdGZ1cnRoZXN0TGltaXRzLmIgPSB2TGltaXRzLmVuZDtcblx0XHRcdFx0ZnVydGhlc3RBbmdsZXMuYiA9IGFuZ2xlUmFkaWFucztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRzY2FsZS5zZXRSZWR1Y3Rpb25zKGxhcmdlc3RQb3NzaWJsZVJhZGl1cywgZnVydGhlc3RMaW1pdHMsIGZ1cnRoZXN0QW5nbGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZml0IGEgcmFkaWFsIGxpbmVhciBzY2FsZSB3aXRoIG5vIHBvaW50IGxhYmVsc1xuXHQgKi9cblx0ZnVuY3Rpb24gZml0KHNjYWxlKSB7XG5cdFx0dmFyIGxhcmdlc3RQb3NzaWJsZVJhZGl1cyA9IE1hdGgubWluKHNjYWxlLmhlaWdodCAvIDIsIHNjYWxlLndpZHRoIC8gMik7XG5cdFx0c2NhbGUuZHJhd2luZ0FyZWEgPSBNYXRoLnJvdW5kKGxhcmdlc3RQb3NzaWJsZVJhZGl1cyk7XG5cdFx0c2NhbGUuc2V0Q2VudGVyUG9pbnQoMCwgMCwgMCwgMCk7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRUZXh0QWxpZ25Gb3JBbmdsZShhbmdsZSkge1xuXHRcdGlmIChhbmdsZSA9PT0gMCB8fCBhbmdsZSA9PT0gMTgwKSB7XG5cdFx0XHRyZXR1cm4gJ2NlbnRlcic7XG5cdFx0fSBlbHNlIGlmIChhbmdsZSA8IDE4MCkge1xuXHRcdFx0cmV0dXJuICdsZWZ0Jztcblx0XHR9XG5cblx0XHRyZXR1cm4gJ3JpZ2h0Jztcblx0fVxuXG5cdGZ1bmN0aW9uIGZpbGxUZXh0KGN0eCwgdGV4dCwgcG9zaXRpb24sIGZvbnRTaXplKSB7XG5cdFx0aWYgKGhlbHBlcnMuaXNBcnJheSh0ZXh0KSkge1xuXHRcdFx0dmFyIHkgPSBwb3NpdGlvbi55O1xuXHRcdFx0dmFyIHNwYWNpbmcgPSAxLjUgKiBmb250U2l6ZTtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdGN0eC5maWxsVGV4dCh0ZXh0W2ldLCBwb3NpdGlvbi54LCB5KTtcblx0XHRcdFx0eSArPSBzcGFjaW5nO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdHguZmlsbFRleHQodGV4dCwgcG9zaXRpb24ueCwgcG9zaXRpb24ueSk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gYWRqdXN0UG9pbnRQb3NpdGlvbkZvckxhYmVsSGVpZ2h0KGFuZ2xlLCB0ZXh0U2l6ZSwgcG9zaXRpb24pIHtcblx0XHRpZiAoYW5nbGUgPT09IDkwIHx8IGFuZ2xlID09PSAyNzApIHtcblx0XHRcdHBvc2l0aW9uLnkgLT0gKHRleHRTaXplLmggLyAyKTtcblx0XHR9IGVsc2UgaWYgKGFuZ2xlID4gMjcwIHx8IGFuZ2xlIDwgOTApIHtcblx0XHRcdHBvc2l0aW9uLnkgLT0gdGV4dFNpemUuaDtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBkcmF3UG9pbnRMYWJlbHMoc2NhbGUpIHtcblx0XHR2YXIgY3R4ID0gc2NhbGUuY3R4O1xuXHRcdHZhciBvcHRzID0gc2NhbGUub3B0aW9ucztcblx0XHR2YXIgYW5nbGVMaW5lT3B0cyA9IG9wdHMuYW5nbGVMaW5lcztcblx0XHR2YXIgcG9pbnRMYWJlbE9wdHMgPSBvcHRzLnBvaW50TGFiZWxzO1xuXG5cdFx0Y3R4LmxpbmVXaWR0aCA9IGFuZ2xlTGluZU9wdHMubGluZVdpZHRoO1xuXHRcdGN0eC5zdHJva2VTdHlsZSA9IGFuZ2xlTGluZU9wdHMuY29sb3I7XG5cblx0XHR2YXIgb3V0ZXJEaXN0YW5jZSA9IHNjYWxlLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKG9wdHMudGlja3MucmV2ZXJzZSA/IHNjYWxlLm1pbiA6IHNjYWxlLm1heCk7XG5cblx0XHQvLyBQb2ludCBMYWJlbCBGb250XG5cdFx0dmFyIHBsRm9udCA9IGdldFBvaW50TGFiZWxGb250T3B0aW9ucyhzY2FsZSk7XG5cblx0XHRjdHgudGV4dEJhc2VsaW5lID0gJ3RvcCc7XG5cblx0XHRmb3IgKHZhciBpID0gZ2V0VmFsdWVDb3VudChzY2FsZSkgLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0aWYgKGFuZ2xlTGluZU9wdHMuZGlzcGxheSkge1xuXHRcdFx0XHR2YXIgb3V0ZXJQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb24oaSwgb3V0ZXJEaXN0YW5jZSk7XG5cdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0Y3R4Lm1vdmVUbyhzY2FsZS54Q2VudGVyLCBzY2FsZS55Q2VudGVyKTtcblx0XHRcdFx0Y3R4LmxpbmVUbyhvdXRlclBvc2l0aW9uLngsIG91dGVyUG9zaXRpb24ueSk7XG5cdFx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHRcdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocG9pbnRMYWJlbE9wdHMuZGlzcGxheSkge1xuXHRcdFx0XHQvLyBFeHRyYSAzcHggb3V0IGZvciBzb21lIGxhYmVsIHNwYWNpbmdcblx0XHRcdFx0dmFyIHBvaW50TGFiZWxQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb24oaSwgb3V0ZXJEaXN0YW5jZSArIDUpO1xuXG5cdFx0XHRcdC8vIEtlZXAgdGhpcyBpbiBsb29wIHNpbmNlIHdlIG1heSBzdXBwb3J0IGFycmF5IHByb3BlcnRpZXMgaGVyZVxuXHRcdFx0XHR2YXIgcG9pbnRMYWJlbEZvbnRDb2xvciA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KHBvaW50TGFiZWxPcHRzLmZvbnRDb2xvciwgaSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRDb2xvcik7XG5cdFx0XHRcdGN0eC5mb250ID0gcGxGb250LmZvbnQ7XG5cdFx0XHRcdGN0eC5maWxsU3R5bGUgPSBwb2ludExhYmVsRm9udENvbG9yO1xuXG5cdFx0XHRcdHZhciBhbmdsZVJhZGlhbnMgPSBzY2FsZS5nZXRJbmRleEFuZ2xlKGkpO1xuXHRcdFx0XHR2YXIgYW5nbGUgPSBoZWxwZXJzLnRvRGVncmVlcyhhbmdsZVJhZGlhbnMpO1xuXHRcdFx0XHRjdHgudGV4dEFsaWduID0gZ2V0VGV4dEFsaWduRm9yQW5nbGUoYW5nbGUpO1xuXHRcdFx0XHRhZGp1c3RQb2ludFBvc2l0aW9uRm9yTGFiZWxIZWlnaHQoYW5nbGUsIHNjYWxlLl9wb2ludExhYmVsU2l6ZXNbaV0sIHBvaW50TGFiZWxQb3NpdGlvbik7XG5cdFx0XHRcdGZpbGxUZXh0KGN0eCwgc2NhbGUucG9pbnRMYWJlbHNbaV0gfHwgJycsIHBvaW50TGFiZWxQb3NpdGlvbiwgcGxGb250LnNpemUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGRyYXdSYWRpdXNMaW5lKHNjYWxlLCBncmlkTGluZU9wdHMsIHJhZGl1cywgaW5kZXgpIHtcblx0XHR2YXIgY3R4ID0gc2NhbGUuY3R4O1xuXHRcdGN0eC5zdHJva2VTdHlsZSA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGdyaWRMaW5lT3B0cy5jb2xvciwgaW5kZXggLSAxKTtcblx0XHRjdHgubGluZVdpZHRoID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZ3JpZExpbmVPcHRzLmxpbmVXaWR0aCwgaW5kZXggLSAxKTtcblxuXHRcdGlmIChzY2FsZS5vcHRpb25zLmdyaWRMaW5lcy5jaXJjdWxhcikge1xuXHRcdFx0Ly8gRHJhdyBjaXJjdWxhciBhcmNzIGJldHdlZW4gdGhlIHBvaW50c1xuXHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0Y3R4LmFyYyhzY2FsZS54Q2VudGVyLCBzY2FsZS55Q2VudGVyLCByYWRpdXMsIDAsIE1hdGguUEkgKiAyKTtcblx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRHJhdyBzdHJhaWdodCBsaW5lcyBjb25uZWN0aW5nIGVhY2ggaW5kZXhcblx0XHRcdHZhciB2YWx1ZUNvdW50ID0gZ2V0VmFsdWVDb3VudChzY2FsZSk7XG5cblx0XHRcdGlmICh2YWx1ZUNvdW50ID09PSAwKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0dmFyIHBvaW50UG9zaXRpb24gPSBzY2FsZS5nZXRQb2ludFBvc2l0aW9uKDAsIHJhZGl1cyk7XG5cdFx0XHRjdHgubW92ZVRvKHBvaW50UG9zaXRpb24ueCwgcG9pbnRQb3NpdGlvbi55KTtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDE7IGkgPCB2YWx1ZUNvdW50OyBpKyspIHtcblx0XHRcdFx0cG9pbnRQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb24oaSwgcmFkaXVzKTtcblx0XHRcdFx0Y3R4LmxpbmVUbyhwb2ludFBvc2l0aW9uLngsIHBvaW50UG9zaXRpb24ueSk7XG5cdFx0XHR9XG5cblx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBudW1iZXJPclplcm8ocGFyYW0pIHtcblx0XHRyZXR1cm4gaGVscGVycy5pc051bWJlcihwYXJhbSkgPyBwYXJhbSA6IDA7XG5cdH1cblxuXHR2YXIgTGluZWFyUmFkaWFsU2NhbGUgPSBDaGFydC5MaW5lYXJTY2FsZUJhc2UuZXh0ZW5kKHtcblx0XHRzZXREaW1lbnNpb25zOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XG5cdFx0XHR2YXIgdGlja09wdHMgPSBvcHRzLnRpY2tzO1xuXHRcdFx0Ly8gU2V0IHRoZSB1bmNvbnN0cmFpbmVkIGRpbWVuc2lvbiBiZWZvcmUgbGFiZWwgcm90YXRpb25cblx0XHRcdG1lLndpZHRoID0gbWUubWF4V2lkdGg7XG5cdFx0XHRtZS5oZWlnaHQgPSBtZS5tYXhIZWlnaHQ7XG5cdFx0XHRtZS54Q2VudGVyID0gTWF0aC5yb3VuZChtZS53aWR0aCAvIDIpO1xuXHRcdFx0bWUueUNlbnRlciA9IE1hdGgucm91bmQobWUuaGVpZ2h0IC8gMik7XG5cblx0XHRcdHZhciBtaW5TaXplID0gaGVscGVycy5taW4oW21lLmhlaWdodCwgbWUud2lkdGhdKTtcblx0XHRcdHZhciB0aWNrRm9udFNpemUgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLmZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpO1xuXHRcdFx0bWUuZHJhd2luZ0FyZWEgPSBvcHRzLmRpc3BsYXkgPyAobWluU2l6ZSAvIDIpIC0gKHRpY2tGb250U2l6ZSAvIDIgKyB0aWNrT3B0cy5iYWNrZHJvcFBhZGRpbmdZKSA6IChtaW5TaXplIC8gMik7XG5cdFx0fSxcblx0XHRkZXRlcm1pbmVEYXRhTGltaXRzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcblx0XHRcdHZhciBtaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG5cdFx0XHR2YXIgbWF4ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuXG5cdFx0XHRoZWxwZXJzLmVhY2goY2hhcnQuZGF0YS5kYXRhc2V0cywgZnVuY3Rpb24oZGF0YXNldCwgZGF0YXNldEluZGV4KSB7XG5cdFx0XHRcdGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGRhdGFzZXRJbmRleCkpIHtcblx0XHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cblx0XHRcdFx0XHRoZWxwZXJzLmVhY2goZGF0YXNldC5kYXRhLCBmdW5jdGlvbihyYXdWYWx1ZSwgaW5kZXgpIHtcblx0XHRcdFx0XHRcdHZhciB2YWx1ZSA9ICttZS5nZXRSaWdodFZhbHVlKHJhd1ZhbHVlKTtcblx0XHRcdFx0XHRcdGlmIChpc05hTih2YWx1ZSkgfHwgbWV0YS5kYXRhW2luZGV4XS5oaWRkZW4pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRtaW4gPSBNYXRoLm1pbih2YWx1ZSwgbWluKTtcblx0XHRcdFx0XHRcdG1heCA9IE1hdGgubWF4KHZhbHVlLCBtYXgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0bWUubWluID0gKG1pbiA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZID8gMCA6IG1pbik7XG5cdFx0XHRtZS5tYXggPSAobWF4ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPyAwIDogbWF4KTtcblxuXHRcdFx0Ly8gQ29tbW9uIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gaGFuZGxlIHRpY2tzLm1pbiwgdGlja3MubWF4LCB0aWNrcy5iZWdpbkF0WmVyb1xuXHRcdFx0bWUuaGFuZGxlVGlja1JhbmdlT3B0aW9ucygpO1xuXHRcdH0sXG5cdFx0Z2V0VGlja0xpbWl0OiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0aWNrT3B0cyA9IHRoaXMub3B0aW9ucy50aWNrcztcblx0XHRcdHZhciB0aWNrRm9udFNpemUgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLmZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpO1xuXHRcdFx0cmV0dXJuIE1hdGgubWluKHRpY2tPcHRzLm1heFRpY2tzTGltaXQgPyB0aWNrT3B0cy5tYXhUaWNrc0xpbWl0IDogMTEsIE1hdGguY2VpbCh0aGlzLmRyYXdpbmdBcmVhIC8gKDEuNSAqIHRpY2tGb250U2l6ZSkpKTtcblx0XHR9LFxuXHRcdGNvbnZlcnRUaWNrc1RvTGFiZWxzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHRcdENoYXJ0LkxpbmVhclNjYWxlQmFzZS5wcm90b3R5cGUuY29udmVydFRpY2tzVG9MYWJlbHMuY2FsbChtZSk7XG5cblx0XHRcdC8vIFBvaW50IGxhYmVsc1xuXHRcdFx0bWUucG9pbnRMYWJlbHMgPSBtZS5jaGFydC5kYXRhLmxhYmVscy5tYXAobWUub3B0aW9ucy5wb2ludExhYmVscy5jYWxsYmFjaywgbWUpO1xuXHRcdH0sXG5cdFx0Z2V0TGFiZWxGb3JJbmRleDogZnVuY3Rpb24oaW5kZXgsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0cmV0dXJuICt0aGlzLmdldFJpZ2h0VmFsdWUodGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0uZGF0YVtpbmRleF0pO1xuXHRcdH0sXG5cdFx0Zml0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICh0aGlzLm9wdGlvbnMucG9pbnRMYWJlbHMuZGlzcGxheSkge1xuXHRcdFx0XHRmaXRXaXRoUG9pbnRMYWJlbHModGhpcyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmaXQodGhpcyk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBTZXQgcmFkaXVzIHJlZHVjdGlvbnMgYW5kIGRldGVybWluZSBuZXcgcmFkaXVzIGFuZCBjZW50ZXIgcG9pbnRcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHNldFJlZHVjdGlvbnM6IGZ1bmN0aW9uKGxhcmdlc3RQb3NzaWJsZVJhZGl1cywgZnVydGhlc3RMaW1pdHMsIGZ1cnRoZXN0QW5nbGVzKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIHJhZGl1c1JlZHVjdGlvbkxlZnQgPSBmdXJ0aGVzdExpbWl0cy5sIC8gTWF0aC5zaW4oZnVydGhlc3RBbmdsZXMubCk7XG5cdFx0XHR2YXIgcmFkaXVzUmVkdWN0aW9uUmlnaHQgPSBNYXRoLm1heChmdXJ0aGVzdExpbWl0cy5yIC0gbWUud2lkdGgsIDApIC8gTWF0aC5zaW4oZnVydGhlc3RBbmdsZXMucik7XG5cdFx0XHR2YXIgcmFkaXVzUmVkdWN0aW9uVG9wID0gLWZ1cnRoZXN0TGltaXRzLnQgLyBNYXRoLmNvcyhmdXJ0aGVzdEFuZ2xlcy50KTtcblx0XHRcdHZhciByYWRpdXNSZWR1Y3Rpb25Cb3R0b20gPSAtTWF0aC5tYXgoZnVydGhlc3RMaW1pdHMuYiAtIG1lLmhlaWdodCwgMCkgLyBNYXRoLmNvcyhmdXJ0aGVzdEFuZ2xlcy5iKTtcblxuXHRcdFx0cmFkaXVzUmVkdWN0aW9uTGVmdCA9IG51bWJlck9yWmVybyhyYWRpdXNSZWR1Y3Rpb25MZWZ0KTtcblx0XHRcdHJhZGl1c1JlZHVjdGlvblJpZ2h0ID0gbnVtYmVyT3JaZXJvKHJhZGl1c1JlZHVjdGlvblJpZ2h0KTtcblx0XHRcdHJhZGl1c1JlZHVjdGlvblRvcCA9IG51bWJlck9yWmVybyhyYWRpdXNSZWR1Y3Rpb25Ub3ApO1xuXHRcdFx0cmFkaXVzUmVkdWN0aW9uQm90dG9tID0gbnVtYmVyT3JaZXJvKHJhZGl1c1JlZHVjdGlvbkJvdHRvbSk7XG5cblx0XHRcdG1lLmRyYXdpbmdBcmVhID0gTWF0aC5taW4oXG5cdFx0XHRcdE1hdGgucm91bmQobGFyZ2VzdFBvc3NpYmxlUmFkaXVzIC0gKHJhZGl1c1JlZHVjdGlvbkxlZnQgKyByYWRpdXNSZWR1Y3Rpb25SaWdodCkgLyAyKSxcblx0XHRcdFx0TWF0aC5yb3VuZChsYXJnZXN0UG9zc2libGVSYWRpdXMgLSAocmFkaXVzUmVkdWN0aW9uVG9wICsgcmFkaXVzUmVkdWN0aW9uQm90dG9tKSAvIDIpKTtcblx0XHRcdG1lLnNldENlbnRlclBvaW50KHJhZGl1c1JlZHVjdGlvbkxlZnQsIHJhZGl1c1JlZHVjdGlvblJpZ2h0LCByYWRpdXNSZWR1Y3Rpb25Ub3AsIHJhZGl1c1JlZHVjdGlvbkJvdHRvbSk7XG5cdFx0fSxcblx0XHRzZXRDZW50ZXJQb2ludDogZnVuY3Rpb24obGVmdE1vdmVtZW50LCByaWdodE1vdmVtZW50LCB0b3BNb3ZlbWVudCwgYm90dG9tTW92ZW1lbnQpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgbWF4UmlnaHQgPSBtZS53aWR0aCAtIHJpZ2h0TW92ZW1lbnQgLSBtZS5kcmF3aW5nQXJlYTtcblx0XHRcdHZhciBtYXhMZWZ0ID0gbGVmdE1vdmVtZW50ICsgbWUuZHJhd2luZ0FyZWE7XG5cdFx0XHR2YXIgbWF4VG9wID0gdG9wTW92ZW1lbnQgKyBtZS5kcmF3aW5nQXJlYTtcblx0XHRcdHZhciBtYXhCb3R0b20gPSBtZS5oZWlnaHQgLSBib3R0b21Nb3ZlbWVudCAtIG1lLmRyYXdpbmdBcmVhO1xuXG5cdFx0XHRtZS54Q2VudGVyID0gTWF0aC5yb3VuZCgoKG1heExlZnQgKyBtYXhSaWdodCkgLyAyKSArIG1lLmxlZnQpO1xuXHRcdFx0bWUueUNlbnRlciA9IE1hdGgucm91bmQoKChtYXhUb3AgKyBtYXhCb3R0b20pIC8gMikgKyBtZS50b3ApO1xuXHRcdH0sXG5cblx0XHRnZXRJbmRleEFuZ2xlOiBmdW5jdGlvbihpbmRleCkge1xuXHRcdFx0dmFyIGFuZ2xlTXVsdGlwbGllciA9IChNYXRoLlBJICogMikgLyBnZXRWYWx1ZUNvdW50KHRoaXMpO1xuXHRcdFx0dmFyIHN0YXJ0QW5nbGUgPSB0aGlzLmNoYXJ0Lm9wdGlvbnMgJiYgdGhpcy5jaGFydC5vcHRpb25zLnN0YXJ0QW5nbGUgP1xuXHRcdFx0XHR0aGlzLmNoYXJ0Lm9wdGlvbnMuc3RhcnRBbmdsZSA6XG5cdFx0XHRcdDA7XG5cblx0XHRcdHZhciBzdGFydEFuZ2xlUmFkaWFucyA9IHN0YXJ0QW5nbGUgKiBNYXRoLlBJICogMiAvIDM2MDtcblxuXHRcdFx0Ly8gU3RhcnQgZnJvbSB0aGUgdG9wIGluc3RlYWQgb2YgcmlnaHQsIHNvIHJlbW92ZSBhIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuXHRcdFx0cmV0dXJuIGluZGV4ICogYW5nbGVNdWx0aXBsaWVyICsgc3RhcnRBbmdsZVJhZGlhbnM7XG5cdFx0fSxcblx0XHRnZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHRcdGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gMDsgLy8gbnVsbCBhbHdheXMgaW4gY2VudGVyXG5cdFx0XHR9XG5cblx0XHRcdC8vIFRha2UgaW50byBhY2NvdW50IGhhbGYgZm9udCBzaXplICsgdGhlIHlQYWRkaW5nIG9mIHRoZSB0b3AgdmFsdWVcblx0XHRcdHZhciBzY2FsaW5nRmFjdG9yID0gbWUuZHJhd2luZ0FyZWEgLyAobWUubWF4IC0gbWUubWluKTtcblx0XHRcdGlmIChtZS5vcHRpb25zLnRpY2tzLnJldmVyc2UpIHtcblx0XHRcdFx0cmV0dXJuIChtZS5tYXggLSB2YWx1ZSkgKiBzY2FsaW5nRmFjdG9yO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICh2YWx1ZSAtIG1lLm1pbikgKiBzY2FsaW5nRmFjdG9yO1xuXHRcdH0sXG5cdFx0Z2V0UG9pbnRQb3NpdGlvbjogZnVuY3Rpb24oaW5kZXgsIGRpc3RhbmNlRnJvbUNlbnRlcikge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciB0aGlzQW5nbGUgPSBtZS5nZXRJbmRleEFuZ2xlKGluZGV4KSAtIChNYXRoLlBJIC8gMik7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR4OiBNYXRoLnJvdW5kKE1hdGguY29zKHRoaXNBbmdsZSkgKiBkaXN0YW5jZUZyb21DZW50ZXIpICsgbWUueENlbnRlcixcblx0XHRcdFx0eTogTWF0aC5yb3VuZChNYXRoLnNpbih0aGlzQW5nbGUpICogZGlzdGFuY2VGcm9tQ2VudGVyKSArIG1lLnlDZW50ZXJcblx0XHRcdH07XG5cdFx0fSxcblx0XHRnZXRQb2ludFBvc2l0aW9uRm9yVmFsdWU6IGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0UG9pbnRQb3NpdGlvbihpbmRleCwgdGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh2YWx1ZSkpO1xuXHRcdH0sXG5cblx0XHRnZXRCYXNlUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBtaW4gPSBtZS5taW47XG5cdFx0XHR2YXIgbWF4ID0gbWUubWF4O1xuXG5cdFx0XHRyZXR1cm4gbWUuZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlKDAsXG5cdFx0XHRcdG1lLmJlZ2luQXRaZXJvID8gMCA6XG5cdFx0XHRcdG1pbiA8IDAgJiYgbWF4IDwgMCA/IG1heCA6XG5cdFx0XHRcdG1pbiA+IDAgJiYgbWF4ID4gMCA/IG1pbiA6XG5cdFx0XHRcdDApO1xuXHRcdH0sXG5cblx0XHRkcmF3OiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XG5cdFx0XHR2YXIgZ3JpZExpbmVPcHRzID0gb3B0cy5ncmlkTGluZXM7XG5cdFx0XHR2YXIgdGlja09wdHMgPSBvcHRzLnRpY2tzO1xuXHRcdFx0dmFyIHZhbHVlT3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdDtcblxuXHRcdFx0aWYgKG9wdHMuZGlzcGxheSkge1xuXHRcdFx0XHR2YXIgY3R4ID0gbWUuY3R4O1xuXHRcdFx0XHR2YXIgc3RhcnRBbmdsZSA9IHRoaXMuZ2V0SW5kZXhBbmdsZSgwKTtcblxuXHRcdFx0XHQvLyBUaWNrIEZvbnRcblx0XHRcdFx0dmFyIHRpY2tGb250U2l6ZSA9IHZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLmZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpO1xuXHRcdFx0XHR2YXIgdGlja0ZvbnRTdHlsZSA9IHZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLmZvbnRTdHlsZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTdHlsZSk7XG5cdFx0XHRcdHZhciB0aWNrRm9udEZhbWlseSA9IHZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLmZvbnRGYW1pbHksIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250RmFtaWx5KTtcblx0XHRcdFx0dmFyIHRpY2tMYWJlbEZvbnQgPSBoZWxwZXJzLmZvbnRTdHJpbmcodGlja0ZvbnRTaXplLCB0aWNrRm9udFN0eWxlLCB0aWNrRm9udEZhbWlseSk7XG5cblx0XHRcdFx0aGVscGVycy5lYWNoKG1lLnRpY2tzLCBmdW5jdGlvbihsYWJlbCwgaW5kZXgpIHtcblx0XHRcdFx0XHQvLyBEb24ndCBkcmF3IGEgY2VudHJlIHZhbHVlIChpZiBpdCBpcyBtaW5pbXVtKVxuXHRcdFx0XHRcdGlmIChpbmRleCA+IDAgfHwgdGlja09wdHMucmV2ZXJzZSkge1xuXHRcdFx0XHRcdFx0dmFyIHlDZW50ZXJPZmZzZXQgPSBtZS5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZShtZS50aWNrc0FzTnVtYmVyc1tpbmRleF0pO1xuXG5cdFx0XHRcdFx0XHQvLyBEcmF3IGNpcmN1bGFyIGxpbmVzIGFyb3VuZCB0aGUgc2NhbGVcblx0XHRcdFx0XHRcdGlmIChncmlkTGluZU9wdHMuZGlzcGxheSAmJiBpbmRleCAhPT0gMCkge1xuXHRcdFx0XHRcdFx0XHRkcmF3UmFkaXVzTGluZShtZSwgZ3JpZExpbmVPcHRzLCB5Q2VudGVyT2Zmc2V0LCBpbmRleCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0aWNrT3B0cy5kaXNwbGF5KSB7XG5cdFx0XHRcdFx0XHRcdHZhciB0aWNrRm9udENvbG9yID0gdmFsdWVPckRlZmF1bHQodGlja09wdHMuZm9udENvbG9yLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udENvbG9yKTtcblx0XHRcdFx0XHRcdFx0Y3R4LmZvbnQgPSB0aWNrTGFiZWxGb250O1xuXG5cdFx0XHRcdFx0XHRcdGN0eC5zYXZlKCk7XG5cdFx0XHRcdFx0XHRcdGN0eC50cmFuc2xhdGUobWUueENlbnRlciwgbWUueUNlbnRlcik7XG5cdFx0XHRcdFx0XHRcdGN0eC5yb3RhdGUoc3RhcnRBbmdsZSk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRpY2tPcHRzLnNob3dMYWJlbEJhY2tkcm9wKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIGxhYmVsV2lkdGggPSBjdHgubWVhc3VyZVRleHQobGFiZWwpLndpZHRoO1xuXHRcdFx0XHRcdFx0XHRcdGN0eC5maWxsU3R5bGUgPSB0aWNrT3B0cy5iYWNrZHJvcENvbG9yO1xuXHRcdFx0XHRcdFx0XHRcdGN0eC5maWxsUmVjdChcblx0XHRcdFx0XHRcdFx0XHRcdC1sYWJlbFdpZHRoIC8gMiAtIHRpY2tPcHRzLmJhY2tkcm9wUGFkZGluZ1gsXG5cdFx0XHRcdFx0XHRcdFx0XHQteUNlbnRlck9mZnNldCAtIHRpY2tGb250U2l6ZSAvIDIgLSB0aWNrT3B0cy5iYWNrZHJvcFBhZGRpbmdZLFxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWxXaWR0aCArIHRpY2tPcHRzLmJhY2tkcm9wUGFkZGluZ1ggKiAyLFxuXHRcdFx0XHRcdFx0XHRcdFx0dGlja0ZvbnRTaXplICsgdGlja09wdHMuYmFja2Ryb3BQYWRkaW5nWSAqIDJcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Y3R4LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuXHRcdFx0XHRcdFx0XHRjdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG5cdFx0XHRcdFx0XHRcdGN0eC5maWxsU3R5bGUgPSB0aWNrRm9udENvbG9yO1xuXHRcdFx0XHRcdFx0XHRjdHguZmlsbFRleHQobGFiZWwsIDAsIC15Q2VudGVyT2Zmc2V0KTtcblx0XHRcdFx0XHRcdFx0Y3R4LnJlc3RvcmUoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChvcHRzLmFuZ2xlTGluZXMuZGlzcGxheSB8fCBvcHRzLnBvaW50TGFiZWxzLmRpc3BsYXkpIHtcblx0XHRcdFx0XHRkcmF3UG9pbnRMYWJlbHMobWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRzY2FsZVNlcnZpY2UucmVnaXN0ZXJTY2FsZVR5cGUoJ3JhZGlhbExpbmVhcicsIExpbmVhclJhZGlhbFNjYWxlLCBkZWZhdWx0Q29uZmlnKTtcbn07XG5cbn0se1wiMjZcIjoyNixcIjM0XCI6MzQsXCIzNVwiOjM1LFwiNDZcIjo0Nn1dLDU5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbi8qIGdsb2JhbCB3aW5kb3c6IGZhbHNlICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBtb21lbnQgPSByZXF1aXJlKDEpO1xubW9tZW50ID0gdHlwZW9mIG1vbWVudCA9PT0gJ2Z1bmN0aW9uJyA/IG1vbWVudCA6IHdpbmRvdy5tb21lbnQ7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcbnZhciBTY2FsZSA9IHJlcXVpcmUoMzMpO1xudmFyIHNjYWxlU2VydmljZSA9IHJlcXVpcmUoMzQpO1xuXG4vLyBJbnRlZ2VyIGNvbnN0YW50cyBhcmUgZnJvbSB0aGUgRVM2IHNwZWMuXG52YXIgTUlOX0lOVEVHRVIgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiB8fCAtOTAwNzE5OTI1NDc0MDk5MTtcbnZhciBNQVhfSU5URUdFUiA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbnZhciBJTlRFUlZBTFMgPSB7XG5cdG1pbGxpc2Vjb25kOiB7XG5cdFx0Y29tbW9uOiB0cnVlLFxuXHRcdHNpemU6IDEsXG5cdFx0c3RlcHM6IFsxLCAyLCA1LCAxMCwgMjAsIDUwLCAxMDAsIDI1MCwgNTAwXVxuXHR9LFxuXHRzZWNvbmQ6IHtcblx0XHRjb21tb246IHRydWUsXG5cdFx0c2l6ZTogMTAwMCxcblx0XHRzdGVwczogWzEsIDIsIDUsIDEwLCAxNSwgMzBdXG5cdH0sXG5cdG1pbnV0ZToge1xuXHRcdGNvbW1vbjogdHJ1ZSxcblx0XHRzaXplOiA2MDAwMCxcblx0XHRzdGVwczogWzEsIDIsIDUsIDEwLCAxNSwgMzBdXG5cdH0sXG5cdGhvdXI6IHtcblx0XHRjb21tb246IHRydWUsXG5cdFx0c2l6ZTogMzYwMDAwMCxcblx0XHRzdGVwczogWzEsIDIsIDMsIDYsIDEyXVxuXHR9LFxuXHRkYXk6IHtcblx0XHRjb21tb246IHRydWUsXG5cdFx0c2l6ZTogODY0MDAwMDAsXG5cdFx0c3RlcHM6IFsxLCAyLCA1XVxuXHR9LFxuXHR3ZWVrOiB7XG5cdFx0Y29tbW9uOiBmYWxzZSxcblx0XHRzaXplOiA2MDQ4MDAwMDAsXG5cdFx0c3RlcHM6IFsxLCAyLCAzLCA0XVxuXHR9LFxuXHRtb250aDoge1xuXHRcdGNvbW1vbjogdHJ1ZSxcblx0XHRzaXplOiAyLjYyOGU5LFxuXHRcdHN0ZXBzOiBbMSwgMiwgM11cblx0fSxcblx0cXVhcnRlcjoge1xuXHRcdGNvbW1vbjogZmFsc2UsXG5cdFx0c2l6ZTogNy44ODRlOSxcblx0XHRzdGVwczogWzEsIDIsIDMsIDRdXG5cdH0sXG5cdHllYXI6IHtcblx0XHRjb21tb246IHRydWUsXG5cdFx0c2l6ZTogMy4xNTRlMTBcblx0fVxufTtcblxudmFyIFVOSVRTID0gT2JqZWN0LmtleXMoSU5URVJWQUxTKTtcblxuZnVuY3Rpb24gc29ydGVyKGEsIGIpIHtcblx0cmV0dXJuIGEgLSBiO1xufVxuXG5mdW5jdGlvbiBhcnJheVVuaXF1ZShpdGVtcykge1xuXHR2YXIgaGFzaCA9IHt9O1xuXHR2YXIgb3V0ID0gW107XG5cdHZhciBpLCBpbGVuLCBpdGVtO1xuXG5cdGZvciAoaSA9IDAsIGlsZW4gPSBpdGVtcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRpdGVtID0gaXRlbXNbaV07XG5cdFx0aWYgKCFoYXNoW2l0ZW1dKSB7XG5cdFx0XHRoYXNoW2l0ZW1dID0gdHJ1ZTtcblx0XHRcdG91dC5wdXNoKGl0ZW0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiB7dGltZSwgcG9zfSBvYmplY3RzIHVzZWQgdG8gaW50ZXJwb2xhdGUgYSBzcGVjaWZpYyBgdGltZWAgb3IgcG9zaXRpb25cbiAqIChgcG9zYCkgb24gdGhlIHNjYWxlLCBieSBzZWFyY2hpbmcgZW50cmllcyBiZWZvcmUgYW5kIGFmdGVyIHRoZSByZXF1ZXN0ZWQgdmFsdWUuIGBwb3NgIGlzXG4gKiBhIGRlY2ltYWwgYmV0d2VlbiAwIGFuZCAxOiAwIGJlaW5nIHRoZSBzdGFydCBvZiB0aGUgc2NhbGUgKGxlZnQgb3IgdG9wKSBhbmQgMSB0aGUgb3RoZXJcbiAqIGV4dHJlbWl0eSAobGVmdCArIHdpZHRoIG9yIHRvcCArIGhlaWdodCkuIE5vdGUgdGhhdCBpdCB3b3VsZCBiZSBtb3JlIG9wdGltaXplZCB0byBkaXJlY3RseVxuICogc3RvcmUgcHJlLWNvbXB1dGVkIHBpeGVscywgYnV0IHRoZSBzY2FsZSBkaW1lbnNpb25zIGFyZSBub3QgZ3VhcmFudGVlZCBhdCB0aGUgdGltZSB3ZSBuZWVkXG4gKiB0byBjcmVhdGUgdGhlIGxvb2t1cCB0YWJsZS4gVGhlIHRhYmxlIEFMV0FZUyBjb250YWlucyBhdCBsZWFzdCB0d28gaXRlbXM6IG1pbiBhbmQgbWF4LlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyW119IHRpbWVzdGFtcHMgLSB0aW1lc3RhbXBzIHNvcnRlZCBmcm9tIGxvd2VzdCB0byBoaWdoZXN0LlxuICogQHBhcmFtIHtTdHJpbmd9IGRpc3RyaWJ1dGlvbiAtIElmICdsaW5lYXInLCB0aW1lc3RhbXBzIHdpbGwgYmUgc3ByZWFkIGxpbmVhcmx5IGFsb25nIHRoZSBtaW5cbiAqIGFuZCBtYXggcmFuZ2UsIHNvIGJhc2ljYWxseSwgdGhlIHRhYmxlIHdpbGwgY29udGFpbnMgb25seSB0d28gaXRlbXM6IHttaW4sIDB9IGFuZCB7bWF4LCAxfS5cbiAqIElmICdzZXJpZXMnLCB0aW1lc3RhbXBzIHdpbGwgYmUgcG9zaXRpb25lZCBhdCB0aGUgc2FtZSBkaXN0YW5jZSBmcm9tIGVhY2ggb3RoZXIuIEluIHRoaXNcbiAqIGNhc2UsIG9ubHkgdGltZXN0YW1wcyB0aGF0IGJyZWFrIHRoZSB0aW1lIGxpbmVhcml0eSBhcmUgcmVnaXN0ZXJlZCwgbWVhbmluZyB0aGF0IGluIHRoZVxuICogYmVzdCBjYXNlLCBhbGwgdGltZXN0YW1wcyBhcmUgbGluZWFyLCB0aGUgdGFibGUgY29udGFpbnMgb25seSBtaW4gYW5kIG1heC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRMb29rdXBUYWJsZSh0aW1lc3RhbXBzLCBtaW4sIG1heCwgZGlzdHJpYnV0aW9uKSB7XG5cdGlmIChkaXN0cmlidXRpb24gPT09ICdsaW5lYXInIHx8ICF0aW1lc3RhbXBzLmxlbmd0aCkge1xuXHRcdHJldHVybiBbXG5cdFx0XHR7dGltZTogbWluLCBwb3M6IDB9LFxuXHRcdFx0e3RpbWU6IG1heCwgcG9zOiAxfVxuXHRcdF07XG5cdH1cblxuXHR2YXIgdGFibGUgPSBbXTtcblx0dmFyIGl0ZW1zID0gW21pbl07XG5cdHZhciBpLCBpbGVuLCBwcmV2LCBjdXJyLCBuZXh0O1xuXG5cdGZvciAoaSA9IDAsIGlsZW4gPSB0aW1lc3RhbXBzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdGN1cnIgPSB0aW1lc3RhbXBzW2ldO1xuXHRcdGlmIChjdXJyID4gbWluICYmIGN1cnIgPCBtYXgpIHtcblx0XHRcdGl0ZW1zLnB1c2goY3Vycik7XG5cdFx0fVxuXHR9XG5cblx0aXRlbXMucHVzaChtYXgpO1xuXG5cdGZvciAoaSA9IDAsIGlsZW4gPSBpdGVtcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRuZXh0ID0gaXRlbXNbaSArIDFdO1xuXHRcdHByZXYgPSBpdGVtc1tpIC0gMV07XG5cdFx0Y3VyciA9IGl0ZW1zW2ldO1xuXG5cdFx0Ly8gb25seSBhZGQgcG9pbnRzIHRoYXQgYnJlYWtzIHRoZSBzY2FsZSBsaW5lYXJpdHlcblx0XHRpZiAocHJldiA9PT0gdW5kZWZpbmVkIHx8IG5leHQgPT09IHVuZGVmaW5lZCB8fCBNYXRoLnJvdW5kKChuZXh0ICsgcHJldikgLyAyKSAhPT0gY3Vycikge1xuXHRcdFx0dGFibGUucHVzaCh7dGltZTogY3VyciwgcG9zOiBpIC8gKGlsZW4gLSAxKX0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0YWJsZTtcbn1cblxuLy8gQHNlZSBhZGFwdGVkIGZyb20gaHR0cDovL3d3dy5hbnVqZ2FraGFyLmNvbS8yMDE0LzAzLzAxL2JpbmFyeS1zZWFyY2gtaW4tamF2YXNjcmlwdC9cbmZ1bmN0aW9uIGxvb2t1cCh0YWJsZSwga2V5LCB2YWx1ZSkge1xuXHR2YXIgbG8gPSAwO1xuXHR2YXIgaGkgPSB0YWJsZS5sZW5ndGggLSAxO1xuXHR2YXIgbWlkLCBpMCwgaTE7XG5cblx0d2hpbGUgKGxvID49IDAgJiYgbG8gPD0gaGkpIHtcblx0XHRtaWQgPSAobG8gKyBoaSkgPj4gMTtcblx0XHRpMCA9IHRhYmxlW21pZCAtIDFdIHx8IG51bGw7XG5cdFx0aTEgPSB0YWJsZVttaWRdO1xuXG5cdFx0aWYgKCFpMCkge1xuXHRcdFx0Ly8gZ2l2ZW4gdmFsdWUgaXMgb3V0c2lkZSB0YWJsZSAoYmVmb3JlIGZpcnN0IGl0ZW0pXG5cdFx0XHRyZXR1cm4ge2xvOiBudWxsLCBoaTogaTF9O1xuXHRcdH0gZWxzZSBpZiAoaTFba2V5XSA8IHZhbHVlKSB7XG5cdFx0XHRsbyA9IG1pZCArIDE7XG5cdFx0fSBlbHNlIGlmIChpMFtrZXldID4gdmFsdWUpIHtcblx0XHRcdGhpID0gbWlkIC0gMTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHtsbzogaTAsIGhpOiBpMX07XG5cdFx0fVxuXHR9XG5cblx0Ly8gZ2l2ZW4gdmFsdWUgaXMgb3V0c2lkZSB0YWJsZSAoYWZ0ZXIgbGFzdCBpdGVtKVxuXHRyZXR1cm4ge2xvOiBpMSwgaGk6IG51bGx9O1xufVxuXG4vKipcbiAqIExpbmVhcmx5IGludGVycG9sYXRlcyB0aGUgZ2l2ZW4gc291cmNlIGB2YWx1ZWAgdXNpbmcgdGhlIHRhYmxlIGl0ZW1zIGBza2V5YCB2YWx1ZXMgYW5kXG4gKiByZXR1cm5zIHRoZSBhc3NvY2lhdGVkIGB0a2V5YCB2YWx1ZS4gRm9yIGV4YW1wbGUsIGludGVycG9sYXRlKHRhYmxlLCAndGltZScsIDQyLCAncG9zJylcbiAqIHJldHVybnMgdGhlIHBvc2l0aW9uIGZvciBhIHRpbWVzdGFtcCBlcXVhbCB0byA0Mi4gSWYgdmFsdWUgaXMgb3V0IG9mIGJvdW5kcywgdmFsdWVzIGF0XG4gKiBpbmRleCBbMCwgMV0gb3IgW24gLSAxLCBuXSBhcmUgdXNlZCBmb3IgdGhlIGludGVycG9sYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGludGVycG9sYXRlKHRhYmxlLCBza2V5LCBzdmFsLCB0a2V5KSB7XG5cdHZhciByYW5nZSA9IGxvb2t1cCh0YWJsZSwgc2tleSwgc3ZhbCk7XG5cblx0Ly8gTm90ZTogdGhlIGxvb2t1cCB0YWJsZSBBTFdBWVMgY29udGFpbnMgYXQgbGVhc3QgMiBpdGVtcyAobWluIGFuZCBtYXgpXG5cdHZhciBwcmV2ID0gIXJhbmdlLmxvID8gdGFibGVbMF0gOiAhcmFuZ2UuaGkgPyB0YWJsZVt0YWJsZS5sZW5ndGggLSAyXSA6IHJhbmdlLmxvO1xuXHR2YXIgbmV4dCA9ICFyYW5nZS5sbyA/IHRhYmxlWzFdIDogIXJhbmdlLmhpID8gdGFibGVbdGFibGUubGVuZ3RoIC0gMV0gOiByYW5nZS5oaTtcblxuXHR2YXIgc3BhbiA9IG5leHRbc2tleV0gLSBwcmV2W3NrZXldO1xuXHR2YXIgcmF0aW8gPSBzcGFuID8gKHN2YWwgLSBwcmV2W3NrZXldKSAvIHNwYW4gOiAwO1xuXHR2YXIgb2Zmc2V0ID0gKG5leHRbdGtleV0gLSBwcmV2W3RrZXldKSAqIHJhdGlvO1xuXG5cdHJldHVybiBwcmV2W3RrZXldICsgb2Zmc2V0O1xufVxuXG4vKipcbiAqIENvbnZlcnQgdGhlIGdpdmVuIHZhbHVlIHRvIGEgbW9tZW50IG9iamVjdCB1c2luZyB0aGUgZ2l2ZW4gdGltZSBvcHRpb25zLlxuICogQHNlZSBodHRwOi8vbW9tZW50anMuY29tL2RvY3MvIy9wYXJzaW5nL1xuICovXG5mdW5jdGlvbiBtb21lbnRpZnkodmFsdWUsIG9wdGlvbnMpIHtcblx0dmFyIHBhcnNlciA9IG9wdGlvbnMucGFyc2VyO1xuXHR2YXIgZm9ybWF0ID0gb3B0aW9ucy5wYXJzZXIgfHwgb3B0aW9ucy5mb3JtYXQ7XG5cblx0aWYgKHR5cGVvZiBwYXJzZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gcGFyc2VyKHZhbHVlKTtcblx0fVxuXG5cdGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBmb3JtYXQgPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIG1vbWVudCh2YWx1ZSwgZm9ybWF0KTtcblx0fVxuXG5cdGlmICghKHZhbHVlIGluc3RhbmNlb2YgbW9tZW50KSkge1xuXHRcdHZhbHVlID0gbW9tZW50KHZhbHVlKTtcblx0fVxuXG5cdGlmICh2YWx1ZS5pc1ZhbGlkKCkpIHtcblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHQvLyBMYWJlbHMgYXJlIGluIGFuIGluY29tcGF0aWJsZSBtb21lbnQgZm9ybWF0IGFuZCBubyBgcGFyc2VyYCBoYXMgYmVlbiBwcm92aWRlZC5cblx0Ly8gVGhlIHVzZXIgbWlnaHQgc3RpbGwgdXNlIHRoZSBkZXByZWNhdGVkIGBmb3JtYXRgIG9wdGlvbiB0byBjb252ZXJ0IGhpcyBpbnB1dHMuXG5cdGlmICh0eXBlb2YgZm9ybWF0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0cmV0dXJuIGZvcm1hdCh2YWx1ZSk7XG5cdH1cblxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlKGlucHV0LCBzY2FsZSkge1xuXHRpZiAoaGVscGVycy5pc051bGxPclVuZGVmKGlucHV0KSkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIG9wdGlvbnMgPSBzY2FsZS5vcHRpb25zLnRpbWU7XG5cdHZhciB2YWx1ZSA9IG1vbWVudGlmeShzY2FsZS5nZXRSaWdodFZhbHVlKGlucHV0KSwgb3B0aW9ucyk7XG5cdGlmICghdmFsdWUuaXNWYWxpZCgpKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5yb3VuZCkge1xuXHRcdHZhbHVlLnN0YXJ0T2Yob3B0aW9ucy5yb3VuZCk7XG5cdH1cblxuXHRyZXR1cm4gdmFsdWUudmFsdWVPZigpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG51bWJlciBvZiB1bml0IHRvIHNraXAgdG8gYmUgYWJsZSB0byBkaXNwbGF5IHVwIHRvIGBjYXBhY2l0eWAgbnVtYmVyIG9mIHRpY2tzXG4gKiBpbiBgdW5pdGAgZm9yIHRoZSBnaXZlbiBgbWluYCAvIGBtYXhgIHJhbmdlIGFuZCByZXNwZWN0aW5nIHRoZSBpbnRlcnZhbCBzdGVwcyBjb25zdHJhaW50cy5cbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lU3RlcFNpemUobWluLCBtYXgsIHVuaXQsIGNhcGFjaXR5KSB7XG5cdHZhciByYW5nZSA9IG1heCAtIG1pbjtcblx0dmFyIGludGVydmFsID0gSU5URVJWQUxTW3VuaXRdO1xuXHR2YXIgbWlsbGlzZWNvbmRzID0gaW50ZXJ2YWwuc2l6ZTtcblx0dmFyIHN0ZXBzID0gaW50ZXJ2YWwuc3RlcHM7XG5cdHZhciBpLCBpbGVuLCBmYWN0b3I7XG5cblx0aWYgKCFzdGVwcykge1xuXHRcdHJldHVybiBNYXRoLmNlaWwocmFuZ2UgLyAoY2FwYWNpdHkgKiBtaWxsaXNlY29uZHMpKTtcblx0fVxuXG5cdGZvciAoaSA9IDAsIGlsZW4gPSBzdGVwcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRmYWN0b3IgPSBzdGVwc1tpXTtcblx0XHRpZiAoTWF0aC5jZWlsKHJhbmdlIC8gKG1pbGxpc2Vjb25kcyAqIGZhY3RvcikpIDw9IGNhcGFjaXR5KSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZmFjdG9yO1xufVxuXG4vKipcbiAqIEZpZ3VyZXMgb3V0IHdoYXQgdW5pdCByZXN1bHRzIGluIGFuIGFwcHJvcHJpYXRlIG51bWJlciBvZiBhdXRvLWdlbmVyYXRlZCB0aWNrc1xuICovXG5mdW5jdGlvbiBkZXRlcm1pbmVVbml0Rm9yQXV0b1RpY2tzKG1pblVuaXQsIG1pbiwgbWF4LCBjYXBhY2l0eSkge1xuXHR2YXIgaWxlbiA9IFVOSVRTLmxlbmd0aDtcblx0dmFyIGksIGludGVydmFsLCBmYWN0b3I7XG5cblx0Zm9yIChpID0gVU5JVFMuaW5kZXhPZihtaW5Vbml0KTsgaSA8IGlsZW4gLSAxOyArK2kpIHtcblx0XHRpbnRlcnZhbCA9IElOVEVSVkFMU1tVTklUU1tpXV07XG5cdFx0ZmFjdG9yID0gaW50ZXJ2YWwuc3RlcHMgPyBpbnRlcnZhbC5zdGVwc1tpbnRlcnZhbC5zdGVwcy5sZW5ndGggLSAxXSA6IE1BWF9JTlRFR0VSO1xuXG5cdFx0aWYgKGludGVydmFsLmNvbW1vbiAmJiBNYXRoLmNlaWwoKG1heCAtIG1pbikgLyAoZmFjdG9yICogaW50ZXJ2YWwuc2l6ZSkpIDw9IGNhcGFjaXR5KSB7XG5cdFx0XHRyZXR1cm4gVU5JVFNbaV07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFVOSVRTW2lsZW4gLSAxXTtcbn1cblxuLyoqXG4gKiBGaWd1cmVzIG91dCB3aGF0IHVuaXQgdG8gZm9ybWF0IGEgc2V0IG9mIHRpY2tzIHdpdGhcbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lVW5pdEZvckZvcm1hdHRpbmcodGlja3MsIG1pblVuaXQsIG1pbiwgbWF4KSB7XG5cdHZhciBkdXJhdGlvbiA9IG1vbWVudC5kdXJhdGlvbihtb21lbnQobWF4KS5kaWZmKG1vbWVudChtaW4pKSk7XG5cdHZhciBpbGVuID0gVU5JVFMubGVuZ3RoO1xuXHR2YXIgaSwgdW5pdDtcblxuXHRmb3IgKGkgPSBpbGVuIC0gMTsgaSA+PSBVTklUUy5pbmRleE9mKG1pblVuaXQpOyBpLS0pIHtcblx0XHR1bml0ID0gVU5JVFNbaV07XG5cdFx0aWYgKElOVEVSVkFMU1t1bml0XS5jb21tb24gJiYgZHVyYXRpb24uYXModW5pdCkgPj0gdGlja3MubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gdW5pdDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gVU5JVFNbbWluVW5pdCA/IFVOSVRTLmluZGV4T2YobWluVW5pdCkgOiAwXTtcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lTWFqb3JVbml0KHVuaXQpIHtcblx0Zm9yICh2YXIgaSA9IFVOSVRTLmluZGV4T2YodW5pdCkgKyAxLCBpbGVuID0gVU5JVFMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0aWYgKElOVEVSVkFMU1tVTklUU1tpXV0uY29tbW9uKSB7XG5cdFx0XHRyZXR1cm4gVU5JVFNbaV07XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbWF4aW11bSBvZiBgY2FwYWNpdHlgIHRpbWVzdGFtcHMgYmV0d2VlbiBtaW4gYW5kIG1heCwgcm91bmRlZCB0byB0aGVcbiAqIGBtaW5vcmAgdW5pdCwgYWxpZ25lZCBvbiB0aGUgYG1ham9yYCB1bml0IGFuZCB1c2luZyB0aGUgZ2l2ZW4gc2NhbGUgdGltZSBgb3B0aW9uc2AuXG4gKiBJbXBvcnRhbnQ6IHRoaXMgbWV0aG9kIGNhbiByZXR1cm4gdGlja3Mgb3V0c2lkZSB0aGUgbWluIGFuZCBtYXggcmFuZ2UsIGl0J3MgdGhlXG4gKiByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGluZyBjb2RlIHRvIGNsYW1wIHZhbHVlcyBpZiBuZWVkZWQuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlKG1pbiwgbWF4LCBjYXBhY2l0eSwgb3B0aW9ucykge1xuXHR2YXIgdGltZU9wdHMgPSBvcHRpb25zLnRpbWU7XG5cdHZhciBtaW5vciA9IHRpbWVPcHRzLnVuaXQgfHwgZGV0ZXJtaW5lVW5pdEZvckF1dG9UaWNrcyh0aW1lT3B0cy5taW5Vbml0LCBtaW4sIG1heCwgY2FwYWNpdHkpO1xuXHR2YXIgbWFqb3IgPSBkZXRlcm1pbmVNYWpvclVuaXQobWlub3IpO1xuXHR2YXIgc3RlcFNpemUgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHRpbWVPcHRzLnN0ZXBTaXplLCB0aW1lT3B0cy51bml0U3RlcFNpemUpO1xuXHR2YXIgd2Vla2RheSA9IG1pbm9yID09PSAnd2VlaycgPyB0aW1lT3B0cy5pc29XZWVrZGF5IDogZmFsc2U7XG5cdHZhciBtYWpvclRpY2tzRW5hYmxlZCA9IG9wdGlvbnMudGlja3MubWFqb3IuZW5hYmxlZDtcblx0dmFyIGludGVydmFsID0gSU5URVJWQUxTW21pbm9yXTtcblx0dmFyIGZpcnN0ID0gbW9tZW50KG1pbik7XG5cdHZhciBsYXN0ID0gbW9tZW50KG1heCk7XG5cdHZhciB0aWNrcyA9IFtdO1xuXHR2YXIgdGltZTtcblxuXHRpZiAoIXN0ZXBTaXplKSB7XG5cdFx0c3RlcFNpemUgPSBkZXRlcm1pbmVTdGVwU2l6ZShtaW4sIG1heCwgbWlub3IsIGNhcGFjaXR5KTtcblx0fVxuXG5cdC8vIEZvciAnd2VlaycgdW5pdCwgaGFuZGxlIHRoZSBmaXJzdCBkYXkgb2Ygd2VlayBvcHRpb25cblx0aWYgKHdlZWtkYXkpIHtcblx0XHRmaXJzdCA9IGZpcnN0Lmlzb1dlZWtkYXkod2Vla2RheSk7XG5cdFx0bGFzdCA9IGxhc3QuaXNvV2Vla2RheSh3ZWVrZGF5KTtcblx0fVxuXG5cdC8vIEFsaWduIGZpcnN0L2xhc3QgdGlja3Mgb24gdW5pdFxuXHRmaXJzdCA9IGZpcnN0LnN0YXJ0T2Yod2Vla2RheSA/ICdkYXknIDogbWlub3IpO1xuXHRsYXN0ID0gbGFzdC5zdGFydE9mKHdlZWtkYXkgPyAnZGF5JyA6IG1pbm9yKTtcblxuXHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbGFzdCB0aWNrIGluY2x1ZGUgbWF4XG5cdGlmIChsYXN0IDwgbWF4KSB7XG5cdFx0bGFzdC5hZGQoMSwgbWlub3IpO1xuXHR9XG5cblx0dGltZSA9IG1vbWVudChmaXJzdCk7XG5cblx0aWYgKG1ham9yVGlja3NFbmFibGVkICYmIG1ham9yICYmICF3ZWVrZGF5ICYmICF0aW1lT3B0cy5yb3VuZCkge1xuXHRcdC8vIEFsaWduIHRoZSBmaXJzdCB0aWNrIG9uIHRoZSBwcmV2aW91cyBgbWlub3JgIHVuaXQgYWxpZ25lZCBvbiB0aGUgYG1ham9yYCB1bml0OlxuXHRcdC8vIHdlIGZpcnN0IGFsaWduZWQgdGltZSBvbiB0aGUgcHJldmlvdXMgYG1ham9yYCB1bml0IHRoZW4gYWRkIHRoZSBudW1iZXIgb2YgZnVsbFxuXHRcdC8vIHN0ZXBTaXplIHRoZXJlIGlzIGJldHdlZW4gZmlyc3QgYW5kIHRoZSBwcmV2aW91cyBtYWpvciB0aW1lLlxuXHRcdHRpbWUuc3RhcnRPZihtYWpvcik7XG5cdFx0dGltZS5hZGQofn4oKGZpcnN0IC0gdGltZSkgLyAoaW50ZXJ2YWwuc2l6ZSAqIHN0ZXBTaXplKSkgKiBzdGVwU2l6ZSwgbWlub3IpO1xuXHR9XG5cblx0Zm9yICg7IHRpbWUgPCBsYXN0OyB0aW1lLmFkZChzdGVwU2l6ZSwgbWlub3IpKSB7XG5cdFx0dGlja3MucHVzaCgrdGltZSk7XG5cdH1cblxuXHR0aWNrcy5wdXNoKCt0aW1lKTtcblxuXHRyZXR1cm4gdGlja3M7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmlnaHQgYW5kIGxlZnQgb2Zmc2V0cyBmcm9tIGVkZ2VzIGluIHRoZSBmb3JtIG9mIHtsZWZ0LCByaWdodH0uXG4gKiBPZmZzZXRzIGFyZSBhZGRlZCB3aGVuIHRoZSBgb2Zmc2V0YCBvcHRpb24gaXMgdHJ1ZS5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZU9mZnNldHModGFibGUsIHRpY2tzLCBtaW4sIG1heCwgb3B0aW9ucykge1xuXHR2YXIgbGVmdCA9IDA7XG5cdHZhciByaWdodCA9IDA7XG5cdHZhciB1cHBlciwgbG93ZXI7XG5cblx0aWYgKG9wdGlvbnMub2Zmc2V0ICYmIHRpY2tzLmxlbmd0aCkge1xuXHRcdGlmICghb3B0aW9ucy50aW1lLm1pbikge1xuXHRcdFx0dXBwZXIgPSB0aWNrcy5sZW5ndGggPiAxID8gdGlja3NbMV0gOiBtYXg7XG5cdFx0XHRsb3dlciA9IHRpY2tzWzBdO1xuXHRcdFx0bGVmdCA9IChcblx0XHRcdFx0aW50ZXJwb2xhdGUodGFibGUsICd0aW1lJywgdXBwZXIsICdwb3MnKSAtXG5cdFx0XHRcdGludGVycG9sYXRlKHRhYmxlLCAndGltZScsIGxvd2VyLCAncG9zJylcblx0XHRcdCkgLyAyO1xuXHRcdH1cblx0XHRpZiAoIW9wdGlvbnMudGltZS5tYXgpIHtcblx0XHRcdHVwcGVyID0gdGlja3NbdGlja3MubGVuZ3RoIC0gMV07XG5cdFx0XHRsb3dlciA9IHRpY2tzLmxlbmd0aCA+IDEgPyB0aWNrc1t0aWNrcy5sZW5ndGggLSAyXSA6IG1pbjtcblx0XHRcdHJpZ2h0ID0gKFxuXHRcdFx0XHRpbnRlcnBvbGF0ZSh0YWJsZSwgJ3RpbWUnLCB1cHBlciwgJ3BvcycpIC1cblx0XHRcdFx0aW50ZXJwb2xhdGUodGFibGUsICd0aW1lJywgbG93ZXIsICdwb3MnKVxuXHRcdFx0KSAvIDI7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHtsZWZ0OiBsZWZ0LCByaWdodDogcmlnaHR9O1xufVxuXG5mdW5jdGlvbiB0aWNrc0Zyb21UaW1lc3RhbXBzKHZhbHVlcywgbWFqb3JVbml0KSB7XG5cdHZhciB0aWNrcyA9IFtdO1xuXHR2YXIgaSwgaWxlbiwgdmFsdWUsIG1ham9yO1xuXG5cdGZvciAoaSA9IDAsIGlsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0dmFsdWUgPSB2YWx1ZXNbaV07XG5cdFx0bWFqb3IgPSBtYWpvclVuaXQgPyB2YWx1ZSA9PT0gK21vbWVudCh2YWx1ZSkuc3RhcnRPZihtYWpvclVuaXQpIDogZmFsc2U7XG5cblx0XHR0aWNrcy5wdXNoKHtcblx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdG1ham9yOiBtYWpvclxuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIHRpY2tzO1xufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVMYWJlbEZvcm1hdChkYXRhLCB0aW1lT3B0cykge1xuXHR2YXIgaSwgbW9tZW50RGF0ZSwgaGFzVGltZTtcblx0dmFyIGlsZW4gPSBkYXRhLmxlbmd0aDtcblxuXHQvLyBmaW5kIHRoZSBsYWJlbCB3aXRoIHRoZSBtb3N0IHBhcnRzIChtaWxsaXNlY29uZHMsIG1pbnV0ZXMsIGV0Yy4pXG5cdC8vIGZvcm1hdCBhbGwgbGFiZWxzIHdpdGggdGhlIHNhbWUgbGV2ZWwgb2YgZGV0YWlsIGFzIHRoZSBtb3N0IHNwZWNpZmljIGxhYmVsXG5cdGZvciAoaSA9IDA7IGkgPCBpbGVuOyBpKyspIHtcblx0XHRtb21lbnREYXRlID0gbW9tZW50aWZ5KGRhdGFbaV0sIHRpbWVPcHRzKTtcblx0XHRpZiAobW9tZW50RGF0ZS5taWxsaXNlY29uZCgpICE9PSAwKSB7XG5cdFx0XHRyZXR1cm4gJ01NTSBELCBZWVlZIGg6bW06c3MuU1NTIGEnO1xuXHRcdH1cblx0XHRpZiAobW9tZW50RGF0ZS5zZWNvbmQoKSAhPT0gMCB8fCBtb21lbnREYXRlLm1pbnV0ZSgpICE9PSAwIHx8IG1vbWVudERhdGUuaG91cigpICE9PSAwKSB7XG5cdFx0XHRoYXNUaW1lID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0aWYgKGhhc1RpbWUpIHtcblx0XHRyZXR1cm4gJ01NTSBELCBZWVlZIGg6bW06c3MgYSc7XG5cdH1cblx0cmV0dXJuICdNTU0gRCwgWVlZWSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG5cblx0dmFyIGRlZmF1bHRDb25maWcgPSB7XG5cdFx0cG9zaXRpb246ICdib3R0b20nLFxuXG5cdFx0LyoqXG5cdFx0ICogRGF0YSBkaXN0cmlidXRpb24gYWxvbmcgdGhlIHNjYWxlOlxuXHRcdCAqIC0gJ2xpbmVhcic6IGRhdGEgYXJlIHNwcmVhZCBhY2NvcmRpbmcgdG8gdGhlaXIgdGltZSAoZGlzdGFuY2VzIGNhbiB2YXJ5KSxcblx0XHQgKiAtICdzZXJpZXMnOiBkYXRhIGFyZSBzcHJlYWQgYXQgdGhlIHNhbWUgZGlzdGFuY2UgZnJvbSBlYWNoIG90aGVyLlxuXHRcdCAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvcHVsbC80NTA3XG5cdFx0ICogQHNpbmNlIDIuNy4wXG5cdFx0ICovXG5cdFx0ZGlzdHJpYnV0aW9uOiAnbGluZWFyJyxcblxuXHRcdC8qKlxuXHRcdCAqIFNjYWxlIGJvdW5kYXJ5IHN0cmF0ZWd5IChieXBhc3NlZCBieSBtaW4vbWF4IHRpbWUgb3B0aW9ucylcblx0XHQgKiAtIGBkYXRhYDogbWFrZSBzdXJlIGRhdGEgYXJlIGZ1bGx5IHZpc2libGUsIHRpY2tzIG91dHNpZGUgYXJlIHJlbW92ZWRcblx0XHQgKiAtIGB0aWNrc2A6IG1ha2Ugc3VyZSB0aWNrcyBhcmUgZnVsbHkgdmlzaWJsZSwgZGF0YSBvdXRzaWRlIGFyZSB0cnVuY2F0ZWRcblx0XHQgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL3B1bGwvNDU1NlxuXHRcdCAqIEBzaW5jZSAyLjcuMFxuXHRcdCAqL1xuXHRcdGJvdW5kczogJ2RhdGEnLFxuXG5cdFx0dGltZToge1xuXHRcdFx0cGFyc2VyOiBmYWxzZSwgLy8gZmFsc2UgPT0gYSBwYXR0ZXJuIHN0cmluZyBmcm9tIGh0dHA6Ly9tb21lbnRqcy5jb20vZG9jcy8jL3BhcnNpbmcvc3RyaW5nLWZvcm1hdC8gb3IgYSBjdXN0b20gY2FsbGJhY2sgdGhhdCBjb252ZXJ0cyBpdHMgYXJndW1lbnQgdG8gYSBtb21lbnRcblx0XHRcdGZvcm1hdDogZmFsc2UsIC8vIERFUFJFQ0FURUQgZmFsc2UgPT0gZGF0ZSBvYmplY3RzLCBtb21lbnQgb2JqZWN0LCBjYWxsYmFjayBvciBhIHBhdHRlcm4gc3RyaW5nIGZyb20gaHR0cDovL21vbWVudGpzLmNvbS9kb2NzLyMvcGFyc2luZy9zdHJpbmctZm9ybWF0L1xuXHRcdFx0dW5pdDogZmFsc2UsIC8vIGZhbHNlID09IGF1dG9tYXRpYyBvciBvdmVycmlkZSB3aXRoIHdlZWssIG1vbnRoLCB5ZWFyLCBldGMuXG5cdFx0XHRyb3VuZDogZmFsc2UsIC8vIG5vbmUsIG9yIG92ZXJyaWRlIHdpdGggd2VlaywgbW9udGgsIHllYXIsIGV0Yy5cblx0XHRcdGRpc3BsYXlGb3JtYXQ6IGZhbHNlLCAvLyBERVBSRUNBVEVEXG5cdFx0XHRpc29XZWVrZGF5OiBmYWxzZSwgLy8gb3ZlcnJpZGUgd2VlayBzdGFydCBkYXkgLSBzZWUgaHR0cDovL21vbWVudGpzLmNvbS9kb2NzLyMvZ2V0LXNldC9pc28td2Vla2RheS9cblx0XHRcdG1pblVuaXQ6ICdtaWxsaXNlY29uZCcsXG5cblx0XHRcdC8vIGRlZmF1bHRzIHRvIHVuaXQncyBjb3JyZXNwb25kaW5nIHVuaXRGb3JtYXQgYmVsb3cgb3Igb3ZlcnJpZGUgdXNpbmcgcGF0dGVybiBzdHJpbmcgZnJvbSBodHRwOi8vbW9tZW50anMuY29tL2RvY3MvIy9kaXNwbGF5aW5nL2Zvcm1hdC9cblx0XHRcdGRpc3BsYXlGb3JtYXRzOiB7XG5cdFx0XHRcdG1pbGxpc2Vjb25kOiAnaDptbTpzcy5TU1MgYScsIC8vIDExOjIwOjAxLjEyMyBBTSxcblx0XHRcdFx0c2Vjb25kOiAnaDptbTpzcyBhJywgLy8gMTE6MjA6MDEgQU1cblx0XHRcdFx0bWludXRlOiAnaDptbSBhJywgLy8gMTE6MjAgQU1cblx0XHRcdFx0aG91cjogJ2hBJywgLy8gNVBNXG5cdFx0XHRcdGRheTogJ01NTSBEJywgLy8gU2VwIDRcblx0XHRcdFx0d2VlazogJ2xsJywgLy8gV2VlayA0Niwgb3IgbWF5YmUgXCJbV11XVyAtIFlZWVlcIiA/XG5cdFx0XHRcdG1vbnRoOiAnTU1NIFlZWVknLCAvLyBTZXB0IDIwMTVcblx0XHRcdFx0cXVhcnRlcjogJ1tRXVEgLSBZWVlZJywgLy8gUTNcblx0XHRcdFx0eWVhcjogJ1lZWVknIC8vIDIwMTVcblx0XHRcdH0sXG5cdFx0fSxcblx0XHR0aWNrczoge1xuXHRcdFx0YXV0b1NraXA6IGZhbHNlLFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIFRpY2tzIGdlbmVyYXRpb24gaW5wdXQgdmFsdWVzOlxuXHRcdFx0ICogLSAnYXV0byc6IGdlbmVyYXRlcyBcIm9wdGltYWxcIiB0aWNrcyBiYXNlZCBvbiBzY2FsZSBzaXplIGFuZCB0aW1lIG9wdGlvbnMuXG5cdFx0XHQgKiAtICdkYXRhJzogZ2VuZXJhdGVzIHRpY2tzIGZyb20gZGF0YSAoaW5jbHVkaW5nIGxhYmVscyBmcm9tIGRhdGEge3R8eHx5fSBvYmplY3RzKS5cblx0XHRcdCAqIC0gJ2xhYmVscyc6IGdlbmVyYXRlcyB0aWNrcyBmcm9tIHVzZXIgZ2l2ZW4gYGRhdGEubGFiZWxzYCB2YWx1ZXMgT05MWS5cblx0XHRcdCAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvcHVsbC80NTA3XG5cdFx0XHQgKiBAc2luY2UgMi43LjBcblx0XHRcdCAqL1xuXHRcdFx0c291cmNlOiAnYXV0bycsXG5cblx0XHRcdG1ham9yOiB7XG5cdFx0XHRcdGVuYWJsZWQ6IGZhbHNlXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdHZhciBUaW1lU2NhbGUgPSBTY2FsZS5leHRlbmQoe1xuXHRcdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCFtb21lbnQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDaGFydC5qcyAtIE1vbWVudC5qcyBjb3VsZCBub3QgYmUgZm91bmQhIFlvdSBtdXN0IGluY2x1ZGUgaXQgYmVmb3JlIENoYXJ0LmpzIHRvIHVzZSB0aGUgdGltZSBzY2FsZS4gRG93bmxvYWQgYXQgaHR0cHM6Ly9tb21lbnRqcy5jb20nKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tZXJnZVRpY2tzT3B0aW9ucygpO1xuXG5cdFx0XHRTY2FsZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMpO1xuXHRcdH0sXG5cblx0XHR1cGRhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBvcHRpb25zID0gbWUub3B0aW9ucztcblxuXHRcdFx0Ly8gREVQUkVDQVRJT05TOiBvdXRwdXQgYSBtZXNzYWdlIG9ubHkgb25lIHRpbWUgcGVyIHVwZGF0ZVxuXHRcdFx0aWYgKG9wdGlvbnMudGltZSAmJiBvcHRpb25zLnRpbWUuZm9ybWF0KSB7XG5cdFx0XHRcdGNvbnNvbGUud2Fybignb3B0aW9ucy50aW1lLmZvcm1hdCBpcyBkZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBvcHRpb25zLnRpbWUucGFyc2VyLicpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gU2NhbGUucHJvdG90eXBlLnVwZGF0ZS5hcHBseShtZSwgYXJndW1lbnRzKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQWxsb3dzIGRhdGEgdG8gYmUgcmVmZXJlbmNlZCB2aWEgJ3QnIGF0dHJpYnV0ZVxuXHRcdCAqL1xuXHRcdGdldFJpZ2h0VmFsdWU6IGZ1bmN0aW9uKHJhd1ZhbHVlKSB7XG5cdFx0XHRpZiAocmF3VmFsdWUgJiYgcmF3VmFsdWUudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJhd1ZhbHVlID0gcmF3VmFsdWUudDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBTY2FsZS5wcm90b3R5cGUuZ2V0UmlnaHRWYWx1ZS5jYWxsKHRoaXMsIHJhd1ZhbHVlKTtcblx0XHR9LFxuXG5cdFx0ZGV0ZXJtaW5lRGF0YUxpbWl0czogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0XHR2YXIgdGltZU9wdHMgPSBtZS5vcHRpb25zLnRpbWU7XG5cdFx0XHR2YXIgdW5pdCA9IHRpbWVPcHRzLnVuaXQgfHwgJ2RheSc7XG5cdFx0XHR2YXIgbWluID0gTUFYX0lOVEVHRVI7XG5cdFx0XHR2YXIgbWF4ID0gTUlOX0lOVEVHRVI7XG5cdFx0XHR2YXIgdGltZXN0YW1wcyA9IFtdO1xuXHRcdFx0dmFyIGRhdGFzZXRzID0gW107XG5cdFx0XHR2YXIgbGFiZWxzID0gW107XG5cdFx0XHR2YXIgaSwgaiwgaWxlbiwgamxlbiwgZGF0YSwgdGltZXN0YW1wO1xuXG5cdFx0XHQvLyBDb252ZXJ0IGxhYmVscyB0byB0aW1lc3RhbXBzXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gY2hhcnQuZGF0YS5sYWJlbHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdGxhYmVscy5wdXNoKHBhcnNlKGNoYXJ0LmRhdGEubGFiZWxzW2ldLCBtZSkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IGRhdGEgdG8gdGltZXN0YW1wc1xuXHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IChjaGFydC5kYXRhLmRhdGFzZXRzIHx8IFtdKS5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0aWYgKGNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSkpIHtcblx0XHRcdFx0XHRkYXRhID0gY2hhcnQuZGF0YS5kYXRhc2V0c1tpXS5kYXRhO1xuXG5cdFx0XHRcdFx0Ly8gTGV0J3MgY29uc2lkZXIgdGhhdCBhbGwgZGF0YSBoYXZlIHRoZSBzYW1lIGZvcm1hdC5cblx0XHRcdFx0XHRpZiAoaGVscGVycy5pc09iamVjdChkYXRhWzBdKSkge1xuXHRcdFx0XHRcdFx0ZGF0YXNldHNbaV0gPSBbXTtcblxuXHRcdFx0XHRcdFx0Zm9yIChqID0gMCwgamxlbiA9IGRhdGEubGVuZ3RoOyBqIDwgamxlbjsgKytqKSB7XG5cdFx0XHRcdFx0XHRcdHRpbWVzdGFtcCA9IHBhcnNlKGRhdGFbal0sIG1lKTtcblx0XHRcdFx0XHRcdFx0dGltZXN0YW1wcy5wdXNoKHRpbWVzdGFtcCk7XG5cdFx0XHRcdFx0XHRcdGRhdGFzZXRzW2ldW2pdID0gdGltZXN0YW1wO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aW1lc3RhbXBzLnB1c2guYXBwbHkodGltZXN0YW1wcywgbGFiZWxzKTtcblx0XHRcdFx0XHRcdGRhdGFzZXRzW2ldID0gbGFiZWxzLnNsaWNlKDApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhc2V0c1tpXSA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChsYWJlbHMubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIFNvcnQgbGFiZWxzICoqYWZ0ZXIqKiBkYXRhIGhhdmUgYmVlbiBjb252ZXJ0ZWRcblx0XHRcdFx0bGFiZWxzID0gYXJyYXlVbmlxdWUobGFiZWxzKS5zb3J0KHNvcnRlcik7XG5cdFx0XHRcdG1pbiA9IE1hdGgubWluKG1pbiwgbGFiZWxzWzBdKTtcblx0XHRcdFx0bWF4ID0gTWF0aC5tYXgobWF4LCBsYWJlbHNbbGFiZWxzLmxlbmd0aCAtIDFdKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRpbWVzdGFtcHMubGVuZ3RoKSB7XG5cdFx0XHRcdHRpbWVzdGFtcHMgPSBhcnJheVVuaXF1ZSh0aW1lc3RhbXBzKS5zb3J0KHNvcnRlcik7XG5cdFx0XHRcdG1pbiA9IE1hdGgubWluKG1pbiwgdGltZXN0YW1wc1swXSk7XG5cdFx0XHRcdG1heCA9IE1hdGgubWF4KG1heCwgdGltZXN0YW1wc1t0aW1lc3RhbXBzLmxlbmd0aCAtIDFdKTtcblx0XHRcdH1cblxuXHRcdFx0bWluID0gcGFyc2UodGltZU9wdHMubWluLCBtZSkgfHwgbWluO1xuXHRcdFx0bWF4ID0gcGFyc2UodGltZU9wdHMubWF4LCBtZSkgfHwgbWF4O1xuXG5cdFx0XHQvLyBJbiBjYXNlIHRoZXJlIGlzIG5vIHZhbGlkIG1pbi9tYXgsIHNldCBsaW1pdHMgYmFzZWQgb24gdW5pdCB0aW1lIG9wdGlvblxuXHRcdFx0bWluID0gbWluID09PSBNQVhfSU5URUdFUiA/ICttb21lbnQoKS5zdGFydE9mKHVuaXQpIDogbWluO1xuXHRcdFx0bWF4ID0gbWF4ID09PSBNSU5fSU5URUdFUiA/ICttb21lbnQoKS5lbmRPZih1bml0KSArIDEgOiBtYXg7XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IG1heCBpcyBzdHJpY3RseSBoaWdoZXIgdGhhbiBtaW4gKHJlcXVpcmVkIGJ5IHRoZSBsb29rdXAgdGFibGUpXG5cdFx0XHRtZS5taW4gPSBNYXRoLm1pbihtaW4sIG1heCk7XG5cdFx0XHRtZS5tYXggPSBNYXRoLm1heChtaW4gKyAxLCBtYXgpO1xuXG5cdFx0XHQvLyBQUklWQVRFXG5cdFx0XHRtZS5faG9yaXpvbnRhbCA9IG1lLmlzSG9yaXpvbnRhbCgpO1xuXHRcdFx0bWUuX3RhYmxlID0gW107XG5cdFx0XHRtZS5fdGltZXN0YW1wcyA9IHtcblx0XHRcdFx0ZGF0YTogdGltZXN0YW1wcyxcblx0XHRcdFx0ZGF0YXNldHM6IGRhdGFzZXRzLFxuXHRcdFx0XHRsYWJlbHM6IGxhYmVsc1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0YnVpbGRUaWNrczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG1pbiA9IG1lLm1pbjtcblx0XHRcdHZhciBtYXggPSBtZS5tYXg7XG5cdFx0XHR2YXIgb3B0aW9ucyA9IG1lLm9wdGlvbnM7XG5cdFx0XHR2YXIgdGltZU9wdHMgPSBvcHRpb25zLnRpbWU7XG5cdFx0XHR2YXIgdGltZXN0YW1wcyA9IFtdO1xuXHRcdFx0dmFyIHRpY2tzID0gW107XG5cdFx0XHR2YXIgaSwgaWxlbiwgdGltZXN0YW1wO1xuXG5cdFx0XHRzd2l0Y2ggKG9wdGlvbnMudGlja3Muc291cmNlKSB7XG5cdFx0XHRjYXNlICdkYXRhJzpcblx0XHRcdFx0dGltZXN0YW1wcyA9IG1lLl90aW1lc3RhbXBzLmRhdGE7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbGFiZWxzJzpcblx0XHRcdFx0dGltZXN0YW1wcyA9IG1lLl90aW1lc3RhbXBzLmxhYmVscztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhdXRvJzpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRpbWVzdGFtcHMgPSBnZW5lcmF0ZShtaW4sIG1heCwgbWUuZ2V0TGFiZWxDYXBhY2l0eShtaW4pLCBvcHRpb25zKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9wdGlvbnMuYm91bmRzID09PSAndGlja3MnICYmIHRpbWVzdGFtcHMubGVuZ3RoKSB7XG5cdFx0XHRcdG1pbiA9IHRpbWVzdGFtcHNbMF07XG5cdFx0XHRcdG1heCA9IHRpbWVzdGFtcHNbdGltZXN0YW1wcy5sZW5ndGggLSAxXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRW5mb3JjZSBsaW1pdHMgd2l0aCB1c2VyIG1pbi9tYXggb3B0aW9uc1xuXHRcdFx0bWluID0gcGFyc2UodGltZU9wdHMubWluLCBtZSkgfHwgbWluO1xuXHRcdFx0bWF4ID0gcGFyc2UodGltZU9wdHMubWF4LCBtZSkgfHwgbWF4O1xuXG5cdFx0XHQvLyBSZW1vdmUgdGlja3Mgb3V0c2lkZSB0aGUgbWluL21heCByYW5nZVxuXHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IHRpbWVzdGFtcHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdHRpbWVzdGFtcCA9IHRpbWVzdGFtcHNbaV07XG5cdFx0XHRcdGlmICh0aW1lc3RhbXAgPj0gbWluICYmIHRpbWVzdGFtcCA8PSBtYXgpIHtcblx0XHRcdFx0XHR0aWNrcy5wdXNoKHRpbWVzdGFtcCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0bWUubWluID0gbWluO1xuXHRcdFx0bWUubWF4ID0gbWF4O1xuXG5cdFx0XHQvLyBQUklWQVRFXG5cdFx0XHRtZS5fdW5pdCA9IHRpbWVPcHRzLnVuaXQgfHwgZGV0ZXJtaW5lVW5pdEZvckZvcm1hdHRpbmcodGlja3MsIHRpbWVPcHRzLm1pblVuaXQsIG1lLm1pbiwgbWUubWF4KTtcblx0XHRcdG1lLl9tYWpvclVuaXQgPSBkZXRlcm1pbmVNYWpvclVuaXQobWUuX3VuaXQpO1xuXHRcdFx0bWUuX3RhYmxlID0gYnVpbGRMb29rdXBUYWJsZShtZS5fdGltZXN0YW1wcy5kYXRhLCBtaW4sIG1heCwgb3B0aW9ucy5kaXN0cmlidXRpb24pO1xuXHRcdFx0bWUuX29mZnNldHMgPSBjb21wdXRlT2Zmc2V0cyhtZS5fdGFibGUsIHRpY2tzLCBtaW4sIG1heCwgb3B0aW9ucyk7XG5cdFx0XHRtZS5fbGFiZWxGb3JtYXQgPSBkZXRlcm1pbmVMYWJlbEZvcm1hdChtZS5fdGltZXN0YW1wcy5kYXRhLCB0aW1lT3B0cyk7XG5cblx0XHRcdHJldHVybiB0aWNrc0Zyb21UaW1lc3RhbXBzKHRpY2tzLCBtZS5fbWFqb3JVbml0KTtcblx0XHR9LFxuXG5cdFx0Z2V0TGFiZWxGb3JJbmRleDogZnVuY3Rpb24oaW5kZXgsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBkYXRhID0gbWUuY2hhcnQuZGF0YTtcblx0XHRcdHZhciB0aW1lT3B0cyA9IG1lLm9wdGlvbnMudGltZTtcblx0XHRcdHZhciBsYWJlbCA9IGRhdGEubGFiZWxzICYmIGluZGV4IDwgZGF0YS5sYWJlbHMubGVuZ3RoID8gZGF0YS5sYWJlbHNbaW5kZXhdIDogJyc7XG5cdFx0XHR2YXIgdmFsdWUgPSBkYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0uZGF0YVtpbmRleF07XG5cblx0XHRcdGlmIChoZWxwZXJzLmlzT2JqZWN0KHZhbHVlKSkge1xuXHRcdFx0XHRsYWJlbCA9IG1lLmdldFJpZ2h0VmFsdWUodmFsdWUpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRpbWVPcHRzLnRvb2x0aXBGb3JtYXQpIHtcblx0XHRcdFx0cmV0dXJuIG1vbWVudGlmeShsYWJlbCwgdGltZU9wdHMpLmZvcm1hdCh0aW1lT3B0cy50b29sdGlwRm9ybWF0KTtcblx0XHRcdH1cblx0XHRcdGlmICh0eXBlb2YgbGFiZWwgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdHJldHVybiBsYWJlbDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1vbWVudGlmeShsYWJlbCwgdGltZU9wdHMpLmZvcm1hdChtZS5fbGFiZWxGb3JtYXQpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBGdW5jdGlvbiB0byBmb3JtYXQgYW4gaW5kaXZpZHVhbCB0aWNrIG1hcmtcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHRpY2tGb3JtYXRGdW5jdGlvbjogZnVuY3Rpb24odGljaywgaW5kZXgsIHRpY2tzLCBmb3JtYXRPdmVycmlkZSkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBvcHRpb25zID0gbWUub3B0aW9ucztcblx0XHRcdHZhciB0aW1lID0gdGljay52YWx1ZU9mKCk7XG5cdFx0XHR2YXIgZm9ybWF0cyA9IG9wdGlvbnMudGltZS5kaXNwbGF5Rm9ybWF0cztcblx0XHRcdHZhciBtaW5vckZvcm1hdCA9IGZvcm1hdHNbbWUuX3VuaXRdO1xuXHRcdFx0dmFyIG1ham9yVW5pdCA9IG1lLl9tYWpvclVuaXQ7XG5cdFx0XHR2YXIgbWFqb3JGb3JtYXQgPSBmb3JtYXRzW21ham9yVW5pdF07XG5cdFx0XHR2YXIgbWFqb3JUaW1lID0gdGljay5jbG9uZSgpLnN0YXJ0T2YobWFqb3JVbml0KS52YWx1ZU9mKCk7XG5cdFx0XHR2YXIgbWFqb3JUaWNrT3B0cyA9IG9wdGlvbnMudGlja3MubWFqb3I7XG5cdFx0XHR2YXIgbWFqb3IgPSBtYWpvclRpY2tPcHRzLmVuYWJsZWQgJiYgbWFqb3JVbml0ICYmIG1ham9yRm9ybWF0ICYmIHRpbWUgPT09IG1ham9yVGltZTtcblx0XHRcdHZhciBsYWJlbCA9IHRpY2suZm9ybWF0KGZvcm1hdE92ZXJyaWRlID8gZm9ybWF0T3ZlcnJpZGUgOiBtYWpvciA/IG1ham9yRm9ybWF0IDogbWlub3JGb3JtYXQpO1xuXHRcdFx0dmFyIHRpY2tPcHRzID0gbWFqb3IgPyBtYWpvclRpY2tPcHRzIDogb3B0aW9ucy50aWNrcy5taW5vcjtcblx0XHRcdHZhciBmb3JtYXR0ZXIgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLmNhbGxiYWNrLCB0aWNrT3B0cy51c2VyQ2FsbGJhY2spO1xuXG5cdFx0XHRyZXR1cm4gZm9ybWF0dGVyID8gZm9ybWF0dGVyKGxhYmVsLCBpbmRleCwgdGlja3MpIDogbGFiZWw7XG5cdFx0fSxcblxuXHRcdGNvbnZlcnRUaWNrc1RvTGFiZWxzOiBmdW5jdGlvbih0aWNrcykge1xuXHRcdFx0dmFyIGxhYmVscyA9IFtdO1xuXHRcdFx0dmFyIGksIGlsZW47XG5cblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSB0aWNrcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0bGFiZWxzLnB1c2godGhpcy50aWNrRm9ybWF0RnVuY3Rpb24obW9tZW50KHRpY2tzW2ldLnZhbHVlKSwgaSwgdGlja3MpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGxhYmVscztcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRnZXRQaXhlbEZvck9mZnNldDogZnVuY3Rpb24odGltZSkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBzaXplID0gbWUuX2hvcml6b250YWwgPyBtZS53aWR0aCA6IG1lLmhlaWdodDtcblx0XHRcdHZhciBzdGFydCA9IG1lLl9ob3Jpem9udGFsID8gbWUubGVmdCA6IG1lLnRvcDtcblx0XHRcdHZhciBwb3MgPSBpbnRlcnBvbGF0ZShtZS5fdGFibGUsICd0aW1lJywgdGltZSwgJ3BvcycpO1xuXG5cdFx0XHRyZXR1cm4gc3RhcnQgKyBzaXplICogKG1lLl9vZmZzZXRzLmxlZnQgKyBwb3MpIC8gKG1lLl9vZmZzZXRzLmxlZnQgKyAxICsgbWUuX29mZnNldHMucmlnaHQpO1xuXHRcdH0sXG5cblx0XHRnZXRQaXhlbEZvclZhbHVlOiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciB0aW1lID0gbnVsbDtcblxuXHRcdFx0aWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgZGF0YXNldEluZGV4ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGltZSA9IG1lLl90aW1lc3RhbXBzLmRhdGFzZXRzW2RhdGFzZXRJbmRleF1baW5kZXhdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGltZSA9PT0gbnVsbCkge1xuXHRcdFx0XHR0aW1lID0gcGFyc2UodmFsdWUsIG1lKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRpbWUgIT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIG1lLmdldFBpeGVsRm9yT2Zmc2V0KHRpbWUpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRnZXRQaXhlbEZvclRpY2s6IGZ1bmN0aW9uKGluZGV4KSB7XG5cdFx0XHR2YXIgdGlja3MgPSB0aGlzLmdldFRpY2tzKCk7XG5cdFx0XHRyZXR1cm4gaW5kZXggPj0gMCAmJiBpbmRleCA8IHRpY2tzLmxlbmd0aCA/XG5cdFx0XHRcdHRoaXMuZ2V0UGl4ZWxGb3JPZmZzZXQodGlja3NbaW5kZXhdLnZhbHVlKSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0fSxcblxuXHRcdGdldFZhbHVlRm9yUGl4ZWw6IGZ1bmN0aW9uKHBpeGVsKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIHNpemUgPSBtZS5faG9yaXpvbnRhbCA/IG1lLndpZHRoIDogbWUuaGVpZ2h0O1xuXHRcdFx0dmFyIHN0YXJ0ID0gbWUuX2hvcml6b250YWwgPyBtZS5sZWZ0IDogbWUudG9wO1xuXHRcdFx0dmFyIHBvcyA9IChzaXplID8gKHBpeGVsIC0gc3RhcnQpIC8gc2l6ZSA6IDApICogKG1lLl9vZmZzZXRzLmxlZnQgKyAxICsgbWUuX29mZnNldHMubGVmdCkgLSBtZS5fb2Zmc2V0cy5yaWdodDtcblx0XHRcdHZhciB0aW1lID0gaW50ZXJwb2xhdGUobWUuX3RhYmxlLCAncG9zJywgcG9zLCAndGltZScpO1xuXG5cdFx0XHRyZXR1cm4gbW9tZW50KHRpbWUpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBDcnVkZSBhcHByb3hpbWF0aW9uIG9mIHdoYXQgdGhlIGxhYmVsIHdpZHRoIG1pZ2h0IGJlXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRnZXRMYWJlbFdpZHRoOiBmdW5jdGlvbihsYWJlbCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciB0aWNrc09wdHMgPSBtZS5vcHRpb25zLnRpY2tzO1xuXHRcdFx0dmFyIHRpY2tMYWJlbFdpZHRoID0gbWUuY3R4Lm1lYXN1cmVUZXh0KGxhYmVsKS53aWR0aDtcblx0XHRcdHZhciBhbmdsZSA9IGhlbHBlcnMudG9SYWRpYW5zKHRpY2tzT3B0cy5tYXhSb3RhdGlvbik7XG5cdFx0XHR2YXIgY29zUm90YXRpb24gPSBNYXRoLmNvcyhhbmdsZSk7XG5cdFx0XHR2YXIgc2luUm90YXRpb24gPSBNYXRoLnNpbihhbmdsZSk7XG5cdFx0XHR2YXIgdGlja0ZvbnRTaXplID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdCh0aWNrc09wdHMuZm9udFNpemUsIGRlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Rm9udFNpemUpO1xuXG5cdFx0XHRyZXR1cm4gKHRpY2tMYWJlbFdpZHRoICogY29zUm90YXRpb24pICsgKHRpY2tGb250U2l6ZSAqIHNpblJvdGF0aW9uKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRnZXRMYWJlbENhcGFjaXR5OiBmdW5jdGlvbihleGFtcGxlVGltZSkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblxuXHRcdFx0dmFyIGZvcm1hdE92ZXJyaWRlID0gbWUub3B0aW9ucy50aW1lLmRpc3BsYXlGb3JtYXRzLm1pbGxpc2Vjb25kO1x0Ly8gUGljayB0aGUgbG9uZ2VzdCBmb3JtYXQgZm9yIGd1ZXN0aW1hdGlvblxuXG5cdFx0XHR2YXIgZXhhbXBsZUxhYmVsID0gbWUudGlja0Zvcm1hdEZ1bmN0aW9uKG1vbWVudChleGFtcGxlVGltZSksIDAsIFtdLCBmb3JtYXRPdmVycmlkZSk7XG5cdFx0XHR2YXIgdGlja0xhYmVsV2lkdGggPSBtZS5nZXRMYWJlbFdpZHRoKGV4YW1wbGVMYWJlbCk7XG5cdFx0XHR2YXIgaW5uZXJXaWR0aCA9IG1lLmlzSG9yaXpvbnRhbCgpID8gbWUud2lkdGggOiBtZS5oZWlnaHQ7XG5cblx0XHRcdHZhciBjYXBhY2l0eSA9IE1hdGguZmxvb3IoaW5uZXJXaWR0aCAvIHRpY2tMYWJlbFdpZHRoKTtcblx0XHRcdHJldHVybiBjYXBhY2l0eSA+IDAgPyBjYXBhY2l0eSA6IDE7XG5cdFx0fVxuXHR9KTtcblxuXHRzY2FsZVNlcnZpY2UucmVnaXN0ZXJTY2FsZVR5cGUoJ3RpbWUnLCBUaW1lU2NhbGUsIGRlZmF1bHRDb25maWcpO1xufTtcblxufSx7XCIxXCI6MSxcIjI2XCI6MjYsXCIzM1wiOjMzLFwiMzRcIjozNCxcIjQ2XCI6NDZ9XX0se30sWzddKSg3KVxufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvQ2hhcnQuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7\n");
|
|
|
|
/***/ })
|
|
|
|
/******/ }); |