UNPKG

@ericblade/quagga2

Version:

An advanced barcode-scanner written in JavaScript

14,335 lines 1.58 MB
(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory();
	else if(typeof define === 'function' && define.amd)
		define([], factory);
	else if(typeof exports === 'object')
		exports["Quagga"] = factory();
	else
		root["Quagga"] = factory();
})(window, function() {
return /******/ (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, { enumerable: true, get: getter });
/******/ 		}
/******/ 	};
/******/
/******/ 	// define __esModule on exports
/******/ 	__webpack_require__.r = function(exports) {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/
/******/ 	// create a fake namespace object
/******/ 	// mode & 1: value is a module id, require it
/******/ 	// mode & 2: merge all properties of value into the ns
/******/ 	// mode & 4: return value when already ns object
/******/ 	// mode & 8|1: behave like require
/******/ 	__webpack_require__.t = function(value, mode) {
/******/ 		if(mode & 1) value = __webpack_require__(value);
/******/ 		if(mode & 8) return value;
/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ 		var ns = Object.create(null);
/******/ 		__webpack_require__.r(ns);
/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ 		return ns;
/******/ 	};
/******/
/******/ 	// 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 = 72);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {

function _defineProperty(obj, key, value) {
  if (key in obj) {
    Object.defineProperty(obj, key, {
      value: value,
      enumerable: true,
      configurable: true,
      writable: true
    });
  } else {
    obj[key] = value;
  }
  return obj;
}
module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 1 */
/***/ (function(module, exports) {

function _assertThisInitialized(self) {
  if (self === void 0) {
    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
  }
  return self;
}
module.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 2 */
/***/ (function(module, exports) {

function _getPrototypeOf(o) {
  module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {
    return o.__proto__ || Object.getPrototypeOf(o);
  }, module.exports.__esModule = true, module.exports["default"] = module.exports;
  return _getPrototypeOf(o);
}
module.exports = _getPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 3 */
/***/ (function(module, exports) {

function _classCallCheck(instance, Constructor) {
  if (!(instance instanceof Constructor)) {
    throw new TypeError("Cannot call a class as a function");
  }
}
module.exports = _classCallCheck, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 4 */
/***/ (function(module, exports) {

function _defineProperties(target, props) {
  for (var i = 0; i < props.length; i++) {
    var descriptor = props[i];
    descriptor.enumerable = descriptor.enumerable || false;
    descriptor.configurable = true;
    if ("value" in descriptor) descriptor.writable = true;
    Object.defineProperty(target, descriptor.key, descriptor);
  }
}
function _createClass(Constructor, protoProps, staticProps) {
  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
  if (staticProps) _defineProperties(Constructor, staticProps);
  Object.defineProperty(Constructor, "prototype", {
    writable: false
  });
  return Constructor;
}
module.exports = _createClass, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 5 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";

// EXPORTS
__webpack_require__.d(__webpack_exports__, "a", function() { return /* reexport */ common_namespaceObject; });
__webpack_require__.d(__webpack_exports__, "b", function() { return /* reexport */ mat2_namespaceObject; });
__webpack_require__.d(__webpack_exports__, "c", function() { return /* reexport */ vec2_namespaceObject; });
__webpack_require__.d(__webpack_exports__, "d", function() { return /* reexport */ vec3_namespaceObject; });

// UNUSED EXPORTS: mat2d, mat3, mat4, quat, quat2, vec4

// NAMESPACE OBJECT: ./node_modules/gl-matrix/esm/common.js
var common_namespaceObject = {};
__webpack_require__.r(common_namespaceObject);
__webpack_require__.d(common_namespaceObject, "EPSILON", function() { return EPSILON; });
__webpack_require__.d(common_namespaceObject, "ARRAY_TYPE", function() { return ARRAY_TYPE; });
__webpack_require__.d(common_namespaceObject, "RANDOM", function() { return RANDOM; });
__webpack_require__.d(common_namespaceObject, "setMatrixArrayType", function() { return setMatrixArrayType; });
__webpack_require__.d(common_namespaceObject, "toRadian", function() { return toRadian; });
__webpack_require__.d(common_namespaceObject, "equals", function() { return equals; });

// NAMESPACE OBJECT: ./node_modules/gl-matrix/esm/mat2.js
var mat2_namespaceObject = {};
__webpack_require__.r(mat2_namespaceObject);
__webpack_require__.d(mat2_namespaceObject, "create", function() { return create; });
__webpack_require__.d(mat2_namespaceObject, "clone", function() { return clone; });
__webpack_require__.d(mat2_namespaceObject, "copy", function() { return copy; });
__webpack_require__.d(mat2_namespaceObject, "identity", function() { return identity; });
__webpack_require__.d(mat2_namespaceObject, "fromValues", function() { return fromValues; });
__webpack_require__.d(mat2_namespaceObject, "set", function() { return set; });
__webpack_require__.d(mat2_namespaceObject, "transpose", function() { return transpose; });
__webpack_require__.d(mat2_namespaceObject, "invert", function() { return invert; });
__webpack_require__.d(mat2_namespaceObject, "adjoint", function() { return adjoint; });
__webpack_require__.d(mat2_namespaceObject, "determinant", function() { return determinant; });
__webpack_require__.d(mat2_namespaceObject, "multiply", function() { return multiply; });
__webpack_require__.d(mat2_namespaceObject, "rotate", function() { return rotate; });
__webpack_require__.d(mat2_namespaceObject, "scale", function() { return mat2_scale; });
__webpack_require__.d(mat2_namespaceObject, "fromRotation", function() { return fromRotation; });
__webpack_require__.d(mat2_namespaceObject, "fromScaling", function() { return fromScaling; });
__webpack_require__.d(mat2_namespaceObject, "str", function() { return str; });
__webpack_require__.d(mat2_namespaceObject, "frob", function() { return frob; });
__webpack_require__.d(mat2_namespaceObject, "LDU", function() { return LDU; });
__webpack_require__.d(mat2_namespaceObject, "add", function() { return add; });
__webpack_require__.d(mat2_namespaceObject, "subtract", function() { return subtract; });
__webpack_require__.d(mat2_namespaceObject, "exactEquals", function() { return exactEquals; });
__webpack_require__.d(mat2_namespaceObject, "equals", function() { return mat2_equals; });
__webpack_require__.d(mat2_namespaceObject, "multiplyScalar", function() { return multiplyScalar; });
__webpack_require__.d(mat2_namespaceObject, "multiplyScalarAndAdd", function() { return multiplyScalarAndAdd; });
__webpack_require__.d(mat2_namespaceObject, "mul", function() { return mul; });
__webpack_require__.d(mat2_namespaceObject, "sub", function() { return sub; });

// NAMESPACE OBJECT: ./node_modules/gl-matrix/esm/vec2.js
var vec2_namespaceObject = {};
__webpack_require__.r(vec2_namespaceObject);
__webpack_require__.d(vec2_namespaceObject, "create", function() { return vec2_create; });
__webpack_require__.d(vec2_namespaceObject, "clone", function() { return vec2_clone; });
__webpack_require__.d(vec2_namespaceObject, "fromValues", function() { return vec2_fromValues; });
__webpack_require__.d(vec2_namespaceObject, "copy", function() { return vec2_copy; });
__webpack_require__.d(vec2_namespaceObject, "set", function() { return vec2_set; });
__webpack_require__.d(vec2_namespaceObject, "add", function() { return vec2_add; });
__webpack_require__.d(vec2_namespaceObject, "subtract", function() { return vec2_subtract; });
__webpack_require__.d(vec2_namespaceObject, "multiply", function() { return vec2_multiply; });
__webpack_require__.d(vec2_namespaceObject, "divide", function() { return divide; });
__webpack_require__.d(vec2_namespaceObject, "ceil", function() { return ceil; });
__webpack_require__.d(vec2_namespaceObject, "floor", function() { return floor; });
__webpack_require__.d(vec2_namespaceObject, "min", function() { return min; });
__webpack_require__.d(vec2_namespaceObject, "max", function() { return max; });
__webpack_require__.d(vec2_namespaceObject, "round", function() { return round; });
__webpack_require__.d(vec2_namespaceObject, "scale", function() { return vec2_scale; });
__webpack_require__.d(vec2_namespaceObject, "scaleAndAdd", function() { return scaleAndAdd; });
__webpack_require__.d(vec2_namespaceObject, "distance", function() { return distance; });
__webpack_require__.d(vec2_namespaceObject, "squaredDistance", function() { return squaredDistance; });
__webpack_require__.d(vec2_namespaceObject, "length", function() { return vec2_length; });
__webpack_require__.d(vec2_namespaceObject, "squaredLength", function() { return squaredLength; });
__webpack_require__.d(vec2_namespaceObject, "negate", function() { return negate; });
__webpack_require__.d(vec2_namespaceObject, "inverse", function() { return inverse; });
__webpack_require__.d(vec2_namespaceObject, "normalize", function() { return normalize; });
__webpack_require__.d(vec2_namespaceObject, "dot", function() { return dot; });
__webpack_require__.d(vec2_namespaceObject, "cross", function() { return cross; });
__webpack_require__.d(vec2_namespaceObject, "lerp", function() { return lerp; });
__webpack_require__.d(vec2_namespaceObject, "random", function() { return random; });
__webpack_require__.d(vec2_namespaceObject, "transformMat2", function() { return transformMat2; });
__webpack_require__.d(vec2_namespaceObject, "transformMat2d", function() { return transformMat2d; });
__webpack_require__.d(vec2_namespaceObject, "transformMat3", function() { return transformMat3; });
__webpack_require__.d(vec2_namespaceObject, "transformMat4", function() { return transformMat4; });
__webpack_require__.d(vec2_namespaceObject, "rotate", function() { return vec2_rotate; });
__webpack_require__.d(vec2_namespaceObject, "angle", function() { return angle; });
__webpack_require__.d(vec2_namespaceObject, "zero", function() { return zero; });
__webpack_require__.d(vec2_namespaceObject, "str", function() { return vec2_str; });
__webpack_require__.d(vec2_namespaceObject, "exactEquals", function() { return vec2_exactEquals; });
__webpack_require__.d(vec2_namespaceObject, "equals", function() { return vec2_equals; });
__webpack_require__.d(vec2_namespaceObject, "len", function() { return len; });
__webpack_require__.d(vec2_namespaceObject, "sub", function() { return vec2_sub; });
__webpack_require__.d(vec2_namespaceObject, "mul", function() { return vec2_mul; });
__webpack_require__.d(vec2_namespaceObject, "div", function() { return div; });
__webpack_require__.d(vec2_namespaceObject, "dist", function() { return dist; });
__webpack_require__.d(vec2_namespaceObject, "sqrDist", function() { return sqrDist; });
__webpack_require__.d(vec2_namespaceObject, "sqrLen", function() { return sqrLen; });
__webpack_require__.d(vec2_namespaceObject, "forEach", function() { return forEach; });

// NAMESPACE OBJECT: ./node_modules/gl-matrix/esm/vec3.js
var vec3_namespaceObject = {};
__webpack_require__.r(vec3_namespaceObject);
__webpack_require__.d(vec3_namespaceObject, "create", function() { return vec3_create; });
__webpack_require__.d(vec3_namespaceObject, "clone", function() { return vec3_clone; });
__webpack_require__.d(vec3_namespaceObject, "length", function() { return vec3_length; });
__webpack_require__.d(vec3_namespaceObject, "fromValues", function() { return vec3_fromValues; });
__webpack_require__.d(vec3_namespaceObject, "copy", function() { return vec3_copy; });
__webpack_require__.d(vec3_namespaceObject, "set", function() { return vec3_set; });
__webpack_require__.d(vec3_namespaceObject, "add", function() { return vec3_add; });
__webpack_require__.d(vec3_namespaceObject, "subtract", function() { return vec3_subtract; });
__webpack_require__.d(vec3_namespaceObject, "multiply", function() { return vec3_multiply; });
__webpack_require__.d(vec3_namespaceObject, "divide", function() { return vec3_divide; });
__webpack_require__.d(vec3_namespaceObject, "ceil", function() { return vec3_ceil; });
__webpack_require__.d(vec3_namespaceObject, "floor", function() { return vec3_floor; });
__webpack_require__.d(vec3_namespaceObject, "min", function() { return vec3_min; });
__webpack_require__.d(vec3_namespaceObject, "max", function() { return vec3_max; });
__webpack_require__.d(vec3_namespaceObject, "round", function() { return vec3_round; });
__webpack_require__.d(vec3_namespaceObject, "scale", function() { return vec3_scale; });
__webpack_require__.d(vec3_namespaceObject, "scaleAndAdd", function() { return vec3_scaleAndAdd; });
__webpack_require__.d(vec3_namespaceObject, "distance", function() { return vec3_distance; });
__webpack_require__.d(vec3_namespaceObject, "squaredDistance", function() { return vec3_squaredDistance; });
__webpack_require__.d(vec3_namespaceObject, "squaredLength", function() { return vec3_squaredLength; });
__webpack_require__.d(vec3_namespaceObject, "negate", function() { return vec3_negate; });
__webpack_require__.d(vec3_namespaceObject, "inverse", function() { return vec3_inverse; });
__webpack_require__.d(vec3_namespaceObject, "normalize", function() { return vec3_normalize; });
__webpack_require__.d(vec3_namespaceObject, "dot", function() { return vec3_dot; });
__webpack_require__.d(vec3_namespaceObject, "cross", function() { return vec3_cross; });
__webpack_require__.d(vec3_namespaceObject, "lerp", function() { return vec3_lerp; });
__webpack_require__.d(vec3_namespaceObject, "hermite", function() { return hermite; });
__webpack_require__.d(vec3_namespaceObject, "bezier", function() { return bezier; });
__webpack_require__.d(vec3_namespaceObject, "random", function() { return vec3_random; });
__webpack_require__.d(vec3_namespaceObject, "transformMat4", function() { return vec3_transformMat4; });
__webpack_require__.d(vec3_namespaceObject, "transformMat3", function() { return vec3_transformMat3; });
__webpack_require__.d(vec3_namespaceObject, "transformQuat", function() { return transformQuat; });
__webpack_require__.d(vec3_namespaceObject, "rotateX", function() { return rotateX; });
__webpack_require__.d(vec3_namespaceObject, "rotateY", function() { return rotateY; });
__webpack_require__.d(vec3_namespaceObject, "rotateZ", function() { return rotateZ; });
__webpack_require__.d(vec3_namespaceObject, "angle", function() { return vec3_angle; });
__webpack_require__.d(vec3_namespaceObject, "zero", function() { return vec3_zero; });
__webpack_require__.d(vec3_namespaceObject, "str", function() { return vec3_str; });
__webpack_require__.d(vec3_namespaceObject, "exactEquals", function() { return vec3_exactEquals; });
__webpack_require__.d(vec3_namespaceObject, "equals", function() { return vec3_equals; });
__webpack_require__.d(vec3_namespaceObject, "sub", function() { return vec3_sub; });
__webpack_require__.d(vec3_namespaceObject, "mul", function() { return vec3_mul; });
__webpack_require__.d(vec3_namespaceObject, "div", function() { return vec3_div; });
__webpack_require__.d(vec3_namespaceObject, "dist", function() { return vec3_dist; });
__webpack_require__.d(vec3_namespaceObject, "sqrDist", function() { return vec3_sqrDist; });
__webpack_require__.d(vec3_namespaceObject, "len", function() { return vec3_len; });
__webpack_require__.d(vec3_namespaceObject, "sqrLen", function() { return vec3_sqrLen; });
__webpack_require__.d(vec3_namespaceObject, "forEach", function() { return vec3_forEach; });

// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/common.js
/**
 * Common utilities
 * @module glMatrix
 */
// Configuration Constants
var EPSILON = 0.000001;
var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;
var RANDOM = Math.random;
/**
 * Sets the type of array used when creating new vectors and matrices
 *
 * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array
 */

function setMatrixArrayType(type) {
  ARRAY_TYPE = type;
}
var degree = Math.PI / 180;
/**
 * Convert Degree To Radian
 *
 * @param {Number} a Angle in Degrees
 */

function toRadian(a) {
  return a * degree;
}
/**
 * Tests whether or not the arguments have approximately the same value, within an absolute
 * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less
 * than or equal to 1.0, and a relative tolerance is used for larger values)
 *
 * @param {Number} a The first number to test.
 * @param {Number} b The second number to test.
 * @returns {Boolean} True if the numbers are approximately equal, false otherwise.
 */

function equals(a, b) {
  return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));
}
if (!Math.hypot) Math.hypot = function () {
  var y = 0,
    i = arguments.length;
  while (i--) {
    y += arguments[i] * arguments[i];
  }
  return Math.sqrt(y);
};
// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/mat2.js

/**
 * 2x2 Matrix
 * @module mat2
 */

/**
 * Creates a new identity mat2
 *
 * @returns {mat2} a new 2x2 matrix
 */

function create() {
  var out = new ARRAY_TYPE(4);
  if (ARRAY_TYPE != Float32Array) {
    out[1] = 0;
    out[2] = 0;
  }
  out[0] = 1;
  out[3] = 1;
  return out;
}
/**
 * Creates a new mat2 initialized with values from an existing matrix
 *
 * @param {ReadonlyMat2} a matrix to clone
 * @returns {mat2} a new 2x2 matrix
 */

function clone(a) {
  var out = new ARRAY_TYPE(4);
  out[0] = a[0];
  out[1] = a[1];
  out[2] = a[2];
  out[3] = a[3];
  return out;
}
/**
 * Copy the values from one mat2 to another
 *
 * @param {mat2} out the receiving matrix
 * @param {ReadonlyMat2} a the source matrix
 * @returns {mat2} out
 */

function copy(out, a) {
  out[0] = a[0];
  out[1] = a[1];
  out[2] = a[2];
  out[3] = a[3];
  return out;
}
/**
 * Set a mat2 to the identity matrix
 *
 * @param {mat2} out the receiving matrix
 * @returns {mat2} out
 */

function identity(out) {
  out[0] = 1;
  out[1] = 0;
  out[2] = 0;
  out[3] = 1;
  return out;
}
/**
 * Create a new mat2 with the given values
 *
 * @param {Number} m00 Component in column 0, row 0 position (index 0)
 * @param {Number} m01 Component in column 0, row 1 position (index 1)
 * @param {Number} m10 Component in column 1, row 0 position (index 2)
 * @param {Number} m11 Component in column 1, row 1 position (index 3)
 * @returns {mat2} out A new 2x2 matrix
 */

function fromValues(m00, m01, m10, m11) {
  var out = new ARRAY_TYPE(4);
  out[0] = m00;
  out[1] = m01;
  out[2] = m10;
  out[3] = m11;
  return out;
}
/**
 * Set the components of a mat2 to the given values
 *
 * @param {mat2} out the receiving matrix
 * @param {Number} m00 Component in column 0, row 0 position (index 0)
 * @param {Number} m01 Component in column 0, row 1 position (index 1)
 * @param {Number} m10 Component in column 1, row 0 position (index 2)
 * @param {Number} m11 Component in column 1, row 1 position (index 3)
 * @returns {mat2} out
 */

function set(out, m00, m01, m10, m11) {
  out[0] = m00;
  out[1] = m01;
  out[2] = m10;
  out[3] = m11;
  return out;
}
/**
 * Transpose the values of a mat2
 *
 * @param {mat2} out the receiving matrix
 * @param {ReadonlyMat2} a the source matrix
 * @returns {mat2} out
 */

function transpose(out, a) {
  // If we are transposing ourselves we can skip a few steps but have to cache
  // some values
  if (out === a) {
    var a1 = a[1];
    out[1] = a[2];
    out[2] = a1;
  } else {
    out[0] = a[0];
    out[1] = a[2];
    out[2] = a[1];
    out[3] = a[3];
  }
  return out;
}
/**
 * Inverts a mat2
 *
 * @param {mat2} out the receiving matrix
 * @param {ReadonlyMat2} a the source matrix
 * @returns {mat2} out
 */

function invert(out, a) {
  var a0 = a[0],
    a1 = a[1],
    a2 = a[2],
    a3 = a[3]; // Calculate the determinant

  var det = a0 * a3 - a2 * a1;
  if (!det) {
    return null;
  }
  det = 1.0 / det;
  out[0] = a3 * det;
  out[1] = -a1 * det;
  out[2] = -a2 * det;
  out[3] = a0 * det;
  return out;
}
/**
 * Calculates the adjugate of a mat2
 *
 * @param {mat2} out the receiving matrix
 * @param {ReadonlyMat2} a the source matrix
 * @returns {mat2} out
 */

function adjoint(out, a) {
  // Caching this value is nessecary if out == a
  var a0 = a[0];
  out[0] = a[3];
  out[1] = -a[1];
  out[2] = -a[2];
  out[3] = a0;
  return out;
}
/**
 * Calculates the determinant of a mat2
 *
 * @param {ReadonlyMat2} a the source matrix
 * @returns {Number} determinant of a
 */

function determinant(a) {
  return a[0] * a[3] - a[2] * a[1];
}
/**
 * Multiplies two mat2's
 *
 * @param {mat2} out the receiving matrix
 * @param {ReadonlyMat2} a the first operand
 * @param {ReadonlyMat2} b the second operand
 * @returns {mat2} out
 */

function multiply(out, a, b) {
  var a0 = a[0],
    a1 = a[1],
    a2 = a[2],
    a3 = a[3];
  var b0 = b[0],
    b1 = b[1],
    b2 = b[2],
    b3 = b[3];
  out[0] = a0 * b0 + a2 * b1;
  out[1] = a1 * b0 + a3 * b1;
  out[2] = a0 * b2 + a2 * b3;
  out[3] = a1 * b2 + a3 * b3;
  return out;
}
/**
 * Rotates a mat2 by the given angle
 *
 * @param {mat2} out the receiving matrix
 * @param {ReadonlyMat2} a the matrix to rotate
 * @param {Number} rad the angle to rotate the matrix by
 * @returns {mat2} out
 */

function rotate(out, a, rad) {
  var a0 = a[0],
    a1 = a[1],
    a2 = a[2],
    a3 = a[3];
  var s = Math.sin(rad);
  var c = Math.cos(rad);
  out[0] = a0 * c + a2 * s;
  out[1] = a1 * c + a3 * s;
  out[2] = a0 * -s + a2 * c;
  out[3] = a1 * -s + a3 * c;
  return out;
}
/**
 * Scales the mat2 by the dimensions in the given vec2
 *
 * @param {mat2} out the receiving matrix
 * @param {ReadonlyMat2} a the matrix to rotate
 * @param {ReadonlyVec2} v the vec2 to scale the matrix by
 * @returns {mat2} out
 **/

function mat2_scale(out, a, v) {
  var a0 = a[0],
    a1 = a[1],
    a2 = a[2],
    a3 = a[3];
  var v0 = v[0],
    v1 = v[1];
  out[0] = a0 * v0;
  out[1] = a1 * v0;
  out[2] = a2 * v1;
  out[3] = a3 * v1;
  return out;
}
/**
 * Creates a matrix from a given angle
 * This is equivalent to (but much faster than):
 *
 *     mat2.identity(dest);
 *     mat2.rotate(dest, dest, rad);
 *
 * @param {mat2} out mat2 receiving operation result
 * @param {Number} rad the angle to rotate the matrix by
 * @returns {mat2} out
 */

function fromRotation(out, rad) {
  var s = Math.sin(rad);
  var c = Math.cos(rad);
  out[0] = c;
  out[1] = s;
  out[2] = -s;
  out[3] = c;
  return out;
}
/**
 * Creates a matrix from a vector scaling
 * This is equivalent to (but much faster than):
 *
 *     mat2.identity(dest);
 *     mat2.scale(dest, dest, vec);
 *
 * @param {mat2} out mat2 receiving operation result
 * @param {ReadonlyVec2} v Scaling vector
 * @returns {mat2} out
 */

function fromScaling(out, v) {
  out[0] = v[0];
  out[1] = 0;
  out[2] = 0;
  out[3] = v[1];
  return out;
}
/**
 * Returns a string representation of a mat2
 *
 * @param {ReadonlyMat2} a matrix to represent as a string
 * @returns {String} string representation of the matrix
 */

function str(a) {
  return "mat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")";
}
/**
 * Returns Frobenius norm of a mat2
 *
 * @param {ReadonlyMat2} a the matrix to calculate Frobenius norm of
 * @returns {Number} Frobenius norm
 */

function frob(a) {
  return Math.hypot(a[0], a[1], a[2], a[3]);
}
/**
 * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix
 * @param {ReadonlyMat2} L the lower triangular matrix
 * @param {ReadonlyMat2} D the diagonal matrix
 * @param {ReadonlyMat2} U the upper triangular matrix
 * @param {ReadonlyMat2} a the input matrix to factorize
 */

function LDU(L, D, U, a) {
  L[2] = a[2] / a[0];
  U[0] = a[0];
  U[1] = a[1];
  U[3] = a[3] - L[2] * U[1];
  return [L, D, U];
}
/**
 * Adds two mat2's
 *
 * @param {mat2} out the receiving matrix
 * @param {ReadonlyMat2} a the first operand
 * @param {ReadonlyMat2} b the second operand
 * @returns {mat2} out
 */

function add(out, a, b) {
  out[0] = a[0] + b[0];
  out[1] = a[1] + b[1];
  out[2] = a[2] + b[2];
  out[3] = a[3] + b[3];
  return out;
}
/**
 * Subtracts matrix b from matrix a
 *
 * @param {mat2} out the receiving matrix
 * @param {ReadonlyMat2} a the first operand
 * @param {ReadonlyMat2} b the second operand
 * @returns {mat2} out
 */

function subtract(out, a, b) {
  out[0] = a[0] - b[0];
  out[1] = a[1] - b[1];
  out[2] = a[2] - b[2];
  out[3] = a[3] - b[3];
  return out;
}
/**
 * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)
 *
 * @param {ReadonlyMat2} a The first matrix.
 * @param {ReadonlyMat2} b The second matrix.
 * @returns {Boolean} True if the matrices are equal, false otherwise.
 */

function exactEquals(a, b) {
  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];
}
/**
 * Returns whether or not the matrices have approximately the same elements in the same position.
 *
 * @param {ReadonlyMat2} a The first matrix.
 * @param {ReadonlyMat2} b The second matrix.
 * @returns {Boolean} True if the matrices are equal, false otherwise.
 */

function mat2_equals(a, b) {
  var a0 = a[0],
    a1 = a[1],
    a2 = a[2],
    a3 = a[3];
  var b0 = b[0],
    b1 = b[1],
    b2 = b[2],
    b3 = b[3];
  return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));
}
/**
 * Multiply each element of the matrix by a scalar.
 *
 * @param {mat2} out the receiving matrix
 * @param {ReadonlyMat2} a the matrix to scale
 * @param {Number} b amount to scale the matrix's elements by
 * @returns {mat2} out
 */

function multiplyScalar(out, a, b) {
  out[0] = a[0] * b;
  out[1] = a[1] * b;
  out[2] = a[2] * b;
  out[3] = a[3] * b;
  return out;
}
/**
 * Adds two mat2's after multiplying each element of the second operand by a scalar value.
 *
 * @param {mat2} out the receiving vector
 * @param {ReadonlyMat2} a the first operand
 * @param {ReadonlyMat2} b the second operand
 * @param {Number} scale the amount to scale b's elements by before adding
 * @returns {mat2} out
 */

function multiplyScalarAndAdd(out, a, b, scale) {
  out[0] = a[0] + b[0] * scale;
  out[1] = a[1] + b[1] * scale;
  out[2] = a[2] + b[2] * scale;
  out[3] = a[3] + b[3] * scale;
  return out;
}
/**
 * Alias for {@link mat2.multiply}
 * @function
 */

var mul = multiply;
/**
 * Alias for {@link mat2.subtract}
 * @function
 */

var sub = subtract;
// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/vec2.js

/**
 * 2 Dimensional Vector
 * @module vec2
 */

/**
 * Creates a new, empty vec2
 *
 * @returns {vec2} a new 2D vector
 */

function vec2_create() {
  var out = new ARRAY_TYPE(2);
  if (ARRAY_TYPE != Float32Array) {
    out[0] = 0;
    out[1] = 0;
  }
  return out;
}
/**
 * Creates a new vec2 initialized with values from an existing vector
 *
 * @param {ReadonlyVec2} a vector to clone
 * @returns {vec2} a new 2D vector
 */

function vec2_clone(a) {
  var out = new ARRAY_TYPE(2);
  out[0] = a[0];
  out[1] = a[1];
  return out;
}
/**
 * Creates a new vec2 initialized with the given values
 *
 * @param {Number} x X component
 * @param {Number} y Y component
 * @returns {vec2} a new 2D vector
 */

function vec2_fromValues(x, y) {
  var out = new ARRAY_TYPE(2);
  out[0] = x;
  out[1] = y;
  return out;
}
/**
 * Copy the values from one vec2 to another
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a the source vector
 * @returns {vec2} out
 */

function vec2_copy(out, a) {
  out[0] = a[0];
  out[1] = a[1];
  return out;
}
/**
 * Set the components of a vec2 to the given values
 *
 * @param {vec2} out the receiving vector
 * @param {Number} x X component
 * @param {Number} y Y component
 * @returns {vec2} out
 */

function vec2_set(out, x, y) {
  out[0] = x;
  out[1] = y;
  return out;
}
/**
 * Adds two vec2's
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a the first operand
 * @param {ReadonlyVec2} b the second operand
 * @returns {vec2} out
 */

function vec2_add(out, a, b) {
  out[0] = a[0] + b[0];
  out[1] = a[1] + b[1];
  return out;
}
/**
 * Subtracts vector b from vector a
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a the first operand
 * @param {ReadonlyVec2} b the second operand
 * @returns {vec2} out
 */

function vec2_subtract(out, a, b) {
  out[0] = a[0] - b[0];
  out[1] = a[1] - b[1];
  return out;
}
/**
 * Multiplies two vec2's
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a the first operand
 * @param {ReadonlyVec2} b the second operand
 * @returns {vec2} out
 */

function vec2_multiply(out, a, b) {
  out[0] = a[0] * b[0];
  out[1] = a[1] * b[1];
  return out;
}
/**
 * Divides two vec2's
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a the first operand
 * @param {ReadonlyVec2} b the second operand
 * @returns {vec2} out
 */

function divide(out, a, b) {
  out[0] = a[0] / b[0];
  out[1] = a[1] / b[1];
  return out;
}
/**
 * Math.ceil the components of a vec2
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a vector to ceil
 * @returns {vec2} out
 */

function ceil(out, a) {
  out[0] = Math.ceil(a[0]);
  out[1] = Math.ceil(a[1]);
  return out;
}
/**
 * Math.floor the components of a vec2
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a vector to floor
 * @returns {vec2} out
 */

function floor(out, a) {
  out[0] = Math.floor(a[0]);
  out[1] = Math.floor(a[1]);
  return out;
}
/**
 * Returns the minimum of two vec2's
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a the first operand
 * @param {ReadonlyVec2} b the second operand
 * @returns {vec2} out
 */

function min(out, a, b) {
  out[0] = Math.min(a[0], b[0]);
  out[1] = Math.min(a[1], b[1]);
  return out;
}
/**
 * Returns the maximum of two vec2's
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a the first operand
 * @param {ReadonlyVec2} b the second operand
 * @returns {vec2} out
 */

function max(out, a, b) {
  out[0] = Math.max(a[0], b[0]);
  out[1] = Math.max(a[1], b[1]);
  return out;
}
/**
 * Math.round the components of a vec2
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a vector to round
 * @returns {vec2} out
 */

function round(out, a) {
  out[0] = Math.round(a[0]);
  out[1] = Math.round(a[1]);
  return out;
}
/**
 * Scales a vec2 by a scalar number
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a the vector to scale
 * @param {Number} b amount to scale the vector by
 * @returns {vec2} out
 */

function vec2_scale(out, a, b) {
  out[0] = a[0] * b;
  out[1] = a[1] * b;
  return out;
}
/**
 * Adds two vec2's after scaling the second operand by a scalar value
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a the first operand
 * @param {ReadonlyVec2} b the second operand
 * @param {Number} scale the amount to scale b by before adding
 * @returns {vec2} out
 */

function scaleAndAdd(out, a, b, scale) {
  out[0] = a[0] + b[0] * scale;
  out[1] = a[1] + b[1] * scale;
  return out;
}
/**
 * Calculates the euclidian distance between two vec2's
 *
 * @param {ReadonlyVec2} a the first operand
 * @param {ReadonlyVec2} b the second operand
 * @returns {Number} distance between a and b
 */

function distance(a, b) {
  var x = b[0] - a[0],
    y = b[1] - a[1];
  return Math.hypot(x, y);
}
/**
 * Calculates the squared euclidian distance between two vec2's
 *
 * @param {ReadonlyVec2} a the first operand
 * @param {ReadonlyVec2} b the second operand
 * @returns {Number} squared distance between a and b
 */

function squaredDistance(a, b) {
  var x = b[0] - a[0],
    y = b[1] - a[1];
  return x * x + y * y;
}
/**
 * Calculates the length of a vec2
 *
 * @param {ReadonlyVec2} a vector to calculate length of
 * @returns {Number} length of a
 */

function vec2_length(a) {
  var x = a[0],
    y = a[1];
  return Math.hypot(x, y);
}
/**
 * Calculates the squared length of a vec2
 *
 * @param {ReadonlyVec2} a vector to calculate squared length of
 * @returns {Number} squared length of a
 */

function squaredLength(a) {
  var x = a[0],
    y = a[1];
  return x * x + y * y;
}
/**
 * Negates the components of a vec2
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a vector to negate
 * @returns {vec2} out
 */

function negate(out, a) {
  out[0] = -a[0];
  out[1] = -a[1];
  return out;
}
/**
 * Returns the inverse of the components of a vec2
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a vector to invert
 * @returns {vec2} out
 */

function inverse(out, a) {
  out[0] = 1.0 / a[0];
  out[1] = 1.0 / a[1];
  return out;
}
/**
 * Normalize a vec2
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a vector to normalize
 * @returns {vec2} out
 */

function normalize(out, a) {
  var x = a[0],
    y = a[1];
  var len = x * x + y * y;
  if (len > 0) {
    //TODO: evaluate use of glm_invsqrt here?
    len = 1 / Math.sqrt(len);
  }
  out[0] = a[0] * len;
  out[1] = a[1] * len;
  return out;
}
/**
 * Calculates the dot product of two vec2's
 *
 * @param {ReadonlyVec2} a the first operand
 * @param {ReadonlyVec2} b the second operand
 * @returns {Number} dot product of a and b
 */

function dot(a, b) {
  return a[0] * b[0] + a[1] * b[1];
}
/**
 * Computes the cross product of two vec2's
 * Note that the cross product must by definition produce a 3D vector
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec2} a the first operand
 * @param {ReadonlyVec2} b the second operand
 * @returns {vec3} out
 */

function cross(out, a, b) {
  var z = a[0] * b[1] - a[1] * b[0];
  out[0] = out[1] = 0;
  out[2] = z;
  return out;
}
/**
 * Performs a linear interpolation between two vec2's
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a the first operand
 * @param {ReadonlyVec2} b the second operand
 * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
 * @returns {vec2} out
 */

function lerp(out, a, b, t) {
  var ax = a[0],
    ay = a[1];
  out[0] = ax + t * (b[0] - ax);
  out[1] = ay + t * (b[1] - ay);
  return out;
}
/**
 * Generates a random vector with the given scale
 *
 * @param {vec2} out the receiving vector
 * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned
 * @returns {vec2} out
 */

function random(out, scale) {
  scale = scale || 1.0;
  var r = RANDOM() * 2.0 * Math.PI;
  out[0] = Math.cos(r) * scale;
  out[1] = Math.sin(r) * scale;
  return out;
}
/**
 * Transforms the vec2 with a mat2
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a the vector to transform
 * @param {ReadonlyMat2} m matrix to transform with
 * @returns {vec2} out
 */

function transformMat2(out, a, m) {
  var x = a[0],
    y = a[1];
  out[0] = m[0] * x + m[2] * y;
  out[1] = m[1] * x + m[3] * y;
  return out;
}
/**
 * Transforms the vec2 with a mat2d
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a the vector to transform
 * @param {ReadonlyMat2d} m matrix to transform with
 * @returns {vec2} out
 */

function transformMat2d(out, a, m) {
  var x = a[0],
    y = a[1];
  out[0] = m[0] * x + m[2] * y + m[4];
  out[1] = m[1] * x + m[3] * y + m[5];
  return out;
}
/**
 * Transforms the vec2 with a mat3
 * 3rd vector component is implicitly '1'
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a the vector to transform
 * @param {ReadonlyMat3} m matrix to transform with
 * @returns {vec2} out
 */

function transformMat3(out, a, m) {
  var x = a[0],
    y = a[1];
  out[0] = m[0] * x + m[3] * y + m[6];
  out[1] = m[1] * x + m[4] * y + m[7];
  return out;
}
/**
 * Transforms the vec2 with a mat4
 * 3rd vector component is implicitly '0'
 * 4th vector component is implicitly '1'
 *
 * @param {vec2} out the receiving vector
 * @param {ReadonlyVec2} a the vector to transform
 * @param {ReadonlyMat4} m matrix to transform with
 * @returns {vec2} out
 */

function transformMat4(out, a, m) {
  var x = a[0];
  var y = a[1];
  out[0] = m[0] * x + m[4] * y + m[12];
  out[1] = m[1] * x + m[5] * y + m[13];
  return out;
}
/**
 * Rotate a 2D vector
 * @param {vec2} out The receiving vec2
 * @param {ReadonlyVec2} a The vec2 point to rotate
 * @param {ReadonlyVec2} b The origin of the rotation
 * @param {Number} rad The angle of rotation in radians
 * @returns {vec2} out
 */

function vec2_rotate(out, a, b, rad) {
  //Translate point to the origin
  var p0 = a[0] - b[0],
    p1 = a[1] - b[1],
    sinC = Math.sin(rad),
    cosC = Math.cos(rad); //perform rotation and translate to correct position

  out[0] = p0 * cosC - p1 * sinC + b[0];
  out[1] = p0 * sinC + p1 * cosC + b[1];
  return out;
}
/**
 * Get the angle between two 2D vectors
 * @param {ReadonlyVec2} a The first operand
 * @param {ReadonlyVec2} b The second operand
 * @returns {Number} The angle in radians
 */

function angle(a, b) {
  var x1 = a[0],
    y1 = a[1],
    x2 = b[0],
    y2 = b[1],
    // mag is the product of the magnitudes of a and b
    mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),
    // mag &&.. short circuits if mag == 0
    cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1

  return Math.acos(Math.min(Math.max(cosine, -1), 1));
}
/**
 * Set the components of a vec2 to zero
 *
 * @param {vec2} out the receiving vector
 * @returns {vec2} out
 */

function zero(out) {
  out[0] = 0.0;
  out[1] = 0.0;
  return out;
}
/**
 * Returns a string representation of a vector
 *
 * @param {ReadonlyVec2} a vector to represent as a string
 * @returns {String} string representation of the vector
 */

function vec2_str(a) {
  return "vec2(" + a[0] + ", " + a[1] + ")";
}
/**
 * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)
 *
 * @param {ReadonlyVec2} a The first vector.
 * @param {ReadonlyVec2} b The second vector.
 * @returns {Boolean} True if the vectors are equal, false otherwise.
 */

function vec2_exactEquals(a, b) {
  return a[0] === b[0] && a[1] === b[1];
}
/**
 * Returns whether or not the vectors have approximately the same elements in the same position.
 *
 * @param {ReadonlyVec2} a The first vector.
 * @param {ReadonlyVec2} b The second vector.
 * @returns {Boolean} True if the vectors are equal, false otherwise.
 */

function vec2_equals(a, b) {
  var a0 = a[0],
    a1 = a[1];
  var b0 = b[0],
    b1 = b[1];
  return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));
}
/**
 * Alias for {@link vec2.length}
 * @function
 */

var len = vec2_length;
/**
 * Alias for {@link vec2.subtract}
 * @function
 */

var vec2_sub = vec2_subtract;
/**
 * Alias for {@link vec2.multiply}
 * @function
 */

var vec2_mul = vec2_multiply;
/**
 * Alias for {@link vec2.divide}
 * @function
 */

var div = divide;
/**
 * Alias for {@link vec2.distance}
 * @function
 */

var dist = distance;
/**
 * Alias for {@link vec2.squaredDistance}
 * @function
 */

var sqrDist = squaredDistance;
/**
 * Alias for {@link vec2.squaredLength}
 * @function
 */

var sqrLen = squaredLength;
/**
 * Perform some operation over an array of vec2s.
 *
 * @param {Array} a the array of vectors to iterate over
 * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed
 * @param {Number} offset Number of elements to skip at the beginning of the array
 * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array
 * @param {Function} fn Function to call for each vector in the array
 * @param {Object} [arg] additional argument to pass to fn
 * @returns {Array} a
 * @function
 */

var forEach = function () {
  var vec = vec2_create();
  return function (a, stride, offset, count, fn, arg) {
    var i, l;
    if (!stride) {
      stride = 2;
    }
    if (!offset) {
      offset = 0;
    }
    if (count) {
      l = Math.min(count * stride + offset, a.length);
    } else {
      l = a.length;
    }
    for (i = offset; i < l; i += stride) {
      vec[0] = a[i];
      vec[1] = a[i + 1];
      fn(vec, vec, arg);
      a[i] = vec[0];
      a[i + 1] = vec[1];
    }
    return a;
  };
}();
// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/vec3.js

/**
 * 3 Dimensional Vector
 * @module vec3
 */

/**
 * Creates a new, empty vec3
 *
 * @returns {vec3} a new 3D vector
 */

function vec3_create() {
  var out = new ARRAY_TYPE(3);
  if (ARRAY_TYPE != Float32Array) {
    out[0] = 0;
    out[1] = 0;
    out[2] = 0;
  }
  return out;
}
/**
 * Creates a new vec3 initialized with values from an existing vector
 *
 * @param {ReadonlyVec3} a vector to clone
 * @returns {vec3} a new 3D vector
 */

function vec3_clone(a) {
  var out = new ARRAY_TYPE(3);
  out[0] = a[0];
  out[1] = a[1];
  out[2] = a[2];
  return out;
}
/**
 * Calculates the length of a vec3
 *
 * @param {ReadonlyVec3} a vector to calculate length of
 * @returns {Number} length of a
 */

function vec3_length(a) {
  var x = a[0];
  var y = a[1];
  var z = a[2];
  return Math.hypot(x, y, z);
}
/**
 * Creates a new vec3 initialized with the given values
 *
 * @param {Number} x X component
 * @param {Number} y Y component
 * @param {Number} z Z component
 * @returns {vec3} a new 3D vector
 */

function vec3_fromValues(x, y, z) {
  var out = new ARRAY_TYPE(3);
  out[0] = x;
  out[1] = y;
  out[2] = z;
  return out;
}
/**
 * Copy the values from one vec3 to another
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the source vector
 * @returns {vec3} out
 */

function vec3_copy(out, a) {
  out[0] = a[0];
  out[1] = a[1];
  out[2] = a[2];
  return out;
}
/**
 * Set the components of a vec3 to the given values
 *
 * @param {vec3} out the receiving vector
 * @param {Number} x X component
 * @param {Number} y Y component
 * @param {Number} z Z component
 * @returns {vec3} out
 */

function vec3_set(out, x, y, z) {
  out[0] = x;
  out[1] = y;
  out[2] = z;
  return out;
}
/**
 * Adds two vec3's
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the first operand
 * @param {ReadonlyVec3} b the second operand
 * @returns {vec3} out
 */

function vec3_add(out, a, b) {
  out[0] = a[0] + b[0];
  out[1] = a[1] + b[1];
  out[2] = a[2] + b[2];
  return out;
}
/**
 * Subtracts vector b from vector a
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the first operand
 * @param {ReadonlyVec3} b the second operand
 * @returns {vec3} out
 */

function vec3_subtract(out, a, b) {
  out[0] = a[0] - b[0];
  out[1] = a[1] - b[1];
  out[2] = a[2] - b[2];
  return out;
}
/**
 * Multiplies two vec3's
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the first operand
 * @param {ReadonlyVec3} b the second operand
 * @returns {vec3} out
 */

function vec3_multiply(out, a, b) {
  out[0] = a[0] * b[0];
  out[1] = a[1] * b[1];
  out[2] = a[2] * b[2];
  return out;
}
/**
 * Divides two vec3's
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the first operand
 * @param {ReadonlyVec3} b the second operand
 * @returns {vec3} out
 */

function vec3_divide(out, a, b) {
  out[0] = a[0] / b[0];
  out[1] = a[1] / b[1];
  out[2] = a[2] / b[2];
  return out;
}
/**
 * Math.ceil the components of a vec3
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a vector to ceil
 * @returns {vec3} out
 */

function vec3_ceil(out, a) {
  out[0] = Math.ceil(a[0]);
  out[1] = Math.ceil(a[1]);
  out[2] = Math.ceil(a[2]);
  return out;
}
/**
 * Math.floor the components of a vec3
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a vector to floor
 * @returns {vec3} out
 */

function vec3_floor(out, a) {
  out[0] = Math.floor(a[0]);
  out[1] = Math.floor(a[1]);
  out[2] = Math.floor(a[2]);
  return out;
}
/**
 * Returns the minimum of two vec3's
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the first operand
 * @param {ReadonlyVec3} b the second operand
 * @returns {vec3} out
 */

function vec3_min(out, a, b) {
  out[0] = Math.min(a[0], b[0]);
  out[1] = Math.min(a[1], b[1]);
  out[2] = Math.min(a[2], b[2]);
  return out;
}
/**
 * Returns the maximum of two vec3's
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the first operand
 * @param {ReadonlyVec3} b the second operand
 * @returns {vec3} out
 */

function vec3_max(out, a, b) {
  out[0] = Math.max(a[0], b[0]);
  out[1] = Math.max(a[1], b[1]);
  out[2] = Math.max(a[2], b[2]);
  return out;
}
/**
 * Math.round the components of a vec3
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a vector to round
 * @returns {vec3} out
 */

function vec3_round(out, a) {
  out[0] = Math.round(a[0]);
  out[1] = Math.round(a[1]);
  out[2] = Math.round(a[2]);
  return out;
}
/**
 * Scales a vec3 by a scalar number
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the vector to scale
 * @param {Number} b amount to scale the vector by
 * @returns {vec3} out
 */

function vec3_scale(out, a, b) {
  out[0] = a[0] * b;
  out[1] = a[1] * b;
  out[2] = a[2] * b;
  return out;
}
/**
 * Adds two vec3's after scaling the second operand by a scalar value
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the first operand
 * @param {ReadonlyVec3} b the second operand
 * @param {Number} scale the amount to scale b by before adding
 * @returns {vec3} out
 */

function vec3_scaleAndAdd(out, a, b, scale) {
  out[0] = a[0] + b[0] * scale;
  out[1] = a[1] + b[1] * scale;
  out[2] = a[2] + b[2] * scale;
  return out;
}
/**
 * Calculates the euclidian distance between two vec3's
 *
 * @param {ReadonlyVec3} a the first operand
 * @param {ReadonlyVec3} b the second operand
 * @returns {Number} distance between a and b
 */

function vec3_distance(a, b) {
  var x = b[0] - a[0];
  var y = b[1] - a[1];
  var z = b[2] - a[2];
  return Math.hypot(x, y, z);
}
/**
 * Calculates the squared euclidian distance between two vec3's
 *
 * @param {ReadonlyVec3} a the first operand
 * @param {ReadonlyVec3} b the second operand
 * @returns {Number} squared distance between a and b
 */

function vec3_squaredDistance(a, b) {
  var x = b[0] - a[0];
  var y = b[1] - a[1];
  var z = b[2] - a[2];
  return x * x + y * y + z * z;
}
/**
 * Calculates the squared length of a vec3
 *
 * @param {ReadonlyVec3} a vector to calculate squared length of
 * @returns {Number} squared length of a
 */

function vec3_squaredLength(a) {
  var x = a[0];
  var y = a[1];
  var z = a[2];
  return x * x + y * y + z * z;
}
/**
 * Negates the components of a vec3
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a vector to negate
 * @returns {vec3} out
 */

function vec3_negate(out, a) {
  out[0] = -a[0];
  out[1] = -a[1];
  out[2] = -a[2];
  return out;
}
/**
 * Returns the inverse of the components of a vec3
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a vector to invert
 * @returns {vec3} out
 */

function vec3_inverse(out, a) {
  out[0] = 1.0 / a[0];
  out[1] = 1.0 / a[1];
  out[2] = 1.0 / a[2];
  return out;
}
/**
 * Normalize a vec3
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a vector to normalize
 * @returns {vec3} out
 */

function vec3_normalize(out, a) {
  var x = a[0];
  var y = a[1];
  var z = a[2];
  var len = x * x + y * y + z * z;
  if (len > 0) {
    //TODO: evaluate use of glm_invsqrt here?
    len = 1 / Math.sqrt(len);
  }
  out[0] = a[0] * len;
  out[1] = a[1] * len;
  out[2] = a[2] * len;
  return out;
}
/**
 * Calculates the dot product of two vec3's
 *
 * @param {ReadonlyVec3} a the first operand
 * @param {ReadonlyVec3} b the second operand
 * @returns {Number} dot product of a and b
 */

function vec3_dot(a, b) {
  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
}
/**
 * Computes the cross product of two vec3's
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the first operand
 * @param {ReadonlyVec3} b the second operand
 * @returns {vec3} out
 */

function vec3_cross(out, a, b) {
  var ax = a[0],
    ay = a[1],
    az = a[2];
  var bx = b[0],
    by = b[1],
    bz = b[2];
  out[0] = ay * bz - az * by;
  out[1] = az * bx - ax * bz;
  out[2] = ax * by - ay * bx;
  return out;
}
/**
 * Performs a linear interpolation between two vec3's
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the first operand
 * @param {ReadonlyVec3} b the second operand
 * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
 * @returns {vec3} out
 */

function vec3_lerp(out, a, b, t) {
  var ax = a[0];
  var ay = a[1];
  var az = a[2];
  out[0] = ax + t * (b[0] - ax);
  out[1] = ay + t * (b[1] - ay);
  out[2] = az + t * (b[2] - az);
  return out;
}
/**
 * Performs a hermite interpolation with two control points
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the first operand
 * @param {ReadonlyVec3} b the second operand
 * @param {ReadonlyVec3} c the third operand
 * @param {ReadonlyVec3} d the fourth operand
 * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
 * @returns {vec3} out
 */

function hermite(out, a, b, c, d, t) {
  var factorTimes2 = t * t;
  var factor1 = factorTimes2 * (2 * t - 3) + 1;
  var factor2 = factorTimes2 * (t - 2) + t;
  var factor3 = factorTimes2 * (t - 1);
  var factor4 = factorTimes2 * (3 - 2 * t);
  out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;
  out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;
  out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;
  return out;
}
/**
 * Performs a bezier interpolation with two control points
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the first operand
 * @param {ReadonlyVec3} b the second operand
 * @param {ReadonlyVec3} c the third operand
 * @param {ReadonlyVec3} d the fourth operand
 * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
 * @returns {vec3} out
 */

function bezier(out, a, b, c, d, t) {
  var inverseFactor = 1 - t;
  var inverseFactorTimesTwo = inverseFactor * inverseFactor;
  var factorTimes2 = t * t;
  var factor1 = inverseFactorTimesTwo * inverseFactor;
  var factor2 = 3 * t * inverseFactorTimesTwo;
  var factor3 = 3 * factorTimes2 * inverseFactor;
  var factor4 = factorTimes2 * t;
  out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;
  out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;
  out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;
  return out;
}
/**
 * Generates a random vector with the given scale
 *
 * @param {vec3} out the receiving vector
 * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned
 * @returns {vec3} out
 */

function vec3_random(out, scale) {
  scale = scale || 1.0;
  var r = RANDOM() * 2.0 * Math.PI;
  var z = RANDOM() * 2.0 - 1.0;
  var zScale = Math.sqrt(1.0 - z * z) * scale;
  out[0] = Math.cos(r) * zScale;
  out[1] = Math.sin(r) * zScale;
  out[2] = z * scale;
  return out;
}
/**
 * Transforms the vec3 with a mat4.
 * 4th vector component is implicitly '1'
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the vector to transform
 * @param {ReadonlyMat4} m matrix to transform with
 * @returns {vec3} out
 */

function vec3_transformMat4(out, a, m) {
  var x = a[0],
    y = a[1],
    z = a[2];
  var w = m[3] * x + m[7] * y + m[11] * z + m[15];
  w = w || 1.0;
  out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;
  out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;
  out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;
  return out;
}
/**
 * Transforms the vec3 with a mat3.
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the vector to transform
 * @param {ReadonlyMat3} m the 3x3 matrix to transform with
 * @returns {vec3} out
 */

function vec3_transformMat3(out, a, m) {
  var x = a[0],
    y = a[1],
    z = a[2];
  out[0] = x * m[0] + y * m[3] + z * m[6];
  out[1] = x * m[1] + y * m[4] + z * m[7];
  out[2] = x * m[2] + y * m[5] + z * m[8];
  return out;
}
/**
 * Transforms the vec3 with a quat
 * Can also be used for dual quaternions. (Multiply it with the real part)
 *
 * @param {vec3} out the receiving vector
 * @param {ReadonlyVec3} a the vector to transform
 * @param {ReadonlyQuat} q quaternion to transform with
 * @returns {vec3} out
 */

function transformQuat(out, a, q) {
  // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed
  var qx = q[0],
    qy = q[1],
    qz = q[2],
    qw = q[3];
  var x = a[0],
    y = a[1],
    z = a[2]; // var qvec = [qx, qy, qz];
  // var uv = vec3.cross([], qvec, a);

  var uvx = qy * z - qz * y,
    uvy = qz * x - qx * z,
    uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);

  var uuvx = qy * uvz - qz * uvy,
    uuvy = qz * uvx - qx * uvz,
    uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);

  var w2 = qw * 2;
  uvx *= w2;
  uvy *= w2;
  uvz *= w2; // vec3.scale(uuv, uuv, 2);

  uuvx *= 2;
  uuvy *= 2;
  uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));

  out[0] = x + uvx + uuvx;
  out[1] = y + uvy + uuvy;
  out[2] = z + uvz + uuvz;
  return out;
}
/**
 * Rotate a 3D vector around the x-axis
 * @param {vec3} out The receiving vec3
 * @param {ReadonlyVec3} a The vec3 point to rotate
 * @param {ReadonlyVec3} b The origin of the rotation
 * @param {Number} rad The angle of rotation in radians
 * @returns {vec3} out
 */

function rotateX(out, a, b, rad) {
  var p = [],
    r = []; //Translate point to the origin

  p[0] = a[0] - b[0];
  p[1] = a[1] - b[1];
  p[2] = a[2] - b[2]; //perform rotation

  r[0] = p[0];
  r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);
  r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position

  out[0] = r[0] + b[0];
  out[1] = r[1] + b[1];
  out[2] = r[2] + b[2];
  return out;
}
/**
 * Rotate a 3D vector around the y-axis
 * @param {vec3} out The receiving vec3
 * @param {ReadonlyVec3} a The vec3 point to rotate
 * @param {ReadonlyVec3} b The origin of the rotation
 * @param {Number} rad The angle of rotation in radians
 * @returns {vec3} out
 */

function rotateY(out, a, b, rad) {
  var p = [],
    r = []; //Translate point to the origin

  p[0] = a[0] - b[0];
  p[1] = a[1] - b[1];
  p[2] = a[2] - b[2]; //perform rotation

  r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);
  r[1] = p[1];
  r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position

  out[0] = r[0] + b[0];
  out[1] = r[1] + b[1];
  out[2] = r[2] + b[2];
  return out;
}
/**
 * Rotate a 3D vector around the z-axis
 * @param {vec3} out The receiving vec3
 * @param {ReadonlyVec3} a The vec3 point to rotate
 * @param {ReadonlyVec3} b The origin of the rotation
 * @param {Number} rad The angle of rotation in radians
 * @returns {vec3} out
 */

function rotateZ(out, a, b, rad) {
  var p = [],
    r = []; //Translate point to the origin

  p[0] = a[0] - b[0];
  p[1] = a[1] - b[1];
  p[2] = a[2] - b[2]; //perform rotation

  r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);
  r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);
  r[2] = p[2]; //translate to correct position

  out[0] = r[0] + b[0];
  out[1] = r[1] + b[1];
  out[2] = r[2] + b[2];
  return out;
}
/**
 * Get the angle between two 3D vectors
 * @param {ReadonlyVec3} a The first operand
 * @param {ReadonlyVec3} b The second operand
 * @returns {Number} The angle in radians
 */

function vec3_angle(a, b) {
  var ax = a[0],
    ay = a[1],
    az = a[2],
    bx = b[0],
    by = b[1],
    bz = b[2],
    mag1 = Math.sqrt(ax * ax + ay * ay + az * az),
    mag2 = Math.sqrt(bx * bx + by * by + bz * bz),
    mag = mag1 * mag2,
    cosine = mag && vec3_dot(a, b) / mag;
  return Math.acos(Math.min(Math.max(cosine, -1), 1));
}
/**
 * Set the components of a vec3 to zero
 *
 * @param {vec3} out the receiving vector
 * @returns {vec3} out
 */

function vec3_zero(out) {
  out[0] = 0.0;
  out[1] = 0.0;
  out[2] = 0.0;
  return out;
}
/**
 * Returns a string representation of a vector
 *
 * @param {ReadonlyVec3} a vector to represent as a string
 * @returns {String} string representation of the vector
 */

function vec3_str(a) {
  return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")";
}
/**
 * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)
 *
 * @param {ReadonlyVec3} a The first vector.
 * @param {ReadonlyVec3} b The second vector.
 * @returns {Boolean} True if the vectors are equal, false otherwise.
 */

function vec3_exactEquals(a, b) {
  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];
}
/**
 * Returns whether or not the vectors have approximately the same elements in the same position.
 *
 * @param {ReadonlyVec3} a The first vector.
 * @param {ReadonlyVec3} b The second vector.
 * @returns {Boolean} True if the vectors are equal, false otherwise.
 */

function vec3_equals(a, b) {
  var a0 = a[0],
    a1 = a[1],
    a2 = a[2];
  var b0 = b[0],
    b1 = b[1],
    b2 = b[2];
  return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));
}
/**
 * Alias for {@link vec3.subtract}
 * @function
 */

var vec3_sub = vec3_subtract;
/**
 * Alias for {@link vec3.multiply}
 * @function
 */

var vec3_mul = vec3_multiply;
/**
 * Alias for {@link vec3.divide}
 * @function
 */

var vec3_div = vec3_divide;
/**
 * Alias for {@link vec3.distance}
 * @function
 */

var vec3_dist = vec3_distance;
/**
 * Alias for {@link vec3.squaredDistance}
 * @function
 */

var vec3_sqrDist = vec3_squaredDistance;
/**
 * Alias for {@link vec3.length}
 * @function
 */

var vec3_len = vec3_length;
/**
 * Alias for {@link vec3.squaredLength}
 * @function
 */

var vec3_sqrLen = vec3_squaredLength;
/**
 * Perform some operation over an array of vec3s.
 *
 * @param {Array} a the array of vectors to iterate over
 * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed
 * @param {Number} offset Number of elements to skip at the beginning of the array
 * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array
 * @param {Function} fn Function to call for each vector in the array
 * @param {Object} [arg] additional argument to pass to fn
 * @returns {Array} a
 * @function
 */

var vec3_forEach = function () {
  var vec = vec3_create();
  return function (a, stride, offset, count, fn, arg) {
    var i, l;
    if (!stride) {
      stride = 3;
    }
    if (!offset) {
      offset = 0;
    }
    if (count) {
      l = Math.min(count * stride + offset, a.length);
    } else {
      l = a.length;
    }
    for (i = offset; i < l; i += stride) {
      vec[0] = a[i];
      vec[1] = a[i + 1];
      vec[2] = a[i + 2];
      fn(vec, vec, arg);
      a[i] = vec[0];
      a[i + 1] = vec[1];
      a[i + 2] = vec[2];
    }
    return a;
  };
}();
// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/index.js












/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {

var _typeof = __webpack_require__(17)["default"];
var assertThisInitialized = __webpack_require__(1);
function _possibleConstructorReturn(self, call) {
  if (call && (_typeof(call) === "object" || typeof call === "function")) {
    return call;
  } else if (call !== void 0) {
    throw new TypeError("Derived constructors may only return object or undefined");
  }
  return assertThisInitialized(self);
}
module.exports = _possibleConstructorReturn, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {

var setPrototypeOf = __webpack_require__(40);
function _inherits(subClass, superClass) {
  if (typeof superClass !== "function" && superClass !== null) {
    throw new TypeError("Super expression must either be null or a function");
  }
  subClass.prototype = Object.create(superClass && superClass.prototype, {
    constructor: {
      value: subClass,
      writable: true,
      configurable: true
    }
  });
  Object.defineProperty(subClass, "prototype", {
    writable: false
  });
  if (superClass) setPrototypeOf(subClass, superClass);
}
module.exports = _inherits, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {

// TODO(Babel 8): Remove this file.

var runtime = __webpack_require__(139)();
module.exports = runtime;

// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=
try {
  regeneratorRuntime = runtime;
} catch (accidentalStrictMode) {
  if (typeof globalThis === "object") {
    globalThis.regeneratorRuntime = runtime;
  } else {
    Function("r", "regeneratorRuntime = r")(runtime);
  }
}

/***/ }),
/* 9 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";

// EXPORTS
__webpack_require__.d(__webpack_exports__, "h", function() { return /* binding */ imageRef; });
__webpack_require__.d(__webpack_exports__, "i", function() { return /* binding */ otsuThreshold; });
__webpack_require__.d(__webpack_exports__, "b", function() { return /* binding */ cv_utils_cluster; });
__webpack_require__.d(__webpack_exports__, "j", function() { return /* binding */ topGeneric; });
__webpack_require__.d(__webpack_exports__, "e", function() { return /* binding */ grayAndHalfSampleFromCanvasData; });
__webpack_require__.d(__webpack_exports__, "c", function() { return /* binding */ computeGray; });
__webpack_require__.d(__webpack_exports__, "f", function() { return /* binding */ halfSample; });
__webpack_require__.d(__webpack_exports__, "g", function() { return /* binding */ hsv2rgb; });
__webpack_require__.d(__webpack_exports__, "a", function() { return /* binding */ calculatePatchSize; });
__webpack_require__.d(__webpack_exports__, "d", function() { return /* binding */ computeImageArea; });

// UNUSED EXPORTS: computeIntegralImage2, computeIntegralImage, thresholdImage, computeHistogram, sharpenLine, determineOtsuThreshold, computeBinaryImage, Tracer, DILATE, ERODE, dilate, erode, subtract, bitwiseOr, countNonZero, grayArrayFromImage, grayArrayFromContext, loadImageArray, _computeDivisors, _parseCSSDimensionValues, _dimensionsConverters

// EXTERNAL MODULE: ./node_modules/gl-matrix/esm/index.js + 4 modules
var esm = __webpack_require__(5);

// EXTERNAL MODULE: ./src/common/array_helper.ts
var array_helper = __webpack_require__(11);

// CONCATENATED MODULE: ./src/common/cluster.js
// TODO: cluster.js and cv_utils.js are pretty tightly intertwined, making for a complex conversion
// into typescript. be warned. :-)


esm["a" /* glMatrix */].setMatrixArrayType(Array);
/**
 * Creates a cluster for grouping similar orientations of datapoints
 */
/* harmony default export */ var cluster = ({
  create: function create(point, threshold) {
    var points = [];
    var center = {
      rad: 0,
      vec: esm["c" /* vec2 */].clone([0, 0])
    };
    var pointMap = {};
    function _add(pointToAdd) {
      pointMap[pointToAdd.id] = pointToAdd;
      points.push(pointToAdd);
    }
    function updateCenter() {
      var i;
      var sum = 0;
      for (i = 0; i < points.length; i++) {
        sum += points[i].rad;
      }
      center.rad = sum / points.length;
      center.vec = esm["c" /* vec2 */].clone([Math.cos(center.rad), Math.sin(center.rad)]);
    }
    function init() {
      _add(point);
      updateCenter();
    }
    init();
    return {
      add: function add(pointToAdd) {
        if (!pointMap[pointToAdd.id]) {
          _add(pointToAdd);
          updateCenter();
        }
      },
      fits: function fits(otherPoint) {
        // check cosine similarity to center-angle
        var similarity = Math.abs(esm["c" /* vec2 */].dot(otherPoint.point.vec, center.vec));
        if (similarity > threshold) {
          return true;
        }
        return false;
      },
      getPoints: function getPoints() {
        return points;
      },
      getCenter: function getCenter() {
        return center;
      }
    };
  },
  createPoint: function createPoint(newPoint, id, property) {
    return {
      rad: newPoint[property],
      point: newPoint,
      id: id
    };
  }
});
// CONCATENATED MODULE: ./src/common/cv_utils.js
/* eslint-disable no-mixed-operators */
/* eslint-disable no-bitwise */



esm["a" /* glMatrix */].setMatrixArrayType(Array);

/**
 * @param x x-coordinate
 * @param y y-coordinate
 * @return ImageReference {x,y} Coordinate
 */
function imageRef(x, y) {
  var that = {
    x: x,
    y: y,
    toVec2: function toVec2() {
      return esm["c" /* vec2 */].clone([this.x, this.y]);
    },
    toVec3: function toVec3() {
      return esm["d" /* vec3 */].clone([this.x, this.y, 1]);
    },
    round: function round() {
      this.x = this.x > 0.0 ? Math.floor(this.x + 0.5) : Math.floor(this.x - 0.5);
      this.y = this.y > 0.0 ? Math.floor(this.y + 0.5) : Math.floor(this.y - 0.5);
      return this;
    }
  };
  return that;
}

/**
 * Computes an integral image of a given grayscale image.
 * @param imageDataContainer {ImageDataContainer} the image to be integrated
 */
function computeIntegralImage2(imageWrapper, integralWrapper) {
  var imageData = imageWrapper.data;
  var width = imageWrapper.size.x;
  var height = imageWrapper.size.y;
  var integralImageData = integralWrapper.data;
  var sum = 0;
  var posA = 0;
  var posB = 0;
  var posC = 0;
  var posD = 0;
  var x;
  var y;

  // sum up first column
  posB = width;
  sum = 0;
  for (y = 1; y < height; y++) {
    sum += imageData[posA];
    integralImageData[posB] += sum;
    posA += width;
    posB += width;
  }
  posA = 0;
  posB = 1;
  sum = 0;
  for (x = 1; x < width; x++) {
    sum += imageData[posA];
    integralImageData[posB] += sum;
    posA++;
    posB++;
  }
  for (y = 1; y < height; y++) {
    posA = y * width + 1;
    posB = (y - 1) * width + 1;
    posC = y * width;
    posD = (y - 1) * width;
    for (x = 1; x < width; x++) {
      integralImageData[posA] += imageData[posA] + integralImageData[posB] + integralImageData[posC] - integralImageData[posD];
      posA++;
      posB++;
      posC++;
      posD++;
    }
  }
}
function computeIntegralImage(imageWrapper, integralWrapper) {
  var imageData = imageWrapper.data;
  var width = imageWrapper.size.x;
  var height = imageWrapper.size.y;
  var integralImageData = integralWrapper.data;
  var sum = 0;

  // sum up first row
  for (var i = 0; i < width; i++) {
    sum += imageData[i];
    integralImageData[i] = sum;
  }
  for (var v = 1; v < height; v++) {
    sum = 0;
    for (var u = 0; u < width; u++) {
      sum += imageData[v * width + u];
      integralImageData[v * width + u] = sum + integralImageData[(v - 1) * width + u];
    }
  }
}
function thresholdImage(imageWrapper, threshold, targetWrapper) {
  if (!targetWrapper) {
    // eslint-disable-next-line no-param-reassign
    targetWrapper = imageWrapper;
  }
  var imageData = imageWrapper.data;
  var length = imageData.length;
  var targetData = targetWrapper.data;
  while (length--) {
    targetData[length] = imageData[length] < threshold ? 1 : 0;
  }
}
function computeHistogram(imageWrapper, bitsPerPixel) {
  if (!bitsPerPixel) {
    // eslint-disable-next-line no-param-reassign
    bitsPerPixel = 8;
  }
  var imageData = imageWrapper.data;
  var length = imageData.length;
  var bitShift = 8 - bitsPerPixel;
  var bucketCnt = 1 << bitsPerPixel;
  var hist = new Int32Array(bucketCnt);
  while (length--) {
    hist[imageData[length] >> bitShift]++;
  }
  return hist;
}
function sharpenLine(line) {
  var i;
  var length = line.length;
  var left = line[0];
  var center = line[1];
  var right;
  for (i = 1; i < length - 1; i++) {
    right = line[i + 1];
    //  -1 4 -1 kernel
    // eslint-disable-next-line no-param-reassign
    line[i - 1] = center * 2 - left - right & 255;
    left = center;
    center = right;
  }
  return line;
}
function determineOtsuThreshold(imageWrapper) {
  var bitsPerPixel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 8;
  var hist;
  var bitShift = 8 - bitsPerPixel;
  function px(init, end) {
    var sum = 0;
    for (var i = init; i <= end; i++) {
      sum += hist[i];
    }
    return sum;
  }
  function mx(init, end) {
    var sum = 0;
    for (var i = init; i <= end; i++) {
      sum += i * hist[i];
    }
    return sum;
  }
  function determineThreshold() {
    var vet = [0];
    var p1;
    var p2;
    var p12;
    var m1;
    var m2;
    var m12;
    var max = (1 << bitsPerPixel) - 1;
    hist = computeHistogram(imageWrapper, bitsPerPixel);
    for (var k = 1; k < max; k++) {
      p1 = px(0, k);
      p2 = px(k + 1, max);
      p12 = p1 * p2;
      if (p12 === 0) {
        p12 = 1;
      }
      m1 = mx(0, k) * p2;
      m2 = mx(k + 1, max) * p1;
      m12 = m1 - m2;
      vet[k] = m12 * m12 / p12;
    }
    return array_helper["a" /* default */].maxIndex(vet);
  }
  var threshold = determineThreshold();
  return threshold << bitShift;
}
function otsuThreshold(imageWrapper, targetWrapper) {
  var threshold = determineOtsuThreshold(imageWrapper);
  thresholdImage(imageWrapper, threshold, targetWrapper);
  return threshold;
}

// local thresholding
function computeBinaryImage(imageWrapper, integralWrapper, targetWrapper) {
  computeIntegralImage(imageWrapper, integralWrapper);
  if (!targetWrapper) {
    // eslint-disable-next-line no-param-reassign
    targetWrapper = imageWrapper;
  }
  var imageData = imageWrapper.data;
  var targetData = targetWrapper.data;
  var width = imageWrapper.size.x;
  var height = imageWrapper.size.y;
  var integralImageData = integralWrapper.data;
  var sum = 0;
  var v;
  var u;
  var kernel = 3;
  var A;
  var B;
  var C;
  var D;
  var avg;
  var size = (kernel * 2 + 1) * (kernel * 2 + 1);

  // clear out top & bottom-border
  for (v = 0; v <= kernel; v++) {
    for (u = 0; u < width; u++) {
      targetData[v * width + u] = 0;
      targetData[(height - 1 - v) * width + u] = 0;
    }
  }

  // clear out left & right border
  for (v = kernel; v < height - kernel; v++) {
    for (u = 0; u <= kernel; u++) {
      targetData[v * width + u] = 0;
      targetData[v * width + (width - 1 - u)] = 0;
    }
  }
  for (v = kernel + 1; v < height - kernel - 1; v++) {
    for (u = kernel + 1; u < width - kernel; u++) {
      A = integralImageData[(v - kernel - 1) * width + (u - kernel - 1)];
      B = integralImageData[(v - kernel - 1) * width + (u + kernel)];
      C = integralImageData[(v + kernel) * width + (u - kernel - 1)];
      D = integralImageData[(v + kernel) * width + (u + kernel)];
      sum = D - C - B + A;
      avg = sum / size;
      targetData[v * width + u] = imageData[v * width + u] > avg + 5 ? 0 : 1;
    }
  }
}
function cv_utils_cluster(points, threshold, property) {
  var i;
  var k;
  var thisCluster;
  var point;
  var clusters = [];
  if (!property) {
    // eslint-disable-next-line no-param-reassign
    property = 'rad';
  }
  function addToCluster(newPoint) {
    var found = false;
    for (k = 0; k < clusters.length; k++) {
      thisCluster = clusters[k];
      if (thisCluster.fits(newPoint)) {
        thisCluster.add(newPoint);
        found = true;
      }
    }
    return found;
  }

  // iterate over each cloud
  for (i = 0; i < points.length; i++) {
    point = cluster.createPoint(points[i], i, property);
    if (!addToCluster(point)) {
      clusters.push(cluster.create(point, threshold));
    }
  }
  return clusters;
}
var Tracer = {
  trace: function trace(points, vec) {
    var iteration;
    var maxIterations = 10;
    var top = [];
    var result = [];
    var centerPos = 0;
    var currentPos = 0;
    function trace(idx, forward) {
      var to;
      var toIdx;
      var predictedPos;
      var thresholdX = 1;
      var thresholdY = Math.abs(vec[1] / 10);
      var found = false;
      function match(pos, predicted) {
        if (pos.x > predicted.x - thresholdX && pos.x < predicted.x + thresholdX && pos.y > predicted.y - thresholdY && pos.y < predicted.y + thresholdY) {
          return true;
        }
        return false;
      }

      // check if the next index is within the vec specifications
      // if not, check as long as the threshold is met

      var from = points[idx];
      if (forward) {
        predictedPos = {
          x: from.x + vec[0],
          y: from.y + vec[1]
        };
      } else {
        predictedPos = {
          x: from.x - vec[0],
          y: from.y - vec[1]
        };
      }
      toIdx = forward ? idx + 1 : idx - 1;
      to = points[toIdx];
      // eslint-disable-next-line no-cond-assign
      while (to && (found = match(to, predictedPos)) !== true && Math.abs(to.y - from.y) < vec[1]) {
        toIdx = forward ? toIdx + 1 : toIdx - 1;
        to = points[toIdx];
      }
      return found ? toIdx : null;
    }
    for (iteration = 0; iteration < maxIterations; iteration++) {
      // randomly select point to start with
      centerPos = Math.floor(Math.random() * points.length);

      // trace forward
      top = [];
      currentPos = centerPos;
      top.push(points[currentPos]);
      // eslint-disable-next-line no-cond-assign
      while ((currentPos = trace(currentPos, true)) !== null) {
        top.push(points[currentPos]);
      }
      if (centerPos > 0) {
        currentPos = centerPos;
        // eslint-disable-next-line no-cond-assign
        while ((currentPos = trace(currentPos, false)) !== null) {
          top.push(points[currentPos]);
        }
      }
      if (top.length > result.length) {
        result = top;
      }
    }
    return result;
  }
};
var DILATE = 1;
var ERODE = 2;
function dilate(inImageWrapper, outImageWrapper) {
  var v;
  var u;
  var inImageData = inImageWrapper.data;
  var outImageData = outImageWrapper.data;
  var height = inImageWrapper.size.y;
  var width = inImageWrapper.size.x;
  var sum;
  var yStart1;
  var yStart2;
  var xStart1;
  var xStart2;
  for (v = 1; v < height - 1; v++) {
    for (u = 1; u < width - 1; u++) {
      yStart1 = v - 1;
      yStart2 = v + 1;
      xStart1 = u - 1;
      xStart2 = u + 1;
      sum = inImageData[yStart1 * width + xStart1] + inImageData[yStart1 * width + xStart2] + inImageData[v * width + u] + inImageData[yStart2 * width + xStart1] + inImageData[yStart2 * width + xStart2];
      outImageData[v * width + u] = sum > 0 ? 1 : 0;
    }
  }
}
function erode(inImageWrapper, outImageWrapper) {
  var v;
  var u;
  var inImageData = inImageWrapper.data;
  var outImageData = outImageWrapper.data;
  var height = inImageWrapper.size.y;
  var width = inImageWrapper.size.x;
  var sum;
  var yStart1;
  var yStart2;
  var xStart1;
  var xStart2;
  for (v = 1; v < height - 1; v++) {
    for (u = 1; u < width - 1; u++) {
      yStart1 = v - 1;
      yStart2 = v + 1;
      xStart1 = u - 1;
      xStart2 = u + 1;
      sum = inImageData[yStart1 * width + xStart1] + inImageData[yStart1 * width + xStart2] + inImageData[v * width + u] + inImageData[yStart2 * width + xStart1] + inImageData[yStart2 * width + xStart2];
      outImageData[v * width + u] = sum === 5 ? 1 : 0;
    }
  }
}
function subtract(aImageWrapper, bImageWrapper, resultImageWrapper) {
  if (!resultImageWrapper) {
    // eslint-disable-next-line no-param-reassign
    resultImageWrapper = aImageWrapper;
  }
  var length = aImageWrapper.data.length;
  var aImageData = aImageWrapper.data;
  var bImageData = bImageWrapper.data;
  var cImageData = resultImageWrapper.data;
  while (length--) {
    cImageData[length] = aImageData[length] - bImageData[length];
  }
}
function bitwiseOr(aImageWrapper, bImageWrapper, resultImageWrapper) {
  if (!resultImageWrapper) {
    // eslint-disable-next-line no-param-reassign
    resultImageWrapper = aImageWrapper;
  }
  var length = aImageWrapper.data.length;
  var aImageData = aImageWrapper.data;
  var bImageData = bImageWrapper.data;
  var cImageData = resultImageWrapper.data;
  while (length--) {
    cImageData[length] = aImageData[length] || bImageData[length];
  }
}
function countNonZero(imageWrapper) {
  var length = imageWrapper.data.length;
  var data = imageWrapper.data;
  var sum = 0;
  while (length--) {
    sum += data[length];
  }
  return sum;
}
function topGeneric(list, top, scoreFunc) {
  var i;
  var minIdx = 0;
  var min = 0;
  var queue = [];
  var score;
  var hit;
  var pos;
  for (i = 0; i < top; i++) {
    queue[i] = {
      score: 0,
      item: null
    };
  }
  for (i = 0; i < list.length; i++) {
    score = scoreFunc.apply(this, [list[i]]);
    if (score > min) {
      hit = queue[minIdx];
      hit.score = score;
      hit.item = list[i];
      min = Number.MAX_VALUE;
      for (pos = 0; pos < top; pos++) {
        if (queue[pos].score < min) {
          min = queue[pos].score;
          minIdx = pos;
        }
      }
    }
  }
  return queue;
}
function grayArrayFromImage(htmlImage, offsetX, ctx, array) {
  ctx.drawImage(htmlImage, offsetX, 0, htmlImage.width, htmlImage.height);
  var ctxData = ctx.getImageData(offsetX, 0, htmlImage.width, htmlImage.height).data;
  computeGray(ctxData, array);
}
function grayArrayFromContext(ctx, size, offset, array) {
  var ctxData = ctx.getImageData(offset.x, offset.y, size.x, size.y).data;
  computeGray(ctxData, array);
}
function grayAndHalfSampleFromCanvasData(canvasData, size, outArray) {
  var topRowIdx = 0;
  var bottomRowIdx = size.x;
  var endIdx = Math.floor(canvasData.length / 4);
  var outWidth = size.x / 2;
  var outImgIdx = 0;
  var inWidth = size.x;
  var i;
  while (bottomRowIdx < endIdx) {
    for (i = 0; i < outWidth; i++) {
      // eslint-disable-next-line no-param-reassign
      outArray[outImgIdx] = (0.299 * canvasData[topRowIdx * 4 + 0] + 0.587 * canvasData[topRowIdx * 4 + 1] + 0.114 * canvasData[topRowIdx * 4 + 2] + (0.299 * canvasData[(topRowIdx + 1) * 4 + 0] + 0.587 * canvasData[(topRowIdx + 1) * 4 + 1] + 0.114 * canvasData[(topRowIdx + 1) * 4 + 2]) + (0.299 * canvasData[bottomRowIdx * 4 + 0] + 0.587 * canvasData[bottomRowIdx * 4 + 1] + 0.114 * canvasData[bottomRowIdx * 4 + 2]) + (0.299 * canvasData[(bottomRowIdx + 1) * 4 + 0] + 0.587 * canvasData[(bottomRowIdx + 1) * 4 + 1] + 0.114 * canvasData[(bottomRowIdx + 1) * 4 + 2])) / 4;
      outImgIdx++;
      topRowIdx += 2;
      bottomRowIdx += 2;
    }
    topRowIdx += inWidth;
    bottomRowIdx += inWidth;
  }
}
function computeGray(imageData, outArray, config) {
  var l = imageData.length / 4 | 0;
  var singleChannel = config && config.singleChannel === true;
  if (singleChannel) {
    for (var i = 0; i < l; i++) {
      // eslint-disable-next-line no-param-reassign
      outArray[i] = imageData[i * 4 + 0];
    }
  } else {
    for (var _i = 0; _i < l; _i++) {
      // eslint-disable-next-line no-param-reassign
      outArray[_i] = 0.299 * imageData[_i * 4 + 0] + 0.587 * imageData[_i * 4 + 1] + 0.114 * imageData[_i * 4 + 2];
    }
  }
}
function loadImageArray(src, callback) {
  var canvas = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document && document.createElement('canvas');
  var img = new Image();
  img.callback = callback;
  img.onload = function () {
    // eslint-disable-next-line no-param-reassign
    canvas.width = this.width;
    // eslint-disable-next-line no-param-reassign
    canvas.height = this.height;
    console.warn('* loadImageArray getContext 2d');
    var ctx = canvas.getContext('2d');
    ctx.drawImage(this, 0, 0);
    var array = new Uint8Array(this.width * this.height);
    ctx.drawImage(this, 0, 0);
    var _ctx$getImageData = ctx.getImageData(0, 0, this.width, this.height),
      data = _ctx$getImageData.data;
    computeGray(data, array);
    this.callback(array, {
      x: this.width,
      y: this.height
    }, this);
  };
  img.src = src;
}

/**
 * @param inImg {ImageWrapper} input image to be sampled
 * @param outImg {ImageWrapper} to be stored in
 */
function halfSample(inImgWrapper, outImgWrapper) {
  var inImg = inImgWrapper.data;
  var inWidth = inImgWrapper.size.x;
  var outImg = outImgWrapper.data;
  var topRowIdx = 0;
  var bottomRowIdx = inWidth;
  var endIdx = inImg.length;
  var outWidth = inWidth / 2;
  var outImgIdx = 0;
  while (bottomRowIdx < endIdx) {
    for (var i = 0; i < outWidth; i++) {
      outImg[outImgIdx] = Math.floor((inImg[topRowIdx] + inImg[topRowIdx + 1] + inImg[bottomRowIdx] + inImg[bottomRowIdx + 1]) / 4);
      outImgIdx++;
      topRowIdx += 2;
      bottomRowIdx += 2;
    }
    topRowIdx += inWidth;
    bottomRowIdx += inWidth;
  }
}
function hsv2rgb(hsv) {
  var rgb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0, 0, 0];
  var h = hsv[0];
  var s = hsv[1];
  var v = hsv[2];
  var c = v * s;
  var x = c * (1 - Math.abs(h / 60 % 2 - 1));
  var m = v - c;
  var r = 0;
  var g = 0;
  var b = 0;
  if (h < 60) {
    r = c;
    g = x;
  } else if (h < 120) {
    r = x;
    g = c;
  } else if (h < 180) {
    g = c;
    b = x;
  } else if (h < 240) {
    g = x;
    b = c;
  } else if (h < 300) {
    r = x;
    b = c;
  } else if (h < 360) {
    r = c;
    b = x;
  }
  // eslint-disable-next-line no-param-reassign
  rgb[0] = (r + m) * 255 | 0;
  // eslint-disable-next-line no-param-reassign
  rgb[1] = (g + m) * 255 | 0;
  // eslint-disable-next-line no-param-reassign
  rgb[2] = (b + m) * 255 | 0;
  return rgb;
}
function _computeDivisors(n) {
  var largeDivisors = [];
  var divisors = [];
  for (var i = 1; i < Math.sqrt(n) + 1; i++) {
    if (n % i === 0) {
      divisors.push(i);
      if (i !== n / i) {
        largeDivisors.unshift(Math.floor(n / i));
      }
    }
  }
  return divisors.concat(largeDivisors);
}
function _computeIntersection(arr1, arr2) {
  var i = 0;
  var j = 0;
  var result = [];
  while (i < arr1.length && j < arr2.length) {
    if (arr1[i] === arr2[j]) {
      result.push(arr1[i]);
      i++;
      j++;
    } else if (arr1[i] > arr2[j]) {
      j++;
    } else {
      i++;
    }
  }
  return result;
}
function calculatePatchSize(patchSize, imgSize) {
  var divisorsX = _computeDivisors(imgSize.x);
  var divisorsY = _computeDivisors(imgSize.y);
  var wideSide = Math.max(imgSize.x, imgSize.y);
  var common = _computeIntersection(divisorsX, divisorsY);
  var nrOfPatchesList = [8, 10, 15, 20, 32, 60, 80];
  var nrOfPatchesMap = {
    'x-small': 5,
    small: 4,
    medium: 3,
    large: 2,
    'x-large': 1
  };
  var nrOfPatchesIdx = nrOfPatchesMap[patchSize] || nrOfPatchesMap.medium;
  var nrOfPatches = nrOfPatchesList[nrOfPatchesIdx];
  var desiredPatchSize = Math.floor(wideSide / nrOfPatches);
  var optimalPatchSize;
  function findPatchSizeForDivisors(divisors) {
    var i = 0;
    var found = divisors[Math.floor(divisors.length / 2)];
    while (i < divisors.length - 1 && divisors[i] < desiredPatchSize) {
      i++;
    }
    if (i > 0) {
      if (Math.abs(divisors[i] - desiredPatchSize) > Math.abs(divisors[i - 1] - desiredPatchSize)) {
        found = divisors[i - 1];
      } else {
        found = divisors[i];
      }
    }
    if (desiredPatchSize / found < nrOfPatchesList[nrOfPatchesIdx + 1] / nrOfPatchesList[nrOfPatchesIdx] && desiredPatchSize / found > nrOfPatchesList[nrOfPatchesIdx - 1] / nrOfPatchesList[nrOfPatchesIdx]) {
      return {
        x: found,
        y: found
      };
    }
    return null;
  }
  optimalPatchSize = findPatchSizeForDivisors(common);
  if (!optimalPatchSize) {
    optimalPatchSize = findPatchSizeForDivisors(_computeDivisors(wideSide));
    if (!optimalPatchSize) {
      optimalPatchSize = findPatchSizeForDivisors(_computeDivisors(desiredPatchSize * nrOfPatches));
    }
  }
  return optimalPatchSize;
}
function _parseCSSDimensionValues(value) {
  var dimension = {
    value: parseFloat(value),
    unit: value.indexOf('%') === value.length - 1 ? '%' : '%'
  };
  return dimension;
}
var _dimensionsConverters = {
  top: function top(dimension, context) {
    return dimension.unit === '%' ? Math.floor(context.height * (dimension.value / 100)) : null;
  },
  right: function right(dimension, context) {
    return dimension.unit === '%' ? Math.floor(context.width - context.width * (dimension.value / 100)) : null;
  },
  bottom: function bottom(dimension, context) {
    return dimension.unit === '%' ? Math.floor(context.height - context.height * (dimension.value / 100)) : null;
  },
  left: function left(dimension, context) {
    return dimension.unit === '%' ? Math.floor(context.width * (dimension.value / 100)) : null;
  }
};
function computeImageArea(inputWidth, inputHeight, area) {
  var context = {
    width: inputWidth,
    height: inputHeight
  };
  var parsedArea = Object.keys(area).reduce(function (result, key) {
    var value = area[key];
    var parsed = _parseCSSDimensionValues(value);
    var calculated = _dimensionsConverters[key](parsed, context);

    // eslint-disable-next-line no-param-reassign
    result[key] = calculated;
    return result;
  }, {});
  return {
    sx: parsedArea.left,
    sy: parsedArea.top,
    sw: parsedArea.right - parsedArea.left,
    sh: parsedArea.bottom - parsedArea.top
  };
}

/***/ }),
/* 10 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
// TODO: XYPosition should be an XYObject, but that breaks XYDefinition, which breaks drawPath() below.

// XYDefinition tells us which component of a given array or object is the "X" and which is the "Y".
// Usually this is 0 for X and 1 for Y, but might be used as 'x' for x and 'y' for Y.

/* harmony default export */ __webpack_exports__["a"] = ({
  drawRect: function drawRect(pos, size, ctx, style) {
    ctx.strokeStyle = style.color;
    ctx.fillStyle = style.color;
    ctx.lineWidth = style.lineWidth || 1;
    ctx.beginPath();
    ctx.strokeRect(pos.x, pos.y, size.x, size.y);
  },
  drawPath: function drawPath(path, def, ctx, style) {
    ctx.strokeStyle = style.color;
    ctx.fillStyle = style.color;
    ctx.lineWidth = style.lineWidth;
    ctx.beginPath();
    ctx.moveTo(path[0][def.x], path[0][def.y]);
    for (var j = 1; j < path.length; j++) {
      ctx.lineTo(path[j][def.x], path[j][def.y]);
    }
    ctx.closePath();
    ctx.stroke();
  },
  drawImage: function drawImage(imageData, size, ctx) {
    var canvasData = ctx.getImageData(0, 0, size.x, size.y);
    var data = canvasData.data;
    var canvasDataPos = data.length;
    var imageDataPos = imageData.length;
    if (canvasDataPos / imageDataPos !== 4) {
      return false;
    }
    while (imageDataPos--) {
      var value = imageData[imageDataPos];
      data[--canvasDataPos] = 255;
      data[--canvasDataPos] = value;
      data[--canvasDataPos] = value;
      data[--canvasDataPos] = value;
    }
    ctx.putImageData(canvasData, 0, 0);
    return true;
  }
});

/***/ }),
/* 11 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* eslint-disable no-param-reassign */

/* harmony default export */ __webpack_exports__["a"] = ({
  init: function init(arr, val) {
    arr.fill(val);
  },
  /**
   * IN-PLACE Shuffles the content of an array
   */
  shuffle: function shuffle(arr) {
    // Durstenfeld shuffle algorithm
    // https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array
    for (var i = arr.length - 1; i > 0; i--) {
      var j = Math.floor(Math.random() * (i + 1));
      var _ref = [arr[j], arr[i]];
      arr[i] = _ref[0];
      arr[j] = _ref[1];
    }
    return arr;
  },
  toPointList: function toPointList(arr) {
    var rows = arr.reduce(function (p, n) {
      var row = "[".concat(n.join(','), "]");
      p.push(row);
      return p;
    }, []);
    return "[".concat(rows.join(',\r\n'), "]");
  },
  /**
   * returns the elements which's score is bigger than the threshold
   */
  // eslint-disable-next-line no-unused-vars
  threshold: function threshold(arr, _threshold, scoreFunc) {
    var queue = arr.reduce(function (prev, next) {
      if (scoreFunc.apply(arr, [next]) >= _threshold) {
        prev.push(next);
      }
      return prev;
    }, []);
    return queue;
  },
  maxIndex: function maxIndex(arr) {
    var max = 0;
    for (var i = 0; i < arr.length; i++) {
      if (arr[i] > arr[max]) {
        max = i;
      }
    }
    return max;
  },
  max: function max(arr) {
    var max = 0;
    for (var i = 0; i < arr.length; i++) {
      if (arr[i] > max) {
        max = arr[i];
      }
    }
    return max;
  },
  sum: function sum(arr) {
    var length = arr.length;
    var sum = 0;
    while (length--) {
      sum += arr[length];
    }
    return sum;
  }
});

/***/ }),
/* 12 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(61);
/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(0);
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__);
/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(5);
/* harmony import */ var _array_helper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11);
/* harmony import */ var _cv_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(9);







gl_matrix__WEBPACK_IMPORTED_MODULE_4__[/* glMatrix */ "a"].setMatrixArrayType(Array);
function assertNumberPositive(val) {
  if (val < 0) {
    throw new Error("expected positive number, received ".concat(val));
  }
}
var ImageWrapper = /*#__PURE__*/function () {
  // Represents a basic image combining the data and size. In addition, some methods for
  // manipulation are contained within.
  function ImageWrapper(size, data) {
    var ArrayType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Uint8Array;
    var initialize = arguments.length > 3 ? arguments[3] : undefined;
    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, ImageWrapper);
    _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default()(this, "data", void 0);
    _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default()(this, "size", void 0);
    _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default()(this, "indexMapping", void 0);
    if (!data) {
      this.data = new ArrayType(size.x * size.y);
      if (initialize) {
        _array_helper__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"].init(this.data, 0);
      }
    } else {
      this.data = data;
    }
    this.size = size;
  }

  // tests if a position is within the image, extended out by a border on each side
  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(ImageWrapper, [{
    key: "inImageWithBorder",
    value: function inImageWithBorder(imgRef) {
      var border = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
      assertNumberPositive(border);
      return imgRef.x >= 0 && imgRef.y >= 0 && imgRef.x < this.size.x + border * 2 && imgRef.y < this.size.y + border * 2;
    }

    // Copy from THIS ImageWrapper to the new imageWrapper parameter, starting at from, stopping at
    // end of new imageWrapper size.
  }, {
    key: "subImageAsCopy",
    value: function subImageAsCopy(imageWrapper, from) {
      assertNumberPositive(from.x);
      assertNumberPositive(from.y);
      var _imageWrapper$size = imageWrapper.size,
        sizeX = _imageWrapper$size.x,
        sizeY = _imageWrapper$size.y;
      for (var x = 0; x < sizeX; x++) {
        for (var y = 0; y < sizeY; y++) {
          // eslint-disable-next-line no-param-reassign
          imageWrapper.data[y * sizeX + x] = this.data[(from.y + y) * this.size.x + from.x + x];
        }
      }
      return imageWrapper;
      // TODO: this function really probably should call into ImageWrapper somewhere to make
      // sure that all of it's parameters are set properly, something like
      // ImageWrapper.UpdateFrom()
      // that might take a provided data and size, and make sure there's no invalid indexMapping
      // hanging around, and such.
    }

    // Retrieve a grayscale value at the given pixel position of the image
  }, {
    key: "get",
    value: function get(x, y) {
      return this.data[y * this.size.x + x];
    }

    // Retrieve a grayscale value at the given pixel position of the image (safe, whatever that
    // means)
  }, {
    key: "getSafe",
    value: function getSafe(x, y) {
      // cache indexMapping because if we're using it once, we'll probably need it a bunch more
      // too
      if (!this.indexMapping) {
        this.indexMapping = {
          x: [],
          y: []
        };
        for (var i = 0; i < this.size.x; i++) {
          this.indexMapping.x[i] = i;
          this.indexMapping.x[i + this.size.x] = i;
        }
        for (var _i = 0; _i < this.size.y; _i++) {
          this.indexMapping.y[_i] = _i;
          this.indexMapping.y[_i + this.size.y] = _i;
        }
      }
      return this.data[this.indexMapping.y[y + this.size.y] * this.size.x + this.indexMapping.x[x + this.size.x]];
    }

    // Sets a given pixel position in the image to the given grayscale value
  }, {
    key: "set",
    value: function set(x, y, value) {
      this.data[y * this.size.x + x] = value;
      delete this.indexMapping;
      return this;
    }

    // Sets the border of the image (1 pixel) to zero
  }, {
    key: "zeroBorder",
    value: function zeroBorder() {
      var _this$size = this.size,
        width = _this$size.x,
        height = _this$size.y;
      for (var i = 0; i < width; i++) {
        // eslint-disable-next-line no-multi-assign
        this.data[i] = this.data[(height - 1) * width + i] = 0;
      }
      for (var _i2 = 1; _i2 < height - 1; _i2++) {
        // eslint-disable-next-line no-multi-assign
        this.data[_i2 * width] = this.data[_i2 * width + (width - 1)] = 0;
      }
      delete this.indexMapping;
      return this;
    }

    // TODO: this function is entirely too large for me to reason out right at this moment that i'm handling
    // all the rest of it, so this is a verbatim copy of the javascript source, with only tweaks
    // necessary to get it to run, no thought put into it yet.
  }, {
    key: "moments",
    value: function moments(labelCount) {
      var data = this.data;
      var x;
      var y;
      var height = this.size.y;
      var width = this.size.x;
      var val;
      var ysq;
      var labelSum = [];
      var i;
      var label;
      var mu11;
      var mu02;
      var mu20;
      var x_;
      var y_;
      var tmp;
      var result = [];
      var PI = Math.PI;
      var PI_4 = PI / 4;
      if (labelCount <= 0) {
        return result;
      }
      for (i = 0; i < labelCount; i++) {
        labelSum[i] = {
          m00: 0,
          m01: 0,
          m10: 0,
          m11: 0,
          m02: 0,
          m20: 0,
          theta: 0,
          rad: 0
        };
      }
      for (y = 0; y < height; y++) {
        ysq = y * y;
        for (x = 0; x < width; x++) {
          val = data[y * width + x];
          if (val > 0) {
            label = labelSum[val - 1];
            label.m00 += 1;
            label.m01 += y;
            label.m10 += x;
            label.m11 += x * y;
            label.m02 += ysq;
            label.m20 += x * x;
          }
        }
      }
      for (i = 0; i < labelCount; i++) {
        label = labelSum[i];
        // eslint-disable-next-line no-restricted-globals
        if (!isNaN(label.m00) && label.m00 !== 0) {
          x_ = label.m10 / label.m00;
          y_ = label.m01 / label.m00;
          mu11 = label.m11 / label.m00 - x_ * y_;
          mu02 = label.m02 / label.m00 - y_ * y_;
          mu20 = label.m20 / label.m00 - x_ * x_;
          tmp = (mu02 - mu20) / (2 * mu11);
          tmp = 0.5 * Math.atan(tmp) + (mu11 >= 0 ? PI_4 : -PI_4) + PI;
          // eslint-disable-next-line no-mixed-operators
          label.theta = (tmp * 180 / PI + 90) % 180 - 90;
          if (label.theta < 0) {
            label.theta += 180;
          }
          label.rad = tmp > PI ? tmp - PI : tmp;
          label.vec = gl_matrix__WEBPACK_IMPORTED_MODULE_4__[/* vec2 */ "c"].clone([Math.cos(tmp), Math.sin(tmp)]);
          result.push(label);
        }
      }
      return result;
    }

    // return a Uint8ClampedArray containing this grayscale image converted to RGBA form
  }, {
    key: "getAsRGBA",
    value: function getAsRGBA() {
      var scale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0;
      var ret = new Uint8ClampedArray(4 * this.size.x * this.size.y);
      for (var y = 0; y < this.size.y; y++) {
        for (var x = 0; x < this.size.x; x++) {
          var pixel = y * this.size.x + x;
          var current = this.get(x, y) * scale;
          ret[pixel * 4 + 0] = current;
          ret[pixel * 4 + 1] = current;
          ret[pixel * 4 + 2] = current;
          ret[pixel * 4 + 3] = 255;
        }
      }
      return ret;
    }

    // Display this ImageWrapper in a given Canvas element at the specified scale
  }, {
    key: "show",
    value: function show(canvas) {
      var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0;
      console.warn('* imagewrapper show getcontext 2d');
      var ctx = canvas.getContext('2d');
      if (!ctx) {
        throw new Error('Unable to get canvas context');
      }
      var frame = ctx.getImageData(0, 0, canvas.width, canvas.height);
      var data = this.getAsRGBA(scale);
      // eslint-disable-next-line no-param-reassign
      canvas.width = this.size.x;
      // eslint-disable-next-line no-param-reassign
      canvas.height = this.size.y;
      var newFrame = new ImageData(data, frame.width, frame.height);
      ctx.putImageData(newFrame, 0, 0);
    }

    // Displays a specified SubImage area in a given canvas. This differs drastically from
    // creating a new SubImage and using it's show() method. Why? I don't have the answer to that
    // yet.  I suspect the HSV/RGB operations involved here are making it significantly different,
    // but until I can visualize these functions side by side, I'm just going to copy the existing
    // implementation.
  }, {
    key: "overlay",
    value: function overlay(canvas, inScale, from) {
      var adjustedScale = inScale < 0 || inScale > 360 ? 360 : inScale;
      var hsv = [0, 1, 1];
      var rgb = [0, 0, 0];
      var whiteRgb = [255, 255, 255];
      var blackRgb = [0, 0, 0];
      var result = [];
      console.warn('* imagewrapper overlay getcontext 2d');
      var ctx = canvas.getContext('2d');
      if (!ctx) {
        throw new Error('Unable to get canvas context');
      }
      var frame = ctx.getImageData(from.x, from.y, this.size.x, this.size.y);
      var data = frame.data;
      var length = this.data.length;
      while (length--) {
        hsv[0] = this.data[length] * adjustedScale;
        // eslint-disable-next-line no-nested-ternary
        result = hsv[0] <= 0 ? whiteRgb : hsv[0] >= 360 ? blackRgb : Object(_cv_utils__WEBPACK_IMPORTED_MODULE_6__[/* hsv2rgb */ "g"])(hsv, rgb);
        var pos = length * 4;
        var _result = result;
        var _result2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_result, 3);
        data[pos] = _result2[0];
        data[pos + 1] = _result2[1];
        data[pos + 2] = _result2[2];
        data[pos + 3] = 255;
      }
      ctx.putImageData(frame, from.x, from.y);
    }
  }]);
  return ImageWrapper;
}();
/* harmony default export */ __webpack_exports__["a"] = (ImageWrapper);

/***/ }),
/* 13 */
/***/ (function(module, exports) {

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
  try {
    var info = gen[key](arg);
    var value = info.value;
  } catch (error) {
    reject(error);
    return;
  }
  if (info.done) {
    resolve(value);
  } else {
    Promise.resolve(value).then(_next, _throw);
  }
}
function _asyncToGenerator(fn) {
  return function () {
    var self = this,
      args = arguments;
    return new Promise(function (resolve, reject) {
      var gen = fn.apply(self, args);
      function _next(value) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
      }
      function _throw(err) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
      }
      _next(undefined);
    });
  };
}
module.exports = _asyncToGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 14 */
/***/ (function(module, exports, __webpack_require__) {

var superPropBase = __webpack_require__(140);
function _get() {
  if (typeof Reflect !== "undefined" && Reflect.get) {
    module.exports = _get = Reflect.get.bind(), module.exports.__esModule = true, module.exports["default"] = module.exports;
  } else {
    module.exports = _get = function _get(target, property, receiver) {
      var base = superPropBase(target, property);
      if (!base) return;
      var desc = Object.getOwnPropertyDescriptor(base, property);
      if (desc.get) {
        return desc.get.call(arguments.length < 3 ? target : receiver);
      }
      return desc.value;
    }, module.exports.__esModule = true, module.exports["default"] = module.exports;
  }
  return _get.apply(this, arguments);
}
module.exports = _get, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 15 */
/***/ (function(module, exports) {

/**
 * Checks if `value` is the
 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
 * @example
 *
 * _.isObject({});
 * // => true
 *
 * _.isObject([1, 2, 3]);
 * // => true
 *
 * _.isObject(_.noop);
 * // => true
 *
 * _.isObject(null);
 * // => false
 */
function isObject(value) {
  var type = typeof value;
  return value != null && (type == 'object' || type == 'function');
}
module.exports = isObject;

/***/ }),
/* 16 */
/***/ (function(module, exports) {

/**
 * Checks if `value` is classified as an `Array` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an array, else `false`.
 * @example
 *
 * _.isArray([1, 2, 3]);
 * // => true
 *
 * _.isArray(document.body.children);
 * // => false
 *
 * _.isArray('abc');
 * // => false
 *
 * _.isArray(_.noop);
 * // => false
 */
var isArray = Array.isArray;
module.exports = isArray;

/***/ }),
/* 17 */
/***/ (function(module, exports) {

function _typeof(obj) {
  "@babel/helpers - typeof";

  return (module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
    return typeof obj;
  } : function (obj) {
    return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
  }, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(obj);
}
module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 18 */
/***/ (function(module, exports, __webpack_require__) {

var baseMerge = __webpack_require__(73),
  createAssigner = __webpack_require__(128);

/**
 * This method is like `_.assign` except that it recursively merges own and
 * inherited enumerable string keyed properties of source objects into the
 * destination object. Source properties that resolve to `undefined` are
 * skipped if a destination value exists. Array and plain object properties
 * are merged recursively. Other objects and value types are overridden by
 * assignment. Source objects are applied from left to right. Subsequent
 * sources overwrite property assignments of previous sources.
 *
 * **Note:** This method mutates `object`.
 *
 * @static
 * @memberOf _
 * @since 0.5.0
 * @category Object
 * @param {Object} object The destination object.
 * @param {...Object} [sources] The source objects.
 * @returns {Object} Returns `object`.
 * @example
 *
 * var object = {
 *   'a': [{ 'b': 2 }, { 'd': 4 }]
 * };
 *
 * var other = {
 *   'a': [{ 'c': 3 }, { 'e': 5 }]
 * };
 *
 * _.merge(object, other);
 * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
 */
var merge = createAssigner(function (object, source, srcIndex) {
  baseMerge(object, source, srcIndex);
});
module.exports = merge;

/***/ }),
/* 19 */
/***/ (function(module, exports, __webpack_require__) {

var freeGlobal = __webpack_require__(44);

/** Detect free variable `self`. */
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;

/** Used as a reference to the global object. */
var root = freeGlobal || freeSelf || Function('return this')();
module.exports = root;

/***/ }),
/* 20 */
/***/ (function(module, exports) {

/**
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 * and has a `typeof` result of "object".
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 * @example
 *
 * _.isObjectLike({});
 * // => true
 *
 * _.isObjectLike([1, 2, 3]);
 * // => true
 *
 * _.isObjectLike(_.noop);
 * // => false
 *
 * _.isObjectLike(null);
 * // => false
 */
function isObjectLike(value) {
  return value != null && typeof value == 'object';
}
module.exports = isObjectLike;

/***/ }),
/* 21 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/**
 * http://www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization
 */
var Tracer = {
  searchDirections: [[0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1]],
  create: function create(imageWrapper, labelWrapper) {
    var imageData = imageWrapper.data;
    var labelData = labelWrapper.data;
    var searchDirections = this.searchDirections;
    var width = imageWrapper.size.x;
    var pos;
    function _trace(current, color, label, edgelabel) {
      var i;
      var y;
      var x;
      for (i = 0; i < searchDirections.length; i++) {
        y = current.cy + searchDirections[current.dir][0];
        x = current.cx + searchDirections[current.dir][1];
        pos = y * width + x;
        if (imageData[pos] === color && (labelData[pos] === 0 || labelData[pos] === label)) {
          labelData[pos] = label;
          current.cy = y;
          current.cx = x;
          return true;
        }
        if (labelData[pos] === 0) {
          labelData[pos] = edgelabel;
        }
        current.dir = (current.dir + 1) % 8;
      }
      return false;
    }
    function vertex2D(x, y, dir) {
      return {
        dir: dir,
        x: x,
        y: y,
        next: null,
        prev: null
      };
    }
    function _contourTracing(sy, sx, label, color, edgelabel) {
      var Fv = null;
      var Cv;
      var P;
      var ldir;
      var current = {
        cx: sx,
        cy: sy,
        dir: 0
      };
      if (_trace(current, color, label, edgelabel)) {
        Fv = vertex2D(sx, sy, current.dir);
        Cv = Fv;
        ldir = current.dir;
        P = vertex2D(current.cx, current.cy, 0);
        P.prev = Cv;
        Cv.next = P;
        P.next = null;
        Cv = P;
        var totalPixelCount = imageWrapper.size.x * imageWrapper.size.y;
        var pixelCounter = 0;
        do {
          current.dir = (current.dir + 6) % 8;
          _trace(current, color, label, edgelabel);
          if (ldir !== current.dir) {
            Cv.dir = current.dir;
            P = vertex2D(current.cx, current.cy, 0);
            P.prev = Cv;
            Cv.next = P;
            P.next = null;
            Cv = P;
          } else {
            Cv.dir = ldir;
            Cv.x = current.cx;
            Cv.y = current.cy;
          }
          ldir = current.dir;
        } while ((current.cx !== sx || current.cy !== sy) && ++pixelCounter < totalPixelCount);
        Fv.prev = Cv.prev;
        Cv.prev.next = Fv;
      }
      return Fv;
    }
    return {
      trace: function trace(current, color, label, edgelabel) {
        return _trace(current, color, label, edgelabel);
      },
      contourTracing: function contourTracing(sy, sx, label, color, edgelabel) {
        return _contourTracing(sy, sx, label, color, edgelabel);
      }
    };
  }
};
/* harmony default export */ __webpack_exports__["a"] = (Tracer);

/***/ }),
/* 22 */
/***/ (function(module, exports, __webpack_require__) {

var Symbol = __webpack_require__(27),
  getRawTag = __webpack_require__(86),
  objectToString = __webpack_require__(87);

/** `Object#toString` result references. */
var nullTag = '[object Null]',
  undefinedTag = '[object Undefined]';

/** Built-in value references. */
var symToStringTag = Symbol ? Symbol.toStringTag : undefined;

/**
 * The base implementation of `getTag` without fallbacks for buggy environments.
 *
 * @private
 * @param {*} value The value to query.
 * @returns {string} Returns the `toStringTag`.
 */
function baseGetTag(value) {
  if (value == null) {
    return value === undefined ? undefinedTag : nullTag;
  }
  return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
}
module.exports = baseGetTag;

/***/ }),
/* 23 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5);
/* harmony import */ var _common_image_wrapper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12);
/* harmony import */ var _common_cv_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9);
/* harmony import */ var _common_array_helper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11);
/* harmony import */ var _common_image_debug__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(10);
/* harmony import */ var _rasterizer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(64);
/* harmony import */ var _tracer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(21);
/* harmony import */ var _skeletonizer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(65);








gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* glMatrix */ "a"].setMatrixArrayType(Array);
var _config;
var _currentImageWrapper;
var _skelImageWrapper;
var _subImageWrapper;
var _labelImageWrapper;
var _patchGrid;
var _patchLabelGrid;
var _imageToPatchGrid;
var _binaryImageWrapper;
var _patchSize;
var _canvasContainer = {
  ctx: {
    binary: null
  },
  dom: {
    binary: null
  }
};
var _numPatches = {
  x: 0,
  y: 0
};
var _inputImageWrapper;
var _skeletonizer;
function initBuffers() {
  if (_config.halfSample) {
    _currentImageWrapper = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"]({
      // eslint-disable-next-line no-bitwise
      x: _inputImageWrapper.size.x / 2 | 0,
      // eslint-disable-next-line no-bitwise
      y: _inputImageWrapper.size.y / 2 | 0
    });
  } else {
    _currentImageWrapper = _inputImageWrapper;
  }
  _patchSize = Object(_common_cv_utils__WEBPACK_IMPORTED_MODULE_2__[/* calculatePatchSize */ "a"])(_config.patchSize, _currentImageWrapper.size);

  // eslint-disable-next-line no-bitwise
  _numPatches.x = _currentImageWrapper.size.x / _patchSize.x | 0;
  // eslint-disable-next-line no-bitwise
  _numPatches.y = _currentImageWrapper.size.y / _patchSize.y | 0;
  _binaryImageWrapper = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"](_currentImageWrapper.size, undefined, Uint8Array, false);
  _labelImageWrapper = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"](_patchSize, undefined, Array, true);
  var skeletonImageData = new ArrayBuffer(64 * 1024);
  _subImageWrapper = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"](_patchSize, new Uint8Array(skeletonImageData, 0, _patchSize.x * _patchSize.y));
  _skelImageWrapper = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"](_patchSize, new Uint8Array(skeletonImageData, _patchSize.x * _patchSize.y * 3, _patchSize.x * _patchSize.y), undefined, true);
  _skeletonizer = Object(_skeletonizer__WEBPACK_IMPORTED_MODULE_7__[/* default */ "a"])(typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : global, {
    size: _patchSize.x
  }, skeletonImageData);
  _imageToPatchGrid = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"]({
    // eslint-disable-next-line no-bitwise
    x: _currentImageWrapper.size.x / _subImageWrapper.size.x | 0,
    // eslint-disable-next-line no-bitwise
    y: _currentImageWrapper.size.y / _subImageWrapper.size.y | 0
  }, undefined, Array, true);
  _patchGrid = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"](_imageToPatchGrid.size, undefined, undefined, true);
  _patchLabelGrid = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"](_imageToPatchGrid.size, undefined, Int32Array, true);
}
function initCanvas() {
  if (_config.useWorker || typeof document === 'undefined') {
    return;
  }
  _canvasContainer.dom.binary = document.createElement('canvas');
  _canvasContainer.dom.binary.className = 'binaryBuffer';
  if ( true && _config.debug.showCanvas === true) {
    document.querySelector('#debug').appendChild(_canvasContainer.dom.binary);
  }
  var willReadFrequently = !!_config.willReadFrequently;
  console.warn('* initCanvas willReadFrequently', willReadFrequently, _config);
  _canvasContainer.ctx.binary = _canvasContainer.dom.binary.getContext('2d', {
    willReadFrequently: willReadFrequently
  });
  _canvasContainer.dom.binary.width = _binaryImageWrapper.size.x;
  _canvasContainer.dom.binary.height = _binaryImageWrapper.size.y;
}

/**
 * Creates a bounding box which encloses all the given patches
 * @returns {Array} The minimal bounding box
 */
function boxFromPatches(patches) {
  var overAvg;
  var i;
  var j;
  var patch;
  var transMat;
  var minx = _binaryImageWrapper.size.x;
  var miny = _binaryImageWrapper.size.y;
  var maxx = -_binaryImageWrapper.size.x;
  var maxy = -_binaryImageWrapper.size.y;
  var box;
  var scale;

  // draw all patches which are to be taken into consideration
  overAvg = 0;
  for (i = 0; i < patches.length; i++) {
    patch = patches[i];
    overAvg += patch.rad;
    if ( true && _config.debug.showPatches) {
      _common_image_debug__WEBPACK_IMPORTED_MODULE_4__[/* default */ "a"].drawRect(patch.pos, _subImageWrapper.size, _canvasContainer.ctx.binary, {
        color: 'red'
      });
    }
  }
  overAvg /= patches.length;
  overAvg = (overAvg * 180 / Math.PI + 90) % 180 - 90;
  if (overAvg < 0) {
    overAvg += 180;
  }
  overAvg = (180 - overAvg) * Math.PI / 180;
  transMat = gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* mat2 */ "b"].copy(gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* mat2 */ "b"].create(), [Math.cos(overAvg), Math.sin(overAvg), -Math.sin(overAvg), Math.cos(overAvg)]);

  // iterate over patches and rotate by angle
  for (i = 0; i < patches.length; i++) {
    patch = patches[i];
    for (j = 0; j < 4; j++) {
      gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* vec2 */ "c"].transformMat2(patch.box[j], patch.box[j], transMat);
    }
    if ( true && _config.debug.boxFromPatches.showTransformed) {
      _common_image_debug__WEBPACK_IMPORTED_MODULE_4__[/* default */ "a"].drawPath(patch.box, {
        x: 0,
        y: 1
      }, _canvasContainer.ctx.binary, {
        color: '#99ff00',
        lineWidth: 2
      });
    }
  }

  // find bounding box
  for (i = 0; i < patches.length; i++) {
    patch = patches[i];
    for (j = 0; j < 4; j++) {
      if (patch.box[j][0] < minx) {
        minx = patch.box[j][0];
      }
      if (patch.box[j][0] > maxx) {
        maxx = patch.box[j][0];
      }
      if (patch.box[j][1] < miny) {
        miny = patch.box[j][1];
      }
      if (patch.box[j][1] > maxy) {
        maxy = patch.box[j][1];
      }
    }
  }
  box = [[minx, miny], [maxx, miny], [maxx, maxy], [minx, maxy]];
  if ( true && _config.debug.boxFromPatches.showTransformedBox) {
    _common_image_debug__WEBPACK_IMPORTED_MODULE_4__[/* default */ "a"].drawPath(box, {
      x: 0,
      y: 1
    }, _canvasContainer.ctx.binary, {
      color: '#ff0000',
      lineWidth: 2
    });
  }
  scale = _config.halfSample ? 2 : 1;
  // reverse rotation;
  transMat = gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* mat2 */ "b"].invert(transMat, transMat);
  for (j = 0; j < 4; j++) {
    gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* vec2 */ "c"].transformMat2(box[j], box[j], transMat);
  }
  if ( true && _config.debug.boxFromPatches.showBB) {
    _common_image_debug__WEBPACK_IMPORTED_MODULE_4__[/* default */ "a"].drawPath(box, {
      x: 0,
      y: 1
    }, _canvasContainer.ctx.binary, {
      color: '#ff0000',
      lineWidth: 2
    });
  }
  for (j = 0; j < 4; j++) {
    gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* vec2 */ "c"].scale(box[j], box[j], scale);
  }
  return box;
}

/**
 * Creates a binary image of the current image
 */
function binarizeImage() {
  Object(_common_cv_utils__WEBPACK_IMPORTED_MODULE_2__[/* otsuThreshold */ "i"])(_currentImageWrapper, _binaryImageWrapper);
  _binaryImageWrapper.zeroBorder();
  if ( true && _config.debug.showCanvas) {
    _binaryImageWrapper.show(_canvasContainer.dom.binary, 255);
  }
}

/**
 * Iterate over the entire image
 * extract patches
 */
function findPatches() {
  var i;
  var j;
  var x;
  var y;
  var moments;
  var patchesFound = [];
  var rasterizer;
  var rasterResult;
  var patch;
  for (i = 0; i < _numPatches.x; i++) {
    for (j = 0; j < _numPatches.y; j++) {
      x = _subImageWrapper.size.x * i;
      y = _subImageWrapper.size.y * j;

      // seperate parts
      skeletonize(x, y);

      // Rasterize, find individual bars
      _skelImageWrapper.zeroBorder();
      _common_array_helper__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"].init(_labelImageWrapper.data, 0);
      rasterizer = _rasterizer__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"].create(_skelImageWrapper, _labelImageWrapper);
      rasterResult = rasterizer.rasterize(0);
      if ( true && _config.debug.showLabels) {
        _labelImageWrapper.overlay(_canvasContainer.dom.binary, Math.floor(360 / rasterResult.count), {
          x: x,
          y: y
        });
      }

      // calculate moments from the skeletonized patch
      moments = _labelImageWrapper.moments(rasterResult.count);

      // extract eligible patches
      patchesFound = patchesFound.concat(describePatch(moments, [i, j], x, y));
    }
  }
  if ( true && _config.debug.showFoundPatches) {
    for (i = 0; i < patchesFound.length; i++) {
      patch = patchesFound[i];
      _common_image_debug__WEBPACK_IMPORTED_MODULE_4__[/* default */ "a"].drawRect(patch.pos, _subImageWrapper.size, _canvasContainer.ctx.binary, {
        color: '#99ff00',
        lineWidth: 2
      });
    }
  }
  return patchesFound;
}

/**
 * Finds those connected areas which contain at least 6 patches
 * and returns them ordered DESC by the number of contained patches
 * @param {Number} maxLabel
 */
function findBiggestConnectedAreas(maxLabel) {
  var i;
  var sum;
  var labelHist = [];
  var topLabels = [];
  for (i = 0; i < maxLabel; i++) {
    labelHist.push(0);
  }
  sum = _patchLabelGrid.data.length;
  while (sum--) {
    if (_patchLabelGrid.data[sum] > 0) {
      labelHist[_patchLabelGrid.data[sum] - 1]++;
    }
  }
  labelHist = labelHist.map(function (val, idx) {
    return {
      val: val,
      label: idx + 1
    };
  });
  labelHist.sort(function (a, b) {
    return b.val - a.val;
  });

  // extract top areas with at least 6 patches present
  topLabels = labelHist.filter(function (el) {
    return el.val >= 5;
  });
  return topLabels;
}

/**
 *
 */
function findBoxes(topLabels, maxLabel) {
  var i;
  var j;
  var sum;
  var patches = [];
  var patch;
  var box;
  var boxes = [];
  var hsv = [0, 1, 1];
  var rgb = [0, 0, 0];
  for (i = 0; i < topLabels.length; i++) {
    sum = _patchLabelGrid.data.length;
    patches.length = 0;
    while (sum--) {
      if (_patchLabelGrid.data[sum] === topLabels[i].label) {
        patch = _imageToPatchGrid.data[sum];
        patches.push(patch);
      }
    }
    box = boxFromPatches(patches);
    if (box) {
      boxes.push(box);

      // draw patch-labels if requested
      if ( true && _config.debug.showRemainingPatchLabels) {
        for (j = 0; j < patches.length; j++) {
          patch = patches[j];
          hsv[0] = topLabels[i].label / (maxLabel + 1) * 360;
          Object(_common_cv_utils__WEBPACK_IMPORTED_MODULE_2__[/* hsv2rgb */ "g"])(hsv, rgb);
          _common_image_debug__WEBPACK_IMPORTED_MODULE_4__[/* default */ "a"].drawRect(patch.pos, _subImageWrapper.size, _canvasContainer.ctx.binary, {
            color: "rgb(".concat(rgb.join(','), ")"),
            lineWidth: 2
          });
        }
      }
    }
  }
  return boxes;
}

/**
 * Find similar moments (via cluster)
 * @param {Object} moments
 */
function similarMoments(moments) {
  var clusters = Object(_common_cv_utils__WEBPACK_IMPORTED_MODULE_2__[/* cluster */ "b"])(moments, 0.90);
  var topCluster = Object(_common_cv_utils__WEBPACK_IMPORTED_MODULE_2__[/* topGeneric */ "j"])(clusters, 1, function (e) {
    return e.getPoints().length;
  });
  var points = [];
  var result = [];
  if (topCluster.length === 1) {
    points = topCluster[0].item.getPoints();
    for (var i = 0; i < points.length; i++) {
      result.push(points[i].point);
    }
  }
  return result;
}
function skeletonize(x, y) {
  _binaryImageWrapper.subImageAsCopy(_subImageWrapper, Object(_common_cv_utils__WEBPACK_IMPORTED_MODULE_2__[/* imageRef */ "h"])(x, y));
  _skeletonizer.skeletonize();

  // Show skeleton if requested
  if ( true && _config.debug.showSkeleton) {
    _skelImageWrapper.overlay(_canvasContainer.dom.binary, 360, Object(_common_cv_utils__WEBPACK_IMPORTED_MODULE_2__[/* imageRef */ "h"])(x, y));
  }
}

/**
 * Extracts and describes those patches which seem to contain a barcode pattern
 * @param {Array} moments
 * @param {Object} patchPos,
 * @param {Number} x
 * @param {Number} y
 * @returns {Array} list of patches
 */
function describePatch(moments, patchPos, x, y) {
  var k;
  var avg;
  var eligibleMoments = [];
  var matchingMoments;
  var patch;
  var patchesFound = [];
  var minComponentWeight = Math.ceil(_patchSize.x / 3);
  if (moments.length >= 2) {
    // only collect moments which's area covers at least minComponentWeight pixels.
    for (k = 0; k < moments.length; k++) {
      if (moments[k].m00 > minComponentWeight) {
        eligibleMoments.push(moments[k]);
      }
    }

    // if at least 2 moments are found which have at least minComponentWeights covered
    if (eligibleMoments.length >= 2) {
      matchingMoments = similarMoments(eligibleMoments);
      avg = 0;
      // determine the similarity of the moments
      for (k = 0; k < matchingMoments.length; k++) {
        var _matchingMoments$k$ra, _matchingMoments$k;
        avg += (_matchingMoments$k$ra = (_matchingMoments$k = matchingMoments[k]) === null || _matchingMoments$k === void 0 ? void 0 : _matchingMoments$k.rad) !== null && _matchingMoments$k$ra !== void 0 ? _matchingMoments$k$ra : 0;
      }

      // Only two of the moments are allowed not to fit into the equation
      // add the patch to the set
      if (matchingMoments.length > 1 && matchingMoments.length >= eligibleMoments.length / 4 * 3 && matchingMoments.length > moments.length / 4) {
        avg /= matchingMoments.length;
        patch = {
          index: patchPos[1] * _numPatches.x + patchPos[0],
          pos: {
            x: x,
            y: y
          },
          box: [gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* vec2 */ "c"].clone([x, y]), gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* vec2 */ "c"].clone([x + _subImageWrapper.size.x, y]), gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* vec2 */ "c"].clone([x + _subImageWrapper.size.x, y + _subImageWrapper.size.y]), gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* vec2 */ "c"].clone([x, y + _subImageWrapper.size.y])],
          moments: matchingMoments,
          rad: avg,
          vec: gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* vec2 */ "c"].clone([Math.cos(avg), Math.sin(avg)])
        };
        patchesFound.push(patch);
      }
    }
  }
  return patchesFound;
}

/**
 * finds patches which are connected and share the same orientation
 * @param {Object} patchesFound
 */
function rasterizeAngularSimilarity(patchesFound) {
  var label = 0;
  var threshold = 0.95;
  var currIdx = 0;
  var j;
  var patch;
  var hsv = [0, 1, 1];
  var rgb = [0, 0, 0];
  function notYetProcessed() {
    var i;
    for (i = 0; i < _patchLabelGrid.data.length; i++) {
      if (_patchLabelGrid.data[i] === 0 && _patchGrid.data[i] === 1) {
        return i;
      }
    }
    return _patchLabelGrid.data.length;
  }
  function trace(currentIdx) {
    var x;
    var y;
    var currentPatch;
    var idx;
    var dir;
    var current = {
      x: currentIdx % _patchLabelGrid.size.x,
      y: currentIdx / _patchLabelGrid.size.x | 0
    };
    var similarity;
    if (currentIdx < _patchLabelGrid.data.length) {
      currentPatch = _imageToPatchGrid.data[currentIdx];
      // assign label
      _patchLabelGrid.data[currentIdx] = label;
      for (dir = 0; dir < _tracer__WEBPACK_IMPORTED_MODULE_6__[/* default */ "a"].searchDirections.length; dir++) {
        y = current.y + _tracer__WEBPACK_IMPORTED_MODULE_6__[/* default */ "a"].searchDirections[dir][0];
        x = current.x + _tracer__WEBPACK_IMPORTED_MODULE_6__[/* default */ "a"].searchDirections[dir][1];
        idx = y * _patchLabelGrid.size.x + x;

        // continue if patch empty
        if (_patchGrid.data[idx] === 0) {
          _patchLabelGrid.data[idx] = Number.MAX_VALUE;
          // eslint-disable-next-line no-continue
          continue;
        }
        if (_patchLabelGrid.data[idx] === 0) {
          similarity = Math.abs(gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* vec2 */ "c"].dot(_imageToPatchGrid.data[idx].vec, currentPatch.vec));
          if (similarity > threshold) {
            trace(idx);
          }
        }
      }
    }
  }

  // prepare for finding the right patches
  _common_array_helper__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"].init(_patchGrid.data, 0);
  _common_array_helper__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"].init(_patchLabelGrid.data, 0);
  _common_array_helper__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"].init(_imageToPatchGrid.data, null);
  for (j = 0; j < patchesFound.length; j++) {
    patch = patchesFound[j];
    _imageToPatchGrid.data[patch.index] = patch;
    _patchGrid.data[patch.index] = 1;
  }

  // rasterize the patches found to determine area
  _patchGrid.zeroBorder();

  // eslint-disable-next-line no-cond-assign
  while ((currIdx = notYetProcessed()) < _patchLabelGrid.data.length) {
    label++;
    trace(currIdx);
  }

  // draw patch-labels if requested
  if ( true && _config.debug.showPatchLabels) {
    for (j = 0; j < _patchLabelGrid.data.length; j++) {
      if (_patchLabelGrid.data[j] > 0 && _patchLabelGrid.data[j] <= label) {
        patch = _imageToPatchGrid.data[j];
        hsv[0] = _patchLabelGrid.data[j] / (label + 1) * 360;
        Object(_common_cv_utils__WEBPACK_IMPORTED_MODULE_2__[/* hsv2rgb */ "g"])(hsv, rgb);
        _common_image_debug__WEBPACK_IMPORTED_MODULE_4__[/* default */ "a"].drawRect(patch.pos, _subImageWrapper.size, _canvasContainer.ctx.binary, {
          color: "rgb(".concat(rgb.join(','), ")"),
          lineWidth: 2
        });
      }
    }
  }
  return label;
}
/* harmony default export */ __webpack_exports__["a"] = ({
  init: function init(inputImageWrapper, config) {
    _config = config;
    _inputImageWrapper = inputImageWrapper;
    initBuffers();
    initCanvas();
  },
  locate: function locate() {
    if (_config.halfSample) {
      Object(_common_cv_utils__WEBPACK_IMPORTED_MODULE_2__[/* halfSample */ "f"])(_inputImageWrapper, _currentImageWrapper);
    }
    binarizeImage();
    var patchesFound = findPatches();
    // return unless 5% or more patches are found
    if (patchesFound.length < _numPatches.x * _numPatches.y * 0.05) {
      return null;
    }

    // rasterrize area by comparing angular similarity;
    var maxLabel = rasterizeAngularSimilarity(patchesFound);
    if (maxLabel < 1) {
      return null;
    }

    // search for area with the most patches (biggest connected area)
    var topLabels = findBiggestConnectedAreas(maxLabel);
    if (topLabels.length === 0) {
      return null;
    }
    var boxes = findBoxes(topLabels, maxLabel);
    return boxes;
  },
  checkImageConstraints: function checkImageConstraints(inputStream, config) {
    var patchSize;
    var width = inputStream.getWidth();
    var height = inputStream.getHeight();
    var thisHalfSample = config.halfSample ? 0.5 : 1;
    var area;

    // calculate width and height based on area
    if (inputStream.getConfig().area) {
      area = Object(_common_cv_utils__WEBPACK_IMPORTED_MODULE_2__[/* computeImageArea */ "d"])(width, height, inputStream.getConfig().area);
      inputStream.setTopRight({
        x: area.sx,
        y: area.sy
      });
      inputStream.setCanvasSize({
        x: width,
        y: height
      });
      width = area.sw;
      height = area.sh;
    }
    var size = {
      x: Math.floor(width * thisHalfSample),
      y: Math.floor(height * thisHalfSample)
    };
    patchSize = Object(_common_cv_utils__WEBPACK_IMPORTED_MODULE_2__[/* calculatePatchSize */ "a"])(config.patchSize, size);
    if (true) {
      console.log("Patch-Size: ".concat(JSON.stringify(patchSize)));
    }
    inputStream.setWidth(Math.floor(Math.floor(size.x / patchSize.x) * (1 / thisHalfSample) * patchSize.x));
    inputStream.setHeight(Math.floor(Math.floor(size.y / patchSize.y) * (1 / thisHalfSample) * patchSize.y));
    if (inputStream.getWidth() % patchSize.x === 0 && inputStream.getHeight() % patchSize.y === 0) {
      return true;
    }
    throw new Error("Image dimensions do not comply with the current settings: Width (".concat(width, " )and height (").concat(height, ") must a multiple of ").concat(patchSize.x));
  }
});
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(45)))

/***/ }),
/* 24 */
/***/ (function(module, exports, __webpack_require__) {

var listCacheClear = __webpack_require__(75),
  listCacheDelete = __webpack_require__(76),
  listCacheGet = __webpack_require__(77),
  listCacheHas = __webpack_require__(78),
  listCacheSet = __webpack_require__(79);

/**
 * Creates an list cache object.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */
function ListCache(entries) {
  var index = -1,
    length = entries == null ? 0 : entries.length;
  this.clear();
  while (++index < length) {
    var entry = entries[index];
    this.set(entry[0], entry[1]);
  }
}

// Add methods to `ListCache`.
ListCache.prototype.clear = listCacheClear;
ListCache.prototype['delete'] = listCacheDelete;
ListCache.prototype.get = listCacheGet;
ListCache.prototype.has = listCacheHas;
ListCache.prototype.set = listCacheSet;
module.exports = ListCache;

/***/ }),
/* 25 */
/***/ (function(module, exports, __webpack_require__) {

var eq = __webpack_require__(26);

/**
 * Gets the index at which the `key` is found in `array` of key-value pairs.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {*} key The key to search for.
 * @returns {number} Returns the index of the matched value, else `-1`.
 */
function assocIndexOf(array, key) {
  var length = array.length;
  while (length--) {
    if (eq(array[length][0], key)) {
      return length;
    }
  }
  return -1;
}
module.exports = assocIndexOf;

/***/ }),
/* 26 */
/***/ (function(module, exports) {

/**
 * Performs a
 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * comparison between two values to determine if they are equivalent.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
 * @example
 *
 * var object = { 'a': 1 };
 * var other = { 'a': 1 };
 *
 * _.eq(object, object);
 * // => true
 *
 * _.eq(object, other);
 * // => false
 *
 * _.eq('a', 'a');
 * // => true
 *
 * _.eq('a', Object('a'));
 * // => false
 *
 * _.eq(NaN, NaN);
 * // => true
 */
function eq(value, other) {
  return value === other || value !== value && other !== other;
}
module.exports = eq;

/***/ }),
/* 27 */
/***/ (function(module, exports, __webpack_require__) {

var root = __webpack_require__(19);

/** Built-in value references. */
var Symbol = root.Symbol;
module.exports = Symbol;

/***/ }),
/* 28 */
/***/ (function(module, exports, __webpack_require__) {

var getNative = __webpack_require__(34);

/* Built-in method references that are verified to be native. */
var nativeCreate = getNative(Object, 'create');
module.exports = nativeCreate;

/***/ }),
/* 29 */
/***/ (function(module, exports, __webpack_require__) {

var isKeyable = __webpack_require__(100);

/**
 * Gets the data for `map`.
 *
 * @private
 * @param {Object} map The map to query.
 * @param {string} key The reference key.
 * @returns {*} Returns the map data.
 */
function getMapData(map, key) {
  var data = map.__data__;
  return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map;
}
module.exports = getMapData;

/***/ }),
/* 30 */
/***/ (function(module, exports, __webpack_require__) {

var baseIsArguments = __webpack_require__(115),
  isObjectLike = __webpack_require__(20);

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/** Built-in value references. */
var propertyIsEnumerable = objectProto.propertyIsEnumerable;

/**
 * Checks if `value` is likely an `arguments` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
 *  else `false`.
 * @example
 *
 * _.isArguments(function() { return arguments; }());
 * // => true
 *
 * _.isArguments([1, 2, 3]);
 * // => false
 */
var isArguments = baseIsArguments(function () {
  return arguments;
}()) ? baseIsArguments : function (value) {
  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
};
module.exports = isArguments;

/***/ }),
/* 31 */
/***/ (function(module, exports) {

/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;

/** Used to detect unsigned integer values. */
var reIsUint = /^(?:0|[1-9]\d*)$/;

/**
 * Checks if `value` is a valid array-like index.
 *
 * @private
 * @param {*} value The value to check.
 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
 */
function isIndex(value, length) {
  var type = typeof value;
  length = length == null ? MAX_SAFE_INTEGER : length;
  return !!length && (type == 'number' || type != 'symbol' && reIsUint.test(value)) && value > -1 && value % 1 == 0 && value < length;
}
module.exports = isIndex;

/***/ }),
/* 32 */
/***/ (function(module, exports, __webpack_require__) {

var isArray = __webpack_require__(16),
  isKey = __webpack_require__(147),
  stringToPath = __webpack_require__(148),
  toString = __webpack_require__(151);

/**
 * Casts `value` to a path array if it's not one.
 *
 * @private
 * @param {*} value The value to inspect.
 * @param {Object} [object] The object to query keys on.
 * @returns {Array} Returns the cast property path array.
 */
function castPath(value, object) {
  if (isArray(value)) {
    return value;
  }
  return isKey(value, object) ? [value] : stringToPath(toString(value));
}
module.exports = castPath;

/***/ }),
/* 33 */
/***/ (function(module, exports, __webpack_require__) {

var arrayWithoutHoles = __webpack_require__(141);
var iterableToArray = __webpack_require__(142);
var unsupportedIterableToArray = __webpack_require__(59);
var nonIterableSpread = __webpack_require__(143);
function _toConsumableArray(arr) {
  return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();
}
module.exports = _toConsumableArray, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 34 */
/***/ (function(module, exports, __webpack_require__) {

var baseIsNative = __webpack_require__(85),
  getValue = __webpack_require__(91);

/**
 * Gets the native function at `key` of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {string} key The key of the method to get.
 * @returns {*} Returns the function if it's native, else `undefined`.
 */
function getNative(object, key) {
  var value = getValue(object, key);
  return baseIsNative(value) ? value : undefined;
}
module.exports = getNative;

/***/ }),
/* 35 */
/***/ (function(module, exports, __webpack_require__) {

var baseGetTag = __webpack_require__(22),
  isObject = __webpack_require__(15);

/** `Object#toString` result references. */
var asyncTag = '[object AsyncFunction]',
  funcTag = '[object Function]',
  genTag = '[object GeneratorFunction]',
  proxyTag = '[object Proxy]';

/**
 * Checks if `value` is classified as a `Function` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a function, else `false`.
 * @example
 *
 * _.isFunction(_);
 * // => true
 *
 * _.isFunction(/abc/);
 * // => false
 */
function isFunction(value) {
  if (!isObject(value)) {
    return false;
  }
  // The use of `Object#toString` avoids issues with the `typeof` operator
  // in Safari 9 which returns 'object' for typed arrays and other constructors.
  var tag = baseGetTag(value);
  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
}
module.exports = isFunction;

/***/ }),
/* 36 */
/***/ (function(module, exports, __webpack_require__) {

var defineProperty = __webpack_require__(48);

/**
 * The base implementation of `assignValue` and `assignMergeValue` without
 * value checks.
 *
 * @private
 * @param {Object} object The object to modify.
 * @param {string} key The key of the property to assign.
 * @param {*} value The value to assign.
 */
function baseAssignValue(object, key, value) {
  if (key == '__proto__' && defineProperty) {
    defineProperty(object, key, {
      'configurable': true,
      'enumerable': true,
      'value': value,
      'writable': true
    });
  } else {
    object[key] = value;
  }
}
module.exports = baseAssignValue;

/***/ }),
/* 37 */
/***/ (function(module, exports) {

module.exports = function (module) {
  if (!module.webpackPolyfill) {
    module.deprecate = function () {};
    module.paths = [];
    // module.parent = undefined by default
    if (!module.children) module.children = [];
    Object.defineProperty(module, "loaded", {
      enumerable: true,
      get: function () {
        return module.l;
      }
    });
    Object.defineProperty(module, "id", {
      enumerable: true,
      get: function () {
        return module.i;
      }
    });
    module.webpackPolyfill = 1;
  }
  return module;
};

/***/ }),
/* 38 */
/***/ (function(module, exports, __webpack_require__) {

var isFunction = __webpack_require__(35),
  isLength = __webpack_require__(39);

/**
 * Checks if `value` is array-like. A value is considered array-like if it's
 * not a function and has a `value.length` that's an integer greater than or
 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
 * @example
 *
 * _.isArrayLike([1, 2, 3]);
 * // => true
 *
 * _.isArrayLike(document.body.children);
 * // => true
 *
 * _.isArrayLike('abc');
 * // => true
 *
 * _.isArrayLike(_.noop);
 * // => false
 */
function isArrayLike(value) {
  return value != null && isLength(value.length) && !isFunction(value);
}
module.exports = isArrayLike;

/***/ }),
/* 39 */
/***/ (function(module, exports) {

/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;

/**
 * Checks if `value` is a valid array-like length.
 *
 * **Note:** This method is loosely based on
 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
 * @example
 *
 * _.isLength(3);
 * // => true
 *
 * _.isLength(Number.MIN_VALUE);
 * // => false
 *
 * _.isLength(Infinity);
 * // => false
 *
 * _.isLength('3');
 * // => false
 */
function isLength(value) {
  return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}
module.exports = isLength;

/***/ }),
/* 40 */
/***/ (function(module, exports) {

function _setPrototypeOf(o, p) {
  module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
    o.__proto__ = p;
    return o;
  }, module.exports.__esModule = true, module.exports["default"] = module.exports;
  return _setPrototypeOf(o, p);
}
module.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 41 */
/***/ (function(module, exports, __webpack_require__) {

var baseGetTag = __webpack_require__(22),
  isObjectLike = __webpack_require__(20);

/** `Object#toString` result references. */
var symbolTag = '[object Symbol]';

/**
 * Checks if `value` is classified as a `Symbol` primitive or object.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
 * @example
 *
 * _.isSymbol(Symbol.iterator);
 * // => true
 *
 * _.isSymbol('abc');
 * // => false
 */
function isSymbol(value) {
  return typeof value == 'symbol' || isObjectLike(value) && baseGetTag(value) == symbolTag;
}
module.exports = isSymbol;

/***/ }),
/* 42 */
/***/ (function(module, exports, __webpack_require__) {

var isSymbol = __webpack_require__(41);

/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;

/**
 * Converts `value` to a string key if it's not a string or symbol.
 *
 * @private
 * @param {*} value The value to inspect.
 * @returns {string|symbol} Returns the key.
 */
function toKey(value) {
  if (typeof value == 'string' || isSymbol(value)) {
    return value;
  }
  var result = value + '';
  return result == '0' && 1 / value == -INFINITY ? '-0' : result;
}
module.exports = toKey;

/***/ }),
/* 43 */
/***/ (function(module, exports, __webpack_require__) {

var getNative = __webpack_require__(34),
  root = __webpack_require__(19);

/* Built-in method references that are verified to be native. */
var Map = getNative(root, 'Map');
module.exports = Map;

/***/ }),
/* 44 */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
module.exports = freeGlobal;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(45)))

/***/ }),
/* 45 */
/***/ (function(module, exports) {

var g;

// This works in non-strict mode
g = function () {
  return this;
}();
try {
  // This works if eval is allowed (see CSP)
  g = g || new Function("return this")();
} catch (e) {
  // This works if the window reference is available
  if (typeof window === "object") g = window;
}

// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}

module.exports = g;

/***/ }),
/* 46 */
/***/ (function(module, exports, __webpack_require__) {

var mapCacheClear = __webpack_require__(92),
  mapCacheDelete = __webpack_require__(99),
  mapCacheGet = __webpack_require__(101),
  mapCacheHas = __webpack_require__(102),
  mapCacheSet = __webpack_require__(103);

/**
 * Creates a map cache object to store key-value pairs.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */
function MapCache(entries) {
  var index = -1,
    length = entries == null ? 0 : entries.length;
  this.clear();
  while (++index < length) {
    var entry = entries[index];
    this.set(entry[0], entry[1]);
  }
}

// Add methods to `MapCache`.
MapCache.prototype.clear = mapCacheClear;
MapCache.prototype['delete'] = mapCacheDelete;
MapCache.prototype.get = mapCacheGet;
MapCache.prototype.has = mapCacheHas;
MapCache.prototype.set = mapCacheSet;
module.exports = MapCache;

/***/ }),
/* 47 */
/***/ (function(module, exports, __webpack_require__) {

var baseAssignValue = __webpack_require__(36),
  eq = __webpack_require__(26);

/**
 * This function is like `assignValue` except that it doesn't assign
 * `undefined` values.
 *
 * @private
 * @param {Object} object The object to modify.
 * @param {string} key The key of the property to assign.
 * @param {*} value The value to assign.
 */
function assignMergeValue(object, key, value) {
  if (value !== undefined && !eq(object[key], value) || value === undefined && !(key in object)) {
    baseAssignValue(object, key, value);
  }
}
module.exports = assignMergeValue;

/***/ }),
/* 48 */
/***/ (function(module, exports, __webpack_require__) {

var getNative = __webpack_require__(34);
var defineProperty = function () {
  try {
    var func = getNative(Object, 'defineProperty');
    func({}, '', {});
    return func;
  } catch (e) {}
}();
module.exports = defineProperty;

/***/ }),
/* 49 */
/***/ (function(module, exports, __webpack_require__) {

var overArg = __webpack_require__(114);

/** Built-in value references. */
var getPrototype = overArg(Object.getPrototypeOf, Object);
module.exports = getPrototype;

/***/ }),
/* 50 */
/***/ (function(module, exports) {

/** Used for built-in method references. */
var objectProto = Object.prototype;

/**
 * Checks if `value` is likely a prototype object.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
 */
function isPrototype(value) {
  var Ctor = value && value.constructor,
    proto = typeof Ctor == 'function' && Ctor.prototype || objectProto;
  return value === proto;
}
module.exports = isPrototype;

/***/ }),
/* 51 */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(19),
  stubFalse = __webpack_require__(117);

/** Detect free variable `exports`. */
var freeExports =  true && exports && !exports.nodeType && exports;

/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;

/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports = freeModule && freeModule.exports === freeExports;

/** Built-in value references. */
var Buffer = moduleExports ? root.Buffer : undefined;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;

/**
 * Checks if `value` is a buffer.
 *
 * @static
 * @memberOf _
 * @since 4.3.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
 * @example
 *
 * _.isBuffer(new Buffer(2));
 * // => true
 *
 * _.isBuffer(new Uint8Array(2));
 * // => false
 */
var isBuffer = nativeIsBuffer || stubFalse;
module.exports = isBuffer;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(37)(module)))

/***/ }),
/* 52 */
/***/ (function(module, exports, __webpack_require__) {

var baseIsTypedArray = __webpack_require__(119),
  baseUnary = __webpack_require__(120),
  nodeUtil = __webpack_require__(121);

/* Node.js helper references. */
var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;

/**
 * Checks if `value` is classified as a typed array.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
 * @example
 *
 * _.isTypedArray(new Uint8Array);
 * // => true
 *
 * _.isTypedArray([]);
 * // => false
 */
var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
module.exports = isTypedArray;

/***/ }),
/* 53 */
/***/ (function(module, exports) {

/**
 * Gets the value at `key`, unless `key` is "__proto__" or "constructor".
 *
 * @private
 * @param {Object} object The object to query.
 * @param {string} key The key of the property to get.
 * @returns {*} Returns the property value.
 */
function safeGet(object, key) {
  if (key === 'constructor' && typeof object[key] === 'function') {
    return;
  }
  if (key == '__proto__') {
    return;
  }
  return object[key];
}
module.exports = safeGet;

/***/ }),
/* 54 */
/***/ (function(module, exports, __webpack_require__) {

var baseAssignValue = __webpack_require__(36),
  eq = __webpack_require__(26);

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Assigns `value` to `key` of `object` if the existing value is not equivalent
 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * for equality comparisons.
 *
 * @private
 * @param {Object} object The object to modify.
 * @param {string} key The key of the property to assign.
 * @param {*} value The value to assign.
 */
function assignValue(object, key, value) {
  var objValue = object[key];
  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || value === undefined && !(key in object)) {
    baseAssignValue(object, key, value);
  }
}
module.exports = assignValue;

/***/ }),
/* 55 */
/***/ (function(module, exports, __webpack_require__) {

var arrayLikeKeys = __webpack_require__(124),
  baseKeysIn = __webpack_require__(126),
  isArrayLike = __webpack_require__(38);

/**
 * Creates an array of the own and inherited enumerable property names of `object`.
 *
 * **Note:** Non-object values are coerced to objects.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Object
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.keysIn(new Foo);
 * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
 */
function keysIn(object) {
  return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
}
module.exports = keysIn;

/***/ }),
/* 56 */
/***/ (function(module, exports) {

/**
 * This method returns the first argument it receives.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Util
 * @param {*} value Any value.
 * @returns {*} Returns `value`.
 * @example
 *
 * var object = { 'a': 1 };
 *
 * console.log(_.identity(object) === object);
 * // => true
 */
function identity(value) {
  return value;
}
module.exports = identity;

/***/ }),
/* 57 */
/***/ (function(module, exports, __webpack_require__) {

var apply = __webpack_require__(130);

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;

/**
 * A specialized version of `baseRest` which transforms the rest array.
 *
 * @private
 * @param {Function} func The function to apply a rest parameter to.
 * @param {number} [start=func.length-1] The start position of the rest parameter.
 * @param {Function} transform The rest array transform.
 * @returns {Function} Returns the new function.
 */
function overRest(func, start, transform) {
  start = nativeMax(start === undefined ? func.length - 1 : start, 0);
  return function () {
    var args = arguments,
      index = -1,
      length = nativeMax(args.length - start, 0),
      array = Array(length);
    while (++index < length) {
      array[index] = args[start + index];
    }
    index = -1;
    var otherArgs = Array(start + 1);
    while (++index < start) {
      otherArgs[index] = args[index];
    }
    otherArgs[start] = transform(array);
    return apply(func, this, otherArgs);
  };
}
module.exports = overRest;

/***/ }),
/* 58 */
/***/ (function(module, exports, __webpack_require__) {

var baseSetToString = __webpack_require__(131),
  shortOut = __webpack_require__(133);

/**
 * Sets the `toString` method of `func` to return `string`.
 *
 * @private
 * @param {Function} func The function to modify.
 * @param {Function} string The `toString` result.
 * @returns {Function} Returns `func`.
 */
var setToString = shortOut(baseSetToString);
module.exports = setToString;

/***/ }),
/* 59 */
/***/ (function(module, exports, __webpack_require__) {

var arrayLikeToArray = __webpack_require__(60);
function _unsupportedIterableToArray(o, minLen) {
  if (!o) return;
  if (typeof o === "string") return arrayLikeToArray(o, minLen);
  var n = Object.prototype.toString.call(o).slice(8, -1);
  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return Array.from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);
}
module.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 60 */
/***/ (function(module, exports) {

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;
  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }
  return arr2;
}
module.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 61 */
/***/ (function(module, exports, __webpack_require__) {

var arrayWithHoles = __webpack_require__(136);
var iterableToArrayLimit = __webpack_require__(137);
var unsupportedIterableToArray = __webpack_require__(59);
var nonIterableRest = __webpack_require__(138);
function _slicedToArray(arr, i) {
  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();
}
module.exports = _slicedToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 62 */
/***/ (function(module, exports, __webpack_require__) {

var basePick = __webpack_require__(144),
  flatRest = __webpack_require__(158);

/**
 * Creates an object composed of the picked `object` properties.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Object
 * @param {Object} object The source object.
 * @param {...(string|string[])} [paths] The property paths to pick.
 * @returns {Object} Returns the new object.
 * @example
 *
 * var object = { 'a': 1, 'b': '2', 'c': 3 };
 *
 * _.pick(object, ['a', 'c']);
 * // => { 'a': 1, 'c': 3 }
 */
var pick = flatRest(function (object, paths) {
  return object == null ? {} : basePick(object, paths);
});
module.exports = pick;

/***/ }),
/* 63 */
/***/ (function(module, exports, __webpack_require__) {

var getPrototypeOf = __webpack_require__(2);
var setPrototypeOf = __webpack_require__(40);
var isNativeFunction = __webpack_require__(163);
var construct = __webpack_require__(164);
function _wrapNativeSuper(Class) {
  var _cache = typeof Map === "function" ? new Map() : undefined;
  module.exports = _wrapNativeSuper = function _wrapNativeSuper(Class) {
    if (Class === null || !isNativeFunction(Class)) return Class;
    if (typeof Class !== "function") {
      throw new TypeError("Super expression must either be null or a function");
    }
    if (typeof _cache !== "undefined") {
      if (_cache.has(Class)) return _cache.get(Class);
      _cache.set(Class, Wrapper);
    }
    function Wrapper() {
      return construct(Class, arguments, getPrototypeOf(this).constructor);
    }
    Wrapper.prototype = Object.create(Class.prototype, {
      constructor: {
        value: Wrapper,
        enumerable: false,
        writable: true,
        configurable: true
      }
    });
    return setPrototypeOf(Wrapper, Class);
  }, module.exports.__esModule = true, module.exports["default"] = module.exports;
  return _wrapNativeSuper(Class);
}
module.exports = _wrapNativeSuper, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 64 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony import */ var _tracer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(21);


/**
 * http://www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization
 */
var Rasterizer = {
  createContour2D: function createContour2D() {
    return {
      dir: null,
      index: null,
      firstVertex: null,
      insideContours: null,
      nextpeer: null,
      prevpeer: null
    };
  },
  CONTOUR_DIR: {
    CW_DIR: 0,
    CCW_DIR: 1,
    UNKNOWN_DIR: 2
  },
  DIR: {
    OUTSIDE_EDGE: -32767,
    INSIDE_EDGE: -32766
  },
  create: function create(imageWrapper, labelWrapper) {
    var imageData = imageWrapper.data;
    var labelData = labelWrapper.data;
    var width = imageWrapper.size.x;
    var height = imageWrapper.size.y;
    var tracer = _tracer__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].create(imageWrapper, labelWrapper);
    return {
      rasterize: function rasterize(depthlabel) {
        var color;
        var bc;
        var lc;
        var labelindex;
        var cx;
        var cy;
        var colorMap = [];
        var vertex;
        var p;
        var cc;
        var sc;
        var pos;
        var connectedCount = 0;
        var i;
        for (i = 0; i < 400; i++) {
          colorMap[i] = 0;
        }
        colorMap[0] = imageData[0];
        cc = null;
        for (cy = 1; cy < height - 1; cy++) {
          labelindex = 0;
          bc = colorMap[0];
          for (cx = 1; cx < width - 1; cx++) {
            pos = cy * width + cx;
            if (labelData[pos] === 0) {
              color = imageData[pos];
              if (color !== bc) {
                if (labelindex === 0) {
                  lc = connectedCount + 1;
                  colorMap[lc] = color;
                  bc = color;
                  vertex = tracer.contourTracing(cy, cx, lc, color, Rasterizer.DIR.OUTSIDE_EDGE);
                  if (vertex !== null) {
                    connectedCount++;
                    labelindex = lc;
                    p = Rasterizer.createContour2D();
                    p.dir = Rasterizer.CONTOUR_DIR.CW_DIR;
                    p.index = labelindex;
                    p.firstVertex = vertex;
                    p.nextpeer = cc;
                    p.insideContours = null;
                    if (cc !== null) {
                      cc.prevpeer = p;
                    }
                    cc = p;
                  }
                } else {
                  vertex = tracer.contourTracing(cy, cx, Rasterizer.DIR.INSIDE_EDGE, color, labelindex);
                  if (vertex !== null) {
                    p = Rasterizer.createContour2D();
                    p.firstVertex = vertex;
                    p.insideContours = null;
                    if (depthlabel === 0) {
                      p.dir = Rasterizer.CONTOUR_DIR.CCW_DIR;
                    } else {
                      p.dir = Rasterizer.CONTOUR_DIR.CW_DIR;
                    }
                    p.index = depthlabel;
                    sc = cc;
                    while (sc !== null && sc.index !== labelindex) {
                      sc = sc.nextpeer;
                    }
                    if (sc !== null) {
                      p.nextpeer = sc.insideContours;
                      if (sc.insideContours !== null) {
                        sc.insideContours.prevpeer = p;
                      }
                      sc.insideContours = p;
                    }
                  }
                }
              } else {
                labelData[pos] = labelindex;
              }
            } else if (labelData[pos] === Rasterizer.DIR.OUTSIDE_EDGE || labelData[pos] === Rasterizer.DIR.INSIDE_EDGE) {
              labelindex = 0;
              if (labelData[pos] === Rasterizer.DIR.INSIDE_EDGE) {
                bc = imageData[pos];
              } else {
                bc = colorMap[0];
              }
            } else {
              labelindex = labelData[pos];
              bc = colorMap[labelindex];
            }
          }
        }
        sc = cc;
        while (sc !== null) {
          sc.index = depthlabel;
          sc = sc.nextpeer;
        }
        return {
          cc: cc,
          count: connectedCount
        };
      },
      debug: {
        drawContour: function drawContour(canvas, firstContour) {
          var ctx = canvas.getContext('2d');
          var pq = firstContour;
          var iq;
          var q;
          var p;
          ctx.strokeStyle = 'red';
          ctx.fillStyle = 'red';
          ctx.lineWidth = 1;
          if (pq !== null) {
            iq = pq.insideContours;
          } else {
            iq = null;
          }
          while (pq !== null) {
            if (iq !== null) {
              q = iq;
              iq = iq.nextpeer;
            } else {
              q = pq;
              pq = pq.nextpeer;
              if (pq !== null) {
                iq = pq.insideContours;
              } else {
                iq = null;
              }
            }
            switch (q.dir) {
              case Rasterizer.CONTOUR_DIR.CW_DIR:
                ctx.strokeStyle = 'red';
                break;
              case Rasterizer.CONTOUR_DIR.CCW_DIR:
                ctx.strokeStyle = 'blue';
                break;
              case Rasterizer.CONTOUR_DIR.UNKNOWN_DIR:
                ctx.strokeStyle = 'green';
                break;
            }
            p = q.firstVertex;
            ctx.beginPath();
            ctx.moveTo(p.x, p.y);
            do {
              p = p.next;
              ctx.lineTo(p.x, p.y);
            } while (p !== q.firstVertex);
            ctx.stroke();
          }
        }
      }
    };
  }
};
/* harmony default export */ __webpack_exports__["a"] = (Rasterizer);

/***/ }),
/* 65 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* eslint-disable no-param-reassign */
/* eslint-disable no-bitwise */
/* eslint-disable eqeqeq */

/* @preserve ASM BEGIN */
function Skeletonizer(stdlib, foreign, buffer) {
  'use asm';

  var images = new stdlib.Uint8Array(buffer);
  var size = foreign.size | 0;
  var imul = stdlib.Math.imul;
  function erode(inImagePtr, outImagePtr) {
    inImagePtr |= 0;
    outImagePtr |= 0;
    var v = 0;
    var u = 0;
    var sum = 0;
    var yStart1 = 0;
    var yStart2 = 0;
    var xStart1 = 0;
    var xStart2 = 0;
    var offset = 0;
    for (v = 1; (v | 0) < (size - 1 | 0); v = v + 1 | 0) {
      offset = offset + size | 0;
      for (u = 1; (u | 0) < (size - 1 | 0); u = u + 1 | 0) {
        yStart1 = offset - size | 0;
        yStart2 = offset + size | 0;
        xStart1 = u - 1 | 0;
        xStart2 = u + 1 | 0;
        sum = (images[inImagePtr + yStart1 + xStart1 | 0] | 0) + (images[inImagePtr + yStart1 + xStart2 | 0] | 0) + (images[inImagePtr + offset + u | 0] | 0) + (images[inImagePtr + yStart2 + xStart1 | 0] | 0) + (images[inImagePtr + yStart2 + xStart2 | 0] | 0) | 0;
        if ((sum | 0) == (5 | 0)) {
          images[outImagePtr + offset + u | 0] = 1;
        } else {
          images[outImagePtr + offset + u | 0] = 0;
        }
      }
    }
  }
  function subtract(aImagePtr, bImagePtr, outImagePtr) {
    aImagePtr |= 0;
    bImagePtr |= 0;
    outImagePtr |= 0;
    var length = 0;
    length = imul(size, size) | 0;
    while ((length | 0) > 0) {
      length = length - 1 | 0;
      images[outImagePtr + length | 0] = (images[aImagePtr + length | 0] | 0) - (images[bImagePtr + length | 0] | 0) | 0;
    }
  }
  function bitwiseOr(aImagePtr, bImagePtr, outImagePtr) {
    aImagePtr |= 0;
    bImagePtr |= 0;
    outImagePtr |= 0;
    var length = 0;
    length = imul(size, size) | 0;
    while ((length | 0) > 0) {
      length = length - 1 | 0;
      images[outImagePtr + length | 0] = images[aImagePtr + length | 0] | 0 | (images[bImagePtr + length | 0] | 0) | 0;
    }
  }
  function countNonZero(imagePtr) {
    imagePtr |= 0;
    var sum = 0;
    var length = 0;
    length = imul(size, size) | 0;
    while ((length | 0) > 0) {
      length = length - 1 | 0;
      sum = (sum | 0) + (images[imagePtr + length | 0] | 0) | 0;
    }
    return sum | 0;
  }
  function init(imagePtr, value) {
    imagePtr |= 0;
    value |= 0;
    var length = 0;
    length = imul(size, size) | 0;
    while ((length | 0) > 0) {
      length = length - 1 | 0;
      images[imagePtr + length | 0] = value;
    }
  }
  function dilate(inImagePtr, outImagePtr) {
    inImagePtr |= 0;
    outImagePtr |= 0;
    var v = 0;
    var u = 0;
    var sum = 0;
    var yStart1 = 0;
    var yStart2 = 0;
    var xStart1 = 0;
    var xStart2 = 0;
    var offset = 0;
    for (v = 1; (v | 0) < (size - 1 | 0); v = v + 1 | 0) {
      offset = offset + size | 0;
      for (u = 1; (u | 0) < (size - 1 | 0); u = u + 1 | 0) {
        yStart1 = offset - size | 0;
        yStart2 = offset + size | 0;
        xStart1 = u - 1 | 0;
        xStart2 = u + 1 | 0;
        sum = (images[inImagePtr + yStart1 + xStart1 | 0] | 0) + (images[inImagePtr + yStart1 + xStart2 | 0] | 0) + (images[inImagePtr + offset + u | 0] | 0) + (images[inImagePtr + yStart2 + xStart1 | 0] | 0) + (images[inImagePtr + yStart2 + xStart2 | 0] | 0) | 0;
        if ((sum | 0) > (0 | 0)) {
          images[outImagePtr + offset + u | 0] = 1;
        } else {
          images[outImagePtr + offset + u | 0] = 0;
        }
      }
    }
  }
  function memcpy(srcImagePtr, dstImagePtr) {
    srcImagePtr |= 0;
    dstImagePtr |= 0;
    var length = 0;
    length = imul(size, size) | 0;
    while ((length | 0) > 0) {
      length = length - 1 | 0;
      images[dstImagePtr + length | 0] = images[srcImagePtr + length | 0] | 0;
    }
  }
  function zeroBorder(imagePtr) {
    imagePtr |= 0;
    var x = 0;
    var y = 0;
    for (x = 0; (x | 0) < (size - 1 | 0); x = x + 1 | 0) {
      images[imagePtr + x | 0] = 0;
      images[imagePtr + y | 0] = 0;
      y = y + size - 1 | 0;
      images[imagePtr + y | 0] = 0;
      y = y + 1 | 0;
    }
    for (x = 0; (x | 0) < (size | 0); x = x + 1 | 0) {
      images[imagePtr + y | 0] = 0;
      y = y + 1 | 0;
    }
  }
  function skeletonize() {
    var subImagePtr = 0;
    var erodedImagePtr = 0;
    var tempImagePtr = 0;
    var skelImagePtr = 0;
    var sum = 0;
    var done = 0;
    erodedImagePtr = imul(size, size) | 0;
    tempImagePtr = erodedImagePtr + erodedImagePtr | 0;
    skelImagePtr = tempImagePtr + erodedImagePtr | 0;

    // init skel-image
    init(skelImagePtr, 0);
    zeroBorder(subImagePtr);
    do {
      erode(subImagePtr, erodedImagePtr);
      dilate(erodedImagePtr, tempImagePtr);
      subtract(subImagePtr, tempImagePtr, tempImagePtr);
      bitwiseOr(skelImagePtr, tempImagePtr, skelImagePtr);
      memcpy(erodedImagePtr, subImagePtr);
      sum = countNonZero(subImagePtr) | 0;
      done = (sum | 0) == 0 | 0;
    } while (!done);
  }
  return {
    skeletonize: skeletonize
  };
}
/* @preserve ASM END */
/* harmony default export */ __webpack_exports__["a"] = (Skeletonizer);
/* eslint-enable eqeqeq */

/***/ }),
/* 66 */,
/* 67 */,
/* 68 */,
/* 69 */,
/* 70 */,
/* 71 */,
/* 72 */
/***/ (function(module, exports, __webpack_require__) {

module.exports = __webpack_require__(166);


/***/ }),
/* 73 */
/***/ (function(module, exports, __webpack_require__) {

var Stack = __webpack_require__(74),
  assignMergeValue = __webpack_require__(47),
  baseFor = __webpack_require__(104),
  baseMergeDeep = __webpack_require__(106),
  isObject = __webpack_require__(15),
  keysIn = __webpack_require__(55),
  safeGet = __webpack_require__(53);

/**
 * The base implementation of `_.merge` without support for multiple sources.
 *
 * @private
 * @param {Object} object The destination object.
 * @param {Object} source The source object.
 * @param {number} srcIndex The index of `source`.
 * @param {Function} [customizer] The function to customize merged values.
 * @param {Object} [stack] Tracks traversed source values and their merged
 *  counterparts.
 */
function baseMerge(object, source, srcIndex, customizer, stack) {
  if (object === source) {
    return;
  }
  baseFor(source, function (srcValue, key) {
    stack || (stack = new Stack());
    if (isObject(srcValue)) {
      baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
    } else {
      var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + '', object, source, stack) : undefined;
      if (newValue === undefined) {
        newValue = srcValue;
      }
      assignMergeValue(object, key, newValue);
    }
  }, keysIn);
}
module.exports = baseMerge;

/***/ }),
/* 74 */
/***/ (function(module, exports, __webpack_require__) {

var ListCache = __webpack_require__(24),
  stackClear = __webpack_require__(80),
  stackDelete = __webpack_require__(81),
  stackGet = __webpack_require__(82),
  stackHas = __webpack_require__(83),
  stackSet = __webpack_require__(84);

/**
 * Creates a stack cache object to store key-value pairs.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */
function Stack(entries) {
  var data = this.__data__ = new ListCache(entries);
  this.size = data.size;
}

// Add methods to `Stack`.
Stack.prototype.clear = stackClear;
Stack.prototype['delete'] = stackDelete;
Stack.prototype.get = stackGet;
Stack.prototype.has = stackHas;
Stack.prototype.set = stackSet;
module.exports = Stack;

/***/ }),
/* 75 */
/***/ (function(module, exports) {

/**
 * Removes all key-value entries from the list cache.
 *
 * @private
 * @name clear
 * @memberOf ListCache
 */
function listCacheClear() {
  this.__data__ = [];
  this.size = 0;
}
module.exports = listCacheClear;

/***/ }),
/* 76 */
/***/ (function(module, exports, __webpack_require__) {

var assocIndexOf = __webpack_require__(25);

/** Used for built-in method references. */
var arrayProto = Array.prototype;

/** Built-in value references. */
var splice = arrayProto.splice;

/**
 * Removes `key` and its value from the list cache.
 *
 * @private
 * @name delete
 * @memberOf ListCache
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */
function listCacheDelete(key) {
  var data = this.__data__,
    index = assocIndexOf(data, key);
  if (index < 0) {
    return false;
  }
  var lastIndex = data.length - 1;
  if (index == lastIndex) {
    data.pop();
  } else {
    splice.call(data, index, 1);
  }
  --this.size;
  return true;
}
module.exports = listCacheDelete;

/***/ }),
/* 77 */
/***/ (function(module, exports, __webpack_require__) {

var assocIndexOf = __webpack_require__(25);

/**
 * Gets the list cache value for `key`.
 *
 * @private
 * @name get
 * @memberOf ListCache
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */
function listCacheGet(key) {
  var data = this.__data__,
    index = assocIndexOf(data, key);
  return index < 0 ? undefined : data[index][1];
}
module.exports = listCacheGet;

/***/ }),
/* 78 */
/***/ (function(module, exports, __webpack_require__) {

var assocIndexOf = __webpack_require__(25);

/**
 * Checks if a list cache value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf ListCache
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */
function listCacheHas(key) {
  return assocIndexOf(this.__data__, key) > -1;
}
module.exports = listCacheHas;

/***/ }),
/* 79 */
/***/ (function(module, exports, __webpack_require__) {

var assocIndexOf = __webpack_require__(25);

/**
 * Sets the list cache `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf ListCache
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the list cache instance.
 */
function listCacheSet(key, value) {
  var data = this.__data__,
    index = assocIndexOf(data, key);
  if (index < 0) {
    ++this.size;
    data.push([key, value]);
  } else {
    data[index][1] = value;
  }
  return this;
}
module.exports = listCacheSet;

/***/ }),
/* 80 */
/***/ (function(module, exports, __webpack_require__) {

var ListCache = __webpack_require__(24);

/**
 * Removes all key-value entries from the stack.
 *
 * @private
 * @name clear
 * @memberOf Stack
 */
function stackClear() {
  this.__data__ = new ListCache();
  this.size = 0;
}
module.exports = stackClear;

/***/ }),
/* 81 */
/***/ (function(module, exports) {

/**
 * Removes `key` and its value from the stack.
 *
 * @private
 * @name delete
 * @memberOf Stack
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */
function stackDelete(key) {
  var data = this.__data__,
    result = data['delete'](key);
  this.size = data.size;
  return result;
}
module.exports = stackDelete;

/***/ }),
/* 82 */
/***/ (function(module, exports) {

/**
 * Gets the stack value for `key`.
 *
 * @private
 * @name get
 * @memberOf Stack
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */
function stackGet(key) {
  return this.__data__.get(key);
}
module.exports = stackGet;

/***/ }),
/* 83 */
/***/ (function(module, exports) {

/**
 * Checks if a stack value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf Stack
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */
function stackHas(key) {
  return this.__data__.has(key);
}
module.exports = stackHas;

/***/ }),
/* 84 */
/***/ (function(module, exports, __webpack_require__) {

var ListCache = __webpack_require__(24),
  Map = __webpack_require__(43),
  MapCache = __webpack_require__(46);

/** Used as the size to enable large array optimizations. */
var LARGE_ARRAY_SIZE = 200;

/**
 * Sets the stack `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf Stack
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the stack cache instance.
 */
function stackSet(key, value) {
  var data = this.__data__;
  if (data instanceof ListCache) {
    var pairs = data.__data__;
    if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) {
      pairs.push([key, value]);
      this.size = ++data.size;
      return this;
    }
    data = this.__data__ = new MapCache(pairs);
  }
  data.set(key, value);
  this.size = data.size;
  return this;
}
module.exports = stackSet;

/***/ }),
/* 85 */
/***/ (function(module, exports, __webpack_require__) {

var isFunction = __webpack_require__(35),
  isMasked = __webpack_require__(88),
  isObject = __webpack_require__(15),
  toSource = __webpack_require__(90);

/**
 * Used to match `RegExp`
 * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
 */
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;

/** Used to detect host constructors (Safari). */
var reIsHostCtor = /^\[object .+?Constructor\]$/;

/** Used for built-in method references. */
var funcProto = Function.prototype,
  objectProto = Object.prototype;

/** Used to resolve the decompiled source of functions. */
var funcToString = funcProto.toString;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/** Used to detect if a method is native. */
var reIsNative = RegExp('^' + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&').replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$');

/**
 * The base implementation of `_.isNative` without bad shim checks.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a native function,
 *  else `false`.
 */
function baseIsNative(value) {
  if (!isObject(value) || isMasked(value)) {
    return false;
  }
  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
  return pattern.test(toSource(value));
}
module.exports = baseIsNative;

/***/ }),
/* 86 */
/***/ (function(module, exports, __webpack_require__) {

var Symbol = __webpack_require__(27);

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var nativeObjectToString = objectProto.toString;

/** Built-in value references. */
var symToStringTag = Symbol ? Symbol.toStringTag : undefined;

/**
 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
 *
 * @private
 * @param {*} value The value to query.
 * @returns {string} Returns the raw `toStringTag`.
 */
function getRawTag(value) {
  var isOwn = hasOwnProperty.call(value, symToStringTag),
    tag = value[symToStringTag];
  try {
    value[symToStringTag] = undefined;
    var unmasked = true;
  } catch (e) {}
  var result = nativeObjectToString.call(value);
  if (unmasked) {
    if (isOwn) {
      value[symToStringTag] = tag;
    } else {
      delete value[symToStringTag];
    }
  }
  return result;
}
module.exports = getRawTag;

/***/ }),
/* 87 */
/***/ (function(module, exports) {

/** Used for built-in method references. */
var objectProto = Object.prototype;

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var nativeObjectToString = objectProto.toString;

/**
 * Converts `value` to a string using `Object.prototype.toString`.
 *
 * @private
 * @param {*} value The value to convert.
 * @returns {string} Returns the converted string.
 */
function objectToString(value) {
  return nativeObjectToString.call(value);
}
module.exports = objectToString;

/***/ }),
/* 88 */
/***/ (function(module, exports, __webpack_require__) {

var coreJsData = __webpack_require__(89);

/** Used to detect methods masquerading as native. */
var maskSrcKey = function () {
  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
  return uid ? 'Symbol(src)_1.' + uid : '';
}();

/**
 * Checks if `func` has its source masked.
 *
 * @private
 * @param {Function} func The function to check.
 * @returns {boolean} Returns `true` if `func` is masked, else `false`.
 */
function isMasked(func) {
  return !!maskSrcKey && maskSrcKey in func;
}
module.exports = isMasked;

/***/ }),
/* 89 */
/***/ (function(module, exports, __webpack_require__) {

var root = __webpack_require__(19);

/** Used to detect overreaching core-js shims. */
var coreJsData = root['__core-js_shared__'];
module.exports = coreJsData;

/***/ }),
/* 90 */
/***/ (function(module, exports) {

/** Used for built-in method references. */
var funcProto = Function.prototype;

/** Used to resolve the decompiled source of functions. */
var funcToString = funcProto.toString;

/**
 * Converts `func` to its source code.
 *
 * @private
 * @param {Function} func The function to convert.
 * @returns {string} Returns the source code.
 */
function toSource(func) {
  if (func != null) {
    try {
      return funcToString.call(func);
    } catch (e) {}
    try {
      return func + '';
    } catch (e) {}
  }
  return '';
}
module.exports = toSource;

/***/ }),
/* 91 */
/***/ (function(module, exports) {

/**
 * Gets the value at `key` of `object`.
 *
 * @private
 * @param {Object} [object] The object to query.
 * @param {string} key The key of the property to get.
 * @returns {*} Returns the property value.
 */
function getValue(object, key) {
  return object == null ? undefined : object[key];
}
module.exports = getValue;

/***/ }),
/* 92 */
/***/ (function(module, exports, __webpack_require__) {

var Hash = __webpack_require__(93),
  ListCache = __webpack_require__(24),
  Map = __webpack_require__(43);

/**
 * Removes all key-value entries from the map.
 *
 * @private
 * @name clear
 * @memberOf MapCache
 */
function mapCacheClear() {
  this.size = 0;
  this.__data__ = {
    'hash': new Hash(),
    'map': new (Map || ListCache)(),
    'string': new Hash()
  };
}
module.exports = mapCacheClear;

/***/ }),
/* 93 */
/***/ (function(module, exports, __webpack_require__) {

var hashClear = __webpack_require__(94),
  hashDelete = __webpack_require__(95),
  hashGet = __webpack_require__(96),
  hashHas = __webpack_require__(97),
  hashSet = __webpack_require__(98);

/**
 * Creates a hash object.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */
function Hash(entries) {
  var index = -1,
    length = entries == null ? 0 : entries.length;
  this.clear();
  while (++index < length) {
    var entry = entries[index];
    this.set(entry[0], entry[1]);
  }
}

// Add methods to `Hash`.
Hash.prototype.clear = hashClear;
Hash.prototype['delete'] = hashDelete;
Hash.prototype.get = hashGet;
Hash.prototype.has = hashHas;
Hash.prototype.set = hashSet;
module.exports = Hash;

/***/ }),
/* 94 */
/***/ (function(module, exports, __webpack_require__) {

var nativeCreate = __webpack_require__(28);

/**
 * Removes all key-value entries from the hash.
 *
 * @private
 * @name clear
 * @memberOf Hash
 */
function hashClear() {
  this.__data__ = nativeCreate ? nativeCreate(null) : {};
  this.size = 0;
}
module.exports = hashClear;

/***/ }),
/* 95 */
/***/ (function(module, exports) {

/**
 * Removes `key` and its value from the hash.
 *
 * @private
 * @name delete
 * @memberOf Hash
 * @param {Object} hash The hash to modify.
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */
function hashDelete(key) {
  var result = this.has(key) && delete this.__data__[key];
  this.size -= result ? 1 : 0;
  return result;
}
module.exports = hashDelete;

/***/ }),
/* 96 */
/***/ (function(module, exports, __webpack_require__) {

var nativeCreate = __webpack_require__(28);

/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Gets the hash value for `key`.
 *
 * @private
 * @name get
 * @memberOf Hash
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */
function hashGet(key) {
  var data = this.__data__;
  if (nativeCreate) {
    var result = data[key];
    return result === HASH_UNDEFINED ? undefined : result;
  }
  return hasOwnProperty.call(data, key) ? data[key] : undefined;
}
module.exports = hashGet;

/***/ }),
/* 97 */
/***/ (function(module, exports, __webpack_require__) {

var nativeCreate = __webpack_require__(28);

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Checks if a hash value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf Hash
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */
function hashHas(key) {
  var data = this.__data__;
  return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
}
module.exports = hashHas;

/***/ }),
/* 98 */
/***/ (function(module, exports, __webpack_require__) {

var nativeCreate = __webpack_require__(28);

/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';

/**
 * Sets the hash `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf Hash
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the hash instance.
 */
function hashSet(key, value) {
  var data = this.__data__;
  this.size += this.has(key) ? 0 : 1;
  data[key] = nativeCreate && value === undefined ? HASH_UNDEFINED : value;
  return this;
}
module.exports = hashSet;

/***/ }),
/* 99 */
/***/ (function(module, exports, __webpack_require__) {

var getMapData = __webpack_require__(29);

/**
 * Removes `key` and its value from the map.
 *
 * @private
 * @name delete
 * @memberOf MapCache
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */
function mapCacheDelete(key) {
  var result = getMapData(this, key)['delete'](key);
  this.size -= result ? 1 : 0;
  return result;
}
module.exports = mapCacheDelete;

/***/ }),
/* 100 */
/***/ (function(module, exports) {

/**
 * Checks if `value` is suitable for use as unique object key.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
 */
function isKeyable(value) {
  var type = typeof value;
  return type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean' ? value !== '__proto__' : value === null;
}
module.exports = isKeyable;

/***/ }),
/* 101 */
/***/ (function(module, exports, __webpack_require__) {

var getMapData = __webpack_require__(29);

/**
 * Gets the map value for `key`.
 *
 * @private
 * @name get
 * @memberOf MapCache
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */
function mapCacheGet(key) {
  return getMapData(this, key).get(key);
}
module.exports = mapCacheGet;

/***/ }),
/* 102 */
/***/ (function(module, exports, __webpack_require__) {

var getMapData = __webpack_require__(29);

/**
 * Checks if a map value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf MapCache
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */
function mapCacheHas(key) {
  return getMapData(this, key).has(key);
}
module.exports = mapCacheHas;

/***/ }),
/* 103 */
/***/ (function(module, exports, __webpack_require__) {

var getMapData = __webpack_require__(29);

/**
 * Sets the map `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf MapCache
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the map cache instance.
 */
function mapCacheSet(key, value) {
  var data = getMapData(this, key),
    size = data.size;
  data.set(key, value);
  this.size += data.size == size ? 0 : 1;
  return this;
}
module.exports = mapCacheSet;

/***/ }),
/* 104 */
/***/ (function(module, exports, __webpack_require__) {

var createBaseFor = __webpack_require__(105);

/**
 * The base implementation of `baseForOwn` which iterates over `object`
 * properties returned by `keysFunc` and invokes `iteratee` for each property.
 * Iteratee functions may exit iteration early by explicitly returning `false`.
 *
 * @private
 * @param {Object} object The object to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @param {Function} keysFunc The function to get the keys of `object`.
 * @returns {Object} Returns `object`.
 */
var baseFor = createBaseFor();
module.exports = baseFor;

/***/ }),
/* 105 */
/***/ (function(module, exports) {

/**
 * Creates a base function for methods like `_.forIn` and `_.forOwn`.
 *
 * @private
 * @param {boolean} [fromRight] Specify iterating from right to left.
 * @returns {Function} Returns the new base function.
 */
function createBaseFor(fromRight) {
  return function (object, iteratee, keysFunc) {
    var index = -1,
      iterable = Object(object),
      props = keysFunc(object),
      length = props.length;
    while (length--) {
      var key = props[fromRight ? length : ++index];
      if (iteratee(iterable[key], key, iterable) === false) {
        break;
      }
    }
    return object;
  };
}
module.exports = createBaseFor;

/***/ }),
/* 106 */
/***/ (function(module, exports, __webpack_require__) {

var assignMergeValue = __webpack_require__(47),
  cloneBuffer = __webpack_require__(107),
  cloneTypedArray = __webpack_require__(108),
  copyArray = __webpack_require__(111),
  initCloneObject = __webpack_require__(112),
  isArguments = __webpack_require__(30),
  isArray = __webpack_require__(16),
  isArrayLikeObject = __webpack_require__(116),
  isBuffer = __webpack_require__(51),
  isFunction = __webpack_require__(35),
  isObject = __webpack_require__(15),
  isPlainObject = __webpack_require__(118),
  isTypedArray = __webpack_require__(52),
  safeGet = __webpack_require__(53),
  toPlainObject = __webpack_require__(122);

/**
 * A specialized version of `baseMerge` for arrays and objects which performs
 * deep merges and tracks traversed objects enabling objects with circular
 * references to be merged.
 *
 * @private
 * @param {Object} object The destination object.
 * @param {Object} source The source object.
 * @param {string} key The key of the value to merge.
 * @param {number} srcIndex The index of `source`.
 * @param {Function} mergeFunc The function to merge values.
 * @param {Function} [customizer] The function to customize assigned values.
 * @param {Object} [stack] Tracks traversed source values and their merged
 *  counterparts.
 */
function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
  var objValue = safeGet(object, key),
    srcValue = safeGet(source, key),
    stacked = stack.get(srcValue);
  if (stacked) {
    assignMergeValue(object, key, stacked);
    return;
  }
  var newValue = customizer ? customizer(objValue, srcValue, key + '', object, source, stack) : undefined;
  var isCommon = newValue === undefined;
  if (isCommon) {
    var isArr = isArray(srcValue),
      isBuff = !isArr && isBuffer(srcValue),
      isTyped = !isArr && !isBuff && isTypedArray(srcValue);
    newValue = srcValue;
    if (isArr || isBuff || isTyped) {
      if (isArray(objValue)) {
        newValue = objValue;
      } else if (isArrayLikeObject(objValue)) {
        newValue = copyArray(objValue);
      } else if (isBuff) {
        isCommon = false;
        newValue = cloneBuffer(srcValue, true);
      } else if (isTyped) {
        isCommon = false;
        newValue = cloneTypedArray(srcValue, true);
      } else {
        newValue = [];
      }
    } else if (isPlainObject(srcValue) || isArguments(srcValue)) {
      newValue = objValue;
      if (isArguments(objValue)) {
        newValue = toPlainObject(objValue);
      } else if (!isObject(objValue) || isFunction(objValue)) {
        newValue = initCloneObject(srcValue);
      }
    } else {
      isCommon = false;
    }
  }
  if (isCommon) {
    // Recursively merge objects and arrays (susceptible to call stack limits).
    stack.set(srcValue, newValue);
    mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
    stack['delete'](srcValue);
  }
  assignMergeValue(object, key, newValue);
}
module.exports = baseMergeDeep;

/***/ }),
/* 107 */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(19);

/** Detect free variable `exports`. */
var freeExports =  true && exports && !exports.nodeType && exports;

/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;

/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports = freeModule && freeModule.exports === freeExports;

/** Built-in value references. */
var Buffer = moduleExports ? root.Buffer : undefined,
  allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;

/**
 * Creates a clone of  `buffer`.
 *
 * @private
 * @param {Buffer} buffer The buffer to clone.
 * @param {boolean} [isDeep] Specify a deep clone.
 * @returns {Buffer} Returns the cloned buffer.
 */
function cloneBuffer(buffer, isDeep) {
  if (isDeep) {
    return buffer.slice();
  }
  var length = buffer.length,
    result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
  buffer.copy(result);
  return result;
}
module.exports = cloneBuffer;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(37)(module)))

/***/ }),
/* 108 */
/***/ (function(module, exports, __webpack_require__) {

var cloneArrayBuffer = __webpack_require__(109);

/**
 * Creates a clone of `typedArray`.
 *
 * @private
 * @param {Object} typedArray The typed array to clone.
 * @param {boolean} [isDeep] Specify a deep clone.
 * @returns {Object} Returns the cloned typed array.
 */
function cloneTypedArray(typedArray, isDeep) {
  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
}
module.exports = cloneTypedArray;

/***/ }),
/* 109 */
/***/ (function(module, exports, __webpack_require__) {

var Uint8Array = __webpack_require__(110);

/**
 * Creates a clone of `arrayBuffer`.
 *
 * @private
 * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
 * @returns {ArrayBuffer} Returns the cloned array buffer.
 */
function cloneArrayBuffer(arrayBuffer) {
  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
  new Uint8Array(result).set(new Uint8Array(arrayBuffer));
  return result;
}
module.exports = cloneArrayBuffer;

/***/ }),
/* 110 */
/***/ (function(module, exports, __webpack_require__) {

var root = __webpack_require__(19);

/** Built-in value references. */
var Uint8Array = root.Uint8Array;
module.exports = Uint8Array;

/***/ }),
/* 111 */
/***/ (function(module, exports) {

/**
 * Copies the values of `source` to `array`.
 *
 * @private
 * @param {Array} source The array to copy values from.
 * @param {Array} [array=[]] The array to copy values to.
 * @returns {Array} Returns `array`.
 */
function copyArray(source, array) {
  var index = -1,
    length = source.length;
  array || (array = Array(length));
  while (++index < length) {
    array[index] = source[index];
  }
  return array;
}
module.exports = copyArray;

/***/ }),
/* 112 */
/***/ (function(module, exports, __webpack_require__) {

var baseCreate = __webpack_require__(113),
  getPrototype = __webpack_require__(49),
  isPrototype = __webpack_require__(50);

/**
 * Initializes an object clone.
 *
 * @private
 * @param {Object} object The object to clone.
 * @returns {Object} Returns the initialized clone.
 */
function initCloneObject(object) {
  return typeof object.constructor == 'function' && !isPrototype(object) ? baseCreate(getPrototype(object)) : {};
}
module.exports = initCloneObject;

/***/ }),
/* 113 */
/***/ (function(module, exports, __webpack_require__) {

var isObject = __webpack_require__(15);

/** Built-in value references. */
var objectCreate = Object.create;

/**
 * The base implementation of `_.create` without support for assigning
 * properties to the created object.
 *
 * @private
 * @param {Object} proto The object to inherit from.
 * @returns {Object} Returns the new object.
 */
var baseCreate = function () {
  function object() {}
  return function (proto) {
    if (!isObject(proto)) {
      return {};
    }
    if (objectCreate) {
      return objectCreate(proto);
    }
    object.prototype = proto;
    var result = new object();
    object.prototype = undefined;
    return result;
  };
}();
module.exports = baseCreate;

/***/ }),
/* 114 */
/***/ (function(module, exports) {

/**
 * Creates a unary function that invokes `func` with its argument transformed.
 *
 * @private
 * @param {Function} func The function to wrap.
 * @param {Function} transform The argument transform.
 * @returns {Function} Returns the new function.
 */
function overArg(func, transform) {
  return function (arg) {
    return func(transform(arg));
  };
}
module.exports = overArg;

/***/ }),
/* 115 */
/***/ (function(module, exports, __webpack_require__) {

var baseGetTag = __webpack_require__(22),
  isObjectLike = __webpack_require__(20);

/** `Object#toString` result references. */
var argsTag = '[object Arguments]';

/**
 * The base implementation of `_.isArguments`.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
 */
function baseIsArguments(value) {
  return isObjectLike(value) && baseGetTag(value) == argsTag;
}
module.exports = baseIsArguments;

/***/ }),
/* 116 */
/***/ (function(module, exports, __webpack_require__) {

var isArrayLike = __webpack_require__(38),
  isObjectLike = __webpack_require__(20);

/**
 * This method is like `_.isArrayLike` except that it also checks if `value`
 * is an object.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an array-like object,
 *  else `false`.
 * @example
 *
 * _.isArrayLikeObject([1, 2, 3]);
 * // => true
 *
 * _.isArrayLikeObject(document.body.children);
 * // => true
 *
 * _.isArrayLikeObject('abc');
 * // => false
 *
 * _.isArrayLikeObject(_.noop);
 * // => false
 */
function isArrayLikeObject(value) {
  return isObjectLike(value) && isArrayLike(value);
}
module.exports = isArrayLikeObject;

/***/ }),
/* 117 */
/***/ (function(module, exports) {

/**
 * This method returns `false`.
 *
 * @static
 * @memberOf _
 * @since 4.13.0
 * @category Util
 * @returns {boolean} Returns `false`.
 * @example
 *
 * _.times(2, _.stubFalse);
 * // => [false, false]
 */
function stubFalse() {
  return false;
}
module.exports = stubFalse;

/***/ }),
/* 118 */
/***/ (function(module, exports, __webpack_require__) {

var baseGetTag = __webpack_require__(22),
  getPrototype = __webpack_require__(49),
  isObjectLike = __webpack_require__(20);

/** `Object#toString` result references. */
var objectTag = '[object Object]';

/** Used for built-in method references. */
var funcProto = Function.prototype,
  objectProto = Object.prototype;

/** Used to resolve the decompiled source of functions. */
var funcToString = funcProto.toString;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/** Used to infer the `Object` constructor. */
var objectCtorString = funcToString.call(Object);

/**
 * Checks if `value` is a plain object, that is, an object created by the
 * `Object` constructor or one with a `[[Prototype]]` of `null`.
 *
 * @static
 * @memberOf _
 * @since 0.8.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 * }
 *
 * _.isPlainObject(new Foo);
 * // => false
 *
 * _.isPlainObject([1, 2, 3]);
 * // => false
 *
 * _.isPlainObject({ 'x': 0, 'y': 0 });
 * // => true
 *
 * _.isPlainObject(Object.create(null));
 * // => true
 */
function isPlainObject(value) {
  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
    return false;
  }
  var proto = getPrototype(value);
  if (proto === null) {
    return true;
  }
  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
  return typeof Ctor == 'function' && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
}
module.exports = isPlainObject;

/***/ }),
/* 119 */
/***/ (function(module, exports, __webpack_require__) {

var baseGetTag = __webpack_require__(22),
  isLength = __webpack_require__(39),
  isObjectLike = __webpack_require__(20);

/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
  arrayTag = '[object Array]',
  boolTag = '[object Boolean]',
  dateTag = '[object Date]',
  errorTag = '[object Error]',
  funcTag = '[object Function]',
  mapTag = '[object Map]',
  numberTag = '[object Number]',
  objectTag = '[object Object]',
  regexpTag = '[object RegExp]',
  setTag = '[object Set]',
  stringTag = '[object String]',
  weakMapTag = '[object WeakMap]';
var arrayBufferTag = '[object ArrayBuffer]',
  dataViewTag = '[object DataView]',
  float32Tag = '[object Float32Array]',
  float64Tag = '[object Float64Array]',
  int8Tag = '[object Int8Array]',
  int16Tag = '[object Int16Array]',
  int32Tag = '[object Int32Array]',
  uint8Tag = '[object Uint8Array]',
  uint8ClampedTag = '[object Uint8ClampedArray]',
  uint16Tag = '[object Uint16Array]',
  uint32Tag = '[object Uint32Array]';

/** Used to identify `toStringTag` values of typed arrays. */
var typedArrayTags = {};
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;
typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;

/**
 * The base implementation of `_.isTypedArray` without Node.js optimizations.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
 */
function baseIsTypedArray(value) {
  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
}
module.exports = baseIsTypedArray;

/***/ }),
/* 120 */
/***/ (function(module, exports) {

/**
 * The base implementation of `_.unary` without support for storing metadata.
 *
 * @private
 * @param {Function} func The function to cap arguments for.
 * @returns {Function} Returns the new capped function.
 */
function baseUnary(func) {
  return function (value) {
    return func(value);
  };
}
module.exports = baseUnary;

/***/ }),
/* 121 */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(module) {var freeGlobal = __webpack_require__(44);

/** Detect free variable `exports`. */
var freeExports =  true && exports && !exports.nodeType && exports;

/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;

/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports = freeModule && freeModule.exports === freeExports;

/** Detect free variable `process` from Node.js. */
var freeProcess = moduleExports && freeGlobal.process;

/** Used to access faster Node.js helpers. */
var nodeUtil = function () {
  try {
    // Use `util.types` for Node.js 10+.
    var types = freeModule && freeModule.require && freeModule.require('util').types;
    if (types) {
      return types;
    }

    // Legacy `process.binding('util')` for Node.js < 10.
    return freeProcess && freeProcess.binding && freeProcess.binding('util');
  } catch (e) {}
}();
module.exports = nodeUtil;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(37)(module)))

/***/ }),
/* 122 */
/***/ (function(module, exports, __webpack_require__) {

var copyObject = __webpack_require__(123),
  keysIn = __webpack_require__(55);

/**
 * Converts `value` to a plain object flattening inherited enumerable string
 * keyed properties of `value` to own properties of the plain object.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {Object} Returns the converted plain object.
 * @example
 *
 * function Foo() {
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.assign({ 'a': 1 }, new Foo);
 * // => { 'a': 1, 'b': 2 }
 *
 * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
 * // => { 'a': 1, 'b': 2, 'c': 3 }
 */
function toPlainObject(value) {
  return copyObject(value, keysIn(value));
}
module.exports = toPlainObject;

/***/ }),
/* 123 */
/***/ (function(module, exports, __webpack_require__) {

var assignValue = __webpack_require__(54),
  baseAssignValue = __webpack_require__(36);

/**
 * Copies properties of `source` to `object`.
 *
 * @private
 * @param {Object} source The object to copy properties from.
 * @param {Array} props The property identifiers to copy.
 * @param {Object} [object={}] The object to copy properties to.
 * @param {Function} [customizer] The function to customize copied values.
 * @returns {Object} Returns `object`.
 */
function copyObject(source, props, object, customizer) {
  var isNew = !object;
  object || (object = {});
  var index = -1,
    length = props.length;
  while (++index < length) {
    var key = props[index];
    var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined;
    if (newValue === undefined) {
      newValue = source[key];
    }
    if (isNew) {
      baseAssignValue(object, key, newValue);
    } else {
      assignValue(object, key, newValue);
    }
  }
  return object;
}
module.exports = copyObject;

/***/ }),
/* 124 */
/***/ (function(module, exports, __webpack_require__) {

var baseTimes = __webpack_require__(125),
  isArguments = __webpack_require__(30),
  isArray = __webpack_require__(16),
  isBuffer = __webpack_require__(51),
  isIndex = __webpack_require__(31),
  isTypedArray = __webpack_require__(52);

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Creates an array of the enumerable property names of the array-like `value`.
 *
 * @private
 * @param {*} value The value to query.
 * @param {boolean} inherited Specify returning inherited property names.
 * @returns {Array} Returns the array of property names.
 */
function arrayLikeKeys(value, inherited) {
  var isArr = isArray(value),
    isArg = !isArr && isArguments(value),
    isBuff = !isArr && !isArg && isBuffer(value),
    isType = !isArr && !isArg && !isBuff && isTypedArray(value),
    skipIndexes = isArr || isArg || isBuff || isType,
    result = skipIndexes ? baseTimes(value.length, String) : [],
    length = result.length;
  for (var key in value) {
    if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (
    // Safari 9 has enumerable `arguments.length` in strict mode.
    key == 'length' ||
    // Node.js 0.10 has enumerable non-index properties on buffers.
    isBuff && (key == 'offset' || key == 'parent') ||
    // PhantomJS 2 has enumerable non-index properties on typed arrays.
    isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset') ||
    // Skip index properties.
    isIndex(key, length)))) {
      result.push(key);
    }
  }
  return result;
}
module.exports = arrayLikeKeys;

/***/ }),
/* 125 */
/***/ (function(module, exports) {

/**
 * The base implementation of `_.times` without support for iteratee shorthands
 * or max array length checks.
 *
 * @private
 * @param {number} n The number of times to invoke `iteratee`.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array} Returns the array of results.
 */
function baseTimes(n, iteratee) {
  var index = -1,
    result = Array(n);
  while (++index < n) {
    result[index] = iteratee(index);
  }
  return result;
}
module.exports = baseTimes;

/***/ }),
/* 126 */
/***/ (function(module, exports, __webpack_require__) {

var isObject = __webpack_require__(15),
  isPrototype = __webpack_require__(50),
  nativeKeysIn = __webpack_require__(127);

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 */
function baseKeysIn(object) {
  if (!isObject(object)) {
    return nativeKeysIn(object);
  }
  var isProto = isPrototype(object),
    result = [];
  for (var key in object) {
    if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
      result.push(key);
    }
  }
  return result;
}
module.exports = baseKeysIn;

/***/ }),
/* 127 */
/***/ (function(module, exports) {

/**
 * This function is like
 * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
 * except that it includes inherited enumerable properties.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 */
function nativeKeysIn(object) {
  var result = [];
  if (object != null) {
    for (var key in Object(object)) {
      result.push(key);
    }
  }
  return result;
}
module.exports = nativeKeysIn;

/***/ }),
/* 128 */
/***/ (function(module, exports, __webpack_require__) {

var baseRest = __webpack_require__(129),
  isIterateeCall = __webpack_require__(134);

/**
 * Creates a function like `_.assign`.
 *
 * @private
 * @param {Function} assigner The function to assign values.
 * @returns {Function} Returns the new assigner function.
 */
function createAssigner(assigner) {
  return baseRest(function (object, sources) {
    var index = -1,
      length = sources.length,
      customizer = length > 1 ? sources[length - 1] : undefined,
      guard = length > 2 ? sources[2] : undefined;
    customizer = assigner.length > 3 && typeof customizer == 'function' ? (length--, customizer) : undefined;
    if (guard && isIterateeCall(sources[0], sources[1], guard)) {
      customizer = length < 3 ? undefined : customizer;
      length = 1;
    }
    object = Object(object);
    while (++index < length) {
      var source = sources[index];
      if (source) {
        assigner(object, source, index, customizer);
      }
    }
    return object;
  });
}
module.exports = createAssigner;

/***/ }),
/* 129 */
/***/ (function(module, exports, __webpack_require__) {

var identity = __webpack_require__(56),
  overRest = __webpack_require__(57),
  setToString = __webpack_require__(58);

/**
 * The base implementation of `_.rest` which doesn't validate or coerce arguments.
 *
 * @private
 * @param {Function} func The function to apply a rest parameter to.
 * @param {number} [start=func.length-1] The start position of the rest parameter.
 * @returns {Function} Returns the new function.
 */
function baseRest(func, start) {
  return setToString(overRest(func, start, identity), func + '');
}
module.exports = baseRest;

/***/ }),
/* 130 */
/***/ (function(module, exports) {

/**
 * A faster alternative to `Function#apply`, this function invokes `func`
 * with the `this` binding of `thisArg` and the arguments of `args`.
 *
 * @private
 * @param {Function} func The function to invoke.
 * @param {*} thisArg The `this` binding of `func`.
 * @param {Array} args The arguments to invoke `func` with.
 * @returns {*} Returns the result of `func`.
 */
function apply(func, thisArg, args) {
  switch (args.length) {
    case 0:
      return func.call(thisArg);
    case 1:
      return func.call(thisArg, args[0]);
    case 2:
      return func.call(thisArg, args[0], args[1]);
    case 3:
      return func.call(thisArg, args[0], args[1], args[2]);
  }
  return func.apply(thisArg, args);
}
module.exports = apply;

/***/ }),
/* 131 */
/***/ (function(module, exports, __webpack_require__) {

var constant = __webpack_require__(132),
  defineProperty = __webpack_require__(48),
  identity = __webpack_require__(56);

/**
 * The base implementation of `setToString` without support for hot loop shorting.
 *
 * @private
 * @param {Function} func The function to modify.
 * @param {Function} string The `toString` result.
 * @returns {Function} Returns `func`.
 */
var baseSetToString = !defineProperty ? identity : function (func, string) {
  return defineProperty(func, 'toString', {
    'configurable': true,
    'enumerable': false,
    'value': constant(string),
    'writable': true
  });
};
module.exports = baseSetToString;

/***/ }),
/* 132 */
/***/ (function(module, exports) {

/**
 * Creates a function that returns `value`.
 *
 * @static
 * @memberOf _
 * @since 2.4.0
 * @category Util
 * @param {*} value The value to return from the new function.
 * @returns {Function} Returns the new constant function.
 * @example
 *
 * var objects = _.times(2, _.constant({ 'a': 1 }));
 *
 * console.log(objects);
 * // => [{ 'a': 1 }, { 'a': 1 }]
 *
 * console.log(objects[0] === objects[1]);
 * // => true
 */
function constant(value) {
  return function () {
    return value;
  };
}
module.exports = constant;

/***/ }),
/* 133 */
/***/ (function(module, exports) {

/** Used to detect hot functions by number of calls within a span of milliseconds. */
var HOT_COUNT = 800,
  HOT_SPAN = 16;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeNow = Date.now;

/**
 * Creates a function that'll short out and invoke `identity` instead
 * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
 * milliseconds.
 *
 * @private
 * @param {Function} func The function to restrict.
 * @returns {Function} Returns the new shortable function.
 */
function shortOut(func) {
  var count = 0,
    lastCalled = 0;
  return function () {
    var stamp = nativeNow(),
      remaining = HOT_SPAN - (stamp - lastCalled);
    lastCalled = stamp;
    if (remaining > 0) {
      if (++count >= HOT_COUNT) {
        return arguments[0];
      }
    } else {
      count = 0;
    }
    return func.apply(undefined, arguments);
  };
}
module.exports = shortOut;

/***/ }),
/* 134 */
/***/ (function(module, exports, __webpack_require__) {

var eq = __webpack_require__(26),
  isArrayLike = __webpack_require__(38),
  isIndex = __webpack_require__(31),
  isObject = __webpack_require__(15);

/**
 * Checks if the given arguments are from an iteratee call.
 *
 * @private
 * @param {*} value The potential iteratee value argument.
 * @param {*} index The potential iteratee index or key argument.
 * @param {*} object The potential iteratee object argument.
 * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
 *  else `false`.
 */
function isIterateeCall(value, index, object) {
  if (!isObject(object)) {
    return false;
  }
  var type = typeof index;
  if (type == 'number' ? isArrayLike(object) && isIndex(index, object.length) : type == 'string' && index in object) {
    return eq(object[index], value);
  }
  return false;
}
module.exports = isIterateeCall;

/***/ }),
/* 135 */
/***/ (function(module, exports) {

/*
 * typedefs.js
 * Normalizes browser-specific prefixes and provide some basic polyfills
 */

if (typeof window !== 'undefined') {
  if (!window.requestAnimationFrame) {
    window.requestAnimationFrame = function () {
      return window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function ( /* function FrameRequestCallback */callback) {
        window.setTimeout(callback, 1000 / 60);
      };
    }();
  }
}
if (typeof Math.imul !== 'function') {
  /* eslint-disable no-bitwise */
  Math.imul = function (a, b) {
    var ah = a >>> 16 & 0xffff;
    var al = a & 0xffff;
    var bh = b >>> 16 & 0xffff;
    var bl = b & 0xffff;
    // the shift by 0 fixes the sign on the high part
    // the final |0 converts the unsigned value into a signed value
    return al * bl + (ah * bl + al * bh << 16 >>> 0) | 0;
  };
  /* eslint-enable no-bitwise */
}

if (typeof Object.assign !== 'function') {
  Object.assign = function (target) {
    // .length of function is 2

    'use strict';

    if (target === null) {
      // TypeError if undefined or null
      throw new TypeError('Cannot convert undefined or null to object');
    }
    var to = Object(target);
    for (var index = 1; index < arguments.length; index++) {
      // eslint-disable-next-line prefer-rest-params
      var nextSource = arguments[index];
      if (nextSource !== null) {
        // Skip over if undefined or null
        // eslint-disable-next-line no-restricted-syntax
        for (var nextKey in nextSource) {
          // Avoid bugs when hasOwnProperty is shadowed
          if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
            to[nextKey] = nextSource[nextKey];
          }
        }
      }
    }
    return to;
  };
}

/***/ }),
/* 136 */
/***/ (function(module, exports) {

function _arrayWithHoles(arr) {
  if (Array.isArray(arr)) return arr;
}
module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 137 */
/***/ (function(module, exports) {

function _iterableToArrayLimit(arr, i) {
  var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
  if (_i == null) return;
  var _arr = [];
  var _n = true;
  var _d = false;
  var _s, _e;
  try {
    for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
      _arr.push(_s.value);
      if (i && _arr.length === i) break;
    }
  } catch (err) {
    _d = true;
    _e = err;
  } finally {
    try {
      if (!_n && _i["return"] != null) _i["return"]();
    } finally {
      if (_d) throw _e;
    }
  }
  return _arr;
}
module.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 138 */
/***/ (function(module, exports) {

function _nonIterableRest() {
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
module.exports = _nonIterableRest, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 139 */
/***/ (function(module, exports, __webpack_require__) {

var _typeof = __webpack_require__(17)["default"];
function _regeneratorRuntime() {
  "use strict";

  /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
  module.exports = _regeneratorRuntime = function _regeneratorRuntime() {
    return exports;
  }, module.exports.__esModule = true, module.exports["default"] = module.exports;
  var exports = {},
    Op = Object.prototype,
    hasOwn = Op.hasOwnProperty,
    defineProperty = Object.defineProperty || function (obj, key, desc) {
      obj[key] = desc.value;
    },
    $Symbol = "function" == typeof Symbol ? Symbol : {},
    iteratorSymbol = $Symbol.iterator || "@@iterator",
    asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator",
    toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
  function define(obj, key, value) {
    return Object.defineProperty(obj, key, {
      value: value,
      enumerable: !0,
      configurable: !0,
      writable: !0
    }), obj[key];
  }
  try {
    define({}, "");
  } catch (err) {
    define = function define(obj, key, value) {
      return obj[key] = value;
    };
  }
  function wrap(innerFn, outerFn, self, tryLocsList) {
    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,
      generator = Object.create(protoGenerator.prototype),
      context = new Context(tryLocsList || []);
    return defineProperty(generator, "_invoke", {
      value: makeInvokeMethod(innerFn, self, context)
    }), generator;
  }
  function tryCatch(fn, obj, arg) {
    try {
      return {
        type: "normal",
        arg: fn.call(obj, arg)
      };
    } catch (err) {
      return {
        type: "throw",
        arg: err
      };
    }
  }
  exports.wrap = wrap;
  var ContinueSentinel = {};
  function Generator() {}
  function GeneratorFunction() {}
  function GeneratorFunctionPrototype() {}
  var IteratorPrototype = {};
  define(IteratorPrototype, iteratorSymbol, function () {
    return this;
  });
  var getProto = Object.getPrototypeOf,
    NativeIteratorPrototype = getProto && getProto(getProto(values([])));
  NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);
  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
  function defineIteratorMethods(prototype) {
    ["next", "throw", "return"].forEach(function (method) {
      define(prototype, method, function (arg) {
        return this._invoke(method, arg);
      });
    });
  }
  function AsyncIterator(generator, PromiseImpl) {
    function invoke(method, arg, resolve, reject) {
      var record = tryCatch(generator[method], generator, arg);
      if ("throw" !== record.type) {
        var result = record.arg,
          value = result.value;
        return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) {
          invoke("next", value, resolve, reject);
        }, function (err) {
          invoke("throw", err, resolve, reject);
        }) : PromiseImpl.resolve(value).then(function (unwrapped) {
          result.value = unwrapped, resolve(result);
        }, function (error) {
          return invoke("throw", error, resolve, reject);
        });
      }
      reject(record.arg);
    }
    var previousPromise;
    defineProperty(this, "_invoke", {
      value: function value(method, arg) {
        function callInvokeWithMethodAndArg() {
          return new PromiseImpl(function (resolve, reject) {
            invoke(method, arg, resolve, reject);
          });
        }
        return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
      }
    });
  }
  function makeInvokeMethod(innerFn, self, context) {
    var state = "suspendedStart";
    return function (method, arg) {
      if ("executing" === state) throw new Error("Generator is already running");
      if ("completed" === state) {
        if ("throw" === method) throw arg;
        return doneResult();
      }
      for (context.method = method, context.arg = arg;;) {
        var delegate = context.delegate;
        if (delegate) {
          var delegateResult = maybeInvokeDelegate(delegate, context);
          if (delegateResult) {
            if (delegateResult === ContinueSentinel) continue;
            return delegateResult;
          }
        }
        if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) {
          if ("suspendedStart" === state) throw state = "completed", context.arg;
          context.dispatchException(context.arg);
        } else "return" === context.method && context.abrupt("return", context.arg);
        state = "executing";
        var record = tryCatch(innerFn, self, context);
        if ("normal" === record.type) {
          if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue;
          return {
            value: record.arg,
            done: context.done
          };
        }
        "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg);
      }
    };
  }
  function maybeInvokeDelegate(delegate, context) {
    var method = delegate.iterator[context.method];
    if (undefined === method) {
      if (context.delegate = null, "throw" === context.method) {
        if (delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method)) return ContinueSentinel;
        context.method = "throw", context.arg = new TypeError("The iterator does not provide a 'throw' method");
      }
      return ContinueSentinel;
    }
    var record = tryCatch(method, delegate.iterator, context.arg);
    if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel;
    var info = record.arg;
    return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel);
  }
  function pushTryEntry(locs) {
    var entry = {
      tryLoc: locs[0]
    };
    1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
  }
  function resetTryEntry(entry) {
    var record = entry.completion || {};
    record.type = "normal", delete record.arg, entry.completion = record;
  }
  function Context(tryLocsList) {
    this.tryEntries = [{
      tryLoc: "root"
    }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);
  }
  function values(iterable) {
    if (iterable) {
      var iteratorMethod = iterable[iteratorSymbol];
      if (iteratorMethod) return iteratorMethod.call(iterable);
      if ("function" == typeof iterable.next) return iterable;
      if (!isNaN(iterable.length)) {
        var i = -1,
          next = function next() {
            for (; ++i < iterable.length;) {
              if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;
            }
            return next.value = undefined, next.done = !0, next;
          };
        return next.next = next;
      }
    }
    return {
      next: doneResult
    };
  }
  function doneResult() {
    return {
      value: undefined,
      done: !0
    };
  }
  return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", {
    value: GeneratorFunctionPrototype,
    configurable: !0
  }), defineProperty(GeneratorFunctionPrototype, "constructor", {
    value: GeneratorFunction,
    configurable: !0
  }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) {
    var ctor = "function" == typeof genFun && genFun.constructor;
    return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
  }, exports.mark = function (genFun) {
    return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
  }, exports.awrap = function (arg) {
    return {
      __await: arg
    };
  }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
    return this;
  }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
    void 0 === PromiseImpl && (PromiseImpl = Promise);
    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
    return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {
      return result.done ? result.value : iter.next();
    });
  }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () {
    return this;
  }), define(Gp, "toString", function () {
    return "[object Generator]";
  }), exports.keys = function (val) {
    var object = Object(val),
      keys = [];
    for (var key in object) {
      keys.push(key);
    }
    return keys.reverse(), function next() {
      for (; keys.length;) {
        var key = keys.pop();
        if (key in object) return next.value = key, next.done = !1, next;
      }
      return next.done = !0, next;
    };
  }, exports.values = values, Context.prototype = {
    constructor: Context,
    reset: function reset(skipTempReset) {
      if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) {
        "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);
      }
    },
    stop: function stop() {
      this.done = !0;
      var rootRecord = this.tryEntries[0].completion;
      if ("throw" === rootRecord.type) throw rootRecord.arg;
      return this.rval;
    },
    dispatchException: function dispatchException(exception) {
      if (this.done) throw exception;
      var context = this;
      function handle(loc, caught) {
        return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught;
      }
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i],
          record = entry.completion;
        if ("root" === entry.tryLoc) return handle("end");
        if (entry.tryLoc <= this.prev) {
          var hasCatch = hasOwn.call(entry, "catchLoc"),
            hasFinally = hasOwn.call(entry, "finallyLoc");
          if (hasCatch && hasFinally) {
            if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
            if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
          } else if (hasCatch) {
            if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
          } else {
            if (!hasFinally) throw new Error("try statement without catch or finally");
            if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
          }
        }
      }
    },
    abrupt: function abrupt(type, arg) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
          var finallyEntry = entry;
          break;
        }
      }
      finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
      var record = finallyEntry ? finallyEntry.completion : {};
      return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
    },
    complete: function complete(record, afterLoc) {
      if ("throw" === record.type) throw record.arg;
      return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
    },
    finish: function finish(finallyLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
      }
    },
    "catch": function _catch(tryLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.tryLoc === tryLoc) {
          var record = entry.completion;
          if ("throw" === record.type) {
            var thrown = record.arg;
            resetTryEntry(entry);
          }
          return thrown;
        }
      }
      throw new Error("illegal catch attempt");
    },
    delegateYield: function delegateYield(iterable, resultName, nextLoc) {
      return this.delegate = {
        iterator: values(iterable),
        resultName: resultName,
        nextLoc: nextLoc
      }, "next" === this.method && (this.arg = undefined), ContinueSentinel;
    }
  }, exports;
}
module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 140 */
/***/ (function(module, exports, __webpack_require__) {

var getPrototypeOf = __webpack_require__(2);
function _superPropBase(object, property) {
  while (!Object.prototype.hasOwnProperty.call(object, property)) {
    object = getPrototypeOf(object);
    if (object === null) break;
  }
  return object;
}
module.exports = _superPropBase, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 141 */
/***/ (function(module, exports, __webpack_require__) {

var arrayLikeToArray = __webpack_require__(60);
function _arrayWithoutHoles(arr) {
  if (Array.isArray(arr)) return arrayLikeToArray(arr);
}
module.exports = _arrayWithoutHoles, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 142 */
/***/ (function(module, exports) {

function _iterableToArray(iter) {
  if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
}
module.exports = _iterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 143 */
/***/ (function(module, exports) {

function _nonIterableSpread() {
  throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
module.exports = _nonIterableSpread, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 144 */
/***/ (function(module, exports, __webpack_require__) {

var basePickBy = __webpack_require__(145),
  hasIn = __webpack_require__(155);

/**
 * The base implementation of `_.pick` without support for individual
 * property identifiers.
 *
 * @private
 * @param {Object} object The source object.
 * @param {string[]} paths The property paths to pick.
 * @returns {Object} Returns the new object.
 */
function basePick(object, paths) {
  return basePickBy(object, paths, function (value, path) {
    return hasIn(object, path);
  });
}
module.exports = basePick;

/***/ }),
/* 145 */
/***/ (function(module, exports, __webpack_require__) {

var baseGet = __webpack_require__(146),
  baseSet = __webpack_require__(154),
  castPath = __webpack_require__(32);

/**
 * The base implementation of  `_.pickBy` without support for iteratee shorthands.
 *
 * @private
 * @param {Object} object The source object.
 * @param {string[]} paths The property paths to pick.
 * @param {Function} predicate The function invoked per property.
 * @returns {Object} Returns the new object.
 */
function basePickBy(object, paths, predicate) {
  var index = -1,
    length = paths.length,
    result = {};
  while (++index < length) {
    var path = paths[index],
      value = baseGet(object, path);
    if (predicate(value, path)) {
      baseSet(result, castPath(path, object), value);
    }
  }
  return result;
}
module.exports = basePickBy;

/***/ }),
/* 146 */
/***/ (function(module, exports, __webpack_require__) {

var castPath = __webpack_require__(32),
  toKey = __webpack_require__(42);

/**
 * The base implementation of `_.get` without support for default values.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {Array|string} path The path of the property to get.
 * @returns {*} Returns the resolved value.
 */
function baseGet(object, path) {
  path = castPath(path, object);
  var index = 0,
    length = path.length;
  while (object != null && index < length) {
    object = object[toKey(path[index++])];
  }
  return index && index == length ? object : undefined;
}
module.exports = baseGet;

/***/ }),
/* 147 */
/***/ (function(module, exports, __webpack_require__) {

var isArray = __webpack_require__(16),
  isSymbol = __webpack_require__(41);

/** Used to match property names within property paths. */
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
  reIsPlainProp = /^\w*$/;

/**
 * Checks if `value` is a property name and not a property path.
 *
 * @private
 * @param {*} value The value to check.
 * @param {Object} [object] The object to query keys on.
 * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
 */
function isKey(value, object) {
  if (isArray(value)) {
    return false;
  }
  var type = typeof value;
  if (type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol(value)) {
    return true;
  }
  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object(object);
}
module.exports = isKey;

/***/ }),
/* 148 */
/***/ (function(module, exports, __webpack_require__) {

var memoizeCapped = __webpack_require__(149);

/** Used to match property names within property paths. */
var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;

/** Used to match backslashes in property paths. */
var reEscapeChar = /\\(\\)?/g;

/**
 * Converts `string` to a property path array.
 *
 * @private
 * @param {string} string The string to convert.
 * @returns {Array} Returns the property path array.
 */
var stringToPath = memoizeCapped(function (string) {
  var result = [];
  if (string.charCodeAt(0) === 46 /* . */) {
    result.push('');
  }
  string.replace(rePropName, function (match, number, quote, subString) {
    result.push(quote ? subString.replace(reEscapeChar, '$1') : number || match);
  });
  return result;
});
module.exports = stringToPath;

/***/ }),
/* 149 */
/***/ (function(module, exports, __webpack_require__) {

var memoize = __webpack_require__(150);

/** Used as the maximum memoize cache size. */
var MAX_MEMOIZE_SIZE = 500;

/**
 * A specialized version of `_.memoize` which clears the memoized function's
 * cache when it exceeds `MAX_MEMOIZE_SIZE`.
 *
 * @private
 * @param {Function} func The function to have its output memoized.
 * @returns {Function} Returns the new memoized function.
 */
function memoizeCapped(func) {
  var result = memoize(func, function (key) {
    if (cache.size === MAX_MEMOIZE_SIZE) {
      cache.clear();
    }
    return key;
  });
  var cache = result.cache;
  return result;
}
module.exports = memoizeCapped;

/***/ }),
/* 150 */
/***/ (function(module, exports, __webpack_require__) {

var MapCache = __webpack_require__(46);

/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';

/**
 * Creates a function that memoizes the result of `func`. If `resolver` is
 * provided, it determines the cache key for storing the result based on the
 * arguments provided to the memoized function. By default, the first argument
 * provided to the memoized function is used as the map cache key. The `func`
 * is invoked with the `this` binding of the memoized function.
 *
 * **Note:** The cache is exposed as the `cache` property on the memoized
 * function. Its creation may be customized by replacing the `_.memoize.Cache`
 * constructor with one whose instances implement the
 * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
 * method interface of `clear`, `delete`, `get`, `has`, and `set`.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Function
 * @param {Function} func The function to have its output memoized.
 * @param {Function} [resolver] The function to resolve the cache key.
 * @returns {Function} Returns the new memoized function.
 * @example
 *
 * var object = { 'a': 1, 'b': 2 };
 * var other = { 'c': 3, 'd': 4 };
 *
 * var values = _.memoize(_.values);
 * values(object);
 * // => [1, 2]
 *
 * values(other);
 * // => [3, 4]
 *
 * object.a = 2;
 * values(object);
 * // => [1, 2]
 *
 * // Modify the result cache.
 * values.cache.set(object, ['a', 'b']);
 * values(object);
 * // => ['a', 'b']
 *
 * // Replace `_.memoize.Cache`.
 * _.memoize.Cache = WeakMap;
 */
function memoize(func, resolver) {
  if (typeof func != 'function' || resolver != null && typeof resolver != 'function') {
    throw new TypeError(FUNC_ERROR_TEXT);
  }
  var memoized = function () {
    var args = arguments,
      key = resolver ? resolver.apply(this, args) : args[0],
      cache = memoized.cache;
    if (cache.has(key)) {
      return cache.get(key);
    }
    var result = func.apply(this, args);
    memoized.cache = cache.set(key, result) || cache;
    return result;
  };
  memoized.cache = new (memoize.Cache || MapCache)();
  return memoized;
}

// Expose `MapCache`.
memoize.Cache = MapCache;
module.exports = memoize;

/***/ }),
/* 151 */
/***/ (function(module, exports, __webpack_require__) {

var baseToString = __webpack_require__(152);

/**
 * Converts `value` to a string. An empty string is returned for `null`
 * and `undefined` values. The sign of `-0` is preserved.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {string} Returns the converted string.
 * @example
 *
 * _.toString(null);
 * // => ''
 *
 * _.toString(-0);
 * // => '-0'
 *
 * _.toString([1, 2, 3]);
 * // => '1,2,3'
 */
function toString(value) {
  return value == null ? '' : baseToString(value);
}
module.exports = toString;

/***/ }),
/* 152 */
/***/ (function(module, exports, __webpack_require__) {

var Symbol = __webpack_require__(27),
  arrayMap = __webpack_require__(153),
  isArray = __webpack_require__(16),
  isSymbol = __webpack_require__(41);

/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;

/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol ? Symbol.prototype : undefined,
  symbolToString = symbolProto ? symbolProto.toString : undefined;

/**
 * The base implementation of `_.toString` which doesn't convert nullish
 * values to empty strings.
 *
 * @private
 * @param {*} value The value to process.
 * @returns {string} Returns the string.
 */
function baseToString(value) {
  // Exit early for strings to avoid a performance hit in some environments.
  if (typeof value == 'string') {
    return value;
  }
  if (isArray(value)) {
    // Recursively convert values (susceptible to call stack limits).
    return arrayMap(value, baseToString) + '';
  }
  if (isSymbol(value)) {
    return symbolToString ? symbolToString.call(value) : '';
  }
  var result = value + '';
  return result == '0' && 1 / value == -INFINITY ? '-0' : result;
}
module.exports = baseToString;

/***/ }),
/* 153 */
/***/ (function(module, exports) {

/**
 * A specialized version of `_.map` for arrays without support for iteratee
 * shorthands.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array} Returns the new mapped array.
 */
function arrayMap(array, iteratee) {
  var index = -1,
    length = array == null ? 0 : array.length,
    result = Array(length);
  while (++index < length) {
    result[index] = iteratee(array[index], index, array);
  }
  return result;
}
module.exports = arrayMap;

/***/ }),
/* 154 */
/***/ (function(module, exports, __webpack_require__) {

var assignValue = __webpack_require__(54),
  castPath = __webpack_require__(32),
  isIndex = __webpack_require__(31),
  isObject = __webpack_require__(15),
  toKey = __webpack_require__(42);

/**
 * The base implementation of `_.set`.
 *
 * @private
 * @param {Object} object The object to modify.
 * @param {Array|string} path The path of the property to set.
 * @param {*} value The value to set.
 * @param {Function} [customizer] The function to customize path creation.
 * @returns {Object} Returns `object`.
 */
function baseSet(object, path, value, customizer) {
  if (!isObject(object)) {
    return object;
  }
  path = castPath(path, object);
  var index = -1,
    length = path.length,
    lastIndex = length - 1,
    nested = object;
  while (nested != null && ++index < length) {
    var key = toKey(path[index]),
      newValue = value;
    if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
      return object;
    }
    if (index != lastIndex) {
      var objValue = nested[key];
      newValue = customizer ? customizer(objValue, key, nested) : undefined;
      if (newValue === undefined) {
        newValue = isObject(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {};
      }
    }
    assignValue(nested, key, newValue);
    nested = nested[key];
  }
  return object;
}
module.exports = baseSet;

/***/ }),
/* 155 */
/***/ (function(module, exports, __webpack_require__) {

var baseHasIn = __webpack_require__(156),
  hasPath = __webpack_require__(157);

/**
 * Checks if `path` is a direct or inherited property of `object`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Object
 * @param {Object} object The object to query.
 * @param {Array|string} path The path to check.
 * @returns {boolean} Returns `true` if `path` exists, else `false`.
 * @example
 *
 * var object = _.create({ 'a': _.create({ 'b': 2 }) });
 *
 * _.hasIn(object, 'a');
 * // => true
 *
 * _.hasIn(object, 'a.b');
 * // => true
 *
 * _.hasIn(object, ['a', 'b']);
 * // => true
 *
 * _.hasIn(object, 'b');
 * // => false
 */
function hasIn(object, path) {
  return object != null && hasPath(object, path, baseHasIn);
}
module.exports = hasIn;

/***/ }),
/* 156 */
/***/ (function(module, exports) {

/**
 * The base implementation of `_.hasIn` without support for deep paths.
 *
 * @private
 * @param {Object} [object] The object to query.
 * @param {Array|string} key The key to check.
 * @returns {boolean} Returns `true` if `key` exists, else `false`.
 */
function baseHasIn(object, key) {
  return object != null && key in Object(object);
}
module.exports = baseHasIn;

/***/ }),
/* 157 */
/***/ (function(module, exports, __webpack_require__) {

var castPath = __webpack_require__(32),
  isArguments = __webpack_require__(30),
  isArray = __webpack_require__(16),
  isIndex = __webpack_require__(31),
  isLength = __webpack_require__(39),
  toKey = __webpack_require__(42);

/**
 * Checks if `path` exists on `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {Array|string} path The path to check.
 * @param {Function} hasFunc The function to check properties.
 * @returns {boolean} Returns `true` if `path` exists, else `false`.
 */
function hasPath(object, path, hasFunc) {
  path = castPath(path, object);
  var index = -1,
    length = path.length,
    result = false;
  while (++index < length) {
    var key = toKey(path[index]);
    if (!(result = object != null && hasFunc(object, key))) {
      break;
    }
    object = object[key];
  }
  if (result || ++index != length) {
    return result;
  }
  length = object == null ? 0 : object.length;
  return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object));
}
module.exports = hasPath;

/***/ }),
/* 158 */
/***/ (function(module, exports, __webpack_require__) {

var flatten = __webpack_require__(159),
  overRest = __webpack_require__(57),
  setToString = __webpack_require__(58);

/**
 * A specialized version of `baseRest` which flattens the rest array.
 *
 * @private
 * @param {Function} func The function to apply a rest parameter to.
 * @returns {Function} Returns the new function.
 */
function flatRest(func) {
  return setToString(overRest(func, undefined, flatten), func + '');
}
module.exports = flatRest;

/***/ }),
/* 159 */
/***/ (function(module, exports, __webpack_require__) {

var baseFlatten = __webpack_require__(160);

/**
 * Flattens `array` a single level deep.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {Array} array The array to flatten.
 * @returns {Array} Returns the new flattened array.
 * @example
 *
 * _.flatten([1, [2, [3, [4]], 5]]);
 * // => [1, 2, [3, [4]], 5]
 */
function flatten(array) {
  var length = array == null ? 0 : array.length;
  return length ? baseFlatten(array, 1) : [];
}
module.exports = flatten;

/***/ }),
/* 160 */
/***/ (function(module, exports, __webpack_require__) {

var arrayPush = __webpack_require__(161),
  isFlattenable = __webpack_require__(162);

/**
 * The base implementation of `_.flatten` with support for restricting flattening.
 *
 * @private
 * @param {Array} array The array to flatten.
 * @param {number} depth The maximum recursion depth.
 * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
 * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
 * @param {Array} [result=[]] The initial result value.
 * @returns {Array} Returns the new flattened array.
 */
function baseFlatten(array, depth, predicate, isStrict, result) {
  var index = -1,
    length = array.length;
  predicate || (predicate = isFlattenable);
  result || (result = []);
  while (++index < length) {
    var value = array[index];
    if (depth > 0 && predicate(value)) {
      if (depth > 1) {
        // Recursively flatten arrays (susceptible to call stack limits).
        baseFlatten(value, depth - 1, predicate, isStrict, result);
      } else {
        arrayPush(result, value);
      }
    } else if (!isStrict) {
      result[result.length] = value;
    }
  }
  return result;
}
module.exports = baseFlatten;

/***/ }),
/* 161 */
/***/ (function(module, exports) {

/**
 * Appends the elements of `values` to `array`.
 *
 * @private
 * @param {Array} array The array to modify.
 * @param {Array} values The values to append.
 * @returns {Array} Returns `array`.
 */
function arrayPush(array, values) {
  var index = -1,
    length = values.length,
    offset = array.length;
  while (++index < length) {
    array[offset + index] = values[index];
  }
  return array;
}
module.exports = arrayPush;

/***/ }),
/* 162 */
/***/ (function(module, exports, __webpack_require__) {

var Symbol = __webpack_require__(27),
  isArguments = __webpack_require__(30),
  isArray = __webpack_require__(16);

/** Built-in value references. */
var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;

/**
 * Checks if `value` is a flattenable `arguments` object or array.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
 */
function isFlattenable(value) {
  return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]);
}
module.exports = isFlattenable;

/***/ }),
/* 163 */
/***/ (function(module, exports) {

function _isNativeFunction(fn) {
  return Function.toString.call(fn).indexOf("[native code]") !== -1;
}
module.exports = _isNativeFunction, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 164 */
/***/ (function(module, exports, __webpack_require__) {

var setPrototypeOf = __webpack_require__(40);
var isNativeReflectConstruct = __webpack_require__(165);
function _construct(Parent, args, Class) {
  if (isNativeReflectConstruct()) {
    module.exports = _construct = Reflect.construct.bind(), module.exports.__esModule = true, module.exports["default"] = module.exports;
  } else {
    module.exports = _construct = function _construct(Parent, args, Class) {
      var a = [null];
      a.push.apply(a, args);
      var Constructor = Function.bind.apply(Parent, a);
      var instance = new Constructor();
      if (Class) setPrototypeOf(instance, Class.prototype);
      return instance;
    }, module.exports.__esModule = true, module.exports["default"] = module.exports;
  }
  return _construct.apply(null, arguments);
}
module.exports = _construct, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 165 */
/***/ (function(module, exports) {

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !Reflect.construct) return false;
  if (Reflect.construct.sham) return false;
  if (typeof Proxy === "function") return true;
  try {
    Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}
module.exports = _isNativeReflectConstruct, module.exports.__esModule = true, module.exports["default"] = module.exports;

/***/ }),
/* 166 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);

// EXPORTS
__webpack_require__.d(__webpack_exports__, "BarcodeDecoder", function() { return /* reexport */ barcode_decoder; });
__webpack_require__.d(__webpack_exports__, "Readers", function() { return /* reexport */ reader_namespaceObject; });
__webpack_require__.d(__webpack_exports__, "CameraAccess", function() { return /* reexport */ camera_access; });
__webpack_require__.d(__webpack_exports__, "ImageDebug", function() { return /* reexport */ image_debug["a" /* default */]; });
__webpack_require__.d(__webpack_exports__, "ImageWrapper", function() { return /* reexport */ image_wrapper["a" /* default */]; });
__webpack_require__.d(__webpack_exports__, "ResultCollector", function() { return /* reexport */ result_collector; });

// NAMESPACE OBJECT: ./src/reader/index.ts
var reader_namespaceObject = {};
__webpack_require__.r(reader_namespaceObject);
__webpack_require__.d(reader_namespaceObject, "BarcodeReader", function() { return barcode_reader; });
__webpack_require__.d(reader_namespaceObject, "TwoOfFiveReader", function() { return _2of5_reader; });
__webpack_require__.d(reader_namespaceObject, "NewCodabarReader", function() { return codabar_reader; });
__webpack_require__.d(reader_namespaceObject, "Code128Reader", function() { return code_128_reader; });
__webpack_require__.d(reader_namespaceObject, "Code32Reader", function() { return code_32_reader; });
__webpack_require__.d(reader_namespaceObject, "Code39Reader", function() { return code_39_reader; });
__webpack_require__.d(reader_namespaceObject, "Code39VINReader", function() { return code_39_vin_reader; });
__webpack_require__.d(reader_namespaceObject, "Code93Reader", function() { return code_93_reader; });
__webpack_require__.d(reader_namespaceObject, "EAN2Reader", function() { return ean_2_reader; });
__webpack_require__.d(reader_namespaceObject, "EAN5Reader", function() { return ean_5_reader; });
__webpack_require__.d(reader_namespaceObject, "EAN8Reader", function() { return ean_8_reader; });
__webpack_require__.d(reader_namespaceObject, "EANReader", function() { return ean_reader; });
__webpack_require__.d(reader_namespaceObject, "I2of5Reader", function() { return i2of5_reader; });
__webpack_require__.d(reader_namespaceObject, "UPCEReader", function() { return upc_e_reader; });
__webpack_require__.d(reader_namespaceObject, "UPCReader", function() { return upc_reader; });

// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/typeof.js
var helpers_typeof = __webpack_require__(17);
var typeof_default = /*#__PURE__*/__webpack_require__.n(helpers_typeof);

// EXTERNAL MODULE: ./node_modules/lodash/merge.js
var merge = __webpack_require__(18);
var merge_default = /*#__PURE__*/__webpack_require__.n(merge);

// EXTERNAL MODULE: ./src/common/typedefs.js
var typedefs = __webpack_require__(135);

// EXTERNAL MODULE: ./src/common/image_wrapper.ts
var image_wrapper = __webpack_require__(12);

// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/asyncToGenerator.js
var asyncToGenerator = __webpack_require__(13);
var asyncToGenerator_default = /*#__PURE__*/__webpack_require__.n(asyncToGenerator);

// EXTERNAL MODULE: ./node_modules/@babel/runtime/regenerator/index.js
var regenerator = __webpack_require__(8);
var regenerator_default = /*#__PURE__*/__webpack_require__.n(regenerator);

// EXTERNAL MODULE: ./src/common/image_debug.ts
var image_debug = __webpack_require__(10);

// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/classCallCheck.js
var classCallCheck = __webpack_require__(3);
var classCallCheck_default = /*#__PURE__*/__webpack_require__.n(classCallCheck);

// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/createClass.js
var createClass = __webpack_require__(4);
var createClass_default = /*#__PURE__*/__webpack_require__.n(createClass);

// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/assertThisInitialized.js
var assertThisInitialized = __webpack_require__(1);
var assertThisInitialized_default = /*#__PURE__*/__webpack_require__.n(assertThisInitialized);

// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/inherits.js
var inherits = __webpack_require__(7);
var inherits_default = /*#__PURE__*/__webpack_require__.n(inherits);

// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js
var possibleConstructorReturn = __webpack_require__(6);
var possibleConstructorReturn_default = /*#__PURE__*/__webpack_require__.n(possibleConstructorReturn);

// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/getPrototypeOf.js
var getPrototypeOf = __webpack_require__(2);
var getPrototypeOf_default = /*#__PURE__*/__webpack_require__.n(getPrototypeOf);

// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/defineProperty.js
var defineProperty = __webpack_require__(0);
var defineProperty_default = /*#__PURE__*/__webpack_require__.n(defineProperty);

// EXTERNAL MODULE: ./src/common/array_helper.ts
var array_helper = __webpack_require__(11);

// CONCATENATED MODULE: ./src/reader/barcode_reader.ts



/* eslint-disable no-unused-vars */
/* eslint-disable class-methods-use-this */
// eslint-disable-next-line import/no-cycle



// for some reason this throws a shadow error on itself?!
// eslint-disable-next-line no-shadow
var BarcodeDirection;
(function (BarcodeDirection) {
  BarcodeDirection[BarcodeDirection["Forward"] = 1] = "Forward";
  BarcodeDirection[BarcodeDirection["Reverse"] = -1] = "Reverse";
})(BarcodeDirection || (BarcodeDirection = {}));
var barcode_reader_BarcodeReader = /*#__PURE__*/function () {
  function BarcodeReader(config, supplements) {
    classCallCheck_default()(this, BarcodeReader);
    defineProperty_default()(this, "_row", []);
    defineProperty_default()(this, "config", {});
    defineProperty_default()(this, "supplements", []);
    defineProperty_default()(this, "SINGLE_CODE_ERROR", 0);
    defineProperty_default()(this, "FORMAT", 'unknown');
    defineProperty_default()(this, "CONFIG_KEYS", {});
    this._row = [];
    this.config = config || {};
    if (supplements) {
      this.supplements = supplements;
    }
  }
  createClass_default()(BarcodeReader, [{
    key: "_nextUnset",
    value: function _nextUnset(line) {
      var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
      for (var i = start; i < line.length; i++) {
        if (!line[i]) return i;
      }
      return line.length;
    }
  }, {
    key: "_matchPattern",
    value: function _matchPattern(counter, code) {
      var maxSingleError = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.SINGLE_CODE_ERROR || 1;
      var error = 0;
      var singleError = 0;
      var sum = 0;
      var modulo = 0;
      var barWidth = 0;
      var count = 0;
      var scaled = 0;
      for (var i = 0; i < counter.length; i++) {
        sum += counter[i];
        modulo += code[i];
      }
      if (sum < modulo) {
        return Number.MAX_VALUE;
      }
      barWidth = sum / modulo;
      // eslint-disable-next-line no-param-reassign
      maxSingleError *= barWidth;
      for (var _i = 0; _i < counter.length; _i++) {
        count = counter[_i];
        scaled = code[_i] * barWidth;
        singleError = Math.abs(count - scaled) / scaled;
        if (singleError > maxSingleError) {
          return Number.MAX_VALUE;
        }
        error += singleError;
      }
      return error / modulo;
    }
  }, {
    key: "_nextSet",
    value: function _nextSet(line) {
      var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
      for (var i = offset; i < line.length; i++) {
        if (line[i]) return i;
      }
      return line.length;
    }
  }, {
    key: "_correctBars",
    value: function _correctBars(counter, correction, indices) {
      var length = indices.length;
      var tmp = 0;
      while (length--) {
        tmp = counter[indices[length]] * (1 - (1 - correction) / 2);
        if (tmp > 1) {
          // eslint-disable-next-line no-param-reassign
          counter[indices[length]] = tmp;
        }
      }
    }
  }, {
    key: "decodePattern",
    value: function decodePattern(pattern) {
      // console.warn('* decodePattern', pattern);
      this._row = pattern;
      // console.warn('* decodePattern calling decode', typeof this, this.constructor, this.FORMAT, JSON.stringify(this));
      var result = this.decode();
      // console.warn('* first result=', result);
      if (result === null) {
        this._row.reverse();
        result = this.decode();
        // console.warn('* reversed result=', result);
        if (result) {
          result.direction = BarcodeDirection.Reverse;
          result.start = this._row.length - result.start;
          result.end = this._row.length - result.end;
        }
      } else {
        result.direction = BarcodeDirection.Forward;
      }
      if (result) {
        result.format = this.FORMAT;
      }
      // console.warn('* returning', result);
      return result;
    }
  }, {
    key: "_matchRange",
    value: function _matchRange(start, end, value) {
      // eslint-disable-next-line no-param-reassign
      start = start < 0 ? 0 : start;
      var i;
      for (i = start; i < end; i++) {
        if (this._row[i] !== value) {
          return false;
        }
      }
      return true;
    }
  }, {
    key: "_fillCounters",
    value: function _fillCounters() {
      var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._nextUnset(this._row);
      var end = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this._row.length;
      var isWhite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
      var counters = [];
      var counterPos = 0;
      counters[counterPos] = 0;
      for (var i = offset; i < end; i++) {
        // eslint-disable-next-line no-bitwise
        if (this._row[i] ^ (isWhite ? 1 : 0)) {
          counters[counterPos]++;
        } else {
          counterPos++;
          counters[counterPos] = 1;
          // eslint-disable-next-line no-param-reassign
          isWhite = !isWhite;
        }
      }
      return counters;
    }
  }, {
    key: "_toCounters",
    value: function _toCounters(start, counters) {
      var numCounters = counters.length;
      var end = this._row.length;
      var isWhite = !this._row[start];
      var counterPos = 0;
      array_helper["a" /* default */].init(counters, 0);
      for (var i = start; i < end; i++) {
        // eslint-disable-next-line no-bitwise
        if (this._row[i] ^ (isWhite ? 1 : 0)) {
          // eslint-disable-next-line no-param-reassign
          counters[counterPos]++;
        } else {
          counterPos++;
          if (counterPos === numCounters) {
            break;
          } else {
            // eslint-disable-next-line no-param-reassign
            counters[counterPos] = 1;
            isWhite = !isWhite;
          }
        }
      }
      return counters;
    }

    // override/implement this in your custom readers.
  }, {
    key: "decodeImage",
    value: function decodeImage(imageWrapper) {
      // eslint-disable-next-line no-void
      void imageWrapper;
      return null;
    }
  }], [{
    key: "Exception",
    get: function get() {
      return {
        StartNotFoundException: 'Start-Info was not found!',
        CodeNotFoundException: 'Code could not be found!',
        PatternNotFoundException: 'Pattern could not be found!'
      };
    }
  }]);
  return BarcodeReader;
}();
/* harmony default export */ var barcode_reader = (barcode_reader_BarcodeReader);
// CONCATENATED MODULE: ./src/reader/2of5_reader.ts







function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var N = 1;
var W = 3;
var START_PATTERN = [W, N, W, N, N, N];
var STOP_PATTERN = [W, N, N, N, W];
var CODE_PATTERN = [[N, N, W, W, N], [W, N, N, N, W], [N, W, N, N, W], [W, W, N, N, N], [N, N, W, N, W], [W, N, W, N, N], [N, W, W, N, N], [N, N, N, W, W], [W, N, N, W, N], [N, W, N, W, N]];
var START_PATTERN_LENGTH = START_PATTERN.reduce(function (sum, val) {
  return sum + val;
}, 0);
var _2of5_reader_TwoOfFiveReader = /*#__PURE__*/function (_BarcodeReader) {
  inherits_default()(TwoOfFiveReader, _BarcodeReader);
  var _super = _createSuper(TwoOfFiveReader);
  function TwoOfFiveReader() {
    var _this;
    classCallCheck_default()(this, TwoOfFiveReader);
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    _this = _super.call.apply(_super, [this].concat(args));
    defineProperty_default()(assertThisInitialized_default()(_this), "barSpaceRatio", [1, 1]);
    defineProperty_default()(assertThisInitialized_default()(_this), "FORMAT", '2of5');
    defineProperty_default()(assertThisInitialized_default()(_this), "SINGLE_CODE_ERROR", 0.78);
    defineProperty_default()(assertThisInitialized_default()(_this), "AVG_CODE_ERROR", 0.30);
    return _this;
  }
  createClass_default()(TwoOfFiveReader, [{
    key: "_findPattern",
    value: function _findPattern(pattern, offset) {
      var isWhite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
      var tryHarder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
      var counter = [];
      var counterPos = 0;
      var bestMatch = {
        error: Number.MAX_VALUE,
        code: -1,
        start: 0,
        end: 0
      };
      var sum = 0;
      var error = 0;
      var epsilon = this.AVG_CODE_ERROR;
      if (!offset) {
        offset = this._nextSet(this._row);
      }
      for (var i = 0; i < pattern.length; i++) {
        counter[i] = 0;
      }
      for (var _i = offset; _i < this._row.length; _i++) {
        if (this._row[_i] ^ (isWhite ? 1 : 0)) {
          counter[counterPos]++;
        } else {
          if (counterPos === counter.length - 1) {
            sum = 0;
            for (var j = 0; j < counter.length; j++) {
              sum += counter[j];
            }
            error = this._matchPattern(counter, pattern);
            if (error < epsilon) {
              bestMatch.error = error;
              bestMatch.start = _i - sum;
              bestMatch.end = _i;
              return bestMatch;
            }
            if (tryHarder) {
              for (var _j = 0; _j < counter.length - 2; _j++) {
                counter[_j] = counter[_j + 2];
              }
              counter[counter.length - 2] = 0;
              counter[counter.length - 1] = 0;
              counterPos--;
            } else {
              return null;
            }
          } else {
            counterPos++;
          }
          counter[counterPos] = 1;
          isWhite = !isWhite;
        }
      }
      return null;
    }
  }, {
    key: "_findStart",
    value: function _findStart() {
      var startInfo = null;
      var offset = this._nextSet(this._row);
      var narrowBarWidth = 1;
      var leadingWhitespaceStart = 0;
      while (!startInfo) {
        startInfo = this._findPattern(START_PATTERN, offset, false, true);
        if (!startInfo) {
          return null;
        }
        narrowBarWidth = Math.floor((startInfo.end - startInfo.start) / START_PATTERN_LENGTH);
        leadingWhitespaceStart = startInfo.start - narrowBarWidth * 5;
        if (leadingWhitespaceStart >= 0) {
          if (this._matchRange(leadingWhitespaceStart, startInfo.start, 0)) {
            return startInfo;
          }
        }
        offset = startInfo.end;
        startInfo = null;
      }
      return startInfo;
    }
  }, {
    key: "_verifyTrailingWhitespace",
    value: function _verifyTrailingWhitespace(endInfo) {
      var trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2;
      if (trailingWhitespaceEnd < this._row.length) {
        if (this._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
          return endInfo;
        }
      }
      return null;
    }
  }, {
    key: "_findEnd",
    value: function _findEnd() {
      // TODO: reverse, followed by some calcs, followed by another reverse? really?
      this._row.reverse();
      var offset = this._nextSet(this._row);
      var endInfo = this._findPattern(STOP_PATTERN, offset, false, true);
      this._row.reverse();
      if (endInfo === null) {
        return null;
      }

      // reverse numbers
      var tmp = endInfo.start;
      endInfo.start = this._row.length - endInfo.end;
      endInfo.end = this._row.length - tmp;
      return endInfo !== null ? this._verifyTrailingWhitespace(endInfo) : null;
    }
  }, {
    key: "_verifyCounterLength",
    value: function _verifyCounterLength(counters) {
      return counters.length % 10 === 0;
    }
  }, {
    key: "_decodeCode",
    value: function _decodeCode(counter) {
      var epsilon = this.AVG_CODE_ERROR;
      var bestMatch = {
        error: Number.MAX_VALUE,
        code: -1,
        start: 0,
        end: 0
      };
      for (var code = 0; code < CODE_PATTERN.length; code++) {
        var error = this._matchPattern(counter, CODE_PATTERN[code]);
        if (error < bestMatch.error) {
          bestMatch.code = code;
          bestMatch.error = error;
        }
      }
      if (bestMatch.error < epsilon) {
        return bestMatch;
      }
      return null;
    }
  }, {
    key: "_decodePayload",
    value: function _decodePayload(counters, result, decodedCodes) {
      var pos = 0;
      var counterLength = counters.length;
      var counter = [0, 0, 0, 0, 0];
      var code = null;
      while (pos < counterLength) {
        for (var i = 0; i < 5; i++) {
          counter[i] = counters[pos] * this.barSpaceRatio[0];
          pos += 2;
        }
        code = this._decodeCode(counter);
        if (!code) {
          return null;
        }
        result.push("".concat(code.code));
        decodedCodes.push(code);
      }
      return code;
    }
  }, {
    key: "decode",
    value: function decode(row, start) {
      var startInfo = this._findStart();
      if (!startInfo) {
        return null;
      }
      var endInfo = this._findEnd();
      if (!endInfo) {
        return null;
      }
      var counters = this._fillCounters(startInfo.end, endInfo.start, false);
      if (!this._verifyCounterLength(counters)) {
        return null;
      }
      var decodedCodes = [];
      decodedCodes.push(startInfo);
      var result = [];
      var code = this._decodePayload(counters, result, decodedCodes);
      if (!code) {
        return null;
      }
      if (result.length < 5) {
        return null;
      }
      decodedCodes.push(endInfo);
      return {
        code: result.join(''),
        start: startInfo.start,
        end: endInfo.end,
        startInfo: startInfo,
        decodedCodes: decodedCodes,
        format: this.FORMAT
      };
    }
  }]);
  return TwoOfFiveReader;
}(barcode_reader);
/* harmony default export */ var _2of5_reader = (_2of5_reader_TwoOfFiveReader);
// CONCATENATED MODULE: ./src/reader/codabar_reader.ts







function codabar_reader_createSuper(Derived) { var hasNativeReflectConstruct = codabar_reader_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function codabar_reader_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }


// const ALPHABETH_STRING = '0123456789-$:/.+ABCD';
var ALPHABET = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 36, 58, 47, 46, 43, 65, 66, 67, 68];
var CHARACTER_ENCODINGS = [0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E];
var START_END = [0x01A, 0x029, 0x00B, 0x00E];
var MIN_ENCODED_CHARS = 4;
var MAX_ACCEPTABLE = 2.0;
var PADDING = 1.5;
;
;
var codabar_reader_NewCodabarReader = /*#__PURE__*/function (_BarcodeReader) {
  inherits_default()(NewCodabarReader, _BarcodeReader);
  var _super = codabar_reader_createSuper(NewCodabarReader);
  function NewCodabarReader() {
    var _this;
    classCallCheck_default()(this, NewCodabarReader);
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    _this = _super.call.apply(_super, [this].concat(args));
    defineProperty_default()(assertThisInitialized_default()(_this), "_counters", []);
    defineProperty_default()(assertThisInitialized_default()(_this), "FORMAT", 'codabar');
    return _this;
  }
  createClass_default()(NewCodabarReader, [{
    key: "_computeAlternatingThreshold",
    value: function _computeAlternatingThreshold(offset, end) {
      var min = Number.MAX_VALUE;
      var max = 0;
      var counter = 0;
      for (var i = offset; i < end; i += 2) {
        counter = this._counters[i];
        if (counter > max) {
          max = counter;
        }
        if (counter < min) {
          min = counter;
        }
      }
      return (min + max) / 2.0 | 0;
    }
  }, {
    key: "_toPattern",
    value: function _toPattern(offset) {
      var numCounters = 7;
      var end = offset + numCounters;
      if (end > this._counters.length) {
        return -1;
      }
      var barThreshold = this._computeAlternatingThreshold(offset, end);
      var spaceThreshold = this._computeAlternatingThreshold(offset + 1, end);
      var bitmask = 1 << numCounters - 1;
      var threshold = 0;
      var pattern = 0;
      for (var i = 0; i < numCounters; i++) {
        threshold = (i & 1) === 0 ? barThreshold : spaceThreshold;
        if (this._counters[offset + i] > threshold) {
          pattern |= bitmask;
        }
        bitmask >>= 1;
      }
      return pattern;
    }
  }, {
    key: "_isStartEnd",
    value: function _isStartEnd(pattern) {
      for (var i = 0; i < START_END.length; i++) {
        if (START_END[i] === pattern) {
          return true;
        }
      }
      return false;
    }
  }, {
    key: "_sumCounters",
    value: function _sumCounters(start, end) {
      var sum = 0;
      for (var i = start; i < end; i++) {
        sum += this._counters[i];
      }
      return sum;
    }
  }, {
    key: "_findStart",
    value: function _findStart() {
      var start = this._nextUnset(this._row);
      var end = start;
      for (var i = 1; i < this._counters.length; i++) {
        var pattern = this._toPattern(i);
        if (pattern !== -1 && this._isStartEnd(pattern)) {
          // TODO: Look for whitespace ahead
          start += this._sumCounters(0, i);
          end = start + this._sumCounters(i, i + 8);
          return {
            start: start,
            end: end,
            startCounter: i,
            endCounter: i + 8
          };
        }
      }
      return null;
    }
  }, {
    key: "_patternToChar",
    value: function _patternToChar(pattern) {
      for (var i = 0; i < CHARACTER_ENCODINGS.length; i++) {
        if (CHARACTER_ENCODINGS[i] === pattern) {
          return String.fromCharCode(ALPHABET[i]);
        }
      }
      return null;
    }
  }, {
    key: "_calculatePatternLength",
    value: function _calculatePatternLength(offset) {
      var sum = 0;
      for (var i = offset; i < offset + 7; i++) {
        sum += this._counters[i];
      }
      return sum;
    }
  }, {
    key: "_verifyWhitespace",
    value: function _verifyWhitespace(startCounter, endCounter) {
      if (startCounter - 1 <= 0 || this._counters[startCounter - 1] >= this._calculatePatternLength(startCounter) / 2.0) {
        if (endCounter + 8 >= this._counters.length || this._counters[endCounter + 7] >= this._calculatePatternLength(endCounter) / 2.0) {
          return true;
        }
      }
      return false;
    }
  }, {
    key: "_charToPattern",
    value: function _charToPattern(_char) {
      var charCode = _char.charCodeAt(0);
      for (var i = 0; i < ALPHABET.length; i++) {
        if (ALPHABET[i] === charCode) {
          return CHARACTER_ENCODINGS[i];
        }
      }
      return 0x0;
    }
  }, {
    key: "_thresholdResultPattern",
    value: function _thresholdResultPattern(result, startCounter) {
      var categorization = {
        space: {
          narrow: {
            size: 0,
            counts: 0,
            min: 0,
            max: Number.MAX_VALUE
          },
          wide: {
            size: 0,
            counts: 0,
            min: 0,
            max: Number.MAX_VALUE
          }
        },
        bar: {
          narrow: {
            size: 0,
            counts: 0,
            min: 0,
            max: Number.MAX_VALUE
          },
          wide: {
            size: 0,
            counts: 0,
            min: 0,
            max: Number.MAX_VALUE
          }
        }
      };
      var pos = startCounter;
      var pattern;
      for (var i = 0; i < result.length; i++) {
        pattern = this._charToPattern(result[i]);
        for (var j = 6; j >= 0; j--) {
          var kind = (j & 1) === 2 ? categorization.bar : categorization.space;
          var cat = (pattern & 1) === 1 ? kind.wide : kind.narrow;
          cat.size += this._counters[pos + j];
          cat.counts++;
          pattern >>= 1;
        }
        pos += 8;
      }
      ['space', 'bar'].forEach(function (key) {
        var newkind = categorization[key];
        newkind.wide.min = Math.floor((newkind.narrow.size / newkind.narrow.counts + newkind.wide.size / newkind.wide.counts) / 2);
        newkind.narrow.max = Math.ceil(newkind.wide.min);
        newkind.wide.max = Math.ceil((newkind.wide.size * MAX_ACCEPTABLE + PADDING) / newkind.wide.counts);
      });
      return categorization;
    }
  }, {
    key: "_validateResult",
    value: function _validateResult(result, startCounter) {
      var thresholds = this._thresholdResultPattern(result, startCounter);
      var pos = startCounter;
      var pattern;
      for (var i = 0; i < result.length; i++) {
        pattern = this._charToPattern(result[i]);
        for (var j = 6; j >= 0; j--) {
          var kind = (j & 1) === 0 ? thresholds.bar : thresholds.space;
          var cat = (pattern & 1) === 1 ? kind.wide : kind.narrow;
          var size = this._counters[pos + j];
          if (size < cat.min || size > cat.max) {
            return false;
          }
          pattern >>= 1;
        }
        pos += 8;
      }
      return true;
    }
  }, {
    key: "decode",
    value: function decode(row, start) {
      this._counters = this._fillCounters();
      start = this._findStart();
      if (!start) {
        return null;
      }
      var nextStart = start.startCounter;
      var result = [];
      var pattern;
      do {
        pattern = this._toPattern(nextStart);
        if (pattern < 0) {
          return null;
        }
        var decodedChar = this._patternToChar(pattern);
        if (decodedChar === null) {
          return null;
        }
        result.push(decodedChar);
        nextStart += 8;
        if (result.length > 1 && this._isStartEnd(pattern)) {
          break;
        }
      } while (nextStart < this._counters.length);

      // verify end
      if (result.length - 2 < MIN_ENCODED_CHARS || !this._isStartEnd(pattern)) {
        return null;
      }

      // verify end white space
      if (!this._verifyWhitespace(start.startCounter, nextStart - 8)) {
        return null;
      }
      if (!this._validateResult(result, start.startCounter)) {
        return null;
      }
      nextStart = nextStart > this._counters.length ? this._counters.length : nextStart;
      var end = start.start + this._sumCounters(start.startCounter, nextStart - 8);
      return {
        code: result.join(''),
        start: start.start,
        end: end,
        startInfo: start,
        decodedCodes: result,
        format: this.FORMAT // TODO: i think it should not be required to return format from this, as barcode_reader force sets the format anyway
      };
    }
  }]);
  return NewCodabarReader;
}(barcode_reader);
/* harmony default export */ var codabar_reader = (codabar_reader_NewCodabarReader);
// CONCATENATED MODULE: ./src/reader/code_128_reader.ts







function code_128_reader_createSuper(Derived) { var hasNativeReflectConstruct = code_128_reader_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function code_128_reader_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var code_128_reader_Code128Reader = /*#__PURE__*/function (_BarcodeReader) {
  inherits_default()(Code128Reader, _BarcodeReader);
  var _super = code_128_reader_createSuper(Code128Reader);
  function Code128Reader() {
    var _this;
    classCallCheck_default()(this, Code128Reader);
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    _this = _super.call.apply(_super, [this].concat(args));
    defineProperty_default()(assertThisInitialized_default()(_this), "CODE_SHIFT", 98);
    defineProperty_default()(assertThisInitialized_default()(_this), "CODE_C", 99);
    defineProperty_default()(assertThisInitialized_default()(_this), "CODE_B", 100);
    defineProperty_default()(assertThisInitialized_default()(_this), "CODE_A", 101);
    defineProperty_default()(assertThisInitialized_default()(_this), "START_CODE_A", 103);
    defineProperty_default()(assertThisInitialized_default()(_this), "START_CODE_B", 104);
    defineProperty_default()(assertThisInitialized_default()(_this), "START_CODE_C", 105);
    defineProperty_default()(assertThisInitialized_default()(_this), "STOP_CODE", 106);
    defineProperty_default()(assertThisInitialized_default()(_this), "CODE_PATTERN", [[2, 1, 2, 2, 2, 2], [2, 2, 2, 1, 2, 2], [2, 2, 2, 2, 2, 1], [1, 2, 1, 2, 2, 3], [1, 2, 1, 3, 2, 2], [1, 3, 1, 2, 2, 2], [1, 2, 2, 2, 1, 3], [1, 2, 2, 3, 1, 2], [1, 3, 2, 2, 1, 2], [2, 2, 1, 2, 1, 3], [2, 2, 1, 3, 1, 2], [2, 3, 1, 2, 1, 2], [1, 1, 2, 2, 3, 2], [1, 2, 2, 1, 3, 2], [1, 2, 2, 2, 3, 1], [1, 1, 3, 2, 2, 2], [1, 2, 3, 1, 2, 2], [1, 2, 3, 2, 2, 1], [2, 2, 3, 2, 1, 1], [2, 2, 1, 1, 3, 2], [2, 2, 1, 2, 3, 1], [2, 1, 3, 2, 1, 2], [2, 2, 3, 1, 1, 2], [3, 1, 2, 1, 3, 1], [3, 1, 1, 2, 2, 2], [3, 2, 1, 1, 2, 2], [3, 2, 1, 2, 2, 1], [3, 1, 2, 2, 1, 2], [3, 2, 2, 1, 1, 2], [3, 2, 2, 2, 1, 1], [2, 1, 2, 1, 2, 3], [2, 1, 2, 3, 2, 1], [2, 3, 2, 1, 2, 1], [1, 1, 1, 3, 2, 3], [1, 3, 1, 1, 2, 3], [1, 3, 1, 3, 2, 1], [1, 1, 2, 3, 1, 3], [1, 3, 2, 1, 1, 3], [1, 3, 2, 3, 1, 1], [2, 1, 1, 3, 1, 3], [2, 3, 1, 1, 1, 3], [2, 3, 1, 3, 1, 1], [1, 1, 2, 1, 3, 3], [1, 1, 2, 3, 3, 1], [1, 3, 2, 1, 3, 1], [1, 1, 3, 1, 2, 3], [1, 1, 3, 3, 2, 1], [1, 3, 3, 1, 2, 1], [3, 1, 3, 1, 2, 1], [2, 1, 1, 3, 3, 1], [2, 3, 1, 1, 3, 1], [2, 1, 3, 1, 1, 3], [2, 1, 3, 3, 1, 1], [2, 1, 3, 1, 3, 1], [3, 1, 1, 1, 2, 3], [3, 1, 1, 3, 2, 1], [3, 3, 1, 1, 2, 1], [3, 1, 2, 1, 1, 3], [3, 1, 2, 3, 1, 1], [3, 3, 2, 1, 1, 1], [3, 1, 4, 1, 1, 1], [2, 2, 1, 4, 1, 1], [4, 3, 1, 1, 1, 1], [1, 1, 1, 2, 2, 4], [1, 1, 1, 4, 2, 2], [1, 2, 1, 1, 2, 4], [1, 2, 1, 4, 2, 1], [1, 4, 1, 1, 2, 2], [1, 4, 1, 2, 2, 1], [1, 1, 2, 2, 1, 4], [1, 1, 2, 4, 1, 2], [1, 2, 2, 1, 1, 4], [1, 2, 2, 4, 1, 1], [1, 4, 2, 1, 1, 2], [1, 4, 2, 2, 1, 1], [2, 4, 1, 2, 1, 1], [2, 2, 1, 1, 1, 4], [4, 1, 3, 1, 1, 1], [2, 4, 1, 1, 1, 2], [1, 3, 4, 1, 1, 1], [1, 1, 1, 2, 4, 2], [1, 2, 1, 1, 4, 2], [1, 2, 1, 2, 4, 1], [1, 1, 4, 2, 1, 2], [1, 2, 4, 1, 1, 2], [1, 2, 4, 2, 1, 1], [4, 1, 1, 2, 1, 2], [4, 2, 1, 1, 1, 2], [4, 2, 1, 2, 1, 1], [2, 1, 2, 1, 4, 1], [2, 1, 4, 1, 2, 1], [4, 1, 2, 1, 2, 1], [1, 1, 1, 1, 4, 3], [1, 1, 1, 3, 4, 1], [1, 3, 1, 1, 4, 1], [1, 1, 4, 1, 1, 3], [1, 1, 4, 3, 1, 1], [4, 1, 1, 1, 1, 3], [4, 1, 1, 3, 1, 1], [1, 1, 3, 1, 4, 1], [1, 1, 4, 1, 3, 1], [3, 1, 1, 1, 4, 1], [4, 1, 1, 1, 3, 1], [2, 1, 1, 4, 1, 2], [2, 1, 1, 2, 1, 4], [2, 1, 1, 2, 3, 2], [2, 3, 3, 1, 1, 1, 2]]);
    defineProperty_default()(assertThisInitialized_default()(_this), "SINGLE_CODE_ERROR", 0.64);
    defineProperty_default()(assertThisInitialized_default()(_this), "AVG_CODE_ERROR", 0.30);
    defineProperty_default()(assertThisInitialized_default()(_this), "FORMAT", 'code_128');
    defineProperty_default()(assertThisInitialized_default()(_this), "MODULE_INDICES", {
      bar: [0, 2, 4],
      space: [1, 3, 5]
    });
    return _this;
  }
  createClass_default()(Code128Reader, [{
    key: "_decodeCode",
    value: function _decodeCode(start, correction) {
      var bestMatch = {
        error: Number.MAX_VALUE,
        code: -1,
        start: start,
        end: start,
        correction: {
          bar: 1,
          space: 1
        }
      };
      var counter = [0, 0, 0, 0, 0, 0];
      var offset = start;
      var isWhite = !this._row[offset];
      var counterPos = 0;
      for (var i = offset; i < this._row.length; i++) {
        if (this._row[i] ^ (isWhite ? 1 : 0)) {
          counter[counterPos]++;
        } else {
          if (counterPos === counter.length - 1) {
            if (correction) {
              this._correct(counter, correction);
            }
            for (var code = 0; code < this.CODE_PATTERN.length; code++) {
              var error = this._matchPattern(counter, this.CODE_PATTERN[code]);
              if (error < bestMatch.error) {
                bestMatch.code = code;
                bestMatch.error = error;
              }
            }
            bestMatch.end = i;
            if (bestMatch.code === -1 || bestMatch.error > this.AVG_CODE_ERROR) {
              return null;
            }
            if (this.CODE_PATTERN[bestMatch.code]) {
              bestMatch.correction.bar = this.calculateCorrection(this.CODE_PATTERN[bestMatch.code], counter, this.MODULE_INDICES.bar);
              bestMatch.correction.space = this.calculateCorrection(this.CODE_PATTERN[bestMatch.code], counter, this.MODULE_INDICES.space);
            }
            return bestMatch;
          } else {
            counterPos++;
          }
          counter[counterPos] = 1;
          isWhite = !isWhite;
        }
      }
      return null;
    }
  }, {
    key: "_correct",
    value: function _correct(counter, correction) {
      this._correctBars(counter, correction.bar, this.MODULE_INDICES.bar);
      this._correctBars(counter, correction.space, this.MODULE_INDICES.space);
    }
  }, {
    key: "_findStart",
    value:
    // TODO: _findStart and decodeCode share similar code, can we re-use some?
    function _findStart() {
      var counter = [0, 0, 0, 0, 0, 0];
      var offset = this._nextSet(this._row);
      var bestMatch = {
        error: Number.MAX_VALUE,
        code: -1,
        start: 0,
        end: 0,
        correction: {
          bar: 1,
          space: 1
        }
      };
      var isWhite = false;
      var counterPos = 0;
      for (var i = offset; i < this._row.length; i++) {
        if (this._row[i] ^ (isWhite ? 1 : 0)) {
          counter[counterPos]++;
        } else {
          if (counterPos === counter.length - 1) {
            var sum = counter.reduce(function (prev, next) {
              return prev + next;
            }, 0);
            for (var code = this.START_CODE_A; code <= this.START_CODE_C; code++) {
              var error = this._matchPattern(counter, this.CODE_PATTERN[code]);
              if (error < bestMatch.error) {
                bestMatch.code = code;
                bestMatch.error = error;
              }
            }
            if (bestMatch.error < this.AVG_CODE_ERROR) {
              bestMatch.start = i - sum;
              bestMatch.end = i;
              bestMatch.correction.bar = this.calculateCorrection(this.CODE_PATTERN[bestMatch.code], counter, this.MODULE_INDICES.bar);
              bestMatch.correction.space = this.calculateCorrection(this.CODE_PATTERN[bestMatch.code], counter, this.MODULE_INDICES.space);
              return bestMatch;
            }
            for (var j = 0; j < 4; j++) {
              counter[j] = counter[j + 2];
            }
            counter[4] = 0;
            counter[5] = 0;
            counterPos--;
          } else {
            counterPos++;
          }
          counter[counterPos] = 1;
          isWhite = !isWhite;
        }
      }
      return null;
    }
  }, {
    key: "decode",
    value: function decode(row, start) {
      var _this2 = this;
      var startInfo = this._findStart();
      if (startInfo === null) {
        return null;
      }
      // var self = this,
      //     done = false,
      //     result = [],
      //     multiplier = 0,
      //     checksum = 0,
      //     codeset,
      //     rawResult = [],
      //     decodedCodes = [],
      //     shiftNext = false,
      //     unshift,
      //     removeLastCharacter = true;

      var code = {
        code: startInfo.code,
        start: startInfo.start,
        end: startInfo.end,
        correction: {
          bar: startInfo.correction.bar,
          space: startInfo.correction.space
        }
      };
      var decodedCodes = [];
      decodedCodes.push(code);
      var checksum = code.code;
      var codeset = function (c) {
        switch (c) {
          case _this2.START_CODE_A:
            return _this2.CODE_A;
          case _this2.START_CODE_B:
            return _this2.CODE_B;
          case _this2.START_CODE_C:
            return _this2.CODE_C;
          default:
            return null;
        }
      }(code.code);
      var done = false;
      var shiftNext = false;
      var unshift = shiftNext;
      var removeLastCharacter = true;
      var multiplier = 0;
      var rawResult = [];
      var result = []; // TODO: i think this should be string only, but it creates problems if it is

      while (!done) {
        unshift = shiftNext;
        shiftNext = false;
        code = this._decodeCode(code.end, code.correction);
        if (code !== null) {
          if (code.code !== this.STOP_CODE) {
            removeLastCharacter = true;
          }
          if (code.code !== this.STOP_CODE) {
            rawResult.push(code.code);
            multiplier++;
            checksum += multiplier * code.code;
          }
          decodedCodes.push(code);
          switch (codeset) {
            case this.CODE_A:
              if (code.code < 64) {
                result.push(String.fromCharCode(32 + code.code));
              } else if (code.code < 96) {
                result.push(String.fromCharCode(code.code - 64));
              } else {
                if (code.code !== this.STOP_CODE) {
                  removeLastCharacter = false;
                }
                switch (code.code) {
                  case this.CODE_SHIFT:
                    shiftNext = true;
                    codeset = this.CODE_B;
                    break;
                  case this.CODE_B:
                    codeset = this.CODE_B;
                    break;
                  case this.CODE_C:
                    codeset = this.CODE_C;
                    break;
                  case this.STOP_CODE:
                    done = true;
                    break;
                }
              }
              break;
            case this.CODE_B:
              if (code.code < 96) {
                result.push(String.fromCharCode(32 + code.code));
              } else {
                if (code.code !== this.STOP_CODE) {
                  removeLastCharacter = false;
                }
                switch (code.code) {
                  case this.CODE_SHIFT:
                    shiftNext = true;
                    codeset = this.CODE_A;
                    break;
                  case this.CODE_A:
                    codeset = this.CODE_A;
                    break;
                  case this.CODE_C:
                    codeset = this.CODE_C;
                    break;
                  case this.STOP_CODE:
                    done = true;
                    break;
                }
              }
              break;
            case this.CODE_C:
              if (code.code < 100) {
                result.push(code.code < 10 ? '0' + code.code : code.code);
              } else {
                if (code.code !== this.STOP_CODE) {
                  removeLastCharacter = false;
                }
                switch (code.code) {
                  case this.CODE_A:
                    codeset = this.CODE_A;
                    break;
                  case this.CODE_B:
                    codeset = this.CODE_B;
                    break;
                  case this.STOP_CODE:
                    done = true;
                    break;
                }
              }
              break;
          }
        } else {
          done = true;
        }
        if (unshift) {
          codeset = codeset === this.CODE_A ? this.CODE_B : this.CODE_A;
        }
      }
      if (code === null) {
        return null;
      }
      code.end = this._nextUnset(this._row, code.end);
      if (!this._verifyTrailingWhitespace(code)) {
        return null;
      }
      checksum -= multiplier * rawResult[rawResult.length - 1];
      if (checksum % 103 !== rawResult[rawResult.length - 1]) {
        return null;
      }
      if (!result.length) {
        return null;
      }

      // remove last code from result (checksum)
      if (removeLastCharacter) {
        result.splice(result.length - 1, 1);
      }
      return {
        code: result.join(''),
        start: startInfo.start,
        end: code.end,
        codeset: codeset,
        startInfo: startInfo,
        decodedCodes: decodedCodes,
        endInfo: code,
        format: this.FORMAT
      };
    }
  }, {
    key: "_verifyTrailingWhitespace",
    value: function _verifyTrailingWhitespace(endInfo) {
      var self = this,
        trailingWhitespaceEnd;
      trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2;
      if (trailingWhitespaceEnd < self._row.length) {
        if (self._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
          return endInfo;
        }
      }
      return null;
    }
  }, {
    key: "calculateCorrection",
    value: function calculateCorrection(expected, normalized, indices) {
      var length = indices.length,
        sumNormalized = 0,
        sumExpected = 0;
      while (length--) {
        sumExpected += expected[indices[length]];
        sumNormalized += normalized[indices[length]];
      }
      return sumExpected / sumNormalized;
    }
  }]);
  return Code128Reader;
}(barcode_reader);
/* harmony default export */ var code_128_reader = (code_128_reader_Code128Reader);
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/get.js
var get = __webpack_require__(14);
var get_default = /*#__PURE__*/__webpack_require__.n(get);

// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/toConsumableArray.js
var toConsumableArray = __webpack_require__(33);
var toConsumableArray_default = /*#__PURE__*/__webpack_require__.n(toConsumableArray);

// CONCATENATED MODULE: ./src/reader/code_39_reader.ts








function code_39_reader_createSuper(Derived) { var hasNativeReflectConstruct = code_39_reader_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function code_39_reader_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
/* eslint-disable class-methods-use-this */


var ALPHABETH_STRING = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%';
var code_39_reader_ALPHABET = new Uint16Array(toConsumableArray_default()(ALPHABETH_STRING).map(function (_char) {
  return _char.charCodeAt(0);
}));
var code_39_reader_CHARACTER_ENCODINGS = new Uint16Array([0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C, 0x04C, 0x01C, 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x085, 0x184, 0x0C4, 0x094, 0x0A8, 0x0A2, 0x08A, 0x02A]);
var ASTERISK = 0x094;
var code_39_reader_Code39Reader = /*#__PURE__*/function (_BarcodeReader) {
  inherits_default()(Code39Reader, _BarcodeReader);
  var _super = code_39_reader_createSuper(Code39Reader);
  function Code39Reader() {
    var _this;
    classCallCheck_default()(this, Code39Reader);
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    _this = _super.call.apply(_super, [this].concat(args));
    defineProperty_default()(assertThisInitialized_default()(_this), "FORMAT", 'code_39');
    return _this;
  }
  createClass_default()(Code39Reader, [{
    key: "_findStart",
    value: function _findStart() {
      var offset = this._nextSet(this._row);
      var patternStart = offset;
      var counter = new Uint16Array([0, 0, 0, 0, 0, 0, 0, 0, 0]);
      var counterPos = 0;
      var isWhite = false;
      for (var i = offset; i < this._row.length; i++) {
        // eslint-disable-next-line no-bitwise
        if (this._row[i] ^ (isWhite ? 1 : 0)) {
          counter[counterPos]++;
        } else {
          if (counterPos === counter.length - 1) {
            // find start pattern
            if (this._toPattern(counter) === ASTERISK) {
              var whiteSpaceMustStart = Math.floor(Math.max(0, patternStart - (i - patternStart) / 4));
              if (this._matchRange(whiteSpaceMustStart, patternStart, 0)) {
                return {
                  start: patternStart,
                  end: i
                };
              }
            }
            patternStart += counter[0] + counter[1];
            for (var j = 0; j < 7; j++) {
              counter[j] = counter[j + 2];
            }
            counter[7] = 0;
            counter[8] = 0;
            counterPos--;
          } else {
            counterPos++;
          }
          counter[counterPos] = 1;
          isWhite = !isWhite;
        }
      }
      return null;
    }
  }, {
    key: "_toPattern",
    value: function _toPattern(counters) {
      var numCounters = counters.length;
      var maxNarrowWidth = 0;
      var numWideBars = numCounters;
      var wideBarWidth = 0;
      while (numWideBars > 3) {
        maxNarrowWidth = this._findNextWidth(counters, maxNarrowWidth);
        numWideBars = 0;
        var pattern = 0;
        for (var i = 0; i < numCounters; i++) {
          if (counters[i] > maxNarrowWidth) {
            // eslint-disable-next-line no-bitwise
            pattern |= 1 << numCounters - 1 - i;
            numWideBars++;
            wideBarWidth += counters[i];
          }
        }
        if (numWideBars === 3) {
          for (var _i = 0; _i < numCounters && numWideBars > 0; _i++) {
            if (counters[_i] > maxNarrowWidth) {
              numWideBars--;
              if (counters[_i] * 2 >= wideBarWidth) {
                return -1;
              }
            }
          }
          return pattern;
        }
      }
      return -1;
    }
  }, {
    key: "_findNextWidth",
    value: function _findNextWidth(counters, current) {
      var minWidth = Number.MAX_VALUE;
      for (var i = 0; i < counters.length; i++) {
        if (counters[i] < minWidth && counters[i] > current) {
          minWidth = counters[i];
        }
      }
      return minWidth;
    }
  }, {
    key: "_patternToChar",
    value: function _patternToChar(pattern) {
      for (var i = 0; i < code_39_reader_CHARACTER_ENCODINGS.length; i++) {
        if (code_39_reader_CHARACTER_ENCODINGS[i] === pattern) {
          return String.fromCharCode(code_39_reader_ALPHABET[i]);
        }
      }
      return null;
    }
  }, {
    key: "_verifyTrailingWhitespace",
    value: function _verifyTrailingWhitespace(lastStart, nextStart, counters) {
      var patternSize = array_helper["a" /* default */].sum(counters);
      var trailingWhitespaceEnd = nextStart - lastStart - patternSize;
      if (trailingWhitespaceEnd * 3 >= patternSize) {
        return true;
      }
      return false;
    }
  }, {
    key: "decode",
    value: function decode() {
      var counters = new Uint16Array([0, 0, 0, 0, 0, 0, 0, 0, 0]);
      var result = [];
      var start = this._findStart();
      if (!start) {
        return null;
      }
      var nextStart = this._nextSet(this._row, start.end);
      var decodedChar;
      var lastStart;
      do {
        counters = this._toCounters(nextStart, counters);
        var pattern = this._toPattern(counters);
        if (pattern < 0) {
          return null;
        }
        decodedChar = this._patternToChar(pattern);
        if (decodedChar === null) {
          return null;
        }
        result.push(decodedChar);
        lastStart = nextStart;
        nextStart += array_helper["a" /* default */].sum(counters);
        nextStart = this._nextSet(this._row, nextStart);
      } while (decodedChar !== '*');
      result.pop();
      if (!result.length) {
        return null;
      }
      if (!this._verifyTrailingWhitespace(lastStart, nextStart, counters)) {
        return null;
      }
      return {
        code: result.join(''),
        start: start.start,
        end: nextStart,
        startInfo: start,
        decodedCodes: result,
        format: this.FORMAT
      };
    }
  }]);
  return Code39Reader;
}(barcode_reader);
/* harmony default export */ var code_39_reader = (code_39_reader_Code39Reader);
// CONCATENATED MODULE: ./src/reader/code_32_reader.ts








function code_32_reader_createSuper(Derived) { var hasNativeReflectConstruct = code_32_reader_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function code_32_reader_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var patterns = {
  AEIO: /[AEIO]/g,
  AZ09: /[A-Z0-9]/
};
var code32set = '0123456789BCDFGHJKLMNPQRSTUVWXYZ';
var code_32_reader_Code32Reader = /*#__PURE__*/function (_Code39Reader) {
  inherits_default()(Code32Reader, _Code39Reader);
  var _super = code_32_reader_createSuper(Code32Reader);
  function Code32Reader() {
    var _this;
    classCallCheck_default()(this, Code32Reader);
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    _this = _super.call.apply(_super, [this].concat(args));
    defineProperty_default()(assertThisInitialized_default()(_this), "FORMAT", 'code_32_reader');
    return _this;
  }
  createClass_default()(Code32Reader, [{
    key: "_decodeCode32",
    value: function _decodeCode32(code) {
      if (/[^0-9BCDFGHJKLMNPQRSTUVWXYZ]/.test(code)) {
        return null;
      }
      var res = 0;
      for (var i = 0; i < code.length; i++) {
        res = res * 32 + code32set.indexOf(code[i]);
      }
      var code32 = "".concat(res);
      if (code32.length < 9) {
        code32 = ('000000000' + code32).slice(-9);
      }
      return 'A' + code32;
    }

    // TODO (this was todo in original repo, no text was there. sorry.)
  }, {
    key: "_checkChecksum",
    value: function _checkChecksum(code) {
      return !!code;
    }
  }, {
    key: "decode",
    value: function decode() {
      var result = get_default()(getPrototypeOf_default()(Code32Reader.prototype), "decode", this).call(this);
      if (!result) {
        return null;
      }
      var code = result.code;
      if (!code) {
        return null;
      }
      code = code.replace(patterns.AEIO, '');
      if (!this._checkChecksum(code)) {
        return null;
      }
      var code32 = this._decodeCode32(code);
      if (!code32) {
        return null;
      }
      result.code = code32;
      return result;
    }
  }]);
  return Code32Reader;
}(code_39_reader);
/* harmony default export */ var code_32_reader = (code_32_reader_Code32Reader);
// CONCATENATED MODULE: ./src/reader/code_39_vin_reader.ts








function code_39_vin_reader_createSuper(Derived) { var hasNativeReflectConstruct = code_39_vin_reader_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function code_39_vin_reader_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
/* eslint-disable class-methods-use-this */


var code_39_vin_reader_patterns = {
  IOQ: /[IOQ]/g,
  AZ09: /[A-Z0-9]{17}/
};
var code_39_vin_reader_Code39VINReader = /*#__PURE__*/function (_Code39Reader) {
  inherits_default()(Code39VINReader, _Code39Reader);
  var _super = code_39_vin_reader_createSuper(Code39VINReader);
  function Code39VINReader() {
    var _this;
    classCallCheck_default()(this, Code39VINReader);
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    _this = _super.call.apply(_super, [this].concat(args));
    defineProperty_default()(assertThisInitialized_default()(_this), "FORMAT", 'code_39_vin');
    return _this;
  }
  createClass_default()(Code39VINReader, [{
    key: "_checkChecksum",
    value:
    // TODO (this was todo in original repo, no text was there. sorry.)
    function _checkChecksum(code) {
      return !!code;
    }

    // Cribbed from:
    // https://github.com/zxing/zxing/blob/master/core/src/main/java/com/google/zxing/client/result/VINResultParser.java
  }, {
    key: "decode",
    value: function decode() {
      var result = get_default()(getPrototypeOf_default()(Code39VINReader.prototype), "decode", this).call(this);
      if (!result) {
        return null;
      }
      var code = result.code;
      if (!code) {
        return null;
      }
      code = code.replace(code_39_vin_reader_patterns.IOQ, '');
      if (!code.match(code_39_vin_reader_patterns.AZ09)) {
        if (true) {
          console.log('Failed AZ09 pattern code:', code);
        }
        return null;
      }
      if (!this._checkChecksum(code)) {
        return null;
      }
      result.code = code;
      return result;
    }
  }]);
  return Code39VINReader;
}(code_39_reader);
/* harmony default export */ var code_39_vin_reader = (code_39_vin_reader_Code39VINReader);
// CONCATENATED MODULE: ./src/reader/code_93_reader.ts








function code_93_reader_createSuper(Derived) { var hasNativeReflectConstruct = code_93_reader_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function code_93_reader_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }


var code_93_reader_ALPHABETH_STRING = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd*';
var code_93_reader_ALPHABET = new Uint16Array(toConsumableArray_default()(code_93_reader_ALPHABETH_STRING).map(function (_char) {
  return _char.charCodeAt(0);
}));
var code_93_reader_CHARACTER_ENCODINGS = new Uint16Array([0x114, 0x148, 0x144, 0x142, 0x128, 0x124, 0x122, 0x150, 0x112, 0x10A, 0x1A8, 0x1A4, 0x1A2, 0x194, 0x192, 0x18A, 0x168, 0x164, 0x162, 0x134, 0x11A, 0x158, 0x14C, 0x146, 0x12C, 0x116, 0x1B4, 0x1B2, 0x1AC, 0x1A6, 0x196, 0x19A, 0x16C, 0x166, 0x136, 0x13A, 0x12E, 0x1D4, 0x1D2, 0x1CA, 0x16E, 0x176, 0x1AE, 0x126, 0x1DA, 0x1D6, 0x132, 0x15E]);
var code_93_reader_ASTERISK = 0x15E;
var code_93_reader_Code93Reader = /*#__PURE__*/function (_BarcodeReader) {
  inherits_default()(Code93Reader, _BarcodeReader);
  var _super = code_93_reader_createSuper(Code93Reader);
  function Code93Reader() {
    var _this;
    classCallCheck_default()(this, Code93Reader);
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    _this = _super.call.apply(_super, [this].concat(args));
    defineProperty_default()(assertThisInitialized_default()(_this), "FORMAT", 'code_93');
    return _this;
  }
  createClass_default()(Code93Reader, [{
    key: "_patternToChar",
    value: function _patternToChar(pattern) {
      for (var i = 0; i < code_93_reader_CHARACTER_ENCODINGS.length; i++) {
        if (code_93_reader_CHARACTER_ENCODINGS[i] === pattern) {
          return String.fromCharCode(code_93_reader_ALPHABET[i]);
        }
      }
      return null;
    }
  }, {
    key: "_toPattern",
    value: function _toPattern(counters) {
      var numCounters = counters.length;
      var sum = counters.reduce(function (prev, next) {
        return prev + next;
      }, 0);
      var pattern = 0;
      for (var i = 0; i < numCounters; i++) {
        var normalized = Math.round(counters[i] * 9 / sum);
        if (normalized < 1 || normalized > 4) {
          return -1;
        }
        if ((i & 1) === 0) {
          for (var j = 0; j < normalized; j++) {
            pattern = pattern << 1 | 1;
          }
        } else {
          pattern <<= normalized;
        }
      }
      return pattern;
    }
  }, {
    key: "_findStart",
    value: function _findStart() {
      var offset = this._nextSet(this._row);
      var patternStart = offset;
      var counter = new Uint16Array([0, 0, 0, 0, 0, 0]);
      var counterPos = 0;
      var isWhite = false;
      for (var i = offset; i < this._row.length; i++) {
        if (this._row[i] ^ (isWhite ? 1 : 0)) {
          counter[counterPos]++;
        } else {
          if (counterPos === counter.length - 1) {
            // find start pattern
            if (this._toPattern(counter) === code_93_reader_ASTERISK) {
              var whiteSpaceMustStart = Math.floor(Math.max(0, patternStart - (i - patternStart) / 4));
              if (this._matchRange(whiteSpaceMustStart, patternStart, 0)) {
                return {
                  start: patternStart,
                  end: i
                };
              }
            }
            patternStart += counter[0] + counter[1];
            for (var j = 0; j < 4; j++) {
              counter[j] = counter[j + 2];
            }
            counter[4] = 0;
            counter[5] = 0;
            counterPos--;
          } else {
            counterPos++;
          }
          counter[counterPos] = 1;
          isWhite = !isWhite;
        }
      }
      return null;
    }
  }, {
    key: "_verifyEnd",
    value: function _verifyEnd(lastStart, nextStart) {
      if (lastStart === nextStart || !this._row[nextStart]) {
        return false;
      }
      return true;
    }
  }, {
    key: "_decodeExtended",
    value: function _decodeExtended(charArray) {
      var length = charArray.length;
      var result = [];
      for (var i = 0; i < length; i++) {
        var _char2 = charArray[i];
        if (_char2 >= 'a' && _char2 <= 'd') {
          if (i > length - 2) {
            return null;
          }
          var nextChar = charArray[++i];
          var nextCharCode = nextChar.charCodeAt(0);
          var decodedChar = void 0;
          switch (_char2) {
            case 'a':
              if (nextChar >= 'A' && nextChar <= 'Z') {
                decodedChar = String.fromCharCode(nextCharCode - 64);
              } else {
                return null;
              }
              break;
            case 'b':
              if (nextChar >= 'A' && nextChar <= 'E') {
                decodedChar = String.fromCharCode(nextCharCode - 38);
              } else if (nextChar >= 'F' && nextChar <= 'J') {
                decodedChar = String.fromCharCode(nextCharCode - 11);
              } else if (nextChar >= 'K' && nextChar <= 'O') {
                decodedChar = String.fromCharCode(nextCharCode + 16);
              } else if (nextChar >= 'P' && nextChar <= 'S') {
                decodedChar = String.fromCharCode(nextCharCode + 43);
              } else if (nextChar >= 'T' && nextChar <= 'Z') {
                decodedChar = String.fromCharCode(127);
              } else {
                return null;
              }
              break;
            case 'c':
              if (nextChar >= 'A' && nextChar <= 'O') {
                decodedChar = String.fromCharCode(nextCharCode - 32);
              } else if (nextChar === 'Z') {
                decodedChar = ':';
              } else {
                return null;
              }
              break;
            case 'd':
              if (nextChar >= 'A' && nextChar <= 'Z') {
                decodedChar = String.fromCharCode(nextCharCode + 32);
              } else {
                return null;
              }
              break;
            default:
              console.warn('* code_93_reader _decodeExtended hit default case, this may be an error', decodedChar);
              return null;
          }
          result.push(decodedChar);
        } else {
          result.push(_char2);
        }
      }
      return result;
    }
  }, {
    key: "_matchCheckChar",
    value: function _matchCheckChar(charArray, index, maxWeight) {
      var arrayToCheck = charArray.slice(0, index);
      var length = arrayToCheck.length;
      var weightedSums = arrayToCheck.reduce(function (sum, _char3, i) {
        var weight = (i * -1 + (length - 1)) % maxWeight + 1;
        var value = code_93_reader_ALPHABET.indexOf(_char3.charCodeAt(0));
        return sum + weight * value;
      }, 0);
      var checkChar = code_93_reader_ALPHABET[weightedSums % 47];
      return checkChar === charArray[index].charCodeAt(0);
    }
  }, {
    key: "_verifyChecksums",
    value: function _verifyChecksums(charArray) {
      return this._matchCheckChar(charArray, charArray.length - 2, 20) && this._matchCheckChar(charArray, charArray.length - 1, 15);
    }
  }, {
    key: "decode",
    value: function decode(row, start) {
      start = this._findStart();
      if (!start) {
        return null;
      }
      var counters = new Uint16Array([0, 0, 0, 0, 0, 0]);
      var result = [];
      var nextStart = this._nextSet(this._row, start.end);
      var lastStart;
      var decodedChar;
      do {
        counters = this._toCounters(nextStart, counters);
        var pattern = this._toPattern(counters);
        if (pattern < 0) {
          return null;
        }
        decodedChar = this._patternToChar(pattern);
        if (decodedChar === null) {
          return null;
        }
        result.push(decodedChar);
        lastStart = nextStart;
        nextStart += array_helper["a" /* default */].sum(counters);
        nextStart = this._nextSet(this._row, nextStart);
      } while (decodedChar !== '*');
      result.pop();
      if (!result.length) {
        return null;
      }
      if (!this._verifyEnd(lastStart, nextStart)) {
        return null;
      }
      if (!this._verifyChecksums(result)) {
        return null;
      }
      result = result.slice(0, result.length - 2);
      // yes, this is an assign inside an if.
      if ((result = this._decodeExtended(result)) === null) {
        return null;
      }
      return {
        code: result.join(''),
        start: start.start,
        end: nextStart,
        startInfo: start,
        decodedCodes: result,
        format: this.FORMAT
      };
    }
  }]);
  return Code93Reader;
}(barcode_reader);
/* harmony default export */ var code_93_reader = (code_93_reader_Code93Reader);
// CONCATENATED MODULE: ./src/reader/ean_reader.ts







function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { defineProperty_default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function ean_reader_createSuper(Derived) { var hasNativeReflectConstruct = ean_reader_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function ean_reader_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }



// const CODE_L_START = 0;
var CODE_G_START = 10;

var ean_reader_START_PATTERN = [1, 1, 1];
var MIDDLE_PATTERN = [1, 1, 1, 1, 1];

var EXTENSION_START_PATTERN = [1, 1, 2];
var ean_reader_CODE_PATTERN = [[3, 2, 1, 1], [2, 2, 2, 1], [2, 1, 2, 2], [1, 4, 1, 1], [1, 1, 3, 2], [1, 2, 3, 1], [1, 1, 1, 4], [1, 3, 1, 2], [1, 2, 1, 3], [3, 1, 1, 2], [1, 1, 2, 3], [1, 2, 2, 2], [2, 2, 1, 2], [1, 1, 4, 1], [2, 3, 1, 1], [1, 3, 2, 1], [4, 1, 1, 1], [2, 1, 3, 1], [3, 1, 2, 1], [2, 1, 1, 3]];
var CODE_FREQUENCY = [0, 11, 13, 14, 19, 25, 28, 21, 22, 26];
// const SINGLE_CODE_ERROR = 0.70;
var AVG_CODE_ERROR = 0.48;
var ean_reader_EANReader = /*#__PURE__*/function (_BarcodeReader) {
  inherits_default()(EANReader, _BarcodeReader);
  var _super = ean_reader_createSuper(EANReader);
  // TODO: does this need to be in the class?

  function EANReader(config, supplements) {
    var _this;
    classCallCheck_default()(this, EANReader);
    _this = _super.call(this, merge_default()({
      supplements: []
    }, config), supplements);
    defineProperty_default()(assertThisInitialized_default()(_this), "FORMAT", 'ean_13');
    defineProperty_default()(assertThisInitialized_default()(_this), "SINGLE_CODE_ERROR", 0.70);
    defineProperty_default()(assertThisInitialized_default()(_this), "STOP_PATTERN", [1, 1, 1]);
    return _this;
  }
  createClass_default()(EANReader, [{
    key: "_findPattern",
    value: function _findPattern(pattern, offset, isWhite, tryHarder) {
      var counter = new Array(pattern.length).fill(0);
      var bestMatch = {
        error: Number.MAX_VALUE,
        start: 0,
        end: 0
      };
      var epsilon = AVG_CODE_ERROR;
      // console.warn('* findPattern', pattern, offset, isWhite, tryHarder, epsilon);
      var counterPos = 0;
      if (!offset) {
        offset = this._nextSet(this._row);
      }
      var found = false;
      for (var i = offset; i < this._row.length; i++) {
        // console.warn(`* loop i=${offset} len=${this._row.length} isWhite=${isWhite} counterPos=${counterPos}`);
        if (this._row[i] ^ (isWhite ? 1 : 0)) {
          counter[counterPos] += 1;
        } else {
          if (counterPos === counter.length - 1) {
            var error = this._matchPattern(counter, pattern);
            // console.warn('* matchPattern', error, counter, pattern);
            if (error < epsilon && bestMatch.error && error < bestMatch.error) {
              found = true;
              bestMatch.error = error;
              bestMatch.start = i - counter.reduce(function (sum, value) {
                return sum + value;
              }, 0);
              bestMatch.end = i;
              // console.warn('* return bestMatch', JSON.stringify(bestMatch));
              return bestMatch;
            }
            if (tryHarder) {
              for (var j = 0; j < counter.length - 2; j++) {
                counter[j] = counter[j + 2];
              }
              counter[counter.length - 2] = 0;
              counter[counter.length - 1] = 0;
              counterPos--;
            }
          } else {
            counterPos++;
          }
          counter[counterPos] = 1;
          isWhite = !isWhite;
        }
      }
      if (found) {
        // console.warn('* return bestMatch', JSON.stringify(bestMatch));
      } else {
        // console.warn('* return null');
      }
      return found ? bestMatch : null;
    }

    // TODO: findPattern and decodeCode appear to share quite similar code, can it be reduced?
  }, {
    key: "_decodeCode",
    value: function _decodeCode(start, coderange) {
      // console.warn('* decodeCode', start, coderange);
      var counter = [0, 0, 0, 0];
      var offset = start;
      var bestMatch = {
        error: Number.MAX_VALUE,
        code: -1,
        start: start,
        end: start
      };
      var epsilon = AVG_CODE_ERROR;
      var isWhite = !this._row[offset];
      var counterPos = 0;
      if (!coderange) {
        // console.warn('* decodeCode before length');
        coderange = ean_reader_CODE_PATTERN.length;
        // console.warn('* decodeCode after length');
      }

      var found = false;
      for (var i = offset; i < this._row.length; i++) {
        if (this._row[i] ^ (isWhite ? 1 : 0)) {
          counter[counterPos]++;
        } else {
          if (counterPos === counter.length - 1) {
            for (var code = 0; code < coderange; code++) {
              var error = this._matchPattern(counter, ean_reader_CODE_PATTERN[code]);
              bestMatch.end = i;
              if (error < bestMatch.error) {
                bestMatch.code = code;
                bestMatch.error = error;
              }
            }
            if (bestMatch.error > epsilon) {
              // console.warn('* return null');
              return null;
            }
            // console.warn('* return bestMatch', JSON.stringify(bestMatch));
            return bestMatch;
          } else {
            counterPos++;
          }
          counter[counterPos] = 1;
          isWhite = !isWhite;
        }
      }
      return found ? bestMatch : null;
    }
  }, {
    key: "_findStart",
    value: function _findStart() {
      // console.warn('* findStart');
      var offset = this._nextSet(this._row);
      var startInfo = null;
      while (!startInfo) {
        startInfo = this._findPattern(ean_reader_START_PATTERN, offset, false, true);
        // console.warn('* startInfo=', JSON.stringify(startInfo));
        if (!startInfo) {
          return null;
        }
        var leadingWhitespaceStart = startInfo.start - (startInfo.end - startInfo.start);
        if (leadingWhitespaceStart >= 0) {
          if (this._matchRange(leadingWhitespaceStart, startInfo.start, 0)) {
            // console.warn('* returning startInfo');
            return startInfo;
          }
        }
        offset = startInfo.end;
        startInfo = null;
      }
      // console.warn('* returning null');
      return null;
    }
  }, {
    key: "_calculateFirstDigit",
    value: function _calculateFirstDigit(codeFrequency) {
      // console.warn('* calculateFirstDigit', codeFrequency);
      for (var i = 0; i < CODE_FREQUENCY.length; i++) {
        if (codeFrequency === CODE_FREQUENCY[i]) {
          // console.warn('* returning', i);
          return i;
        }
      }
      // console.warn('* return null');
      return null;
    }
  }, {
    key: "_decodePayload",
    value: function _decodePayload(inCode, result, decodedCodes) {
      // console.warn('* decodePayload', inCode, result, decodedCodes);
      var outCode = _objectSpread({}, inCode);
      var codeFrequency = 0x0;
      for (var i = 0; i < 6; i++) {
        outCode = this._decodeCode(outCode.end);
        // console.warn('* decodeCode=', outCode);
        if (!outCode) {
          // console.warn('* return null');
          return null;
        }
        if (outCode.code >= CODE_G_START) {
          outCode.code -= CODE_G_START;
          codeFrequency |= 1 << 5 - i;
        } else {
          codeFrequency |= 0 << 5 - i;
        }
        result.push(outCode.code);
        decodedCodes.push(outCode);
      }
      var firstDigit = this._calculateFirstDigit(codeFrequency);
      // console.warn('* firstDigit=', firstDigit);
      if (firstDigit === null) {
        // console.warn('* return null');
        return null;
      }
      result.unshift(firstDigit);
      var middlePattern = this._findPattern(MIDDLE_PATTERN, outCode.end, true, false);
      // console.warn('* findPattern=', JSON.stringify(middlePattern));

      if (middlePattern === null || !middlePattern.end) {
        // console.warn('* return null');
        return null;
      }
      decodedCodes.push(middlePattern);
      for (var _i = 0; _i < 6; _i++) {
        middlePattern = this._decodeCode(middlePattern.end, CODE_G_START);
        // console.warn('* decodeCode=', JSON.stringify(middlePattern));

        if (!middlePattern) {
          // console.warn('* return null');
          return null;
        }
        decodedCodes.push(middlePattern);
        result.push(middlePattern.code);
      }

      // console.warn('* end code=', JSON.stringify(middlePattern));
      // console.warn('* end result=', JSON.stringify(result));
      // console.warn('* end decodedCodes=', decodedCodes);
      return middlePattern;
    }
  }, {
    key: "_verifyTrailingWhitespace",
    value: function _verifyTrailingWhitespace(endInfo) {
      // console.warn('* verifyTrailingWhitespace', JSON.stringify(endInfo));
      var trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start);
      if (trailingWhitespaceEnd < this._row.length) {
        if (this._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
          // console.warn('* returning', JSON.stringify(endInfo));
          return endInfo;
        }
      }
      // console.warn('* return null');
      return null;
    }
  }, {
    key: "_findEnd",
    value: function _findEnd(offset, isWhite) {
      // console.warn('* findEnd', offset, isWhite);
      var endInfo = this._findPattern(this.STOP_PATTERN, offset, isWhite, false);
      return endInfo !== null ? this._verifyTrailingWhitespace(endInfo) : null;
    }
  }, {
    key: "_checksum",
    value: function _checksum(result) {
      // console.warn('* _checksum', result);
      var sum = 0;
      for (var i = result.length - 2; i >= 0; i -= 2) {
        sum += result[i];
      }
      sum *= 3;
      for (var _i2 = result.length - 1; _i2 >= 0; _i2 -= 2) {
        sum += result[_i2];
      }

      // console.warn('* end checksum', sum % 10 === 0);
      return sum % 10 === 0;
    }
  }, {
    key: "_decodeExtensions",
    value: function _decodeExtensions(offset) {
      var start = this._nextSet(this._row, offset);
      var startInfo = this._findPattern(EXTENSION_START_PATTERN, start, false, false);
      if (startInfo === null) {
        return null;
      }

      // console.warn('* decodeExtensions', this.supplements);
      // console.warn('* there are ', this.supplements.length, ' supplements');
      for (var i = 0; i < this.supplements.length; i++) {
        // console.warn('* extensions loop', i, this.supplements[i], this.supplements[i]._decode);
        try {
          var result = this.supplements[i].decode(this._row, startInfo.end);
          // console.warn('* decode result=', result);
          if (result !== null) {
            return {
              code: result.code,
              start: start,
              startInfo: startInfo,
              end: result.end,
              decodedCodes: result.decodedCodes,
              format: this.supplements[i].FORMAT
            };
          }
        } catch (err) {
          console.error('* decodeExtensions error in ', this.supplements[i], ': ', err);
        }
      }

      // console.warn('* end decodeExtensions');
      return null;
    }
  }, {
    key: "decode",
    value: function decode(row, start) {
      // console.warn('* decode', row);
      // console.warn('* decode', start);
      var result = new Array();
      var decodedCodes = new Array();
      var resultInfo = {};
      var startInfo = this._findStart();
      if (!startInfo) {
        return null;
      }
      var code = {
        start: startInfo.start,
        end: startInfo.end
      };
      decodedCodes.push(code);
      code = this._decodePayload(code, result, decodedCodes);
      if (!code) {
        return null;
      }
      code = this._findEnd(code.end, false);
      if (!code) {
        return null;
      }
      decodedCodes.push(code);

      // Checksum
      if (!this._checksum(result)) {
        return null;
      }

      // console.warn('* this.supplements=', this.supplements);
      if (this.supplements.length > 0) {
        var supplement = this._decodeExtensions(code.end);
        // console.warn('* decodeExtensions returns', supplement);
        if (!supplement) {
          return null;
        }
        if (!supplement.decodedCodes) {
          return null;
        }
        var lastCode = supplement.decodedCodes[supplement.decodedCodes.length - 1];
        var endInfo = {
          start: lastCode.start + ((lastCode.end - lastCode.start) / 2 | 0),
          end: lastCode.end
        };
        if (!this._verifyTrailingWhitespace(endInfo)) {
          return null;
        }
        resultInfo = {
          supplement: supplement,
          code: result.join('') + supplement.code
        };
      }
      return _objectSpread(_objectSpread({
        code: result.join(''),
        start: startInfo.start,
        end: code.end,
        startInfo: startInfo,
        decodedCodes: decodedCodes
      }, resultInfo), {}, {
        format: this.FORMAT
      });
    }
  }]);
  return EANReader;
}(barcode_reader);
/* harmony default export */ var ean_reader = (ean_reader_EANReader);
// CONCATENATED MODULE: ./src/reader/ean_2_reader.ts







function ean_2_reader_createSuper(Derived) { var hasNativeReflectConstruct = ean_2_reader_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function ean_2_reader_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var ean_2_reader_EAN2Reader = /*#__PURE__*/function (_EANReader) {
  inherits_default()(EAN2Reader, _EANReader);
  var _super = ean_2_reader_createSuper(EAN2Reader);
  function EAN2Reader() {
    var _this;
    classCallCheck_default()(this, EAN2Reader);
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    _this = _super.call.apply(_super, [this].concat(args));
    defineProperty_default()(assertThisInitialized_default()(_this), "FORMAT", 'ean_2');
    return _this;
  }
  createClass_default()(EAN2Reader, [{
    key: "decode",
    value: function decode(row, start) {
      if (row) {
        this._row = row;
      }
      var codeFrequency = 0;
      var offset = start;
      var end = this._row.length;
      var result = [];
      var decodedCodes = [];
      var code = null;
      if (offset === undefined) {
        return null;
      }
      for (var i = 0; i < 2 && offset < end; i++) {
        code = this._decodeCode(offset);
        if (!code) {
          return null;
        }
        decodedCodes.push(code);
        result.push(code.code % 10);
        if (code.code >= CODE_G_START) {
          codeFrequency |= 1 << 1 - i;
        }
        if (i !== 1) {
          offset = this._nextSet(this._row, code.end);
          offset = this._nextUnset(this._row, offset);
        }
      }
      if (result.length !== 2 || parseInt(result.join('')) % 4 !== codeFrequency) {
        return null;
      }
      var startInfo = this._findStart();
      return {
        code: result.join(''),
        decodedCodes: decodedCodes,
        end: code.end,
        format: this.FORMAT,
        startInfo: startInfo,
        start: startInfo.start
      };
    }
  }]);
  return EAN2Reader;
}(ean_reader);
;
/* harmony default export */ var ean_2_reader = (ean_2_reader_EAN2Reader);
// CONCATENATED MODULE: ./src/reader/ean_5_reader.ts







function ean_5_reader_createSuper(Derived) { var hasNativeReflectConstruct = ean_5_reader_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function ean_5_reader_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var CHECK_DIGIT_ENCODINGS = [24, 20, 18, 17, 12, 6, 3, 10, 9, 5];
function determineCheckDigit(codeFrequency) {
  for (var i = 0; i < 10; i++) {
    if (codeFrequency === CHECK_DIGIT_ENCODINGS[i]) {
      return i;
    }
  }
  return null;
}
function extensionChecksum(result) {
  var length = result.length;
  var sum = 0;
  for (var i = length - 2; i >= 0; i -= 2) {
    sum += result[i];
  }
  sum *= 3;
  for (var _i = length - 1; _i >= 0; _i -= 2) {
    sum += result[_i];
  }
  sum *= 3;
  return sum % 10;
}
var ean_5_reader_EAN5Reader = /*#__PURE__*/function (_EANReader) {
  inherits_default()(EAN5Reader, _EANReader);
  var _super = ean_5_reader_createSuper(EAN5Reader);
  function EAN5Reader() {
    var _this;
    classCallCheck_default()(this, EAN5Reader);
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    _this = _super.call.apply(_super, [this].concat(args));
    defineProperty_default()(assertThisInitialized_default()(_this), "FORMAT", 'ean_5');
    return _this;
  }
  createClass_default()(EAN5Reader, [{
    key: "decode",
    value: function decode(row, start) {
      if (start === undefined) {
        return null;
      }
      if (row) {
        this._row = row;
      }
      var codeFrequency = 0;
      var offset = start;
      var end = this._row.length;
      var code = null;
      var result = [];
      var decodedCodes = [];
      for (var i = 0; i < 5 && offset < end; i++) {
        code = this._decodeCode(offset);
        if (!code) {
          return null;
        }
        decodedCodes.push(code);
        result.push(code.code % 10);
        if (code.code >= CODE_G_START) {
          codeFrequency |= 1 << 4 - i;
        }
        if (i !== 4) {
          offset = this._nextSet(this._row, code.end);
          offset = this._nextUnset(this._row, offset);
        }
      }
      if (result.length !== 5) {
        return null;
      }
      if (extensionChecksum(result) !== determineCheckDigit(codeFrequency)) {
        return null;
      }
      var startInfo = this._findStart();
      return {
        code: result.join(''),
        decodedCodes: decodedCodes,
        end: code.end,
        format: this.FORMAT,
        startInfo: startInfo,
        start: startInfo.start
      };
    }
  }]);
  return EAN5Reader;
}(ean_reader);
;
/* harmony default export */ var ean_5_reader = (ean_5_reader_EAN5Reader);
// CONCATENATED MODULE: ./src/reader/ean_8_reader.ts







function ean_8_reader_createSuper(Derived) { var hasNativeReflectConstruct = ean_8_reader_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function ean_8_reader_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var ean_8_reader_EAN8Reader = /*#__PURE__*/function (_EANReader) {
  inherits_default()(EAN8Reader, _EANReader);
  var _super = ean_8_reader_createSuper(EAN8Reader);
  function EAN8Reader() {
    var _this;
    classCallCheck_default()(this, EAN8Reader);
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    _this = _super.call.apply(_super, [this].concat(args));
    defineProperty_default()(assertThisInitialized_default()(_this), "FORMAT", 'ean_8');
    return _this;
  }
  createClass_default()(EAN8Reader, [{
    key: "_decodePayload",
    value: function _decodePayload(inCode, result, decodedCodes) {
      var code = inCode;
      for (var i = 0; i < 4; i++) {
        code = this._decodeCode(code.end, CODE_G_START);
        if (!code) {
          return null;
        }
        result.push(code.code);
        decodedCodes.push(code);
      }
      code = this._findPattern(MIDDLE_PATTERN, code.end, true, false);
      if (code === null) {
        return null;
      }
      decodedCodes.push(code);
      for (var _i = 0; _i < 4; _i++) {
        code = this._decodeCode(code.end, CODE_G_START);
        if (!code) {
          return null;
        }
        decodedCodes.push(code);
        result.push(code.code);
      }
      return code;
    }
  }]);
  return EAN8Reader;
}(ean_reader);
/* harmony default export */ var ean_8_reader = (ean_8_reader_EAN8Reader);
// CONCATENATED MODULE: ./src/reader/i2of5_reader.ts








function i2of5_reader_createSuper(Derived) { var hasNativeReflectConstruct = i2of5_reader_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function i2of5_reader_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
// TODO: i2of5_reader and 2of5_reader share very similar code, make use of that



var i2of5_reader_N = 1;
var i2of5_reader_W = 3;
var i2of5_reader_I2of5Reader = /*#__PURE__*/function (_BarcodeReader) {
  inherits_default()(I2of5Reader, _BarcodeReader);
  var _super = i2of5_reader_createSuper(I2of5Reader);
  function I2of5Reader(opts) {
    var _this;
    classCallCheck_default()(this, I2of5Reader);
    _this = _super.call(this, merge_default()({
      normalizeBarSpaceWidth: false
    }, opts));
    defineProperty_default()(assertThisInitialized_default()(_this), "barSpaceRatio", [1, 1]);
    defineProperty_default()(assertThisInitialized_default()(_this), "SINGLE_CODE_ERROR", 0.78);
    defineProperty_default()(assertThisInitialized_default()(_this), "AVG_CODE_ERROR", 0.38);
    defineProperty_default()(assertThisInitialized_default()(_this), "START_PATTERN", [i2of5_reader_N, i2of5_reader_N, i2of5_reader_N, i2of5_reader_N]);
    defineProperty_default()(assertThisInitialized_default()(_this), "STOP_PATTERN", [i2of5_reader_N, i2of5_reader_N, i2of5_reader_W]);
    defineProperty_default()(assertThisInitialized_default()(_this), "CODE_PATTERN", [[i2of5_reader_N, i2of5_reader_N, i2of5_reader_W, i2of5_reader_W, i2of5_reader_N], [i2of5_reader_W, i2of5_reader_N, i2of5_reader_N, i2of5_reader_N, i2of5_reader_W], [i2of5_reader_N, i2of5_reader_W, i2of5_reader_N, i2of5_reader_N, i2of5_reader_W], [i2of5_reader_W, i2of5_reader_W, i2of5_reader_N, i2of5_reader_N, i2of5_reader_N], [i2of5_reader_N, i2of5_reader_N, i2of5_reader_W, i2of5_reader_N, i2of5_reader_W], [i2of5_reader_W, i2of5_reader_N, i2of5_reader_W, i2of5_reader_N, i2of5_reader_N], [i2of5_reader_N, i2of5_reader_W, i2of5_reader_W, i2of5_reader_N, i2of5_reader_N], [i2of5_reader_N, i2of5_reader_N, i2of5_reader_N, i2of5_reader_W, i2of5_reader_W], [i2of5_reader_W, i2of5_reader_N, i2of5_reader_N, i2of5_reader_W, i2of5_reader_N], [i2of5_reader_N, i2of5_reader_W, i2of5_reader_N, i2of5_reader_W, i2of5_reader_N]]);
    defineProperty_default()(assertThisInitialized_default()(_this), "MAX_CORRECTION_FACTOR", 5);
    defineProperty_default()(assertThisInitialized_default()(_this), "FORMAT", 'i2of5');
    if (opts.normalizeBarSpaceWidth) {
      _this.SINGLE_CODE_ERROR = 0.38;
      _this.AVG_CODE_ERROR = 0.09;
    }
    _this.config = opts;
    return possibleConstructorReturn_default()(_this, assertThisInitialized_default()(_this));
  }
  createClass_default()(I2of5Reader, [{
    key: "_matchPattern",
    value: function _matchPattern(counter, code) {
      if (this.config.normalizeBarSpaceWidth) {
        var counterSum = [0, 0];
        var codeSum = [0, 0];
        var correction = [0, 0];
        var correctionRatio = this.MAX_CORRECTION_FACTOR;
        var correctionRatioInverse = 1 / correctionRatio;
        for (var i = 0; i < counter.length; i++) {
          counterSum[i % 2] += counter[i];
          codeSum[i % 2] += code[i];
        }
        correction[0] = codeSum[0] / counterSum[0];
        correction[1] = codeSum[1] / counterSum[1];
        correction[0] = Math.max(Math.min(correction[0], correctionRatio), correctionRatioInverse);
        correction[1] = Math.max(Math.min(correction[1], correctionRatio), correctionRatioInverse);
        this.barSpaceRatio = correction;
        for (var _i = 0; _i < counter.length; _i++) {
          counter[_i] *= this.barSpaceRatio[_i % 2];
        }
      }
      return get_default()(getPrototypeOf_default()(I2of5Reader.prototype), "_matchPattern", this).call(this, counter, code);
    }
  }, {
    key: "_findPattern",
    value: function _findPattern(pattern, offset) {
      var isWhite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
      var tryHarder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
      var counter = new Array(pattern.length).fill(0);
      var counterPos = 0;
      var bestMatch = {
        error: Number.MAX_VALUE,
        start: 0,
        end: 0
      };
      var epsilon = this.AVG_CODE_ERROR;
      isWhite = isWhite || false;
      tryHarder = tryHarder || false;
      if (!offset) {
        offset = this._nextSet(this._row);
      }
      for (var i = offset; i < this._row.length; i++) {
        if (this._row[i] ^ (isWhite ? 1 : 0)) {
          counter[counterPos]++;
        } else {
          if (counterPos === counter.length - 1) {
            var sum = counter.reduce(function (prev, next) {
              return prev + next;
            }, 0);
            var error = this._matchPattern(counter, pattern);
            if (error < epsilon) {
              bestMatch.error = error;
              bestMatch.start = i - sum;
              bestMatch.end = i;
              return bestMatch;
            }
            if (tryHarder) {
              for (var j = 0; j < counter.length - 2; j++) {
                counter[j] = counter[j + 2];
              }
              counter[counter.length - 2] = 0;
              counter[counter.length - 1] = 0;
              counterPos--;
            } else {
              return null;
            }
          } else {
            counterPos++;
          }
          counter[counterPos] = 1;
          isWhite = !isWhite;
        }
      }
      return null;
    }
  }, {
    key: "_findStart",
    value: function _findStart() {
      var leadingWhitespaceStart = 0;
      var offset = this._nextSet(this._row);
      var startInfo = null;
      var narrowBarWidth = 1;
      while (!startInfo) {
        startInfo = this._findPattern(this.START_PATTERN, offset, false, true);
        if (!startInfo) {
          return null;
        }
        narrowBarWidth = Math.floor((startInfo.end - startInfo.start) / 4);
        leadingWhitespaceStart = startInfo.start - narrowBarWidth * 10;
        if (leadingWhitespaceStart >= 0) {
          if (this._matchRange(leadingWhitespaceStart, startInfo.start, 0)) {
            return startInfo;
          }
        }
        offset = startInfo.end;
        startInfo = null;
      }
      return null;
    }
  }, {
    key: "_verifyTrailingWhitespace",
    value: function _verifyTrailingWhitespace(endInfo) {
      var trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2;
      if (trailingWhitespaceEnd < this._row.length) {
        if (this._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
          return endInfo;
        }
      }
      return null;
    }
  }, {
    key: "_findEnd",
    value: function _findEnd() {
      this._row.reverse();
      var endInfo = this._findPattern(this.STOP_PATTERN);
      this._row.reverse();
      if (endInfo === null) {
        return null;
      }

      // reverse numbers
      var tmp = endInfo.start;
      endInfo.start = this._row.length - endInfo.end;
      endInfo.end = this._row.length - tmp;
      return endInfo !== null ? this._verifyTrailingWhitespace(endInfo) : null;
    }
  }, {
    key: "_decodePair",
    value: function _decodePair(counterPair) {
      var codes = [];
      for (var i = 0; i < counterPair.length; i++) {
        var code = this._decodeCode(counterPair[i]);
        if (!code) {
          return null;
        }
        codes.push(code);
      }
      return codes;
    }
  }, {
    key: "_decodeCode",
    value: function _decodeCode(counter) {
      var epsilon = this.AVG_CODE_ERROR;
      var bestMatch = {
        error: Number.MAX_VALUE,
        code: -1,
        start: 0,
        end: 0
      };
      for (var code = 0; code < this.CODE_PATTERN.length; code++) {
        var error = this._matchPattern(counter, this.CODE_PATTERN[code]);
        if (error < bestMatch.error) {
          bestMatch.code = code;
          bestMatch.error = error;
        }
      }
      if (bestMatch.error < epsilon) {
        return bestMatch;
      }
      return null;
    }
  }, {
    key: "_decodePayload",
    value: function _decodePayload(counters, result, decodedCodes) {
      var pos = 0;
      var counterLength = counters.length;
      var counterPair = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]];
      var codes = null;
      while (pos < counterLength) {
        for (var i = 0; i < 5; i++) {
          counterPair[0][i] = counters[pos] * this.barSpaceRatio[0];
          counterPair[1][i] = counters[pos + 1] * this.barSpaceRatio[1];
          pos += 2;
        }
        codes = this._decodePair(counterPair);
        if (!codes) {
          return null;
        }
        for (var _i2 = 0; _i2 < codes.length; _i2++) {
          result.push(codes[_i2].code + '');
          decodedCodes.push(codes[_i2]);
        }
      }
      return codes;
    }
  }, {
    key: "_verifyCounterLength",
    value: function _verifyCounterLength(counters) {
      return counters.length % 10 === 0;
    }
  }, {
    key: "decode",
    value: function decode(row, start) {
      var result = new Array();
      var decodedCodes = new Array();
      var startInfo = this._findStart();
      if (!startInfo) {
        return null;
      }
      decodedCodes.push(startInfo);
      var endInfo = this._findEnd();
      if (!endInfo) {
        return null;
      }
      var counters = this._fillCounters(startInfo.end, endInfo.start, false);
      if (!this._verifyCounterLength(counters)) {
        return null;
      }
      var code = this._decodePayload(counters, result, decodedCodes);
      if (!code) {
        return null;
      }
      if (result.length % 2 !== 0 || result.length < 6) {
        return null;
      }
      decodedCodes.push(endInfo);
      return {
        code: result.join(''),
        start: startInfo.start,
        end: endInfo.end,
        startInfo: startInfo,
        decodedCodes: decodedCodes,
        format: this.FORMAT
      };
    }
  }]);
  return I2of5Reader;
}(barcode_reader);
/* harmony default export */ var i2of5_reader = (i2of5_reader_I2of5Reader);
// CONCATENATED MODULE: ./src/reader/upc_e_reader.ts








function upc_e_reader_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function upc_e_reader_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? upc_e_reader_ownKeys(Object(source), !0).forEach(function (key) { defineProperty_default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : upc_e_reader_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function upc_e_reader_createSuper(Derived) { var hasNativeReflectConstruct = upc_e_reader_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function upc_e_reader_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var upc_e_reader_UPCEReader = /*#__PURE__*/function (_EANReader) {
  inherits_default()(UPCEReader, _EANReader);
  var _super = upc_e_reader_createSuper(UPCEReader);
  function UPCEReader() {
    var _this;
    classCallCheck_default()(this, UPCEReader);
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    _this = _super.call.apply(_super, [this].concat(args));
    defineProperty_default()(assertThisInitialized_default()(_this), "CODE_FREQUENCY", [[56, 52, 50, 49, 44, 38, 35, 42, 41, 37], [7, 11, 13, 14, 19, 25, 28, 21, 22, 26]]);
    defineProperty_default()(assertThisInitialized_default()(_this), "STOP_PATTERN", [1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7]);
    defineProperty_default()(assertThisInitialized_default()(_this), "FORMAT", 'upc_e');
    return _this;
  }
  createClass_default()(UPCEReader, [{
    key: "_decodePayload",
    value: function _decodePayload(inCode, result, decodedCodes) {
      var outCode = upc_e_reader_objectSpread({}, inCode);
      var codeFrequency = 0x0;
      for (var i = 0; i < 6; i++) {
        outCode = this._decodeCode(outCode.end);
        if (!outCode) {
          return null;
        }
        if (outCode.code >= CODE_G_START) {
          outCode.code = outCode.code - CODE_G_START;
          codeFrequency |= 1 << 5 - i;
        }
        result.push(outCode.code);
        decodedCodes.push(outCode);
      }
      if (!this._determineParity(codeFrequency, result)) {
        return null;
      }
      return outCode;
    }
  }, {
    key: "_determineParity",
    value: function _determineParity(codeFrequency, result) {
      for (var nrSystem = 0; nrSystem < this.CODE_FREQUENCY.length; nrSystem++) {
        for (var i = 0; i < this.CODE_FREQUENCY[nrSystem].length; i++) {
          if (codeFrequency === this.CODE_FREQUENCY[nrSystem][i]) {
            result.unshift(nrSystem);
            result.push(i);
            return true;
          }
        }
      }
      return false;
    }
  }, {
    key: "_convertToUPCA",
    value: function _convertToUPCA(result) {
      var upca = [result[0]];
      var lastDigit = result[result.length - 2];
      if (lastDigit <= 2) {
        upca = upca.concat(result.slice(1, 3)).concat([lastDigit, 0, 0, 0, 0]).concat(result.slice(3, 6));
      } else if (lastDigit === 3) {
        upca = upca.concat(result.slice(1, 4)).concat([0, 0, 0, 0, 0]).concat(result.slice(4, 6));
      } else if (lastDigit === 4) {
        upca = upca.concat(result.slice(1, 5)).concat([0, 0, 0, 0, 0, result[5]]);
      } else {
        upca = upca.concat(result.slice(1, 6)).concat([0, 0, 0, 0, lastDigit]);
      }
      upca.push(result[result.length - 1]);
      return upca;
    }
  }, {
    key: "_checksum",
    value: function _checksum(result) {
      return get_default()(getPrototypeOf_default()(UPCEReader.prototype), "_checksum", this).call(this, this._convertToUPCA(result));
    }
  }, {
    key: "_findEnd",
    value: function _findEnd(offset, isWhite) {
      return get_default()(getPrototypeOf_default()(UPCEReader.prototype), "_findEnd", this).call(this, offset, true);
    }
  }, {
    key: "_verifyTrailingWhitespace",
    value: function _verifyTrailingWhitespace(endInfo) {
      var trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2;
      if (trailingWhitespaceEnd < this._row.length) {
        if (this._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
          return endInfo;
        }
      }
      return null;
    }
  }]);
  return UPCEReader;
}(ean_reader);
/* harmony default export */ var upc_e_reader = (upc_e_reader_UPCEReader);
// CONCATENATED MODULE: ./src/reader/upc_reader.ts







function upc_reader_createSuper(Derived) { var hasNativeReflectConstruct = upc_reader_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function upc_reader_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var upc_reader_UPCReader = /*#__PURE__*/function (_EANReader) {
  inherits_default()(UPCReader, _EANReader);
  var _super = upc_reader_createSuper(UPCReader);
  function UPCReader() {
    var _this;
    classCallCheck_default()(this, UPCReader);
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    _this = _super.call.apply(_super, [this].concat(args));
    defineProperty_default()(assertThisInitialized_default()(_this), "FORMAT", 'upc_a');
    return _this;
  }
  createClass_default()(UPCReader, [{
    key: "decode",
    value: function decode(row, start) {
      var result = ean_reader.prototype.decode.call(this);
      if (result && result.code && result.code.length === 13 && result.code.charAt(0) === '0') {
        result.code = result.code.substring(1);
        return result;
      }
      return null;
    }
  }]);
  return UPCReader;
}(ean_reader);
/* harmony default export */ var upc_reader = (upc_reader_UPCReader);
// CONCATENATED MODULE: ./src/decoder/bresenham.js
var Bresenham = {};
var Slope = {
  DIR: {
    UP: 1,
    DOWN: -1
  }
};
/**
 * Scans a line of the given image from point p1 to p2 and returns a result object containing
 * gray-scale values (0-255) of the underlying pixels in addition to the min
 * and max values.
 * @param {Object} imageWrapper
 * @param {Object} p1 The start point {x,y}
 * @param {Object} p2 The end point {x,y}
 * @returns {line, min, max}
 */
Bresenham.getBarcodeLine = function (imageWrapper, p1, p2) {
  /* eslint-disable no-bitwise */
  var x0 = p1.x | 0;
  var y0 = p1.y | 0;
  var x1 = p2.x | 0;
  var y1 = p2.y | 0;
  /* eslint-disable no-bitwise */
  var steep = Math.abs(y1 - y0) > Math.abs(x1 - x0);
  var error;
  var y;
  var tmp;
  var x;
  var line = [];
  var imageData = imageWrapper.data;
  var width = imageWrapper.size.x;
  var val;
  var min = 255;
  var max = 0;
  function read(a, b) {
    val = imageData[b * width + a];
    min = val < min ? val : min;
    max = val > max ? val : max;
    line.push(val);
  }
  if (steep) {
    tmp = x0;
    x0 = y0;
    y0 = tmp;
    tmp = x1;
    x1 = y1;
    y1 = tmp;
  }
  if (x0 > x1) {
    tmp = x0;
    x0 = x1;
    x1 = tmp;
    tmp = y0;
    y0 = y1;
    y1 = tmp;
  }
  var deltaX = x1 - x0;
  var deltaY = Math.abs(y1 - y0);
  error = deltaX / 2 | 0;
  y = y0;
  var yStep = y0 < y1 ? 1 : -1;
  for (x = x0; x < x1; x++) {
    if (steep) {
      read(y, x);
    } else {
      read(x, y);
    }
    error -= deltaY;
    if (error < 0) {
      y += yStep;
      error += deltaX;
    }
  }
  return {
    line: line,
    min: min,
    max: max
  };
};

/**
 * Converts the result from getBarcodeLine into a binary representation
 * also considering the frequency and slope of the signal for more robust results
 * @param {Object} result {line, min, max}
 */
Bresenham.toBinaryLine = function (result) {
  var min = result.min;
  var max = result.max;
  var line = result.line;
  var slope;
  var slope2;
  var center = min + (max - min) / 2;
  var extrema = [];
  var currentDir;
  var dir;
  var threshold = (max - min) / 12;
  var rThreshold = -threshold;
  var i;
  var j;

  // 1. find extrema
  currentDir = line[0] > center ? Slope.DIR.UP : Slope.DIR.DOWN;
  extrema.push({
    pos: 0,
    val: line[0]
  });
  for (i = 0; i < line.length - 2; i++) {
    slope = line[i + 1] - line[i];
    slope2 = line[i + 2] - line[i + 1];
    if (slope + slope2 < rThreshold && line[i + 1] < center * 1.5) {
      dir = Slope.DIR.DOWN;
    } else if (slope + slope2 > threshold && line[i + 1] > center * 0.5) {
      dir = Slope.DIR.UP;
    } else {
      dir = currentDir;
    }
    if (currentDir !== dir) {
      extrema.push({
        pos: i,
        val: line[i]
      });
      currentDir = dir;
    }
  }
  extrema.push({
    pos: line.length,
    val: line[line.length - 1]
  });
  for (j = extrema[0].pos; j < extrema[1].pos; j++) {
    line[j] = line[j] > center ? 0 : 1;
  }

  // iterate over extrema and convert to binary based on avg between minmax
  for (i = 1; i < extrema.length - 1; i++) {
    if (extrema[i + 1].val > extrema[i].val) {
      threshold = extrema[i].val + (extrema[i + 1].val - extrema[i].val) / 3 * 2 | 0;
    } else {
      threshold = extrema[i + 1].val + (extrema[i].val - extrema[i + 1].val) / 3 | 0;
    }
    for (j = extrema[i].pos; j < extrema[i + 1].pos; j++) {
      line[j] = line[j] > threshold ? 0 : 1;
    }
  }
  return {
    line: line,
    threshold: threshold
  };
};

/**
 * Used for development only
 */
Bresenham.debug = {
  printFrequency: function printFrequency(line, canvas) {
    var i;
    var ctx = canvas.getContext('2d');
    // eslint-disable-next-line no-param-reassign
    canvas.width = line.length;
    // eslint-disable-next-line no-param-reassign
    canvas.height = 256;
    ctx.beginPath();
    ctx.strokeStyle = 'blue';
    for (i = 0; i < line.length; i++) {
      ctx.moveTo(i, 255);
      ctx.lineTo(i, 255 - line[i]);
    }
    ctx.stroke();
    ctx.closePath();
  },
  printPattern: function printPattern(line, canvas) {
    var ctx = canvas.getContext('2d');
    var i;

    // eslint-disable-next-line no-param-reassign
    canvas.width = line.length;
    ctx.fillColor = 'black';
    for (i = 0; i < line.length; i++) {
      if (line[i] === 1) {
        ctx.fillRect(i, 0, 1, 100);
      }
    }
  }
};
/* harmony default export */ var bresenham = (Bresenham);
// CONCATENATED MODULE: ./src/decoder/barcode_decoder.js


function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

/* eslint-disable import/no-cycle */

















var READERS = {
  code_128_reader: code_128_reader,
  ean_reader: ean_reader,
  ean_5_reader: ean_5_reader,
  ean_2_reader: ean_2_reader,
  ean_8_reader: ean_8_reader,
  code_39_reader: code_39_reader,
  code_39_vin_reader: code_39_vin_reader,
  codabar_reader: codabar_reader,
  upc_reader: upc_reader,
  upc_e_reader: upc_e_reader,
  i2of5_reader: i2of5_reader,
  '2of5_reader': _2of5_reader,
  code_93_reader: code_93_reader,
  code_32_reader: code_32_reader
};
/* harmony default export */ var barcode_decoder = ({
  registerReader: function registerReader(name, reader) {
    READERS[name] = reader;
  },
  create: function create(config, inputImageWrapper) {
    var _canvas = {
      ctx: {
        frequency: null,
        pattern: null,
        overlay: null
      },
      dom: {
        frequency: null,
        pattern: null,
        overlay: null
      }
    };
    var _barcodeReaders = [];
    initCanvas();
    initReaders();
    initConfig();
    function initCanvas() {
      if ( true && typeof document !== 'undefined') {
        var $debug = document.querySelector('#debug.detection');
        _canvas.dom.frequency = document.querySelector('canvas.frequency');
        if (!_canvas.dom.frequency) {
          _canvas.dom.frequency = document.createElement('canvas');
          _canvas.dom.frequency.className = 'frequency';
          if ($debug) {
            $debug.appendChild(_canvas.dom.frequency);
          }
        }
        console.warn('* barcode decoder initCanvas getcontext 2d');
        _canvas.ctx.frequency = _canvas.dom.frequency.getContext('2d');
        _canvas.dom.pattern = document.querySelector('canvas.patternBuffer');
        if (!_canvas.dom.pattern) {
          _canvas.dom.pattern = document.createElement('canvas');
          _canvas.dom.pattern.className = 'patternBuffer';
          if ($debug) {
            $debug.appendChild(_canvas.dom.pattern);
          }
        }
        _canvas.ctx.pattern = _canvas.dom.pattern.getContext('2d');
        _canvas.dom.overlay = document.querySelector('canvas.drawingBuffer');
        if (_canvas.dom.overlay) {
          _canvas.ctx.overlay = _canvas.dom.overlay.getContext('2d');
        }
      }
    }
    function initReaders() {
      config.readers.forEach(function (readerConfig) {
        var reader;
        var configuration = {};
        var supplements = [];
        if (typeof_default()(readerConfig) === 'object') {
          reader = readerConfig.format;
          configuration = readerConfig.config;
        } else if (typeof readerConfig === 'string') {
          reader = readerConfig;
        }
        if (true) {
          console.log('Before registering reader: ', reader);
        }
        if (configuration.supplements) {
          supplements = configuration.supplements.map(function (supplement) {
            return new READERS[supplement]();
          });
        }
        try {
          var readerObj = new READERS[reader](configuration, supplements);
          _barcodeReaders.push(readerObj);
        } catch (err) {
          console.error('* Error constructing reader ', reader, err);
          throw err;
        }
      });
      if (true) {
        console.log("Registered Readers: ".concat(_barcodeReaders.map(function (reader) {
          return JSON.stringify({
            format: reader.FORMAT,
            config: reader.config
          });
        }).join(', ')));
      }
    }
    function initConfig() {
      if ( true && typeof document !== 'undefined') {
        var i;
        var vis = [{
          node: _canvas.dom.frequency,
          prop: config.debug.showFrequency
        }, {
          node: _canvas.dom.pattern,
          prop: config.debug.showPattern
        }];
        for (i = 0; i < vis.length; i++) {
          if (vis[i].prop === true) {
            vis[i].node.style.display = 'block';
          } else {
            vis[i].node.style.display = 'none';
          }
        }
      }
    }

    /**
     * extend the line on both ends
     * @param {Array} line
     * @param {Number} angle
     */
    function getExtendedLine(line, angle, ext) {
      function extendLine(amount) {
        var extension = {
          y: amount * Math.sin(angle),
          x: amount * Math.cos(angle)
        };
        /* eslint-disable no-param-reassign */
        line[0].y -= extension.y;
        line[0].x -= extension.x;
        line[1].y += extension.y;
        line[1].x += extension.x;
        /* eslint-enable no-param-reassign */
      }

      // check if inside image
      extendLine(ext);
      while (ext > 1 && (!inputImageWrapper.inImageWithBorder(line[0]) || !inputImageWrapper.inImageWithBorder(line[1]))) {
        // eslint-disable-next-line no-param-reassign
        ext -= Math.ceil(ext / 2);
        extendLine(-ext);
      }
      return line;
    }
    function getLine(box) {
      return [{
        x: (box[1][0] - box[0][0]) / 2 + box[0][0],
        y: (box[1][1] - box[0][1]) / 2 + box[0][1]
      }, {
        x: (box[3][0] - box[2][0]) / 2 + box[2][0],
        y: (box[3][1] - box[2][1]) / 2 + box[2][1]
      }];
    }
    function tryDecode(line) {
      var result = null;
      var i;
      var barcodeLine = bresenham.getBarcodeLine(inputImageWrapper, line[0], line[1]);
      if ( true && config.debug.showFrequency) {
        image_debug["a" /* default */].drawPath(line, {
          x: 'x',
          y: 'y'
        }, _canvas.ctx.overlay, {
          color: 'red',
          lineWidth: 3
        });
        bresenham.debug.printFrequency(barcodeLine.line, _canvas.dom.frequency);
      }
      bresenham.toBinaryLine(barcodeLine);
      if ( true && config.debug.showPattern) {
        bresenham.debug.printPattern(barcodeLine.line, _canvas.dom.pattern);
      }
      for (i = 0; i < _barcodeReaders.length && result === null; i++) {
        result = _barcodeReaders[i].decodePattern(barcodeLine.line);
      }
      if (result === null) {
        return null;
      }
      return {
        codeResult: result,
        barcodeLine: barcodeLine
      };
    }

    /**
     * This method slices the given area apart and tries to detect a barcode-pattern
     * for each slice. It returns the decoded barcode, or null if nothing was found
     * @param {Array} box
     * @param {Array} line
     * @param {Number} lineAngle
     */
    function tryDecodeBruteForce(box, line, lineAngle) {
      var sideLength = Math.sqrt(Math.pow(box[1][0] - box[0][0], 2) + Math.pow(box[1][1] - box[0][1], 2));
      var i;
      var slices = 16;
      var result = null;
      var dir;
      var extension;
      var xdir = Math.sin(lineAngle);
      var ydir = Math.cos(lineAngle);
      for (i = 1; i < slices && result === null; i++) {
        // move line perpendicular to angle
        // eslint-disable-next-line no-mixed-operators
        dir = sideLength / slices * i * (i % 2 === 0 ? -1 : 1);
        extension = {
          y: dir * xdir,
          x: dir * ydir
        };
        /* eslint-disable no-param-reassign */
        line[0].y += extension.x;
        line[0].x -= extension.y;
        line[1].y += extension.x;
        line[1].x -= extension.y;
        /* eslint-enable no-param-reassign */

        result = tryDecode(line);
      }
      return result;
    }
    function getLineLength(line) {
      return Math.sqrt(Math.pow(Math.abs(line[1].y - line[0].y), 2) + Math.pow(Math.abs(line[1].x - line[0].x), 2));
    }
    function _decodeFromImage2(_x) {
      return _decodeFromImage.apply(this, arguments);
    }
    /**
     * With the help of the configured readers (Code128 or EAN) this function tries to detect a
     * valid barcode pattern within the given area.
     * @param {Object} box The area to search in
     * @returns {Object} the result {codeResult, line, angle, pattern, threshold}
     */
    function _decodeFromImage() {
      _decodeFromImage = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee2(imageWrapper) {
        var result, _iterator, _step, reader;
        return regenerator_default.a.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                result = null;
                _iterator = _createForOfIteratorHelper(_barcodeReaders);
                _context2.prev = 2;
                _iterator.s();
              case 4:
                if ((_step = _iterator.n()).done) {
                  _context2.next = 14;
                  break;
                }
                reader = _step.value;
                if (!reader.decodeImage) {
                  _context2.next = 12;
                  break;
                }
                _context2.next = 9;
                return reader.decodeImage(imageWrapper);
              case 9:
                result = _context2.sent;
                if (!result) {
                  _context2.next = 12;
                  break;
                }
                return _context2.abrupt("break", 14);
              case 12:
                _context2.next = 4;
                break;
              case 14:
                _context2.next = 19;
                break;
              case 16:
                _context2.prev = 16;
                _context2.t0 = _context2["catch"](2);
                _iterator.e(_context2.t0);
              case 19:
                _context2.prev = 19;
                _iterator.f();
                return _context2.finish(19);
              case 22:
                return _context2.abrupt("return", result);
              case 23:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, null, [[2, 16, 19, 22]]);
      }));
      return _decodeFromImage.apply(this, arguments);
    }
    function _decodeFromBoundingBox(box) {
      var line;
      var ctx = _canvas.ctx.overlay;
      var result;
      if (true) {
        if (config.debug.drawBoundingBox && ctx) {
          image_debug["a" /* default */].drawPath(box, {
            x: 0,
            y: 1
          }, ctx, {
            color: 'blue',
            lineWidth: 2
          });
        }
      }
      line = getLine(box);
      var lineLength = getLineLength(line);
      var lineAngle = Math.atan2(line[1].y - line[0].y, line[1].x - line[0].x);
      line = getExtendedLine(line, lineAngle, Math.floor(lineLength * 0.1));
      if (line === null) {
        return null;
      }
      result = tryDecode(line);
      if (result === null) {
        result = tryDecodeBruteForce(box, line, lineAngle);
      }
      if (result === null) {
        return null;
      }
      if ( true && result && config.debug.drawScanline && ctx) {
        image_debug["a" /* default */].drawPath(line, {
          x: 'x',
          y: 'y'
        }, ctx, {
          color: 'red',
          lineWidth: 3
        });
      }
      return {
        codeResult: result.codeResult,
        line: line,
        angle: lineAngle,
        pattern: result.barcodeLine.line,
        threshold: result.barcodeLine.threshold
      };
    }
    return {
      decodeFromBoundingBox: function decodeFromBoundingBox(box) {
        return _decodeFromBoundingBox(box);
      },
      decodeFromBoundingBoxes: function decodeFromBoundingBoxes(boxes) {
        var i;
        var result;
        var barcodes = [];
        var multiple = config.multiple;
        for (i = 0; i < boxes.length; i++) {
          var box = boxes[i];
          result = _decodeFromBoundingBox(box) || {};
          result.box = box;
          if (multiple) {
            barcodes.push(result);
          } else if (result.codeResult) {
            return result;
          }
        }
        return {
          barcodes: barcodes
        };
      },
      decodeFromImage: function decodeFromImage(imageWrapperIn) {
        return asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee() {
          var result;
          return regenerator_default.a.wrap(function _callee$(_context) {
            while (1) {
              switch (_context.prev = _context.next) {
                case 0:
                  _context.next = 2;
                  return _decodeFromImage2(imageWrapperIn);
                case 2:
                  result = _context.sent;
                  return _context.abrupt("return", result);
                case 4:
                case "end":
                  return _context.stop();
              }
            }
          }, _callee);
        }))();
      },
      registerReader: function registerReader(name, reader) {
        if (READERS[name]) {
          throw new Error('cannot register existing reader', name);
        }
        READERS[name] = reader;
      },
      setReaders: function setReaders(readers) {
        // eslint-disable-next-line no-param-reassign
        config.readers = readers;
        _barcodeReaders.length = 0;
        initReaders();
      }
    };
  }
});
// CONCATENATED MODULE: ./src/reader/index.ts
















// CONCATENATED MODULE: ./src/common/events.ts
/* harmony default export */ var events = ((function EventInterface() {
  var events = {};
  function getEvent(eventName) {
    if (!events[eventName]) {
      events[eventName] = {
        subscribers: []
      };
    }
    return events[eventName];
  }
  function clearEvents() {
    events = {};
  }
  function publishSubscription(subscription, data) {
    if (subscription.async) {
      setTimeout(function () {
        subscription.callback(data);
      }, 4);
    } else {
      subscription.callback(data);
    }
  }
  function _subscribe(event, callback, async) {
    var subscription;
    if (typeof callback === 'function') {
      subscription = {
        callback: callback,
        async: async
      };
    } else {
      subscription = callback;
      if (!subscription.callback) {
        throw new Error('Callback was not specified on options');
      }
    }
    getEvent(event).subscribers.push(subscription);
  }
  return {
    subscribe: function subscribe(event, callback, async) {
      return _subscribe(event, callback, async);
    },
    publish: function publish(eventName, data) {
      var event = getEvent(eventName);
      var subscribers = event.subscribers;

      // Publish one-time subscriptions
      subscribers.filter(function (subscriber) {
        return !!subscriber.once;
      }).forEach(function (subscriber) {
        publishSubscription(subscriber, data);
      });

      // remove them from the subscriber
      event.subscribers = subscribers.filter(function (subscriber) {
        return !subscriber.once;
      });

      // publish the rest
      event.subscribers.forEach(function (subscriber) {
        publishSubscription(subscriber, data);
      });
    },
    once: function once(event, callback) {
      var async = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
      _subscribe(event, {
        callback: callback,
        async: async,
        once: true
      });
    },
    unsubscribe: function unsubscribe(eventName, callback) {
      if (eventName) {
        var _event = getEvent(eventName);
        if (_event && callback) {
          _event.subscribers = _event.subscribers.filter(function (subscriber) {
            return subscriber.callback !== callback;
          });
        } else {
          _event.subscribers = [];
        }
      } else {
        clearEvents();
      }
    }
  };
})());
// EXTERNAL MODULE: ./node_modules/lodash/pick.js
var pick = __webpack_require__(62);
var pick_default = /*#__PURE__*/__webpack_require__.n(pick);

// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/wrapNativeSuper.js
var wrapNativeSuper = __webpack_require__(63);
var wrapNativeSuper_default = /*#__PURE__*/__webpack_require__.n(wrapNativeSuper);

// CONCATENATED MODULE: ./src/quagga/Exception.ts








function Exception_createSuper(Derived) { var hasNativeReflectConstruct = Exception_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }
function Exception_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var Exception_Exception = /*#__PURE__*/function (_Error) {
  inherits_default()(Exception, _Error);
  var _super = Exception_createSuper(Exception);
  function Exception(m, code) {
    var _this;
    classCallCheck_default()(this, Exception);
    _this = _super.call(this, m);
    defineProperty_default()(assertThisInitialized_default()(_this), "code", void 0);
    _this.code = code;
    Object.setPrototypeOf(assertThisInitialized_default()(_this), Exception.prototype);
    return _this;
  }
  return createClass_default()(Exception);
}( /*#__PURE__*/wrapNativeSuper_default()(Error));

// CONCATENATED MODULE: ./src/common/mediaDevices.ts

var ERROR_DESC = 'This may mean that the user has declined camera access, or the browser does not support media APIs. If you are running in iOS, you must use Safari.';
function enumerateDevices() {
  try {
    return navigator.mediaDevices.enumerateDevices();
  } catch (err) {
    var error = new Exception_Exception("enumerateDevices is not defined. ".concat(ERROR_DESC), -1);
    return Promise.reject(error);
  }
}
function getUserMedia(constraints) {
  try {
    return navigator.mediaDevices.getUserMedia(constraints);
  } catch (err) {
    var error = new Exception_Exception("getUserMedia is not defined. ".concat(ERROR_DESC), -1);
    return Promise.reject(error);
  }
}
// CONCATENATED MODULE: ./src/input/camera_access.ts


// TODO: when this file was written years ago, HTMLMediaElement.play() did not return a useful value
// to let us know when the video started playing.  Now, it does.  So, we shouldn't need to run this
// odd waitForVideo() function that polls to see if the video has started.



var streamRef;
function waitForVideo(video) {
  return new Promise(function (resolve, reject) {
    var attempts = 10;
    function checkVideo() {
      if (attempts > 0) {
        if (video.videoWidth > 10 && video.videoHeight > 10) {
          if (true) {
            console.log("* dev: checkVideo found ".concat(video.videoWidth, "px x ").concat(video.videoHeight, "px"));
          }
          resolve();
        } else {
          window.setTimeout(checkVideo, 500);
        }
      } else {
        reject(new Exception_Exception('Unable to play video stream. Is webcam working?', -1)); // TODO: add error code
      }

      attempts--;
    }
    checkVideo();
  });
}

/**
 * Tries to attach the camera-stream to a given video-element
 * and calls the callback function when the content is ready
 * @param {Object} constraints
 * @param {Object} video
 */
function initCamera(_x, _x2) {
  return _initCamera.apply(this, arguments);
}
function _initCamera() {
  _initCamera = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee4(video, constraints) {
    var stream;
    return regenerator_default.a.wrap(function _callee4$(_context4) {
      while (1) {
        switch (_context4.prev = _context4.next) {
          case 0:
            _context4.next = 2;
            return getUserMedia(constraints);
          case 2:
            stream = _context4.sent;
            streamRef = stream;
            if (!video) {
              _context4.next = 11;
              break;
            }
            video.setAttribute('autoplay', 'true');
            video.setAttribute('muted', 'true');
            video.setAttribute('playsinline', 'true'); // not listed on MDN...
            // eslint-disable-next-line no-param-reassign
            video.srcObject = stream;
            video.addEventListener('loadedmetadata', function () {
              video.play()["catch"](function (err) {
                console.warn('* Error while trying to play video stream:', err);
              });
            });
            return _context4.abrupt("return", waitForVideo(video));
          case 11:
            return _context4.abrupt("return", Promise.resolve());
          case 12:
          case "end":
            return _context4.stop();
        }
      }
    }, _callee4);
  }));
  return _initCamera.apply(this, arguments);
}
function deprecatedConstraints(videoConstraints) {
  var normalized = pick_default()(videoConstraints, ['width', 'height', 'facingMode', 'aspectRatio', 'deviceId']);
  if (typeof videoConstraints.minAspectRatio !== 'undefined' && videoConstraints.minAspectRatio > 0) {
    normalized.aspectRatio = videoConstraints.minAspectRatio;
    console.log('WARNING: Constraint \'minAspectRatio\' is deprecated; Use \'aspectRatio\' instead');
  }
  if (typeof videoConstraints.facing !== 'undefined') {
    normalized.facingMode = videoConstraints.facing;
    console.log('WARNING: Constraint \'facing\' is deprecated. Use \'facingMode\' instead\'');
  }
  return normalized;
}

// TODO: #192 I don't think there's any good reason pickConstraints should return a Promise,
// I think it was just that way so it could be chained to other functions that did return a Promise.
// That's not necessary with async functions being a thing, so that should be fixed.
function pickConstraints() {
  var videoConstraints = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  var video = deprecatedConstraints(videoConstraints);
  if (video && video.deviceId && video.facingMode) {
    delete video.facingMode;
  }
  return Promise.resolve({
    audio: false,
    video: video
  });
}
function enumerateVideoDevices() {
  return _enumerateVideoDevices.apply(this, arguments);
}
function _enumerateVideoDevices() {
  _enumerateVideoDevices = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee5() {
    var devices;
    return regenerator_default.a.wrap(function _callee5$(_context5) {
      while (1) {
        switch (_context5.prev = _context5.next) {
          case 0:
            _context5.next = 2;
            return enumerateDevices();
          case 2:
            devices = _context5.sent;
            return _context5.abrupt("return", devices.filter(function (device) {
              return device.kind === 'videoinput';
            }));
          case 4:
          case "end":
            return _context5.stop();
        }
      }
    }, _callee5);
  }));
  return _enumerateVideoDevices.apply(this, arguments);
}
function getActiveTrack() {
  if (!streamRef) {
    return null;
  }
  var tracks = streamRef.getVideoTracks();
  return tracks && tracks !== null && tracks !== void 0 && tracks.length ? tracks[0] : null;
}

/**
 * Used for accessing information about the active stream track and available video devices.
 */
var QuaggaJSCameraAccess = {
  requestedVideoElement: null,
  request: function request(video, videoConstraints) {
    return asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee() {
      var newConstraints;
      return regenerator_default.a.wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              QuaggaJSCameraAccess.requestedVideoElement = video;
              _context.next = 3;
              return pickConstraints(videoConstraints);
            case 3:
              newConstraints = _context.sent;
              return _context.abrupt("return", initCamera(video, newConstraints));
            case 5:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }))();
  },
  release: function release() {
    var tracks = streamRef && streamRef.getVideoTracks();
    if (QuaggaJSCameraAccess.requestedVideoElement !== null) {
      QuaggaJSCameraAccess.requestedVideoElement.pause();
    }
    return new Promise(function (resolve) {
      setTimeout(function () {
        if (tracks && tracks.length) {
          tracks.forEach(function (track) {
            return track.stop();
          });
        }
        streamRef = null;
        QuaggaJSCameraAccess.requestedVideoElement = null;
        resolve();
      }, 0);
    });
  },
  enumerateVideoDevices: enumerateVideoDevices,
  getActiveStreamLabel: function getActiveStreamLabel() {
    var track = getActiveTrack();
    return track ? track.label : '';
  },
  getActiveTrack: getActiveTrack,
  disableTorch: function disableTorch() {
    return asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee2() {
      var track;
      return regenerator_default.a.wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              track = getActiveTrack(); // TODO: should we acquire camera access even if there's no current camera open?
              // TODO: what happens on iOS or another device where torch isn't supported at all? Should we throw an error?
              if (!track) {
                _context2.next = 11;
                break;
              }
              _context2.prev = 2;
              _context2.next = 5;
              return track.applyConstraints({
                advanced: [{
                  torch: false
                }]
              });
            case 5:
              _context2.next = 11;
              break;
            case 7:
              _context2.prev = 7;
              _context2.t0 = _context2["catch"](2);
              if (_context2.t0 instanceof OverconstrainedError) {
                console.warn('quagga2/CameraAccess: Torch not supported on this device');
              }
              throw _context2.t0;
            case 11:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2, null, [[2, 7]]);
    }))();
  },
  enableTorch: function enableTorch() {
    return asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee3() {
      var track;
      return regenerator_default.a.wrap(function _callee3$(_context3) {
        while (1) {
          switch (_context3.prev = _context3.next) {
            case 0:
              track = getActiveTrack(); // TODO: should we acquire camera access even if there's no current camera open?
              // TODO: what happens on iOS or another device where torch isn't supported at all? Should we throw an error?
              if (!track) {
                _context3.next = 11;
                break;
              }
              _context3.prev = 2;
              _context3.next = 5;
              return track.applyConstraints({
                advanced: [{
                  torch: true
                }]
              });
            case 5:
              _context3.next = 11;
              break;
            case 7:
              _context3.prev = 7;
              _context3.t0 = _context3["catch"](2);
              if (_context3.t0 instanceof OverconstrainedError) {
                console.warn('quagga2/CameraAccess: Torch not supported on this device');
              }
              throw _context3.t0;
            case 11:
            case "end":
              return _context3.stop();
          }
        }
      }, _callee3, null, [[2, 7]]);
    }))();
  }
};
/* harmony default export */ var camera_access = (QuaggaJSCameraAccess);
// CONCATENATED MODULE: ./src/analytics/result_collector.ts

function contains(codeResult, list) {
  return list && list.some(function (item) {
    var keys = Object.keys(item);
    return keys.every(function (key) {
      return item[key] === codeResult[key];
    });
  });
}
function passesFilter(codeResult, filter) {
  return typeof filter === 'function' ? filter(codeResult) : true;
}
/* harmony default export */ var result_collector = ({
  create: function create(config) {
    var _config$capacity;
    var canvas = document.createElement('canvas');
    var ctx = canvas.getContext('2d', {
      willReadFrequently: !!config.willReadFrequently
    });
    var results = [];
    var capacity = (_config$capacity = config.capacity) !== null && _config$capacity !== void 0 ? _config$capacity : 20;
    var capture = config.capture === true;
    function matchesConstraints(codeResult) {
      return !!capacity && codeResult && !contains(codeResult, config.blacklist) && passesFilter(codeResult, config.filter);
    }
    return {
      addResult: function addResult(data, imageSize, codeResult) {
        var result = {}; // this is 'any' to avoid having to construct a whole QuaggaJSCodeResult :|
        if (matchesConstraints(codeResult)) {
          capacity--;
          result.codeResult = codeResult;
          if (capture) {
            canvas.width = imageSize.x;
            canvas.height = imageSize.y;
            image_debug["a" /* default */].drawImage(data, imageSize, ctx);
            result.frame = canvas.toDataURL();
          }
          results.push(result);
        }
      },
      getResults: function getResults() {
        return results;
      }
    };
  }
});
// CONCATENATED MODULE: ./src/config/config.dev.ts
var DevConfig = {
  inputStream: {
    name: 'Live',
    type: 'LiveStream',
    constraints: {
      width: 640,
      height: 480,
      // aspectRatio: 640/480, // optional
      facingMode: 'environment' // or user
      // deviceId: "38745983457387598375983759834"
    },

    area: {
      top: '0%',
      right: '0%',
      left: '0%',
      bottom: '0%'
    },
    singleChannel: false // true: only the red color-channel is read
  },

  locate: true,
  numOfWorkers: 0,
  decoder: {
    readers: ['code_128_reader'],
    debug: {
      drawBoundingBox: false,
      showFrequency: false,
      drawScanline: false,
      showPattern: false
    }
  },
  locator: {
    halfSample: true,
    patchSize: 'medium',
    // x-small, small, medium, large, x-large
    debug: {
      showCanvas: false,
      showPatches: false,
      showFoundPatches: false,
      showSkeleton: false,
      showLabels: false,
      showPatchLabels: false,
      showRemainingPatchLabels: false,
      boxFromPatches: {
        showTransformed: false,
        showTransformedBox: false,
        showBB: false
      }
    }
  }
};
/* harmony default export */ var config_dev = (DevConfig);
// CONCATENATED MODULE: ./src/config/config.node.ts
var NodeConfig = {
  inputStream: {
    type: 'ImageStream',
    sequence: false,
    size: 800,
    area: {
      top: '0%',
      right: '0%',
      left: '0%',
      bottom: '0%'
    },
    singleChannel: false // true: only the red color-channel is read
  },

  locate: true,
  numOfWorkers: 0,
  decoder: {
    readers: ['code_128_reader']
  },
  locator: {
    halfSample: true,
    patchSize: 'medium' // x-small, small, medium, large, x-large
  }
};

/* harmony default export */ var config_node = (NodeConfig);
// CONCATENATED MODULE: ./src/config/config.prod.ts
var ProdConfig = {
  inputStream: {
    name: 'Live',
    type: 'LiveStream',
    constraints: {
      width: 640,
      height: 480,
      // aspectRatio: 640/480, // optional
      facingMode: 'environment' // or user
      // deviceId: "38745983457387598375983759834"
    },

    area: {
      top: '0%',
      right: '0%',
      left: '0%',
      bottom: '0%'
    },
    singleChannel: false // true: only the red color-channel is read
  },

  locate: true,
  numOfWorkers: 4,
  decoder: {
    readers: ['code_128_reader']
  },
  locator: {
    halfSample: true,
    patchSize: 'medium' // x-small, small, medium, large, x-large
  }
};

/* harmony default export */ var config_prod = (ProdConfig);
// CONCATENATED MODULE: ./src/config/config.ts



var ExportConfig = function () {
  var QuaggaConfig;
  if (true) {
    QuaggaConfig = config_dev;
  } else {}
  return QuaggaConfig;
}();
/* harmony default export */ var config_config = (ExportConfig);
// EXTERNAL MODULE: ./node_modules/gl-matrix/esm/index.js + 4 modules
var esm = __webpack_require__(5);

// EXTERNAL MODULE: ./src/common/cv_utils.js + 1 modules
var cv_utils = __webpack_require__(9);

// CONCATENATED MODULE: ./src/input/frame_grabber_browser.js
// NOTE FOR ANYONE IN HERE IN THE FUTURE:
// webpack.config.js replaces the frame_grabber module with THIS module when it is building for a Browser environment.


var TO_RADIANS = Math.PI / 180;
function adjustCanvasSize(canvas, targetSize) {
  if (canvas.width !== targetSize.x) {
    if (true) {
      console.log('WARNING: canvas-size needs to be adjusted');
    }
    canvas.width = targetSize.x;
  }
  if (canvas.height !== targetSize.y) {
    if (true) {
      console.log('WARNING: canvas-size needs to be adjusted');
    }
    canvas.height = targetSize.y;
  }
}
var FrameGrabber = {};
FrameGrabber.create = function (inputStream, canvas) {
  // console.warn('*** FrameGrabberBrowser create');
  var _that = {};
  var _streamConfig = inputStream.getConfig();
  var _videoSize = Object(cv_utils["h" /* imageRef */])(inputStream.getRealWidth(), inputStream.getRealHeight());
  var _canvasSize = inputStream.getCanvasSize();
  var _size = Object(cv_utils["h" /* imageRef */])(inputStream.getWidth(), inputStream.getHeight());
  var topRight = inputStream.getTopRight();
  var _sx = topRight.x;
  var _sy = topRight.y;
  var _canvas;
  var _ctx = null;
  var _data = null;
  var willReadFrequently = _streamConfig.willReadFrequently;
  _canvas = canvas || document.createElement('canvas');
  _canvas.width = _canvasSize.x;
  _canvas.height = _canvasSize.y;
  console.warn('*** frame_grabber_browser: willReadFrequently=', willReadFrequently, 'canvas=', _canvas);
  _ctx = _canvas.getContext('2d', {
    willReadFrequently: !!willReadFrequently
  }); // double not because we have an optional bool that needs to pass as a bool
  _data = new Uint8Array(_size.x * _size.y);
  if (true) {
    console.log('FrameGrabber', JSON.stringify({
      size: _size,
      topRight: topRight,
      videoSize: _videoSize,
      canvasSize: _canvasSize
    }));
  }

  /**
   * Uses the given array as frame-buffer
   */
  _that.attachData = function (data) {
    _data = data;
  };

  /**
   * Returns the used frame-buffer
   */
  _that.getData = function () {
    return _data;
  };

  /**
   * Fetches a frame from the input-stream and puts into the frame-buffer.
   * The image-data is converted to gray-scale and then half-sampled if configured.
   */
  _that.grab = function () {
    var doHalfSample = _streamConfig.halfSample;
    var frame = inputStream.getFrame();
    var drawable = frame;
    var drawAngle = 0;
    var ctxData;
    if (drawable) {
      adjustCanvasSize(_canvas, _canvasSize);
      if (_streamConfig.type === 'ImageStream') {
        drawable = frame.img;
        if (frame.tags && frame.tags.orientation) {
          switch (frame.tags.orientation) {
            case 6:
              drawAngle = 90 * TO_RADIANS;
              break;
            case 8:
              drawAngle = -90 * TO_RADIANS;
              break;
          }
        }
      }
      if (drawAngle !== 0) {
        _ctx.translate(_canvasSize.x / 2, _canvasSize.y / 2);
        _ctx.rotate(drawAngle);
        _ctx.drawImage(drawable, -_canvasSize.y / 2, -_canvasSize.x / 2, _canvasSize.y, _canvasSize.x);
        _ctx.rotate(-drawAngle);
        _ctx.translate(-_canvasSize.x / 2, -_canvasSize.y / 2);
      } else {
        _ctx.drawImage(drawable, 0, 0, _canvasSize.x, _canvasSize.y);
      }
      ctxData = _ctx.getImageData(_sx, _sy, _size.x, _size.y).data;
      if (doHalfSample) {
        Object(cv_utils["e" /* grayAndHalfSampleFromCanvasData */])(ctxData, _size, _data);
      } else {
        Object(cv_utils["c" /* computeGray */])(ctxData, _data, _streamConfig);
      }
      return true;
    }
    return false;
  };
  _that.getSize = function () {
    return _size;
  };
  return _that;
};
/* harmony default export */ var frame_grabber_browser = (FrameGrabber);
// CONCATENATED MODULE: ./src/input/exif_helper.js
// NOTE: (SOME OF) THIS IS BROWSER ONLY CODE.  Node does not have 'atob' built in, nor XMLHttpRequest.
// How exactly is this set of functions used in Quagga? Do we need the browser specific code? Do we
// need to port any part of this that doesn't work in Node to node?

// Tags scraped from https://github.com/exif-js/exif-js
var ExifTags = {
  0x0112: 'orientation'
};
var AvailableTags = Object.keys(ExifTags).map(function (key) {
  return ExifTags[key];
});
function findTagsInObjectURL(src) {
  var tags = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : AvailableTags;
  if (/^blob:/i.test(src)) {
    return objectURLToBlob(src).then(readToBuffer).then(function (buffer) {
      return findTagsInBuffer(buffer, tags);
    });
  }
  return Promise.resolve(null);
}
function base64ToArrayBuffer(dataUrl) {
  var base64 = dataUrl.replace(/^data:([^;]+);base64,/gmi, '');
  var binary = atob(base64);
  var len = binary.length;
  var buffer = new ArrayBuffer(len);
  var view = new Uint8Array(buffer);
  for (var i = 0; i < len; i++) {
    view[i] = binary.charCodeAt(i);
  }
  return buffer;
}
function readToBuffer(blob) {
  return new Promise(function (resolve) {
    var fileReader = new FileReader();
    fileReader.onload = function (e) {
      return resolve(e.target.result);
    };
    fileReader.readAsArrayBuffer(blob);
  });
}
function objectURLToBlob(url) {
  return new Promise(function (resolve, reject) {
    var http = new XMLHttpRequest();
    http.open('GET', url, true);
    http.responseType = 'blob';
    http.onreadystatechange = function () {
      if (http.readyState === XMLHttpRequest.DONE && (http.status === 200 || http.status === 0)) {
        resolve(this.response);
      }
    };
    http.onerror = reject;
    http.send();
  });
}
function findTagsInBuffer(file) {
  var selectedTags = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : AvailableTags;
  var dataView = new DataView(file);
  var length = file.byteLength;
  var exifTags = selectedTags.reduce(function (result, selectedTag) {
    var exifTag = Object.keys(ExifTags).filter(function (tag) {
      return ExifTags[tag] === selectedTag;
    })[0];
    if (exifTag) {
      result[exifTag] = selectedTag;
    }
    return result;
  }, {});
  var offset = 2;
  var marker;
  if (dataView.getUint8(0) !== 0xFF || dataView.getUint8(1) !== 0xD8) {
    return false;
  }
  while (offset < length) {
    if (dataView.getUint8(offset) !== 0xFF) {
      return false;
    }
    marker = dataView.getUint8(offset + 1);
    if (marker === 0xE1) {
      return readEXIFData(dataView, offset + 4, exifTags);
    }
    offset += 2 + dataView.getUint16(offset + 2);
  }
  return false;
}
function readEXIFData(file, start, exifTags) {
  if (getStringFromBuffer(file, start, 4) !== 'Exif') {
    return false;
  }
  var tiffOffset = start + 6;
  var bigEnd;
  if (file.getUint16(tiffOffset) === 0x4949) {
    bigEnd = false;
  } else if (file.getUint16(tiffOffset) === 0x4D4D) {
    bigEnd = true;
  } else {
    return false;
  }
  if (file.getUint16(tiffOffset + 2, !bigEnd) !== 0x002A) {
    return false;
  }
  var firstIFDOffset = file.getUint32(tiffOffset + 4, !bigEnd);
  if (firstIFDOffset < 0x00000008) {
    return false;
  }
  var tags = readTags(file, tiffOffset, tiffOffset + firstIFDOffset, exifTags, bigEnd);
  return tags;
}
function readTags(file, tiffStart, dirStart, strings, bigEnd) {
  var entries = file.getUint16(dirStart, !bigEnd);
  var tags = {};
  for (var i = 0; i < entries; i++) {
    var entryOffset = dirStart + i * 12 + 2;
    var tag = strings[file.getUint16(entryOffset, !bigEnd)];
    if (tag) {
      tags[tag] = readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd);
    }
  }
  return tags;
}
function readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd) {
  var type = file.getUint16(entryOffset + 2, !bigEnd);
  var numValues = file.getUint32(entryOffset + 4, !bigEnd);
  switch (type) {
    case 3:
      if (numValues === 1) {
        return file.getUint16(entryOffset + 8, !bigEnd);
      }
  }
  return null;
}
function getStringFromBuffer(buffer, start, length) {
  var outstr = '';
  for (var n = start; n < start + length; n++) {
    outstr += String.fromCharCode(buffer.getUint8(n));
  }
  return outstr;
}
// CONCATENATED MODULE: ./src/input/image_loader.js

var ImageLoader = {};
ImageLoader.load = function (directory, callback, offset, size, sequence) {
  var htmlImagesSrcArray = new Array(size);
  var htmlImagesArray = new Array(htmlImagesSrcArray.length);
  var i;
  var img;
  var num;
  if (sequence === false) {
    htmlImagesSrcArray[0] = directory;
  } else {
    for (i = 0; i < htmlImagesSrcArray.length; i++) {
      num = offset + i;
      htmlImagesSrcArray[i] = "".concat(directory, "image-").concat("00".concat(num).slice(-3), ".jpg");
    }
  }
  htmlImagesArray.notLoaded = [];
  htmlImagesArray.addImage = function (image) {
    htmlImagesArray.notLoaded.push(image);
  };
  htmlImagesArray.loaded = function (loadedImg) {
    var notloadedImgs = htmlImagesArray.notLoaded;
    for (var x = 0; x < notloadedImgs.length; x++) {
      if (notloadedImgs[x] === loadedImg) {
        notloadedImgs.splice(x, 1);
        for (var y = 0; y < htmlImagesSrcArray.length; y++) {
          var imgName = htmlImagesSrcArray[y].substr(htmlImagesSrcArray[y].lastIndexOf('/'));
          if (loadedImg.src.lastIndexOf(imgName) !== -1) {
            htmlImagesArray[y] = {
              img: loadedImg
            };
            break;
          }
        }
        break;
      }
    }
    if (notloadedImgs.length === 0) {
      if (true) {
        console.log('Images loaded');
      }
      if (sequence === false) {
        findTagsInObjectURL(directory, ['orientation']).then(function (tags) {
          htmlImagesArray[0].tags = tags;
          callback(htmlImagesArray);
        })["catch"](function (e) {
          console.log(e);
          callback(htmlImagesArray);
        });
      } else {
        callback(htmlImagesArray);
      }
    }
  };
  for (i = 0; i < htmlImagesSrcArray.length; i++) {
    img = new Image();
    htmlImagesArray.addImage(img);
    addOnloadHandler(img, htmlImagesArray);
    img.src = htmlImagesSrcArray[i];
  }
};
function addOnloadHandler(img, htmlImagesArray) {
  img.onload = function () {
    htmlImagesArray.loaded(this);
  };
}
/* harmony default export */ var image_loader = (ImageLoader);
// CONCATENATED MODULE: ./src/input/input_stream/input_stream_browser.ts
/* eslint-disable @typescript-eslint/no-explicit-any */


var inputStreamFactory = {
  createVideoStream: function createVideoStream(video) {
    console.warn('**** InputStreamBrowser createVideoStream');
    var _config = null;
    var _eventNames = ['canrecord', 'ended'];
    var _eventHandlers = {};
    var _calculatedWidth;
    var _calculatedHeight;
    var _topRight = {
      x: 0,
      y: 0,
      type: 'Point'
    };
    var _canvasSize = {
      x: 0,
      y: 0,
      type: 'XYSize'
    };
    function initSize() {
      var _config2, _config3;
      var width = video.videoWidth;
      var height = video.videoHeight;

      // eslint-disable-next-line no-nested-ternary
      _calculatedWidth = (_config2 = _config) !== null && _config2 !== void 0 && _config2.size ? width / height > 1 ? _config.size : Math.floor(width / height * _config.size) : width;
      // eslint-disable-next-line no-nested-ternary
      _calculatedHeight = (_config3 = _config) !== null && _config3 !== void 0 && _config3.size ? width / height > 1 ? Math.floor(height / width * _config.size) : _config.size : height;
      _canvasSize.x = _calculatedWidth;
      _canvasSize.y = _calculatedHeight;
    }
    var inputStream = {
      getRealWidth: function getRealWidth() {
        return video.videoWidth;
      },
      getRealHeight: function getRealHeight() {
        return video.videoHeight;
      },
      getWidth: function getWidth() {
        return _calculatedWidth;
      },
      getHeight: function getHeight() {
        return _calculatedHeight;
      },
      setWidth: function setWidth(width) {
        _calculatedWidth = width;
      },
      setHeight: function setHeight(height) {
        _calculatedHeight = height;
      },
      setInputStream: function setInputStream(config) {
        // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
        _config = config;
        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
        this.setAttribute('src', typeof config.src !== 'undefined' ? config.src : '');
      },
      ended: function ended() {
        return video.ended;
      },
      getConfig: function getConfig() {
        return _config;
      },
      setAttribute: function setAttribute(name, value) {
        if (video) {
          video.setAttribute(name, value);
        }
      },
      pause: function pause() {
        video.pause();
      },
      play: function play() {
        // eslint-disable-next-line @typescript-eslint/no-floating-promises
        video.play();
      },
      setCurrentTime: function setCurrentTime(time) {
        var _config4;
        if (((_config4 = _config) === null || _config4 === void 0 ? void 0 : _config4.type) !== 'LiveStream') {
          this.setAttribute('currentTime', time.toString());
        }
      },
      addEventListener: function addEventListener(event, f, bool) {
        if (_eventNames.indexOf(event) !== -1) {
          if (!_eventHandlers[event]) {
            _eventHandlers[event] = [];
          }
          _eventHandlers[event].push(f);
        } else {
          video.addEventListener(event, f, bool);
        }
      },
      clearEventHandlers: function clearEventHandlers() {
        _eventNames.forEach(function (eventName) {
          var handlers = _eventHandlers[eventName];
          if (handlers && handlers.length > 0) {
            handlers.forEach(function (handler) {
              video.removeEventListener(eventName, handler);
            });
          }
        });
      },
      trigger: function trigger(eventName, args) {
        var j;
        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
        var handlers = _eventHandlers[eventName];
        if (eventName === 'canrecord') {
          initSize();
        }
        if (handlers && handlers.length > 0) {
          for (j = 0; j < handlers.length; j++) {
            handlers[j].apply(inputStream, args);
          }
        }
      },
      setTopRight: function setTopRight(topRight) {
        _topRight.x = topRight.x;
        _topRight.y = topRight.y;
      },
      getTopRight: function getTopRight() {
        return _topRight;
      },
      setCanvasSize: function setCanvasSize(size) {
        _canvasSize.x = size.x;
        _canvasSize.y = size.y;
      },
      getCanvasSize: function getCanvasSize() {
        return _canvasSize;
      },
      getFrame: function getFrame() {
        return video;
      }
    };
    return inputStream;
  },
  createLiveStream: function createLiveStream(video) {
    console.warn('**** InputStreamBrowser createLiveStream');
    if (video) {
      video.setAttribute('autoplay', 'true');
    }
    var that = inputStreamFactory.createVideoStream(video);
    that.ended = function ended() {
      return false;
    };
    return that;
  },
  createImageStream: function createImageStream() {
    // console.warn('**** InputStreamBrowser createImageStream');
    var _config = null;
    var width = 0;
    var height = 0;
    var frameIdx = 0;
    var paused = true;
    var loaded = false;
    var imgArray = null;
    var size = 0;
    var offset = 1;
    var baseUrl = null;
    var _ended = false;
    var calculatedWidth;
    var calculatedHeight;
    var _eventNames = ['canrecord', 'ended'];
    var _eventHandlers = {};
    var _topRight = {
      x: 0,
      y: 0,
      type: 'Point'
    };
    var _canvasSize = {
      x: 0,
      y: 0,
      type: 'XYSize'
    };
    function loadImages() {
      var _config7;
      loaded = false;
      image_loader.load(baseUrl, function (imgs) {
        var _config5, _config6;
        imgArray = imgs;
        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
        if (imgs[0].tags && imgs[0].tags.orientation) {
          // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
          switch (imgs[0].tags.orientation) {
            case 6:
            case 8:
              width = imgs[0].img.height;
              height = imgs[0].img.width;
              break;
            default:
              width = imgs[0].img.width;
              height = imgs[0].img.height;
          }
        } else {
          width = imgs[0].img.width;
          height = imgs[0].img.height;
        }
        // eslint-disable-next-line no-nested-ternary
        calculatedWidth = (_config5 = _config) !== null && _config5 !== void 0 && _config5.size ? width / height > 1 ? _config.size : Math.floor(width / height * _config.size) : width;
        // eslint-disable-next-line no-nested-ternary
        calculatedHeight = (_config6 = _config) !== null && _config6 !== void 0 && _config6.size ? width / height > 1 ? Math.floor(height / width * _config.size) : _config.size : height;
        _canvasSize.x = calculatedWidth;
        _canvasSize.y = calculatedHeight;
        loaded = true;
        frameIdx = 0;
        setTimeout(function () {
          // eslint-disable-next-line @typescript-eslint/no-use-before-define
          publishEvent('canrecord', []);
        }, 0);
      }, offset, size, (_config7 = _config) === null || _config7 === void 0 ? void 0 : _config7.sequence);
    }
    function publishEvent(eventName, args) {
      var j;
      var handlers = _eventHandlers[eventName];
      if (handlers && handlers.length > 0) {
        for (j = 0; j < handlers.length; j++) {
          // eslint-disable-next-line @typescript-eslint/no-use-before-define
          handlers[j].apply(inputStream, args); // TODO: typescript complains that any[] is not valid for a second arg for apply?!
        }
      }
    }

    // TODO: any code shared with the first InputStream above should be shared not copied
    // TODO: publishEvent needs access to inputStream, but inputStream needs access to publishEvent
    // TODO: This is why it's a 'var', so it hoists back.  This is ugly, and should be changed.
    // eslint-disable-next-line no-var,vars-on-top
    var inputStream = {
      trigger: publishEvent,
      getWidth: function getWidth() {
        return calculatedWidth;
      },
      getHeight: function getHeight() {
        return calculatedHeight;
      },
      setWidth: function setWidth(newWidth) {
        calculatedWidth = newWidth;
      },
      setHeight: function setHeight(newHeight) {
        calculatedHeight = newHeight;
      },
      getRealWidth: function getRealWidth() {
        return width;
      },
      getRealHeight: function getRealHeight() {
        return height;
      },
      setInputStream: function setInputStream(stream) {
        // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
        _config = stream;
        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
        if (stream.sequence === false) {
          // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access
          baseUrl = stream.src;
          size = 1;
        } else {
          // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access
          baseUrl = stream.src;
          // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access
          size = stream.length;
        }
        loadImages();
      },
      ended: function ended() {
        return _ended;
      },
      setAttribute: function setAttribute() {},
      getConfig: function getConfig() {
        return _config;
      },
      pause: function pause() {
        paused = true;
      },
      play: function play() {
        paused = false;
      },
      setCurrentTime: function setCurrentTime(time) {
        frameIdx = time;
      },
      addEventListener: function addEventListener(event, f) {
        if (_eventNames.indexOf(event) !== -1) {
          if (!_eventHandlers[event]) {
            _eventHandlers[event] = [];
          }
          _eventHandlers[event].push(f);
        }
      },
      clearEventHandlers: function clearEventHandlers() {
        Object.keys(_eventHandlers).forEach(function (ind) {
          return delete _eventHandlers[ind];
        });
      },
      setTopRight: function setTopRight(topRight) {
        _topRight.x = topRight.x;
        _topRight.y = topRight.y;
      },
      getTopRight: function getTopRight() {
        return _topRight;
      },
      setCanvasSize: function setCanvasSize(canvasSize) {
        _canvasSize.x = canvasSize.x;
        _canvasSize.y = canvasSize.y;
      },
      getCanvasSize: function getCanvasSize() {
        return _canvasSize;
      },
      getFrame: function getFrame() {
        var frame;
        if (!loaded) {
          return null;
        }
        if (!paused) {
          var _imgArray;
          // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
          frame = (_imgArray = imgArray) === null || _imgArray === void 0 ? void 0 : _imgArray[frameIdx];
          if (frameIdx < size - 1) {
            frameIdx++;
          } else {
            setTimeout(function () {
              _ended = true;
              publishEvent('ended', []);
            }, 0);
          }
        }
        // eslint-disable-next-line @typescript-eslint/no-unsafe-return
        return frame;
      }
    };
    return inputStream;
  }
};
/* harmony default export */ var input_stream_browser = (inputStreamFactory);
// EXTERNAL MODULE: ./src/locator/barcode_locator.js
var barcode_locator = __webpack_require__(23);

// CONCATENATED MODULE: ./src/QuaggaContext.ts



var QuaggaContext_QuaggaContext = /*#__PURE__*/createClass_default()(function QuaggaContext() {
  classCallCheck_default()(this, QuaggaContext);
  defineProperty_default()(this, "config", void 0);
  defineProperty_default()(this, "inputStream", void 0);
  defineProperty_default()(this, "framegrabber", void 0);
  defineProperty_default()(this, "inputImageWrapper", void 0);
  defineProperty_default()(this, "stopped", false);
  defineProperty_default()(this, "boxSize", void 0);
  defineProperty_default()(this, "resultCollector", void 0);
  defineProperty_default()(this, "decoder", void 0);
  defineProperty_default()(this, "workerPool", []);
  defineProperty_default()(this, "onUIThread", true);
  defineProperty_default()(this, "canvasContainer", new QuaggaContext_CanvasContainer());
});
var QuaggaContext_CanvasInfo = /*#__PURE__*/createClass_default()(function CanvasInfo() {
  classCallCheck_default()(this, CanvasInfo);
  defineProperty_default()(this, "image", void 0);
  defineProperty_default()(this, "overlay", void 0);
});
var QuaggaContext_CanvasContainer = /*#__PURE__*/createClass_default()(function CanvasContainer() {
  classCallCheck_default()(this, CanvasContainer);
  defineProperty_default()(this, "ctx", void 0);
  defineProperty_default()(this, "dom", void 0);
  this.ctx = new QuaggaContext_CanvasInfo();
  this.dom = new QuaggaContext_CanvasInfo();
});
// CONCATENATED MODULE: ./src/quagga/getViewPort.ts
function getViewPort_getViewPort(target) {
  if (typeof document === 'undefined') {
    return null;
  }

  // Check if target is already a DOM element
  if (target instanceof HTMLElement && target.nodeName && target.nodeType === 1) {
    return target;
  }
  // Use '#interactive.viewport' as a fallback selector (backwards compatibility)
  var selector = typeof target === 'string' ? target : '#interactive.viewport';
  return document.querySelector(selector);
}
// CONCATENATED MODULE: ./src/quagga/initBuffers.ts



esm["a" /* glMatrix */].setMatrixArrayType(Array);

// TODO: need typescript def for BarcodeLocator
function initBuffers_initBuffers(inputStream, imageWrapper, locator) {
  var inputImageWrapper = imageWrapper || new image_wrapper["a" /* default */]({
    x: inputStream.getWidth(),
    y: inputStream.getHeight(),
    type: 'XYSize'
  });
  if (true) {
    console.log("image wrapper size ".concat(inputImageWrapper.size));
  }
  var boxSize = [esm["c" /* vec2 */].clone([0, 0]), esm["c" /* vec2 */].clone([0, inputImageWrapper.size.y]), esm["c" /* vec2 */].clone([inputImageWrapper.size.x, inputImageWrapper.size.y]), esm["c" /* vec2 */].clone([inputImageWrapper.size.x, 0])];
  barcode_locator["a" /* default */].init(inputImageWrapper, locator);
  return {
    inputImageWrapper: inputImageWrapper,
    boxSize: boxSize
  };
}
// CONCATENATED MODULE: ./src/quagga/initCanvas.ts

function findOrCreateCanvas(selector, className) {
  var canvas = document.querySelector(selector);
  if (!canvas) {
    canvas = document.createElement('canvas');
    canvas.className = className;
  }
  return canvas;
}
function getCanvasAndContext(selector, className, options) {
  var canvas = findOrCreateCanvas(selector, className);
  console.warn('* initCanvas getCanvasAndContext');
  var context = canvas.getContext('2d', {
    willReadFrequently: options.willReadFrequently
  });
  return {
    canvas: canvas,
    context: context
  };
}
function initCanvases(canvasSize, _ref) {
  var willReadFrequently = _ref.willReadFrequently;
  if (typeof document !== 'undefined') {
    var image = getCanvasAndContext('canvas.imgBuffer', 'imgBuffer', {
      willReadFrequently: willReadFrequently
    });
    var overlay = getCanvasAndContext('canvas.drawingBuffer', 'drawingBuffer', {
      willReadFrequently: willReadFrequently
    });

    // eslint-disable-next-line no-multi-assign
    image.canvas.width = overlay.canvas.width = canvasSize.x;
    // eslint-disable-next-line no-multi-assign
    image.canvas.height = overlay.canvas.height = canvasSize.y;
    return {
      dom: {
        image: image.canvas,
        overlay: overlay.canvas
      },
      ctx: {
        image: image.context,
        overlay: overlay.context
      }
    };
  }
  return null;
}
function initCanvas_initCanvas(context) {
  var _context$config, _context$config$input, _context$config2, _context$config2$inpu, _context$config3, _context$config3$inpu;
  var viewport = getViewPort_getViewPort(context === null || context === void 0 ? void 0 : (_context$config = context.config) === null || _context$config === void 0 ? void 0 : (_context$config$input = _context$config.inputStream) === null || _context$config$input === void 0 ? void 0 : _context$config$input.target);
  var type = context === null || context === void 0 ? void 0 : (_context$config2 = context.config) === null || _context$config2 === void 0 ? void 0 : (_context$config2$inpu = _context$config2.inputStream) === null || _context$config2$inpu === void 0 ? void 0 : _context$config2$inpu.type;
  if (!type) return null;
  var container = initCanvases(context.inputStream.getCanvasSize(), {
    willReadFrequently: !!(context !== null && context !== void 0 && (_context$config3 = context.config) !== null && _context$config3 !== void 0 && (_context$config3$inpu = _context$config3.inputStream) !== null && _context$config3$inpu !== void 0 && _context$config3$inpu.willReadFrequently)
  });
  if (!container) return {
    dom: {
      image: null,
      overlay: null
    },
    ctx: {
      image: null,
      overlay: null
    }
  };
  var dom = container.dom;
  if (typeof document !== 'undefined') {
    if (viewport) {
      if (type === 'ImageStream' && !viewport.contains(dom.image)) {
        viewport.appendChild(dom.image);
      }
      if (!viewport.contains(dom.overlay)) {
        viewport.appendChild(dom.overlay);
      }
    }
  }
  return container;
}
// CONCATENATED MODULE: ./src/quagga/qworker.ts

function qworker_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function qworker_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? qworker_ownKeys(Object(source), !0).forEach(function (key) { defineProperty_default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : qworker_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
/* Worker functions. These are straight from the original quagga.js file.
 * Not presently used, as worker support is non-functional.  Keeping them around temporarily
 * to refer to until it is re-implemented. We may be able to fix/use some of this.
 */

// TODO: need a typescript interface for FrameGrabber

var workerPool = [];
function updateWorkers(frameGrabber) {
  var availableWorker;
  if (workerPool.length) {
    availableWorker = workerPool.filter(function (workerThread) {
      return !workerThread.busy;
    })[0];
    if (availableWorker) {
      frameGrabber.attachData(availableWorker.imageData);
      if (frameGrabber.grab()) {
        availableWorker.busy = true;
        availableWorker.worker.postMessage({
          cmd: 'process',
          imageData: availableWorker.imageData
        }, [availableWorker.imageData.buffer]);
      }
      return true;
    } else {
      return false;
    }
  }
  return null;
}
function configForWorker(config) {
  return qworker_objectSpread(qworker_objectSpread({}, config), {}, {
    inputStream: qworker_objectSpread(qworker_objectSpread({}, config.inputStream), {}, {
      target: null
    })
  });
}

// @ts-ignore
function workerInterface(factory) {
  if (factory) {
    var Quagga = factory()["default"];
    if (!Quagga) {
      // @ts-ignore
      self.postMessage({
        'event': 'error',
        message: 'Quagga could not be created'
      });
      return;
    }
  }
  // @ts-ignore
  var imageWrapper;

  // @ts-ignore
  function onProcessed(result) {
    self.postMessage({
      'event': 'processed',
      // @ts-ignore
      imageData: imageWrapper.data,
      result: result
      // @ts-ignore
    }, [imageWrapper.data.buffer]);
  }
  function workerInterfaceReady() {
    self.postMessage({
      'event': 'initialized',
      // @ts-ignore
      imageData: imageWrapper.data
      // @ts-ignore
    }, [imageWrapper.data.buffer]);
  }

  // @ts-ignore
  self.onmessage = function (e) {
    if (e.data.cmd === 'init') {
      var config = e.data.config;
      config.numOfWorkers = 0;
      imageWrapper = new Quagga.ImageWrapper({
        x: e.data.size.x,
        y: e.data.size.y
      }, new Uint8Array(e.data.imageData));
      Quagga.init(config, workerInterfaceReady, imageWrapper);
      Quagga.onProcessed(onProcessed);
    } else if (e.data.cmd === 'process') {
      // @ts-ignore
      imageWrapper.data = new Uint8Array(e.data.imageData);
      Quagga.start();
    } else if (e.data.cmd === 'setReaders') {
      Quagga.setReaders(e.data.readers);
    } else if (e.data.cmd === 'registerReader') {
      Quagga.registerReader(e.data.name, e.data.reader);
    }
  };
}
function generateWorkerBlob() {
  var blob, factorySource;

  /* jshint ignore:start */
  // @ts-ignore
  if (typeof __factorySource__ !== 'undefined') {
    // @ts-ignore
    factorySource = __factorySource__; // eslint-disable-line no-undef
  }
  /* jshint ignore:end */

  blob = new Blob(['(' + workerInterface.toString() + ')(' + factorySource + ');'], {
    type: 'text/javascript'
  });
  return window.URL.createObjectURL(blob);
}
function initWorker(config, inputStream, cb) {
  var blobURL = generateWorkerBlob();
  var worker = new Worker(blobURL);
  var workerThread = {
    worker: worker,
    imageData: new Uint8Array(inputStream.getWidth() * inputStream.getHeight()),
    busy: true
  };
  workerThread.worker.onmessage = function (e) {
    if (e.data.event === 'initialized') {
      URL.revokeObjectURL(blobURL);
      workerThread.busy = false;
      workerThread.imageData = new Uint8Array(e.data.imageData);
      if (true) {
        console.log('Worker initialized');
      }
      cb(workerThread);
    } else if (e.data.event === 'processed') {
      workerThread.imageData = new Uint8Array(e.data.imageData);
      workerThread.busy = false;
      // TODO: how to thread publishResult into here?
      // publishResult(e.data.result, workerThread.imageData);
    } else if (e.data.event === 'error') {
      if (true) {
        console.log('Worker error: ' + e.data.message);
      }
    }
  };
  workerThread.worker.postMessage({
    cmd: 'init',
    size: {
      x: inputStream.getWidth(),
      y: inputStream.getHeight()
    },
    imageData: workerThread.imageData,
    config: configForWorker(config)
  }, [workerThread.imageData.buffer]);
}
function adjustWorkerPool(capacity, config, inputStream, cb) {
  var increaseBy = capacity - workerPool.length;
  if (increaseBy === 0 && cb) {
    cb();
  } else if (increaseBy < 0) {
    var workersToTerminate = workerPool.slice(increaseBy);
    workersToTerminate.forEach(function (workerThread) {
      workerThread.worker.terminate();
      if (true) {
        console.log('Worker terminated!');
      }
    });
    workerPool = workerPool.slice(0, increaseBy);
    if (cb) {
      cb();
    }
  } else {
    var workerInitialized = function workerInitialized(workerThread) {
      workerPool.push(workerThread);
      if (workerPool.length >= capacity && cb) {
        cb();
      }
    };
    if (config) {
      for (var i = 0; i < increaseBy; i++) {
        initWorker(config, inputStream, workerInitialized);
      }
    }
  }
}
function qworker_setReaders(readers) {
  workerPool.forEach(function (workerThread) {
    return workerThread.worker.postMessage({
      cmd: 'setReaders',
      readers: readers
    });
  });
}
function qworker_registerReader(name, reader) {
  workerPool.forEach(function (workerThread) {
    return workerThread.worker.postMessage({
      cmd: 'registerReader',
      name: name,
      reader: reader
    });
  });
}
// CONCATENATED MODULE: ./src/quagga/setupInputStream.ts
// TODO: need to create an InputStream typescript interface, so we don't have an "any" in the next line
function setupInputStream() {
  var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'LiveStream';
  var viewport = arguments.length > 1 ? arguments[1] : undefined;
  var inputStreamFactory = arguments.length > 2 ? arguments[2] : undefined;
  switch (type) {
    case 'VideoStream':
      {
        var video = document.createElement('video');
        return {
          video: video,
          inputStream: inputStreamFactory.createVideoStream(video)
        };
      }
    case 'ImageStream':
      return {
        inputStream: inputStreamFactory.createImageStream()
      };
    case 'LiveStream':
      {
        var _video = null;
        if (viewport) {
          _video = viewport.querySelector('video');
          if (!_video) {
            _video = document.createElement('video');
            viewport.appendChild(_video);
          }
        }
        return {
          video: _video,
          inputStream: inputStreamFactory.createLiveStream(_video)
        };
      }
    default:
      console.error("* setupInputStream invalid type ".concat(type));
      return {
        video: null,
        inputStream: null
      };
  }
}
// CONCATENATED MODULE: ./src/quagga/transform.ts
/* eslint-disable no-param-reassign */

function moveBox(box, xOffset, yOffset) {
  var corner = box.length;
  while (corner--) {
    box[corner][0] += xOffset;
    box[corner][1] += yOffset;
  }
}
function moveLine(line, xOffset, yOffset) {
  line[0].x += xOffset;
  line[0].y += yOffset;
  line[1].x += xOffset;
  line[1].y += yOffset;
}
// CONCATENATED MODULE: ./src/quagga/quagga.ts



















esm["a" /* glMatrix */].setMatrixArrayType(Array);
var quagga_Quagga = /*#__PURE__*/function () {
  function Quagga() {
    var _this = this;
    classCallCheck_default()(this, Quagga);
    defineProperty_default()(this, "context", new QuaggaContext_QuaggaContext());
    defineProperty_default()(this, "canRecord", function (callback) {
      var _this$context$config;
      if (!_this.context.config) {
        return;
      }
      barcode_locator["a" /* default */].checkImageConstraints(_this.context.inputStream, (_this$context$config = _this.context.config) === null || _this$context$config === void 0 ? void 0 : _this$context$config.locator);
      _this.initCanvas();
      _this.context.framegrabber = frame_grabber_browser.create(_this.context.inputStream, _this.context.canvasContainer.dom.image);
      if (_this.context.config.numOfWorkers === undefined) {
        _this.context.config.numOfWorkers = 0;
      }
      adjustWorkerPool(_this.context.config.numOfWorkers, _this.context.config, _this.context.inputStream, function () {
        var _this$context$config2;
        if (((_this$context$config2 = _this.context.config) === null || _this$context$config2 === void 0 ? void 0 : _this$context$config2.numOfWorkers) === 0) {
          _this.initializeData();
        }
        _this.ready(callback);
      });
    });
    defineProperty_default()(this, "update", function () {
      if (_this.context.onUIThread) {
        var workersUpdated = updateWorkers(_this.context.framegrabber);
        if (!workersUpdated) {
          var _this$context$inputIm;
          _this.context.framegrabber.attachData((_this$context$inputIm = _this.context.inputImageWrapper) === null || _this$context$inputIm === void 0 ? void 0 : _this$context$inputIm.data);
          if (_this.context.framegrabber.grab()) {
            if (!workersUpdated) {
              _this.locateAndDecode();
            }
          }
        }
      } else {
        var _this$context$inputIm2;
        _this.context.framegrabber.attachData((_this$context$inputIm2 = _this.context.inputImageWrapper) === null || _this$context$inputIm2 === void 0 ? void 0 : _this$context$inputIm2.data);
        _this.context.framegrabber.grab();
        _this.locateAndDecode();
      }
    });
  }
  createClass_default()(Quagga, [{
    key: "initBuffers",
    value: function initBuffers(imageWrapper) {
      if (!this.context.config) {
        return;
      }
      var _initBuffers2 = initBuffers_initBuffers(this.context.inputStream, imageWrapper, this.context.config.locator),
        inputImageWrapper = _initBuffers2.inputImageWrapper,
        boxSize = _initBuffers2.boxSize;
      this.context.inputImageWrapper = inputImageWrapper;
      this.context.boxSize = boxSize;
    }
  }, {
    key: "initializeData",
    value: function initializeData(imageWrapper) {
      if (!this.context.config) {
        return;
      }
      this.initBuffers(imageWrapper);
      this.context.decoder = barcode_decoder.create(this.context.config.decoder, this.context.inputImageWrapper);
    }
  }, {
    key: "getViewPort",
    value: function getViewPort() {
      if (!this.context.config || !this.context.config.inputStream) {
        return null;
      }
      var target = this.context.config.inputStream.target;
      return getViewPort_getViewPort(target);
    }
  }, {
    key: "ready",
    value: function ready(callback) {
      this.context.inputStream.play();
      callback();
    }
  }, {
    key: "initCanvas",
    value: function initCanvas() {
      var container = initCanvas_initCanvas(this.context);
      if (!container) {
        return;
      }
      var ctx = container.ctx,
        dom = container.dom;
      this.context.canvasContainer.dom.image = dom.image;
      this.context.canvasContainer.dom.overlay = dom.overlay;
      this.context.canvasContainer.ctx.image = ctx.image;
      this.context.canvasContainer.ctx.overlay = ctx.overlay;
    }
  }, {
    key: "initInputStream",
    value: function initInputStream(callback) {
      if (!this.context.config || !this.context.config.inputStream) {
        return;
      }
      var _this$context$config$ = this.context.config.inputStream,
        inputType = _this$context$config$.type,
        constraints = _this$context$config$.constraints;
      var _setupInputStream = setupInputStream(inputType, this.getViewPort(), input_stream_browser),
        video = _setupInputStream.video,
        inputStream = _setupInputStream.inputStream;
      if (inputType === 'LiveStream' && video) {
        camera_access.request(video, constraints).then(function () {
          return inputStream.trigger('canrecord');
        })["catch"](function (err) {
          return callback(err);
        });
      }
      if (inputStream) {
        inputStream.setAttribute('preload', 'auto');
        inputStream.setInputStream(this.context.config.inputStream);
        inputStream.addEventListener('canrecord', this.canRecord.bind(undefined, callback));
      }
      this.context.inputStream = inputStream;
    }
  }, {
    key: "getBoundingBoxes",
    value: function getBoundingBoxes() {
      var _this$context$config3;
      return (_this$context$config3 = this.context.config) !== null && _this$context$config3 !== void 0 && _this$context$config3.locate ? barcode_locator["a" /* default */].locate() : [[esm["c" /* vec2 */].clone(this.context.boxSize[0]), esm["c" /* vec2 */].clone(this.context.boxSize[1]), esm["c" /* vec2 */].clone(this.context.boxSize[2]), esm["c" /* vec2 */].clone(this.context.boxSize[3])]];
    }

    // TODO: need a typescript type for result here.
    // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
  }, {
    key: "transformResult",
    value: function transformResult(result) {
      var _this2 = this;
      var topRight = this.context.inputStream.getTopRight();
      var xOffset = topRight.x;
      var yOffset = topRight.y;
      if (xOffset === 0 && yOffset === 0) {
        return;
      }
      if (result.barcodes) {
        // TODO: BarcodeInfo may not be the right type here.
        result.barcodes.forEach(function (barcode) {
          return _this2.transformResult(barcode);
        });
      }
      if (result.line && result.line.length === 2) {
        moveLine(result.line, xOffset, yOffset);
      }
      if (result.box) {
        moveBox(result.box, xOffset, yOffset);
      }
      if (result.boxes && result.boxes.length > 0) {
        for (var i = 0; i < result.boxes.length; i++) {
          moveBox(result.boxes[i], xOffset, yOffset);
        }
      }
    }
  }, {
    key: "addResult",
    value: function addResult(result, imageData) {
      var _this3 = this;
      if (!imageData || !this.context.resultCollector) {
        return;
      }

      // TODO: Figure out what data structure holds a "barcodes" result, if any...
      if (result.barcodes) {
        result.barcodes.filter(function (barcode) {
          return barcode.codeResult;
        }).forEach(function (barcode) {
          return _this3.addResult(barcode, imageData);
        });
      } else if (result.codeResult) {
        this.context.resultCollector.addResult(imageData, this.context.inputStream.getCanvasSize(), result.codeResult);
      }
    }

    // eslint-disable-next-line class-methods-use-this
  }, {
    key: "hasCodeResult",
    value: function hasCodeResult(result) {
      return !!(result && (result.barcodes ? result.barcodes.some(function (barcode) {
        return barcode.codeResult;
      }) : result.codeResult));
    }

    // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
  }, {
    key: "publishResult",
    value: function publishResult() {
      var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
      var imageData = arguments.length > 1 ? arguments[1] : undefined;
      var resultToPublish = result;
      if (result && this.context.onUIThread) {
        this.transformResult(result);
        this.addResult(result, imageData);
        resultToPublish = result.barcodes || result;
      }
      events.publish('processed', resultToPublish);
      if (this.hasCodeResult(result)) {
        events.publish('detected', resultToPublish);
      }
    }
  }, {
    key: "locateAndDecode",
    value: function () {
      var _locateAndDecode = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee() {
        var boxes, _this$context$inputIm3, decodeResult, imageResult, _this$context$inputIm4;
        return regenerator_default.a.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                boxes = this.getBoundingBoxes();
                if (!boxes) {
                  _context.next = 12;
                  break;
                }
                _context.next = 4;
                return this.context.decoder.decodeFromBoundingBoxes(boxes);
              case 4:
                _context.t0 = _context.sent;
                if (_context.t0) {
                  _context.next = 7;
                  break;
                }
                _context.t0 = {};
              case 7:
                decodeResult = _context.t0;
                decodeResult.boxes = boxes;
                this.publishResult(decodeResult, (_this$context$inputIm3 = this.context.inputImageWrapper) === null || _this$context$inputIm3 === void 0 ? void 0 : _this$context$inputIm3.data);
                _context.next = 16;
                break;
              case 12:
                _context.next = 14;
                return this.context.decoder.decodeFromImage(this.context.inputImageWrapper);
              case 14:
                imageResult = _context.sent;
                if (imageResult) {
                  this.publishResult(imageResult, (_this$context$inputIm4 = this.context.inputImageWrapper) === null || _this$context$inputIm4 === void 0 ? void 0 : _this$context$inputIm4.data);
                } else {
                  this.publishResult();
                }
              case 16:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));
      function locateAndDecode() {
        return _locateAndDecode.apply(this, arguments);
      }
      return locateAndDecode;
    }()
  }, {
    key: "startContinuousUpdate",
    value: function startContinuousUpdate() {
      var _this$context$config4,
        _this4 = this;
      var next = null;
      var delay = 1000 / (((_this$context$config4 = this.context.config) === null || _this$context$config4 === void 0 ? void 0 : _this$context$config4.frequency) || 60);
      this.context.stopped = false;
      var context = this.context;
      var newFrame = function newFrame(timestamp) {
        next = next || timestamp;
        if (!context.stopped) {
          if (timestamp >= next) {
            next += delay;
            _this4.update();
          }
          window.requestAnimationFrame(newFrame);
        }
      };
      newFrame(performance.now());
    }
  }, {
    key: "start",
    value: function start() {
      var _this$context$config5, _this$context$config6;
      if (this.context.onUIThread && ((_this$context$config5 = this.context.config) === null || _this$context$config5 === void 0 ? void 0 : (_this$context$config6 = _this$context$config5.inputStream) === null || _this$context$config6 === void 0 ? void 0 : _this$context$config6.type) === 'LiveStream') {
        this.startContinuousUpdate();
      } else {
        this.update();
      }
    }
  }, {
    key: "stop",
    value: function () {
      var _stop = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee2() {
        var _this$context$config7;
        return regenerator_default.a.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                this.context.stopped = true;
                adjustWorkerPool(0);
                if (!((_this$context$config7 = this.context.config) !== null && _this$context$config7 !== void 0 && _this$context$config7.inputStream && this.context.config.inputStream.type === 'LiveStream')) {
                  _context2.next = 6;
                  break;
                }
                _context2.next = 5;
                return camera_access.release();
              case 5:
                this.context.inputStream.clearEventHandlers();
              case 6:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));
      function stop() {
        return _stop.apply(this, arguments);
      }
      return stop;
    }()
  }, {
    key: "setReaders",
    value: function setReaders(readers) {
      if (this.context.decoder) {
        this.context.decoder.setReaders(readers);
      }
      qworker_setReaders(readers);
    }
  }, {
    key: "registerReader",
    value: function registerReader(name, reader) {
      barcode_decoder.registerReader(name, reader);
      if (this.context.decoder) {
        this.context.decoder.registerReader(name, reader);
      }
      qworker_registerReader(name, reader);
    }
  }]);
  return Quagga;
}();

// CONCATENATED MODULE: ./src/quagga.js


 // eslint-disable-line no-unused-vars









var instance = new quagga_Quagga();
var _context = instance.context;
var QuaggaJSStaticInterface = {
  init: function init(config, cb, imageWrapper) {
    var quaggaInstance = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : instance;
    var promise;
    if (!cb) {
      promise = new Promise(function (resolve, reject) {
        cb = function cb(err) {
          err ? reject(err) : resolve();
        };
      });
    }
    quaggaInstance.context.config = merge_default()({}, config_config, config);
    // TODO #179: pending restructure in Issue #179, we are temp disabling workers
    if (quaggaInstance.context.config.numOfWorkers > 0) {
      quaggaInstance.context.config.numOfWorkers = 0;
    }
    if (imageWrapper) {
      quaggaInstance.context.onUIThread = false;
      quaggaInstance.initializeData(imageWrapper);
      if (cb) {
        cb();
      }
    } else {
      quaggaInstance.initInputStream(cb);
    }
    return promise;
  },
  start: function start() {
    return instance.start();
  },
  stop: function stop() {
    return instance.stop();
  },
  pause: function pause() {
    _context.stopped = true;
  },
  onDetected: function onDetected(callback) {
    if (!callback || typeof callback !== 'function' && (typeof_default()(callback) !== 'object' || !callback.callback)) {
      console.trace('* warning: Quagga.onDetected called with invalid callback, ignoring');
      return;
    }
    events.subscribe('detected', callback);
  },
  offDetected: function offDetected(callback) {
    events.unsubscribe('detected', callback);
  },
  onProcessed: function onProcessed(callback) {
    if (!callback || typeof callback !== 'function' && (typeof_default()(callback) !== 'object' || !callback.callback)) {
      console.trace('* warning: Quagga.onProcessed called with invalid callback, ignoring');
      return;
    }
    events.subscribe('processed', callback);
  },
  offProcessed: function offProcessed(callback) {
    events.unsubscribe('processed', callback);
  },
  setReaders: function setReaders(readers) {
    if (!readers) {
      console.trace('* warning: Quagga.setReaders called with no readers, ignoring');
      return;
    }
    instance.setReaders(readers);
  },
  registerReader: function registerReader(name, reader) {
    if (!name) {
      console.trace('* warning: Quagga.registerReader called with no name, ignoring');
      return;
    }
    if (!reader) {
      console.trace('* warning: Quagga.registerReader called with no reader, ignoring');
      return;
    }
    instance.registerReader(name, reader);
  },
  registerResultCollector: function registerResultCollector(resultCollector) {
    if (resultCollector && typeof resultCollector.addResult === 'function') {
      _context.resultCollector = resultCollector;
    }
  },
  get canvas() {
    return _context.canvasContainer;
  },
  decodeSingle: function decodeSingle(config, resultCallback) {
    var _this = this;
    var quaggaInstance = new quagga_Quagga();
    config = merge_default()({
      inputStream: {
        type: 'ImageStream',
        sequence: false,
        size: 800,
        src: config.src
      },
      numOfWorkers:  true && config.debug ? 0 : 1,
      locator: {
        halfSample: false
      }
    }, config);
    // TODO #175: restructure worker support so that it will work with typescript using worker-loader
    // https://webpack.js.org/loaders/worker-loader/
    if (config.numOfWorkers > 0) {
      config.numOfWorkers = 0;
    }
    // workers require Worker and Blob support presently, so if no Blob or Worker then set
    // workers to 0.
    if (config.numOfWorkers > 0 && (typeof Blob === 'undefined' || typeof Worker === 'undefined')) {
      console.warn('* no Worker and/or Blob support - forcing numOfWorkers to 0');
      config.numOfWorkers = 0;
    }
    return new Promise(function (resolve, reject) {
      try {
        _this.init(config, function () {
          events.once('processed', function (result) {
            quaggaInstance.stop();
            if (resultCallback) {
              resultCallback.call(null, result);
            }
            resolve(result);
          }, true);
          quaggaInstance.start();
        }, null, quaggaInstance);
      } catch (err) {
        reject(err);
      }
    });
  },
  // add the usually expected "default" for use with require, build step won't allow us to
  // write to module.exports so do it here.
  get default() {
    return QuaggaJSStaticInterface;
  },
  Readers: reader_namespaceObject,
  CameraAccess: camera_access,
  ImageDebug: image_debug["a" /* default */],
  ImageWrapper: image_wrapper["a" /* default */],
  ResultCollector: result_collector
};
/* harmony default export */ var quagga = __webpack_exports__["default"] = (QuaggaJSStaticInterface);
// export BarcodeReader and other utilities for external plugins


/***/ })
/******/ ])["default"];
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9RdWFnZ2Evd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1F1YWdnYS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2suanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vY29tbW9uLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL21hdDIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vdmVjMi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMzLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL2luZGV4LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb21tb24vY2x1c3Rlci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29tbW9uL2N2X3V0aWxzLmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb21tb24vaW1hZ2VfZGVidWcudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbW1vbi9hcnJheV9oZWxwZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbW1vbi9pbWFnZV93cmFwcGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21lcmdlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdExpa2UuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2xvY2F0b3IvdHJhY2VyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2xvY2F0b3IvYmFyY29kZV9sb2NhdG9yLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX0xpc3RDYWNoZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NvY0luZGV4T2YuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9lcS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlQ3JlYXRlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE1hcERhdGEuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FyZ3VtZW50cy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0luZGV4LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nhc3RQYXRoLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE5hdGl2ZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUFzc2lnblZhbHVlLmpzIiwid2VicGFjazovL1F1YWdnYS8od2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzTGVuZ3RoLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTeW1ib2wuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9LZXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZyZWVHbG9iYWwuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXBDYWNoZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NpZ25NZXJnZVZhbHVlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFByb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc1Byb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQnVmZmVyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NhZmVHZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzaWduVmFsdWUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzSW4uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vdmVyUmVzdC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheUxpa2VUb0FycmF5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9waWNrLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBOYXRpdmVTdXBlci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvbG9jYXRvci9yYXN0ZXJpemVyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9sb2NhdG9yL3NrZWxldG9uaXplci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWVyZ2UuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU3RhY2suanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlRGVsZXRlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUdldC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlU2V0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tEZWxldGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tHZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tIYXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tTZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmF0aXZlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc01hc2tlZC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3JlSnNEYXRhLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RvU291cmNlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFZhbHVlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fSGFzaC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaERlbGV0ZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoR2V0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hIYXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaFNldC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZURlbGV0ZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0tleWFibGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVHZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVTZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZvci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVCYXNlRm9yLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNZXJnZURlZXAuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVUeXBlZEFycmF5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lQXJyYXlCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fVWludDhBcnJheS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5QXJyYXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lT2JqZWN0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZU9iamVjdC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJGYWxzZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5hcnkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbm9kZVV0aWwuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b1BsYWluT2JqZWN0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlPYmplY3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlMaWtlS2V5cy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVGltZXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUtleXNJbi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQXNzaWduZXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJlc3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXBwbHkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNldFRvU3RyaW5nLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2hvcnRPdXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJdGVyYXRlZUNhbGwuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbW1vbi90eXBlZGVmcy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheVdpdGhIb2xlcy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVJlc3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvcmVnZW5lcmF0b3JSdW50aW1lLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3N1cGVyUHJvcEJhc2UuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRob3V0SG9sZXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXRlcmFibGVUb0FycmF5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlU3ByZWFkLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQaWNrLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQaWNrQnkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0tleS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdUb1BhdGguanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWVtb2l6ZUNhcHBlZC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21lbW9pemUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b1N0cmluZy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlNYXAuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNldC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2hhc0luLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VIYXNJbi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNQYXRoLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZsYXRSZXN0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmxhdHRlbi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmxhdHRlbi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVB1c2guanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNGbGF0dGVuYWJsZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pc05hdGl2ZUZ1bmN0aW9uLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NvbnN0cnVjdC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9iYXJjb2RlX3JlYWRlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcmVhZGVyLzJvZjVfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvY29kYWJhcl9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9jb2RlXzEyOF9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9jb2RlXzM5X3JlYWRlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcmVhZGVyL2NvZGVfMzJfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvY29kZV8zOV92aW5fcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvY29kZV85M19yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9lYW5fcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvZWFuXzJfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvZWFuXzVfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvZWFuXzhfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvaTJvZjVfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvdXBjX2VfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvdXBjX3JlYWRlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvZGVjb2Rlci9icmVzZW5oYW0uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2RlY29kZXIvYmFyY29kZV9kZWNvZGVyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbW1vbi9ldmVudHMudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3F1YWdnYS9FeGNlcHRpb24udHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbW1vbi9tZWRpYURldmljZXMudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2lucHV0L2NhbWVyYV9hY2Nlc3MudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2FuYWx5dGljcy9yZXN1bHRfY29sbGVjdG9yLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb25maWcvY29uZmlnLmRldi50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29uZmlnL2NvbmZpZy5ub2RlLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb25maWcvY29uZmlnLnByb2QudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbmZpZy9jb25maWcudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2lucHV0L2ZyYW1lX2dyYWJiZXJfYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvaW5wdXQvZXhpZl9oZWxwZXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2lucHV0L2ltYWdlX2xvYWRlci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvaW5wdXQvaW5wdXRfc3RyZWFtL2lucHV0X3N0cmVhbV9icm93c2VyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9RdWFnZ2FDb250ZXh0LnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9xdWFnZ2EvZ2V0Vmlld1BvcnQudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3F1YWdnYS9pbml0QnVmZmVycy50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcXVhZ2dhL2luaXRDYW52YXMudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3F1YWdnYS9xd29ya2VyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9xdWFnZ2Evc2V0dXBJbnB1dFN0cmVhbS50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcXVhZ2dhL3RyYW5zZm9ybS50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcXVhZ2dhL3F1YWdnYS50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcXVhZ2dhLmpzIl0sIm5hbWVzIjpbIl9kZWZpbmVQcm9wZXJ0eSIsIm9iaiIsImtleSIsInZhbHVlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJtb2R1bGUiLCJleHBvcnRzIiwiX19lc01vZHVsZSIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfZ2V0UHJvdG90eXBlT2YiLCJvIiwic2V0UHJvdG90eXBlT2YiLCJnZXRQcm90b3R5cGVPZiIsImJpbmQiLCJfX3Byb3RvX18iLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX2RlZmluZVByb3BlcnRpZXMiLCJ0YXJnZXQiLCJwcm9wcyIsImkiLCJsZW5ndGgiLCJkZXNjcmlwdG9yIiwiX2NyZWF0ZUNsYXNzIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwicHJvdG90eXBlIiwiRVBTSUxPTiIsIkFSUkFZX1RZUEUiLCJGbG9hdDMyQXJyYXkiLCJBcnJheSIsIlJBTkRPTSIsIk1hdGgiLCJyYW5kb20iLCJzZXRNYXRyaXhBcnJheVR5cGUiLCJ0eXBlIiwiZGVncmVlIiwiUEkiLCJ0b1JhZGlhbiIsImEiLCJlcXVhbHMiLCJiIiwiYWJzIiwibWF4IiwiaHlwb3QiLCJ5IiwiYXJndW1lbnRzIiwic3FydCIsImNyZWF0ZSIsIm91dCIsImdsTWF0cml4IiwiY2xvbmUiLCJjb3B5IiwiaWRlbnRpdHkiLCJmcm9tVmFsdWVzIiwibTAwIiwibTAxIiwibTEwIiwibTExIiwic2V0IiwidHJhbnNwb3NlIiwiYTEiLCJpbnZlcnQiLCJhMCIsImEyIiwiYTMiLCJkZXQiLCJhZGpvaW50IiwiZGV0ZXJtaW5hbnQiLCJtdWx0aXBseSIsImIwIiwiYjEiLCJiMiIsImIzIiwicm90YXRlIiwicmFkIiwicyIsInNpbiIsImMiLCJjb3MiLCJzY2FsZSIsInYiLCJ2MCIsInYxIiwiZnJvbVJvdGF0aW9uIiwiZnJvbVNjYWxpbmciLCJzdHIiLCJmcm9iIiwiTERVIiwiTCIsIkQiLCJVIiwiYWRkIiwic3VidHJhY3QiLCJleGFjdEVxdWFscyIsIm11bHRpcGx5U2NhbGFyIiwibXVsdGlwbHlTY2FsYXJBbmRBZGQiLCJtdWwiLCJzdWIiLCJ4IiwiZGl2aWRlIiwiY2VpbCIsImZsb29yIiwibWluIiwicm91bmQiLCJzY2FsZUFuZEFkZCIsImRpc3RhbmNlIiwic3F1YXJlZERpc3RhbmNlIiwic3F1YXJlZExlbmd0aCIsIm5lZ2F0ZSIsImludmVyc2UiLCJub3JtYWxpemUiLCJsZW4iLCJkb3QiLCJjcm9zcyIsInoiLCJsZXJwIiwidCIsImF4IiwiYXkiLCJyIiwidHJhbnNmb3JtTWF0MiIsIm0iLCJ0cmFuc2Zvcm1NYXQyZCIsInRyYW5zZm9ybU1hdDMiLCJ0cmFuc2Zvcm1NYXQ0IiwicDAiLCJwMSIsInNpbkMiLCJjb3NDIiwiYW5nbGUiLCJ4MSIsInkxIiwieDIiLCJ5MiIsIm1hZyIsImNvc2luZSIsImFjb3MiLCJ6ZXJvIiwiZGl2IiwiZGlzdCIsInNxckRpc3QiLCJzcXJMZW4iLCJmb3JFYWNoIiwidmVjIiwic3RyaWRlIiwib2Zmc2V0IiwiY291bnQiLCJmbiIsImFyZyIsImwiLCJheiIsImJ4IiwiYnkiLCJieiIsImhlcm1pdGUiLCJkIiwiZmFjdG9yVGltZXMyIiwiZmFjdG9yMSIsImZhY3RvcjIiLCJmYWN0b3IzIiwiZmFjdG9yNCIsImJlemllciIsImludmVyc2VGYWN0b3IiLCJpbnZlcnNlRmFjdG9yVGltZXNUd28iLCJ6U2NhbGUiLCJ3IiwidHJhbnNmb3JtUXVhdCIsInEiLCJxeCIsInF5IiwicXoiLCJxdyIsInV2eCIsInV2eSIsInV2eiIsInV1dngiLCJ1dXZ5IiwidXV2eiIsIncyIiwicm90YXRlWCIsInAiLCJyb3RhdGVZIiwicm90YXRlWiIsIm1hZzEiLCJtYWcyIiwiX3R5cGVvZiIsInJlcXVpcmUiLCJhc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsImNhbGwiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjb25zdHJ1Y3RvciIsInJ1bnRpbWUiLCJyZWdlbmVyYXRvclJ1bnRpbWUiLCJhY2NpZGVudGFsU3RyaWN0TW9kZSIsImdsb2JhbFRoaXMiLCJGdW5jdGlvbiIsInBvaW50IiwidGhyZXNob2xkIiwicG9pbnRzIiwiY2VudGVyIiwidmVjMiIsInBvaW50TWFwIiwicG9pbnRUb0FkZCIsImlkIiwicHVzaCIsInVwZGF0ZUNlbnRlciIsInN1bSIsImluaXQiLCJmaXRzIiwib3RoZXJQb2ludCIsInNpbWlsYXJpdHkiLCJnZXRQb2ludHMiLCJnZXRDZW50ZXIiLCJjcmVhdGVQb2ludCIsIm5ld1BvaW50IiwicHJvcGVydHkiLCJpbWFnZVJlZiIsInRoYXQiLCJ0b1ZlYzIiLCJ0b1ZlYzMiLCJ2ZWMzIiwiY29tcHV0ZUludGVncmFsSW1hZ2UyIiwiaW1hZ2VXcmFwcGVyIiwiaW50ZWdyYWxXcmFwcGVyIiwiaW1hZ2VEYXRhIiwiZGF0YSIsIndpZHRoIiwic2l6ZSIsImhlaWdodCIsImludGVncmFsSW1hZ2VEYXRhIiwicG9zQSIsInBvc0IiLCJwb3NDIiwicG9zRCIsImNvbXB1dGVJbnRlZ3JhbEltYWdlIiwidSIsInRocmVzaG9sZEltYWdlIiwidGFyZ2V0V3JhcHBlciIsInRhcmdldERhdGEiLCJjb21wdXRlSGlzdG9ncmFtIiwiYml0c1BlclBpeGVsIiwiYml0U2hpZnQiLCJidWNrZXRDbnQiLCJoaXN0IiwiSW50MzJBcnJheSIsInNoYXJwZW5MaW5lIiwibGluZSIsImxlZnQiLCJyaWdodCIsImRldGVybWluZU90c3VUaHJlc2hvbGQiLCJweCIsImVuZCIsIm14IiwiZGV0ZXJtaW5lVGhyZXNob2xkIiwidmV0IiwicDIiLCJwMTIiLCJtMSIsIm0yIiwibTEyIiwiayIsIkFycmF5SGVscGVyIiwibWF4SW5kZXgiLCJvdHN1VGhyZXNob2xkIiwiY29tcHV0ZUJpbmFyeUltYWdlIiwia2VybmVsIiwiQSIsIkIiLCJDIiwiYXZnIiwiY2x1c3RlciIsInRoaXNDbHVzdGVyIiwiY2x1c3RlcnMiLCJhZGRUb0NsdXN0ZXIiLCJmb3VuZCIsIkNsdXN0ZXIyIiwiVHJhY2VyIiwidHJhY2UiLCJpdGVyYXRpb24iLCJtYXhJdGVyYXRpb25zIiwidG9wIiwicmVzdWx0IiwiY2VudGVyUG9zIiwiY3VycmVudFBvcyIsImlkeCIsImZvcndhcmQiLCJ0byIsInRvSWR4IiwicHJlZGljdGVkUG9zIiwidGhyZXNob2xkWCIsInRocmVzaG9sZFkiLCJtYXRjaCIsInBvcyIsInByZWRpY3RlZCIsImZyb20iLCJESUxBVEUiLCJFUk9ERSIsImRpbGF0ZSIsImluSW1hZ2VXcmFwcGVyIiwib3V0SW1hZ2VXcmFwcGVyIiwiaW5JbWFnZURhdGEiLCJvdXRJbWFnZURhdGEiLCJ5U3RhcnQxIiwieVN0YXJ0MiIsInhTdGFydDEiLCJ4U3RhcnQyIiwiZXJvZGUiLCJhSW1hZ2VXcmFwcGVyIiwiYkltYWdlV3JhcHBlciIsInJlc3VsdEltYWdlV3JhcHBlciIsImFJbWFnZURhdGEiLCJiSW1hZ2VEYXRhIiwiY0ltYWdlRGF0YSIsImJpdHdpc2VPciIsImNvdW50Tm9uWmVybyIsInRvcEdlbmVyaWMiLCJsaXN0Iiwic2NvcmVGdW5jIiwibWluSWR4IiwicXVldWUiLCJzY29yZSIsImhpdCIsIml0ZW0iLCJhcHBseSIsIk51bWJlciIsIk1BWF9WQUxVRSIsImdyYXlBcnJheUZyb21JbWFnZSIsImh0bWxJbWFnZSIsIm9mZnNldFgiLCJjdHgiLCJhcnJheSIsImRyYXdJbWFnZSIsImN0eERhdGEiLCJnZXRJbWFnZURhdGEiLCJjb21wdXRlR3JheSIsImdyYXlBcnJheUZyb21Db250ZXh0IiwiZ3JheUFuZEhhbGZTYW1wbGVGcm9tQ2FudmFzRGF0YSIsImNhbnZhc0RhdGEiLCJvdXRBcnJheSIsInRvcFJvd0lkeCIsImJvdHRvbVJvd0lkeCIsImVuZElkeCIsIm91dFdpZHRoIiwib3V0SW1nSWR4IiwiaW5XaWR0aCIsImNvbmZpZyIsInNpbmdsZUNoYW5uZWwiLCJsb2FkSW1hZ2VBcnJheSIsInNyYyIsImNhbGxiYWNrIiwiY2FudmFzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaW1nIiwiSW1hZ2UiLCJvbmxvYWQiLCJjb25zb2xlIiwid2FybiIsImdldENvbnRleHQiLCJVaW50OEFycmF5IiwiaGFsZlNhbXBsZSIsImluSW1nV3JhcHBlciIsIm91dEltZ1dyYXBwZXIiLCJpbkltZyIsIm91dEltZyIsImhzdjJyZ2IiLCJoc3YiLCJyZ2IiLCJoIiwiZyIsIl9jb21wdXRlRGl2aXNvcnMiLCJuIiwibGFyZ2VEaXZpc29ycyIsImRpdmlzb3JzIiwidW5zaGlmdCIsImNvbmNhdCIsIl9jb21wdXRlSW50ZXJzZWN0aW9uIiwiYXJyMSIsImFycjIiLCJqIiwiY2FsY3VsYXRlUGF0Y2hTaXplIiwicGF0Y2hTaXplIiwiaW1nU2l6ZSIsImRpdmlzb3JzWCIsImRpdmlzb3JzWSIsIndpZGVTaWRlIiwiY29tbW9uIiwibnJPZlBhdGNoZXNMaXN0IiwibnJPZlBhdGNoZXNNYXAiLCJzbWFsbCIsIm1lZGl1bSIsImxhcmdlIiwibnJPZlBhdGNoZXNJZHgiLCJuck9mUGF0Y2hlcyIsImRlc2lyZWRQYXRjaFNpemUiLCJvcHRpbWFsUGF0Y2hTaXplIiwiZmluZFBhdGNoU2l6ZUZvckRpdmlzb3JzIiwiX3BhcnNlQ1NTRGltZW5zaW9uVmFsdWVzIiwiZGltZW5zaW9uIiwicGFyc2VGbG9hdCIsInVuaXQiLCJpbmRleE9mIiwiX2RpbWVuc2lvbnNDb252ZXJ0ZXJzIiwiY29udGV4dCIsImJvdHRvbSIsImNvbXB1dGVJbWFnZUFyZWEiLCJpbnB1dFdpZHRoIiwiaW5wdXRIZWlnaHQiLCJhcmVhIiwicGFyc2VkQXJlYSIsImtleXMiLCJyZWR1Y2UiLCJwYXJzZWQiLCJjYWxjdWxhdGVkIiwic3giLCJzeSIsInN3Iiwic2giLCJkcmF3UmVjdCIsInN0eWxlIiwic3Ryb2tlU3R5bGUiLCJjb2xvciIsImZpbGxTdHlsZSIsImxpbmVXaWR0aCIsImJlZ2luUGF0aCIsInN0cm9rZVJlY3QiLCJkcmF3UGF0aCIsInBhdGgiLCJkZWYiLCJtb3ZlVG8iLCJsaW5lVG8iLCJjbG9zZVBhdGgiLCJzdHJva2UiLCJjYW52YXNEYXRhUG9zIiwiaW1hZ2VEYXRhUG9zIiwicHV0SW1hZ2VEYXRhIiwiYXJyIiwidmFsIiwiZmlsbCIsInNodWZmbGUiLCJ0b1BvaW50TGlzdCIsInJvd3MiLCJyb3ciLCJqb2luIiwicHJldiIsIm5leHQiLCJhc3NlcnROdW1iZXJQb3NpdGl2ZSIsIkVycm9yIiwiSW1hZ2VXcmFwcGVyIiwiQXJyYXlUeXBlIiwiaW5pdGlhbGl6ZSIsImltZ1JlZiIsImJvcmRlciIsInNpemVYIiwic2l6ZVkiLCJpbmRleE1hcHBpbmciLCJsYWJlbENvdW50IiwieXNxIiwibGFiZWxTdW0iLCJsYWJlbCIsIm11MTEiLCJtdTAyIiwibXUyMCIsInhfIiwieV8iLCJ0bXAiLCJQSV80IiwibTAyIiwibTIwIiwidGhldGEiLCJpc05hTiIsImF0YW4iLCJyZXQiLCJVaW50OENsYW1wZWRBcnJheSIsInBpeGVsIiwiY3VycmVudCIsImdldCIsImZyYW1lIiwiZ2V0QXNSR0JBIiwibmV3RnJhbWUiLCJJbWFnZURhdGEiLCJpblNjYWxlIiwiYWRqdXN0ZWRTY2FsZSIsIndoaXRlUmdiIiwiYmxhY2tSZ2IiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJnZW4iLCJyZXNvbHZlIiwicmVqZWN0IiwiX25leHQiLCJfdGhyb3ciLCJpbmZvIiwiZXJyb3IiLCJkb25lIiwiUHJvbWlzZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3MiLCJlcnIiLCJ1bmRlZmluZWQiLCJzdXBlclByb3BCYXNlIiwiX2dldCIsIlJlZmxlY3QiLCJyZWNlaXZlciIsImJhc2UiLCJkZXNjIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiaXNPYmplY3QiLCJpc0FycmF5IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJiYXNlTWVyZ2UiLCJjcmVhdGVBc3NpZ25lciIsIm1lcmdlIiwib2JqZWN0Iiwic291cmNlIiwic3JjSW5kZXgiLCJmcmVlR2xvYmFsIiwiZnJlZVNlbGYiLCJyb290IiwiaXNPYmplY3RMaWtlIiwic2VhcmNoRGlyZWN0aW9ucyIsImxhYmVsV3JhcHBlciIsImxhYmVsRGF0YSIsImVkZ2VsYWJlbCIsImN5IiwiZGlyIiwiY3giLCJ2ZXJ0ZXgyRCIsImNvbnRvdXJUcmFjaW5nIiwiRnYiLCJDdiIsIlAiLCJsZGlyIiwidG90YWxQaXhlbENvdW50IiwicGl4ZWxDb3VudGVyIiwiZ2V0UmF3VGFnIiwib2JqZWN0VG9TdHJpbmciLCJudWxsVGFnIiwidW5kZWZpbmVkVGFnIiwic3ltVG9TdHJpbmdUYWciLCJ0b1N0cmluZ1RhZyIsImJhc2VHZXRUYWciLCJfY29uZmlnIiwiX2N1cnJlbnRJbWFnZVdyYXBwZXIiLCJfc2tlbEltYWdlV3JhcHBlciIsIl9zdWJJbWFnZVdyYXBwZXIiLCJfbGFiZWxJbWFnZVdyYXBwZXIiLCJfcGF0Y2hHcmlkIiwiX3BhdGNoTGFiZWxHcmlkIiwiX2ltYWdlVG9QYXRjaEdyaWQiLCJfYmluYXJ5SW1hZ2VXcmFwcGVyIiwiX3BhdGNoU2l6ZSIsIl9jYW52YXNDb250YWluZXIiLCJiaW5hcnkiLCJkb20iLCJfbnVtUGF0Y2hlcyIsIl9pbnB1dEltYWdlV3JhcHBlciIsIl9za2VsZXRvbml6ZXIiLCJpbml0QnVmZmVycyIsInNrZWxldG9uSW1hZ2VEYXRhIiwiQXJyYXlCdWZmZXIiLCJza2VsZXRvbml6ZXIiLCJ3aW5kb3ciLCJnbG9iYWwiLCJpbml0Q2FudmFzIiwidXNlV29ya2VyIiwiY2xhc3NOYW1lIiwiRU5WIiwiZGVidWciLCJzaG93Q2FudmFzIiwicXVlcnlTZWxlY3RvciIsImFwcGVuZENoaWxkIiwid2lsbFJlYWRGcmVxdWVudGx5IiwiYm94RnJvbVBhdGNoZXMiLCJwYXRjaGVzIiwib3ZlckF2ZyIsInBhdGNoIiwidHJhbnNNYXQiLCJtaW54IiwibWlueSIsIm1heHgiLCJtYXh5IiwiYm94Iiwic2hvd1BhdGNoZXMiLCJJbWFnZURlYnVnIiwibWF0MiIsInNob3dUcmFuc2Zvcm1lZCIsInNob3dUcmFuc2Zvcm1lZEJveCIsInNob3dCQiIsImJpbmFyaXplSW1hZ2UiLCJ6ZXJvQm9yZGVyIiwic2hvdyIsImZpbmRQYXRjaGVzIiwibW9tZW50cyIsInBhdGNoZXNGb3VuZCIsInJhc3Rlcml6ZXIiLCJyYXN0ZXJSZXN1bHQiLCJza2VsZXRvbml6ZSIsIlJhc3Rlcml6ZXIiLCJyYXN0ZXJpemUiLCJzaG93TGFiZWxzIiwib3ZlcmxheSIsImRlc2NyaWJlUGF0Y2giLCJzaG93Rm91bmRQYXRjaGVzIiwiZmluZEJpZ2dlc3RDb25uZWN0ZWRBcmVhcyIsIm1heExhYmVsIiwibGFiZWxIaXN0IiwidG9wTGFiZWxzIiwibWFwIiwic29ydCIsImZpbHRlciIsImVsIiwiZmluZEJveGVzIiwiYm94ZXMiLCJzaG93UmVtYWluaW5nUGF0Y2hMYWJlbHMiLCJzaW1pbGFyTW9tZW50cyIsInRvcENsdXN0ZXIiLCJlIiwic3ViSW1hZ2VBc0NvcHkiLCJzaG93U2tlbGV0b24iLCJwYXRjaFBvcyIsImVsaWdpYmxlTW9tZW50cyIsIm1hdGNoaW5nTW9tZW50cyIsIm1pbkNvbXBvbmVudFdlaWdodCIsImluZGV4IiwicmFzdGVyaXplQW5ndWxhclNpbWlsYXJpdHkiLCJjdXJySWR4Iiwibm90WWV0UHJvY2Vzc2VkIiwiY3VycmVudElkeCIsImN1cnJlbnRQYXRjaCIsInNob3dQYXRjaExhYmVscyIsImlucHV0SW1hZ2VXcmFwcGVyIiwibG9jYXRlIiwiY2hlY2tJbWFnZUNvbnN0cmFpbnRzIiwiaW5wdXRTdHJlYW0iLCJnZXRXaWR0aCIsImdldEhlaWdodCIsInRoaXNIYWxmU2FtcGxlIiwiZ2V0Q29uZmlnIiwic2V0VG9wUmlnaHQiLCJzZXRDYW52YXNTaXplIiwibG9nIiwiSlNPTiIsInN0cmluZ2lmeSIsInNldFdpZHRoIiwic2V0SGVpZ2h0IiwibGlzdENhY2hlQ2xlYXIiLCJsaXN0Q2FjaGVEZWxldGUiLCJsaXN0Q2FjaGVHZXQiLCJsaXN0Q2FjaGVIYXMiLCJsaXN0Q2FjaGVTZXQiLCJMaXN0Q2FjaGUiLCJlbnRyaWVzIiwiY2xlYXIiLCJlbnRyeSIsImhhcyIsImVxIiwiYXNzb2NJbmRleE9mIiwib3RoZXIiLCJnZXROYXRpdmUiLCJuYXRpdmVDcmVhdGUiLCJpc0tleWFibGUiLCJnZXRNYXBEYXRhIiwiX19kYXRhX18iLCJiYXNlSXNBcmd1bWVudHMiLCJvYmplY3RQcm90byIsImhhc093blByb3BlcnR5IiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJpc0FyZ3VtZW50cyIsIk1BWF9TQUZFX0lOVEVHRVIiLCJyZUlzVWludCIsImlzSW5kZXgiLCJ0ZXN0IiwiaXNLZXkiLCJzdHJpbmdUb1BhdGgiLCJ0b1N0cmluZyIsImNhc3RQYXRoIiwiYXJyYXlXaXRob3V0SG9sZXMiLCJpdGVyYWJsZVRvQXJyYXkiLCJ1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIm5vbkl0ZXJhYmxlU3ByZWFkIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiYmFzZUlzTmF0aXZlIiwiZ2V0VmFsdWUiLCJhc3luY1RhZyIsImZ1bmNUYWciLCJnZW5UYWciLCJwcm94eVRhZyIsImlzRnVuY3Rpb24iLCJ0YWciLCJiYXNlQXNzaWduVmFsdWUiLCJ3ZWJwYWNrUG9seWZpbGwiLCJkZXByZWNhdGUiLCJwYXRocyIsImNoaWxkcmVuIiwiaXNMZW5ndGgiLCJpc0FycmF5TGlrZSIsIl9zZXRQcm90b3R5cGVPZiIsInN5bWJvbFRhZyIsImlzU3ltYm9sIiwiSU5GSU5JVFkiLCJ0b0tleSIsIk1hcCIsIm1hcENhY2hlQ2xlYXIiLCJtYXBDYWNoZURlbGV0ZSIsIm1hcENhY2hlR2V0IiwibWFwQ2FjaGVIYXMiLCJtYXBDYWNoZVNldCIsIk1hcENhY2hlIiwiYXNzaWduTWVyZ2VWYWx1ZSIsImZ1bmMiLCJvdmVyQXJnIiwiZ2V0UHJvdG90eXBlIiwiaXNQcm90b3R5cGUiLCJDdG9yIiwicHJvdG8iLCJzdHViRmFsc2UiLCJmcmVlRXhwb3J0cyIsIm5vZGVUeXBlIiwiZnJlZU1vZHVsZSIsIm1vZHVsZUV4cG9ydHMiLCJCdWZmZXIiLCJuYXRpdmVJc0J1ZmZlciIsImlzQnVmZmVyIiwiYmFzZUlzVHlwZWRBcnJheSIsImJhc2VVbmFyeSIsIm5vZGVVdGlsIiwibm9kZUlzVHlwZWRBcnJheSIsImlzVHlwZWRBcnJheSIsInNhZmVHZXQiLCJhc3NpZ25WYWx1ZSIsIm9ialZhbHVlIiwiYXJyYXlMaWtlS2V5cyIsImJhc2VLZXlzSW4iLCJrZXlzSW4iLCJuYXRpdmVNYXgiLCJvdmVyUmVzdCIsInN0YXJ0IiwidHJhbnNmb3JtIiwib3RoZXJBcmdzIiwiYmFzZVNldFRvU3RyaW5nIiwic2hvcnRPdXQiLCJzZXRUb1N0cmluZyIsImFycmF5TGlrZVRvQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJtaW5MZW4iLCJzbGljZSIsIm5hbWUiLCJfYXJyYXlMaWtlVG9BcnJheSIsImFycmF5V2l0aEhvbGVzIiwiaXRlcmFibGVUb0FycmF5TGltaXQiLCJub25JdGVyYWJsZVJlc3QiLCJfc2xpY2VkVG9BcnJheSIsImJhc2VQaWNrIiwiZmxhdFJlc3QiLCJwaWNrIiwiaXNOYXRpdmVGdW5jdGlvbiIsImNvbnN0cnVjdCIsIl93cmFwTmF0aXZlU3VwZXIiLCJDbGFzcyIsIl9jYWNoZSIsIldyYXBwZXIiLCJjcmVhdGVDb250b3VyMkQiLCJmaXJzdFZlcnRleCIsImluc2lkZUNvbnRvdXJzIiwibmV4dHBlZXIiLCJwcmV2cGVlciIsIkNPTlRPVVJfRElSIiwiQ1dfRElSIiwiQ0NXX0RJUiIsIlVOS05PV05fRElSIiwiRElSIiwiT1VUU0lERV9FREdFIiwiSU5TSURFX0VER0UiLCJ0cmFjZXIiLCJkZXB0aGxhYmVsIiwiYmMiLCJsYyIsImxhYmVsaW5kZXgiLCJjb2xvck1hcCIsInZlcnRleCIsImNjIiwic2MiLCJjb25uZWN0ZWRDb3VudCIsImRyYXdDb250b3VyIiwiZmlyc3RDb250b3VyIiwicHEiLCJpcSIsIlNrZWxldG9uaXplciIsInN0ZGxpYiIsImZvcmVpZ24iLCJidWZmZXIiLCJpbWFnZXMiLCJpbXVsIiwiaW5JbWFnZVB0ciIsIm91dEltYWdlUHRyIiwiYUltYWdlUHRyIiwiYkltYWdlUHRyIiwiaW1hZ2VQdHIiLCJtZW1jcHkiLCJzcmNJbWFnZVB0ciIsImRzdEltYWdlUHRyIiwic3ViSW1hZ2VQdHIiLCJlcm9kZWRJbWFnZVB0ciIsInRlbXBJbWFnZVB0ciIsInNrZWxJbWFnZVB0ciIsIlN0YWNrIiwiYmFzZUZvciIsImJhc2VNZXJnZURlZXAiLCJjdXN0b21pemVyIiwic3RhY2siLCJzcmNWYWx1ZSIsIm5ld1ZhbHVlIiwic3RhY2tDbGVhciIsInN0YWNrRGVsZXRlIiwic3RhY2tHZXQiLCJzdGFja0hhcyIsInN0YWNrU2V0IiwiYXJyYXlQcm90byIsInNwbGljZSIsImxhc3RJbmRleCIsInBvcCIsIkxBUkdFX0FSUkFZX1NJWkUiLCJwYWlycyIsImlzTWFza2VkIiwidG9Tb3VyY2UiLCJyZVJlZ0V4cENoYXIiLCJyZUlzSG9zdEN0b3IiLCJmdW5jUHJvdG8iLCJmdW5jVG9TdHJpbmciLCJyZUlzTmF0aXZlIiwiUmVnRXhwIiwicmVwbGFjZSIsInBhdHRlcm4iLCJuYXRpdmVPYmplY3RUb1N0cmluZyIsImlzT3duIiwidW5tYXNrZWQiLCJjb3JlSnNEYXRhIiwibWFza1NyY0tleSIsInVpZCIsImV4ZWMiLCJJRV9QUk9UTyIsIkhhc2giLCJoYXNoQ2xlYXIiLCJoYXNoRGVsZXRlIiwiaGFzaEdldCIsImhhc2hIYXMiLCJoYXNoU2V0IiwiSEFTSF9VTkRFRklORUQiLCJjcmVhdGVCYXNlRm9yIiwiZnJvbVJpZ2h0IiwiaXRlcmF0ZWUiLCJrZXlzRnVuYyIsIml0ZXJhYmxlIiwiY2xvbmVCdWZmZXIiLCJjbG9uZVR5cGVkQXJyYXkiLCJjb3B5QXJyYXkiLCJpbml0Q2xvbmVPYmplY3QiLCJpc0FycmF5TGlrZU9iamVjdCIsImlzUGxhaW5PYmplY3QiLCJ0b1BsYWluT2JqZWN0IiwibWVyZ2VGdW5jIiwic3RhY2tlZCIsImlzQ29tbW9uIiwiaXNBcnIiLCJpc0J1ZmYiLCJpc1R5cGVkIiwiYWxsb2NVbnNhZmUiLCJpc0RlZXAiLCJjbG9uZUFycmF5QnVmZmVyIiwidHlwZWRBcnJheSIsImJ5dGVPZmZzZXQiLCJhcnJheUJ1ZmZlciIsImJ5dGVMZW5ndGgiLCJiYXNlQ3JlYXRlIiwib2JqZWN0Q3JlYXRlIiwiYXJnc1RhZyIsIm9iamVjdFRhZyIsIm9iamVjdEN0b3JTdHJpbmciLCJhcnJheVRhZyIsImJvb2xUYWciLCJkYXRlVGFnIiwiZXJyb3JUYWciLCJtYXBUYWciLCJudW1iZXJUYWciLCJyZWdleHBUYWciLCJzZXRUYWciLCJzdHJpbmdUYWciLCJ3ZWFrTWFwVGFnIiwiYXJyYXlCdWZmZXJUYWciLCJkYXRhVmlld1RhZyIsImZsb2F0MzJUYWciLCJmbG9hdDY0VGFnIiwiaW50OFRhZyIsImludDE2VGFnIiwiaW50MzJUYWciLCJ1aW50OFRhZyIsInVpbnQ4Q2xhbXBlZFRhZyIsInVpbnQxNlRhZyIsInVpbnQzMlRhZyIsInR5cGVkQXJyYXlUYWdzIiwiZnJlZVByb2Nlc3MiLCJwcm9jZXNzIiwidHlwZXMiLCJiaW5kaW5nIiwiY29weU9iamVjdCIsImlzTmV3IiwiYmFzZVRpbWVzIiwiaW5oZXJpdGVkIiwiaXNBcmciLCJpc1R5cGUiLCJza2lwSW5kZXhlcyIsIlN0cmluZyIsIm5hdGl2ZUtleXNJbiIsImlzUHJvdG8iLCJiYXNlUmVzdCIsImlzSXRlcmF0ZWVDYWxsIiwiYXNzaWduZXIiLCJzb3VyY2VzIiwiZ3VhcmQiLCJ0aGlzQXJnIiwiY29uc3RhbnQiLCJzdHJpbmciLCJIT1RfQ09VTlQiLCJIT1RfU1BBTiIsIm5hdGl2ZU5vdyIsIkRhdGUiLCJub3ciLCJsYXN0Q2FsbGVkIiwic3RhbXAiLCJyZW1haW5pbmciLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJvUmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwibXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJzZXRUaW1lb3V0IiwiYWgiLCJhbCIsImJoIiwiYmwiLCJhc3NpZ24iLCJuZXh0U291cmNlIiwibmV4dEtleSIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl9pIiwiX2FyciIsIl9uIiwiX2QiLCJfcyIsIl9lIiwiX25vbkl0ZXJhYmxlUmVzdCIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJPcCIsImhhc093biIsIiRTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJkZWZpbmUiLCJ3cmFwIiwiaW5uZXJGbiIsIm91dGVyRm4iLCJ0cnlMb2NzTGlzdCIsInByb3RvR2VuZXJhdG9yIiwiR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJ0cnlDYXRjaCIsIkNvbnRpbnVlU2VudGluZWwiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiSXRlcmF0b3JQcm90b3R5cGUiLCJnZXRQcm90byIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwidmFsdWVzIiwiR3AiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJtZXRob2QiLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwiaW52b2tlIiwicmVjb3JkIiwiX19hd2FpdCIsInVud3JhcHBlZCIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwic3RhdGUiLCJkb25lUmVzdWx0IiwiZGVsZWdhdGUiLCJkZWxlZ2F0ZVJlc3VsdCIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsInJlc3VsdE5hbWUiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwibG9jcyIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInJlc2V0VHJ5RW50cnkiLCJjb21wbGV0aW9uIiwicmVzZXQiLCJpdGVyYXRvck1ldGhvZCIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJtYXJrIiwiYXdyYXAiLCJhc3luYyIsIml0ZXIiLCJyZXZlcnNlIiwic2tpcFRlbXBSZXNldCIsImNoYXJBdCIsInN0b3AiLCJyb290UmVjb3JkIiwicnZhbCIsImV4Y2VwdGlvbiIsImhhbmRsZSIsImxvYyIsImNhdWdodCIsImhhc0NhdGNoIiwiaGFzRmluYWxseSIsImZpbmFsbHlFbnRyeSIsImNvbXBsZXRlIiwiZmluaXNoIiwiX2NhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsIl9zdXBlclByb3BCYXNlIiwiX2FycmF5V2l0aG91dEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVNwcmVhZCIsImJhc2VQaWNrQnkiLCJoYXNJbiIsImJhc2VHZXQiLCJiYXNlU2V0IiwicHJlZGljYXRlIiwicmVJc0RlZXBQcm9wIiwicmVJc1BsYWluUHJvcCIsIm1lbW9pemVDYXBwZWQiLCJyZVByb3BOYW1lIiwicmVFc2NhcGVDaGFyIiwiY2hhckNvZGVBdCIsIm51bWJlciIsInF1b3RlIiwic3ViU3RyaW5nIiwibWVtb2l6ZSIsIk1BWF9NRU1PSVpFX1NJWkUiLCJjYWNoZSIsIkZVTkNfRVJST1JfVEVYVCIsInJlc29sdmVyIiwibWVtb2l6ZWQiLCJDYWNoZSIsImJhc2VUb1N0cmluZyIsImFycmF5TWFwIiwic3ltYm9sUHJvdG8iLCJzeW1ib2xUb1N0cmluZyIsIm5lc3RlZCIsImJhc2VIYXNJbiIsImhhc1BhdGgiLCJoYXNGdW5jIiwiZmxhdHRlbiIsImJhc2VGbGF0dGVuIiwiYXJyYXlQdXNoIiwiaXNGbGF0dGVuYWJsZSIsImRlcHRoIiwiaXNTdHJpY3QiLCJzcHJlYWRhYmxlU3ltYm9sIiwiaXNDb25jYXRTcHJlYWRhYmxlIiwiX2lzTmF0aXZlRnVuY3Rpb24iLCJpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJfY29uc3RydWN0IiwiUGFyZW50IiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsInNoYW0iLCJQcm94eSIsIkJvb2xlYW4iLCJ2YWx1ZU9mIiwiQmFyY29kZURpcmVjdGlvbiIsIkJhcmNvZGVSZWFkZXIiLCJzdXBwbGVtZW50cyIsIl9yb3ciLCJjb3VudGVyIiwiY29kZSIsIm1heFNpbmdsZUVycm9yIiwiU0lOR0xFX0NPREVfRVJST1IiLCJzaW5nbGVFcnJvciIsIm1vZHVsbyIsImJhcldpZHRoIiwic2NhbGVkIiwiY29ycmVjdGlvbiIsImluZGljZXMiLCJkZWNvZGUiLCJkaXJlY3Rpb24iLCJSZXZlcnNlIiwiRm9yd2FyZCIsImZvcm1hdCIsIkZPUk1BVCIsIl9uZXh0VW5zZXQiLCJpc1doaXRlIiwiY291bnRlcnMiLCJjb3VudGVyUG9zIiwibnVtQ291bnRlcnMiLCJTdGFydE5vdEZvdW5kRXhjZXB0aW9uIiwiQ29kZU5vdEZvdW5kRXhjZXB0aW9uIiwiUGF0dGVybk5vdEZvdW5kRXhjZXB0aW9uIiwiTiIsIlciLCJTVEFSVF9QQVRURVJOIiwiU1RPUF9QQVRURVJOIiwiQ09ERV9QQVRURVJOIiwiU1RBUlRfUEFUVEVSTl9MRU5HVEgiLCJUd29PZkZpdmVSZWFkZXIiLCJ0cnlIYXJkZXIiLCJiZXN0TWF0Y2giLCJlcHNpbG9uIiwiQVZHX0NPREVfRVJST1IiLCJfbmV4dFNldCIsIl9tYXRjaFBhdHRlcm4iLCJzdGFydEluZm8iLCJuYXJyb3dCYXJXaWR0aCIsImxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQiLCJfZmluZFBhdHRlcm4iLCJfbWF0Y2hSYW5nZSIsImVuZEluZm8iLCJ0cmFpbGluZ1doaXRlc3BhY2VFbmQiLCJfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlIiwiZGVjb2RlZENvZGVzIiwiY291bnRlckxlbmd0aCIsImJhclNwYWNlUmF0aW8iLCJfZGVjb2RlQ29kZSIsIl9maW5kU3RhcnQiLCJfZmluZEVuZCIsIl9maWxsQ291bnRlcnMiLCJfdmVyaWZ5Q291bnRlckxlbmd0aCIsIl9kZWNvZGVQYXlsb2FkIiwiQUxQSEFCRVQiLCJDSEFSQUNURVJfRU5DT0RJTkdTIiwiU1RBUlRfRU5EIiwiTUlOX0VOQ09ERURfQ0hBUlMiLCJNQVhfQUNDRVBUQUJMRSIsIlBBRERJTkciLCJOZXdDb2RhYmFyUmVhZGVyIiwiX2NvdW50ZXJzIiwiYmFyVGhyZXNob2xkIiwiX2NvbXB1dGVBbHRlcm5hdGluZ1RocmVzaG9sZCIsInNwYWNlVGhyZXNob2xkIiwiYml0bWFzayIsIl90b1BhdHRlcm4iLCJfaXNTdGFydEVuZCIsIl9zdW1Db3VudGVycyIsInN0YXJ0Q291bnRlciIsImVuZENvdW50ZXIiLCJmcm9tQ2hhckNvZGUiLCJfY2FsY3VsYXRlUGF0dGVybkxlbmd0aCIsImNoYXIiLCJjaGFyQ29kZSIsImNhdGVnb3JpemF0aW9uIiwic3BhY2UiLCJuYXJyb3ciLCJjb3VudHMiLCJ3aWRlIiwiYmFyIiwiX2NoYXJUb1BhdHRlcm4iLCJraW5kIiwiY2F0IiwibmV3a2luZCIsInRocmVzaG9sZHMiLCJfdGhyZXNob2xkUmVzdWx0UGF0dGVybiIsIm5leHRTdGFydCIsImRlY29kZWRDaGFyIiwiX3BhdHRlcm5Ub0NoYXIiLCJfdmVyaWZ5V2hpdGVzcGFjZSIsIl92YWxpZGF0ZVJlc3VsdCIsIkNvZGUxMjhSZWFkZXIiLCJfY29ycmVjdCIsImNhbGN1bGF0ZUNvcnJlY3Rpb24iLCJNT0RVTEVfSU5ESUNFUyIsIl9jb3JyZWN0QmFycyIsIlNUQVJUX0NPREVfQSIsIlNUQVJUX0NPREVfQyIsImNoZWNrc3VtIiwiY29kZXNldCIsIkNPREVfQSIsIlNUQVJUX0NPREVfQiIsIkNPREVfQiIsIkNPREVfQyIsInNoaWZ0TmV4dCIsInJlbW92ZUxhc3RDaGFyYWN0ZXIiLCJtdWx0aXBsaWVyIiwicmF3UmVzdWx0IiwiU1RPUF9DT0RFIiwiQ09ERV9TSElGVCIsImV4cGVjdGVkIiwibm9ybWFsaXplZCIsInN1bU5vcm1hbGl6ZWQiLCJzdW1FeHBlY3RlZCIsIkFMUEhBQkVUSF9TVFJJTkciLCJVaW50MTZBcnJheSIsIkFTVEVSSVNLIiwiQ29kZTM5UmVhZGVyIiwicGF0dGVyblN0YXJ0Iiwid2hpdGVTcGFjZU11c3RTdGFydCIsIm1heE5hcnJvd1dpZHRoIiwibnVtV2lkZUJhcnMiLCJ3aWRlQmFyV2lkdGgiLCJfZmluZE5leHRXaWR0aCIsIm1pbldpZHRoIiwibGFzdFN0YXJ0IiwicGF0dGVyblNpemUiLCJfdG9Db3VudGVycyIsInBhdHRlcm5zIiwiQUVJTyIsIkFaMDkiLCJjb2RlMzJzZXQiLCJDb2RlMzJSZWFkZXIiLCJyZXMiLCJjb2RlMzIiLCJfY2hlY2tDaGVja3N1bSIsIl9kZWNvZGVDb2RlMzIiLCJJT1EiLCJDb2RlMzlWSU5SZWFkZXIiLCJDb2RlOTNSZWFkZXIiLCJjaGFyQXJyYXkiLCJuZXh0Q2hhciIsIm5leHRDaGFyQ29kZSIsIm1heFdlaWdodCIsImFycmF5VG9DaGVjayIsIndlaWdodGVkU3VtcyIsIndlaWdodCIsImNoZWNrQ2hhciIsIl9tYXRjaENoZWNrQ2hhciIsIl92ZXJpZnlFbmQiLCJfdmVyaWZ5Q2hlY2tzdW1zIiwiX2RlY29kZUV4dGVuZGVkIiwiQ09ERV9HX1NUQVJUIiwiTUlERExFX1BBVFRFUk4iLCJFWFRFTlNJT05fU1RBUlRfUEFUVEVSTiIsIkNPREVfRlJFUVVFTkNZIiwiRUFOUmVhZGVyIiwiY29kZXJhbmdlIiwiY29kZUZyZXF1ZW5jeSIsImluQ29kZSIsIm91dENvZGUiLCJmaXJzdERpZ2l0IiwiX2NhbGN1bGF0ZUZpcnN0RGlnaXQiLCJtaWRkbGVQYXR0ZXJuIiwicmVzdWx0SW5mbyIsIl9jaGVja3N1bSIsInN1cHBsZW1lbnQiLCJfZGVjb2RlRXh0ZW5zaW9ucyIsImxhc3RDb2RlIiwiRUFOMlJlYWRlciIsInBhcnNlSW50IiwiQ0hFQ0tfRElHSVRfRU5DT0RJTkdTIiwiZGV0ZXJtaW5lQ2hlY2tEaWdpdCIsImV4dGVuc2lvbkNoZWNrc3VtIiwiRUFONVJlYWRlciIsIkVBTjhSZWFkZXIiLCJJMm9mNVJlYWRlciIsIm9wdHMiLCJub3JtYWxpemVCYXJTcGFjZVdpZHRoIiwiY291bnRlclN1bSIsImNvZGVTdW0iLCJjb3JyZWN0aW9uUmF0aW8iLCJNQVhfQ09SUkVDVElPTl9GQUNUT1IiLCJjb3JyZWN0aW9uUmF0aW9JbnZlcnNlIiwiY291bnRlclBhaXIiLCJjb2RlcyIsIl9kZWNvZGVQYWlyIiwiVVBDRVJlYWRlciIsIl9kZXRlcm1pbmVQYXJpdHkiLCJuclN5c3RlbSIsInVwY2EiLCJsYXN0RGlnaXQiLCJfY29udmVydFRvVVBDQSIsIlVQQ1JlYWRlciIsInN1YnN0cmluZyIsIkJyZXNlbmhhbSIsIlNsb3BlIiwiVVAiLCJET1dOIiwiZ2V0QmFyY29kZUxpbmUiLCJ4MCIsInkwIiwic3RlZXAiLCJyZWFkIiwiZGVsdGFYIiwiZGVsdGFZIiwieVN0ZXAiLCJ0b0JpbmFyeUxpbmUiLCJzbG9wZSIsInNsb3BlMiIsImV4dHJlbWEiLCJjdXJyZW50RGlyIiwiclRocmVzaG9sZCIsInByaW50RnJlcXVlbmN5IiwicHJpbnRQYXR0ZXJuIiwiZmlsbENvbG9yIiwiZmlsbFJlY3QiLCJSRUFERVJTIiwiY29kZV8xMjhfcmVhZGVyIiwiZWFuX3JlYWRlciIsImVhbl81X3JlYWRlciIsImVhbl8yX3JlYWRlciIsImVhbl84X3JlYWRlciIsImNvZGVfMzlfcmVhZGVyIiwiY29kZV8zOV92aW5fcmVhZGVyIiwiY29kYWJhcl9yZWFkZXIiLCJDb2RhYmFyUmVhZGVyIiwidXBjX3JlYWRlciIsInVwY19lX3JlYWRlciIsImkyb2Y1X3JlYWRlciIsImNvZGVfOTNfcmVhZGVyIiwiY29kZV8zMl9yZWFkZXIiLCJyZWdpc3RlclJlYWRlciIsInJlYWRlciIsIl9jYW52YXMiLCJmcmVxdWVuY3kiLCJfYmFyY29kZVJlYWRlcnMiLCJpbml0UmVhZGVycyIsImluaXRDb25maWciLCIkZGVidWciLCJyZWFkZXJzIiwicmVhZGVyQ29uZmlnIiwiY29uZmlndXJhdGlvbiIsInJlYWRlck9iaiIsInZpcyIsIm5vZGUiLCJwcm9wIiwic2hvd0ZyZXF1ZW5jeSIsInNob3dQYXR0ZXJuIiwiZGlzcGxheSIsImdldEV4dGVuZGVkTGluZSIsImV4dCIsImV4dGVuZExpbmUiLCJhbW91bnQiLCJleHRlbnNpb24iLCJpbkltYWdlV2l0aEJvcmRlciIsImdldExpbmUiLCJ0cnlEZWNvZGUiLCJiYXJjb2RlTGluZSIsImRlY29kZVBhdHRlcm4iLCJjb2RlUmVzdWx0IiwidHJ5RGVjb2RlQnJ1dGVGb3JjZSIsImxpbmVBbmdsZSIsInNpZGVMZW5ndGgiLCJwb3ciLCJzbGljZXMiLCJ4ZGlyIiwieWRpciIsImdldExpbmVMZW5ndGgiLCJkZWNvZGVGcm9tSW1hZ2UiLCJkZWNvZGVJbWFnZSIsImRlY29kZUZyb21Cb3VuZGluZ0JveCIsImRyYXdCb3VuZGluZ0JveCIsImxpbmVMZW5ndGgiLCJhdGFuMiIsImRyYXdTY2FubGluZSIsImRlY29kZUZyb21Cb3VuZGluZ0JveGVzIiwiYmFyY29kZXMiLCJtdWx0aXBsZSIsImltYWdlV3JhcHBlckluIiwic2V0UmVhZGVycyIsIkV2ZW50SW50ZXJmYWNlIiwiZXZlbnRzIiwiZ2V0RXZlbnQiLCJldmVudE5hbWUiLCJzdWJzY3JpYmVycyIsImNsZWFyRXZlbnRzIiwicHVibGlzaFN1YnNjcmlwdGlvbiIsInN1YnNjcmlwdGlvbiIsIl9zdWJzY3JpYmUiLCJldmVudCIsInN1YnNjcmliZSIsInB1Ymxpc2giLCJzdWJzY3JpYmVyIiwib25jZSIsInVuc3Vic2NyaWJlIiwiRXhjZXB0aW9uIiwiRVJST1JfREVTQyIsImVudW1lcmF0ZURldmljZXMiLCJuYXZpZ2F0b3IiLCJtZWRpYURldmljZXMiLCJnZXRVc2VyTWVkaWEiLCJjb25zdHJhaW50cyIsInN0cmVhbVJlZiIsIndhaXRGb3JWaWRlbyIsInZpZGVvIiwiYXR0ZW1wdHMiLCJjaGVja1ZpZGVvIiwidmlkZW9XaWR0aCIsInZpZGVvSGVpZ2h0IiwiaW5pdENhbWVyYSIsInN0cmVhbSIsInNldEF0dHJpYnV0ZSIsInNyY09iamVjdCIsImFkZEV2ZW50TGlzdGVuZXIiLCJwbGF5IiwiZGVwcmVjYXRlZENvbnN0cmFpbnRzIiwidmlkZW9Db25zdHJhaW50cyIsIm1pbkFzcGVjdFJhdGlvIiwiYXNwZWN0UmF0aW8iLCJmYWNpbmciLCJmYWNpbmdNb2RlIiwicGlja0NvbnN0cmFpbnRzIiwiZGV2aWNlSWQiLCJhdWRpbyIsImVudW1lcmF0ZVZpZGVvRGV2aWNlcyIsImRldmljZXMiLCJkZXZpY2UiLCJnZXRBY3RpdmVUcmFjayIsInRyYWNrcyIsImdldFZpZGVvVHJhY2tzIiwiUXVhZ2dhSlNDYW1lcmFBY2Nlc3MiLCJyZXF1ZXN0ZWRWaWRlb0VsZW1lbnQiLCJyZXF1ZXN0IiwibmV3Q29uc3RyYWludHMiLCJyZWxlYXNlIiwicGF1c2UiLCJ0cmFjayIsImdldEFjdGl2ZVN0cmVhbUxhYmVsIiwiZGlzYWJsZVRvcmNoIiwiYXBwbHlDb25zdHJhaW50cyIsImFkdmFuY2VkIiwidG9yY2giLCJPdmVyY29uc3RyYWluZWRFcnJvciIsImVuYWJsZVRvcmNoIiwiY29udGFpbnMiLCJzb21lIiwiZXZlcnkiLCJwYXNzZXNGaWx0ZXIiLCJyZXN1bHRzIiwiY2FwYWNpdHkiLCJjYXB0dXJlIiwibWF0Y2hlc0NvbnN0cmFpbnRzIiwiYmxhY2tsaXN0IiwiYWRkUmVzdWx0IiwiaW1hZ2VTaXplIiwidG9EYXRhVVJMIiwiZ2V0UmVzdWx0cyIsIkRldkNvbmZpZyIsIm51bU9mV29ya2VycyIsImRlY29kZXIiLCJsb2NhdG9yIiwiTm9kZUNvbmZpZyIsInNlcXVlbmNlIiwiUHJvZENvbmZpZyIsIkV4cG9ydENvbmZpZyIsIlF1YWdnYUNvbmZpZyIsIlRPX1JBRElBTlMiLCJhZGp1c3RDYW52YXNTaXplIiwidGFyZ2V0U2l6ZSIsIkZyYW1lR3JhYmJlciIsIl90aGF0IiwiX3N0cmVhbUNvbmZpZyIsIl92aWRlb1NpemUiLCJnZXRSZWFsV2lkdGgiLCJnZXRSZWFsSGVpZ2h0IiwiX2NhbnZhc1NpemUiLCJnZXRDYW52YXNTaXplIiwiX3NpemUiLCJ0b3BSaWdodCIsImdldFRvcFJpZ2h0IiwiX3N4IiwiX3N5IiwiX2N0eCIsIl9kYXRhIiwidmlkZW9TaXplIiwiY2FudmFzU2l6ZSIsImF0dGFjaERhdGEiLCJnZXREYXRhIiwiZ3JhYiIsImRvSGFsZlNhbXBsZSIsImdldEZyYW1lIiwiZHJhd2FibGUiLCJkcmF3QW5nbGUiLCJ0YWdzIiwib3JpZW50YXRpb24iLCJ0cmFuc2xhdGUiLCJnZXRTaXplIiwiRXhpZlRhZ3MiLCJBdmFpbGFibGVUYWdzIiwiZmluZFRhZ3NJbk9iamVjdFVSTCIsIm9iamVjdFVSTFRvQmxvYiIsInJlYWRUb0J1ZmZlciIsImZpbmRUYWdzSW5CdWZmZXIiLCJiYXNlNjRUb0FycmF5QnVmZmVyIiwiZGF0YVVybCIsImJhc2U2NCIsImF0b2IiLCJ2aWV3IiwiYmxvYiIsImZpbGVSZWFkZXIiLCJGaWxlUmVhZGVyIiwicmVhZEFzQXJyYXlCdWZmZXIiLCJ1cmwiLCJodHRwIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwicmVzcG9uc2VUeXBlIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsIkRPTkUiLCJzdGF0dXMiLCJyZXNwb25zZSIsIm9uZXJyb3IiLCJzZW5kIiwiZmlsZSIsInNlbGVjdGVkVGFncyIsImRhdGFWaWV3IiwiRGF0YVZpZXciLCJleGlmVGFncyIsInNlbGVjdGVkVGFnIiwiZXhpZlRhZyIsIm1hcmtlciIsImdldFVpbnQ4IiwicmVhZEVYSUZEYXRhIiwiZ2V0VWludDE2IiwiZ2V0U3RyaW5nRnJvbUJ1ZmZlciIsInRpZmZPZmZzZXQiLCJiaWdFbmQiLCJmaXJzdElGRE9mZnNldCIsImdldFVpbnQzMiIsInJlYWRUYWdzIiwidGlmZlN0YXJ0IiwiZGlyU3RhcnQiLCJzdHJpbmdzIiwiZW50cnlPZmZzZXQiLCJyZWFkVGFnVmFsdWUiLCJudW1WYWx1ZXMiLCJvdXRzdHIiLCJJbWFnZUxvYWRlciIsImxvYWQiLCJkaXJlY3RvcnkiLCJodG1sSW1hZ2VzU3JjQXJyYXkiLCJodG1sSW1hZ2VzQXJyYXkiLCJudW0iLCJub3RMb2FkZWQiLCJhZGRJbWFnZSIsImltYWdlIiwibG9hZGVkIiwibG9hZGVkSW1nIiwibm90bG9hZGVkSW1ncyIsImltZ05hbWUiLCJzdWJzdHIiLCJsYXN0SW5kZXhPZiIsImFkZE9ubG9hZEhhbmRsZXIiLCJpbnB1dFN0cmVhbUZhY3RvcnkiLCJjcmVhdGVWaWRlb1N0cmVhbSIsIl9ldmVudE5hbWVzIiwiX2V2ZW50SGFuZGxlcnMiLCJfY2FsY3VsYXRlZFdpZHRoIiwiX2NhbGN1bGF0ZWRIZWlnaHQiLCJfdG9wUmlnaHQiLCJpbml0U2l6ZSIsInNldElucHV0U3RyZWFtIiwiZW5kZWQiLCJzZXRDdXJyZW50VGltZSIsInRpbWUiLCJmIiwiYm9vbCIsImNsZWFyRXZlbnRIYW5kbGVycyIsImhhbmRsZXJzIiwiaGFuZGxlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ0cmlnZ2VyIiwiY3JlYXRlTGl2ZVN0cmVhbSIsImNyZWF0ZUltYWdlU3RyZWFtIiwiZnJhbWVJZHgiLCJwYXVzZWQiLCJpbWdBcnJheSIsImJhc2VVcmwiLCJjYWxjdWxhdGVkV2lkdGgiLCJjYWxjdWxhdGVkSGVpZ2h0IiwibG9hZEltYWdlcyIsImltZ3MiLCJwdWJsaXNoRXZlbnQiLCJuZXdXaWR0aCIsIm5ld0hlaWdodCIsImluZCIsIlF1YWdnYUNvbnRleHQiLCJDYW52YXNDb250YWluZXIiLCJDYW52YXNJbmZvIiwiZ2V0Vmlld1BvcnQiLCJIVE1MRWxlbWVudCIsIm5vZGVOYW1lIiwic2VsZWN0b3IiLCJib3hTaXplIiwiQmFyY29kZUxvY2F0b3IiLCJmaW5kT3JDcmVhdGVDYW52YXMiLCJnZXRDYW52YXNBbmRDb250ZXh0Iiwib3B0aW9ucyIsImluaXRDYW52YXNlcyIsInZpZXdwb3J0IiwiY29udGFpbmVyIiwid29ya2VyUG9vbCIsInVwZGF0ZVdvcmtlcnMiLCJmcmFtZUdyYWJiZXIiLCJhdmFpbGFibGVXb3JrZXIiLCJ3b3JrZXJUaHJlYWQiLCJidXN5Iiwid29ya2VyIiwicG9zdE1lc3NhZ2UiLCJjbWQiLCJjb25maWdGb3JXb3JrZXIiLCJ3b3JrZXJJbnRlcmZhY2UiLCJmYWN0b3J5IiwiUXVhZ2dhIiwibWVzc2FnZSIsIm9uUHJvY2Vzc2VkIiwid29ya2VySW50ZXJmYWNlUmVhZHkiLCJvbm1lc3NhZ2UiLCJnZW5lcmF0ZVdvcmtlckJsb2IiLCJmYWN0b3J5U291cmNlIiwiX19mYWN0b3J5U291cmNlX18iLCJCbG9iIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwiaW5pdFdvcmtlciIsImNiIiwiYmxvYlVSTCIsIldvcmtlciIsInJldm9rZU9iamVjdFVSTCIsImFkanVzdFdvcmtlclBvb2wiLCJpbmNyZWFzZUJ5Iiwid29ya2Vyc1RvVGVybWluYXRlIiwidGVybWluYXRlIiwid29ya2VySW5pdGlhbGl6ZWQiLCJzZXR1cElucHV0U3RyZWFtIiwibW92ZUJveCIsInhPZmZzZXQiLCJ5T2Zmc2V0IiwiY29ybmVyIiwibW92ZUxpbmUiLCJmcmFtZWdyYWJiZXIiLCJjYW52YXNDb250YWluZXIiLCJRV29ya2VycyIsImluaXRpYWxpemVEYXRhIiwicmVhZHkiLCJvblVJVGhyZWFkIiwid29ya2Vyc1VwZGF0ZWQiLCJsb2NhdGVBbmREZWNvZGUiLCJfaW5pdEJ1ZmZlcnMiLCJCYXJjb2RlRGVjb2RlciIsIl9nZXRWaWV3UG9ydCIsIl9pbml0Q2FudmFzIiwiaW5wdXRUeXBlIiwiSW5wdXRTdHJlYW0iLCJDYW1lcmFBY2Nlc3MiLCJjYW5SZWNvcmQiLCJiYXJjb2RlIiwidHJhbnNmb3JtUmVzdWx0IiwicmVzdWx0Q29sbGVjdG9yIiwicmVzdWx0VG9QdWJsaXNoIiwiRXZlbnRzIiwiaGFzQ29kZVJlc3VsdCIsImdldEJvdW5kaW5nQm94ZXMiLCJkZWNvZGVSZXN1bHQiLCJwdWJsaXNoUmVzdWx0IiwiaW1hZ2VSZXN1bHQiLCJkZWxheSIsInN0b3BwZWQiLCJ0aW1lc3RhbXAiLCJ1cGRhdGUiLCJwZXJmb3JtYW5jZSIsInN0YXJ0Q29udGludW91c1VwZGF0ZSIsIl9jb250ZXh0IiwiUXVhZ2dhSlNTdGF0aWNJbnRlcmZhY2UiLCJxdWFnZ2FJbnN0YW5jZSIsInByb21pc2UiLCJDb25maWciLCJpbml0SW5wdXRTdHJlYW0iLCJvbkRldGVjdGVkIiwib2ZmRGV0ZWN0ZWQiLCJvZmZQcm9jZXNzZWQiLCJyZWdpc3RlclJlc3VsdENvbGxlY3RvciIsImRlY29kZVNpbmdsZSIsInJlc3VsdENhbGxiYWNrIiwiZGVmYXVsdCIsIlJlYWRlcnMiLCJSZXN1bHRDb2xsZWN0b3IiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO1FDVkE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7O0FDbEZBLFNBQVNBLGVBQWUsQ0FBQ0MsR0FBRyxFQUFFQyxHQUFHLEVBQUVDLEtBQUssRUFBRTtFQUN4QyxJQUFJRCxHQUFHLElBQUlELEdBQUcsRUFBRTtJQUNkRyxNQUFNLENBQUNDLGNBQWMsQ0FBQ0osR0FBRyxFQUFFQyxHQUFHLEVBQUU7TUFDOUJDLEtBQUssRUFBRUEsS0FBSztNQUNaRyxVQUFVLEVBQUUsSUFBSTtNQUNoQkMsWUFBWSxFQUFFLElBQUk7TUFDbEJDLFFBQVEsRUFBRTtJQUNaLENBQUMsQ0FBQztFQUNKLENBQUMsTUFBTTtJQUNMUCxHQUFHLENBQUNDLEdBQUcs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QyxHQUFHLEVBQUVDLEdBQUcsRUFBRUMsR0FBRyxFQUFFO0VBQzdDLElBQUlULEdBQUcsR0FBRyxJQUFJQyxVQUFtQixDQUFDLENBQUMsQ0FBQztFQUNwQ0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHTSxHQUFHO0VBQ1pOLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBR08sR0FBRztFQUNaUCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUdRLEdBQUc7RUFDWlIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHUyxHQUFHO0VBQ1osT0FBT1QsR0FBRztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU8sU0FBU1UsR0FBRyxDQUFDVixHQUFHLEVBQUVNLEdBQUcsRUFBRUMsR0FBRyxFQUFFQyxHQUFHLEVBQUVDLEdBQUcsRUFBRTtFQUMzQ1QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHTSxHQUFHO0VBQ1pOLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBR08sR0FBRztFQUNaUCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUdRLEdBQUc7RUFDWlIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHUyxHQUFHO0VBQ1osT0FBT1QsR0FBRztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU8sU0FBU1csU0FBUyxDQUFDWCxHQUFHLEVBQUVWLENBQUMsRUFBRTtFQUNoQztFQUNBO0VBQ0EsSUFBSVUsR0FBRyxLQUFLVixDQUFDLEVBQUU7SUFDYixJQUFJc0IsRUFBRSxHQUFHdEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNiVSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUdWLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYlUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHWSxFQUFFO0VBQ2IsQ0FBQyxNQUFNO0lBQ0xaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBR1YsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNiVSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdB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QUMxQixLQUFLclUsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHc1UsUUFBUSxFQUFFdFUsQ0FBQyxFQUFFLEVBQUU7TUFDM0I7TUFDQWtVLFFBQVEsQ0FBQ0ssU0FBUyxDQUFDLEdBQUcsQ0FDakIsS0FBSyxHQUFHTixVQUFVLENBQUNFLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ25DLEtBQUssR0FBR0YsVUFBVSxDQUFDRSxTQUFTLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUNyQyxLQUFLLEdBQUdGLFVBQVUsQ0FBQ0UsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFDckMsS0FBSyxHQUFHRixVQUFVLENBQUMsQ0FBQ0UsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQzNDLEtBQUssR0FBR0YsVUFBVSxDQUFDLENBQUNFLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUMzQyxLQUFLLEdBQUdGLFVBQVUsQ0FBQyxDQUFDRSxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUM1QyxLQUFLLEdBQUdGLFVBQVUsQ0FBRUcsWUFBWSxHQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDMUMsS0FBSyxHQUFHSCxVQUFVLENBQUVHLFlBQVksR0FBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQzFDLEtBQUssR0FBR0gsVUFBVSxDQUFFRyxZQUFZLEdBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQzNDLEtBQUssR0FBR0gsVUFBVSxDQUFDLENBQUNHLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUM5QyxLQUFLLEdBQUdILFVBQVUsQ0FBQyxDQUFDRyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDOUMsS0FBSyxHQUFHSCxVQUFVLENBQUMsQ0FBQ0csWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FB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LEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVB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RSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFB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bkIsQ0FBQyxFQUFFLElBQUksQ0FBQztVQUNSdzNDLGNBQWMsQ0FBQy82QixLQUFLLEVBQUU7UUFDMUIsQ0FBQyxFQUFFLElBQUksRUFBRSs2QixjQUFjLENBQUM7TUFDNUIsQ0FBQyxDQUFDLE9BQU8vcEMsR0FBRyxFQUFFO1FBQ1ZWLE1BQU0sQ0FBQ1UsR0FBRyxDQUFDO01BQ2Y7SUFDSixDQUFDLENBQUM7RUFDTixDQUFDO0VBQ0Q7RUFDQTtFQUNBLElBQUl5cUMsT0FBTyxHQUFHO0lBQ1YsT0FBT1gsdUJBQXVCO0VBQ2xDLENBQUM7RUFDRFksT0FBTyxFQUFQQSxzQkFBTztFQUNQL0IsWUFBWSxFQUFaQSxhQUFZO0VBQ1pwakMsVUFBVSxFQUFWQSw4QkFBVTtFQUNWekksWUFBWSxFQUFaQSxnQ0FBWTtFQUNaNnRDLGVBQWUsRUFBZkEsZ0JBQWVBO0FBQ25CLENBQUM7QUFFY2IsbUdBQXVCLEVBQUM7QUFDdkMiLCJmaWxlIjoicXVhZ2dhLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiUXVhZ2dhXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlF1YWdnYVwiXSA9IGZhY3RvcnkoKTtcbn0pKHdpbmRvdywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA3Mik7XG4iLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9kZWZpbmVQcm9wZXJ0eSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG4gIHJldHVybiBzZWxmO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemVkLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO1xuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jbGFzc0NhbGxDaGVjaywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2NyZWF0ZUNsYXNzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiLyoqXG4gKiBDb21tb24gdXRpbGl0aWVzXG4gKiBAbW9kdWxlIGdsTWF0cml4XG4gKi9cbi8vIENvbmZpZ3VyYXRpb24gQ29uc3RhbnRzXG5leHBvcnQgdmFyIEVQU0lMT04gPSAwLjAwMDAwMTtcbmV4cG9ydCB2YXIgQVJSQVlfVFlQRSA9IHR5cGVvZiBGbG9hdDMyQXJyYXkgIT09ICd1bmRlZmluZWQnID8gRmxvYXQzMkFycmF5IDogQXJyYXk7XG5leHBvcnQgdmFyIFJBTkRPTSA9IE1hdGgucmFuZG9tO1xuLyoqXG4gKiBTZXRzIHRoZSB0eXBlIG9mIGFycmF5IHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdmVjdG9ycyBhbmQgbWF0cmljZXNcbiAqXG4gKiBAcGFyYW0ge0Zsb2F0MzJBcnJheUNvbnN0cnVjdG9yIHwgQXJyYXlDb25zdHJ1Y3Rvcn0gdHlwZSBBcnJheSB0eXBlLCBzdWNoIGFzIEZsb2F0MzJBcnJheSBvciBBcnJheVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRNYXRyaXhBcnJheVR5cGUodHlwZSkge1xuICBBUlJBWV9UWVBFID0gdHlwZTtcbn1cbnZhciBkZWdyZWUgPSBNYXRoLlBJIC8gMTgwO1xuLyoqXG4gKiBDb252ZXJ0IERlZ3JlZSBUbyBSYWRpYW5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gYSBBbmdsZSBpbiBEZWdyZWVzXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUmFkaWFuKGEpIHtcbiAgcmV0dXJuIGEgKiBkZWdyZWU7XG59XG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IHRoZSBhcmd1bWVudHMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIHZhbHVlLCB3aXRoaW4gYW4gYWJzb2x1dGVcbiAqIG9yIHJlbGF0aXZlIHRvbGVyYW5jZSBvZiBnbE1hdHJpeC5FUFNJTE9OIChhbiBhYnNvbHV0ZSB0b2xlcmFuY2UgaXMgdXNlZCBmb3IgdmFsdWVzIGxlc3NcbiAqIHRoYW4gb3IgZXF1YWwgdG8gMS4wLCBhbmQgYSByZWxhdGl2ZSB0b2xlcmFuY2UgaXMgdXNlZCBmb3IgbGFyZ2VyIHZhbHVlcylcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gYSBUaGUgZmlyc3QgbnVtYmVyIHRvIHRlc3QuXG4gKiBAcGFyYW0ge051bWJlcn0gYiBUaGUgc2Vjb25kIG51bWJlciB0byB0ZXN0LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlcnMgYXJlIGFwcHJveGltYXRlbHkgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIE1hdGguYWJzKGEgLSBiKSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhKSwgTWF0aC5hYnMoYikpO1xufVxuaWYgKCFNYXRoLmh5cG90KSBNYXRoLmh5cG90ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgeSA9IDAsXG4gICAgICBpID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgeSArPSBhcmd1bWVudHNbaV0gKiBhcmd1bWVudHNbaV07XG4gIH1cblxuICByZXR1cm4gTWF0aC5zcXJ0KHkpO1xufTsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxuICogMngyIE1hdHJpeFxuICogQG1vZHVsZSBtYXQyXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJcbiAqXG4gKiBAcmV0dXJucyB7bWF0Mn0gYSBuZXcgMngyIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gIH1cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbM10gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDIgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0MiB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCBhIG1hdDIgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgbWF0MiB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDMpXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0IEEgbmV3IDJ4MiBtYXRyaXhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyhtMDAsIG0wMSwgbTEwLCBtMTEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICBvdXRbMF0gPSBtMDA7XG4gIG91dFsxXSA9IG0wMTtcbiAgb3V0WzJdID0gbTEwO1xuICBvdXRbM10gPSBtMTE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIG1hdDIgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDMpXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIG0wMCwgbTAxLCBtMTAsIG0xMSkge1xuICBvdXRbMF0gPSBtMDA7XG4gIG91dFsxXSA9IG0wMTtcbiAgb3V0WzJdID0gbTEwO1xuICBvdXRbM10gPSBtMTE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2Uob3V0LCBhKSB7XG4gIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGVcbiAgLy8gc29tZSB2YWx1ZXNcbiAgaWYgKG91dCA9PT0gYSkge1xuICAgIHZhciBhMSA9IGFbMV07XG4gICAgb3V0WzFdID0gYVsyXTtcbiAgICBvdXRbMl0gPSBhMTtcbiAgfSBlbHNlIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMl07XG4gICAgb3V0WzJdID0gYVsxXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdOyAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG5cbiAgdmFyIGRldCA9IGEwICogYTMgLSBhMiAqIGExO1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IGEzICogZGV0O1xuICBvdXRbMV0gPSAtYTEgKiBkZXQ7XG4gIG91dFsyXSA9IC1hMiAqIGRldDtcbiAgb3V0WzNdID0gYTAgKiBkZXQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFkanVnYXRlIG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGpvaW50KG91dCwgYSkge1xuICAvLyBDYWNoaW5nIHRoaXMgdmFsdWUgaXMgbmVzc2VjYXJ5IGlmIG91dCA9PSBhXG4gIHZhciBhMCA9IGFbMF07XG4gIG91dFswXSA9IGFbM107XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgb3V0WzNdID0gYTA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluYW50KGEpIHtcbiAgcmV0dXJuIGFbMF0gKiBhWzNdIC0gYVsyXSAqIGFbMV07XG59XG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDInc1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdO1xuICBvdXRbMF0gPSBhMCAqIGIwICsgYTIgKiBiMTtcbiAgb3V0WzFdID0gYTEgKiBiMCArIGEzICogYjE7XG4gIG91dFsyXSA9IGEwICogYjIgKyBhMiAqIGIzO1xuICBvdXRbM10gPSBhMSAqIGIyICsgYTMgKiBiMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIG1hdDIgYnkgdGhlIGdpdmVuIGFuZ2xlXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCByYWQpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGEwICogYyArIGEyICogcztcbiAgb3V0WzFdID0gYTEgKiBjICsgYTMgKiBzO1xuICBvdXRbMl0gPSBhMCAqIC1zICsgYTIgKiBjO1xuICBvdXRbM10gPSBhMSAqIC1zICsgYTMgKiBjO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTY2FsZXMgdGhlIG1hdDIgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgdjAgPSB2WzBdLFxuICAgICAgdjEgPSB2WzFdO1xuICBvdXRbMF0gPSBhMCAqIHYwO1xuICBvdXRbMV0gPSBhMSAqIHYwO1xuICBvdXRbMl0gPSBhMiAqIHYxO1xuICBvdXRbM10gPSBhMyAqIHYxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZVxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDIuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0Mi5yb3RhdGUoZGVzdCwgZGVzdCwgcmFkKTtcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCBtYXQyIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGM7XG4gIG91dFsxXSA9IHM7XG4gIG91dFsyXSA9IC1zO1xuICBvdXRbM10gPSBjO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDIuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0Mi5zY2FsZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IG1hdDIgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IFNjYWxpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TY2FsaW5nKG91dCwgdikge1xuICBvdXRbMF0gPSB2WzBdO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSB2WzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcIm1hdDIoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIiwgXCIgKyBhWzNdICsgXCIpXCI7XG59XG4vKipcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb2IoYSkge1xuICByZXR1cm4gTWF0aC5oeXBvdChhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTtcbn1cbi8qKlxuICogUmV0dXJucyBMLCBEIGFuZCBVIG1hdHJpY2VzIChMb3dlciB0cmlhbmd1bGFyLCBEaWFnb25hbCBhbmQgVXBwZXIgdHJpYW5ndWxhcikgYnkgZmFjdG9yaXppbmcgdGhlIGlucHV0IG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IEwgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gRCB0aGUgZGlhZ29uYWwgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gVSB0aGUgdXBwZXIgdHJpYW5ndWxhciBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBpbnB1dCBtYXRyaXggdG8gZmFjdG9yaXplXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIExEVShMLCBELCBVLCBhKSB7XG4gIExbMl0gPSBhWzJdIC8gYVswXTtcbiAgVVswXSA9IGFbMF07XG4gIFVbMV0gPSBhWzFdO1xuICBVWzNdID0gYVszXSAtIExbMl0gKiBVWzFdO1xuICByZXR1cm4gW0wsIEQsIFVdO1xufVxuLyoqXG4gKiBBZGRzIHR3byBtYXQyJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXTtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKTtcbn1cbi8qKlxuICogTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHRoZSBtYXRyaXggYnkgYSBzY2FsYXIuXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgbWF0cml4J3MgZWxlbWVudHMgYnlcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byBtYXQyJ3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDIubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDIuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXG4gKiAyIERpbWVuc2lvbmFsIFZlY3RvclxuICogQG1vZHVsZSB2ZWMyXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMyXG4gKlxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzIgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2xvbmVcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzIgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHkpIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogRGl2aWRlcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGl2aWRlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAvIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNlaWxcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBmbG9vclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmbG9vcihvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1heChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gcm91bmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyBhIHZlYzIgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEFkZHMgdHdvIHZlYzIncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgIHkgPSBiWzFdIC0gYVsxXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSk7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWREaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICB5ID0gYlsxXSAtIGFbMV07XG4gIHJldHVybiB4ICogeCArIHkgKiB5O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5KTtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkTGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIHJldHVybiB4ICogeCArIHkgKiB5O1xufVxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gaW52ZXJ0XG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2Uob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeTtcblxuICBpZiAobGVuID4gMCkge1xuICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICB9XG5cbiAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZG90KGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV07XG59XG4vKipcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcbiAqIE5vdGUgdGhhdCB0aGUgY3Jvc3MgcHJvZHVjdCBtdXN0IGJ5IGRlZmluaXRpb24gcHJvZHVjZSBhIDNEIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyb3NzKG91dCwgYSwgYikge1xuICB2YXIgeiA9IGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF07XG4gIG91dFswXSA9IG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IHo7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlIHx8IDEuMDtcbiAgdmFyIHIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAqIE1hdGguUEk7XG4gIG91dFswXSA9IE1hdGguY29zKHIpICogc2NhbGU7XG4gIG91dFsxXSA9IE1hdGguc2luKHIpICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQyKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzJdICogeTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzNdICogeTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MmQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDNcbiAqIDNyZCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MyhvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVszXSAqIHkgKyBtWzZdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNF0gKiB5ICsgbVs3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0NFxuICogM3JkIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMCdcbiAqIDR0aCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0NChvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzEyXTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bMTNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGUgYSAyRCB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IFRoZSByZWNlaXZpbmcgdmVjMlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgVGhlIHZlYzIgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCBiLCByYWQpIHtcbiAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICB2YXIgcDAgPSBhWzBdIC0gYlswXSxcbiAgICAgIHAxID0gYVsxXSAtIGJbMV0sXG4gICAgICBzaW5DID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGNvc0MgPSBNYXRoLmNvcyhyYWQpOyAvL3BlcmZvcm0gcm90YXRpb24gYW5kIHRyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gcDAgKiBjb3NDIC0gcDEgKiBzaW5DICsgYlswXTtcbiAgb3V0WzFdID0gcDAgKiBzaW5DICsgcDEgKiBjb3NDICsgYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHR3byAyRCB2ZWN0b3JzXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFuc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhbmdsZShhLCBiKSB7XG4gIHZhciB4MSA9IGFbMF0sXG4gICAgICB5MSA9IGFbMV0sXG4gICAgICB4MiA9IGJbMF0sXG4gICAgICB5MiA9IGJbMV0sXG4gICAgICAvLyBtYWcgaXMgdGhlIHByb2R1Y3Qgb2YgdGhlIG1hZ25pdHVkZXMgb2YgYSBhbmQgYlxuICBtYWcgPSBNYXRoLnNxcnQoeDEgKiB4MSArIHkxICogeTEpICogTWF0aC5zcXJ0KHgyICogeDIgKyB5MiAqIHkyKSxcbiAgICAgIC8vIG1hZyAmJi4uIHNob3J0IGNpcmN1aXRzIGlmIG1hZyA9PSAwXG4gIGNvc2luZSA9IG1hZyAmJiAoeDEgKiB4MiArIHkxICogeTIpIC8gbWFnOyAvLyBNYXRoLm1pbihNYXRoLm1heChjb3NpbmUsIC0xKSwgMSkgY2xhbXBzIHRoZSBjb3NpbmUgYmV0d2VlbiAtMSBhbmQgMVxuXG4gIHJldHVybiBNYXRoLmFjb3MoTWF0aC5taW4oTWF0aC5tYXgoY29zaW5lLCAtMSksIDEpKTtcbn1cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMiB0byB6ZXJvXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gemVybyhvdXQpIHtcbiAgb3V0WzBdID0gMC4wO1xuICBvdXRbMV0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJ2ZWMyKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIilcIjtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBleGFjdGx5IGhhdmUgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXTtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpO1xufVxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5kaXZpZGV9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGRpdiA9IGRpdmlkZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBkaXN0ID0gZGlzdGFuY2U7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zcXVhcmVkRGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNxckRpc3QgPSBzcXVhcmVkRGlzdGFuY2U7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzcXJMZW4gPSBzcXVhcmVkTGVuZ3RoO1xuLyoqXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjMnMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYSB0aGUgYXJyYXkgb2YgdmVjdG9ycyB0byBpdGVyYXRlIG92ZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjMi4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IE51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIHZlYzJzIHRvIGl0ZXJhdGUgb3Zlci4gSWYgMCBpdGVyYXRlcyBvdmVyIGVudGlyZSBhcnJheVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ10gYWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIGZuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGFcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZm9yRWFjaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZlYyA9IGNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgIHZhciBpLCBsO1xuXG4gICAgaWYgKCFzdHJpZGUpIHtcbiAgICAgIHN0cmlkZSA9IDI7XG4gICAgfVxuXG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBsID0gTWF0aC5taW4oY291bnQgKiBzdHJpZGUgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbCA9IGEubGVuZ3RoO1xuICAgIH1cblxuICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICB2ZWNbMF0gPSBhW2ldO1xuICAgICAgdmVjWzFdID0gYVtpICsgMV07XG4gICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgIGFbaV0gPSB2ZWNbMF07XG4gICAgICBhW2kgKyAxXSA9IHZlY1sxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfTtcbn0oKTsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxuICogMyBEaW1lbnNpb25hbCBWZWN0b3JcbiAqIEBtb2R1bGUgdmVjM1xuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjM1xuICpcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzMgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2xvbmVcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeik7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMyBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjM30gYSBuZXcgM0QgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoeCwgeSwgeikge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIG91dFsyXSA9IHo7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWMzIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIHNvdXJjZSB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMyB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSwgeikge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKiBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBEaXZpZGVzIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXZpZGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGNlaWxcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguY2VpbChhWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTWF0aC5mbG9vciB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGZsb29yXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZsb29yKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmZsb29yKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtaW4ob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5taW4oYVsyXSwgYlsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1heChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTWF0aC5yb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIHJvdW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLnJvdW5kKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLnJvdW5kKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLnJvdW5kKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMzIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHZlY3RvciBieVxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gdmVjMydzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogejtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkTGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogejtcbn1cbi8qKlxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBuZWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgb3V0WzJdID0gLWFbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgb3V0WzJdID0gMS4wIC8gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTm9ybWFsaXplIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgdmFyIGxlbiA9IHggKiB4ICsgeSAqIHkgKyB6ICogejtcblxuICBpZiAobGVuID4gMCkge1xuICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICB9XG5cbiAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgb3V0WzJdID0gYVsyXSAqIGxlbjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZG90KGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyb3NzKG91dCwgYSwgYikge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdO1xuICB2YXIgYnggPSBiWzBdLFxuICAgICAgYnkgPSBiWzFdLFxuICAgICAgYnogPSBiWzJdO1xuICBvdXRbMF0gPSBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzFdID0gYXogKiBieCAtIGF4ICogYno7XG4gIG91dFsyXSA9IGF4ICogYnkgLSBheSAqIGJ4O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlcnAob3V0LCBhLCBiLCB0KSB7XG4gIHZhciBheCA9IGFbMF07XG4gIHZhciBheSA9IGFbMV07XG4gIHZhciBheiA9IGFbMl07XG4gIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgb3V0WzJdID0gYXogKyB0ICogKGJbMl0gLSBheik7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFBlcmZvcm1zIGEgaGVybWl0ZSBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBjIHRoZSB0aGlyZCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZCB0aGUgZm91cnRoIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaGVybWl0ZShvdXQsIGEsIGIsIGMsIGQsIHQpIHtcbiAgdmFyIGZhY3RvclRpbWVzMiA9IHQgKiB0O1xuICB2YXIgZmFjdG9yMSA9IGZhY3RvclRpbWVzMiAqICgyICogdCAtIDMpICsgMTtcbiAgdmFyIGZhY3RvcjIgPSBmYWN0b3JUaW1lczIgKiAodCAtIDIpICsgdDtcbiAgdmFyIGZhY3RvcjMgPSBmYWN0b3JUaW1lczIgKiAodCAtIDEpO1xuICB2YXIgZmFjdG9yNCA9IGZhY3RvclRpbWVzMiAqICgzIC0gMiAqIHQpO1xuICBvdXRbMF0gPSBhWzBdICogZmFjdG9yMSArIGJbMF0gKiBmYWN0b3IyICsgY1swXSAqIGZhY3RvcjMgKyBkWzBdICogZmFjdG9yNDtcbiAgb3V0WzFdID0gYVsxXSAqIGZhY3RvcjEgKyBiWzFdICogZmFjdG9yMiArIGNbMV0gKiBmYWN0b3IzICsgZFsxXSAqIGZhY3RvcjQ7XG4gIG91dFsyXSA9IGFbMl0gKiBmYWN0b3IxICsgYlsyXSAqIGZhY3RvcjIgKyBjWzJdICogZmFjdG9yMyArIGRbMl0gKiBmYWN0b3I0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBQZXJmb3JtcyBhIGJlemllciBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBjIHRoZSB0aGlyZCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZCB0aGUgZm91cnRoIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYmV6aWVyKG91dCwgYSwgYiwgYywgZCwgdCkge1xuICB2YXIgaW52ZXJzZUZhY3RvciA9IDEgLSB0O1xuICB2YXIgaW52ZXJzZUZhY3RvclRpbWVzVHdvID0gaW52ZXJzZUZhY3RvciAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdDtcbiAgdmFyIGZhY3RvcjEgPSBpbnZlcnNlRmFjdG9yVGltZXNUd28gKiBpbnZlcnNlRmFjdG9yO1xuICB2YXIgZmFjdG9yMiA9IDMgKiB0ICogaW52ZXJzZUZhY3RvclRpbWVzVHdvO1xuICB2YXIgZmFjdG9yMyA9IDMgKiBmYWN0b3JUaW1lczIgKiBpbnZlcnNlRmFjdG9yO1xuICB2YXIgZmFjdG9yNCA9IGZhY3RvclRpbWVzMiAqIHQ7XG4gIG91dFswXSA9IGFbMF0gKiBmYWN0b3IxICsgYlswXSAqIGZhY3RvcjIgKyBjWzBdICogZmFjdG9yMyArIGRbMF0gKiBmYWN0b3I0O1xuICBvdXRbMV0gPSBhWzFdICogZmFjdG9yMSArIGJbMV0gKiBmYWN0b3IyICsgY1sxXSAqIGZhY3RvcjMgKyBkWzFdICogZmFjdG9yNDtcbiAgb3V0WzJdID0gYVsyXSAqIGZhY3RvcjEgKyBiWzJdICogZmFjdG9yMiArIGNbMl0gKiBmYWN0b3IzICsgZFsyXSAqIGZhY3RvcjQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQsIHNjYWxlKSB7XG4gIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuICB2YXIgciA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgdmFyIHogPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAtIDEuMDtcbiAgdmFyIHpTY2FsZSA9IE1hdGguc3FydCgxLjAgLSB6ICogeikgKiBzY2FsZTtcbiAgb3V0WzBdID0gTWF0aC5jb3MocikgKiB6U2NhbGU7XG4gIG91dFsxXSA9IE1hdGguc2luKHIpICogelNjYWxlO1xuICBvdXRbMl0gPSB6ICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDQuXG4gKiA0dGggdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07XG4gIHZhciB3ID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTFdICogeiArIG1bMTVdO1xuICB3ID0gdyB8fCAxLjA7XG4gIG91dFswXSA9IChtWzBdICogeCArIG1bNF0gKiB5ICsgbVs4XSAqIHogKyBtWzEyXSkgLyB3O1xuICBvdXRbMV0gPSAobVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10pIC8gdztcbiAgb3V0WzJdID0gKG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzEwXSAqIHogKyBtWzE0XSkgLyB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQzLlxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IG0gdGhlIDN4MyBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MyhvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTtcbiAgb3V0WzBdID0geCAqIG1bMF0gKyB5ICogbVszXSArIHogKiBtWzZdO1xuICBvdXRbMV0gPSB4ICogbVsxXSArIHkgKiBtWzRdICsgeiAqIG1bN107XG4gIG91dFsyXSA9IHggKiBtWzJdICsgeSAqIG1bNV0gKyB6ICogbVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgcXVhdFxuICogQ2FuIGFsc28gYmUgdXNlZCBmb3IgZHVhbCBxdWF0ZXJuaW9ucy4gKE11bHRpcGx5IGl0IHdpdGggdGhlIHJlYWwgcGFydClcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIHF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtUXVhdChvdXQsIGEsIHEpIHtcbiAgLy8gYmVuY2htYXJrczogaHR0cHM6Ly9qc3BlcmYuY29tL3F1YXRlcm5pb24tdHJhbnNmb3JtLXZlYzMtaW1wbGVtZW50YXRpb25zLWZpeGVkXG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM107XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07IC8vIHZhciBxdmVjID0gW3F4LCBxeSwgcXpdO1xuICAvLyB2YXIgdXYgPSB2ZWMzLmNyb3NzKFtdLCBxdmVjLCBhKTtcblxuICB2YXIgdXZ4ID0gcXkgKiB6IC0gcXogKiB5LFxuICAgICAgdXZ5ID0gcXogKiB4IC0gcXggKiB6LFxuICAgICAgdXZ6ID0gcXggKiB5IC0gcXkgKiB4OyAvLyB2YXIgdXV2ID0gdmVjMy5jcm9zcyhbXSwgcXZlYywgdXYpO1xuXG4gIHZhciB1dXZ4ID0gcXkgKiB1dnogLSBxeiAqIHV2eSxcbiAgICAgIHV1dnkgPSBxeiAqIHV2eCAtIHF4ICogdXZ6LFxuICAgICAgdXV2eiA9IHF4ICogdXZ5IC0gcXkgKiB1dng7IC8vIHZlYzMuc2NhbGUodXYsIHV2LCAyICogdyk7XG5cbiAgdmFyIHcyID0gcXcgKiAyO1xuICB1dnggKj0gdzI7XG4gIHV2eSAqPSB3MjtcbiAgdXZ6ICo9IHcyOyAvLyB2ZWMzLnNjYWxlKHV1diwgdXV2LCAyKTtcblxuICB1dXZ4ICo9IDI7XG4gIHV1dnkgKj0gMjtcbiAgdXV2eiAqPSAyOyAvLyByZXR1cm4gdmVjMy5hZGQob3V0LCBhLCB2ZWMzLmFkZChvdXQsIHV2LCB1dXYpKTtcblxuICBvdXRbMF0gPSB4ICsgdXZ4ICsgdXV2eDtcbiAgb3V0WzFdID0geSArIHV2eSArIHV1dnk7XG4gIG91dFsyXSA9IHogKyB1dnogKyB1dXZ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB4LWF4aXNcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVYKG91dCwgYSwgYiwgcmFkKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFswXTtcbiAgclsxXSA9IHBbMV0gKiBNYXRoLmNvcyhyYWQpIC0gcFsyXSAqIE1hdGguc2luKHJhZCk7XG4gIHJbMl0gPSBwWzFdICogTWF0aC5zaW4ocmFkKSArIHBbMl0gKiBNYXRoLmNvcyhyYWQpOyAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlIGEgM0QgdmVjdG9yIGFyb3VuZCB0aGUgeS1heGlzXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWShvdXQsIGEsIGIsIHJhZCkge1xuICB2YXIgcCA9IFtdLFxuICAgICAgciA9IFtdOyAvL1RyYW5zbGF0ZSBwb2ludCB0byB0aGUgb3JpZ2luXG5cbiAgcFswXSA9IGFbMF0gLSBiWzBdO1xuICBwWzFdID0gYVsxXSAtIGJbMV07XG4gIHBbMl0gPSBhWzJdIC0gYlsyXTsgLy9wZXJmb3JtIHJvdGF0aW9uXG5cbiAgclswXSA9IHBbMl0gKiBNYXRoLnNpbihyYWQpICsgcFswXSAqIE1hdGguY29zKHJhZCk7XG4gIHJbMV0gPSBwWzFdO1xuICByWzJdID0gcFsyXSAqIE1hdGguY29zKHJhZCkgLSBwWzBdICogTWF0aC5zaW4ocmFkKTsgLy90cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gclsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHotYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgdmVjMyBwb2ludCB0byByb3RhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCBiLCByYWQpIHtcbiAgdmFyIHAgPSBbXSxcbiAgICAgIHIgPSBbXTsgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXG4gIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgcFsxXSA9IGFbMV0gLSBiWzFdO1xuICBwWzJdID0gYVsyXSAtIGJbMl07IC8vcGVyZm9ybSByb3RhdGlvblxuXG4gIHJbMF0gPSBwWzBdICogTWF0aC5jb3MocmFkKSAtIHBbMV0gKiBNYXRoLnNpbihyYWQpO1xuICByWzFdID0gcFswXSAqIE1hdGguc2luKHJhZCkgKyBwWzFdICogTWF0aC5jb3MocmFkKTtcbiAgclsyXSA9IHBbMl07IC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgb3V0WzFdID0gclsxXSArIGJbMV07XG4gIG91dFsyXSA9IHJbMl0gKyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZXQgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIDNEIHZlY3RvcnNcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFuZ2xlKGEsIGIpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXSxcbiAgICAgIG1hZzEgPSBNYXRoLnNxcnQoYXggKiBheCArIGF5ICogYXkgKyBheiAqIGF6KSxcbiAgICAgIG1hZzIgPSBNYXRoLnNxcnQoYnggKiBieCArIGJ5ICogYnkgKyBieiAqIGJ6KSxcbiAgICAgIG1hZyA9IG1hZzEgKiBtYWcyLFxuICAgICAgY29zaW5lID0gbWFnICYmIGRvdChhLCBiKSAvIG1hZztcbiAgcmV0dXJuIE1hdGguYWNvcyhNYXRoLm1pbihNYXRoLm1heChjb3NpbmUsIC0xKSwgMSkpO1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzIHRvIHplcm9cbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvKG91dCkge1xuICBvdXRbMF0gPSAwLjA7XG4gIG91dFsxXSA9IDAuMDtcbiAgb3V0WzJdID0gMC4wO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwidmVjMyhcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiKVwiO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl07XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSk7XG59XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5kaXZpZGV9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGRpdiA9IGRpdmlkZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBkaXN0ID0gZGlzdGFuY2U7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkRGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNxckRpc3QgPSBzcXVhcmVkRGlzdGFuY2U7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMzcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMzLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjM3MgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBmb3JFYWNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdmVjID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgdmFyIGksIGw7XG5cbiAgICBpZiAoIXN0cmlkZSkge1xuICAgICAgc3RyaWRlID0gMztcbiAgICB9XG5cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGwgPSBNYXRoLm1pbihjb3VudCAqIHN0cmlkZSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsID0gYS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIHZlY1swXSA9IGFbaV07XG4gICAgICB2ZWNbMV0gPSBhW2kgKyAxXTtcbiAgICAgIHZlY1syXSA9IGFbaSArIDJdO1xuICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICBhW2ldID0gdmVjWzBdO1xuICAgICAgYVtpICsgMV0gPSB2ZWNbMV07XG4gICAgICBhW2kgKyAyXSA9IHZlY1syXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfTtcbn0oKTsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbmltcG9ydCAqIGFzIG1hdDIgZnJvbSBcIi4vbWF0Mi5qc1wiO1xuaW1wb3J0ICogYXMgbWF0MmQgZnJvbSBcIi4vbWF0MmQuanNcIjtcbmltcG9ydCAqIGFzIG1hdDMgZnJvbSBcIi4vbWF0My5qc1wiO1xuaW1wb3J0ICogYXMgbWF0NCBmcm9tIFwiLi9tYXQ0LmpzXCI7XG5pbXBvcnQgKiBhcyBxdWF0IGZyb20gXCIuL3F1YXQuanNcIjtcbmltcG9ydCAqIGFzIHF1YXQyIGZyb20gXCIuL3F1YXQyLmpzXCI7XG5pbXBvcnQgKiBhcyB2ZWMyIGZyb20gXCIuL3ZlYzIuanNcIjtcbmltcG9ydCAqIGFzIHZlYzMgZnJvbSBcIi4vdmVjMy5qc1wiO1xuaW1wb3J0ICogYXMgdmVjNCBmcm9tIFwiLi92ZWM0LmpzXCI7XG5leHBvcnQgeyBnbE1hdHJpeCwgbWF0MiwgbWF0MmQsIG1hdDMsIG1hdDQsIHF1YXQsIHF1YXQyLCB2ZWMyLCB2ZWMzLCB2ZWM0IH07IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi90eXBlb2YuanNcIilbXCJkZWZhdWx0XCJdO1xudmFyIGFzc2VydFRoaXNJbml0aWFsaXplZCA9IHJlcXVpcmUoXCIuL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qc1wiKTtcbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICByZXR1cm4gY2FsbDtcbiAgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7XG4gIH1cbiAgcmV0dXJuIGFzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiKTtcbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2luaGVyaXRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiLy8gVE9ETyhCYWJlbCA4KTogUmVtb3ZlIHRoaXMgZmlsZS5cblxudmFyIHJ1bnRpbWUgPSByZXF1aXJlKFwiLi4vaGVscGVycy9yZWdlbmVyYXRvclJ1bnRpbWVcIikoKTtcbm1vZHVsZS5leHBvcnRzID0gcnVudGltZTtcblxuLy8gQ29waWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2Jsb2IvbWFpbi9wYWNrYWdlcy9ydW50aW1lL3J1bnRpbWUuanMjTDczNj1cbnRyeSB7XG4gIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG59IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09IFwib2JqZWN0XCIpIHtcbiAgICBnbG9iYWxUaGlzLnJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG4gIH0gZWxzZSB7XG4gICAgRnVuY3Rpb24oXCJyXCIsIFwicmVnZW5lcmF0b3JSdW50aW1lID0gclwiKShydW50aW1lKTtcbiAgfVxufVxuIiwiLy8gVE9ETzogY2x1c3Rlci5qcyBhbmQgY3ZfdXRpbHMuanMgYXJlIHByZXR0eSB0aWdodGx5IGludGVydHdpbmVkLCBtYWtpbmcgZm9yIGEgY29tcGxleCBjb252ZXJzaW9uXG4vLyBpbnRvIHR5cGVzY3JpcHQuIGJlIHdhcm5lZC4gOi0pXG5cbmltcG9ydCB7IGdsTWF0cml4LCB2ZWMyIH0gZnJvbSAnZ2wtbWF0cml4JztcblxuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtcbi8qKlxuICogQ3JlYXRlcyBhIGNsdXN0ZXIgZm9yIGdyb3VwaW5nIHNpbWlsYXIgb3JpZW50YXRpb25zIG9mIGRhdGFwb2ludHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQge1xuICAgIGNyZWF0ZShwb2ludCwgdGhyZXNob2xkKSB7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IFtdO1xuICAgICAgICBjb25zdCBjZW50ZXIgPSB7XG4gICAgICAgICAgICByYWQ6IDAsXG4gICAgICAgICAgICB2ZWM6IHZlYzIuY2xvbmUoWzAsIDBdKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcG9pbnRNYXAgPSB7fTtcblxuICAgICAgICBmdW5jdGlvbiBhZGQocG9pbnRUb0FkZCkge1xuICAgICAgICAgICAgcG9pbnRNYXBbcG9pbnRUb0FkZC5pZF0gPSBwb2ludFRvQWRkO1xuICAgICAgICAgICAgcG9pbnRzLnB1c2gocG9pbnRUb0FkZCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVDZW50ZXIoKSB7XG4gICAgICAgICAgICBsZXQgaTsgbGV0XG4gICAgICAgICAgICAgICAgc3VtID0gMDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzdW0gKz0gcG9pbnRzW2ldLnJhZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNlbnRlci5yYWQgPSBzdW0gLyBwb2ludHMubGVuZ3RoO1xuICAgICAgICAgICAgY2VudGVyLnZlYyA9IHZlYzIuY2xvbmUoW01hdGguY29zKGNlbnRlci5yYWQpLCBNYXRoLnNpbihjZW50ZXIucmFkKV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgICAgIGFkZChwb2ludCk7XG4gICAgICAgICAgICB1cGRhdGVDZW50ZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluaXQoKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWRkKHBvaW50VG9BZGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXBvaW50TWFwW3BvaW50VG9BZGQuaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZChwb2ludFRvQWRkKTtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2VudGVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpdHMob3RoZXJQb2ludCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGNvc2luZSBzaW1pbGFyaXR5IHRvIGNlbnRlci1hbmdsZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNpbWlsYXJpdHkgPSBNYXRoLmFicyh2ZWMyLmRvdChvdGhlclBvaW50LnBvaW50LnZlYywgY2VudGVyLnZlYykpO1xuICAgICAgICAgICAgICAgIGlmIChzaW1pbGFyaXR5ID4gdGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0UG9pbnRzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0Q2VudGVyKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjZW50ZXI7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0sXG4gICAgY3JlYXRlUG9pbnQobmV3UG9pbnQsIGlkLCBwcm9wZXJ0eSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmFkOiBuZXdQb2ludFtwcm9wZXJ0eV0sXG4gICAgICAgICAgICBwb2ludDogbmV3UG9pbnQsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgfTtcbiAgICB9LFxufTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLW1peGVkLW9wZXJhdG9ycyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuaW1wb3J0IHsgZ2xNYXRyaXgsIHZlYzIsIHZlYzMgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IEFycmF5SGVscGVyIGZyb20gJy4vYXJyYXlfaGVscGVyJztcbmltcG9ydCBDbHVzdGVyMiBmcm9tICcuL2NsdXN0ZXInO1xuXG5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO1xuXG4vKipcbiAqIEBwYXJhbSB4IHgtY29vcmRpbmF0ZVxuICogQHBhcmFtIHkgeS1jb29yZGluYXRlXG4gKiBAcmV0dXJuIEltYWdlUmVmZXJlbmNlIHt4LHl9IENvb3JkaW5hdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGltYWdlUmVmKHgsIHkpIHtcbiAgICBjb25zdCB0aGF0ID0ge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB0b1ZlYzIoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmVjMi5jbG9uZShbdGhpcy54LCB0aGlzLnldKTtcbiAgICAgICAgfSxcbiAgICAgICAgdG9WZWMzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZlYzMuY2xvbmUoW3RoaXMueCwgdGhpcy55LCAxXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJvdW5kKCkge1xuICAgICAgICAgICAgdGhpcy54ID0gdGhpcy54ID4gMC4wID8gTWF0aC5mbG9vcih0aGlzLnggKyAwLjUpIDogTWF0aC5mbG9vcih0aGlzLnggLSAwLjUpO1xuICAgICAgICAgICAgdGhpcy55ID0gdGhpcy55ID4gMC4wID8gTWF0aC5mbG9vcih0aGlzLnkgKyAwLjUpIDogTWF0aC5mbG9vcih0aGlzLnkgLSAwLjUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gdGhhdDtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBhbiBpbnRlZ3JhbCBpbWFnZSBvZiBhIGdpdmVuIGdyYXlzY2FsZSBpbWFnZS5cbiAqIEBwYXJhbSBpbWFnZURhdGFDb250YWluZXIge0ltYWdlRGF0YUNvbnRhaW5lcn0gdGhlIGltYWdlIHRvIGJlIGludGVncmF0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVJbnRlZ3JhbEltYWdlMihpbWFnZVdyYXBwZXIsIGludGVncmFsV3JhcHBlcikge1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IHdpZHRoID0gaW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICBjb25zdCBoZWlnaHQgPSBpbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgIGNvbnN0IGludGVncmFsSW1hZ2VEYXRhID0gaW50ZWdyYWxXcmFwcGVyLmRhdGE7XG4gICAgbGV0IHN1bSA9IDA7IGxldCBwb3NBID0gMDsgbGV0IHBvc0IgPSAwOyBsZXQgcG9zQyA9IDA7IGxldCBwb3NEID0gMDsgbGV0IHg7IGxldFxuICAgICAgICB5O1xuXG4gICAgLy8gc3VtIHVwIGZpcnN0IGNvbHVtblxuICAgIHBvc0IgPSB3aWR0aDtcbiAgICBzdW0gPSAwO1xuICAgIGZvciAoeSA9IDE7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBzdW0gKz0gaW1hZ2VEYXRhW3Bvc0FdO1xuICAgICAgICBpbnRlZ3JhbEltYWdlRGF0YVtwb3NCXSArPSBzdW07XG4gICAgICAgIHBvc0EgKz0gd2lkdGg7XG4gICAgICAgIHBvc0IgKz0gd2lkdGg7XG4gICAgfVxuXG4gICAgcG9zQSA9IDA7XG4gICAgcG9zQiA9IDE7XG4gICAgc3VtID0gMDtcbiAgICBmb3IgKHggPSAxOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBzdW0gKz0gaW1hZ2VEYXRhW3Bvc0FdO1xuICAgICAgICBpbnRlZ3JhbEltYWdlRGF0YVtwb3NCXSArPSBzdW07XG4gICAgICAgIHBvc0ErKztcbiAgICAgICAgcG9zQisrO1xuICAgIH1cblxuICAgIGZvciAoeSA9IDE7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBwb3NBID0geSAqIHdpZHRoICsgMTtcbiAgICAgICAgcG9zQiA9ICh5IC0gMSkgKiB3aWR0aCArIDE7XG4gICAgICAgIHBvc0MgPSB5ICogd2lkdGg7XG4gICAgICAgIHBvc0QgPSAoeSAtIDEpICogd2lkdGg7XG4gICAgICAgIGZvciAoeCA9IDE7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICBpbnRlZ3JhbEltYWdlRGF0YVtwb3NBXVxuICAgICAgICAgICAgICAgICs9IGltYWdlRGF0YVtwb3NBXSArIGludGVncmFsSW1hZ2VEYXRhW3Bvc0JdICsgaW50ZWdyYWxJbWFnZURhdGFbcG9zQ10gLSBpbnRlZ3JhbEltYWdlRGF0YVtwb3NEXTtcbiAgICAgICAgICAgIHBvc0ErKztcbiAgICAgICAgICAgIHBvc0IrKztcbiAgICAgICAgICAgIHBvc0MrKztcbiAgICAgICAgICAgIHBvc0QrKztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVJbnRlZ3JhbEltYWdlKGltYWdlV3JhcHBlciwgaW50ZWdyYWxXcmFwcGVyKSB7XG4gICAgY29uc3QgaW1hZ2VEYXRhID0gaW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3Qgd2lkdGggPSBpbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgIGNvbnN0IGhlaWdodCA9IGltYWdlV3JhcHBlci5zaXplLnk7XG4gICAgY29uc3QgaW50ZWdyYWxJbWFnZURhdGEgPSBpbnRlZ3JhbFdyYXBwZXIuZGF0YTtcbiAgICBsZXQgc3VtID0gMDtcblxuICAgIC8vIHN1bSB1cCBmaXJzdCByb3dcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICAgICAgc3VtICs9IGltYWdlRGF0YVtpXTtcbiAgICAgICAgaW50ZWdyYWxJbWFnZURhdGFbaV0gPSBzdW07XG4gICAgfVxuXG4gICAgZm9yIChsZXQgdiA9IDE7IHYgPCBoZWlnaHQ7IHYrKykge1xuICAgICAgICBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCB1ID0gMDsgdSA8IHdpZHRoOyB1KyspIHtcbiAgICAgICAgICAgIHN1bSArPSBpbWFnZURhdGFbdiAqIHdpZHRoICsgdV07XG4gICAgICAgICAgICBpbnRlZ3JhbEltYWdlRGF0YVsoKHYpICogd2lkdGgpICsgdV0gPSBzdW0gKyBpbnRlZ3JhbEltYWdlRGF0YVsodiAtIDEpICogd2lkdGggKyB1XTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRocmVzaG9sZEltYWdlKGltYWdlV3JhcHBlciwgdGhyZXNob2xkLCB0YXJnZXRXcmFwcGVyKSB7XG4gICAgaWYgKCF0YXJnZXRXcmFwcGVyKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICB0YXJnZXRXcmFwcGVyID0gaW1hZ2VXcmFwcGVyO1xuICAgIH1cbiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YTsgbGV0IHsgbGVuZ3RoIH0gPSBpbWFnZURhdGE7IGNvbnN0XG4gICAgICAgIHRhcmdldERhdGEgPSB0YXJnZXRXcmFwcGVyLmRhdGE7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdGFyZ2V0RGF0YVtsZW5ndGhdID0gaW1hZ2VEYXRhW2xlbmd0aF0gPCB0aHJlc2hvbGQgPyAxIDogMDtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlSGlzdG9ncmFtKGltYWdlV3JhcHBlciwgYml0c1BlclBpeGVsKSB7XG4gICAgaWYgKCFiaXRzUGVyUGl4ZWwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGJpdHNQZXJQaXhlbCA9IDg7XG4gICAgfVxuICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgIGxldCB7IGxlbmd0aCB9ID0gaW1hZ2VEYXRhO1xuICAgIGNvbnN0IGJpdFNoaWZ0ID0gOCAtIGJpdHNQZXJQaXhlbDtcbiAgICBjb25zdCBidWNrZXRDbnQgPSAxIDw8IGJpdHNQZXJQaXhlbDtcbiAgICBjb25zdCBoaXN0ID0gbmV3IEludDMyQXJyYXkoYnVja2V0Q250KTtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBoaXN0W2ltYWdlRGF0YVtsZW5ndGhdID4+IGJpdFNoaWZ0XSsrO1xuICAgIH1cbiAgICByZXR1cm4gaGlzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJwZW5MaW5lKGxpbmUpIHtcbiAgICBsZXQgaTtcbiAgICBjb25zdCB7IGxlbmd0aCB9ID0gbGluZTtcbiAgICBsZXQgbGVmdCA9IGxpbmVbMF07XG4gICAgbGV0IGNlbnRlciA9IGxpbmVbMV07XG4gICAgbGV0IHJpZ2h0O1xuXG4gICAgZm9yIChpID0gMTsgaSA8IGxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICByaWdodCA9IGxpbmVbaSArIDFdO1xuICAgICAgICAvLyAgLTEgNCAtMSBrZXJuZWxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGxpbmVbaSAtIDFdID0gKCgoY2VudGVyICogMikgLSBsZWZ0IC0gcmlnaHQpKSAmIDI1NTtcbiAgICAgICAgbGVmdCA9IGNlbnRlcjtcbiAgICAgICAgY2VudGVyID0gcmlnaHQ7XG4gICAgfVxuICAgIHJldHVybiBsaW5lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5lT3RzdVRocmVzaG9sZChpbWFnZVdyYXBwZXIsIGJpdHNQZXJQaXhlbCA9IDgpIHtcbiAgICBsZXQgaGlzdDtcbiAgICBjb25zdCBiaXRTaGlmdCA9IDggLSBiaXRzUGVyUGl4ZWw7XG5cbiAgICBmdW5jdGlvbiBweChpbml0LCBlbmQpIHtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSBpbml0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBzdW0gKz0gaGlzdFtpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG14KGluaXQsIGVuZCkge1xuICAgICAgICBsZXQgc3VtID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gaW5pdDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICAgICAgc3VtICs9IGkgKiBoaXN0W2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXRlcm1pbmVUaHJlc2hvbGQoKSB7XG4gICAgICAgIGNvbnN0IHZldCA9IFswXTtcbiAgICAgICAgbGV0IHAxO1xuICAgICAgICBsZXQgcDI7XG4gICAgICAgIGxldCBwMTI7XG4gICAgICAgIGxldCBtMTtcbiAgICAgICAgbGV0IG0yO1xuICAgICAgICBsZXQgbTEyO1xuICAgICAgICBjb25zdCBtYXggPSAoMSA8PCBiaXRzUGVyUGl4ZWwpIC0gMTtcblxuICAgICAgICBoaXN0ID0gY29tcHV0ZUhpc3RvZ3JhbShpbWFnZVdyYXBwZXIsIGJpdHNQZXJQaXhlbCk7XG4gICAgICAgIGZvciAobGV0IGsgPSAxOyBrIDwgbWF4OyBrKyspIHtcbiAgICAgICAgICAgIHAxID0gcHgoMCwgayk7XG4gICAgICAgICAgICBwMiA9IHB4KGsgKyAxLCBtYXgpO1xuICAgICAgICAgICAgcDEyID0gcDEgKiBwMjtcbiAgICAgICAgICAgIGlmIChwMTIgPT09IDApIHtcbiAgICAgICAgICAgICAgICBwMTIgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbTEgPSBteCgwLCBrKSAqIHAyO1xuICAgICAgICAgICAgbTIgPSBteChrICsgMSwgbWF4KSAqIHAxO1xuICAgICAgICAgICAgbTEyID0gbTEgLSBtMjtcbiAgICAgICAgICAgIHZldFtrXSA9IG0xMiAqIG0xMiAvIHAxMjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQXJyYXlIZWxwZXIubWF4SW5kZXgodmV0KTtcbiAgICB9XG5cbiAgICBjb25zdCB0aHJlc2hvbGQgPSBkZXRlcm1pbmVUaHJlc2hvbGQoKTtcbiAgICByZXR1cm4gdGhyZXNob2xkIDw8IGJpdFNoaWZ0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3RzdVRocmVzaG9sZChpbWFnZVdyYXBwZXIsIHRhcmdldFdyYXBwZXIpIHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSBkZXRlcm1pbmVPdHN1VGhyZXNob2xkKGltYWdlV3JhcHBlcik7XG5cbiAgICB0aHJlc2hvbGRJbWFnZShpbWFnZVdyYXBwZXIsIHRocmVzaG9sZCwgdGFyZ2V0V3JhcHBlcik7XG4gICAgcmV0dXJuIHRocmVzaG9sZDtcbn1cblxuLy8gbG9jYWwgdGhyZXNob2xkaW5nXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUJpbmFyeUltYWdlKGltYWdlV3JhcHBlciwgaW50ZWdyYWxXcmFwcGVyLCB0YXJnZXRXcmFwcGVyKSB7XG4gICAgY29tcHV0ZUludGVncmFsSW1hZ2UoaW1hZ2VXcmFwcGVyLCBpbnRlZ3JhbFdyYXBwZXIpO1xuXG4gICAgaWYgKCF0YXJnZXRXcmFwcGVyKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICB0YXJnZXRXcmFwcGVyID0gaW1hZ2VXcmFwcGVyO1xuICAgIH1cbiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCB0YXJnZXREYXRhID0gdGFyZ2V0V3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IHdpZHRoID0gaW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICBjb25zdCBoZWlnaHQgPSBpbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgIGNvbnN0IGludGVncmFsSW1hZ2VEYXRhID0gaW50ZWdyYWxXcmFwcGVyLmRhdGE7XG4gICAgbGV0IHN1bSA9IDA7IGxldCB2OyBsZXQgdTsgY29uc3Qga2VybmVsID0gMzsgbGV0IEE7IGxldCBCOyBsZXQgQzsgbGV0IEQ7IGxldCBhdmc7IGNvbnN0XG4gICAgICAgIHNpemUgPSAoa2VybmVsICogMiArIDEpICogKGtlcm5lbCAqIDIgKyAxKTtcblxuICAgIC8vIGNsZWFyIG91dCB0b3AgJiBib3R0b20tYm9yZGVyXG4gICAgZm9yICh2ID0gMDsgdiA8PSBrZXJuZWw7IHYrKykge1xuICAgICAgICBmb3IgKHUgPSAwOyB1IDwgd2lkdGg7IHUrKykge1xuICAgICAgICAgICAgdGFyZ2V0RGF0YVsoKHYpICogd2lkdGgpICsgdV0gPSAwO1xuICAgICAgICAgICAgdGFyZ2V0RGF0YVsoKChoZWlnaHQgLSAxKSAtIHYpICogd2lkdGgpICsgdV0gPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2xlYXIgb3V0IGxlZnQgJiByaWdodCBib3JkZXJcbiAgICBmb3IgKHYgPSBrZXJuZWw7IHYgPCBoZWlnaHQgLSBrZXJuZWw7IHYrKykge1xuICAgICAgICBmb3IgKHUgPSAwOyB1IDw9IGtlcm5lbDsgdSsrKSB7XG4gICAgICAgICAgICB0YXJnZXREYXRhWygodikgKiB3aWR0aCkgKyB1XSA9IDA7XG4gICAgICAgICAgICB0YXJnZXREYXRhWygodikgKiB3aWR0aCkgKyAod2lkdGggLSAxIC0gdSldID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodiA9IGtlcm5lbCArIDE7IHYgPCBoZWlnaHQgLSBrZXJuZWwgLSAxOyB2KyspIHtcbiAgICAgICAgZm9yICh1ID0ga2VybmVsICsgMTsgdSA8IHdpZHRoIC0ga2VybmVsOyB1KyspIHtcbiAgICAgICAgICAgIEEgPSBpbnRlZ3JhbEltYWdlRGF0YVsodiAtIGtlcm5lbCAtIDEpICogd2lkdGggKyAodSAtIGtlcm5lbCAtIDEpXTtcbiAgICAgICAgICAgIEIgPSBpbnRlZ3JhbEltYWdlRGF0YVsodiAtIGtlcm5lbCAtIDEpICogd2lkdGggKyAodSArIGtlcm5lbCldO1xuICAgICAgICAgICAgQyA9IGludGVncmFsSW1hZ2VEYXRhWyh2ICsga2VybmVsKSAqIHdpZHRoICsgKHUgLSBrZXJuZWwgLSAxKV07XG4gICAgICAgICAgICBEID0gaW50ZWdyYWxJbWFnZURhdGFbKHYgKyBrZXJuZWwpICogd2lkdGggKyAodSArIGtlcm5lbCldO1xuICAgICAgICAgICAgc3VtID0gRCAtIEMgLSBCICsgQTtcbiAgICAgICAgICAgIGF2ZyA9IHN1bSAvIChzaXplKTtcbiAgICAgICAgICAgIHRhcmdldERhdGFbdiAqIHdpZHRoICsgdV0gPSBpbWFnZURhdGFbdiAqIHdpZHRoICsgdV0gPiAoYXZnICsgNSkgPyAwIDogMTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsdXN0ZXIocG9pbnRzLCB0aHJlc2hvbGQsIHByb3BlcnR5KSB7XG4gICAgbGV0IGk7IGxldCBrOyBsZXQgdGhpc0NsdXN0ZXI7IGxldCBwb2ludDsgY29uc3RcbiAgICAgICAgY2x1c3RlcnMgPSBbXTtcblxuICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHByb3BlcnR5ID0gJ3JhZCc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkVG9DbHVzdGVyKG5ld1BvaW50KSB7XG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY2x1c3RlcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHRoaXNDbHVzdGVyID0gY2x1c3RlcnNba107XG4gICAgICAgICAgICBpZiAodGhpc0NsdXN0ZXIuZml0cyhuZXdQb2ludCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzQ2x1c3Rlci5hZGQobmV3UG9pbnQpO1xuICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuXG4gICAgLy8gaXRlcmF0ZSBvdmVyIGVhY2ggY2xvdWRcbiAgICBmb3IgKGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBvaW50ID0gQ2x1c3RlcjIuY3JlYXRlUG9pbnQocG9pbnRzW2ldLCBpLCBwcm9wZXJ0eSk7XG4gICAgICAgIGlmICghYWRkVG9DbHVzdGVyKHBvaW50KSkge1xuICAgICAgICAgICAgY2x1c3RlcnMucHVzaChDbHVzdGVyMi5jcmVhdGUocG9pbnQsIHRocmVzaG9sZCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbHVzdGVycztcbn1cblxuZXhwb3J0IGNvbnN0IFRyYWNlciA9IHtcbiAgICB0cmFjZShwb2ludHMsIHZlYykge1xuICAgICAgICBsZXQgaXRlcmF0aW9uO1xuICAgICAgICBjb25zdCBtYXhJdGVyYXRpb25zID0gMTA7XG4gICAgICAgIGxldCB0b3AgPSBbXTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgY2VudGVyUG9zID0gMDtcbiAgICAgICAgbGV0IGN1cnJlbnRQb3MgPSAwO1xuXG4gICAgICAgIGZ1bmN0aW9uIHRyYWNlKGlkeCwgZm9yd2FyZCkge1xuICAgICAgICAgICAgbGV0IHRvO1xuICAgICAgICAgICAgbGV0IHRvSWR4O1xuICAgICAgICAgICAgbGV0IHByZWRpY3RlZFBvcztcbiAgICAgICAgICAgIGNvbnN0IHRocmVzaG9sZFggPSAxO1xuICAgICAgICAgICAgY29uc3QgdGhyZXNob2xkWSA9IE1hdGguYWJzKHZlY1sxXSAvIDEwKTtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBtYXRjaChwb3MsIHByZWRpY3RlZCkge1xuICAgICAgICAgICAgICAgIGlmIChwb3MueCA+IChwcmVkaWN0ZWQueCAtIHRocmVzaG9sZFgpXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBwb3MueCA8IChwcmVkaWN0ZWQueCArIHRocmVzaG9sZFgpXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBwb3MueSA+IChwcmVkaWN0ZWQueSAtIHRocmVzaG9sZFkpXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBwb3MueSA8IChwcmVkaWN0ZWQueSArIHRocmVzaG9sZFkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBuZXh0IGluZGV4IGlzIHdpdGhpbiB0aGUgdmVjIHNwZWNpZmljYXRpb25zXG4gICAgICAgICAgICAvLyBpZiBub3QsIGNoZWNrIGFzIGxvbmcgYXMgdGhlIHRocmVzaG9sZCBpcyBtZXRcblxuICAgICAgICAgICAgY29uc3QgZnJvbSA9IHBvaW50c1tpZHhdO1xuICAgICAgICAgICAgaWYgKGZvcndhcmQpIHtcbiAgICAgICAgICAgICAgICBwcmVkaWN0ZWRQb3MgPSB7XG4gICAgICAgICAgICAgICAgICAgIHg6IGZyb20ueCArIHZlY1swXSxcbiAgICAgICAgICAgICAgICAgICAgeTogZnJvbS55ICsgdmVjWzFdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZWRpY3RlZFBvcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgeDogZnJvbS54IC0gdmVjWzBdLFxuICAgICAgICAgICAgICAgICAgICB5OiBmcm9tLnkgLSB2ZWNbMV0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG9JZHggPSBmb3J3YXJkID8gaWR4ICsgMSA6IGlkeCAtIDE7XG4gICAgICAgICAgICB0byA9IHBvaW50c1t0b0lkeF07XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cbiAgICAgICAgICAgIHdoaWxlICh0byAmJiAoZm91bmQgPSBtYXRjaCh0bywgcHJlZGljdGVkUG9zKSkgIT09IHRydWUgJiYgKE1hdGguYWJzKHRvLnkgLSBmcm9tLnkpIDwgdmVjWzFdKSkge1xuICAgICAgICAgICAgICAgIHRvSWR4ID0gZm9yd2FyZCA/IHRvSWR4ICsgMSA6IHRvSWR4IC0gMTtcbiAgICAgICAgICAgICAgICB0byA9IHBvaW50c1t0b0lkeF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmb3VuZCA/IHRvSWR4IDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaXRlcmF0aW9uID0gMDsgaXRlcmF0aW9uIDwgbWF4SXRlcmF0aW9uczsgaXRlcmF0aW9uKyspIHtcbiAgICAgICAgICAgIC8vIHJhbmRvbWx5IHNlbGVjdCBwb2ludCB0byBzdGFydCB3aXRoXG4gICAgICAgICAgICBjZW50ZXJQb3MgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBwb2ludHMubGVuZ3RoKTtcblxuICAgICAgICAgICAgLy8gdHJhY2UgZm9yd2FyZFxuICAgICAgICAgICAgdG9wID0gW107XG4gICAgICAgICAgICBjdXJyZW50UG9zID0gY2VudGVyUG9zO1xuICAgICAgICAgICAgdG9wLnB1c2gocG9pbnRzW2N1cnJlbnRQb3NdKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25kLWFzc2lnblxuICAgICAgICAgICAgd2hpbGUgKChjdXJyZW50UG9zID0gdHJhY2UoY3VycmVudFBvcywgdHJ1ZSkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdG9wLnB1c2gocG9pbnRzW2N1cnJlbnRQb3NdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjZW50ZXJQb3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFBvcyA9IGNlbnRlclBvcztcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cbiAgICAgICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnRQb3MgPSB0cmFjZShjdXJyZW50UG9zLCBmYWxzZSkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcC5wdXNoKHBvaW50c1tjdXJyZW50UG9zXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodG9wLmxlbmd0aCA+IHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IERJTEFURSA9IDE7XG5leHBvcnQgY29uc3QgRVJPREUgPSAyO1xuXG5leHBvcnQgZnVuY3Rpb24gZGlsYXRlKGluSW1hZ2VXcmFwcGVyLCBvdXRJbWFnZVdyYXBwZXIpIHtcbiAgICBsZXQgdjtcbiAgICBsZXQgdTtcbiAgICBjb25zdCBpbkltYWdlRGF0YSA9IGluSW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3Qgb3V0SW1hZ2VEYXRhID0gb3V0SW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3QgaGVpZ2h0ID0gaW5JbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgIGNvbnN0IHdpZHRoID0gaW5JbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgIGxldCBzdW07XG4gICAgbGV0IHlTdGFydDE7XG4gICAgbGV0IHlTdGFydDI7XG4gICAgbGV0IHhTdGFydDE7XG4gICAgbGV0IHhTdGFydDI7XG5cbiAgICBmb3IgKHYgPSAxOyB2IDwgaGVpZ2h0IC0gMTsgdisrKSB7XG4gICAgICAgIGZvciAodSA9IDE7IHUgPCB3aWR0aCAtIDE7IHUrKykge1xuICAgICAgICAgICAgeVN0YXJ0MSA9IHYgLSAxO1xuICAgICAgICAgICAgeVN0YXJ0MiA9IHYgKyAxO1xuICAgICAgICAgICAgeFN0YXJ0MSA9IHUgLSAxO1xuICAgICAgICAgICAgeFN0YXJ0MiA9IHUgKyAxO1xuICAgICAgICAgICAgc3VtID0gaW5JbWFnZURhdGFbeVN0YXJ0MSAqIHdpZHRoICsgeFN0YXJ0MV0gKyBpbkltYWdlRGF0YVt5U3RhcnQxICogd2lkdGggKyB4U3RhcnQyXVxuICAgICAgICAgICAgKyBpbkltYWdlRGF0YVt2ICogd2lkdGggKyB1XVxuICAgICAgICAgICAgKyBpbkltYWdlRGF0YVt5U3RhcnQyICogd2lkdGggKyB4U3RhcnQxXSArIGluSW1hZ2VEYXRhW3lTdGFydDIgKiB3aWR0aCArIHhTdGFydDJdO1xuICAgICAgICAgICAgb3V0SW1hZ2VEYXRhW3YgKiB3aWR0aCArIHVdID0gc3VtID4gMCA/IDEgOiAwO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJvZGUoaW5JbWFnZVdyYXBwZXIsIG91dEltYWdlV3JhcHBlcikge1xuICAgIGxldCB2O1xuICAgIGxldCB1O1xuICAgIGNvbnN0IGluSW1hZ2VEYXRhID0gaW5JbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCBvdXRJbWFnZURhdGEgPSBvdXRJbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCBoZWlnaHQgPSBpbkltYWdlV3JhcHBlci5zaXplLnk7XG4gICAgY29uc3Qgd2lkdGggPSBpbkltYWdlV3JhcHBlci5zaXplLng7XG4gICAgbGV0IHN1bTtcbiAgICBsZXQgeVN0YXJ0MTtcbiAgICBsZXQgeVN0YXJ0MjtcbiAgICBsZXQgeFN0YXJ0MTtcbiAgICBsZXQgeFN0YXJ0MjtcblxuICAgIGZvciAodiA9IDE7IHYgPCBoZWlnaHQgLSAxOyB2KyspIHtcbiAgICAgICAgZm9yICh1ID0gMTsgdSA8IHdpZHRoIC0gMTsgdSsrKSB7XG4gICAgICAgICAgICB5U3RhcnQxID0gdiAtIDE7XG4gICAgICAgICAgICB5U3RhcnQyID0gdiArIDE7XG4gICAgICAgICAgICB4U3RhcnQxID0gdSAtIDE7XG4gICAgICAgICAgICB4U3RhcnQyID0gdSArIDE7XG4gICAgICAgICAgICBzdW0gPSBpbkltYWdlRGF0YVt5U3RhcnQxICogd2lkdGggKyB4U3RhcnQxXSArIGluSW1hZ2VEYXRhW3lTdGFydDEgKiB3aWR0aCArIHhTdGFydDJdXG4gICAgICAgICAgICArIGluSW1hZ2VEYXRhW3YgKiB3aWR0aCArIHVdXG4gICAgICAgICAgICArIGluSW1hZ2VEYXRhW3lTdGFydDIgKiB3aWR0aCArIHhTdGFydDFdICsgaW5JbWFnZURhdGFbeVN0YXJ0MiAqIHdpZHRoICsgeFN0YXJ0Ml07XG4gICAgICAgICAgICBvdXRJbWFnZURhdGFbdiAqIHdpZHRoICsgdV0gPSBzdW0gPT09IDUgPyAxIDogMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KGFJbWFnZVdyYXBwZXIsIGJJbWFnZVdyYXBwZXIsIHJlc3VsdEltYWdlV3JhcHBlcikge1xuICAgIGlmICghcmVzdWx0SW1hZ2VXcmFwcGVyKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICByZXN1bHRJbWFnZVdyYXBwZXIgPSBhSW1hZ2VXcmFwcGVyO1xuICAgIH1cbiAgICBsZXQgeyBsZW5ndGggfSA9IGFJbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCBhSW1hZ2VEYXRhID0gYUltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IGJJbWFnZURhdGEgPSBiSW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3QgY0ltYWdlRGF0YSA9IHJlc3VsdEltYWdlV3JhcHBlci5kYXRhO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGNJbWFnZURhdGFbbGVuZ3RoXSA9IGFJbWFnZURhdGFbbGVuZ3RoXSAtIGJJbWFnZURhdGFbbGVuZ3RoXTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaXR3aXNlT3IoYUltYWdlV3JhcHBlciwgYkltYWdlV3JhcHBlciwgcmVzdWx0SW1hZ2VXcmFwcGVyKSB7XG4gICAgaWYgKCFyZXN1bHRJbWFnZVdyYXBwZXIpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHJlc3VsdEltYWdlV3JhcHBlciA9IGFJbWFnZVdyYXBwZXI7XG4gICAgfVxuICAgIGxldCB7IGxlbmd0aCB9ID0gYUltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IGFJbWFnZURhdGEgPSBhSW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3QgYkltYWdlRGF0YSA9IGJJbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCBjSW1hZ2VEYXRhID0gcmVzdWx0SW1hZ2VXcmFwcGVyLmRhdGE7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgY0ltYWdlRGF0YVtsZW5ndGhdID0gYUltYWdlRGF0YVtsZW5ndGhdIHx8IGJJbWFnZURhdGFbbGVuZ3RoXTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3VudE5vblplcm8oaW1hZ2VXcmFwcGVyKSB7XG4gICAgbGV0IHsgbGVuZ3RoIH0gPSBpbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCB7IGRhdGEgfSA9IGltYWdlV3JhcHBlcjtcbiAgICBsZXQgc3VtID0gMDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBzdW0gKz0gZGF0YVtsZW5ndGhdO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9wR2VuZXJpYyhsaXN0LCB0b3AsIHNjb3JlRnVuYykge1xuICAgIGxldCBpOyBsZXQgbWluSWR4ID0gMDsgbGV0IG1pbiA9IDA7IGNvbnN0IHF1ZXVlID0gW107IGxldCBzY29yZTsgbGV0IGhpdDsgbGV0XG4gICAgICAgIHBvcztcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0b3A7IGkrKykge1xuICAgICAgICBxdWV1ZVtpXSA9IHtcbiAgICAgICAgICAgIHNjb3JlOiAwLFxuICAgICAgICAgICAgaXRlbTogbnVsbCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBzY29yZSA9IHNjb3JlRnVuYy5hcHBseSh0aGlzLCBbbGlzdFtpXV0pO1xuICAgICAgICBpZiAoc2NvcmUgPiBtaW4pIHtcbiAgICAgICAgICAgIGhpdCA9IHF1ZXVlW21pbklkeF07XG4gICAgICAgICAgICBoaXQuc2NvcmUgPSBzY29yZTtcbiAgICAgICAgICAgIGhpdC5pdGVtID0gbGlzdFtpXTtcbiAgICAgICAgICAgIG1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICAgICAgICBmb3IgKHBvcyA9IDA7IHBvcyA8IHRvcDsgcG9zKyspIHtcbiAgICAgICAgICAgICAgICBpZiAocXVldWVbcG9zXS5zY29yZSA8IG1pbikge1xuICAgICAgICAgICAgICAgICAgICBtaW4gPSBxdWV1ZVtwb3NdLnNjb3JlO1xuICAgICAgICAgICAgICAgICAgICBtaW5JZHggPSBwb3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3JheUFycmF5RnJvbUltYWdlKGh0bWxJbWFnZSwgb2Zmc2V0WCwgY3R4LCBhcnJheSkge1xuICAgIGN0eC5kcmF3SW1hZ2UoaHRtbEltYWdlLCBvZmZzZXRYLCAwLCBodG1sSW1hZ2Uud2lkdGgsIGh0bWxJbWFnZS5oZWlnaHQpO1xuICAgIGNvbnN0IGN0eERhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKG9mZnNldFgsIDAsIGh0bWxJbWFnZS53aWR0aCwgaHRtbEltYWdlLmhlaWdodCkuZGF0YTtcbiAgICBjb21wdXRlR3JheShjdHhEYXRhLCBhcnJheSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncmF5QXJyYXlGcm9tQ29udGV4dChjdHgsIHNpemUsIG9mZnNldCwgYXJyYXkpIHtcbiAgICBjb25zdCBjdHhEYXRhID0gY3R4LmdldEltYWdlRGF0YShvZmZzZXQueCwgb2Zmc2V0LnksIHNpemUueCwgc2l6ZS55KS5kYXRhO1xuICAgIGNvbXB1dGVHcmF5KGN0eERhdGEsIGFycmF5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyYXlBbmRIYWxmU2FtcGxlRnJvbUNhbnZhc0RhdGEoY2FudmFzRGF0YSwgc2l6ZSwgb3V0QXJyYXkpIHtcbiAgICBsZXQgdG9wUm93SWR4ID0gMDtcbiAgICBsZXQgYm90dG9tUm93SWR4ID0gc2l6ZS54O1xuICAgIGNvbnN0IGVuZElkeCA9IE1hdGguZmxvb3IoY2FudmFzRGF0YS5sZW5ndGggLyA0KTtcbiAgICBjb25zdCBvdXRXaWR0aCA9IHNpemUueCAvIDI7XG4gICAgbGV0IG91dEltZ0lkeCA9IDA7XG4gICAgY29uc3QgaW5XaWR0aCA9IHNpemUueDtcbiAgICBsZXQgaTtcblxuICAgIHdoaWxlIChib3R0b21Sb3dJZHggPCBlbmRJZHgpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dFdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgb3V0QXJyYXlbb3V0SW1nSWR4XSA9IChcbiAgICAgICAgICAgICAgICAoMC4yOTkgKiBjYW52YXNEYXRhW3RvcFJvd0lkeCAqIDQgKyAwXVxuICAgICAgICAgICAgICAgICArIDAuNTg3ICogY2FudmFzRGF0YVt0b3BSb3dJZHggKiA0ICsgMV1cbiAgICAgICAgICAgICAgICAgKyAwLjExNCAqIGNhbnZhc0RhdGFbdG9wUm93SWR4ICogNCArIDJdKVxuICAgICAgICAgICAgICAgICsgKDAuMjk5ICogY2FudmFzRGF0YVsodG9wUm93SWR4ICsgMSkgKiA0ICsgMF1cbiAgICAgICAgICAgICAgICAgKyAwLjU4NyAqIGNhbnZhc0RhdGFbKHRvcFJvd0lkeCArIDEpICogNCArIDFdXG4gICAgICAgICAgICAgICAgICsgMC4xMTQgKiBjYW52YXNEYXRhWyh0b3BSb3dJZHggKyAxKSAqIDQgKyAyXSlcbiAgICAgICAgICAgICAgICArICgwLjI5OSAqIGNhbnZhc0RhdGFbKGJvdHRvbVJvd0lkeCkgKiA0ICsgMF1cbiAgICAgICAgICAgICAgICAgKyAwLjU4NyAqIGNhbnZhc0RhdGFbKGJvdHRvbVJvd0lkeCkgKiA0ICsgMV1cbiAgICAgICAgICAgICAgICAgKyAwLjExNCAqIGNhbnZhc0RhdGFbKGJvdHRvbVJvd0lkeCkgKiA0ICsgMl0pXG4gICAgICAgICAgICAgICAgKyAoMC4yOTkgKiBjYW52YXNEYXRhWyhib3R0b21Sb3dJZHggKyAxKSAqIDQgKyAwXVxuICAgICAgICAgICAgICAgICArIDAuNTg3ICogY2FudmFzRGF0YVsoYm90dG9tUm93SWR4ICsgMSkgKiA0ICsgMV1cbiAgICAgICAgICAgICAgICAgKyAwLjExNCAqIGNhbnZhc0RhdGFbKGJvdHRvbVJvd0lkeCArIDEpICogNCArIDJdKSkgLyA0O1xuICAgICAgICAgICAgb3V0SW1nSWR4Kys7XG4gICAgICAgICAgICB0b3BSb3dJZHggKz0gMjtcbiAgICAgICAgICAgIGJvdHRvbVJvd0lkeCArPSAyO1xuICAgICAgICB9XG4gICAgICAgIHRvcFJvd0lkeCArPSBpbldpZHRoO1xuICAgICAgICBib3R0b21Sb3dJZHggKz0gaW5XaWR0aDtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlR3JheShpbWFnZURhdGEsIG91dEFycmF5LCBjb25maWcpIHtcbiAgICBjb25zdCBsID0gKGltYWdlRGF0YS5sZW5ndGggLyA0KSB8IDA7XG4gICAgY29uc3Qgc2luZ2xlQ2hhbm5lbCA9IGNvbmZpZyAmJiBjb25maWcuc2luZ2xlQ2hhbm5lbCA9PT0gdHJ1ZTtcblxuICAgIGlmIChzaW5nbGVDaGFubmVsKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIG91dEFycmF5W2ldID0gaW1hZ2VEYXRhW2kgKiA0ICsgMF07XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICBvdXRBcnJheVtpXSA9IDAuMjk5ICogaW1hZ2VEYXRhW2kgKiA0ICsgMF0gKyAwLjU4NyAqIGltYWdlRGF0YVtpICogNCArIDFdICsgMC4xMTQgKiBpbWFnZURhdGFbaSAqIDQgKyAyXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRJbWFnZUFycmF5KHNyYywgY2FsbGJhY2ssIGNhbnZhcyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpKSB7XG4gICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgaW1nLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgICAgIGNvbnNvbGUud2FybignKiBsb2FkSW1hZ2VBcnJheSBnZXRDb250ZXh0IDJkJyk7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjdHguZHJhd0ltYWdlKHRoaXMsIDAsIDApO1xuICAgICAgICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCk7XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UodGhpcywgMCwgMCk7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgICAgIGNvbXB1dGVHcmF5KGRhdGEsIGFycmF5KTtcbiAgICAgICAgdGhpcy5jYWxsYmFjayhhcnJheSwge1xuICAgICAgICAgICAgeDogdGhpcy53aWR0aCxcbiAgICAgICAgICAgIHk6IHRoaXMuaGVpZ2h0LFxuICAgICAgICB9LCB0aGlzKTtcbiAgICB9O1xuICAgIGltZy5zcmMgPSBzcmM7XG59XG5cbi8qKlxuICogQHBhcmFtIGluSW1nIHtJbWFnZVdyYXBwZXJ9IGlucHV0IGltYWdlIHRvIGJlIHNhbXBsZWRcbiAqIEBwYXJhbSBvdXRJbWcge0ltYWdlV3JhcHBlcn0gdG8gYmUgc3RvcmVkIGluXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYWxmU2FtcGxlKGluSW1nV3JhcHBlciwgb3V0SW1nV3JhcHBlcikge1xuICAgIGNvbnN0IGluSW1nID0gaW5JbWdXcmFwcGVyLmRhdGE7XG4gICAgY29uc3QgaW5XaWR0aCA9IGluSW1nV3JhcHBlci5zaXplLng7XG4gICAgY29uc3Qgb3V0SW1nID0gb3V0SW1nV3JhcHBlci5kYXRhO1xuICAgIGxldCB0b3BSb3dJZHggPSAwO1xuICAgIGxldCBib3R0b21Sb3dJZHggPSBpbldpZHRoO1xuICAgIGNvbnN0IGVuZElkeCA9IGluSW1nLmxlbmd0aDtcbiAgICBjb25zdCBvdXRXaWR0aCA9IGluV2lkdGggLyAyO1xuICAgIGxldCBvdXRJbWdJZHggPSAwO1xuICAgIHdoaWxlIChib3R0b21Sb3dJZHggPCBlbmRJZHgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRXaWR0aDsgaSsrKSB7XG4gICAgICAgICAgICBvdXRJbWdbb3V0SW1nSWR4XSA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgKGluSW1nW3RvcFJvd0lkeF0gKyBpbkltZ1t0b3BSb3dJZHggKyAxXSArIGluSW1nW2JvdHRvbVJvd0lkeF0gKyBpbkltZ1tib3R0b21Sb3dJZHggKyAxXSkgLyA0LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG91dEltZ0lkeCsrO1xuICAgICAgICAgICAgdG9wUm93SWR4ICs9IDI7XG4gICAgICAgICAgICBib3R0b21Sb3dJZHggKz0gMjtcbiAgICAgICAgfVxuICAgICAgICB0b3BSb3dJZHggKz0gaW5XaWR0aDtcbiAgICAgICAgYm90dG9tUm93SWR4ICs9IGluV2lkdGg7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaHN2MnJnYihoc3YsIHJnYiA9IFswLCAwLCAwXSkge1xuICAgIGNvbnN0IGggPSBoc3ZbMF07XG4gICAgY29uc3QgcyA9IGhzdlsxXTtcbiAgICBjb25zdCB2ID0gaHN2WzJdO1xuICAgIGNvbnN0IGMgPSB2ICogcztcbiAgICBjb25zdCB4ID0gYyAqICgxIC0gTWF0aC5hYnMoKGggLyA2MCkgJSAyIC0gMSkpO1xuICAgIGNvbnN0IG0gPSB2IC0gYztcbiAgICBsZXQgciA9IDA7XG4gICAgbGV0IGcgPSAwO1xuICAgIGxldCBiID0gMDtcblxuICAgIGlmIChoIDwgNjApIHtcbiAgICAgICAgciA9IGM7XG4gICAgICAgIGcgPSB4O1xuICAgIH0gZWxzZSBpZiAoaCA8IDEyMCkge1xuICAgICAgICByID0geDtcbiAgICAgICAgZyA9IGM7XG4gICAgfSBlbHNlIGlmIChoIDwgMTgwKSB7XG4gICAgICAgIGcgPSBjO1xuICAgICAgICBiID0geDtcbiAgICB9IGVsc2UgaWYgKGggPCAyNDApIHtcbiAgICAgICAgZyA9IHg7XG4gICAgICAgIGIgPSBjO1xuICAgIH0gZWxzZSBpZiAoaCA8IDMwMCkge1xuICAgICAgICByID0geDtcbiAgICAgICAgYiA9IGM7XG4gICAgfSBlbHNlIGlmIChoIDwgMzYwKSB7XG4gICAgICAgIHIgPSBjO1xuICAgICAgICBiID0geDtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgcmdiWzBdID0gKChyICsgbSkgKiAyNTUpIHwgMDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICByZ2JbMV0gPSAoKGcgKyBtKSAqIDI1NSkgfCAwO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIHJnYlsyXSA9ICgoYiArIG0pICogMjU1KSB8IDA7XG4gICAgcmV0dXJuIHJnYjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9jb21wdXRlRGl2aXNvcnMobikge1xuICAgIGNvbnN0IGxhcmdlRGl2aXNvcnMgPSBbXTtcbiAgICBjb25zdCBkaXZpc29ycyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBNYXRoLnNxcnQobikgKyAxOyBpKyspIHtcbiAgICAgICAgaWYgKG4gJSBpID09PSAwKSB7XG4gICAgICAgICAgICBkaXZpc29ycy5wdXNoKGkpO1xuICAgICAgICAgICAgaWYgKGkgIT09IG4gLyBpKSB7XG4gICAgICAgICAgICAgICAgbGFyZ2VEaXZpc29ycy51bnNoaWZ0KE1hdGguZmxvb3IobiAvIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGl2aXNvcnMuY29uY2F0KGxhcmdlRGl2aXNvcnMpO1xufVxuXG5mdW5jdGlvbiBfY29tcHV0ZUludGVyc2VjdGlvbihhcnIxLCBhcnIyKSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBqID0gMDtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlIChpIDwgYXJyMS5sZW5ndGggJiYgaiA8IGFycjIubGVuZ3RoKSB7XG4gICAgICAgIGlmIChhcnIxW2ldID09PSBhcnIyW2pdKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChhcnIxW2ldKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgfSBlbHNlIGlmIChhcnIxW2ldID4gYXJyMltqXSkge1xuICAgICAgICAgICAgaisrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVQYXRjaFNpemUocGF0Y2hTaXplLCBpbWdTaXplKSB7XG4gICAgY29uc3QgZGl2aXNvcnNYID0gX2NvbXB1dGVEaXZpc29ycyhpbWdTaXplLngpO1xuICAgIGNvbnN0IGRpdmlzb3JzWSA9IF9jb21wdXRlRGl2aXNvcnMoaW1nU2l6ZS55KTtcbiAgICBjb25zdCB3aWRlU2lkZSA9IE1hdGgubWF4KGltZ1NpemUueCwgaW1nU2l6ZS55KTtcbiAgICBjb25zdCBjb21tb24gPSBfY29tcHV0ZUludGVyc2VjdGlvbihkaXZpc29yc1gsIGRpdmlzb3JzWSk7XG4gICAgY29uc3QgbnJPZlBhdGNoZXNMaXN0ID0gWzgsIDEwLCAxNSwgMjAsIDMyLCA2MCwgODBdO1xuICAgIGNvbnN0IG5yT2ZQYXRjaGVzTWFwID0ge1xuICAgICAgICAneC1zbWFsbCc6IDUsXG4gICAgICAgIHNtYWxsOiA0LFxuICAgICAgICBtZWRpdW06IDMsXG4gICAgICAgIGxhcmdlOiAyLFxuICAgICAgICAneC1sYXJnZSc6IDEsXG4gICAgfTtcbiAgICBjb25zdCBuck9mUGF0Y2hlc0lkeCA9IG5yT2ZQYXRjaGVzTWFwW3BhdGNoU2l6ZV0gfHwgbnJPZlBhdGNoZXNNYXAubWVkaXVtO1xuICAgIGNvbnN0IG5yT2ZQYXRjaGVzID0gbnJPZlBhdGNoZXNMaXN0W25yT2ZQYXRjaGVzSWR4XTtcbiAgICBjb25zdCBkZXNpcmVkUGF0Y2hTaXplID0gTWF0aC5mbG9vcih3aWRlU2lkZSAvIG5yT2ZQYXRjaGVzKTtcbiAgICBsZXQgb3B0aW1hbFBhdGNoU2l6ZTtcblxuICAgIGZ1bmN0aW9uIGZpbmRQYXRjaFNpemVGb3JEaXZpc29ycyhkaXZpc29ycykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBmb3VuZCA9IGRpdmlzb3JzW01hdGguZmxvb3IoZGl2aXNvcnMubGVuZ3RoIC8gMildO1xuXG4gICAgICAgIHdoaWxlIChpIDwgKGRpdmlzb3JzLmxlbmd0aCAtIDEpICYmIGRpdmlzb3JzW2ldIDwgZGVzaXJlZFBhdGNoU2l6ZSkge1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRpdmlzb3JzW2ldIC0gZGVzaXJlZFBhdGNoU2l6ZSkgPiBNYXRoLmFicyhkaXZpc29yc1tpIC0gMV0gLSBkZXNpcmVkUGF0Y2hTaXplKSkge1xuICAgICAgICAgICAgICAgIGZvdW5kID0gZGl2aXNvcnNbaSAtIDFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IGRpdmlzb3JzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNpcmVkUGF0Y2hTaXplIC8gZm91bmQgPCBuck9mUGF0Y2hlc0xpc3RbbnJPZlBhdGNoZXNJZHggKyAxXSAvIG5yT2ZQYXRjaGVzTGlzdFtuck9mUGF0Y2hlc0lkeF1cbiAgICAgICAgICAgICYmIGRlc2lyZWRQYXRjaFNpemUgLyBmb3VuZCA+IG5yT2ZQYXRjaGVzTGlzdFtuck9mUGF0Y2hlc0lkeCAtIDFdIC8gbnJPZlBhdGNoZXNMaXN0W25yT2ZQYXRjaGVzSWR4XSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgeDogZm91bmQsIHk6IGZvdW5kIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgb3B0aW1hbFBhdGNoU2l6ZSA9IGZpbmRQYXRjaFNpemVGb3JEaXZpc29ycyhjb21tb24pO1xuICAgIGlmICghb3B0aW1hbFBhdGNoU2l6ZSkge1xuICAgICAgICBvcHRpbWFsUGF0Y2hTaXplID0gZmluZFBhdGNoU2l6ZUZvckRpdmlzb3JzKF9jb21wdXRlRGl2aXNvcnMod2lkZVNpZGUpKTtcbiAgICAgICAgaWYgKCFvcHRpbWFsUGF0Y2hTaXplKSB7XG4gICAgICAgICAgICBvcHRpbWFsUGF0Y2hTaXplID0gZmluZFBhdGNoU2l6ZUZvckRpdmlzb3JzKChfY29tcHV0ZURpdmlzb3JzKGRlc2lyZWRQYXRjaFNpemUgKiBuck9mUGF0Y2hlcykpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3B0aW1hbFBhdGNoU2l6ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9wYXJzZUNTU0RpbWVuc2lvblZhbHVlcyh2YWx1ZSkge1xuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHtcbiAgICAgICAgdmFsdWU6IHBhcnNlRmxvYXQodmFsdWUpLFxuICAgICAgICB1bml0OiB2YWx1ZS5pbmRleE9mKCclJykgPT09IHZhbHVlLmxlbmd0aCAtIDEgPyAnJScgOiAnJScsXG4gICAgfTtcblxuICAgIHJldHVybiBkaW1lbnNpb247XG59XG5cbmV4cG9ydCBjb25zdCBfZGltZW5zaW9uc0NvbnZlcnRlcnMgPSB7XG4gICAgdG9wKGRpbWVuc2lvbiwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gZGltZW5zaW9uLnVuaXQgPT09ICclJyA/IE1hdGguZmxvb3IoY29udGV4dC5oZWlnaHQgKiAoZGltZW5zaW9uLnZhbHVlIC8gMTAwKSkgOiBudWxsO1xuICAgIH0sXG4gICAgcmlnaHQoZGltZW5zaW9uLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBkaW1lbnNpb24udW5pdCA9PT0gJyUnID8gTWF0aC5mbG9vcihjb250ZXh0LndpZHRoIC0gKGNvbnRleHQud2lkdGggKiAoZGltZW5zaW9uLnZhbHVlIC8gMTAwKSkpIDogbnVsbDtcbiAgICB9LFxuICAgIGJvdHRvbShkaW1lbnNpb24sIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGRpbWVuc2lvbi51bml0ID09PSAnJScgPyBNYXRoLmZsb29yKGNvbnRleHQuaGVpZ2h0IC0gKGNvbnRleHQuaGVpZ2h0ICogKGRpbWVuc2lvbi52YWx1ZSAvIDEwMCkpKSA6IG51bGw7XG4gICAgfSxcbiAgICBsZWZ0KGRpbWVuc2lvbiwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gZGltZW5zaW9uLnVuaXQgPT09ICclJyA/IE1hdGguZmxvb3IoY29udGV4dC53aWR0aCAqIChkaW1lbnNpb24udmFsdWUgLyAxMDApKSA6IG51bGw7XG4gICAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlSW1hZ2VBcmVhKGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBhcmVhKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHsgd2lkdGg6IGlucHV0V2lkdGgsIGhlaWdodDogaW5wdXRIZWlnaHQgfTtcblxuICAgIGNvbnN0IHBhcnNlZEFyZWEgPSBPYmplY3Qua2V5cyhhcmVhKS5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXJlYVtrZXldO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBfcGFyc2VDU1NEaW1lbnNpb25WYWx1ZXModmFsdWUpO1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVkID0gX2RpbWVuc2lvbnNDb252ZXJ0ZXJzW2tleV0ocGFyc2VkLCBjb250ZXh0KTtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgcmVzdWx0W2tleV0gPSBjYWxjdWxhdGVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIHt9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHN4OiBwYXJzZWRBcmVhLmxlZnQsXG4gICAgICAgIHN5OiBwYXJzZWRBcmVhLnRvcCxcbiAgICAgICAgc3c6IHBhcnNlZEFyZWEucmlnaHQgLSBwYXJzZWRBcmVhLmxlZnQsXG4gICAgICAgIHNoOiBwYXJzZWRBcmVhLmJvdHRvbSAtIHBhcnNlZEFyZWEudG9wLFxuICAgIH07XG59XG4iLCJpbXBvcnQgeyBYWVNpemUgfSBmcm9tICcuLi8uLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYS5kJztcblxuLy8gVE9ETzogWFlQb3NpdGlvbiBzaG91bGQgYmUgYW4gWFlPYmplY3QsIGJ1dCB0aGF0IGJyZWFrcyBYWURlZmluaXRpb24sIHdoaWNoIGJyZWFrcyBkcmF3UGF0aCgpIGJlbG93LlxuZGVjbGFyZSBpbnRlcmZhY2UgWFlQb3NpdGlvbiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbn1cblxuZGVjbGFyZSBpbnRlcmZhY2UgQ2FudmFzU3R5bGUge1xuICAgIGNvbG9yOiBzdHJpbmc7XG4gICAgbGluZVdpZHRoOiBudW1iZXI7XG59XG5cbi8vIFhZRGVmaW5pdGlvbiB0ZWxscyB1cyB3aGljaCBjb21wb25lbnQgb2YgYSBnaXZlbiBhcnJheSBvciBvYmplY3QgaXMgdGhlIFwiWFwiIGFuZCB3aGljaCBpcyB0aGUgXCJZXCIuXG4vLyBVc3VhbGx5IHRoaXMgaXMgMCBmb3IgWCBhbmQgMSBmb3IgWSwgYnV0IG1pZ2h0IGJlIHVzZWQgYXMgJ3gnIGZvciB4IGFuZCAneScgZm9yIFkuXG5kZWNsYXJlIGludGVyZmFjZSBYWURlZmluaXRpb24ge1xuICAgIHg6IGtleW9mIFhZUG9zaXRpb247XG4gICAgeToga2V5b2YgWFlQb3NpdGlvbjtcbn1cblxuZGVjbGFyZSB0eXBlIFBhdGggPSBBcnJheTxYWVBvc2l0aW9uPjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIGRyYXdSZWN0KHBvczogWFlQb3NpdGlvbiwgc2l6ZTogWFlTaXplLCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgc3R5bGU6IENhbnZhc1N0eWxlKTogdm9pZCB7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHN0eWxlLmNvbG9yO1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gc3R5bGUuY29sb3I7XG4gICAgICAgIGN0eC5saW5lV2lkdGggPSBzdHlsZS5saW5lV2lkdGggfHwgMTtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHguc3Ryb2tlUmVjdChwb3MueCwgcG9zLnksIHNpemUueCwgc2l6ZS55KTtcbiAgICB9LFxuICAgIGRyYXdQYXRoKHBhdGg6IFBhdGgsIGRlZjogWFlEZWZpbml0aW9uLCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgc3R5bGU6IENhbnZhc1N0eWxlKTogdm9pZCB7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHN0eWxlLmNvbG9yO1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gc3R5bGUuY29sb3I7XG4gICAgICAgIGN0eC5saW5lV2lkdGggPSBzdHlsZS5saW5lV2lkdGg7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4Lm1vdmVUbyhwYXRoWzBdW2RlZi54XSwgcGF0aFswXVtkZWYueV0pO1xuICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHBhdGgubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGN0eC5saW5lVG8ocGF0aFtqXVtkZWYueF0sIHBhdGhbal1bZGVmLnldKTtcbiAgICAgICAgfVxuICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICB9LFxuICAgIGRyYXdJbWFnZShpbWFnZURhdGE6IEFycmF5PG51bWJlcj4sIHNpemU6IFhZU2l6ZSwgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY2FudmFzRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgc2l6ZS54LCBzaXplLnkpO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGNhbnZhc0RhdGE7XG4gICAgICAgIGxldCBjYW52YXNEYXRhUG9zID0gZGF0YS5sZW5ndGg7XG4gICAgICAgIGxldCBpbWFnZURhdGFQb3MgPSBpbWFnZURhdGEubGVuZ3RoO1xuXG4gICAgICAgIGlmIChjYW52YXNEYXRhUG9zIC8gaW1hZ2VEYXRhUG9zICE9PSA0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGltYWdlRGF0YVBvcy0tKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGltYWdlRGF0YVtpbWFnZURhdGFQb3NdO1xuICAgICAgICAgICAgZGF0YVstLWNhbnZhc0RhdGFQb3NdID0gMjU1O1xuICAgICAgICAgICAgZGF0YVstLWNhbnZhc0RhdGFQb3NdID0gdmFsdWU7XG4gICAgICAgICAgICBkYXRhWy0tY2FudmFzRGF0YVBvc10gPSB2YWx1ZTtcbiAgICAgICAgICAgIGRhdGFbLS1jYW52YXNEYXRhUG9zXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2FudmFzRGF0YSwgMCwgMCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG59O1xuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCB7IFR5cGVkQXJyYXkgfSBmcm9tICcuLi8uLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBpbml0KGFycjogVHlwZWRBcnJheSB8IEFycmF5PG51bWJlcj4sIHZhbDogbnVtYmVyKSB7XG4gICAgICAgIGFyci5maWxsKHZhbCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIElOLVBMQUNFIFNodWZmbGVzIHRoZSBjb250ZW50IG9mIGFuIGFycmF5XG4gICAgICovXG4gICAgc2h1ZmZsZShhcnI6IEFycmF5PG51bWJlcj4pIHtcbiAgICAgICAgLy8gRHVyc3RlbmZlbGQgc2h1ZmZsZSBhbGdvcml0aG1cbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjQ1MDk1NC9ob3ctdG8tcmFuZG9taXplLXNodWZmbGUtYS1qYXZhc2NyaXB0LWFycmF5XG4gICAgICAgIGZvciAobGV0IGkgPSBhcnIubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgICAgICAgW2FycltpXSwgYXJyW2pdXSA9IFthcnJbal0sIGFycltpXV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuXG4gICAgdG9Qb2ludExpc3QoYXJyOiBBcnJheTxBcnJheTxudW1iZXI+Pikge1xuICAgICAgICBjb25zdCByb3dzID0gYXJyLnJlZHVjZSgocCwgbikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gYFske24uam9pbignLCcpfV1gO1xuICAgICAgICAgICAgcC5wdXNoKHJvdyk7XG4gICAgICAgICAgICByZXR1cm4gcDtcbiAgICAgICAgfSwgW10gYXMgQXJyYXk8c3RyaW5nPik7XG4gICAgICAgIHJldHVybiBgWyR7cm93cy5qb2luKCcsXFxyXFxuJyl9XWA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgdGhlIGVsZW1lbnRzIHdoaWNoJ3Mgc2NvcmUgaXMgYmlnZ2VyIHRoYW4gdGhlIHRocmVzaG9sZFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHRocmVzaG9sZChhcnI6IEFycmF5PG51bWJlcj4sIHRocmVzaG9sZDogbnVtYmVyLCBzY29yZUZ1bmM6ICgoc2NvcmU6IG51bWJlcikgPT4gbnVtYmVyKSkge1xuICAgICAgICBjb25zdCBxdWV1ZSA9IGFyci5yZWR1Y2UoKHByZXY6IEFycmF5PG51bWJlcj4sIG5leHQpID0+IHtcbiAgICAgICAgICAgIGlmIChzY29yZUZ1bmMuYXBwbHkoYXJyLCBbbmV4dF0pID49IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIHByZXYucHVzaChuZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIHJldHVybiBxdWV1ZTtcbiAgICB9LFxuXG4gICAgbWF4SW5kZXgoYXJyOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIGxldCBtYXggPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGFycltpXSA+IGFyclttYXhdKSB7XG4gICAgICAgICAgICAgICAgbWF4ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH0sXG5cbiAgICBtYXgoYXJyOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIGxldCBtYXggPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGFycltpXSA+IG1heCkge1xuICAgICAgICAgICAgICAgIG1heCA9IGFycltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH0sXG5cbiAgICBzdW0oYXJyOiBBcnJheTxudW1iZXI+IHwgVHlwZWRBcnJheSk6IG51bWJlciB7XG4gICAgICAgIGxldCB7IGxlbmd0aCB9ID0gYXJyO1xuICAgICAgICBsZXQgc3VtID0gMDtcblxuICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgICAgIHN1bSArPSBhcnJbbGVuZ3RoXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH0sXG59O1xuIiwiaW1wb3J0IHsgZ2xNYXRyaXgsIHZlYzIgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHtcbiAgICBYWVNpemUsXG4gICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yLFxuICAgIFR5cGVkQXJyYXksXG4gICAgV3JhcHBlckluZGV4TWFwcGluZyxcbiAgICBNb21lbnQsXG4gICAgU3BhcnNlSW1hZ2VXcmFwcGVyLFxufSBmcm9tICcuLi8uLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYS5kJztcbmltcG9ydCBBcnJheUhlbHBlciBmcm9tICcuL2FycmF5X2hlbHBlcic7XG5pbXBvcnQgeyBoc3YycmdiIH0gZnJvbSAnLi9jdl91dGlscyc7XG5cbmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7XG5cbnR5cGUgUG9zaXRpdmVOdW1iZXIgPSBudW1iZXI7XG5mdW5jdGlvbiBhc3NlcnROdW1iZXJQb3NpdGl2ZSh2YWw6IG51bWJlcik6IGFzc2VydHMgdmFsIGlzIFBvc2l0aXZlTnVtYmVyIHtcbiAgICBpZiAodmFsIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIHBvc2l0aXZlIG51bWJlciwgcmVjZWl2ZWQgJHt2YWx9YCk7XG4gICAgfVxufVxuXG5jbGFzcyBJbWFnZVdyYXBwZXIgaW1wbGVtZW50cyBTcGFyc2VJbWFnZVdyYXBwZXIge1xuICAgIGRhdGE6IFR5cGVkQXJyYXkgfCBBcnJheTxudW1iZXI+O1xuXG4gICAgc2l6ZTogWFlTaXplO1xuXG4gICAgaW5kZXhNYXBwaW5nPzogV3JhcHBlckluZGV4TWFwcGluZztcblxuICAgIC8vIFJlcHJlc2VudHMgYSBiYXNpYyBpbWFnZSBjb21iaW5pbmcgdGhlIGRhdGEgYW5kIHNpemUuIEluIGFkZGl0aW9uLCBzb21lIG1ldGhvZHMgZm9yXG4gICAgLy8gbWFuaXB1bGF0aW9uIGFyZSBjb250YWluZWQgd2l0aGluLlxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBzaXplOiBYWVNpemUsXG4gICAgICAgIGRhdGE/OiBUeXBlZEFycmF5IHwgQXJyYXk8bnVtYmVyPixcbiAgICAgICAgQXJyYXlUeXBlOiBUeXBlZEFycmF5Q29uc3RydWN0b3IgfCBBcnJheUNvbnN0cnVjdG9yID0gVWludDhBcnJheSxcbiAgICAgICAgaW5pdGlhbGl6ZT86IGJvb2xlYW4sXG4gICAgKSB7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3IChBcnJheVR5cGUpKHNpemUueCAqIHNpemUueSk7XG4gICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZSkge1xuICAgICAgICAgICAgICAgIEFycmF5SGVscGVyLmluaXQodGhpcy5kYXRhLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICAvLyB0ZXN0cyBpZiBhIHBvc2l0aW9uIGlzIHdpdGhpbiB0aGUgaW1hZ2UsIGV4dGVuZGVkIG91dCBieSBhIGJvcmRlciBvbiBlYWNoIHNpZGVcbiAgICBpbkltYWdlV2l0aEJvcmRlcihpbWdSZWY6IFhZU2l6ZSwgYm9yZGVyOiBQb3NpdGl2ZU51bWJlciA9IDApOiBib29sZWFuIHtcbiAgICAgICAgYXNzZXJ0TnVtYmVyUG9zaXRpdmUoYm9yZGVyKTtcbiAgICAgICAgcmV0dXJuIChpbWdSZWYueCA+PSAwKVxuICAgICAgICAgICAgJiYgKGltZ1JlZi55ID49IDApXG4gICAgICAgICAgICAmJiAoaW1nUmVmLnggPCAodGhpcy5zaXplLnggKyAoYm9yZGVyICogMikpKVxuICAgICAgICAgICAgJiYgKGltZ1JlZi55IDwgKHRoaXMuc2l6ZS55ICsgKGJvcmRlciAqIDIpKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBmcm9tIFRISVMgSW1hZ2VXcmFwcGVyIHRvIHRoZSBuZXcgaW1hZ2VXcmFwcGVyIHBhcmFtZXRlciwgc3RhcnRpbmcgYXQgZnJvbSwgc3RvcHBpbmcgYXRcbiAgICAvLyBlbmQgb2YgbmV3IGltYWdlV3JhcHBlciBzaXplLlxuICAgIHN1YkltYWdlQXNDb3B5KGltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyLCBmcm9tOiBYWVNpemUpOiBJbWFnZVdyYXBwZXIge1xuICAgICAgICBhc3NlcnROdW1iZXJQb3NpdGl2ZShmcm9tLngpO1xuICAgICAgICBhc3NlcnROdW1iZXJQb3NpdGl2ZShmcm9tLnkpO1xuICAgICAgICBjb25zdCB7IHg6IHNpemVYLCB5OiBzaXplWSB9ID0gaW1hZ2VXcmFwcGVyLnNpemU7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgc2l6ZVg7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBzaXplWTsgeSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgaW1hZ2VXcmFwcGVyLmRhdGFbeSAqIHNpemVYICsgeF0gPSB0aGlzLmRhdGFbKGZyb20ueSArIHkpICogdGhpcy5zaXplLnggKyBmcm9tLnggKyB4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW1hZ2VXcmFwcGVyO1xuICAgICAgICAvLyBUT0RPOiB0aGlzIGZ1bmN0aW9uIHJlYWxseSBwcm9iYWJseSBzaG91bGQgY2FsbCBpbnRvIEltYWdlV3JhcHBlciBzb21ld2hlcmUgdG8gbWFrZVxuICAgICAgICAvLyBzdXJlIHRoYXQgYWxsIG9mIGl0J3MgcGFyYW1ldGVycyBhcmUgc2V0IHByb3Blcmx5LCBzb21ldGhpbmcgbGlrZVxuICAgICAgICAvLyBJbWFnZVdyYXBwZXIuVXBkYXRlRnJvbSgpXG4gICAgICAgIC8vIHRoYXQgbWlnaHQgdGFrZSBhIHByb3ZpZGVkIGRhdGEgYW5kIHNpemUsIGFuZCBtYWtlIHN1cmUgdGhlcmUncyBubyBpbnZhbGlkIGluZGV4TWFwcGluZ1xuICAgICAgICAvLyBoYW5naW5nIGFyb3VuZCwgYW5kIHN1Y2guXG4gICAgfVxuXG4gICAgLy8gUmV0cmlldmUgYSBncmF5c2NhbGUgdmFsdWUgYXQgdGhlIGdpdmVuIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBpbWFnZVxuICAgIGdldCh4OiBudW1iZXIsIHk6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFbeSAqIHRoaXMuc2l6ZS54ICsgeF07XG4gICAgfVxuXG4gICAgLy8gUmV0cmlldmUgYSBncmF5c2NhbGUgdmFsdWUgYXQgdGhlIGdpdmVuIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBpbWFnZSAoc2FmZSwgd2hhdGV2ZXIgdGhhdFxuICAgIC8vIG1lYW5zKVxuICAgIGdldFNhZmUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICAvLyBjYWNoZSBpbmRleE1hcHBpbmcgYmVjYXVzZSBpZiB3ZSdyZSB1c2luZyBpdCBvbmNlLCB3ZSdsbCBwcm9iYWJseSBuZWVkIGl0IGEgYnVuY2ggbW9yZVxuICAgICAgICAvLyB0b29cbiAgICAgICAgaWYgKCF0aGlzLmluZGV4TWFwcGluZykge1xuICAgICAgICAgICAgdGhpcy5pbmRleE1hcHBpbmcgPSB7XG4gICAgICAgICAgICAgICAgeDogW10sXG4gICAgICAgICAgICAgICAgeTogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNpemUueDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleE1hcHBpbmcueFtpXSA9IGk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleE1hcHBpbmcueFtpICsgdGhpcy5zaXplLnhdID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zaXplLnk7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhNYXBwaW5nLnlbaV0gPSBpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhNYXBwaW5nLnlbaSArIHRoaXMuc2l6ZS55XSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVsodGhpcy5pbmRleE1hcHBpbmcueVt5ICsgdGhpcy5zaXplLnldKSAqIHRoaXMuc2l6ZS54ICsgdGhpcy5pbmRleE1hcHBpbmcueFt4ICsgdGhpcy5zaXplLnhdXTtcbiAgICB9XG5cbiAgICAvLyBTZXRzIGEgZ2l2ZW4gcGl4ZWwgcG9zaXRpb24gaW4gdGhlIGltYWdlIHRvIHRoZSBnaXZlbiBncmF5c2NhbGUgdmFsdWVcbiAgICBzZXQoeDogbnVtYmVyLCB5OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiBJbWFnZVdyYXBwZXIge1xuICAgICAgICB0aGlzLmRhdGFbeSAqIHRoaXMuc2l6ZS54ICsgeF0gPSB2YWx1ZTtcbiAgICAgICAgZGVsZXRlIHRoaXMuaW5kZXhNYXBwaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBTZXRzIHRoZSBib3JkZXIgb2YgdGhlIGltYWdlICgxIHBpeGVsKSB0byB6ZXJvXG4gICAgemVyb0JvcmRlcigpOiBJbWFnZVdyYXBwZXIge1xuICAgICAgICBjb25zdCB7IHg6IHdpZHRoLCB5OiBoZWlnaHQgfSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbXVsdGktYXNzaWduXG4gICAgICAgICAgICB0aGlzLmRhdGFbaV0gPSB0aGlzLmRhdGFbKGhlaWdodCAtIDEpICogd2lkdGggKyBpXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBoZWlnaHQgLSAxOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tdWx0aS1hc3NpZ25cbiAgICAgICAgICAgIHRoaXMuZGF0YVtpICogd2lkdGhdID0gdGhpcy5kYXRhW2kgKiB3aWR0aCArICh3aWR0aCAtIDEpXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuaW5kZXhNYXBwaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiB0aGlzIGZ1bmN0aW9uIGlzIGVudGlyZWx5IHRvbyBsYXJnZSBmb3IgbWUgdG8gcmVhc29uIG91dCByaWdodCBhdCB0aGlzIG1vbWVudCB0aGF0IGknbSBoYW5kbGluZ1xuICAgIC8vIGFsbCB0aGUgcmVzdCBvZiBpdCwgc28gdGhpcyBpcyBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGphdmFzY3JpcHQgc291cmNlLCB3aXRoIG9ubHkgdHdlYWtzXG4gICAgLy8gbmVjZXNzYXJ5IHRvIGdldCBpdCB0byBydW4sIG5vIHRob3VnaHQgcHV0IGludG8gaXQgeWV0LlxuICAgIG1vbWVudHMobGFiZWxDb3VudDogbnVtYmVyKTogQXJyYXk8TW9tZW50PiB7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gdGhpcztcbiAgICAgICAgbGV0IHg7XG4gICAgICAgIGxldCB5O1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnNpemUueTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnNpemUueDtcbiAgICAgICAgbGV0IHZhbDtcbiAgICAgICAgbGV0IHlzcTtcbiAgICAgICAgY29uc3QgbGFiZWxTdW06IEFycmF5PE1vbWVudD4gPSBbXTtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGxldCBsYWJlbDtcbiAgICAgICAgbGV0IG11MTE7XG4gICAgICAgIGxldCBtdTAyO1xuICAgICAgICBsZXQgbXUyMDtcbiAgICAgICAgbGV0IHhfO1xuICAgICAgICBsZXQgeV87XG4gICAgICAgIGxldCB0bXA7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8TW9tZW50PiA9IFtdO1xuICAgICAgICBjb25zdCB7IFBJIH0gPSBNYXRoO1xuICAgICAgICBjb25zdCBQSV80ID0gUEkgLyA0O1xuXG4gICAgICAgIGlmIChsYWJlbENvdW50IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGFiZWxDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBsYWJlbFN1bVtpXSA9IHtcbiAgICAgICAgICAgICAgICBtMDA6IDAsXG4gICAgICAgICAgICAgICAgbTAxOiAwLFxuICAgICAgICAgICAgICAgIG0xMDogMCxcbiAgICAgICAgICAgICAgICBtMTE6IDAsXG4gICAgICAgICAgICAgICAgbTAyOiAwLFxuICAgICAgICAgICAgICAgIG0yMDogMCxcbiAgICAgICAgICAgICAgICB0aGV0YTogMCxcbiAgICAgICAgICAgICAgICByYWQ6IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICB5c3EgPSB5ICogeTtcbiAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFsID0gZGF0YVt5ICogd2lkdGggKyB4XTtcbiAgICAgICAgICAgICAgICBpZiAodmFsID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGxhYmVsU3VtW3ZhbCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5tMDAgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubTAxICs9IHk7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLm0xMCArPSB4O1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5tMTEgKz0geCAqIHk7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLm0wMiArPSB5c3E7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLm0yMCArPSB4ICogeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGFiZWxDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBsYWJlbCA9IGxhYmVsU3VtW2ldO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgICAgICAgICAgaWYgKCFpc05hTihsYWJlbC5tMDApICYmIGxhYmVsLm0wMCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHhfID0gbGFiZWwubTEwIC8gbGFiZWwubTAwO1xuICAgICAgICAgICAgICAgIHlfID0gbGFiZWwubTAxIC8gbGFiZWwubTAwO1xuICAgICAgICAgICAgICAgIG11MTEgPSBsYWJlbC5tMTEgLyBsYWJlbC5tMDAgLSB4XyAqIHlfO1xuICAgICAgICAgICAgICAgIG11MDIgPSBsYWJlbC5tMDIgLyBsYWJlbC5tMDAgLSB5XyAqIHlfO1xuICAgICAgICAgICAgICAgIG11MjAgPSBsYWJlbC5tMjAgLyBsYWJlbC5tMDAgLSB4XyAqIHhfO1xuICAgICAgICAgICAgICAgIHRtcCA9IChtdTAyIC0gbXUyMCkgLyAoMiAqIG11MTEpO1xuICAgICAgICAgICAgICAgIHRtcCA9IDAuNSAqIE1hdGguYXRhbih0bXApICsgKG11MTEgPj0gMCA/IFBJXzQgOiAtUElfNCkgKyBQSTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWl4ZWQtb3BlcmF0b3JzXG4gICAgICAgICAgICAgICAgbGFiZWwudGhldGEgPSAodG1wICogMTgwIC8gUEkgKyA5MCkgJSAxODAgLSA5MDtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwudGhldGEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLnRoZXRhICs9IDE4MDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFiZWwucmFkID0gdG1wID4gUEkgPyB0bXAgLSBQSSA6IHRtcDtcbiAgICAgICAgICAgICAgICBsYWJlbC52ZWMgPSB2ZWMyLmNsb25lKFtNYXRoLmNvcyh0bXApLCBNYXRoLnNpbih0bXApXSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIGEgVWludDhDbGFtcGVkQXJyYXkgY29udGFpbmluZyB0aGlzIGdyYXlzY2FsZSBpbWFnZSBjb252ZXJ0ZWQgdG8gUkdCQSBmb3JtXG4gICAgZ2V0QXNSR0JBKHNjYWxlID0gMS4wKTogVWludDhDbGFtcGVkQXJyYXkge1xuICAgICAgICBjb25zdCByZXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoNCAqIHRoaXMuc2l6ZS54ICogdGhpcy5zaXplLnkpO1xuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuc2l6ZS55OyB5KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy5zaXplLng7IHgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0geSAqIHRoaXMuc2l6ZS54ICsgeDtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5nZXQoeCwgeSkgKiBzY2FsZTtcbiAgICAgICAgICAgICAgICByZXRbcGl4ZWwgKiA0ICsgMF0gPSBjdXJyZW50O1xuICAgICAgICAgICAgICAgIHJldFtwaXhlbCAqIDQgKyAxXSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgcmV0W3BpeGVsICogNCArIDJdID0gY3VycmVudDtcbiAgICAgICAgICAgICAgICByZXRbcGl4ZWwgKiA0ICsgM10gPSAyNTU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvLyBEaXNwbGF5IHRoaXMgSW1hZ2VXcmFwcGVyIGluIGEgZ2l2ZW4gQ2FudmFzIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBzY2FsZVxuICAgIHNob3coY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgc2NhbGUgPSAxLjApOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS53YXJuKCcqIGltYWdld3JhcHBlciBzaG93IGdldGNvbnRleHQgMmQnKTtcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGlmICghY3R4KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBnZXQgY2FudmFzIGNvbnRleHQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcmFtZSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0QXNSR0JBKHNjYWxlKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHRoaXMuc2l6ZS54O1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgY2FudmFzLmhlaWdodCA9IHRoaXMuc2l6ZS55O1xuICAgICAgICBjb25zdCBuZXdGcmFtZSA9IG5ldyBJbWFnZURhdGEoZGF0YSwgZnJhbWUud2lkdGgsIGZyYW1lLmhlaWdodCk7XG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEobmV3RnJhbWUsIDAsIDApO1xuICAgIH1cblxuICAgIC8vIERpc3BsYXlzIGEgc3BlY2lmaWVkIFN1YkltYWdlIGFyZWEgaW4gYSBnaXZlbiBjYW52YXMuIFRoaXMgZGlmZmVycyBkcmFzdGljYWxseSBmcm9tXG4gICAgLy8gY3JlYXRpbmcgYSBuZXcgU3ViSW1hZ2UgYW5kIHVzaW5nIGl0J3Mgc2hvdygpIG1ldGhvZC4gV2h5PyBJIGRvbid0IGhhdmUgdGhlIGFuc3dlciB0byB0aGF0XG4gICAgLy8geWV0LiAgSSBzdXNwZWN0IHRoZSBIU1YvUkdCIG9wZXJhdGlvbnMgaW52b2x2ZWQgaGVyZSBhcmUgbWFraW5nIGl0IHNpZ25pZmljYW50bHkgZGlmZmVyZW50LFxuICAgIC8vIGJ1dCB1bnRpbCBJIGNhbiB2aXN1YWxpemUgdGhlc2UgZnVuY3Rpb25zIHNpZGUgYnkgc2lkZSwgSSdtIGp1c3QgZ29pbmcgdG8gY29weSB0aGUgZXhpc3RpbmdcbiAgICAvLyBpbXBsZW1lbnRhdGlvbi5cbiAgICBvdmVybGF5KGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGluU2NhbGU6IG51bWJlciwgZnJvbTogWFlTaXplKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkU2NhbGUgPSAoaW5TY2FsZSA8IDAgfHwgaW5TY2FsZSA+IDM2MCkgPyAzNjAgOiBpblNjYWxlO1xuICAgICAgICBjb25zdCBoc3YgPSBbMCwgMSwgMV07XG4gICAgICAgIGNvbnN0IHJnYiA9IFswLCAwLCAwXTtcbiAgICAgICAgY29uc3Qgd2hpdGVSZ2IgPSBbMjU1LCAyNTUsIDI1NV07XG4gICAgICAgIGNvbnN0IGJsYWNrUmdiID0gWzAsIDAsIDBdO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGNvbnNvbGUud2FybignKiBpbWFnZXdyYXBwZXIgb3ZlcmxheSBnZXRjb250ZXh0IDJkJyk7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBpZiAoIWN0eCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IGNhbnZhcyBjb250ZXh0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZnJhbWUgPSBjdHguZ2V0SW1hZ2VEYXRhKGZyb20ueCwgZnJvbS55LCB0aGlzLnNpemUueCwgdGhpcy5zaXplLnkpO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGZyYW1lO1xuICAgICAgICBsZXQgeyBsZW5ndGggfSA9IHRoaXMuZGF0YTtcbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgICBoc3ZbMF0gPSB0aGlzLmRhdGFbbGVuZ3RoXSAqIGFkanVzdGVkU2NhbGU7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgIHJlc3VsdCA9IGhzdlswXSA8PSAwID8gd2hpdGVSZ2IgOiBoc3ZbMF0gPj0gMzYwID8gYmxhY2tSZ2IgOiBoc3YycmdiKGhzdiwgcmdiKTtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IGxlbmd0aCAqIDQ7XG4gICAgICAgICAgICBbZGF0YVtwb3NdLCBkYXRhW3BvcyArIDFdLCBkYXRhW3BvcyArIDJdXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIGRhdGFbcG9zICsgM10gPSAyNTU7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShmcmFtZSwgZnJvbS54LCBmcm9tLnkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW1hZ2VXcmFwcGVyO1xuIiwiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlamVjdChlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpbmZvLmRvbmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gIH1cbn1cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cbiAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIHN1cGVyUHJvcEJhc2UgPSByZXF1aXJlKFwiLi9zdXBlclByb3BCYXNlLmpzXCIpO1xuZnVuY3Rpb24gX2dldCgpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmIFJlZmxlY3QuZ2V0KSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfZ2V0ID0gUmVmbGVjdC5nZXQuYmluZCgpLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfZ2V0ID0gZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikge1xuICAgICAgdmFyIGJhc2UgPSBzdXBlclByb3BCYXNlKHRhcmdldCwgcHJvcGVydHkpO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm47XG4gICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSwgcHJvcGVydHkpO1xuICAgICAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgICAgIHJldHVybiBkZXNjLmdldC5jYWxsKGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdGFyZ2V0IDogcmVjZWl2ZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlc2MudmFsdWU7XG4gICAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzO1xuICB9XG4gIHJldHVybiBfZ2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9nZXQsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7XG4iLCJmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgcmV0dXJuIChtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gIH0gOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzKSwgX3R5cGVvZihvYmopO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIGJhc2VNZXJnZSA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZScpLFxuICAgIGNyZWF0ZUFzc2lnbmVyID0gcmVxdWlyZSgnLi9fY3JlYXRlQXNzaWduZXInKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgbWVyZ2VzIG93biBhbmRcbiAqIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIGludG8gdGhlXG4gKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmVcbiAqIHNraXBwZWQgaWYgYSBkZXN0aW5hdGlvbiB2YWx1ZSBleGlzdHMuIEFycmF5IGFuZCBwbGFpbiBvYmplY3QgcHJvcGVydGllc1xuICogYXJlIG1lcmdlZCByZWN1cnNpdmVseS4gT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnlcbiAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudFxuICogc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuNS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7XG4gKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dXG4gKiB9O1xuICpcbiAqIHZhciBvdGhlciA9IHtcbiAqICAgJ2EnOiBbeyAnYyc6IDMgfSwgeyAnZSc6IDUgfV1cbiAqIH07XG4gKlxuICogXy5tZXJnZShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IDIsICdjJzogMyB9LCB7ICdkJzogNCwgJ2UnOiA1IH1dIH1cbiAqL1xudmFyIG1lcmdlID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KSB7XG4gIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2U7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iLCIvKipcbiAqIGh0dHA6Ly93d3cuY29kZXByb2plY3QuY29tL1RpcHMvNDA3MTcyL0Nvbm5lY3RlZC1Db21wb25lbnQtTGFiZWxpbmctYW5kLVZlY3Rvcml6YXRpb25cbiAqL1xuY29uc3QgVHJhY2VyID0ge1xuICAgIHNlYXJjaERpcmVjdGlvbnM6IFtbMCwgMV0sIFsxLCAxXSwgWzEsIDBdLCBbMSwgLTFdLCBbMCwgLTFdLCBbLTEsIC0xXSwgWy0xLCAwXSwgWy0xLCAxXV0sXG4gICAgY3JlYXRlKGltYWdlV3JhcHBlciwgbGFiZWxXcmFwcGVyKSB7XG4gICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgICAgICBjb25zdCBsYWJlbERhdGEgPSBsYWJlbFdyYXBwZXIuZGF0YTtcbiAgICAgICAgY29uc3QgeyBzZWFyY2hEaXJlY3Rpb25zIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB3aWR0aCA9IGltYWdlV3JhcHBlci5zaXplLng7XG4gICAgICAgIGxldCBwb3M7XG5cbiAgICAgICAgZnVuY3Rpb24gdHJhY2UoY3VycmVudCwgY29sb3IsIGxhYmVsLCBlZGdlbGFiZWwpIHtcbiAgICAgICAgICAgIGxldCBpO1xuICAgICAgICAgICAgbGV0IHk7XG4gICAgICAgICAgICBsZXQgeDtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlYXJjaERpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB5ID0gY3VycmVudC5jeSArIHNlYXJjaERpcmVjdGlvbnNbY3VycmVudC5kaXJdWzBdO1xuICAgICAgICAgICAgICAgIHggPSBjdXJyZW50LmN4ICsgc2VhcmNoRGlyZWN0aW9uc1tjdXJyZW50LmRpcl1bMV07XG4gICAgICAgICAgICAgICAgcG9zID0geSAqIHdpZHRoICsgeDtcbiAgICAgICAgICAgICAgICBpZiAoKGltYWdlRGF0YVtwb3NdID09PSBjb2xvcikgJiYgKChsYWJlbERhdGFbcG9zXSA9PT0gMCkgfHwgKGxhYmVsRGF0YVtwb3NdID09PSBsYWJlbCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsRGF0YVtwb3NdID0gbGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuY3kgPSB5O1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmN4ID0geDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsYWJlbERhdGFbcG9zXSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbERhdGFbcG9zXSA9IGVkZ2VsYWJlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudC5kaXIgPSAoY3VycmVudC5kaXIgKyAxKSAlIDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB2ZXJ0ZXgyRCh4LCB5LCBkaXIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlyLFxuICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICAgICAgICAgIHByZXY6IG51bGwsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY29udG91clRyYWNpbmcoc3ksIHN4LCBsYWJlbCwgY29sb3IsIGVkZ2VsYWJlbCkge1xuICAgICAgICAgICAgbGV0IEZ2ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBDdjtcbiAgICAgICAgICAgIGxldCBQO1xuICAgICAgICAgICAgbGV0IGxkaXI7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0ge1xuICAgICAgICAgICAgICAgIGN4OiBzeCxcbiAgICAgICAgICAgICAgICBjeTogc3ksXG4gICAgICAgICAgICAgICAgZGlyOiAwLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHRyYWNlKGN1cnJlbnQsIGNvbG9yLCBsYWJlbCwgZWRnZWxhYmVsKSkge1xuICAgICAgICAgICAgICAgIEZ2ID0gdmVydGV4MkQoc3gsIHN5LCBjdXJyZW50LmRpcik7XG4gICAgICAgICAgICAgICAgQ3YgPSBGdjtcbiAgICAgICAgICAgICAgICBsZGlyID0gY3VycmVudC5kaXI7XG4gICAgICAgICAgICAgICAgUCA9IHZlcnRleDJEKGN1cnJlbnQuY3gsIGN1cnJlbnQuY3ksIDApO1xuICAgICAgICAgICAgICAgIFAucHJldiA9IEN2O1xuICAgICAgICAgICAgICAgIEN2Lm5leHQgPSBQO1xuICAgICAgICAgICAgICAgIFAubmV4dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgQ3YgPSBQO1xuXG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsUGl4ZWxDb3VudCA9IGltYWdlV3JhcHBlci5zaXplLnggKiBpbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgICAgICAgICAgICAgIGxldCBwaXhlbENvdW50ZXIgPSAwO1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5kaXIgPSAoY3VycmVudC5kaXIgKyA2KSAlIDg7XG4gICAgICAgICAgICAgICAgICAgIHRyYWNlKGN1cnJlbnQsIGNvbG9yLCBsYWJlbCwgZWRnZWxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxkaXIgIT09IGN1cnJlbnQuZGlyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDdi5kaXIgPSBjdXJyZW50LmRpcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIFAgPSB2ZXJ0ZXgyRChjdXJyZW50LmN4LCBjdXJyZW50LmN5LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFAucHJldiA9IEN2O1xuICAgICAgICAgICAgICAgICAgICAgICAgQ3YubmV4dCA9IFA7XG4gICAgICAgICAgICAgICAgICAgICAgICBQLm5leHQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgQ3YgPSBQO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ3YuZGlyID0gbGRpcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIEN2LnggPSBjdXJyZW50LmN4O1xuICAgICAgICAgICAgICAgICAgICAgICAgQ3YueSA9IGN1cnJlbnQuY3k7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGRpciA9IGN1cnJlbnQuZGlyO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKChjdXJyZW50LmN4ICE9PSBzeCB8fCBjdXJyZW50LmN5ICE9PSBzeSkgJiYgKytwaXhlbENvdW50ZXIgPCB0b3RhbFBpeGVsQ291bnQpO1xuICAgICAgICAgICAgICAgIEZ2LnByZXYgPSBDdi5wcmV2O1xuICAgICAgICAgICAgICAgIEN2LnByZXYubmV4dCA9IEZ2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEZ2O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRyYWNlKGN1cnJlbnQsIGNvbG9yLCBsYWJlbCwgZWRnZWxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNlKGN1cnJlbnQsIGNvbG9yLCBsYWJlbCwgZWRnZWxhYmVsKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250b3VyVHJhY2luZyhzeSwgc3gsIGxhYmVsLCBjb2xvciwgZWRnZWxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRvdXJUcmFjaW5nKHN5LCBzeCwgbGFiZWwsIGNvbG9yLCBlZGdlbGFiZWwpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgKFRyYWNlcik7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgZ2V0UmF3VGFnID0gcmVxdWlyZSgnLi9fZ2V0UmF3VGFnJyksXG4gICAgb2JqZWN0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19vYmplY3RUb1N0cmluZycpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0VGFnO1xuIiwiaW1wb3J0IHsgZ2xNYXRyaXgsIHZlYzIsIG1hdDIgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IEltYWdlV3JhcHBlciBmcm9tICcuLi9jb21tb24vaW1hZ2Vfd3JhcHBlcic7XG5pbXBvcnQge1xuICAgIGNhbGN1bGF0ZVBhdGNoU2l6ZSxcbiAgICBvdHN1VGhyZXNob2xkLFxuICAgIGhzdjJyZ2IsXG4gICAgY2x1c3RlcixcbiAgICB0b3BHZW5lcmljLFxuICAgIGltYWdlUmVmLFxuICAgIGhhbGZTYW1wbGUsXG4gICAgY29tcHV0ZUltYWdlQXJlYSxcbn0gZnJvbSAnLi4vY29tbW9uL2N2X3V0aWxzJztcbmltcG9ydCBBcnJheUhlbHBlciBmcm9tICcuLi9jb21tb24vYXJyYXlfaGVscGVyJztcbmltcG9ydCBJbWFnZURlYnVnIGZyb20gJy4uL2NvbW1vbi9pbWFnZV9kZWJ1Zyc7XG5pbXBvcnQgUmFzdGVyaXplciBmcm9tICcuL3Jhc3Rlcml6ZXInO1xuaW1wb3J0IFRyYWNlciBmcm9tICcuL3RyYWNlcic7XG5pbXBvcnQgc2tlbGV0b25pemVyIGZyb20gJy4vc2tlbGV0b25pemVyJztcblxuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtcblxubGV0IF9jb25maWc7XG5sZXQgX2N1cnJlbnRJbWFnZVdyYXBwZXI7XG5sZXQgX3NrZWxJbWFnZVdyYXBwZXI7XG5sZXQgX3N1YkltYWdlV3JhcHBlcjtcbmxldCBfbGFiZWxJbWFnZVdyYXBwZXI7XG5sZXQgX3BhdGNoR3JpZDtcbmxldCBfcGF0Y2hMYWJlbEdyaWQ7XG5sZXQgX2ltYWdlVG9QYXRjaEdyaWQ7XG5sZXQgX2JpbmFyeUltYWdlV3JhcHBlcjtcbmxldCBfcGF0Y2hTaXplO1xuY29uc3QgX2NhbnZhc0NvbnRhaW5lciA9IHtcbiAgICBjdHg6IHtcbiAgICAgICAgYmluYXJ5OiBudWxsLFxuICAgIH0sXG4gICAgZG9tOiB7XG4gICAgICAgIGJpbmFyeTogbnVsbCxcbiAgICB9LFxufTtcbmNvbnN0IF9udW1QYXRjaGVzID0geyB4OiAwLCB5OiAwIH07XG5sZXQgX2lucHV0SW1hZ2VXcmFwcGVyO1xubGV0IF9za2VsZXRvbml6ZXI7XG5cbmZ1bmN0aW9uIGluaXRCdWZmZXJzKCkge1xuICAgIGlmIChfY29uZmlnLmhhbGZTYW1wbGUpIHtcbiAgICAgICAgX2N1cnJlbnRJbWFnZVdyYXBwZXIgPSBuZXcgSW1hZ2VXcmFwcGVyKHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICAgICAgICB4OiBfaW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS54IC8gMiB8IDAsXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgICAgICAgICAgeTogX2lucHV0SW1hZ2VXcmFwcGVyLnNpemUueSAvIDIgfCAwLFxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBfY3VycmVudEltYWdlV3JhcHBlciA9IF9pbnB1dEltYWdlV3JhcHBlcjtcbiAgICB9XG5cbiAgICBfcGF0Y2hTaXplID0gY2FsY3VsYXRlUGF0Y2hTaXplKF9jb25maWcucGF0Y2hTaXplLCBfY3VycmVudEltYWdlV3JhcHBlci5zaXplKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgX251bVBhdGNoZXMueCA9IF9jdXJyZW50SW1hZ2VXcmFwcGVyLnNpemUueCAvIF9wYXRjaFNpemUueCB8IDA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICBfbnVtUGF0Y2hlcy55ID0gX2N1cnJlbnRJbWFnZVdyYXBwZXIuc2l6ZS55IC8gX3BhdGNoU2l6ZS55IHwgMDtcblxuICAgIF9iaW5hcnlJbWFnZVdyYXBwZXIgPSBuZXcgSW1hZ2VXcmFwcGVyKF9jdXJyZW50SW1hZ2VXcmFwcGVyLnNpemUsIHVuZGVmaW5lZCwgVWludDhBcnJheSwgZmFsc2UpO1xuXG4gICAgX2xhYmVsSW1hZ2VXcmFwcGVyID0gbmV3IEltYWdlV3JhcHBlcihfcGF0Y2hTaXplLCB1bmRlZmluZWQsIEFycmF5LCB0cnVlKTtcblxuICAgIGNvbnN0IHNrZWxldG9uSW1hZ2VEYXRhID0gbmV3IEFycmF5QnVmZmVyKDY0ICogMTAyNCk7XG4gICAgX3N1YkltYWdlV3JhcHBlciA9IG5ldyBJbWFnZVdyYXBwZXIoX3BhdGNoU2l6ZSxcbiAgICAgICAgbmV3IFVpbnQ4QXJyYXkoc2tlbGV0b25JbWFnZURhdGEsIDAsIF9wYXRjaFNpemUueCAqIF9wYXRjaFNpemUueSkpO1xuICAgIF9za2VsSW1hZ2VXcmFwcGVyID0gbmV3IEltYWdlV3JhcHBlcihfcGF0Y2hTaXplLFxuICAgICAgICBuZXcgVWludDhBcnJheShza2VsZXRvbkltYWdlRGF0YSwgX3BhdGNoU2l6ZS54ICogX3BhdGNoU2l6ZS55ICogMywgX3BhdGNoU2l6ZS54ICogX3BhdGNoU2l6ZS55KSxcbiAgICAgICAgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICBfc2tlbGV0b25pemVyID0gc2tlbGV0b25pemVyKFxuICAgICAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpID8gd2luZG93IDogKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykgPyBzZWxmIDogZ2xvYmFsLFxuICAgICAgICB7IHNpemU6IF9wYXRjaFNpemUueCB9LFxuICAgICAgICBza2VsZXRvbkltYWdlRGF0YSxcbiAgICApO1xuXG4gICAgX2ltYWdlVG9QYXRjaEdyaWQgPSBuZXcgSW1hZ2VXcmFwcGVyKHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgICAgeDogKF9jdXJyZW50SW1hZ2VXcmFwcGVyLnNpemUueCAvIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZS54KSB8IDAsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICAgIHk6IChfY3VycmVudEltYWdlV3JhcHBlci5zaXplLnkgLyBfc3ViSW1hZ2VXcmFwcGVyLnNpemUueSkgfCAwLFxuICAgIH0sIHVuZGVmaW5lZCwgQXJyYXksIHRydWUpO1xuICAgIF9wYXRjaEdyaWQgPSBuZXcgSW1hZ2VXcmFwcGVyKF9pbWFnZVRvUGF0Y2hHcmlkLnNpemUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICBfcGF0Y2hMYWJlbEdyaWQgPSBuZXcgSW1hZ2VXcmFwcGVyKF9pbWFnZVRvUGF0Y2hHcmlkLnNpemUsIHVuZGVmaW5lZCwgSW50MzJBcnJheSwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGluaXRDYW52YXMoKSB7XG4gICAgaWYgKF9jb25maWcudXNlV29ya2VyIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5iaW5hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5iaW5hcnkuY2xhc3NOYW1lID0gJ2JpbmFyeUJ1ZmZlcic7XG4gICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLnNob3dDYW52YXMgPT09IHRydWUpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RlYnVnJykuYXBwZW5kQ2hpbGQoX2NhbnZhc0NvbnRhaW5lci5kb20uYmluYXJ5KTtcbiAgICB9XG4gICAgY29uc3Qgd2lsbFJlYWRGcmVxdWVudGx5ID0gISFfY29uZmlnLndpbGxSZWFkRnJlcXVlbnRseTtcbiAgICBjb25zb2xlLndhcm4oJyogaW5pdENhbnZhcyB3aWxsUmVhZEZyZXF1ZW50bHknLCB3aWxsUmVhZEZyZXF1ZW50bHksIF9jb25maWcpO1xuICAgIF9jYW52YXNDb250YWluZXIuY3R4LmJpbmFyeSA9IF9jYW52YXNDb250YWluZXIuZG9tLmJpbmFyeS5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5IH0pO1xuICAgIF9jYW52YXNDb250YWluZXIuZG9tLmJpbmFyeS53aWR0aCA9IF9iaW5hcnlJbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgIF9jYW52YXNDb250YWluZXIuZG9tLmJpbmFyeS5oZWlnaHQgPSBfYmluYXJ5SW1hZ2VXcmFwcGVyLnNpemUueTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgYm91bmRpbmcgYm94IHdoaWNoIGVuY2xvc2VzIGFsbCB0aGUgZ2l2ZW4gcGF0Y2hlc1xuICogQHJldHVybnMge0FycmF5fSBUaGUgbWluaW1hbCBib3VuZGluZyBib3hcbiAqL1xuZnVuY3Rpb24gYm94RnJvbVBhdGNoZXMocGF0Y2hlcykge1xuICAgIGxldCBvdmVyQXZnO1xuICAgIGxldCBpO1xuICAgIGxldCBqO1xuICAgIGxldCBwYXRjaDtcbiAgICBsZXQgdHJhbnNNYXQ7XG4gICAgbGV0IG1pbnggPSBfYmluYXJ5SW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICBsZXQgbWlueSA9IF9iaW5hcnlJbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgIGxldCBtYXh4ID0gLV9iaW5hcnlJbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgIGxldCBtYXh5ID0gLV9iaW5hcnlJbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgIGxldCBib3g7XG4gICAgbGV0IHNjYWxlO1xuXG4gICAgLy8gZHJhdyBhbGwgcGF0Y2hlcyB3aGljaCBhcmUgdG8gYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAgb3ZlckF2ZyA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHBhdGNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcGF0Y2ggPSBwYXRjaGVzW2ldO1xuICAgICAgICBvdmVyQXZnICs9IHBhdGNoLnJhZDtcbiAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLnNob3dQYXRjaGVzKSB7XG4gICAgICAgICAgICBJbWFnZURlYnVnLmRyYXdSZWN0KHBhdGNoLnBvcywgX3N1YkltYWdlV3JhcHBlci5zaXplLCBfY2FudmFzQ29udGFpbmVyLmN0eC5iaW5hcnksIHsgY29sb3I6ICdyZWQnIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3ZlckF2ZyAvPSBwYXRjaGVzLmxlbmd0aDtcbiAgICBvdmVyQXZnID0gKG92ZXJBdmcgKiAxODAgLyBNYXRoLlBJICsgOTApICUgMTgwIC0gOTA7XG4gICAgaWYgKG92ZXJBdmcgPCAwKSB7XG4gICAgICAgIG92ZXJBdmcgKz0gMTgwO1xuICAgIH1cblxuICAgIG92ZXJBdmcgPSAoMTgwIC0gb3ZlckF2ZykgKiBNYXRoLlBJIC8gMTgwO1xuICAgIHRyYW5zTWF0ID0gbWF0Mi5jb3B5KG1hdDIuY3JlYXRlKCksIFtNYXRoLmNvcyhvdmVyQXZnKSwgTWF0aC5zaW4ob3ZlckF2ZyksIC1NYXRoLnNpbihvdmVyQXZnKSwgTWF0aC5jb3Mob3ZlckF2ZyldKTtcblxuICAgIC8vIGl0ZXJhdGUgb3ZlciBwYXRjaGVzIGFuZCByb3RhdGUgYnkgYW5nbGVcbiAgICBmb3IgKGkgPSAwOyBpIDwgcGF0Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYXRjaCA9IHBhdGNoZXNbaV07XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICAgIHZlYzIudHJhbnNmb3JtTWF0MihwYXRjaC5ib3hbal0sIHBhdGNoLmJveFtqXSwgdHJhbnNNYXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLmJveEZyb21QYXRjaGVzLnNob3dUcmFuc2Zvcm1lZCkge1xuICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UGF0aChwYXRjaC5ib3gsIHsgeDogMCwgeTogMSB9LCBfY2FudmFzQ29udGFpbmVyLmN0eC5iaW5hcnksIHsgY29sb3I6ICcjOTlmZjAwJywgbGluZVdpZHRoOiAyIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZmluZCBib3VuZGluZyBib3hcbiAgICBmb3IgKGkgPSAwOyBpIDwgcGF0Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYXRjaCA9IHBhdGNoZXNbaV07XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYXRjaC5ib3hbal1bMF0gPCBtaW54KSB7XG4gICAgICAgICAgICAgICAgbWlueCA9IHBhdGNoLmJveFtqXVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXRjaC5ib3hbal1bMF0gPiBtYXh4KSB7XG4gICAgICAgICAgICAgICAgbWF4eCA9IHBhdGNoLmJveFtqXVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXRjaC5ib3hbal1bMV0gPCBtaW55KSB7XG4gICAgICAgICAgICAgICAgbWlueSA9IHBhdGNoLmJveFtqXVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXRjaC5ib3hbal1bMV0gPiBtYXh5KSB7XG4gICAgICAgICAgICAgICAgbWF4eSA9IHBhdGNoLmJveFtqXVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJveCA9IFtbbWlueCwgbWlueV0sIFttYXh4LCBtaW55XSwgW21heHgsIG1heHldLCBbbWlueCwgbWF4eV1dO1xuXG4gICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLmJveEZyb21QYXRjaGVzLnNob3dUcmFuc2Zvcm1lZEJveCkge1xuICAgICAgICBJbWFnZURlYnVnLmRyYXdQYXRoKGJveCwgeyB4OiAwLCB5OiAxIH0sIF9jYW52YXNDb250YWluZXIuY3R4LmJpbmFyeSwgeyBjb2xvcjogJyNmZjAwMDAnLCBsaW5lV2lkdGg6IDIgfSk7XG4gICAgfVxuXG4gICAgc2NhbGUgPSBfY29uZmlnLmhhbGZTYW1wbGUgPyAyIDogMTtcbiAgICAvLyByZXZlcnNlIHJvdGF0aW9uO1xuICAgIHRyYW5zTWF0ID0gbWF0Mi5pbnZlcnQodHJhbnNNYXQsIHRyYW5zTWF0KTtcbiAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgIHZlYzIudHJhbnNmb3JtTWF0Mihib3hbal0sIGJveFtqXSwgdHJhbnNNYXQpO1xuICAgIH1cblxuICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5ib3hGcm9tUGF0Y2hlcy5zaG93QkIpIHtcbiAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UGF0aChib3gsIHsgeDogMCwgeTogMSB9LCBfY2FudmFzQ29udGFpbmVyLmN0eC5iaW5hcnksIHsgY29sb3I6ICcjZmYwMDAwJywgbGluZVdpZHRoOiAyIH0pO1xuICAgIH1cblxuICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgdmVjMi5zY2FsZShib3hbal0sIGJveFtqXSwgc2NhbGUpO1xuICAgIH1cblxuICAgIHJldHVybiBib3g7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJpbmFyeSBpbWFnZSBvZiB0aGUgY3VycmVudCBpbWFnZVxuICovXG5mdW5jdGlvbiBiaW5hcml6ZUltYWdlKCkge1xuICAgIG90c3VUaHJlc2hvbGQoX2N1cnJlbnRJbWFnZVdyYXBwZXIsIF9iaW5hcnlJbWFnZVdyYXBwZXIpO1xuICAgIF9iaW5hcnlJbWFnZVdyYXBwZXIuemVyb0JvcmRlcigpO1xuICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5zaG93Q2FudmFzKSB7XG4gICAgICAgIF9iaW5hcnlJbWFnZVdyYXBwZXIuc2hvdyhfY2FudmFzQ29udGFpbmVyLmRvbS5iaW5hcnksIDI1NSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciB0aGUgZW50aXJlIGltYWdlXG4gKiBleHRyYWN0IHBhdGNoZXNcbiAqL1xuZnVuY3Rpb24gZmluZFBhdGNoZXMoKSB7XG4gICAgbGV0IGk7XG4gICAgbGV0IGo7XG4gICAgbGV0IHg7XG4gICAgbGV0IHk7XG4gICAgbGV0IG1vbWVudHM7XG4gICAgbGV0IHBhdGNoZXNGb3VuZCA9IFtdO1xuICAgIGxldCByYXN0ZXJpemVyO1xuICAgIGxldCByYXN0ZXJSZXN1bHQ7XG4gICAgbGV0IHBhdGNoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBfbnVtUGF0Y2hlcy54OyBpKyspIHtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IF9udW1QYXRjaGVzLnk7IGorKykge1xuICAgICAgICAgICAgeCA9IF9zdWJJbWFnZVdyYXBwZXIuc2l6ZS54ICogaTtcbiAgICAgICAgICAgIHkgPSBfc3ViSW1hZ2VXcmFwcGVyLnNpemUueSAqIGo7XG5cbiAgICAgICAgICAgIC8vIHNlcGVyYXRlIHBhcnRzXG4gICAgICAgICAgICBza2VsZXRvbml6ZSh4LCB5KTtcblxuICAgICAgICAgICAgLy8gUmFzdGVyaXplLCBmaW5kIGluZGl2aWR1YWwgYmFyc1xuICAgICAgICAgICAgX3NrZWxJbWFnZVdyYXBwZXIuemVyb0JvcmRlcigpO1xuICAgICAgICAgICAgQXJyYXlIZWxwZXIuaW5pdChfbGFiZWxJbWFnZVdyYXBwZXIuZGF0YSwgMCk7XG4gICAgICAgICAgICByYXN0ZXJpemVyID0gUmFzdGVyaXplci5jcmVhdGUoX3NrZWxJbWFnZVdyYXBwZXIsIF9sYWJlbEltYWdlV3JhcHBlcik7XG4gICAgICAgICAgICByYXN0ZXJSZXN1bHQgPSByYXN0ZXJpemVyLnJhc3Rlcml6ZSgwKTtcblxuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLnNob3dMYWJlbHMpIHtcbiAgICAgICAgICAgICAgICBfbGFiZWxJbWFnZVdyYXBwZXIub3ZlcmxheShfY2FudmFzQ29udGFpbmVyLmRvbS5iaW5hcnksIE1hdGguZmxvb3IoMzYwIC8gcmFzdGVyUmVzdWx0LmNvdW50KSxcbiAgICAgICAgICAgICAgICAgICAgeyB4LCB5IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgbW9tZW50cyBmcm9tIHRoZSBza2VsZXRvbml6ZWQgcGF0Y2hcbiAgICAgICAgICAgIG1vbWVudHMgPSBfbGFiZWxJbWFnZVdyYXBwZXIubW9tZW50cyhyYXN0ZXJSZXN1bHQuY291bnQpO1xuXG4gICAgICAgICAgICAvLyBleHRyYWN0IGVsaWdpYmxlIHBhdGNoZXNcbiAgICAgICAgICAgIHBhdGNoZXNGb3VuZCA9IHBhdGNoZXNGb3VuZC5jb25jYXQoZGVzY3JpYmVQYXRjaChtb21lbnRzLCBbaSwgal0sIHgsIHkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5zaG93Rm91bmRQYXRjaGVzKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXRjaGVzRm91bmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBhdGNoID0gcGF0Y2hlc0ZvdW5kW2ldO1xuICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UmVjdChwYXRjaC5wb3MsIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZSwgX2NhbnZhc0NvbnRhaW5lci5jdHguYmluYXJ5LFxuICAgICAgICAgICAgICAgIHsgY29sb3I6ICcjOTlmZjAwJywgbGluZVdpZHRoOiAyIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGNoZXNGb3VuZDtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aG9zZSBjb25uZWN0ZWQgYXJlYXMgd2hpY2ggY29udGFpbiBhdCBsZWFzdCA2IHBhdGNoZXNcbiAqIGFuZCByZXR1cm5zIHRoZW0gb3JkZXJlZCBERVNDIGJ5IHRoZSBudW1iZXIgb2YgY29udGFpbmVkIHBhdGNoZXNcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhMYWJlbFxuICovXG5mdW5jdGlvbiBmaW5kQmlnZ2VzdENvbm5lY3RlZEFyZWFzKG1heExhYmVsKSB7XG4gICAgbGV0IGk7XG4gICAgbGV0IHN1bTtcbiAgICBsZXQgbGFiZWxIaXN0ID0gW107XG4gICAgbGV0IHRvcExhYmVscyA9IFtdO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG1heExhYmVsOyBpKyspIHtcbiAgICAgICAgbGFiZWxIaXN0LnB1c2goMCk7XG4gICAgfVxuICAgIHN1bSA9IF9wYXRjaExhYmVsR3JpZC5kYXRhLmxlbmd0aDtcbiAgICB3aGlsZSAoc3VtLS0pIHtcbiAgICAgICAgaWYgKF9wYXRjaExhYmVsR3JpZC5kYXRhW3N1bV0gPiAwKSB7XG4gICAgICAgICAgICBsYWJlbEhpc3RbX3BhdGNoTGFiZWxHcmlkLmRhdGFbc3VtXSAtIDFdKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsYWJlbEhpc3QgPSBsYWJlbEhpc3QubWFwKCh2YWwsIGlkeCkgPT4gKHtcbiAgICAgICAgdmFsLFxuICAgICAgICBsYWJlbDogaWR4ICsgMSxcbiAgICB9KSk7XG5cbiAgICBsYWJlbEhpc3Quc29ydCgoYSwgYikgPT4gYi52YWwgLSBhLnZhbCk7XG5cbiAgICAvLyBleHRyYWN0IHRvcCBhcmVhcyB3aXRoIGF0IGxlYXN0IDYgcGF0Y2hlcyBwcmVzZW50XG4gICAgdG9wTGFiZWxzID0gbGFiZWxIaXN0LmZpbHRlcigoZWwpID0+IGVsLnZhbCA+PSA1KTtcblxuICAgIHJldHVybiB0b3BMYWJlbHM7XG59XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gZmluZEJveGVzKHRvcExhYmVscywgbWF4TGFiZWwpIHtcbiAgICBsZXQgaTtcbiAgICBsZXQgajtcbiAgICBsZXQgc3VtO1xuICAgIGNvbnN0IHBhdGNoZXMgPSBbXTtcbiAgICBsZXQgcGF0Y2g7XG4gICAgbGV0IGJveDtcbiAgICBjb25zdCBib3hlcyA9IFtdO1xuICAgIGNvbnN0IGhzdiA9IFswLCAxLCAxXTtcbiAgICBjb25zdCByZ2IgPSBbMCwgMCwgMF07XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdG9wTGFiZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN1bSA9IF9wYXRjaExhYmVsR3JpZC5kYXRhLmxlbmd0aDtcbiAgICAgICAgcGF0Y2hlcy5sZW5ndGggPSAwO1xuICAgICAgICB3aGlsZSAoc3VtLS0pIHtcbiAgICAgICAgICAgIGlmIChfcGF0Y2hMYWJlbEdyaWQuZGF0YVtzdW1dID09PSB0b3BMYWJlbHNbaV0ubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBwYXRjaCA9IF9pbWFnZVRvUGF0Y2hHcmlkLmRhdGFbc3VtXTtcbiAgICAgICAgICAgICAgICBwYXRjaGVzLnB1c2gocGF0Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJveCA9IGJveEZyb21QYXRjaGVzKHBhdGNoZXMpO1xuICAgICAgICBpZiAoYm94KSB7XG4gICAgICAgICAgICBib3hlcy5wdXNoKGJveCk7XG5cbiAgICAgICAgICAgIC8vIGRyYXcgcGF0Y2gtbGFiZWxzIGlmIHJlcXVlc3RlZFxuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLnNob3dSZW1haW5pbmdQYXRjaExhYmVscykge1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXRjaGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGNoID0gcGF0Y2hlc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgaHN2WzBdID0gKHRvcExhYmVsc1tpXS5sYWJlbCAvIChtYXhMYWJlbCArIDEpKSAqIDM2MDtcbiAgICAgICAgICAgICAgICAgICAgaHN2MnJnYihoc3YsIHJnYik7XG4gICAgICAgICAgICAgICAgICAgIEltYWdlRGVidWcuZHJhd1JlY3QocGF0Y2gucG9zLCBfc3ViSW1hZ2VXcmFwcGVyLnNpemUsIF9jYW52YXNDb250YWluZXIuY3R4LmJpbmFyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgY29sb3I6IGByZ2IoJHtyZ2Iuam9pbignLCcpfSlgLCBsaW5lV2lkdGg6IDIgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBib3hlcztcbn1cblxuLyoqXG4gKiBGaW5kIHNpbWlsYXIgbW9tZW50cyAodmlhIGNsdXN0ZXIpXG4gKiBAcGFyYW0ge09iamVjdH0gbW9tZW50c1xuICovXG5mdW5jdGlvbiBzaW1pbGFyTW9tZW50cyhtb21lbnRzKSB7XG4gICAgY29uc3QgY2x1c3RlcnMgPSBjbHVzdGVyKG1vbWVudHMsIDAuOTApO1xuICAgIGNvbnN0IHRvcENsdXN0ZXIgPSB0b3BHZW5lcmljKGNsdXN0ZXJzLCAxLCAoZSkgPT4gZS5nZXRQb2ludHMoKS5sZW5ndGgpO1xuICAgIGxldCBwb2ludHMgPSBbXTsgY29uc3RcbiAgICAgICAgcmVzdWx0ID0gW107XG4gICAgaWYgKHRvcENsdXN0ZXIubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHBvaW50cyA9IHRvcENsdXN0ZXJbMF0uaXRlbS5nZXRQb2ludHMoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBvaW50c1tpXS5wb2ludCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2tlbGV0b25pemUoeCwgeSkge1xuICAgIF9iaW5hcnlJbWFnZVdyYXBwZXIuc3ViSW1hZ2VBc0NvcHkoX3N1YkltYWdlV3JhcHBlciwgaW1hZ2VSZWYoeCwgeSkpO1xuICAgIF9za2VsZXRvbml6ZXIuc2tlbGV0b25pemUoKTtcblxuICAgIC8vIFNob3cgc2tlbGV0b24gaWYgcmVxdWVzdGVkXG4gICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLnNob3dTa2VsZXRvbikge1xuICAgICAgICBfc2tlbEltYWdlV3JhcHBlci5vdmVybGF5KF9jYW52YXNDb250YWluZXIuZG9tLmJpbmFyeSwgMzYwLCBpbWFnZVJlZih4LCB5KSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3RzIGFuZCBkZXNjcmliZXMgdGhvc2UgcGF0Y2hlcyB3aGljaCBzZWVtIHRvIGNvbnRhaW4gYSBiYXJjb2RlIHBhdHRlcm5cbiAqIEBwYXJhbSB7QXJyYXl9IG1vbWVudHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXRjaFBvcyxcbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiBAcGFyYW0ge051bWJlcn0geVxuICogQHJldHVybnMge0FycmF5fSBsaXN0IG9mIHBhdGNoZXNcbiAqL1xuZnVuY3Rpb24gZGVzY3JpYmVQYXRjaChtb21lbnRzLCBwYXRjaFBvcywgeCwgeSkge1xuICAgIGxldCBrO1xuICAgIGxldCBhdmc7XG4gICAgY29uc3QgZWxpZ2libGVNb21lbnRzID0gW107XG4gICAgbGV0IG1hdGNoaW5nTW9tZW50cztcbiAgICBsZXQgcGF0Y2g7XG4gICAgY29uc3QgcGF0Y2hlc0ZvdW5kID0gW107XG4gICAgY29uc3QgbWluQ29tcG9uZW50V2VpZ2h0ID0gTWF0aC5jZWlsKF9wYXRjaFNpemUueCAvIDMpO1xuXG4gICAgaWYgKG1vbWVudHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgLy8gb25seSBjb2xsZWN0IG1vbWVudHMgd2hpY2gncyBhcmVhIGNvdmVycyBhdCBsZWFzdCBtaW5Db21wb25lbnRXZWlnaHQgcGl4ZWxzLlxuICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbW9tZW50cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgaWYgKG1vbWVudHNba10ubTAwID4gbWluQ29tcG9uZW50V2VpZ2h0KSB7XG4gICAgICAgICAgICAgICAgZWxpZ2libGVNb21lbnRzLnB1c2gobW9tZW50c1trXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBhdCBsZWFzdCAyIG1vbWVudHMgYXJlIGZvdW5kIHdoaWNoIGhhdmUgYXQgbGVhc3QgbWluQ29tcG9uZW50V2VpZ2h0cyBjb3ZlcmVkXG4gICAgICAgIGlmIChlbGlnaWJsZU1vbWVudHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIG1hdGNoaW5nTW9tZW50cyA9IHNpbWlsYXJNb21lbnRzKGVsaWdpYmxlTW9tZW50cyk7XG4gICAgICAgICAgICBhdmcgPSAwO1xuICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHRoZSBzaW1pbGFyaXR5IG9mIHRoZSBtb21lbnRzXG4gICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbWF0Y2hpbmdNb21lbnRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgYXZnICs9IG1hdGNoaW5nTW9tZW50c1trXT8ucmFkID8/IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9ubHkgdHdvIG9mIHRoZSBtb21lbnRzIGFyZSBhbGxvd2VkIG5vdCB0byBmaXQgaW50byB0aGUgZXF1YXRpb25cbiAgICAgICAgICAgIC8vIGFkZCB0aGUgcGF0Y2ggdG8gdGhlIHNldFxuICAgICAgICAgICAgaWYgKG1hdGNoaW5nTW9tZW50cy5sZW5ndGggPiAxXG4gICAgICAgICAgICAgICAgICAgICYmIG1hdGNoaW5nTW9tZW50cy5sZW5ndGggPj0gKGVsaWdpYmxlTW9tZW50cy5sZW5ndGggLyA0KSAqIDNcbiAgICAgICAgICAgICAgICAgICAgJiYgbWF0Y2hpbmdNb21lbnRzLmxlbmd0aCA+IG1vbWVudHMubGVuZ3RoIC8gNCkge1xuICAgICAgICAgICAgICAgIGF2ZyAvPSBtYXRjaGluZ01vbWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHBhdGNoID0ge1xuICAgICAgICAgICAgICAgICAgICBpbmRleDogcGF0Y2hQb3NbMV0gKiBfbnVtUGF0Y2hlcy54ICsgcGF0Y2hQb3NbMF0sXG4gICAgICAgICAgICAgICAgICAgIHBvczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGJveDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVjMi5jbG9uZShbeCwgeV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmVjMi5jbG9uZShbeCArIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZS54LCB5XSksXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZWMyLmNsb25lKFt4ICsgX3N1YkltYWdlV3JhcHBlci5zaXplLngsIHkgKyBfc3ViSW1hZ2VXcmFwcGVyLnNpemUueV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmVjMi5jbG9uZShbeCwgeSArIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZS55XSksXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIG1vbWVudHM6IG1hdGNoaW5nTW9tZW50cyxcbiAgICAgICAgICAgICAgICAgICAgcmFkOiBhdmcsXG4gICAgICAgICAgICAgICAgICAgIHZlYzogdmVjMi5jbG9uZShbTWF0aC5jb3MoYXZnKSwgTWF0aC5zaW4oYXZnKV0pLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcGF0Y2hlc0ZvdW5kLnB1c2gocGF0Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXRjaGVzRm91bmQ7XG59XG5cbi8qKlxuICogZmluZHMgcGF0Y2hlcyB3aGljaCBhcmUgY29ubmVjdGVkIGFuZCBzaGFyZSB0aGUgc2FtZSBvcmllbnRhdGlvblxuICogQHBhcmFtIHtPYmplY3R9IHBhdGNoZXNGb3VuZFxuICovXG5mdW5jdGlvbiByYXN0ZXJpemVBbmd1bGFyU2ltaWxhcml0eShwYXRjaGVzRm91bmQpIHtcbiAgICBsZXQgbGFiZWwgPSAwO1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IDAuOTU7XG4gICAgbGV0IGN1cnJJZHggPSAwO1xuICAgIGxldCBqO1xuICAgIGxldCBwYXRjaDtcbiAgICBjb25zdCBoc3YgPSBbMCwgMSwgMV07XG4gICAgY29uc3QgcmdiID0gWzAsIDAsIDBdO1xuXG4gICAgZnVuY3Rpb24gbm90WWV0UHJvY2Vzc2VkKCkge1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IF9wYXRjaExhYmVsR3JpZC5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoX3BhdGNoTGFiZWxHcmlkLmRhdGFbaV0gPT09IDAgJiYgX3BhdGNoR3JpZC5kYXRhW2ldID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9wYXRjaExhYmVsR3JpZC5kYXRhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFjZShjdXJyZW50SWR4KSB7XG4gICAgICAgIGxldCB4O1xuICAgICAgICBsZXQgeTtcbiAgICAgICAgbGV0IGN1cnJlbnRQYXRjaDtcbiAgICAgICAgbGV0IGlkeDtcbiAgICAgICAgbGV0IGRpcjtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHtcbiAgICAgICAgICAgIHg6IGN1cnJlbnRJZHggJSBfcGF0Y2hMYWJlbEdyaWQuc2l6ZS54LFxuICAgICAgICAgICAgeTogKGN1cnJlbnRJZHggLyBfcGF0Y2hMYWJlbEdyaWQuc2l6ZS54KSB8IDAsXG4gICAgICAgIH07XG4gICAgICAgIGxldCBzaW1pbGFyaXR5O1xuXG4gICAgICAgIGlmIChjdXJyZW50SWR4IDwgX3BhdGNoTGFiZWxHcmlkLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBjdXJyZW50UGF0Y2ggPSBfaW1hZ2VUb1BhdGNoR3JpZC5kYXRhW2N1cnJlbnRJZHhdO1xuICAgICAgICAgICAgLy8gYXNzaWduIGxhYmVsXG4gICAgICAgICAgICBfcGF0Y2hMYWJlbEdyaWQuZGF0YVtjdXJyZW50SWR4XSA9IGxhYmVsO1xuICAgICAgICAgICAgZm9yIChkaXIgPSAwOyBkaXIgPCBUcmFjZXIuc2VhcmNoRGlyZWN0aW9ucy5sZW5ndGg7IGRpcisrKSB7XG4gICAgICAgICAgICAgICAgeSA9IGN1cnJlbnQueSArIFRyYWNlci5zZWFyY2hEaXJlY3Rpb25zW2Rpcl1bMF07XG4gICAgICAgICAgICAgICAgeCA9IGN1cnJlbnQueCArIFRyYWNlci5zZWFyY2hEaXJlY3Rpb25zW2Rpcl1bMV07XG4gICAgICAgICAgICAgICAgaWR4ID0geSAqIF9wYXRjaExhYmVsR3JpZC5zaXplLnggKyB4O1xuXG4gICAgICAgICAgICAgICAgLy8gY29udGludWUgaWYgcGF0Y2ggZW1wdHlcbiAgICAgICAgICAgICAgICBpZiAoX3BhdGNoR3JpZC5kYXRhW2lkeF0gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgX3BhdGNoTGFiZWxHcmlkLmRhdGFbaWR4XSA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoX3BhdGNoTGFiZWxHcmlkLmRhdGFbaWR4XSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBzaW1pbGFyaXR5ID0gTWF0aC5hYnModmVjMi5kb3QoX2ltYWdlVG9QYXRjaEdyaWQuZGF0YVtpZHhdLnZlYywgY3VycmVudFBhdGNoLnZlYykpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2ltaWxhcml0eSA+IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2UoaWR4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHByZXBhcmUgZm9yIGZpbmRpbmcgdGhlIHJpZ2h0IHBhdGNoZXNcbiAgICBBcnJheUhlbHBlci5pbml0KF9wYXRjaEdyaWQuZGF0YSwgMCk7XG4gICAgQXJyYXlIZWxwZXIuaW5pdChfcGF0Y2hMYWJlbEdyaWQuZGF0YSwgMCk7XG4gICAgQXJyYXlIZWxwZXIuaW5pdChfaW1hZ2VUb1BhdGNoR3JpZC5kYXRhLCBudWxsKTtcblxuICAgIGZvciAoaiA9IDA7IGogPCBwYXRjaGVzRm91bmQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgcGF0Y2ggPSBwYXRjaGVzRm91bmRbal07XG4gICAgICAgIF9pbWFnZVRvUGF0Y2hHcmlkLmRhdGFbcGF0Y2guaW5kZXhdID0gcGF0Y2g7XG4gICAgICAgIF9wYXRjaEdyaWQuZGF0YVtwYXRjaC5pbmRleF0gPSAxO1xuICAgIH1cblxuICAgIC8vIHJhc3Rlcml6ZSB0aGUgcGF0Y2hlcyBmb3VuZCB0byBkZXRlcm1pbmUgYXJlYVxuICAgIF9wYXRjaEdyaWQuemVyb0JvcmRlcigpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbmQtYXNzaWduXG4gICAgd2hpbGUgKChjdXJySWR4ID0gbm90WWV0UHJvY2Vzc2VkKCkpIDwgX3BhdGNoTGFiZWxHcmlkLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgIGxhYmVsKys7XG4gICAgICAgIHRyYWNlKGN1cnJJZHgpO1xuICAgIH1cblxuICAgIC8vIGRyYXcgcGF0Y2gtbGFiZWxzIGlmIHJlcXVlc3RlZFxuICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5zaG93UGF0Y2hMYWJlbHMpIHtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IF9wYXRjaExhYmVsR3JpZC5kYXRhLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoX3BhdGNoTGFiZWxHcmlkLmRhdGFbal0gPiAwICYmIF9wYXRjaExhYmVsR3JpZC5kYXRhW2pdIDw9IGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2ggPSBfaW1hZ2VUb1BhdGNoR3JpZC5kYXRhW2pdO1xuICAgICAgICAgICAgICAgIGhzdlswXSA9IChfcGF0Y2hMYWJlbEdyaWQuZGF0YVtqXSAvIChsYWJlbCArIDEpKSAqIDM2MDtcbiAgICAgICAgICAgICAgICBoc3YycmdiKGhzdiwgcmdiKTtcbiAgICAgICAgICAgICAgICBJbWFnZURlYnVnLmRyYXdSZWN0KHBhdGNoLnBvcywgX3N1YkltYWdlV3JhcHBlci5zaXplLCBfY2FudmFzQ29udGFpbmVyLmN0eC5iaW5hcnksXG4gICAgICAgICAgICAgICAgICAgIHsgY29sb3I6IGByZ2IoJHtyZ2Iuam9pbignLCcpfSlgLCBsaW5lV2lkdGg6IDIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBpbml0KGlucHV0SW1hZ2VXcmFwcGVyLCBjb25maWcpIHtcbiAgICAgICAgX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgX2lucHV0SW1hZ2VXcmFwcGVyID0gaW5wdXRJbWFnZVdyYXBwZXI7XG5cbiAgICAgICAgaW5pdEJ1ZmZlcnMoKTtcbiAgICAgICAgaW5pdENhbnZhcygpO1xuICAgIH0sXG5cbiAgICBsb2NhdGUoKSB7XG4gICAgICAgIGlmIChfY29uZmlnLmhhbGZTYW1wbGUpIHtcbiAgICAgICAgICAgIGhhbGZTYW1wbGUoX2lucHV0SW1hZ2VXcmFwcGVyLCBfY3VycmVudEltYWdlV3JhcHBlcik7XG4gICAgICAgIH1cblxuICAgICAgICBiaW5hcml6ZUltYWdlKCk7XG4gICAgICAgIGNvbnN0IHBhdGNoZXNGb3VuZCA9IGZpbmRQYXRjaGVzKCk7XG4gICAgICAgIC8vIHJldHVybiB1bmxlc3MgNSUgb3IgbW9yZSBwYXRjaGVzIGFyZSBmb3VuZFxuICAgICAgICBpZiAocGF0Y2hlc0ZvdW5kLmxlbmd0aCA8IF9udW1QYXRjaGVzLnggKiBfbnVtUGF0Y2hlcy55ICogMC4wNSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByYXN0ZXJyaXplIGFyZWEgYnkgY29tcGFyaW5nIGFuZ3VsYXIgc2ltaWxhcml0eTtcbiAgICAgICAgY29uc3QgbWF4TGFiZWwgPSByYXN0ZXJpemVBbmd1bGFyU2ltaWxhcml0eShwYXRjaGVzRm91bmQpO1xuICAgICAgICBpZiAobWF4TGFiZWwgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNlYXJjaCBmb3IgYXJlYSB3aXRoIHRoZSBtb3N0IHBhdGNoZXMgKGJpZ2dlc3QgY29ubmVjdGVkIGFyZWEpXG4gICAgICAgIGNvbnN0IHRvcExhYmVscyA9IGZpbmRCaWdnZXN0Q29ubmVjdGVkQXJlYXMobWF4TGFiZWwpO1xuICAgICAgICBpZiAodG9wTGFiZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib3hlcyA9IGZpbmRCb3hlcyh0b3BMYWJlbHMsIG1heExhYmVsKTtcbiAgICAgICAgcmV0dXJuIGJveGVzO1xuICAgIH0sXG5cbiAgICBjaGVja0ltYWdlQ29uc3RyYWludHMoaW5wdXRTdHJlYW0sIGNvbmZpZykge1xuICAgICAgICBsZXQgcGF0Y2hTaXplO1xuICAgICAgICBsZXQgd2lkdGggPSBpbnB1dFN0cmVhbS5nZXRXaWR0aCgpO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gaW5wdXRTdHJlYW0uZ2V0SGVpZ2h0KCk7XG4gICAgICAgIGNvbnN0IHRoaXNIYWxmU2FtcGxlID0gY29uZmlnLmhhbGZTYW1wbGUgPyAwLjUgOiAxO1xuICAgICAgICBsZXQgYXJlYTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgd2lkdGggYW5kIGhlaWdodCBiYXNlZCBvbiBhcmVhXG4gICAgICAgIGlmIChpbnB1dFN0cmVhbS5nZXRDb25maWcoKS5hcmVhKSB7XG4gICAgICAgICAgICBhcmVhID0gY29tcHV0ZUltYWdlQXJlYSh3aWR0aCwgaGVpZ2h0LCBpbnB1dFN0cmVhbS5nZXRDb25maWcoKS5hcmVhKTtcbiAgICAgICAgICAgIGlucHV0U3RyZWFtLnNldFRvcFJpZ2h0KHsgeDogYXJlYS5zeCwgeTogYXJlYS5zeSB9KTtcbiAgICAgICAgICAgIGlucHV0U3RyZWFtLnNldENhbnZhc1NpemUoeyB4OiB3aWR0aCwgeTogaGVpZ2h0IH0pO1xuICAgICAgICAgICAgd2lkdGggPSBhcmVhLnN3O1xuICAgICAgICAgICAgaGVpZ2h0ID0gYXJlYS5zaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpemUgPSB7XG4gICAgICAgICAgICB4OiBNYXRoLmZsb29yKHdpZHRoICogdGhpc0hhbGZTYW1wbGUpLFxuICAgICAgICAgICAgeTogTWF0aC5mbG9vcihoZWlnaHQgKiB0aGlzSGFsZlNhbXBsZSksXG4gICAgICAgIH07XG5cbiAgICAgICAgcGF0Y2hTaXplID0gY2FsY3VsYXRlUGF0Y2hTaXplKGNvbmZpZy5wYXRjaFNpemUsIHNpemUpO1xuICAgICAgICBpZiAoRU5WLmRldmVsb3BtZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUGF0Y2gtU2l6ZTogJHtKU09OLnN0cmluZ2lmeShwYXRjaFNpemUpfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXRTdHJlYW0uc2V0V2lkdGgoTWF0aC5mbG9vcihNYXRoLmZsb29yKHNpemUueCAvIHBhdGNoU2l6ZS54KSAqICgxIC8gdGhpc0hhbGZTYW1wbGUpICogcGF0Y2hTaXplLngpKTtcbiAgICAgICAgaW5wdXRTdHJlYW0uc2V0SGVpZ2h0KE1hdGguZmxvb3IoTWF0aC5mbG9vcihzaXplLnkgLyBwYXRjaFNpemUueSkgKiAoMSAvIHRoaXNIYWxmU2FtcGxlKSAqIHBhdGNoU2l6ZS55KSk7XG5cbiAgICAgICAgaWYgKChpbnB1dFN0cmVhbS5nZXRXaWR0aCgpICUgcGF0Y2hTaXplLngpID09PSAwICYmIChpbnB1dFN0cmVhbS5nZXRIZWlnaHQoKSAlIHBhdGNoU2l6ZS55KSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEltYWdlIGRpbWVuc2lvbnMgZG8gbm90IGNvbXBseSB3aXRoIHRoZSBjdXJyZW50IHNldHRpbmdzOiBXaWR0aCAoJHtcbiAgICAgICAgICAgIHdpZHRofSApYW5kIGhlaWdodCAoJHtoZWlnaHRcbiAgICAgICAgfSkgbXVzdCBhIG11bHRpcGxlIG9mICR7cGF0Y2hTaXplLnh9YCk7XG4gICAgfSxcbn07XG4iLCJ2YXIgbGlzdENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVDbGVhcicpLFxuICAgIGxpc3RDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZURlbGV0ZScpLFxuICAgIGxpc3RDYWNoZUdldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUdldCcpLFxuICAgIGxpc3RDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUhhcycpLFxuICAgIGxpc3RDYWNoZVNldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdENhY2hlO1xuIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc29jSW5kZXhPZjtcbiIsIi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbDtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVDcmVhdGU7XG4iLCJ2YXIgaXNLZXlhYmxlID0gcmVxdWlyZSgnLi9faXNLZXlhYmxlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgOiBkYXRhLm1hcDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRNYXBEYXRhO1xuIiwidmFyIGJhc2VJc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vX2Jhc2VJc0FyZ3VtZW50cycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FyZ3VtZW50cyA9IGJhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA/IGJhc2VJc0FyZ3VtZW50cyA6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJndW1lbnRzO1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSW5kZXg7XG4iLCJ2YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzS2V5ID0gcmVxdWlyZSgnLi9faXNLZXknKSxcbiAgICBzdHJpbmdUb1BhdGggPSByZXF1aXJlKCcuL19zdHJpbmdUb1BhdGgnKSxcbiAgICB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9TdHJpbmcnKTtcblxuLyoqXG4gKiBDYXN0cyBgdmFsdWVgIHRvIGEgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGNhc3RQYXRoKHZhbHVlLCBvYmplY3QpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYXN0UGF0aDtcbiIsInZhciBhcnJheVdpdGhvdXRIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCIpO1xudmFyIGl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2l0ZXJhYmxlVG9BcnJheS5qc1wiKTtcbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCIpO1xudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIik7XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBhcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3RvQ29uc3VtYWJsZUFycmF5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIGJhc2VJc05hdGl2ZSA9IHJlcXVpcmUoJy4vX2Jhc2VJc05hdGl2ZScpLFxuICAgIGdldFZhbHVlID0gcmVxdWlyZSgnLi9fZ2V0VmFsdWUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTtcbiAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXROYXRpdmU7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWcgfHwgdGFnID09IGFzeW5jVGFnIHx8IHRhZyA9PSBwcm94eVRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uO1xuIiwidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fZGVmaW5lUHJvcGVydHknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICogdmFsdWUgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBkZWZpbmVQcm9wZXJ0eSkge1xuICAgIGRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICd2YWx1ZSc6IHZhbHVlLFxuICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQXNzaWduVmFsdWU7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHRpZiAoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XG5cdH1cblx0cmV0dXJuIG1vZHVsZTtcbn07XG4iLCJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZTtcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0xlbmd0aCgzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aCgnMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0xlbmd0aDtcbiIsImZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N5bWJvbDtcbiIsInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICovXG5mdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9LZXk7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIE1hcCA9IGdldE5hdGl2ZShyb290LCAnTWFwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwO1xuIiwiLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxubW9kdWxlLmV4cG9ydHMgPSBmcmVlR2xvYmFsO1xuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwidmFyIG1hcENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19tYXBDYWNoZUNsZWFyJyksXG4gICAgbWFwQ2FjaGVEZWxldGUgPSByZXF1aXJlKCcuL19tYXBDYWNoZURlbGV0ZScpLFxuICAgIG1hcENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVHZXQnKSxcbiAgICBtYXBDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX21hcENhY2hlSGFzJyksXG4gICAgbWFwQ2FjaGVTZXQgPSByZXF1aXJlKCcuL19tYXBDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbk1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbk1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbk1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXBDYWNoZTtcbiIsInZhciBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFzc2lnblZhbHVlYCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IGFzc2lnblxuICogYHVuZGVmaW5lZGAgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIGlmICgodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZXEob2JqZWN0W2tleV0sIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25NZXJnZVZhbHVlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICBmdW5jKHt9LCAnJywge30pO1xuICAgIHJldHVybiBmdW5jO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVQcm9wZXJ0eTtcbiIsInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRQcm90b3R5cGU7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQcm90b3R5cGU7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKSxcbiAgICBzdHViRmFsc2UgPSByZXF1aXJlKCcuL3N0dWJGYWxzZScpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyByb290LkJ1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IEJ1ZmZlcigyKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgVWludDhBcnJheSgyKSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNCdWZmZXI7XG4iLCJ2YXIgYmFzZUlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vX2Jhc2VJc1R5cGVkQXJyYXknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzVHlwZWRBcnJheSA9IG5vZGVJc1R5cGVkQXJyYXkgPyBiYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSkgOiBiYXNlSXNUeXBlZEFycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVHlwZWRBcnJheTtcbiIsIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAsIHVubGVzcyBga2V5YCBpcyBcIl9fcHJvdG9fX1wiIG9yIFwiY29uc3RydWN0b3JcIi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LCBrZXkpIHtcbiAgaWYgKGtleSA9PT0gJ2NvbnN0cnVjdG9yJyAmJiB0eXBlb2Ygb2JqZWN0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoa2V5ID09ICdfX3Byb3RvX18nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNhZmVHZXQ7XG4iLCJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzaWduVmFsdWU7XG4iLCJ2YXIgYXJyYXlMaWtlS2V5cyA9IHJlcXVpcmUoJy4vX2FycmF5TGlrZUtleXMnKSxcbiAgICBiYXNlS2V5c0luID0gcmVxdWlyZSgnLi9fYmFzZUtleXNJbicpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzSW4obmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqL1xuZnVuY3Rpb24ga2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0LCB0cnVlKSA6IGJhc2VLZXlzSW4ob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBrZXlzSW47XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuIiwidmFyIGFwcGx5ID0gcmVxdWlyZSgnLi9fYXBwbHknKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIHN0YXJ0LCAwKSxcbiAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IGFyZ3Nbc3RhcnQgKyBpbmRleF07XG4gICAgfVxuICAgIGluZGV4ID0gLTE7XG4gICAgdmFyIG90aGVyQXJncyA9IEFycmF5KHN0YXJ0ICsgMSk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgIH1cbiAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdmVyUmVzdDtcbiIsInZhciBiYXNlU2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19iYXNlU2V0VG9TdHJpbmcnKSxcbiAgICBzaG9ydE91dCA9IHJlcXVpcmUoJy4vX3Nob3J0T3V0Jyk7XG5cbi8qKlxuICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYGZ1bmNgIHRvIHJldHVybiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0VG9TdHJpbmc7XG4iLCJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIik7XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYXJyMltpXSA9IGFycltpXTtcbiAgfVxuICByZXR1cm4gYXJyMjtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5TGlrZVRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgYXJyYXlXaXRoSG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhIb2xlcy5qc1wiKTtcbnZhciBpdGVyYWJsZVRvQXJyYXlMaW1pdCA9IHJlcXVpcmUoXCIuL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzXCIpO1xudmFyIHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIik7XG52YXIgbm9uSXRlcmFibGVSZXN0ID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVSZXN0LmpzXCIpO1xuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBub25JdGVyYWJsZVJlc3QoKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3NsaWNlZFRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgYmFzZVBpY2sgPSByZXF1aXJlKCcuL19iYXNlUGljaycpLFxuICAgIGZsYXRSZXN0ID0gcmVxdWlyZSgnLi9fZmxhdFJlc3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIGBvYmplY3RgIHByb3BlcnRpZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAqXG4gKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICovXG52YXIgcGljayA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8ge30gOiBiYXNlUGljayhvYmplY3QsIHBhdGhzKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBpY2s7XG4iLCJ2YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9nZXRQcm90b3R5cGVPZi5qc1wiKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL3NldFByb3RvdHlwZU9mLmpzXCIpO1xudmFyIGlzTmF0aXZlRnVuY3Rpb24gPSByZXF1aXJlKFwiLi9pc05hdGl2ZUZ1bmN0aW9uLmpzXCIpO1xudmFyIGNvbnN0cnVjdCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdC5qc1wiKTtcbmZ1bmN0aW9uIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpIHtcbiAgdmFyIF9jYWNoZSA9IHR5cGVvZiBNYXAgPT09IFwiZnVuY3Rpb25cIiA/IG5ldyBNYXAoKSA6IHVuZGVmaW5lZDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfd3JhcE5hdGl2ZVN1cGVyID0gZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICAgIGlmIChDbGFzcyA9PT0gbnVsbCB8fCAhaXNOYXRpdmVGdW5jdGlvbihDbGFzcykpIHJldHVybiBDbGFzcztcbiAgICBpZiAodHlwZW9mIENsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBfY2FjaGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChfY2FjaGUuaGFzKENsYXNzKSkgcmV0dXJuIF9jYWNoZS5nZXQoQ2xhc3MpO1xuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyYXBwZXIoKSB7XG4gICAgICByZXR1cm4gY29uc3RydWN0KENsYXNzLCBhcmd1bWVudHMsIGdldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yKTtcbiAgICB9XG4gICAgV3JhcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNldFByb3RvdHlwZU9mKFdyYXBwZXIsIENsYXNzKTtcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzO1xuICByZXR1cm4gX3dyYXBOYXRpdmVTdXBlcihDbGFzcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF93cmFwTmF0aXZlU3VwZXIsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJpbXBvcnQgVHJhY2VyIGZyb20gJy4vdHJhY2VyJztcblxuLyoqXG4gKiBodHRwOi8vd3d3LmNvZGVwcm9qZWN0LmNvbS9UaXBzLzQwNzE3Mi9Db25uZWN0ZWQtQ29tcG9uZW50LUxhYmVsaW5nLWFuZC1WZWN0b3JpemF0aW9uXG4gKi9cbmNvbnN0IFJhc3Rlcml6ZXIgPSB7XG4gICAgY3JlYXRlQ29udG91cjJEKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlyOiBudWxsLFxuICAgICAgICAgICAgaW5kZXg6IG51bGwsXG4gICAgICAgICAgICBmaXJzdFZlcnRleDogbnVsbCxcbiAgICAgICAgICAgIGluc2lkZUNvbnRvdXJzOiBudWxsLFxuICAgICAgICAgICAgbmV4dHBlZXI6IG51bGwsXG4gICAgICAgICAgICBwcmV2cGVlcjogbnVsbCxcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIENPTlRPVVJfRElSOiB7XG4gICAgICAgIENXX0RJUjogMCxcbiAgICAgICAgQ0NXX0RJUjogMSxcbiAgICAgICAgVU5LTk9XTl9ESVI6IDIsXG4gICAgfSxcbiAgICBESVI6IHtcbiAgICAgICAgT1VUU0lERV9FREdFOiAtMzI3NjcsXG4gICAgICAgIElOU0lERV9FREdFOiAtMzI3NjYsXG4gICAgfSxcbiAgICBjcmVhdGUoaW1hZ2VXcmFwcGVyLCBsYWJlbFdyYXBwZXIpIHtcbiAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0gaW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgICAgIGNvbnN0IGxhYmVsRGF0YSA9IGxhYmVsV3JhcHBlci5kYXRhO1xuICAgICAgICBjb25zdCB3aWR0aCA9IGltYWdlV3JhcHBlci5zaXplLng7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGltYWdlV3JhcHBlci5zaXplLnk7XG4gICAgICAgIGNvbnN0IHRyYWNlciA9IFRyYWNlci5jcmVhdGUoaW1hZ2VXcmFwcGVyLCBsYWJlbFdyYXBwZXIpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYXN0ZXJpemUoZGVwdGhsYWJlbCkge1xuICAgICAgICAgICAgICAgIGxldCBjb2xvcjtcbiAgICAgICAgICAgICAgICBsZXQgYmM7XG4gICAgICAgICAgICAgICAgbGV0IGxjO1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbGluZGV4O1xuICAgICAgICAgICAgICAgIGxldCBjeDtcbiAgICAgICAgICAgICAgICBsZXQgY3k7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sb3JNYXAgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdmVydGV4O1xuICAgICAgICAgICAgICAgIGxldCBwO1xuICAgICAgICAgICAgICAgIGxldCBjYztcbiAgICAgICAgICAgICAgICBsZXQgc2M7XG4gICAgICAgICAgICAgICAgbGV0IHBvcztcbiAgICAgICAgICAgICAgICBsZXQgY29ubmVjdGVkQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQwMDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwW2ldID0gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb2xvck1hcFswXSA9IGltYWdlRGF0YVswXTtcbiAgICAgICAgICAgICAgICBjYyA9IG51bGw7XG4gICAgICAgICAgICAgICAgZm9yIChjeSA9IDE7IGN5IDwgaGVpZ2h0IC0gMTsgY3krKykge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYmMgPSBjb2xvck1hcFswXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjeCA9IDE7IGN4IDwgd2lkdGggLSAxOyBjeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBjeSAqIHdpZHRoICsgY3g7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxEYXRhW3Bvc10gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGltYWdlRGF0YVtwb3NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvciAhPT0gYmMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjID0gY29ubmVjdGVkQ291bnQgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNYXBbbGNdID0gY29sb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYyA9IGNvbG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4ID0gdHJhY2VyLmNvbnRvdXJUcmFjaW5nKGN5LCBjeCwgbGMsIGNvbG9yLCBSYXN0ZXJpemVyLkRJUi5PVVRTSURFX0VER0UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZENvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxpbmRleCA9IGxjO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBSYXN0ZXJpemVyLmNyZWF0ZUNvbnRvdXIyRCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZGlyID0gUmFzdGVyaXplci5DT05UT1VSX0RJUi5DV19ESVI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5pbmRleCA9IGxhYmVsaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5maXJzdFZlcnRleCA9IHZlcnRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLm5leHRwZWVyID0gY2M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5pbnNpZGVDb250b3VycyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLnByZXZwZWVyID0gcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgPSBwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4ID0gdHJhY2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRvdXJUcmFjaW5nKGN5LCBjeCwgUmFzdGVyaXplci5ESVIuSU5TSURFX0VER0UsIGNvbG9yLCBsYWJlbGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJ0ZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gUmFzdGVyaXplci5jcmVhdGVDb250b3VyMkQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmZpcnN0VmVydGV4ID0gdmVydGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuaW5zaWRlQ29udG91cnMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aGxhYmVsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZGlyID0gUmFzdGVyaXplci5DT05UT1VSX0RJUi5DQ1dfRElSO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZGlyID0gUmFzdGVyaXplci5DT05UT1VSX0RJUi5DV19ESVI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuaW5kZXggPSBkZXB0aGxhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjID0gY2M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChzYyAhPT0gbnVsbCkgJiYgc2MuaW5kZXggIT09IGxhYmVsaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MgPSBzYy5uZXh0cGVlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAubmV4dHBlZXIgPSBzYy5pbnNpZGVDb250b3VycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjLmluc2lkZUNvbnRvdXJzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYy5pbnNpZGVDb250b3Vycy5wcmV2cGVlciA9IHA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MuaW5zaWRlQ29udG91cnMgPSBwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsRGF0YVtwb3NdID0gbGFiZWxpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhYmVsRGF0YVtwb3NdID09PSBSYXN0ZXJpemVyLkRJUi5PVVRTSURFX0VER0VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGFiZWxEYXRhW3Bvc10gPT09IFJhc3Rlcml6ZXIuRElSLklOU0lERV9FREdFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxpbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsRGF0YVtwb3NdID09PSBSYXN0ZXJpemVyLkRJUi5JTlNJREVfRURHRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYyA9IGltYWdlRGF0YVtwb3NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjID0gY29sb3JNYXBbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGluZGV4ID0gbGFiZWxEYXRhW3Bvc107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmMgPSBjb2xvck1hcFtsYWJlbGluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzYyA9IGNjO1xuICAgICAgICAgICAgICAgIHdoaWxlIChzYyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzYy5pbmRleCA9IGRlcHRobGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIHNjID0gc2MubmV4dHBlZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNjLFxuICAgICAgICAgICAgICAgICAgICBjb3VudDogY29ubmVjdGVkQ291bnQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWJ1Zzoge1xuICAgICAgICAgICAgICAgIGRyYXdDb250b3VyKGNhbnZhcywgZmlyc3RDb250b3VyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHEgPSBmaXJzdENvbnRvdXI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpcTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHE7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwO1xuXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICdyZWQnO1xuICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gJ3JlZCc7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSAxO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXEgPSBwcS5pbnNpZGVDb250b3VycztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlxID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChwcSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlxICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IGlxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlxID0gaXEubmV4dHBlZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBwcTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcSA9IHBxLm5leHRwZWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcSA9IHBxLmluc2lkZUNvbnRvdXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlxID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocS5kaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJhc3Rlcml6ZXIuQ09OVE9VUl9ESVIuQ1dfRElSOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAncmVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSYXN0ZXJpemVyLkNPTlRPVVJfRElSLkNDV19ESVI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICdibHVlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSYXN0ZXJpemVyLkNPTlRPVVJfRElSLlVOS05PV05fRElSOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAnZ3JlZW4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHEuZmlyc3RWZXJ0ZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHAueCwgcC55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8ocC54LCBwLnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAocCAhPT0gcS5maXJzdFZlcnRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgUmFzdGVyaXplcjtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBlcWVxZXEgKi9cblxuLyogQHByZXNlcnZlIEFTTSBCRUdJTiAqL1xuZnVuY3Rpb24gU2tlbGV0b25pemVyKHN0ZGxpYiwgZm9yZWlnbiwgYnVmZmVyKSB7XG4gICAgJ3VzZSBhc20nO1xuXG4gICAgY29uc3QgaW1hZ2VzID0gbmV3IHN0ZGxpYi5VaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgY29uc3Qgc2l6ZSA9IGZvcmVpZ24uc2l6ZSB8IDA7XG4gICAgY29uc3QgeyBpbXVsIH0gPSBzdGRsaWIuTWF0aDtcblxuICAgIGZ1bmN0aW9uIGVyb2RlKGluSW1hZ2VQdHIsIG91dEltYWdlUHRyKSB7XG4gICAgICAgIGluSW1hZ2VQdHIgfD0gMDtcbiAgICAgICAgb3V0SW1hZ2VQdHIgfD0gMDtcblxuICAgICAgICBsZXQgdiA9IDA7XG4gICAgICAgIGxldCB1ID0gMDtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGxldCB5U3RhcnQxID0gMDtcbiAgICAgICAgbGV0IHlTdGFydDIgPSAwO1xuICAgICAgICBsZXQgeFN0YXJ0MSA9IDA7XG4gICAgICAgIGxldCB4U3RhcnQyID0gMDtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG5cbiAgICAgICAgZm9yICh2ID0gMTsgKHYgfCAwKSA8ICgoc2l6ZSAtIDEpIHwgMCk7IHYgPSAodiArIDEpIHwgMCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCArIHNpemUpIHwgMDtcbiAgICAgICAgICAgIGZvciAodSA9IDE7ICh1IHwgMCkgPCAoKHNpemUgLSAxKSB8IDApOyB1ID0gKHUgKyAxKSB8IDApIHtcbiAgICAgICAgICAgICAgICB5U3RhcnQxID0gKG9mZnNldCAtIHNpemUpIHwgMDtcbiAgICAgICAgICAgICAgICB5U3RhcnQyID0gKG9mZnNldCArIHNpemUpIHwgMDtcbiAgICAgICAgICAgICAgICB4U3RhcnQxID0gKHUgLSAxKSB8IDA7XG4gICAgICAgICAgICAgICAgeFN0YXJ0MiA9ICh1ICsgMSkgfCAwO1xuICAgICAgICAgICAgICAgIHN1bSA9ICgoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MSArIHhTdGFydDEpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQxICsgeFN0YXJ0MikgfCAwXSB8IDApXG4gICAgICAgICAgICAgICAgICAgICsgKGltYWdlc1soaW5JbWFnZVB0ciArIG9mZnNldCArIHUpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQyICsgeFN0YXJ0MSkgfCAwXSB8IDApXG4gICAgICAgICAgICAgICAgICAgICsgKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDIgKyB4U3RhcnQyKSB8IDBdIHwgMCkpIHwgMDtcbiAgICAgICAgICAgICAgICBpZiAoKHN1bSB8IDApID09ICg1IHwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VzWyhvdXRJbWFnZVB0ciArIG9mZnNldCArIHUpIHwgMF0gPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlc1sob3V0SW1hZ2VQdHIgKyBvZmZzZXQgKyB1KSB8IDBdID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdWJ0cmFjdChhSW1hZ2VQdHIsIGJJbWFnZVB0ciwgb3V0SW1hZ2VQdHIpIHtcbiAgICAgICAgYUltYWdlUHRyIHw9IDA7XG4gICAgICAgIGJJbWFnZVB0ciB8PSAwO1xuICAgICAgICBvdXRJbWFnZVB0ciB8PSAwO1xuXG4gICAgICAgIGxldCBsZW5ndGggPSAwO1xuXG4gICAgICAgIGxlbmd0aCA9IGltdWwoc2l6ZSwgc2l6ZSkgfCAwO1xuXG4gICAgICAgIHdoaWxlICgobGVuZ3RoIHwgMCkgPiAwKSB7XG4gICAgICAgICAgICBsZW5ndGggPSAobGVuZ3RoIC0gMSkgfCAwO1xuICAgICAgICAgICAgaW1hZ2VzWyhvdXRJbWFnZVB0ciArIGxlbmd0aCkgfCAwXSA9ICgoaW1hZ2VzWyhhSW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gfCAwKSAtIChpbWFnZXNbKGJJbWFnZVB0ciArIGxlbmd0aCkgfCAwXSB8IDApKSB8IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBiaXR3aXNlT3IoYUltYWdlUHRyLCBiSW1hZ2VQdHIsIG91dEltYWdlUHRyKSB7XG4gICAgICAgIGFJbWFnZVB0ciB8PSAwO1xuICAgICAgICBiSW1hZ2VQdHIgfD0gMDtcbiAgICAgICAgb3V0SW1hZ2VQdHIgfD0gMDtcblxuICAgICAgICBsZXQgbGVuZ3RoID0gMDtcblxuICAgICAgICBsZW5ndGggPSBpbXVsKHNpemUsIHNpemUpIHwgMDtcblxuICAgICAgICB3aGlsZSAoKGxlbmd0aCB8IDApID4gMCkge1xuICAgICAgICAgICAgbGVuZ3RoID0gKGxlbmd0aCAtIDEpIHwgMDtcbiAgICAgICAgICAgIGltYWdlc1sob3V0SW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gPSAoKGltYWdlc1soYUltYWdlUHRyICsgbGVuZ3RoKSB8IDBdIHwgMCkgfCAoaW1hZ2VzWyhiSW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gfCAwKSkgfCAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY291bnROb25aZXJvKGltYWdlUHRyKSB7XG4gICAgICAgIGltYWdlUHRyIHw9IDA7XG5cbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGxldCBsZW5ndGggPSAwO1xuXG4gICAgICAgIGxlbmd0aCA9IGltdWwoc2l6ZSwgc2l6ZSkgfCAwO1xuXG4gICAgICAgIHdoaWxlICgobGVuZ3RoIHwgMCkgPiAwKSB7XG4gICAgICAgICAgICBsZW5ndGggPSAobGVuZ3RoIC0gMSkgfCAwO1xuICAgICAgICAgICAgc3VtID0gKChzdW0gfCAwKSArIChpbWFnZXNbKGltYWdlUHRyICsgbGVuZ3RoKSB8IDBdIHwgMCkpIHwgMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoc3VtIHwgMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5pdChpbWFnZVB0ciwgdmFsdWUpIHtcbiAgICAgICAgaW1hZ2VQdHIgfD0gMDtcbiAgICAgICAgdmFsdWUgfD0gMDtcblxuICAgICAgICBsZXQgbGVuZ3RoID0gMDtcblxuICAgICAgICBsZW5ndGggPSBpbXVsKHNpemUsIHNpemUpIHwgMDtcblxuICAgICAgICB3aGlsZSAoKGxlbmd0aCB8IDApID4gMCkge1xuICAgICAgICAgICAgbGVuZ3RoID0gKGxlbmd0aCAtIDEpIHwgMDtcbiAgICAgICAgICAgIGltYWdlc1soaW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpbGF0ZShpbkltYWdlUHRyLCBvdXRJbWFnZVB0cikge1xuICAgICAgICBpbkltYWdlUHRyIHw9IDA7XG4gICAgICAgIG91dEltYWdlUHRyIHw9IDA7XG5cbiAgICAgICAgbGV0IHYgPSAwO1xuICAgICAgICBsZXQgdSA9IDA7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBsZXQgeVN0YXJ0MSA9IDA7XG4gICAgICAgIGxldCB5U3RhcnQyID0gMDtcbiAgICAgICAgbGV0IHhTdGFydDEgPSAwO1xuICAgICAgICBsZXQgeFN0YXJ0MiA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuXG4gICAgICAgIGZvciAodiA9IDE7ICh2IHwgMCkgPCAoKHNpemUgLSAxKSB8IDApOyB2ID0gKHYgKyAxKSB8IDApIHtcbiAgICAgICAgICAgIG9mZnNldCA9IChvZmZzZXQgKyBzaXplKSB8IDA7XG4gICAgICAgICAgICBmb3IgKHUgPSAxOyAodSB8IDApIDwgKChzaXplIC0gMSkgfCAwKTsgdSA9ICh1ICsgMSkgfCAwKSB7XG4gICAgICAgICAgICAgICAgeVN0YXJ0MSA9IChvZmZzZXQgLSBzaXplKSB8IDA7XG4gICAgICAgICAgICAgICAgeVN0YXJ0MiA9IChvZmZzZXQgKyBzaXplKSB8IDA7XG4gICAgICAgICAgICAgICAgeFN0YXJ0MSA9ICh1IC0gMSkgfCAwO1xuICAgICAgICAgICAgICAgIHhTdGFydDIgPSAodSArIDEpIHwgMDtcbiAgICAgICAgICAgICAgICBzdW0gPSAoKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDEgKyB4U3RhcnQxKSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MSArIHhTdGFydDIpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyBvZmZzZXQgKyB1KSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MiArIHhTdGFydDEpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQyICsgeFN0YXJ0MikgfCAwXSB8IDApKSB8IDA7XG4gICAgICAgICAgICAgICAgaWYgKChzdW0gfCAwKSA+ICgwIHwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VzWyhvdXRJbWFnZVB0ciArIG9mZnNldCArIHUpIHwgMF0gPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlc1sob3V0SW1hZ2VQdHIgKyBvZmZzZXQgKyB1KSB8IDBdID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZW1jcHkoc3JjSW1hZ2VQdHIsIGRzdEltYWdlUHRyKSB7XG4gICAgICAgIHNyY0ltYWdlUHRyIHw9IDA7XG4gICAgICAgIGRzdEltYWdlUHRyIHw9IDA7XG5cbiAgICAgICAgbGV0IGxlbmd0aCA9IDA7XG5cbiAgICAgICAgbGVuZ3RoID0gaW11bChzaXplLCBzaXplKSB8IDA7XG5cbiAgICAgICAgd2hpbGUgKChsZW5ndGggfCAwKSA+IDApIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IChsZW5ndGggLSAxKSB8IDA7XG4gICAgICAgICAgICBpbWFnZXNbKGRzdEltYWdlUHRyICsgbGVuZ3RoKSB8IDBdID0gKGltYWdlc1soc3JjSW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gfCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHplcm9Cb3JkZXIoaW1hZ2VQdHIpIHtcbiAgICAgICAgaW1hZ2VQdHIgfD0gMDtcblxuICAgICAgICBsZXQgeCA9IDA7XG4gICAgICAgIGxldCB5ID0gMDtcblxuICAgICAgICBmb3IgKHggPSAwOyAoeCB8IDApIDwgKChzaXplIC0gMSkgfCAwKTsgeCA9ICh4ICsgMSkgfCAwKSB7XG4gICAgICAgICAgICBpbWFnZXNbKGltYWdlUHRyICsgeCkgfCAwXSA9IDA7XG4gICAgICAgICAgICBpbWFnZXNbKGltYWdlUHRyICsgeSkgfCAwXSA9IDA7XG4gICAgICAgICAgICB5ID0gKCh5ICsgc2l6ZSkgLSAxKSB8IDA7XG4gICAgICAgICAgICBpbWFnZXNbKGltYWdlUHRyICsgeSkgfCAwXSA9IDA7XG4gICAgICAgICAgICB5ID0gKHkgKyAxKSB8IDA7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh4ID0gMDsgKHggfCAwKSA8IChzaXplIHwgMCk7IHggPSAoeCArIDEpIHwgMCkge1xuICAgICAgICAgICAgaW1hZ2VzWyhpbWFnZVB0ciArIHkpIHwgMF0gPSAwO1xuICAgICAgICAgICAgeSA9ICh5ICsgMSkgfCAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2tlbGV0b25pemUoKSB7XG4gICAgICAgIGNvbnN0IHN1YkltYWdlUHRyID0gMDtcbiAgICAgICAgbGV0IGVyb2RlZEltYWdlUHRyID0gMDtcbiAgICAgICAgbGV0IHRlbXBJbWFnZVB0ciA9IDA7XG4gICAgICAgIGxldCBza2VsSW1hZ2VQdHIgPSAwO1xuICAgICAgICBsZXQgc3VtID0gMDtcbiAgICAgICAgbGV0IGRvbmUgPSAwO1xuXG4gICAgICAgIGVyb2RlZEltYWdlUHRyID0gaW11bChzaXplLCBzaXplKSB8IDA7XG4gICAgICAgIHRlbXBJbWFnZVB0ciA9IChlcm9kZWRJbWFnZVB0ciArIGVyb2RlZEltYWdlUHRyKSB8IDA7XG4gICAgICAgIHNrZWxJbWFnZVB0ciA9ICh0ZW1wSW1hZ2VQdHIgKyBlcm9kZWRJbWFnZVB0cikgfCAwO1xuXG4gICAgICAgIC8vIGluaXQgc2tlbC1pbWFnZVxuICAgICAgICBpbml0KHNrZWxJbWFnZVB0ciwgMCk7XG4gICAgICAgIHplcm9Cb3JkZXIoc3ViSW1hZ2VQdHIpO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGVyb2RlKHN1YkltYWdlUHRyLCBlcm9kZWRJbWFnZVB0cik7XG4gICAgICAgICAgICBkaWxhdGUoZXJvZGVkSW1hZ2VQdHIsIHRlbXBJbWFnZVB0cik7XG4gICAgICAgICAgICBzdWJ0cmFjdChzdWJJbWFnZVB0ciwgdGVtcEltYWdlUHRyLCB0ZW1wSW1hZ2VQdHIpO1xuICAgICAgICAgICAgYml0d2lzZU9yKHNrZWxJbWFnZVB0ciwgdGVtcEltYWdlUHRyLCBza2VsSW1hZ2VQdHIpO1xuICAgICAgICAgICAgbWVtY3B5KGVyb2RlZEltYWdlUHRyLCBzdWJJbWFnZVB0cik7XG4gICAgICAgICAgICBzdW0gPSBjb3VudE5vblplcm8oc3ViSW1hZ2VQdHIpIHwgMDtcbiAgICAgICAgICAgIGRvbmUgPSAoKHN1bSB8IDApID09IDAgfCAwKTtcbiAgICAgICAgfSB3aGlsZSAoIWRvbmUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBza2VsZXRvbml6ZSxcbiAgICB9O1xufVxuLyogQHByZXNlcnZlIEFTTSBFTkQgKi9cbmV4cG9ydCBkZWZhdWx0IFNrZWxldG9uaXplcjtcbi8qIGVzbGludC1lbmFibGUgZXFlcWVxICovXG4iLCJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGFzc2lnbk1lcmdlVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25NZXJnZVZhbHVlJyksXG4gICAgYmFzZUZvciA9IHJlcXVpcmUoJy4vX2Jhc2VGb3InKSxcbiAgICBiYXNlTWVyZ2VEZWVwID0gcmVxdWlyZSgnLi9fYmFzZU1lcmdlRGVlcCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyksXG4gICAgc2FmZUdldCA9IHJlcXVpcmUoJy4vX3NhZmVHZXQnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZXJnZWAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIG1lcmdlZCB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICogIGNvdW50ZXJwYXJ0cy5cbiAqL1xuZnVuY3Rpb24gYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spIHtcbiAgaWYgKG9iamVjdCA9PT0gc291cmNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGJhc2VGb3Ioc291cmNlLCBmdW5jdGlvbihzcmNWYWx1ZSwga2V5KSB7XG4gICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICBpZiAoaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBiYXNlTWVyZ2UsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgID8gY3VzdG9taXplcihzYWZlR2V0KG9iamVjdCwga2V5KSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgICB9XG4gICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9LCBrZXlzSW4pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNZXJnZTtcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBzdGFja0NsZWFyID0gcmVxdWlyZSgnLi9fc3RhY2tDbGVhcicpLFxuICAgIHN0YWNrRGVsZXRlID0gcmVxdWlyZSgnLi9fc3RhY2tEZWxldGUnKSxcbiAgICBzdGFja0dldCA9IHJlcXVpcmUoJy4vX3N0YWNrR2V0JyksXG4gICAgc3RhY2tIYXMgPSByZXF1aXJlKCcuL19zdGFja0hhcycpLFxuICAgIHN0YWNrU2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RhY2sgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU3RhY2soZW50cmllcykge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlKGVudHJpZXMpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBTdGFja2AuXG5TdGFjay5wcm90b3R5cGUuY2xlYXIgPSBzdGFja0NsZWFyO1xuU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xuU3RhY2sucHJvdG90eXBlLmhhcyA9IHN0YWNrSGFzO1xuU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0YWNrO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUNsZWFyO1xuIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICBkYXRhLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgfVxuICAtLXRoaXMuc2l6ZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlRGVsZXRlO1xuIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIEdldHMgdGhlIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUdldDtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlSGFzO1xuIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgICsrdGhpcy5zaXplO1xuICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9IGVsc2Uge1xuICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlU2V0O1xuIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIFN0YWNrXG4gKi9cbmZ1bmN0aW9uIHN0YWNrQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrQ2xlYXI7XG4iLCIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBzdGFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgcmVzdWx0ID0gZGF0YVsnZGVsZXRlJ10oa2V5KTtcblxuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tEZWxldGU7XG4iLCIvKipcbiAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBzdGFja0dldChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tHZXQ7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBhIHN0YWNrIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tIYXMoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrSGFzO1xuIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpLFxuICAgIE1hcENhY2hlID0gcmVxdWlyZSgnLi9fTWFwQ2FjaGUnKTtcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBTZXRzIHRoZSBzdGFjayBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBzdGFjayBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgdmFyIHBhaXJzID0gZGF0YS5fX2RhdGFfXztcbiAgICBpZiAoIU1hcCB8fCAocGFpcnMubGVuZ3RoIDwgTEFSR0VfQVJSQVlfU0laRSAtIDEpKSB7XG4gICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICB0aGlzLnNpemUgPSArK2RhdGEuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlycyk7XG4gIH1cbiAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tTZXQ7XG4iLCJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTWFza2VkID0gcmVxdWlyZSgnLi9faXNNYXNrZWQnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICB0b1NvdXJjZSA9IHJlcXVpcmUoJy4vX3RvU291cmNlJyk7XG5cbi8qKlxuICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gKi9cbnZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbnZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbih2YWx1ZSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTmF0aXZlO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlR2V0VGFnYCB3aGljaCBpZ25vcmVzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKSB7XG4gIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICB0cnkge1xuICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgaWYgKHVubWFza2VkKSB7XG4gICAgaWYgKGlzT3duKSB7XG4gICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UmF3VGFnO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb2JqZWN0VG9TdHJpbmc7XG4iLCJ2YXIgY29yZUpzRGF0YSA9IHJlcXVpcmUoJy4vX2NvcmVKc0RhdGEnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc01hc2tlZDtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcmVKc0RhdGE7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9Tb3VyY2U7XG4iLCIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRWYWx1ZTtcbiIsInZhciBIYXNoID0gcmVxdWlyZSgnLi9fSGFzaCcpLFxuICAgIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICB0aGlzLnNpemUgPSAwO1xuICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICdoYXNoJzogbmV3IEhhc2gsXG4gICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVDbGVhcjtcbiIsInZhciBoYXNoQ2xlYXIgPSByZXF1aXJlKCcuL19oYXNoQ2xlYXInKSxcbiAgICBoYXNoRGVsZXRlID0gcmVxdWlyZSgnLi9faGFzaERlbGV0ZScpLFxuICAgIGhhc2hHZXQgPSByZXF1aXJlKCcuL19oYXNoR2V0JyksXG4gICAgaGFzaEhhcyA9IHJlcXVpcmUoJy4vX2hhc2hIYXMnKSxcbiAgICBoYXNoU2V0ID0gcmVxdWlyZSgnLi9faGFzaFNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBIYXNoYC5cbkhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gaGFzaERlbGV0ZTtcbkhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XG5IYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoO1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoQ2xlYXI7XG4iLCIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hEZWxldGU7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoR2V0O1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEhhcztcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIFNldHMgdGhlIGhhc2ggYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBoYXNoU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICBkYXRhW2tleV0gPSAobmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaFNldDtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZURlbGV0ZTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuICAgIDogKHZhbHVlID09PSBudWxsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleWFibGU7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlR2V0O1xuIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVIYXM7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBtYXAgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlU2V0O1xuIiwidmFyIGNyZWF0ZUJhc2VGb3IgPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRm9yJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG52YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRm9yO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgYmFzZSBmdW5jdGlvbiBmb3IgbWV0aG9kcyBsaWtlIGBfLmZvckluYCBhbmQgYF8uZm9yT3duYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCYXNlRm9yKGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0LCBpdGVyYXRlZSwga2V5c0Z1bmMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgaXRlcmFibGUgPSBPYmplY3Qob2JqZWN0KSxcbiAgICAgICAgcHJvcHMgPSBrZXlzRnVuYyhvYmplY3QpLFxuICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wc1tmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XTtcbiAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQmFzZUZvcjtcbiIsInZhciBhc3NpZ25NZXJnZVZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduTWVyZ2VWYWx1ZScpLFxuICAgIGNsb25lQnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVCdWZmZXInKSxcbiAgICBjbG9uZVR5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19jbG9uZVR5cGVkQXJyYXknKSxcbiAgICBjb3B5QXJyYXkgPSByZXF1aXJlKCcuL19jb3B5QXJyYXknKSxcbiAgICBpbml0Q2xvbmVPYmplY3QgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVPYmplY3QnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNBcnJheUxpa2VPYmplY3QgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlT2JqZWN0JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuL2lzUGxhaW5PYmplY3QnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpLFxuICAgIHNhZmVHZXQgPSByZXF1aXJlKCcuL19zYWZlR2V0JyksXG4gICAgdG9QbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4vdG9QbGFpbk9iamVjdCcpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZU1lcmdlYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gKiBkZWVwIG1lcmdlcyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBtZXJnZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIG1lcmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1lcmdlRnVuYyBUaGUgZnVuY3Rpb24gdG8gbWVyZ2UgdmFsdWVzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIG1lcmdlRnVuYywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgdmFyIG9ialZhbHVlID0gc2FmZUdldChvYmplY3QsIGtleSksXG4gICAgICBzcmNWYWx1ZSA9IHNhZmVHZXQoc291cmNlLCBrZXkpLFxuICAgICAgc3RhY2tlZCA9IHN0YWNrLmdldChzcmNWYWx1ZSk7XG5cbiAgaWYgKHN0YWNrZWQpIHtcbiAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBzdGFja2VkKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgID8gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICA6IHVuZGVmaW5lZDtcblxuICB2YXIgaXNDb21tb24gPSBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gIGlmIChpc0NvbW1vbikge1xuICAgIHZhciBpc0FyciA9IGlzQXJyYXkoc3JjVmFsdWUpLFxuICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgaXNCdWZmZXIoc3JjVmFsdWUpLFxuICAgICAgICBpc1R5cGVkID0gIWlzQXJyICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHNyY1ZhbHVlKTtcblxuICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgaWYgKGlzQXJyIHx8IGlzQnVmZiB8fCBpc1R5cGVkKSB7XG4gICAgICBpZiAoaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IGNvcHlBcnJheShvYmpWYWx1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc0J1ZmYpIHtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgbmV3VmFsdWUgPSBjbG9uZUJ1ZmZlcihzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc1R5cGVkKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIG5ld1ZhbHVlID0gY2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBuZXdWYWx1ZSA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKSB8fCBpc0FyZ3VtZW50cyhzcmNWYWx1ZSkpIHtcbiAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICBpZiAoaXNBcmd1bWVudHMob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gdG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICghaXNPYmplY3Qob2JqVmFsdWUpIHx8IGlzRnVuY3Rpb24ob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoaXNDb21tb24pIHtcbiAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICBtZXJnZUZ1bmMobmV3VmFsdWUsIHNyY1ZhbHVlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spO1xuICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gIH1cbiAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNZXJnZURlZXA7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgYWxsb2NVbnNhZmUgPSBCdWZmZXIgPyBCdWZmZXIuYWxsb2NVbnNhZmUgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mICBgYnVmZmVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gIGlmIChpc0RlZXApIHtcbiAgICByZXR1cm4gYnVmZmVyLnNsaWNlKCk7XG4gIH1cbiAgdmFyIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBhbGxvY1Vuc2FmZSA/IGFsbG9jVW5zYWZlKGxlbmd0aCkgOiBuZXcgYnVmZmVyLmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZUJ1ZmZlcjtcbiIsInZhciBjbG9uZUFycmF5QnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVBcnJheUJ1ZmZlcicpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgdHlwZWRBcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSB0eXBlZEFycmF5IFRoZSB0eXBlZCBhcnJheSB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgdHlwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIodHlwZWRBcnJheS5idWZmZXIpIDogdHlwZWRBcnJheS5idWZmZXI7XG4gIHJldHVybiBuZXcgdHlwZWRBcnJheS5jb25zdHJ1Y3RvcihidWZmZXIsIHR5cGVkQXJyYXkuYnl0ZU9mZnNldCwgdHlwZWRBcnJheS5sZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lVHlwZWRBcnJheTtcbiIsInZhciBVaW50OEFycmF5ID0gcmVxdWlyZSgnLi9fVWludDhBcnJheScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgYXJyYXlCdWZmZXJgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBhcnJheUJ1ZmZlciBUaGUgYXJyYXkgYnVmZmVyIHRvIGNsb25lLlxuICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbG9uZUFycmF5QnVmZmVyKGFycmF5QnVmZmVyKSB7XG4gIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gIG5ldyBVaW50OEFycmF5KHJlc3VsdCkuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVBcnJheUJ1ZmZlcjtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBVaW50OEFycmF5ID0gcm9vdC5VaW50OEFycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVpbnQ4QXJyYXk7XG4iLCIvKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIHRvLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBcnJheShzb3VyY2UsIGFycmF5KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5QXJyYXk7XG4iLCJ2YXIgYmFzZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX2Jhc2VDcmVhdGUnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAqL1xuZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSlcbiAgICA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpXG4gICAgOiB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbml0Q2xvbmVPYmplY3Q7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICogcHJvcGVydGllcyB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm90byBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbnZhciBiYXNlQ3JlYXRlID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBvYmplY3QoKSB7fVxuICByZXR1cm4gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICBpZiAoIWlzT2JqZWN0KHByb3RvKSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBpZiAob2JqZWN0Q3JlYXRlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0Q3JlYXRlKHByb3RvKTtcbiAgICB9XG4gICAgb2JqZWN0LnByb3RvdHlwZSA9IHByb3RvO1xuICAgIHZhciByZXN1bHQgPSBuZXcgb2JqZWN0O1xuICAgIG9iamVjdC5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUNyZWF0ZTtcbiIsIi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG92ZXJBcmc7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0FyZ3VtZW50cztcbiIsInZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAqIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2VPYmplY3Q7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAqL1xuZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkZhbHNlO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuOC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiB9XG4gKlxuICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiZcbiAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzUGxhaW5PYmplY3Q7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG52YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbnR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xudHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxudHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxudHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzVHlwZWRBcnJheTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5hcnk7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4vKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi9cbnZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy5cbiAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgIGlmICh0eXBlcykge1xuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBub2RlVXRpbDtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZ1xuICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICpcbiAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfVxuICovXG5mdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1BsYWluT2JqZWN0O1xuIiwidmFyIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKTtcblxuLyoqXG4gKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzIHRvIGNvcHkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgdmFyIGlzTmV3ID0gIW9iamVjdDtcbiAgb2JqZWN0IHx8IChvYmplY3QgPSB7fSk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgPyBjdXN0b21pemVyKG9iamVjdFtrZXldLCBzb3VyY2Vba2V5XSwga2V5LCBvYmplY3QsIHNvdXJjZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG5ld1ZhbHVlID0gc291cmNlW2tleV07XG4gICAgfVxuICAgIGlmIChpc05ldykge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weU9iamVjdDtcbiIsInZhciBiYXNlVGltZXMgPSByZXF1aXJlKCcuL19iYXNlVGltZXMnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlMaWtlS2V5cztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRpbWVzO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzSW4gPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzSW4nKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICB9XG4gIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5c0luO1xuIiwiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAqIFtgT2JqZWN0LmtleXNgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAob2JqZWN0ICE9IG51bGwpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlS2V5c0luO1xuIiwidmFyIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9XG4gICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgYXNzaWduZXIob2JqZWN0LCBzb3VyY2UsIGluZGV4LCBjdXN0b21pemVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQXNzaWduZXI7XG4iLCJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgb3ZlclJlc3QgPSByZXF1aXJlKCcuL19vdmVyUmVzdCcpLFxuICAgIHNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fc2V0VG9TdHJpbmcnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJlc3Q7XG4iLCIvKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXBwbHk7XG4iLCJ2YXIgY29uc3RhbnQgPSByZXF1aXJlKCcuL2NvbnN0YW50JyksXG4gICAgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBiYXNlU2V0VG9TdHJpbmcgPSAhZGVmaW5lUHJvcGVydHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIHN0cmluZykge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICdlbnVtZXJhYmxlJzogZmFsc2UsXG4gICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAnd3JpdGFibGUnOiB0cnVlXG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlU2V0VG9TdHJpbmc7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbnN0YW50IGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5jb25zdGFudCh7ICdhJzogMSB9KSk7XG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gKiAvLyA9PiBbeyAnYSc6IDEgfSwgeyAnYSc6IDEgfV1cbiAqXG4gKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb25zdGFudDtcbiIsIi8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbnZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgSE9UX1NQQU4gPSAxNjtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZFxuICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gKiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gIHZhciBjb3VudCA9IDAsXG4gICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YW1wID0gbmF0aXZlTm93KCksXG4gICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCA9IDA7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG9ydE91dDtcbiIsInZhciBlcSA9IHJlcXVpcmUoJy4vZXEnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gaW5kZXggVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBpbmRleCBvciBrZXkgYXJndW1lbnQuXG4gKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHR5cGUgPSB0eXBlb2YgaW5kZXg7XG4gIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICAgID8gKGlzQXJyYXlMaWtlKG9iamVjdCkgJiYgaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpXG4gICAgICAgIDogKHR5cGUgPT0gJ3N0cmluZycgJiYgaW5kZXggaW4gb2JqZWN0KVxuICAgICAgKSB7XG4gICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJdGVyYXRlZUNhbGw7XG4iLCIvKlxuICogdHlwZWRlZnMuanNcbiAqIE5vcm1hbGl6ZXMgYnJvd3Nlci1zcGVjaWZpYyBwcmVmaXhlcyBhbmQgcHJvdmlkZSBzb21lIGJhc2ljIHBvbHlmaWxsc1xuICovXG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICghd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgICAgICAgICAgfHwgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgIHx8IHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgICAgICAgICAgfHwgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgICAgICAgICAgfHwgZnVuY3Rpb24gKC8qIGZ1bmN0aW9uIEZyYW1lUmVxdWVzdENhbGxiYWNrICovIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gNjApO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgIH0oKSk7XG4gICAgfVxufVxuXG5pZiAodHlwZW9mIE1hdGguaW11bCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cbiAgICBNYXRoLmltdWwgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBjb25zdCBhaCA9IChhID4+PiAxNikgJiAweGZmZmY7XG4gICAgICAgIGNvbnN0IGFsID0gYSAmIDB4ZmZmZjtcbiAgICAgICAgY29uc3QgYmggPSAoYiA+Pj4gMTYpICYgMHhmZmZmO1xuICAgICAgICBjb25zdCBibCA9IGIgJiAweGZmZmY7XG4gICAgICAgIC8vIHRoZSBzaGlmdCBieSAwIGZpeGVzIHRoZSBzaWduIG9uIHRoZSBoaWdoIHBhcnRcbiAgICAgICAgLy8gdGhlIGZpbmFsIHwwIGNvbnZlcnRzIHRoZSB1bnNpZ25lZCB2YWx1ZSBpbnRvIGEgc2lnbmVkIHZhbHVlXG4gICAgICAgIHJldHVybiAoKGFsICogYmwpICsgKCgoYWggKiBibCArIGFsICogYmgpIDw8IDE2KSA+Pj4gMCkgfCAwKTtcbiAgICB9O1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tYml0d2lzZSAqL1xufVxuXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgICBPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKHRhcmdldCkgeyAvLyAubGVuZ3RoIG9mIGZ1bmN0aW9uIGlzIDJcblxuJ3VzZSBzdHJpY3QnO1xuXG4gICAgICAgIGlmICh0YXJnZXQgPT09IG51bGwpIHsgLy8gVHlwZUVycm9yIGlmIHVuZGVmaW5lZCBvciBudWxsXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvID0gT2JqZWN0KHRhcmdldCk7XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgICAgICAgIGNvbnN0IG5leHRTb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAobmV4dFNvdXJjZSAhPT0gbnVsbCkgeyAvLyBTa2lwIG92ZXIgaWYgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5leHRLZXkgaW4gbmV4dFNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdm9pZCBidWdzIHdoZW4gaGFzT3duUHJvcGVydHkgaXMgc2hhZG93ZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXh0U291cmNlLCBuZXh0S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0bztcbiAgICB9O1xufVxuIiwiZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRoSG9sZXMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIHZhciBfaSA9IGFyciA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKF9pID09IG51bGwpIHJldHVybjtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG4gIHZhciBfcywgX2U7XG4gIHRyeSB7XG4gICAgZm9yIChfaSA9IF9pLmNhbGwoYXJyKTsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gX2Fycjtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheUxpbWl0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlUmVzdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4vdHlwZW9mLmpzXCIpW1wiZGVmYXVsdFwiXTtcbmZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7XG4gIFwidXNlIHN0cmljdFwiOyAvKiEgcmVnZW5lcmF0b3ItcnVudGltZSAtLSBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4gLS0gbGljZW5zZSAoTUlUKTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2Jsb2IvbWFpbi9MSUNFTlNFICovXG4gIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSA9IGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7XG4gICAgcmV0dXJuIGV4cG9ydHM7XG4gIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cztcbiAgdmFyIGV4cG9ydHMgPSB7fSxcbiAgICBPcCA9IE9iamVjdC5wcm90b3R5cGUsXG4gICAgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHksXG4gICAgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgfHwgZnVuY3Rpb24gKG9iaiwga2V5LCBkZXNjKSB7XG4gICAgICBvYmpba2V5XSA9IGRlc2MudmFsdWU7XG4gICAgfSxcbiAgICAkU3ltYm9sID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgPyBTeW1ib2wgOiB7fSxcbiAgICBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCIsXG4gICAgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiLFxuICAgIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcbiAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMFxuICAgIH0pLCBvYmpba2V5XTtcbiAgfVxuICB0cnkge1xuICAgIGRlZmluZSh7fSwgXCJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yLFxuICAgICAgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpLFxuICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcbiAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZ2VuZXJhdG9yLCBcIl9pbnZva2VcIiwge1xuICAgICAgdmFsdWU6IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dClcbiAgICB9KSwgZ2VuZXJhdG9yO1xuICB9XG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIm5vcm1hbFwiLFxuICAgICAgICBhcmc6IGZuLmNhbGwob2JqLCBhcmcpXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJ0aHJvd1wiLFxuICAgICAgICBhcmc6IGVyclxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0cy53cmFwID0gd3JhcDtcbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBkZWZpbmUoSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YsXG4gICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpICYmIChJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgZGVmaW5lKHByb3RvdHlwZSwgbWV0aG9kLCBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKFwidGhyb3dcIiAhPT0gcmVjb3JkLnR5cGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmcsXG4gICAgICAgICAgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZSAmJiBcIm9iamVjdFwiID09IF90eXBlb2YodmFsdWUpICYmIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikgPyBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSkgOiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uICh1bndyYXBwZWQpIHtcbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQsIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICB9XG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcbiAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9pbnZva2VcIiwge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPSBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZywgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcpIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChtZXRob2QsIGFyZykge1xuICAgICAgaWYgKFwiZXhlY3V0aW5nXCIgPT09IHN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgaWYgKFwiY29tcGxldGVkXCIgPT09IHN0YXRlKSB7XG4gICAgICAgIGlmIChcInRocm93XCIgPT09IG1ldGhvZCkgdGhyb3cgYXJnO1xuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuICAgICAgZm9yIChjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZCwgY29udGV4dC5hcmcgPSBhcmc7Oykge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChcIm5leHRcIiA9PT0gY29udGV4dC5tZXRob2QpIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztlbHNlIGlmIChcInRocm93XCIgPT09IGNvbnRleHQubWV0aG9kKSB7XG4gICAgICAgICAgaWYgKFwic3VzcGVuZGVkU3RhcnRcIiA9PT0gc3RhdGUpIHRocm93IHN0YXRlID0gXCJjb21wbGV0ZWRcIiwgY29udGV4dC5hcmc7XG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG4gICAgICAgIH0gZWxzZSBcInJldHVyblwiID09PSBjb250ZXh0Lm1ldGhvZCAmJiBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIHN0YXRlID0gXCJleGVjdXRpbmdcIjtcbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAoXCJub3JtYWxcIiA9PT0gcmVjb3JkLnR5cGUpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPSBjb250ZXh0LmRvbmUgPyBcImNvbXBsZXRlZFwiIDogXCJzdXNwZW5kZWRZaWVsZFwiLCByZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFwidGhyb3dcIiA9PT0gcmVjb3JkLnR5cGUgJiYgKHN0YXRlID0gXCJjb21wbGV0ZWRcIiwgY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAodW5kZWZpbmVkID09PSBtZXRob2QpIHtcbiAgICAgIGlmIChjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgXCJ0aHJvd1wiID09PSBjb250ZXh0Lm1ldGhvZCkge1xuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl0gJiYgKGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQsIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpLCBcInRocm93XCIgPT09IGNvbnRleHQubWV0aG9kKSkgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG4gICAgaWYgKFwidGhyb3dcIiA9PT0gcmVjb3JkLnR5cGUpIHJldHVybiBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbDtcbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG4gICAgcmV0dXJuIGluZm8gPyBpbmZvLmRvbmUgPyAoY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWUsIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2MsIFwicmV0dXJuXCIgIT09IGNvbnRleHQubWV0aG9kICYmIChjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBDb250aW51ZVNlbnRpbmVsKSA6IGluZm8gOiAoY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCk7XG4gIH1cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7XG4gICAgICB0cnlMb2M6IGxvY3NbMF1cbiAgICB9O1xuICAgIDEgaW4gbG9jcyAmJiAoZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdKSwgMiBpbiBsb2NzICYmIChlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXSwgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdKSwgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCIsIGRlbGV0ZSByZWNvcmQuYXJnLCBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbe1xuICAgICAgdHJ5TG9jOiBcInJvb3RcIlxuICAgIH1dLCB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyksIHRoaXMucmVzZXQoITApO1xuICB9XG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBpdGVyYWJsZS5uZXh0KSByZXR1cm4gaXRlcmFibGU7XG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSxcbiAgICAgICAgICBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIGZvciAoOyArK2kgPCBpdGVyYWJsZS5sZW5ndGg7KSB7XG4gICAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHJldHVybiBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV0sIG5leHQuZG9uZSA9ICExLCBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5leHQudmFsdWUgPSB1bmRlZmluZWQsIG5leHQuZG9uZSA9ICEwLCBuZXh0O1xuICAgICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmV4dDogZG9uZVJlc3VsdFxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIGRvbmU6ICEwXG4gICAgfTtcbiAgfVxuICByZXR1cm4gR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIGRlZmluZVByb3BlcnR5KEdwLCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsXG4gICAgY29uZmlndXJhYmxlOiAhMFxuICB9KSwgZGVmaW5lUHJvcGVydHkoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIFwiY29uc3RydWN0b3JcIiwge1xuICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbixcbiAgICBjb25maWd1cmFibGU6ICEwXG4gIH0pLCBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yRnVuY3Rpb25cIiksIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uIChnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZ2VuRnVuICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gISFjdG9yICYmIChjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIgPT09IChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkpO1xuICB9LCBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbiAoZ2VuRnVuKSB7XG4gICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKSA6IChnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpKSwgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApLCBnZW5GdW47XG4gIH0sIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbiAoYXJnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fYXdhaXQ6IGFyZ1xuICAgIH07XG4gIH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSksIGRlZmluZShBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSwgYXN5bmNJdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KSwgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvciwgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uIChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICB2b2lkIDAgPT09IFByb21pc2VJbXBsICYmIChQcm9taXNlSW1wbCA9IFByb21pc2UpO1xuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3Iod3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksIFByb21pc2VJbXBsKTtcbiAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pID8gaXRlciA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgfSk7XG4gIH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCksIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpLCBkZWZpbmUoR3AsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLCBkZWZpbmUoR3AsIFwidG9TdHJpbmdcIiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9KSwgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBvYmplY3QgPSBPYmplY3QodmFsKSxcbiAgICAgIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXMucmV2ZXJzZSgpLCBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgZm9yICg7IGtleXMubGVuZ3RoOykge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHJldHVybiBuZXh0LnZhbHVlID0ga2V5LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXh0LmRvbmUgPSAhMCwgbmV4dDtcbiAgICB9O1xuICB9LCBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcywgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG4gICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIGlmICh0aGlzLnByZXYgPSAwLCB0aGlzLm5leHQgPSAwLCB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkLCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gXCJuZXh0XCIsIHRoaXMuYXJnID0gdW5kZWZpbmVkLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KSwgIXNraXBUZW1wUmVzZXQpIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICBcInRcIiA9PT0gbmFtZS5jaGFyQXQoMCkgJiYgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiYgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSAmJiAodGhpc1tuYW1lXSA9IHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgdGhpcy5kb25lID0gITA7XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uO1xuICAgICAgaWYgKFwidGhyb3dcIiA9PT0gcm9vdFJlY29yZC50eXBlKSB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24gZGlzcGF0Y2hFeGNlcHRpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB0aHJvdyBleGNlcHRpb247XG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiLCByZWNvcmQuYXJnID0gZXhjZXB0aW9uLCBjb250ZXh0Lm5leHQgPSBsb2MsIGNhdWdodCAmJiAoY29udGV4dC5tZXRob2QgPSBcIm5leHRcIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQpLCAhIWNhdWdodDtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldLFxuICAgICAgICAgIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgIGlmIChcInJvb3RcIiA9PT0gZW50cnkudHJ5TG9jKSByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpLFxuICAgICAgICAgICAgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgITApO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCAhMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzRmluYWxseSkgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGFicnVwdDogZnVuY3Rpb24gYWJydXB0KHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiYgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmluYWxseUVudHJ5ICYmIChcImJyZWFrXCIgPT09IHR5cGUgfHwgXCJjb250aW51ZVwiID09PSB0eXBlKSAmJiBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJiBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MgJiYgKGZpbmFsbHlFbnRyeSA9IG51bGwpO1xuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZXR1cm4gcmVjb3JkLnR5cGUgPSB0eXBlLCByZWNvcmQuYXJnID0gYXJnLCBmaW5hbGx5RW50cnkgPyAodGhpcy5tZXRob2QgPSBcIm5leHRcIiwgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MsIENvbnRpbnVlU2VudGluZWwpIDogdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgcmV0dXJuIFwiYnJlYWtcIiA9PT0gcmVjb3JkLnR5cGUgfHwgXCJjb250aW51ZVwiID09PSByZWNvcmQudHlwZSA/IHRoaXMubmV4dCA9IHJlY29yZC5hcmcgOiBcInJldHVyblwiID09PSByZWNvcmQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmcsIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIiwgdGhpcy5uZXh0ID0gXCJlbmRcIikgOiBcIm5vcm1hbFwiID09PSByZWNvcmQudHlwZSAmJiBhZnRlckxvYyAmJiAodGhpcy5uZXh0ID0gYWZ0ZXJMb2MpLCBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG4gICAgZmluaXNoOiBmdW5jdGlvbiBmaW5pc2goZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSByZXR1cm4gdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyksIHJlc2V0VHJ5RW50cnkoZW50cnkpLCBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuICAgIH0sXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbiBfY2F0Y2godHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKFwidGhyb3dcIiA9PT0gcmVjb3JkLnR5cGUpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfSwgXCJuZXh0XCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHVuZGVmaW5lZCksIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9LCBleHBvcnRzO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vZ2V0UHJvdG90eXBlT2YuanNcIik7XG5mdW5jdGlvbiBfc3VwZXJQcm9wQmFzZShvYmplY3QsIHByb3BlcnR5KSB7XG4gIHdoaWxlICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpKSB7XG4gICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTtcbiAgICBpZiAob2JqZWN0ID09PSBudWxsKSBicmVhaztcbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxubW9kdWxlLmV4cG9ydHMgPSBfc3VwZXJQcm9wQmFzZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBhcnJheUxpa2VUb0FycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiKTtcbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aG91dEhvbGVzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfaXRlcmFibGVUb0FycmF5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlU3ByZWFkLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIGJhc2VQaWNrQnkgPSByZXF1aXJlKCcuL19iYXNlUGlja0J5JyksXG4gICAgaGFzSW4gPSByZXF1aXJlKCcuL2hhc0luJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gKiBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgIHJldHVybiBoYXNJbihvYmplY3QsIHBhdGgpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGljaztcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VTZXQgPSByZXF1aXJlKCcuL19iYXNlU2V0JyksXG4gICAgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0ge307XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgcGF0aCA9IHBhdGhzW2luZGV4XSxcbiAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgYmFzZVNldChyZXN1bHQsIGNhc3RQYXRoKHBhdGgsIG9iamVjdCksIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGlja0J5O1xuIiwidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAwLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgb2JqZWN0ID0gb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXgrK10pXTtcbiAgfVxuICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldDtcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleSh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSB8fCAhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpIHx8XG4gICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleTtcbiIsInZhciBtZW1vaXplQ2FwcGVkID0gcmVxdWlyZSgnLi9fbWVtb2l6ZUNhcHBlZCcpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwkKSkvZztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbi8qKlxuICogQ29udmVydHMgYHN0cmluZ2AgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xudmFyIHN0cmluZ1RvUGF0aCA9IG1lbW9pemVDYXBwZWQoZnVuY3Rpb24oc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KDApID09PSA0NiAvKiAuICovKSB7XG4gICAgcmVzdWx0LnB1c2goJycpO1xuICB9XG4gIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcbiAgICByZXN1bHQucHVzaChxdW90ZSA/IHN1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwgJyQxJykgOiAobnVtYmVyIHx8IG1hdGNoKSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5nVG9QYXRoO1xuIiwidmFyIG1lbW9pemUgPSByZXF1aXJlKCcuL21lbW9pemUnKTtcblxuLyoqIFVzZWQgYXMgdGhlIG1heGltdW0gbWVtb2l6ZSBjYWNoZSBzaXplLiAqL1xudmFyIE1BWF9NRU1PSVpFX1NJWkUgPSA1MDA7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykge1xuICB2YXIgcmVzdWx0ID0gbWVtb2l6ZShmdW5jLCBmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfSk7XG5cbiAgdmFyIGNhY2hlID0gcmVzdWx0LmNhY2hlO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lbW9pemVDYXBwZWQ7XG4iLCJ2YXIgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzXG4gKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnRcbiAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgXG4gKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkXG4gKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlXG4gKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KVxuICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAqXG4gKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogdmFsdWVzKG90aGVyKTtcbiAqIC8vID0+IFszLCA0XVxuICpcbiAqIG9iamVjdC5hID0gMjtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuXG4gKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsnYScsICdiJ11cbiAqXG4gKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDtcbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgIT0gbnVsbCAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xuXG4gICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gIHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG5tZW1vaXplLkNhY2hlID0gTWFwQ2FjaGU7XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZTtcbiIsInZhciBiYXNlVG9TdHJpbmcgPSByZXF1aXJlKCcuL19iYXNlVG9TdHJpbmcnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgZm9yIGBudWxsYFxuICogYW5kIGB1bmRlZmluZWRgIHZhbHVlcy4gVGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvU3RyaW5nKG51bGwpO1xuICogLy8gPT4gJydcbiAqXG4gKiBfLnRvU3RyaW5nKC0wKTtcbiAqIC8vID0+ICctMCdcbiAqXG4gKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAnMSwyLDMnXG4gKi9cbmZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBiYXNlVG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvU3RyaW5nO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRvU3RyaW5nO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheU1hcDtcbiIsInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuICAgICAgbmVzdGVkID0gb2JqZWN0O1xuXG4gIHdoaWxlIChuZXN0ZWQgIT0gbnVsbCAmJiArK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKSxcbiAgICAgICAgbmV3VmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nIHx8IGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIGlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldO1xuICAgICAgbmV3VmFsdWUgPSBjdXN0b21pemVyID8gY3VzdG9taXplcihvYmpWYWx1ZSwga2V5LCBuZXN0ZWQpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBpc09iamVjdChvYmpWYWx1ZSlcbiAgICAgICAgICA/IG9ialZhbHVlXG4gICAgICAgICAgOiAoaXNJbmRleChwYXRoW2luZGV4ICsgMV0pID8gW10gOiB7fSk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2lnblZhbHVlKG5lc3RlZCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgbmVzdGVkID0gbmVzdGVkW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlU2V0O1xuIiwidmFyIGJhc2VIYXNJbiA9IHJlcXVpcmUoJy4vX2Jhc2VIYXNJbicpLFxuICAgIGhhc1BhdGggPSByZXF1aXJlKCcuL19oYXNQYXRoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNJbjtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VIYXNJbjtcbiIsInZhciBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgcGF0aGAgZXhpc3RzIG9uIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrIHByb3BlcnRpZXMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgaGFzRnVuYykge1xuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gZmFsc2U7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pO1xuICAgIGlmICghKHJlc3VsdCA9IG9iamVjdCAhPSBudWxsICYmIGhhc0Z1bmMob2JqZWN0LCBrZXkpKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICB9XG4gIGlmIChyZXN1bHQgfHwgKytpbmRleCAhPSBsZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGxlbmd0aCA9IG9iamVjdCA9PSBudWxsID8gMCA6IG9iamVjdC5sZW5ndGg7XG4gIHJldHVybiAhIWxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpICYmXG4gICAgKGlzQXJyYXkob2JqZWN0KSB8fCBpc0FyZ3VtZW50cyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNQYXRoO1xuIiwidmFyIGZsYXR0ZW4gPSByZXF1aXJlKCcuL2ZsYXR0ZW4nKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHVuZGVmaW5lZCwgZmxhdHRlbiksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdFJlc3Q7XG4iLCJ2YXIgYmFzZUZsYXR0ZW4gPSByZXF1aXJlKCcuL19iYXNlRmxhdHRlbicpO1xuXG4vKipcbiAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmbGF0dGVuO1xuIiwidmFyIGFycmF5UHVzaCA9IHJlcXVpcmUoJy4vX2FycmF5UHVzaCcpLFxuICAgIGlzRmxhdHRlbmFibGUgPSByZXF1aXJlKCcuL19pc0ZsYXR0ZW5hYmxlJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHQ9W11dIFRoZSBpbml0aWFsIHJlc3VsdCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgcHJlZGljYXRlIHx8IChwcmVkaWNhdGUgPSBpc0ZsYXR0ZW5hYmxlKTtcbiAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGbGF0dGVuO1xuIiwiLyoqXG4gKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIG9mZnNldCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UHVzaDtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICEhKHNwcmVhZGFibGVTeW1ib2wgJiYgdmFsdWUgJiYgdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRmxhdHRlbmFibGU7XG4iLCJmdW5jdGlvbiBfaXNOYXRpdmVGdW5jdGlvbihmbikge1xuICByZXR1cm4gRnVuY3Rpb24udG9TdHJpbmcuY2FsbChmbikuaW5kZXhPZihcIltuYXRpdmUgY29kZV1cIikgIT09IC0xO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfaXNOYXRpdmVGdW5jdGlvbiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL3NldFByb3RvdHlwZU9mLmpzXCIpO1xudmFyIGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IHJlcXVpcmUoXCIuL2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdC5qc1wiKTtcbmZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICBpZiAoaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF9jb25zdHJ1Y3QgPSBSZWZsZWN0LmNvbnN0cnVjdC5iaW5kKCksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cztcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF9jb25zdHJ1Y3QgPSBmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgYS5wdXNoLmFwcGx5KGEsIGFyZ3MpO1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIHNldFByb3RvdHlwZU9mKGluc3RhbmNlLCBDbGFzcy5wcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cztcbiAgfVxuICByZXR1cm4gX2NvbnN0cnVjdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuICB0cnkge1xuICAgIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tY3ljbGVcbmltcG9ydCB7IEltYWdlV3JhcHBlciB9IGZyb20gJ3F1YWdnYSc7XG5pbXBvcnQgeyBRdWFnZ2FKU1Jlc3VsdE9iamVjdCB9IGZyb20gJy4uLy4uL3R5cGUtZGVmaW5pdGlvbnMvcXVhZ2dhJztcbmltcG9ydCBBcnJheUhlbHBlciBmcm9tICcuLi9jb21tb24vYXJyYXlfaGVscGVyJztcblxuLy8gZm9yIHNvbWUgcmVhc29uIHRoaXMgdGhyb3dzIGEgc2hhZG93IGVycm9yIG9uIGl0c2VsZj8hXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG5leHBvcnQgZW51bSBCYXJjb2RlRGlyZWN0aW9uIHtcbiAgICBGb3J3YXJkID0gMSxcbiAgICBSZXZlcnNlID0gLTFcbn1cblxuZXhwb3J0IHR5cGUgQmFyY29kZVJlYWRlclR5cGUgPSBzdHJpbmc7XG5leHBvcnQgdHlwZSBCYXJjb2RlRm9ybWF0ID0gc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhcmNvZGVSZWFkZXJDb25maWcge1xuICAgIG5vcm1hbGl6ZUJhclNwYWNlV2lkdGg/OiBib29sZWFuLFxuICAgIHN1cHBsZW1lbnRzPzogQXJyYXk8QmFyY29kZVJlYWRlclR5cGU+LFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhcmNvZGVDb3JyZWN0aW9uIHtcbiAgICBiYXI6IG51bWJlcixcbiAgICBzcGFjZTogbnVtYmVyLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhcmNvZGVQb3NpdGlvbiB7XG4gICAgZW5kOiBudW1iZXIsXG4gICAgZW5kQ291bnRlcj86IG51bWJlcixcbiAgICBlcnJvcj86IG51bWJlcixcbiAgICBzdGFydDogbnVtYmVyLFxuICAgIHN0YXJ0Q291bnRlcj86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhcmNvZGVJbmZvIGV4dGVuZHMgQmFyY29kZVBvc2l0aW9uIHtcbiAgICBjb2RlOiBudW1iZXIsXG4gICAgY29ycmVjdGlvbj86IEJhcmNvZGVDb3JyZWN0aW9uLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhcmNvZGUge1xuICAgIGNvZGU6IHN0cmluZyxcbiAgICBjb2Rlc2V0PzogbnVtYmVyLFxuICAgIGNvcnJlY3Rpb24/OiBCYXJjb2RlQ29ycmVjdGlvbixcbiAgICBkZWNvZGVkQ29kZXM/OiBBcnJheTxzdHJpbmcgfCBCYXJjb2RlSW5mbyB8IEJhcmNvZGVQb3NpdGlvbj4sXG4gICAgZGlyZWN0aW9uPzogQmFyY29kZURpcmVjdGlvbixcbiAgICBlbmQ6IG51bWJlcixcbiAgICBlbmRJbmZvPzogQmFyY29kZVBvc2l0aW9uLFxuICAgIGZvcm1hdDogQmFyY29kZUZvcm1hdCxcbiAgICBzdGFydDogbnVtYmVyLFxuICAgIHN0YXJ0SW5mbzogQmFyY29kZVBvc2l0aW9uLFxuICAgIHN1cHBsZW1lbnQ/OiBCYXJjb2RlLFxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFyY29kZVJlYWRlciB7XG4gICAgX3JvdzogQXJyYXk8bnVtYmVyPiA9IFtdO1xuXG4gICAgY29uZmlnOiBCYXJjb2RlUmVhZGVyQ29uZmlnID0ge307XG5cbiAgICBzdXBwbGVtZW50czogQXJyYXk8QmFyY29kZVJlYWRlcj4gPSBbXTtcblxuICAgIFNJTkdMRV9DT0RFX0VSUk9SID0gMDtcblxuICAgIEZPUk1BVDogQmFyY29kZUZvcm1hdCA9ICd1bmtub3duJztcblxuICAgIENPTkZJR19LRVlTOiBCYXJjb2RlUmVhZGVyQ29uZmlnID0ge307XG4gICAgLy8gVE9ETzogc2hvdWxkIGFkZCBBTFBIQUJFVEhfU1RSSU5HLCBBTFBIQUJFVCwgQ0hBUkFDVEVSX0VOQ09ESU5HUyB0byBiYXNlIGNsYXNzLCBpZiB0aGV5XG4gICAgLy8gYXJlIHVzZWZ1bCBpbiBtb3N0IHJlYWRlcnMuXG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgZGVjb2RlKHJvdz86IEFycmF5PG51bWJlcj4sIHN0YXJ0PzogQmFyY29kZVBvc2l0aW9uIHwgbnVtYmVyKTogQmFyY29kZSB8IG51bGw7XG5cbiAgICBzdGF0aWMgZ2V0IEV4Y2VwdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFN0YXJ0Tm90Rm91bmRFeGNlcHRpb246ICdTdGFydC1JbmZvIHdhcyBub3QgZm91bmQhJyxcbiAgICAgICAgICAgIENvZGVOb3RGb3VuZEV4Y2VwdGlvbjogJ0NvZGUgY291bGQgbm90IGJlIGZvdW5kIScsXG4gICAgICAgICAgICBQYXR0ZXJuTm90Rm91bmRFeGNlcHRpb246ICdQYXR0ZXJuIGNvdWxkIG5vdCBiZSBmb3VuZCEnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogQmFyY29kZVJlYWRlckNvbmZpZywgc3VwcGxlbWVudHM/OiBBcnJheTxCYXJjb2RlUmVhZGVyPikge1xuICAgICAgICB0aGlzLl9yb3cgPSBbXTtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWcgfHwge307XG4gICAgICAgIGlmIChzdXBwbGVtZW50cykge1xuICAgICAgICAgICAgdGhpcy5zdXBwbGVtZW50cyA9IHN1cHBsZW1lbnRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9uZXh0VW5zZXQobGluZTogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBzdGFydCA9IDApOiBudW1iZXIge1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmVbaV0pIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaW5lLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX21hdGNoUGF0dGVybihjb3VudGVyOiBSZWFkb25seUFycmF5PG51bWJlcj4sIGNvZGU6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPiwgbWF4U2luZ2xlRXJyb3IgPSB0aGlzLlNJTkdMRV9DT0RFX0VSUk9SIHx8IDEpOiBudW1iZXIge1xuICAgICAgICBsZXQgZXJyb3IgPSAwO1xuICAgICAgICBsZXQgc2luZ2xlRXJyb3IgPSAwO1xuICAgICAgICBsZXQgc3VtID0gMDtcbiAgICAgICAgbGV0IG1vZHVsbyA9IDA7XG4gICAgICAgIGxldCBiYXJXaWR0aCA9IDA7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGxldCBzY2FsZWQgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3VtICs9IGNvdW50ZXJbaV07XG4gICAgICAgICAgICBtb2R1bG8gKz0gY29kZVtpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VtIDwgbW9kdWxvKSB7XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJhcldpZHRoID0gc3VtIC8gbW9kdWxvO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgbWF4U2luZ2xlRXJyb3IgKj0gYmFyV2lkdGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY291bnQgPSBjb3VudGVyW2ldO1xuICAgICAgICAgICAgc2NhbGVkID0gY29kZVtpXSAqIGJhcldpZHRoO1xuICAgICAgICAgICAgc2luZ2xlRXJyb3IgPSBNYXRoLmFicyhjb3VudCAtIHNjYWxlZCkgLyBzY2FsZWQ7XG4gICAgICAgICAgICBpZiAoc2luZ2xlRXJyb3IgPiBtYXhTaW5nbGVFcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXJyb3IgKz0gc2luZ2xlRXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9yIC8gbW9kdWxvO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbmV4dFNldChsaW5lOiBSZWFkb25seUFycmF5PG51bWJlcj4sIG9mZnNldCA9IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChsaW5lW2ldKSByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jb3JyZWN0QmFycyhjb3VudGVyOiBBcnJheTxudW1iZXI+LCBjb3JyZWN0aW9uOiBudW1iZXIsIGluZGljZXM6IEFycmF5PG51bWJlcj4pIHtcbiAgICAgICAgbGV0IHsgbGVuZ3RoIH0gPSBpbmRpY2VzO1xuICAgICAgICBsZXQgdG1wID0gMDtcbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgICB0bXAgPSBjb3VudGVyW2luZGljZXNbbGVuZ3RoXV0gKiAoMSAtICgoMSAtIGNvcnJlY3Rpb24pIC8gMikpO1xuICAgICAgICAgICAgaWYgKHRtcCA+IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBjb3VudGVyW2luZGljZXNbbGVuZ3RoXV0gPSB0bXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZGVjb2RlUGF0dGVybihwYXR0ZXJuOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGVQYXR0ZXJuJywgcGF0dGVybik7XG4gICAgICAgIHRoaXMuX3JvdyA9IHBhdHRlcm47XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGVQYXR0ZXJuIGNhbGxpbmcgZGVjb2RlJywgdHlwZW9mIHRoaXMsIHRoaXMuY29uc3RydWN0b3IsIHRoaXMuRk9STUFULCBKU09OLnN0cmluZ2lmeSh0aGlzKSk7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmRlY29kZSgpO1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZmlyc3QgcmVzdWx0PScsIHJlc3VsdCk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmRlY29kZSgpO1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldmVyc2VkIHJlc3VsdD0nLCByZXN1bHQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5kaXJlY3Rpb24gPSBCYXJjb2RlRGlyZWN0aW9uLlJldmVyc2U7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXJ0ID0gdGhpcy5fcm93Lmxlbmd0aCAtIHJlc3VsdC5zdGFydDtcbiAgICAgICAgICAgICAgICByZXN1bHQuZW5kID0gdGhpcy5fcm93Lmxlbmd0aCAtIHJlc3VsdC5lbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuZGlyZWN0aW9uID0gQmFyY29kZURpcmVjdGlvbi5Gb3J3YXJkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5mb3JtYXQgPSB0aGlzLkZPUk1BVDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogcmV0dXJuaW5nJywgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX21hdGNoUmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgPCAwID8gMCA6IHN0YXJ0O1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9maWxsQ291bnRlcnMob2Zmc2V0OiBudW1iZXIgPSB0aGlzLl9uZXh0VW5zZXQodGhpcy5fcm93KSwgZW5kOiBudW1iZXIgPSB0aGlzLl9yb3cubGVuZ3RoLCBpc1doaXRlID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBjb3VudGVyczogQXJyYXk8bnVtYmVyPiA9IFtdO1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG4gICAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NdID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSBeIChpc1doaXRlID8gMSA6IDApKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50ZXJzO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdG9Db3VudGVycyhzdGFydDogbnVtYmVyLCBjb3VudGVyczogVWludDE2QXJyYXkgfCBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIGNvbnN0IG51bUNvdW50ZXJzID0gY291bnRlcnMubGVuZ3RoO1xuICAgICAgICBjb25zdCBlbmQgPSB0aGlzLl9yb3cubGVuZ3RoO1xuICAgICAgICBsZXQgaXNXaGl0ZSA9ICF0aGlzLl9yb3dbc3RhcnRdO1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG5cbiAgICAgICAgQXJyYXlIZWxwZXIuaW5pdChjb3VudGVycywgMCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSBeIChpc1doaXRlID8gMSA6IDApKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBudW1Db3VudGVycykge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3VudGVycztcbiAgICB9XG5cbiAgICAvLyBvdmVycmlkZS9pbXBsZW1lbnQgdGhpcyBpbiB5b3VyIGN1c3RvbSByZWFkZXJzLlxuICAgIHByb3RlY3RlZCBkZWNvZGVJbWFnZShpbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlcik6IFF1YWdnYUpTUmVzdWx0T2JqZWN0IHwgbnVsbCB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby12b2lkXG4gICAgICAgIHZvaWQgaW1hZ2VXcmFwcGVyO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhcmNvZGVSZWFkZXI7XG4iLCJpbXBvcnQgQmFyY29kZVJlYWRlciwgeyBCYXJjb2RlLCBCYXJjb2RlSW5mbywgQmFyY29kZVBvc2l0aW9uIH0gZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5cbmNvbnN0IE4gPSAxO1xuY29uc3QgVyA9IDM7XG5jb25zdCBTVEFSVF9QQVRURVJOID0gW1csIE4sIFcsIE4sIE4sIE5dO1xuY29uc3QgU1RPUF9QQVRURVJOID0gW1csIE4sIE4sIE4sIFddO1xuY29uc3QgQ09ERV9QQVRURVJOID0gW1xuICAgIFtOLCBOLCBXLCBXLCBOXSxcbiAgICBbVywgTiwgTiwgTiwgV10sXG4gICAgW04sIFcsIE4sIE4sIFddLFxuICAgIFtXLCBXLCBOLCBOLCBOXSxcbiAgICBbTiwgTiwgVywgTiwgV10sXG4gICAgW1csIE4sIFcsIE4sIE5dLFxuICAgIFtOLCBXLCBXLCBOLCBOXSxcbiAgICBbTiwgTiwgTiwgVywgV10sXG4gICAgW1csIE4sIE4sIFcsIE5dLFxuICAgIFtOLCBXLCBOLCBXLCBOXSxcbl07XG5jb25zdCBTVEFSVF9QQVRURVJOX0xFTkdUSCA9IFNUQVJUX1BBVFRFUk4ucmVkdWNlKChzdW0sIHZhbCkgPT4gc3VtICsgdmFsLCAwKTtcblxuY2xhc3MgVHdvT2ZGaXZlUmVhZGVyIGV4dGVuZHMgQmFyY29kZVJlYWRlciB7XG4gICAgYmFyU3BhY2VSYXRpbyA9IFsxLCAxXTtcblxuICAgIEZPUk1BVCA9ICcyb2Y1JztcblxuICAgIFNJTkdMRV9DT0RFX0VSUk9SID0gMC43ODtcblxuICAgIEFWR19DT0RFX0VSUk9SID0gMC4zMDtcblxuICAgIHByb3RlY3RlZCBfZmluZFBhdHRlcm4ocGF0dGVybjogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBvZmZzZXQ6IG51bWJlciwgaXNXaGl0ZSA9IGZhbHNlLCB0cnlIYXJkZXIgPSBmYWxzZSk6IEJhcmNvZGVJbmZvIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBbXTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuICAgICAgICBjb25zdCBiZXN0TWF0Y2ggPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIGNvZGU6IC0xLFxuICAgICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgICBlbmQ6IDAsXG4gICAgICAgIH07XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBsZXQgZXJyb3IgPSAwO1xuICAgICAgICBjb25zdCBlcHNpbG9uID0gdGhpcy5BVkdfQ09ERV9FUlJPUjtcblxuICAgICAgICBpZiAoIW9mZnNldCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb3VudGVyW2ldID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiAoaXNXaGl0ZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBzdW0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvdW50ZXIubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBjb3VudGVyW2pdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPCBlcHNpbG9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5zdGFydCA9IGkgLSBzdW07XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZXN0TWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyeUhhcmRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3VudGVyLmxlbmd0aCAtIDI7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbal0gPSBjb3VudGVyW2ogKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlci5sZW5ndGggLSAyXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXIubGVuZ3RoIC0gMV0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcy0tO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRTdGFydCgpOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsIHtcbiAgICAgICAgbGV0IHN0YXJ0SW5mbyA9IG51bGw7XG4gICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGxldCBuYXJyb3dCYXJXaWR0aCA9IDE7XG4gICAgICAgIGxldCBsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0ID0gMDtcblxuICAgICAgICB3aGlsZSAoIXN0YXJ0SW5mbykge1xuICAgICAgICAgICAgc3RhcnRJbmZvID0gdGhpcy5fZmluZFBhdHRlcm4oU1RBUlRfUEFUVEVSTiwgb2Zmc2V0LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIXN0YXJ0SW5mbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmFycm93QmFyV2lkdGggPSBNYXRoLmZsb29yKChzdGFydEluZm8uZW5kIC0gc3RhcnRJbmZvLnN0YXJ0KSAvIFNUQVJUX1BBVFRFUk5fTEVOR1RIKTtcbiAgICAgICAgICAgIGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPSBzdGFydEluZm8uc3RhcnQgLSBuYXJyb3dCYXJXaWR0aCAqIDU7XG4gICAgICAgICAgICBpZiAobGVhZGluZ1doaXRlc3BhY2VTdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21hdGNoUmFuZ2UobGVhZGluZ1doaXRlc3BhY2VTdGFydCwgc3RhcnRJbmZvLnN0YXJ0LCAwKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRJbmZvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCA9IHN0YXJ0SW5mby5lbmQ7XG4gICAgICAgICAgICBzdGFydEluZm8gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGFydEluZm87XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbzogQmFyY29kZUluZm8pOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsIHtcbiAgICAgICAgY29uc3QgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kID0gZW5kSW5mby5lbmQgKyAoKGVuZEluZm8uZW5kIC0gZW5kSW5mby5zdGFydCkgLyAyKTtcbiAgICAgICAgaWYgKHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA8IHRoaXMuX3Jvdy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGVuZEluZm8uZW5kLCB0cmFpbGluZ1doaXRlc3BhY2VFbmQsIDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuZEluZm87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9maW5kRW5kKCk6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICAvLyBUT0RPOiByZXZlcnNlLCBmb2xsb3dlZCBieSBzb21lIGNhbGNzLCBmb2xsb3dlZCBieSBhbm90aGVyIHJldmVyc2U/IHJlYWxseT9cbiAgICAgICAgdGhpcy5fcm93LnJldmVyc2UoKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBjb25zdCBlbmRJbmZvID0gdGhpcy5fZmluZFBhdHRlcm4oU1RPUF9QQVRURVJOLCBvZmZzZXQsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5fcm93LnJldmVyc2UoKTtcblxuICAgICAgICBpZiAoZW5kSW5mbyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXZlcnNlIG51bWJlcnNcbiAgICAgICAgY29uc3QgdG1wID0gZW5kSW5mby5zdGFydDtcbiAgICAgICAgZW5kSW5mby5zdGFydCA9IHRoaXMuX3Jvdy5sZW5ndGggLSBlbmRJbmZvLmVuZDtcbiAgICAgICAgZW5kSW5mby5lbmQgPSB0aGlzLl9yb3cubGVuZ3RoIC0gdG1wO1xuXG4gICAgICAgIHJldHVybiBlbmRJbmZvICE9PSBudWxsID8gdGhpcy5fdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm8pIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3ZlcmlmeUNvdW50ZXJMZW5ndGgoY291bnRlcnM6IEFycmF5PG51bWJlcj4pIHtcbiAgICAgICAgcmV0dXJuIChjb3VudGVycy5sZW5ndGggJSAxMCA9PT0gMCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVDb2RlKGNvdW50ZXI6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPik6IEJhcmNvZGVJbmZvIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGVwc2lsb24gPSB0aGlzLkFWR19DT0RFX0VSUk9SO1xuICAgICAgICBjb25zdCBiZXN0TWF0Y2ggPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIGNvZGU6IC0xLFxuICAgICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgICBlbmQ6IDAsXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQgY29kZSA9IDA7IGNvZGUgPCBDT0RFX1BBVFRFUk4ubGVuZ3RoOyBjb2RlKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIENPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgPCBiZXN0TWF0Y2guZXJyb3IhKSB7XG4gICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiZXN0TWF0Y2guZXJyb3IhIDwgZXBzaWxvbikge1xuICAgICAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2RlY29kZVBheWxvYWQoY291bnRlcnM6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPiwgcmVzdWx0OiBBcnJheTxzdHJpbmc+LCBkZWNvZGVkQ29kZXM6IEFycmF5PEJhcmNvZGVJbmZvIHwgQmFyY29kZVBvc2l0aW9uPik6IEJhcmNvZGVJbmZvIHwgbnVsbCB7XG4gICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICBjb25zdCBjb3VudGVyTGVuZ3RoID0gY291bnRlcnMubGVuZ3RoO1xuICAgICAgICBjb25zdCBjb3VudGVyID0gWzAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBsZXQgY29kZTogQmFyY29kZUluZm8gfCBudWxsID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAocG9zIDwgY291bnRlckxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2ldID0gY291bnRlcnNbcG9zXSAqIHRoaXMuYmFyU3BhY2VSYXRpb1swXTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKGNvdW50ZXIpO1xuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChgJHtjb2RlLmNvZGV9YCk7XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29kZTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBkZWNvZGUocm93PzogQXJyYXk8bnVtYmVyPiwgc3RhcnQ/OiBCYXJjb2RlUG9zaXRpb24pOiBCYXJjb2RlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuICAgICAgICBpZiAoIXN0YXJ0SW5mbykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbmRJbmZvID0gdGhpcy5fZmluZEVuZCgpO1xuICAgICAgICBpZiAoIWVuZEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnRlcnMgPSB0aGlzLl9maWxsQ291bnRlcnMoc3RhcnRJbmZvLmVuZCwgZW5kSW5mby5zdGFydCwgZmFsc2UpO1xuICAgICAgICBpZiAoIXRoaXMuX3ZlcmlmeUNvdW50ZXJMZW5ndGgoY291bnRlcnMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWNvZGVkQ29kZXMgPSBbXTtcbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goc3RhcnRJbmZvKTtcblxuICAgICAgICBjb25zdCByZXN1bHQ6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAgICAgY29uc3QgY29kZSA9IHRoaXMuX2RlY29kZVBheWxvYWQoY291bnRlcnMsIHJlc3VsdCwgZGVjb2RlZENvZGVzKTtcbiAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA8IDUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goZW5kSW5mbyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBzdGFydDogc3RhcnRJbmZvLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBlbmRJbmZvLmVuZCxcbiAgICAgICAgICAgIHN0YXJ0SW5mbyxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlcyxcbiAgICAgICAgICAgIGZvcm1hdDogdGhpcy5GT1JNQVQsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUd29PZkZpdmVSZWFkZXI7XG4iLCJpbXBvcnQgQmFyY29kZVJlYWRlciwgeyBCYXJjb2RlLCBCYXJjb2RlUG9zaXRpb24gfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcblxuLy8gY29uc3QgQUxQSEFCRVRIX1NUUklORyA9ICcwMTIzNDU2Nzg5LSQ6Ly4rQUJDRCc7XG5jb25zdCBBTFBIQUJFVCA9IFs0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNDUsIDM2LCA1OCwgNDcsIDQ2LCA0MywgNjUsIDY2LCA2NywgNjhdO1xuY29uc3QgQ0hBUkFDVEVSX0VOQ09ESU5HUyA9XG4gICAgWzB4MDAzLCAweDAwNiwgMHgwMDksIDB4MDYwLCAweDAxMiwgMHgwNDIsIDB4MDIxLCAweDAyNCwgMHgwMzAsIDB4MDQ4LCAweDAwYywgMHgwMTgsXG4gICAgICAgIDB4MDQ1LCAweDA1MSwgMHgwNTQsIDB4MDE1LCAweDAxQSwgMHgwMjksIDB4MDBCLCAweDAwRV07XG5jb25zdCBTVEFSVF9FTkQgPSBbMHgwMUEsIDB4MDI5LCAweDAwQiwgMHgwMEVdO1xuY29uc3QgTUlOX0VOQ09ERURfQ0hBUlMgPSA0O1xuY29uc3QgTUFYX0FDQ0VQVEFCTEUgPSAyLjA7XG5jb25zdCBQQURESU5HID0gMS41O1xuXG5pbnRlcmZhY2UgVGhyZXNob2xkU2l6ZSB7XG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIGNvdW50czogbnVtYmVyLFxuICAgIG1pbjogbnVtYmVyLFxuICAgIG1heDogbnVtYmVyLFxufTtcblxuaW50ZXJmYWNlIFRocmVzaG9sZCB7XG4gICAgc3BhY2U6IHtcbiAgICAgICAgbmFycm93OiBUaHJlc2hvbGRTaXplLFxuICAgICAgICB3aWRlOiBUaHJlc2hvbGRTaXplLFxuICAgIH0sXG4gICAgYmFyOiB7XG4gICAgICAgIG5hcnJvdzogVGhyZXNob2xkU2l6ZSxcbiAgICAgICAgd2lkZTogVGhyZXNob2xkU2l6ZSxcbiAgICB9LFxufTtcblxuY2xhc3MgTmV3Q29kYWJhclJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIF9jb3VudGVyczogQXJyYXk8bnVtYmVyPiA9IFtdO1xuICAgIEZPUk1BVCA9ICdjb2RhYmFyJztcblxuICAgIHByb3RlY3RlZCBfY29tcHV0ZUFsdGVybmF0aW5nVGhyZXNob2xkKG9mZnNldDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICAgICAgICBsZXQgbWluID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgICAgbGV0IG1heCA9IDA7XG4gICAgICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gb2Zmc2V0OyBpIDwgZW5kOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNvdW50ZXIgPSB0aGlzLl9jb3VudGVyc1tpXTtcbiAgICAgICAgICAgIGlmIChjb3VudGVyID4gbWF4KSB7XG4gICAgICAgICAgICAgICAgbWF4ID0gY291bnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb3VudGVyIDwgbWluKSB7XG4gICAgICAgICAgICAgICAgbWluID0gY291bnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoKG1pbiArIG1heCkgLyAyLjApIHwgMDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF90b1BhdHRlcm4ob2Zmc2V0OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbnVtQ291bnRlcnMgPSA3O1xuICAgICAgICBjb25zdCBlbmQgPSBvZmZzZXQgKyBudW1Db3VudGVycztcblxuICAgICAgICBpZiAoZW5kID4gdGhpcy5fY291bnRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXJUaHJlc2hvbGQgPSB0aGlzLl9jb21wdXRlQWx0ZXJuYXRpbmdUaHJlc2hvbGQob2Zmc2V0LCBlbmQpO1xuICAgICAgICBjb25zdCBzcGFjZVRocmVzaG9sZCA9IHRoaXMuX2NvbXB1dGVBbHRlcm5hdGluZ1RocmVzaG9sZChvZmZzZXQgKyAxLCBlbmQpO1xuXG4gICAgICAgIGxldCBiaXRtYXNrID0gMSA8PCAobnVtQ291bnRlcnMgLSAxKTtcbiAgICAgICAgbGV0IHRocmVzaG9sZCA9IDA7XG4gICAgICAgIGxldCBwYXR0ZXJuID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvdW50ZXJzOyBpKyspIHtcbiAgICAgICAgICAgIHRocmVzaG9sZCA9IChpICYgMSkgPT09IDAgPyBiYXJUaHJlc2hvbGQgOiBzcGFjZVRocmVzaG9sZDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb3VudGVyc1tvZmZzZXQgKyBpXSA+IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIHBhdHRlcm4gfD0gYml0bWFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJpdG1hc2sgPj49IDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGF0dGVybjtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9pc1N0YXJ0RW5kKHBhdHRlcm46IG51bWJlcikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFNUQVJUX0VORC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKFNUQVJUX0VORFtpXSA9PT0gcGF0dGVybikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9zdW1Db3VudGVycyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICAgICAgICBsZXQgc3VtID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgc3VtICs9IHRoaXMuX2NvdW50ZXJzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCk6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLl9uZXh0VW5zZXQodGhpcy5fcm93KTtcbiAgICAgICAgbGV0IGVuZCA9IHN0YXJ0O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5fY291bnRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLl90b1BhdHRlcm4oaSk7XG4gICAgICAgICAgICBpZiAocGF0dGVybiAhPT0gLTEgJiYgdGhpcy5faXNTdGFydEVuZChwYXR0ZXJuKSkge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IExvb2sgZm9yIHdoaXRlc3BhY2UgYWhlYWRcbiAgICAgICAgICAgICAgICBzdGFydCArPSB0aGlzLl9zdW1Db3VudGVycygwLCBpKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBzdGFydCArIHRoaXMuX3N1bUNvdW50ZXJzKGksIGkgKyA4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIGVuZDogZW5kLFxuICAgICAgICAgICAgICAgICAgICBzdGFydENvdW50ZXI6IGksXG4gICAgICAgICAgICAgICAgICAgIGVuZENvdW50ZXI6IGkgKyA4LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9wYXR0ZXJuVG9DaGFyKHBhdHRlcm46IG51bWJlcikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IENIQVJBQ1RFUl9FTkNPRElOR1MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChDSEFSQUNURVJfRU5DT0RJTkdTW2ldID09PSBwYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoQUxQSEFCRVRbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2NhbGN1bGF0ZVBhdHRlcm5MZW5ndGgob2Zmc2V0OiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IG9mZnNldCArIDc7IGkrKykge1xuICAgICAgICAgICAgc3VtICs9IHRoaXMuX2NvdW50ZXJzW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlXaGl0ZXNwYWNlKHN0YXJ0Q291bnRlcjogbnVtYmVyLCBlbmRDb3VudGVyOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKChzdGFydENvdW50ZXIgLSAxIDw9IDApXG4gICAgICAgICAgICB8fCB0aGlzLl9jb3VudGVyc1tzdGFydENvdW50ZXIgLSAxXSA+PSAodGhpcy5fY2FsY3VsYXRlUGF0dGVybkxlbmd0aChzdGFydENvdW50ZXIpIC8gMi4wKSkge1xuICAgICAgICAgICAgaWYgKChlbmRDb3VudGVyICsgOCA+PSB0aGlzLl9jb3VudGVycy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgfHwgdGhpcy5fY291bnRlcnNbZW5kQ291bnRlciArIDddID49ICh0aGlzLl9jYWxjdWxhdGVQYXR0ZXJuTGVuZ3RoKGVuZENvdW50ZXIpIC8gMi4wKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9jaGFyVG9QYXR0ZXJuKGNoYXI6IHN0cmluZykge1xuICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IEFMUEhBQkVULmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoQUxQSEFCRVRbaV0gPT09IGNoYXJDb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENIQVJBQ1RFUl9FTkNPRElOR1NbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDB4MDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF90aHJlc2hvbGRSZXN1bHRQYXR0ZXJuKHJlc3VsdDogUmVhZG9ubHlBcnJheTxzdHJpbmc+LCBzdGFydENvdW50ZXI6IG51bWJlcikge1xuICAgICAgICBjb25zdCBjYXRlZ29yaXphdGlvbjogVGhyZXNob2xkID0ge1xuICAgICAgICAgICAgICAgIHNwYWNlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hcnJvdzogeyBzaXplOiAwLCBjb3VudHM6IDAsIG1pbjogMCwgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFIH0sXG4gICAgICAgICAgICAgICAgICAgIHdpZGU6IHsgc2l6ZTogMCwgY291bnRzOiAwLCBtaW46IDAsIG1heDogTnVtYmVyLk1BWF9WQUxVRSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYmFyOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hcnJvdzogeyBzaXplOiAwLCBjb3VudHM6IDAsIG1pbjogMCwgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFIH0sXG4gICAgICAgICAgICAgICAgICAgIHdpZGU6IHsgc2l6ZTogMCwgY291bnRzOiAwLCBtaW46IDAsIG1heDogTnVtYmVyLk1BWF9WQUxVRSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICBsZXQgcG9zID0gc3RhcnRDb3VudGVyO1xuICAgICAgICBsZXQgcGF0dGVybjogbnVtYmVyO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwYXR0ZXJuID0gdGhpcy5fY2hhclRvUGF0dGVybihyZXN1bHRbaV0pO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDY7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2luZCA9IChqICYgMSkgPT09IDIgPyBjYXRlZ29yaXphdGlvbi5iYXIgOiBjYXRlZ29yaXphdGlvbi5zcGFjZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXQgPSAocGF0dGVybiAmIDEpID09PSAxID8ga2luZC53aWRlIDoga2luZC5uYXJyb3c7XG4gICAgICAgICAgICAgICAgY2F0LnNpemUgKz0gdGhpcy5fY291bnRlcnNbcG9zICsgal07XG4gICAgICAgICAgICAgICAgY2F0LmNvdW50cysrO1xuICAgICAgICAgICAgICAgIHBhdHRlcm4gPj49IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgKz0gODtcbiAgICAgICAgfVxuXG4gICAgICAgIChbJ3NwYWNlJywgJ2JhciddIGFzIGNvbnN0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld2tpbmQgPSBjYXRlZ29yaXphdGlvbltrZXldO1xuICAgICAgICAgICAgbmV3a2luZC53aWRlLm1pbiA9XG4gICAgICAgICAgICAgICAgTWF0aC5mbG9vcigobmV3a2luZC5uYXJyb3cuc2l6ZSAvIG5ld2tpbmQubmFycm93LmNvdW50cyArIG5ld2tpbmQud2lkZS5zaXplIC8gbmV3a2luZC53aWRlLmNvdW50cykgLyAyKTtcbiAgICAgICAgICAgIG5ld2tpbmQubmFycm93Lm1heCA9IE1hdGguY2VpbChuZXdraW5kLndpZGUubWluKTtcbiAgICAgICAgICAgIG5ld2tpbmQud2lkZS5tYXggPSBNYXRoLmNlaWwoKG5ld2tpbmQud2lkZS5zaXplICogTUFYX0FDQ0VQVEFCTEUgKyBQQURESU5HKSAvIG5ld2tpbmQud2lkZS5jb3VudHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY2F0ZWdvcml6YXRpb247XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfdmFsaWRhdGVSZXN1bHQocmVzdWx0OiBSZWFkb25seUFycmF5PHN0cmluZz4sIHN0YXJ0Q291bnRlcjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZHMgPSB0aGlzLl90aHJlc2hvbGRSZXN1bHRQYXR0ZXJuKHJlc3VsdCwgc3RhcnRDb3VudGVyKTtcbiAgICAgICAgbGV0IHBvcyA9IHN0YXJ0Q291bnRlcjtcbiAgICAgICAgbGV0IHBhdHRlcm46IG51bWJlcjtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGF0dGVybiA9IHRoaXMuX2NoYXJUb1BhdHRlcm4ocmVzdWx0W2ldKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSA2OyBqID49IDA7IGotLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtpbmQgPSAoaiAmIDEpID09PSAwID8gdGhyZXNob2xkcy5iYXIgOiB0aHJlc2hvbGRzLnNwYWNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhdCA9IChwYXR0ZXJuICYgMSkgPT09IDEgPyBraW5kLndpZGUgOiBraW5kLm5hcnJvdztcbiAgICAgICAgICAgICAgICBjb25zdCBzaXplID0gdGhpcy5fY291bnRlcnNbcG9zICsgal07XG4gICAgICAgICAgICAgICAgaWYgKHNpemUgPCBjYXQubWluIHx8IHNpemUgPiBjYXQubWF4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGF0dGVybiA+Pj0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBwdWJsaWMgZGVjb2RlKHJvdz86IEFycmF5PG51bWJlcj4sIHN0YXJ0PzogQmFyY29kZVBvc2l0aW9uIHwgbnVtYmVyIHwgbnVsbCk6IEJhcmNvZGUgfCBudWxsIHtcblxuICAgICAgICB0aGlzLl9jb3VudGVycyA9IHRoaXMuX2ZpbGxDb3VudGVycygpO1xuICAgICAgICBzdGFydCA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuICAgICAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dFN0YXJ0ID0gc3RhcnQuc3RhcnRDb3VudGVyIGFzIG51bWJlcjtcblxuICAgICAgICBjb25zdCByZXN1bHQ6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAgICAgbGV0IHBhdHRlcm46IG51bWJlcjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgcGF0dGVybiA9IHRoaXMuX3RvUGF0dGVybihuZXh0U3RhcnQpO1xuICAgICAgICAgICAgaWYgKHBhdHRlcm4gPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkQ2hhciA9IHRoaXMuX3BhdHRlcm5Ub0NoYXIocGF0dGVybik7XG4gICAgICAgICAgICBpZiAoZGVjb2RlZENoYXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRlY29kZWRDaGFyKTtcbiAgICAgICAgICAgIG5leHRTdGFydCArPSA4O1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAxICYmIHRoaXMuX2lzU3RhcnRFbmQocGF0dGVybikpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAobmV4dFN0YXJ0IDwgdGhpcy5fY291bnRlcnMubGVuZ3RoKTtcblxuICAgICAgICAvLyB2ZXJpZnkgZW5kXG4gICAgICAgIGlmICgocmVzdWx0Lmxlbmd0aCAtIDIpIDwgTUlOX0VOQ09ERURfQ0hBUlMgfHwgIXRoaXMuX2lzU3RhcnRFbmQocGF0dGVybikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmVyaWZ5IGVuZCB3aGl0ZSBzcGFjZVxuICAgICAgICBpZiAoIXRoaXMuX3ZlcmlmeVdoaXRlc3BhY2Uoc3RhcnQuc3RhcnRDb3VudGVyIGFzIG51bWJlciwgbmV4dFN0YXJ0IC0gOCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl92YWxpZGF0ZVJlc3VsdChyZXN1bHQsIHN0YXJ0LnN0YXJ0Q291bnRlciBhcyBudW1iZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIG5leHRTdGFydCA9IG5leHRTdGFydCA+IHRoaXMuX2NvdW50ZXJzLmxlbmd0aCA/IHRoaXMuX2NvdW50ZXJzLmxlbmd0aCA6IG5leHRTdGFydDtcbiAgICAgICAgY29uc3QgZW5kID0gc3RhcnQuc3RhcnQgKyB0aGlzLl9zdW1Db3VudGVycyhzdGFydC5zdGFydENvdW50ZXIgYXMgbnVtYmVyLCBuZXh0U3RhcnQgLSA4KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oJycpLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBlbmQsXG4gICAgICAgICAgICBzdGFydEluZm86IHN0YXJ0LFxuICAgICAgICAgICAgZGVjb2RlZENvZGVzOiByZXN1bHQsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULCAvLyBUT0RPOiBpIHRoaW5rIGl0IHNob3VsZCBub3QgYmUgcmVxdWlyZWQgdG8gcmV0dXJuIGZvcm1hdCBmcm9tIHRoaXMsIGFzIGJhcmNvZGVfcmVhZGVyIGZvcmNlIHNldHMgdGhlIGZvcm1hdCBhbnl3YXlcbiAgICAgICAgfTtcbiAgICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBOZXdDb2RhYmFyUmVhZGVyO1xuIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIsIHsgQmFyY29kZUNvcnJlY3Rpb24sIEJhcmNvZGVQb3NpdGlvbiwgQmFyY29kZSwgQmFyY29kZUluZm8gfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcblxuY2xhc3MgQ29kZTEyOFJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIENPREVfU0hJRlQgPSA5ODtcbiAgICBDT0RFX0MgPSA5OTtcbiAgICBDT0RFX0IgPSAxMDA7XG4gICAgQ09ERV9BID0gMTAxO1xuICAgIFNUQVJUX0NPREVfQSA9IDEwMztcbiAgICBTVEFSVF9DT0RFX0IgPSAxMDQ7XG4gICAgU1RBUlRfQ09ERV9DID0gMTA1O1xuICAgIFNUT1BfQ09ERSA9IDEwNjtcbiAgICBDT0RFX1BBVFRFUk4gPSBbXG4gICAgICAgICAgICBbMiwgMSwgMiwgMiwgMiwgMl0sXG4gICAgICAgICAgICBbMiwgMiwgMiwgMSwgMiwgMl0sXG4gICAgICAgICAgICBbMiwgMiwgMiwgMiwgMiwgMV0sXG4gICAgICAgICAgICBbMSwgMiwgMSwgMiwgMiwgM10sXG4gICAgICAgICAgICBbMSwgMiwgMSwgMywgMiwgMl0sXG4gICAgICAgICAgICBbMSwgMywgMSwgMiwgMiwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMiwgMiwgMSwgM10sXG4gICAgICAgICAgICBbMSwgMiwgMiwgMywgMSwgMl0sXG4gICAgICAgICAgICBbMSwgMywgMiwgMiwgMSwgMl0sXG4gICAgICAgICAgICBbMiwgMiwgMSwgMiwgMSwgM10sXG4gICAgICAgICAgICBbMiwgMiwgMSwgMywgMSwgMl0sXG4gICAgICAgICAgICBbMiwgMywgMSwgMiwgMSwgMl0sXG4gICAgICAgICAgICBbMSwgMSwgMiwgMiwgMywgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMiwgMSwgMywgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMiwgMiwgMywgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMywgMiwgMiwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMywgMSwgMiwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMywgMiwgMiwgMV0sXG4gICAgICAgICAgICBbMiwgMiwgMywgMiwgMSwgMV0sXG4gICAgICAgICAgICBbMiwgMiwgMSwgMSwgMywgMl0sXG4gICAgICAgICAgICBbMiwgMiwgMSwgMiwgMywgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMywgMiwgMSwgMl0sXG4gICAgICAgICAgICBbMiwgMiwgMywgMSwgMSwgMl0sXG4gICAgICAgICAgICBbMywgMSwgMiwgMSwgMywgMV0sXG4gICAgICAgICAgICBbMywgMSwgMSwgMiwgMiwgMl0sXG4gICAgICAgICAgICBbMywgMiwgMSwgMSwgMiwgMl0sXG4gICAgICAgICAgICBbMywgMiwgMSwgMiwgMiwgMV0sXG4gICAgICAgICAgICBbMywgMSwgMiwgMiwgMSwgMl0sXG4gICAgICAgICAgICBbMywgMiwgMiwgMSwgMSwgMl0sXG4gICAgICAgICAgICBbMywgMiwgMiwgMiwgMSwgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMiwgMSwgMiwgM10sXG4gICAgICAgICAgICBbMiwgMSwgMiwgMywgMiwgMV0sXG4gICAgICAgICAgICBbMiwgMywgMiwgMSwgMiwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMSwgMywgMiwgM10sXG4gICAgICAgICAgICBbMSwgMywgMSwgMSwgMiwgM10sXG4gICAgICAgICAgICBbMSwgMywgMSwgMywgMiwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMiwgMywgMSwgM10sXG4gICAgICAgICAgICBbMSwgMywgMiwgMSwgMSwgM10sXG4gICAgICAgICAgICBbMSwgMywgMiwgMywgMSwgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMSwgMywgMSwgM10sXG4gICAgICAgICAgICBbMiwgMywgMSwgMSwgMSwgM10sXG4gICAgICAgICAgICBbMiwgMywgMSwgMywgMSwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMiwgMSwgMywgM10sXG4gICAgICAgICAgICBbMSwgMSwgMiwgMywgMywgMV0sXG4gICAgICAgICAgICBbMSwgMywgMiwgMSwgMywgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMywgMSwgMiwgM10sXG4gICAgICAgICAgICBbMSwgMSwgMywgMywgMiwgMV0sXG4gICAgICAgICAgICBbMSwgMywgMywgMSwgMiwgMV0sXG4gICAgICAgICAgICBbMywgMSwgMywgMSwgMiwgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMSwgMywgMywgMV0sXG4gICAgICAgICAgICBbMiwgMywgMSwgMSwgMywgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMywgMSwgMSwgM10sXG4gICAgICAgICAgICBbMiwgMSwgMywgMywgMSwgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMywgMSwgMywgMV0sXG4gICAgICAgICAgICBbMywgMSwgMSwgMSwgMiwgM10sXG4gICAgICAgICAgICBbMywgMSwgMSwgMywgMiwgMV0sXG4gICAgICAgICAgICBbMywgMywgMSwgMSwgMiwgMV0sXG4gICAgICAgICAgICBbMywgMSwgMiwgMSwgMSwgM10sXG4gICAgICAgICAgICBbMywgMSwgMiwgMywgMSwgMV0sXG4gICAgICAgICAgICBbMywgMywgMiwgMSwgMSwgMV0sXG4gICAgICAgICAgICBbMywgMSwgNCwgMSwgMSwgMV0sXG4gICAgICAgICAgICBbMiwgMiwgMSwgNCwgMSwgMV0sXG4gICAgICAgICAgICBbNCwgMywgMSwgMSwgMSwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMSwgMiwgMiwgNF0sXG4gICAgICAgICAgICBbMSwgMSwgMSwgNCwgMiwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMSwgMSwgMiwgNF0sXG4gICAgICAgICAgICBbMSwgMiwgMSwgNCwgMiwgMV0sXG4gICAgICAgICAgICBbMSwgNCwgMSwgMSwgMiwgMl0sXG4gICAgICAgICAgICBbMSwgNCwgMSwgMiwgMiwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMiwgMiwgMSwgNF0sXG4gICAgICAgICAgICBbMSwgMSwgMiwgNCwgMSwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMiwgMSwgMSwgNF0sXG4gICAgICAgICAgICBbMSwgMiwgMiwgNCwgMSwgMV0sXG4gICAgICAgICAgICBbMSwgNCwgMiwgMSwgMSwgMl0sXG4gICAgICAgICAgICBbMSwgNCwgMiwgMiwgMSwgMV0sXG4gICAgICAgICAgICBbMiwgNCwgMSwgMiwgMSwgMV0sXG4gICAgICAgICAgICBbMiwgMiwgMSwgMSwgMSwgNF0sXG4gICAgICAgICAgICBbNCwgMSwgMywgMSwgMSwgMV0sXG4gICAgICAgICAgICBbMiwgNCwgMSwgMSwgMSwgMl0sXG4gICAgICAgICAgICBbMSwgMywgNCwgMSwgMSwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMSwgMiwgNCwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMSwgMSwgNCwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMSwgMiwgNCwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgNCwgMiwgMSwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgNCwgMSwgMSwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgNCwgMiwgMSwgMV0sXG4gICAgICAgICAgICBbNCwgMSwgMSwgMiwgMSwgMl0sXG4gICAgICAgICAgICBbNCwgMiwgMSwgMSwgMSwgMl0sXG4gICAgICAgICAgICBbNCwgMiwgMSwgMiwgMSwgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMiwgMSwgNCwgMV0sXG4gICAgICAgICAgICBbMiwgMSwgNCwgMSwgMiwgMV0sXG4gICAgICAgICAgICBbNCwgMSwgMiwgMSwgMiwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMSwgMSwgNCwgM10sXG4gICAgICAgICAgICBbMSwgMSwgMSwgMywgNCwgMV0sXG4gICAgICAgICAgICBbMSwgMywgMSwgMSwgNCwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgNCwgMSwgMSwgM10sXG4gICAgICAgICAgICBbMSwgMSwgNCwgMywgMSwgMV0sXG4gICAgICAgICAgICBbNCwgMSwgMSwgMSwgMSwgM10sXG4gICAgICAgICAgICBbNCwgMSwgMSwgMywgMSwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMywgMSwgNCwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgNCwgMSwgMywgMV0sXG4gICAgICAgICAgICBbMywgMSwgMSwgMSwgNCwgMV0sXG4gICAgICAgICAgICBbNCwgMSwgMSwgMSwgMywgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMSwgNCwgMSwgMl0sXG4gICAgICAgICAgICBbMiwgMSwgMSwgMiwgMSwgNF0sXG4gICAgICAgICAgICBbMiwgMSwgMSwgMiwgMywgMl0sXG4gICAgICAgICAgICBbMiwgMywgMywgMSwgMSwgMSwgMl0sXG4gICAgICAgIF07XG4gICAgU0lOR0xFX0NPREVfRVJST1IgPSAwLjY0O1xuICAgIEFWR19DT0RFX0VSUk9SID0gMC4zMDtcbiAgICBGT1JNQVQgPSAnY29kZV8xMjgnO1xuICAgIE1PRFVMRV9JTkRJQ0VTID0geyBiYXI6IFswLCAyLCA0XSwgc3BhY2U6IFsxLCAzLCA1XSB9O1xuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVDb2RlKHN0YXJ0OiBudW1iZXIsIGNvcnJlY3Rpb24/OiBCYXJjb2RlQ29ycmVjdGlvbik6IEJhcmNvZGVJbmZvIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGJlc3RNYXRjaCA9IHtcbiAgICAgICAgICAgIGVycm9yOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICBzdGFydDogc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHN0YXJ0LFxuICAgICAgICAgICAgY29ycmVjdGlvbjoge1xuICAgICAgICAgICAgICAgIGJhcjogMSxcbiAgICAgICAgICAgICAgICBzcGFjZTogMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGxldCBjb3VudGVyID0gWzAsIDAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBzdGFydDtcbiAgICAgICAgbGV0IGlzV2hpdGUgPSAhdGhpcy5fcm93W29mZnNldF07XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gb2Zmc2V0OyBpIDwgdGhpcy5fcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcm93W2ldIF4gKGlzV2hpdGUgPyAxIDogMCkpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvcnJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvcnJlY3QoY291bnRlciwgY29ycmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY29kZSA9IDA7IGNvZGUgPCB0aGlzLkNPREVfUEFUVEVSTi5sZW5ndGg7IGNvZGUrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9tYXRjaFBhdHRlcm4oY291bnRlciwgdGhpcy5DT0RFX1BBVFRFUk5bY29kZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgYmVzdE1hdGNoLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lbmQgPSBpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmVzdE1hdGNoLmNvZGUgPT09IC0xIHx8IGJlc3RNYXRjaC5lcnJvciA+IHRoaXMuQVZHX0NPREVfRVJST1IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkNPREVfUEFUVEVSTltiZXN0TWF0Y2guY29kZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb3JyZWN0aW9uLmJhciA9IHRoaXMuY2FsY3VsYXRlQ29ycmVjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNPREVfUEFUVEVSTltiZXN0TWF0Y2guY29kZV0sIGNvdW50ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NT0RVTEVfSU5ESUNFUy5iYXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvcnJlY3Rpb24uc3BhY2UgPSB0aGlzLmNhbGN1bGF0ZUNvcnJlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DT0RFX1BBVFRFUk5bYmVzdE1hdGNoLmNvZGVdLCBjb3VudGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTU9EVUxFX0lORElDRVMuc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiZXN0TWF0Y2g7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfY29ycmVjdChjb3VudGVyOiBBcnJheTxudW1iZXI+LCBjb3JyZWN0aW9uOiBCYXJjb2RlQ29ycmVjdGlvbikge1xuICAgICAgICB0aGlzLl9jb3JyZWN0QmFycyhjb3VudGVyLCBjb3JyZWN0aW9uLmJhciwgdGhpcy5NT0RVTEVfSU5ESUNFUy5iYXIpO1xuICAgICAgICB0aGlzLl9jb3JyZWN0QmFycyhjb3VudGVyLCBjb3JyZWN0aW9uLnNwYWNlLCB0aGlzLk1PRFVMRV9JTkRJQ0VTLnNwYWNlKTtcbiAgICB9O1xuXG4gICAgLy8gVE9ETzogX2ZpbmRTdGFydCBhbmQgZGVjb2RlQ29kZSBzaGFyZSBzaW1pbGFyIGNvZGUsIGNhbiB3ZSByZS11c2Ugc29tZT9cbiAgICBwcm90ZWN0ZWQgX2ZpbmRTdGFydCgpOiBCYXJjb2RlSW5mbyB8IG51bGwge1xuICAgICAgICBjb25zdCBjb3VudGVyID0gWzAsIDAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGNvbnN0IGJlc3RNYXRjaCA9IHtcbiAgICAgICAgICAgIGVycm9yOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgICAgIGNvcnJlY3Rpb246IHtcbiAgICAgICAgICAgICAgICBiYXI6IDEsXG4gICAgICAgICAgICAgICAgc3BhY2U6IDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBsZXQgaXNXaGl0ZSA9IGZhbHNlO1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IHRoaXMuX3Jvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSBeIChpc1doaXRlID8gMSA6IDApKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gY291bnRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1bSA9IGNvdW50ZXIucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNvZGUgPSB0aGlzLlNUQVJUX0NPREVfQTsgY29kZSA8PSB0aGlzLlNUQVJUX0NPREVfQzsgY29kZSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCB0aGlzLkNPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPCBiZXN0TWF0Y2guZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guY29kZSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlc3RNYXRjaC5lcnJvciA8IHRoaXMuQVZHX0NPREVfRVJST1IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5zdGFydCA9IGkgLSBzdW07XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb3JyZWN0aW9uLmJhciA9IHRoaXMuY2FsY3VsYXRlQ29ycmVjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNPREVfUEFUVEVSTltiZXN0TWF0Y2guY29kZV0sIGNvdW50ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NT0RVTEVfSU5ESUNFUy5iYXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvcnJlY3Rpb24uc3BhY2UgPSB0aGlzLmNhbGN1bGF0ZUNvcnJlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DT0RFX1BBVFRFUk5bYmVzdE1hdGNoLmNvZGVdLCBjb3VudGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTU9EVUxFX0lORElDRVMuc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2pdID0gY291bnRlcltqICsgMl07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY291bnRlcls0XSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbNV0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcblxuICAgIHB1YmxpYyBkZWNvZGUocm93PzogQXJyYXk8bnVtYmVyPiwgc3RhcnQ/OiBCYXJjb2RlUG9zaXRpb24pOiBCYXJjb2RlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuICAgICAgICBpZiAoc3RhcnRJbmZvID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIC8vICAgICBkb25lID0gZmFsc2UsXG4gICAgICAgIC8vICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgLy8gICAgIG11bHRpcGxpZXIgPSAwLFxuICAgICAgICAvLyAgICAgY2hlY2tzdW0gPSAwLFxuICAgICAgICAvLyAgICAgY29kZXNldCxcbiAgICAgICAgLy8gICAgIHJhd1Jlc3VsdCA9IFtdLFxuICAgICAgICAvLyAgICAgZGVjb2RlZENvZGVzID0gW10sXG4gICAgICAgIC8vICAgICBzaGlmdE5leHQgPSBmYWxzZSxcbiAgICAgICAgLy8gICAgIHVuc2hpZnQsXG4gICAgICAgIC8vICAgICByZW1vdmVMYXN0Q2hhcmFjdGVyID0gdHJ1ZTtcblxuICAgICAgICBsZXQgY29kZTogQmFyY29kZUluZm8gfCBudWxsID0ge1xuICAgICAgICAgICAgY29kZTogc3RhcnRJbmZvLmNvZGUsXG4gICAgICAgICAgICBzdGFydDogc3RhcnRJbmZvLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBzdGFydEluZm8uZW5kLFxuICAgICAgICAgICAgY29ycmVjdGlvbjoge1xuICAgICAgICAgICAgICAgIGJhcjogc3RhcnRJbmZvLmNvcnJlY3Rpb24hLmJhcixcbiAgICAgICAgICAgICAgICBzcGFjZTogc3RhcnRJbmZvLmNvcnJlY3Rpb24hLnNwYWNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZGVjb2RlZENvZGVzID0gW107XG4gICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuICAgICAgICBsZXQgY2hlY2tzdW0gPSBjb2RlLmNvZGU7XG4gICAgICAgIGxldCBjb2Rlc2V0ID0gKChjOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5TVEFSVF9DT0RFX0E6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkNPREVfQTtcbiAgICAgICAgICAgICAgICBjYXNlIHRoaXMuU1RBUlRfQ09ERV9COlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5DT0RFX0I7XG4gICAgICAgICAgICAgICAgY2FzZSB0aGlzLlNUQVJUX0NPREVfQzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ09ERV9DO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KShjb2RlLmNvZGUpO1xuICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICBsZXQgc2hpZnROZXh0ID0gZmFsc2U7XG4gICAgICAgIGxldCB1bnNoaWZ0ID0gc2hpZnROZXh0O1xuICAgICAgICBsZXQgcmVtb3ZlTGFzdENoYXJhY3RlciA9IHRydWU7XG4gICAgICAgIGxldCBtdWx0aXBsaWVyID0gMDtcbiAgICAgICAgbGV0IHJhd1Jlc3VsdDogQXJyYXk8bnVtYmVyPiA9IFtdO1xuICAgICAgICBsZXQgcmVzdWx0OiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW107IC8vIFRPRE86IGkgdGhpbmsgdGhpcyBzaG91bGQgYmUgc3RyaW5nIG9ubHksIGJ1dCBpdCBjcmVhdGVzIHByb2JsZW1zIGlmIGl0IGlzXG5cbiAgICAgICAgd2hpbGUgKCFkb25lKSB7XG4gICAgICAgICAgICB1bnNoaWZ0ID0gc2hpZnROZXh0O1xuICAgICAgICAgICAgc2hpZnROZXh0ID0gZmFsc2U7XG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShjb2RlIS5lbmQsIGNvZGUhLmNvcnJlY3Rpb24pO1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSB0aGlzLlNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVMYXN0Q2hhcmFjdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSB0aGlzLlNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICByYXdSZXN1bHQucHVzaChjb2RlLmNvZGUpO1xuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWVyKys7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtICs9IG11bHRpcGxpZXIgKiBjb2RlLmNvZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjb2Rlc2V0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSB0aGlzLkNPREVfQTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSA8IDY0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDMyICsgY29kZS5jb2RlKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZS5jb2RlIDwgOTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZS5jb2RlIC0gNjQpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgIT09IHRoaXMuU1RPUF9DT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGFzdENoYXJhY3RlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5DT0RFX1NISUZUOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0TmV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IHRoaXMuQ09ERV9CO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLkNPREVfQjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gdGhpcy5DT0RFX0I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuQ09ERV9DOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSB0aGlzLkNPREVfQztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5TVE9QX0NPREU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSB0aGlzLkNPREVfQjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSA8IDk2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDMyICsgY29kZS5jb2RlKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSB0aGlzLlNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxhc3RDaGFyYWN0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZS5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLkNPREVfU0hJRlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0TmV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSB0aGlzLkNPREVfQTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLkNPREVfQTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IHRoaXMuQ09ERV9BO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuQ09ERV9DOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gdGhpcy5DT0RFX0M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5TVE9QX0NPREU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIHRoaXMuQ09ERV9DOlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlIDwgMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUgPCAxMCA/ICcwJyArIGNvZGUuY29kZSA6IGNvZGUuY29kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSB0aGlzLlNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxhc3RDaGFyYWN0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZS5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuQ09ERV9BOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSB0aGlzLkNPREVfQTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5DT0RFX0I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IHRoaXMuQ09ERV9CO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlNUT1BfQ09ERTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVuc2hpZnQpIHtcbiAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gY29kZXNldCA9PT0gdGhpcy5DT0RFX0EgPyB0aGlzLkNPREVfQiA6IHRoaXMuQ09ERV9BO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29kZS5lbmQgPSB0aGlzLl9uZXh0VW5zZXQodGhpcy5fcm93LCBjb2RlLmVuZCk7XG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGNvZGUpKXtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hlY2tzdW0gLT0gbXVsdGlwbGllciAqIHJhd1Jlc3VsdFtyYXdSZXN1bHQubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChjaGVja3N1bSAlIDEwMyAhPT0gcmF3UmVzdWx0W3Jhd1Jlc3VsdC5sZW5ndGggLSAxXSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGxhc3QgY29kZSBmcm9tIHJlc3VsdCAoY2hlY2tzdW0pXG4gICAgICAgIGlmIChyZW1vdmVMYXN0Q2hhcmFjdGVyKSB7XG4gICAgICAgICAgICByZXN1bHQuc3BsaWNlKHJlc3VsdC5sZW5ndGggLSAxLCAxKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydEluZm8uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGNvZGUuZW5kLFxuICAgICAgICAgICAgY29kZXNldDogY29kZXNldCBhcyBudW1iZXIsXG4gICAgICAgICAgICBzdGFydEluZm86IHN0YXJ0SW5mbyxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlczogZGVjb2RlZENvZGVzLFxuICAgICAgICAgICAgZW5kSW5mbzogY29kZSxcbiAgICAgICAgICAgIGZvcm1hdDogdGhpcy5GT1JNQVQsXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm86IEJhcmNvZGVJbmZvKTogQmFyY29kZUluZm8gfCBudWxsIHtcblxuICAgICAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgICAgICB0cmFpbGluZ1doaXRlc3BhY2VFbmQ7XG5cbiAgICAgICAgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kID0gZW5kSW5mby5lbmQgKyAoKGVuZEluZm8uZW5kIC0gZW5kSW5mby5zdGFydCkgLyAyKTtcbiAgICAgICAgaWYgKHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA8IHNlbGYuX3Jvdy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl9tYXRjaFJhbmdlKGVuZEluZm8uZW5kLCB0cmFpbGluZ1doaXRlc3BhY2VFbmQsIDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuZEluZm87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcblxuXG4gICAgcHVibGljIGNhbGN1bGF0ZUNvcnJlY3Rpb24oZXhwZWN0ZWQ6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPiwgbm9ybWFsaXplZDogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBpbmRpY2VzOiBSZWFkb25seUFycmF5PG51bWJlcj4pOiBudW1iZXIge1xuICAgICAgICB2YXIgbGVuZ3RoID0gaW5kaWNlcy5sZW5ndGgsXG4gICAgICAgICAgICBzdW1Ob3JtYWxpemVkID0gMCxcbiAgICAgICAgICAgIHN1bUV4cGVjdGVkID0gMDtcblxuICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgICAgIHN1bUV4cGVjdGVkICs9IGV4cGVjdGVkW2luZGljZXNbbGVuZ3RoXV07XG4gICAgICAgICAgICBzdW1Ob3JtYWxpemVkICs9IG5vcm1hbGl6ZWRbaW5kaWNlc1tsZW5ndGhdXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VtRXhwZWN0ZWQgLyBzdW1Ob3JtYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29kZTEyOFJlYWRlcjtcbiIsIi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cbmltcG9ydCBBcnJheUhlbHBlciBmcm9tICcuLi9jb21tb24vYXJyYXlfaGVscGVyJztcbmltcG9ydCBCYXJjb2RlUmVhZGVyLCB7IHR5cGUgQmFyY29kZVBvc2l0aW9uLCB0eXBlIEJhcmNvZGUgfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcblxuY29uc3QgQUxQSEFCRVRIX1NUUklORyA9ICcwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVotLiAqJC8rJSc7XG5jb25zdCBBTFBIQUJFVCA9IG5ldyBVaW50MTZBcnJheShbLi4uQUxQSEFCRVRIX1NUUklOR10ubWFwKChjaGFyKSA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbmNvbnN0IENIQVJBQ1RFUl9FTkNPRElOR1MgPSBuZXcgVWludDE2QXJyYXkoW1xuICAgIDB4MDM0LCAweDEyMSwgMHgwNjEsIDB4MTYwLCAweDAzMSwgMHgxMzAsIDB4MDcwLCAweDAyNSwgMHgxMjQsIDB4MDY0LCAweDEwOSwgMHgwNDksXG4gICAgMHgxNDgsIDB4MDE5LCAweDExOCwgMHgwNTgsIDB4MDBELCAweDEwQywgMHgwNEMsIDB4MDFDLCAweDEwMywgMHgwNDMsIDB4MTQyLCAweDAxMywgMHgxMTIsIDB4MDUyLCAweDAwNywgMHgxMDYsXG4gICAgMHgwNDYsIDB4MDE2LCAweDE4MSwgMHgwQzEsIDB4MUMwLCAweDA5MSwgMHgxOTAsIDB4MEQwLCAweDA4NSwgMHgxODQsIDB4MEM0LCAweDA5NCwgMHgwQTgsIDB4MEEyLCAweDA4QSwgMHgwMkEsXG5dKTtcbmNvbnN0IEFTVEVSSVNLID0gMHgwOTQ7XG5cbmNsYXNzIENvZGUzOVJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIEZPUk1BVCA9ICdjb2RlXzM5JztcblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCk6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGxldCBwYXR0ZXJuU3RhcnQgPSBvZmZzZXQ7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBuZXcgVWludDE2QXJyYXkoWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuICAgICAgICBsZXQgaXNXaGl0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICAgICAgICBpZiAodGhpcy5fcm93W2ldIF4gKGlzV2hpdGUgPyAxIDogMCkpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBzdGFydCBwYXR0ZXJuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b1BhdHRlcm4oY291bnRlcikgPT09IEFTVEVSSVNLKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3aGl0ZVNwYWNlTXVzdFN0YXJ0ID0gTWF0aC5mbG9vcihNYXRoLm1heCgwLCBwYXR0ZXJuU3RhcnQgLSAoKGkgLSBwYXR0ZXJuU3RhcnQpIC8gNCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKHdoaXRlU3BhY2VNdXN0U3RhcnQsIHBhdHRlcm5TdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogcGF0dGVyblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5TdGFydCArPSBjb3VudGVyWzBdICsgY291bnRlclsxXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA3OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbal0gPSBjb3VudGVyW2ogKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb3VudGVyWzddID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlcls4XSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3RvUGF0dGVybihjb3VudGVyczogVWludDE2QXJyYXkpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBudW1Db3VudGVycyA9IGNvdW50ZXJzLmxlbmd0aDtcbiAgICAgICAgbGV0IG1heE5hcnJvd1dpZHRoID0gMDtcbiAgICAgICAgbGV0IG51bVdpZGVCYXJzID0gbnVtQ291bnRlcnM7XG4gICAgICAgIGxldCB3aWRlQmFyV2lkdGggPSAwO1xuXG4gICAgICAgIHdoaWxlIChudW1XaWRlQmFycyA+IDMpIHtcbiAgICAgICAgICAgIG1heE5hcnJvd1dpZHRoID0gdGhpcy5fZmluZE5leHRXaWR0aChjb3VudGVycywgbWF4TmFycm93V2lkdGgpO1xuICAgICAgICAgICAgbnVtV2lkZUJhcnMgPSAwO1xuICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJzW2ldID4gbWF4TmFycm93V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybiB8PSAxIDw8IChudW1Db3VudGVycyAtIDEgLSBpKTtcbiAgICAgICAgICAgICAgICAgICAgbnVtV2lkZUJhcnMrKztcbiAgICAgICAgICAgICAgICAgICAgd2lkZUJhcldpZHRoICs9IGNvdW50ZXJzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bVdpZGVCYXJzID09PSAzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db3VudGVycyAmJiBudW1XaWRlQmFycyA+IDA7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRlcnNbaV0gPiBtYXhOYXJyb3dXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtV2lkZUJhcnMtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY291bnRlcnNbaV0gKiAyKSA+PSB3aWRlQmFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZE5leHRXaWR0aChjb3VudGVyczogVWludDE2QXJyYXksIGN1cnJlbnQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBtaW5XaWR0aCA9IE51bWJlci5NQVhfVkFMVUU7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNvdW50ZXJzW2ldIDwgbWluV2lkdGggJiYgY291bnRlcnNbaV0gPiBjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgbWluV2lkdGggPSBjb3VudGVyc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtaW5XaWR0aDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3BhdHRlcm5Ub0NoYXIocGF0dGVybjogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ0hBUkFDVEVSX0VOQ09ESU5HUy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKENIQVJBQ1RFUl9FTkNPRElOR1NbaV0gPT09IHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShBTFBIQUJFVFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UobGFzdFN0YXJ0OiBudW1iZXIsIG5leHRTdGFydDogbnVtYmVyLCBjb3VudGVyczogVWludDE2QXJyYXkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcGF0dGVyblNpemUgPSBBcnJheUhlbHBlci5zdW0oY291bnRlcnMpO1xuXG4gICAgICAgIGNvbnN0IHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IG5leHRTdGFydCAtIGxhc3RTdGFydCAtIHBhdHRlcm5TaXplO1xuICAgICAgICBpZiAoKHRyYWlsaW5nV2hpdGVzcGFjZUVuZCAqIDMpID49IHBhdHRlcm5TaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGRlY29kZSgpOiBCYXJjb2RlIHwgbnVsbCB7XG4gICAgICAgIGxldCBjb3VudGVycyA9IG5ldyBVaW50MTZBcnJheShbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pO1xuICAgICAgICBjb25zdCByZXN1bHQ6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9maW5kU3RhcnQoKTtcblxuICAgICAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dFN0YXJ0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3csIHN0YXJ0LmVuZCk7XG5cbiAgICAgICAgbGV0IGRlY29kZWRDaGFyO1xuICAgICAgICBsZXQgbGFzdFN0YXJ0OiBudW1iZXI7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNvdW50ZXJzID0gdGhpcy5fdG9Db3VudGVycyhuZXh0U3RhcnQsIGNvdW50ZXJzKSBhcyBVaW50MTZBcnJheTtcbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLl90b1BhdHRlcm4oY291bnRlcnMpO1xuICAgICAgICAgICAgaWYgKHBhdHRlcm4gPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWNvZGVkQ2hhciA9IHRoaXMuX3BhdHRlcm5Ub0NoYXIocGF0dGVybik7XG4gICAgICAgICAgICBpZiAoZGVjb2RlZENoYXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRlY29kZWRDaGFyKTtcbiAgICAgICAgICAgIGxhc3RTdGFydCA9IG5leHRTdGFydDtcbiAgICAgICAgICAgIG5leHRTdGFydCArPSBBcnJheUhlbHBlci5zdW0oY291bnRlcnMpO1xuICAgICAgICAgICAgbmV4dFN0YXJ0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3csIG5leHRTdGFydCk7XG4gICAgICAgIH0gd2hpbGUgKGRlY29kZWRDaGFyICE9PSAnKicpO1xuICAgICAgICByZXN1bHQucG9wKCk7XG5cbiAgICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGxhc3RTdGFydCwgbmV4dFN0YXJ0LCBjb3VudGVycykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydC5zdGFydCxcbiAgICAgICAgICAgIGVuZDogbmV4dFN0YXJ0LFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydCxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0LFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLkZPUk1BVCxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvZGUzOVJlYWRlcjtcbiIsImltcG9ydCBDb2RlMzlSZWFkZXIgZnJvbSAnLi9jb2RlXzM5X3JlYWRlcic7XG5cbmNvbnN0IHBhdHRlcm5zID0ge1xuICAgIEFFSU86IC9bQUVJT10vZyxcbiAgICBBWjA5OiAvW0EtWjAtOV0vLFxufTtcblxuY29uc3QgY29kZTMyc2V0ID0gJzAxMjM0NTY3ODlCQ0RGR0hKS0xNTlBRUlNUVVZXWFlaJztcblxuY2xhc3MgQ29kZTMyUmVhZGVyIGV4dGVuZHMgQ29kZTM5UmVhZGVyIHtcbiAgICBGT1JNQVQgPSAnY29kZV8zMl9yZWFkZXInO1xuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVDb2RlMzIoY29kZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICgvW14wLTlCQ0RGR0hKS0xNTlBRUlNUVVZXWFlaXS8udGVzdChjb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzID0gcmVzICogMzIgKyBjb2RlMzJzZXQuaW5kZXhPZihjb2RlW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29kZTMyID0gYCR7cmVzfWA7XG4gICAgICAgIGlmIChjb2RlMzIubGVuZ3RoIDwgOSkge1xuICAgICAgICAgICAgY29kZTMyID0gKCcwMDAwMDAwMDAnICsgY29kZTMyKS5zbGljZSgtOSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdBJyArIGNvZGUzMjtcbiAgICB9XG5cbiAgICAvLyBUT0RPICh0aGlzIHdhcyB0b2RvIGluIG9yaWdpbmFsIHJlcG8sIG5vIHRleHQgd2FzIHRoZXJlLiBzb3JyeS4pXG4gICAgcHJvdGVjdGVkIF9jaGVja0NoZWNrc3VtKGNvZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISFjb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWNvZGUoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLmRlY29kZSgpO1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29kZSA9IHJlc3VsdC5jb2RlO1xuXG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlKHBhdHRlcm5zLkFFSU8sICcnKTtcblxuICAgICAgICBpZiAoIXRoaXMuX2NoZWNrQ2hlY2tzdW0oY29kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29kZTMyID0gdGhpcy5fZGVjb2RlQ29kZTMyKGNvZGUpO1xuXG4gICAgICAgIGlmICghY29kZTMyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5jb2RlID0gY29kZTMyO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29kZTMyUmVhZGVyO1xuIiwiLyogZXNsaW50LWRpc2FibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAqL1xuaW1wb3J0IHsgQmFyY29kZSB9IGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuaW1wb3J0IENvZGUzOVJlYWRlciBmcm9tICcuL2NvZGVfMzlfcmVhZGVyJztcblxuY29uc3QgcGF0dGVybnMgPSB7XG4gICAgSU9ROiAvW0lPUV0vZyxcbiAgICBBWjA5OiAvW0EtWjAtOV17MTd9Lyxcbn07XG5cbmNsYXNzIENvZGUzOVZJTlJlYWRlciBleHRlbmRzIENvZGUzOVJlYWRlciB7XG4gICAgRk9STUFUID0gJ2NvZGVfMzlfdmluJztcblxuICAgIC8vIFRPRE8gKHRoaXMgd2FzIHRvZG8gaW4gb3JpZ2luYWwgcmVwbywgbm8gdGV4dCB3YXMgdGhlcmUuIHNvcnJ5LilcbiAgICBwcm90ZWN0ZWQgX2NoZWNrQ2hlY2tzdW0oY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIWNvZGU7XG4gICAgfVxuXG4gICAgLy8gQ3JpYmJlZCBmcm9tOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96eGluZy96eGluZy9ibG9iL21hc3Rlci9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS96eGluZy9jbGllbnQvcmVzdWx0L1ZJTlJlc3VsdFBhcnNlci5qYXZhXG4gICAgcHVibGljIGRlY29kZSgpOiBCYXJjb2RlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLmRlY29kZSgpO1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgeyBjb2RlIH0gPSByZXN1bHQ7XG5cbiAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UocGF0dGVybnMuSU9RLCAnJyk7XG5cbiAgICAgICAgaWYgKCFjb2RlLm1hdGNoKHBhdHRlcm5zLkFaMDkpKSB7XG4gICAgICAgICAgICBpZiAoRU5WLmRldmVsb3BtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBBWjA5IHBhdHRlcm4gY29kZTonLCBjb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jaGVja0NoZWNrc3VtKGNvZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5jb2RlID0gY29kZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvZGUzOVZJTlJlYWRlcjtcbiIsImltcG9ydCBCYXJjb2RlUmVhZGVyLCB7IEJhcmNvZGVQb3NpdGlvbiwgQmFyY29kZSB9IGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuaW1wb3J0IEFycmF5SGVscGVyIGZyb20gJy4uL2NvbW1vbi9hcnJheV9oZWxwZXInO1xuXG5jb25zdCBBTFBIQUJFVEhfU1RSSU5HID0gJzAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi0uICQvKyVhYmNkKic7XG5jb25zdCBBTFBIQUJFVCA9IG5ldyBVaW50MTZBcnJheShbLi4uQUxQSEFCRVRIX1NUUklOR10ubWFwKGNoYXIgPT4gY2hhci5jaGFyQ29kZUF0KDApKSk7XG5jb25zdCBDSEFSQUNURVJfRU5DT0RJTkdTID0gbmV3IFVpbnQxNkFycmF5KFtcbiAgICAweDExNCwgMHgxNDgsIDB4MTQ0LCAweDE0MiwgMHgxMjgsIDB4MTI0LCAweDEyMiwgMHgxNTAsIDB4MTEyLCAweDEwQSxcbiAgICAweDFBOCwgMHgxQTQsIDB4MUEyLCAweDE5NCwgMHgxOTIsIDB4MThBLCAweDE2OCwgMHgxNjQsIDB4MTYyLCAweDEzNCxcbiAgICAweDExQSwgMHgxNTgsIDB4MTRDLCAweDE0NiwgMHgxMkMsIDB4MTE2LCAweDFCNCwgMHgxQjIsIDB4MUFDLCAweDFBNixcbiAgICAweDE5NiwgMHgxOUEsIDB4MTZDLCAweDE2NiwgMHgxMzYsIDB4MTNBLCAweDEyRSwgMHgxRDQsIDB4MUQyLCAweDFDQSxcbiAgICAweDE2RSwgMHgxNzYsIDB4MUFFLCAweDEyNiwgMHgxREEsIDB4MUQ2LCAweDEzMiwgMHgxNUUsXG5dKTtcbmNvbnN0IEFTVEVSSVNLID0gMHgxNUU7XG5cbmNsYXNzIENvZGU5M1JlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIEZPUk1BVCA9ICdjb2RlXzkzJztcbiAgICBwcm90ZWN0ZWQgX3BhdHRlcm5Ub0NoYXIocGF0dGVybjogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ0hBUkFDVEVSX0VOQ09ESU5HUy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKENIQVJBQ1RFUl9FTkNPRElOR1NbaV0gPT09IHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShBTFBIQUJFVFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfdG9QYXR0ZXJuKGNvdW50ZXJzOiBVaW50MTZBcnJheSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG51bUNvdW50ZXJzID0gY291bnRlcnMubGVuZ3RoO1xuICAgICAgICBjb25zdCBzdW0gPSBjb3VudGVycy5yZWR1Y2UoKHByZXYsIG5leHQpID0+IHByZXYgKyBuZXh0LCAwKTtcbiAgICAgICAgbGV0IHBhdHRlcm4gPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ291bnRlcnM7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5vcm1hbGl6ZWQgPSBNYXRoLnJvdW5kKGNvdW50ZXJzW2ldICogOSAvIHN1bSk7XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZCA8IDEgfHwgbm9ybWFsaXplZCA+IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGkgJiAxKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9ybWFsaXplZDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAocGF0dGVybiA8PCAxKSB8IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuIDw8PSBub3JtYWxpemVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXR0ZXJuO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRTdGFydCgpOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBsZXQgcGF0dGVyblN0YXJ0ID0gb2Zmc2V0O1xuICAgICAgICBjb25zdCBjb3VudGVyID0gbmV3IFVpbnQxNkFycmF5KFswLCAwLCAwLCAwLCAwLCAwXSk7XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcbiAgICAgICAgbGV0IGlzV2hpdGUgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gb2Zmc2V0OyBpIDwgdGhpcy5fcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcm93W2ldIF4gKGlzV2hpdGUgPyAxIDogMCkpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBzdGFydCBwYXR0ZXJuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b1BhdHRlcm4oY291bnRlcikgPT09IEFTVEVSSVNLKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3aGl0ZVNwYWNlTXVzdFN0YXJ0ID0gTWF0aC5mbG9vcihNYXRoLm1heCgwLCBwYXR0ZXJuU3RhcnQgLSAoKGkgLSBwYXR0ZXJuU3RhcnQpIC8gNCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKHdoaXRlU3BhY2VNdXN0U3RhcnQsIHBhdHRlcm5TdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogcGF0dGVyblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5TdGFydCArPSBjb3VudGVyWzBdICsgY291bnRlclsxXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbal0gPSBjb3VudGVyW2ogKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb3VudGVyWzRdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlcls1XSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlFbmQobGFzdFN0YXJ0OiBudW1iZXIsIG5leHRTdGFydDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChsYXN0U3RhcnQgPT09IG5leHRTdGFydCB8fCAhdGhpcy5fcm93W25leHRTdGFydF0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVFeHRlbmRlZChjaGFyQXJyYXk6IEFycmF5PHN0cmluZz4pOiBzdHJpbmdbXSB8IG51bGwge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBjaGFyQXJyYXkubGVuZ3RoO1xuICAgICAgICBjb25zdCByZXN1bHQ6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IGNoYXJBcnJheVtpXTtcbiAgICAgICAgICAgIGlmIChjaGFyID49ICdhJyAmJiBjaGFyIDw9ICdkJykge1xuICAgICAgICAgICAgICAgIGlmIChpID4gKGxlbmd0aCAtIDIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Q2hhciA9IGNoYXJBcnJheVsrK2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRDaGFyQ29kZSA9IG5leHRDaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgbGV0IGRlY29kZWRDaGFyO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoY2hhcikge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdhJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSAnQScgJiYgbmV4dENoYXIgPD0gJ1onKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSAtIDY0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPj0gJ0EnICYmIG5leHRDaGFyIDw9ICdFJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgLSAzOCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRDaGFyID49ICdGJyAmJiBuZXh0Q2hhciA8PSAnSicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dENoYXJDb2RlIC0gMTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0Q2hhciA+PSAnSycgJiYgbmV4dENoYXIgPD0gJ08nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSArIDE2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dENoYXIgPj0gJ1AnICYmIG5leHRDaGFyIDw9ICdTJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgKyA0Myk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRDaGFyID49ICdUJyAmJiBuZXh0Q2hhciA8PSAnWicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMTI3KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPj0gJ0EnICYmIG5leHRDaGFyIDw9ICdPJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgLSAzMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRDaGFyID09PSAnWicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9ICc6JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPj0gJ0EnICYmIG5leHRDaGFyIDw9ICdaJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgKyAzMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJyogY29kZV85M19yZWFkZXIgX2RlY29kZUV4dGVuZGVkIGhpdCBkZWZhdWx0IGNhc2UsIHRoaXMgbWF5IGJlIGFuIGVycm9yJywgZGVjb2RlZENoYXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRlY29kZWRDaGFyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hhcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9tYXRjaENoZWNrQ2hhcihjaGFyQXJyYXk6IEFycmF5PHN0cmluZz4sIGluZGV4OiBudW1iZXIsIG1heFdlaWdodDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGFycmF5VG9DaGVjayA9IGNoYXJBcnJheS5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5VG9DaGVjay5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHdlaWdodGVkU3VtcyA9IGFycmF5VG9DaGVjay5yZWR1Y2UoKHN1bSwgY2hhciwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd2VpZ2h0ID0gKCgoaSAqIC0xKSArIChsZW5ndGggLSAxKSkgJSBtYXhXZWlnaHQpICsgMTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQUxQSEFCRVQuaW5kZXhPZihjaGFyLmNoYXJDb2RlQXQoMCkpO1xuICAgICAgICAgICAgcmV0dXJuIHN1bSArICh3ZWlnaHQgKiB2YWx1ZSk7XG4gICAgICAgIH0sIDApO1xuXG4gICAgICAgIGNvbnN0IGNoZWNrQ2hhciA9IEFMUEhBQkVUWyh3ZWlnaHRlZFN1bXMgJSA0NyldO1xuICAgICAgICByZXR1cm4gY2hlY2tDaGFyID09PSBjaGFyQXJyYXlbaW5kZXhdLmNoYXJDb2RlQXQoMCk7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5Q2hlY2tzdW1zKGNoYXJBcnJheTogQXJyYXk8c3RyaW5nPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF0Y2hDaGVja0NoYXIoY2hhckFycmF5LCBjaGFyQXJyYXkubGVuZ3RoIC0gMiwgMjApXG4gICAgICAgICAgICAmJiB0aGlzLl9tYXRjaENoZWNrQ2hhcihjaGFyQXJyYXksIGNoYXJBcnJheS5sZW5ndGggLSAxLCAxNSk7XG4gICAgfTtcblxuICAgIHB1YmxpYyBkZWNvZGUocm93PzogQXJyYXk8bnVtYmVyPiwgc3RhcnQ/OiBCYXJjb2RlUG9zaXRpb24gfCBudW1iZXIgfCBudWxsKTogQmFyY29kZSB8IG51bGwge1xuICAgICAgICBzdGFydCA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuICAgICAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb3VudGVycyA9IG5ldyBVaW50MTZBcnJheShbMCwgMCwgMCwgMCwgMCwgMF0pO1xuICAgICAgICBsZXQgcmVzdWx0OiBBcnJheTxzdHJpbmc+IHwgbnVsbCA9IFtdO1xuICAgICAgICBsZXQgbmV4dFN0YXJ0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3csIHN0YXJ0LmVuZCk7XG4gICAgICAgIGxldCBsYXN0U3RhcnQ7XG4gICAgICAgIGxldCBkZWNvZGVkQ2hhcjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY291bnRlcnMgPSB0aGlzLl90b0NvdW50ZXJzKG5leHRTdGFydCwgY291bnRlcnMpIGFzIFVpbnQxNkFycmF5O1xuICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMuX3RvUGF0dGVybihjb3VudGVycyk7XG4gICAgICAgICAgICBpZiAocGF0dGVybiA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlY29kZWRDaGFyID0gdGhpcy5fcGF0dGVyblRvQ2hhcihwYXR0ZXJuKTtcbiAgICAgICAgICAgIGlmIChkZWNvZGVkQ2hhciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZGVjb2RlZENoYXIpO1xuICAgICAgICAgICAgbGFzdFN0YXJ0ID0gbmV4dFN0YXJ0O1xuICAgICAgICAgICAgbmV4dFN0YXJ0ICs9IEFycmF5SGVscGVyLnN1bShjb3VudGVycyk7XG4gICAgICAgICAgICBuZXh0U3RhcnQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3JvdywgbmV4dFN0YXJ0KTtcbiAgICAgICAgfSB3aGlsZSAoZGVjb2RlZENoYXIgIT09ICcqJyk7XG4gICAgICAgIHJlc3VsdC5wb3AoKTtcblxuICAgICAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl92ZXJpZnlFbmQobGFzdFN0YXJ0LCBuZXh0U3RhcnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5Q2hlY2tzdW1zKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIHJlc3VsdC5sZW5ndGggLSAyKTtcbiAgICAgICAgLy8geWVzLCB0aGlzIGlzIGFuIGFzc2lnbiBpbnNpZGUgYW4gaWYuXG4gICAgICAgIGlmICgocmVzdWx0ID0gdGhpcy5fZGVjb2RlRXh0ZW5kZWQocmVzdWx0KSkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydC5zdGFydCxcbiAgICAgICAgICAgIGVuZDogbmV4dFN0YXJ0LFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydCxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0LFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLkZPUk1BVCxcbiAgICAgICAgfTtcblxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29kZTkzUmVhZGVyO1xuIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIsIHsgQmFyY29kZVJlYWRlckNvbmZpZywgQmFyY29kZUluZm8sIEJhcmNvZGVQb3NpdGlvbiwgQmFyY29kZSB9IGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuaW1wb3J0IG1lcmdlIGZyb20gJ2xvZGFzaC9tZXJnZSc7XG5cbi8vIGNvbnN0IENPREVfTF9TVEFSVCA9IDA7XG5jb25zdCBDT0RFX0dfU1RBUlQgPSAxMDtcbmV4cG9ydCB7IENPREVfR19TVEFSVCB9O1xuY29uc3QgU1RBUlRfUEFUVEVSTiA9IFsxLCAxLCAxXTtcbmNvbnN0IE1JRERMRV9QQVRURVJOID0gWzEsIDEsIDEsIDEsIDFdO1xuZXhwb3J0IHsgTUlERExFX1BBVFRFUk4gfTtcbmNvbnN0IEVYVEVOU0lPTl9TVEFSVF9QQVRURVJOID0gWzEsIDEsIDJdO1xuY29uc3QgQ09ERV9QQVRURVJOID0gW1xuICAgIFszLCAyLCAxLCAxXSxcbiAgICBbMiwgMiwgMiwgMV0sXG4gICAgWzIsIDEsIDIsIDJdLFxuICAgIFsxLCA0LCAxLCAxXSxcbiAgICBbMSwgMSwgMywgMl0sXG4gICAgWzEsIDIsIDMsIDFdLFxuICAgIFsxLCAxLCAxLCA0XSxcbiAgICBbMSwgMywgMSwgMl0sXG4gICAgWzEsIDIsIDEsIDNdLFxuICAgIFszLCAxLCAxLCAyXSxcbiAgICBbMSwgMSwgMiwgM10sXG4gICAgWzEsIDIsIDIsIDJdLFxuICAgIFsyLCAyLCAxLCAyXSxcbiAgICBbMSwgMSwgNCwgMV0sXG4gICAgWzIsIDMsIDEsIDFdLFxuICAgIFsxLCAzLCAyLCAxXSxcbiAgICBbNCwgMSwgMSwgMV0sXG4gICAgWzIsIDEsIDMsIDFdLFxuICAgIFszLCAxLCAyLCAxXSxcbiAgICBbMiwgMSwgMSwgM10sXG5dO1xuY29uc3QgQ09ERV9GUkVRVUVOQ1kgPSBbMCwgMTEsIDEzLCAxNCwgMTksIDI1LCAyOCwgMjEsIDIyLCAyNl07XG4vLyBjb25zdCBTSU5HTEVfQ09ERV9FUlJPUiA9IDAuNzA7XG5jb25zdCBBVkdfQ09ERV9FUlJPUiA9IDAuNDg7XG5cbmNsYXNzIEVBTlJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIEZPUk1BVCA9ICdlYW5fMTMnO1xuICAgIFNJTkdMRV9DT0RFX0VSUk9SID0gMC43MDtcbiAgICBTVE9QX1BBVFRFUk4gPSBbMSwgMSwgMV07IC8vIFRPRE86IGRvZXMgdGhpcyBuZWVkIHRvIGJlIGluIHRoZSBjbGFzcz9cblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZz86IEJhcmNvZGVSZWFkZXJDb25maWcsIHN1cHBsZW1lbnRzPzogQXJyYXk8QmFyY29kZVJlYWRlcj4pIHtcbiAgICAgICAgc3VwZXIobWVyZ2UoeyBzdXBwbGVtZW50czogW10gfSwgY29uZmlnKSwgc3VwcGxlbWVudHMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZFBhdHRlcm4ocGF0dGVybjogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBvZmZzZXQ6IG51bWJlciwgaXNXaGl0ZTogYm9vbGVhbiwgdHJ5SGFyZGVyOiBib29sZWFuKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBuZXcgQXJyYXk8bnVtYmVyPihwYXR0ZXJuLmxlbmd0aCkuZmlsbCgwKTtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoOiBCYXJjb2RlUG9zaXRpb24gPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGVwc2lsb24gPSBBVkdfQ09ERV9FUlJPUjtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGZpbmRQYXR0ZXJuJywgcGF0dGVybiwgb2Zmc2V0LCBpc1doaXRlLCB0cnlIYXJkZXIsIGVwc2lsb24pO1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG4gICAgICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihgKiBsb29wIGk9JHtvZmZzZXR9IGxlbj0ke3RoaXMuX3Jvdy5sZW5ndGh9IGlzV2hpdGU9JHtpc1doaXRlfSBjb3VudGVyUG9zPSR7Y291bnRlclBvc31gKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiAoaXNXaGl0ZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gKz0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCBwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIG1hdGNoUGF0dGVybicsIGVycm9yLCBjb3VudGVyLCBwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgZXBzaWxvbiAmJiBiZXN0TWF0Y2guZXJyb3IgJiYgZXJyb3IgPCBiZXN0TWF0Y2guZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLnN0YXJ0ID0gaSAtIGNvdW50ZXIucmVkdWNlKChzdW0sIHZhbHVlKSA9PiBzdW0gKyB2YWx1ZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXR1cm4gYmVzdE1hdGNoJywgSlNPTi5zdHJpbmdpZnkoYmVzdE1hdGNoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cnlIYXJkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY291bnRlci5sZW5ndGggLSAyOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2pdID0gY291bnRlcltqICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXIubGVuZ3RoIC0gMl0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyLmxlbmd0aCAtIDFdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBiZXN0TWF0Y2gnLCBKU09OLnN0cmluZ2lmeShiZXN0TWF0Y2gpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXR1cm4gbnVsbCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZCA/IGJlc3RNYXRjaCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogZmluZFBhdHRlcm4gYW5kIGRlY29kZUNvZGUgYXBwZWFyIHRvIHNoYXJlIHF1aXRlIHNpbWlsYXIgY29kZSwgY2FuIGl0IGJlIHJlZHVjZWQ/XG4gICAgcHJvdGVjdGVkIF9kZWNvZGVDb2RlKHN0YXJ0OiBudW1iZXIsIGNvZGVyYW5nZT86IG51bWJlcik6IEJhcmNvZGVJbmZvIHwgbnVsbCB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGVDb2RlJywgc3RhcnQsIGNvZGVyYW5nZSk7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBbMCwgMCwgMCwgMF07XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHN0YXJ0O1xuICAgICAgICBjb25zdCBiZXN0TWF0Y2g6IEJhcmNvZGVJbmZvID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgICAgIGVuZDogc3RhcnRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXBzaWxvbiA9IEFWR19DT0RFX0VSUk9SO1xuICAgICAgICBsZXQgaXNXaGl0ZSA9ICF0aGlzLl9yb3dbb2Zmc2V0XTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuXG4gICAgICAgIGlmICghY29kZXJhbmdlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZGVjb2RlQ29kZSBiZWZvcmUgbGVuZ3RoJyk7XG4gICAgICAgICAgICBjb2RlcmFuZ2UgPSBDT0RFX1BBVFRFUk4ubGVuZ3RoO1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGRlY29kZUNvZGUgYWZ0ZXIgbGVuZ3RoJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IHRoaXMuX3Jvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSBeIChpc1doaXRlID8gMSA6IDApKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gY291bnRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNvZGUgPSAwOyBjb2RlIDwgY29kZXJhbmdlOyBjb2RlKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIENPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IGJlc3RNYXRjaC5lcnJvciEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guY29kZSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlc3RNYXRjaC5lcnJvciEgPiBlcHNpbG9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogcmV0dXJuIG51bGwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXR1cm4gYmVzdE1hdGNoJywgSlNPTi5zdHJpbmdpZnkoYmVzdE1hdGNoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiZXN0TWF0Y2g7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvdW5kID8gYmVzdE1hdGNoIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRTdGFydCgpOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGZpbmRTdGFydCcpO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBsZXQgc3RhcnRJbmZvOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoIXN0YXJ0SW5mbykge1xuICAgICAgICAgICAgc3RhcnRJbmZvID0gdGhpcy5fZmluZFBhdHRlcm4oU1RBUlRfUEFUVEVSTiwgb2Zmc2V0LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogc3RhcnRJbmZvPScsIEpTT04uc3RyaW5naWZ5KHN0YXJ0SW5mbykpO1xuICAgICAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGVhZGluZ1doaXRlc3BhY2VTdGFydCA9IHN0YXJ0SW5mby5zdGFydCAtIChzdGFydEluZm8uZW5kIC0gc3RhcnRJbmZvLnN0YXJ0KTtcblxuICAgICAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQsIHN0YXJ0SW5mby5zdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybmluZyBzdGFydEluZm8nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0SW5mbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9mZnNldCA9IHN0YXJ0SW5mby5lbmQ7XG4gICAgICAgICAgICBzdGFydEluZm8gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXR1cm5pbmcgbnVsbCcpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jYWxjdWxhdGVGaXJzdERpZ2l0KGNvZGVGcmVxdWVuY3k6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogY2FsY3VsYXRlRmlyc3REaWdpdCcsIGNvZGVGcmVxdWVuY3kpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IENPREVfRlJFUVVFTkNZLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29kZUZyZXF1ZW5jeSA9PT0gQ09ERV9GUkVRVUVOQ1lbaV0pIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogcmV0dXJuaW5nJywgaSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZGVjb2RlUGF5bG9hZChpbkNvZGU6IEJhcmNvZGVQb3NpdGlvbiwgcmVzdWx0OiBBcnJheTxudW1iZXI+LCBkZWNvZGVkQ29kZXM6IEFycmF5PEJhcmNvZGVQb3NpdGlvbj4pOiBCYXJjb2RlSW5mbyB8IG51bGwge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZGVjb2RlUGF5bG9hZCcsIGluQ29kZSwgcmVzdWx0LCBkZWNvZGVkQ29kZXMpO1xuICAgICAgICBsZXQgb3V0Q29kZTogQmFyY29kZUluZm8gfCBCYXJjb2RlUG9zaXRpb24gfCBudWxsID0geyAuLi5pbkNvZGUgfTtcbiAgICAgICAgbGV0IGNvZGVGcmVxdWVuY3kgPSAweDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIG91dENvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKG91dENvZGUuZW5kKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGVDb2RlPScsIG91dENvZGUpO1xuICAgICAgICAgICAgaWYgKCFvdXRDb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG91dENvZGUgYXMgQmFyY29kZUluZm8pLmNvZGUgPj0gQ09ERV9HX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgKG91dENvZGUgYXMgQmFyY29kZUluZm8pLmNvZGUgLT0gQ09ERV9HX1NUQVJUO1xuICAgICAgICAgICAgICAgIGNvZGVGcmVxdWVuY3kgfD0gMSA8PCAoNSAtIGkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2RlRnJlcXVlbmN5IHw9IDAgPDwgKDUgLSBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChvdXRDb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlKTtcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKG91dENvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3REaWdpdCA9IHRoaXMuX2NhbGN1bGF0ZUZpcnN0RGlnaXQoY29kZUZyZXF1ZW5jeSk7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBmaXJzdERpZ2l0PScsIGZpcnN0RGlnaXQpO1xuICAgICAgICBpZiAoZmlyc3REaWdpdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC51bnNoaWZ0KGZpcnN0RGlnaXQpO1xuXG4gICAgICAgIGxldCBtaWRkbGVQYXR0ZXJuID0gdGhpcy5fZmluZFBhdHRlcm4oTUlERExFX1BBVFRFUk4sIG91dENvZGUuZW5kLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBmaW5kUGF0dGVybj0nLCBKU09OLnN0cmluZ2lmeShtaWRkbGVQYXR0ZXJuKSk7XG5cbiAgICAgICAgaWYgKG1pZGRsZVBhdHRlcm4gPT09IG51bGwgfHwgIW1pZGRsZVBhdHRlcm4uZW5kKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogcmV0dXJuIG51bGwnKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2gobWlkZGxlUGF0dGVybik7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIG1pZGRsZVBhdHRlcm4gPSB0aGlzLl9kZWNvZGVDb2RlKG1pZGRsZVBhdHRlcm4hLmVuZCwgQ09ERV9HX1NUQVJUKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGVDb2RlPScsIEpTT04uc3RyaW5naWZ5KG1pZGRsZVBhdHRlcm4pKTtcblxuICAgICAgICAgICAgaWYgKCFtaWRkbGVQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKG1pZGRsZVBhdHRlcm4pO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goKG1pZGRsZVBhdHRlcm4gYXMgQmFyY29kZUluZm8pLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGVuZCBjb2RlPScsIEpTT04uc3RyaW5naWZ5KG1pZGRsZVBhdHRlcm4pKTtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGVuZCByZXN1bHQ9JywgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBlbmQgZGVjb2RlZENvZGVzPScsIGRlY29kZWRDb2Rlcyk7XG4gICAgICAgIHJldHVybiBtaWRkbGVQYXR0ZXJuIGFzIEJhcmNvZGVJbmZvO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm86IEJhcmNvZGVQb3NpdGlvbik6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlJywgSlNPTi5zdHJpbmdpZnkoZW5kSW5mbykpO1xuICAgICAgICBjb25zdCB0cmFpbGluZ1doaXRlc3BhY2VFbmQgPSBlbmRJbmZvLmVuZCArIChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpO1xuXG4gICAgICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShlbmRJbmZvLmVuZCwgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kLCAwKSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXR1cm5pbmcnLCBKU09OLnN0cmluZ2lmeShlbmRJbmZvKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuZEluZm87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZEVuZChvZmZzZXQ6IG51bWJlciwgaXNXaGl0ZTogYm9vbGVhbik6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZmluZEVuZCcsIG9mZnNldCwgaXNXaGl0ZSk7XG4gICAgICAgIGNvbnN0IGVuZEluZm8gPSB0aGlzLl9maW5kUGF0dGVybih0aGlzLlNUT1BfUEFUVEVSTiwgb2Zmc2V0LCBpc1doaXRlLCBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIGVuZEluZm8gIT09IG51bGwgPyB0aGlzLl92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbykgOiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY2hlY2tzdW0ocmVzdWx0OiBBcnJheTxudW1iZXI+KTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBfY2hlY2tzdW0nLCByZXN1bHQpO1xuICAgICAgICBsZXQgc3VtID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gcmVzdWx0Lmxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgICAgICAgICBzdW0gKz0gcmVzdWx0W2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VtICo9IDM7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHJlc3VsdC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMikge1xuICAgICAgICAgICAgc3VtICs9IHJlc3VsdFtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBlbmQgY2hlY2tzdW0nLCBzdW0gJSAxMCA9PT0gMCk7XG4gICAgICAgIHJldHVybiBzdW0gJSAxMCA9PT0gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kZWNvZGVFeHRlbnNpb25zKG9mZnNldDogbnVtYmVyKTogQmFyY29kZSB8IG51bGwge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBvZmZzZXQpO1xuICAgICAgICBjb25zdCBzdGFydEluZm8gPSB0aGlzLl9maW5kUGF0dGVybihFWFRFTlNJT05fU1RBUlRfUEFUVEVSTiwgc3RhcnQsIGZhbHNlLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKHN0YXJ0SW5mbyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZGVjb2RlRXh0ZW5zaW9ucycsIHRoaXMuc3VwcGxlbWVudHMpO1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogdGhlcmUgYXJlICcsIHRoaXMuc3VwcGxlbWVudHMubGVuZ3RoLCAnIHN1cHBsZW1lbnRzJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdXBwbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGV4dGVuc2lvbnMgbG9vcCcsIGksIHRoaXMuc3VwcGxlbWVudHNbaV0sIHRoaXMuc3VwcGxlbWVudHNbaV0uX2RlY29kZSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnN1cHBsZW1lbnRzW2ldLmRlY29kZSh0aGlzLl9yb3csIHN0YXJ0SW5mby5lbmQpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGUgcmVzdWx0PScsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogcmVzdWx0LmNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogcmVzdWx0LmVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0LmRlY29kZWRDb2RlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogdGhpcy5zdXBwbGVtZW50c1tpXS5GT1JNQVQsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignKiBkZWNvZGVFeHRlbnNpb25zIGVycm9yIGluICcsIHRoaXMuc3VwcGxlbWVudHNbaV0sICc6ICcsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZW5kIGRlY29kZUV4dGVuc2lvbnMnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IEJhcmNvZGVQb3NpdGlvbiB8IG51bWJlcik6IEJhcmNvZGUgfCBudWxsIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGRlY29kZScsIHJvdyk7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGUnLCBzdGFydCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgICAgIGNvbnN0IGRlY29kZWRDb2RlcyA9IG5ldyBBcnJheTxCYXJjb2RlSW5mbyB8IEJhcmNvZGVQb3NpdGlvbj4oKTtcbiAgICAgICAgbGV0IHJlc3VsdEluZm86IEJhcmNvZGUgfCB7fSA9IHt9O1xuICAgICAgICBsZXQgc3RhcnRJbmZvID0gdGhpcy5fZmluZFN0YXJ0KCk7XG5cbiAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvZGU6IEJhcmNvZGVQb3NpdGlvbiB8IEJhcmNvZGVJbmZvIHwgbnVsbCA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydEluZm8uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHN0YXJ0SW5mby5lbmRcbiAgICAgICAgfTtcbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG5cbiAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZVBheWxvYWQoY29kZSwgcmVzdWx0LCBkZWNvZGVkQ29kZXMpO1xuXG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb2RlID0gdGhpcy5fZmluZEVuZChjb2RlLmVuZCwgZmFsc2UpO1xuXG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcblxuICAgICAgICAvLyBDaGVja3N1bVxuICAgICAgICBpZiAoIXRoaXMuX2NoZWNrc3VtKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHRoaXMuc3VwcGxlbWVudHM9JywgdGhpcy5zdXBwbGVtZW50cyk7XG4gICAgICAgIGlmICh0aGlzLnN1cHBsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHN1cHBsZW1lbnQgPSB0aGlzLl9kZWNvZGVFeHRlbnNpb25zKGNvZGUuZW5kKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGVFeHRlbnNpb25zIHJldHVybnMnLCBzdXBwbGVtZW50KTtcbiAgICAgICAgICAgIGlmICghc3VwcGxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXN1cHBsZW1lbnQuZGVjb2RlZENvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxhc3RDb2RlID0gc3VwcGxlbWVudC5kZWNvZGVkQ29kZXNbc3VwcGxlbWVudC5kZWNvZGVkQ29kZXMubGVuZ3RoIC0gMV0gYXMgQmFyY29kZUluZm87XG4gICAgICAgICAgICBjb25zdCBlbmRJbmZvID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBsYXN0Q29kZS5zdGFydCArICgoKGxhc3RDb2RlLmVuZCAtIGxhc3RDb2RlLnN0YXJ0KSAvIDIpIHwgMCksXG4gICAgICAgICAgICAgICAgZW5kOiBsYXN0Q29kZS5lbmRcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5fdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm8pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdEluZm8gPSB7XG4gICAgICAgICAgICAgICAgc3VwcGxlbWVudCxcbiAgICAgICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJykgKyBzdXBwbGVtZW50LmNvZGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oJycpLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0SW5mby5zdGFydCxcbiAgICAgICAgICAgIGVuZDogY29kZS5lbmQsXG4gICAgICAgICAgICBzdGFydEluZm8sXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICAuLi5yZXN1bHRJbmZvLFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLkZPUk1BVCxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVBTlJlYWRlcjtcbiIsImltcG9ydCBFQU5SZWFkZXIsIHsgQ09ERV9HX1NUQVJUIH0gZnJvbSAnLi9lYW5fcmVhZGVyJztcbmltcG9ydCB7IEJhcmNvZGVQb3NpdGlvbiwgQmFyY29kZSwgQmFyY29kZUluZm8gfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcblxuXG5jbGFzcyBFQU4yUmVhZGVyIGV4dGVuZHMgRUFOUmVhZGVyIHtcbiAgICBGT1JNQVQgPSAnZWFuXzInO1xuICAgIHB1YmxpYyBkZWNvZGUocm93PzogQXJyYXk8bnVtYmVyPiwgc3RhcnQ/OiBudW1iZXIpOiBCYXJjb2RlIHwgbnVsbCB7XG4gICAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgICAgIHRoaXMuX3JvdyA9IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb2RlRnJlcXVlbmN5ID0gMDtcbiAgICAgICAgbGV0IG9mZnNldCA9IHN0YXJ0O1xuICAgICAgICBjb25zdCBlbmQgPSB0aGlzLl9yb3cubGVuZ3RoO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgY29uc3QgZGVjb2RlZENvZGVzID0gW107XG4gICAgICAgIGxldCBjb2RlOiBCYXJjb2RlSW5mbyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMiAmJiBvZmZzZXQgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUob2Zmc2V0KTtcbiAgICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUgJSAxMCk7XG4gICAgICAgICAgICBpZiAoY29kZS5jb2RlID49IENPREVfR19TVEFSVCkge1xuICAgICAgICAgICAgICAgIGNvZGVGcmVxdWVuY3kgfD0gMSA8PCAoMSAtIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3JvdywgY29kZS5lbmQpO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuX25leHRVbnNldCh0aGlzLl9yb3csIG9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCAhPT0gMiB8fCAocGFyc2VJbnQocmVzdWx0LmpvaW4oJycpKSAlIDQpICE9PSBjb2RlRnJlcXVlbmN5KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICBlbmQ6IChjb2RlIGFzIEJhcmNvZGVJbmZvKS5lbmQsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydEluZm8gYXMgQmFyY29kZVBvc2l0aW9uLFxuICAgICAgICAgICAgc3RhcnQ6IChzdGFydEluZm8gYXMgQmFyY29kZVBvc2l0aW9uKS5zdGFydCxcbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBFQU4yUmVhZGVyO1xuIiwiaW1wb3J0IEVBTlJlYWRlciwgeyBDT0RFX0dfU1RBUlQgfSBmcm9tICcuL2Vhbl9yZWFkZXInO1xuaW1wb3J0IHsgQmFyY29kZSwgQmFyY29kZVBvc2l0aW9uLCBCYXJjb2RlSW5mbyB9IGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuXG5jb25zdCBDSEVDS19ESUdJVF9FTkNPRElOR1MgPSBbMjQsIDIwLCAxOCwgMTcsIDEyLCA2LCAzLCAxMCwgOSwgNV07XG5cbmZ1bmN0aW9uIGRldGVybWluZUNoZWNrRGlnaXQoY29kZUZyZXF1ZW5jeTogbnVtYmVyKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgIGlmIChjb2RlRnJlcXVlbmN5ID09PSBDSEVDS19ESUdJVF9FTkNPRElOR1NbaV0pIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBleHRlbnNpb25DaGVja3N1bShyZXN1bHQ6IEFycmF5PG51bWJlcj4pIHtcbiAgICBjb25zdCBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuICAgIGxldCBzdW0gPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IGxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgICAgIHN1bSArPSByZXN1bHRbaV07XG4gICAgfVxuICAgIHN1bSAqPSAzO1xuICAgIGZvciAobGV0IGkgPSBsZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMikge1xuICAgICAgICBzdW0gKz0gcmVzdWx0W2ldO1xuICAgIH1cbiAgICBzdW0gKj0gMztcbiAgICByZXR1cm4gc3VtICUgMTA7XG59XG5cbmNsYXNzIEVBTjVSZWFkZXIgZXh0ZW5kcyBFQU5SZWFkZXIge1xuICAgIEZPUk1BVCA9ICdlYW5fNSc7XG4gICAgcHVibGljIGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IG51bWJlcik6IEJhcmNvZGUgfCBudWxsIHtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgdGhpcy5fcm93ID0gcm93O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvZGVGcmVxdWVuY3kgPSAwO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gc3RhcnQ7XG4gICAgICAgIGNvbnN0IGVuZCA9IHRoaXMuX3Jvdy5sZW5ndGg7XG4gICAgICAgIGxldCBjb2RlOiBCYXJjb2RlSW5mbyB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgY29uc3QgZGVjb2RlZENvZGVzID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1ICYmIG9mZnNldCA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShvZmZzZXQpO1xuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSAlIDEwKTtcbiAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgPj0gQ09ERV9HX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgY29kZUZyZXF1ZW5jeSB8PSAxIDw8ICg0IC0gaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gNCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBjb2RlLmVuZCk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbmV4dFVuc2V0KHRoaXMuX3Jvdywgb2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICE9PSA1KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHRlbnNpb25DaGVja3N1bShyZXN1bHQpICE9PSBkZXRlcm1pbmVDaGVja0RpZ2l0KGNvZGVGcmVxdWVuY3kpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICBlbmQ6IChjb2RlIGFzIEJhcmNvZGVJbmZvKS5lbmQsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydEluZm8gYXMgQmFyY29kZVBvc2l0aW9uLFxuICAgICAgICAgICAgc3RhcnQ6IChzdGFydEluZm8gYXMgQmFyY29kZVBvc2l0aW9uKS5zdGFydCxcbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBFQU41UmVhZGVyO1xuIiwiaW1wb3J0IEVBTlJlYWRlciwgeyBDT0RFX0dfU1RBUlQsIE1JRERMRV9QQVRURVJOIH0gZnJvbSAnLi9lYW5fcmVhZGVyJztcbmltcG9ydCB7IEJhcmNvZGVQb3NpdGlvbiwgQmFyY29kZUluZm8gfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcblxuY2xhc3MgRUFOOFJlYWRlciBleHRlbmRzIEVBTlJlYWRlciB7XG4gICAgRk9STUFUID0gJ2Vhbl84JztcbiAgICBwcm90ZWN0ZWQgX2RlY29kZVBheWxvYWQoaW5Db2RlOiBCYXJjb2RlUG9zaXRpb24sIHJlc3VsdDogQXJyYXk8bnVtYmVyPiwgZGVjb2RlZENvZGVzOiBBcnJheTxCYXJjb2RlUG9zaXRpb24+KTogQmFyY29kZUluZm8gfCBudWxsIHtcbiAgICAgICAgbGV0IGNvZGU6IEJhcmNvZGVJbmZvIHwgQmFyY29kZVBvc2l0aW9uIHwgbnVsbCA9IGluQ29kZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUoY29kZS5lbmQsIENPREVfR19TVEFSVCk7XG4gICAgICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChjb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlKTtcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29kZSA9IHRoaXMuX2ZpbmRQYXR0ZXJuKE1JRERMRV9QQVRURVJOLCBjb2RlLmVuZCwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGNvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKGNvZGUuZW5kLCBDT0RFX0dfU1RBUlQpO1xuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChjb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2RlIGFzIEJhcmNvZGVJbmZvO1xuICAgIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVBTjhSZWFkZXI7XG4iLCIvLyBUT0RPOiBpMm9mNV9yZWFkZXIgYW5kIDJvZjVfcmVhZGVyIHNoYXJlIHZlcnkgc2ltaWxhciBjb2RlLCBtYWtlIHVzZSBvZiB0aGF0XG5cbmltcG9ydCBCYXJjb2RlUmVhZGVyLCB7IEJhcmNvZGVSZWFkZXJDb25maWcsIEJhcmNvZGVJbmZvLCBCYXJjb2RlUG9zaXRpb24sIEJhcmNvZGUgfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcbmltcG9ydCBtZXJnZSBmcm9tICdsb2Rhc2gvbWVyZ2UnO1xuXG5jb25zdCBOID0gMTtcbmNvbnN0IFcgPSAzO1xuXG5jbGFzcyBJMm9mNVJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIHByaXZhdGUgYmFyU3BhY2VSYXRpbyA9IFsxLCAxXTtcbiAgICBTSU5HTEVfQ09ERV9FUlJPUiA9IDAuNzg7XG4gICAgQVZHX0NPREVfRVJST1IgPSAwLjM4O1xuXG4gICAgU1RBUlRfUEFUVEVSTiA9IFtOLCBOLCBOLCBOXTtcbiAgICBTVE9QX1BBVFRFUk4gPSBbTiwgTiwgV107XG4gICAgQ09ERV9QQVRURVJOID0gW1xuICAgICAgICBbTiwgTiwgVywgVywgTl0sXG4gICAgICAgIFtXLCBOLCBOLCBOLCBXXSxcbiAgICAgICAgW04sIFcsIE4sIE4sIFddLFxuICAgICAgICBbVywgVywgTiwgTiwgTl0sXG4gICAgICAgIFtOLCBOLCBXLCBOLCBXXSxcbiAgICAgICAgW1csIE4sIFcsIE4sIE5dLFxuICAgICAgICBbTiwgVywgVywgTiwgTl0sXG4gICAgICAgIFtOLCBOLCBOLCBXLCBXXSxcbiAgICAgICAgW1csIE4sIE4sIFcsIE5dLFxuICAgICAgICBbTiwgVywgTiwgVywgTl0sXG4gICAgXTtcbiAgICBNQVhfQ09SUkVDVElPTl9GQUNUT1IgPSA1O1xuICAgIEZPUk1BVCA9ICdpMm9mNSc7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRzOiBCYXJjb2RlUmVhZGVyQ29uZmlnKSB7XG4gICAgICAgIHN1cGVyKG1lcmdlKHsgbm9ybWFsaXplQmFyU3BhY2VXaWR0aDogZmFsc2UgfSwgb3B0cykpO1xuICAgICAgICBpZiAob3B0cy5ub3JtYWxpemVCYXJTcGFjZVdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLlNJTkdMRV9DT0RFX0VSUk9SID0gMC4zODtcbiAgICAgICAgICAgIHRoaXMuQVZHX0NPREVfRVJST1IgPSAwLjA5O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29uZmlnID0gb3B0cztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9tYXRjaFBhdHRlcm4oY291bnRlcjogQXJyYXk8bnVtYmVyPiwgY29kZTogUmVhZG9ubHlBcnJheTxudW1iZXI+KTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm5vcm1hbGl6ZUJhclNwYWNlV2lkdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ZXJTdW0gPSBbMCwgMF07XG4gICAgICAgICAgICBjb25zdCBjb2RlU3VtID0gWzAsIDBdO1xuICAgICAgICAgICAgY29uc3QgY29ycmVjdGlvbiA9IFswLCAwXTtcbiAgICAgICAgICAgIGNvbnN0IGNvcnJlY3Rpb25SYXRpbyA9IHRoaXMuTUFYX0NPUlJFQ1RJT05fRkFDVE9SO1xuICAgICAgICAgICAgY29uc3QgY29ycmVjdGlvblJhdGlvSW52ZXJzZSA9IDEgLyBjb3JyZWN0aW9uUmF0aW87XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJTdW1baSAlIDJdICs9IGNvdW50ZXJbaV07XG4gICAgICAgICAgICAgICAgY29kZVN1bVtpICUgMl0gKz0gY29kZVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvcnJlY3Rpb25bMF0gPSBjb2RlU3VtWzBdIC8gY291bnRlclN1bVswXTtcbiAgICAgICAgICAgIGNvcnJlY3Rpb25bMV0gPSBjb2RlU3VtWzFdIC8gY291bnRlclN1bVsxXTtcblxuICAgICAgICAgICAgY29ycmVjdGlvblswXSA9IE1hdGgubWF4KE1hdGgubWluKGNvcnJlY3Rpb25bMF0sIGNvcnJlY3Rpb25SYXRpbyksIGNvcnJlY3Rpb25SYXRpb0ludmVyc2UpO1xuICAgICAgICAgICAgY29ycmVjdGlvblsxXSA9IE1hdGgubWF4KE1hdGgubWluKGNvcnJlY3Rpb25bMV0sIGNvcnJlY3Rpb25SYXRpbyksIGNvcnJlY3Rpb25SYXRpb0ludmVyc2UpO1xuICAgICAgICAgICAgdGhpcy5iYXJTcGFjZVJhdGlvID0gY29ycmVjdGlvbjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbaV0gKj0gdGhpcy5iYXJTcGFjZVJhdGlvW2kgJSAyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuX21hdGNoUGF0dGVybihjb3VudGVyLCBjb2RlKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9maW5kUGF0dGVybihwYXR0ZXJuOiBSZWFkb25seUFycmF5PG51bWJlcj4sIG9mZnNldD86IG51bWJlciwgaXNXaGl0ZTogYm9vbGVhbiA9IGZhbHNlLCB0cnlIYXJkZXI6IGJvb2xlYW4gPSBmYWxzZSk6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICBjb25zdCBjb3VudGVyID0gbmV3IEFycmF5PG51bWJlcj4ocGF0dGVybi5sZW5ndGgpLmZpbGwoMCk7XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoOiBCYXJjb2RlUG9zaXRpb24gPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGVwc2lsb24gPSB0aGlzLkFWR19DT0RFX0VSUk9SO1xuXG4gICAgICAgIGlzV2hpdGUgPSBpc1doaXRlIHx8IGZhbHNlO1xuICAgICAgICB0cnlIYXJkZXIgPSB0cnlIYXJkZXIgfHwgZmFsc2U7XG5cbiAgICAgICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiAoaXNXaGl0ZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdW0gPSBjb3VudGVyLnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQsIDApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCBwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgZXBzaWxvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guc3RhcnQgPSBpIC0gc3VtO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cnlIYXJkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY291bnRlci5sZW5ndGggLSAyOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2pdID0gY291bnRlcltqICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXIubGVuZ3RoIC0gMl0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyLmxlbmd0aCAtIDFdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCk6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICBsZXQgbGVhZGluZ1doaXRlc3BhY2VTdGFydCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGxldCBzdGFydEluZm86IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgbmFycm93QmFyV2lkdGggPSAxO1xuXG4gICAgICAgIHdoaWxlICghc3RhcnRJbmZvKSB7XG4gICAgICAgICAgICBzdGFydEluZm8gPSB0aGlzLl9maW5kUGF0dGVybih0aGlzLlNUQVJUX1BBVFRFUk4sIG9mZnNldCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hcnJvd0JhcldpZHRoID0gTWF0aC5mbG9vcigoc3RhcnRJbmZvLmVuZCAtIHN0YXJ0SW5mby5zdGFydCkgLyA0KTtcbiAgICAgICAgICAgIGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPSBzdGFydEluZm8uc3RhcnQgLSBuYXJyb3dCYXJXaWR0aCAqIDEwO1xuICAgICAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQsIHN0YXJ0SW5mby5zdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0SW5mbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgPSBzdGFydEluZm8uZW5kO1xuICAgICAgICAgICAgc3RhcnRJbmZvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbzogQmFyY29kZVBvc2l0aW9uKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IGVuZEluZm8uZW5kICsgKChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMik7XG4gICAgICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShlbmRJbmZvLmVuZCwgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kLCAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmRJbmZvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRFbmQoKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG4gICAgICAgIGNvbnN0IGVuZEluZm8gPSB0aGlzLl9maW5kUGF0dGVybih0aGlzLlNUT1BfUEFUVEVSTik7XG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG5cbiAgICAgICAgaWYgKGVuZEluZm8gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV2ZXJzZSBudW1iZXJzXG4gICAgICAgIGNvbnN0IHRtcCA9IGVuZEluZm8uc3RhcnQ7XG4gICAgICAgIGVuZEluZm8uc3RhcnQgPSB0aGlzLl9yb3cubGVuZ3RoIC0gZW5kSW5mby5lbmQ7XG4gICAgICAgIGVuZEluZm8uZW5kID0gdGhpcy5fcm93Lmxlbmd0aCAtIHRtcDtcblxuICAgICAgICByZXR1cm4gZW5kSW5mbyAhPT0gbnVsbCA/IHRoaXMuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvKSA6IG51bGw7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfZGVjb2RlUGFpcihjb3VudGVyUGFpcjogQXJyYXk8QXJyYXk8bnVtYmVyPj4pOiBBcnJheTxCYXJjb2RlSW5mbz4gfCBudWxsIHtcbiAgICAgICAgY29uc3QgY29kZXM6IEFycmF5PEJhcmNvZGVJbmZvPiA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRlclBhaXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKGNvdW50ZXJQYWlyW2ldKTtcbiAgICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29kZXM7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfZGVjb2RlQ29kZShjb3VudGVyOiBBcnJheTxudW1iZXI+KTogQmFyY29kZUluZm8gfCBudWxsIHtcbiAgICAgICAgY29uc3QgZXBzaWxvbiA9IHRoaXMuQVZHX0NPREVfRVJST1I7XG5cbiAgICAgICAgY29uc3QgYmVzdE1hdGNoOiBCYXJjb2RlSW5mbyA9IHtcbiAgICAgICAgICAgIGVycm9yOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGxldCBjb2RlID0gMDsgY29kZSA8IHRoaXMuQ09ERV9QQVRURVJOLmxlbmd0aDsgY29kZSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCB0aGlzLkNPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgPCBiZXN0TWF0Y2guZXJyb3IhKSB7XG4gICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiZXN0TWF0Y2guZXJyb3IhIDwgZXBzaWxvbikge1xuICAgICAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzOiBSZWFkb25seUFycmF5PG51bWJlcj4sIHJlc3VsdDogQXJyYXk8c3RyaW5nPiwgZGVjb2RlZENvZGVzOiBBcnJheTxCYXJjb2RlSW5mbyB8IEJhcmNvZGVQb3NpdGlvbj4pOiBBcnJheTxCYXJjb2RlSW5mbz4gfCBudWxsIHtcbiAgICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICAgIGNvbnN0IGNvdW50ZXJMZW5ndGggPSBjb3VudGVycy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNvdW50ZXJQYWlyID0gW1swLCAwLCAwLCAwLCAwXSwgWzAsIDAsIDAsIDAsIDBdXTtcbiAgICAgICAgbGV0IGNvZGVzOiBCYXJjb2RlSW5mb1tdIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKHBvcyA8IGNvdW50ZXJMZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY291bnRlclBhaXJbMF1baV0gPSBjb3VudGVyc1twb3NdICogdGhpcy5iYXJTcGFjZVJhdGlvWzBdO1xuICAgICAgICAgICAgICAgIGNvdW50ZXJQYWlyWzFdW2ldID0gY291bnRlcnNbcG9zICsgMV0gKiB0aGlzLmJhclNwYWNlUmF0aW9bMV07XG4gICAgICAgICAgICAgICAgcG9zICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2RlcyA9IHRoaXMuX2RlY29kZVBhaXIoY291bnRlclBhaXIpO1xuICAgICAgICAgICAgaWYgKCFjb2Rlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGVzW2ldLmNvZGUgKyAnJyk7XG4gICAgICAgICAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2RlcztcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlDb3VudGVyTGVuZ3RoKGNvdW50ZXJzOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIHJldHVybiAoY291bnRlcnMubGVuZ3RoICUgMTAgPT09IDApO1xuICAgIH07XG5cbiAgICBwdWJsaWMgZGVjb2RlKHJvdz86IEFycmF5PG51bWJlcj4sIHN0YXJ0PzogQmFyY29kZVBvc2l0aW9uIHwgbnVtYmVyKTogQmFyY29kZSB8IG51bGwge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICAgICAgdmFyIGRlY29kZWRDb2RlcyA9IG5ldyBBcnJheTxCYXJjb2RlUG9zaXRpb24+KCk7XG5cbiAgICAgICAgY29uc3Qgc3RhcnRJbmZvID0gdGhpcy5fZmluZFN0YXJ0KCk7XG4gICAgICAgIGlmICghc3RhcnRJbmZvKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChzdGFydEluZm8pO1xuXG4gICAgICAgIGNvbnN0IGVuZEluZm8gPSB0aGlzLl9maW5kRW5kKCk7XG4gICAgICAgIGlmICghZW5kSW5mbykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3VudGVycyA9IHRoaXMuX2ZpbGxDb3VudGVycyhzdGFydEluZm8uZW5kLCBlbmRJbmZvLnN0YXJ0LCBmYWxzZSk7XG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5Q291bnRlckxlbmd0aChjb3VudGVycykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLl9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzLCByZXN1bHQsIGRlY29kZWRDb2Rlcyk7XG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggJSAyICE9PSAwIHx8XG4gICAgICAgICAgICAgICAgcmVzdWx0Lmxlbmd0aCA8IDYpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goZW5kSW5mbyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBzdGFydDogc3RhcnRJbmZvLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBlbmRJbmZvLmVuZCxcbiAgICAgICAgICAgIHN0YXJ0SW5mbzogc3RhcnRJbmZvLFxuICAgICAgICAgICAgZGVjb2RlZENvZGVzOiBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULFxuICAgICAgICB9O1xuICAgIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IEkyb2Y1UmVhZGVyO1xuIiwiaW1wb3J0IEVBTlJlYWRlciwgeyBDT0RFX0dfU1RBUlQgfSBmcm9tICcuL2Vhbl9yZWFkZXInO1xuaW1wb3J0IHsgQmFyY29kZVBvc2l0aW9uLCBCYXJjb2RlSW5mbyB9IGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuXG5jbGFzcyBVUENFUmVhZGVyIGV4dGVuZHMgRUFOUmVhZGVyIHtcbiAgICBDT0RFX0ZSRVFVRU5DWSA9IFtcbiAgICAgICAgWyA1NiwgNTIsIDUwLCA0OSwgNDQsIDM4LCAzNSwgNDIsIDQxLCAzNyBdLFxuICAgICAgICBbNywgMTEsIDEzLCAxNCwgMTksIDI1LCAyOCwgMjEsIDIyLCAyNl1dO1xuICAgIFNUT1BfUEFUVEVSTiA9IFsxIC8gNiAqIDcsIDEgLyA2ICogNywgMSAvIDYgKiA3LCAxIC8gNiAqIDcsIDEgLyA2ICogNywgMSAvIDYgKiA3XTtcbiAgICBGT1JNQVQgPSAndXBjX2UnO1xuICAgIHByb3RlY3RlZCBfZGVjb2RlUGF5bG9hZChpbkNvZGU6IEJhcmNvZGVQb3NpdGlvbiwgcmVzdWx0OiBBcnJheTxudW1iZXI+LCBkZWNvZGVkQ29kZXM6IEFycmF5PEJhcmNvZGVQb3NpdGlvbj4pOiBCYXJjb2RlSW5mbyB8IG51bGwge1xuICAgICAgICBsZXQgb3V0Q29kZTogQmFyY29kZUluZm8gfCBCYXJjb2RlUG9zaXRpb24gfCBudWxsID0geyAuLi5pbkNvZGUgfTtcbiAgICAgICAgbGV0IGNvZGVGcmVxdWVuY3kgPSAweDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIG91dENvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKG91dENvZGUuZW5kKTtcbiAgICAgICAgICAgIGlmICghb3V0Q29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChvdXRDb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlID49IENPREVfR19TVEFSVCkge1xuICAgICAgICAgICAgICAgIChvdXRDb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlID0gKG91dENvZGUgYXMgQmFyY29kZUluZm8pLmNvZGUgLSBDT0RFX0dfU1RBUlQ7XG4gICAgICAgICAgICAgICAgY29kZUZyZXF1ZW5jeSB8PSAoMSA8PCAoNSAtIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChvdXRDb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlKTtcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKG91dENvZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZGV0ZXJtaW5lUGFyaXR5KGNvZGVGcmVxdWVuY3ksIHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRDb2RlIGFzIEJhcmNvZGVJbmZvO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2RldGVybWluZVBhcml0eShjb2RlRnJlcXVlbmN5OiBudW1iZXIsIHJlc3VsdDogQXJyYXk8bnVtYmVyPikge1xuICAgICAgICBmb3IgKGxldCBuclN5c3RlbSA9IDA7IG5yU3lzdGVtIDwgdGhpcy5DT0RFX0ZSRVFVRU5DWS5sZW5ndGg7IG5yU3lzdGVtKyspe1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkNPREVfRlJFUVVFTkNZW25yU3lzdGVtXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb2RlRnJlcXVlbmN5ID09PSB0aGlzLkNPREVfRlJFUVVFTkNZW25yU3lzdGVtXVtpXSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudW5zaGlmdChuclN5c3RlbSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2NvbnZlcnRUb1VQQ0EocmVzdWx0OiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIGxldCB1cGNhID0gW3Jlc3VsdFswXV07XG4gICAgICAgIGNvbnN0IGxhc3REaWdpdCA9IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMl07XG5cbiAgICAgICAgaWYgKGxhc3REaWdpdCA8PSAyKSB7XG4gICAgICAgICAgICB1cGNhID0gdXBjYS5jb25jYXQocmVzdWx0LnNsaWNlKDEsIDMpKVxuICAgICAgICAgICAgICAgIC5jb25jYXQoW2xhc3REaWdpdCwgMCwgMCwgMCwgMF0pXG4gICAgICAgICAgICAgICAgLmNvbmNhdChyZXN1bHQuc2xpY2UoMywgNikpO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMykge1xuICAgICAgICAgICAgdXBjYSA9IHVwY2EuY29uY2F0KHJlc3VsdC5zbGljZSgxLCA0KSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KFswLCAwLCAwLCAwLCAwXSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KHJlc3VsdC5zbGljZSg0LCA2KSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSA0KSB7XG4gICAgICAgICAgICB1cGNhID0gdXBjYS5jb25jYXQocmVzdWx0LnNsaWNlKDEsIDUpKVxuICAgICAgICAgICAgICAgIC5jb25jYXQoWzAsIDAsIDAsIDAsIDAsIHJlc3VsdFs1XV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXBjYSA9IHVwY2EuY29uY2F0KHJlc3VsdC5zbGljZSgxLCA2KSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KFswLCAwLCAwLCAwLCBsYXN0RGlnaXRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwY2EucHVzaChyZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdKTtcbiAgICAgICAgcmV0dXJuIHVwY2E7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfY2hlY2tzdW0ocmVzdWx0OiBBcnJheTxudW1iZXI+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzdXBlci5fY2hlY2tzdW0odGhpcy5fY29udmVydFRvVVBDQShyZXN1bHQpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRFbmQob2Zmc2V0OiBudW1iZXIsIGlzV2hpdGU6IGJvb2xlYW4pOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLl9maW5kRW5kKG9mZnNldCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbzogQmFyY29kZVBvc2l0aW9uKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IGVuZEluZm8uZW5kICsgKChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMik7XG4gICAgICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShlbmRJbmZvLmVuZCwgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kLCAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmRJbmZvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVQQ0VSZWFkZXI7XG4iLCJpbXBvcnQgRUFOUmVhZGVyIGZyb20gJy4vZWFuX3JlYWRlcic7XG5pbXBvcnQgeyBCYXJjb2RlUG9zaXRpb24sIEJhcmNvZGUgfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcblxuY2xhc3MgVVBDUmVhZGVyIGV4dGVuZHMgRUFOUmVhZGVyIHtcbiAgICBGT1JNQVQgPSAndXBjX2EnO1xuICAgIGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IEJhcmNvZGVQb3NpdGlvbiB8IG51bWJlcik6IEJhcmNvZGUgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gRUFOUmVhZGVyLnByb3RvdHlwZS5kZWNvZGUuY2FsbCh0aGlzKTtcblxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5jb2RlICYmIHJlc3VsdC5jb2RlLmxlbmd0aCA9PT0gMTMgJiYgcmVzdWx0LmNvZGUuY2hhckF0KDApID09PSAnMCcpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb2RlID0gcmVzdWx0LmNvZGUuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVQQ1JlYWRlcjtcbiIsImNvbnN0IEJyZXNlbmhhbSA9IHt9O1xuXG5jb25zdCBTbG9wZSA9IHtcbiAgICBESVI6IHtcbiAgICAgICAgVVA6IDEsXG4gICAgICAgIERPV046IC0xLFxuICAgIH0sXG59O1xuLyoqXG4gKiBTY2FucyBhIGxpbmUgb2YgdGhlIGdpdmVuIGltYWdlIGZyb20gcG9pbnQgcDEgdG8gcDIgYW5kIHJldHVybnMgYSByZXN1bHQgb2JqZWN0IGNvbnRhaW5pbmdcbiAqIGdyYXktc2NhbGUgdmFsdWVzICgwLTI1NSkgb2YgdGhlIHVuZGVybHlpbmcgcGl4ZWxzIGluIGFkZGl0aW9uIHRvIHRoZSBtaW5cbiAqIGFuZCBtYXggdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IGltYWdlV3JhcHBlclxuICogQHBhcmFtIHtPYmplY3R9IHAxIFRoZSBzdGFydCBwb2ludCB7eCx5fVxuICogQHBhcmFtIHtPYmplY3R9IHAyIFRoZSBlbmQgcG9pbnQge3gseX1cbiAqIEByZXR1cm5zIHtsaW5lLCBtaW4sIG1heH1cbiAqL1xuQnJlc2VuaGFtLmdldEJhcmNvZGVMaW5lID0gZnVuY3Rpb24gKGltYWdlV3JhcHBlciwgcDEsIHAyKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuICAgIGxldCB4MCA9IHAxLnggfCAwO1xuICAgIGxldCB5MCA9IHAxLnkgfCAwO1xuICAgIGxldCB4MSA9IHAyLnggfCAwO1xuICAgIGxldCB5MSA9IHAyLnkgfCAwO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cbiAgICBjb25zdCBzdGVlcCA9IE1hdGguYWJzKHkxIC0geTApID4gTWF0aC5hYnMoeDEgLSB4MCk7XG4gICAgbGV0IGVycm9yO1xuICAgIGxldCB5O1xuICAgIGxldCB0bXA7XG4gICAgbGV0IHg7XG4gICAgY29uc3QgbGluZSA9IFtdO1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IHdpZHRoID0gaW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICBsZXQgdmFsO1xuICAgIGxldCBtaW4gPSAyNTU7XG4gICAgbGV0IG1heCA9IDA7XG5cbiAgICBmdW5jdGlvbiByZWFkKGEsIGIpIHtcbiAgICAgICAgdmFsID0gaW1hZ2VEYXRhW2IgKiB3aWR0aCArIGFdO1xuICAgICAgICBtaW4gPSB2YWwgPCBtaW4gPyB2YWwgOiBtaW47XG4gICAgICAgIG1heCA9IHZhbCA+IG1heCA/IHZhbCA6IG1heDtcbiAgICAgICAgbGluZS5wdXNoKHZhbCk7XG4gICAgfVxuXG4gICAgaWYgKHN0ZWVwKSB7XG4gICAgICAgIHRtcCA9IHgwO1xuICAgICAgICB4MCA9IHkwO1xuICAgICAgICB5MCA9IHRtcDtcblxuICAgICAgICB0bXAgPSB4MTtcbiAgICAgICAgeDEgPSB5MTtcbiAgICAgICAgeTEgPSB0bXA7XG4gICAgfVxuICAgIGlmICh4MCA+IHgxKSB7XG4gICAgICAgIHRtcCA9IHgwO1xuICAgICAgICB4MCA9IHgxO1xuICAgICAgICB4MSA9IHRtcDtcblxuICAgICAgICB0bXAgPSB5MDtcbiAgICAgICAgeTAgPSB5MTtcbiAgICAgICAgeTEgPSB0bXA7XG4gICAgfVxuICAgIGNvbnN0IGRlbHRhWCA9IHgxIC0geDA7XG4gICAgY29uc3QgZGVsdGFZID0gTWF0aC5hYnMoeTEgLSB5MCk7XG4gICAgZXJyb3IgPSAoZGVsdGFYIC8gMikgfCAwO1xuICAgIHkgPSB5MDtcbiAgICBjb25zdCB5U3RlcCA9IHkwIDwgeTEgPyAxIDogLTE7XG4gICAgZm9yICh4ID0geDA7IHggPCB4MTsgeCsrKSB7XG4gICAgICAgIGlmIChzdGVlcCkge1xuICAgICAgICAgICAgcmVhZCh5LCB4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlYWQoeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3IgLT0gZGVsdGFZO1xuICAgICAgICBpZiAoZXJyb3IgPCAwKSB7XG4gICAgICAgICAgICB5ICs9IHlTdGVwO1xuICAgICAgICAgICAgZXJyb3IgKz0gZGVsdGFYO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGluZSxcbiAgICAgICAgbWluLFxuICAgICAgICBtYXgsXG4gICAgfTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhlIHJlc3VsdCBmcm9tIGdldEJhcmNvZGVMaW5lIGludG8gYSBiaW5hcnkgcmVwcmVzZW50YXRpb25cbiAqIGFsc28gY29uc2lkZXJpbmcgdGhlIGZyZXF1ZW5jeSBhbmQgc2xvcGUgb2YgdGhlIHNpZ25hbCBmb3IgbW9yZSByb2J1c3QgcmVzdWx0c1xuICogQHBhcmFtIHtPYmplY3R9IHJlc3VsdCB7bGluZSwgbWluLCBtYXh9XG4gKi9cbkJyZXNlbmhhbS50b0JpbmFyeUxpbmUgPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgY29uc3QgeyBtaW4gfSA9IHJlc3VsdDtcbiAgICBjb25zdCB7IG1heCB9ID0gcmVzdWx0O1xuICAgIGNvbnN0IHsgbGluZSB9ID0gcmVzdWx0O1xuICAgIGxldCBzbG9wZTtcbiAgICBsZXQgc2xvcGUyO1xuICAgIGNvbnN0IGNlbnRlciA9IG1pbiArIChtYXggLSBtaW4pIC8gMjtcbiAgICBjb25zdCBleHRyZW1hID0gW107XG4gICAgbGV0IGN1cnJlbnREaXI7XG4gICAgbGV0IGRpcjtcbiAgICBsZXQgdGhyZXNob2xkID0gKG1heCAtIG1pbikgLyAxMjtcbiAgICBjb25zdCByVGhyZXNob2xkID0gLXRocmVzaG9sZDtcbiAgICBsZXQgaTtcbiAgICBsZXQgajtcblxuICAgIC8vIDEuIGZpbmQgZXh0cmVtYVxuICAgIGN1cnJlbnREaXIgPSBsaW5lWzBdID4gY2VudGVyID8gU2xvcGUuRElSLlVQIDogU2xvcGUuRElSLkRPV047XG4gICAgZXh0cmVtYS5wdXNoKHtcbiAgICAgICAgcG9zOiAwLFxuICAgICAgICB2YWw6IGxpbmVbMF0sXG4gICAgfSk7XG4gICAgZm9yIChpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgIHNsb3BlID0gKGxpbmVbaSArIDFdIC0gbGluZVtpXSk7XG4gICAgICAgIHNsb3BlMiA9IChsaW5lW2kgKyAyXSAtIGxpbmVbaSArIDFdKTtcbiAgICAgICAgaWYgKChzbG9wZSArIHNsb3BlMikgPCByVGhyZXNob2xkICYmIGxpbmVbaSArIDFdIDwgKGNlbnRlciAqIDEuNSkpIHtcbiAgICAgICAgICAgIGRpciA9IFNsb3BlLkRJUi5ET1dOO1xuICAgICAgICB9IGVsc2UgaWYgKChzbG9wZSArIHNsb3BlMikgPiB0aHJlc2hvbGQgJiYgbGluZVtpICsgMV0gPiAoY2VudGVyICogMC41KSkge1xuICAgICAgICAgICAgZGlyID0gU2xvcGUuRElSLlVQO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGlyID0gY3VycmVudERpcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50RGlyICE9PSBkaXIpIHtcbiAgICAgICAgICAgIGV4dHJlbWEucHVzaCh7XG4gICAgICAgICAgICAgICAgcG9zOiBpLFxuICAgICAgICAgICAgICAgIHZhbDogbGluZVtpXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3VycmVudERpciA9IGRpcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBleHRyZW1hLnB1c2goe1xuICAgICAgICBwb3M6IGxpbmUubGVuZ3RoLFxuICAgICAgICB2YWw6IGxpbmVbbGluZS5sZW5ndGggLSAxXSxcbiAgICB9KTtcblxuICAgIGZvciAoaiA9IGV4dHJlbWFbMF0ucG9zOyBqIDwgZXh0cmVtYVsxXS5wb3M7IGorKykge1xuICAgICAgICBsaW5lW2pdID0gbGluZVtqXSA+IGNlbnRlciA/IDAgOiAxO1xuICAgIH1cblxuICAgIC8vIGl0ZXJhdGUgb3ZlciBleHRyZW1hIGFuZCBjb252ZXJ0IHRvIGJpbmFyeSBiYXNlZCBvbiBhdmcgYmV0d2VlbiBtaW5tYXhcbiAgICBmb3IgKGkgPSAxOyBpIDwgZXh0cmVtYS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgaWYgKGV4dHJlbWFbaSArIDFdLnZhbCA+IGV4dHJlbWFbaV0udmFsKSB7XG4gICAgICAgICAgICB0aHJlc2hvbGQgPSAoZXh0cmVtYVtpXS52YWwgKyAoKGV4dHJlbWFbaSArIDFdLnZhbCAtIGV4dHJlbWFbaV0udmFsKSAvIDMpICogMikgfCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyZXNob2xkID0gKGV4dHJlbWFbaSArIDFdLnZhbCArICgoZXh0cmVtYVtpXS52YWwgLSBleHRyZW1hW2kgKyAxXS52YWwpIC8gMykpIHwgMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaiA9IGV4dHJlbWFbaV0ucG9zOyBqIDwgZXh0cmVtYVtpICsgMV0ucG9zOyBqKyspIHtcbiAgICAgICAgICAgIGxpbmVbal0gPSBsaW5lW2pdID4gdGhyZXNob2xkID8gMCA6IDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsaW5lLFxuICAgICAgICB0aHJlc2hvbGQsXG4gICAgfTtcbn07XG5cbi8qKlxuICogVXNlZCBmb3IgZGV2ZWxvcG1lbnQgb25seVxuICovXG5CcmVzZW5oYW0uZGVidWcgPSB7XG4gICAgcHJpbnRGcmVxdWVuY3kobGluZSwgY2FudmFzKSB7XG4gICAgICAgIGxldCBpO1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGxpbmUubGVuZ3RoO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgY2FudmFzLmhlaWdodCA9IDI1NjtcblxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICdibHVlJztcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oaSwgMjU1KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oaSwgMjU1IC0gbGluZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgfSxcblxuICAgIHByaW50UGF0dGVybihsaW5lLCBjYW52YXMpIHtcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7IGxldFxuICAgICAgICAgICAgaTtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgY2FudmFzLndpZHRoID0gbGluZS5sZW5ndGg7XG4gICAgICAgIGN0eC5maWxsQ29sb3IgPSAnYmxhY2snO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGxpbmVbaV0gPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoaSwgMCwgMSwgMTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBCcmVzZW5oYW07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tY3ljbGUgKi9cblxuaW1wb3J0IEltYWdlRGVidWcgZnJvbSAnLi4vY29tbW9uL2ltYWdlX2RlYnVnJztcbmltcG9ydCBUd29PZkZpdmVSZWFkZXIgZnJvbSAnLi4vcmVhZGVyLzJvZjVfcmVhZGVyJztcbmltcG9ydCBDb2RhYmFyUmVhZGVyIGZyb20gJy4uL3JlYWRlci9jb2RhYmFyX3JlYWRlcic7XG5pbXBvcnQgQ29kZTEyOFJlYWRlciBmcm9tICcuLi9yZWFkZXIvY29kZV8xMjhfcmVhZGVyJztcbmltcG9ydCBDb2RlMzJSZWFkZXIgZnJvbSAnLi4vcmVhZGVyL2NvZGVfMzJfcmVhZGVyJztcbmltcG9ydCBDb2RlMzlSZWFkZXIgZnJvbSAnLi4vcmVhZGVyL2NvZGVfMzlfcmVhZGVyJztcbmltcG9ydCBDb2RlMzlWSU5SZWFkZXIgZnJvbSAnLi4vcmVhZGVyL2NvZGVfMzlfdmluX3JlYWRlcic7XG5pbXBvcnQgQ29kZTkzUmVhZGVyIGZyb20gJy4uL3JlYWRlci9jb2RlXzkzX3JlYWRlcic7XG5pbXBvcnQgRUFOMlJlYWRlciBmcm9tICcuLi9yZWFkZXIvZWFuXzJfcmVhZGVyJztcbmltcG9ydCBFQU41UmVhZGVyIGZyb20gJy4uL3JlYWRlci9lYW5fNV9yZWFkZXInO1xuaW1wb3J0IEVBTjhSZWFkZXIgZnJvbSAnLi4vcmVhZGVyL2Vhbl84X3JlYWRlcic7XG5pbXBvcnQgRUFOUmVhZGVyIGZyb20gJy4uL3JlYWRlci9lYW5fcmVhZGVyJztcbmltcG9ydCBJMm9mNVJlYWRlciBmcm9tICcuLi9yZWFkZXIvaTJvZjVfcmVhZGVyJztcbmltcG9ydCBVUENFUmVhZGVyIGZyb20gJy4uL3JlYWRlci91cGNfZV9yZWFkZXInO1xuaW1wb3J0IFVQQ1JlYWRlciBmcm9tICcuLi9yZWFkZXIvdXBjX3JlYWRlcic7XG5pbXBvcnQgQnJlc2VuaGFtIGZyb20gJy4vYnJlc2VuaGFtJztcblxuY29uc3QgUkVBREVSUyA9IHtcbiAgICBjb2RlXzEyOF9yZWFkZXI6IENvZGUxMjhSZWFkZXIsXG4gICAgZWFuX3JlYWRlcjogRUFOUmVhZGVyLFxuICAgIGVhbl81X3JlYWRlcjogRUFONVJlYWRlcixcbiAgICBlYW5fMl9yZWFkZXI6IEVBTjJSZWFkZXIsXG4gICAgZWFuXzhfcmVhZGVyOiBFQU44UmVhZGVyLFxuICAgIGNvZGVfMzlfcmVhZGVyOiBDb2RlMzlSZWFkZXIsXG4gICAgY29kZV8zOV92aW5fcmVhZGVyOiBDb2RlMzlWSU5SZWFkZXIsXG4gICAgY29kYWJhcl9yZWFkZXI6IENvZGFiYXJSZWFkZXIsXG4gICAgdXBjX3JlYWRlcjogVVBDUmVhZGVyLFxuICAgIHVwY19lX3JlYWRlcjogVVBDRVJlYWRlcixcbiAgICBpMm9mNV9yZWFkZXI6IEkyb2Y1UmVhZGVyLFxuICAgICcyb2Y1X3JlYWRlcic6IFR3b09mRml2ZVJlYWRlcixcbiAgICBjb2RlXzkzX3JlYWRlcjogQ29kZTkzUmVhZGVyLFxuICAgIGNvZGVfMzJfcmVhZGVyOiBDb2RlMzJSZWFkZXIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgcmVnaXN0ZXJSZWFkZXI6IChuYW1lLCByZWFkZXIpID0+IHtcbiAgICAgICAgUkVBREVSU1tuYW1lXSA9IHJlYWRlcjtcbiAgICB9LFxuICAgIGNyZWF0ZShjb25maWcsIGlucHV0SW1hZ2VXcmFwcGVyKSB7XG4gICAgICAgIGNvbnN0IF9jYW52YXMgPSB7XG4gICAgICAgICAgICBjdHg6IHtcbiAgICAgICAgICAgICAgICBmcmVxdWVuY3k6IG51bGwsXG4gICAgICAgICAgICAgICAgcGF0dGVybjogbnVsbCxcbiAgICAgICAgICAgICAgICBvdmVybGF5OiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRvbToge1xuICAgICAgICAgICAgICAgIGZyZXF1ZW5jeTogbnVsbCxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuOiBudWxsLFxuICAgICAgICAgICAgICAgIG92ZXJsYXk6IG51bGwsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBfYmFyY29kZVJlYWRlcnMgPSBbXTtcblxuICAgICAgICBpbml0Q2FudmFzKCk7XG4gICAgICAgIGluaXRSZWFkZXJzKCk7XG4gICAgICAgIGluaXRDb25maWcoKTtcblxuICAgICAgICBmdW5jdGlvbiBpbml0Q2FudmFzKCkge1xuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgJGRlYnVnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RlYnVnLmRldGVjdGlvbicpO1xuICAgICAgICAgICAgICAgIF9jYW52YXMuZG9tLmZyZXF1ZW5jeSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NhbnZhcy5mcmVxdWVuY3knKTtcbiAgICAgICAgICAgICAgICBpZiAoIV9jYW52YXMuZG9tLmZyZXF1ZW5jeSkge1xuICAgICAgICAgICAgICAgICAgICBfY2FudmFzLmRvbS5mcmVxdWVuY3kgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgICAgICAgICAgX2NhbnZhcy5kb20uZnJlcXVlbmN5LmNsYXNzTmFtZSA9ICdmcmVxdWVuY3knO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkZGVidWcuYXBwZW5kQ2hpbGQoX2NhbnZhcy5kb20uZnJlcXVlbmN5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJyogYmFyY29kZSBkZWNvZGVyIGluaXRDYW52YXMgZ2V0Y29udGV4dCAyZCcpO1xuICAgICAgICAgICAgICAgIF9jYW52YXMuY3R4LmZyZXF1ZW5jeSA9IF9jYW52YXMuZG9tLmZyZXF1ZW5jeS5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgICAgICAgICAgICAgX2NhbnZhcy5kb20ucGF0dGVybiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NhbnZhcy5wYXR0ZXJuQnVmZmVyJyk7XG4gICAgICAgICAgICAgICAgaWYgKCFfY2FudmFzLmRvbS5wYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgICAgIF9jYW52YXMuZG9tLnBhdHRlcm4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgICAgICAgICAgX2NhbnZhcy5kb20ucGF0dGVybi5jbGFzc05hbWUgPSAncGF0dGVybkJ1ZmZlcic7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkZGVidWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRkZWJ1Zy5hcHBlbmRDaGlsZChfY2FudmFzLmRvbS5wYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfY2FudmFzLmN0eC5wYXR0ZXJuID0gX2NhbnZhcy5kb20ucGF0dGVybi5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgICAgICAgICAgICAgX2NhbnZhcy5kb20ub3ZlcmxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NhbnZhcy5kcmF3aW5nQnVmZmVyJyk7XG4gICAgICAgICAgICAgICAgaWYgKF9jYW52YXMuZG9tLm92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgX2NhbnZhcy5jdHgub3ZlcmxheSA9IF9jYW52YXMuZG9tLm92ZXJsYXkuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpbml0UmVhZGVycygpIHtcbiAgICAgICAgICAgIGNvbmZpZy5yZWFkZXJzLmZvckVhY2goKHJlYWRlckNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICAgIGxldCByZWFkZXI7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZ3VyYXRpb24gPSB7fTtcbiAgICAgICAgICAgICAgICBsZXQgc3VwcGxlbWVudHMgPSBbXTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhZGVyQ29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICByZWFkZXIgPSByZWFkZXJDb25maWcuZm9ybWF0O1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uID0gcmVhZGVyQ29uZmlnLmNvbmZpZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWFkZXJDb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IHJlYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQmVmb3JlIHJlZ2lzdGVyaW5nIHJlYWRlcjogJywgcmVhZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uc3VwcGxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VwcGxlbWVudHMgPSBjb25maWd1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3VwcGxlbWVudHMubWFwKChzdXBwbGVtZW50KSA9PiBuZXcgUkVBREVSU1tzdXBwbGVtZW50XSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZGVyT2JqID0gbmV3IFJFQURFUlNbcmVhZGVyXShjb25maWd1cmF0aW9uLCBzdXBwbGVtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIF9iYXJjb2RlUmVhZGVycy5wdXNoKHJlYWRlck9iaik7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJyogRXJyb3IgY29uc3RydWN0aW5nIHJlYWRlciAnLCByZWFkZXIsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVnaXN0ZXJlZCBSZWFkZXJzOiAke19iYXJjb2RlUmVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChyZWFkZXIpID0+IEpTT04uc3RyaW5naWZ5KHsgZm9ybWF0OiByZWFkZXIuRk9STUFULCBjb25maWc6IHJlYWRlci5jb25maWcgfSkpXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdENvbmZpZygpIHtcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGxldCBpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpcyA9IFt7XG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IF9jYW52YXMuZG9tLmZyZXF1ZW5jeSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogY29uZmlnLmRlYnVnLnNob3dGcmVxdWVuY3ksXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBub2RlOiBfY2FudmFzLmRvbS5wYXR0ZXJuLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiBjb25maWcuZGVidWcuc2hvd1BhdHRlcm4sXG4gICAgICAgICAgICAgICAgfV07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aXNbaV0ucHJvcCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlzW2ldLm5vZGUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNbaV0ubm9kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGV4dGVuZCB0aGUgbGluZSBvbiBib3RoIGVuZHNcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gbGluZVxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gYW5nbGVcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldEV4dGVuZGVkTGluZShsaW5lLCBhbmdsZSwgZXh0KSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBleHRlbmRMaW5lKGFtb3VudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgeTogYW1vdW50ICogTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgICAgICAgICB4OiBhbW91bnQgKiBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgICAgICAgICAgICAgIGxpbmVbMF0ueSAtPSBleHRlbnNpb24ueTtcbiAgICAgICAgICAgICAgICBsaW5lWzBdLnggLT0gZXh0ZW5zaW9uLng7XG4gICAgICAgICAgICAgICAgbGluZVsxXS55ICs9IGV4dGVuc2lvbi55O1xuICAgICAgICAgICAgICAgIGxpbmVbMV0ueCArPSBleHRlbnNpb24ueDtcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGluc2lkZSBpbWFnZVxuICAgICAgICAgICAgZXh0ZW5kTGluZShleHQpO1xuICAgICAgICAgICAgd2hpbGUgKGV4dCA+IDEgJiYgKCFpbnB1dEltYWdlV3JhcHBlci5pbkltYWdlV2l0aEJvcmRlcihsaW5lWzBdKVxuICAgICAgICAgICAgICAgICAgICB8fCAhaW5wdXRJbWFnZVdyYXBwZXIuaW5JbWFnZVdpdGhCb3JkZXIobGluZVsxXSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgZXh0IC09IE1hdGguY2VpbChleHQgLyAyKTtcbiAgICAgICAgICAgICAgICBleHRlbmRMaW5lKC1leHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBnZXRMaW5lKGJveCkge1xuICAgICAgICAgICAgcmV0dXJuIFt7XG4gICAgICAgICAgICAgICAgeDogKGJveFsxXVswXSAtIGJveFswXVswXSkgLyAyICsgYm94WzBdWzBdLFxuICAgICAgICAgICAgICAgIHk6IChib3hbMV1bMV0gLSBib3hbMF1bMV0pIC8gMiArIGJveFswXVsxXSxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB4OiAoYm94WzNdWzBdIC0gYm94WzJdWzBdKSAvIDIgKyBib3hbMl1bMF0sXG4gICAgICAgICAgICAgICAgeTogKGJveFszXVsxXSAtIGJveFsyXVsxXSkgLyAyICsgYm94WzJdWzFdLFxuICAgICAgICAgICAgfV07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB0cnlEZWNvZGUobGluZSkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgaTtcbiAgICAgICAgICAgIGNvbnN0IGJhcmNvZGVMaW5lID0gQnJlc2VuaGFtLmdldEJhcmNvZGVMaW5lKGlucHV0SW1hZ2VXcmFwcGVyLCBsaW5lWzBdLCBsaW5lWzFdKTtcblxuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBjb25maWcuZGVidWcuc2hvd0ZyZXF1ZW5jeSkge1xuICAgICAgICAgICAgICAgIEltYWdlRGVidWcuZHJhd1BhdGgobGluZSwgeyB4OiAneCcsIHk6ICd5JyB9LCBfY2FudmFzLmN0eC5vdmVybGF5LCB7IGNvbG9yOiAncmVkJywgbGluZVdpZHRoOiAzIH0pO1xuICAgICAgICAgICAgICAgIEJyZXNlbmhhbS5kZWJ1Zy5wcmludEZyZXF1ZW5jeShiYXJjb2RlTGluZS5saW5lLCBfY2FudmFzLmRvbS5mcmVxdWVuY3kpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBCcmVzZW5oYW0udG9CaW5hcnlMaW5lKGJhcmNvZGVMaW5lKTtcblxuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBjb25maWcuZGVidWcuc2hvd1BhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBCcmVzZW5oYW0uZGVidWcucHJpbnRQYXR0ZXJuKGJhcmNvZGVMaW5lLmxpbmUsIF9jYW52YXMuZG9tLnBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgX2JhcmNvZGVSZWFkZXJzLmxlbmd0aCAmJiByZXN1bHQgPT09IG51bGw7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9iYXJjb2RlUmVhZGVyc1tpXS5kZWNvZGVQYXR0ZXJuKGJhcmNvZGVMaW5lLmxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb2RlUmVzdWx0OiByZXN1bHQsXG4gICAgICAgICAgICAgICAgYmFyY29kZUxpbmUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHNsaWNlcyB0aGUgZ2l2ZW4gYXJlYSBhcGFydCBhbmQgdHJpZXMgdG8gZGV0ZWN0IGEgYmFyY29kZS1wYXR0ZXJuXG4gICAgICAgICAqIGZvciBlYWNoIHNsaWNlLiBJdCByZXR1cm5zIHRoZSBkZWNvZGVkIGJhcmNvZGUsIG9yIG51bGwgaWYgbm90aGluZyB3YXMgZm91bmRcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYm94XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGxpbmVcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGxpbmVBbmdsZVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gdHJ5RGVjb2RlQnJ1dGVGb3JjZShib3gsIGxpbmUsIGxpbmVBbmdsZSkge1xuICAgICAgICAgICAgY29uc3Qgc2lkZUxlbmd0aCA9IE1hdGguc3FydChNYXRoLnBvdyhib3hbMV1bMF0gLSBib3hbMF1bMF0sIDIpICsgTWF0aC5wb3coKGJveFsxXVsxXSAtIGJveFswXVsxXSksIDIpKTtcbiAgICAgICAgICAgIGxldCBpO1xuICAgICAgICAgICAgY29uc3Qgc2xpY2VzID0gMTY7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBkaXI7XG4gICAgICAgICAgICBsZXQgZXh0ZW5zaW9uO1xuICAgICAgICAgICAgY29uc3QgeGRpciA9IE1hdGguc2luKGxpbmVBbmdsZSk7XG4gICAgICAgICAgICBjb25zdCB5ZGlyID0gTWF0aC5jb3MobGluZUFuZ2xlKTtcblxuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHNsaWNlcyAmJiByZXN1bHQgPT09IG51bGw7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIG1vdmUgbGluZSBwZXJwZW5kaWN1bGFyIHRvIGFuZ2xlXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1peGVkLW9wZXJhdG9yc1xuICAgICAgICAgICAgICAgIGRpciA9IHNpZGVMZW5ndGggLyBzbGljZXMgKiBpICogKGkgJSAyID09PSAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgICAgICBleHRlbnNpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIHk6IGRpciAqIHhkaXIsXG4gICAgICAgICAgICAgICAgICAgIHg6IGRpciAqIHlkaXIsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgICAgICAgICAgICAgIGxpbmVbMF0ueSArPSBleHRlbnNpb24ueDtcbiAgICAgICAgICAgICAgICBsaW5lWzBdLnggLT0gZXh0ZW5zaW9uLnk7XG4gICAgICAgICAgICAgICAgbGluZVsxXS55ICs9IGV4dGVuc2lvbi54O1xuICAgICAgICAgICAgICAgIGxpbmVbMV0ueCAtPSBleHRlbnNpb24ueTtcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5cbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnlEZWNvZGUobGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0TGluZUxlbmd0aChsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KFxuICAgICAgICAgICAgICAgIE1hdGgucG93KE1hdGguYWJzKGxpbmVbMV0ueSAtIGxpbmVbMF0ueSksIDIpXG4gICAgICAgICAgICAgICAgKyBNYXRoLnBvdyhNYXRoLmFicyhsaW5lWzFdLnggLSBsaW5lWzBdLngpLCAyKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBhc3luYyBmdW5jdGlvbiBkZWNvZGVGcm9tSW1hZ2UoaW1hZ2VXcmFwcGVyKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIF9iYXJjb2RlUmVhZGVycykge1xuICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZGVjb2RlSW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLmRlY29kZUltYWdlKGltYWdlV3JhcHBlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2l0aCB0aGUgaGVscCBvZiB0aGUgY29uZmlndXJlZCByZWFkZXJzIChDb2RlMTI4IG9yIEVBTikgdGhpcyBmdW5jdGlvbiB0cmllcyB0byBkZXRlY3QgYVxuICAgICAgICAgKiB2YWxpZCBiYXJjb2RlIHBhdHRlcm4gd2l0aGluIHRoZSBnaXZlbiBhcmVhLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYm94IFRoZSBhcmVhIHRvIHNlYXJjaCBpblxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB0aGUgcmVzdWx0IHtjb2RlUmVzdWx0LCBsaW5lLCBhbmdsZSwgcGF0dGVybiwgdGhyZXNob2xkfVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVjb2RlRnJvbUJvdW5kaW5nQm94KGJveCkge1xuICAgICAgICAgICAgbGV0IGxpbmU7XG4gICAgICAgICAgICBjb25zdCBjdHggPSBfY2FudmFzLmN0eC5vdmVybGF5O1xuICAgICAgICAgICAgbGV0IHJlc3VsdDtcblxuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcuZGVidWcuZHJhd0JvdW5kaW5nQm94ICYmIGN0eCkge1xuICAgICAgICAgICAgICAgICAgICBJbWFnZURlYnVnLmRyYXdQYXRoKGJveCwgeyB4OiAwLCB5OiAxIH0sIGN0eCwgeyBjb2xvcjogJ2JsdWUnLCBsaW5lV2lkdGg6IDIgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lID0gZ2V0TGluZShib3gpO1xuICAgICAgICAgICAgY29uc3QgbGluZUxlbmd0aCA9IGdldExpbmVMZW5ndGgobGluZSk7XG4gICAgICAgICAgICBjb25zdCBsaW5lQW5nbGUgPSBNYXRoLmF0YW4yKGxpbmVbMV0ueSAtIGxpbmVbMF0ueSwgbGluZVsxXS54IC0gbGluZVswXS54KTtcbiAgICAgICAgICAgIGxpbmUgPSBnZXRFeHRlbmRlZExpbmUobGluZSwgbGluZUFuZ2xlLCBNYXRoLmZsb29yKGxpbmVMZW5ndGggKiAwLjEpKTtcbiAgICAgICAgICAgIGlmIChsaW5lID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IHRyeURlY29kZShsaW5lKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnlEZWNvZGVCcnV0ZUZvcmNlKGJveCwgbGluZSwgbGluZUFuZ2xlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoRU5WLmRldmVsb3BtZW50ICYmIHJlc3VsdCAmJiBjb25maWcuZGVidWcuZHJhd1NjYW5saW5lICYmIGN0eCkge1xuICAgICAgICAgICAgICAgIEltYWdlRGVidWcuZHJhd1BhdGgobGluZSwgeyB4OiAneCcsIHk6ICd5JyB9LCBjdHgsIHsgY29sb3I6ICdyZWQnLCBsaW5lV2lkdGg6IDMgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29kZVJlc3VsdDogcmVzdWx0LmNvZGVSZXN1bHQsXG4gICAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgICBhbmdsZTogbGluZUFuZ2xlLFxuICAgICAgICAgICAgICAgIHBhdHRlcm46IHJlc3VsdC5iYXJjb2RlTGluZS5saW5lLFxuICAgICAgICAgICAgICAgIHRocmVzaG9sZDogcmVzdWx0LmJhcmNvZGVMaW5lLnRocmVzaG9sZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVjb2RlRnJvbUJvdW5kaW5nQm94KGJveCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVGcm9tQm91bmRpbmdCb3goYm94KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWNvZGVGcm9tQm91bmRpbmdCb3hlcyhib3hlcykge1xuICAgICAgICAgICAgICAgIGxldCBpOyBsZXQgcmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhcmNvZGVzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgeyBtdWx0aXBsZSB9ID0gY29uZmlnO1xuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJveGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJveCA9IGJveGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWNvZGVGcm9tQm91bmRpbmdCb3goYm94KSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJveCA9IGJveDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcmNvZGVzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuY29kZVJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGJhcmNvZGVzLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgZGVjb2RlRnJvbUltYWdlKGltYWdlV3JhcHBlckluKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVjb2RlRnJvbUltYWdlKGltYWdlV3JhcHBlckluKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlZ2lzdGVyUmVhZGVyKG5hbWUsIHJlYWRlcikge1xuICAgICAgICAgICAgICAgIGlmIChSRUFERVJTW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHJlZ2lzdGVyIGV4aXN0aW5nIHJlYWRlcicsIG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBSRUFERVJTW25hbWVdID0gcmVhZGVyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldFJlYWRlcnMocmVhZGVycykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGNvbmZpZy5yZWFkZXJzID0gcmVhZGVycztcbiAgICAgICAgICAgICAgICBfYmFyY29kZVJlYWRlcnMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICBpbml0UmVhZGVycygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9LFxufTtcbiIsImltcG9ydCBCYXJjb2RlUmVhZGVyIGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuaW1wb3J0IFR3b09mRml2ZVJlYWRlciBmcm9tICcuLzJvZjVfcmVhZGVyJztcbmltcG9ydCBOZXdDb2RhYmFyUmVhZGVyIGZyb20gJy4vY29kYWJhcl9yZWFkZXInO1xuaW1wb3J0IENvZGUxMjhSZWFkZXIgZnJvbSAnLi9jb2RlXzEyOF9yZWFkZXInO1xuaW1wb3J0IENvZGUzMlJlYWRlciBmcm9tICcuL2NvZGVfMzJfcmVhZGVyJztcbmltcG9ydCBDb2RlMzlSZWFkZXIgZnJvbSAnLi9jb2RlXzM5X3JlYWRlcic7XG5pbXBvcnQgQ29kZTM5VklOUmVhZGVyIGZyb20gJy4vY29kZV8zOV92aW5fcmVhZGVyJztcbmltcG9ydCBDb2RlOTNSZWFkZXIgZnJvbSAnLi9jb2RlXzkzX3JlYWRlcic7XG5pbXBvcnQgRUFOMlJlYWRlciBmcm9tICcuL2Vhbl8yX3JlYWRlcic7XG5pbXBvcnQgRUFONVJlYWRlciBmcm9tICcuL2Vhbl81X3JlYWRlcic7XG5pbXBvcnQgRUFOOFJlYWRlciBmcm9tICcuL2Vhbl84X3JlYWRlcic7XG5pbXBvcnQgRUFOUmVhZGVyIGZyb20gJy4vZWFuX3JlYWRlcic7XG5pbXBvcnQgSTJvZjVSZWFkZXIgZnJvbSAnLi9pMm9mNV9yZWFkZXInO1xuaW1wb3J0IFVQQ0VSZWFkZXIgZnJvbSAnLi91cGNfZV9yZWFkZXInO1xuaW1wb3J0IFVQQ1JlYWRlciBmcm9tICcuL3VwY19yZWFkZXInO1xuXG5leHBvcnQge1xuICAgIEJhcmNvZGVSZWFkZXIsXG4gICAgVHdvT2ZGaXZlUmVhZGVyLFxuICAgIE5ld0NvZGFiYXJSZWFkZXIsXG4gICAgQ29kZTEyOFJlYWRlcixcbiAgICBDb2RlMzJSZWFkZXIsXG4gICAgQ29kZTM5UmVhZGVyLFxuICAgIENvZGUzOVZJTlJlYWRlcixcbiAgICBDb2RlOTNSZWFkZXIsXG4gICAgRUFOMlJlYWRlcixcbiAgICBFQU41UmVhZGVyLFxuICAgIEVBTjhSZWFkZXIsXG4gICAgRUFOUmVhZGVyLFxuICAgIEkyb2Y1UmVhZGVyLFxuICAgIFVQQ0VSZWFkZXIsXG4gICAgVVBDUmVhZGVyLCAgICBcbn1cbiIsInR5cGUgRXZlbnROYW1lID0gc3RyaW5nO1xuXG5pbnRlcmZhY2UgU3Vic2NyaXB0aW9uIHtcbiAgICBhc3luYz86IGJvb2xlYW47XG4gICAgY2FsbGJhY2s6IEZ1bmN0aW9uO1xuICAgIG9uY2U/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRXZlbnREYXRhIHtcbiAgICBzdWJzY3JpYmVyczogQXJyYXk8U3Vic2NyaXB0aW9uPjtcbn1cblxuaW50ZXJmYWNlIEV2ZW50cyB7XG4gICAgW2tleTogc3RyaW5nXTogRXZlbnREYXRhO1xufVxuXG5pbnRlcmZhY2UgRXZlbnRJbnRlcmZhY2Uge1xuICAgIHN1YnNjcmliZShldmVudDogRXZlbnROYW1lLCBjYWxsYmFjazogRnVuY3Rpb24gfCBTdWJzY3JpcHRpb24sIGFzeW5jPzogYm9vbGVhbik6IHZvaWQ7XG4gICAgcHVibGlzaChldmVudE5hbWU6IEV2ZW50TmFtZSwgZGF0YT86IG5ldmVyKTogdm9pZDtcbiAgICBvbmNlKGV2ZW50OiBFdmVudE5hbWUsIGNhbGxiYWNrOiBGdW5jdGlvbiwgYXN5bmM/OiBib29sZWFuKTogdm9pZDtcbiAgICB1bnN1YnNjcmliZShldmVudE5hbWU/OiBFdmVudE5hbWUsIGNhbGxiYWNrPzogRnVuY3Rpb24gfCBTdWJzY3JpcHRpb24pOiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gRXZlbnRJbnRlcmZhY2UoKTogRXZlbnRJbnRlcmZhY2Uge1xuICAgIGxldCBldmVudHM6IEV2ZW50cyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gZ2V0RXZlbnQoZXZlbnROYW1lOiBFdmVudE5hbWUpOiBFdmVudERhdGEge1xuICAgICAgICBpZiAoIWV2ZW50c1tldmVudE5hbWVdKSB7XG4gICAgICAgICAgICBldmVudHNbZXZlbnROYW1lXSA9IHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyczogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBldmVudHNbZXZlbnROYW1lXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckV2ZW50cygpOiB2b2lkIHtcbiAgICAgICAgZXZlbnRzID0ge307XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHVibGlzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiwgZGF0YTogbmV2ZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbi5hc3luYykge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmNhbGxiYWNrKGRhdGEpO1xuICAgICAgICAgICAgfSwgNCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfc3Vic2NyaWJlKGV2ZW50OiBFdmVudE5hbWUsIGNhbGxiYWNrOiBGdW5jdGlvbiB8IFN1YnNjcmlwdGlvbiwgYXN5bmM/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGxldCBzdWJzY3JpcHRpb247XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0ge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgICAgIGFzeW5jLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24uY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxiYWNrIHdhcyBub3Qgc3BlY2lmaWVkIG9uIG9wdGlvbnMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdldEV2ZW50KGV2ZW50KS5zdWJzY3JpYmVycy5wdXNoKHN1YnNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3Vic2NyaWJlKGV2ZW50OiBFdmVudE5hbWUsIGNhbGxiYWNrOiBGdW5jdGlvbiB8IFN1YnNjcmlwdGlvbiwgYXN5bmM/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgICAgICByZXR1cm4gX3N1YnNjcmliZShldmVudCwgY2FsbGJhY2ssIGFzeW5jKTtcbiAgICAgICAgfSxcbiAgICAgICAgcHVibGlzaChldmVudE5hbWU6IEV2ZW50TmFtZSwgZGF0YT86IG5ldmVyKTogdm9pZCB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGdldEV2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICBjb25zdCB7IHN1YnNjcmliZXJzIH0gPSBldmVudDtcblxuICAgICAgICAgICAgLy8gUHVibGlzaCBvbmUtdGltZSBzdWJzY3JpcHRpb25zXG4gICAgICAgICAgICBzdWJzY3JpYmVycy5maWx0ZXIoKHN1YnNjcmliZXIpID0+ICEhc3Vic2NyaWJlci5vbmNlKS5mb3JFYWNoKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgcHVibGlzaFN1YnNjcmlwdGlvbihzdWJzY3JpYmVyLCBkYXRhIGFzIG5ldmVyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdGhlbSBmcm9tIHRoZSBzdWJzY3JpYmVyXG4gICAgICAgICAgICBldmVudC5zdWJzY3JpYmVycyA9IHN1YnNjcmliZXJzLmZpbHRlcigoc3Vic2NyaWJlcikgPT4gIXN1YnNjcmliZXIub25jZSk7XG5cbiAgICAgICAgICAgIC8vIHB1Ymxpc2ggdGhlIHJlc3RcbiAgICAgICAgICAgIGV2ZW50LnN1YnNjcmliZXJzLmZvckVhY2goKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgICAgICAgICBwdWJsaXNoU3Vic2NyaXB0aW9uKHN1YnNjcmliZXIsIGRhdGEgYXMgbmV2ZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uY2UoZXZlbnQ6IEV2ZW50TmFtZSwgY2FsbGJhY2s6IEZ1bmN0aW9uLCBhc3luYyA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgICAgICBfc3Vic2NyaWJlKGV2ZW50LCB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgYXN5bmMsXG4gICAgICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICB1bnN1YnNjcmliZShldmVudE5hbWU/OiBFdmVudE5hbWUsIGNhbGxiYWNrPzogRnVuY3Rpb24gfCBTdWJzY3JpcHRpb24pOiB2b2lkIHtcbiAgICAgICAgICAgIGlmIChldmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGdldEV2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN1YnNjcmliZXJzID0gZXZlbnQuc3Vic2NyaWJlcnMuZmlsdGVyKChzdWJzY3JpYmVyKSA9PiBzdWJzY3JpYmVyLmNhbGxiYWNrICE9PSBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3Vic2NyaWJlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNsZWFyRXZlbnRzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn0oKSk7XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBFeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG4gICAgY29kZT86IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG06IHN0cmluZywgY29kZT86IG51bWJlcikge1xuICAgICAgICBzdXBlcihtKTtcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICAgIH1cbn1cbiIsImltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi4vcXVhZ2dhL0V4Y2VwdGlvbic7XG5cbmNvbnN0IEVSUk9SX0RFU0MgPSAnVGhpcyBtYXkgbWVhbiB0aGF0IHRoZSB1c2VyIGhhcyBkZWNsaW5lZCBjYW1lcmEgYWNjZXNzLCBvciB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IG1lZGlhIEFQSXMuIElmIHlvdSBhcmUgcnVubmluZyBpbiBpT1MsIHlvdSBtdXN0IHVzZSBTYWZhcmkuJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVudW1lcmF0ZURldmljZXMoKTogUHJvbWlzZTxBcnJheTxNZWRpYURldmljZUluZm8+PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSBuZXcgRXhjZXB0aW9uKGBlbnVtZXJhdGVEZXZpY2VzIGlzIG5vdCBkZWZpbmVkLiAke0VSUk9SX0RFU0N9YCwgLTEpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJNZWRpYShjb25zdHJhaW50czogTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8TWVkaWFTdHJlYW0+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoY29uc3RyYWludHMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSBuZXcgRXhjZXB0aW9uKGBnZXRVc2VyTWVkaWEgaXMgbm90IGRlZmluZWQuICR7RVJST1JfREVTQ31gLCAtMSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxufVxuIiwiLy8gVE9ETzogd2hlbiB0aGlzIGZpbGUgd2FzIHdyaXR0ZW4geWVhcnMgYWdvLCBIVE1MTWVkaWFFbGVtZW50LnBsYXkoKSBkaWQgbm90IHJldHVybiBhIHVzZWZ1bCB2YWx1ZVxuLy8gdG8gbGV0IHVzIGtub3cgd2hlbiB0aGUgdmlkZW8gc3RhcnRlZCBwbGF5aW5nLiAgTm93LCBpdCBkb2VzLiAgU28sIHdlIHNob3VsZG4ndCBuZWVkIHRvIHJ1biB0aGlzXG4vLyBvZGQgd2FpdEZvclZpZGVvKCkgZnVuY3Rpb24gdGhhdCBwb2xscyB0byBzZWUgaWYgdGhlIHZpZGVvIGhhcyBzdGFydGVkLlxuaW1wb3J0IHBpY2sgZnJvbSAnbG9kYXNoL3BpY2snO1xuaW1wb3J0IHsgZ2V0VXNlck1lZGlhLCBlbnVtZXJhdGVEZXZpY2VzIH0gZnJvbSAnLi4vY29tbW9uL21lZGlhRGV2aWNlcyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4uL3F1YWdnYS9FeGNlcHRpb24nO1xuaW1wb3J0IHR5cGUge1xuICAgIE1lZGlhVHJhY2tDb25zdHJhaW50c1dpdGhEZXByZWNhdGVkLFxuICAgIFF1YWdnYUpTQ2FtZXJhQWNjZXNzIGFzIENhbWVyYUFjY2Vzc1R5cGUsXG59IGZyb20gJy4uLy4uL3R5cGUtZGVmaW5pdGlvbnMvcXVhZ2dhLmQnO1xuXG5sZXQgc3RyZWFtUmVmOiBNZWRpYVN0cmVhbSB8IG51bGw7XG5cbmZ1bmN0aW9uIHdhaXRGb3JWaWRlbyh2aWRlbzogSFRNTFZpZGVvRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBhdHRlbXB0cyA9IDEwO1xuXG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrVmlkZW8oKTogdm9pZCB7XG4gICAgICAgICAgICBpZiAoYXR0ZW1wdHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpZGVvLnZpZGVvV2lkdGggPiAxMCAmJiB2aWRlby52aWRlb0hlaWdodCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAqIGRldjogY2hlY2tWaWRlbyBmb3VuZCAke3ZpZGVvLnZpZGVvV2lkdGh9cHggeCAke3ZpZGVvLnZpZGVvSGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGNoZWNrVmlkZW8sIDUwMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEV4Y2VwdGlvbignVW5hYmxlIHRvIHBsYXkgdmlkZW8gc3RyZWFtLiBJcyB3ZWJjYW0gd29ya2luZz8nLCAtMSkpOyAvLyBUT0RPOiBhZGQgZXJyb3IgY29kZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXR0ZW1wdHMtLTtcbiAgICAgICAgfVxuICAgICAgICBjaGVja1ZpZGVvKCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogVHJpZXMgdG8gYXR0YWNoIHRoZSBjYW1lcmEtc3RyZWFtIHRvIGEgZ2l2ZW4gdmlkZW8tZWxlbWVudFxuICogYW5kIGNhbGxzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSBjb250ZW50IGlzIHJlYWR5XG4gKiBAcGFyYW0ge09iamVjdH0gY29uc3RyYWludHNcbiAqIEBwYXJhbSB7T2JqZWN0fSB2aWRlb1xuICovXG5hc3luYyBmdW5jdGlvbiBpbml0Q2FtZXJhKHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50IHwgbnVsbCwgY29uc3RyYWludHM6IE1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBnZXRVc2VyTWVkaWEoY29uc3RyYWludHMpO1xuICAgIHN0cmVhbVJlZiA9IHN0cmVhbTtcbiAgICBpZiAodmlkZW8pIHtcbiAgICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdhdXRvcGxheScsICd0cnVlJyk7XG4gICAgICAgIHZpZGVvLnNldEF0dHJpYnV0ZSgnbXV0ZWQnLCAndHJ1ZScpO1xuICAgICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ3BsYXlzaW5saW5lJywgJ3RydWUnKTsgLy8gbm90IGxpc3RlZCBvbiBNRE4uLi5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHZpZGVvLnNyY09iamVjdCA9IHN0cmVhbTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCAoKSA9PiB7XG4gICAgICAgICAgICB2aWRlby5wbGF5KCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignKiBFcnJvciB3aGlsZSB0cnlpbmcgdG8gcGxheSB2aWRlbyBzdHJlYW06JywgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHdhaXRGb3JWaWRlbyh2aWRlbyk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn1cblxuZnVuY3Rpb24gZGVwcmVjYXRlZENvbnN0cmFpbnRzKHZpZGVvQ29uc3RyYWludHM6IE1lZGlhVHJhY2tDb25zdHJhaW50c1dpdGhEZXByZWNhdGVkKTogTWVkaWFUcmFja0NvbnN0cmFpbnRzIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gcGljayh2aWRlb0NvbnN0cmFpbnRzLCBbJ3dpZHRoJywgJ2hlaWdodCcsICdmYWNpbmdNb2RlJyxcbiAgICAgICAgJ2FzcGVjdFJhdGlvJywgJ2RldmljZUlkJ10pO1xuXG4gICAgaWYgKHR5cGVvZiB2aWRlb0NvbnN0cmFpbnRzLm1pbkFzcGVjdFJhdGlvICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgJiYgdmlkZW9Db25zdHJhaW50cy5taW5Bc3BlY3RSYXRpbyA+IDApIHtcbiAgICAgICAgbm9ybWFsaXplZC5hc3BlY3RSYXRpbyA9IHZpZGVvQ29uc3RyYWludHMubWluQXNwZWN0UmF0aW87XG4gICAgICAgIGNvbnNvbGUubG9nKCdXQVJOSU5HOiBDb25zdHJhaW50IFxcJ21pbkFzcGVjdFJhdGlvXFwnIGlzIGRlcHJlY2F0ZWQ7IFVzZSBcXCdhc3BlY3RSYXRpb1xcJyBpbnN0ZWFkJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmlkZW9Db25zdHJhaW50cy5mYWNpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuZmFjaW5nTW9kZSA9IHZpZGVvQ29uc3RyYWludHMuZmFjaW5nO1xuICAgICAgICBjb25zb2xlLmxvZygnV0FSTklORzogQ29uc3RyYWludCBcXCdmYWNpbmdcXCcgaXMgZGVwcmVjYXRlZC4gVXNlIFxcJ2ZhY2luZ01vZGVcXCcgaW5zdGVhZFxcJycpO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLy8gVE9ETzogIzE5MiBJIGRvbid0IHRoaW5rIHRoZXJlJ3MgYW55IGdvb2QgcmVhc29uIHBpY2tDb25zdHJhaW50cyBzaG91bGQgcmV0dXJuIGEgUHJvbWlzZSxcbi8vIEkgdGhpbmsgaXQgd2FzIGp1c3QgdGhhdCB3YXkgc28gaXQgY291bGQgYmUgY2hhaW5lZCB0byBvdGhlciBmdW5jdGlvbnMgdGhhdCBkaWQgcmV0dXJuIGEgUHJvbWlzZS5cbi8vIFRoYXQncyBub3QgbmVjZXNzYXJ5IHdpdGggYXN5bmMgZnVuY3Rpb25zIGJlaW5nIGEgdGhpbmcsIHNvIHRoYXQgc2hvdWxkIGJlIGZpeGVkLlxuZXhwb3J0IGZ1bmN0aW9uIHBpY2tDb25zdHJhaW50cyh2aWRlb0NvbnN0cmFpbnRzOiBNZWRpYVRyYWNrQ29uc3RyYWludHNXaXRoRGVwcmVjYXRlZCA9IHt9KTogUHJvbWlzZTxNZWRpYVN0cmVhbUNvbnN0cmFpbnRzPiB7XG4gICAgY29uc3QgdmlkZW8gPSBkZXByZWNhdGVkQ29uc3RyYWludHModmlkZW9Db25zdHJhaW50cyk7XG5cbiAgICBpZiAodmlkZW8gJiYgdmlkZW8uZGV2aWNlSWQgJiYgdmlkZW8uZmFjaW5nTW9kZSkge1xuICAgICAgICBkZWxldGUgdmlkZW8uZmFjaW5nTW9kZTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGF1ZGlvOiBmYWxzZSwgdmlkZW8gfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVudW1lcmF0ZVZpZGVvRGV2aWNlcygpOiBQcm9taXNlPEFycmF5PE1lZGlhRGV2aWNlSW5mbz4+IHtcbiAgICBjb25zdCBkZXZpY2VzID0gYXdhaXQgZW51bWVyYXRlRGV2aWNlcygpO1xuICAgIHJldHVybiBkZXZpY2VzLmZpbHRlcigoZGV2aWNlOiBNZWRpYURldmljZUluZm8pID0+IGRldmljZS5raW5kID09PSAndmlkZW9pbnB1dCcpO1xufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVUcmFjaygpOiBNZWRpYVN0cmVhbVRyYWNrIHwgbnVsbCB7XG4gICAgaWYgKCFzdHJlYW1SZWYpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHRyYWNrcyA9IHN0cmVhbVJlZi5nZXRWaWRlb1RyYWNrcygpO1xuICAgIHJldHVybiB0cmFja3MgJiYgdHJhY2tzPy5sZW5ndGggPyB0cmFja3NbMF0gOiBudWxsO1xufVxuXG4vKipcbiAqIFVzZWQgZm9yIGFjY2Vzc2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWN0aXZlIHN0cmVhbSB0cmFjayBhbmQgYXZhaWxhYmxlIHZpZGVvIGRldmljZXMuXG4gKi9cbmNvbnN0IFF1YWdnYUpTQ2FtZXJhQWNjZXNzOiBDYW1lcmFBY2Nlc3NUeXBlID0ge1xuICAgIHJlcXVlc3RlZFZpZGVvRWxlbWVudDogbnVsbCxcbiAgICBhc3luYyByZXF1ZXN0KHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50IHwgbnVsbCwgdmlkZW9Db25zdHJhaW50cz86IE1lZGlhVHJhY2tDb25zdHJhaW50c1dpdGhEZXByZWNhdGVkKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgUXVhZ2dhSlNDYW1lcmFBY2Nlc3MucmVxdWVzdGVkVmlkZW9FbGVtZW50ID0gdmlkZW87XG4gICAgICAgIGNvbnN0IG5ld0NvbnN0cmFpbnRzID0gYXdhaXQgcGlja0NvbnN0cmFpbnRzKHZpZGVvQ29uc3RyYWludHMpO1xuICAgICAgICByZXR1cm4gaW5pdENhbWVyYSh2aWRlbywgbmV3Q29uc3RyYWludHMpO1xuICAgIH0sXG4gICAgcmVsZWFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdHJhY2tzID0gc3RyZWFtUmVmICYmIHN0cmVhbVJlZi5nZXRWaWRlb1RyYWNrcygpO1xuICAgICAgICBpZiAoUXVhZ2dhSlNDYW1lcmFBY2Nlc3MucmVxdWVzdGVkVmlkZW9FbGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBRdWFnZ2FKU0NhbWVyYUFjY2Vzcy5yZXF1ZXN0ZWRWaWRlb0VsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0cmFja3MgJiYgdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0cmFja3MuZm9yRWFjaCgodHJhY2spID0+IHRyYWNrLnN0b3AoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0cmVhbVJlZiA9IG51bGw7XG4gICAgICAgICAgICAgICAgUXVhZ2dhSlNDYW1lcmFBY2Nlc3MucmVxdWVzdGVkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBlbnVtZXJhdGVWaWRlb0RldmljZXMsXG4gICAgZ2V0QWN0aXZlU3RyZWFtTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSBnZXRBY3RpdmVUcmFjaygpO1xuICAgICAgICByZXR1cm4gdHJhY2sgPyB0cmFjay5sYWJlbCA6ICcnO1xuICAgIH0sXG4gICAgZ2V0QWN0aXZlVHJhY2ssXG4gICAgYXN5bmMgZGlzYWJsZVRvcmNoKCkge1xuICAgICAgICBjb25zdCB0cmFjayA9IGdldEFjdGl2ZVRyYWNrKCk7XG4gICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhY3F1aXJlIGNhbWVyYSBhY2Nlc3MgZXZlbiBpZiB0aGVyZSdzIG5vIGN1cnJlbnQgY2FtZXJhIG9wZW4/XG4gICAgICAgIC8vIFRPRE86IHdoYXQgaGFwcGVucyBvbiBpT1Mgb3IgYW5vdGhlciBkZXZpY2Ugd2hlcmUgdG9yY2ggaXNuJ3Qgc3VwcG9ydGVkIGF0IGFsbD8gU2hvdWxkIHdlIHRocm93IGFuIGVycm9yP1xuICAgICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdHJhY2suYXBwbHlDb25zdHJhaW50cyh7IGFkdmFuY2VkOiBbeyB0b3JjaDogZmFsc2UgfV0gfSBhcyBNZWRpYVRyYWNrQ29uc3RyYWludFNldCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgT3ZlcmNvbnN0cmFpbmVkRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdxdWFnZ2EyL0NhbWVyYUFjY2VzczogVG9yY2ggbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGVuYWJsZVRvcmNoKCkge1xuICAgICAgICBjb25zdCB0cmFjayA9IGdldEFjdGl2ZVRyYWNrKCk7XG4gICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhY3F1aXJlIGNhbWVyYSBhY2Nlc3MgZXZlbiBpZiB0aGVyZSdzIG5vIGN1cnJlbnQgY2FtZXJhIG9wZW4/XG4gICAgICAgIC8vIFRPRE86IHdoYXQgaGFwcGVucyBvbiBpT1Mgb3IgYW5vdGhlciBkZXZpY2Ugd2hlcmUgdG9yY2ggaXNuJ3Qgc3VwcG9ydGVkIGF0IGFsbD8gU2hvdWxkIHdlIHRocm93IGFuIGVycm9yP1xuICAgICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdHJhY2suYXBwbHlDb25zdHJhaW50cyh7IGFkdmFuY2VkOiBbeyB0b3JjaDogdHJ1ZSB9XSB9IGFzIE1lZGlhVHJhY2tDb25zdHJhaW50U2V0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBPdmVyY29uc3RyYWluZWRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3F1YWdnYTIvQ2FtZXJhQWNjZXNzOiBUb3JjaCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBRdWFnZ2FKU0NhbWVyYUFjY2VzcztcbiIsImltcG9ydCBJbWFnZURlYnVnIGZyb20gJy4uL2NvbW1vbi9pbWFnZV9kZWJ1Zyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgUXVhZ2dhSlNDb2RlUmVzdWx0LFxuICAgIFF1YWdnYUpTUmVzdWx0Q29sbGVjdG9yLFxuICAgIFF1YWdnYUpTUmVzdWx0Q29sbGVjdG9yRmlsdGVyRnVuY3Rpb24sXG4gICAgWFlTaXplLFxuICAgIFF1YWdnYUltYWdlRGF0YSxcbn0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5cbmZ1bmN0aW9uIGNvbnRhaW5zKGNvZGVSZXN1bHQ6IFF1YWdnYUpTQ29kZVJlc3VsdCwgbGlzdDogQXJyYXk8UXVhZ2dhSlNDb2RlUmVzdWx0Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsaXN0ICYmIGxpc3Quc29tZSgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXRlbSkgYXMgQXJyYXk8a2V5b2YgUXVhZ2dhSlNDb2RlUmVzdWx0PjtcbiAgICAgICAgcmV0dXJuIGtleXMuZXZlcnkoKGtleSkgPT4gaXRlbVtrZXldID09PSBjb2RlUmVzdWx0W2tleV0pO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBwYXNzZXNGaWx0ZXIoXG4gICAgY29kZVJlc3VsdDogUXVhZ2dhSlNDb2RlUmVzdWx0LFxuICAgIGZpbHRlcjogUXVhZ2dhSlNSZXN1bHRDb2xsZWN0b3JGaWx0ZXJGdW5jdGlvbiB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nID8gZmlsdGVyKGNvZGVSZXN1bHQpIDogdHJ1ZTtcbn1cblxuaW50ZXJmYWNlIFJlc3VsdENvbGxlY3RvciB7XG4gICAgYWRkUmVzdWx0OiAoZGF0YTogUXVhZ2dhSW1hZ2VEYXRhLCBpbWFnZVNpemU6IFhZU2l6ZSwgY29kZVJlc3VsdDogUXVhZ2dhSlNDb2RlUmVzdWx0KSA9PiB2b2lkO1xuICAgIGdldFJlc3VsdHM6ICgpID0+IEFycmF5PFF1YWdnYUpTQ29kZVJlc3VsdD47XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBjcmVhdGUoY29uZmlnOiBRdWFnZ2FKU1Jlc3VsdENvbGxlY3Rvcik6IFJlc3VsdENvbGxlY3RvciB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogISFjb25maWcud2lsbFJlYWRGcmVxdWVudGx5IH0pIGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgICAgICAgY29uc3QgcmVzdWx0czogQXJyYXk8UXVhZ2dhSlNDb2RlUmVzdWx0PiA9IFtdO1xuICAgICAgICBsZXQgY2FwYWNpdHkgPSBjb25maWcuY2FwYWNpdHkgPz8gMjA7XG4gICAgICAgIGNvbnN0IGNhcHR1cmUgPSBjb25maWcuY2FwdHVyZSA9PT0gdHJ1ZTtcblxuICAgICAgICBmdW5jdGlvbiBtYXRjaGVzQ29uc3RyYWludHMoY29kZVJlc3VsdDogUXVhZ2dhSlNDb2RlUmVzdWx0KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gISFjYXBhY2l0eVxuICAgICAgICAgICAgICAgICYmIGNvZGVSZXN1bHRcbiAgICAgICAgICAgICAgICAmJiAhY29udGFpbnMoY29kZVJlc3VsdCwgY29uZmlnLmJsYWNrbGlzdCBhcyBBcnJheTxRdWFnZ2FKU0NvZGVSZXN1bHQ+KVxuICAgICAgICAgICAgICAgICYmIHBhc3Nlc0ZpbHRlcihjb2RlUmVzdWx0LCBjb25maWcuZmlsdGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGRSZXN1bHQoZGF0YTogUXVhZ2dhSW1hZ2VEYXRhLCBpbWFnZVNpemU6IFhZU2l6ZSwgY29kZVJlc3VsdDogUXVhZ2dhSlNDb2RlUmVzdWx0KTogdm9pZCB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7IH07IC8vIHRoaXMgaXMgJ2FueScgdG8gYXZvaWQgaGF2aW5nIHRvIGNvbnN0cnVjdCBhIHdob2xlIFF1YWdnYUpTQ29kZVJlc3VsdCA6fFxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzQ29uc3RyYWludHMoY29kZVJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHktLTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvZGVSZXN1bHQgPSBjb2RlUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLndpZHRoID0gaW1hZ2VTaXplLng7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1hZ2VTaXplLnk7XG4gICAgICAgICAgICAgICAgICAgICAgICBJbWFnZURlYnVnLmRyYXdJbWFnZShkYXRhLCBpbWFnZVNpemUsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZnJhbWUgPSBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFJlc3VsdHMoKTogQXJyYXk8UXVhZ2dhSlNDb2RlUmVzdWx0PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0sXG59O1xuIiwiaW1wb3J0IHsgUXVhZ2dhSlNDb25maWdPYmplY3QgfSBmcm9tICcuLi8uLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYS5kJztcblxuY29uc3QgRGV2Q29uZmlnOiBRdWFnZ2FKU0NvbmZpZ09iamVjdCA9IHtcbiAgICBpbnB1dFN0cmVhbToge1xuICAgICAgICBuYW1lOiAnTGl2ZScsXG4gICAgICAgIHR5cGU6ICdMaXZlU3RyZWFtJyxcbiAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgIHdpZHRoOiA2NDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDQ4MCxcbiAgICAgICAgICAgIC8vIGFzcGVjdFJhdGlvOiA2NDAvNDgwLCAvLyBvcHRpb25hbFxuICAgICAgICAgICAgZmFjaW5nTW9kZTogJ2Vudmlyb25tZW50JywgLy8gb3IgdXNlclxuICAgICAgICAgICAgLy8gZGV2aWNlSWQ6IFwiMzg3NDU5ODM0NTczODc1OTgzNzU5ODM3NTk4MzRcIlxuICAgICAgICB9LFxuICAgICAgICBhcmVhOiB7XG4gICAgICAgICAgICB0b3A6ICcwJScsXG4gICAgICAgICAgICByaWdodDogJzAlJyxcbiAgICAgICAgICAgIGxlZnQ6ICcwJScsXG4gICAgICAgICAgICBib3R0b206ICcwJScsXG4gICAgICAgIH0sXG4gICAgICAgIHNpbmdsZUNoYW5uZWw6IGZhbHNlLCAvLyB0cnVlOiBvbmx5IHRoZSByZWQgY29sb3ItY2hhbm5lbCBpcyByZWFkXG4gICAgfSxcbiAgICBsb2NhdGU6IHRydWUsXG4gICAgbnVtT2ZXb3JrZXJzOiAwLFxuICAgIGRlY29kZXI6IHtcbiAgICAgICAgcmVhZGVyczogW1xuICAgICAgICAgICAgJ2NvZGVfMTI4X3JlYWRlcicsXG4gICAgICAgIF0sXG4gICAgICAgIGRlYnVnOiB7XG4gICAgICAgICAgICBkcmF3Qm91bmRpbmdCb3g6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd0ZyZXF1ZW5jeTogZmFsc2UsXG4gICAgICAgICAgICBkcmF3U2NhbmxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd1BhdHRlcm46IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgbG9jYXRvcjoge1xuICAgICAgICBoYWxmU2FtcGxlOiB0cnVlLFxuICAgICAgICBwYXRjaFNpemU6ICdtZWRpdW0nLCAvLyB4LXNtYWxsLCBzbWFsbCwgbWVkaXVtLCBsYXJnZSwgeC1sYXJnZVxuICAgICAgICBkZWJ1Zzoge1xuICAgICAgICAgICAgc2hvd0NhbnZhczogZmFsc2UsXG4gICAgICAgICAgICBzaG93UGF0Y2hlczogZmFsc2UsXG4gICAgICAgICAgICBzaG93Rm91bmRQYXRjaGVzOiBmYWxzZSxcbiAgICAgICAgICAgIHNob3dTa2VsZXRvbjogZmFsc2UsXG4gICAgICAgICAgICBzaG93TGFiZWxzOiBmYWxzZSxcbiAgICAgICAgICAgIHNob3dQYXRjaExhYmVsczogZmFsc2UsXG4gICAgICAgICAgICBzaG93UmVtYWluaW5nUGF0Y2hMYWJlbHM6IGZhbHNlLFxuICAgICAgICAgICAgYm94RnJvbVBhdGNoZXM6IHtcbiAgICAgICAgICAgICAgICBzaG93VHJhbnNmb3JtZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNob3dUcmFuc2Zvcm1lZEJveDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2hvd0JCOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IERldkNvbmZpZztcbiIsImltcG9ydCB7IFF1YWdnYUpTQ29uZmlnT2JqZWN0IH0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5cbmNvbnN0IE5vZGVDb25maWc6IFF1YWdnYUpTQ29uZmlnT2JqZWN0ID0ge1xuICAgIGlucHV0U3RyZWFtOiB7XG4gICAgICAgIHR5cGU6ICdJbWFnZVN0cmVhbScsXG4gICAgICAgIHNlcXVlbmNlOiBmYWxzZSxcbiAgICAgICAgc2l6ZTogODAwLFxuICAgICAgICBhcmVhOiB7XG4gICAgICAgICAgICB0b3A6ICcwJScsXG4gICAgICAgICAgICByaWdodDogJzAlJyxcbiAgICAgICAgICAgIGxlZnQ6ICcwJScsXG4gICAgICAgICAgICBib3R0b206ICcwJScsXG4gICAgICAgIH0sXG4gICAgICAgIHNpbmdsZUNoYW5uZWw6IGZhbHNlLCAvLyB0cnVlOiBvbmx5IHRoZSByZWQgY29sb3ItY2hhbm5lbCBpcyByZWFkXG4gICAgfSxcbiAgICBsb2NhdGU6IHRydWUsXG4gICAgbnVtT2ZXb3JrZXJzOiAwLFxuICAgIGRlY29kZXI6IHtcbiAgICAgICAgcmVhZGVyczogW1xuICAgICAgICAgICAgJ2NvZGVfMTI4X3JlYWRlcicsXG4gICAgICAgIF0sXG4gICAgfSxcbiAgICBsb2NhdG9yOiB7XG4gICAgICAgIGhhbGZTYW1wbGU6IHRydWUsXG4gICAgICAgIHBhdGNoU2l6ZTogJ21lZGl1bScsIC8vIHgtc21hbGwsIHNtYWxsLCBtZWRpdW0sIGxhcmdlLCB4LWxhcmdlXG4gICAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE5vZGVDb25maWc7XG4iLCJpbXBvcnQgeyBRdWFnZ2FKU0NvbmZpZ09iamVjdCB9IGZyb20gJy4uLy4uL3R5cGUtZGVmaW5pdGlvbnMvcXVhZ2dhLmQnO1xuXG5jb25zdCBQcm9kQ29uZmlnOiBRdWFnZ2FKU0NvbmZpZ09iamVjdCA9IHtcbiAgICBpbnB1dFN0cmVhbToge1xuICAgICAgICBuYW1lOiAnTGl2ZScsXG4gICAgICAgIHR5cGU6ICdMaXZlU3RyZWFtJyxcbiAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgIHdpZHRoOiA2NDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDQ4MCxcbiAgICAgICAgICAgIC8vIGFzcGVjdFJhdGlvOiA2NDAvNDgwLCAvLyBvcHRpb25hbFxuICAgICAgICAgICAgZmFjaW5nTW9kZTogJ2Vudmlyb25tZW50JywgLy8gb3IgdXNlclxuICAgICAgICAgICAgLy8gZGV2aWNlSWQ6IFwiMzg3NDU5ODM0NTczODc1OTgzNzU5ODM3NTk4MzRcIlxuICAgICAgICB9LFxuICAgICAgICBhcmVhOiB7XG4gICAgICAgICAgICB0b3A6ICcwJScsXG4gICAgICAgICAgICByaWdodDogJzAlJyxcbiAgICAgICAgICAgIGxlZnQ6ICcwJScsXG4gICAgICAgICAgICBib3R0b206ICcwJScsXG4gICAgICAgIH0sXG4gICAgICAgIHNpbmdsZUNoYW5uZWw6IGZhbHNlLCAvLyB0cnVlOiBvbmx5IHRoZSByZWQgY29sb3ItY2hhbm5lbCBpcyByZWFkXG4gICAgfSxcbiAgICBsb2NhdGU6IHRydWUsXG4gICAgbnVtT2ZXb3JrZXJzOiA0LFxuICAgIGRlY29kZXI6IHtcbiAgICAgICAgcmVhZGVyczogW1xuICAgICAgICAgICAgJ2NvZGVfMTI4X3JlYWRlcicsXG4gICAgICAgIF0sXG4gICAgfSxcbiAgICBsb2NhdG9yOiB7XG4gICAgICAgIGhhbGZTYW1wbGU6IHRydWUsXG4gICAgICAgIHBhdGNoU2l6ZTogJ21lZGl1bScsIC8vIHgtc21hbGwsIHNtYWxsLCBtZWRpdW0sIGxhcmdlLCB4LWxhcmdlXG4gICAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByb2RDb25maWc7XG4iLCJpbXBvcnQgeyBRdWFnZ2FKU0NvbmZpZ09iamVjdCB9IGZyb20gJy4uLy4uL3R5cGUtZGVmaW5pdGlvbnMvcXVhZ2dhLmQnO1xuaW1wb3J0IERldkNvbmZpZyBmcm9tICcuL2NvbmZpZy5kZXYnO1xuaW1wb3J0IE5vZGVDb25maWcgZnJvbSAnLi9jb25maWcubm9kZSc7XG5pbXBvcnQgUHJvZENvbmZpZyBmcm9tICcuL2NvbmZpZy5wcm9kJztcblxuY29uc3QgRXhwb3J0Q29uZmlnOiBRdWFnZ2FKU0NvbmZpZ09iamVjdCA9ICgoKSA9PiB7XG4gICAgbGV0IFF1YWdnYUNvbmZpZzogUXVhZ2dhSlNDb25maWdPYmplY3Q7XG4gICAgaWYgKHR5cGVvZiBFTlYgPT09ICd1bmRlZmluZWQnIHx8IEVOVi5kZXZlbG9wbWVudCkge1xuICAgICAgICBRdWFnZ2FDb25maWcgPSBEZXZDb25maWc7XG4gICAgfSBlbHNlIGlmIChFTlYubm9kZSkge1xuICAgICAgICBRdWFnZ2FDb25maWcgPSBOb2RlQ29uZmlnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIFF1YWdnYUNvbmZpZyA9IFByb2RDb25maWc7XG4gICAgfVxuICAgIHJldHVybiBRdWFnZ2FDb25maWc7XG59KSgpO1xuXG5leHBvcnQgZGVmYXVsdCBFeHBvcnRDb25maWc7XG4iLCIvLyBOT1RFIEZPUiBBTllPTkUgSU4gSEVSRSBJTiBUSEUgRlVUVVJFOlxuLy8gd2VicGFjay5jb25maWcuanMgcmVwbGFjZXMgdGhlIGZyYW1lX2dyYWJiZXIgbW9kdWxlIHdpdGggVEhJUyBtb2R1bGUgd2hlbiBpdCBpcyBidWlsZGluZyBmb3IgYSBCcm93c2VyIGVudmlyb25tZW50LlxuXG5pbXBvcnQge1xuICAgIGltYWdlUmVmLFxuICAgIGdyYXlBbmRIYWxmU2FtcGxlRnJvbUNhbnZhc0RhdGEsXG4gICAgY29tcHV0ZUdyYXksXG59IGZyb20gJy4uL2NvbW1vbi9jdl91dGlscyc7XG5cbmNvbnN0IFRPX1JBRElBTlMgPSBNYXRoLlBJIC8gMTgwO1xuXG5mdW5jdGlvbiBhZGp1c3RDYW52YXNTaXplKGNhbnZhcywgdGFyZ2V0U2l6ZSkge1xuICAgIGlmIChjYW52YXMud2lkdGggIT09IHRhcmdldFNpemUueCkge1xuICAgICAgICBpZiAoRU5WLmRldmVsb3BtZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV0FSTklORzogY2FudmFzLXNpemUgbmVlZHMgdG8gYmUgYWRqdXN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjYW52YXMud2lkdGggPSB0YXJnZXRTaXplLng7XG4gICAgfVxuICAgIGlmIChjYW52YXMuaGVpZ2h0ICE9PSB0YXJnZXRTaXplLnkpIHtcbiAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dBUk5JTkc6IGNhbnZhcy1zaXplIG5lZWRzIHRvIGJlIGFkanVzdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FudmFzLmhlaWdodCA9IHRhcmdldFNpemUueTtcbiAgICB9XG59XG5cbmNvbnN0IEZyYW1lR3JhYmJlciA9IHt9O1xuXG5GcmFtZUdyYWJiZXIuY3JlYXRlID0gZnVuY3Rpb24gKGlucHV0U3RyZWFtLCBjYW52YXMpIHtcbiAgICAvLyBjb25zb2xlLndhcm4oJyoqKiBGcmFtZUdyYWJiZXJCcm93c2VyIGNyZWF0ZScpO1xuICAgIGNvbnN0IF90aGF0ID0ge307XG4gICAgY29uc3QgX3N0cmVhbUNvbmZpZyA9IGlucHV0U3RyZWFtLmdldENvbmZpZygpO1xuICAgIGNvbnN0IF92aWRlb1NpemUgPSBpbWFnZVJlZihpbnB1dFN0cmVhbS5nZXRSZWFsV2lkdGgoKSwgaW5wdXRTdHJlYW0uZ2V0UmVhbEhlaWdodCgpKTtcbiAgICBjb25zdCBfY2FudmFzU2l6ZSA9IGlucHV0U3RyZWFtLmdldENhbnZhc1NpemUoKTtcbiAgICBjb25zdCBfc2l6ZSA9IGltYWdlUmVmKGlucHV0U3RyZWFtLmdldFdpZHRoKCksIGlucHV0U3RyZWFtLmdldEhlaWdodCgpKTtcbiAgICBjb25zdCB0b3BSaWdodCA9IGlucHV0U3RyZWFtLmdldFRvcFJpZ2h0KCk7XG4gICAgY29uc3QgX3N4ID0gdG9wUmlnaHQueDtcbiAgICBjb25zdCBfc3kgPSB0b3BSaWdodC55O1xuICAgIGxldCBfY2FudmFzO1xuICAgIGxldCBfY3R4ID0gbnVsbDtcbiAgICBsZXQgX2RhdGEgPSBudWxsO1xuICAgIGNvbnN0IHsgd2lsbFJlYWRGcmVxdWVudGx5IH0gPSBfc3RyZWFtQ29uZmlnO1xuXG4gICAgX2NhbnZhcyA9IGNhbnZhcyB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBfY2FudmFzLndpZHRoID0gX2NhbnZhc1NpemUueDtcbiAgICBfY2FudmFzLmhlaWdodCA9IF9jYW52YXNTaXplLnk7XG4gICAgY29uc29sZS53YXJuKCcqKiogZnJhbWVfZ3JhYmJlcl9icm93c2VyOiB3aWxsUmVhZEZyZXF1ZW50bHk9Jywgd2lsbFJlYWRGcmVxdWVudGx5LCAnY2FudmFzPScsIF9jYW52YXMpO1xuICAgIF9jdHggPSBfY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6ICEhd2lsbFJlYWRGcmVxdWVudGx5IH0pOyAvLyBkb3VibGUgbm90IGJlY2F1c2Ugd2UgaGF2ZSBhbiBvcHRpb25hbCBib29sIHRoYXQgbmVlZHMgdG8gcGFzcyBhcyBhIGJvb2xcbiAgICBfZGF0YSA9IG5ldyBVaW50OEFycmF5KF9zaXplLnggKiBfc2l6ZS55KTtcbiAgICBpZiAoRU5WLmRldmVsb3BtZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdGcmFtZUdyYWJiZXInLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBzaXplOiBfc2l6ZSxcbiAgICAgICAgICAgIHRvcFJpZ2h0LFxuICAgICAgICAgICAgdmlkZW9TaXplOiBfdmlkZW9TaXplLFxuICAgICAgICAgICAgY2FudmFzU2l6ZTogX2NhbnZhc1NpemUsXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VzIHRoZSBnaXZlbiBhcnJheSBhcyBmcmFtZS1idWZmZXJcbiAgICAgKi9cbiAgICBfdGhhdC5hdHRhY2hEYXRhID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgX2RhdGEgPSBkYXRhO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB1c2VkIGZyYW1lLWJ1ZmZlclxuICAgICAqL1xuICAgIF90aGF0LmdldERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfZGF0YTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBhIGZyYW1lIGZyb20gdGhlIGlucHV0LXN0cmVhbSBhbmQgcHV0cyBpbnRvIHRoZSBmcmFtZS1idWZmZXIuXG4gICAgICogVGhlIGltYWdlLWRhdGEgaXMgY29udmVydGVkIHRvIGdyYXktc2NhbGUgYW5kIHRoZW4gaGFsZi1zYW1wbGVkIGlmIGNvbmZpZ3VyZWQuXG4gICAgICovXG4gICAgX3RoYXQuZ3JhYiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgZG9IYWxmU2FtcGxlID0gX3N0cmVhbUNvbmZpZy5oYWxmU2FtcGxlO1xuICAgICAgICBjb25zdCBmcmFtZSA9IGlucHV0U3RyZWFtLmdldEZyYW1lKCk7XG4gICAgICAgIGxldCBkcmF3YWJsZSA9IGZyYW1lO1xuICAgICAgICBsZXQgZHJhd0FuZ2xlID0gMDtcbiAgICAgICAgbGV0IGN0eERhdGE7XG4gICAgICAgIGlmIChkcmF3YWJsZSkge1xuICAgICAgICAgICAgYWRqdXN0Q2FudmFzU2l6ZShfY2FudmFzLCBfY2FudmFzU2l6ZSk7XG4gICAgICAgICAgICBpZiAoX3N0cmVhbUNvbmZpZy50eXBlID09PSAnSW1hZ2VTdHJlYW0nKSB7XG4gICAgICAgICAgICAgICAgZHJhd2FibGUgPSBmcmFtZS5pbWc7XG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lLnRhZ3MgJiYgZnJhbWUudGFncy5vcmllbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZyYW1lLnRhZ3Mub3JpZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3QW5nbGUgPSA5MCAqIFRPX1JBRElBTlM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0FuZ2xlID0gLTkwICogVE9fUkFESUFOUztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRyYXdBbmdsZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIF9jdHgudHJhbnNsYXRlKF9jYW52YXNTaXplLnggLyAyLCBfY2FudmFzU2l6ZS55IC8gMik7XG4gICAgICAgICAgICAgICAgX2N0eC5yb3RhdGUoZHJhd0FuZ2xlKTtcbiAgICAgICAgICAgICAgICBfY3R4LmRyYXdJbWFnZShkcmF3YWJsZSwgLV9jYW52YXNTaXplLnkgLyAyLCAtX2NhbnZhc1NpemUueCAvIDIsIF9jYW52YXNTaXplLnksIF9jYW52YXNTaXplLngpO1xuICAgICAgICAgICAgICAgIF9jdHgucm90YXRlKC1kcmF3QW5nbGUpO1xuICAgICAgICAgICAgICAgIF9jdHgudHJhbnNsYXRlKC1fY2FudmFzU2l6ZS54IC8gMiwgLV9jYW52YXNTaXplLnkgLyAyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX2N0eC5kcmF3SW1hZ2UoZHJhd2FibGUsIDAsIDAsIF9jYW52YXNTaXplLngsIF9jYW52YXNTaXplLnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdHhEYXRhID0gX2N0eC5nZXRJbWFnZURhdGEoX3N4LCBfc3ksIF9zaXplLngsIF9zaXplLnkpLmRhdGE7XG4gICAgICAgICAgICBpZiAoZG9IYWxmU2FtcGxlKSB7XG4gICAgICAgICAgICAgICAgZ3JheUFuZEhhbGZTYW1wbGVGcm9tQ2FudmFzRGF0YShjdHhEYXRhLCBfc2l6ZSwgX2RhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlR3JheShjdHhEYXRhLCBfZGF0YSwgX3N0cmVhbUNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIF90aGF0LmdldFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfc2l6ZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGF0O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRnJhbWVHcmFiYmVyO1xuIiwiLy8gTk9URTogKFNPTUUgT0YpIFRISVMgSVMgQlJPV1NFUiBPTkxZIENPREUuICBOb2RlIGRvZXMgbm90IGhhdmUgJ2F0b2InIGJ1aWx0IGluLCBub3IgWE1MSHR0cFJlcXVlc3QuXG4vLyBIb3cgZXhhY3RseSBpcyB0aGlzIHNldCBvZiBmdW5jdGlvbnMgdXNlZCBpbiBRdWFnZ2E/IERvIHdlIG5lZWQgdGhlIGJyb3dzZXIgc3BlY2lmaWMgY29kZT8gRG8gd2Vcbi8vIG5lZWQgdG8gcG9ydCBhbnkgcGFydCBvZiB0aGlzIHRoYXQgZG9lc24ndCB3b3JrIGluIE5vZGUgdG8gbm9kZT9cblxuLy8gVGFncyBzY3JhcGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2V4aWYtanMvZXhpZi1qc1xuY29uc3QgRXhpZlRhZ3MgPSB7IDB4MDExMjogJ29yaWVudGF0aW9uJyB9O1xuZXhwb3J0IGNvbnN0IEF2YWlsYWJsZVRhZ3MgPSBPYmplY3Qua2V5cyhFeGlmVGFncykubWFwKChrZXkpID0+IEV4aWZUYWdzW2tleV0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZmluZFRhZ3NJbk9iamVjdFVSTChzcmMsIHRhZ3MgPSBBdmFpbGFibGVUYWdzKSB7XG4gICAgaWYgKC9eYmxvYjovaS50ZXN0KHNyYykpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdFVSTFRvQmxvYihzcmMpXG4gICAgICAgICAgICAudGhlbihyZWFkVG9CdWZmZXIpXG4gICAgICAgICAgICAudGhlbigoYnVmZmVyKSA9PiBmaW5kVGFnc0luQnVmZmVyKGJ1ZmZlciwgdGFncykpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0VG9BcnJheUJ1ZmZlcihkYXRhVXJsKSB7XG4gICAgY29uc3QgYmFzZTY0ID0gZGF0YVVybC5yZXBsYWNlKC9eZGF0YTooW147XSspO2Jhc2U2NCwvZ21pLCAnJyk7XG4gICAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpO1xuICAgIGNvbnN0IGxlbiA9IGJpbmFyeS5sZW5ndGg7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGxlbik7XG4gICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZpZXdbaV0gPSBiaW5hcnkuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZnVuY3Rpb24gcmVhZFRvQnVmZmVyKGJsb2IpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGUudGFyZ2V0LnJlc3VsdCk7XG4gICAgICAgIH07XG4gICAgICAgIGZpbGVSZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG9iamVjdFVSTFRvQmxvYih1cmwpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBodHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIGh0dHAub3BlbignR0VUJywgdXJsLCB0cnVlKTtcbiAgICAgICAgaHR0cC5yZXNwb25zZVR5cGUgPSAnYmxvYic7XG4gICAgICAgIGh0dHAub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGh0dHAucmVhZHlTdGF0ZSA9PT0gWE1MSHR0cFJlcXVlc3QuRE9ORSAmJiAoaHR0cC5zdGF0dXMgPT09IDIwMCB8fCBodHRwLnN0YXR1cyA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBodHRwLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgIGh0dHAuc2VuZCgpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFRhZ3NJbkJ1ZmZlcihmaWxlLCBzZWxlY3RlZFRhZ3MgPSBBdmFpbGFibGVUYWdzKSB7XG4gICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoZmlsZSk7XG4gICAgY29uc3QgbGVuZ3RoID0gZmlsZS5ieXRlTGVuZ3RoO1xuICAgIGNvbnN0IGV4aWZUYWdzID0gc2VsZWN0ZWRUYWdzLnJlZHVjZSgocmVzdWx0LCBzZWxlY3RlZFRhZykgPT4ge1xuICAgICAgICBjb25zdCBleGlmVGFnID0gT2JqZWN0LmtleXMoRXhpZlRhZ3MpLmZpbHRlcigodGFnKSA9PiBFeGlmVGFnc1t0YWddID09PSBzZWxlY3RlZFRhZylbMF07XG4gICAgICAgIGlmIChleGlmVGFnKSB7XG4gICAgICAgICAgICByZXN1bHRbZXhpZlRhZ10gPSBzZWxlY3RlZFRhZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIHt9KTtcbiAgICBsZXQgb2Zmc2V0ID0gMjtcbiAgICBsZXQgbWFya2VyO1xuXG4gICAgaWYgKChkYXRhVmlldy5nZXRVaW50OCgwKSAhPT0gMHhGRikgfHwgKGRhdGFWaWV3LmdldFVpbnQ4KDEpICE9PSAweEQ4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkge1xuICAgICAgICBpZiAoZGF0YVZpZXcuZ2V0VWludDgob2Zmc2V0KSAhPT0gMHhGRikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFya2VyID0gZGF0YVZpZXcuZ2V0VWludDgob2Zmc2V0ICsgMSk7XG4gICAgICAgIGlmIChtYXJrZXIgPT09IDB4RTEpIHtcbiAgICAgICAgICAgIHJldHVybiByZWFkRVhJRkRhdGEoZGF0YVZpZXcsIG9mZnNldCArIDQsIGV4aWZUYWdzKTtcbiAgICAgICAgfVxuICAgICAgICBvZmZzZXQgKz0gMiArIGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQgKyAyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlYWRFWElGRGF0YShmaWxlLCBzdGFydCwgZXhpZlRhZ3MpIHtcbiAgICBpZiAoZ2V0U3RyaW5nRnJvbUJ1ZmZlcihmaWxlLCBzdGFydCwgNCkgIT09ICdFeGlmJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGlmZk9mZnNldCA9IHN0YXJ0ICsgNjtcbiAgICBsZXQgYmlnRW5kO1xuXG4gICAgaWYgKGZpbGUuZ2V0VWludDE2KHRpZmZPZmZzZXQpID09PSAweDQ5NDkpIHtcbiAgICAgICAgYmlnRW5kID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChmaWxlLmdldFVpbnQxNih0aWZmT2Zmc2V0KSA9PT0gMHg0RDREKSB7XG4gICAgICAgIGJpZ0VuZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChmaWxlLmdldFVpbnQxNih0aWZmT2Zmc2V0ICsgMiwgIWJpZ0VuZCkgIT09IDB4MDAyQSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RJRkRPZmZzZXQgPSBmaWxlLmdldFVpbnQzMih0aWZmT2Zmc2V0ICsgNCwgIWJpZ0VuZCk7XG4gICAgaWYgKGZpcnN0SUZET2Zmc2V0IDwgMHgwMDAwMDAwOCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGFncyA9IHJlYWRUYWdzKGZpbGUsIHRpZmZPZmZzZXQsIHRpZmZPZmZzZXQgKyBmaXJzdElGRE9mZnNldCwgZXhpZlRhZ3MsIGJpZ0VuZCk7XG4gICAgcmV0dXJuIHRhZ3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWdzKGZpbGUsIHRpZmZTdGFydCwgZGlyU3RhcnQsIHN0cmluZ3MsIGJpZ0VuZCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmaWxlLmdldFVpbnQxNihkaXJTdGFydCwgIWJpZ0VuZCk7XG4gICAgY29uc3QgdGFncyA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHtcbiAgICAgICAgY29uc3QgZW50cnlPZmZzZXQgPSBkaXJTdGFydCArIGkgKiAxMiArIDI7XG4gICAgICAgIGNvbnN0IHRhZyA9IHN0cmluZ3NbZmlsZS5nZXRVaW50MTYoZW50cnlPZmZzZXQsICFiaWdFbmQpXTtcbiAgICAgICAgaWYgKHRhZykge1xuICAgICAgICAgICAgdGFnc1t0YWddID0gcmVhZFRhZ1ZhbHVlKGZpbGUsIGVudHJ5T2Zmc2V0LCB0aWZmU3RhcnQsIGRpclN0YXJ0LCBiaWdFbmQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YWdzO1xufVxuXG5mdW5jdGlvbiByZWFkVGFnVmFsdWUoZmlsZSwgZW50cnlPZmZzZXQsIHRpZmZTdGFydCwgZGlyU3RhcnQsIGJpZ0VuZCkge1xuICAgIGNvbnN0IHR5cGUgPSBmaWxlLmdldFVpbnQxNihlbnRyeU9mZnNldCArIDIsICFiaWdFbmQpO1xuICAgIGNvbnN0IG51bVZhbHVlcyA9IGZpbGUuZ2V0VWludDMyKGVudHJ5T2Zmc2V0ICsgNCwgIWJpZ0VuZCk7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgaWYgKG51bVZhbHVlcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLmdldFVpbnQxNihlbnRyeU9mZnNldCArIDgsICFiaWdFbmQpO1xuICAgICAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRTdHJpbmdGcm9tQnVmZmVyKGJ1ZmZlciwgc3RhcnQsIGxlbmd0aCkge1xuICAgIGxldCBvdXRzdHIgPSAnJztcbiAgICBmb3IgKGxldCBuID0gc3RhcnQ7IG4gPCBzdGFydCArIGxlbmd0aDsgbisrKSB7XG4gICAgICAgIG91dHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZmZlci5nZXRVaW50OChuKSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRzdHI7XG59XG4iLCJpbXBvcnQgeyBmaW5kVGFnc0luT2JqZWN0VVJMIH0gZnJvbSAnLi9leGlmX2hlbHBlcic7XG5cbmNvbnN0IEltYWdlTG9hZGVyID0ge307XG5JbWFnZUxvYWRlci5sb2FkID0gZnVuY3Rpb24gKGRpcmVjdG9yeSwgY2FsbGJhY2ssIG9mZnNldCwgc2l6ZSwgc2VxdWVuY2UpIHtcbiAgICBjb25zdCBodG1sSW1hZ2VzU3JjQXJyYXkgPSBuZXcgQXJyYXkoc2l6ZSk7XG4gICAgY29uc3QgaHRtbEltYWdlc0FycmF5ID0gbmV3IEFycmF5KGh0bWxJbWFnZXNTcmNBcnJheS5sZW5ndGgpO1xuICAgIGxldCBpO1xuICAgIGxldCBpbWc7XG4gICAgbGV0IG51bTtcblxuICAgIGlmIChzZXF1ZW5jZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgaHRtbEltYWdlc1NyY0FycmF5WzBdID0gZGlyZWN0b3J5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBodG1sSW1hZ2VzU3JjQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG51bSA9IChvZmZzZXQgKyBpKTtcbiAgICAgICAgICAgIGh0bWxJbWFnZXNTcmNBcnJheVtpXSA9IGAke2RpcmVjdG9yeX1pbWFnZS0keyhgMDAke251bX1gKS5zbGljZSgtMyl9LmpwZ2A7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaHRtbEltYWdlc0FycmF5Lm5vdExvYWRlZCA9IFtdO1xuICAgIGh0bWxJbWFnZXNBcnJheS5hZGRJbWFnZSA9IGZ1bmN0aW9uIChpbWFnZSkge1xuICAgICAgICBodG1sSW1hZ2VzQXJyYXkubm90TG9hZGVkLnB1c2goaW1hZ2UpO1xuICAgIH07XG4gICAgaHRtbEltYWdlc0FycmF5LmxvYWRlZCA9IGZ1bmN0aW9uIChsb2FkZWRJbWcpIHtcbiAgICAgICAgY29uc3Qgbm90bG9hZGVkSW1ncyA9IGh0bWxJbWFnZXNBcnJheS5ub3RMb2FkZWQ7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgbm90bG9hZGVkSW1ncy5sZW5ndGg7IHgrKykge1xuICAgICAgICAgICAgaWYgKG5vdGxvYWRlZEltZ3NbeF0gPT09IGxvYWRlZEltZykge1xuICAgICAgICAgICAgICAgIG5vdGxvYWRlZEltZ3Muc3BsaWNlKHgsIDEpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaHRtbEltYWdlc1NyY0FycmF5Lmxlbmd0aDsgeSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ05hbWUgPSBodG1sSW1hZ2VzU3JjQXJyYXlbeV0uc3Vic3RyKGh0bWxJbWFnZXNTcmNBcnJheVt5XS5sYXN0SW5kZXhPZignLycpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlZEltZy5zcmMubGFzdEluZGV4T2YoaW1nTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sSW1hZ2VzQXJyYXlbeV0gPSB7IGltZzogbG9hZGVkSW1nIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm90bG9hZGVkSW1ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnSW1hZ2VzIGxvYWRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlcXVlbmNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGZpbmRUYWdzSW5PYmplY3RVUkwoZGlyZWN0b3J5LCBbJ29yaWVudGF0aW9uJ10pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCh0YWdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sSW1hZ2VzQXJyYXlbMF0udGFncyA9IHRhZ3M7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhodG1sSW1hZ2VzQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhodG1sSW1hZ2VzQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soaHRtbEltYWdlc0FycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaHRtbEltYWdlc1NyY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBodG1sSW1hZ2VzQXJyYXkuYWRkSW1hZ2UoaW1nKTtcbiAgICAgICAgYWRkT25sb2FkSGFuZGxlcihpbWcsIGh0bWxJbWFnZXNBcnJheSk7XG4gICAgICAgIGltZy5zcmMgPSBodG1sSW1hZ2VzU3JjQXJyYXlbaV07XG4gICAgfVxufTtcblxuZnVuY3Rpb24gYWRkT25sb2FkSGFuZGxlcihpbWcsIGh0bWxJbWFnZXNBcnJheSkge1xuICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWxJbWFnZXNBcnJheS5sb2FkZWQodGhpcyk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgKEltYWdlTG9hZGVyKTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IEltYWdlTG9hZGVyIGZyb20gJy4uL2ltYWdlX2xvYWRlcic7XG5pbXBvcnQgeyBYWVNpemUsIFBvaW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5pbXBvcnQgeyBJbnB1dFN0cmVhbUZhY3RvcnksIElucHV0U3RyZWFtLCBFdmVudEhhbmRsZXJMaXN0IH0gZnJvbSAnLi9pbnB1dF9zdHJlYW0uZCc7XG5cbmNvbnN0IGlucHV0U3RyZWFtRmFjdG9yeTogSW5wdXRTdHJlYW1GYWN0b3J5ID0ge1xuICAgIGNyZWF0ZVZpZGVvU3RyZWFtKHZpZGVvKTogSW5wdXRTdHJlYW0ge1xuICAgICAgICBjb25zb2xlLndhcm4oJyoqKiogSW5wdXRTdHJlYW1Ccm93c2VyIGNyZWF0ZVZpZGVvU3RyZWFtJyk7XG4gICAgICAgIGxldCBfY29uZmlnOiB7IHNpemU6IG51bWJlcjsgdHlwZTogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3QgX2V2ZW50TmFtZXMgPSBbJ2NhbnJlY29yZCcsICdlbmRlZCddO1xuICAgICAgICBjb25zdCBfZXZlbnRIYW5kbGVyczogRXZlbnRIYW5kbGVyTGlzdCA9IHt9O1xuICAgICAgICBsZXQgX2NhbGN1bGF0ZWRXaWR0aDogbnVtYmVyO1xuICAgICAgICBsZXQgX2NhbGN1bGF0ZWRIZWlnaHQ6IG51bWJlcjtcbiAgICAgICAgY29uc3QgX3RvcFJpZ2h0OiBQb2ludCA9IHsgeDogMCwgeTogMCwgdHlwZTogJ1BvaW50JyB9O1xuICAgICAgICBjb25zdCBfY2FudmFzU2l6ZTogWFlTaXplID0geyB4OiAwLCB5OiAwLCB0eXBlOiAnWFlTaXplJyB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGluaXRTaXplKCk6IHZvaWQge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB2aWRlby52aWRlb1dpZHRoO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdmlkZW8udmlkZW9IZWlnaHQ7XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuICAgICAgICAgICAgX2NhbGN1bGF0ZWRXaWR0aCA9IF9jb25maWc/LnNpemUgPyB3aWR0aCAvIGhlaWdodCA+IDEgPyBfY29uZmlnLnNpemUgOiBNYXRoLmZsb29yKCh3aWR0aCAvIGhlaWdodCkgKiBfY29uZmlnLnNpemUpIDogd2lkdGg7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgIF9jYWxjdWxhdGVkSGVpZ2h0ID0gX2NvbmZpZz8uc2l6ZSA/IHdpZHRoIC8gaGVpZ2h0ID4gMSA/IE1hdGguZmxvb3IoKGhlaWdodCAvIHdpZHRoKSAqIF9jb25maWcuc2l6ZSkgOiBfY29uZmlnLnNpemUgOiBoZWlnaHQ7XG5cbiAgICAgICAgICAgIF9jYW52YXNTaXplLnggPSBfY2FsY3VsYXRlZFdpZHRoO1xuICAgICAgICAgICAgX2NhbnZhc1NpemUueSA9IF9jYWxjdWxhdGVkSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbSA9IHtcbiAgICAgICAgICAgIGdldFJlYWxXaWR0aCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlkZW8udmlkZW9XaWR0aDtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldFJlYWxIZWlnaHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZpZGVvLnZpZGVvSGVpZ2h0O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0V2lkdGgoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jYWxjdWxhdGVkV2lkdGg7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRIZWlnaHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jYWxjdWxhdGVkSGVpZ2h0O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0V2lkdGgod2lkdGgpIHtcbiAgICAgICAgICAgICAgICBfY2FsY3VsYXRlZFdpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgX2NhbGN1bGF0ZWRIZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRJbnB1dFN0cmVhbShjb25maWcpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG4gICAgICAgICAgICAgICAgX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3NyYycsICh0eXBlb2YgY29uZmlnLnNyYyAhPT0gJ3VuZGVmaW5lZCcpID8gY29uZmlnLnNyYyA6ICcnKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVuZGVkKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2aWRlby5lbmRlZDtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldENvbmZpZygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbmZpZztcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh2aWRlbykge1xuICAgICAgICAgICAgICAgICAgICB2aWRlby5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHBhdXNlKCkge1xuICAgICAgICAgICAgICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBwbGF5KCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgICAgICAgICB2aWRlby5wbGF5KCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRDdXJyZW50VGltZSh0aW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jb25maWc/LnR5cGUgIT09ICdMaXZlU3RyZWFtJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY3VycmVudFRpbWUnLCB0aW1lLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGYsIGJvb2wpIHtcbiAgICAgICAgICAgICAgICBpZiAoX2V2ZW50TmFtZXMuaW5kZXhPZihldmVudCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghX2V2ZW50SGFuZGxlcnNbZXZlbnRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZXZlbnRIYW5kbGVyc1tldmVudF0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfZXZlbnRIYW5kbGVyc1tldmVudF0ucHVzaChmKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmLCBib29sKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjbGVhckV2ZW50SGFuZGxlcnMoKSB7XG4gICAgICAgICAgICAgICAgX2V2ZW50TmFtZXMuZm9yRWFjaCgoZXZlbnROYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gX2V2ZW50SGFuZGxlcnNbZXZlbnROYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdHJpZ2dlcihldmVudE5hbWUsIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgajtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlcnMgPSBfZXZlbnRIYW5kbGVyc1tldmVudE5hbWVdO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gJ2NhbnJlY29yZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5pdFNpemUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGhhbmRsZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyc1tqXS5hcHBseShpbnB1dFN0cmVhbSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRUb3BSaWdodCh0b3BSaWdodCkge1xuICAgICAgICAgICAgICAgIF90b3BSaWdodC54ID0gdG9wUmlnaHQueDtcbiAgICAgICAgICAgICAgICBfdG9wUmlnaHQueSA9IHRvcFJpZ2h0Lnk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRUb3BSaWdodCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RvcFJpZ2h0O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0Q2FudmFzU2l6ZShzaXplKSB7XG4gICAgICAgICAgICAgICAgX2NhbnZhc1NpemUueCA9IHNpemUueDtcbiAgICAgICAgICAgICAgICBfY2FudmFzU2l6ZS55ID0gc2l6ZS55O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0Q2FudmFzU2l6ZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NhbnZhc1NpemU7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRGcmFtZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlkZW87XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW07XG4gICAgfSxcbiAgICBjcmVhdGVMaXZlU3RyZWFtKHZpZGVvKTogSW5wdXRTdHJlYW0ge1xuICAgICAgICBjb25zb2xlLndhcm4oJyoqKiogSW5wdXRTdHJlYW1Ccm93c2VyIGNyZWF0ZUxpdmVTdHJlYW0nKTtcbiAgICAgICAgaWYgKHZpZGVvKSB7XG4gICAgICAgICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ2F1dG9wbGF5JywgJ3RydWUnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aGF0ID0gaW5wdXRTdHJlYW1GYWN0b3J5LmNyZWF0ZVZpZGVvU3RyZWFtKHZpZGVvKTtcbiAgICAgICAgdGhhdC5lbmRlZCA9IGZ1bmN0aW9uIGVuZGVkKCk6IGZhbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoYXQ7XG4gICAgfSxcbiAgICBjcmVhdGVJbWFnZVN0cmVhbSgpOiBJbnB1dFN0cmVhbSB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKioqKiBJbnB1dFN0cmVhbUJyb3dzZXIgY3JlYXRlSW1hZ2VTdHJlYW0nKTtcbiAgICAgICAgbGV0IF9jb25maWc6IHsgc2l6ZTogbnVtYmVyOyBzZXF1ZW5jZTogYW55IH0gfCBudWxsID0gbnVsbDtcblxuICAgICAgICBsZXQgd2lkdGggPSAwO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gMDtcbiAgICAgICAgbGV0IGZyYW1lSWR4ID0gMDtcbiAgICAgICAgbGV0IHBhdXNlZCA9IHRydWU7XG4gICAgICAgIGxldCBsb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGltZ0FycmF5OiBhbnlbXSB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IDE7XG4gICAgICAgIGxldCBiYXNlVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IGVuZGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBjYWxjdWxhdGVkV2lkdGg6IG51bWJlcjtcbiAgICAgICAgbGV0IGNhbGN1bGF0ZWRIZWlnaHQ6IG51bWJlcjtcbiAgICAgICAgY29uc3QgX2V2ZW50TmFtZXMgPSBbJ2NhbnJlY29yZCcsICdlbmRlZCddO1xuICAgICAgICBjb25zdCBfZXZlbnRIYW5kbGVyczogRXZlbnRIYW5kbGVyTGlzdCA9IHt9O1xuICAgICAgICBjb25zdCBfdG9wUmlnaHQ6IFBvaW50ID0geyB4OiAwLCB5OiAwLCB0eXBlOiAnUG9pbnQnIH07XG4gICAgICAgIGNvbnN0IF9jYW52YXNTaXplOiBYWVNpemUgPSB7IHg6IDAsIHk6IDAsIHR5cGU6ICdYWVNpemUnIH07XG5cbiAgICAgICAgZnVuY3Rpb24gbG9hZEltYWdlcygpOiB2b2lkIHtcbiAgICAgICAgICAgIGxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgSW1hZ2VMb2FkZXIubG9hZChiYXNlVXJsLCAoaW1nczogQXJyYXk8eyB0YWdzOiBhbnk7IGltZzogSFRNTEltYWdlRWxlbWVudH0+KSA9PiB7XG4gICAgICAgICAgICAgICAgaW1nQXJyYXkgPSBpbWdzO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgICAgICAgICBpZiAoaW1nc1swXS50YWdzICYmIGltZ3NbMF0udGFncy5vcmllbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaW1nc1swXS50YWdzLm9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBpbWdzWzBdLmltZy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gaW1nc1swXS5pbWcud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gaW1nc1swXS5pbWcud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gaW1nc1swXS5pbWcuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBpbWdzWzBdLmltZy53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gaW1nc1swXS5pbWcuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVkV2lkdGggPSBfY29uZmlnPy5zaXplID8gd2lkdGggLyBoZWlnaHQgPiAxID8gX2NvbmZpZy5zaXplIDogTWF0aC5mbG9vcigod2lkdGggLyBoZWlnaHQpICogX2NvbmZpZy5zaXplKSA6IHdpZHRoO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRIZWlnaHQgPSBfY29uZmlnPy5zaXplID8gd2lkdGggLyBoZWlnaHQgPiAxID8gTWF0aC5mbG9vcigoaGVpZ2h0IC8gd2lkdGgpICogX2NvbmZpZy5zaXplKSA6IF9jb25maWcuc2l6ZSA6IGhlaWdodDtcbiAgICAgICAgICAgICAgICBfY2FudmFzU2l6ZS54ID0gY2FsY3VsYXRlZFdpZHRoO1xuICAgICAgICAgICAgICAgIF9jYW52YXNTaXplLnkgPSBjYWxjdWxhdGVkSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZnJhbWVJZHggPSAwO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hFdmVudCgnY2FucmVjb3JkJywgW10pO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSwgb2Zmc2V0LCBzaXplLCBfY29uZmlnPy5zZXF1ZW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBwdWJsaXNoRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IEFycmF5PGFueT4pOiB2b2lkIHtcbiAgICAgICAgICAgIGxldCBqO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlcnMgPSBfZXZlbnRIYW5kbGVyc1tldmVudE5hbWVdO1xuXG4gICAgICAgICAgICBpZiAoaGFuZGxlcnMgJiYgaGFuZGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBoYW5kbGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzW2pdLmFwcGx5KGlucHV0U3RyZWFtLCBhcmdzIGFzIGFueSk7IC8vIFRPRE86IHR5cGVzY3JpcHQgY29tcGxhaW5zIHRoYXQgYW55W10gaXMgbm90IHZhbGlkIGZvciBhIHNlY29uZCBhcmcgZm9yIGFwcGx5PyFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBhbnkgY29kZSBzaGFyZWQgd2l0aCB0aGUgZmlyc3QgSW5wdXRTdHJlYW0gYWJvdmUgc2hvdWxkIGJlIHNoYXJlZCBub3QgY29waWVkXG4gICAgICAgIC8vIFRPRE86IHB1Ymxpc2hFdmVudCBuZWVkcyBhY2Nlc3MgdG8gaW5wdXRTdHJlYW0sIGJ1dCBpbnB1dFN0cmVhbSBuZWVkcyBhY2Nlc3MgdG8gcHVibGlzaEV2ZW50XG4gICAgICAgIC8vIFRPRE86IFRoaXMgaXMgd2h5IGl0J3MgYSAndmFyJywgc28gaXQgaG9pc3RzIGJhY2suICBUaGlzIGlzIHVnbHksIGFuZCBzaG91bGQgYmUgY2hhbmdlZC5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXZhcix2YXJzLW9uLXRvcFxuICAgICAgICB2YXIgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtID0ge1xuXG4gICAgICAgICAgICB0cmlnZ2VyOiBwdWJsaXNoRXZlbnQsXG5cbiAgICAgICAgICAgIGdldFdpZHRoKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxjdWxhdGVkV2lkdGg7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRIZWlnaHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZWRIZWlnaHQ7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRXaWR0aChuZXdXaWR0aCkge1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRXaWR0aCA9IG5ld1dpZHRoO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0SGVpZ2h0KG5ld0hlaWdodCkge1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRIZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRSZWFsV2lkdGgoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0UmVhbEhlaWdodCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0SW5wdXRTdHJlYW0oc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuICAgICAgICAgICAgICAgIF9jb25maWcgPSBzdHJlYW07XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uc2VxdWVuY2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwgPSBzdHJlYW0uc3JjO1xuICAgICAgICAgICAgICAgICAgICBzaXplID0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50LEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgICAgICAgICBiYXNlVXJsID0gc3RyZWFtLnNyYztcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHN0cmVhbS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvYWRJbWFnZXMoKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVuZGVkKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmRlZDtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZSgpIHt9LFxuXG4gICAgICAgICAgICBnZXRDb25maWcoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb25maWc7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBwYXVzZSgpIHtcbiAgICAgICAgICAgICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcGxheSgpIHtcbiAgICAgICAgICAgICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNldEN1cnJlbnRUaW1lKHRpbWUpIHtcbiAgICAgICAgICAgICAgICBmcmFtZUlkeCA9IHRpbWU7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9ldmVudE5hbWVzLmluZGV4T2YoZXZlbnQpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV9ldmVudEhhbmRsZXJzW2V2ZW50XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2V2ZW50SGFuZGxlcnNbZXZlbnRdID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX2V2ZW50SGFuZGxlcnNbZXZlbnRdLnB1c2goZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY2xlYXJFdmVudEhhbmRsZXJzKCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKF9ldmVudEhhbmRsZXJzKS5mb3JFYWNoKChpbmQpID0+IGRlbGV0ZSBfZXZlbnRIYW5kbGVyc1tpbmRdKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNldFRvcFJpZ2h0KHRvcFJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgX3RvcFJpZ2h0LnggPSB0b3BSaWdodC54O1xuICAgICAgICAgICAgICAgIF90b3BSaWdodC55ID0gdG9wUmlnaHQueTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldFRvcFJpZ2h0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfdG9wUmlnaHQ7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRDYW52YXNTaXplKGNhbnZhc1NpemUpIHtcbiAgICAgICAgICAgICAgICBfY2FudmFzU2l6ZS54ID0gY2FudmFzU2l6ZS54O1xuICAgICAgICAgICAgICAgIF9jYW52YXNTaXplLnkgPSBjYW52YXNTaXplLnk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRDYW52YXNTaXplKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfY2FudmFzU2l6ZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldEZyYW1lKCkge1xuICAgICAgICAgICAgICAgIGxldCBmcmFtZTtcblxuICAgICAgICAgICAgICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXBhdXNlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG4gICAgICAgICAgICAgICAgICAgIGZyYW1lID0gaW1nQXJyYXk/LltmcmFtZUlkeF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZUlkeCA8IChzaXplIC0gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSWR4Kys7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaEV2ZW50KCdlbmRlZCcsIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLXJldHVyblxuICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpbnB1dFN0cmVhbTtcbiAgICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgaW5wdXRTdHJlYW1GYWN0b3J5O1xuIiwiaW1wb3J0IHsgUXVhZ2dhSlNDb25maWdPYmplY3QgfSBmcm9tIFwiLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2FcIjtcbmltcG9ydCBJbWFnZVdyYXBwZXIgZnJvbSBcImNvbW1vbi9pbWFnZV93cmFwcGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWFnZ2FDb250ZXh0IHtcbiAgICBwdWJsaWMgY29uZmlnPzogUXVhZ2dhSlNDb25maWdPYmplY3Q7XG5cbiAgICBwdWJsaWMgaW5wdXRTdHJlYW06IGFueTtcblxuICAgIHB1YmxpYyBmcmFtZWdyYWJiZXI6IGFueTtcblxuICAgIHB1YmxpYyBpbnB1dEltYWdlV3JhcHBlcj86IEltYWdlV3JhcHBlcjtcblxuICAgIHB1YmxpYyBzdG9wcGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgYm94U2l6ZTogYW55O1xuXG4gICAgcHVibGljIHJlc3VsdENvbGxlY3RvcjogYW55O1xuXG4gICAgcHVibGljIGRlY29kZXI6IGFueTtcblxuICAgIHB1YmxpYyB3b3JrZXJQb29sOiBhbnlbXSA9IFtdO1xuXG4gICAgcHVibGljIG9uVUlUaHJlYWQgPSB0cnVlO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGNhbnZhc0NvbnRhaW5lciA9IG5ldyBDYW52YXNDb250YWluZXIoKTtcbn1cblxuZXhwb3J0IGNsYXNzIENhbnZhc0luZm8ge1xuICAgIGltYWdlOiBhbnk7XG4gICAgb3ZlcmxheTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgQ2FudmFzQ29udGFpbmVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgY3R4OiBDYW52YXNJbmZvO1xuICAgIHB1YmxpYyByZWFkb25seSBkb206IENhbnZhc0luZm87XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jdHggPSBuZXcgQ2FudmFzSW5mbygpO1xuICAgICAgICB0aGlzLmRvbSA9IG5ldyBDYW52YXNJbmZvKCk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Vmlld1BvcnQodGFyZ2V0PzogRWxlbWVudCB8IHN0cmluZyk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0YXJnZXQgaXMgYWxyZWFkeSBhIERPTSBlbGVtZW50XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5ub2RlTmFtZSAmJiB0YXJnZXQubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgLy8gVXNlICcjaW50ZXJhY3RpdmUudmlld3BvcnQnIGFzIGEgZmFsbGJhY2sgc2VsZWN0b3IgKGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICAgIGNvbnN0IHNlbGVjdG9yID0gdHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycgPyB0YXJnZXQgOiAnI2ludGVyYWN0aXZlLnZpZXdwb3J0JztcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG59XG4iLCJpbXBvcnQgeyBnbE1hdHJpeCwgdmVjMiB9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgSW1hZ2VXcmFwcGVyIGZyb20gJy4uL2NvbW1vbi9pbWFnZV93cmFwcGVyJztcbmltcG9ydCB0eXBlIHsgSW5wdXRTdHJlYW0gfSBmcm9tICcuLi9pbnB1dC9pbnB1dF9zdHJlYW0vaW5wdXRfc3RyZWFtLmQnO1xuaW1wb3J0IEJhcmNvZGVMb2NhdG9yIGZyb20gJy4uL2xvY2F0b3IvYmFyY29kZV9sb2NhdG9yJztcblxuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtcblxuLy8gVE9ETzogbmVlZCB0eXBlc2NyaXB0IGRlZiBmb3IgQmFyY29kZUxvY2F0b3JcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRCdWZmZXJzKFxuICAgIGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbSxcbiAgICBpbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlciB8IHVuZGVmaW5lZCxcbiAgICBsb2NhdG9yOiBhbnksXG4pIHtcbiAgICBjb25zdCBpbnB1dEltYWdlV3JhcHBlciA9IGltYWdlV3JhcHBlciB8fCBuZXcgSW1hZ2VXcmFwcGVyKHtcbiAgICAgICAgeDogaW5wdXRTdHJlYW0uZ2V0V2lkdGgoKSxcbiAgICAgICAgeTogaW5wdXRTdHJlYW0uZ2V0SGVpZ2h0KCksXG4gICAgICAgIHR5cGU6ICdYWVNpemUnLFxuICAgIH0pO1xuXG4gICAgaWYgKEVOVi5kZXZlbG9wbWVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgaW1hZ2Ugd3JhcHBlciBzaXplICR7aW5wdXRJbWFnZVdyYXBwZXIuc2l6ZX1gKTtcbiAgICB9XG4gICAgY29uc3QgYm94U2l6ZSA9IFtcbiAgICAgICAgdmVjMi5jbG9uZShbMCwgMF0pLFxuICAgICAgICB2ZWMyLmNsb25lKFswLCBpbnB1dEltYWdlV3JhcHBlci5zaXplLnldKSxcbiAgICAgICAgdmVjMi5jbG9uZShbaW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS54LCBpbnB1dEltYWdlV3JhcHBlci5zaXplLnldKSxcbiAgICAgICAgdmVjMi5jbG9uZShbaW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS54LCAwXSksXG4gICAgXTtcbiAgICBCYXJjb2RlTG9jYXRvci5pbml0KGlucHV0SW1hZ2VXcmFwcGVyLCBsb2NhdG9yKTtcbiAgICByZXR1cm4geyBpbnB1dEltYWdlV3JhcHBlciwgYm94U2l6ZSB9O1xufVxuIiwiaW1wb3J0IHsgUXVhZ2dhQ29udGV4dCwgQ2FudmFzQ29udGFpbmVyIH0gZnJvbSAnUXVhZ2dhQ29udGV4dCc7XG5pbXBvcnQgZ2V0Vmlld1BvcnQgZnJvbSAnLi9nZXRWaWV3UG9ydCc7XG5pbXBvcnQgdHlwZSB7IFhZU2l6ZSB9IGZyb20gJy4uLy4uL3R5cGUtZGVmaW5pdGlvbnMvcXVhZ2dhLmQnO1xuXG5mdW5jdGlvbiBmaW5kT3JDcmVhdGVDYW52YXMoc2VsZWN0b3I6IHN0cmluZywgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICBpZiAoIWNhbnZhcykge1xuICAgICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgY2FudmFzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbnZhcztcbn1cblxuZnVuY3Rpb24gZ2V0Q2FudmFzQW5kQ29udGV4dChzZWxlY3Rvcjogc3RyaW5nLCBjbGFzc05hbWU6IHN0cmluZywgb3B0aW9uczogeyB3aWxsUmVhZEZyZXF1ZW50bHk6IGJvb2xlYW4gfSkge1xuICAgIGNvbnN0IGNhbnZhcyA9IGZpbmRPckNyZWF0ZUNhbnZhcyhzZWxlY3RvciwgY2xhc3NOYW1lKTtcbiAgICBjb25zb2xlLndhcm4oJyogaW5pdENhbnZhcyBnZXRDYW52YXNBbmRDb250ZXh0Jyk7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiBvcHRpb25zLndpbGxSZWFkRnJlcXVlbnRseSB9KTtcbiAgICByZXR1cm4geyBjYW52YXMsIGNvbnRleHQgfTtcbn1cblxuZnVuY3Rpb24gaW5pdENhbnZhc2VzKGNhbnZhc1NpemU6IFhZU2l6ZSwgeyB3aWxsUmVhZEZyZXF1ZW50bHkgfTogeyB3aWxsUmVhZEZyZXF1ZW50bHk6IGJvb2xlYW4gfSk6IENhbnZhc0NvbnRhaW5lciB8IG51bGwge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gZ2V0Q2FudmFzQW5kQ29udGV4dCgnY2FudmFzLmltZ0J1ZmZlcicsICdpbWdCdWZmZXInLCB7IHdpbGxSZWFkRnJlcXVlbnRseSB9KTtcbiAgICAgICAgY29uc3Qgb3ZlcmxheSA9IGdldENhbnZhc0FuZENvbnRleHQoJ2NhbnZhcy5kcmF3aW5nQnVmZmVyJywgJ2RyYXdpbmdCdWZmZXInLCB7IHdpbGxSZWFkRnJlcXVlbnRseSB9KTtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbXVsdGktYXNzaWduXG4gICAgICAgIGltYWdlLmNhbnZhcy53aWR0aCA9IG92ZXJsYXkuY2FudmFzLndpZHRoID0gY2FudmFzU2l6ZS54O1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbXVsdGktYXNzaWduXG4gICAgICAgIGltYWdlLmNhbnZhcy5oZWlnaHQgPSBvdmVybGF5LmNhbnZhcy5oZWlnaHQgPSBjYW52YXNTaXplLnk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbToge1xuICAgICAgICAgICAgICAgIGltYWdlOiBpbWFnZS5jYW52YXMsXG4gICAgICAgICAgICAgICAgb3ZlcmxheTogb3ZlcmxheS5jYW52YXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3R4OiB7XG4gICAgICAgICAgICAgICAgaW1hZ2U6IGltYWdlLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgb3ZlcmxheTogb3ZlcmxheS5jb250ZXh0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRDYW52YXMoY29udGV4dDogUXVhZ2dhQ29udGV4dCk6IENhbnZhc0NvbnRhaW5lciB8IG51bGwge1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gZ2V0Vmlld1BvcnQoY29udGV4dD8uY29uZmlnPy5pbnB1dFN0cmVhbT8udGFyZ2V0KTtcbiAgICBjb25zdCB0eXBlID0gY29udGV4dD8uY29uZmlnPy5pbnB1dFN0cmVhbT8udHlwZTtcbiAgICBpZiAoIXR5cGUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGluaXRDYW52YXNlcyhjb250ZXh0LmlucHV0U3RyZWFtLmdldENhbnZhc1NpemUoKSwgeyB3aWxsUmVhZEZyZXF1ZW50bHk6ICEhY29udGV4dD8uY29uZmlnPy5pbnB1dFN0cmVhbT8ud2lsbFJlYWRGcmVxdWVudGx5IH0pO1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm4geyBkb206IHsgaW1hZ2U6IG51bGwsIG92ZXJsYXk6IG51bGwgfSwgY3R4OiB7IGltYWdlOiBudWxsLCBvdmVybGF5OiBudWxsIH0gfTtcblxuICAgIGNvbnN0IHsgZG9tIH0gPSBjb250YWluZXI7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ0ltYWdlU3RyZWFtJyAmJiAhdmlld3BvcnQuY29udGFpbnMoZG9tLmltYWdlKSkge1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0LmFwcGVuZENoaWxkKGRvbS5pbWFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXZpZXdwb3J0LmNvbnRhaW5zKGRvbS5vdmVybGF5KSkge1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0LmFwcGVuZENoaWxkKGRvbS5vdmVybGF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29udGFpbmVyO1xufVxuIiwiLyogV29ya2VyIGZ1bmN0aW9ucy4gVGhlc2UgYXJlIHN0cmFpZ2h0IGZyb20gdGhlIG9yaWdpbmFsIHF1YWdnYS5qcyBmaWxlLlxuICogTm90IHByZXNlbnRseSB1c2VkLCBhcyB3b3JrZXIgc3VwcG9ydCBpcyBub24tZnVuY3Rpb25hbC4gIEtlZXBpbmcgdGhlbSBhcm91bmQgdGVtcG9yYXJpbHlcbiAqIHRvIHJlZmVyIHRvIHVudGlsIGl0IGlzIHJlLWltcGxlbWVudGVkLiBXZSBtYXkgYmUgYWJsZSB0byBmaXgvdXNlIHNvbWUgb2YgdGhpcy5cbiAqL1xuXG5pbXBvcnQgeyBRdWFnZ2FKU0NvbmZpZ09iamVjdCwgUXVhZ2dhSlNSZWFkZXJDb25maWcgfSBmcm9tIFwiLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2FcIjtcblxuLy8gVE9ETzogbmVlZCBhIHR5cGVzY3JpcHQgaW50ZXJmYWNlIGZvciBGcmFtZUdyYWJiZXJcblxuaW50ZXJmYWNlIFFXb3JrZXJUaHJlYWQge1xuICAgIGltYWdlRGF0YTogVWludDhBcnJheTtcbiAgICBidXN5OiBib29sZWFuO1xuICAgIHdvcmtlcjogV29ya2VyO1xufVxuXG5sZXQgd29ya2VyUG9vbDogQXJyYXk8UVdvcmtlclRocmVhZD4gPSBbXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVdvcmtlcnMoZnJhbWVHcmFiYmVyOiBhbnkpIHtcbiAgICBsZXQgYXZhaWxhYmxlV29ya2VyOiBRV29ya2VyVGhyZWFkO1xuICAgIGlmICh3b3JrZXJQb29sLmxlbmd0aCkge1xuICAgICAgICBhdmFpbGFibGVXb3JrZXIgPSB3b3JrZXJQb29sLmZpbHRlcigod29ya2VyVGhyZWFkKSA9PiAhd29ya2VyVGhyZWFkLmJ1c3kpWzBdO1xuICAgICAgICBpZiAoYXZhaWxhYmxlV29ya2VyKSB7XG4gICAgICAgICAgICBmcmFtZUdyYWJiZXIuYXR0YWNoRGF0YShhdmFpbGFibGVXb3JrZXIuaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIGlmIChmcmFtZUdyYWJiZXIuZ3JhYigpKSB7XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV29ya2VyLmJ1c3kgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdvcmtlci53b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBjbWQ6ICdwcm9jZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VEYXRhOiBhdmFpbGFibGVXb3JrZXIuaW1hZ2VEYXRhLFxuICAgICAgICAgICAgICAgIH0sIFthdmFpbGFibGVXb3JrZXIuaW1hZ2VEYXRhLmJ1ZmZlcl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ0Zvcldvcmtlcihjb25maWc6IFF1YWdnYUpTQ29uZmlnT2JqZWN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICBpbnB1dFN0cmVhbToge1xuICAgICAgICAgICAgLi4uY29uZmlnLmlucHV0U3RyZWFtLFxuICAgICAgICAgICAgdGFyZ2V0OiBudWxsLFxuICAgICAgICB9LFxuICAgIH07XG59XG5cbi8vIEB0cy1pZ25vcmVcbmZ1bmN0aW9uIHdvcmtlckludGVyZmFjZShmYWN0b3J5KSB7XG4gICAgaWYgKGZhY3RvcnkpIHtcbiAgICAgICAgdmFyIFF1YWdnYSA9IGZhY3RvcnkoKS5kZWZhdWx0O1xuICAgICAgICBpZiAoIVF1YWdnYSkge1xuLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7ICdldmVudCc6ICdlcnJvcicsIG1lc3NhZ2U6ICdRdWFnZ2EgY291bGQgbm90IGJlIGNyZWF0ZWQnIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuLy8gQHRzLWlnbm9yZVxuICAgIHZhciBpbWFnZVdyYXBwZXI7XG5cbi8vIEB0cy1pZ25vcmVcbiAgICBmdW5jdGlvbiBvblByb2Nlc3NlZChyZXN1bHQpIHtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAnZXZlbnQnOiAncHJvY2Vzc2VkJyxcbi8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGltYWdlRGF0YTogaW1hZ2VXcmFwcGVyLmRhdGEsXG4gICAgICAgICAgICByZXN1bHQ6IHJlc3VsdCxcbi8vIEB0cy1pZ25vcmVcbiAgICAgICAgfSwgW2ltYWdlV3JhcHBlci5kYXRhLmJ1ZmZlcl0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdvcmtlckludGVyZmFjZVJlYWR5KCkge1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICdldmVudCc6ICdpbml0aWFsaXplZCcsXG4vLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpbWFnZURhdGE6IGltYWdlV3JhcHBlci5kYXRhLFxuLy8gQHRzLWlnbm9yZVxuICAgICAgICB9LCBbaW1hZ2VXcmFwcGVyLmRhdGEuYnVmZmVyXSk7XG4gICAgfVxuXG4vLyBAdHMtaWdub3JlXG4gICAgc2VsZi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS5kYXRhLmNtZCA9PT0gJ2luaXQnKSB7XG4gICAgICAgICAgICB2YXIgY29uZmlnID0gZS5kYXRhLmNvbmZpZztcbiAgICAgICAgICAgIGNvbmZpZy5udW1PZldvcmtlcnMgPSAwO1xuICAgICAgICAgICAgaW1hZ2VXcmFwcGVyID0gbmV3IFF1YWdnYS5JbWFnZVdyYXBwZXIoe1xuICAgICAgICAgICAgICAgIHg6IGUuZGF0YS5zaXplLngsXG4gICAgICAgICAgICAgICAgeTogZS5kYXRhLnNpemUueSxcbiAgICAgICAgICAgIH0sIG5ldyBVaW50OEFycmF5KGUuZGF0YS5pbWFnZURhdGEpKTtcbiAgICAgICAgICAgIFF1YWdnYS5pbml0KGNvbmZpZywgd29ya2VySW50ZXJmYWNlUmVhZHksIGltYWdlV3JhcHBlcik7XG4gICAgICAgICAgICBRdWFnZ2Eub25Qcm9jZXNzZWQob25Qcm9jZXNzZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5jbWQgPT09ICdwcm9jZXNzJykge1xuLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaW1hZ2VXcmFwcGVyLmRhdGEgPSBuZXcgVWludDhBcnJheShlLmRhdGEuaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIFF1YWdnYS5zdGFydCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5jbWQgPT09ICdzZXRSZWFkZXJzJykge1xuICAgICAgICAgICAgUXVhZ2dhLnNldFJlYWRlcnMoZS5kYXRhLnJlYWRlcnMpO1xuICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5jbWQgPT09ICdyZWdpc3RlclJlYWRlcicpIHtcbiAgICAgICAgICAgIFF1YWdnYS5yZWdpc3RlclJlYWRlcihlLmRhdGEubmFtZSwgZS5kYXRhLnJlYWRlcik7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVdvcmtlckJsb2IoKSB7XG4gICAgdmFyIGJsb2IsXG4gICAgICAgIGZhY3RvcnlTb3VyY2U7XG5cbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0eXBlb2YgX19mYWN0b3J5U291cmNlX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZmFjdG9yeVNvdXJjZSA9IF9fZmFjdG9yeVNvdXJjZV9fOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgfVxuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgICBibG9iID0gbmV3IEJsb2IoWycoJyArIHdvcmtlckludGVyZmFjZS50b1N0cmluZygpICsgJykoJyArIGZhY3RvcnlTb3VyY2UgKyAnKTsnXSxcbiAgICAgICAgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KTtcblxuICAgIHJldHVybiB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRXb3JrZXIoY29uZmlnOiBRdWFnZ2FKU0NvbmZpZ09iamVjdCwgaW5wdXRTdHJlYW06IGFueSwgY2I6IEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgYmxvYlVSTCA9IGdlbmVyYXRlV29ya2VyQmxvYigpO1xuICAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIoYmxvYlVSTCk7XG5cbiAgICBjb25zdCB3b3JrZXJUaHJlYWQ6IFFXb3JrZXJUaHJlYWQgPSB7XG4gICAgICAgIHdvcmtlcixcbiAgICAgICAgaW1hZ2VEYXRhOiBuZXcgVWludDhBcnJheShpbnB1dFN0cmVhbS5nZXRXaWR0aCgpICogaW5wdXRTdHJlYW0uZ2V0SGVpZ2h0KCkpLFxuICAgICAgICBidXN5OiB0cnVlLFxuICAgIH07XG5cbiAgICB3b3JrZXJUaHJlYWQud29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChlLmRhdGEuZXZlbnQgPT09ICdpbml0aWFsaXplZCcpIHtcbiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVSTCk7XG4gICAgICAgICAgICB3b3JrZXJUaHJlYWQuYnVzeSA9IGZhbHNlO1xuICAgICAgICAgICAgd29ya2VyVGhyZWFkLmltYWdlRGF0YSA9IG5ldyBVaW50OEFycmF5KGUuZGF0YS5pbWFnZURhdGEpO1xuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXb3JrZXIgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNiKHdvcmtlclRocmVhZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmV2ZW50ID09PSAncHJvY2Vzc2VkJykge1xuICAgICAgICAgICAgd29ya2VyVGhyZWFkLmltYWdlRGF0YSA9IG5ldyBVaW50OEFycmF5KGUuZGF0YS5pbWFnZURhdGEpO1xuICAgICAgICAgICAgd29ya2VyVGhyZWFkLmJ1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIFRPRE86IGhvdyB0byB0aHJlYWQgcHVibGlzaFJlc3VsdCBpbnRvIGhlcmU/XG4gICAgICAgICAgICAvLyBwdWJsaXNoUmVzdWx0KGUuZGF0YS5yZXN1bHQsIHdvcmtlclRocmVhZC5pbWFnZURhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5ldmVudCA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXb3JrZXIgZXJyb3I6ICcgKyBlLmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgd29ya2VyVGhyZWFkLndvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIGNtZDogJ2luaXQnLFxuICAgICAgICBzaXplOiB7IHg6IGlucHV0U3RyZWFtLmdldFdpZHRoKCksIHk6IGlucHV0U3RyZWFtLmdldEhlaWdodCgpIH0sXG4gICAgICAgIGltYWdlRGF0YTogd29ya2VyVGhyZWFkLmltYWdlRGF0YSxcbiAgICAgICAgY29uZmlnOiBjb25maWdGb3JXb3JrZXIoY29uZmlnKSxcbiAgICB9LCBbd29ya2VyVGhyZWFkLmltYWdlRGF0YS5idWZmZXJdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkanVzdFdvcmtlclBvb2woY2FwYWNpdHk6IG51bWJlciwgY29uZmlnPzogUXVhZ2dhSlNDb25maWdPYmplY3QsIGlucHV0U3RyZWFtPzogYW55LCBjYj86IEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgaW5jcmVhc2VCeSA9IGNhcGFjaXR5IC0gd29ya2VyUG9vbC5sZW5ndGg7XG4gICAgaWYgKGluY3JlYXNlQnkgPT09IDAgJiYgY2IpIHtcbiAgICAgICAgY2IoKTtcbiAgICB9IGVsc2UgaWYgKGluY3JlYXNlQnkgPCAwKSB7XG4gICAgICAgIGNvbnN0IHdvcmtlcnNUb1Rlcm1pbmF0ZSA9IHdvcmtlclBvb2wuc2xpY2UoaW5jcmVhc2VCeSk7XG4gICAgICAgIHdvcmtlcnNUb1Rlcm1pbmF0ZS5mb3JFYWNoKGZ1bmN0aW9uICh3b3JrZXJUaHJlYWQpIHtcbiAgICAgICAgICAgIHdvcmtlclRocmVhZC53b3JrZXIudGVybWluYXRlKCk7XG4gICAgICAgICAgICBpZiAoRU5WLmRldmVsb3BtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1dvcmtlciB0ZXJtaW5hdGVkIScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgd29ya2VyUG9vbCA9IHdvcmtlclBvb2wuc2xpY2UoMCwgaW5jcmVhc2VCeSk7XG4gICAgICAgIGlmIChjYikge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHdvcmtlckluaXRpYWxpemVkID0gKHdvcmtlclRocmVhZDogUVdvcmtlclRocmVhZCkgPT4ge1xuICAgICAgICAgICAgd29ya2VyUG9vbC5wdXNoKHdvcmtlclRocmVhZCk7XG4gICAgICAgICAgICBpZiAod29ya2VyUG9vbC5sZW5ndGggPj0gY2FwYWNpdHkgJiYgY2IpIHtcbiAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5jcmVhc2VCeTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaW5pdFdvcmtlcihjb25maWcsIGlucHV0U3RyZWFtLCB3b3JrZXJJbml0aWFsaXplZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRSZWFkZXJzKHJlYWRlcnM6IEFycmF5PFF1YWdnYUpTUmVhZGVyQ29uZmlnPikge1xuICAgIHdvcmtlclBvb2wuZm9yRWFjaCgod29ya2VyVGhyZWFkKSA9PiB3b3JrZXJUaHJlYWQud29ya2VyLnBvc3RNZXNzYWdlKHsgY21kOiAnc2V0UmVhZGVycycsIHJlYWRlcnMgfSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSZWFkZXIobmFtZTogc3RyaW5nLCByZWFkZXI6IGFueSkge1xuICAgIHdvcmtlclBvb2wuZm9yRWFjaCgod29ya2VyVGhyZWFkKSA9PiB3b3JrZXJUaHJlYWQud29ya2VyLnBvc3RNZXNzYWdlKHsgY21kOiAncmVnaXN0ZXJSZWFkZXInLCBuYW1lLCByZWFkZXIgfSkpO1xufVxuIiwiaW1wb3J0IHsgSW5wdXRTdHJlYW1GYWN0b3J5IH0gZnJvbSAnaW5wdXQvaW5wdXRfc3RyZWFtL2lucHV0X3N0cmVhbS5kJztcbmltcG9ydCB0eXBlIHsgSW5wdXRTdHJlYW1UeXBlIH0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5cbi8vIFRPRE86IG5lZWQgdG8gY3JlYXRlIGFuIElucHV0U3RyZWFtIHR5cGVzY3JpcHQgaW50ZXJmYWNlLCBzbyB3ZSBkb24ndCBoYXZlIGFuIFwiYW55XCIgaW4gdGhlIG5leHQgbGluZVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0dXBJbnB1dFN0cmVhbSh0eXBlOiBJbnB1dFN0cmVhbVR5cGUgPSAnTGl2ZVN0cmVhbScsIHZpZXdwb3J0OiBFbGVtZW50IHwgbnVsbCwgaW5wdXRTdHJlYW1GYWN0b3J5OiBJbnB1dFN0cmVhbUZhY3RvcnkpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAnVmlkZW9TdHJlYW0nOiB7XG4gICAgICAgICAgICBjb25zdCB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZpZGVvLFxuICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtOiBpbnB1dFN0cmVhbUZhY3RvcnkuY3JlYXRlVmlkZW9TdHJlYW0odmlkZW8pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdJbWFnZVN0cmVhbSc6XG4gICAgICAgICAgICByZXR1cm4geyBpbnB1dFN0cmVhbTogaW5wdXRTdHJlYW1GYWN0b3J5LmNyZWF0ZUltYWdlU3RyZWFtKCkgfTtcbiAgICAgICAgY2FzZSAnTGl2ZVN0cmVhbSc6IHtcbiAgICAgICAgICAgIGxldCB2aWRlbzogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgdmlkZW8gPSB2aWV3cG9ydC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpO1xuICAgICAgICAgICAgICAgIGlmICghdmlkZW8pIHtcbiAgICAgICAgICAgICAgICAgICAgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydC5hcHBlbmRDaGlsZCh2aWRlbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2aWRlbyxcbiAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbTogaW5wdXRTdHJlYW1GYWN0b3J5LmNyZWF0ZUxpdmVTdHJlYW0odmlkZW8gYXMgSFRNTFZpZGVvRWxlbWVudCksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAqIHNldHVwSW5wdXRTdHJlYW0gaW52YWxpZCB0eXBlICR7dHlwZX1gKTtcbiAgICAgICAgICAgIHJldHVybiB7IHZpZGVvOiBudWxsLCBpbnB1dFN0cmVhbTogbnVsbCB9O1xuICAgIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5pbXBvcnQgdHlwZSB7IFBvaW50IH0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5cbmV4cG9ydCB0eXBlIEJveCA9IEFycmF5PFsgbnVtYmVyLCBudW1iZXIgXT47XG5cbmV4cG9ydCB0eXBlIExpbmUgPSBbIFBvaW50LCBQb2ludCBdO1xuXG5leHBvcnQgZnVuY3Rpb24gbW92ZUJveChib3g6IEJveCwgeE9mZnNldDogbnVtYmVyLCB5T2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgY29ybmVyID0gYm94Lmxlbmd0aDtcbiAgICB3aGlsZSAoY29ybmVyLS0pIHtcbiAgICAgICAgYm94W2Nvcm5lcl1bMF0gKz0geE9mZnNldDtcbiAgICAgICAgYm94W2Nvcm5lcl1bMV0gKz0geU9mZnNldDtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlTGluZShsaW5lOiBMaW5lLCB4T2Zmc2V0OiBudW1iZXIsIHlPZmZzZXQ6IG51bWJlcik6IHZvaWQge1xuICAgIGxpbmVbMF0ueCArPSB4T2Zmc2V0O1xuICAgIGxpbmVbMF0ueSArPSB5T2Zmc2V0O1xuICAgIGxpbmVbMV0ueCArPSB4T2Zmc2V0O1xuICAgIGxpbmVbMV0ueSArPSB5T2Zmc2V0O1xufVxuIiwiaW1wb3J0IHsgZ2xNYXRyaXgsIHZlYzIgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHsgUXVhZ2dhSlNSZXN1bHRPYmplY3QsIFF1YWdnYUpTUmVhZGVyQ29uZmlnIH0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5pbXBvcnQgRXZlbnRzIGZyb20gJy4uL2NvbW1vbi9ldmVudHMnO1xuaW1wb3J0IEltYWdlV3JhcHBlciBmcm9tICcuLi9jb21tb24vaW1hZ2Vfd3JhcHBlcic7XG5pbXBvcnQgQmFyY29kZURlY29kZXIgZnJvbSAnLi4vZGVjb2Rlci9iYXJjb2RlX2RlY29kZXInO1xuaW1wb3J0IENhbWVyYUFjY2VzcyBmcm9tICcuLi9pbnB1dC9jYW1lcmFfYWNjZXNzJztcbmltcG9ydCBGcmFtZUdyYWJiZXIgZnJvbSAnLi4vaW5wdXQvZnJhbWVfZ3JhYmJlci5qcyc7XG5pbXBvcnQgSW5wdXRTdHJlYW0gZnJvbSAnLi4vaW5wdXQvaW5wdXRfc3RyZWFtL2lucHV0X3N0cmVhbSc7XG5pbXBvcnQgQmFyY29kZUxvY2F0b3IgZnJvbSAnLi4vbG9jYXRvci9iYXJjb2RlX2xvY2F0b3InO1xuaW1wb3J0IHsgUXVhZ2dhQ29udGV4dCB9IGZyb20gJy4uL1F1YWdnYUNvbnRleHQnO1xuaW1wb3J0IHsgQmFyY29kZUluZm8gfSBmcm9tICcuLi9yZWFkZXIvYmFyY29kZV9yZWFkZXInO1xuaW1wb3J0IF9nZXRWaWV3UG9ydCBmcm9tICcuL2dldFZpZXdQb3J0JztcbmltcG9ydCBfaW5pdEJ1ZmZlcnMgZnJvbSAnLi9pbml0QnVmZmVycyc7XG5pbXBvcnQgX2luaXRDYW52YXMgZnJvbSAnLi9pbml0Q2FudmFzJztcbmltcG9ydCAqIGFzIFFXb3JrZXJzIGZyb20gJy4vcXdvcmtlcic7XG5pbXBvcnQgc2V0dXBJbnB1dFN0cmVhbSBmcm9tICcuL3NldHVwSW5wdXRTdHJlYW0nO1xuaW1wb3J0IHsgbW92ZUxpbmUsIG1vdmVCb3ggfSBmcm9tICcuL3RyYW5zZm9ybSc7XG5cbmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF1YWdnYSB7XG4gICAgY29udGV4dDogUXVhZ2dhQ29udGV4dCA9IG5ldyBRdWFnZ2FDb250ZXh0KCk7XG5cbiAgICBpbml0QnVmZmVycyhpbWFnZVdyYXBwZXI/OiBJbWFnZVdyYXBwZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuY29uZmlnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBpbnB1dEltYWdlV3JhcHBlciwgYm94U2l6ZSB9ID0gX2luaXRCdWZmZXJzKFxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlucHV0U3RyZWFtLFxuICAgICAgICAgICAgaW1hZ2VXcmFwcGVyLFxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmNvbmZpZy5sb2NhdG9yLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbnRleHQuaW5wdXRJbWFnZVdyYXBwZXIgPSBpbnB1dEltYWdlV3JhcHBlcjtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJveFNpemUgPSBib3hTaXplO1xuICAgIH1cblxuICAgIGluaXRpYWxpemVEYXRhKGltYWdlV3JhcHBlcj86IEltYWdlV3JhcHBlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5jb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluaXRCdWZmZXJzKGltYWdlV3JhcHBlcik7XG4gICAgICAgIHRoaXMuY29udGV4dC5kZWNvZGVyID0gQmFyY29kZURlY29kZXIuY3JlYXRlKHRoaXMuY29udGV4dC5jb25maWcuZGVjb2RlciwgdGhpcy5jb250ZXh0LmlucHV0SW1hZ2VXcmFwcGVyKTtcbiAgICB9XG5cbiAgICBnZXRWaWV3UG9ydCgpOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0LmNvbmZpZyB8fCAhdGhpcy5jb250ZXh0LmNvbmZpZy5pbnB1dFN0cmVhbSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0YXJnZXQgfSA9IHRoaXMuY29udGV4dC5jb25maWcuaW5wdXRTdHJlYW07XG4gICAgICAgIHJldHVybiBfZ2V0Vmlld1BvcnQodGFyZ2V0KTtcbiAgICB9XG5cbiAgICByZWFkeShjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRleHQuaW5wdXRTdHJlYW0ucGxheSgpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGluaXRDYW52YXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IF9pbml0Q2FudmFzKHRoaXMuY29udGV4dCk7XG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBjdHgsIGRvbSB9ID0gY29udGFpbmVyO1xuICAgICAgICB0aGlzLmNvbnRleHQuY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZSA9IGRvbS5pbWFnZTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmNhbnZhc0NvbnRhaW5lci5kb20ub3ZlcmxheSA9IGRvbS5vdmVybGF5O1xuICAgICAgICB0aGlzLmNvbnRleHQuY2FudmFzQ29udGFpbmVyLmN0eC5pbWFnZSA9IGN0eC5pbWFnZTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmNhbnZhc0NvbnRhaW5lci5jdHgub3ZlcmxheSA9IGN0eC5vdmVybGF5O1xuICAgIH1cblxuICAgIGNhblJlY29yZCA9IChjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5jb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBCYXJjb2RlTG9jYXRvci5jaGVja0ltYWdlQ29uc3RyYWludHModGhpcy5jb250ZXh0LmlucHV0U3RyZWFtLCB0aGlzLmNvbnRleHQuY29uZmlnPy5sb2NhdG9yKTtcbiAgICAgICAgdGhpcy5pbml0Q2FudmFzKCk7XG4gICAgICAgIHRoaXMuY29udGV4dC5mcmFtZWdyYWJiZXIgPSBGcmFtZUdyYWJiZXIuY3JlYXRlKFxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlucHV0U3RyZWFtLFxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmNhbnZhc0NvbnRhaW5lci5kb20uaW1hZ2UsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5jb25maWcubnVtT2ZXb3JrZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5jb25maWcubnVtT2ZXb3JrZXJzID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIFFXb3JrZXJzLmFkanVzdFdvcmtlclBvb2woXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuY29uZmlnLm51bU9mV29ya2VycyxcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5jb25maWcsXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5wdXRTdHJlYW0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5jb25maWc/Lm51bU9mV29ya2VycyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVEYXRhKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVhZHkoY2FsbGJhY2spO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgaW5pdElucHV0U3RyZWFtKGNhbGxiYWNrOiAoZXJyPzogRXJyb3IpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuY29uZmlnIHx8ICF0aGlzLmNvbnRleHQuY29uZmlnLmlucHV0U3RyZWFtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0eXBlOiBpbnB1dFR5cGUsIGNvbnN0cmFpbnRzIH0gPSB0aGlzLmNvbnRleHQuY29uZmlnLmlucHV0U3RyZWFtO1xuICAgICAgICBjb25zdCB7IHZpZGVvLCBpbnB1dFN0cmVhbSB9ID0gc2V0dXBJbnB1dFN0cmVhbShpbnB1dFR5cGUsIHRoaXMuZ2V0Vmlld1BvcnQoKSwgSW5wdXRTdHJlYW0pO1xuXG4gICAgICAgIGlmIChpbnB1dFR5cGUgPT09ICdMaXZlU3RyZWFtJyAmJiB2aWRlbykge1xuICAgICAgICAgICAgQ2FtZXJhQWNjZXNzLnJlcXVlc3QodmlkZW8sIGNvbnN0cmFpbnRzKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IGlucHV0U3RyZWFtLnRyaWdnZXIoJ2NhbnJlY29yZCcpKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiBjYWxsYmFjayhlcnIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnB1dFN0cmVhbSkge1xuICAgICAgICAgICAgaW5wdXRTdHJlYW0uc2V0QXR0cmlidXRlKCdwcmVsb2FkJywgJ2F1dG8nKTtcbiAgICAgICAgICAgIGlucHV0U3RyZWFtLnNldElucHV0U3RyZWFtKHRoaXMuY29udGV4dC5jb25maWcuaW5wdXRTdHJlYW0pO1xuICAgICAgICAgICAgaW5wdXRTdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignY2FucmVjb3JkJywgdGhpcy5jYW5SZWNvcmQuYmluZCh1bmRlZmluZWQsIGNhbGxiYWNrKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRleHQuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTtcbiAgICB9XG5cbiAgICBnZXRCb3VuZGluZ0JveGVzKCk6IEFycmF5PEFycmF5PG51bWJlcj4+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQuY29uZmlnPy5sb2NhdGUgPyBCYXJjb2RlTG9jYXRvci5sb2NhdGUoKVxuICAgICAgICAgICAgOiBbW1xuICAgICAgICAgICAgICAgIHZlYzIuY2xvbmUodGhpcy5jb250ZXh0LmJveFNpemVbMF0pLFxuICAgICAgICAgICAgICAgIHZlYzIuY2xvbmUodGhpcy5jb250ZXh0LmJveFNpemVbMV0pLFxuICAgICAgICAgICAgICAgIHZlYzIuY2xvbmUodGhpcy5jb250ZXh0LmJveFNpemVbMl0pLFxuICAgICAgICAgICAgICAgIHZlYzIuY2xvbmUodGhpcy5jb250ZXh0LmJveFNpemVbM10pLFxuICAgICAgICAgICAgXV07XG4gICAgfVxuXG4gICAgLy8gVE9ETzogbmVlZCBhIHR5cGVzY3JpcHQgdHlwZSBmb3IgcmVzdWx0IGhlcmUuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbiAgICB0cmFuc2Zvcm1SZXN1bHQocmVzdWx0OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9wUmlnaHQgPSB0aGlzLmNvbnRleHQuaW5wdXRTdHJlYW0uZ2V0VG9wUmlnaHQoKTtcbiAgICAgICAgY29uc3QgeE9mZnNldCA9IHRvcFJpZ2h0Lng7XG4gICAgICAgIGNvbnN0IHlPZmZzZXQgPSB0b3BSaWdodC55O1xuXG4gICAgICAgIGlmICh4T2Zmc2V0ID09PSAwICYmIHlPZmZzZXQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQuYmFyY29kZXMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IEJhcmNvZGVJbmZvIG1heSBub3QgYmUgdGhlIHJpZ2h0IHR5cGUgaGVyZS5cbiAgICAgICAgICAgIHJlc3VsdC5iYXJjb2Rlcy5mb3JFYWNoKChiYXJjb2RlOiBCYXJjb2RlSW5mbykgPT4gdGhpcy50cmFuc2Zvcm1SZXN1bHQoYmFyY29kZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdC5saW5lICYmIHJlc3VsdC5saW5lLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgbW92ZUxpbmUocmVzdWx0LmxpbmUsIHhPZmZzZXQsIHlPZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdC5ib3gpIHtcbiAgICAgICAgICAgIG1vdmVCb3gocmVzdWx0LmJveCwgeE9mZnNldCwgeU9mZnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0LmJveGVzICYmIHJlc3VsdC5ib3hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5ib3hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG1vdmVCb3gocmVzdWx0LmJveGVzW2ldLCB4T2Zmc2V0LCB5T2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFJlc3VsdChyZXN1bHQ6IFF1YWdnYUpTUmVzdWx0T2JqZWN0LCBpbWFnZURhdGE6IEFycmF5PG51bWJlcj4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpbWFnZURhdGEgfHwgIXRoaXMuY29udGV4dC5yZXN1bHRDb2xsZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2hhdCBkYXRhIHN0cnVjdHVyZSBob2xkcyBhIFwiYmFyY29kZXNcIiByZXN1bHQsIGlmIGFueS4uLlxuICAgICAgICBpZiAocmVzdWx0LmJhcmNvZGVzKSB7XG4gICAgICAgICAgICByZXN1bHQuYmFyY29kZXMuZmlsdGVyKChiYXJjb2RlOiBRdWFnZ2FKU1Jlc3VsdE9iamVjdCkgPT4gYmFyY29kZS5jb2RlUmVzdWx0KVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKChiYXJjb2RlOiBRdWFnZ2FKU1Jlc3VsdE9iamVjdCkgPT4gdGhpcy5hZGRSZXN1bHQoYmFyY29kZSwgaW1hZ2VEYXRhKSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmNvZGVSZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5yZXN1bHRDb2xsZWN0b3IuYWRkUmVzdWx0KFxuICAgICAgICAgICAgICAgIGltYWdlRGF0YSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5wdXRTdHJlYW0uZ2V0Q2FudmFzU2l6ZSgpLFxuICAgICAgICAgICAgICAgIHJlc3VsdC5jb2RlUmVzdWx0LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gICAgaGFzQ29kZVJlc3VsdChyZXN1bHQ6IFF1YWdnYUpTUmVzdWx0T2JqZWN0KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIShyZXN1bHQgJiYgKHJlc3VsdC5iYXJjb2Rlc1xuICAgICAgICAgICAgPyByZXN1bHQuYmFyY29kZXMuc29tZSgoYmFyY29kZSkgPT4gYmFyY29kZS5jb2RlUmVzdWx0KVxuICAgICAgICAgICAgOiByZXN1bHQuY29kZVJlc3VsdCkpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG4gICAgcHVibGlzaFJlc3VsdChyZXN1bHQ6IFF1YWdnYUpTUmVzdWx0T2JqZWN0IHwgbnVsbCA9IG51bGwsIGltYWdlRGF0YT86IGFueSk6IHZvaWQge1xuICAgICAgICBsZXQgcmVzdWx0VG9QdWJsaXNoOiBBcnJheTxRdWFnZ2FKU1Jlc3VsdE9iamVjdD4gfCBRdWFnZ2FKU1Jlc3VsdE9iamVjdCB8IG51bGwgPSByZXN1bHQ7XG5cbiAgICAgICAgaWYgKHJlc3VsdCAmJiB0aGlzLmNvbnRleHQub25VSVRocmVhZCkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1SZXN1bHQocmVzdWx0KTtcbiAgICAgICAgICAgIHRoaXMuYWRkUmVzdWx0KHJlc3VsdCwgaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIHJlc3VsdFRvUHVibGlzaCA9IHJlc3VsdC5iYXJjb2RlcyB8fCByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBFdmVudHMucHVibGlzaCgncHJvY2Vzc2VkJywgcmVzdWx0VG9QdWJsaXNoIGFzIG5ldmVyKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29kZVJlc3VsdChyZXN1bHQgYXMgUXVhZ2dhSlNSZXN1bHRPYmplY3QpKSB7XG4gICAgICAgICAgICBFdmVudHMucHVibGlzaCgnZGV0ZWN0ZWQnLCByZXN1bHRUb1B1Ymxpc2ggYXMgbmV2ZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgbG9jYXRlQW5kRGVjb2RlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBib3hlcyA9IHRoaXMuZ2V0Qm91bmRpbmdCb3hlcygpO1xuICAgICAgICBpZiAoYm94ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY29kZVJlc3VsdCA9IChhd2FpdCB0aGlzLmNvbnRleHQuZGVjb2Rlci5kZWNvZGVGcm9tQm91bmRpbmdCb3hlcyhib3hlcykpIHx8IHt9O1xuICAgICAgICAgICAgZGVjb2RlUmVzdWx0LmJveGVzID0gYm94ZXM7XG4gICAgICAgICAgICB0aGlzLnB1Ymxpc2hSZXN1bHQoZGVjb2RlUmVzdWx0LCB0aGlzLmNvbnRleHQuaW5wdXRJbWFnZVdyYXBwZXI/LmRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW1hZ2VSZXN1bHQgPSBhd2FpdCB0aGlzLmNvbnRleHQuZGVjb2Rlci5kZWNvZGVGcm9tSW1hZ2UodGhpcy5jb250ZXh0LmlucHV0SW1hZ2VXcmFwcGVyKTtcbiAgICAgICAgICAgIGlmIChpbWFnZVJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaFJlc3VsdChpbWFnZVJlc3VsdCwgdGhpcy5jb250ZXh0LmlucHV0SW1hZ2VXcmFwcGVyPy5kYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdWJsaXNoUmVzdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQub25VSVRocmVhZCkge1xuICAgICAgICAgICAgY29uc3Qgd29ya2Vyc1VwZGF0ZWQgPSBRV29ya2Vycy51cGRhdGVXb3JrZXJzKHRoaXMuY29udGV4dC5mcmFtZWdyYWJiZXIpO1xuICAgICAgICAgICAgaWYgKCF3b3JrZXJzVXBkYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5mcmFtZWdyYWJiZXIuYXR0YWNoRGF0YSh0aGlzLmNvbnRleHQuaW5wdXRJbWFnZVdyYXBwZXI/LmRhdGEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuZnJhbWVncmFiYmVyLmdyYWIoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXdvcmtlcnNVcGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0ZUFuZERlY29kZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmZyYW1lZ3JhYmJlci5hdHRhY2hEYXRhKHRoaXMuY29udGV4dC5pbnB1dEltYWdlV3JhcHBlcj8uZGF0YSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZnJhbWVncmFiYmVyLmdyYWIoKTtcbiAgICAgICAgICAgIHRoaXMubG9jYXRlQW5kRGVjb2RlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgc3RhcnRDb250aW51b3VzVXBkYXRlKCk6IHZvaWQge1xuICAgICAgICBsZXQgbmV4dDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gMTAwMCAvICh0aGlzLmNvbnRleHQuY29uZmlnPy5mcmVxdWVuY3kgfHwgNjApO1xuXG4gICAgICAgIHRoaXMuY29udGV4dC5zdG9wcGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHsgY29udGV4dCB9ID0gdGhpcztcblxuICAgICAgICBjb25zdCBuZXdGcmFtZSA9ICh0aW1lc3RhbXA6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbmV4dCA9IG5leHQgfHwgdGltZXN0YW1wO1xuICAgICAgICAgICAgaWYgKCFjb250ZXh0LnN0b3BwZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGltZXN0YW1wID49IG5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCArPSBkZWxheTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShuZXdGcmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbmV3RnJhbWUocGVyZm9ybWFuY2Uubm93KCkpO1xuICAgIH1cblxuICAgIHN0YXJ0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0Lm9uVUlUaHJlYWQgJiYgdGhpcy5jb250ZXh0LmNvbmZpZz8uaW5wdXRTdHJlYW0/LnR5cGUgPT09ICdMaXZlU3RyZWFtJykge1xuICAgICAgICAgICAgdGhpcy5zdGFydENvbnRpbnVvdXNVcGRhdGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbnRleHQuc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIFFXb3JrZXJzLmFkanVzdFdvcmtlclBvb2woMCk7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuY29uZmlnPy5pbnB1dFN0cmVhbSAmJiB0aGlzLmNvbnRleHQuY29uZmlnLmlucHV0U3RyZWFtLnR5cGUgPT09ICdMaXZlU3RyZWFtJykge1xuICAgICAgICAgICAgYXdhaXQgQ2FtZXJhQWNjZXNzLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5pbnB1dFN0cmVhbS5jbGVhckV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFJlYWRlcnMocmVhZGVyczogQXJyYXk8UXVhZ2dhSlNSZWFkZXJDb25maWc+KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuZGVjb2Rlcikge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRlY29kZXIuc2V0UmVhZGVycyhyZWFkZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBRV29ya2Vycy5zZXRSZWFkZXJzKHJlYWRlcnMpO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyUmVhZGVyKG5hbWU6IHN0cmluZywgcmVhZGVyOiBRdWFnZ2FKU1JlYWRlckNvbmZpZyk6IHZvaWQge1xuICAgICAgICBCYXJjb2RlRGVjb2Rlci5yZWdpc3RlclJlYWRlcihuYW1lLCByZWFkZXIpO1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmRlY29kZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5kZWNvZGVyLnJlZ2lzdGVyUmVhZGVyKG5hbWUsIHJlYWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgUVdvcmtlcnMucmVnaXN0ZXJSZWFkZXIobmFtZSwgcmVhZGVyKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgbWVyZ2UgZnJvbSAnbG9kYXNoL21lcmdlJztcbmltcG9ydCBUeXBlRGVmcyBmcm9tICcuL2NvbW1vbi90eXBlZGVmcyc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCBJbWFnZVdyYXBwZXIgZnJvbSAnLi9jb21tb24vaW1hZ2Vfd3JhcHBlcic7XG5pbXBvcnQgQmFyY29kZURlY29kZXIgZnJvbSAnLi9kZWNvZGVyL2JhcmNvZGVfZGVjb2Rlcic7XG5pbXBvcnQgKiBhcyBSZWFkZXJzIGZyb20gJy4vcmVhZGVyL2luZGV4JztcbmltcG9ydCBFdmVudHMgZnJvbSAnLi9jb21tb24vZXZlbnRzJztcbmltcG9ydCBDYW1lcmFBY2Nlc3MgZnJvbSAnLi9pbnB1dC9jYW1lcmFfYWNjZXNzJztcbmltcG9ydCBJbWFnZURlYnVnIGZyb20gJy4vY29tbW9uL2ltYWdlX2RlYnVnJztcbmltcG9ydCBSZXN1bHRDb2xsZWN0b3IgZnJvbSAnLi9hbmFseXRpY3MvcmVzdWx0X2NvbGxlY3Rvcic7XG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vY29uZmlnL2NvbmZpZyc7XG5cbmltcG9ydCBRdWFnZ2EgZnJvbSAnLi9xdWFnZ2EvcXVhZ2dhJztcblxuY29uc3QgaW5zdGFuY2UgPSBuZXcgUXVhZ2dhKCk7XG5jb25zdCBfY29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG5cbmNvbnN0IFF1YWdnYUpTU3RhdGljSW50ZXJmYWNlID0ge1xuICAgIGluaXQ6IGZ1bmN0aW9uIChjb25maWcsIGNiLCBpbWFnZVdyYXBwZXIsIHF1YWdnYUluc3RhbmNlID0gaW5zdGFuY2UpIHtcbiAgICAgICAgbGV0IHByb21pc2U7XG4gICAgICAgIGlmICghY2IpIHtcbiAgICAgICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY2IgPSAoZXJyKSA9PiB7IGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZSgpOyB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcXVhZ2dhSW5zdGFuY2UuY29udGV4dC5jb25maWcgPSBtZXJnZSh7fSwgQ29uZmlnLCBjb25maWcpO1xuICAgICAgICAvLyBUT0RPICMxNzk6IHBlbmRpbmcgcmVzdHJ1Y3R1cmUgaW4gSXNzdWUgIzE3OSwgd2UgYXJlIHRlbXAgZGlzYWJsaW5nIHdvcmtlcnNcbiAgICAgICAgaWYgKHF1YWdnYUluc3RhbmNlLmNvbnRleHQuY29uZmlnLm51bU9mV29ya2VycyA+IDApIHtcbiAgICAgICAgICAgIHF1YWdnYUluc3RhbmNlLmNvbnRleHQuY29uZmlnLm51bU9mV29ya2VycyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGltYWdlV3JhcHBlcikge1xuICAgICAgICAgICAgcXVhZ2dhSW5zdGFuY2UuY29udGV4dC5vblVJVGhyZWFkID0gZmFsc2U7XG4gICAgICAgICAgICBxdWFnZ2FJbnN0YW5jZS5pbml0aWFsaXplRGF0YShpbWFnZVdyYXBwZXIpO1xuICAgICAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1YWdnYUluc3RhbmNlLmluaXRJbnB1dFN0cmVhbShjYik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfSxcbiAgICBzdGFydDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2Uuc3RhcnQoKTtcbiAgICB9LFxuICAgIHN0b3A6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnN0b3AoKTtcbiAgICB9LFxuICAgIHBhdXNlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9jb250ZXh0LnN0b3BwZWQgPSB0cnVlO1xuICAgIH0sXG4gICAgb25EZXRlY3RlZDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghY2FsbGJhY2sgfHwgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJyAmJiAodHlwZW9mIGNhbGxiYWNrICE9PSAnb2JqZWN0JyB8fCAhY2FsbGJhY2suY2FsbGJhY2spKSkge1xuICAgICAgICAgICAgY29uc29sZS50cmFjZSgnKiB3YXJuaW5nOiBRdWFnZ2Eub25EZXRlY3RlZCBjYWxsZWQgd2l0aCBpbnZhbGlkIGNhbGxiYWNrLCBpZ25vcmluZycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIEV2ZW50cy5zdWJzY3JpYmUoJ2RldGVjdGVkJywgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgb2ZmRGV0ZWN0ZWQ6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBFdmVudHMudW5zdWJzY3JpYmUoJ2RldGVjdGVkJywgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgb25Qcm9jZXNzZWQ6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBpZiAoIWNhbGxiYWNrIHx8ICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicgJiYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ29iamVjdCcgfHwgIWNhbGxiYWNrLmNhbGxiYWNrKSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUudHJhY2UoJyogd2FybmluZzogUXVhZ2dhLm9uUHJvY2Vzc2VkIGNhbGxlZCB3aXRoIGludmFsaWQgY2FsbGJhY2ssIGlnbm9yaW5nJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgRXZlbnRzLnN1YnNjcmliZSgncHJvY2Vzc2VkJywgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgb2ZmUHJvY2Vzc2VkOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgRXZlbnRzLnVuc3Vic2NyaWJlKCdwcm9jZXNzZWQnLCBjYWxsYmFjayk7XG4gICAgfSxcbiAgICBzZXRSZWFkZXJzOiBmdW5jdGlvbiAocmVhZGVycykge1xuICAgICAgICBpZiAoIXJlYWRlcnMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUudHJhY2UoJyogd2FybmluZzogUXVhZ2dhLnNldFJlYWRlcnMgY2FsbGVkIHdpdGggbm8gcmVhZGVycywgaWdub3JpbmcnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZS5zZXRSZWFkZXJzKHJlYWRlcnMpO1xuICAgIH0sXG4gICAgcmVnaXN0ZXJSZWFkZXI6IGZ1bmN0aW9uIChuYW1lLCByZWFkZXIpIHtcbiAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLnRyYWNlKCcqIHdhcm5pbmc6IFF1YWdnYS5yZWdpc3RlclJlYWRlciBjYWxsZWQgd2l0aCBubyBuYW1lLCBpZ25vcmluZycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLnRyYWNlKCcqIHdhcm5pbmc6IFF1YWdnYS5yZWdpc3RlclJlYWRlciBjYWxsZWQgd2l0aCBubyByZWFkZXIsIGlnbm9yaW5nJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UucmVnaXN0ZXJSZWFkZXIobmFtZSwgcmVhZGVyKTtcbiAgICB9LFxuICAgIHJlZ2lzdGVyUmVzdWx0Q29sbGVjdG9yOiBmdW5jdGlvbiAocmVzdWx0Q29sbGVjdG9yKSB7XG4gICAgICAgIGlmIChyZXN1bHRDb2xsZWN0b3IgJiYgdHlwZW9mIHJlc3VsdENvbGxlY3Rvci5hZGRSZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIF9jb250ZXh0LnJlc3VsdENvbGxlY3RvciA9IHJlc3VsdENvbGxlY3RvcjtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZ2V0IGNhbnZhcygpIHtcbiAgICAgICAgcmV0dXJuIF9jb250ZXh0LmNhbnZhc0NvbnRhaW5lcjtcbiAgICB9LFxuICAgIGRlY29kZVNpbmdsZTogZnVuY3Rpb24gKGNvbmZpZywgcmVzdWx0Q2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgcXVhZ2dhSW5zdGFuY2UgPSBuZXcgUXVhZ2dhKCk7XG4gICAgICAgIGNvbmZpZyA9IG1lcmdlKHtcbiAgICAgICAgICAgIGlucHV0U3RyZWFtOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0ltYWdlU3RyZWFtJyxcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2l6ZTogODAwLFxuICAgICAgICAgICAgICAgIHNyYzogY29uZmlnLnNyYyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBudW1PZldvcmtlcnM6IChFTlYuZGV2ZWxvcG1lbnQgJiYgY29uZmlnLmRlYnVnKSA/IDAgOiAxLFxuICAgICAgICAgICAgbG9jYXRvcjoge1xuICAgICAgICAgICAgICAgIGhhbGZTYW1wbGU6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSwgY29uZmlnKTtcbiAgICAgICAgLy8gVE9ETyAjMTc1OiByZXN0cnVjdHVyZSB3b3JrZXIgc3VwcG9ydCBzbyB0aGF0IGl0IHdpbGwgd29yayB3aXRoIHR5cGVzY3JpcHQgdXNpbmcgd29ya2VyLWxvYWRlclxuICAgICAgICAvLyBodHRwczovL3dlYnBhY2suanMub3JnL2xvYWRlcnMvd29ya2VyLWxvYWRlci9cbiAgICAgICAgaWYgKGNvbmZpZy5udW1PZldvcmtlcnMgPiAwKSB7XG4gICAgICAgICAgICBjb25maWcubnVtT2ZXb3JrZXJzID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyB3b3JrZXJzIHJlcXVpcmUgV29ya2VyIGFuZCBCbG9iIHN1cHBvcnQgcHJlc2VudGx5LCBzbyBpZiBubyBCbG9iIG9yIFdvcmtlciB0aGVuIHNldFxuICAgICAgICAvLyB3b3JrZXJzIHRvIDAuXG4gICAgICAgIGlmIChjb25maWcubnVtT2ZXb3JrZXJzID4gMCAmJiAodHlwZW9mIEJsb2IgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBXb3JrZXIgPT09ICd1bmRlZmluZWQnKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCcqIG5vIFdvcmtlciBhbmQvb3IgQmxvYiBzdXBwb3J0IC0gZm9yY2luZyBudW1PZldvcmtlcnMgdG8gMCcpO1xuICAgICAgICAgICAgY29uZmlnLm51bU9mV29ya2VycyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0KGNvbmZpZywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBFdmVudHMub25jZSgncHJvY2Vzc2VkJywgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVhZ2dhSW5zdGFuY2Uuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2suY2FsbChudWxsLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcXVhZ2dhSW5zdGFuY2Uuc3RhcnQoKTtcbiAgICAgICAgICAgICAgICB9LCBudWxsLCBxdWFnZ2FJbnN0YW5jZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICAvLyBhZGQgdGhlIHVzdWFsbHkgZXhwZWN0ZWQgXCJkZWZhdWx0XCIgZm9yIHVzZSB3aXRoIHJlcXVpcmUsIGJ1aWxkIHN0ZXAgd29uJ3QgYWxsb3cgdXMgdG9cbiAgICAvLyB3cml0ZSB0byBtb2R1bGUuZXhwb3J0cyBzbyBkbyBpdCBoZXJlLlxuICAgIGdldCBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gUXVhZ2dhSlNTdGF0aWNJbnRlcmZhY2U7XG4gICAgfSxcbiAgICBSZWFkZXJzLFxuICAgIENhbWVyYUFjY2VzcyxcbiAgICBJbWFnZURlYnVnLFxuICAgIEltYWdlV3JhcHBlcixcbiAgICBSZXN1bHRDb2xsZWN0b3IsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBRdWFnZ2FKU1N0YXRpY0ludGVyZmFjZTtcbi8vIGV4cG9ydCBCYXJjb2RlUmVhZGVyIGFuZCBvdGhlciB1dGlsaXRpZXMgZm9yIGV4dGVybmFsIHBsdWdpbnNcbmV4cG9ydCB7XG4gICAgQmFyY29kZURlY29kZXIsXG4gICAgUmVhZGVycyxcbiAgICBDYW1lcmFBY2Nlc3MsXG4gICAgSW1hZ2VEZWJ1ZyxcbiAgICBJbWFnZVdyYXBwZXIsXG4gICAgUmVzdWx0Q29sbGVjdG9yLFxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=