<?php

use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Extension\CoreExtension;
use Twig\Extension\SandboxExtension;
use Twig\Markup;
use Twig\Sandbox\SecurityError;
use Twig\Sandbox\SecurityNotAllowedTagError;
use Twig\Sandbox\SecurityNotAllowedFilterError;
use Twig\Sandbox\SecurityNotAllowedFunctionError;
use Twig\Source;
use Twig\Template;

/* @public_path/build/secto.js */
class __TwigTemplate_e8d6722c7a1b916bcf238d2156bf5c5b1669c186abc134316488557ebb70c2a3 extends Template
{
    private $source;
    private $macros = [];

    public function __construct(Environment $env)
    {
        parent::__construct($env);

        $this->source = $this->getSourceContext();

        $this->parent = false;

        $this->blocks = [
        ];
    }

    protected function doDisplay(array $context, array $blocks = [])
    {
        $macros = $this->macros;
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "@public_path/build/secto.js"));

        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "@public_path/build/secto.js"));

        // line 1
        yield "(self[\"webpackChunk\"] = self[\"webpackChunk\"] || []).push([[\"secto\"],{

/***/ \"./assets/images/secto/agents.png\":
/*!****************************************!*\\
  !*** ./assets/images/secto/agents.png ***!
  \\****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/agents.ff1dc136.png\";

/***/ }),

/***/ \"./assets/images/secto/bdd.png\":
/*!*************************************!*\\
  !*** ./assets/images/secto/bdd.png ***!
  \\*************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/bdd.be7d3a77.png\";

/***/ }),

/***/ \"./assets/images/secto/circle.png\":
/*!****************************************!*\\
  !*** ./assets/images/secto/circle.png ***!
  \\****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/circle.b491ce2e.png\";

/***/ }),

/***/ \"./assets/images/secto/clients30.png\":
/*!*******************************************!*\\
  !*** ./assets/images/secto/clients30.png ***!
  \\*******************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/clients30.fbd5fcb9.png\";

/***/ }),

/***/ \"./assets/images/secto/clientsOut.png\":
/*!********************************************!*\\
  !*** ./assets/images/secto/clientsOut.png ***!
  \\********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/clientsOut.56de179b.png\";

/***/ }),

/***/ \"./assets/images/secto/creation_assist.png\":
/*!*************************************************!*\\
  !*** ./assets/images/secto/creation_assist.png ***!
  \\*************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/creation_assist.e7cd96e2.png\";

/***/ }),

/***/ \"./assets/images/secto/densite1.png\":
/*!******************************************!*\\
  !*** ./assets/images/secto/densite1.png ***!
  \\******************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/densite1.43286f31.png\";

/***/ }),

/***/ \"./assets/images/secto/icon_marker_black.png\":
/*!***************************************************!*\\
  !*** ./assets/images/secto/icon_marker_black.png ***!
  \\***************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/icon_marker_black.bfa480fc.png\";

/***/ }),

/***/ \"./assets/images/secto/icon_marker_red.png\":
/*!*************************************************!*\\
  !*** ./assets/images/secto/icon_marker_red.png ***!
  \\*************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/icon_marker_red.d988b994.png\";

/***/ }),

/***/ \"./assets/images/secto/maison.png\":
/*!****************************************!*\\
  !*** ./assets/images/secto/maison.png ***!
  \\****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/maison.6000e52e.png\";

/***/ }),

/***/ \"./assets/images/secto/number.png\":
/*!****************************************!*\\
  !*** ./assets/images/secto/number.png ***!
  \\****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/number.f29d5d5a.png\";

/***/ }),

/***/ \"./assets/images/secto/pastille.png\":
/*!******************************************!*\\
  !*** ./assets/images/secto/pastille.png ***!
  \\******************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/pastille.9a231ce3.png\";

/***/ }),

/***/ \"./assets/images/secto/refresh.png\":
/*!*****************************************!*\\
  !*** ./assets/images/secto/refresh.png ***!
  \\*****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/refresh.961546ea.png\";

/***/ }),

/***/ \"./assets/images/secto/save.png\":
/*!**************************************!*\\
  !*** ./assets/images/secto/save.png ***!
  \\**************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/save.86e68346.png\";

/***/ }),

/***/ \"./assets/images/secto/undo.png\":
/*!**************************************!*\\
  !*** ./assets/images/secto/undo.png ***!
  \\**************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/undo.9cb1531e.png\";

/***/ }),

/***/ \"./assets/js/map/leaflet-search.js\":
/*!*****************************************!*\\
  !*** ./assets/js/map/leaflet-search.js ***!
  \\*****************************************/
/***/ ((module, exports, __webpack_require__) => {

var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;__webpack_require__(/*! core-js/modules/es.regexp.exec.js */ \"./node_modules/core-js/modules/es.regexp.exec.js\");

__webpack_require__(/*! core-js/modules/es.string.split.js */ \"./node_modules/core-js/modules/es.string.split.js\");

__webpack_require__(/*! core-js/modules/es.object.to-string.js */ \"./node_modules/core-js/modules/es.object.to-string.js\");

__webpack_require__(/*! core-js/modules/web.timers.js */ \"./node_modules/core-js/modules/web.timers.js\");

__webpack_require__(/*! core-js/modules/es.string.replace.js */ \"./node_modules/core-js/modules/es.string.replace.js\");

__webpack_require__(/*! core-js/modules/es.regexp.constructor.js */ \"./node_modules/core-js/modules/es.regexp.constructor.js\");

__webpack_require__(/*! core-js/modules/es.regexp.to-string.js */ \"./node_modules/core-js/modules/es.regexp.to-string.js\");

__webpack_require__(/*! core-js/modules/es.array.index-of.js */ \"./node_modules/core-js/modules/es.array.index-of.js\");

__webpack_require__(/*! core-js/modules/es.date.to-string.js */ \"./node_modules/core-js/modules/es.date.to-string.js\");

__webpack_require__(/*! core-js/modules/es.parse-int.js */ \"./node_modules/core-js/modules/es.parse-int.js\");

__webpack_require__(/*! core-js/modules/es.string.search.js */ \"./node_modules/core-js/modules/es.string.search.js\");

/*
\tName\t\t\t\t\tData passed\t\t\t   Description

\tManaged Events:
\t search:locationfound\t{latlng, title, layer} fired after moved and show markerLocation
\t search:expanded\t\t{}\t\t\t\t\t   fired after control was expanded
\t search:collapsed\t\t{}\t\t\t\t\t   fired after control was collapsed
 \t search:cancel\t\t\t{}\t\t\t\t\t   fired after cancel button clicked

\tPublic methods:
\t setLayer()\t\t\t\tL.LayerGroup()         set layer search at runtime
\t showAlert()            'Text message'         show alert message
\t searchText()\t\t\t'Text searched'        search text by external code
*/
//TODO implement can do research on multiple sources layers and remote\t\t
//TODO history: false,\t\t//show latest searches in tooltip\t\t
//FIXME option condition problem {autoCollapse: true, markerLocation: true} not show location
//FIXME option condition problem {autoCollapse: false }
//
//TODO here insert function  search inputText FIRST in _recordsCache keys and if not find results.. 
//  run one of callbacks search(sourceData,jsonpUrl or options.layer) and run this.showTooltip
//
//TODO change structure of _recordsCache
//\tlike this: _recordsCache = {\"text-key1\": {loc:[lat,lng], ..other attributes.. }, {\"text-key2\": {loc:[lat,lng]}...}, ...}
//\tin this mode every record can have a free structure of attributes, only 'loc' is required
//TODO important optimization!!! always append data in this._recordsCache
//  now _recordsCache content is emptied and replaced with new data founded
//  always appending data on _recordsCache give the possibility of caching ajax, jsonp and layersearch!
//
//TODO here insert function  search inputText FIRST in _recordsCache keys and if not find results.. 
//  run one of callbacks search(sourceData,jsonpUrl or options.layer) and run this.showTooltip
//
//TODO change structure of _recordsCache
//\tlike this: _recordsCache = {\"text-key1\": {loc:[lat,lng], ..other attributes.. }, {\"text-key2\": {loc:[lat,lng]}...}, ...}
//\tin this way every record can have a free structure of attributes, only 'loc' is required
(function (factory) {
  if (true) {
    //AMD
    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! leaflet */ \"./node_modules/leaflet/dist/leaflet-src.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  } else {}
})(function (L) {
  L.Control.Search = L.Control.extend({
    includes: L.version[0] === '1' ? L.Evented.prototype : L.Mixin.Events,
    options: {
      url: '',
      //url for search by ajax request, ex: \"search.php?q={s}\". Can be function to returns string for dynamic parameter setting
      layer: null,
      //layer where search markers(is a L.LayerGroup)\t\t\t\t
      sourceData: null,
      //function to fill _recordsCache, passed searching text by first param and callback in second\t\t\t\t
      //TODO implements uniq option 'sourceData' to recognizes source type: url,array,callback or layer\t\t\t\t
      jsonpParam: null,
      //jsonp param name for search by jsonp service, ex: \"callback\"
      propertyLoc: 'loc',
      //field for remapping location, using array: ['latname','lonname'] for select double fields(ex. ['lat','lon'] ) support dotted format: 'prop.subprop.title'
      propertyName: 'title',
      //property in marker.options(or feature.properties for vector layer) trough filter elements in layer,
      formatData: null,
      //callback for reformat all data from source to indexed data object
      filterData: null,
      //callback for filtering data from text searched, params: textSearch, allRecords
      moveToLocation: null,
      //callback run on location found, params: latlng, title, map
      buildTip: null,
      //function to return row tip html node(or html string), receive text tooltip in first param
      container: '',
      //container id to insert Search Control\t\t
      zoom: null,
      //default zoom level for move to location
      minLength: 1,
      //minimal text length for autocomplete
      initial: true,
      //search elements only by initial text
      casesensitive: false,
      //search elements in case sensitive text
      autoType: true,
      //complete input with first suggested result and select this filled-in text.
      delayType: 400,
      //delay while typing for show tooltip
      tooltipLimit: -1,
      //limit max results to show in tooltip. -1 for no limit, 0 for no results
      tipAutoSubmit: true,
      //auto map panTo when click on tooltip
      firstTipSubmit: false,
      //auto select first result con enter click
      autoResize: true,
      //autoresize on input change
      collapsed: true,
      //collapse search control at startup
      autoCollapse: false,
      //collapse search control after submit(on button or on tips if enabled tipAutoSubmit)
      autoCollapseTime: 1200,
      //delay for autoclosing alert and collapse after blur
      textErr: 'Location not found',
      //error message
      textCancel: 'Cancel',
      //title in cancel button\t\t
      textPlaceholder: 'Search...',
      //placeholder value\t\t\t
      hideMarkerOnCollapse: false,
      //remove circle and marker on search control collapsed\t\t
      position: 'topleft',
      marker: {
        //custom L.Marker or false for hide
        icon: false,
        //custom L.Icon for maker location or false for hide
        animate: true,
        //animate a circle over location found
        circle: {
          //draw a circle in location found
          radius: 10,
          weight: 3,
          color: '#e03',
          stroke: true,
          fill: false
        }
      }
    },
    _getPath: function _getPath(obj, prop) {
      var parts = prop.split('.'),
          last = parts.pop(),
          len = parts.length,
          cur = parts[0],
          i = 1;
      if (len > 0) while ((obj = obj[cur]) && i < len) {
        cur = parts[i++];
      }
      if (obj) return obj[last];
    },
    _isObject: function _isObject(obj) {
      return Object.prototype.toString.call(obj) === \"[object Object]\";
    },
    initialize: function initialize(options) {
      L.Util.setOptions(this, options || {});
      this._inputMinSize = this.options.textPlaceholder ? this.options.textPlaceholder.length : 10;
      this._layer = this.options.layer || new L.LayerGroup();
      this._filterData = this.options.filterData || this._defaultFilterData;
      this._formatData = this.options.formatData || this._defaultFormatData;
      this._moveToLocation = this.options.moveToLocation || this._defaultMoveToLocation;
      this._autoTypeTmp = this.options.autoType; //useful for disable autoType temporarily in delete/backspace keydown

      this._countertips = 0; //number of tips items

      this._recordsCache = {}; //key,value table! to store locations! format: key,latlng

      this._curReq = null;
    },
    onAdd: function onAdd(map) {
      this._map = map;
      this._container = L.DomUtil.create('div', 'leaflet-control-search');
      this._input = this._createInput(this.options.textPlaceholder, 'search-input');
      this._tooltip = this._createTooltip('search-tooltip');
      this._cancel = this._createCancel(this.options.textCancel, 'search-cancel');
      this._button = this._createButton(this.options.textPlaceholder, 'search-button');
      this._alert = this._createAlert('search-alert');
      if (this.options.collapsed === false) this.expand(this.options.collapsed);

      if (this.options.marker) {
        if (this.options.marker instanceof L.Marker || this.options.marker instanceof L.CircleMarker) this._markerSearch = this.options.marker;else if (this._isObject(this.options.marker)) this._markerSearch = new L.Control.Search.Marker([0, 0], this.options.marker);
        this._markerSearch._isMarkerSearch = true;
      }

      this.setLayer(this._layer);
      map.on({
        // \t\t'layeradd': this._onLayerAddRemove,
        // \t\t'layerremove': this._onLayerAddRemove
        'resize': this._handleAutoresize
      }, this);
      return this._container;
    },
    addTo: function addTo(map) {
      if (this.options.container) {
        this._container = this.onAdd(map);
        this._wrapper = L.DomUtil.get(this.options.container);
        this._wrapper.style.position = 'relative';

        this._wrapper.appendChild(this._container);
      } else L.Control.prototype.addTo.call(this, map);

      return this;
    },
    onRemove: function onRemove(map) {
      this._recordsCache = {}; // map.off({
      // \t\t'layeradd': this._onLayerAddRemove,
      // \t\t'layerremove': this._onLayerAddRemove
      // \t}, this);

      map.off({
        // \t\t'layeradd': this._onLayerAddRemove,
        // \t\t'layerremove': this._onLayerAddRemove
        'resize': this._handleAutoresize
      }, this);
    },
    // _onLayerAddRemove: function(e) {
    // \t//without this, run setLayer also for each Markers!! to optimize!
    // \tif(e.layer instanceof L.LayerGroup)
    // \t\tif( L.stamp(e.layer) != L.stamp(this._layer) )
    // \t\t\tthis.setLayer(e.layer);
    // },
    setLayer: function setLayer(layer) {
      //set search layer at runtime
      //this.options.layer = layer; //setting this, run only this._recordsFromLayer()
      this._layer = layer;

      this._layer.addTo(this._map);

      return this;
    },
    showAlert: function showAlert(text) {
      var self = this;
      text = text || this.options.textErr;
      this._alert.style.display = 'block';
      this._alert.innerHTML = text;
      clearTimeout(this.timerAlert);
      this.timerAlert = setTimeout(function () {
        self.hideAlert();
      }, this.options.autoCollapseTime);
      return this;
    },
    hideAlert: function hideAlert() {
      this._alert.style.display = 'none';
      return this;
    },
    cancel: function cancel() {
      this._input.value = '';

      this._handleKeypress({
        keyCode: 8
      }); //simulate backspace keypress


      this._input.size = this._inputMinSize;

      this._input.focus();

      this._cancel.style.display = 'none';

      this._hideTooltip();

      this.fire('search:cancel');
      return this;
    },
    expand: function expand(toggle) {
      toggle = typeof toggle === 'boolean' ? toggle : true;
      this._input.style.display = 'block';
      L.DomUtil.addClass(this._container, 'search-exp');

      if (toggle !== false) {
        this._input.focus();

        this._map.on('dragstart click', this.collapse, this);
      }

      this.fire('search:expanded');
      return this;
    },
    collapse: function collapse() {
      this._hideTooltip();

      this.cancel();
      this._alert.style.display = 'none';

      this._input.blur();

      if (this.options.collapsed) {
        this._input.style.display = 'none';
        this._cancel.style.display = 'none';
        L.DomUtil.removeClass(this._container, 'search-exp');

        if (this.options.hideMarkerOnCollapse) {
          this._map.removeLayer(this._markerSearch);
        }

        this._map.off('dragstart click', this.collapse, this);
      }

      this.fire('search:collapsed');
      return this;
    },
    collapseDelayed: function collapseDelayed() {
      //collapse after delay, used on_input blur
      var self = this;
      if (!this.options.autoCollapse) return this;
      clearTimeout(this.timerCollapse);
      this.timerCollapse = setTimeout(function () {
        self.collapse();
      }, this.options.autoCollapseTime);
      return this;
    },
    collapseDelayedStop: function collapseDelayedStop() {
      clearTimeout(this.timerCollapse);
      return this;
    },
    ////start DOM creations
    _createAlert: function _createAlert(className) {
      var alert = L.DomUtil.create('div', className, this._container);
      alert.style.display = 'none';
      L.DomEvent.on(alert, 'click', L.DomEvent.stop, this).on(alert, 'click', this.hideAlert, this);
      return alert;
    },
    _createInput: function _createInput(text, className) {
      var self = this;
      var label = L.DomUtil.create('label', className, this._container);
      var input = L.DomUtil.create('input', className, this._container);
      input.type = 'text';
      input.size = this._inputMinSize;
      input.value = '';
      input.autocomplete = 'off';
      input.autocorrect = 'off';
      input.autocapitalize = 'off';
      input.placeholder = text;
      input.style.display = 'none';
      input.role = 'search';
      input.id = input.role + input.type + input.size;
      label.htmlFor = input.id;
      label.style.display = 'none';
      label.value = text;
      L.DomEvent.disableClickPropagation(input).on(input, 'keyup', this._handleKeypress, this).on(input, 'paste', function (e) {
        setTimeout(function (e) {
          self._handleKeypress(e);
        }, 10, e);
      }, this).on(input, 'blur', this.collapseDelayed, this).on(input, 'focus', this.collapseDelayedStop, this);
      return input;
    },
    _createCancel: function _createCancel(title, className) {
      var cancel = L.DomUtil.create('a', className, this._container);
      cancel.href = '#';
      cancel.title = title;
      cancel.style.display = 'none';
      cancel.innerHTML = \"<span>&otimes;</span>\"; //imageless(see css)

      L.DomEvent.on(cancel, 'click', L.DomEvent.stop, this).on(cancel, 'click', this.cancel, this);
      return cancel;
    },
    _createButton: function _createButton(title, className) {
      var button = L.DomUtil.create('a', className, this._container);
      button.href = '#';
      button.title = title;
      L.DomEvent.on(button, 'click', L.DomEvent.stop, this).on(button, 'click', this._handleSubmit, this).on(button, 'focus', this.collapseDelayedStop, this).on(button, 'blur', this.collapseDelayed, this);
      return button;
    },
    _createTooltip: function _createTooltip(className) {
      var self = this;
      var tool = L.DomUtil.create('ul', className, this._container);
      tool.style.display = 'none';
      L.DomEvent.disableClickPropagation(tool).on(tool, 'blur', this.collapseDelayed, this).on(tool, 'mousewheel', function (e) {
        self.collapseDelayedStop();
        L.DomEvent.stopPropagation(e); //disable zoom map
      }, this).on(tool, 'mouseover', function (e) {
        self.collapseDelayedStop();
      }, this);
      return tool;
    },
    _createTip: function _createTip(text, val) {
      //val is object in recordCache, usually is Latlng
      var tip;

      if (this.options.buildTip) {
        tip = this.options.buildTip.call(this, text, val); //custom tip node or html string

        if (typeof tip === 'string') {
          var tmpNode = L.DomUtil.create('div');
          tmpNode.innerHTML = tip;
          tip = tmpNode.firstChild;
        }
      } else {
        tip = L.DomUtil.create('li', '');
        tip.innerHTML = text;
      }

      L.DomUtil.addClass(tip, 'search-tip');
      tip._text = text; //value replaced in this._input and used by _autoType

      if (this.options.tipAutoSubmit) L.DomEvent.disableClickPropagation(tip).on(tip, 'click', L.DomEvent.stop, this).on(tip, 'click', function (e) {
        this._input.value = text;

        this._handleAutoresize();

        this._input.focus();

        this._hideTooltip();

        this._handleSubmit();
      }, this);
      return tip;
    },
    //////end DOM creations
    _getUrl: function _getUrl(text) {
      return typeof this.options.url === 'function' ? this.options.url(text) : this.options.url;
    },
    _defaultFilterData: function _defaultFilterData(text, records) {
      var I,
          icase,
          regSearch,
          frecords = {};
      text = text.replace(/[.*+?^\${}()|[\\]\\\\]/g, ''); //sanitize remove all special characters

      if (text === '') return [];
      I = this.options.initial ? '^' : ''; //search only initial text

      icase = !this.options.casesensitive ? 'i' : undefined;
      regSearch = new RegExp(I + text, icase); //TODO use .filter or .map

      for (var key in records) {
        if (regSearch.test(key)) frecords[key] = records[key];
      }

      return frecords;
    },
    showTooltip: function showTooltip(records) {
      this._countertips = 0;
      this._tooltip.innerHTML = '';
      this._tooltip.currentSelection = -1; //inizialized for _handleArrowSelect()

      if (this.options.tooltipLimit) {
        for (var key in records) //fill tooltip
        {
          if (this._countertips === this.options.tooltipLimit) break;
          this._countertips++;

          this._tooltip.appendChild(this._createTip(key, records[key]));
        }
      }

      if (this._countertips > 0) {
        this._tooltip.style.display = 'block';
        if (this._autoTypeTmp) this._autoType();
        this._autoTypeTmp = this.options.autoType; //reset default value
      } else this._hideTooltip();

      this._tooltip.scrollTop = 0;
      return this._countertips;
    },
    _hideTooltip: function _hideTooltip() {
      this._tooltip.style.display = 'none';
      this._tooltip.innerHTML = '';
      return 0;
    },
    _defaultFormatData: function _defaultFormatData(json) {
      //default callback for format data to indexed data
      var self = this,
          propName = this.options.propertyName,
          propLoc = this.options.propertyLoc,
          i,
          jsonret = {};
      if (L.Util.isArray(propLoc)) for (i in json) {
        jsonret[self._getPath(json[i], propName)] = L.latLng(json[i][propLoc[0]], json[i][propLoc[1]]);
      } else for (i in json) {
        jsonret[self._getPath(json[i], propName)] = L.latLng(self._getPath(json[i], propLoc));
      } //TODO throw new Error(\"propertyName '\"+propName+\"' not found in JSON data\");

      return jsonret;
    },
    _recordsFromJsonp: function _recordsFromJsonp(text, callAfter) {
      //extract searched records from remote jsonp service
      L.Control.Search.callJsonp = callAfter;
      var script = L.DomUtil.create('script', 'leaflet-search-jsonp', document.getElementsByTagName('body')[0]),
          url = L.Util.template(this._getUrl(text) + '&' + this.options.jsonpParam + '=L.Control.Search.callJsonp', {
        s: text
      }); //parsing url
      //rnd = '&_='+Math.floor(Math.random()*10000);
      //TODO add rnd param or randomize callback name! in recordsFromJsonp

      script.type = 'text/javascript';
      script.src = url;
      return {
        abort: function abort() {
          script.parentNode.removeChild(script);
        }
      };
    },
    _recordsFromAjax: function _recordsFromAjax(text, callAfter) {
      //Ajax request
      if (window.XMLHttpRequest === undefined) {
        window.XMLHttpRequest = function () {
          try {
            return new ActiveXObject(\"Microsoft.XMLHTTP.6.0\");
          } catch (e1) {
            try {
              return new ActiveXObject(\"Microsoft.XMLHTTP.3.0\");
            } catch (e2) {
              throw new Error(\"XMLHttpRequest is not supported\");
            }
          }
        };
      }

      var IE8or9 = L.Browser.ie && !window.atob && document.querySelector,
          request = IE8or9 ? new XDomainRequest() : new XMLHttpRequest(),
          url = L.Util.template(this._getUrl(text), {
        s: text
      }); //rnd = '&_='+Math.floor(Math.random()*10000);
      //TODO add rnd param or randomize callback name! in recordsFromAjax\t\t\t

      request.open(\"GET\", url);

      request.onload = function () {
        callAfter(JSON.parse(request.responseText));
      };

      request.onreadystatechange = function () {
        if (request.readyState === 4 && request.status === 200) {
          this.onload();
        }
      };

      request.send();
      return request;
    },
    _searchInLayer: function _searchInLayer(layer, retRecords, propName) {
      var self = this,
          loc;
      if (layer instanceof L.Control.Search.Marker) return;

      if (layer instanceof L.Marker || layer instanceof L.CircleMarker) {
        if (self._getPath(layer.options, propName)) {
          loc = layer.getLatLng();
          loc.layer = layer;
          retRecords[self._getPath(layer.options, propName)] = loc;
        } else if (self._getPath(layer.feature.properties, propName)) {
          loc = layer.getLatLng();
          loc.layer = layer;
          retRecords[self._getPath(layer.feature.properties, propName)] = loc;
        } else {
          //throw new Error(\"propertyName '\"+propName+\"' not found in marker\"); 
          console.warn(\"propertyName '\" + propName + \"' not found in marker\");
        }
      } else if (layer instanceof L.Path || layer instanceof L.Polyline || layer instanceof L.Polygon) {
        if (self._getPath(layer.options, propName)) {
          loc = layer.getBounds().getCenter();
          loc.layer = layer;
          retRecords[self._getPath(layer.options, propName)] = loc;
        } else if (self._getPath(layer.feature.properties, propName)) {
          loc = layer.getBounds().getCenter();
          loc.layer = layer;
          retRecords[self._getPath(layer.feature.properties, propName)] = loc;
        } else {
          //throw new Error(\"propertyName '\"+propName+\"' not found in shape\"); 
          console.warn(\"propertyName '\" + propName + \"' not found in shape\");
        }
      } else if (layer.hasOwnProperty('feature')) //GeoJSON
        {
          if (layer.feature.properties.hasOwnProperty(propName)) {
            if (layer.getLatLng && typeof layer.getLatLng === 'function') {
              loc = layer.getLatLng();
              loc.layer = layer;
              retRecords[layer.feature.properties[propName]] = loc;
            } else if (layer.getBounds && typeof layer.getBounds === 'function') {
              loc = layer.getBounds().getCenter();
              loc.layer = layer;
              retRecords[layer.feature.properties[propName]] = loc;
            } else {
              console.warn(\"Unknown type of Layer\");
            }
          } else {
            //throw new Error(\"propertyName '\"+propName+\"' not found in feature\");
            console.warn(\"propertyName '\" + propName + \"' not found in feature\");
          }
        } else if (layer instanceof L.LayerGroup) {
        layer.eachLayer(function (layer) {
          self._searchInLayer(layer, retRecords, propName);
        });
      }
    },
    _recordsFromLayer: function _recordsFromLayer() {
      //return table: key,value from layer
      var self = this,
          retRecords = {},
          propName = this.options.propertyName;

      this._layer.eachLayer(function (layer) {
        self._searchInLayer(layer, retRecords, propName);
      });

      return retRecords;
    },
    _autoType: function _autoType() {
      //TODO implements autype without selection(useful for mobile device)
      var start = this._input.value.length,
          firstRecord = this._tooltip.firstChild ? this._tooltip.firstChild._text : '',
          end = firstRecord.length;

      if (firstRecord.indexOf(this._input.value) === 0) {
        // If prefix match
        this._input.value = firstRecord;

        this._handleAutoresize();

        if (this._input.createTextRange) {
          var selRange = this._input.createTextRange();

          selRange.collapse(true);
          selRange.moveStart('character', start);
          selRange.moveEnd('character', end);
          selRange.select();
        } else if (this._input.setSelectionRange) {
          this._input.setSelectionRange(start, end);
        } else if (this._input.selectionStart) {
          this._input.selectionStart = start;
          this._input.selectionEnd = end;
        }
      }
    },
    _hideAutoType: function _hideAutoType() {
      // deselect text:
      var sel;

      if ((sel = this._input.selection) && sel.empty) {
        sel.empty();
      } else if (this._input.createTextRange) {
        sel = this._input.createTextRange();
        sel.collapse(true);
        var end = this._input.value.length;
        sel.moveStart('character', end);
        sel.moveEnd('character', end);
        sel.select();
      } else {
        if (this._input.getSelection) {
          this._input.getSelection().removeAllRanges();
        }

        this._input.selectionStart = this._input.selectionEnd;
      }
    },
    _handleKeypress: function _handleKeypress(e) {
      //run _input keyup event
      var self = this;

      switch (e.keyCode) {
        case 27:
          //Esc
          this.collapse();
          break;

        case 13:
          //Enter
          if (this._countertips == 1 || this.options.firstTipSubmit && this._countertips > 0) {
            if (this._tooltip.currentSelection == -1) {
              this._handleArrowSelect(1);
            }
          }

          this._handleSubmit(); //do search


          break;

        case 38:
          //Up
          this._handleArrowSelect(-1);

          break;

        case 40:
          //Down
          this._handleArrowSelect(1);

          break;

        case 8: //Backspace

        case 45: //Insert

        case 46:
          //Delete
          this._autoTypeTmp = false; //disable temporarily autoType

          break;

        case 37: //Left

        case 39: //Right

        case 16: //Shift

        case 17: //Ctrl

        case 35: //End

        case 36:
          //Home
          break;

        default:
          //All keys
          if (this._input.value.length) this._cancel.style.display = 'block';else this._cancel.style.display = 'none';

          if (this._input.value.length >= this.options.minLength) {
            clearTimeout(this.timerKeypress); //cancel last search request while type in\t\t\t\t

            this.timerKeypress = setTimeout(function () {
              //delay before request, for limit jsonp/ajax request
              self._fillRecordsCache();
            }, this.options.delayType);
          } else this._hideTooltip();

      }

      this._handleAutoresize();
    },
    searchText: function searchText(text) {
      var code = text.charCodeAt(text.length);
      this._input.value = text;
      this._input.style.display = 'block';
      L.DomUtil.addClass(this._container, 'search-exp');
      this._autoTypeTmp = false;

      this._handleKeypress({
        keyCode: code
      });
    },
    _fillRecordsCache: function _fillRecordsCache() {
      var self = this,
          inputText = this._input.value,
          records;
      if (this._curReq && this._curReq.abort) this._curReq.abort(); //abort previous requests

      L.DomUtil.addClass(this._container, 'search-load'); // if(this._layer)
      // {
      // \t//TODO _recordsFromLayer must return array of objects, formatted from _formatData
      // \tthis._recordsCache = this._recordsFromLayer();
      //
      // \trecords = this._filterData( this._input.value, this._recordsCache );
      //
      // \tthis.showTooltip( records );
      //
      // \tL.DomUtil.removeClass(this._container, 'search-load');
      // }
      // else
      // {

      if (this.options.sourceData) this._retrieveData = this.options.sourceData;else if (this.options.url) //jsonp or ajax
        this._retrieveData = this.options.jsonpParam ? this._recordsFromJsonp : this._recordsFromAjax;
      this._curReq = this._retrieveData.call(this, inputText, function (data) {
        self._recordsCache = self._formatData.call(self, data); //TODO refact!

        if (self.options.sourceData) records = self._filterData(self._input.value, self._recordsCache);else records = self._recordsCache;
        self.showTooltip(records);
        L.DomUtil.removeClass(self._container, 'search-load');
      }); // }
    },
    _handleAutoresize: function _handleAutoresize() {
      var maxWidth;

      if (this._input.style.maxWidth !== this._map._container.offsetWidth) {
        maxWidth = this._map._container.clientWidth; // other side margin + padding + width border + width search-button + width search-cancel

        maxWidth -= 10 + 20 + 1 + 30 + 22;
        this._input.style.maxWidth = maxWidth.toString() + 'px';
      }

      if (this.options.autoResize && this._container.offsetWidth + 20 < this._map._container.offsetWidth) {
        this._input.size = this._input.value.length < this._inputMinSize ? this._inputMinSize : this._input.value.length;
      }
    },
    _handleArrowSelect: function _handleArrowSelect(velocity) {
      var searchTips = this._tooltip.hasChildNodes() ? this._tooltip.childNodes : [];

      for (i = 0; i < searchTips.length; i++) {
        L.DomUtil.removeClass(searchTips[i], 'search-tip-select');
      }

      if (velocity == 1 && this._tooltip.currentSelection >= searchTips.length - 1) {
        // If at end of list.
        L.DomUtil.addClass(searchTips[this._tooltip.currentSelection], 'search-tip-select');
      } else if (velocity == -1 && this._tooltip.currentSelection <= 0) {
        // Going back up to the search box.
        this._tooltip.currentSelection = -1;
      } else if (this._tooltip.style.display != 'none') {
        this._tooltip.currentSelection += velocity;
        L.DomUtil.addClass(searchTips[this._tooltip.currentSelection], 'search-tip-select');
        this._input.value = searchTips[this._tooltip.currentSelection]._text; // scroll:

        var tipOffsetTop = searchTips[this._tooltip.currentSelection].offsetTop;

        if (tipOffsetTop + searchTips[this._tooltip.currentSelection].clientHeight >= this._tooltip.scrollTop + this._tooltip.clientHeight) {
          this._tooltip.scrollTop = tipOffsetTop - this._tooltip.clientHeight + searchTips[this._tooltip.currentSelection].clientHeight;
        } else if (tipOffsetTop <= this._tooltip.scrollTop) {
          this._tooltip.scrollTop = tipOffsetTop;
        }
      }
    },
    _handleSubmit: function _handleSubmit() {
      //button and tooltip click and enter submit
      this._hideAutoType();

      this.hideAlert();

      this._hideTooltip();

      if (this._input.style.display == 'none') //on first click show _input only
        this.expand();else {
        if (this._input.value === '') //hide _input only
          this.collapse();else {
          var loc = this._getLocation(this._input.value);

          if (loc === false) this.showAlert();else {
            this.showLocation(loc, this._input.value);
            this.fire('search:locationfound', {
              latlng: loc,
              text: this._input.value,
              layer: loc.layer ? loc.layer : null
            });
          }
        }
      }
    },
    _getLocation: function _getLocation(key) {
      //extract latlng from _recordsCache
      if (this._recordsCache.hasOwnProperty(key)) return this._recordsCache[key]; //then after use .loc attribute
      else return false;
    },
    _defaultMoveToLocation: function _defaultMoveToLocation(latlng, title, map) {
      if (this.options.zoom) this._map.setView(latlng, this.options.zoom);else this._map.panTo(latlng);
    },
    showLocation: function showLocation(latlng, title) {
      //set location on map from _recordsCache
      var self = this;

      self._map.once('moveend zoomend', function (e) {
        if (self._markerSearch) {
          self._markerSearch.addTo(self._map).setLatLng(latlng);
        }
      });

      self._moveToLocation(latlng, title, self._map); //FIXME autoCollapse option hide self._markerSearch before visualized!!


      if (self.options.autoCollapse) self.collapse();
      return self;
    }
  });
  L.Control.Search.Marker = L.Marker.extend({
    includes: L.version[0] === '1' ? L.Evented.prototype : L.Mixin.Events,
    options: {
      icon: new L.Icon.Default(),
      animate: true,
      circle: {
        radius: 10,
        weight: 3,
        color: '#e03',
        stroke: true,
        fill: false
      }
    },
    initialize: function initialize(latlng, options) {
      L.setOptions(this, options);
      if (options.icon === true) options.icon = new L.Icon.Default();
      L.Marker.prototype.initialize.call(this, latlng, options);
      if (L.Control.Search.prototype._isObject(this.options.circle)) this._circleLoc = new L.CircleMarker(latlng, this.options.circle);
    },
    onAdd: function onAdd(map) {
      L.Marker.prototype.onAdd.call(this, map);

      if (this._circleLoc) {
        map.addLayer(this._circleLoc);
        if (this.options.animate) this.animate();
      }
    },
    onRemove: function onRemove(map) {
      L.Marker.prototype.onRemove.call(this, map);
      if (this._circleLoc) map.removeLayer(this._circleLoc);
    },
    setLatLng: function setLatLng(latlng) {
      L.Marker.prototype.setLatLng.call(this, latlng);
      if (this._circleLoc) this._circleLoc.setLatLng(latlng);
      return this;
    },
    _initIcon: function _initIcon() {
      if (this.options.icon) L.Marker.prototype._initIcon.call(this);
    },
    _removeIcon: function _removeIcon() {
      if (this.options.icon) L.Marker.prototype._removeIcon.call(this);
    },
    animate: function animate() {
      //TODO refact animate() more smooth! like this: http://goo.gl/DDlRs
      if (this._circleLoc) {
        var circle = this._circleLoc,
            tInt = 200,
            //time interval
        ss = 5,
            //frames
        mr = parseInt(circle._radius / ss),
            oldrad = this.options.circle.radius,
            newrad = circle._radius * 2,
            acc = 0;
        circle._timerAnimLoc = setInterval(function () {
          acc += 0.5;
          mr += acc; //adding acceleration

          newrad -= mr;
          circle.setRadius(newrad);

          if (newrad < oldrad) {
            clearInterval(circle._timerAnimLoc);
            circle.setRadius(oldrad); //reset radius
            //if(typeof afterAnimCall == 'function')
            //afterAnimCall();
            //TODO use create event 'animateEnd' in L.Control.Search.Marker 
          }
        }, tInt);
      }

      return this;
    }
  });
  L.Map.addInitHook(function () {
    if (this.options.searchControl) {
      this.searchControl = L.control.search(this.options.searchControl);
      this.addControl(this.searchControl);
    }
  });

  L.control.search = function (options) {
    return new L.Control.Search(options);
  };

  return L.Control.Search;
});

/***/ }),

/***/ \"./assets/js/map/leaflet.draw-custom.js\":
/*!**********************************************!*\\
  !*** ./assets/js/map/leaflet.draw-custom.js ***!
  \\**********************************************/
/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {

function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }

__webpack_require__(/*! core-js/modules/es.array.splice.js */ \"./node_modules/core-js/modules/es.array.splice.js\");

__webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");

__webpack_require__(/*! core-js/modules/web.timers.js */ \"./node_modules/core-js/modules/web.timers.js\");

__webpack_require__(/*! core-js/modules/es.function.bind.js */ \"./node_modules/core-js/modules/es.function.bind.js\");

__webpack_require__(/*! core-js/modules/es.number.to-fixed.js */ \"./node_modules/core-js/modules/es.number.to-fixed.js\");

__webpack_require__(/*! core-js/modules/es.parse-int.js */ \"./node_modules/core-js/modules/es.parse-int.js\");

__webpack_require__(/*! core-js/modules/es.array.concat.js */ \"./node_modules/core-js/modules/es.array.concat.js\");

__webpack_require__(/*! core-js/modules/es.array.fill.js */ \"./node_modules/core-js/modules/es.array.fill.js\");

__webpack_require__(/*! core-js/modules/es.array.index-of.js */ \"./node_modules/core-js/modules/es.array.index-of.js\");

__webpack_require__(/*! core-js/modules/es.array.is-array.js */ \"./node_modules/core-js/modules/es.array.is-array.js\");

__webpack_require__(/*! core-js/modules/es.parse-float.js */ \"./node_modules/core-js/modules/es.parse-float.js\");

__webpack_require__(/*! core-js/modules/es.regexp.exec.js */ \"./node_modules/core-js/modules/es.regexp.exec.js\");

__webpack_require__(/*! core-js/modules/es.string.split.js */ \"./node_modules/core-js/modules/es.string.split.js\");

__webpack_require__(/*! core-js/modules/es.string.replace.js */ \"./node_modules/core-js/modules/es.string.replace.js\");

__webpack_require__(/*! core-js/modules/es.symbol.js */ \"./node_modules/core-js/modules/es.symbol.js\");

__webpack_require__(/*! core-js/modules/es.symbol.description.js */ \"./node_modules/core-js/modules/es.symbol.description.js\");

__webpack_require__(/*! core-js/modules/es.object.to-string.js */ \"./node_modules/core-js/modules/es.object.to-string.js\");

__webpack_require__(/*! core-js/modules/es.symbol.iterator.js */ \"./node_modules/core-js/modules/es.symbol.iterator.js\");

__webpack_require__(/*! core-js/modules/es.array.iterator.js */ \"./node_modules/core-js/modules/es.array.iterator.js\");

__webpack_require__(/*! core-js/modules/es.string.iterator.js */ \"./node_modules/core-js/modules/es.string.iterator.js\");

__webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ \"./node_modules/core-js/modules/web.dom-collections.iterator.js\");

/*
 Leaflet.draw 0.4.12, a plugin that adds drawing and editing tools to Leaflet powered maps.
 (c) 2012-2017, Jacob Toye, Jon West, Smartrak, Leaflet

 https://github.com/Leaflet/Leaflet.draw
 http://leafletjs.com
 */
(function (window, document, undefined) {
  /**
   * Leaflet.draw assumes that you have already included the Leaflet library.
   */
  L.drawVersion = \"0.4.12\";
  /**
   * @class L.Draw
   * @aka Draw
   *
   *
   * To add the draw toolbar set the option drawControl: true in the map options.
   *
   * @example
   * ```js
   *      var map = L.map('map', {drawControl: true}).setView([51.505, -0.09], 13);
   *
   *      L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
  *          attribution: '&copy; <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'
  *      }).addTo(map);
   * ```
   *
   * ### Adding the edit toolbar
   * To use the edit toolbar you must initialise the Leaflet.draw control and manually add it to the map.
   *
   * ```js
   *      var map = L.map('map').setView([51.505, -0.09], 13);
   *
   *      L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
  *          attribution: '&copy; <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'
  *      }).addTo(map);
   *
   *      // FeatureGroup is to store editable layers
   *      var drawnItems = new L.FeatureGroup();
   *      map.addLayer(drawnItems);
   *
   *      var drawControl = new L.Control.Draw({
  *          edit: {
  *              featureGroup: drawnItems
  *          }
  *      });
   *      map.addControl(drawControl);
   * ```
   *
   * The key here is the featureGroup option. This tells the plugin which FeatureGroup contains the layers that
   * should be editable. The featureGroup can contain 0 or more features with geometry types Point, LineString, and Polygon.
   * Leaflet.draw does not work with multigeometry features such as MultiPoint, MultiLineString, MultiPolygon,
   * or GeometryCollection. If you need to add multigeometry features to the draw plugin, convert them to a
   * FeatureCollection of non-multigeometries (Points, LineStrings, or Polygons).
   */

  L.Draw = {};
  /**
   * @class L.drawLocal
   * @aka L.drawLocal
   *
   * The core toolbar class of the API — it is used to create the toolbar ui
   *
   * @example
   * ```js
   *      var modifiedDraw = L.drawLocal.extend({
  *          draw: {
  *              toolbar: {
  *                  buttons: {
  *                      polygon: 'Draw an awesome polygon'
  *                  }
  *              }
  *          }
  *      });
   * ```
   *
   * The default state for the control is the draw toolbar just below the zoom control.
   *  This will allow map users to draw vectors and markers.
   *  **Please note the edit toolbar is not enabled by default.**
   */

  L.drawLocal = {
    // format: {
    // \tnumeric: {
    // \t\tdelimiters: {
    // \t\t\tthousands: ',',
    // \t\t\tdecimal: '.'
    // \t\t}
    // \t}
    // },
    draw: {
      toolbar: {
        // #TODO: this should be reorganized where actions are nested in actions
        // ex: actions.undo  or actions.cancel
        actions: {
          title: 'Cancel drawing',
          text: 'Cancel'
        },
        finish: {
          title: 'Finish drawing',
          text: 'Finish'
        },
        undo: {
          title: 'Delete last point drawn',
          text: 'Delete last point'
        },
        buttons: {
          polyline: 'Draw a polyline',
          polygon: 'Draw a polygon',
          rectangle: 'Draw a rectangle',
          circle: 'Draw a circle',
          marker: 'Draw a marker',
          circlemarker: 'Draw a circlemarker'
        }
      },
      handlers: {
        circle: {
          tooltip: {
            start: 'Click and drag to draw circle.'
          },
          radius: 'Radius'
        },
        circlemarker: {
          tooltip: {
            start: 'Click map to place circle marker.'
          }
        },
        marker: {
          tooltip: {
            start: 'Click map to place marker.'
          }
        },
        polygon: {
          tooltip: {
            start: 'Click to start drawing shape.',
            cont: 'Click to continue drawing shape.',
            end: 'Click first point to close this shape.'
          }
        },
        polyline: {
          error: '<strong>Error:</strong> shape edges cannot cross!',
          tooltip: {
            start: 'Click to start drawing line.',
            cont: 'Click to continue drawing line.',
            end: 'Click last point to finish line.'
          }
        },
        rectangle: {
          tooltip: {
            start: 'Click and drag to draw rectangle.'
          }
        },
        simpleshape: {
          tooltip: {
            end: 'Release mouse to finish drawing.'
          }
        }
      }
    },
    edit: {
      toolbar: {
        actions: {
          save: {
            title: 'Save changes',
            text: 'Save'
          },
          cancel: {
            title: 'Cancel editing, discards all changes',
            text: 'Cancel'
          },
          clearAll: {
            title: 'Clear all layers',
            text: 'Clear All'
          }
        },
        buttons: {
          edit: 'Edit layers',
          editDisabled: 'No layers to edit',
          remove: 'Delete layers',
          removeDisabled: 'No layers to delete'
        }
      },
      handlers: {
        edit: {
          tooltip: {
            text: 'Drag handles or markers to edit features.',
            subtext: 'Click cancel to undo changes.'
          }
        },
        remove: {
          tooltip: {
            text: 'Click on a feature to remove.'
          }
        }
      }
    }
  };
  /**
   * ### Events
   * Once you have successfully added the Leaflet.draw plugin to your map you will want to respond to the different
   * actions users can initiate. The following events will be triggered on the map:
   *
   * @class L.Draw.Event
   * @aka Draw.Event
   *
   * Use `L.Draw.Event.EVENTNAME` constants to ensure events are correct.
   *
   * @example
   * ```js
   * map.on(L.Draw.Event.CREATED; function (e) {
  *    var type = e.layerType,
  *        layer = e.layer;
  *
  *    if (type === 'marker') {
  *        // Do marker specific actions
  *    }
  *
  *    // Do whatever else you need to. (save to db; add to map etc)
  *    map.addLayer(layer);
  *});
   * ```
   */

  L.Draw.Event = {};
  /**
   * @event draw:created: PolyLine; Polygon; Rectangle; Circle; Marker | String
   *
   * Layer that was just created.
   * The type of layer this is. One of: `polyline`; `polygon`; `rectangle`; `circle`; `marker`
   * Triggered when a new vector or marker has been created.
   *
   */

  L.Draw.Event.CREATED = 'draw:created';
  /**
   * @event draw:edited: LayerGroup
   *
   * List of all layers just edited on the map.
   *
   *
   * Triggered when layers in the FeatureGroup; initialised with the plugin; have been edited and saved.
   *
   * @example
   * ```js
   *      map.on('draw:edited', function (e) {
   *          var layers = e.layers;
   *          layers.eachLayer(function (layer) {
   *              //do whatever you want; most likely save back to db
   *          });
   *      });
   * ```
   */

  L.Draw.Event.EDITED = 'draw:edited';
  /**
   * @event draw:deleted: LayerGroup
   *
   * List of all layers just removed from the map.
   *
   * Triggered when layers have been removed (and saved) from the FeatureGroup.
   */

  L.Draw.Event.DELETED = 'draw:deleted';
  /**
   * @event draw:drawstart: String
   *
   * The type of layer this is. One of:`polyline`; `polygon`; `rectangle`; `circle`; `marker`
   *
   * Triggered when the user has chosen to draw a particular vector or marker.
   */

  L.Draw.Event.DRAWSTART = 'draw:drawstart';
  /**
   * @event draw:drawstop: String
   *
   * The type of layer this is. One of: `polyline`; `polygon`; `rectangle`; `circle`; `marker`
   *
   * Triggered when the user has finished a particular vector or marker.
   */

  L.Draw.Event.DRAWSTOP = 'draw:drawstop';
  /**
   * @event draw:drawvertex: LayerGroup
   *
   * List of all layers just being added from the map.
   *
   * Triggered when a vertex is created on a polyline or polygon.
   */

  L.Draw.Event.DRAWVERTEX = 'draw:drawvertex';
  /**
   * @event draw:editstart: String
   *
   * The type of edit this is. One of: `edit`
   *
   * Triggered when the user starts edit mode by clicking the edit tool button.
   */

  L.Draw.Event.EDITSTART = 'draw:editstart';
  /**
   * @event draw:editmove: ILayer
   *
   *  Layer that was just moved.
   *
   * Triggered as the user moves a rectangle; circle or marker.
   */

  L.Draw.Event.EDITMOVE = 'draw:editmove';
  /**
   * @event draw:editresize: ILayer
   *
   * Layer that was just moved.
   *
   * Triggered as the user resizes a rectangle or circle.
   */

  L.Draw.Event.EDITRESIZE = 'draw:editresize';
  /**
   * @event draw:editvertex: LayerGroup
   *
   * List of all layers just being edited from the map.
   *
   * Triggered when a vertex is edited on a polyline or polygon.
   */

  L.Draw.Event.EDITVERTEX = 'draw:editvertex';
  /**
   * @event draw:editstop: String
   *
   * The type of edit this is. One of: `edit`
   *
   * Triggered when the user has finshed editing (edit mode) and saves edits.
   */

  L.Draw.Event.EDITSTOP = 'draw:editstop';
  /**
   * @event draw:deletestart: String
   *
   * The type of edit this is. One of: `remove`
   *
   * Triggered when the user starts remove mode by clicking the remove tool button.
   */

  L.Draw.Event.DELETESTART = 'draw:deletestart';
  /**
   * @event draw:deletestop: String
   *
   * The type of edit this is. One of: `remove`
   *
   * Triggered when the user has finished removing shapes (remove mode) and saves.
   */

  L.Draw.Event.DELETESTOP = 'draw:deletestop';
  L.Draw = L.Draw || {};
  /**
   * @class L.Draw.Feature
   * @aka Draw.Feature
   */

  L.Draw.Feature = L.Handler.extend({
    includes: L.Mixin.Events,
    // @method initialize(): void
    initialize: function initialize(map, options) {
      this._map = map;
      this._container = map._container;
      this._overlayPane = map._panes.overlayPane;
      this._popupPane = map._panes.popupPane; // Merge default shapeOptions options with custom shapeOptions

      if (options && options.shapeOptions) {
        options.shapeOptions = L.Util.extend({}, this.options.shapeOptions, options.shapeOptions);
      }

      L.setOptions(this, options);
    },
    // @method enable(): void
    // Enables this handler
    enable: function enable() {
      if (this._enabled) {
        return;
      }

      L.Handler.prototype.enable.call(this);
      this.fire('enabled', {
        handler: this.type
      });

      this._map.fire(L.Draw.Event.DRAWSTART, {
        layerType: this.type
      });
    },
    // @method disable(): void
    disable: function disable() {
      if (!this._enabled) {
        return;
      }

      L.Handler.prototype.disable.call(this);

      this._map.fire(L.Draw.Event.DRAWSTOP, {
        layerType: this.type
      });

      this.fire('disabled', {
        handler: this.type
      });
    },
    // @method addHooks(): void
    // Add's event listeners to this handler
    addHooks: function addHooks() {
      var map = this._map;

      if (map) {
        L.DomUtil.disableTextSelection();
        map.getContainer().focus();
        this._tooltip = new L.Draw.Tooltip(this._map);
        L.DomEvent.on(this._container, 'keyup', this._cancelDrawing, this);
      }
    },
    // @method removeHooks(): void
    // Removes event listeners from this handler
    removeHooks: function removeHooks() {
      if (this._map) {
        L.DomUtil.enableTextSelection();

        this._tooltip.dispose();

        this._tooltip = null;
        L.DomEvent.off(this._container, 'keyup', this._cancelDrawing, this);
      }
    },
    // @method setOptions(object): void
    // Sets new options to this handler
    setOptions: function setOptions(options) {
      L.setOptions(this, options);
    },
    _fireCreatedEvent: function _fireCreatedEvent(layer) {
      this._map.fire(L.Draw.Event.CREATED, {
        layer: layer,
        layerType: this.type
      });
    },
    // Cancel drawing when the escape key is pressed
    _cancelDrawing: function _cancelDrawing(e) {
      if (e.keyCode === 27) {
        this._map.fire('draw:canceled', {
          layerType: this.type
        });

        this.disable();
      }
    }
  });
  /**
   * @class L.Draw.Polyline
   * @aka Draw.Polyline
   * @inherits L.Draw.Feature
   */

  L.Draw.Polyline = L.Draw.Feature.extend({
    statics: {
      TYPE: 'polyline'
    },
    Poly: L.Polyline,
    options: {
      allowIntersection: true,
      repeatMode: false,
      drawError: {
        color: '#b00b00',
        timeout: 2500
      },
      icon: new L.DivIcon({
        iconSize: new L.Point(8, 8),
        className: 'leaflet-div-icon leaflet-editing-icon'
      }),
      touchIcon: new L.DivIcon({
        iconSize: new L.Point(20, 20),
        className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
      }),
      guidelineDistance: 20,
      maxGuideLineLength: 4000,
      shapeOptions: {
        stroke: true,
        color: '#3388ff',
        weight: 4,
        opacity: 0.5,
        fill: false,
        clickable: true
      },
      metric: true,
      // Whether to use the metric measurement system or imperial
      feet: true,
      // When not metric, to use feet instead of yards for display.
      nautic: false,
      // When not metric, not feet use nautic mile for display
      showLength: true,
      // Whether to display distance in the tooltip
      zIndexOffset: 2000,
      // This should be > than the highest z-index any map layers
      factor: 1 // To change distance calculation

    },
    // @method initialize(): void
    initialize: function initialize(map, options) {
      // if touch, switch to touch icon
      if (L.Browser.touch) {
        this.options.icon = this.options.touchIcon;
      } // Need to set this here to ensure the correct message is used.


      this.options.drawError.message = L.drawLocal.draw.handlers.polyline.error; // Merge default drawError options with custom options

      if (options && options.drawError) {
        options.drawError = L.Util.extend({}, this.options.drawError, options.drawError);
      } // Save the type so super can fire, need to do this as cannot do this.TYPE :(


      this.type = L.Draw.Polyline.TYPE;
      L.Draw.Feature.prototype.initialize.call(this, map, options);
    },
    // @method addHooks(): void
    // Add listener hooks to this handler
    addHooks: function addHooks() {
      L.Draw.Feature.prototype.addHooks.call(this);

      if (this._map) {
        this._markers = [];
        this._markerGroup = new L.LayerGroup();

        this._map.addLayer(this._markerGroup);

        this._poly = new L.Polyline([], this.options.shapeOptions);

        this._tooltip.updateContent(this._getTooltipText()); // Make a transparent marker that will used to catch click events. These click
        // events will create the vertices. We need to do this so we can ensure that
        // we can create vertices over other map layers (markers, vector layers). We
        // also do not want to trigger any click handlers of objects we are clicking on
        // while drawing.


        if (!this._mouseMarker) {
          this._mouseMarker = L.marker(this._map.getCenter(), {
            icon: L.divIcon({
              className: 'leaflet-mouse-marker',
              iconAnchor: [20, 20],
              iconSize: [40, 40]
            }),
            opacity: 0,
            zIndexOffset: this.options.zIndexOffset
          });
        }

        this._mouseMarker.on('mouseout', this._onMouseOut, this).on('mousemove', this._onMouseMove, this) // Necessary to prevent 0.8 stutter
        .on('mousedown', this._onMouseDown, this).on('mouseup', this._onMouseUp, this) // Necessary for 0.8 compatibility
        .addTo(this._map);

        this._map.on('mouseup', this._onMouseUp, this) // Necessary for 0.7 compatibility
        .on('mousemove', this._onMouseMove, this).on('zoomlevelschange', this._onZoomEnd, this).on('touchstart', this._onTouch, this).on('zoomend', this._onZoomEnd, this);
      }
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler.
    removeHooks: function removeHooks() {
      L.Draw.Feature.prototype.removeHooks.call(this);

      this._clearHideErrorTimeout();

      this._cleanUpShape(); // remove markers from map


      this._map.removeLayer(this._markerGroup);

      delete this._markerGroup;
      delete this._markers;

      this._map.removeLayer(this._poly);

      delete this._poly;

      this._mouseMarker.off('mousedown', this._onMouseDown, this).off('mouseout', this._onMouseOut, this).off('mouseup', this._onMouseUp, this).off('mousemove', this._onMouseMove, this);

      this._map.removeLayer(this._mouseMarker);

      delete this._mouseMarker; // clean up DOM

      this._clearGuides();

      this._map.off('mouseup', this._onMouseUp, this).off('mousemove', this._onMouseMove, this).off('zoomlevelschange', this._onZoomEnd, this).off('zoomend', this._onZoomEnd, this).off('touchstart', this._onTouch, this).off('click', this._onTouch, this);
    },
    // @method deleteLastVertex(): void
    // Remove the last vertex from the polyline, removes polyline from map if only one point exists.
    deleteLastVertex: function deleteLastVertex() {
      if (this._markers.length <= 1) {
        return;
      }

      var lastMarker = this._markers.pop(),
          poly = this._poly,
          // Replaces .spliceLatLngs()
      latlngs = poly.getLatLngs(),
          latlng = latlngs.splice(-1, 1)[0];

      this._poly.setLatLngs(latlngs);

      this._markerGroup.removeLayer(lastMarker);

      if (poly.getLatLngs().length < 2) {
        this._map.removeLayer(poly);
      }

      this._vertexChanged(latlng, false);
    },
    // @method isMarkerInsidePolygon(): void
    isMarkerInsidePolygon: function isMarkerInsidePolygon(latLng, poly) {
      var inside = false;
      var x = latLng.lat,
          y = latLng.lng;

      for (var ii = 0; ii < poly.getLatLngs().length; ii++) {
        var polyPoints = poly.getLatLngs()[ii];

        for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {
          var xi = polyPoints[i].lat,
              yi = polyPoints[i].lng;
          var xj = polyPoints[j].lat,
              yj = polyPoints[j].lng;
          var intersect = yi > y != yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
          if (intersect) inside = !inside;
        }
      }

      return inside;
    },
    // @method addVertex(): void
    // Add a vertex to the end of the polyline
    // Add a vertex to the end of the polyline
    addVertex: function addVertex(latlng, same) {
      var markersLength = this._markers.length; // markersLength must be greater than or equal to 2 before intersections can occur

      var inPolygon = false;

      if (same) {
        this._map.eachLayer(function (poly) {
          if (poly instanceof L.Polygon) {
            var inside = false;
            var x = latlng.lat,
                y = latlng.lng;

            for (var ii = 0; ii < poly.getLatLngs().length; ii++) {
              var polyPoints = poly.getLatLngs()[ii];

              for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {
                var xi = polyPoints[i].lat,
                    yi = polyPoints[i].lng;
                var xj = polyPoints[j].lat,
                    yj = polyPoints[j].lng;
                var intersect = yi > y != yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
                if (intersect) inside = !inside;
              }
            }

            if (inside) {
              //poly.setStyle({ color: 'blue' });
              inPolygon = true;
            }
          }
        });
      } else {
        var pointSnap = this.pointSnap();
      }

      if (!inPolygon && markersLength >= 1) {
        var latLngTest = latlng;

        var lastLatLng = this._markers[markersLength - 1].getLatLng();

        inPolygon = this.lineInPolygon(latLngTest, lastLatLng);
        var lastLine = L.polyline([lastLatLng, latLngTest], {
          opacity: \"0\"
        }).addTo(this._map);
      } //Si ligne intersect un polygon OU si point/ligne in Polygon OU si point n'est pas sur un point snap ou dans le vide


      if (markersLength >= 2 && !this.options.allowIntersection && this._poly.newLatLngIntersects(latlng) || inPolygon || !pointSnap && !same) {
        this._showErrorTooltip();

        return;
      } else if (this._errorShown) {
        this._hideErrorTooltip();
      }

      this._markers.push(this._createMarker(latlng));

      this._poly.addLatLng(latlng);

      if (this._poly.getLatLngs().length === 2) {
        this._map.addLayer(this._poly);
      }

      this._vertexChanged(latlng, true);
    },
    pointSnap: function pointSnap() {
      var guideLayers = this._snapper._guides;

      for (var i = 0; i < guideLayers.length; i++) {
        for (var j = 0; j < guideLayers[i]._latlngs.length; j++) {
          for (var k = 0; k < guideLayers[i]._latlngs[j].length; k++) {
            if (guideLayers[i]._latlngs[j][k].lat) {
              if (this._snapper._markers[0]._latlng.lat == guideLayers[i]._latlngs[j][k].lat && this._snapper._markers[0]._latlng.lng == guideLayers[i]._latlngs[j][k].lng) {
                return true;
              }
            } else {
              for (var l = 0; l < guideLayers[i]._latlngs[j][k].length; l++) {
                if (this._snapper._markers[0]._latlng.lat == guideLayers[i]._latlngs[j][k][l].lat && this._snapper._markers[0]._latlng.lng == guideLayers[i]._latlngs[j][k][l].lng) {
                  return true;
                }
              }
            }
          }
        }
      }

      return false;
    },
    // @method completeShape(): void
    // Closes the polyline between the first and last points
    completeShape: function completeShape() {
      if (this._markers.length <= 1) {
        return;
      }

      this._fireCreatedEvent();

      this.disable();

      if (this.options.repeatMode) {
        this.enable();
      }
    },
    is_in_polygon: function is_in_polygon(\$vertices_x, \$vertices_y, point) {
      \$c = false;
      \$i = \$j = \$c = 0;
      \$longitude_x = point.lng;
      \$latitude_y = point.lat;

      for (\$i = 0, \$j = 2 - 1; \$i < 2; \$j = \$i++) {
        if (\$vertices_y[\$i] > \$latitude_y != \$vertices_y[\$j] > \$latitude_y && \$longitude_x < (\$vertices_x[\$j] - \$vertices_x[\$i]) * (\$latitude_y - \$vertices_y[\$i]) / (\$vertices_y[\$j] - \$vertices_y[\$i]) + \$vertices_x[\$i]) {
          \$c = !\$c;
        }
      }

      return \$c;
    },
    pointOnPolygon: function pointOnPolygon(latLng) {
      this._map.eachLayer(function (poly) {
        if (poly instanceof L.Polygon) {
          var polyBounds = poly.getBounds();

          if (polyBounds.contains(latLng)) {
            var latLngPoly = poly._latlngs[0];
            var lenght = latLngPoly.length;
            var i = 0;
            var j = 1;

            while (i < lenght) {
              if (j == lenght) {
                j = 0;
              }

              var line = L.polyline([poly._latlngs[0][i], poly._latlngs[0][j]], {
                opacity: \"0\"
              }).addTo(poly._map);
              var polyLineBounds = line.getBounds();

              if (polyLineBounds.contains(latLng)) {
                if (i == 0 && j == lenght - 1 || j == 0 && i == lenght - 1) {
                  latLngPoly.splice(0, 0, L.latLng(latLng.lat, latLng.lng));
                } else {
                  var markerPoly = i + j;
                  markerPoly = markerPoly / 2;
                  latLngPoly.splice(Math.ceil(markerPoly), 0, L.latLng(latLng.lat, latLng.lng));
                }

                poly._map.removeLayer(line);

                poly._latlngs[0] = latLngPoly;
                poly.editing.latlngs[0][0] = latLngPoly;
                poly.redraw();
                return true;
              }

              poly._map.removeLayer(line);

              i++;
              j++;
            }
          }
        }
      });

      return false;
    },
    lineInPolygon: function lineInPolygon(latLngTest, lastLatLng) {
      var inPolygon = false;
      var lastLine = L.polyline([lastLatLng, latLngTest], {
        opacity: \"0\"
      }).addTo(this._map);
      latLngTest.lng = Math.round(latLngTest.lng * 1000000) / 1000000;
      latLngTest.lat = Math.round(latLngTest.lat * 1000000) / 1000000;
      lastLatLng.lng = Math.round(lastLatLng.lng * 1000000) / 1000000;
      lastLatLng.lat = Math.round(lastLatLng.lat * 1000000) / 1000000;

      for (var num = 0.1; num <= 0.9; num += 0.1) {
        var point = L.GeometryUtil.interpolateOnLine(this._map, lastLine, num);
        var tabOnPoly = [];

        this._map.eachLayer(function (poly) {
          if (poly instanceof L.Polygon) {
            var before,
                after = 0;

            for (var i = 0; i < poly.getLatLngs().length; i++) {
              var polyPoints = poly.getLatLngs()[i];

              if (!polyPoints[0].lat) {
                //antennes
                polyPoints = polyPoints[0];
              }

              for (var j = 0; j < polyPoints.length; j++) {
                if (polyPoints[j].equals(lastLatLng)) {
                  before = j - 1;
                  after = j + 1;

                  if (j == 0) {
                    before = polyPoints.length - 1;
                  } else if (j == polyPoints.length - 1) {
                    after = 0;
                  }

                  if (polyPoints[before].equals(latLngTest) || polyPoints[after].equals(latLngTest)) {
                    tabOnPoly.push(poly.options.id);
                  }
                }
              }
            }
          }
        });

        this._map.eachLayer(function (poly) {
          if (poly instanceof L.Polygon) {
            if (!tabOnPoly.includes(poly.options.id)) {
              var inside = false;
              var x = point.latLng.lat,
                  y = point.latLng.lng;

              for (var ii = 0; ii < poly.getLatLngs().length; ii++) {
                var polyPoints = poly.getLatLngs()[ii];

                for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {
                  var xi = polyPoints[i].lat,
                      yi = polyPoints[i].lng;
                  var xj = polyPoints[j].lat,
                      yj = polyPoints[j].lng;
                  var intersect = yi > y != yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
                  if (intersect) inside = !inside;
                }
              }

              if (inside) {
                inPolygon = true;
              }
            } else {
              return;
            }
          }
        });
      }

      this._map.removeLayer(lastLine);

      return inPolygon;
    },
    _finishShape: function _finishShape() {
      console.info('finishshape');
      var latlngs = this._poly._defaultShape ? this._poly._defaultShape() : this._poly.getLatLngs();

      var intersects = this._poly.newLatLngIntersects(latlngs[latlngs.length - 1]);

      var markersLength = this._markers.length;

      var latLngTest = this._markers[0].getLatLng();

      var lastLatLng = this._markers[markersLength - 1].getLatLng();

      var inPolygon = this.lineInPolygon(latLngTest, lastLatLng);

      if (!this.options.allowIntersection && intersects || !this._shapeIsValid() || inPolygon) {
        this._showErrorTooltip();

        return;
      }

      this._fireCreatedEvent();

      this.disable();

      if (this.options.repeatMode) {
        this.enable();
      }
    },
    // Called to verify the shape is valid when the user tries to finish it
    // Return false if the shape is not valid
    _shapeIsValid: function _shapeIsValid() {
      return true;
    },
    _onZoomEnd: function _onZoomEnd() {
      if (this._markers !== null) {
        this._updateGuide();
      }
    },
    _onMouseMove: function _onMouseMove(e) {
      var newPos = this._map.mouseEventToLayerPoint(e.originalEvent);

      var latlng = this._map.layerPointToLatLng(newPos); // Save latlng
      // should this be moved to _updateGuide() ?


      this._currentLatLng = latlng;

      this._updateTooltip(latlng); // Update the guide line


      this._updateGuide(newPos); // Update the mouse marker position


      this._mouseMarker.setLatLng(latlng);

      L.DomEvent.preventDefault(e.originalEvent);
    },
    _vertexChanged: function _vertexChanged(latlng, added) {
      this._map.fire(L.Draw.Event.DRAWVERTEX, {
        layers: this._markerGroup
      });

      this._updateFinishHandler();

      this._updateRunningMeasure(latlng, added);

      this._clearGuides();

      this._updateTooltip();
    },
    _onMouseDown: function _onMouseDown(e) {
      if (!this._clickHandled && !this._touchHandled && !this._disableMarkers) {
        this._onMouseMove(e);

        this._clickHandled = true;

        this._disableNewMarkers();

        var originalEvent = e.originalEvent;
        var clientX = originalEvent.clientX;
        var clientY = originalEvent.clientY;

        this._startPoint.call(this, clientX, clientY);
      }
    },
    _startPoint: function _startPoint(clientX, clientY) {
      this._mouseDownOrigin = L.point(clientX, clientY);
    },
    _onMouseUp: function _onMouseUp(e) {
      var originalEvent = e.originalEvent;
      var clientX = originalEvent.clientX;
      var clientY = originalEvent.clientY;

      this._endPoint.call(this, clientX, clientY, e);

      this._clickHandled = null;
    },
    _endPoint: function _endPoint(clientX, clientY, e) {
      if (this._mouseDownOrigin) {
        var dragCheckDistance = L.point(clientX, clientY).distanceTo(this._mouseDownOrigin);

        var lastPtDistance = this._calculateFinishDistance(e.latlng);

        if (lastPtDistance < 10 && L.Browser.touch) {
          this._finishShape();
        } else if (Math.abs(dragCheckDistance) < 9 * (window.devicePixelRatio || 1)) {
          if (this._snapper) {
            var same = false;

            if (this._snapper._markers[0]._latlng.lat == e.latlng.lat && this._snapper._markers[0]._latlng.lng == e.latlng.lng) {
              same = true;
            }

            this.addVertex(this._snapper._markers[0]._latlng, same);
          } else {
            this.addVertex(e.latlng, false);
          }
        }

        this._enableNewMarkers(); // after a short pause, enable new markers

      }

      this._mouseDownOrigin = null;
    },
    // ontouch prevented by clickHandled flag because some browsers fire both click/touch events,
    // causing unwanted behavior
    _onTouch: function _onTouch(e) {
      var originalEvent = e.originalEvent;
      var clientX;
      var clientY;

      if (originalEvent.touches && originalEvent.touches[0] && !this._clickHandled && !this._touchHandled && !this._disableMarkers) {
        clientX = originalEvent.touches[0].clientX;
        clientY = originalEvent.touches[0].clientY;

        this._disableNewMarkers();

        this._touchHandled = true;

        this._startPoint.call(this, clientX, clientY);

        this._endPoint.call(this, clientX, clientY, e);

        this._touchHandled = null;
      }

      this._clickHandled = null;
    },
    _onMouseOut: function _onMouseOut() {
      if (this._tooltip) {
        this._tooltip._onMouseOut.call(this._tooltip);
      }
    },
    // calculate if we are currently within close enough distance
    // of the closing point (first point for shapes, last point for lines)
    // this is semi-ugly code but the only reliable way i found to get the job done
    // note: calculating point.distanceTo between mouseDownOrigin and last marker did NOT work
    _calculateFinishDistance: function _calculateFinishDistance(potentialLatLng) {
      var lastPtDistance;

      if (this._markers.length > 0) {
        var finishMarker;

        if (this.type === L.Draw.Polyline.TYPE) {
          finishMarker = this._markers[this._markers.length - 1];
        } else if (this.type === L.Draw.Polygon.TYPE) {
          finishMarker = this._markers[0];
        } else {
          return Infinity;
        }

        var lastMarkerPoint = this._map.latLngToContainerPoint(finishMarker.getLatLng()),
            potentialMarker = new L.Marker(potentialLatLng, {
          icon: this.options.icon,
          zIndexOffset: this.options.zIndexOffset * 2
        });

        var potentialMarkerPint = this._map.latLngToContainerPoint(potentialMarker.getLatLng());

        lastPtDistance = lastMarkerPoint.distanceTo(potentialMarkerPint);
      } else {
        lastPtDistance = Infinity;
      }

      return lastPtDistance;
    },
    _updateFinishHandler: function _updateFinishHandler() {
      var markerCount = this._markers.length; // The last marker should have a click handler to close the polyline

      if (markerCount > 1) {
        this._markers[markerCount - 1].on('click', this._finishShape, this);
      } // Remove the old marker click handler (as only the last point should close the polyline)


      if (markerCount > 2) {
        this._markers[markerCount - 2].off('click', this._finishShape, this);
      }
    },
    _createMarker: function _createMarker(latlng) {
      var marker = new L.Marker(latlng, {
        icon: this.options.icon,
        zIndexOffset: this.options.zIndexOffset * 2
      });

      this._markerGroup.addLayer(marker);

      return marker;
    },
    _updateGuide: function _updateGuide(newPos) {
      var markerCount = this._markers ? this._markers.length : 0;

      if (markerCount > 0) {
        newPos = newPos || this._map.latLngToLayerPoint(this._currentLatLng); // draw the guide line

        this._clearGuides();

        this._drawGuide(this._map.latLngToLayerPoint(this._markers[markerCount - 1].getLatLng()), newPos);
      }
    },
    _updateTooltip: function _updateTooltip(latLng) {
      var text = this._getTooltipText();

      if (latLng) {
        this._tooltip.updatePosition(latLng);
      }

      if (!this._errorShown) {
        this._tooltip.updateContent(text);
      }
    },
    _drawGuide: function _drawGuide(pointA, pointB) {
      var length = Math.floor(Math.sqrt(Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2))),
          guidelineDistance = this.options.guidelineDistance,
          maxGuideLineLength = this.options.maxGuideLineLength,
          // Only draw a guideline with a max length
      i = length > maxGuideLineLength ? length - maxGuideLineLength : guidelineDistance,
          fraction,
          dashPoint,
          dash; //create the guides container if we haven't yet

      if (!this._guidesContainer) {
        this._guidesContainer = L.DomUtil.create('div', 'leaflet-draw-guides', this._overlayPane);
      } //draw a dash every GuildeLineDistance


      for (; i < length; i += this.options.guidelineDistance) {
        //work out fraction along line we are
        fraction = i / length; //calculate new x,y point

        dashPoint = {
          x: Math.floor(pointA.x * (1 - fraction) + fraction * pointB.x),
          y: Math.floor(pointA.y * (1 - fraction) + fraction * pointB.y)
        }; //add guide dash to guide container

        dash = L.DomUtil.create('div', 'leaflet-draw-guide-dash', this._guidesContainer);
        dash.style.backgroundColor = !this._errorShown ? this.options.shapeOptions.color : this.options.drawError.color;
        L.DomUtil.setPosition(dash, dashPoint);
      }
    },
    _updateGuideColor: function _updateGuideColor(color) {
      if (this._guidesContainer) {
        for (var i = 0, l = this._guidesContainer.childNodes.length; i < l; i++) {
          this._guidesContainer.childNodes[i].style.backgroundColor = color;
        }
      }
    },
    // removes all child elements (guide dashes) from the guides container
    _clearGuides: function _clearGuides() {
      if (this._guidesContainer) {
        while (this._guidesContainer.firstChild) {
          this._guidesContainer.removeChild(this._guidesContainer.firstChild);
        }
      }
    },
    _getTooltipText: function _getTooltipText() {
      var showLength = this.options.showLength,
          labelText,
          distanceStr;

      if (L.Browser.touch) {
        showLength = false; // if there's a better place to put this, feel free to move it
      }

      if (this._markers.length === 0) {
        labelText = {
          text: L.drawLocal.draw.handlers.polyline.tooltip.start
        };
      } else {
        distanceStr = showLength ? this._getMeasurementString() : '';

        if (this._markers.length === 1) {
          labelText = {
            text: L.drawLocal.draw.handlers.polyline.tooltip.cont,
            subtext: distanceStr
          };
        } else {
          labelText = {
            text: L.drawLocal.draw.handlers.polyline.tooltip.end,
            subtext: distanceStr
          };
        }
      }

      return labelText;
    },
    _updateRunningMeasure: function _updateRunningMeasure(latlng, added) {
      var markersLength = this._markers.length,
          previousMarkerIndex,
          distance;

      if (this._markers.length === 1) {
        this._measurementRunningTotal = 0;
      } else {
        previousMarkerIndex = markersLength - (added ? 2 : 1);
        distance = this._map.distance(latlng, this._markers[previousMarkerIndex].getLatLng()) * (this.options.factor || 1);
        this._measurementRunningTotal += distance * (added ? 1 : -1);
      }
    },
    _getMeasurementString: function _getMeasurementString() {
      var currentLatLng = this._currentLatLng,
          previousLatLng = this._markers[this._markers.length - 1].getLatLng(),
          distance; // calculate the distance from the last fixed point to the mouse position


      distance = previousLatLng && currentLatLng ? this._measurementRunningTotal + this._map.distance(currentLatLng, previousLatLng) * (this.options.factor || 1) : this._measurementRunningTotal || 0;
      return L.GeometryUtil.readableDistance(distance, this.options.metric, this.options.feet, this.options.nautic, this.options.precision);
    },
    _showErrorTooltip: function _showErrorTooltip() {
      this._errorShown = true; // Update tooltip

      this._tooltip.showAsError().updateContent({
        text: this.options.drawError.message
      }); // Update shape


      this._updateGuideColor(this.options.drawError.color);

      this._poly.setStyle({
        color: this.options.drawError.color
      }); // Hide the error after 2 seconds


      this._clearHideErrorTimeout();

      this._hideErrorTimeout = setTimeout(L.Util.bind(this._hideErrorTooltip, this), this.options.drawError.timeout);
    },
    _hideErrorTooltip: function _hideErrorTooltip() {
      this._errorShown = false;

      this._clearHideErrorTimeout(); // Revert tooltip


      this._tooltip.removeError().updateContent(this._getTooltipText()); // Revert shape


      this._updateGuideColor(this.options.shapeOptions.color);

      this._poly.setStyle({
        color: this.options.shapeOptions.color
      });
    },
    _clearHideErrorTimeout: function _clearHideErrorTimeout() {
      if (this._hideErrorTimeout) {
        clearTimeout(this._hideErrorTimeout);
        this._hideErrorTimeout = null;
      }
    },
    // disable new markers temporarily;
    // this is to prevent duplicated touch/click events in some browsers
    _disableNewMarkers: function _disableNewMarkers() {
      this._disableMarkers = true;
    },
    // see _disableNewMarkers
    _enableNewMarkers: function _enableNewMarkers() {
      setTimeout(function () {
        this._disableMarkers = false;
      }.bind(this), 50);
    },
    _cleanUpShape: function _cleanUpShape() {
      if (this._markers.length > 1) {
        this._markers[this._markers.length - 1].off('click', this._finishShape, this);
      }
    },
    _fireCreatedEvent: function _fireCreatedEvent() {
      var poly = new this.Poly(this._poly.getLatLngs(), this.options.shapeOptions);

      L.Draw.Feature.prototype._fireCreatedEvent.call(this, poly);
    }
  });
  /**
   * @class L.Draw.Polygon
   * @aka Draw.Polygon
   * @inherits L.Draw.Polyline
   */

  L.Draw.Polygon = L.Draw.Polyline.extend({
    statics: {
      TYPE: 'polygon'
    },
    Poly: L.Polygon,
    options: {
      showArea: false,
      showLength: false,
      shapeOptions: {
        stroke: true,
        color: '#3388ff',
        weight: 4,
        opacity: 0.5,
        fill: true,
        fillColor: null,
        //same as color by default
        fillOpacity: 0.2,
        clickable: true
      },
      // Whether to use the metric measurement system (truthy) or not (falsy).
      // Also defines the units to use for the metric system as an array of
      // strings (e.g. `['ha', 'm']`).
      metric: true,
      feet: true,
      // When not metric, to use feet instead of yards for display.
      nautic: false,
      // When not metric, not feet use nautic mile for display
      // Defines the precision for each type of unit (e.g. {km: 2, ft: 0}
      precision: {}
    },
    // @method initialize(): void
    initialize: function initialize(map, options) {
      L.Draw.Polyline.prototype.initialize.call(this, map, options); // Save the type so super can fire, need to do this as cannot do this.TYPE :(

      this.type = L.Draw.Polygon.TYPE;
    },
    _updateFinishHandler: function _updateFinishHandler() {
      var markerCount = this._markers.length; // The first marker should have a click handler to close the polygon

      if (markerCount === 1) {
        this._markers[0].on('click', this._finishShape, this);
      } // Add and update the double click handler


      if (markerCount > 2) {
        this._markers[markerCount - 1].on('dblclick', this._finishShape, this); // Only need to remove handler if has been added before


        if (markerCount > 3) {
          this._markers[markerCount - 2].off('dblclick', this._finishShape, this);
        }
      }
    },
    _getTooltipText: function _getTooltipText() {
      var text, subtext;

      if (this._markers.length === 0) {
        text = L.drawLocal.draw.handlers.polygon.tooltip.start;
      } else if (this._markers.length < 3) {
        text = L.drawLocal.draw.handlers.polygon.tooltip.cont;
        subtext = this._getMeasurementString();
      } else {
        text = L.drawLocal.draw.handlers.polygon.tooltip.end;
        subtext = this._getMeasurementString();
      }

      return {
        text: text,
        subtext: subtext
      };
    },
    _getMeasurementString: function _getMeasurementString() {
      var area = this._area,
          measurementString = '';

      if (!area && !this.options.showLength) {
        return null;
      }

      if (this.options.showLength) {
        measurementString = L.Draw.Polyline.prototype._getMeasurementString.call(this);
      }

      if (area) {
        measurementString += '<br>' + L.GeometryUtil.readableArea(area, this.options.metric, this.options.precision);
      }

      return measurementString;
    },
    _shapeIsValid: function _shapeIsValid() {
      return this._markers.length >= 3;
    },
    _vertexChanged: function _vertexChanged(latlng, added) {
      var latLngs; // Check to see if we should show the area

      if (!this.options.allowIntersection && this.options.showArea) {
        latLngs = this._poly.getLatLngs();
        this._area = L.GeometryUtil.geodesicArea(latLngs);
      }

      L.Draw.Polyline.prototype._vertexChanged.call(this, latlng, added);
    },
    _cleanUpShape: function _cleanUpShape() {
      var markerCount = this._markers.length;

      if (markerCount > 0) {
        this._markers[0].off('click', this._finishShape, this);

        if (markerCount > 2) {
          this._markers[markerCount - 1].off('dblclick', this._finishShape, this);
        }
      }
    }
  });
  L.SimpleShape = {};
  /**
   * @class L.Draw.SimpleShape
   * @aka Draw.SimpleShape
   * @inherits L.Draw.Feature
   */

  L.Draw.SimpleShape = L.Draw.Feature.extend({
    options: {
      repeatMode: false
    },
    // @method initialize(): void
    initialize: function initialize(map, options) {
      this._endLabelText = L.drawLocal.draw.handlers.simpleshape.tooltip.end;
      L.Draw.Feature.prototype.initialize.call(this, map, options);
    },
    // @method addHooks(): void
    // Add listener hooks to this handler.
    addHooks: function addHooks() {
      L.Draw.Feature.prototype.addHooks.call(this);

      if (this._map) {
        this._mapDraggable = this._map.dragging.enabled();

        if (this._mapDraggable) {
          this._map.dragging.disable();
        } //TODO refactor: move cursor to styles


        this._container.style.cursor = 'crosshair';

        this._tooltip.updateContent({
          text: this._initialLabelText
        });

        this._map.on('mousedown', this._onMouseDown, this).on('mousemove', this._onMouseMove, this).on('touchstart', this._onMouseDown, this).on('touchmove', this._onMouseMove, this);
      }
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler.
    removeHooks: function removeHooks() {
      L.Draw.Feature.prototype.removeHooks.call(this);

      if (this._map) {
        if (this._mapDraggable) {
          this._map.dragging.enable();
        } //TODO refactor: move cursor to styles


        this._container.style.cursor = '';

        this._map.off('mousedown', this._onMouseDown, this).off('mousemove', this._onMouseMove, this).off('touchstart', this._onMouseDown, this).off('touchmove', this._onMouseMove, this);

        L.DomEvent.off(document, 'mouseup', this._onMouseUp, this);
        L.DomEvent.off(document, 'touchend', this._onMouseUp, this); // If the box element doesn't exist they must not have moved the mouse, so don't need to destroy/return

        if (this._shape) {
          this._map.removeLayer(this._shape);

          delete this._shape;
        }
      }

      this._isDrawing = false;
    },
    _getTooltipText: function _getTooltipText() {
      return {
        text: this._endLabelText
      };
    },
    _onMouseDown: function _onMouseDown(e) {
      this._isDrawing = true;
      this._startLatLng = e.latlng;
      L.DomEvent.on(document, 'mouseup', this._onMouseUp, this).on(document, 'touchend', this._onMouseUp, this).preventDefault(e.originalEvent);
    },
    _onMouseMove: function _onMouseMove(e) {
      var latlng = e.latlng;

      this._tooltip.updatePosition(latlng);

      if (this._isDrawing) {
        this._tooltip.updateContent(this._getTooltipText());

        this._drawShape(latlng);
      }
    },
    _onMouseUp: function _onMouseUp() {
      if (this._shape) {
        this._fireCreatedEvent();
      }

      this.disable();

      if (this.options.repeatMode) {
        this.enable();
      }
    }
  });
  /**
   * @class L.Draw.Rectangle
   * @aka Draw.Rectangle
   * @inherits L.Draw.SimpleShape
   */

  L.Draw.Rectangle = L.Draw.SimpleShape.extend({
    statics: {
      TYPE: 'rectangle'
    },
    options: {
      shapeOptions: {
        stroke: true,
        color: '#3388ff',
        weight: 4,
        opacity: 0.5,
        fill: true,
        fillColor: null,
        //same as color by default
        fillOpacity: 0.2,
        showArea: true,
        clickable: true
      },
      metric: true // Whether to use the metric measurement system or imperial

    },
    // @method initialize(): void
    initialize: function initialize(map, options) {
      // Save the type so super can fire, need to do this as cannot do this.TYPE :(
      this.type = L.Draw.Rectangle.TYPE;
      this._initialLabelText = L.drawLocal.draw.handlers.rectangle.tooltip.start;
      L.Draw.SimpleShape.prototype.initialize.call(this, map, options);
    },
    // @method disable(): void
    disable: function disable() {
      if (!this._enabled) {
        return;
      }

      this._isCurrentlyTwoClickDrawing = false;
      L.Draw.SimpleShape.prototype.disable.call(this);
    },
    _onMouseUp: function _onMouseUp(e) {
      if (!this._shape && !this._isCurrentlyTwoClickDrawing) {
        this._isCurrentlyTwoClickDrawing = true;
        return;
      } // Make sure closing click is on map


      if (this._isCurrentlyTwoClickDrawing && !_hasAncestor(e.target, 'leaflet-pane')) {
        return;
      }

      L.Draw.SimpleShape.prototype._onMouseUp.call(this);
    },
    _drawShape: function _drawShape(latlng) {
      if (!this._shape) {
        this._shape = new L.Rectangle(new L.LatLngBounds(this._startLatLng, latlng), this.options.shapeOptions);

        this._map.addLayer(this._shape);
      } else {
        this._shape.setBounds(new L.LatLngBounds(this._startLatLng, latlng));
      }
    },
    _fireCreatedEvent: function _fireCreatedEvent() {
      var rectangle = new L.Rectangle(this._shape.getBounds(), this.options.shapeOptions);

      L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, rectangle);
    },
    _getTooltipText: function _getTooltipText() {
      var tooltipText = L.Draw.SimpleShape.prototype._getTooltipText.call(this),
          shape = this._shape,
          showArea = this.options.showArea,
          latLngs,
          area,
          subtext;

      if (shape) {
        latLngs = this._shape._defaultShape ? this._shape._defaultShape() : this._shape.getLatLngs();
        area = L.GeometryUtil.geodesicArea(latLngs);
        subtext = showArea ? L.GeometryUtil.readableArea(area, this.options.metric) : '';
      }

      return {
        text: tooltipText.text,
        subtext: subtext
      };
    }
  });

  function _hasAncestor(el, cls) {
    while ((el = el.parentElement) && !el.classList.contains(cls)) {
      ;
    }

    return el;
  }
  /**
   * @class L.Draw.Marker
   * @aka Draw.Marker
   * @inherits L.Draw.Feature
   */


  L.Draw.Marker = L.Draw.Feature.extend({
    statics: {
      TYPE: 'marker'
    },
    options: {
      icon: new L.Icon.Default(),
      repeatMode: false,
      zIndexOffset: 2000 // This should be > than the highest z-index any markers

    },
    // @method initialize(): void
    initialize: function initialize(map, options) {
      // Save the type so super can fire, need to do this as cannot do this.TYPE :(
      this.type = L.Draw.Marker.TYPE;
      this._initialLabelText = L.drawLocal.draw.handlers.marker.tooltip.start;
      L.Draw.Feature.prototype.initialize.call(this, map, options);
    },
    // @method addHooks(): void
    // Add listener hooks to this handler.
    addHooks: function addHooks() {
      L.Draw.Feature.prototype.addHooks.call(this);

      if (this._map) {
        this._tooltip.updateContent({
          text: this._initialLabelText
        }); // Same mouseMarker as in Draw.Polyline


        if (!this._mouseMarker) {
          this._mouseMarker = L.marker(this._map.getCenter(), {
            icon: L.divIcon({
              className: 'leaflet-mouse-marker',
              iconAnchor: [20, 20],
              iconSize: [40, 40]
            }),
            opacity: 0,
            zIndexOffset: this.options.zIndexOffset
          });
        }

        this._mouseMarker.on('click', this._onClick, this).addTo(this._map);

        this._map.on('mousemove', this._onMouseMove, this);

        this._map.on('click', this._onTouch, this);
      }
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler.
    removeHooks: function removeHooks() {
      L.Draw.Feature.prototype.removeHooks.call(this);

      if (this._map) {
        if (this._marker) {
          this._marker.off('click', this._onClick, this);

          this._map.off('click', this._onClick, this).off('click', this._onTouch, this).removeLayer(this._marker);

          delete this._marker;
        }

        this._mouseMarker.off('click', this._onClick, this);

        this._map.removeLayer(this._mouseMarker);

        delete this._mouseMarker;

        this._map.off('mousemove', this._onMouseMove, this);
      }
    },
    _onMouseMove: function _onMouseMove(e) {
      var latlng = e.latlng;

      this._tooltip.updatePosition(latlng);

      this._mouseMarker.setLatLng(latlng);

      if (!this._marker) {
        this._marker = this._createMarker(latlng); // Bind to both marker and map to make sure we get the click event.

        this._marker.on('click', this._onClick, this);

        this._map.on('click', this._onClick, this).addLayer(this._marker);
      } else {
        latlng = this._mouseMarker.getLatLng();

        this._marker.setLatLng(latlng);
      }
    },
    _createMarker: function _createMarker(latlng) {
      return new L.Marker(latlng, {
        icon: this.options.icon,
        zIndexOffset: this.options.zIndexOffset
      });
    },
    _onClick: function _onClick() {
      this._fireCreatedEvent();

      this.disable();

      if (this.options.repeatMode) {
        this.enable();
      }
    },
    _onTouch: function _onTouch(e) {
      // called on click & tap, only really does any thing on tap
      this._onMouseMove(e); // creates & places marker


      this._onClick(); // permanently places marker & ends interaction

    },
    _fireCreatedEvent: function _fireCreatedEvent() {
      var marker = new L.Marker.Touch(this._marker.getLatLng(), {
        icon: this.options.icon
      });

      L.Draw.Feature.prototype._fireCreatedEvent.call(this, marker);
    }
  });
  /**
   * @class L.Draw.CircleMarker
   * @aka Draw.CircleMarker
   * @inherits L.Draw.Marker
   */

  L.Draw.CircleMarker = L.Draw.Marker.extend({
    statics: {
      TYPE: 'circlemarker'
    },
    options: {
      stroke: true,
      color: '#3388ff',
      weight: 4,
      opacity: 0.5,
      fill: true,
      fillColor: null,
      //same as color by default
      fillOpacity: 0.2,
      clickable: true,
      zIndexOffset: 2000 // This should be > than the highest z-index any markers

    },
    // @method initialize(): void
    initialize: function initialize(map, options) {
      // Save the type so super can fire, need to do this as cannot do this.TYPE :(
      this.type = L.Draw.CircleMarker.TYPE;
      this._initialLabelText = L.drawLocal.draw.handlers.circlemarker.tooltip.start;
      L.Draw.Feature.prototype.initialize.call(this, map, options);
    },
    _fireCreatedEvent: function _fireCreatedEvent() {
      var circleMarker = new L.CircleMarker(this._marker.getLatLng(), this.options);

      L.Draw.Feature.prototype._fireCreatedEvent.call(this, circleMarker);
    },
    _createMarker: function _createMarker(latlng) {
      return new L.CircleMarker(latlng, this.options);
    }
  });
  /**
   * @class L.Draw.Circle
   * @aka Draw.Circle
   * @inherits L.Draw.SimpleShape
   */

  L.Draw.Circle = L.Draw.SimpleShape.extend({
    statics: {
      TYPE: 'circle'
    },
    options: {
      shapeOptions: {
        stroke: true,
        color: '#3388ff',
        weight: 4,
        opacity: 0.5,
        fill: true,
        fillColor: null,
        //same as color by default
        fillOpacity: 0.2,
        clickable: true
      },
      showRadius: true,
      metric: true,
      // Whether to use the metric measurement system or imperial
      feet: true,
      // When not metric, use feet instead of yards for display
      nautic: false // When not metric, not feet use nautic mile for display

    },
    // @method initialize(): void
    initialize: function initialize(map, options) {
      // Save the type so super can fire, need to do this as cannot do this.TYPE :(
      this.type = L.Draw.Circle.TYPE;
      this._initialLabelText = L.drawLocal.draw.handlers.circle.tooltip.start;
      L.Draw.SimpleShape.prototype.initialize.call(this, map, options);
    },
    _drawShape: function _drawShape(latlng) {
      var distance = this._map.distance(this._startLatLng, latlng);

      if (!this._shape) {
        this._shape = new L.Circle(this._startLatLng, distance, this.options.shapeOptions);

        this._map.addLayer(this._shape);
      } else {
        this._shape.setRadius(distance);
      }
    },
    _fireCreatedEvent: function _fireCreatedEvent() {
      var circle = new L.Circle(this._startLatLng, this._shape.getRadius(), this.options.shapeOptions);

      L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, circle);
    },
    _onMouseMove: function _onMouseMove(e) {
      var latlng = e.latlng,
          showRadius = this.options.showRadius,
          useMetric = this.options.metric,
          radius;

      this._tooltip.updatePosition(latlng);

      if (this._isDrawing) {
        this._drawShape(latlng); // Get the new radius (rounded to 1 dp)


        radius = this._shape.getRadius().toFixed(1);
        var subtext = '';

        if (showRadius) {
          subtext = L.drawLocal.draw.handlers.circle.radius + ': ' + L.GeometryUtil.readableDistance(radius, useMetric, this.options.feet, this.options.nautic);
        }

        this._tooltip.updateContent({
          text: this._endLabelText,
          subtext: subtext
        });
      }
    }
  });
  L.Edit = L.Edit || {};
  /**
   * @class L.Edit.Marker
   * @aka Edit.Marker
   */

  L.Edit.Marker = L.Handler.extend({
    // @method initialize(): void
    initialize: function initialize(marker, options) {
      this._marker = marker;
      L.setOptions(this, options);
    },
    // @method addHooks(): void
    // Add listener hooks to this handler
    addHooks: function addHooks() {
      var marker = this._marker;
      marker.dragging.enable();
      marker.on('dragend', this._onDragEnd, marker);

      this._toggleMarkerHighlight();
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler
    removeHooks: function removeHooks() {
      var marker = this._marker;
      marker.dragging.disable();
      marker.off('dragend', this._onDragEnd, marker);

      this._toggleMarkerHighlight();
    },
    _onDragEnd: function _onDragEnd(e) {
      var layer = e.target;
      layer.edited = true;

      this._map.fire(L.Draw.Event.EDITMOVE, {
        layer: layer
      });
    },
    _toggleMarkerHighlight: function _toggleMarkerHighlight() {
      var icon = this._marker._icon; // Don't do anything if this layer is a marker but doesn't have an icon. Markers
      // should usually have icons. If using Leaflet.draw with Leaflet.markercluster there
      // is a chance that a marker doesn't.

      if (!icon) {
        return;
      } // This is quite naughty, but I don't see another way of doing it. (short of setting a new icon)


      icon.style.display = 'none';

      if (L.DomUtil.hasClass(icon, 'leaflet-edit-marker-selected')) {
        L.DomUtil.removeClass(icon, 'leaflet-edit-marker-selected'); // Offset as the border will make the icon move.

        this._offsetMarker(icon, -4);
      } else {
        L.DomUtil.addClass(icon, 'leaflet-edit-marker-selected'); // Offset as the border will make the icon move.

        this._offsetMarker(icon, 4);
      }

      icon.style.display = '';
    },
    _offsetMarker: function _offsetMarker(icon, offset) {
      var iconMarginTop = parseInt(icon.style.marginTop, 10) - offset,
          iconMarginLeft = parseInt(icon.style.marginLeft, 10) - offset;
      icon.style.marginTop = iconMarginTop + 'px';
      icon.style.marginLeft = iconMarginLeft + 'px';
    }
  });
  L.Marker.addInitHook(function () {
    if (L.Edit.Marker) {
      this.editing = new L.Edit.Marker(this);

      if (this.options.editable) {
        this.editing.enable();
      }
    }
  });
  L.Edit = L.Edit || {};
  /**
   * @class L.Edit.Polyline
   * @aka L.Edit.Poly
   * @aka Edit.Poly
   */

  L.Edit.Poly = L.Handler.extend({
    options: {},
    // @method initialize(): void
    initialize: function initialize(poly, options) {
      this.latlngs = [poly._latlngs];

      if (poly._holes) {
        this.latlngs = this.latlngs.concat(poly._holes);
      }

      this._poly = poly;
      L.setOptions(this, options);

      this._poly.on('revert-edited', this._updateLatLngs, this);
    },
    // Compatibility method to normalize Poly* objects
    // between 0.7.x and 1.0+
    _defaultShape: function _defaultShape() {
      if (!L.Polyline._flat) {
        return this._poly._latlngs;
      }

      return L.Polyline._flat(this._poly._latlngs) ? this._poly._latlngs : this._poly._latlngs[0];
    },
    _eachVertexHandler: function _eachVertexHandler(callback) {
      for (var i = 0; i < this._verticesHandlers.length; i++) {
        callback(this._verticesHandlers[i]);
      }
    },
    // @method addHooks(): void
    // Add listener hooks to this handler
    addHooks: function addHooks() {
      this._initHandlers();

      this._eachVertexHandler(function (handler) {
        handler.addHooks();
      });
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler
    removeHooks: function removeHooks() {
      this._eachVertexHandler(function (handler) {
        handler.removeHooks();
      });
    },
    // @method updateMarkers(): void
    // Fire an update for each vertex handler
    updateMarkers: function updateMarkers() {
      this._eachVertexHandler(function (handler) {
        handler.updateMarkers();
      });
    },
    _initHandlers: function _initHandlers() {
      this._verticesHandlers = [];

      for (var i = 0; i < this.latlngs.length; i++) {
        this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(this._poly, this.latlngs[i], this.options));
      }
    },
    _updateLatLngs: function _updateLatLngs(e) {
      this.latlngs = [e.layer._latlngs];

      if (e.layer._holes) {
        this.latlngs = this.latlngs.concat(e.layer._holes);
      }
    }
  });
  /**
   * @class L.Edit.PolyVerticesEdit
   * @aka Edit.PolyVerticesEdit
   */

  L.Edit.PolyVerticesEdit = L.Handler.extend({
    options: {
      allowIntersection: false,
      icon: new L.DivIcon({
        iconSize: new L.Point(8, 8),
        className: 'leaflet-div-icon leaflet-editing-icon'
      }),
      touchIcon: new L.DivIcon({
        iconSize: new L.Point(20, 20),
        className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
      }),
      drawError: {
        color: '#b00b00',
        timeout: 1000
      }
    },
    // @method intialize(): void
    initialize: function initialize(poly, latlngs, options) {
      // if touch, switch to touch icon
      if (L.Browser.touch) {
        this.options.icon = this.options.touchIcon;
      }

      this._poly = poly;

      if (options && options.drawError) {
        options.drawError = L.Util.extend({}, this.options.drawError, options.drawError);
      }

      this._latlngs = latlngs;
      L.setOptions(this, options);
    },
    // Compatibility method to normalize Poly* objects
    // between 0.7.x and 1.0+
    _defaultShape: function _defaultShape() {
      if (!L.Polyline._flat) {
        return this._latlngs;
      }

      return L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0];
    },
    // @method addHooks(): void
    // Add listener hooks to this handler.
    addHooks: function addHooks() {
      var poly = this._poly;

      if (!(poly instanceof L.Polygon)) {
        poly.options.fill = false;

        if (poly.options.editing) {
          poly.options.editing.fill = false;
        }
      }

      poly.setStyle(poly.options.editing);

      if (this._poly._map) {
        this._map = this._poly._map; // Set map

        if (!this._markerGroup) {
          this._initMarkers();
        }

        this._poly._map.addLayer(this._markerGroup);
      }
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler.
    removeHooks: function removeHooks() {
      var poly = this._poly;
      poly.setStyle(poly.options.original);

      if (poly._map) {
        poly._map.removeLayer(this._markerGroup);

        delete this._markerGroup;
        delete this._markers;
        poly.fire('editstop');
      }
    },
    // @method updateMarkers(): void
    // Clear markers and update their location
    updateMarkers: function updateMarkers() {
      this._markerGroup.clearLayers();

      this._initMarkers();
    },
    _initMarkers: function _initMarkers() {
      if (!this._markerGroup) {
        this._markerGroup = new L.LayerGroup();
      }

      this._markers = [];

      var latlngs = this._defaultShape(),
          i,
          j,
          len,
          marker;

      for (i = 0, len = latlngs.length; i < len; i++) {
        marker = this._createMarker(latlngs[i], i); // marker.on('click', this._onMarkerClick, this);

        this._markers.push(marker);
      }

      var markerLeft, markerRight;

      for (i = 0, j = len - 1; i < len; j = i++) {
        if (i === 0 && !(L.Polygon && this._poly instanceof L.Polygon)) {
          continue;
        }

        markerLeft = this._markers[j];
        markerRight = this._markers[i];

        this._createMiddleMarker(markerLeft, markerRight);

        this._updatePrevNext(markerLeft, markerRight);
      }
    },
    _createMarker: function _createMarker(latlng, index) {
      // Extending L.Marker in TouchEvents.js to include touch.
      var marker = new L.Marker.Touch(latlng, {
        draggable: true,
        icon: this.options.icon
      });
      marker._origLatLng = latlng;
      marker._index = index;
      marker.on('dragstart', this._onMarkerDragStart, this).on('drag', this._onMarkerDrag, this).on('dragend', this._fireEdit, this) // .on('dragend', this._onMarkerDragEnd, this)
      .on('touchmove', this._onTouchMove, this).on('touchend', this._fireEdit, this).on('MSPointerMove', this._onTouchMove, this).on('MSPointerUp', this._fireEdit, this);

      this._markerGroup.addLayer(marker);

      return marker;
    },
    _onMarkerDragStart: function _onMarkerDragStart() {
      this._poly.fire('editstart');
    },
    _spliceLatLngs: function _spliceLatLngs() {
      var latlngs = this._defaultShape();

      var removed = [].splice.apply(latlngs, arguments);

      this._poly._convertLatLngs(latlngs, true);

      this._poly.redraw();

      return removed;
    },
    _removeMarker: function _removeMarker(marker) {
      var i = marker._index;

      this._markerGroup.removeLayer(marker);

      this._markers.splice(i, 1);

      this._spliceLatLngs(i, 1);

      this._updateIndexes(i, -1);

      marker.off('dragstart', this._onMarkerDragStart, this).off('drag', this._onMarkerDrag, this).off('dragend', this._fireEdit, this).off('touchmove', this._onMarkerDrag, this).off('touchend', this._fireEdit, this) //  .off('click', this._onMarkerClick, this)
      .off('MSPointerMove', this._onTouchMove, this).off('MSPointerUp', this._fireEdit, this);
    },
    _fireEdit: function _fireEdit() {
      this._poly.edited = true;

      this._poly.fire('edit');

      this._poly._map.fire(L.Draw.Event.EDITVERTEX, {
        layers: this._markerGroup,
        poly: this._poly
      });
    },
    _onMarkerDrag: function _onMarkerDrag(e) {
      var marker = e.target;
      var poly = this._poly;
      L.extend(marker._origLatLng, marker._latlng);

      if (marker._middleLeft) {
        marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
      }

      if (marker._middleRight) {
        marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
      } // if (poly.options.poly) {
      //     var tooltip = poly._map._editTooltip; // Access the tooltip
      //
      //     // If we don't allow intersections and the polygon intersects
      //     if (!poly.options.poly.allowIntersection && poly.intersects()) {
      //
      //         var originalColor = poly.options.color;
      //         poly.setStyle({color: this.options.drawError.color});
      //
      //         // Manually trigger 'dragend' behavior on marker we are about to remove
      //         // WORKAROUND: introduced in 1.0.0-rc2, may be related to #4484
      //         if (L.version.indexOf('0.7') !== 0) {
      //             marker.dragging._draggable._onUp(e);
      //         }
      //         this._onMarkerClick(e); // Remove violating marker
      //         // FIXME: Reset the marker to it's original position (instead of remove)
      //
      //         if (tooltip) {
      //             tooltip.updateContent({
      //                 text: L.drawLocal.draw.handlers.polyline.error
      //             });
      //         }
      //
      //         // Reset everything back to normal after a second
      //         setTimeout(function () {
      //             poly.setStyle({color: originalColor});
      //             if (tooltip) {
      //                 tooltip.updateContent({
      //                     text: L.drawLocal.edit.handlers.edit.tooltip.text,
      //                     subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
      //                 });
      //             }
      //         }, 1000);
      //     }
      // }


      var tabLatLngs = [];

      for (var j in this._markers) {
        tabLatLngs.push(this._markers[j].getLatLng());
      }

      this._poly.setLatLngs(tabLatLngs);

      this._poly.editing.latlngs[0][0] = tabLatLngs;

      this._poly.redraw();

      this._poly.fire('editdrag');
    },
    _onMarkerClick: function _onMarkerClick(e) {
      var minPoints = L.Polygon && this._poly instanceof L.Polygon ? 4 : 3,
          marker = e.target; // If removing this point would create an invalid polyline/polygon don't remove

      if (this._defaultShape().length < minPoints) {
        return;
      } // remove the marker


      this._removeMarker(marker); // update prev/next links of adjacent markers


      this._updatePrevNext(marker._prev, marker._next); // remove ghost markers near the removed marker


      if (marker._middleLeft) {
        this._markerGroup.removeLayer(marker._middleLeft);
      }

      if (marker._middleRight) {
        this._markerGroup.removeLayer(marker._middleRight);
      } // create a ghost marker in place of the removed one


      if (marker._prev && marker._next) {
        this._createMiddleMarker(marker._prev, marker._next);
      } else if (!marker._prev) {
        marker._next._middleLeft = null;
      } else if (!marker._next) {
        marker._prev._middleRight = null;
      }

      this._fireEdit();
    },
    _onTouchMove: function _onTouchMove(e) {
      var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]),
          latlng = this._map.layerPointToLatLng(layerPoint),
          marker = e.target;

      L.extend(marker._origLatLng, latlng);

      if (marker._middleLeft) {
        marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
      }

      if (marker._middleRight) {
        marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
      }

      this._poly.redraw();

      this.updateMarkers();
    },
    _updateIndexes: function _updateIndexes(index, delta) {
      this._markerGroup.eachLayer(function (marker) {
        if (marker._index > index) {
          marker._index += delta;
        }
      });
    },
    _createMiddleMarker: function _createMiddleMarker(marker1, marker2) {
      var latlng = this._getMiddleLatLng(marker1, marker2),
          marker = this._createMarker(latlng),
          onClick,
          _onDragStart,
          _onDragEnd2;

      marker.setOpacity(0.6);
      marker1._middleRight = marker2._middleLeft = marker;

      _onDragStart = function onDragStart() {
        marker.off('touchmove', _onDragStart, this);
        var i = marker2._index;
        marker._index = i;
        marker.off('click', onClick, this).on('click', this._onMarkerClick, this);
        latlng.lat = marker.getLatLng().lat;
        latlng.lng = marker.getLatLng().lng;

        this._spliceLatLngs(i, 0, latlng);

        this._markers.splice(i, 0, marker);

        marker.setOpacity(1);

        this._updateIndexes(i, 1);

        marker2._index++;

        this._updatePrevNext(marker1, marker);

        this._updatePrevNext(marker, marker2);

        this._poly.fire('editstart');
      };

      _onDragEnd2 = function onDragEnd() {
        marker.off('dragstart', _onDragStart, this);
        marker.off('dragend', _onDragEnd2, this);
        marker.off('touchmove', _onDragStart, this);

        if (!this.intersect) {
          this._createMiddleMarker(marker1, marker);

          this._createMiddleMarker(marker, marker2);
        } else {
          marker2._index--;
          var i = marker2._index;

          this._spliceLatLngs(i, 1);

          this._updateIndexes(i, -1);

          this._updatePrevNext(marker1, marker2);

          marker.setOpacity(0.6);

          this._poly.redraw();

          this.updateMarkers();
        }
      };

      onClick = function onClick() {
        _onDragStart.call(this);

        _onDragEnd2.call(this);

        this._fireEdit();
      };

      marker //.on('click', onClick, this)
      .on('dragstart', _onDragStart, this).on('dragend', _onDragEnd2, this).on('touchmove', _onDragStart, this);

      this._markerGroup.addLayer(marker);
    },
    _updatePrevNext: function _updatePrevNext(marker1, marker2) {
      if (marker1) {
        marker1._next = marker2;
      }

      if (marker2) {
        marker2._prev = marker1;
      }
    },
    _getMiddleLatLng: function _getMiddleLatLng(marker1, marker2) {
      var map = this._poly._map,
          p1 = map.project(marker1.getLatLng()),
          p2 = map.project(marker2.getLatLng());
      return map.unproject(p1._add(p2)._divideBy(2));
    }
  });
  L.Polyline.addInitHook(function () {
    // Check to see if handler has already been initialized. This is to support versions of Leaflet that still have L.Handler.PolyEdit
    if (this.editing) {
      return;
    }

    if (L.Edit.Poly) {
      this.editing = new L.Edit.Poly(this, this.options.poly);

      if (this.options.editable) {
        this.editing.enable();
      }
    }

    this.on('add', function () {
      if (this.editing && this.editing.enabled()) {
        this.editing.addHooks();
      }
    });
    this.on('remove', function () {
      if (this.editing && this.editing.enabled()) {
        this.editing.removeHooks();
      }
    });
  });
  L.Edit = L.Edit || {};
  /**
   * @class L.Edit.SimpleShape
   * @aka Edit.SimpleShape
   */

  L.Edit.SimpleShape = L.Handler.extend({
    options: {
      moveIcon: new L.DivIcon({
        iconSize: new L.Point(8, 8),
        className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move'
      }),
      resizeIcon: new L.DivIcon({
        iconSize: new L.Point(8, 8),
        className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize'
      }),
      touchMoveIcon: new L.DivIcon({
        iconSize: new L.Point(20, 20),
        className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon'
      }),
      touchResizeIcon: new L.DivIcon({
        iconSize: new L.Point(20, 20),
        className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon'
      })
    },
    // @method intialize(): void
    initialize: function initialize(shape, options) {
      // if touch, switch to touch icon
      if (L.Browser.touch) {
        this.options.moveIcon = this.options.touchMoveIcon;
        this.options.resizeIcon = this.options.touchResizeIcon;
      }

      this._shape = shape;
      L.Util.setOptions(this, options);
    },
    // @method addHooks(): void
    // Add listener hooks to this handler
    addHooks: function addHooks() {
      var shape = this._shape;

      if (this._shape._map) {
        this._map = this._shape._map;
        shape.setStyle(shape.options.editing);

        if (shape._map) {
          this._map = shape._map;

          if (!this._markerGroup) {
            this._initMarkers();
          }

          this._map.addLayer(this._markerGroup);
        }
      }
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler
    removeHooks: function removeHooks() {
      var shape = this._shape;
      shape.setStyle(shape.options.original);

      if (shape._map) {
        this._unbindMarker(this._moveMarker);

        for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
          this._unbindMarker(this._resizeMarkers[i]);
        }

        this._resizeMarkers = null;

        this._map.removeLayer(this._markerGroup);

        delete this._markerGroup;
      }

      this._map = null;
    },
    // @method updateMarkers(): void
    // Remove the edit markers from this layer
    updateMarkers: function updateMarkers() {
      this._markerGroup.clearLayers();

      this._initMarkers();
    },
    _initMarkers: function _initMarkers() {
      if (!this._markerGroup) {
        this._markerGroup = new L.LayerGroup();
      } // Create center marker


      this._createMoveMarker(); // Create edge marker


      this._createResizeMarker();
    },
    _createMoveMarker: function _createMoveMarker() {// Children override
    },
    _createResizeMarker: function _createResizeMarker() {// Children override
    },
    _createMarker: function _createMarker(latlng, icon) {
      // Extending L.Marker in TouchEvents.js to include touch.
      var marker = new L.Marker.Touch(latlng, {
        draggable: true,
        icon: icon,
        zIndexOffset: 10
      });

      this._bindMarker(marker);

      this._markerGroup.addLayer(marker);

      return marker;
    },
    _bindMarker: function _bindMarker(marker) {
      marker.on('dragstart', this._onMarkerDragStart, this).on('drag', this._onMarkerDrag, this).on('dragend', this._onMarkerDragEnd, this).on('touchstart', this._onTouchStart, this).on('touchmove', this._onTouchMove, this).on('MSPointerMove', this._onTouchMove, this).on('touchend', this._onTouchEnd, this).on('MSPointerUp', this._onTouchEnd, this);
    },
    _unbindMarker: function _unbindMarker(marker) {
      marker.off('dragstart', this._onMarkerDragStart, this).off('drag', this._onMarkerDrag, this).off('dragend', this._onMarkerDragEnd, this).off('touchstart', this._onTouchStart, this).off('touchmove', this._onTouchMove, this).off('MSPointerMove', this._onTouchMove, this).off('touchend', this._onTouchEnd, this).off('MSPointerUp', this._onTouchEnd, this);
    },
    _onMarkerDragStart: function _onMarkerDragStart(e) {
      var marker = e.target;
      marker.setOpacity(0);

      this._shape.fire('editstart');
    },
    _fireEdit: function _fireEdit() {
      this._shape.edited = true;

      this._shape.fire('edit');
    },
    _onMarkerDrag: function _onMarkerDrag(e) {
      var marker = e.target,
          latlng = marker.getLatLng();

      if (marker === this._moveMarker) {
        this._move(latlng);
      } else {
        this._resize(latlng);
      }

      this._shape.redraw();

      this._shape.fire('editdrag');
    },
    _onMarkerDragEnd: function _onMarkerDragEnd(e) {
      var marker = e.target;
      marker.setOpacity(1);

      this._fireEdit();
    },
    _onTouchStart: function _onTouchStart(e) {
      L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e);

      if (typeof this._getCorners === 'function') {
        // Save a reference to the opposite point
        var corners = this._getCorners(),
            marker = e.target,
            currentCornerIndex = marker._cornerIndex;

        marker.setOpacity(0); // Copyed from Edit.Rectangle.js line 23 _onMarkerDragStart()
        // Latlng is null otherwise.

        this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];

        this._toggleCornerMarkers(0, currentCornerIndex);
      }

      this._shape.fire('editstart');
    },
    _onTouchMove: function _onTouchMove(e) {
      var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]),
          latlng = this._map.layerPointToLatLng(layerPoint),
          marker = e.target;

      if (marker === this._moveMarker) {
        this._move(latlng);
      } else {
        this._resize(latlng);
      }

      this._shape.redraw(); // prevent touchcancel in IOS
      // e.preventDefault();


      return false;
    },
    _onTouchEnd: function _onTouchEnd(e) {
      var marker = e.target;
      marker.setOpacity(1);
      this.updateMarkers();

      this._fireEdit();
    },
    _move: function _move() {// Children override
    },
    _resize: function _resize() {// Children override
    }
  });
  L.Edit = L.Edit || {};
  /**
   * @class L.Edit.Rectangle
   * @aka Edit.Rectangle
   * @inherits L.Edit.SimpleShape
   */

  L.Edit.Rectangle = L.Edit.SimpleShape.extend({
    _createMoveMarker: function _createMoveMarker() {
      var bounds = this._shape.getBounds(),
          center = bounds.getCenter();

      this._moveMarker = this._createMarker(center, this.options.moveIcon);
    },
    _createResizeMarker: function _createResizeMarker() {
      var corners = this._getCorners();

      this._resizeMarkers = [];

      for (var i = 0, l = corners.length; i < l; i++) {
        this._resizeMarkers.push(this._createMarker(corners[i], this.options.resizeIcon)); // Monkey in the corner index as we will need to know this for dragging


        this._resizeMarkers[i]._cornerIndex = i;
      }
    },
    _onMarkerDragStart: function _onMarkerDragStart(e) {
      L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e); // Save a reference to the opposite point


      var corners = this._getCorners(),
          marker = e.target,
          currentCornerIndex = marker._cornerIndex;

      this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];

      this._toggleCornerMarkers(0, currentCornerIndex);
    },
    _onMarkerDragEnd: function _onMarkerDragEnd(e) {
      var marker = e.target,
          bounds,
          center; // Reset move marker position to the center

      if (marker === this._moveMarker) {
        bounds = this._shape.getBounds();
        center = bounds.getCenter();
        marker.setLatLng(center);
      }

      this._toggleCornerMarkers(1);

      this._repositionCornerMarkers();

      L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this, e);
    },
    _move: function _move(newCenter) {
      var latlngs = this._shape._defaultShape ? this._shape._defaultShape() : this._shape.getLatLngs(),
          bounds = this._shape.getBounds(),
          center = bounds.getCenter(),
          offset,
          newLatLngs = []; // Offset the latlngs to the new center


      for (var i = 0, l = latlngs.length; i < l; i++) {
        offset = [latlngs[i].lat - center.lat, latlngs[i].lng - center.lng];
        newLatLngs.push([newCenter.lat + offset[0], newCenter.lng + offset[1]]);
      }

      this._shape.setLatLngs(newLatLngs); // Reposition the resize markers


      this._repositionCornerMarkers();

      this._map.fire(L.Draw.Event.EDITMOVE, {
        layer: this._shape
      });
    },
    _resize: function _resize(latlng) {
      var bounds; // Update the shape based on the current position of this corner and the opposite point

      this._shape.setBounds(L.latLngBounds(latlng, this._oppositeCorner)); // Reposition the move marker


      bounds = this._shape.getBounds();

      this._moveMarker.setLatLng(bounds.getCenter());

      this._map.fire(L.Draw.Event.EDITRESIZE, {
        layer: this._shape
      });
    },
    _getCorners: function _getCorners() {
      var bounds = this._shape.getBounds(),
          nw = bounds.getNorthWest(),
          ne = bounds.getNorthEast(),
          se = bounds.getSouthEast(),
          sw = bounds.getSouthWest();

      return [nw, ne, se, sw];
    },
    _toggleCornerMarkers: function _toggleCornerMarkers(opacity) {
      for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
        this._resizeMarkers[i].setOpacity(opacity);
      }
    },
    _repositionCornerMarkers: function _repositionCornerMarkers() {
      var corners = this._getCorners();

      for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
        this._resizeMarkers[i].setLatLng(corners[i]);
      }
    }
  });
  L.Rectangle.addInitHook(function () {
    if (L.Edit.Rectangle) {
      this.editing = new L.Edit.Rectangle(this);

      if (this.options.editable) {
        this.editing.enable();
      }
    }
  });
  L.Edit = L.Edit || {};
  /**
   * @class L.Edit.CircleMarker
   * @aka Edit.Circle
   * @inherits L.Edit.SimpleShape
   */

  L.Edit.CircleMarker = L.Edit.SimpleShape.extend({
    _createMoveMarker: function _createMoveMarker() {
      var center = this._shape.getLatLng();

      this._moveMarker = this._createMarker(center, this.options.moveIcon);
    },
    _createResizeMarker: function _createResizeMarker() {
      // To avoid an undefined check in L.Edit.SimpleShape.removeHooks
      this._resizeMarkers = [];
    },
    _move: function _move(latlng) {
      if (this._resizeMarkers.length) {
        var resizemarkerPoint = this._getResizeMarkerPoint(latlng); // Move the resize marker


        this._resizeMarkers[0].setLatLng(resizemarkerPoint);
      } // Move the circle


      this._shape.setLatLng(latlng);

      this._map.fire(L.Draw.Event.EDITMOVE, {
        layer: this._shape
      });
    }
  });
  L.CircleMarker.addInitHook(function () {
    if (L.Edit.CircleMarker) {
      this.editing = new L.Edit.CircleMarker(this);

      if (this.options.editable) {
        this.editing.enable();
      }
    }

    this.on('add', function () {
      if (this.editing && this.editing.enabled()) {
        this.editing.addHooks();
      }
    });
    this.on('remove', function () {
      if (this.editing && this.editing.enabled()) {
        this.editing.removeHooks();
      }
    });
  });
  L.Edit = L.Edit || {};
  /**
   * @class L.Edit.Circle
   * @aka Edit.Circle
   * @inherits L.Edit.CircleMarker
   */

  L.Edit.Circle = L.Edit.CircleMarker.extend({
    _createResizeMarker: function _createResizeMarker() {
      var center = this._shape.getLatLng(),
          resizemarkerPoint = this._getResizeMarkerPoint(center);

      this._resizeMarkers = [];

      this._resizeMarkers.push(this._createMarker(resizemarkerPoint, this.options.resizeIcon));
    },
    _getResizeMarkerPoint: function _getResizeMarkerPoint(latlng) {
      // From L.shape.getBounds()
      var delta = this._shape._radius * Math.cos(Math.PI / 4),
          point = this._map.project(latlng);

      return this._map.unproject([point.x + delta, point.y - delta]);
    },
    _resize: function _resize(latlng) {
      var moveLatLng = this._moveMarker.getLatLng(),
          radius = this._map.distance(moveLatLng, latlng);

      this._shape.setRadius(radius);

      this._map.fire(L.Draw.Event.EDITRESIZE, {
        layer: this._shape
      });
    }
  });
  L.Circle.addInitHook(function () {
    if (L.Edit.Circle) {
      this.editing = new L.Edit.Circle(this);

      if (this.options.editable) {
        this.editing.enable();
      }
    }

    this.on('add', function () {
      if (this.editing && this.editing.enabled()) {
        this.editing.addHooks();
      }
    });
    this.on('remove', function () {
      if (this.editing && this.editing.enabled()) {
        this.editing.removeHooks();
      }
    });
  });
  L.Map.mergeOptions({
    touchExtend: true
  });
  /**
   * @class L.Map.TouchExtend
   * @aka TouchExtend
   */

  L.Map.TouchExtend = L.Handler.extend({
    // @method initialize(): void
    // Sets TouchExtend private accessor variables
    initialize: function initialize(map) {
      this._map = map;
      this._container = map._container;
      this._pane = map._panes.overlayPane;
    },
    // @method addHooks(): void
    // Adds dom listener events to the map container
    addHooks: function addHooks() {
      L.DomEvent.on(this._container, 'touchstart', this._onTouchStart, this);
      L.DomEvent.on(this._container, 'touchend', this._onTouchEnd, this);
      L.DomEvent.on(this._container, 'touchmove', this._onTouchMove, this);

      if (this._detectIE()) {
        L.DomEvent.on(this._container, 'MSPointerDown', this._onTouchStart, this);
        L.DomEvent.on(this._container, 'MSPointerUp', this._onTouchEnd, this);
        L.DomEvent.on(this._container, 'MSPointerMove', this._onTouchMove, this);
        L.DomEvent.on(this._container, 'MSPointerCancel', this._onTouchCancel, this);
      } else {
        L.DomEvent.on(this._container, 'touchcancel', this._onTouchCancel, this);
        L.DomEvent.on(this._container, 'touchleave', this._onTouchLeave, this);
      }
    },
    // @method removeHooks(): void
    // Removes dom listener events from the map container
    removeHooks: function removeHooks() {
      L.DomEvent.off(this._container, 'touchstart', this._onTouchStart);
      L.DomEvent.off(this._container, 'touchend', this._onTouchEnd);
      L.DomEvent.off(this._container, 'touchmove', this._onTouchMove);

      if (this._detectIE()) {
        L.DomEvent.off(this._container, 'MSPointerDowm', this._onTouchStart);
        L.DomEvent.off(this._container, 'MSPointerUp', this._onTouchEnd);
        L.DomEvent.off(this._container, 'MSPointerMove', this._onTouchMove);
        L.DomEvent.off(this._container, 'MSPointerCancel', this._onTouchCancel);
      } else {
        L.DomEvent.off(this._container, 'touchcancel', this._onTouchCancel);
        L.DomEvent.off(this._container, 'touchleave', this._onTouchLeave);
      }
    },
    _touchEvent: function _touchEvent(e, type) {
      // #TODO: fix the pageX error that is do a bug in Android where a single touch triggers two click events
      // _filterClick is what leaflet uses as a workaround.
      // This is a problem with more things than just android. Another problem is touchEnd has no touches in
      // its touch list.
      var touchEvent = {};

      if (typeof e.touches !== 'undefined') {
        if (!e.touches.length) {
          return;
        }

        touchEvent = e.touches[0];
      } else if (e.pointerType === 'touch') {
        touchEvent = e;

        if (!this._filterClick(e)) {
          return;
        }
      } else {
        return;
      }

      var containerPoint = this._map.mouseEventToContainerPoint(touchEvent),
          layerPoint = this._map.mouseEventToLayerPoint(touchEvent),
          latlng = this._map.layerPointToLatLng(layerPoint);

      this._map.fire(type, {
        latlng: latlng,
        layerPoint: layerPoint,
        containerPoint: containerPoint,
        pageX: touchEvent.pageX,
        pageY: touchEvent.pageY,
        originalEvent: e
      });
    },

    /** Borrowed from Leaflet and modified for bool ops **/
    _filterClick: function _filterClick(e) {
      var timeStamp = e.timeStamp || e.originalEvent.timeStamp,
          elapsed = L.DomEvent._lastClick && timeStamp - L.DomEvent._lastClick; // are they closer together than 500ms yet more than 100ms?
      // Android typically triggers them ~300ms apart while multiple listeners
      // on the same event should be triggered far faster;
      // or check if click is simulated on the element, and if it is, reject any non-simulated events

      if (elapsed && elapsed > 100 && elapsed < 500 || e.target._simulatedClick && !e._simulated) {
        L.DomEvent.stop(e);
        return false;
      }

      L.DomEvent._lastClick = timeStamp;
      return true;
    },
    _onTouchStart: function _onTouchStart(e) {
      if (!this._map._loaded) {
        return;
      }

      var type = 'touchstart';

      this._touchEvent(e, type);
    },
    _onTouchEnd: function _onTouchEnd(e) {
      if (!this._map._loaded) {
        return;
      }

      var type = 'touchend';

      this._touchEvent(e, type);
    },
    _onTouchCancel: function _onTouchCancel(e) {
      if (!this._map._loaded) {
        return;
      }

      var type = 'touchcancel';

      if (this._detectIE()) {
        type = 'pointercancel';
      }

      this._touchEvent(e, type);
    },
    _onTouchLeave: function _onTouchLeave(e) {
      if (!this._map._loaded) {
        return;
      }

      var type = 'touchleave';

      this._touchEvent(e, type);
    },
    _onTouchMove: function _onTouchMove(e) {
      if (!this._map._loaded) {
        return;
      }

      var type = 'touchmove';

      this._touchEvent(e, type);
    },
    _detectIE: function _detectIE() {
      var ua = window.navigator.userAgent;
      var msie = ua.indexOf('MSIE ');

      if (msie > 0) {
        // IE 10 or older => return version number
        return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
      }

      var trident = ua.indexOf('Trident/');

      if (trident > 0) {
        // IE 11 => return version number
        var rv = ua.indexOf('rv:');
        return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
      }

      var edge = ua.indexOf('Edge/');

      if (edge > 0) {
        // IE 12 => return version number
        return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
      } // other browser


      return false;
    }
  });
  L.Map.addInitHook('addHandler', 'touchExtend', L.Map.TouchExtend);
  /**
   * @class L.Marker.Touch
   * @aka Marker.Touch
   *
   * This isn't full Touch support. This is just to get markers to also support dom touch events after creation
   * #TODO: find a better way of getting markers to support touch.
   */

  L.Marker.Touch = L.Marker.extend({
    _initInteraction: function _initInteraction() {
      if (!this.addInteractiveTarget) {
        // 0.7.x support
        return this._initInteractionLegacy();
      } // TODO this may need be updated to re-add touch events for 1.0+


      return L.Marker.prototype._initInteraction.apply(this);
    },
    // This is an exact copy of https://github.com/Leaflet/Leaflet/blob/v0.7/src/layer/marker/Marker.js
    // with the addition of the touch events
    _initInteractionLegacy: function _initInteractionLegacy() {
      if (!this.options.clickable) {
        return;
      } // TODO refactor into something shared with Map/Path/etc. to DRY it up


      var icon = this._icon,
          events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu', 'touchstart', 'touchend', 'touchmove'];

      if (this._detectIE) {
        events.concat(['MSPointerDown', 'MSPointerUp', 'MSPointerMove', 'MSPointerCancel']);
      } else {
        events.concat(['touchcancel']);
      }

      L.DomUtil.addClass(icon, 'leaflet-clickable');
      L.DomEvent.on(icon, 'click', this._onMouseClick, this);
      L.DomEvent.on(icon, 'keypress', this._onKeyPress, this);

      for (var i = 0; i < events.length; i++) {
        L.DomEvent.on(icon, events[i], this._fireMouseEvent, this);
      }

      if (L.Handler.MarkerDrag) {
        this.dragging = new L.Handler.MarkerDrag(this);

        if (this.options.draggable) {
          this.dragging.enable();
        }
      }
    },
    _detectIE: function _detectIE() {
      var ua = window.navigator.userAgent;
      var msie = ua.indexOf('MSIE ');

      if (msie > 0) {
        // IE 10 or older => return version number
        return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
      }

      var trident = ua.indexOf('Trident/');

      if (trident > 0) {
        // IE 11 => return version number
        var rv = ua.indexOf('rv:');
        return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
      }

      var edge = ua.indexOf('Edge/');

      if (edge > 0) {
        // IE 12 => return version number
        return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
      } // other browser


      return false;
    }
  });
  /**
   * @class L.LatLngUtil
   * @aka LatLngUtil
   */

  L.LatLngUtil = {
    // Clones a LatLngs[], returns [][]
    // @method cloneLatLngs(LatLngs[]): L.LatLngs[]
    // Clone the latLng point or points or nested points and return an array with those points
    cloneLatLngs: function cloneLatLngs(latlngs) {
      var clone = [];

      for (var i = 0, l = latlngs.length; i < l; i++) {
        // Check for nested array (Polyline/Polygon)
        if (Array.isArray(latlngs[i])) {
          clone.push(L.LatLngUtil.cloneLatLngs(latlngs[i]));
        } else {
          clone.push(this.cloneLatLng(latlngs[i]));
        }
      }

      return clone;
    },
    // @method cloneLatLng(LatLng): L.LatLng
    // Clone the latLng and return a new LatLng object.
    cloneLatLng: function cloneLatLng(latlng) {
      return L.latLng(latlng.lat, latlng.lng);
    }
  };

  (function () {
    var defaultPrecision = {
      km: 2,
      ha: 2,
      m: 0,
      mi: 2,
      ac: 2,
      yd: 0,
      ft: 0,
      nm: 2
    };
    /**
     * @class L.GeometryUtil
     * @aka GeometryUtil
     */

    L.GeometryUtil = L.extend(L.GeometryUtil || {}, {
      // Ported from the OpenLayers implementation. See https://github.com/openlayers/openlayers/blob/master/lib/OpenLayers/Geometry/LinearRing.js#L270
      // @method geodesicArea(): number
      geodesicArea: function geodesicArea(latLngs) {
        var pointsCount = latLngs.length,
            area = 0.0,
            d2r = Math.PI / 180,
            p1,
            p2;

        if (pointsCount > 2) {
          for (var i = 0; i < pointsCount; i++) {
            p1 = latLngs[i];
            p2 = latLngs[(i + 1) % pointsCount];
            area += (p2.lng - p1.lng) * d2r * (2 + Math.sin(p1.lat * d2r) + Math.sin(p2.lat * d2r));
          }

          area = area * 6378137.0 * 6378137.0 / 2.0;
        }

        return Math.abs(area);
      },
      // @method formattedNumber(n, precision): string
      // Returns n in specified number format (if defined) and precision
      formattedNumber: function formattedNumber(n, precision) {
        var formatted = parseFloat(n).toFixed(precision),
            format = L.drawLocal.format && L.drawLocal.format.numeric,
            delimiters = format && format.delimiters,
            thousands = delimiters && delimiters.thousands,
            decimal = delimiters && delimiters.decimal;

        if (thousands || decimal) {
          var splitValue = formatted.split('.');
          formatted = thousands ? splitValue[0].replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '\$1' + thousands) : splitValue[0];
          decimal = decimal || '.';

          if (splitValue.length > 1) {
            formatted = formatted + decimal + splitValue[1];
          }
        }

        return formatted;
      },
      // @method readableArea(area, isMetric, precision): string
      // Returns a readable area string in yards or metric.
      // The value will be rounded as defined by the precision option object.
      readableArea: function readableArea(area, isMetric, precision) {
        var areaStr,
            units,
            precision = L.Util.extend({}, defaultPrecision, precision);

        if (isMetric) {
          units = ['ha', 'm'];
          type = _typeof(isMetric);

          if (type === 'string') {
            units = [isMetric];
          } else if (type !== 'boolean') {
            units = isMetric;
          }

          if (area >= 1000000 && units.indexOf('km') !== -1) {
            areaStr = L.GeometryUtil.formattedNumber(area * 0.000001, precision['km']) + ' km²';
          } else if (area >= 10000 && units.indexOf('ha') !== -1) {
            areaStr = L.GeometryUtil.formattedNumber(area * 0.0001, precision['ha']) + ' ha';
          } else {
            areaStr = L.GeometryUtil.formattedNumber(area, precision['m']) + ' m²';
          }
        } else {
          area /= 0.836127; // Square yards in 1 meter

          if (area >= 3097600) {
            //3097600 square yards in 1 square mile
            areaStr = L.GeometryUtil.formattedNumber(area / 3097600, precision['mi']) + ' mi²';
          } else if (area >= 4840) {
            //4840 square yards in 1 acre
            areaStr = L.GeometryUtil.formattedNumber(area / 4840, precision['ac']) + ' acres';
          } else {
            areaStr = L.GeometryUtil.formattedNumber(area, precision['yd']) + ' yd²';
          }
        }

        return areaStr;
      },
      // @method readableDistance(distance, units): string
      // Converts a metric distance to one of [ feet, nauticalMile, metric or yards ] string
      //
      // @alternative
      // @method readableDistance(distance, isMetric, useFeet, isNauticalMile, precision): string
      // Converts metric distance to distance string.
      // The value will be rounded as defined by the precision option object.
      readableDistance: function readableDistance(distance, isMetric, isFeet, isNauticalMile, precision) {
        var distanceStr,
            units,
            precision = L.Util.extend({}, defaultPrecision, precision);

        if (isMetric) {
          units = typeof isMetric == 'string' ? isMetric : 'metric';
        } else if (isFeet) {
          units = 'feet';
        } else if (isNauticalMile) {
          units = 'nauticalMile';
        } else {
          units = 'yards';
        }

        switch (units) {
          case 'metric':
            // show metres when distance is < 1km, then show km
            if (distance > 1000) {
              distanceStr = L.GeometryUtil.formattedNumber(distance / 1000, precision['km']) + ' km';
            } else {
              distanceStr = L.GeometryUtil.formattedNumber(distance, precision['m']) + ' m';
            }

            break;

          case 'feet':
            distance *= 1.09361 * 3;
            distanceStr = L.GeometryUtil.formattedNumber(distance, precision['ft']) + ' ft';
            break;

          case 'nauticalMile':
            distance *= 0.53996;
            distanceStr = L.GeometryUtil.formattedNumber(distance / 1000, precision['nm']) + ' nm';
            break;

          case 'yards':
          default:
            distance *= 1.09361;

            if (distance > 1760) {
              distanceStr = L.GeometryUtil.formattedNumber(distance / 1760, precision['mi']) + ' miles';
            } else {
              distanceStr = L.GeometryUtil.formattedNumber(distance, precision['yd']) + ' yd';
            }

            break;
        }

        return distanceStr;
      }
    });
  })();
  /**
   * @class L.LineUtil
   * @aka Util
   * @aka L.Utils
   */


  L.Util.extend(L.LineUtil, {
    // @method segmentsIntersect(): boolean
    // Checks to see if two line segments intersect. Does not handle degenerate cases.
    // http://compgeom.cs.uiuc.edu/~jeffe/teaching/373/notes/x06-sweepline.pdf
    segmentsIntersect: function segmentsIntersect(
    /*Point*/
    p,
    /*Point*/
    p1,
    /*Point*/
    p2,
    /*Point*/
    p3) {
      return this._checkCounterclockwise(p, p2, p3) !== this._checkCounterclockwise(p1, p2, p3) && this._checkCounterclockwise(p, p1, p2) !== this._checkCounterclockwise(p, p1, p3);
    },
    // check to see if points are in counterclockwise order
    _checkCounterclockwise: function _checkCounterclockwise(
    /*Point*/
    p,
    /*Point*/
    p1,
    /*Point*/
    p2) {
      return (p2.y - p.y) * (p1.x - p.x) > (p1.y - p.y) * (p2.x - p.x);
    }
  });
  /**
   * @class L.Polyline
   * @aka Polyline
   */

  L.Polyline.include({
    // @method intersects(): boolean
    // Check to see if this polyline has any linesegments that intersect.
    // NOTE: does not support detecting intersection for degenerate cases.
    intersects: function intersects() {
      var points = this._getProjectedPoints(),
          len = points ? points.length : 0,
          i,
          p,
          p1;

      if (this._tooFewPointsForIntersection()) {
        return false;
      }

      for (i = len - 1; i >= 3; i--) {
        p = points[i - 1];
        p1 = points[i];

        if (this._lineSegmentsIntersectsRange(p, p1, i - 2)) {
          return true;
        }
      }

      return false;
    },
    // @method newLatLngIntersects(): boolean
    // Check for intersection if new latlng was added to this polyline.
    // NOTE: does not support detecting intersection for degenerate cases.
    newLatLngIntersects: function newLatLngIntersects(latlng, skipFirst) {
      // Cannot check a polyline for intersecting lats/lngs when not added to the map
      if (!this._map) {
        return false;
      }

      return this.newPointIntersects(this._map.latLngToLayerPoint(latlng), skipFirst);
    },
    // @method newPointIntersects(): boolean
    // Check for intersection if new point was added to this polyline.
    // newPoint must be a layer point.
    // NOTE: does not support detecting intersection for degenerate cases.
    newPointIntersects: function newPointIntersects(newPoint, skipFirst) {
      var points = this._getProjectedPoints(),
          len = points ? points.length : 0,
          lastPoint = points ? points[len - 1] : null,
          // The previous previous line segment. Previous line segment doesn't need testing.
      maxIndex = len - 2;

      if (this._tooFewPointsForIntersection(1)) {
        return false;
      }

      return this._lineSegmentsIntersectsRange(lastPoint, newPoint, maxIndex, skipFirst ? 1 : 0);
    },
    // Polylines with 2 sides can only intersect in cases where points are collinear (we don't support detecting these).
    // Cannot have intersection when < 3 line segments (< 4 points)
    _tooFewPointsForIntersection: function _tooFewPointsForIntersection(extraPoints) {
      var points = this._getProjectedPoints(),
          len = points ? points.length : 0; // Increment length by extraPoints if present


      len += extraPoints || 0;
      return !points || len <= 3;
    },
    // Checks a line segment intersections with any line segments before its predecessor.
    // Don't need to check the predecessor as will never intersect.
    _lineSegmentsIntersectsRange: function _lineSegmentsIntersectsRange(p, p1, maxIndex, minIndex) {
      var points = this._getProjectedPoints(),
          p2,
          p3;

      minIndex = minIndex || 0; // Check all previous line segments (beside the immediately previous) for intersections

      for (var j = maxIndex; j > minIndex; j--) {
        p2 = points[j - 1];
        p3 = points[j];

        if (L.LineUtil.segmentsIntersect(p, p1, p2, p3)) {
          return true;
        }
      }

      return false;
    },
    _getProjectedPoints: function _getProjectedPoints() {
      if (!this._defaultShape) {
        return this._originalPoints;
      }

      var points = [],
          _shape = this._defaultShape();

      for (var i = 0; i < _shape.length; i++) {
        points.push(this._map.latLngToLayerPoint(_shape[i]));
      }

      return points;
    }
  });
  /**
   * @class L.Polygon
   * @aka Polygon
   */

  L.Polygon.include({
    // @method intersects(): boolean
    // Checks a polygon for any intersecting line segments. Ignores holes.
    intersects: function intersects() {
      var polylineIntersects,
          points = this._getProjectedPoints(),
          len,
          firstPoint,
          lastPoint,
          maxIndex;

      if (this._tooFewPointsForIntersection()) {
        return false;
      }

      polylineIntersects = L.Polyline.prototype.intersects.call(this); // If already found an intersection don't need to check for any more.

      if (polylineIntersects) {
        return true;
      }

      len = points.length;
      firstPoint = points[0];
      lastPoint = points[len - 1];
      maxIndex = len - 2; // Check the line segment between last and first point. Don't need to check the first line segment (minIndex = 1)

      return this._lineSegmentsIntersectsRange(lastPoint, firstPoint, maxIndex, 1);
    }
  });
  /**
   * @class L.Control.Draw
   * @aka L.Draw
   */

  L.Control.Draw = L.Control.extend({
    // Options
    options: {
      position: 'topleft',
      draw: {},
      edit: false
    },
    // @method initialize(): void
    // Initializes draw control, toolbars from the options
    initialize: function initialize(options) {
      if (L.version < '0.7') {
        throw new Error('Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/');
      }

      L.Control.prototype.initialize.call(this, options);
      var toolbar;
      this._toolbars = {}; // Initialize toolbars

      if (L.DrawToolbar && this.options.draw) {
        toolbar = new L.DrawToolbar(this.options.draw);
        this._toolbars[L.DrawToolbar.TYPE] = toolbar; // Listen for when toolbar is enabled

        this._toolbars[L.DrawToolbar.TYPE].on('enable', this._toolbarEnabled, this);
      }

      if (L.EditToolbar && this.options.edit) {
        toolbar = new L.EditToolbar(this.options.edit);
        this._toolbars[L.EditToolbar.TYPE] = toolbar; // Listen for when toolbar is enabled

        this._toolbars[L.EditToolbar.TYPE].on('enable', this._toolbarEnabled, this);
      }

      L.toolbar = this; //set global var for editing the toolbar
    },
    // @method onAdd(): container
    // Adds the toolbar container to the map
    onAdd: function onAdd(map) {
      var container = L.DomUtil.create('div', 'leaflet-draw'),
          addedTopClass = false,
          topClassName = 'leaflet-draw-toolbar-top',
          toolbarContainer;

      for (var toolbarId in this._toolbars) {
        if (this._toolbars.hasOwnProperty(toolbarId)) {
          toolbarContainer = this._toolbars[toolbarId].addToolbar(map);

          if (toolbarContainer) {
            // Add class to the first toolbar to remove the margin
            if (!addedTopClass) {
              if (!L.DomUtil.hasClass(toolbarContainer, topClassName)) {
                L.DomUtil.addClass(toolbarContainer.childNodes[0], topClassName);
              }

              addedTopClass = true;
            }

            container.appendChild(toolbarContainer);
          }
        }
      }

      return container;
    },
    // @method onRemove(): void
    // Removes the toolbars from the map toolbar container
    onRemove: function onRemove() {
      for (var toolbarId in this._toolbars) {
        if (this._toolbars.hasOwnProperty(toolbarId)) {
          this._toolbars[toolbarId].removeToolbar();
        }
      }
    },
    // @method setDrawingOptions(options): void
    // Sets options to all toolbar instances
    setDrawingOptions: function setDrawingOptions(options) {
      for (var toolbarId in this._toolbars) {
        if (this._toolbars[toolbarId] instanceof L.DrawToolbar) {
          this._toolbars[toolbarId].setOptions(options);
        }
      }
    },
    _toolbarEnabled: function _toolbarEnabled(e) {
      var enabledToolbar = e.target;

      for (var toolbarId in this._toolbars) {
        if (this._toolbars[toolbarId] !== enabledToolbar) {
          this._toolbars[toolbarId].disable();
        }
      }
    }
  });
  L.Map.mergeOptions({
    drawControlTooltips: true,
    drawControl: false
  });
  L.Map.addInitHook(function () {
    if (this.options.drawControl) {
      this.drawControl = new L.Control.Draw();
      this.addControl(this.drawControl);
    }
  });
  /**
   * @class L.Draw.Toolbar
   * @aka Toolbar
   *
   * The toolbar class of the API — it is used to create the ui
   * This will be depreciated
   *
   * @example
   *
   * ```js
   *    var toolbar = L.Toolbar();
   *    toolbar.addToolbar(map);
   * ```
   *
   * ### Disabling a toolbar
   *
   * If you do not want a particular toolbar in your app you can turn it off by setting the toolbar to false.
   *
   * ```js
   *      var drawControl = new L.Control.Draw({
  *          draw: false,
  *          edit: {
  *              featureGroup: editableLayers
  *          }
  *      });
   * ```
   *
   * ### Disabling a toolbar item
   *
   * If you want to turn off a particular toolbar item, set it to false. The following disables drawing polygons and
   * markers. It also turns off the ability to edit layers.
   *
   * ```js
   *      var drawControl = new L.Control.Draw({
  *          draw: {
  *              polygon: false,
  *              marker: false
  *          },
  *          edit: {
  *              featureGroup: editableLayers,
  *              edit: false
  *          }
  *      });
   * ```
   */

  L.Toolbar = L.Class.extend({
    includes: [L.Mixin.Events],
    // @section Methods for modifying the toolbar
    // @method initialize(options): void
    // Toolbar constructor
    initialize: function initialize(options) {
      L.setOptions(this, options);
      this._modes = {};
      this._actionButtons = [];
      this._activeMode = null;
    },
    // @method enabled(): boolean
    // Gets a true/false of whether the toolbar is enabled
    enabled: function enabled() {
      return this._activeMode !== null;
    },
    // @method disable(): void
    // Disables the toolbar
    disable: function disable() {
      if (!this.enabled()) {
        return;
      }

      this._activeMode.handler.disable();
    },
    // @method addToolbar(map): L.DomUtil
    // Adds the toolbar to the map and returns the toolbar dom element
    addToolbar: function addToolbar(map) {
      var container = L.DomUtil.create('div', 'leaflet-draw-section'),
          buttonIndex = 0,
          buttonClassPrefix = this._toolbarClass || '',
          modeHandlers = this.getModeHandlers(map),
          i;
      this._toolbarContainer = L.DomUtil.create('div', 'leaflet-draw-toolbar leaflet-bar');
      this._map = map;

      for (i = 0; i < modeHandlers.length; i++) {
        if (modeHandlers[i].enabled) {
          this._initModeHandler(modeHandlers[i].handler, this._toolbarContainer, buttonIndex++, buttonClassPrefix, modeHandlers[i].title);
        }
      } // if no buttons were added, do not add the toolbar


      if (!buttonIndex) {
        return;
      } // Save button index of the last button, -1 as we would have ++ after the last button


      this._lastButtonIndex = --buttonIndex; // Create empty actions part of the toolbar

      this._actionsContainer = L.DomUtil.create('ul', 'leaflet-draw-actions'); // Add draw and cancel containers to the control container

      container.appendChild(this._toolbarContainer);
      container.appendChild(this._actionsContainer);
      return container;
    },
    // @method removeToolbar(): void
    // Removes the toolbar and drops the handler event listeners
    removeToolbar: function removeToolbar() {
      // Dispose each handler
      for (var handlerId in this._modes) {
        if (this._modes.hasOwnProperty(handlerId)) {
          // Unbind handler button
          this._disposeButton(this._modes[handlerId].button, this._modes[handlerId].handler.enable, this._modes[handlerId].handler); // Make sure is disabled


          this._modes[handlerId].handler.disable(); // Unbind handler


          this._modes[handlerId].handler.off('enabled', this._handlerActivated, this).off('disabled', this._handlerDeactivated, this);
        }
      }

      this._modes = {}; // Dispose the actions toolbar

      for (var i = 0, l = this._actionButtons.length; i < l; i++) {
        this._disposeButton(this._actionButtons[i].button, this._actionButtons[i].callback, this);
      }

      this._actionButtons = [];
      this._actionsContainer = null;
    },
    _initModeHandler: function _initModeHandler(handler, container, buttonIndex, classNamePredix, buttonTitle) {
      var type = handler.type;
      this._modes[type] = {};
      this._modes[type].handler = handler;
      this._modes[type].button = this._createButton({
        type: type,
        title: buttonTitle,
        className: classNamePredix + '-' + type,
        container: container,
        callback: this._modes[type].handler.enable,
        context: this._modes[type].handler
      });
      this._modes[type].buttonIndex = buttonIndex;

      this._modes[type].handler.on('enabled', this._handlerActivated, this).on('disabled', this._handlerDeactivated, this);
    },

    /* Detect iOS based on browser User Agent, based on:
    * http://stackoverflow.com/a/9039885 */
    _detectIOS: function _detectIOS() {
      var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
      return iOS;
    },
    _createButton: function _createButton(options) {
      var link = L.DomUtil.create('a', options.className || '', options.container); // Screen reader tag

      var sr = L.DomUtil.create('span', 'sr-only', options.container);
      link.href = '#';
      link.appendChild(sr);

      if (options.title) {
        link.title = options.title;
        sr.innerHTML = options.title;
      }

      if (options.text) {
        link.innerHTML = options.text;
        sr.innerHTML = options.text;
      }
      /* iOS does not use click events */


      var buttonEvent = this._detectIOS() ? 'touchstart' : 'click';
      L.DomEvent.on(link, 'click', L.DomEvent.stopPropagation).on(link, 'mousedown', L.DomEvent.stopPropagation).on(link, 'dblclick', L.DomEvent.stopPropagation).on(link, 'touchstart', L.DomEvent.stopPropagation).on(link, 'click', L.DomEvent.preventDefault).on(link, buttonEvent, options.callback, options.context);
      return link;
    },
    _disposeButton: function _disposeButton(button, callback) {
      /* iOS does not use click events */
      var buttonEvent = this._detectIOS() ? 'touchstart' : 'click';
      L.DomEvent.off(button, 'click', L.DomEvent.stopPropagation).off(button, 'mousedown', L.DomEvent.stopPropagation).off(button, 'dblclick', L.DomEvent.stopPropagation).off(button, 'touchstart', L.DomEvent.stopPropagation).off(button, 'click', L.DomEvent.preventDefault).off(button, buttonEvent, callback);
    },
    _handlerActivated: function _handlerActivated(e) {
      // Disable active mode (if present)
      this.disable(); // Cache new active feature

      this._activeMode = this._modes[e.handler];
      L.DomUtil.addClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled');

      this._showActionsToolbar();

      this.fire('enable');
    },
    _handlerDeactivated: function _handlerDeactivated() {
      this._hideActionsToolbar();

      L.DomUtil.removeClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled');
      this._activeMode = null;
      this.fire('disable');
    },
    _createActions: function _createActions(handler) {
      var container = this._actionsContainer,
          buttons = this.getActions(handler),
          l = buttons.length,
          li,
          di,
          dl,
          button; // Dispose the actions toolbar (todo: dispose only not used buttons)

      for (di = 0, dl = this._actionButtons.length; di < dl; di++) {
        this._disposeButton(this._actionButtons[di].button, this._actionButtons[di].callback);
      }

      this._actionButtons = []; // Remove all old buttons

      while (container.firstChild) {
        container.removeChild(container.firstChild);
      }

      for (var i = 0; i < l; i++) {
        if ('enabled' in buttons[i] && !buttons[i].enabled) {
          continue;
        }

        li = L.DomUtil.create('li', '', container);
        button = this._createButton({
          title: buttons[i].title,
          text: buttons[i].text,
          container: li,
          callback: buttons[i].callback,
          context: buttons[i].context
        });

        this._actionButtons.push({
          button: button,
          callback: buttons[i].callback
        });
      }
    },
    _showActionsToolbar: function _showActionsToolbar() {
      var buttonIndex = this._activeMode.buttonIndex,
          lastButtonIndex = this._lastButtonIndex,
          toolbarPosition = this._activeMode.button.offsetTop - 1; // Recreate action buttons on every click

      this._createActions(this._activeMode.handler); // Correctly position the cancel button


      this._actionsContainer.style.top = toolbarPosition + 'px';

      if (buttonIndex === 0) {
        L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop');
        L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-top');
      }

      if (buttonIndex === lastButtonIndex) {
        L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom');
        L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-bottom');
      }

      this._actionsContainer.style.display = 'block';
    },
    _hideActionsToolbar: function _hideActionsToolbar() {
      this._actionsContainer.style.display = 'none';
      L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop');
      L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom');
      L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-top');
      L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-bottom');
    }
  });
  L.Draw = L.Draw || {};
  /**
   * @class L.Draw.Tooltip
   * @aka Tooltip
   *
   * The tooltip class — it is used to display the tooltip while drawing
   * This will be depreciated
   *
   * @example
   *
   * ```js
   *    var tooltip = L.Draw.Tooltip();
   * ```
   *
   */

  L.Draw.Tooltip = L.Class.extend({
    // @section Methods for modifying draw state
    // @method initialize(map): void
    // Tooltip constructor
    initialize: function initialize(map) {
      this._map = map;
      this._popupPane = map._panes.popupPane;
      this._visible = false;
      this._container = map.options.drawControlTooltips ? L.DomUtil.create('div', 'leaflet-draw-tooltip', this._popupPane) : null;
      this._singleLineLabel = false;

      this._map.on('mouseout', this._onMouseOut, this);
    },
    // @method dispose(): void
    // Remove Tooltip DOM and unbind events
    dispose: function dispose() {
      this._map.off('mouseout', this._onMouseOut, this);

      if (this._container) {
        this._popupPane.removeChild(this._container);

        this._container = null;
      }
    },
    // @method updateContent(labelText): this
    // Changes the tooltip text to string in function call
    updateContent: function updateContent(labelText) {
      if (!this._container) {
        return this;
      }

      labelText.subtext = labelText.subtext || ''; // update the vertical position (only if changed)

      if (labelText.subtext.length === 0 && !this._singleLineLabel) {
        L.DomUtil.addClass(this._container, 'leaflet-draw-tooltip-single');
        this._singleLineLabel = true;
      } else if (labelText.subtext.length > 0 && this._singleLineLabel) {
        L.DomUtil.removeClass(this._container, 'leaflet-draw-tooltip-single');
        this._singleLineLabel = false;
      }

      this._container.innerHTML = (labelText.subtext.length > 0 ? '<span class=\"leaflet-draw-tooltip-subtext\">' + labelText.subtext + '</span>' + '<br />' : '') + '<span>' + labelText.text + '</span>';

      if (!labelText.text && !labelText.subtext) {
        this._visible = false;
        this._container.style.visibility = 'hidden';
      } else {
        this._visible = true;
        this._container.style.visibility = 'inherit';
      }

      return this;
    },
    // @method updatePosition(latlng): this
    // Changes the location of the tooltip
    updatePosition: function updatePosition(latlng) {
      var pos = this._map.latLngToLayerPoint(latlng),
          tooltipContainer = this._container;

      if (this._container) {
        if (this._visible) {
          tooltipContainer.style.visibility = 'inherit';
        }

        L.DomUtil.setPosition(tooltipContainer, pos);
      }

      return this;
    },
    // @method showAsError(): this
    // Applies error class to tooltip
    showAsError: function showAsError() {
      if (this._container) {
        L.DomUtil.addClass(this._container, 'leaflet-error-draw-tooltip');
      }

      return this;
    },
    // @method removeError(): this
    // Removes the error class from the tooltip
    removeError: function removeError() {
      if (this._container) {
        L.DomUtil.removeClass(this._container, 'leaflet-error-draw-tooltip');
      }

      return this;
    },
    _onMouseOut: function _onMouseOut() {
      if (this._container) {
        this._container.style.visibility = 'hidden';
      }
    }
  });
  /**
   * @class L.DrawToolbar
   * @aka Toolbar
   */

  L.DrawToolbar = L.Toolbar.extend({
    statics: {
      TYPE: 'draw'
    },
    options: {
      polyline: {},
      polygon: {},
      rectangle: {},
      circle: {},
      marker: {},
      circlemarker: {}
    },
    // @method initialize(): void
    initialize: function initialize(options) {
      // Ensure that the options are merged correctly since L.extend is only shallow
      for (var type in this.options) {
        if (this.options.hasOwnProperty(type)) {
          if (options[type]) {
            options[type] = L.extend({}, this.options[type], options[type]);
          }
        }
      }

      this._toolbarClass = 'leaflet-draw-draw';
      L.Toolbar.prototype.initialize.call(this, options);
    },
    // @method getModeHandlers(): object
    // Get mode handlers information
    getModeHandlers: function getModeHandlers(map) {
      return [{
        enabled: this.options.polyline,
        handler: new L.Draw.Polyline(map, this.options.polyline),
        title: L.drawLocal.draw.toolbar.buttons.polyline
      }, {
        enabled: this.options.polygon,
        handler: new L.Draw.Polygon(map, this.options.polygon),
        title: L.drawLocal.draw.toolbar.buttons.polygon
      }, {
        enabled: this.options.rectangle,
        handler: new L.Draw.Rectangle(map, this.options.rectangle),
        title: L.drawLocal.draw.toolbar.buttons.rectangle
      }, {
        enabled: this.options.circle,
        handler: new L.Draw.Circle(map, this.options.circle),
        title: L.drawLocal.draw.toolbar.buttons.circle
      }, {
        enabled: this.options.marker,
        handler: new L.Draw.Marker(map, this.options.marker),
        title: L.drawLocal.draw.toolbar.buttons.marker
      }, {
        enabled: this.options.circlemarker,
        handler: new L.Draw.CircleMarker(map, this.options.circlemarker),
        title: L.drawLocal.draw.toolbar.buttons.circlemarker
      }];
    },
    // @method getActions(): object
    // Get action information
    getActions: function getActions(handler) {
      return [// {
      //     enabled: handler.completeShape,
      //     title: L.drawLocal.draw.toolbar.finish.title,
      //     text: L.drawLocal.draw.toolbar.finish.text,
      //     callback: handler.completeShape,
      //     context: handler
      // },
      {
        enabled: handler.deleteLastVertex,
        title: L.drawLocal.draw.toolbar.undo.title,
        text: L.drawLocal.draw.toolbar.undo.text,
        callback: handler.deleteLastVertex,
        context: handler
      }, {
        title: L.drawLocal.draw.toolbar.actions.title,
        text: L.drawLocal.draw.toolbar.actions.text,
        callback: this.disable,
        context: this
      }];
    },
    // @method setOptions(): void
    // Sets the options to the toolbar
    setOptions: function setOptions(options) {
      L.setOptions(this, options);

      for (var type in this._modes) {
        if (this._modes.hasOwnProperty(type) && options.hasOwnProperty(type)) {
          this._modes[type].handler.setOptions(options[type]);
        }
      }
    }
  });
  /*L.Map.mergeOptions({
  editControl: true
  });*/

  /**
   * @class L.EditToolbar
   * @aka EditToolbar
   */

  L.EditToolbar = L.Toolbar.extend({
    statics: {
      TYPE: 'edit'
    },
    options: {
      edit: {
        selectedPathOptions: {
          dashArray: '10, 10',
          fill: true,
          fillColor: '#fe57a1',
          fillOpacity: 0.1,
          // Whether to user the existing layers color
          maintainColor: false
        }
      },
      remove: {},
      poly: null,
      featureGroup: null
      /* REQUIRED! TODO: perhaps if not set then all layers on the map are selectable? */

    },
    // @method intialize(): void
    initialize: function initialize(options) {
      // Need to set this manually since null is an acceptable value here
      if (options.edit) {
        if (typeof options.edit.selectedPathOptions === 'undefined') {
          options.edit.selectedPathOptions = this.options.edit.selectedPathOptions;
        }

        options.edit.selectedPathOptions = L.extend({}, this.options.edit.selectedPathOptions, options.edit.selectedPathOptions);
      }

      if (options.remove) {
        options.remove = L.extend({}, this.options.remove, options.remove);
      }

      if (options.poly) {
        options.poly = L.extend({}, this.options.poly, options.poly);
      }

      this._toolbarClass = 'leaflet-draw-edit';
      L.Toolbar.prototype.initialize.call(this, options);
      this._selectedFeatureCount = 0;
    },
    // @method getModeHandlers(): object
    // Get mode handlers information
    getModeHandlers: function getModeHandlers(map) {
      var featureGroup = this.options.featureGroup;
      return [{
        enabled: this.options.edit,
        handler: new L.EditToolbar.Edit(map, {
          featureGroup: featureGroup,
          selectedPathOptions: this.options.edit.selectedPathOptions,
          poly: this.options.poly
        }),
        title: L.drawLocal.edit.toolbar.buttons.edit
      }, {
        enabled: this.options.remove,
        handler: new L.EditToolbar.Delete(map, {
          featureGroup: featureGroup
        }),
        title: L.drawLocal.edit.toolbar.buttons.remove
      }];
    },
    // @method getActions(): object
    // Get actions information
    getActions: function getActions(handler) {
      var actions = [{
        title: L.drawLocal.edit.toolbar.actions.save.title,
        text: L.drawLocal.edit.toolbar.actions.save.text,
        callback: this._save,
        context: this
      }, {
        title: L.drawLocal.edit.toolbar.actions.cancel.title,
        text: L.drawLocal.edit.toolbar.actions.cancel.text,
        callback: this.disable,
        context: this
      }];

      if (handler.removeAllLayers) {
        actions.push({
          title: L.drawLocal.edit.toolbar.actions.clearAll.title,
          text: L.drawLocal.edit.toolbar.actions.clearAll.text,
          callback: this._clearAllLayers,
          context: this
        });
      }

      return actions;
    },
    // @method addToolbar(map): L.DomUtil
    // Adds the toolbar to the map
    addToolbar: function addToolbar(map) {
      var container = L.Toolbar.prototype.addToolbar.call(this, map);

      this._checkDisabled();

      this.options.featureGroup.on('layeradd layerremove', this._checkDisabled, this);
      return container;
    },
    // @method removeToolbar(): void
    // Removes the toolbar from the map
    removeToolbar: function removeToolbar() {
      this.options.featureGroup.off('layeradd layerremove', this._checkDisabled, this);
      L.Toolbar.prototype.removeToolbar.call(this);
    },
    // @method disable(): void
    // Disables the toolbar
    disable: function disable() {
      if (!this.enabled()) {
        return;
      }

      this._activeMode.handler.revertLayers();

      L.Toolbar.prototype.disable.call(this);
    },
    _save: function _save() {
      this._activeMode.handler.save();

      if (this._activeMode) {
        this._activeMode.handler.disable();
      }
    },
    _clearAllLayers: function _clearAllLayers() {
      this._activeMode.handler.removeAllLayers();

      if (this._activeMode) {
        this._activeMode.handler.disable();
      }
    },
    _checkDisabled: function _checkDisabled() {
      var featureGroup = this.options.featureGroup,
          hasLayers = featureGroup.getLayers().length !== 0,
          button;

      if (this.options.edit) {
        button = this._modes[L.EditToolbar.Edit.TYPE].button;

        if (hasLayers) {
          L.DomUtil.removeClass(button, 'leaflet-disabled');
        } else {
          L.DomUtil.addClass(button, 'leaflet-disabled');
        }

        button.setAttribute('title', hasLayers ? L.drawLocal.edit.toolbar.buttons.edit : L.drawLocal.edit.toolbar.buttons.editDisabled);
      }

      if (this.options.remove) {
        button = this._modes[L.EditToolbar.Delete.TYPE].button;

        if (hasLayers) {
          L.DomUtil.removeClass(button, 'leaflet-disabled');
        } else {
          L.DomUtil.addClass(button, 'leaflet-disabled');
        }

        button.setAttribute('title', hasLayers ? L.drawLocal.edit.toolbar.buttons.remove : L.drawLocal.edit.toolbar.buttons.removeDisabled);
      }
    }
  });
  /**
   * @class L.EditToolbar.Edit
   * @aka EditToolbar.Edit
   */

  L.EditToolbar.Edit = L.Handler.extend({
    statics: {
      TYPE: 'edit'
    },
    includes: L.Mixin.Events,
    // @method intialize(): void
    initialize: function initialize(map, options) {
      L.Handler.prototype.initialize.call(this, map);
      L.setOptions(this, options); // Store the selectable layer group for ease of access

      this._featureGroup = options.featureGroup;

      if (!(this._featureGroup instanceof L.FeatureGroup)) {
        throw new Error('options.featureGroup must be a L.FeatureGroup');
      }

      this._uneditedLayerProps = {}; // Save the type so super can fire, need to do this as cannot do this.TYPE :(

      this.type = L.EditToolbar.Edit.TYPE;
    },
    // @method enable(): void
    // Enable the edit toolbar
    enable: function enable() {
      if (this._enabled || !this._hasAvailableLayers()) {
        return;
      }

      this.fire('enabled', {
        handler: this.type
      }); //this disable other handlers

      this._map.fire(L.Draw.Event.EDITSTART, {
        handler: this.type
      }); //allow drawLayer to be updated before beginning edition.


      L.Handler.prototype.enable.call(this);

      this._featureGroup.on('layeradd', this._enableLayerEdit, this).on('layerremove', this._disableLayerEdit, this);
    },
    // @method disable(): void
    // Disable the edit toolbar
    disable: function disable() {
      if (!this._enabled) {
        return;
      }

      this._featureGroup.off('layeradd', this._enableLayerEdit, this).off('layerremove', this._disableLayerEdit, this);

      L.Handler.prototype.disable.call(this);

      this._map.fire(L.Draw.Event.EDITSTOP, {
        handler: this.type
      });

      this.fire('disabled', {
        handler: this.type
      });
    },
    // @method addHooks(): void
    // Add listener hooks for this handler
    addHooks: function addHooks() {
      var map = this._map;

      if (map) {
        map.getContainer().focus();

        this._featureGroup.eachLayer(this._enableLayerEdit, this);

        this._tooltip = new L.Draw.Tooltip(this._map);

        this._tooltip.updateContent({
          text: L.drawLocal.edit.handlers.edit.tooltip.text,
          subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
        }); // Quickly access the tooltip to update for intersection checking


        map._editTooltip = this._tooltip;

        this._updateTooltip();

        this._map.on('mousemove', this._onMouseMove, this).on('touchmove', this._onMouseMove, this).on('MSPointerMove', this._onMouseMove, this).on(L.Draw.Event.EDITVERTEX, this._updateTooltip, this);
      }
    },
    // @method removeHooks(): void
    // Remove listener hooks for this handler
    removeHooks: function removeHooks() {
      if (this._map) {
        // Clean up selected layers.
        this._featureGroup.eachLayer(this._disableLayerEdit, this); // Clear the backups of the original layers


        this._uneditedLayerProps = {};

        this._tooltip.dispose();

        this._tooltip = null;

        this._map.off('mousemove', this._onMouseMove, this).off('touchmove', this._onMouseMove, this).off('MSPointerMove', this._onMouseMove, this).off(L.Draw.Event.EDITVERTEX, this._updateTooltip, this);
      }
    },
    // @method revertLayers(): void
    // Revert each layer's geometry changes
    revertLayers: function revertLayers() {
      this._featureGroup.eachLayer(function (layer) {
        this._revertLayer(layer);
      }, this);
    },
    // @method save(): void
    // Save the layer geometries
    save: function save() {
      var editedLayers = new L.LayerGroup();

      this._featureGroup.eachLayer(function (layer) {
        if (layer.edited) {
          editedLayers.addLayer(layer);
          layer.edited = false;
        }
      });

      this._map.fire(L.Draw.Event.EDITED, {
        layers: editedLayers
      });
    },
    _backupLayer: function _backupLayer(layer) {
      var id = L.Util.stamp(layer);

      if (!this._uneditedLayerProps[id]) {
        // Polyline, Polygon or Rectangle
        if (layer instanceof L.Polyline || layer instanceof L.Polygon || layer instanceof L.Rectangle) {
          this._uneditedLayerProps[id] = {
            latlngs: L.LatLngUtil.cloneLatLngs(layer.getLatLngs())
          };
        } else if (layer instanceof L.Circle) {
          this._uneditedLayerProps[id] = {
            latlng: L.LatLngUtil.cloneLatLng(layer.getLatLng()),
            radius: layer.getRadius()
          };
        } else if (layer instanceof L.Marker || layer instanceof L.CircleMarker) {
          // Marker
          this._uneditedLayerProps[id] = {
            latlng: L.LatLngUtil.cloneLatLng(layer.getLatLng())
          };
        }
      }
    },
    _getTooltipText: function _getTooltipText() {
      return {
        text: L.drawLocal.edit.handlers.edit.tooltip.text,
        subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
      };
    },
    _updateTooltip: function _updateTooltip() {
      this._tooltip.updateContent(this._getTooltipText());
    },
    _revertLayer: function _revertLayer(layer) {
      var id = L.Util.stamp(layer);
      layer.edited = false;

      if (this._uneditedLayerProps.hasOwnProperty(id)) {
        // Polyline, Polygon or Rectangle
        if (layer instanceof L.Polyline || layer instanceof L.Polygon || layer instanceof L.Rectangle) {
          layer.setLatLngs(this._uneditedLayerProps[id].latlngs);
        } else if (layer instanceof L.Circle) {
          layer.setLatLng(this._uneditedLayerProps[id].latlng);
          layer.setRadius(this._uneditedLayerProps[id].radius);
        } else if (layer instanceof L.Marker || layer instanceof L.CircleMarker) {
          // Marker or CircleMarker
          layer.setLatLng(this._uneditedLayerProps[id].latlng);
        }

        layer.fire('revert-edited', {
          layer: layer
        });
      }
    },
    _enableLayerEdit: function _enableLayerEdit(e) {
      var layer = e.layer || e.target || e,
          pathOptions,
          poly; // Back up this layer (if haven't before)

      this._backupLayer(layer);

      if (this.options.poly) {
        poly = L.Util.extend({}, this.options.poly);
        layer.options.poly = poly;
      } // Set different style for editing mode


      if (this.options.selectedPathOptions) {
        pathOptions = L.Util.extend({}, this.options.selectedPathOptions); // Use the existing color of the layer

        if (pathOptions.maintainColor) {
          pathOptions.color = layer.options.color;
          pathOptions.fillColor = layer.options.fillColor;
        }

        layer.options.original = L.extend({}, layer.options);
        layer.options.editing = pathOptions;
      }

      if (layer instanceof L.Marker) {
        if (layer.editing) {
          layer.editing.enable();
        }

        layer.dragging.enable();
        layer.on('dragend', this._onMarkerDragEnd) // #TODO: remove when leaflet finally fixes their draggable so it's touch friendly again.
        .on('touchmove', this._onTouchMove, this).on('MSPointerMove', this._onTouchMove, this).on('touchend', this._onMarkerDragEnd, this).on('MSPointerUp', this._onMarkerDragEnd, this);
      } else {
        layer.editing.enable();
      }
    },
    _disableLayerEdit: function _disableLayerEdit(e) {
      var layer = e.layer || e.target || e;
      layer.edited = false;

      if (layer.editing) {
        layer.editing.disable();
      }

      delete layer.options.editing;
      delete layer.options.original; // Reset layer styles to that of before select

      if (this._selectedPathOptions) {
        if (layer instanceof L.Marker) {
          this._toggleMarkerHighlight(layer);
        } else {
          // reset the layer style to what is was before being selected
          layer.setStyle(layer.options.previousOptions); // remove the cached options for the layer object

          delete layer.options.previousOptions;
        }
      }

      if (layer instanceof L.Marker) {
        layer.dragging.disable();
        layer.off('dragend', this._onMarkerDragEnd, this).off('touchmove', this._onTouchMove, this).off('MSPointerMove', this._onTouchMove, this).off('touchend', this._onMarkerDragEnd, this).off('MSPointerUp', this._onMarkerDragEnd, this);
      } else {
        layer.editing.disable();
      }
    },
    _onMouseMove: function _onMouseMove(e) {
      this._tooltip.updatePosition(e.latlng);
    },
    _onMarkerDragEnd: function _onMarkerDragEnd(e) {
      var layer = e.target;
      layer.edited = true;

      this._map.fire(L.Draw.Event.EDITMOVE, {
        layer: layer
      });
    },
    _onTouchMove: function _onTouchMove(e) {
      var touchEvent = e.originalEvent.changedTouches[0],
          layerPoint = this._map.mouseEventToLayerPoint(touchEvent),
          latlng = this._map.layerPointToLatLng(layerPoint);

      e.target.setLatLng(latlng);
    },
    _hasAvailableLayers: function _hasAvailableLayers() {
      return this._featureGroup.getLayers().length !== 0;
    }
  });
  /**
   * @class L.EditToolbar.Delete
   * @aka EditToolbar.Delete
   */

  L.EditToolbar.Delete = L.Handler.extend({
    statics: {
      TYPE: 'remove' // not delete as delete is reserved in js

    },
    includes: L.Mixin.Events,
    // @method intialize(): void
    initialize: function initialize(map, options) {
      L.Handler.prototype.initialize.call(this, map);
      L.Util.setOptions(this, options); // Store the selectable layer group for ease of access

      this._deletableLayers = this.options.featureGroup;

      if (!(this._deletableLayers instanceof L.FeatureGroup)) {
        throw new Error('options.featureGroup must be a L.FeatureGroup');
      } // Save the type so super can fire, need to do this as cannot do this.TYPE :(


      this.type = L.EditToolbar.Delete.TYPE;
    },
    // @method enable(): void
    // Enable the delete toolbar
    enable: function enable() {
      if (this._enabled || !this._hasAvailableLayers()) {
        return;
      }

      this.fire('enabled', {
        handler: this.type
      });

      this._map.fire(L.Draw.Event.DELETESTART, {
        handler: this.type
      });

      L.Handler.prototype.enable.call(this);

      this._deletableLayers.on('layeradd', this._enableLayerDelete, this).on('layerremove', this._disableLayerDelete, this);
    },
    // @method disable(): void
    // Disable the delete toolbar
    disable: function disable() {
      if (!this._enabled) {
        return;
      }

      this._deletableLayers.off('layeradd', this._enableLayerDelete, this).off('layerremove', this._disableLayerDelete, this);

      L.Handler.prototype.disable.call(this);

      this._map.fire(L.Draw.Event.DELETESTOP, {
        handler: this.type
      });

      this.fire('disabled', {
        handler: this.type
      });
    },
    // @method addHooks(): void
    // Add listener hooks to this handler
    addHooks: function addHooks() {
      var map = this._map;

      if (map) {
        map.getContainer().focus();

        this._deletableLayers.eachLayer(this._enableLayerDelete, this);

        this._deletedLayers = new L.LayerGroup();
        this._tooltip = new L.Draw.Tooltip(this._map);

        this._tooltip.updateContent({
          text: L.drawLocal.edit.handlers.remove.tooltip.text
        });

        this._map.on('mousemove', this._onMouseMove, this);
      }
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler
    removeHooks: function removeHooks() {
      if (this._map) {
        this._deletableLayers.eachLayer(this._disableLayerDelete, this);

        this._deletedLayers = null;

        this._tooltip.dispose();

        this._tooltip = null;

        this._map.off('mousemove', this._onMouseMove, this);
      }
    },
    // @method revertLayers(): void
    // Revert the deleted layers back to their prior state.
    revertLayers: function revertLayers() {
      // Iterate of the deleted layers and add them back into the featureGroup
      this._deletedLayers.eachLayer(function (layer) {
        this._deletableLayers.addLayer(layer);

        layer.fire('revert-deleted', {
          layer: layer
        });
      }, this);
    },
    // @method save(): void
    // Save deleted layers
    save: function save() {
      this._map.fire(L.Draw.Event.DELETED, {
        layers: this._deletedLayers
      });
    },
    // @method removeAllLayers(): void
    // Remove all delateable layers
    removeAllLayers: function removeAllLayers() {
      // Iterate of the delateable layers and add remove them
      this._deletableLayers.eachLayer(function (layer) {
        this._removeLayer({
          layer: layer
        });
      }, this);

      this.save();
    },
    _enableLayerDelete: function _enableLayerDelete(e) {
      var layer = e.layer || e.target || e;
      layer.on('click', this._removeLayer, this);
    },
    _disableLayerDelete: function _disableLayerDelete(e) {
      var layer = e.layer || e.target || e;
      layer.off('click', this._removeLayer, this); // Remove from the deleted layers so we can't accidentally revert if the user presses cancel

      this._deletedLayers.removeLayer(layer);
    },
    _removeLayer: function _removeLayer(e) {
      var layer = e.layer || e.target || e;

      this._deletableLayers.removeLayer(layer);

      this._deletedLayers.addLayer(layer);

      layer.fire('deleted');
    },
    _onMouseMove: function _onMouseMove(e) {
      this._tooltip.updatePosition(e.latlng);
    },
    _hasAvailableLayers: function _hasAvailableLayers() {
      return this._deletableLayers.getLayers().length !== 0;
    }
  });
})(window, document);

/***/ }),

/***/ \"./assets/js/sectorisation.js\":
/*!************************************!*\\
  !*** ./assets/js/sectorisation.js ***!
  \\************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

\"use strict\";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.map.js */ \"./node_modules/core-js/modules/es.array.map.js\");
/* harmony import */ var core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");
/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.array.find.js */ \"./node_modules/core-js/modules/es.array.find.js\");
/* harmony import */ var core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var core_js_modules_es_number_constructor_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.number.constructor.js */ \"./node_modules/core-js/modules/es.number.constructor.js\");
/* harmony import */ var core_js_modules_es_number_constructor_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_number_constructor_js__WEBPACK_IMPORTED_MODULE_3__);
/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.regexp.exec.js */ \"./node_modules/core-js/modules/es.regexp.exec.js\");
/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ \"./node_modules/core-js/modules/es.string.replace.js\");
/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var core_js_modules_es_array_index_of_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.array.index-of.js */ \"./node_modules/core-js/modules/es.array.index-of.js\");
/* harmony import */ var core_js_modules_es_array_index_of_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_index_of_js__WEBPACK_IMPORTED_MODULE_6__);
/* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.string.split.js */ \"./node_modules/core-js/modules/es.string.split.js\");
/* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_7__);
/* harmony import */ var core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.date.to-string.js */ \"./node_modules/core-js/modules/es.date.to-string.js\");
/* harmony import */ var core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_8__);
/* harmony import */ var core_js_modules_es_array_reduce_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.array.reduce.js */ \"./node_modules/core-js/modules/es.array.reduce.js\");
/* harmony import */ var core_js_modules_es_array_reduce_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_reduce_js__WEBPACK_IMPORTED_MODULE_9__);
/* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.array.for-each.js */ \"./node_modules/core-js/modules/es.array.for-each.js\");
/* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_10__);
/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ \"./node_modules/core-js/modules/web.dom-collections.for-each.js\");
/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_11__);
/* harmony import */ var core_js_modules_es_array_some_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.array.some.js */ \"./node_modules/core-js/modules/es.array.some.js\");
/* harmony import */ var core_js_modules_es_array_some_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_some_js__WEBPACK_IMPORTED_MODULE_12__);
/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.array.splice.js */ \"./node_modules/core-js/modules/es.array.splice.js\");
/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_13__);
/* harmony import */ var _images_secto_save_png__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../images/secto/save.png */ \"./assets/images/secto/save.png\");
/* harmony import */ var _images_secto_icon_marker_black_png__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../images/secto/icon_marker_black.png */ \"./assets/images/secto/icon_marker_black.png\");
/* harmony import */ var _images_secto_icon_marker_red_png__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../images/secto/icon_marker_red.png */ \"./assets/images/secto/icon_marker_red.png\");
/* harmony import */ var _images_secto_circle_png__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../images/secto/circle.png */ \"./assets/images/secto/circle.png\");
/* harmony import */ var _images_secto_maison_png__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../images/secto/maison.png */ \"./assets/images/secto/maison.png\");
/* harmony import */ var _images_secto_undo_png__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../images/secto/undo.png */ \"./assets/images/secto/undo.png\");
/* harmony import */ var _images_secto_refresh_png__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../images/secto/refresh.png */ \"./assets/images/secto/refresh.png\");
/* harmony import */ var _images_secto_pastille_png__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../images/secto/pastille.png */ \"./assets/images/secto/pastille.png\");
/* harmony import */ var _images_secto_bdd_png__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../images/secto/bdd.png */ \"./assets/images/secto/bdd.png\");
/* harmony import */ var _images_secto_creation_assist_png__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../images/secto/creation_assist.png */ \"./assets/images/secto/creation_assist.png\");
/* harmony import */ var _images_secto_clients30_png__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../images/secto/clients30.png */ \"./assets/images/secto/clients30.png\");
/* harmony import */ var _images_secto_agents_png__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../images/secto/agents.png */ \"./assets/images/secto/agents.png\");
/* harmony import */ var _images_secto_number_png__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../images/secto/number.png */ \"./assets/images/secto/number.png\");
/* harmony import */ var _images_secto_densite1_png__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../images/secto/densite1.png */ \"./assets/images/secto/densite1.png\");
/* harmony import */ var _images_secto_clientsOut_png__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../images/secto/clientsOut.png */ \"./assets/images/secto/clientsOut.png\");
/* harmony import */ var leaflet_dist_leaflet_css__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! leaflet/dist/leaflet.css */ \"./node_modules/leaflet/dist/leaflet.css\");
/* harmony import */ var _styles_sectorisation_css__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../styles/sectorisation.css */ \"./assets/styles/sectorisation.css\");
/* harmony import */ var _styles_timeline_css__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../styles/timeline.css */ \"./assets/styles/timeline.css\");
/* harmony import */ var leaflet_dist_leaflet_src__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! leaflet/dist/leaflet-src.js */ \"./node_modules/leaflet/dist/leaflet-src.js\");
/* harmony import */ var leaflet_dist_leaflet_src__WEBPACK_IMPORTED_MODULE_32___default = /*#__PURE__*/__webpack_require__.n(leaflet_dist_leaflet_src__WEBPACK_IMPORTED_MODULE_32__);
/* harmony import */ var bootstrap_table_dist_bootstrap_table_min_css__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! bootstrap-table/dist/bootstrap-table.min.css */ \"./node_modules/bootstrap-table/dist/bootstrap-table.min.css\");
/* harmony import */ var bootstrap_table_dist_bootstrap_table_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! bootstrap-table/dist/bootstrap-table.js */ \"./node_modules/bootstrap-table/dist/bootstrap-table.js\");
/* harmony import */ var bootstrap_table_dist_bootstrap_table_js__WEBPACK_IMPORTED_MODULE_34___default = /*#__PURE__*/__webpack_require__.n(bootstrap_table_dist_bootstrap_table_js__WEBPACK_IMPORTED_MODULE_34__);
/* harmony import */ var bootstrap_table_dist_bootstrap_table_locale_all_min_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! bootstrap-table/dist/bootstrap-table-locale-all.min.js */ \"./node_modules/bootstrap-table/dist/bootstrap-table-locale-all.min.js\");
/* harmony import */ var bootstrap_table_dist_bootstrap_table_locale_all_min_js__WEBPACK_IMPORTED_MODULE_35___default = /*#__PURE__*/__webpack_require__.n(bootstrap_table_dist_bootstrap_table_locale_all_min_js__WEBPACK_IMPORTED_MODULE_35__);
/* harmony import */ var _map_leaflet_draw_custom_js__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./map/leaflet.draw-custom.js */ \"./assets/js/map/leaflet.draw-custom.js\");
/* harmony import */ var _map_leaflet_draw_custom_js__WEBPACK_IMPORTED_MODULE_36___default = /*#__PURE__*/__webpack_require__.n(_map_leaflet_draw_custom_js__WEBPACK_IMPORTED_MODULE_36__);
/* harmony import */ var _map_leaflet_search_js__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./map/leaflet-search.js */ \"./assets/js/map/leaflet-search.js\");
/* harmony import */ var _map_leaflet_search_js__WEBPACK_IMPORTED_MODULE_37___default = /*#__PURE__*/__webpack_require__.n(_map_leaflet_search_js__WEBPACK_IMPORTED_MODULE_37__);
/* provided dependency */ var \$ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");














//IMAGES














 //STYLE





 //JS





 //\$(document).ready(function () {

\$(document).on('ready turbo:load', function () {
  /*redimensionnement carte*/
  \$(window).resize(function () {
    var height = 344;
    var width = 60;

    if (\$('#filter-container').hasClass('active')) {
      height = 482;
    }

    if (!\$('#blocRight').hasClass('active')) {
      width = 97;
    }

    \$('#sectorisationMap').css('width', width + '%');
    var sH = \$(window).height() - height;
    \$('#sectorisationMap').css('height', sH + 30 + 'px');
    \$('#blocTab').css('height', sH + 'px');
    \$('#explainMe').css('height', sH + 'px');
    \$('#containerMap').css('height', sH + 30 + 'px');
  });
  \$('.dx-datagrid-search-panel').css('width', '250px');
  \$(window).trigger('resize');
  document.getElementById('filter-image').addEventListener('click', function () {
    if (!\$('#listeAgents').hasClass('visible')) {
      \$('#listeAgents').addClass('visible');
      \$('#listeAgents').show();
    }

    \$(window).trigger('resize');
  });
  \$('#minimize-tab').click(function () {
    \$('#blocRight').toggleClass('active');
    \$(window).trigger('resize');
  });
  /*fin redimensionnement carte*/

  /*VARIABLES*/

  var tabColor = ['SPRINGGREEN', 'aqua', 'yellow', 'DEEPPINK', 'STEELBLUE', 'green', 'GOLDENROD', 'DEEPSKYBLUE', 'magenta', 'purple', 'orange', 'DARKRED', 'maroon'];
  var tabAntennes = ['VERGNIEUX', 'HANNIQUET', 'GOSNET', 'CHEZE', 'LAHALLE'];
  var colors = [];
  var fillColorWithoutAgent = 'black';
  var colorWithoutAgent = 'red';
  var colorWithAgent = '#000';
  var tabAgents = JSON.parse(\$('#tabAgents')[0].innerHTML);
  var siteUser = \$('#site')[0].innerHTML;
  console.info(agents);
  var tabNbClients = [];

  for (var i in tabAgents) {
    if (!tabNbClients[tabAgents[i]['code_agent']]) {
      tabNbClients[tabAgents[i]['code_agent']] = [];
    }

    tabNbClients[tabAgents[i]['code_agent']]['nbClients'] = tabAgents[i]['nb_clients'];
    tabNbClients[tabAgents[i]['code_agent']]['famille0'] = tabAgents[i]['famille0'];
    tabNbClients[tabAgents[i]['code_agent']]['famille1'] = tabAgents[i]['famille1'];
    tabNbClients[tabAgents[i]['code_agent']]['famille2'] = tabAgents[i]['famille2'];
    tabNbClients[tabAgents[i]['code_agent']]['famille3'] = tabAgents[i]['famille3'];
  }

  var lastId = 0;
  var markerDecoupage = new L.layerGroup();
  var marker1 = '';
  var marker2 = '';
  var fusion = false;
  var decoupage = false;
  var modification = false;
  var creation = false;
  var assist = false;
  var containerClick = false;
  var showTooltip = false; //var agents = '';

  var showAgents = true;
  var showAgentsOfSecteurs = true;
  var densiteClients = '';
  var showDensite = false;
  var clientsWithoutSecteur = new L.FeatureGroup();
  var geojsonClients = '';
  var showClients = false;
  var tabDensite = [];
  var secteursByResponsable = [];
  var secteursSelect = '';
  var historiqueActions = []; //Contient la liste des actions faites depuis la dernière sauvegarde

  var histoPolygon = '';
  var flagUndo = false;
  var eventActif = false;
  var optionsCircleClients = {
    radius: 3,
    opacity: 1,
    fillColor: \"#e20613\",
    color: \"#000\",
    weight: 1,
    fillOpacity: 1
  };
  /*FIN VARIABLES*/

  /*ICONS*/

  var markerIcon = L.icon({
    iconUrl: _images_secto_icon_marker_black_png__WEBPACK_IMPORTED_MODULE_15__,
    iconAnchor: [12, 21] // point of the icon which will correspond to marker's location

  });
  var markerIconRed = L.icon({
    iconUrl: _images_secto_icon_marker_red_png__WEBPACK_IMPORTED_MODULE_16__,
    iconAnchor: [12, 21] // point of the icon which will correspond to marker's location

  });
  var circleIcon = L.icon({
    iconUrl: _images_secto_circle_png__WEBPACK_IMPORTED_MODULE_17__,
    iconSize: [14, 14],
    // size of the icon
    iconAnchor: [7, 7] // point of the icon which will correspond to marker's location

  });
  var homeIcon = L.icon({
    iconUrl: _images_secto_maison_png__WEBPACK_IMPORTED_MODULE_18__,
    iconSize: [20, 20],
    // size of the icon
    iconAnchor: [10, 10] // point of the icon which will correspond to marker's location

  });
  /*FIN ICONS*/

  /*DECLARATION MAP*/

  var zoom = 11;
  var coords = [48.876457644366816, 2.3644638061523438];

  if (siteUser == \"BRON\") {
    coords = [45.75, 4.85];
  } else if (siteUser == \"HANNIQUET\") {
    coords = [48.385, 2.951];
    zoom = 10;
  } else if (siteUser == \"GOSNET\") {
    coords = [49.429, 2.08];
    zoom = 9;
  } else if (siteUser == \"LAHALLE\") {
    coords = [48.8, 2.1900052];
    zoom = 12;
  } else if (siteUser == \"VERGNIEUX\") {
    coords = [48.62, 1.7800076];
    zoom = 10;
  } else if (siteUser == \"CHEZE\") {
    coords = [48.5309275, 2.1939081];
    zoom = 10;
  } // if (tabAntennes.includes(siteUser)) {
  //     var tabEditActions = [
  //         LeafletToolbar.ToolbarAction.extend(modifierSecteur()),
  //         LeafletToolbar.ToolbarAction.extend(calculDistanceSecteur())
  //     ];
  // } else {
  //     var tabEditActions = [
  //         LeafletToolbar.EditAction.Popup.Edit,
  //         LeafletToolbar.ToolbarAction.extend(deleteSecteur()),
  //         LeafletToolbar.ToolbarAction.extend(decouperSecteur()),
  //         LeafletToolbar.ToolbarAction.extend(fusionSecteur()),
  //         LeafletToolbar.ToolbarAction.extend(modifierSecteur()),
  //         LeafletToolbar.ToolbarAction.extend(calculDistanceSecteur())
  //     ];
  // }
  // var mapSecto = L.map('sectorisationMap').setView(coords, zoom),
  //     drawnItems = new L.FeatureGroup().addTo(mapSecto),
  //     editActions = tabEditActions;


  var mapSecto = L.map('sectorisationMap').setView(coords, zoom);
  mapSecto.zoomControl._zoomInButton.title = \"Zoom avant\";
  mapSecto.zoomControl._zoomOutButton.title = \"Zoom arrière\";
  var scale = L.control.scale({
    position: 'bottomright'
  }).addTo(mapSecto);
  /*FIN DECLARATION MAP*/

  /*FOND DE CARTE*/

  var glcMapsGGh = L.tileLayer('http://sfcp.frisquet.com/?t={z}/{x}/{y}&th=ggl', {
    maxZoom: 18,
    detectRetina: true,
    attribution: '<a target=\"_blank\" href=\"https://icones8.fr\">Icons8</a>'
  });
  glcMapsGGh.addTo(mapSecto);
  var plan = L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
    attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors | &copy <a target=\"_blank\" href=\"https://icones8.fr\">Icons8</a>'
  });
  var Esri_WorldImagery = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {
    attribution: 'Tiles &copy; Esri | &copy <a target=\"_blank\" href=\"https://icones8.fr\">Icons8</a>'
  });
  var Esri_WorldTopoMap = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', {
    attribution: 'Tiles &copy; Esri | &copy <a target=\"_blank\" href=\"https://icones8.fr\">Icons8</a>'
  });
  var plan2 = L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
    attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors | &copy <a target=\"_blank\" href=\"https://icones8.fr\">Icons8</a>'
  });
  var histoMap = L.map('histoMap').setView(coords, 11);
  histoMap.zoomControl._zoomInButton.title = \"Zoom avant\";
  histoMap.zoomControl._zoomOutButton.title = \"Zoom arrière\";
  plan2.addTo(histoMap);
  var baseLayers = {
    'Google Map': glcMapsGGh,
    'Plan': plan,
    'Satellite': Esri_WorldImagery,
    'Topographique': Esri_WorldTopoMap
  };
  L.control.layers(baseLayers).addTo(mapSecto);
  /*FIN FOND DE CARTE*/

  /*LAYERS*/

  var guideLayers = [];
  var layersAdjacent = new L.FeatureGroup();
  var agentsAdjacent = new L.FeatureGroup();
  var circleGuide = new L.FeatureGroup();
  var antennes = new L.FeatureGroup();
  mapSecto.addLayer(antennes);
  var editableLayers = new L.FeatureGroup();
  mapSecto.addLayer(editableLayers);
  var bigPolygon = new L.FeatureGroup();
  mapSecto.addLayer(bigPolygon);
  var bigPolygonAntennes = new L.FeatureGroup();
  mapSecto.addLayer(bigPolygonAntennes);
  var agentsOfSecteurs = new L.FeatureGroup();
  mapSecto.addLayer(agentsOfSecteurs);
  var histoAgentsOfSecteurs = new L.FeatureGroup();
  histoMap.addLayer(histoAgentsOfSecteurs);
  var agents = new L.FeatureGroup();
  mapSecto.addLayer(agents);
  /*FIN LAYERS*/

  /*CONTROL*/

  if (tabAntennes.includes(siteUser)) {
    var options = {
      position: 'topright',
      draw: {
        polyline: false,
        polygon: false,
        circle: false,
        // Turns off this drawing tool
        rectangle: false,
        marker: false,
        circlemarker: false
      },
      edit: false
    };
  } else {
    var options = {
      position: 'topright',
      draw: {
        polyline: false,
        polygon: {
          shapeOptions: {
            color: '#000',
            opacity: 1,
            weight: 2
          },
          allowIntersection: false,
          // Restricts shapes to simple polygons
          showArea: true,
          drawError: {
            color: 'red',
            // Color the shape will turn when intersects
            message: '<strong>Oh non !<strong> Vous ne pouvez pas tracer ça !' // Message that will show when intersect

          },
          guideLayers: guideLayers
        },
        circle: false,
        // Turns off this drawing tool
        rectangle: false,
        marker: false,
        circlemarker: false
      },
      edit: false
    };
  }

  var drawControl = new L.Control.Draw(options);
  mapSecto.addControl(drawControl);
  mapSecto.addControl(new L.Control.Search({
    url: 'https://nominatim.openstreetmap.org/search?format=json&q={s}',
    textPlaceholder: 'Adresse, ville...',
    textErr: 'Localisation non trouvé',
    jsonpParam: 'json_callback',
    propertyName: 'display_name',
    propertyLoc: ['lat', 'lon'],
    //marker: L.circleMarker([0,0],{radius:30}),
    hideMarkerOnCollapse: true,
    autoCollapse: true,
    autoType: false,
    minLength: 2,
    zoom: 14
  }));
  var customControlUndo = L.Control.extend({
    options: {
      position: 'topleft'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Retour arrière\");
      container.setAttribute('id', \"undo\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_undo_png__WEBPACK_IMPORTED_MODULE_19__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';
      container.style.position = 'relative';
      container.style.display = 'none';

      container.onclick = function () {
        undo();
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlUndo());
  var customControlRefresh = L.Control.extend({
    options: {
      position: 'topleft'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Rafraîchir / Effacer les modifications non enregistrées\");
      container.setAttribute('id', \"refresh\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_refresh_png__WEBPACK_IMPORTED_MODULE_20__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';

      container.onclick = function () {
        refresh('', '', true);
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlRefresh());
  var customControlSave = L.Control.extend({
    options: {
      position: 'topleft'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Sauvegarde des secteurs\");
      container.setAttribute('id', \"save\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_save_png__WEBPACK_IMPORTED_MODULE_14__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\"> <img src=\"' + _images_secto_pastille_png__WEBPACK_IMPORTED_MODULE_21__ + '\" id=\"pastille\" style=\"position: absolute;right:0;bottom: 0;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';
      container.style.position = 'relative';

      container.onclick = function () {
        if (historiqueActions.length > 1) {
          \$('#saveMe #historiqueActions')[0].innerHTML = '';

          for (var i in historiqueActions) {
            if (i > 0) {
              \$('#saveMe #historiqueActions')[0].innerHTML += '<li>' + historiqueActions[i]['texte'] + '</li>';
            }
          }

          \$('#saveModif')[0].disabled = false;
          \$('#deleteModif')[0].disabled = false;
        } else {
          \$('#saveMe #historiqueActions')[0].innerHTML = 'Aucune modification en cours.';
          \$('#saveModif')[0].disabled = true;
          \$('#deleteModif')[0].disabled = true;
        }

        \$('#saveMe').modal('show');
        \$(\"#deleteModif\").off(\"click\");
        \$('#deleteModif').on(\"click\", function (event) {
          \$('#saveMe').modal('hide');
          refresh();
        });
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlSave());

  if (siteUser == 'MEAUX') {
    var customControlSave = L.Control.extend({
      options: {
        position: 'topleft'
      },
      onAdd: function onAdd(mapSecto) {
        var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
        container.setAttribute('title', \"Synchronisation\");
        container.setAttribute('id', \"synchro\");
        container.style.backgroundColor = 'white';
        container.innerHTML = '<img src=\"' + _images_secto_bdd_png__WEBPACK_IMPORTED_MODULE_22__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
        container.style.backgroundSize = \"30px 30px\";
        container.style.width = '30px';
        container.style.height = '30px';
        container.style.position = 'relative';

        container.onclick = function () {
          synchro();
        };

        return container;
      }
    });
    mapSecto.addControl(new customControlSave());
  }

  \$('body').on('submit', 'form#form_save', function (event) {
    var form = \$(this);
    event.preventDefault();

    if (historiqueActions.length > 0) {
      var elements = document.getElementsByClassName('dateMep');
      var same = false;

      for (var i = 0; i < elements.length; i++) {
        if (elements[i].innerHTML == \$('#dateMep').val()) {
          same = true;
          break;
        }
      }

      if (same) {
        \$('#saveMe').modal('hide');
        \$('#alertDate').modal('show');
        \$(\"#confirmEcrase\").off(\"click\");
        \$('#confirmEcrase').on(\"click\", function (event) {
          \$('#alertDate').modal('hide');
          saveVersion();
        });
      } else {
        saveVersion();
      }
    }
  });
  var customControlCreationAssist = L.Control.extend({
    options: {
      position: 'topright'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Création assistée secteur\");
      container.setAttribute('id', \"creationAssist\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_creation_assist_png__WEBPACK_IMPORTED_MODULE_23__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';
      container.style.position = 'relative';

      container.onclick = function () {
        hideFunctions();
        \$('#legende p#texte')[0].innerHTML = \"Sélectionnez deux points non adjacent pour créer un secteur\";
        \$('#explainMe').show();
        assist = true;
        containerClick = true;
        circleGuide = new L.FeatureGroup();
        mapSecto.addLayer(circleGuide);
        eventActif = false;

        for (var j = 0; j < bigPolygon._latlngs.length; j++) {
          for (var k = 0; k < bigPolygon._latlngs[j].length; k++) {
            if (bigPolygon._latlngs[j][k].lat) {
              var marker = new L.Marker(bigPolygon._latlngs[j][k], {
                pos: k,
                icon: markerIcon
              });
              circleGuide.addLayer(marker);
              marker.on(\"click\", function (event) {
                clickMarkerAssist(this);
              });
            } else {
              for (var l = 0; l < bigPolygon._latlngs[j][k].length; l++) {
                var marker = new L.Marker(bigPolygon._latlngs[j][k][l], {
                  pos: l,
                  icon: markerIcon
                });
                circleGuide.addLayer(marker);
                marker.on(\"click\", function (event) {
                  clickMarkerAssist(this);
                });
              }
            }
          }
        }
      };

      return container;
    }
  });

  if (!tabAntennes.includes(siteUser)) {
    mapSecto.addControl(new customControlCreationAssist());
  }

  var customControlNbClients = L.Control.extend({
    options: {
      position: 'topright'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Afficher le nombre de clients par secteurs\");
      container.setAttribute('id', \"nbClients\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_clients30_png__WEBPACK_IMPORTED_MODULE_24__ + '\"  style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';

      container.onclick = function () {
        mapSecto.eachLayer(function (layer) {
          if (layer instanceof L.Polygon) {
            layer.toggleTooltip();
          }
        });
        showTooltip = !showTooltip;
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlNbClients());
  var customControlAgents = L.Control.extend({
    options: {
      position: 'topright'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Afficher les agents\");
      container.setAttribute('id', \"agents\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_agents_png__WEBPACK_IMPORTED_MODULE_25__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';

      container.onclick = function () {
        showAgents = bindElements(showAgents, agents);
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlAgents());
  var customControlAgentsOfSecteurs = L.Control.extend({
    options: {
      position: 'topright'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Afficher l'agent principal des secteurs\");
      container.setAttribute('id', \"principal\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_number_png__WEBPACK_IMPORTED_MODULE_26__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';

      container.onclick = function () {
        showAgentsOfSecteurs = bindElements(showAgentsOfSecteurs, agentsOfSecteurs);
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlAgentsOfSecteurs());
  var customControlDensiteClients = L.Control.extend({
    options: {
      position: 'topright'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Afficher la densité client\");
      container.setAttribute('id', \"densite\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_densite1_png__WEBPACK_IMPORTED_MODULE_27__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';

      container.onclick = function () {
        showDensite = bindElements(showDensite, densiteClients);
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlDensiteClients());
  var customControlClient = L.Control.extend({
    options: {
      position: 'topright'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Afficher les clients hors secteurs\");
      container.setAttribute('id', \"clients\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<div id=\"nbClientHorsSecteur\" class=\"alertes\" style=\"font-size:10px;margin:0px;\">0</div><img src=\"' + _images_secto_clientsOut_png__WEBPACK_IMPORTED_MODULE_28__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '45px';

      container.onclick = function () {
        showClients = bindElements(showClients, clientsWithoutSecteur);
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlClient());
  /*FIN CONTROL*/

  initSecto();
  /*TIMELINE*/

  var timelines = \$('.cd-horizontal-timeline'),
      eventsMinDistance = 17;
  timelines.length > 0 && initTimeline(timelines, false);

  function initTimeline(timelines, reload) {
    timelines.each(function () {
      var timeline = \$(this),
          timelineComponents = {}; //cache timeline components

      timelineComponents['timelineWrapper'] = timeline.find('.events-wrapper');
      timelineComponents['eventsWrapper'] = timelineComponents['timelineWrapper'].children('.events');
      timelineComponents['fillingLine'] = timelineComponents['eventsWrapper'].children('.filling-line');
      timelineComponents['timelineEvents'] = timelineComponents['eventsWrapper'].find('li.listeHisto');
      timelineComponents['timelineVersion'] = timelineComponents['eventsWrapper'].find('li.listeHisto.versionActuelle');
      timelineComponents['timelineLinks'] = timelineComponents['eventsWrapper'].find('a');
      timelineComponents['timelineDates'] = timelineComponents['timelineEvents']; //timelineComponents['eventsMinLapse'] = minLapse(timelineComponents['timelineDates']);

      timelineComponents['timelineNavigation'] = timeline.find('.cd-timeline-navigation');
      timelineComponents['eventsContent'] = timeline.children('.events-content'); //assign a left postion to the single events along the timeline

      eventsMinDistance = 250;
      var timelineTotWidth = (timelineComponents['timelineDates'].length + 1) * eventsMinDistance;
      setDatePosition(timelineComponents, eventsMinDistance); //assign a width to the timeline

      setTimelineWidth(timelineComponents, timelineTotWidth); //the timeline has been initialize - show it

      timeline.addClass('loaded');

      if (!reload) {
        var widthTimeline = Number(timelineComponents['timelineWrapper'].css('width').replace('px', ''));
        var middle = widthTimeline / 2;
        var leftVersion = Number(timelineComponents['timelineVersion'].css('left').replace('px', ''));
        var comptDecalage = 0;

        for (i = widthTimeline; i < leftVersion; i += middle) {
          comptDecalage++;
        }

        if (comptDecalage > 0) {
          updateSlide(timelineComponents, timelineTotWidth, 'next', comptDecalage);
        }
      } //detect click on the next arrow


      timelineComponents['timelineNavigation'].on('click', '.next', function (event) {
        event.preventDefault();
        updateSlide(timelineComponents, timelineTotWidth, 'next', 1);
      }); //detect click on the prev arrow

      timelineComponents['timelineNavigation'].on('click', '.prev', function (event) {
        event.preventDefault();
        updateSlide(timelineComponents, timelineTotWidth, 'prev', 1);
      }); //detect click on the a single event - show new event content

      timelineComponents['eventsWrapper'].off(\"click\");
      timelineComponents['eventsWrapper'].on('click', 'a', function (event) {
        event.preventDefault();
        var thisLink = \$(this);
        var version = thisLink[0].id;

        if (historiqueActions.length <= 2) {
          showLoadModal();
          refresh(version, thisLink[0].firstElementChild.innerHTML);
          timelineComponents['timelineLinks'].removeClass('selected');
          thisLink.addClass('selected');
          updateOlderEvents(thisLink);
          updateFilling(thisLink, timelineComponents['fillingLine'], timelineTotWidth);
          updateVisibleContent(thisLink, timelineComponents['eventsContent']);
          hideLoadModal();
        } else {
          \$('#alertVersion').modal('show');
          \$(\"#confirmVersion\").off(\"click\");
          \$('#confirmVersion').on(\"click\", function (event) {
            \$('#alertVersion').modal('hide');
            showLoadModal();
            refresh(version, thisLink[0].firstElementChild.innerHTML);
            timelineComponents['timelineLinks'].removeClass('selected');
            thisLink.addClass('selected');
            updateOlderEvents(thisLink);
            updateFilling(thisLink, timelineComponents['fillingLine'], timelineTotWidth);
            updateVisibleContent(thisLink, timelineComponents['eventsContent']);
            hideLoadModal();
          });
        }
      }); //on swipe, show next/prev event content

      timelineComponents['eventsContent'].on('swipeleft', function () {
        var mq = checkMQ();
        mq == 'mobile' && showNewContent(timelineComponents, timelineTotWidth, 'next');
      });
      timelineComponents['eventsContent'].on('swiperight', function () {
        var mq = checkMQ();
        mq == 'mobile' && showNewContent(timelineComponents, timelineTotWidth, 'prev');
      }); //keyboard navigation

      \$(document).keyup(function (event) {
        if (event.which == '37' && elementInViewport(timeline.get(0))) {
          showNewContent(timelineComponents, timelineTotWidth, 'prev');
        } else if (event.which == '39' && elementInViewport(timeline.get(0))) {
          showNewContent(timelineComponents, timelineTotWidth, 'next');
        }
      });
    });
  }

  function updateSlide(timelineComponents, timelineTotWidth, string, decalage) {
    //retrieve translateX value of timelineComponents['eventsWrapper']
    var translateValue = getTranslateValue(timelineComponents['eventsWrapper']),
        wrapperWidth = Number(timelineComponents['timelineWrapper'].css('width').replace('px', '')); //translate the timeline to the left('next')/right('prev')

    string == 'next' ? translateTimeline(timelineComponents, (translateValue - wrapperWidth + eventsMinDistance) * decalage, wrapperWidth - timelineTotWidth) : translateTimeline(timelineComponents, translateValue + wrapperWidth - eventsMinDistance);
  }

  function showNewContent(timelineComponents, timelineTotWidth, string) {
    //go from one event to the next/previous one
    var visibleContent = timelineComponents['eventsContent'].find('.selected'),
        newContent = string == 'next' ? visibleContent.next() : visibleContent.prev();

    if (newContent.length > 0) {
      //if there's a next/prev event - show it
      var selectedDate = timelineComponents['eventsWrapper'].find('.selected'),
          newEvent = string == 'next' ? selectedDate.parent('li').next('li').children('a') : selectedDate.parent('li').prev('li').children('a');
      updateFilling(newEvent, timelineComponents['fillingLine'], timelineTotWidth);
      updateVisibleContent(newEvent, timelineComponents['eventsContent']);
      newEvent.addClass('selected');
      selectedDate.removeClass('selected');
      updateOlderEvents(newEvent);
      updateTimelinePosition(string, newEvent, timelineComponents, timelineTotWidth);
    }
  }

  function updateTimelinePosition(string, event, timelineComponents, timelineTotWidth) {
    //translate timeline to the left/right according to the position of the selected event
    var eventStyle = window.getComputedStyle(event.get(0), null),
        eventLeft = Number(eventStyle.getPropertyValue(\"left\").replace('px', '')),
        timelineWidth = Number(timelineComponents['timelineWrapper'].css('width').replace('px', '')),
        timelineTotWidth = Number(timelineComponents['eventsWrapper'].css('width').replace('px', ''));
    var timelineTranslate = getTranslateValue(timelineComponents['eventsWrapper']);

    if (string == 'next' && eventLeft > timelineWidth - timelineTranslate || string == 'prev' && eventLeft < -timelineTranslate) {
      translateTimeline(timelineComponents, -eventLeft + timelineWidth / 2, timelineWidth - timelineTotWidth);
    }
  }

  function translateTimeline(timelineComponents, value, totWidth) {
    var eventsWrapper = timelineComponents['eventsWrapper'].get(0);
    value = value > 0 ? 0 : value; //only negative translate value

    value = !(typeof totWidth === 'undefined') && value < totWidth ? totWidth : value; //do not translate more than timeline width

    setTransformValue(eventsWrapper, 'translateX', value + 'px'); //update navigation arrows visibility

    value == 0 ? timelineComponents['timelineNavigation'].find('.prev').addClass('inactive') : timelineComponents['timelineNavigation'].find('.prev').removeClass('inactive');
    value == totWidth ? timelineComponents['timelineNavigation'].find('.next').addClass('inactive') : timelineComponents['timelineNavigation'].find('.next').removeClass('inactive');
  }

  function updateFilling(selectedEvent, filling, totWidth) {
    //change .filling-line length according to the selected event
    var eventStyle = window.getComputedStyle(selectedEvent.get(0), null),
        eventLeft = eventStyle.getPropertyValue(\"left\"),
        eventWidth = eventStyle.getPropertyValue(\"width\");
    eventLeft = Number(eventLeft.replace('%', '')) + Number(eventWidth.replace('%', '')) / 2;
    var scaleValue = eventLeft / totWidth;
    setTransformValue(filling.get(0), 'scaleX', scaleValue);
  }

  function setDatePosition(timelineComponents, min) {
    for (i = 0; i < timelineComponents['timelineDates'].length; i++) {
      timelineComponents['timelineEvents'].eq(i).css('left', i * min + 'px');
    }
  }

  function setTimelineWidth(timelineComponents, totalWidth) {
    timelineComponents['eventsWrapper'].css('width', totalWidth + 'px');
    updateFilling(timelineComponents['timelineEvents'].eq(0), timelineComponents['fillingLine'], totalWidth);
  }

  function updateVisibleContent(event, eventsContent) {
    var eventDate = event.data('date'),
        visibleContent = eventsContent.find('.selected'),
        selectedContent = eventsContent.find('[data-date=\"' + eventDate + '\"]'),
        selectedContentHeight = selectedContent.height();

    if (selectedContent.index() > visibleContent.index()) {
      var classEnetering = 'selected enter-right',
          classLeaving = 'leave-left';
    } else {
      var classEnetering = 'selected enter-left',
          classLeaving = 'leave-right';
    }

    selectedContent.attr('class', classEnetering);
    visibleContent.attr('class', classLeaving).one('webkitAnimationEnd oanimationend msAnimationEnd animationend', function () {
      visibleContent.removeClass('leave-right leave-left');
      selectedContent.removeClass('enter-left enter-right');
    });
    eventsContent.css('height', selectedContentHeight + 'px');
  }

  function updateOlderEvents(event) {
    event.parent('li').prevAll('li').children('a').addClass('older-event').end().end().nextAll('li').children('a').removeClass('older-event');
  }

  function getTranslateValue(timeline) {
    var timelineStyle = window.getComputedStyle(timeline.get(0), null),
        timelineTranslate = timelineStyle.getPropertyValue(\"-webkit-transform\") || timelineStyle.getPropertyValue(\"-moz-transform\") || timelineStyle.getPropertyValue(\"-ms-transform\") || timelineStyle.getPropertyValue(\"-o-transform\") || timelineStyle.getPropertyValue(\"transform\");

    if (timelineTranslate.indexOf('(') >= 0) {
      var timelineTranslate = timelineTranslate.split('(')[1];
      timelineTranslate = timelineTranslate.split(')')[0];
      timelineTranslate = timelineTranslate.split(',');
      var translateValue = timelineTranslate[4];
    } else {
      var translateValue = 0;
    }

    return Number(translateValue);
  }

  function setTransformValue(element, property, value) {
    element.style[\"-webkit-transform\"] = property + \"(\" + value + \")\";
    element.style[\"-moz-transform\"] = property + \"(\" + value + \")\";
    element.style[\"-ms-transform\"] = property + \"(\" + value + \")\";
    element.style[\"-o-transform\"] = property + \"(\" + value + \")\";
    element.style[\"transform\"] = property + \"(\" + value + \")\";
  } //based on http://stackoverflow.com/questions/542938/how-do-i-get-the-number-of-days-between-two-dates-in-javascript


  function parseDate(events) {
    var dateArrays = [];
    events.each(function () {
      var dateComp = \$(this).data('date').split('/'),
          newDate = new Date(dateComp[2], dateComp[1] - 1, dateComp[0]);
      dateArrays.push(newDate);
    });
    return dateArrays;
  }

  function parseDate2(events) {
    var dateArrays = [];
    events.each(function () {
      var singleDate = \$(this),
          dateComp = singleDate.data('date').split('T');

      if (dateComp.length > 1) {
        //both DD/MM/YEAR and time are provided
        var dayComp = dateComp[0].split('/'),
            timeComp = dateComp[1].split(':');
      } else if (dateComp[0].indexOf(':') >= 0) {
        //only time is provide
        var dayComp = [\"2000\", \"0\", \"0\"],
            timeComp = dateComp[0].split(':');
      } else {
        //only DD/MM/YEAR
        var dayComp = dateComp[0].split('/'),
            timeComp = [\"0\", \"0\"];
      }

      var newDate = new Date(dayComp[2], dayComp[1] - 1, dayComp[0], timeComp[0], timeComp[1]);
      dateArrays.push(newDate);
    });
    return dateArrays;
  }

  function daydiff(first, second) {
    return Math.round(second - first);
  }

  function minLapse(dates) {
    //determine the minimum distance among events
    var dateDistances = [];

    for (i = 1; i < dates.length; i++) {
      var distance = daydiff(dates[i - 1], dates[i]);
      dateDistances.push(distance);
    }

    return Math.min.apply(null, dateDistances);
  }
  /*
      How to tell if a DOM element is visible in the current viewport?
      http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport
  */


  function elementInViewport(el) {
    var top = el.offsetTop;
    var left = el.offsetLeft;
    var width = el.offsetWidth;
    var height = el.offsetHeight;

    while (el.offsetParent) {
      el = el.offsetParent;
      top += el.offsetTop;
      left += el.offsetLeft;
    }

    return top < window.pageYOffset + window.innerHeight && left < window.pageXOffset + window.innerWidth && top + height > window.pageYOffset && left + width > window.pageXOffset;
  }

  function checkMQ() {
    //check if mobile or desktop device
    return window.getComputedStyle(document.querySelector('.cd-horizontal-timeline'), '::before').getPropertyValue('content').replace(/'/g, \"\").replace(/\"/g, \"\");
  }
  /*FIN TIMELINE*/

  /*FONCTIONS BOOSTRAP TABLE*/


  function totalFormatter(data) {
    var field = this.field;
    return data.map(function (row) {
      return +row[field];
    }).reduce(function (sum, i) {
      return sum + i;
    }, 0);
  }

  function footerStyle(row, index) {
    return {
      css: {
        \"text-align\": \"center\"
      }
    };
  }

  ;
  /*FIN FONCTIONS BOOSTRAP TABLE*/

  /*FONCTIONS*/

  function initSecto(version, dateMep, viaButton) {
    //showLoadModal();
    // if (version == undefined || version == '') {
    //     //getBigPolygon('base'); //permet d'avoir les contours noirs des polygons des secteurs et non gris.
    // }
    //
    // var initHistoPolygon = false;
    // if (histoPolygon == '') {
    //     initHistoPolygon = true;
    // }
    \$.ajax({
      method: \"POST\",
      dataType: \"json\",
      url: \"/map/get_secteurs\",
      data: JSON.stringify({
        version: version
      }),
      success: function success(result) {
        // result = JSON.parse(result);
        // var secteurs = JSON.parse(result['secteurs']);
        var secteurs = result; //lastId = result['lastId'];

        var latLong = [];
        var count = 0;
        secteurs.forEach(function (secteur) {
          if (secteur.coordonnees.type == \"Polygon\") {
            secteur.coordonnees.coordinates[0].forEach(function (locationArray) {
              latLong.push([locationArray[1], locationArray[0]]);
            });
            var polygon = L.polygon(latLong, {// id: currentFeature.idPolygon, //pour l'enregistrement
              // nbClients: currentFeature.nbClients,
              // famille0: currentFeature.famille0,
              // famille1: currentFeature.famille1,
              // famille2: currentFeature.famille2,
              // famille3: currentFeature.famille3,
              // nomSecteur: currentFeature.nomSecteur,
              // codeAgent: currentFeature.codeAgent,
              // suppleant1: currentFeature.suppleant1,
              // suppleant2: currentFeature.suppleant2,
              // suppleant3: currentFeature.suppleant3,
              // suppleant4: currentFeature.suppleant4,
              // site: currentFeature.site,
              // codeGroupe: currentFeature.codeGroupe,
            }).addTo(mapSecto);
            var withoutAgent = true;
            secteur.agentSecteurs.some(function (agent) {
              if (agent.rang_tri == 1) {
                if (!colors[agent.utilisateur_agent.groupe_affectation]) {
                  colors[agent.utilisateur_agent.groupe_affectation] = tabColor[count];
                  count += 1;
                }

                polygon.setStyle(getStyle(agent.utilisateur_agent.groupe_affectation));
                withoutAgent = false;
                var circle = new L.CircleMarker(polygon.getCenter(), {
                  radius: 0.1,
                  opacity: 0,
                  codeAgent: agent.utilisateur_agent.initiales
                }).bindTooltip('' + agent.utilisateur_agent.initiales, {
                  permanent: true,
                  direction: \"center\",
                  className: \"my-labels\"
                });
                agentsOfSecteurs.addLayer(circle);
                return true;
              }
            });

            if (withoutAgent) {
              polygon.setStyle(getStyle(''));
            }

            bindTooltipNbClients(secteur, polygon); // if (initHistoPolygon) {
            //     histoPolygon = L.polygon(latLong).addTo(histoMap);
            // }
            // if (currentFeature.codeAgent == '') { //faire ressortir les secteurs sans agents principal
            //     polygon.setStyle(getStyle(''));
            //     // if (initHistoPolygon) {
            //     //     histoPolygon.setStyle(getStyle(''));
            //     // }
            // } else {
            //     polygon.setStyle(getStyle(currentFeature.codeGroupe));
            //     // if (initHistoPolygon) {
            //     //     histoPolygon.setStyle(getStyle(currentFeature.codeGroupe));
            //     // }
            // }
            // if (!secteursByResponsable[currentFeature.codeGroupe]) {
            //     secteursByResponsable[currentFeature.codeGroupe] = [];
            // }
            // if (!secteursByResponsable[currentFeature.codeGroupe][currentFeature.codeAgent]) {
            //     secteursByResponsable[currentFeature.codeGroupe][currentFeature.codeAgent] = [];
            // }
            // secteursByResponsable[currentFeature.codeGroupe][currentFeature.codeAgent][currentFeature.idPolygon] = polygon.toGeoJSON();
            // editableLayers.addLayer(polygon);
            //
            // if (currentFeature && currentFeature.codeAgent) {
            //     var circle = new L.CircleMarker(polygon.getCenter(), {
            //         radius: 0.1,
            //         opacity: 0,
            //         codeAgent: currentFeature.codeAgent
            //     }).bindTooltip('' + currentFeature.codeAgent, {
            //         permanent: true,
            //         direction: \"center\",
            //         className: \"my-labels\"
            //     });
            //     agentsOfSecteurs.addLayer(circle);
            //
            //     if (initHistoPolygon) {
            //         var histoCircle = new L.CircleMarker(histoPolygon.getCenter(), {
            //             radius: 0.1,
            //             opacity: 0,
            //             codeAgent: currentFeature.codeAgent
            //         }).bindTooltip('' + currentFeature.codeAgent, {
            //             permanent: true,
            //             direction: \"center\",
            //             className: \"my-labels\"
            //         });
            //         histoAgentsOfSecteurs.addLayer(histoCircle);
            //     }
            // }

            latLong = [];
            initEvenementLayer(polygon);
          }
        }); //addHisto('Initialisation');
        // getDensite(version, true, dateMep);
        // if (viaButton) {
        //     \$('.events')[0].innerHTML = result.timeline;
        //     initTimeline(timelines, true);
        // }
        // calculNbClients();
      }
    });
    getAgents();
  }

  function getAgents() {
    \$.ajax({
      dataType: \"json\",
      url: \"/agents/domicile\",
      success: function success(data) {
        console.info(data); //geojsonAgents = JSON.parse(data);

        data.forEach(function (agent) {
          var point = [0, 0];

          if (agent.coordonnees != null) {
            point = [agent.coordonnees.latitude, agent.coordonnees.longitude];
          }

          var marker = L.marker(point, {
            radius: 6,
            fillColor: \"#28529a\",
            color: \"#fff\",
            weight: 1,
            opacity: 1,
            fillOpacity: 1,
            // codeAgent: agent.properties.codeAgent,
            // codeGroupe: feature.properties.codeGroupe,
            // detailAgent: feature.properties.popupContent,
            icon: circleIcon
          }).addTo(mapSecto);
          marker.bindPopup(agent.nomComplet);
          agents.addLayer(marker);
        }); // agents = L.geoJSON(data, {
        //     pointToLayer: function (feature, latlng) {
        //         return L.marker(latlng, {
        //             radius: 6,
        //             fillColor: \"#28529a\",
        //             color: \"#fff\",
        //             weight: 1,
        //             opacity: 1,
        //             fillOpacity: 1,
        //             codeAgent: feature.properties.codeAgent,
        //             codeGroupe: feature.properties.codeGroupe,
        //             detailAgent: feature.properties.popupContent,
        //             icon: circleIcon
        //         });
        //     },
        //     onEachFeature: function (feature, layer) {
        //         if (feature.properties && feature.properties.popupContent) {
        //             layer.bindPopup(feature.properties.popupContent);
        //         }
        //     }
        // }).addTo(map);
      }
    });
  }

  function getBigPolygon(type, version) {
    // if (!version) {
    //     var json = '{\"type\": \"FeatureCollection\",\"features\": [';
    //     var features = \"\";
    //     map.eachLayer(function (layer) {
    //         if (layer.options && layer.options.id) {
    //             features += JSON.stringify(layerToJSON(layer)) + \",\";
    //         }
    //     });
    //     version = json + features.slice(0, -1) + ']}';
    // }
    \$.ajax({
      method: 'POST',
      dataType: \"json\",
      url: \"";
        // line 7061
        yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("get_big_polygon"), "js", null, true);
        yield "\",
      data: JSON.stringify({
        type: type,
        secteurs: version
      }),
      success: function success(data) {
        data = JSON.parse(data);
        bigPolygon = L.GeoJSON.geometryToLayer(JSON.parse(data.bigPolygon), options.pointToLayer, options.coordsToLatLng);
        guideLayers.splice(0, guideLayers.length);
        guideLayers.push(bigPolygon);

        if (data.bigPolygonAntennes != '') {
          map.removeLayer(antennesGlobal);
          map.removeLayer(antennes);
          antennesGlobal = new L.FeatureGroup();
          antennes = new L.FeatureGroup();
          bigPolygonAntennes = L.GeoJSON.geometryToLayer(JSON.parse(data.bigPolygonAntennes), options.pointToLayer, options.coordsToLatLng);
          guideLayers.push(bigPolygonAntennes);

          for (var i = 0; i < data.antennes.length; i++) {
            antennes.addLayer(L.GeoJSON.geometryToLayer(JSON.parse(data.antennes[i]['secteur'])), options.pointToLayer, options.coordsToLatLng);
          }

          antennesGlobal.addLayer(bigPolygonAntennes);
          antennesGlobal.addTo(map);
          antennes.addTo(map);
          antennes.eachLayer(function (layer) {
            layer.options.antenne = true, layer.setStyle({
              opacity: '0',
              fillOpacity: '0'
            });
          });
          antennesGlobal.eachLayer(function (layer) {
            layer.setStyle({
              color: 'gray',
              weight: 2,
              fillColor: 'gray',
              className: 'polygonAntennes'
            });
          }); //pour passer les antennes au second plan et ne pas bloquer l'action du clic sur un secteur

          var svg = document.querySelector(\"svg.leaflet-zoom-animated g\"); //var pathAntennes = document.querySelector(\".polygonAntennes\");

          var pathAntennes = document.getElementsByClassName(\"polygonAntennes\");

          for (var i = 0; i < pathAntennes.length; i++) {
            svg.removeChild(pathAntennes[i]);
            svg.prepend(pathAntennes[i]);
          }
        } // if (agents == '') {
        //     getAgents();
        // }
        // if (type == 'local') {
        //     hideLoadModal();
        // }

      }
    });
  }

  function getStyle(codeGroupe) {
    var options = {
      fillOpacity: 0.2,
      color: colorWithoutAgent,
      weight: 2,
      fillColor: fillColorWithoutAgent
    };

    if (codeGroupe != '') {
      options = {
        fillOpacity: 0.2,
        color: colorWithAgent,
        weight: 2,
        fillColor: colors[codeGroupe]
      };
    }

    return options;
  }

  function bindTooltipNbClients(secteur, polygon) {
    polygon.bindTooltip(secteur.nbEquipement.nb_total + \" clients\", {
      permanent: true,
      direction: \"center\"
    }).closeTooltip(); // var countClients = getCountClients(options);
    // if (countClients != 0) {
    //     layer.bindTooltip(countClients + \" clients\",
    //         {permanent: true, direction: \"center\"}
    //     ).closeTooltip();
    // } else {
    //     layer.bindTooltip(options['nbClients'] + \" clients\",
    //         {permanent: true, direction: \"center\"}
    //     ).closeTooltip();
    // }
  }

  function initEvenementLayer(polygon) {
    // polygon.on('click', function (event) {
    //     if (\$('#explainMe').hasClass('distance')) {
    //         \$('#explainMe').hide();
    //         \$('#explainMe').removeClass('distance');
    //     }
    //     map.eachLayer(function (layer) {
    //         if (layer instanceof L.Polygon) {
    //             if (layer.options && layer.options.id != polygon.options.id) {
    //                 layer.options.openToolbar = false;
    //             }
    //             if(!layer.options.antenne) {
    //                 layer.setStyle({fillOpacity: '0.2', fill: 'url()'});
    //             }
    //         }
    //     });
    //     agents.eachLayer(function (layer) {
    //         layer.setIcon(circleIcon);
    //     });
    //     console.info('popup');
    //     if (polygon.options && !polygon.options.openToolbar) {
    //         if (!fusion) {
    //             polygon.setStyle({fillOpacity: '0.6'});
    //             new LeafletToolbar.EditToolbar.Popup(event.latlng, {
    //                 actions: editActions
    //             }).addTo(map, polygon);
    //             polygon.options.openToolbar = true;
    //             \$('#legende p#texte')[0].innerHTML = (polygon.options.nomSecteur ? polygon.options.nomSecteur : 'Secteur ' + polygon.options.id) + \"<br/>\";
    //             \$('#legende p#texte')[0].innerHTML += 'La superficie du secteur est : ' + L.GeometryUtil.readableArea(L.GeometryUtil.geodesicArea(polygon.getLatLngs()[0]), 'km') + '.<br/>';
    //             if (polygon.options.codeAgent) {
    //                 agents.eachLayer(function (layer) {
    //                     if (layer.options.codeAgent == polygon.options.suppleant1 || layer.options.codeAgent == polygon.options.suppleant2 || layer.options.codeAgent == polygon.options.suppleant3 || layer.options.codeAgent == polygon.options.suppleant4) {
    //                         //layer.setStyle({fillColor: '#666'});
    //                     }
    //                     if (layer.options.codeAgent == polygon.options.codeAgent) {
    //                         layer.setIcon(homeIcon);
    //                         // \$('#legende p#texte')[0].innerHTML += 'Il y a ' + (Math.round(polygon.getBounds().getCenter().distanceTo(layer.getLatLng())) / 1000) + ' Kms entre l\\'agent ' + polygon.options.codeAgent + ' et le centre du secteur ' + polygon.options.id + '.';
    //                         Gp.Services.route({
    //                             startPoint: {
    //                                 x: polygon.getBounds().getCenter().lng,
    //                                 y: polygon.getBounds().getCenter().lat
    //                             },
    //                             endPoint: {
    //                                 x: layer.getLatLng().lng,
    //                                 y: layer.getLatLng().lat
    //                             },
    //                             graph: 'Voiture',
    //                             avoidFeature: [],
    //                             routePreference: 'fastest',
    //                             apiKey: \"choisirgeoportail\",
    //                             onSuccess: function (result) {
    //                                 \$('#legende p#texte')[0].innerHTML += 'Il y a ' + result['totalDistance'] + 's entre l\\'agent ' + polygon.options.codeAgent + ' et le centre du secteur ' + polygon.options.id + '.';
    //
    //                             },
    //                             onFailure: function (error) {
    //                                 console.info(error);
    //                             }
    //                         });
    //                     }
    //                 });
    //             }
    //             \$('#explainMe').addClass('distance');
    //             \$('#explainMe').show();
    //         }
    //     } else {
    //         if (map._toolbars && map._toolbars[4]) {
    //             map.removeLayer(map._layers[map._toolbars[4]._leaflet_id]);
    //         }
    //         polygon.options.openToolbar = false;
    //     }
    // });
    //
    // // \$(\"body\").on('click',\"#table_clients tr\", function () {
    // polygon.on('draw-popup:edited', function (e) {
    //     hideFunctions();
    //     modification = true;
    //     drawPopupEdited(this);
    // });
    //
    // polygon.on('editstart', function (e) {
    //     console.info('editstart');
    //     console.info(e);
    // });
    // polygon.on('editstop', function (e) {
    //     showFunctions();
    //     modification = false;
    //     console.info('editstop');
    //     addHisto('Le secteur ' + (this.options.nomSecteur ? this.options.nomSecteur : this.options.id) + ' a été modifié.');
    //     getBigPolygon('local');
    //
    //     //initAgentsOfSecteurs('');
    // });
    polygon.on('mouseover mouseout', function (e) {
      polygon.toggleTooltip();
    });
  }

  function bindElements(flag, layers) {
    if (flag) {
      mapSecto.removeLayer(layers);
    } else {
      mapSecto.addLayer(layers);
    }

    return !flag;
  } // function getCountClients(options) {
  //     var fields = ['famille0', 'famille1', 'famille2', 'famille3'];
  //     var filtreFamille = \$('#table_clients').bootstrapTable('getVisibleColumns').map(function (it) {
  //         return it.field;
  //     });
  //     var countClients = 0;
  //     for (var i in filtreFamille) {
  //         if (fields.indexOf(filtreFamille[i]) != -1) {
  //             countClients += parseInt(options[filtreFamille[i]]);
  //         }
  //     }
  //     return countClients;
  // }

  /*FIN FONCTIONS*/

});

/***/ }),

/***/ \"./assets/styles/sectorisation.css\":
/*!*****************************************!*\\
  !*** ./assets/styles/sectorisation.css ***!
  \\*****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

\"use strict\";
__webpack_require__.r(__webpack_exports__);
// extracted by mini-css-extract-plugin


/***/ }),

/***/ \"./assets/styles/timeline.css\":
/*!************************************!*\\
  !*** ./assets/styles/timeline.css ***!
  \\************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

\"use strict\";
__webpack_require__.r(__webpack_exports__);
// extracted by mini-css-extract-plugin


/***/ })

},
/******/ __webpack_require__ => { // webpackRuntimeModules
/******/ \"use strict\";
/******/ 
/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
/******/ __webpack_require__.O(0, [\"vendors-node_modules_core-js_internals_engine-user-agent_js-node_modules_core-js_internals_ex-b41e05\",\"vendors-node_modules_jquery_dist_jquery_js\",\"vendors-node_modules_core-js_internals_add-to-unscopables_js-node_modules_core-js_internals_a-5c631b\",\"vendors-node_modules_core-js_internals_array-method-has-species-support_js-node_modules_core--4e4faa\",\"vendors-node_modules_core-js_internals_function-bind_js-node_modules_core-js_modules_es_array-1797b9\",\"vendors-node_modules_bootstrap-table_dist_bootstrap-table-locale-all_min_js-node_modules_boot-3f0fd0\"], () => (__webpack_exec__(\"./assets/js/sectorisation.js\")));
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvanMvbWFwL2xlYWZsZXQtc2VhcmNoLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9qcy9tYXAvbGVhZmxldC5kcmF3LWN1c3RvbS5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvanMvc2VjdG9yaXNhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3R5bGVzL3NlY3RvcmlzYXRpb24uY3NzP2E1NTgiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3N0eWxlcy90aW1lbGluZS5jc3M/Y2Q3ZiJdLCJuYW1lcyI6WyJmYWN0b3J5IiwiZGVmaW5lIiwiTCIsIkNvbnRyb2wiLCJTZWFyY2giLCJleHRlbmQiLCJpbmNsdWRlcyIsInZlcnNpb24iLCJFdmVudGVkIiwicHJvdG90eXBlIiwiTWl4aW4iLCJFdmVudHMiLCJvcHRpb25zIiwidXJsIiwibGF5ZXIiLCJzb3VyY2VEYXRhIiwianNvbnBQYXJhbSIsInByb3BlcnR5TG9jIiwicHJvcGVydHlOYW1lIiwiZm9ybWF0RGF0YSIsImZpbHRlckRhdGEiLCJtb3ZlVG9Mb2NhdGlvbiIsImJ1aWxkVGlwIiwiY29udGFpbmVyIiwiem9vbSIsIm1pbkxlbmd0aCIsImluaXRpYWwiLCJjYXNlc2Vuc2l0aXZlIiwiYXV0b1R5cGUiLCJkZWxheVR5cGUiLCJ0b29sdGlwTGltaXQiLCJ0aXBBdXRvU3VibWl0IiwiZmlyc3RUaXBTdWJtaXQiLCJhdXRvUmVzaXplIiwiY29sbGFwc2VkIiwiYXV0b0NvbGxhcHNlIiwiYXV0b0NvbGxhcHNlVGltZSIsInRleHRFcnIiLCJ0ZXh0Q2FuY2VsIiwidGV4dFBsYWNlaG9sZGVyIiwiaGlkZU1hcmtlck9uQ29sbGFwc2UiLCJwb3NpdGlvbiIsIm1hcmtlciIsImljb24iLCJhbmltYXRlIiwiY2lyY2xlIiwicmFkaXVzIiwid2VpZ2h0IiwiY29sb3IiLCJzdHJva2UiLCJmaWxsIiwiX2dldFBhdGgiLCJvYmoiLCJwcm9wIiwicGFydHMiLCJzcGxpdCIsImxhc3QiLCJwb3AiLCJsZW4iLCJsZW5ndGgiLCJjdXIiLCJpIiwiX2lzT2JqZWN0IiwiT2JqZWN0IiwidG9TdHJpbmciLCJjYWxsIiwiaW5pdGlhbGl6ZSIsIlV0aWwiLCJzZXRPcHRpb25zIiwiX2lucHV0TWluU2l6ZSIsIl9sYXllciIsIkxheWVyR3JvdXAiLCJfZmlsdGVyRGF0YSIsIl9kZWZhdWx0RmlsdGVyRGF0YSIsIl9mb3JtYXREYXRhIiwiX2RlZmF1bHRGb3JtYXREYXRhIiwiX21vdmVUb0xvY2F0aW9uIiwiX2RlZmF1bHRNb3ZlVG9Mb2NhdGlvbiIsIl9hdXRvVHlwZVRtcCIsIl9jb3VudGVydGlwcyIsIl9yZWNvcmRzQ2FjaGUiLCJfY3VyUmVxIiwib25BZGQiLCJtYXAiLCJfbWFwIiwiX2NvbnRhaW5lciIsIkRvbVV0aWwiLCJjcmVhdGUiLCJfaW5wdXQiLCJfY3JlYXRlSW5wdXQiLCJfdG9vbHRpcCIsIl9jcmVhdGVUb29sdGlwIiwiX2NhbmNlbCIsIl9jcmVhdGVDYW5jZWwiLCJfYnV0dG9uIiwiX2NyZWF0ZUJ1dHRvbiIsIl9hbGVydCIsIl9jcmVhdGVBbGVydCIsImV4cGFuZCIsIk1hcmtlciIsIkNpcmNsZU1hcmtlciIsIl9tYXJrZXJTZWFyY2giLCJfaXNNYXJrZXJTZWFyY2giLCJzZXRMYXllciIsIm9uIiwiX2hhbmRsZUF1dG9yZXNpemUiLCJhZGRUbyIsIl93cmFwcGVyIiwiZ2V0Iiwic3R5bGUiLCJhcHBlbmRDaGlsZCIsIm9uUmVtb3ZlIiwib2ZmIiwic2hvd0FsZXJ0IiwidGV4dCIsInNlbGYiLCJkaXNwbGF5IiwiaW5uZXJIVE1MIiwiY2xlYXJUaW1lb3V0IiwidGltZXJBbGVydCIsInNldFRpbWVvdXQiLCJoaWRlQWxlcnQiLCJjYW5jZWwiLCJ2YWx1ZSIsIl9oYW5kbGVLZXlwcmVzcyIsImtleUNvZGUiLCJzaXplIiwiZm9jdXMiLCJfaGlkZVRvb2x0aXAiLCJmaXJlIiwidG9nZ2xlIiwiYWRkQ2xhc3MiLCJjb2xsYXBzZSIsImJsdXIiLCJyZW1vdmVDbGFzcyIsInJlbW92ZUxheWVyIiwiY29sbGFwc2VEZWxheWVkIiwidGltZXJDb2xsYXBzZSIsImNvbGxhcHNlRGVsYXllZFN0b3AiLCJjbGFzc05hbWUiLCJhbGVydCIsIkRvbUV2ZW50Iiwic3RvcCIsImxhYmVsIiwiaW5wdXQiLCJ0eXBlIiwiYXV0b2NvbXBsZXRlIiwiYXV0b2NvcnJlY3QiLCJhdXRvY2FwaXRhbGl6ZSIsInBsYWNlaG9sZGVyIiwicm9sZSIsImlkIiwiaHRtbEZvciIsImRpc2FibGVDbGlja1Byb3BhZ2F0aW9uIiwiZSIsInRpdGxlIiwiaHJlZiIsImJ1dHRvbiIsIl9oYW5kbGVTdWJtaXQiLCJ0b29sIiwic3RvcFByb3BhZ2F0aW9uIiwiX2NyZWF0ZVRpcCIsInZhbCIsInRpcCIsInRtcE5vZGUiLCJmaXJzdENoaWxkIiwiX3RleHQiLCJfZ2V0VXJsIiwicmVjb3JkcyIsIkkiLCJpY2FzZSIsInJlZ1NlYXJjaCIsImZyZWNvcmRzIiwicmVwbGFjZSIsInVuZGVmaW5lZCIsIlJlZ0V4cCIsImtleSIsInRlc3QiLCJzaG93VG9vbHRpcCIsImN1cnJlbnRTZWxlY3Rpb24iLCJfYXV0b1R5cGUiLCJzY3JvbGxUb3AiLCJqc29uIiwicHJvcE5hbWUiLCJwcm9wTG9jIiwianNvbnJldCIsImlzQXJyYXkiLCJsYXRMbmciLCJfcmVjb3Jkc0Zyb21Kc29ucCIsImNhbGxBZnRlciIsImNhbGxKc29ucCIsInNjcmlwdCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJ0ZW1wbGF0ZSIsInMiLCJzcmMiLCJhYm9ydCIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsIl9yZWNvcmRzRnJvbUFqYXgiLCJ3aW5kb3ciLCJYTUxIdHRwUmVxdWVzdCIsIkFjdGl2ZVhPYmplY3QiLCJlMSIsImUyIiwiRXJyb3IiLCJJRThvcjkiLCJCcm93c2VyIiwiaWUiLCJhdG9iIiwicXVlcnlTZWxlY3RvciIsInJlcXVlc3QiLCJYRG9tYWluUmVxdWVzdCIsIm9wZW4iLCJvbmxvYWQiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwic3RhdHVzIiwic2VuZCIsIl9zZWFyY2hJbkxheWVyIiwicmV0UmVjb3JkcyIsImxvYyIsImdldExhdExuZyIsImZlYXR1cmUiLCJwcm9wZXJ0aWVzIiwiY29uc29sZSIsIndhcm4iLCJQYXRoIiwiUG9seWxpbmUiLCJQb2x5Z29uIiwiZ2V0Qm91bmRzIiwiZ2V0Q2VudGVyIiwiaGFzT3duUHJvcGVydHkiLCJlYWNoTGF5ZXIiLCJfcmVjb3Jkc0Zyb21MYXllciIsInN0YXJ0IiwiZmlyc3RSZWNvcmQiLCJlbmQiLCJpbmRleE9mIiwiY3JlYXRlVGV4dFJhbmdlIiwic2VsUmFuZ2UiLCJtb3ZlU3RhcnQiLCJtb3ZlRW5kIiwic2VsZWN0Iiwic2V0U2VsZWN0aW9uUmFuZ2UiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsIl9oaWRlQXV0b1R5cGUiLCJzZWwiLCJzZWxlY3Rpb24iLCJlbXB0eSIsImdldFNlbGVjdGlvbiIsInJlbW92ZUFsbFJhbmdlcyIsIl9oYW5kbGVBcnJvd1NlbGVjdCIsInRpbWVyS2V5cHJlc3MiLCJfZmlsbFJlY29yZHNDYWNoZSIsInNlYXJjaFRleHQiLCJjb2RlIiwiY2hhckNvZGVBdCIsImlucHV0VGV4dCIsIl9yZXRyaWV2ZURhdGEiLCJkYXRhIiwibWF4V2lkdGgiLCJvZmZzZXRXaWR0aCIsImNsaWVudFdpZHRoIiwidmVsb2NpdHkiLCJzZWFyY2hUaXBzIiwiaGFzQ2hpbGROb2RlcyIsImNoaWxkTm9kZXMiLCJ0aXBPZmZzZXRUb3AiLCJvZmZzZXRUb3AiLCJjbGllbnRIZWlnaHQiLCJfZ2V0TG9jYXRpb24iLCJzaG93TG9jYXRpb24iLCJsYXRsbmciLCJzZXRWaWV3IiwicGFuVG8iLCJvbmNlIiwic2V0TGF0TG5nIiwiSWNvbiIsIkRlZmF1bHQiLCJfY2lyY2xlTG9jIiwiYWRkTGF5ZXIiLCJfaW5pdEljb24iLCJfcmVtb3ZlSWNvbiIsInRJbnQiLCJzcyIsIm1yIiwicGFyc2VJbnQiLCJfcmFkaXVzIiwib2xkcmFkIiwibmV3cmFkIiwiYWNjIiwiX3RpbWVyQW5pbUxvYyIsInNldEludGVydmFsIiwic2V0UmFkaXVzIiwiY2xlYXJJbnRlcnZhbCIsIk1hcCIsImFkZEluaXRIb29rIiwic2VhcmNoQ29udHJvbCIsImNvbnRyb2wiLCJzZWFyY2giLCJhZGRDb250cm9sIiwiZHJhd1ZlcnNpb24iLCJEcmF3IiwiZHJhd0xvY2FsIiwiZHJhdyIsInRvb2xiYXIiLCJhY3Rpb25zIiwiZmluaXNoIiwidW5kbyIsImJ1dHRvbnMiLCJwb2x5bGluZSIsInBvbHlnb24iLCJyZWN0YW5nbGUiLCJjaXJjbGVtYXJrZXIiLCJoYW5kbGVycyIsInRvb2x0aXAiLCJjb250IiwiZXJyb3IiLCJzaW1wbGVzaGFwZSIsImVkaXQiLCJzYXZlIiwiY2xlYXJBbGwiLCJlZGl0RGlzYWJsZWQiLCJyZW1vdmUiLCJyZW1vdmVEaXNhYmxlZCIsInN1YnRleHQiLCJFdmVudCIsIkNSRUFURUQiLCJFRElURUQiLCJERUxFVEVEIiwiRFJBV1NUQVJUIiwiRFJBV1NUT1AiLCJEUkFXVkVSVEVYIiwiRURJVFNUQVJUIiwiRURJVE1PVkUiLCJFRElUUkVTSVpFIiwiRURJVFZFUlRFWCIsIkVESVRTVE9QIiwiREVMRVRFU1RBUlQiLCJERUxFVEVTVE9QIiwiRmVhdHVyZSIsIkhhbmRsZXIiLCJfb3ZlcmxheVBhbmUiLCJfcGFuZXMiLCJvdmVybGF5UGFuZSIsIl9wb3B1cFBhbmUiLCJwb3B1cFBhbmUiLCJzaGFwZU9wdGlvbnMiLCJlbmFibGUiLCJfZW5hYmxlZCIsImhhbmRsZXIiLCJsYXllclR5cGUiLCJkaXNhYmxlIiwiYWRkSG9va3MiLCJkaXNhYmxlVGV4dFNlbGVjdGlvbiIsImdldENvbnRhaW5lciIsIlRvb2x0aXAiLCJfY2FuY2VsRHJhd2luZyIsInJlbW92ZUhvb2tzIiwiZW5hYmxlVGV4dFNlbGVjdGlvbiIsImRpc3Bvc2UiLCJfZmlyZUNyZWF0ZWRFdmVudCIsInN0YXRpY3MiLCJUWVBFIiwiUG9seSIsImFsbG93SW50ZXJzZWN0aW9uIiwicmVwZWF0TW9kZSIsImRyYXdFcnJvciIsInRpbWVvdXQiLCJEaXZJY29uIiwiaWNvblNpemUiLCJQb2ludCIsInRvdWNoSWNvbiIsImd1aWRlbGluZURpc3RhbmNlIiwibWF4R3VpZGVMaW5lTGVuZ3RoIiwib3BhY2l0eSIsImNsaWNrYWJsZSIsIm1ldHJpYyIsImZlZXQiLCJuYXV0aWMiLCJzaG93TGVuZ3RoIiwiekluZGV4T2Zmc2V0IiwiZmFjdG9yIiwidG91Y2giLCJtZXNzYWdlIiwiX21hcmtlcnMiLCJfbWFya2VyR3JvdXAiLCJfcG9seSIsInVwZGF0ZUNvbnRlbnQiLCJfZ2V0VG9vbHRpcFRleHQiLCJfbW91c2VNYXJrZXIiLCJkaXZJY29uIiwiaWNvbkFuY2hvciIsIl9vbk1vdXNlT3V0IiwiX29uTW91c2VNb3ZlIiwiX29uTW91c2VEb3duIiwiX29uTW91c2VVcCIsIl9vblpvb21FbmQiLCJfb25Ub3VjaCIsIl9jbGVhckhpZGVFcnJvclRpbWVvdXQiLCJfY2xlYW5VcFNoYXBlIiwiX2NsZWFyR3VpZGVzIiwiZGVsZXRlTGFzdFZlcnRleCIsImxhc3RNYXJrZXIiLCJwb2x5IiwibGF0bG5ncyIsImdldExhdExuZ3MiLCJzcGxpY2UiLCJzZXRMYXRMbmdzIiwiX3ZlcnRleENoYW5nZWQiLCJpc01hcmtlckluc2lkZVBvbHlnb24iLCJpbnNpZGUiLCJ4IiwibGF0IiwieSIsImxuZyIsImlpIiwicG9seVBvaW50cyIsImoiLCJ4aSIsInlpIiwieGoiLCJ5aiIsImludGVyc2VjdCIsImFkZFZlcnRleCIsInNhbWUiLCJtYXJrZXJzTGVuZ3RoIiwiaW5Qb2x5Z29uIiwicG9pbnRTbmFwIiwibGF0TG5nVGVzdCIsImxhc3RMYXRMbmciLCJsaW5lSW5Qb2x5Z29uIiwibGFzdExpbmUiLCJuZXdMYXRMbmdJbnRlcnNlY3RzIiwiX3Nob3dFcnJvclRvb2x0aXAiLCJfZXJyb3JTaG93biIsIl9oaWRlRXJyb3JUb29sdGlwIiwicHVzaCIsIl9jcmVhdGVNYXJrZXIiLCJhZGRMYXRMbmciLCJndWlkZUxheWVycyIsIl9zbmFwcGVyIiwiX2d1aWRlcyIsIl9sYXRsbmdzIiwiayIsIl9sYXRsbmciLCJsIiwiY29tcGxldGVTaGFwZSIsImlzX2luX3BvbHlnb24iLCIkdmVydGljZXNfeCIsIiR2ZXJ0aWNlc195IiwicG9pbnQiLCIkYyIsIiRpIiwiJGoiLCIkbG9uZ2l0dWRlX3giLCIkbGF0aXR1ZGVfeSIsInBvaW50T25Qb2x5Z29uIiwicG9seUJvdW5kcyIsImNvbnRhaW5zIiwibGF0TG5nUG9seSIsImxlbmdodCIsImxpbmUiLCJwb2x5TGluZUJvdW5kcyIsIm1hcmtlclBvbHkiLCJNYXRoIiwiY2VpbCIsImVkaXRpbmciLCJyZWRyYXciLCJyb3VuZCIsIm51bSIsIkdlb21ldHJ5VXRpbCIsImludGVycG9sYXRlT25MaW5lIiwidGFiT25Qb2x5IiwiYmVmb3JlIiwiYWZ0ZXIiLCJlcXVhbHMiLCJfZmluaXNoU2hhcGUiLCJpbmZvIiwiX2RlZmF1bHRTaGFwZSIsImludGVyc2VjdHMiLCJfc2hhcGVJc1ZhbGlkIiwiX3VwZGF0ZUd1aWRlIiwibmV3UG9zIiwibW91c2VFdmVudFRvTGF5ZXJQb2ludCIsIm9yaWdpbmFsRXZlbnQiLCJsYXllclBvaW50VG9MYXRMbmciLCJfY3VycmVudExhdExuZyIsIl91cGRhdGVUb29sdGlwIiwicHJldmVudERlZmF1bHQiLCJhZGRlZCIsImxheWVycyIsIl91cGRhdGVGaW5pc2hIYW5kbGVyIiwiX3VwZGF0ZVJ1bm5pbmdNZWFzdXJlIiwiX2NsaWNrSGFuZGxlZCIsIl90b3VjaEhhbmRsZWQiLCJfZGlzYWJsZU1hcmtlcnMiLCJfZGlzYWJsZU5ld01hcmtlcnMiLCJjbGllbnRYIiwiY2xpZW50WSIsIl9zdGFydFBvaW50IiwiX21vdXNlRG93bk9yaWdpbiIsIl9lbmRQb2ludCIsImRyYWdDaGVja0Rpc3RhbmNlIiwiZGlzdGFuY2VUbyIsImxhc3RQdERpc3RhbmNlIiwiX2NhbGN1bGF0ZUZpbmlzaERpc3RhbmNlIiwiYWJzIiwiZGV2aWNlUGl4ZWxSYXRpbyIsIl9lbmFibGVOZXdNYXJrZXJzIiwidG91Y2hlcyIsInBvdGVudGlhbExhdExuZyIsImZpbmlzaE1hcmtlciIsIkluZmluaXR5IiwibGFzdE1hcmtlclBvaW50IiwibGF0TG5nVG9Db250YWluZXJQb2ludCIsInBvdGVudGlhbE1hcmtlciIsInBvdGVudGlhbE1hcmtlclBpbnQiLCJtYXJrZXJDb3VudCIsImxhdExuZ1RvTGF5ZXJQb2ludCIsIl9kcmF3R3VpZGUiLCJ1cGRhdGVQb3NpdGlvbiIsInBvaW50QSIsInBvaW50QiIsImZsb29yIiwic3FydCIsInBvdyIsImZyYWN0aW9uIiwiZGFzaFBvaW50IiwiZGFzaCIsIl9ndWlkZXNDb250YWluZXIiLCJiYWNrZ3JvdW5kQ29sb3IiLCJzZXRQb3NpdGlvbiIsIl91cGRhdGVHdWlkZUNvbG9yIiwibGFiZWxUZXh0IiwiZGlzdGFuY2VTdHIiLCJfZ2V0TWVhc3VyZW1lbnRTdHJpbmciLCJwcmV2aW91c01hcmtlckluZGV4IiwiZGlzdGFuY2UiLCJfbWVhc3VyZW1lbnRSdW5uaW5nVG90YWwiLCJjdXJyZW50TGF0TG5nIiwicHJldmlvdXNMYXRMbmciLCJyZWFkYWJsZURpc3RhbmNlIiwicHJlY2lzaW9uIiwic2hvd0FzRXJyb3IiLCJzZXRTdHlsZSIsIl9oaWRlRXJyb3JUaW1lb3V0IiwiYmluZCIsInJlbW92ZUVycm9yIiwic2hvd0FyZWEiLCJmaWxsQ29sb3IiLCJmaWxsT3BhY2l0eSIsImFyZWEiLCJfYXJlYSIsIm1lYXN1cmVtZW50U3RyaW5nIiwicmVhZGFibGVBcmVhIiwibGF0TG5ncyIsImdlb2Rlc2ljQXJlYSIsIlNpbXBsZVNoYXBlIiwiX2VuZExhYmVsVGV4dCIsIl9tYXBEcmFnZ2FibGUiLCJkcmFnZ2luZyIsImVuYWJsZWQiLCJjdXJzb3IiLCJfaW5pdGlhbExhYmVsVGV4dCIsIl9zaGFwZSIsIl9pc0RyYXdpbmciLCJfc3RhcnRMYXRMbmciLCJfZHJhd1NoYXBlIiwiUmVjdGFuZ2xlIiwiX2lzQ3VycmVudGx5VHdvQ2xpY2tEcmF3aW5nIiwiX2hhc0FuY2VzdG9yIiwidGFyZ2V0IiwiTGF0TG5nQm91bmRzIiwic2V0Qm91bmRzIiwidG9vbHRpcFRleHQiLCJzaGFwZSIsImVsIiwiY2xzIiwicGFyZW50RWxlbWVudCIsImNsYXNzTGlzdCIsIl9vbkNsaWNrIiwiX21hcmtlciIsIlRvdWNoIiwiY2lyY2xlTWFya2VyIiwiQ2lyY2xlIiwic2hvd1JhZGl1cyIsImdldFJhZGl1cyIsInVzZU1ldHJpYyIsInRvRml4ZWQiLCJFZGl0IiwiX29uRHJhZ0VuZCIsIl90b2dnbGVNYXJrZXJIaWdobGlnaHQiLCJlZGl0ZWQiLCJfaWNvbiIsImhhc0NsYXNzIiwiX29mZnNldE1hcmtlciIsIm9mZnNldCIsImljb25NYXJnaW5Ub3AiLCJtYXJnaW5Ub3AiLCJpY29uTWFyZ2luTGVmdCIsIm1hcmdpbkxlZnQiLCJlZGl0YWJsZSIsIl9ob2xlcyIsImNvbmNhdCIsIl91cGRhdGVMYXRMbmdzIiwiX2ZsYXQiLCJfZWFjaFZlcnRleEhhbmRsZXIiLCJjYWxsYmFjayIsIl92ZXJ0aWNlc0hhbmRsZXJzIiwiX2luaXRIYW5kbGVycyIsInVwZGF0ZU1hcmtlcnMiLCJQb2x5VmVydGljZXNFZGl0IiwiX2luaXRNYXJrZXJzIiwib3JpZ2luYWwiLCJjbGVhckxheWVycyIsIm1hcmtlckxlZnQiLCJtYXJrZXJSaWdodCIsIl9jcmVhdGVNaWRkbGVNYXJrZXIiLCJfdXBkYXRlUHJldk5leHQiLCJpbmRleCIsImRyYWdnYWJsZSIsIl9vcmlnTGF0TG5nIiwiX2luZGV4IiwiX29uTWFya2VyRHJhZ1N0YXJ0IiwiX29uTWFya2VyRHJhZyIsIl9maXJlRWRpdCIsIl9vblRvdWNoTW92ZSIsIl9zcGxpY2VMYXRMbmdzIiwicmVtb3ZlZCIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2NvbnZlcnRMYXRMbmdzIiwiX3JlbW92ZU1hcmtlciIsIl91cGRhdGVJbmRleGVzIiwiX21pZGRsZUxlZnQiLCJfZ2V0TWlkZGxlTGF0TG5nIiwiX3ByZXYiLCJfbWlkZGxlUmlnaHQiLCJfbmV4dCIsInRhYkxhdExuZ3MiLCJfb25NYXJrZXJDbGljayIsIm1pblBvaW50cyIsImxheWVyUG9pbnQiLCJkZWx0YSIsIm1hcmtlcjEiLCJtYXJrZXIyIiwib25DbGljayIsIm9uRHJhZ1N0YXJ0Iiwib25EcmFnRW5kIiwic2V0T3BhY2l0eSIsInAxIiwicHJvamVjdCIsInAyIiwidW5wcm9qZWN0IiwiX2FkZCIsIl9kaXZpZGVCeSIsIm1vdmVJY29uIiwicmVzaXplSWNvbiIsInRvdWNoTW92ZUljb24iLCJ0b3VjaFJlc2l6ZUljb24iLCJfdW5iaW5kTWFya2VyIiwiX21vdmVNYXJrZXIiLCJfcmVzaXplTWFya2VycyIsIl9jcmVhdGVNb3ZlTWFya2VyIiwiX2NyZWF0ZVJlc2l6ZU1hcmtlciIsIl9iaW5kTWFya2VyIiwiX29uTWFya2VyRHJhZ0VuZCIsIl9vblRvdWNoU3RhcnQiLCJfb25Ub3VjaEVuZCIsIl9tb3ZlIiwiX3Jlc2l6ZSIsIl9nZXRDb3JuZXJzIiwiY29ybmVycyIsImN1cnJlbnRDb3JuZXJJbmRleCIsIl9jb3JuZXJJbmRleCIsIl9vcHBvc2l0ZUNvcm5lciIsIl90b2dnbGVDb3JuZXJNYXJrZXJzIiwiYm91bmRzIiwiY2VudGVyIiwiX3JlcG9zaXRpb25Db3JuZXJNYXJrZXJzIiwibmV3Q2VudGVyIiwibmV3TGF0TG5ncyIsImxhdExuZ0JvdW5kcyIsIm53IiwiZ2V0Tm9ydGhXZXN0IiwibmUiLCJnZXROb3J0aEVhc3QiLCJzZSIsImdldFNvdXRoRWFzdCIsInN3IiwiZ2V0U291dGhXZXN0IiwicmVzaXplbWFya2VyUG9pbnQiLCJfZ2V0UmVzaXplTWFya2VyUG9pbnQiLCJjb3MiLCJQSSIsIm1vdmVMYXRMbmciLCJtZXJnZU9wdGlvbnMiLCJ0b3VjaEV4dGVuZCIsIlRvdWNoRXh0ZW5kIiwiX3BhbmUiLCJfZGV0ZWN0SUUiLCJfb25Ub3VjaENhbmNlbCIsIl9vblRvdWNoTGVhdmUiLCJfdG91Y2hFdmVudCIsInRvdWNoRXZlbnQiLCJwb2ludGVyVHlwZSIsIl9maWx0ZXJDbGljayIsImNvbnRhaW5lclBvaW50IiwibW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQiLCJwYWdlWCIsInBhZ2VZIiwidGltZVN0YW1wIiwiZWxhcHNlZCIsIl9sYXN0Q2xpY2siLCJfc2ltdWxhdGVkQ2xpY2siLCJfc2ltdWxhdGVkIiwiX2xvYWRlZCIsInVhIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwibXNpZSIsInN1YnN0cmluZyIsInRyaWRlbnQiLCJydiIsImVkZ2UiLCJfaW5pdEludGVyYWN0aW9uIiwiYWRkSW50ZXJhY3RpdmVUYXJnZXQiLCJfaW5pdEludGVyYWN0aW9uTGVnYWN5IiwiZXZlbnRzIiwiX29uTW91c2VDbGljayIsIl9vbktleVByZXNzIiwiX2ZpcmVNb3VzZUV2ZW50IiwiTWFya2VyRHJhZyIsIkxhdExuZ1V0aWwiLCJjbG9uZUxhdExuZ3MiLCJjbG9uZSIsIkFycmF5IiwiY2xvbmVMYXRMbmciLCJkZWZhdWx0UHJlY2lzaW9uIiwia20iLCJoYSIsIm0iLCJtaSIsImFjIiwieWQiLCJmdCIsIm5tIiwicG9pbnRzQ291bnQiLCJkMnIiLCJzaW4iLCJmb3JtYXR0ZWROdW1iZXIiLCJuIiwiZm9ybWF0dGVkIiwicGFyc2VGbG9hdCIsImZvcm1hdCIsIm51bWVyaWMiLCJkZWxpbWl0ZXJzIiwidGhvdXNhbmRzIiwiZGVjaW1hbCIsInNwbGl0VmFsdWUiLCJpc01ldHJpYyIsImFyZWFTdHIiLCJ1bml0cyIsImlzRmVldCIsImlzTmF1dGljYWxNaWxlIiwiTGluZVV0aWwiLCJzZWdtZW50c0ludGVyc2VjdCIsInAiLCJwMyIsIl9jaGVja0NvdW50ZXJjbG9ja3dpc2UiLCJpbmNsdWRlIiwicG9pbnRzIiwiX2dldFByb2plY3RlZFBvaW50cyIsIl90b29GZXdQb2ludHNGb3JJbnRlcnNlY3Rpb24iLCJfbGluZVNlZ21lbnRzSW50ZXJzZWN0c1JhbmdlIiwic2tpcEZpcnN0IiwibmV3UG9pbnRJbnRlcnNlY3RzIiwibmV3UG9pbnQiLCJsYXN0UG9pbnQiLCJtYXhJbmRleCIsImV4dHJhUG9pbnRzIiwibWluSW5kZXgiLCJfb3JpZ2luYWxQb2ludHMiLCJwb2x5bGluZUludGVyc2VjdHMiLCJmaXJzdFBvaW50IiwiX3Rvb2xiYXJzIiwiRHJhd1Rvb2xiYXIiLCJfdG9vbGJhckVuYWJsZWQiLCJFZGl0VG9vbGJhciIsImFkZGVkVG9wQ2xhc3MiLCJ0b3BDbGFzc05hbWUiLCJ0b29sYmFyQ29udGFpbmVyIiwidG9vbGJhcklkIiwiYWRkVG9vbGJhciIsInJlbW92ZVRvb2xiYXIiLCJzZXREcmF3aW5nT3B0aW9ucyIsImVuYWJsZWRUb29sYmFyIiwiZHJhd0NvbnRyb2xUb29sdGlwcyIsImRyYXdDb250cm9sIiwiVG9vbGJhciIsIkNsYXNzIiwiX21vZGVzIiwiX2FjdGlvbkJ1dHRvbnMiLCJfYWN0aXZlTW9kZSIsImJ1dHRvbkluZGV4IiwiYnV0dG9uQ2xhc3NQcmVmaXgiLCJfdG9vbGJhckNsYXNzIiwibW9kZUhhbmRsZXJzIiwiZ2V0TW9kZUhhbmRsZXJzIiwiX3Rvb2xiYXJDb250YWluZXIiLCJfaW5pdE1vZGVIYW5kbGVyIiwiX2xhc3RCdXR0b25JbmRleCIsIl9hY3Rpb25zQ29udGFpbmVyIiwiaGFuZGxlcklkIiwiX2Rpc3Bvc2VCdXR0b24iLCJfaGFuZGxlckFjdGl2YXRlZCIsIl9oYW5kbGVyRGVhY3RpdmF0ZWQiLCJjbGFzc05hbWVQcmVkaXgiLCJidXR0b25UaXRsZSIsImNvbnRleHQiLCJfZGV0ZWN0SU9TIiwiaU9TIiwiTVNTdHJlYW0iLCJsaW5rIiwic3IiLCJidXR0b25FdmVudCIsIl9zaG93QWN0aW9uc1Rvb2xiYXIiLCJfaGlkZUFjdGlvbnNUb29sYmFyIiwiX2NyZWF0ZUFjdGlvbnMiLCJnZXRBY3Rpb25zIiwibGkiLCJkaSIsImRsIiwibGFzdEJ1dHRvbkluZGV4IiwidG9vbGJhclBvc2l0aW9uIiwidG9wIiwiX3Zpc2libGUiLCJfc2luZ2xlTGluZUxhYmVsIiwidmlzaWJpbGl0eSIsInBvcyIsInRvb2x0aXBDb250YWluZXIiLCJzZWxlY3RlZFBhdGhPcHRpb25zIiwiZGFzaEFycmF5IiwibWFpbnRhaW5Db2xvciIsImZlYXR1cmVHcm91cCIsIl9zZWxlY3RlZEZlYXR1cmVDb3VudCIsIkRlbGV0ZSIsIl9zYXZlIiwicmVtb3ZlQWxsTGF5ZXJzIiwiX2NsZWFyQWxsTGF5ZXJzIiwiX2NoZWNrRGlzYWJsZWQiLCJyZXZlcnRMYXllcnMiLCJoYXNMYXllcnMiLCJnZXRMYXllcnMiLCJzZXRBdHRyaWJ1dGUiLCJfZmVhdHVyZUdyb3VwIiwiRmVhdHVyZUdyb3VwIiwiX3VuZWRpdGVkTGF5ZXJQcm9wcyIsIl9oYXNBdmFpbGFibGVMYXllcnMiLCJfZW5hYmxlTGF5ZXJFZGl0IiwiX2Rpc2FibGVMYXllckVkaXQiLCJfZWRpdFRvb2x0aXAiLCJfcmV2ZXJ0TGF5ZXIiLCJlZGl0ZWRMYXllcnMiLCJfYmFja3VwTGF5ZXIiLCJzdGFtcCIsInBhdGhPcHRpb25zIiwiX3NlbGVjdGVkUGF0aE9wdGlvbnMiLCJwcmV2aW91c09wdGlvbnMiLCJjaGFuZ2VkVG91Y2hlcyIsIl9kZWxldGFibGVMYXllcnMiLCJfZW5hYmxlTGF5ZXJEZWxldGUiLCJfZGlzYWJsZUxheWVyRGVsZXRlIiwiX2RlbGV0ZWRMYXllcnMiLCJfcmVtb3ZlTGF5ZXIiLCIkIiwicmVzaXplIiwiaGVpZ2h0Iiwid2lkdGgiLCJjc3MiLCJzSCIsInRyaWdnZXIiLCJnZXRFbGVtZW50QnlJZCIsImFkZEV2ZW50TGlzdGVuZXIiLCJzaG93IiwiY2xpY2siLCJ0b2dnbGVDbGFzcyIsInRhYkNvbG9yIiwidGFiQW50ZW5uZXMiLCJjb2xvcnMiLCJmaWxsQ29sb3JXaXRob3V0QWdlbnQiLCJjb2xvcldpdGhvdXRBZ2VudCIsImNvbG9yV2l0aEFnZW50IiwidGFiQWdlbnRzIiwic2l0ZVVzZXIiLCJhZ2VudHMiLCJ0YWJOYkNsaWVudHMiLCJsYXN0SWQiLCJtYXJrZXJEZWNvdXBhZ2UiLCJsYXllckdyb3VwIiwiZnVzaW9uIiwiZGVjb3VwYWdlIiwibW9kaWZpY2F0aW9uIiwiY3JlYXRpb24iLCJhc3Npc3QiLCJjb250YWluZXJDbGljayIsInNob3dBZ2VudHMiLCJzaG93QWdlbnRzT2ZTZWN0ZXVycyIsImRlbnNpdGVDbGllbnRzIiwic2hvd0RlbnNpdGUiLCJjbGllbnRzV2l0aG91dFNlY3RldXIiLCJnZW9qc29uQ2xpZW50cyIsInNob3dDbGllbnRzIiwidGFiRGVuc2l0ZSIsInNlY3RldXJzQnlSZXNwb25zYWJsZSIsInNlY3RldXJzU2VsZWN0IiwiaGlzdG9yaXF1ZUFjdGlvbnMiLCJoaXN0b1BvbHlnb24iLCJmbGFnVW5kbyIsImV2ZW50QWN0aWYiLCJvcHRpb25zQ2lyY2xlQ2xpZW50cyIsIm1hcmtlckljb24iLCJpY29uVXJsIiwiaW1nTWFya2VyQmxhY2siLCJtYXJrZXJJY29uUmVkIiwiaW1nTWFya2VyUmVkIiwiY2lyY2xlSWNvbiIsImltZ0NpcmNsZSIsImhvbWVJY29uIiwiaW1nTWFpc29uIiwiY29vcmRzIiwibWFwU2VjdG8iLCJ6b29tQ29udHJvbCIsIl96b29tSW5CdXR0b24iLCJfem9vbU91dEJ1dHRvbiIsInNjYWxlIiwiZ2xjTWFwc0dHaCIsInRpbGVMYXllciIsIm1heFpvb20iLCJkZXRlY3RSZXRpbmEiLCJhdHRyaWJ1dGlvbiIsInBsYW4iLCJFc3JpX1dvcmxkSW1hZ2VyeSIsIkVzcmlfV29ybGRUb3BvTWFwIiwicGxhbjIiLCJoaXN0b01hcCIsImJhc2VMYXllcnMiLCJsYXllcnNBZGphY2VudCIsImFnZW50c0FkamFjZW50IiwiY2lyY2xlR3VpZGUiLCJhbnRlbm5lcyIsImVkaXRhYmxlTGF5ZXJzIiwiYmlnUG9seWdvbiIsImJpZ1BvbHlnb25BbnRlbm5lcyIsImFnZW50c09mU2VjdGV1cnMiLCJoaXN0b0FnZW50c09mU2VjdGV1cnMiLCJjdXN0b21Db250cm9sVW5kbyIsImltZ1VuZG8iLCJiYWNrZ3JvdW5kU2l6ZSIsIm9uY2xpY2siLCJjdXN0b21Db250cm9sUmVmcmVzaCIsImltZ1JlZnJlc2giLCJyZWZyZXNoIiwiY3VzdG9tQ29udHJvbFNhdmUiLCJpbWdTYXZlIiwiaW1nUGFzdGlsbGUiLCJkaXNhYmxlZCIsIm1vZGFsIiwiZXZlbnQiLCJpbWdCREQiLCJzeW5jaHJvIiwiZm9ybSIsImVsZW1lbnRzIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsInNhdmVWZXJzaW9uIiwiY3VzdG9tQ29udHJvbENyZWF0aW9uQXNzaXN0IiwiaW1nQ3JlYXRpb25Bc3Npc3QiLCJoaWRlRnVuY3Rpb25zIiwiY2xpY2tNYXJrZXJBc3Npc3QiLCJjdXN0b21Db250cm9sTmJDbGllbnRzIiwiaW1nQ2xpZW50cyIsInRvZ2dsZVRvb2x0aXAiLCJjdXN0b21Db250cm9sQWdlbnRzIiwiaW1nQWdlbnRzIiwiYmluZEVsZW1lbnRzIiwiY3VzdG9tQ29udHJvbEFnZW50c09mU2VjdGV1cnMiLCJpbWdOdW1iZXIiLCJjdXN0b21Db250cm9sRGVuc2l0ZUNsaWVudHMiLCJpbWdEZW5zaXRlIiwiY3VzdG9tQ29udHJvbENsaWVudCIsImltZ0NsaWVudHNPdXQiLCJpbml0U2VjdG8iLCJ0aW1lbGluZXMiLCJldmVudHNNaW5EaXN0YW5jZSIsImluaXRUaW1lbGluZSIsInJlbG9hZCIsImVhY2giLCJ0aW1lbGluZSIsInRpbWVsaW5lQ29tcG9uZW50cyIsImZpbmQiLCJjaGlsZHJlbiIsInRpbWVsaW5lVG90V2lkdGgiLCJzZXREYXRlUG9zaXRpb24iLCJzZXRUaW1lbGluZVdpZHRoIiwid2lkdGhUaW1lbGluZSIsIk51bWJlciIsIm1pZGRsZSIsImxlZnRWZXJzaW9uIiwiY29tcHREZWNhbGFnZSIsInVwZGF0ZVNsaWRlIiwidGhpc0xpbmsiLCJzaG93TG9hZE1vZGFsIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJ1cGRhdGVPbGRlckV2ZW50cyIsInVwZGF0ZUZpbGxpbmciLCJ1cGRhdGVWaXNpYmxlQ29udGVudCIsImhpZGVMb2FkTW9kYWwiLCJtcSIsImNoZWNrTVEiLCJzaG93TmV3Q29udGVudCIsImtleXVwIiwid2hpY2giLCJlbGVtZW50SW5WaWV3cG9ydCIsInN0cmluZyIsImRlY2FsYWdlIiwidHJhbnNsYXRlVmFsdWUiLCJnZXRUcmFuc2xhdGVWYWx1ZSIsIndyYXBwZXJXaWR0aCIsInRyYW5zbGF0ZVRpbWVsaW5lIiwidmlzaWJsZUNvbnRlbnQiLCJuZXdDb250ZW50IiwibmV4dCIsInByZXYiLCJzZWxlY3RlZERhdGUiLCJuZXdFdmVudCIsInBhcmVudCIsInVwZGF0ZVRpbWVsaW5lUG9zaXRpb24iLCJldmVudFN0eWxlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImV2ZW50TGVmdCIsImdldFByb3BlcnR5VmFsdWUiLCJ0aW1lbGluZVdpZHRoIiwidGltZWxpbmVUcmFuc2xhdGUiLCJ0b3RXaWR0aCIsImV2ZW50c1dyYXBwZXIiLCJzZXRUcmFuc2Zvcm1WYWx1ZSIsInNlbGVjdGVkRXZlbnQiLCJmaWxsaW5nIiwiZXZlbnRXaWR0aCIsInNjYWxlVmFsdWUiLCJtaW4iLCJlcSIsInRvdGFsV2lkdGgiLCJldmVudHNDb250ZW50IiwiZXZlbnREYXRlIiwic2VsZWN0ZWRDb250ZW50Iiwic2VsZWN0ZWRDb250ZW50SGVpZ2h0IiwiY2xhc3NFbmV0ZXJpbmciLCJjbGFzc0xlYXZpbmciLCJhdHRyIiwib25lIiwicHJldkFsbCIsIm5leHRBbGwiLCJ0aW1lbGluZVN0eWxlIiwiZWxlbWVudCIsInByb3BlcnR5IiwicGFyc2VEYXRlIiwiZGF0ZUFycmF5cyIsImRhdGVDb21wIiwibmV3RGF0ZSIsIkRhdGUiLCJwYXJzZURhdGUyIiwic2luZ2xlRGF0ZSIsImRheUNvbXAiLCJ0aW1lQ29tcCIsImRheWRpZmYiLCJmaXJzdCIsInNlY29uZCIsIm1pbkxhcHNlIiwiZGF0ZXMiLCJkYXRlRGlzdGFuY2VzIiwibGVmdCIsIm9mZnNldExlZnQiLCJvZmZzZXRIZWlnaHQiLCJvZmZzZXRQYXJlbnQiLCJwYWdlWU9mZnNldCIsImlubmVySGVpZ2h0IiwicGFnZVhPZmZzZXQiLCJpbm5lcldpZHRoIiwidG90YWxGb3JtYXR0ZXIiLCJmaWVsZCIsInJvdyIsInJlZHVjZSIsInN1bSIsImZvb3RlclN0eWxlIiwiZGF0ZU1lcCIsInZpYUJ1dHRvbiIsImFqYXgiLCJtZXRob2QiLCJkYXRhVHlwZSIsInN0cmluZ2lmeSIsInN1Y2Nlc3MiLCJyZXN1bHQiLCJzZWN0ZXVycyIsImxhdExvbmciLCJjb3VudCIsImZvckVhY2giLCJzZWN0ZXVyIiwiY29vcmRvbm5lZXMiLCJjb29yZGluYXRlcyIsImxvY2F0aW9uQXJyYXkiLCJ3aXRob3V0QWdlbnQiLCJhZ2VudFNlY3RldXJzIiwic29tZSIsImFnZW50IiwicmFuZ190cmkiLCJ1dGlsaXNhdGV1cl9hZ2VudCIsImdyb3VwZV9hZmZlY3RhdGlvbiIsImdldFN0eWxlIiwiY29kZUFnZW50IiwiaW5pdGlhbGVzIiwiYmluZFRvb2x0aXAiLCJwZXJtYW5lbnQiLCJkaXJlY3Rpb24iLCJiaW5kVG9vbHRpcE5iQ2xpZW50cyIsImluaXRFdmVuZW1lbnRMYXllciIsImdldEFnZW50cyIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiYmluZFBvcHVwIiwibm9tQ29tcGxldCIsImdldEJpZ1BvbHlnb24iLCJHZW9KU09OIiwiZ2VvbWV0cnlUb0xheWVyIiwicG9pbnRUb0xheWVyIiwiY29vcmRzVG9MYXRMbmciLCJhbnRlbm5lc0dsb2JhbCIsImFudGVubmUiLCJzdmciLCJwYXRoQW50ZW5uZXMiLCJwcmVwZW5kIiwiY29kZUdyb3VwZSIsIm5iRXF1aXBlbWVudCIsIm5iX3RvdGFsIiwiY2xvc2VUb29sdGlwIiwiZmxhZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBQSxXQUFPLENBQUNyTixFQUFSLENBQVcsb0JBQVgsRUFBaUMsVUFBVWtELENBQVYsRUFBYTtBQUMxQ21LLGFBQU8sQ0FBQytwQixhQUFSO0FBQ0gsS0FGRDtBQUdIOztBQUVELFdBQVNHLFlBQVQsQ0FBc0JpSyxJQUF0QixFQUE0Qi9vQixNQUE1QixFQUFvQztBQUNoQyxRQUFJK29CLElBQUosRUFBVTtBQUNOdE4sY0FBUSxDQUFDbnlCLFdBQVQsQ0FBcUIwVyxNQUFyQjtBQUNILEtBRkQsTUFFTztBQUNIeWIsY0FBUSxDQUFDNW9CLFFBQVQsQ0FBa0JtTixNQUFsQjtBQUNIOztBQUNELFdBQU8sQ0FBQytvQixJQUFSO0FBQ0gsR0F0MEN5QyxDQXkwQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBOztBQUVILENBeDFDRCxFOzs7Ozs7Ozs7Ozs7QUNoQ0E7Ozs7Ozs7Ozs7Ozs7QUNBQSIsImZpbGUiOiJzZWN0by5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcblx0TmFtZVx0XHRcdFx0XHREYXRhIHBhc3NlZFx0XHRcdCAgIERlc2NyaXB0aW9uXHJcblxyXG5cdE1hbmFnZWQgRXZlbnRzOlxyXG5cdCBzZWFyY2g6bG9jYXRpb25mb3VuZFx0e2xhdGxuZywgdGl0bGUsIGxheWVyfSBmaXJlZCBhZnRlciBtb3ZlZCBhbmQgc2hvdyBtYXJrZXJMb2NhdGlvblxyXG5cdCBzZWFyY2g6ZXhwYW5kZWRcdFx0e31cdFx0XHRcdFx0ICAgZmlyZWQgYWZ0ZXIgY29udHJvbCB3YXMgZXhwYW5kZWRcclxuXHQgc2VhcmNoOmNvbGxhcHNlZFx0XHR7fVx0XHRcdFx0XHQgICBmaXJlZCBhZnRlciBjb250cm9sIHdhcyBjb2xsYXBzZWRcclxuIFx0IHNlYXJjaDpjYW5jZWxcdFx0XHR7fVx0XHRcdFx0XHQgICBmaXJlZCBhZnRlciBjYW5jZWwgYnV0dG9uIGNsaWNrZWRcclxuXHJcblx0UHVibGljIG1ldGhvZHM6XHJcblx0IHNldExheWVyKClcdFx0XHRcdEwuTGF5ZXJHcm91cCgpICAgICAgICAgc2V0IGxheWVyIHNlYXJjaCBhdCBydW50aW1lXHJcblx0IHNob3dBbGVydCgpICAgICAgICAgICAgJ1RleHQgbWVzc2FnZScgICAgICAgICBzaG93IGFsZXJ0IG1lc3NhZ2VcclxuXHQgc2VhcmNoVGV4dCgpXHRcdFx0J1RleHQgc2VhcmNoZWQnICAgICAgICBzZWFyY2ggdGV4dCBieSBleHRlcm5hbCBjb2RlXHJcbiovXHJcblxyXG4vL1RPRE8gaW1wbGVtZW50IGNhbiBkbyByZXNlYXJjaCBvbiBtdWx0aXBsZSBzb3VyY2VzIGxheWVycyBhbmQgcmVtb3RlXHRcdFxyXG4vL1RPRE8gaGlzdG9yeTogZmFsc2UsXHRcdC8vc2hvdyBsYXRlc3Qgc2VhcmNoZXMgaW4gdG9vbHRpcFx0XHRcclxuLy9GSVhNRSBvcHRpb24gY29uZGl0aW9uIHByb2JsZW0ge2F1dG9Db2xsYXBzZTogdHJ1ZSwgbWFya2VyTG9jYXRpb246IHRydWV9IG5vdCBzaG93IGxvY2F0aW9uXHJcbi8vRklYTUUgb3B0aW9uIGNvbmRpdGlvbiBwcm9ibGVtIHthdXRvQ29sbGFwc2U6IGZhbHNlIH1cclxuLy9cclxuLy9UT0RPIGhlcmUgaW5zZXJ0IGZ1bmN0aW9uICBzZWFyY2ggaW5wdXRUZXh0IEZJUlNUIGluIF9yZWNvcmRzQ2FjaGUga2V5cyBhbmQgaWYgbm90IGZpbmQgcmVzdWx0cy4uIFxyXG4vLyAgcnVuIG9uZSBvZiBjYWxsYmFja3Mgc2VhcmNoKHNvdXJjZURhdGEsanNvbnBVcmwgb3Igb3B0aW9ucy5sYXllcikgYW5kIHJ1biB0aGlzLnNob3dUb29sdGlwXHJcbi8vXHJcbi8vVE9ETyBjaGFuZ2Ugc3RydWN0dXJlIG9mIF9yZWNvcmRzQ2FjaGVcclxuLy9cdGxpa2UgdGhpczogX3JlY29yZHNDYWNoZSA9IHtcInRleHQta2V5MVwiOiB7bG9jOltsYXQsbG5nXSwgLi5vdGhlciBhdHRyaWJ1dGVzLi4gfSwge1widGV4dC1rZXkyXCI6IHtsb2M6W2xhdCxsbmddfS4uLn0sIC4uLn1cclxuLy9cdGluIHRoaXMgbW9kZSBldmVyeSByZWNvcmQgY2FuIGhhdmUgYSBmcmVlIHN0cnVjdHVyZSBvZiBhdHRyaWJ1dGVzLCBvbmx5ICdsb2MnIGlzIHJlcXVpcmVkXHJcbi8vVE9ETyBpbXBvcnRhbnQgb3B0aW1pemF0aW9uISEhIGFsd2F5cyBhcHBlbmQgZGF0YSBpbiB0aGlzLl9yZWNvcmRzQ2FjaGVcclxuLy8gIG5vdyBfcmVjb3Jkc0NhY2hlIGNvbnRlbnQgaXMgZW1wdGllZCBhbmQgcmVwbGFjZWQgd2l0aCBuZXcgZGF0YSBmb3VuZGVkXHJcbi8vICBhbHdheXMgYXBwZW5kaW5nIGRhdGEgb24gX3JlY29yZHNDYWNoZSBnaXZlIHRoZSBwb3NzaWJpbGl0eSBvZiBjYWNoaW5nIGFqYXgsIGpzb25wIGFuZCBsYXllcnNlYXJjaCFcclxuLy9cclxuLy9UT0RPIGhlcmUgaW5zZXJ0IGZ1bmN0aW9uICBzZWFyY2ggaW5wdXRUZXh0IEZJUlNUIGluIF9yZWNvcmRzQ2FjaGUga2V5cyBhbmQgaWYgbm90IGZpbmQgcmVzdWx0cy4uIFxyXG4vLyAgcnVuIG9uZSBvZiBjYWxsYmFja3Mgc2VhcmNoKHNvdXJjZURhdGEsanNvbnBVcmwgb3Igb3B0aW9ucy5sYXllcikgYW5kIHJ1biB0aGlzLnNob3dUb29sdGlwXHJcbi8vXHJcbi8vVE9ETyBjaGFuZ2Ugc3RydWN0dXJlIG9mIF9yZWNvcmRzQ2FjaGVcclxuLy9cdGxpa2UgdGhpczogX3JlY29yZHNDYWNoZSA9IHtcInRleHQta2V5MVwiOiB7bG9jOltsYXQsbG5nXSwgLi5vdGhlciBhdHRyaWJ1dGVzLi4gfSwge1widGV4dC1rZXkyXCI6IHtsb2M6W2xhdCxsbmddfS4uLn0sIC4uLn1cclxuLy9cdGluIHRoaXMgd2F5IGV2ZXJ5IHJlY29yZCBjYW4gaGF2ZSBhIGZyZWUgc3RydWN0dXJlIG9mIGF0dHJpYnV0ZXMsIG9ubHkgJ2xvYycgaXMgcmVxdWlyZWRcclxuXHJcbihmdW5jdGlvbiAoZmFjdG9yeSkge1xyXG4gICAgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XHJcbiAgICAvL0FNRFxyXG4gICAgICAgIGRlZmluZShbJ2xlYWZsZXQnXSwgZmFjdG9yeSk7XHJcbiAgICB9IGVsc2UgaWYodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIC8vIE5vZGUvQ29tbW9uSlNcclxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnbGVhZmxldCcpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAvLyBCcm93c2VyIGdsb2JhbHNcclxuICAgICAgICBpZih0eXBlb2Ygd2luZG93LkwgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICB0aHJvdyAnTGVhZmxldCBtdXN0IGJlIGxvYWRlZCBmaXJzdCc7XHJcbiAgICAgICAgZmFjdG9yeSh3aW5kb3cuTCk7XHJcbiAgICB9XHJcbn0pKGZ1bmN0aW9uIChMKSB7XHJcblxyXG5cclxuTC5Db250cm9sLlNlYXJjaCA9IEwuQ29udHJvbC5leHRlbmQoe1xyXG5cdFxyXG5cdGluY2x1ZGVzOiBMLnZlcnNpb25bMF09PT0nMScgPyBMLkV2ZW50ZWQucHJvdG90eXBlIDogTC5NaXhpbi5FdmVudHMsXHJcblxyXG5cdG9wdGlvbnM6IHtcclxuXHRcdHVybDogJycsXHRcdFx0XHRcdFx0Ly91cmwgZm9yIHNlYXJjaCBieSBhamF4IHJlcXVlc3QsIGV4OiBcInNlYXJjaC5waHA/cT17c31cIi4gQ2FuIGJlIGZ1bmN0aW9uIHRvIHJldHVybnMgc3RyaW5nIGZvciBkeW5hbWljIHBhcmFtZXRlciBzZXR0aW5nXHJcblx0XHRsYXllcjogbnVsbCxcdFx0XHRcdFx0Ly9sYXllciB3aGVyZSBzZWFyY2ggbWFya2VycyhpcyBhIEwuTGF5ZXJHcm91cClcdFx0XHRcdFxyXG5cdFx0c291cmNlRGF0YTogbnVsbCxcdFx0XHRcdC8vZnVuY3Rpb24gdG8gZmlsbCBfcmVjb3Jkc0NhY2hlLCBwYXNzZWQgc2VhcmNoaW5nIHRleHQgYnkgZmlyc3QgcGFyYW0gYW5kIGNhbGxiYWNrIGluIHNlY29uZFx0XHRcdFx0XHJcblx0XHQvL1RPRE8gaW1wbGVtZW50cyB1bmlxIG9wdGlvbiAnc291cmNlRGF0YScgdG8gcmVjb2duaXplcyBzb3VyY2UgdHlwZTogdXJsLGFycmF5LGNhbGxiYWNrIG9yIGxheWVyXHRcdFx0XHRcclxuXHRcdGpzb25wUGFyYW06IG51bGwsXHRcdFx0XHQvL2pzb25wIHBhcmFtIG5hbWUgZm9yIHNlYXJjaCBieSBqc29ucCBzZXJ2aWNlLCBleDogXCJjYWxsYmFja1wiXHJcblx0XHRwcm9wZXJ0eUxvYzogJ2xvYycsXHRcdFx0XHQvL2ZpZWxkIGZvciByZW1hcHBpbmcgbG9jYXRpb24sIHVzaW5nIGFycmF5OiBbJ2xhdG5hbWUnLCdsb25uYW1lJ10gZm9yIHNlbGVjdCBkb3VibGUgZmllbGRzKGV4LiBbJ2xhdCcsJ2xvbiddICkgc3VwcG9ydCBkb3R0ZWQgZm9ybWF0OiAncHJvcC5zdWJwcm9wLnRpdGxlJ1xyXG5cdFx0cHJvcGVydHlOYW1lOiAndGl0bGUnLFx0XHRcdC8vcHJvcGVydHkgaW4gbWFya2VyLm9wdGlvbnMob3IgZmVhdHVyZS5wcm9wZXJ0aWVzIGZvciB2ZWN0b3IgbGF5ZXIpIHRyb3VnaCBmaWx0ZXIgZWxlbWVudHMgaW4gbGF5ZXIsXHJcblx0XHRmb3JtYXREYXRhOiBudWxsLFx0XHRcdFx0Ly9jYWxsYmFjayBmb3IgcmVmb3JtYXQgYWxsIGRhdGEgZnJvbSBzb3VyY2UgdG8gaW5kZXhlZCBkYXRhIG9iamVjdFxyXG5cdFx0ZmlsdGVyRGF0YTogbnVsbCxcdFx0XHRcdC8vY2FsbGJhY2sgZm9yIGZpbHRlcmluZyBkYXRhIGZyb20gdGV4dCBzZWFyY2hlZCwgcGFyYW1zOiB0ZXh0U2VhcmNoLCBhbGxSZWNvcmRzXHJcblx0XHRtb3ZlVG9Mb2NhdGlvbjogbnVsbCxcdFx0XHQvL2NhbGxiYWNrIHJ1biBvbiBsb2NhdGlvbiBmb3VuZCwgcGFyYW1zOiBsYXRsbmcsIHRpdGxlLCBtYXBcclxuXHRcdGJ1aWxkVGlwOiBudWxsLFx0XHRcdFx0XHQvL2Z1bmN0aW9uIHRvIHJldHVybiByb3cgdGlwIGh0bWwgbm9kZShvciBodG1sIHN0cmluZyksIHJlY2VpdmUgdGV4dCB0b29sdGlwIGluIGZpcnN0IHBhcmFtXHJcblx0XHRjb250YWluZXI6ICcnLFx0XHRcdFx0XHQvL2NvbnRhaW5lciBpZCB0byBpbnNlcnQgU2VhcmNoIENvbnRyb2xcdFx0XHJcblx0XHR6b29tOiBudWxsLFx0XHRcdFx0XHRcdC8vZGVmYXVsdCB6b29tIGxldmVsIGZvciBtb3ZlIHRvIGxvY2F0aW9uXHJcblx0XHRtaW5MZW5ndGg6IDEsXHRcdFx0XHRcdC8vbWluaW1hbCB0ZXh0IGxlbmd0aCBmb3IgYXV0b2NvbXBsZXRlXHJcblx0XHRpbml0aWFsOiB0cnVlLFx0XHRcdFx0XHQvL3NlYXJjaCBlbGVtZW50cyBvbmx5IGJ5IGluaXRpYWwgdGV4dFxyXG5cdFx0Y2FzZXNlbnNpdGl2ZTogZmFsc2UsXHRcdFx0Ly9zZWFyY2ggZWxlbWVudHMgaW4gY2FzZSBzZW5zaXRpdmUgdGV4dFxyXG5cdFx0YXV0b1R5cGU6IHRydWUsXHRcdFx0XHRcdC8vY29tcGxldGUgaW5wdXQgd2l0aCBmaXJzdCBzdWdnZXN0ZWQgcmVzdWx0IGFuZCBzZWxlY3QgdGhpcyBmaWxsZWQtaW4gdGV4dC5cclxuXHRcdGRlbGF5VHlwZTogNDAwLFx0XHRcdFx0XHQvL2RlbGF5IHdoaWxlIHR5cGluZyBmb3Igc2hvdyB0b29sdGlwXHJcblx0XHR0b29sdGlwTGltaXQ6IC0xLFx0XHRcdFx0Ly9saW1pdCBtYXggcmVzdWx0cyB0byBzaG93IGluIHRvb2x0aXAuIC0xIGZvciBubyBsaW1pdCwgMCBmb3Igbm8gcmVzdWx0c1xyXG5cdFx0dGlwQXV0b1N1Ym1pdDogdHJ1ZSxcdFx0XHQvL2F1dG8gbWFwIHBhblRvIHdoZW4gY2xpY2sgb24gdG9vbHRpcFxyXG5cdFx0Zmlyc3RUaXBTdWJtaXQ6IGZhbHNlLFx0XHRcdC8vYXV0byBzZWxlY3QgZmlyc3QgcmVzdWx0IGNvbiBlbnRlciBjbGlja1xyXG5cdFx0YXV0b1Jlc2l6ZTogdHJ1ZSxcdFx0XHRcdC8vYXV0b3Jlc2l6ZSBvbiBpbnB1dCBjaGFuZ2VcclxuXHRcdGNvbGxhcHNlZDogdHJ1ZSxcdFx0XHRcdC8vY29sbGFwc2Ugc2VhcmNoIGNvbnRyb2wgYXQgc3RhcnR1cFxyXG5cdFx0YXV0b0NvbGxhcHNlOiBmYWxzZSxcdFx0XHQvL2NvbGxhcHNlIHNlYXJjaCBjb250cm9sIGFmdGVyIHN1Ym1pdChvbiBidXR0b24gb3Igb24gdGlwcyBpZiBlbmFibGVkIHRpcEF1dG9TdWJtaXQpXHJcblx0XHRhdXRvQ29sbGFwc2VUaW1lOiAxMjAwLFx0XHRcdC8vZGVsYXkgZm9yIGF1dG9jbG9zaW5nIGFsZXJ0IGFuZCBjb2xsYXBzZSBhZnRlciBibHVyXHJcblx0XHR0ZXh0RXJyOiAnTG9jYXRpb24gbm90IGZvdW5kJyxcdC8vZXJyb3IgbWVzc2FnZVxyXG5cdFx0dGV4dENhbmNlbDogJ0NhbmNlbCcsXHRcdCAgICAvL3RpdGxlIGluIGNhbmNlbCBidXR0b25cdFx0XHJcblx0XHR0ZXh0UGxhY2Vob2xkZXI6ICdTZWFyY2guLi4nLCAgIC8vcGxhY2Vob2xkZXIgdmFsdWVcdFx0XHRcclxuXHRcdGhpZGVNYXJrZXJPbkNvbGxhcHNlOiBmYWxzZSwgICAgLy9yZW1vdmUgY2lyY2xlIGFuZCBtYXJrZXIgb24gc2VhcmNoIGNvbnRyb2wgY29sbGFwc2VkXHRcdFxyXG5cdFx0cG9zaXRpb246ICd0b3BsZWZ0JyxcdFx0XHJcblx0XHRtYXJrZXI6IHtcdFx0XHRcdFx0XHQvL2N1c3RvbSBMLk1hcmtlciBvciBmYWxzZSBmb3IgaGlkZVxyXG5cdFx0XHRpY29uOiBmYWxzZSxcdFx0XHRcdC8vY3VzdG9tIEwuSWNvbiBmb3IgbWFrZXIgbG9jYXRpb24gb3IgZmFsc2UgZm9yIGhpZGVcclxuXHRcdFx0YW5pbWF0ZTogdHJ1ZSxcdFx0XHRcdC8vYW5pbWF0ZSBhIGNpcmNsZSBvdmVyIGxvY2F0aW9uIGZvdW5kXHJcblx0XHRcdGNpcmNsZToge1x0XHRcdFx0XHQvL2RyYXcgYSBjaXJjbGUgaW4gbG9jYXRpb24gZm91bmRcclxuXHRcdFx0XHRyYWRpdXM6IDEwLFxyXG5cdFx0XHRcdHdlaWdodDogMyxcclxuXHRcdFx0XHRjb2xvcjogJyNlMDMnLFxyXG5cdFx0XHRcdHN0cm9rZTogdHJ1ZSxcclxuXHRcdFx0XHRmaWxsOiBmYWxzZVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0X2dldFBhdGg6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xyXG5cdFx0dmFyIHBhcnRzID0gcHJvcC5zcGxpdCgnLicpLFxyXG5cdFx0XHRsYXN0ID0gcGFydHMucG9wKCksXHJcblx0XHRcdGxlbiA9IHBhcnRzLmxlbmd0aCxcclxuXHRcdFx0Y3VyID0gcGFydHNbMF0sXHJcblx0XHRcdGkgPSAxO1xyXG5cclxuXHRcdGlmKGxlbiA+IDApXHJcblx0XHRcdHdoaWxlKChvYmogPSBvYmpbY3VyXSkgJiYgaSA8IGxlbilcclxuXHRcdFx0XHRjdXIgPSBwYXJ0c1tpKytdO1xyXG5cclxuXHRcdGlmKG9iailcclxuXHRcdFx0cmV0dXJuIG9ialtsYXN0XTtcclxuXHR9LFxyXG5cclxuXHRfaXNPYmplY3Q6IGZ1bmN0aW9uKG9iaikge1xyXG5cdFx0cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgT2JqZWN0XVwiO1xyXG5cdH0sXHJcblxyXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcclxuXHRcdEwuVXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMgfHwge30pO1xyXG5cdFx0dGhpcy5faW5wdXRNaW5TaXplID0gdGhpcy5vcHRpb25zLnRleHRQbGFjZWhvbGRlciA/IHRoaXMub3B0aW9ucy50ZXh0UGxhY2Vob2xkZXIubGVuZ3RoIDogMTA7XHJcblx0XHR0aGlzLl9sYXllciA9IHRoaXMub3B0aW9ucy5sYXllciB8fCBuZXcgTC5MYXllckdyb3VwKCk7XHJcblx0XHR0aGlzLl9maWx0ZXJEYXRhID0gdGhpcy5vcHRpb25zLmZpbHRlckRhdGEgfHwgdGhpcy5fZGVmYXVsdEZpbHRlckRhdGE7XHJcblx0XHR0aGlzLl9mb3JtYXREYXRhID0gdGhpcy5vcHRpb25zLmZvcm1hdERhdGEgfHwgdGhpcy5fZGVmYXVsdEZvcm1hdERhdGE7XHJcblx0XHR0aGlzLl9tb3ZlVG9Mb2NhdGlvbiA9IHRoaXMub3B0aW9ucy5tb3ZlVG9Mb2NhdGlvbiB8fCB0aGlzLl9kZWZhdWx0TW92ZVRvTG9jYXRpb247XHJcblx0XHR0aGlzLl9hdXRvVHlwZVRtcCA9IHRoaXMub3B0aW9ucy5hdXRvVHlwZTtcdC8vdXNlZnVsIGZvciBkaXNhYmxlIGF1dG9UeXBlIHRlbXBvcmFyaWx5IGluIGRlbGV0ZS9iYWNrc3BhY2Uga2V5ZG93blxyXG5cdFx0dGhpcy5fY291bnRlcnRpcHMgPSAwO1x0XHQvL251bWJlciBvZiB0aXBzIGl0ZW1zXHJcblx0XHR0aGlzLl9yZWNvcmRzQ2FjaGUgPSB7fTtcdC8va2V5LHZhbHVlIHRhYmxlISB0byBzdG9yZSBsb2NhdGlvbnMhIGZvcm1hdDoga2V5LGxhdGxuZ1xyXG5cdFx0dGhpcy5fY3VyUmVxID0gbnVsbDtcclxuXHR9LFxyXG5cclxuXHRvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xyXG5cdFx0dGhpcy5fbWFwID0gbWFwO1xyXG5cdFx0dGhpcy5fY29udGFpbmVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2xlYWZsZXQtY29udHJvbC1zZWFyY2gnKTtcclxuXHRcdHRoaXMuX2lucHV0ID0gdGhpcy5fY3JlYXRlSW5wdXQodGhpcy5vcHRpb25zLnRleHRQbGFjZWhvbGRlciwgJ3NlYXJjaC1pbnB1dCcpO1xyXG5cdFx0dGhpcy5fdG9vbHRpcCA9IHRoaXMuX2NyZWF0ZVRvb2x0aXAoJ3NlYXJjaC10b29sdGlwJyk7XHJcblx0XHR0aGlzLl9jYW5jZWwgPSB0aGlzLl9jcmVhdGVDYW5jZWwodGhpcy5vcHRpb25zLnRleHRDYW5jZWwsICdzZWFyY2gtY2FuY2VsJyk7XHJcblx0XHR0aGlzLl9idXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24odGhpcy5vcHRpb25zLnRleHRQbGFjZWhvbGRlciwgJ3NlYXJjaC1idXR0b24nKTtcclxuXHRcdHRoaXMuX2FsZXJ0ID0gdGhpcy5fY3JlYXRlQWxlcnQoJ3NlYXJjaC1hbGVydCcpO1xyXG5cclxuXHRcdGlmKHRoaXMub3B0aW9ucy5jb2xsYXBzZWQ9PT1mYWxzZSlcclxuXHRcdFx0dGhpcy5leHBhbmQodGhpcy5vcHRpb25zLmNvbGxhcHNlZCk7XHJcblxyXG5cdFx0aWYodGhpcy5vcHRpb25zLm1hcmtlcikge1xyXG5cdFx0XHRcclxuXHRcdFx0aWYodGhpcy5vcHRpb25zLm1hcmtlciBpbnN0YW5jZW9mIEwuTWFya2VyIHx8IHRoaXMub3B0aW9ucy5tYXJrZXIgaW5zdGFuY2VvZiBMLkNpcmNsZU1hcmtlcilcclxuXHRcdFx0XHR0aGlzLl9tYXJrZXJTZWFyY2ggPSB0aGlzLm9wdGlvbnMubWFya2VyO1xyXG5cclxuXHRcdFx0ZWxzZSBpZih0aGlzLl9pc09iamVjdCh0aGlzLm9wdGlvbnMubWFya2VyKSlcclxuXHRcdFx0XHR0aGlzLl9tYXJrZXJTZWFyY2ggPSBuZXcgTC5Db250cm9sLlNlYXJjaC5NYXJrZXIoWzAsMF0sIHRoaXMub3B0aW9ucy5tYXJrZXIpO1xyXG5cclxuXHRcdFx0dGhpcy5fbWFya2VyU2VhcmNoLl9pc01hcmtlclNlYXJjaCA9IHRydWU7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zZXRMYXllciggdGhpcy5fbGF5ZXIgKTtcclxuXHJcblx0XHRtYXAub24oe1xyXG5cdFx0XHQvLyBcdFx0J2xheWVyYWRkJzogdGhpcy5fb25MYXllckFkZFJlbW92ZSxcclxuXHRcdFx0Ly8gXHRcdCdsYXllcnJlbW92ZSc6IHRoaXMuX29uTGF5ZXJBZGRSZW1vdmVcclxuXHRcdFx0J3Jlc2l6ZSc6IHRoaXMuX2hhbmRsZUF1dG9yZXNpemVcclxuXHRcdFx0fSwgdGhpcyk7XHJcblx0XHRyZXR1cm4gdGhpcy5fY29udGFpbmVyO1xyXG5cdH0sXHJcblx0YWRkVG86IGZ1bmN0aW9uIChtYXApIHtcclxuXHJcblx0XHRpZih0aGlzLm9wdGlvbnMuY29udGFpbmVyKSB7XHJcblx0XHRcdHRoaXMuX2NvbnRhaW5lciA9IHRoaXMub25BZGQobWFwKTtcclxuXHRcdFx0dGhpcy5fd3JhcHBlciA9IEwuRG9tVXRpbC5nZXQodGhpcy5vcHRpb25zLmNvbnRhaW5lcik7XHJcblx0XHRcdHRoaXMuX3dyYXBwZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG5cdFx0XHR0aGlzLl93cmFwcGVyLmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lcik7XHJcblx0XHR9XHJcblx0XHRlbHNlXHJcblx0XHRcdEwuQ29udHJvbC5wcm90b3R5cGUuYWRkVG8uY2FsbCh0aGlzLCBtYXApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblxyXG5cdG9uUmVtb3ZlOiBmdW5jdGlvbihtYXApIHtcclxuXHRcdHRoaXMuX3JlY29yZHNDYWNoZSA9IHt9O1xyXG5cdFx0Ly8gbWFwLm9mZih7XHJcblx0XHQvLyBcdFx0J2xheWVyYWRkJzogdGhpcy5fb25MYXllckFkZFJlbW92ZSxcclxuXHRcdC8vIFx0XHQnbGF5ZXJyZW1vdmUnOiB0aGlzLl9vbkxheWVyQWRkUmVtb3ZlXHJcblx0XHQvLyBcdH0sIHRoaXMpO1xyXG5cdFx0bWFwLm9mZih7XHJcblx0XHRcdC8vIFx0XHQnbGF5ZXJhZGQnOiB0aGlzLl9vbkxheWVyQWRkUmVtb3ZlLFxyXG5cdFx0XHQvLyBcdFx0J2xheWVycmVtb3ZlJzogdGhpcy5fb25MYXllckFkZFJlbW92ZVxyXG5cdFx0XHQncmVzaXplJzogdGhpcy5faGFuZGxlQXV0b3Jlc2l6ZVxyXG5cdFx0XHR9LCB0aGlzKTtcclxuXHR9LFxyXG5cclxuXHQvLyBfb25MYXllckFkZFJlbW92ZTogZnVuY3Rpb24oZSkge1xyXG5cdC8vIFx0Ly93aXRob3V0IHRoaXMsIHJ1biBzZXRMYXllciBhbHNvIGZvciBlYWNoIE1hcmtlcnMhISB0byBvcHRpbWl6ZSFcclxuXHQvLyBcdGlmKGUubGF5ZXIgaW5zdGFuY2VvZiBMLkxheWVyR3JvdXApXHJcblx0Ly8gXHRcdGlmKCBMLnN0YW1wKGUubGF5ZXIpICE9IEwuc3RhbXAodGhpcy5fbGF5ZXIpIClcclxuXHQvLyBcdFx0XHR0aGlzLnNldExheWVyKGUubGF5ZXIpO1xyXG5cdC8vIH0sXHJcblxyXG5cdHNldExheWVyOiBmdW5jdGlvbihsYXllcikge1x0Ly9zZXQgc2VhcmNoIGxheWVyIGF0IHJ1bnRpbWVcclxuXHRcdC8vdGhpcy5vcHRpb25zLmxheWVyID0gbGF5ZXI7IC8vc2V0dGluZyB0aGlzLCBydW4gb25seSB0aGlzLl9yZWNvcmRzRnJvbUxheWVyKClcclxuXHRcdHRoaXMuX2xheWVyID0gbGF5ZXI7XHJcblx0XHR0aGlzLl9sYXllci5hZGRUbyh0aGlzLl9tYXApO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fSxcclxuXHRcclxuXHRzaG93QWxlcnQ6IGZ1bmN0aW9uKHRleHQpIHtcclxuXHRcdHZhciBzZWxmID0gdGhpcztcclxuXHRcdHRleHQgPSB0ZXh0IHx8IHRoaXMub3B0aW9ucy50ZXh0RXJyO1xyXG5cdFx0dGhpcy5fYWxlcnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblx0XHR0aGlzLl9hbGVydC5pbm5lckhUTUwgPSB0ZXh0O1xyXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMudGltZXJBbGVydCk7XHJcblx0XHRcclxuXHRcdHRoaXMudGltZXJBbGVydCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdHNlbGYuaGlkZUFsZXJ0KCk7XHJcblx0XHR9LHRoaXMub3B0aW9ucy5hdXRvQ29sbGFwc2VUaW1lKTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblx0XHJcblx0aGlkZUFsZXJ0OiBmdW5jdGlvbigpIHtcclxuXHRcdHRoaXMuX2FsZXJ0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cdFx0XHJcblx0Y2FuY2VsOiBmdW5jdGlvbigpIHtcclxuXHRcdHRoaXMuX2lucHV0LnZhbHVlID0gJyc7XHJcblx0XHR0aGlzLl9oYW5kbGVLZXlwcmVzcyh7IGtleUNvZGU6IDggfSk7Ly9zaW11bGF0ZSBiYWNrc3BhY2Uga2V5cHJlc3NcclxuXHRcdHRoaXMuX2lucHV0LnNpemUgPSB0aGlzLl9pbnB1dE1pblNpemU7XHJcblx0XHR0aGlzLl9pbnB1dC5mb2N1cygpO1xyXG5cdFx0dGhpcy5fY2FuY2VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHR0aGlzLl9oaWRlVG9vbHRpcCgpO1xyXG5cdFx0dGhpcy5maXJlKCdzZWFyY2g6Y2FuY2VsJyk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cdFxyXG5cdGV4cGFuZDogZnVuY3Rpb24odG9nZ2xlKSB7XHJcblx0XHR0b2dnbGUgPSB0eXBlb2YgdG9nZ2xlID09PSAnYm9vbGVhbicgPyB0b2dnbGUgOiB0cnVlO1xyXG5cdFx0dGhpcy5faW5wdXQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblx0XHRMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fY29udGFpbmVyLCAnc2VhcmNoLWV4cCcpO1xyXG5cdFx0aWYgKCB0b2dnbGUgIT09IGZhbHNlICkge1xyXG5cdFx0XHR0aGlzLl9pbnB1dC5mb2N1cygpO1xyXG5cdFx0XHR0aGlzLl9tYXAub24oJ2RyYWdzdGFydCBjbGljaycsIHRoaXMuY29sbGFwc2UsIHRoaXMpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5maXJlKCdzZWFyY2g6ZXhwYW5kZWQnKTtcclxuXHRcdHJldHVybiB0aGlzO1x0XHJcblx0fSxcclxuXHJcblx0Y29sbGFwc2U6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dGhpcy5faGlkZVRvb2x0aXAoKTtcclxuXHRcdHRoaXMuY2FuY2VsKCk7XHJcblx0XHR0aGlzLl9hbGVydC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0dGhpcy5faW5wdXQuYmx1cigpO1xyXG5cdFx0aWYodGhpcy5vcHRpb25zLmNvbGxhcHNlZClcclxuXHRcdHtcclxuXHRcdFx0dGhpcy5faW5wdXQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdFx0dGhpcy5fY2FuY2VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHRcdFx0XHJcblx0XHRcdEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9jb250YWluZXIsICdzZWFyY2gtZXhwJyk7XHRcdFxyXG5cdFx0XHRpZiAodGhpcy5vcHRpb25zLmhpZGVNYXJrZXJPbkNvbGxhcHNlKSB7XHJcblx0XHRcdFx0dGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX21hcmtlclNlYXJjaCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5fbWFwLm9mZignZHJhZ3N0YXJ0IGNsaWNrJywgdGhpcy5jb2xsYXBzZSwgdGhpcyk7XHJcblx0XHR9XHJcblx0XHR0aGlzLmZpcmUoJ3NlYXJjaDpjb2xsYXBzZWQnKTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblx0XHJcblx0Y29sbGFwc2VEZWxheWVkOiBmdW5jdGlvbigpIHtcdC8vY29sbGFwc2UgYWZ0ZXIgZGVsYXksIHVzZWQgb25faW5wdXQgYmx1clxyXG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xyXG5cdFx0aWYgKCF0aGlzLm9wdGlvbnMuYXV0b0NvbGxhcHNlKSByZXR1cm4gdGhpcztcclxuXHRcdGNsZWFyVGltZW91dCh0aGlzLnRpbWVyQ29sbGFwc2UpO1xyXG5cdFx0dGhpcy50aW1lckNvbGxhcHNlID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuXHRcdFx0c2VsZi5jb2xsYXBzZSgpO1xyXG5cdFx0fSwgdGhpcy5vcHRpb25zLmF1dG9Db2xsYXBzZVRpbWUpO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHRcdFxyXG5cdH0sXHJcblxyXG5cdGNvbGxhcHNlRGVsYXllZFN0b3A6IGZ1bmN0aW9uKCkge1xyXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMudGltZXJDb2xsYXBzZSk7XHJcblx0XHRyZXR1cm4gdGhpcztcdFx0XHJcblx0fSxcclxuXHJcblx0Ly8vL3N0YXJ0IERPTSBjcmVhdGlvbnNcclxuXHRfY3JlYXRlQWxlcnQ6IGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xyXG5cdFx0dmFyIGFsZXJ0ID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgY2xhc3NOYW1lLCB0aGlzLl9jb250YWluZXIpO1xyXG5cdFx0YWxlcnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcblx0XHRMLkRvbUV2ZW50XHJcblx0XHRcdC5vbihhbGVydCwgJ2NsaWNrJywgTC5Eb21FdmVudC5zdG9wLCB0aGlzKVxyXG5cdFx0XHQub24oYWxlcnQsICdjbGljaycsIHRoaXMuaGlkZUFsZXJ0LCB0aGlzKTtcclxuXHJcblx0XHRyZXR1cm4gYWxlcnQ7XHJcblx0fSxcclxuXHJcblx0X2NyZWF0ZUlucHV0OiBmdW5jdGlvbiAodGV4dCwgY2xhc3NOYW1lKSB7XHJcblx0XHR2YXIgc2VsZiA9IHRoaXM7XHJcblx0XHR2YXIgbGFiZWwgPSBMLkRvbVV0aWwuY3JlYXRlKCdsYWJlbCcsIGNsYXNzTmFtZSwgdGhpcy5fY29udGFpbmVyKTtcclxuXHRcdHZhciBpbnB1dCA9IEwuRG9tVXRpbC5jcmVhdGUoJ2lucHV0JywgY2xhc3NOYW1lLCB0aGlzLl9jb250YWluZXIpO1xyXG5cdFx0aW5wdXQudHlwZSA9ICd0ZXh0JztcclxuXHRcdGlucHV0LnNpemUgPSB0aGlzLl9pbnB1dE1pblNpemU7XHJcblx0XHRpbnB1dC52YWx1ZSA9ICcnO1xyXG5cdFx0aW5wdXQuYXV0b2NvbXBsZXRlID0gJ29mZic7XHJcblx0XHRpbnB1dC5hdXRvY29ycmVjdCA9ICdvZmYnO1xyXG5cdFx0aW5wdXQuYXV0b2NhcGl0YWxpemUgPSAnb2ZmJztcclxuXHRcdGlucHV0LnBsYWNlaG9sZGVyID0gdGV4dDtcclxuXHRcdGlucHV0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHRpbnB1dC5yb2xlID0gJ3NlYXJjaCc7XHJcblx0XHRpbnB1dC5pZCA9IGlucHV0LnJvbGUgKyBpbnB1dC50eXBlICsgaW5wdXQuc2l6ZTtcclxuXHRcdFxyXG5cdFx0bGFiZWwuaHRtbEZvciA9IGlucHV0LmlkO1xyXG5cdFx0bGFiZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdGxhYmVsLnZhbHVlID0gdGV4dDtcclxuXHJcblx0XHRMLkRvbUV2ZW50XHJcblx0XHRcdC5kaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbihpbnB1dClcclxuXHRcdFx0Lm9uKGlucHV0LCAna2V5dXAnLCB0aGlzLl9oYW5kbGVLZXlwcmVzcywgdGhpcylcclxuXHRcdFx0Lm9uKGlucHV0LCAncGFzdGUnLCBmdW5jdGlvbihlKSB7XHJcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbihlKSB7XHJcblx0XHRcdFx0XHRzZWxmLl9oYW5kbGVLZXlwcmVzcyhlKTtcclxuXHRcdFx0XHR9LDEwLGUpO1xyXG5cdFx0XHR9LCB0aGlzKVxyXG5cdFx0XHQub24oaW5wdXQsICdibHVyJywgdGhpcy5jb2xsYXBzZURlbGF5ZWQsIHRoaXMpXHJcblx0XHRcdC5vbihpbnB1dCwgJ2ZvY3VzJywgdGhpcy5jb2xsYXBzZURlbGF5ZWRTdG9wLCB0aGlzKTtcclxuXHRcdFxyXG5cdFx0cmV0dXJuIGlucHV0O1xyXG5cdH0sXHJcblxyXG5cdF9jcmVhdGVDYW5jZWw6IGZ1bmN0aW9uICh0aXRsZSwgY2xhc3NOYW1lKSB7XHJcblx0XHR2YXIgY2FuY2VsID0gTC5Eb21VdGlsLmNyZWF0ZSgnYScsIGNsYXNzTmFtZSwgdGhpcy5fY29udGFpbmVyKTtcclxuXHRcdGNhbmNlbC5ocmVmID0gJyMnO1xyXG5cdFx0Y2FuY2VsLnRpdGxlID0gdGl0bGU7XHJcblx0XHRjYW5jZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdGNhbmNlbC5pbm5lckhUTUwgPSBcIjxzcGFuPiZvdGltZXM7PC9zcGFuPlwiOy8vaW1hZ2VsZXNzKHNlZSBjc3MpXHJcblxyXG5cdFx0TC5Eb21FdmVudFxyXG5cdFx0XHQub24oY2FuY2VsLCAnY2xpY2snLCBMLkRvbUV2ZW50LnN0b3AsIHRoaXMpXHJcblx0XHRcdC5vbihjYW5jZWwsICdjbGljaycsIHRoaXMuY2FuY2VsLCB0aGlzKTtcclxuXHJcblx0XHRyZXR1cm4gY2FuY2VsO1xyXG5cdH0sXHJcblx0XHJcblx0X2NyZWF0ZUJ1dHRvbjogZnVuY3Rpb24gKHRpdGxlLCBjbGFzc05hbWUpIHtcclxuXHRcdHZhciBidXR0b24gPSBMLkRvbVV0aWwuY3JlYXRlKCdhJywgY2xhc3NOYW1lLCB0aGlzLl9jb250YWluZXIpO1xyXG5cdFx0YnV0dG9uLmhyZWYgPSAnIyc7XHJcblx0XHRidXR0b24udGl0bGUgPSB0aXRsZTtcclxuXHJcblx0XHRMLkRvbUV2ZW50XHJcblx0XHRcdC5vbihidXR0b24sICdjbGljaycsIEwuRG9tRXZlbnQuc3RvcCwgdGhpcylcclxuXHRcdFx0Lm9uKGJ1dHRvbiwgJ2NsaWNrJywgdGhpcy5faGFuZGxlU3VibWl0LCB0aGlzKVx0XHRcdFxyXG5cdFx0XHQub24oYnV0dG9uLCAnZm9jdXMnLCB0aGlzLmNvbGxhcHNlRGVsYXllZFN0b3AsIHRoaXMpXHJcblx0XHRcdC5vbihidXR0b24sICdibHVyJywgdGhpcy5jb2xsYXBzZURlbGF5ZWQsIHRoaXMpO1xyXG5cclxuXHRcdHJldHVybiBidXR0b247XHJcblx0fSxcclxuXHJcblx0X2NyZWF0ZVRvb2x0aXA6IGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xyXG5cdFx0dmFyIHNlbGYgPSB0aGlzO1x0XHRcclxuXHRcdHZhciB0b29sID0gTC5Eb21VdGlsLmNyZWF0ZSgndWwnLCBjbGFzc05hbWUsIHRoaXMuX2NvbnRhaW5lcik7XHJcblx0XHR0b29sLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHRMLkRvbUV2ZW50XHJcblx0XHRcdC5kaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbih0b29sKVxyXG5cdFx0XHQub24odG9vbCwgJ2JsdXInLCB0aGlzLmNvbGxhcHNlRGVsYXllZCwgdGhpcylcclxuXHRcdFx0Lm9uKHRvb2wsICdtb3VzZXdoZWVsJywgZnVuY3Rpb24oZSkge1xyXG5cdFx0XHRcdHNlbGYuY29sbGFwc2VEZWxheWVkU3RvcCgpO1xyXG5cdFx0XHRcdEwuRG9tRXZlbnQuc3RvcFByb3BhZ2F0aW9uKGUpOy8vZGlzYWJsZSB6b29tIG1hcFxyXG5cdFx0XHR9LCB0aGlzKVxyXG5cdFx0XHQub24odG9vbCwgJ21vdXNlb3ZlcicsIGZ1bmN0aW9uKGUpIHtcclxuXHRcdFx0XHRzZWxmLmNvbGxhcHNlRGVsYXllZFN0b3AoKTtcclxuXHRcdFx0fSwgdGhpcyk7XHJcblx0XHRyZXR1cm4gdG9vbDtcclxuXHR9LFxyXG5cclxuXHRfY3JlYXRlVGlwOiBmdW5jdGlvbih0ZXh0LCB2YWwpIHsvL3ZhbCBpcyBvYmplY3QgaW4gcmVjb3JkQ2FjaGUsIHVzdWFsbHkgaXMgTGF0bG5nXHJcblx0XHR2YXIgdGlwO1xyXG5cdFx0XHJcblx0XHRpZih0aGlzLm9wdGlvbnMuYnVpbGRUaXApXHJcblx0XHR7XHJcblx0XHRcdHRpcCA9IHRoaXMub3B0aW9ucy5idWlsZFRpcC5jYWxsKHRoaXMsIHRleHQsIHZhbCk7IC8vY3VzdG9tIHRpcCBub2RlIG9yIGh0bWwgc3RyaW5nXHJcblx0XHRcdGlmKHR5cGVvZiB0aXAgPT09ICdzdHJpbmcnKVxyXG5cdFx0XHR7XHJcblx0XHRcdFx0dmFyIHRtcE5vZGUgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnKTtcclxuXHRcdFx0XHR0bXBOb2RlLmlubmVySFRNTCA9IHRpcDtcclxuXHRcdFx0XHR0aXAgPSB0bXBOb2RlLmZpcnN0Q2hpbGQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGVsc2VcclxuXHRcdHtcclxuXHRcdFx0dGlwID0gTC5Eb21VdGlsLmNyZWF0ZSgnbGknLCAnJyk7XHJcblx0XHRcdHRpcC5pbm5lckhUTUwgPSB0ZXh0O1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHRMLkRvbVV0aWwuYWRkQ2xhc3ModGlwLCAnc2VhcmNoLXRpcCcpO1xyXG5cdFx0dGlwLl90ZXh0ID0gdGV4dDsgLy92YWx1ZSByZXBsYWNlZCBpbiB0aGlzLl9pbnB1dCBhbmQgdXNlZCBieSBfYXV0b1R5cGVcclxuXHJcblx0XHRpZih0aGlzLm9wdGlvbnMudGlwQXV0b1N1Ym1pdClcclxuXHRcdFx0TC5Eb21FdmVudFxyXG5cdFx0XHRcdC5kaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbih0aXApXHRcdFxyXG5cdFx0XHRcdC5vbih0aXAsICdjbGljaycsIEwuRG9tRXZlbnQuc3RvcCwgdGhpcylcclxuXHRcdFx0XHQub24odGlwLCAnY2xpY2snLCBmdW5jdGlvbihlKSB7XHJcblx0XHRcdFx0XHR0aGlzLl9pbnB1dC52YWx1ZSA9IHRleHQ7XHJcblx0XHRcdFx0XHR0aGlzLl9oYW5kbGVBdXRvcmVzaXplKCk7XHJcblx0XHRcdFx0XHR0aGlzLl9pbnB1dC5mb2N1cygpO1xyXG5cdFx0XHRcdFx0dGhpcy5faGlkZVRvb2x0aXAoKTtcdFxyXG5cdFx0XHRcdFx0dGhpcy5faGFuZGxlU3VibWl0KCk7XHJcblx0XHRcdFx0fSwgdGhpcyk7XHJcblxyXG5cdFx0cmV0dXJuIHRpcDtcclxuXHR9LFxyXG5cclxuXHQvLy8vLy9lbmQgRE9NIGNyZWF0aW9uc1xyXG5cclxuXHRfZ2V0VXJsOiBmdW5jdGlvbih0ZXh0KSB7XHJcblx0XHRyZXR1cm4gKHR5cGVvZiB0aGlzLm9wdGlvbnMudXJsID09PSAnZnVuY3Rpb24nKSA/IHRoaXMub3B0aW9ucy51cmwodGV4dCkgOiB0aGlzLm9wdGlvbnMudXJsO1xyXG5cdH0sXHJcblxyXG5cdF9kZWZhdWx0RmlsdGVyRGF0YTogZnVuY3Rpb24odGV4dCwgcmVjb3Jkcykge1xyXG5cdFxyXG5cdFx0dmFyIEksIGljYXNlLCByZWdTZWFyY2gsIGZyZWNvcmRzID0ge307XHJcblxyXG5cdFx0dGV4dCA9IHRleHQucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICcnKTsgIC8vc2FuaXRpemUgcmVtb3ZlIGFsbCBzcGVjaWFsIGNoYXJhY3RlcnNcclxuXHRcdGlmKHRleHQ9PT0nJylcclxuXHRcdFx0cmV0dXJuIFtdO1xyXG5cclxuXHRcdEkgPSB0aGlzLm9wdGlvbnMuaW5pdGlhbCA/ICdeJyA6ICcnOyAgLy9zZWFyY2ggb25seSBpbml0aWFsIHRleHRcclxuXHRcdGljYXNlID0gIXRoaXMub3B0aW9ucy5jYXNlc2Vuc2l0aXZlID8gJ2knIDogdW5kZWZpbmVkO1xyXG5cclxuXHRcdHJlZ1NlYXJjaCA9IG5ldyBSZWdFeHAoSSArIHRleHQsIGljYXNlKTtcclxuXHJcblx0XHQvL1RPRE8gdXNlIC5maWx0ZXIgb3IgLm1hcFxyXG5cdFx0Zm9yKHZhciBrZXkgaW4gcmVjb3Jkcykge1xyXG5cdFx0XHRpZiggcmVnU2VhcmNoLnRlc3Qoa2V5KSApXHJcblx0XHRcdFx0ZnJlY29yZHNba2V5XT0gcmVjb3Jkc1trZXldO1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHRyZXR1cm4gZnJlY29yZHM7XHJcblx0fSxcclxuXHJcblx0c2hvd1Rvb2x0aXA6IGZ1bmN0aW9uKHJlY29yZHMpIHtcclxuXHRcdFxyXG5cclxuXHRcdHRoaXMuX2NvdW50ZXJ0aXBzID0gMDtcclxuXHRcdHRoaXMuX3Rvb2x0aXAuaW5uZXJIVE1MID0gJyc7XHJcblx0XHR0aGlzLl90b29sdGlwLmN1cnJlbnRTZWxlY3Rpb24gPSAtMTsgIC8vaW5pemlhbGl6ZWQgZm9yIF9oYW5kbGVBcnJvd1NlbGVjdCgpXHJcblxyXG5cdFx0aWYodGhpcy5vcHRpb25zLnRvb2x0aXBMaW1pdClcclxuXHRcdHtcclxuXHRcdFx0Zm9yKHZhciBrZXkgaW4gcmVjb3JkcykvL2ZpbGwgdG9vbHRpcFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0aWYodGhpcy5fY291bnRlcnRpcHMgPT09IHRoaXMub3B0aW9ucy50b29sdGlwTGltaXQpXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcclxuXHRcdFx0XHR0aGlzLl9jb3VudGVydGlwcysrO1xyXG5cclxuXHRcdFx0XHR0aGlzLl90b29sdGlwLmFwcGVuZENoaWxkKCB0aGlzLl9jcmVhdGVUaXAoa2V5LCByZWNvcmRzW2tleV0pICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0aWYodGhpcy5fY291bnRlcnRpcHMgPiAwKVxyXG5cdFx0e1xyXG5cdFx0XHR0aGlzLl90b29sdGlwLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cdFx0XHRcclxuXHRcdFx0aWYodGhpcy5fYXV0b1R5cGVUbXApXHJcblx0XHRcdFx0dGhpcy5fYXV0b1R5cGUoKTtcclxuXHJcblx0XHRcdHRoaXMuX2F1dG9UeXBlVG1wID0gdGhpcy5vcHRpb25zLmF1dG9UeXBlOy8vcmVzZXQgZGVmYXVsdCB2YWx1ZVxyXG5cdFx0fVxyXG5cdFx0ZWxzZVxyXG5cdFx0XHR0aGlzLl9oaWRlVG9vbHRpcCgpO1xyXG5cclxuXHRcdHRoaXMuX3Rvb2x0aXAuc2Nyb2xsVG9wID0gMDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fY291bnRlcnRpcHM7XHJcblx0fSxcclxuXHJcblx0X2hpZGVUb29sdGlwOiBmdW5jdGlvbigpIHtcclxuXHRcdHRoaXMuX3Rvb2x0aXAuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdHRoaXMuX3Rvb2x0aXAuaW5uZXJIVE1MID0gJyc7XHJcblx0XHRyZXR1cm4gMDtcclxuXHR9LFxyXG5cclxuXHRfZGVmYXVsdEZvcm1hdERhdGE6IGZ1bmN0aW9uKGpzb24pIHtcdC8vZGVmYXVsdCBjYWxsYmFjayBmb3IgZm9ybWF0IGRhdGEgdG8gaW5kZXhlZCBkYXRhXHJcblx0XHR2YXIgc2VsZiA9IHRoaXMsXHJcblx0XHRcdHByb3BOYW1lID0gdGhpcy5vcHRpb25zLnByb3BlcnR5TmFtZSxcclxuXHRcdFx0cHJvcExvYyA9IHRoaXMub3B0aW9ucy5wcm9wZXJ0eUxvYyxcclxuXHRcdFx0aSwganNvbnJldCA9IHt9O1xyXG5cclxuXHRcdGlmKCBMLlV0aWwuaXNBcnJheShwcm9wTG9jKSApXHJcblx0XHRcdGZvcihpIGluIGpzb24pXHJcblx0XHRcdFx0anNvbnJldFsgc2VsZi5fZ2V0UGF0aChqc29uW2ldLHByb3BOYW1lKSBdPSBMLmxhdExuZygganNvbltpXVsgcHJvcExvY1swXSBdLCBqc29uW2ldWyBwcm9wTG9jWzFdIF0gKTtcclxuXHRcdGVsc2VcclxuXHRcdFx0Zm9yKGkgaW4ganNvbilcclxuXHRcdFx0XHRqc29ucmV0WyBzZWxmLl9nZXRQYXRoKGpzb25baV0scHJvcE5hbWUpIF09IEwubGF0TG5nKCBzZWxmLl9nZXRQYXRoKGpzb25baV0scHJvcExvYykgKTtcclxuXHRcdC8vVE9ETyB0aHJvdyBuZXcgRXJyb3IoXCJwcm9wZXJ0eU5hbWUgJ1wiK3Byb3BOYW1lK1wiJyBub3QgZm91bmQgaW4gSlNPTiBkYXRhXCIpO1xyXG5cdFx0cmV0dXJuIGpzb25yZXQ7XHJcblx0fSxcclxuXHJcblx0X3JlY29yZHNGcm9tSnNvbnA6IGZ1bmN0aW9uKHRleHQsIGNhbGxBZnRlcikgeyAgLy9leHRyYWN0IHNlYXJjaGVkIHJlY29yZHMgZnJvbSByZW1vdGUganNvbnAgc2VydmljZVxyXG5cdFx0TC5Db250cm9sLlNlYXJjaC5jYWxsSnNvbnAgPSBjYWxsQWZ0ZXI7XHJcblx0XHR2YXIgc2NyaXB0ID0gTC5Eb21VdGlsLmNyZWF0ZSgnc2NyaXB0JywnbGVhZmxldC1zZWFyY2gtanNvbnAnLCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdICksXHRcdFx0XHJcblx0XHRcdHVybCA9IEwuVXRpbC50ZW1wbGF0ZSh0aGlzLl9nZXRVcmwodGV4dCkrJyYnK3RoaXMub3B0aW9ucy5qc29ucFBhcmFtKyc9TC5Db250cm9sLlNlYXJjaC5jYWxsSnNvbnAnLCB7czogdGV4dH0pOyAvL3BhcnNpbmcgdXJsXHJcblx0XHRcdC8vcm5kID0gJyZfPScrTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjEwMDAwKTtcclxuXHRcdFx0Ly9UT0RPIGFkZCBybmQgcGFyYW0gb3IgcmFuZG9taXplIGNhbGxiYWNrIG5hbWUhIGluIHJlY29yZHNGcm9tSnNvbnBcclxuXHRcdHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XHJcblx0XHRzY3JpcHQuc3JjID0gdXJsO1xyXG5cdFx0cmV0dXJuIHsgYWJvcnQ6IGZ1bmN0aW9uKCkgeyBzY3JpcHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHQpOyB9IH07XHJcblx0fSxcclxuXHJcblx0X3JlY29yZHNGcm9tQWpheDogZnVuY3Rpb24odGV4dCwgY2FsbEFmdGVyKSB7XHQvL0FqYXggcmVxdWVzdFxyXG5cdFx0aWYgKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHdpbmRvdy5YTUxIdHRwUmVxdWVzdCA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxIVFRQLjYuMFwiKTsgfVxyXG5cdFx0XHRcdGNhdGNoICAoZTEpIHtcclxuXHRcdFx0XHRcdHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxIVFRQLjMuMFwiKTsgfVxyXG5cdFx0XHRcdFx0Y2F0Y2ggKGUyKSB7IHRocm93IG5ldyBFcnJvcihcIlhNTEh0dHBSZXF1ZXN0IGlzIG5vdCBzdXBwb3J0ZWRcIik7IH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0XHR2YXIgSUU4b3I5ID0gKCBMLkJyb3dzZXIuaWUgJiYgIXdpbmRvdy5hdG9iICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgKSxcclxuXHRcdFx0cmVxdWVzdCA9IElFOG9yOSA/IG5ldyBYRG9tYWluUmVxdWVzdCgpIDogbmV3IFhNTEh0dHBSZXF1ZXN0KCksXHJcblx0XHRcdHVybCA9IEwuVXRpbC50ZW1wbGF0ZSh0aGlzLl9nZXRVcmwodGV4dCksIHtzOiB0ZXh0fSk7XHJcblxyXG5cdFx0Ly9ybmQgPSAnJl89JytNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMTAwMDApO1xyXG5cdFx0Ly9UT0RPIGFkZCBybmQgcGFyYW0gb3IgcmFuZG9taXplIGNhbGxiYWNrIG5hbWUhIGluIHJlY29yZHNGcm9tQWpheFx0XHRcdFxyXG5cdFx0XHJcblx0XHRyZXF1ZXN0Lm9wZW4oXCJHRVRcIiwgdXJsKTtcclxuXHRcdFxyXG5cclxuXHRcdHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdGNhbGxBZnRlciggSlNPTi5wYXJzZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCkgKTtcclxuXHRcdH07XHJcblx0XHRyZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0ICAgIGlmKHJlcXVlc3QucmVhZHlTdGF0ZSA9PT0gNCAmJiByZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XHJcblx0XHQgICAgXHR0aGlzLm9ubG9hZCgpO1xyXG5cdFx0ICAgIH1cclxuXHRcdH07XHJcblxyXG5cdFx0cmVxdWVzdC5zZW5kKCk7XHJcblx0XHRyZXR1cm4gcmVxdWVzdDsgICBcclxuXHR9LFxyXG5cclxuICBfc2VhcmNoSW5MYXllcjogZnVuY3Rpb24obGF5ZXIsIHJldFJlY29yZHMsIHByb3BOYW1lKSB7XHJcbiAgICB2YXIgc2VsZiA9IHRoaXMsIGxvYztcclxuXHJcbiAgICBpZihsYXllciBpbnN0YW5jZW9mIEwuQ29udHJvbC5TZWFyY2guTWFya2VyKSByZXR1cm47XHJcblxyXG4gICAgaWYobGF5ZXIgaW5zdGFuY2VvZiBMLk1hcmtlciB8fCBsYXllciBpbnN0YW5jZW9mIEwuQ2lyY2xlTWFya2VyKVxyXG4gICAge1xyXG4gICAgICBpZihzZWxmLl9nZXRQYXRoKGxheWVyLm9wdGlvbnMscHJvcE5hbWUpKVxyXG4gICAgICB7XHJcbiAgICAgICAgbG9jID0gbGF5ZXIuZ2V0TGF0TG5nKCk7XHJcbiAgICAgICAgbG9jLmxheWVyID0gbGF5ZXI7XHJcbiAgICAgICAgcmV0UmVjb3Jkc1sgc2VsZi5fZ2V0UGF0aChsYXllci5vcHRpb25zLHByb3BOYW1lKSBdID0gbG9jO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYoc2VsZi5fZ2V0UGF0aChsYXllci5mZWF0dXJlLnByb3BlcnRpZXMscHJvcE5hbWUpKVxyXG4gICAgICB7XHJcbiAgICAgICAgbG9jID0gbGF5ZXIuZ2V0TGF0TG5nKCk7XHJcbiAgICAgICAgbG9jLmxheWVyID0gbGF5ZXI7XHJcbiAgICAgICAgcmV0UmVjb3Jkc1sgc2VsZi5fZ2V0UGF0aChsYXllci5mZWF0dXJlLnByb3BlcnRpZXMscHJvcE5hbWUpIF0gPSBsb2M7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJwcm9wZXJ0eU5hbWUgJ1wiK3Byb3BOYW1lK1wiJyBub3QgZm91bmQgaW4gbWFya2VyXCIpOyBcclxuICAgICAgICBjb25zb2xlLndhcm4oXCJwcm9wZXJ0eU5hbWUgJ1wiK3Byb3BOYW1lK1wiJyBub3QgZm91bmQgaW4gbWFya2VyXCIpOyBcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZihsYXllciBpbnN0YW5jZW9mIEwuUGF0aCB8fCBsYXllciBpbnN0YW5jZW9mIEwuUG9seWxpbmUgfHwgbGF5ZXIgaW5zdGFuY2VvZiBMLlBvbHlnb24pXHJcbiAgICB7XHJcbiAgICAgIGlmKHNlbGYuX2dldFBhdGgobGF5ZXIub3B0aW9ucyxwcm9wTmFtZSkpXHJcbiAgICAgIHtcclxuICAgICAgICBsb2MgPSBsYXllci5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTtcclxuICAgICAgICBsb2MubGF5ZXIgPSBsYXllcjtcclxuICAgICAgICByZXRSZWNvcmRzWyBzZWxmLl9nZXRQYXRoKGxheWVyLm9wdGlvbnMscHJvcE5hbWUpIF0gPSBsb2M7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZihzZWxmLl9nZXRQYXRoKGxheWVyLmZlYXR1cmUucHJvcGVydGllcyxwcm9wTmFtZSkpXHJcbiAgICAgIHtcclxuICAgICAgICBsb2MgPSBsYXllci5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTtcclxuICAgICAgICBsb2MubGF5ZXIgPSBsYXllcjtcclxuICAgICAgICByZXRSZWNvcmRzWyBzZWxmLl9nZXRQYXRoKGxheWVyLmZlYXR1cmUucHJvcGVydGllcyxwcm9wTmFtZSkgXSA9IGxvYztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvL3Rocm93IG5ldyBFcnJvcihcInByb3BlcnR5TmFtZSAnXCIrcHJvcE5hbWUrXCInIG5vdCBmb3VuZCBpbiBzaGFwZVwiKTsgXHJcbiAgICAgICAgY29uc29sZS53YXJuKFwicHJvcGVydHlOYW1lICdcIitwcm9wTmFtZStcIicgbm90IGZvdW5kIGluIHNoYXBlXCIpOyBcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZihsYXllci5oYXNPd25Qcm9wZXJ0eSgnZmVhdHVyZScpKS8vR2VvSlNPTlxyXG4gICAge1xyXG4gICAgICBpZihsYXllci5mZWF0dXJlLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYobGF5ZXIuZ2V0TGF0TG5nICYmIHR5cGVvZiBsYXllci5nZXRMYXRMbmcgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgIGxvYyA9IGxheWVyLmdldExhdExuZygpO1xyXG4gICAgICAgICAgbG9jLmxheWVyID0gbGF5ZXI7XHRcdFx0XHJcbiAgICAgICAgICByZXRSZWNvcmRzWyBsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbcHJvcE5hbWVdIF0gPSBsb2M7XHJcbiAgICAgICAgfSBlbHNlIGlmKGxheWVyLmdldEJvdW5kcyAmJiB0eXBlb2YgbGF5ZXIuZ2V0Qm91bmRzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICBsb2MgPSBsYXllci5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTtcclxuICAgICAgICAgIGxvYy5sYXllciA9IGxheWVyO1x0XHRcdFxyXG4gICAgICAgICAgcmV0UmVjb3Jkc1sgbGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW3Byb3BOYW1lXSBdID0gbG9jO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJVbmtub3duIHR5cGUgb2YgTGF5ZXJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vdGhyb3cgbmV3IEVycm9yKFwicHJvcGVydHlOYW1lICdcIitwcm9wTmFtZStcIicgbm90IGZvdW5kIGluIGZlYXR1cmVcIik7XHJcbiAgICAgICAgY29uc29sZS53YXJuKFwicHJvcGVydHlOYW1lICdcIitwcm9wTmFtZStcIicgbm90IGZvdW5kIGluIGZlYXR1cmVcIik7IFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKGxheWVyIGluc3RhbmNlb2YgTC5MYXllckdyb3VwKVxyXG4gICAge1xyXG4gICAgICBsYXllci5lYWNoTGF5ZXIoZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgc2VsZi5fc2VhcmNoSW5MYXllcihsYXllciwgcmV0UmVjb3JkcywgcHJvcE5hbWUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9LFxyXG5cdFxyXG5cdF9yZWNvcmRzRnJvbUxheWVyOiBmdW5jdGlvbigpIHtcdC8vcmV0dXJuIHRhYmxlOiBrZXksdmFsdWUgZnJvbSBsYXllclxyXG5cdFx0dmFyIHNlbGYgPSB0aGlzLFxyXG5cdFx0XHRyZXRSZWNvcmRzID0ge30sXHJcblx0XHRcdHByb3BOYW1lID0gdGhpcy5vcHRpb25zLnByb3BlcnR5TmFtZTtcclxuXHRcdFxyXG5cdFx0dGhpcy5fbGF5ZXIuZWFjaExheWVyKGZ1bmN0aW9uIChsYXllcikge1xyXG5cdFx0XHRzZWxmLl9zZWFyY2hJbkxheWVyKGxheWVyLCByZXRSZWNvcmRzLCBwcm9wTmFtZSk7XHJcblx0XHR9KTtcclxuXHRcdFxyXG5cdFx0cmV0dXJuIHJldFJlY29yZHM7XHJcblx0fSxcclxuXHRcclxuXHRfYXV0b1R5cGU6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHJcblx0XHQvL1RPRE8gaW1wbGVtZW50cyBhdXR5cGUgd2l0aG91dCBzZWxlY3Rpb24odXNlZnVsIGZvciBtb2JpbGUgZGV2aWNlKVxyXG5cdFx0XHJcblx0XHR2YXIgc3RhcnQgPSB0aGlzLl9pbnB1dC52YWx1ZS5sZW5ndGgsXHJcblx0XHRcdGZpcnN0UmVjb3JkID0gdGhpcy5fdG9vbHRpcC5maXJzdENoaWxkID8gdGhpcy5fdG9vbHRpcC5maXJzdENoaWxkLl90ZXh0IDogJycsXHJcblx0XHRcdGVuZCA9IGZpcnN0UmVjb3JkLmxlbmd0aDtcclxuXHJcblx0XHRpZiAoZmlyc3RSZWNvcmQuaW5kZXhPZih0aGlzLl9pbnB1dC52YWx1ZSkgPT09IDApIHsgLy8gSWYgcHJlZml4IG1hdGNoXHJcblx0XHRcdHRoaXMuX2lucHV0LnZhbHVlID0gZmlyc3RSZWNvcmQ7XHJcblx0XHRcdHRoaXMuX2hhbmRsZUF1dG9yZXNpemUoKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLl9pbnB1dC5jcmVhdGVUZXh0UmFuZ2UpIHtcclxuXHRcdFx0XHR2YXIgc2VsUmFuZ2UgPSB0aGlzLl9pbnB1dC5jcmVhdGVUZXh0UmFuZ2UoKTtcclxuXHRcdFx0XHRzZWxSYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuXHRcdFx0XHRzZWxSYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIHN0YXJ0KTtcclxuXHRcdFx0XHRzZWxSYW5nZS5tb3ZlRW5kKCdjaGFyYWN0ZXInLCBlbmQpO1xyXG5cdFx0XHRcdHNlbFJhbmdlLnNlbGVjdCgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgaWYodGhpcy5faW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcclxuXHRcdFx0XHR0aGlzLl9pbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIGlmKHRoaXMuX2lucHV0LnNlbGVjdGlvblN0YXJ0KSB7XHJcblx0XHRcdFx0dGhpcy5faW5wdXQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcclxuXHRcdFx0XHR0aGlzLl9pbnB1dC5zZWxlY3Rpb25FbmQgPSBlbmQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRfaGlkZUF1dG9UeXBlOiBmdW5jdGlvbigpIHtcdC8vIGRlc2VsZWN0IHRleHQ6XHJcblxyXG5cdFx0dmFyIHNlbDtcclxuXHRcdGlmICgoc2VsID0gdGhpcy5faW5wdXQuc2VsZWN0aW9uKSAmJiBzZWwuZW1wdHkpIHtcclxuXHRcdFx0c2VsLmVtcHR5KCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmICh0aGlzLl9pbnB1dC5jcmVhdGVUZXh0UmFuZ2UpIHtcclxuXHRcdFx0c2VsID0gdGhpcy5faW5wdXQuY3JlYXRlVGV4dFJhbmdlKCk7XHJcblx0XHRcdHNlbC5jb2xsYXBzZSh0cnVlKTtcclxuXHRcdFx0dmFyIGVuZCA9IHRoaXMuX2lucHV0LnZhbHVlLmxlbmd0aDtcclxuXHRcdFx0c2VsLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgZW5kKTtcclxuXHRcdFx0c2VsLm1vdmVFbmQoJ2NoYXJhY3RlcicsIGVuZCk7XHJcblx0XHRcdHNlbC5zZWxlY3QoKTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRpZiAodGhpcy5faW5wdXQuZ2V0U2VsZWN0aW9uKSB7XHJcblx0XHRcdFx0dGhpcy5faW5wdXQuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5faW5wdXQuc2VsZWN0aW9uU3RhcnQgPSB0aGlzLl9pbnB1dC5zZWxlY3Rpb25FbmQ7XHJcblx0XHR9XHJcblx0fSxcclxuXHRcclxuXHRfaGFuZGxlS2V5cHJlc3M6IGZ1bmN0aW9uIChlKSB7XHQvL3J1biBfaW5wdXQga2V5dXAgZXZlbnRcclxuXHRcdHZhciBzZWxmID0gdGhpcztcclxuXHJcblx0XHRzd2l0Y2goZS5rZXlDb2RlKVxyXG5cdFx0e1xyXG5cdFx0XHRjYXNlIDI3Oi8vRXNjXHJcblx0XHRcdFx0dGhpcy5jb2xsYXBzZSgpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAxMzovL0VudGVyXHJcblx0XHRcdFx0aWYodGhpcy5fY291bnRlcnRpcHMgPT0gMSB8fCAodGhpcy5vcHRpb25zLmZpcnN0VGlwU3VibWl0ICYmIHRoaXMuX2NvdW50ZXJ0aXBzID4gMCkpIHtcclxuICAgICAgICAgIFx0XHRcdGlmKHRoaXMuX3Rvb2x0aXAuY3VycmVudFNlbGVjdGlvbiA9PSAtMSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLl9oYW5kbGVBcnJvd1NlbGVjdCgxKTtcclxuICAgICAgICAgIFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy5faGFuZGxlU3VibWl0KCk7XHQvL2RvIHNlYXJjaFxyXG5cdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAzODovL1VwXHJcblx0XHRcdFx0dGhpcy5faGFuZGxlQXJyb3dTZWxlY3QoLTEpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSA0MDovL0Rvd25cclxuXHRcdFx0XHR0aGlzLl9oYW5kbGVBcnJvd1NlbGVjdCgxKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgIDg6Ly9CYWNrc3BhY2VcclxuXHRcdFx0Y2FzZSA0NTovL0luc2VydFxyXG5cdFx0XHRjYXNlIDQ2Oi8vRGVsZXRlXHJcblx0XHRcdFx0dGhpcy5fYXV0b1R5cGVUbXAgPSBmYWxzZTsvL2Rpc2FibGUgdGVtcG9yYXJpbHkgYXV0b1R5cGVcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgMzc6Ly9MZWZ0XHJcblx0XHRcdGNhc2UgMzk6Ly9SaWdodFxyXG5cdFx0XHRjYXNlIDE2Oi8vU2hpZnRcclxuXHRcdFx0Y2FzZSAxNzovL0N0cmxcclxuXHRcdFx0Y2FzZSAzNTovL0VuZFxyXG5cdFx0XHRjYXNlIDM2Oi8vSG9tZVxyXG5cdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDovL0FsbCBrZXlzXHJcblx0XHRcdFx0aWYodGhpcy5faW5wdXQudmFsdWUubGVuZ3RoKVxyXG5cdFx0XHRcdFx0dGhpcy5fY2FuY2VsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cdFx0XHRcdGVsc2VcclxuXHRcdFx0XHRcdHRoaXMuX2NhbmNlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuXHRcdFx0XHRpZih0aGlzLl9pbnB1dC52YWx1ZS5sZW5ndGggPj0gdGhpcy5vcHRpb25zLm1pbkxlbmd0aClcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRjbGVhclRpbWVvdXQodGhpcy50aW1lcktleXByZXNzKTtcdC8vY2FuY2VsIGxhc3Qgc2VhcmNoIHJlcXVlc3Qgd2hpbGUgdHlwZSBpblx0XHRcdFx0XHJcblx0XHRcdFx0XHR0aGlzLnRpbWVyS2V5cHJlc3MgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1x0Ly9kZWxheSBiZWZvcmUgcmVxdWVzdCwgZm9yIGxpbWl0IGpzb25wL2FqYXggcmVxdWVzdFxyXG5cclxuXHRcdFx0XHRcdFx0c2VsZi5fZmlsbFJlY29yZHNDYWNoZSgpO1xyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHR9LCB0aGlzLm9wdGlvbnMuZGVsYXlUeXBlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZWxzZVxyXG5cdFx0XHRcdFx0dGhpcy5faGlkZVRvb2x0aXAoKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9oYW5kbGVBdXRvcmVzaXplKCk7XHJcblx0fSxcclxuXHJcblx0c2VhcmNoVGV4dDogZnVuY3Rpb24odGV4dCkge1xyXG5cdFx0dmFyIGNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQodGV4dC5sZW5ndGgpO1xyXG5cclxuXHRcdHRoaXMuX2lucHV0LnZhbHVlID0gdGV4dDtcclxuXHJcblx0XHR0aGlzLl9pbnB1dC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuXHRcdEwuRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl9jb250YWluZXIsICdzZWFyY2gtZXhwJyk7XHJcblxyXG5cdFx0dGhpcy5fYXV0b1R5cGVUbXAgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLl9oYW5kbGVLZXlwcmVzcyh7a2V5Q29kZTogY29kZX0pO1xyXG5cdH0sXHJcblx0XHJcblx0X2ZpbGxSZWNvcmRzQ2FjaGU6IGZ1bmN0aW9uKCkge1xyXG5cclxuXHRcdHZhciBzZWxmID0gdGhpcyxcclxuXHRcdFx0aW5wdXRUZXh0ID0gdGhpcy5faW5wdXQudmFsdWUsIHJlY29yZHM7XHJcblxyXG5cdFx0aWYodGhpcy5fY3VyUmVxICYmIHRoaXMuX2N1clJlcS5hYm9ydClcclxuXHRcdFx0dGhpcy5fY3VyUmVxLmFib3J0KCk7XHJcblx0XHQvL2Fib3J0IHByZXZpb3VzIHJlcXVlc3RzXHJcblxyXG5cdFx0TC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2NvbnRhaW5lciwgJ3NlYXJjaC1sb2FkJyk7XHRcclxuXHJcblx0XHQvLyBpZih0aGlzLl9sYXllcilcclxuXHRcdC8vIHtcclxuXHRcdC8vIFx0Ly9UT0RPIF9yZWNvcmRzRnJvbUxheWVyIG11c3QgcmV0dXJuIGFycmF5IG9mIG9iamVjdHMsIGZvcm1hdHRlZCBmcm9tIF9mb3JtYXREYXRhXHJcblx0XHQvLyBcdHRoaXMuX3JlY29yZHNDYWNoZSA9IHRoaXMuX3JlY29yZHNGcm9tTGF5ZXIoKTtcclxuXHRcdC8vXHJcblx0XHQvLyBcdHJlY29yZHMgPSB0aGlzLl9maWx0ZXJEYXRhKCB0aGlzLl9pbnB1dC52YWx1ZSwgdGhpcy5fcmVjb3Jkc0NhY2hlICk7XHJcbiAgICAgICAgLy9cclxuXHRcdC8vIFx0dGhpcy5zaG93VG9vbHRpcCggcmVjb3JkcyApO1xyXG4gICAgICAgIC8vXHJcblx0XHQvLyBcdEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9jb250YWluZXIsICdzZWFyY2gtbG9hZCcpO1xyXG5cdFx0Ly8gfVxyXG5cdFx0Ly8gZWxzZVxyXG5cdFx0Ly8ge1xyXG5cdFx0XHRpZih0aGlzLm9wdGlvbnMuc291cmNlRGF0YSlcclxuXHRcdFx0XHR0aGlzLl9yZXRyaWV2ZURhdGEgPSB0aGlzLm9wdGlvbnMuc291cmNlRGF0YTtcclxuXHJcblx0XHRcdGVsc2UgaWYodGhpcy5vcHRpb25zLnVybClcdC8vanNvbnAgb3IgYWpheFxyXG5cdFx0XHRcdHRoaXMuX3JldHJpZXZlRGF0YSA9IHRoaXMub3B0aW9ucy5qc29ucFBhcmFtID8gdGhpcy5fcmVjb3Jkc0Zyb21Kc29ucCA6IHRoaXMuX3JlY29yZHNGcm9tQWpheDtcclxuXHJcblx0XHRcdHRoaXMuX2N1clJlcSA9IHRoaXMuX3JldHJpZXZlRGF0YS5jYWxsKHRoaXMsIGlucHV0VGV4dCwgZnVuY3Rpb24oZGF0YSkge1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdHNlbGYuX3JlY29yZHNDYWNoZSA9IHNlbGYuX2Zvcm1hdERhdGEuY2FsbChzZWxmLCBkYXRhKTtcclxuXHJcblx0XHRcdFx0Ly9UT0RPIHJlZmFjdCFcclxuXHRcdFx0XHRpZihzZWxmLm9wdGlvbnMuc291cmNlRGF0YSlcclxuXHRcdFx0XHRcdHJlY29yZHMgPSBzZWxmLl9maWx0ZXJEYXRhKCBzZWxmLl9pbnB1dC52YWx1ZSwgc2VsZi5fcmVjb3Jkc0NhY2hlICk7XHJcblx0XHRcdFx0ZWxzZVxyXG5cdFx0XHRcdFx0cmVjb3JkcyA9IHNlbGYuX3JlY29yZHNDYWNoZTtcclxuXHJcblx0XHRcdFx0c2VsZi5zaG93VG9vbHRpcCggcmVjb3JkcyApO1xyXG4gXHJcblx0XHRcdFx0TC5Eb21VdGlsLnJlbW92ZUNsYXNzKHNlbGYuX2NvbnRhaW5lciwgJ3NlYXJjaC1sb2FkJyk7XHJcblx0XHRcdH0pO1xyXG5cdFx0Ly8gfVxyXG5cdH0sXHJcblx0XHJcblx0X2hhbmRsZUF1dG9yZXNpemU6IGZ1bmN0aW9uKCkge1xyXG5cdCAgICB2YXIgbWF4V2lkdGg7XHJcblxyXG5cdFx0aWYgKHRoaXMuX2lucHV0LnN0eWxlLm1heFdpZHRoICE9PSB0aGlzLl9tYXAuX2NvbnRhaW5lci5vZmZzZXRXaWR0aCkge1xyXG5cdFx0XHRtYXhXaWR0aCA9IHRoaXMuX21hcC5fY29udGFpbmVyLmNsaWVudFdpZHRoO1xyXG5cclxuXHRcdFx0Ly8gb3RoZXIgc2lkZSBtYXJnaW4gKyBwYWRkaW5nICsgd2lkdGggYm9yZGVyICsgd2lkdGggc2VhcmNoLWJ1dHRvbiArIHdpZHRoIHNlYXJjaC1jYW5jZWxcclxuXHRcdFx0bWF4V2lkdGggLT0gMTAgKyAyMCArIDEgKyAzMCArIDIyOyBcclxuXHJcblx0XHRcdHRoaXMuX2lucHV0LnN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGgudG9TdHJpbmcoKSArICdweCc7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMub3B0aW9ucy5hdXRvUmVzaXplICYmICh0aGlzLl9jb250YWluZXIub2Zmc2V0V2lkdGggKyAyMCA8IHRoaXMuX21hcC5fY29udGFpbmVyLm9mZnNldFdpZHRoKSkge1xyXG5cdFx0XHR0aGlzLl9pbnB1dC5zaXplID0gdGhpcy5faW5wdXQudmFsdWUubGVuZ3RoIDwgdGhpcy5faW5wdXRNaW5TaXplID8gdGhpcy5faW5wdXRNaW5TaXplIDogdGhpcy5faW5wdXQudmFsdWUubGVuZ3RoO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdF9oYW5kbGVBcnJvd1NlbGVjdDogZnVuY3Rpb24odmVsb2NpdHkpIHtcclxuXHRcclxuXHRcdHZhciBzZWFyY2hUaXBzID0gdGhpcy5fdG9vbHRpcC5oYXNDaGlsZE5vZGVzKCkgPyB0aGlzLl90b29sdGlwLmNoaWxkTm9kZXMgOiBbXTtcclxuXHRcdFx0XHJcblx0XHRmb3IgKGk9MDsgaTxzZWFyY2hUaXBzLmxlbmd0aDsgaSsrKVxyXG5cdFx0XHRMLkRvbVV0aWwucmVtb3ZlQ2xhc3Moc2VhcmNoVGlwc1tpXSwgJ3NlYXJjaC10aXAtc2VsZWN0Jyk7XHJcblx0XHRcclxuXHRcdGlmICgodmVsb2NpdHkgPT0gMSApICYmICh0aGlzLl90b29sdGlwLmN1cnJlbnRTZWxlY3Rpb24gPj0gKHNlYXJjaFRpcHMubGVuZ3RoIC0gMSkpKSB7Ly8gSWYgYXQgZW5kIG9mIGxpc3QuXHJcblx0XHRcdEwuRG9tVXRpbC5hZGRDbGFzcyhzZWFyY2hUaXBzW3RoaXMuX3Rvb2x0aXAuY3VycmVudFNlbGVjdGlvbl0sICdzZWFyY2gtdGlwLXNlbGVjdCcpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZiAoKHZlbG9jaXR5ID09IC0xICkgJiYgKHRoaXMuX3Rvb2x0aXAuY3VycmVudFNlbGVjdGlvbiA8PSAwKSkgeyAvLyBHb2luZyBiYWNrIHVwIHRvIHRoZSBzZWFyY2ggYm94LlxyXG5cdFx0XHR0aGlzLl90b29sdGlwLmN1cnJlbnRTZWxlY3Rpb24gPSAtMTtcclxuXHRcdH1cclxuXHRcdGVsc2UgaWYgKHRoaXMuX3Rvb2x0aXAuc3R5bGUuZGlzcGxheSAhPSAnbm9uZScpIHtcclxuXHRcdFx0dGhpcy5fdG9vbHRpcC5jdXJyZW50U2VsZWN0aW9uICs9IHZlbG9jaXR5O1xyXG5cdFx0XHRcclxuXHRcdFx0TC5Eb21VdGlsLmFkZENsYXNzKHNlYXJjaFRpcHNbdGhpcy5fdG9vbHRpcC5jdXJyZW50U2VsZWN0aW9uXSwgJ3NlYXJjaC10aXAtc2VsZWN0Jyk7XHJcblx0XHRcdFxyXG5cdFx0XHR0aGlzLl9pbnB1dC52YWx1ZSA9IHNlYXJjaFRpcHNbdGhpcy5fdG9vbHRpcC5jdXJyZW50U2VsZWN0aW9uXS5fdGV4dDtcclxuXHJcblx0XHRcdC8vIHNjcm9sbDpcclxuXHRcdFx0dmFyIHRpcE9mZnNldFRvcCA9IHNlYXJjaFRpcHNbdGhpcy5fdG9vbHRpcC5jdXJyZW50U2VsZWN0aW9uXS5vZmZzZXRUb3A7XHJcblx0XHRcdFxyXG5cdFx0XHRpZiAodGlwT2Zmc2V0VG9wICsgc2VhcmNoVGlwc1t0aGlzLl90b29sdGlwLmN1cnJlbnRTZWxlY3Rpb25dLmNsaWVudEhlaWdodCA+PSB0aGlzLl90b29sdGlwLnNjcm9sbFRvcCArIHRoaXMuX3Rvb2x0aXAuY2xpZW50SGVpZ2h0KSB7XHJcblx0XHRcdFx0dGhpcy5fdG9vbHRpcC5zY3JvbGxUb3AgPSB0aXBPZmZzZXRUb3AgLSB0aGlzLl90b29sdGlwLmNsaWVudEhlaWdodCArIHNlYXJjaFRpcHNbdGhpcy5fdG9vbHRpcC5jdXJyZW50U2VsZWN0aW9uXS5jbGllbnRIZWlnaHQ7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSBpZiAodGlwT2Zmc2V0VG9wIDw9IHRoaXMuX3Rvb2x0aXAuc2Nyb2xsVG9wKSB7XHJcblx0XHRcdFx0dGhpcy5fdG9vbHRpcC5zY3JvbGxUb3AgPSB0aXBPZmZzZXRUb3A7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRfaGFuZGxlU3VibWl0OiBmdW5jdGlvbigpIHtcdC8vYnV0dG9uIGFuZCB0b29sdGlwIGNsaWNrIGFuZCBlbnRlciBzdWJtaXRcclxuXHJcblx0XHR0aGlzLl9oaWRlQXV0b1R5cGUoKTtcclxuXHRcdFxyXG5cdFx0dGhpcy5oaWRlQWxlcnQoKTtcclxuXHRcdHRoaXMuX2hpZGVUb29sdGlwKCk7XHJcblxyXG5cdFx0aWYodGhpcy5faW5wdXQuc3R5bGUuZGlzcGxheSA9PSAnbm9uZScpXHQvL29uIGZpcnN0IGNsaWNrIHNob3cgX2lucHV0IG9ubHlcclxuXHRcdFx0dGhpcy5leHBhbmQoKTtcclxuXHRcdGVsc2VcclxuXHRcdHtcclxuXHRcdFx0aWYodGhpcy5faW5wdXQudmFsdWUgPT09ICcnKVx0Ly9oaWRlIF9pbnB1dCBvbmx5XHJcblx0XHRcdFx0dGhpcy5jb2xsYXBzZSgpO1xyXG5cdFx0XHRlbHNlXHJcblx0XHRcdHtcclxuXHRcdFx0XHR2YXIgbG9jID0gdGhpcy5fZ2V0TG9jYXRpb24odGhpcy5faW5wdXQudmFsdWUpO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGlmKGxvYz09PWZhbHNlKVxyXG5cdFx0XHRcdFx0dGhpcy5zaG93QWxlcnQoKTtcclxuXHRcdFx0XHRlbHNlXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0dGhpcy5zaG93TG9jYXRpb24obG9jLCB0aGlzLl9pbnB1dC52YWx1ZSk7XHJcblx0XHRcdFx0XHR0aGlzLmZpcmUoJ3NlYXJjaDpsb2NhdGlvbmZvdW5kJywge1xyXG5cdFx0XHRcdFx0XHRcdGxhdGxuZzogbG9jLFxyXG5cdFx0XHRcdFx0XHRcdHRleHQ6IHRoaXMuX2lucHV0LnZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdGxheWVyOiBsb2MubGF5ZXIgPyBsb2MubGF5ZXIgOiBudWxsXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdF9nZXRMb2NhdGlvbjogZnVuY3Rpb24oa2V5KSB7XHQvL2V4dHJhY3QgbGF0bG5nIGZyb20gX3JlY29yZHNDYWNoZVxyXG5cclxuXHRcdGlmKCB0aGlzLl9yZWNvcmRzQ2FjaGUuaGFzT3duUHJvcGVydHkoa2V5KSApXHJcblx0XHRcdHJldHVybiB0aGlzLl9yZWNvcmRzQ2FjaGVba2V5XTsvL3RoZW4gYWZ0ZXIgdXNlIC5sb2MgYXR0cmlidXRlXHJcblx0XHRlbHNlXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHR9LFxyXG5cclxuXHRfZGVmYXVsdE1vdmVUb0xvY2F0aW9uOiBmdW5jdGlvbihsYXRsbmcsIHRpdGxlLCBtYXApIHtcclxuXHRcdGlmKHRoaXMub3B0aW9ucy56b29tKVxyXG4gXHRcdFx0dGhpcy5fbWFwLnNldFZpZXcobGF0bG5nLCB0aGlzLm9wdGlvbnMuem9vbSk7XHJcbiBcdFx0ZWxzZVxyXG5cdFx0XHR0aGlzLl9tYXAucGFuVG8obGF0bG5nKTtcclxuXHR9LFxyXG5cclxuXHRzaG93TG9jYXRpb246IGZ1bmN0aW9uKGxhdGxuZywgdGl0bGUpIHtcdC8vc2V0IGxvY2F0aW9uIG9uIG1hcCBmcm9tIF9yZWNvcmRzQ2FjaGVcclxuXHRcdHZhciBzZWxmID0gdGhpcztcclxuXHJcblx0XHRzZWxmLl9tYXAub25jZSgnbW92ZWVuZCB6b29tZW5kJywgZnVuY3Rpb24oZSkge1xyXG5cclxuXHRcdFx0aWYoc2VsZi5fbWFya2VyU2VhcmNoKSB7XHJcblx0XHRcdFx0c2VsZi5fbWFya2VyU2VhcmNoLmFkZFRvKHNlbGYuX21hcCkuc2V0TGF0TG5nKGxhdGxuZyk7XHJcblx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHR9KTtcclxuXHJcblx0XHRzZWxmLl9tb3ZlVG9Mb2NhdGlvbihsYXRsbmcsIHRpdGxlLCBzZWxmLl9tYXApO1xyXG5cdFx0Ly9GSVhNRSBhdXRvQ29sbGFwc2Ugb3B0aW9uIGhpZGUgc2VsZi5fbWFya2VyU2VhcmNoIGJlZm9yZSB2aXN1YWxpemVkISFcclxuXHRcdGlmKHNlbGYub3B0aW9ucy5hdXRvQ29sbGFwc2UpXHJcblx0XHRcdHNlbGYuY29sbGFwc2UoKTtcclxuXHJcblx0XHRyZXR1cm4gc2VsZjtcclxuXHR9XHJcbn0pO1xyXG5cclxuTC5Db250cm9sLlNlYXJjaC5NYXJrZXIgPSBMLk1hcmtlci5leHRlbmQoe1xyXG5cclxuXHRpbmNsdWRlczogTC52ZXJzaW9uWzBdPT09JzEnID8gTC5FdmVudGVkLnByb3RvdHlwZSA6IEwuTWl4aW4uRXZlbnRzLFxyXG5cdFxyXG5cdG9wdGlvbnM6IHtcclxuXHRcdGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLFxyXG5cdFx0YW5pbWF0ZTogdHJ1ZSxcclxuXHRcdGNpcmNsZToge1xyXG5cdFx0XHRyYWRpdXM6IDEwLFxyXG5cdFx0XHR3ZWlnaHQ6IDMsXHJcblx0XHRcdGNvbG9yOiAnI2UwMycsXHJcblx0XHRcdHN0cm9rZTogdHJ1ZSxcclxuXHRcdFx0ZmlsbDogZmFsc2VcclxuXHRcdH1cclxuXHR9LFxyXG5cdFxyXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uIChsYXRsbmcsIG9wdGlvbnMpIHtcclxuXHRcdEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcclxuXHJcblx0XHRpZihvcHRpb25zLmljb24gPT09IHRydWUpXHJcblx0XHRcdG9wdGlvbnMuaWNvbiA9IG5ldyBMLkljb24uRGVmYXVsdCgpO1xyXG5cclxuXHRcdEwuTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbGF0bG5nLCBvcHRpb25zKTtcclxuXHRcdFxyXG5cdFx0aWYoIEwuQ29udHJvbC5TZWFyY2gucHJvdG90eXBlLl9pc09iamVjdCh0aGlzLm9wdGlvbnMuY2lyY2xlKSApXHJcblx0XHRcdHRoaXMuX2NpcmNsZUxvYyA9IG5ldyBMLkNpcmNsZU1hcmtlcihsYXRsbmcsIHRoaXMub3B0aW9ucy5jaXJjbGUpO1xyXG5cdH0sXHJcblxyXG5cdG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XHJcblx0XHRMLk1hcmtlci5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApO1xyXG5cdFx0aWYodGhpcy5fY2lyY2xlTG9jKSB7XHJcblx0XHRcdG1hcC5hZGRMYXllcih0aGlzLl9jaXJjbGVMb2MpO1xyXG5cdFx0XHRpZih0aGlzLm9wdGlvbnMuYW5pbWF0ZSlcclxuXHRcdFx0XHR0aGlzLmFuaW1hdGUoKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xyXG5cdFx0TC5NYXJrZXIucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcywgbWFwKTtcclxuXHRcdGlmKHRoaXMuX2NpcmNsZUxvYylcclxuXHRcdFx0bWFwLnJlbW92ZUxheWVyKHRoaXMuX2NpcmNsZUxvYyk7XHJcblx0fSxcclxuXHRcclxuXHRzZXRMYXRMbmc6IGZ1bmN0aW9uIChsYXRsbmcpIHtcclxuXHRcdEwuTWFya2VyLnByb3RvdHlwZS5zZXRMYXRMbmcuY2FsbCh0aGlzLCBsYXRsbmcpO1xyXG5cdFx0aWYodGhpcy5fY2lyY2xlTG9jKVxyXG5cdFx0XHR0aGlzLl9jaXJjbGVMb2Muc2V0TGF0TG5nKGxhdGxuZyk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cdFxyXG5cdF9pbml0SWNvbjogZnVuY3Rpb24gKCkge1xyXG5cdFx0aWYodGhpcy5vcHRpb25zLmljb24pXHJcblx0XHRcdEwuTWFya2VyLnByb3RvdHlwZS5faW5pdEljb24uY2FsbCh0aGlzKTtcclxuXHR9LFxyXG5cclxuXHRfcmVtb3ZlSWNvbjogZnVuY3Rpb24gKCkge1xyXG5cdFx0aWYodGhpcy5vcHRpb25zLmljb24pXHJcblx0XHRcdEwuTWFya2VyLnByb3RvdHlwZS5fcmVtb3ZlSWNvbi5jYWxsKHRoaXMpO1xyXG5cdH0sXHJcblxyXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCkge1xyXG5cdC8vVE9ETyByZWZhY3QgYW5pbWF0ZSgpIG1vcmUgc21vb3RoISBsaWtlIHRoaXM6IGh0dHA6Ly9nb28uZ2wvRERsUnNcclxuXHRcdGlmKHRoaXMuX2NpcmNsZUxvYylcclxuXHRcdHtcclxuXHRcdFx0dmFyIGNpcmNsZSA9IHRoaXMuX2NpcmNsZUxvYyxcclxuXHRcdFx0XHR0SW50ID0gMjAwLFx0Ly90aW1lIGludGVydmFsXHJcblx0XHRcdFx0c3MgPSA1LFx0Ly9mcmFtZXNcclxuXHRcdFx0XHRtciA9IHBhcnNlSW50KGNpcmNsZS5fcmFkaXVzL3NzKSxcclxuXHRcdFx0XHRvbGRyYWQgPSB0aGlzLm9wdGlvbnMuY2lyY2xlLnJhZGl1cyxcclxuXHRcdFx0XHRuZXdyYWQgPSBjaXJjbGUuX3JhZGl1cyAqIDIsXHJcblx0XHRcdFx0YWNjID0gMDtcclxuXHJcblx0XHRcdGNpcmNsZS5fdGltZXJBbmltTG9jID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0YWNjICs9IDAuNTtcclxuXHRcdFx0XHRtciArPSBhY2M7XHQvL2FkZGluZyBhY2NlbGVyYXRpb25cclxuXHRcdFx0XHRuZXdyYWQgLT0gbXI7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0Y2lyY2xlLnNldFJhZGl1cyhuZXdyYWQpO1xyXG5cclxuXHRcdFx0XHRpZihuZXdyYWQ8b2xkcmFkKVxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdGNsZWFySW50ZXJ2YWwoY2lyY2xlLl90aW1lckFuaW1Mb2MpO1xyXG5cdFx0XHRcdFx0Y2lyY2xlLnNldFJhZGl1cyhvbGRyYWQpOy8vcmVzZXQgcmFkaXVzXHJcblx0XHRcdFx0XHQvL2lmKHR5cGVvZiBhZnRlckFuaW1DYWxsID09ICdmdW5jdGlvbicpXHJcblx0XHRcdFx0XHRcdC8vYWZ0ZXJBbmltQ2FsbCgpO1xyXG5cdFx0XHRcdFx0XHQvL1RPRE8gdXNlIGNyZWF0ZSBldmVudCAnYW5pbWF0ZUVuZCcgaW4gTC5Db250cm9sLlNlYXJjaC5NYXJrZXIgXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LCB0SW50KTtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG59KTtcclxuXHJcbkwuTWFwLmFkZEluaXRIb29rKGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2VhcmNoQ29udHJvbCkge1xyXG4gICAgICAgIHRoaXMuc2VhcmNoQ29udHJvbCA9IEwuY29udHJvbC5zZWFyY2godGhpcy5vcHRpb25zLnNlYXJjaENvbnRyb2wpO1xyXG4gICAgICAgIHRoaXMuYWRkQ29udHJvbCh0aGlzLnNlYXJjaENvbnRyb2wpO1xyXG4gICAgfVxyXG59KTtcclxuXHJcbkwuY29udHJvbC5zZWFyY2ggPSBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgcmV0dXJuIG5ldyBMLkNvbnRyb2wuU2VhcmNoKG9wdGlvbnMpO1xyXG59O1xyXG5cclxucmV0dXJuIEwuQ29udHJvbC5TZWFyY2g7XHJcblxyXG59KTtcclxuXHJcblxyXG4iLCIvKlxyXG4gTGVhZmxldC5kcmF3IDAuNC4xMiwgYSBwbHVnaW4gdGhhdCBhZGRzIGRyYXdpbmcgYW5kIGVkaXRpbmcgdG9vbHMgdG8gTGVhZmxldCBwb3dlcmVkIG1hcHMuXHJcbiAoYykgMjAxMi0yMDE3LCBKYWNvYiBUb3llLCBKb24gV2VzdCwgU21hcnRyYWssIExlYWZsZXRcclxuXHJcbiBodHRwczovL2dpdGh1Yi5jb20vTGVhZmxldC9MZWFmbGV0LmRyYXdcclxuIGh0dHA6Ly9sZWFmbGV0anMuY29tXHJcbiAqL1xyXG4oZnVuY3Rpb24gKHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBMZWFmbGV0LmRyYXcgYXNzdW1lcyB0aGF0IHlvdSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgdGhlIExlYWZsZXQgbGlicmFyeS5cclxuICAgICAqL1xyXG4gICAgTC5kcmF3VmVyc2lvbiA9IFwiMC40LjEyXCI7XHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkRyYXdcclxuICAgICAqIEBha2EgRHJhd1xyXG4gICAgICpcclxuICAgICAqXHJcbiAgICAgKiBUbyBhZGQgdGhlIGRyYXcgdG9vbGJhciBzZXQgdGhlIG9wdGlvbiBkcmF3Q29udHJvbDogdHJ1ZSBpbiB0aGUgbWFwIG9wdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGpzXHJcbiAgICAgKiAgICAgIHZhciBtYXAgPSBMLm1hcCgnbWFwJywge2RyYXdDb250cm9sOiB0cnVlfSkuc2V0VmlldyhbNTEuNTA1LCAtMC4wOV0sIDEzKTtcclxuICAgICAqXHJcbiAgICAgKiAgICAgIEwudGlsZUxheWVyKCdodHRwOi8ve3N9LnRpbGUub3NtLm9yZy97en0ve3h9L3t5fS5wbmcnLCB7XHJcbiAqICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJmNvcHk7IDxhIGhyZWY9XCJodHRwOi8vb3NtLm9yZy9jb3B5cmlnaHRcIj5PcGVuU3RyZWV0TWFwPC9hPiBjb250cmlidXRvcnMnXHJcbiAqICAgICAgfSkuYWRkVG8obWFwKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqICMjIyBBZGRpbmcgdGhlIGVkaXQgdG9vbGJhclxyXG4gICAgICogVG8gdXNlIHRoZSBlZGl0IHRvb2xiYXIgeW91IG11c3QgaW5pdGlhbGlzZSB0aGUgTGVhZmxldC5kcmF3IGNvbnRyb2wgYW5kIG1hbnVhbGx5IGFkZCBpdCB0byB0aGUgbWFwLlxyXG4gICAgICpcclxuICAgICAqIGBgYGpzXHJcbiAgICAgKiAgICAgIHZhciBtYXAgPSBMLm1hcCgnbWFwJykuc2V0VmlldyhbNTEuNTA1LCAtMC4wOV0sIDEzKTtcclxuICAgICAqXHJcbiAgICAgKiAgICAgIEwudGlsZUxheWVyKCdodHRwOi8ve3N9LnRpbGUub3NtLm9yZy97en0ve3h9L3t5fS5wbmcnLCB7XHJcbiAqICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJmNvcHk7IDxhIGhyZWY9XCJodHRwOi8vb3NtLm9yZy9jb3B5cmlnaHRcIj5PcGVuU3RyZWV0TWFwPC9hPiBjb250cmlidXRvcnMnXHJcbiAqICAgICAgfSkuYWRkVG8obWFwKTtcclxuICAgICAqXHJcbiAgICAgKiAgICAgIC8vIEZlYXR1cmVHcm91cCBpcyB0byBzdG9yZSBlZGl0YWJsZSBsYXllcnNcclxuICAgICAqICAgICAgdmFyIGRyYXduSXRlbXMgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgICAqICAgICAgbWFwLmFkZExheWVyKGRyYXduSXRlbXMpO1xyXG4gICAgICpcclxuICAgICAqICAgICAgdmFyIGRyYXdDb250cm9sID0gbmV3IEwuQ29udHJvbC5EcmF3KHtcclxuICogICAgICAgICAgZWRpdDoge1xyXG4gKiAgICAgICAgICAgICAgZmVhdHVyZUdyb3VwOiBkcmF3bkl0ZW1zXHJcbiAqICAgICAgICAgIH1cclxuICogICAgICB9KTtcclxuICAgICAqICAgICAgbWFwLmFkZENvbnRyb2woZHJhd0NvbnRyb2wpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGtleSBoZXJlIGlzIHRoZSBmZWF0dXJlR3JvdXAgb3B0aW9uLiBUaGlzIHRlbGxzIHRoZSBwbHVnaW4gd2hpY2ggRmVhdHVyZUdyb3VwIGNvbnRhaW5zIHRoZSBsYXllcnMgdGhhdFxyXG4gICAgICogc2hvdWxkIGJlIGVkaXRhYmxlLiBUaGUgZmVhdHVyZUdyb3VwIGNhbiBjb250YWluIDAgb3IgbW9yZSBmZWF0dXJlcyB3aXRoIGdlb21ldHJ5IHR5cGVzIFBvaW50LCBMaW5lU3RyaW5nLCBhbmQgUG9seWdvbi5cclxuICAgICAqIExlYWZsZXQuZHJhdyBkb2VzIG5vdCB3b3JrIHdpdGggbXVsdGlnZW9tZXRyeSBmZWF0dXJlcyBzdWNoIGFzIE11bHRpUG9pbnQsIE11bHRpTGluZVN0cmluZywgTXVsdGlQb2x5Z29uLFxyXG4gICAgICogb3IgR2VvbWV0cnlDb2xsZWN0aW9uLiBJZiB5b3UgbmVlZCB0byBhZGQgbXVsdGlnZW9tZXRyeSBmZWF0dXJlcyB0byB0aGUgZHJhdyBwbHVnaW4sIGNvbnZlcnQgdGhlbSB0byBhXHJcbiAgICAgKiBGZWF0dXJlQ29sbGVjdGlvbiBvZiBub24tbXVsdGlnZW9tZXRyaWVzIChQb2ludHMsIExpbmVTdHJpbmdzLCBvciBQb2x5Z29ucykuXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdyA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuZHJhd0xvY2FsXHJcbiAgICAgKiBAYWthIEwuZHJhd0xvY2FsXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGNvcmUgdG9vbGJhciBjbGFzcyBvZiB0aGUgQVBJIOKAlCBpdCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdG9vbGJhciB1aVxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBgYGBqc1xyXG4gICAgICogICAgICB2YXIgbW9kaWZpZWREcmF3ID0gTC5kcmF3TG9jYWwuZXh0ZW5kKHtcclxuICogICAgICAgICAgZHJhdzoge1xyXG4gKiAgICAgICAgICAgICAgdG9vbGJhcjoge1xyXG4gKiAgICAgICAgICAgICAgICAgIGJ1dHRvbnM6IHtcclxuICogICAgICAgICAgICAgICAgICAgICAgcG9seWdvbjogJ0RyYXcgYW4gYXdlc29tZSBwb2x5Z29uJ1xyXG4gKiAgICAgICAgICAgICAgICAgIH1cclxuICogICAgICAgICAgICAgIH1cclxuICogICAgICAgICAgfVxyXG4gKiAgICAgIH0pO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGRlZmF1bHQgc3RhdGUgZm9yIHRoZSBjb250cm9sIGlzIHRoZSBkcmF3IHRvb2xiYXIganVzdCBiZWxvdyB0aGUgem9vbSBjb250cm9sLlxyXG4gICAgICogIFRoaXMgd2lsbCBhbGxvdyBtYXAgdXNlcnMgdG8gZHJhdyB2ZWN0b3JzIGFuZCBtYXJrZXJzLlxyXG4gICAgICogICoqUGxlYXNlIG5vdGUgdGhlIGVkaXQgdG9vbGJhciBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0LioqXHJcbiAgICAgKi9cclxuICAgIEwuZHJhd0xvY2FsID0ge1xyXG4gICAgICAgIC8vIGZvcm1hdDoge1xyXG4gICAgICAgIC8vIFx0bnVtZXJpYzoge1xyXG4gICAgICAgIC8vIFx0XHRkZWxpbWl0ZXJzOiB7XHJcbiAgICAgICAgLy8gXHRcdFx0dGhvdXNhbmRzOiAnLCcsXHJcbiAgICAgICAgLy8gXHRcdFx0ZGVjaW1hbDogJy4nXHJcbiAgICAgICAgLy8gXHRcdH1cclxuICAgICAgICAvLyBcdH1cclxuICAgICAgICAvLyB9LFxyXG4gICAgICAgIGRyYXc6IHtcclxuICAgICAgICAgICAgdG9vbGJhcjoge1xyXG4gICAgICAgICAgICAgICAgLy8gI1RPRE86IHRoaXMgc2hvdWxkIGJlIHJlb3JnYW5pemVkIHdoZXJlIGFjdGlvbnMgYXJlIG5lc3RlZCBpbiBhY3Rpb25zXHJcbiAgICAgICAgICAgICAgICAvLyBleDogYWN0aW9ucy51bmRvICBvciBhY3Rpb25zLmNhbmNlbFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQ2FuY2VsIGRyYXdpbmcnLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdDYW5jZWwnXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmluaXNoOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdGaW5pc2ggZHJhd2luZycsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0ZpbmlzaCdcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB1bmRvOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdEZWxldGUgbGFzdCBwb2ludCBkcmF3bicsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0RlbGV0ZSBsYXN0IHBvaW50J1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBwb2x5bGluZTogJ0RyYXcgYSBwb2x5bGluZScsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9seWdvbjogJ0RyYXcgYSBwb2x5Z29uJyxcclxuICAgICAgICAgICAgICAgICAgICByZWN0YW5nbGU6ICdEcmF3IGEgcmVjdGFuZ2xlJyxcclxuICAgICAgICAgICAgICAgICAgICBjaXJjbGU6ICdEcmF3IGEgY2lyY2xlJyxcclxuICAgICAgICAgICAgICAgICAgICBtYXJrZXI6ICdEcmF3IGEgbWFya2VyJyxcclxuICAgICAgICAgICAgICAgICAgICBjaXJjbGVtYXJrZXI6ICdEcmF3IGEgY2lyY2xlbWFya2VyJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBoYW5kbGVyczoge1xyXG4gICAgICAgICAgICAgICAgY2lyY2xlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogJ0NsaWNrIGFuZCBkcmFnIHRvIGRyYXcgY2lyY2xlLidcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHJhZGl1czogJ1JhZGl1cydcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjaXJjbGVtYXJrZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiAnQ2xpY2sgbWFwIHRvIHBsYWNlIGNpcmNsZSBtYXJrZXIuJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBtYXJrZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiAnQ2xpY2sgbWFwIHRvIHBsYWNlIG1hcmtlci4nXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHBvbHlnb246IHtcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiAnQ2xpY2sgdG8gc3RhcnQgZHJhd2luZyBzaGFwZS4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250OiAnQ2xpY2sgdG8gY29udGludWUgZHJhd2luZyBzaGFwZS4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6ICdDbGljayBmaXJzdCBwb2ludCB0byBjbG9zZSB0aGlzIHNoYXBlLidcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgcG9seWxpbmU6IHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogJzxzdHJvbmc+RXJyb3I6PC9zdHJvbmc+IHNoYXBlIGVkZ2VzIGNhbm5vdCBjcm9zcyEnLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXA6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6ICdDbGljayB0byBzdGFydCBkcmF3aW5nIGxpbmUuJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udDogJ0NsaWNrIHRvIGNvbnRpbnVlIGRyYXdpbmcgbGluZS4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6ICdDbGljayBsYXN0IHBvaW50IHRvIGZpbmlzaCBsaW5lLidcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgcmVjdGFuZ2xlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogJ0NsaWNrIGFuZCBkcmFnIHRvIGRyYXcgcmVjdGFuZ2xlLidcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc2ltcGxlc2hhcGU6IHtcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogJ1JlbGVhc2UgbW91c2UgdG8gZmluaXNoIGRyYXdpbmcuJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZWRpdDoge1xyXG4gICAgICAgICAgICB0b29sYmFyOiB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2F2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ1NhdmUgY2hhbmdlcycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdTYXZlJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQ2FuY2VsIGVkaXRpbmcsIGRpc2NhcmRzIGFsbCBjaGFuZ2VzJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0NhbmNlbCdcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyQWxsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQ2xlYXIgYWxsIGxheWVycycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdDbGVhciBBbGwnXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0OiAnRWRpdCBsYXllcnMnLFxyXG4gICAgICAgICAgICAgICAgICAgIGVkaXREaXNhYmxlZDogJ05vIGxheWVycyB0byBlZGl0JyxcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmU6ICdEZWxldGUgbGF5ZXJzJyxcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVEaXNhYmxlZDogJ05vIGxheWVycyB0byBkZWxldGUnXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGhhbmRsZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBlZGl0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnRHJhZyBoYW5kbGVzIG9yIG1hcmtlcnMgdG8gZWRpdCBmZWF0dXJlcy4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJ0ZXh0OiAnQ2xpY2sgY2FuY2VsIHRvIHVuZG8gY2hhbmdlcy4nXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHJlbW92ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXA6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0NsaWNrIG9uIGEgZmVhdHVyZSB0byByZW1vdmUuJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIyMjIEV2ZW50c1xyXG4gICAgICogT25jZSB5b3UgaGF2ZSBzdWNjZXNzZnVsbHkgYWRkZWQgdGhlIExlYWZsZXQuZHJhdyBwbHVnaW4gdG8geW91ciBtYXAgeW91IHdpbGwgd2FudCB0byByZXNwb25kIHRvIHRoZSBkaWZmZXJlbnRcclxuICAgICAqIGFjdGlvbnMgdXNlcnMgY2FuIGluaXRpYXRlLiBUaGUgZm9sbG93aW5nIGV2ZW50cyB3aWxsIGJlIHRyaWdnZXJlZCBvbiB0aGUgbWFwOlxyXG4gICAgICpcclxuICAgICAqIEBjbGFzcyBMLkRyYXcuRXZlbnRcclxuICAgICAqIEBha2EgRHJhdy5FdmVudFxyXG4gICAgICpcclxuICAgICAqIFVzZSBgTC5EcmF3LkV2ZW50LkVWRU5UTkFNRWAgY29uc3RhbnRzIHRvIGVuc3VyZSBldmVudHMgYXJlIGNvcnJlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGpzXHJcbiAgICAgKiBtYXAub24oTC5EcmF3LkV2ZW50LkNSRUFURUQ7IGZ1bmN0aW9uIChlKSB7XHJcbiAqICAgIHZhciB0eXBlID0gZS5sYXllclR5cGUsXHJcbiAqICAgICAgICBsYXllciA9IGUubGF5ZXI7XHJcbiAqXHJcbiAqICAgIGlmICh0eXBlID09PSAnbWFya2VyJykge1xyXG4gKiAgICAgICAgLy8gRG8gbWFya2VyIHNwZWNpZmljIGFjdGlvbnNcclxuICogICAgfVxyXG4gKlxyXG4gKiAgICAvLyBEbyB3aGF0ZXZlciBlbHNlIHlvdSBuZWVkIHRvLiAoc2F2ZSB0byBkYjsgYWRkIHRvIG1hcCBldGMpXHJcbiAqICAgIG1hcC5hZGRMYXllcihsYXllcik7XHJcbiAqfSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqL1xyXG4gICAgTC5EcmF3LkV2ZW50ID0ge307XHJcbiAgICAvKipcclxuICAgICAqIEBldmVudCBkcmF3OmNyZWF0ZWQ6IFBvbHlMaW5lOyBQb2x5Z29uOyBSZWN0YW5nbGU7IENpcmNsZTsgTWFya2VyIHwgU3RyaW5nXHJcbiAgICAgKlxyXG4gICAgICogTGF5ZXIgdGhhdCB3YXMganVzdCBjcmVhdGVkLlxyXG4gICAgICogVGhlIHR5cGUgb2YgbGF5ZXIgdGhpcyBpcy4gT25lIG9mOiBgcG9seWxpbmVgOyBgcG9seWdvbmA7IGByZWN0YW5nbGVgOyBgY2lyY2xlYDsgYG1hcmtlcmBcclxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgbmV3IHZlY3RvciBvciBtYXJrZXIgaGFzIGJlZW4gY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdy5FdmVudC5DUkVBVEVEID0gJ2RyYXc6Y3JlYXRlZCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZXZlbnQgZHJhdzplZGl0ZWQ6IExheWVyR3JvdXBcclxuICAgICAqXHJcbiAgICAgKiBMaXN0IG9mIGFsbCBsYXllcnMganVzdCBlZGl0ZWQgb24gdGhlIG1hcC5cclxuICAgICAqXHJcbiAgICAgKlxyXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gbGF5ZXJzIGluIHRoZSBGZWF0dXJlR3JvdXA7IGluaXRpYWxpc2VkIHdpdGggdGhlIHBsdWdpbjsgaGF2ZSBiZWVuIGVkaXRlZCBhbmQgc2F2ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGpzXHJcbiAgICAgKiAgICAgIG1hcC5vbignZHJhdzplZGl0ZWQnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICogICAgICAgICAgdmFyIGxheWVycyA9IGUubGF5ZXJzO1xyXG4gICAgICogICAgICAgICAgbGF5ZXJzLmVhY2hMYXllcihmdW5jdGlvbiAobGF5ZXIpIHtcclxuICAgICAqICAgICAgICAgICAgICAvL2RvIHdoYXRldmVyIHlvdSB3YW50OyBtb3N0IGxpa2VseSBzYXZlIGJhY2sgdG8gZGJcclxuICAgICAqICAgICAgICAgIH0pO1xyXG4gICAgICogICAgICB9KTtcclxuICAgICAqIGBgYFxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuRXZlbnQuRURJVEVEID0gJ2RyYXc6ZWRpdGVkJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBldmVudCBkcmF3OmRlbGV0ZWQ6IExheWVyR3JvdXBcclxuICAgICAqXHJcbiAgICAgKiBMaXN0IG9mIGFsbCBsYXllcnMganVzdCByZW1vdmVkIGZyb20gdGhlIG1hcC5cclxuICAgICAqXHJcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBsYXllcnMgaGF2ZSBiZWVuIHJlbW92ZWQgKGFuZCBzYXZlZCkgZnJvbSB0aGUgRmVhdHVyZUdyb3VwLlxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuRXZlbnQuREVMRVRFRCA9ICdkcmF3OmRlbGV0ZWQnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGV2ZW50IGRyYXc6ZHJhd3N0YXJ0OiBTdHJpbmdcclxuICAgICAqXHJcbiAgICAgKiBUaGUgdHlwZSBvZiBsYXllciB0aGlzIGlzLiBPbmUgb2Y6YHBvbHlsaW5lYDsgYHBvbHlnb25gOyBgcmVjdGFuZ2xlYDsgYGNpcmNsZWA7IGBtYXJrZXJgXHJcbiAgICAgKlxyXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgaGFzIGNob3NlbiB0byBkcmF3IGEgcGFydGljdWxhciB2ZWN0b3Igb3IgbWFya2VyLlxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuRXZlbnQuRFJBV1NUQVJUID0gJ2RyYXc6ZHJhd3N0YXJ0JztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBldmVudCBkcmF3OmRyYXdzdG9wOiBTdHJpbmdcclxuICAgICAqXHJcbiAgICAgKiBUaGUgdHlwZSBvZiBsYXllciB0aGlzIGlzLiBPbmUgb2Y6IGBwb2x5bGluZWA7IGBwb2x5Z29uYDsgYHJlY3RhbmdsZWA7IGBjaXJjbGVgOyBgbWFya2VyYFxyXG4gICAgICpcclxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGhhcyBmaW5pc2hlZCBhIHBhcnRpY3VsYXIgdmVjdG9yIG9yIG1hcmtlci5cclxuICAgICAqL1xyXG5cclxuICAgIEwuRHJhdy5FdmVudC5EUkFXU1RPUCA9ICdkcmF3OmRyYXdzdG9wJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBldmVudCBkcmF3OmRyYXd2ZXJ0ZXg6IExheWVyR3JvdXBcclxuICAgICAqXHJcbiAgICAgKiBMaXN0IG9mIGFsbCBsYXllcnMganVzdCBiZWluZyBhZGRlZCBmcm9tIHRoZSBtYXAuXHJcbiAgICAgKlxyXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSB2ZXJ0ZXggaXMgY3JlYXRlZCBvbiBhIHBvbHlsaW5lIG9yIHBvbHlnb24uXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdy5FdmVudC5EUkFXVkVSVEVYID0gJ2RyYXc6ZHJhd3ZlcnRleCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZXZlbnQgZHJhdzplZGl0c3RhcnQ6IFN0cmluZ1xyXG4gICAgICpcclxuICAgICAqIFRoZSB0eXBlIG9mIGVkaXQgdGhpcyBpcy4gT25lIG9mOiBgZWRpdGBcclxuICAgICAqXHJcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBzdGFydHMgZWRpdCBtb2RlIGJ5IGNsaWNraW5nIHRoZSBlZGl0IHRvb2wgYnV0dG9uLlxyXG4gICAgICovXHJcblxyXG4gICAgTC5EcmF3LkV2ZW50LkVESVRTVEFSVCA9ICdkcmF3OmVkaXRzdGFydCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZXZlbnQgZHJhdzplZGl0bW92ZTogSUxheWVyXHJcbiAgICAgKlxyXG4gICAgICogIExheWVyIHRoYXQgd2FzIGp1c3QgbW92ZWQuXHJcbiAgICAgKlxyXG4gICAgICogVHJpZ2dlcmVkIGFzIHRoZSB1c2VyIG1vdmVzIGEgcmVjdGFuZ2xlOyBjaXJjbGUgb3IgbWFya2VyLlxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuRXZlbnQuRURJVE1PVkUgPSAnZHJhdzplZGl0bW92ZSc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZXZlbnQgZHJhdzplZGl0cmVzaXplOiBJTGF5ZXJcclxuICAgICAqXHJcbiAgICAgKiBMYXllciB0aGF0IHdhcyBqdXN0IG1vdmVkLlxyXG4gICAgICpcclxuICAgICAqIFRyaWdnZXJlZCBhcyB0aGUgdXNlciByZXNpemVzIGEgcmVjdGFuZ2xlIG9yIGNpcmNsZS5cclxuICAgICAqL1xyXG4gICAgTC5EcmF3LkV2ZW50LkVESVRSRVNJWkUgPSAnZHJhdzplZGl0cmVzaXplJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBldmVudCBkcmF3OmVkaXR2ZXJ0ZXg6IExheWVyR3JvdXBcclxuICAgICAqXHJcbiAgICAgKiBMaXN0IG9mIGFsbCBsYXllcnMganVzdCBiZWluZyBlZGl0ZWQgZnJvbSB0aGUgbWFwLlxyXG4gICAgICpcclxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgdmVydGV4IGlzIGVkaXRlZCBvbiBhIHBvbHlsaW5lIG9yIHBvbHlnb24uXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdy5FdmVudC5FRElUVkVSVEVYID0gJ2RyYXc6ZWRpdHZlcnRleCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZXZlbnQgZHJhdzplZGl0c3RvcDogU3RyaW5nXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHR5cGUgb2YgZWRpdCB0aGlzIGlzLiBPbmUgb2Y6IGBlZGl0YFxyXG4gICAgICpcclxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGhhcyBmaW5zaGVkIGVkaXRpbmcgKGVkaXQgbW9kZSkgYW5kIHNhdmVzIGVkaXRzLlxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuRXZlbnQuRURJVFNUT1AgPSAnZHJhdzplZGl0c3RvcCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZXZlbnQgZHJhdzpkZWxldGVzdGFydDogU3RyaW5nXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHR5cGUgb2YgZWRpdCB0aGlzIGlzLiBPbmUgb2Y6IGByZW1vdmVgXHJcbiAgICAgKlxyXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgc3RhcnRzIHJlbW92ZSBtb2RlIGJ5IGNsaWNraW5nIHRoZSByZW1vdmUgdG9vbCBidXR0b24uXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdy5FdmVudC5ERUxFVEVTVEFSVCA9ICdkcmF3OmRlbGV0ZXN0YXJ0JztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBldmVudCBkcmF3OmRlbGV0ZXN0b3A6IFN0cmluZ1xyXG4gICAgICpcclxuICAgICAqIFRoZSB0eXBlIG9mIGVkaXQgdGhpcyBpcy4gT25lIG9mOiBgcmVtb3ZlYFxyXG4gICAgICpcclxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGhhcyBmaW5pc2hlZCByZW1vdmluZyBzaGFwZXMgKHJlbW92ZSBtb2RlKSBhbmQgc2F2ZXMuXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdy5FdmVudC5ERUxFVEVTVE9QID0gJ2RyYXc6ZGVsZXRlc3RvcCc7XHJcblxyXG5cclxuICAgIEwuRHJhdyA9IEwuRHJhdyB8fCB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkRyYXcuRmVhdHVyZVxyXG4gICAgICogQGFrYSBEcmF3LkZlYXR1cmVcclxuICAgICAqL1xyXG4gICAgTC5EcmF3LkZlYXR1cmUgPSBMLkhhbmRsZXIuZXh0ZW5kKHtcclxuICAgICAgICBpbmNsdWRlczogTC5NaXhpbi5FdmVudHMsXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgaW5pdGlhbGl6ZSgpOiB2b2lkXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG1hcCwgb3B0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IG1hcC5fY29udGFpbmVyO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5UGFuZSA9IG1hcC5fcGFuZXMub3ZlcmxheVBhbmU7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwUGFuZSA9IG1hcC5fcGFuZXMucG9wdXBQYW5lO1xyXG5cclxuICAgICAgICAgICAgLy8gTWVyZ2UgZGVmYXVsdCBzaGFwZU9wdGlvbnMgb3B0aW9ucyB3aXRoIGN1c3RvbSBzaGFwZU9wdGlvbnNcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zaGFwZU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2hhcGVPcHRpb25zID0gTC5VdGlsLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLnNoYXBlT3B0aW9ucywgb3B0aW9ucy5zaGFwZU9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGVuYWJsZSgpOiB2b2lkXHJcbiAgICAgICAgLy8gRW5hYmxlcyB0aGlzIGhhbmRsZXJcclxuICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2VuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTC5IYW5kbGVyLnByb3RvdHlwZS5lbmFibGUuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZW5hYmxlZCcsIHtoYW5kbGVyOiB0aGlzLnR5cGV9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5EUkFXU1RBUlQsIHtsYXllclR5cGU6IHRoaXMudHlwZX0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgZGlzYWJsZSgpOiB2b2lkXHJcbiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTC5IYW5kbGVyLnByb3RvdHlwZS5kaXNhYmxlLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShMLkRyYXcuRXZlbnQuRFJBV1NUT1AsIHtsYXllclR5cGU6IHRoaXMudHlwZX0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maXJlKCdkaXNhYmxlZCcsIHtoYW5kbGVyOiB0aGlzLnR5cGV9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGFkZEhvb2tzKCk6IHZvaWRcclxuICAgICAgICAvLyBBZGQncyBldmVudCBsaXN0ZW5lcnMgdG8gdGhpcyBoYW5kbGVyXHJcbiAgICAgICAgYWRkSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcDtcclxuXHJcbiAgICAgICAgICAgIGlmIChtYXApIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5kaXNhYmxlVGV4dFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIG1hcC5nZXRDb250YWluZXIoKS5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAgPSBuZXcgTC5EcmF3LlRvb2x0aXAodGhpcy5fbWFwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBMLkRvbUV2ZW50Lm9uKHRoaXMuX2NvbnRhaW5lciwgJ2tleXVwJywgdGhpcy5fY2FuY2VsRHJhd2luZywgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHJlbW92ZUhvb2tzKCk6IHZvaWRcclxuICAgICAgICAvLyBSZW1vdmVzIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoaXMgaGFuZGxlclxyXG4gICAgICAgIHJlbW92ZUhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXApIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5lbmFibGVUZXh0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbHRpcC5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b29sdGlwID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICBMLkRvbUV2ZW50Lm9mZih0aGlzLl9jb250YWluZXIsICdrZXl1cCcsIHRoaXMuX2NhbmNlbERyYXdpbmcsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBzZXRPcHRpb25zKG9iamVjdCk6IHZvaWRcclxuICAgICAgICAvLyBTZXRzIG5ldyBvcHRpb25zIHRvIHRoaXMgaGFuZGxlclxyXG4gICAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZmlyZUNyZWF0ZWRFdmVudDogZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5DUkVBVEVELCB7bGF5ZXI6IGxheWVyLCBsYXllclR5cGU6IHRoaXMudHlwZX0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIENhbmNlbCBkcmF3aW5nIHdoZW4gdGhlIGVzY2FwZSBrZXkgaXMgcHJlc3NlZFxyXG4gICAgICAgIF9jYW5jZWxEcmF3aW5nOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAyNykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUoJ2RyYXc6Y2FuY2VsZWQnLCB7bGF5ZXJUeXBlOiB0aGlzLnR5cGV9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuRHJhdy5Qb2x5bGluZVxyXG4gICAgICogQGFrYSBEcmF3LlBvbHlsaW5lXHJcbiAgICAgKiBAaW5oZXJpdHMgTC5EcmF3LkZlYXR1cmVcclxuICAgICAqL1xyXG4gICAgTC5EcmF3LlBvbHlsaW5lID0gTC5EcmF3LkZlYXR1cmUuZXh0ZW5kKHtcclxuICAgICAgICBzdGF0aWNzOiB7XHJcbiAgICAgICAgICAgIFRZUEU6ICdwb2x5bGluZSdcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBQb2x5OiBMLlBvbHlsaW5lLFxyXG5cclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGFsbG93SW50ZXJzZWN0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICByZXBlYXRNb2RlOiBmYWxzZSxcclxuICAgICAgICAgICAgZHJhd0Vycm9yOiB7XHJcbiAgICAgICAgICAgICAgICBjb2xvcjogJyNiMDBiMDAnLFxyXG4gICAgICAgICAgICAgICAgdGltZW91dDogMjUwMFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBpY29uOiBuZXcgTC5EaXZJY29uKHtcclxuICAgICAgICAgICAgICAgIGljb25TaXplOiBuZXcgTC5Qb2ludCg4LCA4KSxcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2xlYWZsZXQtZGl2LWljb24gbGVhZmxldC1lZGl0aW5nLWljb24nXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB0b3VjaEljb246IG5ldyBMLkRpdkljb24oe1xyXG4gICAgICAgICAgICAgICAgaWNvblNpemU6IG5ldyBMLlBvaW50KDIwLCAyMCksXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdsZWFmbGV0LWRpdi1pY29uIGxlYWZsZXQtZWRpdGluZy1pY29uIGxlYWZsZXQtdG91Y2gtaWNvbidcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGd1aWRlbGluZURpc3RhbmNlOiAyMCxcclxuICAgICAgICAgICAgbWF4R3VpZGVMaW5lTGVuZ3RoOiA0MDAwLFxyXG4gICAgICAgICAgICBzaGFwZU9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgIHN0cm9rZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG9yOiAnIzMzODhmZicsXHJcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IDQsXHJcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjUsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGNsaWNrYWJsZTogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBtZXRyaWM6IHRydWUsIC8vIFdoZXRoZXIgdG8gdXNlIHRoZSBtZXRyaWMgbWVhc3VyZW1lbnQgc3lzdGVtIG9yIGltcGVyaWFsXHJcbiAgICAgICAgICAgIGZlZXQ6IHRydWUsIC8vIFdoZW4gbm90IG1ldHJpYywgdG8gdXNlIGZlZXQgaW5zdGVhZCBvZiB5YXJkcyBmb3IgZGlzcGxheS5cclxuICAgICAgICAgICAgbmF1dGljOiBmYWxzZSwgLy8gV2hlbiBub3QgbWV0cmljLCBub3QgZmVldCB1c2UgbmF1dGljIG1pbGUgZm9yIGRpc3BsYXlcclxuICAgICAgICAgICAgc2hvd0xlbmd0aDogdHJ1ZSwgLy8gV2hldGhlciB0byBkaXNwbGF5IGRpc3RhbmNlIGluIHRoZSB0b29sdGlwXHJcbiAgICAgICAgICAgIHpJbmRleE9mZnNldDogMjAwMCwgLy8gVGhpcyBzaG91bGQgYmUgPiB0aGFuIHRoZSBoaWdoZXN0IHotaW5kZXggYW55IG1hcCBsYXllcnNcclxuICAgICAgICAgICAgZmFjdG9yOiAxIC8vIFRvIGNoYW5nZSBkaXN0YW5jZSBjYWxjdWxhdGlvblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgaW5pdGlhbGl6ZSgpOiB2b2lkXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG1hcCwgb3B0aW9ucykge1xyXG4gICAgICAgICAgICAvLyBpZiB0b3VjaCwgc3dpdGNoIHRvIHRvdWNoIGljb25cclxuICAgICAgICAgICAgaWYgKEwuQnJvd3Nlci50b3VjaCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmljb24gPSB0aGlzLm9wdGlvbnMudG91Y2hJY29uO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBOZWVkIHRvIHNldCB0aGlzIGhlcmUgdG8gZW5zdXJlIHRoZSBjb3JyZWN0IG1lc3NhZ2UgaXMgdXNlZC5cclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYXdFcnJvci5tZXNzYWdlID0gTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5wb2x5bGluZS5lcnJvcjtcclxuXHJcbiAgICAgICAgICAgIC8vIE1lcmdlIGRlZmF1bHQgZHJhd0Vycm9yIG9wdGlvbnMgd2l0aCBjdXN0b20gb3B0aW9uc1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRyYXdFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kcmF3RXJyb3IgPSBMLlV0aWwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMuZHJhd0Vycm9yLCBvcHRpb25zLmRyYXdFcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHR5cGUgc28gc3VwZXIgY2FuIGZpcmUsIG5lZWQgdG8gZG8gdGhpcyBhcyBjYW5ub3QgZG8gdGhpcy5UWVBFIDooXHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEwuRHJhdy5Qb2x5bGluZS5UWVBFO1xyXG5cclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBtYXAsIG9wdGlvbnMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgYWRkSG9va3MoKTogdm9pZFxyXG4gICAgICAgIC8vIEFkZCBsaXN0ZW5lciBob29rcyB0byB0aGlzIGhhbmRsZXJcclxuICAgICAgICBhZGRIb29rczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBMLkRyYXcuRmVhdHVyZS5wcm90b3R5cGUuYWRkSG9va3MuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2VycyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcmtlckdyb3VwID0gbmV3IEwuTGF5ZXJHcm91cCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmFkZExheWVyKHRoaXMuX21hcmtlckdyb3VwKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2x5ID0gbmV3IEwuUG9seWxpbmUoW10sIHRoaXMub3B0aW9ucy5zaGFwZU9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAudXBkYXRlQ29udGVudCh0aGlzLl9nZXRUb29sdGlwVGV4dCgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBNYWtlIGEgdHJhbnNwYXJlbnQgbWFya2VyIHRoYXQgd2lsbCB1c2VkIHRvIGNhdGNoIGNsaWNrIGV2ZW50cy4gVGhlc2UgY2xpY2tcclxuICAgICAgICAgICAgICAgIC8vIGV2ZW50cyB3aWxsIGNyZWF0ZSB0aGUgdmVydGljZXMuIFdlIG5lZWQgdG8gZG8gdGhpcyBzbyB3ZSBjYW4gZW5zdXJlIHRoYXRcclxuICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBjcmVhdGUgdmVydGljZXMgb3ZlciBvdGhlciBtYXAgbGF5ZXJzIChtYXJrZXJzLCB2ZWN0b3IgbGF5ZXJzKS4gV2VcclxuICAgICAgICAgICAgICAgIC8vIGFsc28gZG8gbm90IHdhbnQgdG8gdHJpZ2dlciBhbnkgY2xpY2sgaGFuZGxlcnMgb2Ygb2JqZWN0cyB3ZSBhcmUgY2xpY2tpbmcgb25cclxuICAgICAgICAgICAgICAgIC8vIHdoaWxlIGRyYXdpbmcuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21vdXNlTWFya2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW91c2VNYXJrZXIgPSBMLm1hcmtlcih0aGlzLl9tYXAuZ2V0Q2VudGVyKCksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogTC5kaXZJY29uKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2xlYWZsZXQtbW91c2UtbWFya2VyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25BbmNob3I6IFsyMCwgMjBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblNpemU6IFs0MCwgNDBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXhPZmZzZXQ6IHRoaXMub3B0aW9ucy56SW5kZXhPZmZzZXRcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3VzZU1hcmtlclxyXG4gICAgICAgICAgICAgICAgICAgIC5vbignbW91c2VvdXQnLCB0aGlzLl9vbk1vdXNlT3V0LCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRoaXMpIC8vIE5lY2Vzc2FyeSB0byBwcmV2ZW50IDAuOCBzdHV0dGVyXHJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdtb3VzZWRvd24nLCB0aGlzLl9vbk1vdXNlRG93biwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAub24oJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIHRoaXMpIC8vIE5lY2Vzc2FyeSBmb3IgMC44IGNvbXBhdGliaWxpdHlcclxuICAgICAgICAgICAgICAgICAgICAuYWRkVG8odGhpcy5fbWFwKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXBcclxuICAgICAgICAgICAgICAgICAgICAub24oJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIHRoaXMpIC8vIE5lY2Vzc2FyeSBmb3IgMC43IGNvbXBhdGliaWxpdHlcclxuICAgICAgICAgICAgICAgICAgICAub24oJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbignem9vbWxldmVsc2NoYW5nZScsIHRoaXMuX29uWm9vbUVuZCwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAub24oJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblRvdWNoLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbignem9vbWVuZCcsIHRoaXMuX29uWm9vbUVuZCwgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCByZW1vdmVIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVyIGhvb2tzIGZyb20gdGhpcyBoYW5kbGVyLlxyXG4gICAgICAgIHJlbW92ZUhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIEwuRHJhdy5GZWF0dXJlLnByb3RvdHlwZS5yZW1vdmVIb29rcy5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY2xlYXJIaWRlRXJyb3JUaW1lb3V0KCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jbGVhblVwU2hhcGUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSBtYXJrZXJzIGZyb20gbWFwXHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzLl9tYXJrZXJHcm91cCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9tYXJrZXJHcm91cDtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcmtlcnM7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fcG9seSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wb2x5O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbW91c2VNYXJrZXJcclxuICAgICAgICAgICAgICAgIC5vZmYoJ21vdXNlZG93bicsIHRoaXMuX29uTW91c2VEb3duLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZignbW91c2VvdXQnLCB0aGlzLl9vbk1vdXNlT3V0LCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZignbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCB0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX21vdXNlTWFya2VyKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21vdXNlTWFya2VyO1xyXG5cclxuICAgICAgICAgICAgLy8gY2xlYW4gdXAgRE9NXHJcbiAgICAgICAgICAgIHRoaXMuX2NsZWFyR3VpZGVzKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXBcclxuICAgICAgICAgICAgICAgIC5vZmYoJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ3pvb21sZXZlbHNjaGFuZ2UnLCB0aGlzLl9vblpvb21FbmQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub2ZmKCd6b29tZW5kJywgdGhpcy5fb25ab29tRW5kLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZigndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2gsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub2ZmKCdjbGljaycsIHRoaXMuX29uVG91Y2gsIHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgZGVsZXRlTGFzdFZlcnRleCgpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBsYXN0IHZlcnRleCBmcm9tIHRoZSBwb2x5bGluZSwgcmVtb3ZlcyBwb2x5bGluZSBmcm9tIG1hcCBpZiBvbmx5IG9uZSBwb2ludCBleGlzdHMuXHJcbiAgICAgICAgZGVsZXRlTGFzdFZlcnRleDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWFya2Vycy5sZW5ndGggPD0gMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgbGFzdE1hcmtlciA9IHRoaXMuX21hcmtlcnMucG9wKCksXHJcbiAgICAgICAgICAgICAgICBwb2x5ID0gdGhpcy5fcG9seSxcclxuICAgICAgICAgICAgICAgIC8vIFJlcGxhY2VzIC5zcGxpY2VMYXRMbmdzKClcclxuICAgICAgICAgICAgICAgIGxhdGxuZ3MgPSBwb2x5LmdldExhdExuZ3MoKSxcclxuICAgICAgICAgICAgICAgIGxhdGxuZyA9IGxhdGxuZ3Muc3BsaWNlKC0xLCAxKVswXTtcclxuICAgICAgICAgICAgdGhpcy5fcG9seS5zZXRMYXRMbmdzKGxhdGxuZ3MpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbWFya2VyR3JvdXAucmVtb3ZlTGF5ZXIobGFzdE1hcmtlcik7XHJcblxyXG4gICAgICAgICAgICBpZiAocG9seS5nZXRMYXRMbmdzKCkubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHBvbHkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92ZXJ0ZXhDaGFuZ2VkKGxhdGxuZywgZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgaXNNYXJrZXJJbnNpZGVQb2x5Z29uKCk6IHZvaWRcclxuICAgICAgICBpc01hcmtlckluc2lkZVBvbHlnb246IGZ1bmN0aW9uIChsYXRMbmcsIHBvbHkpIHtcclxuICAgICAgICAgICAgdmFyIGluc2lkZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YXIgeCA9IGxhdExuZy5sYXQsIHkgPSBsYXRMbmcubG5nO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgcG9seS5nZXRMYXRMbmdzKCkubGVuZ3RoOyBpaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcG9seVBvaW50cyA9IHBvbHkuZ2V0TGF0TG5ncygpW2lpXTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gcG9seVBvaW50cy5sZW5ndGggLSAxOyBpIDwgcG9seVBvaW50cy5sZW5ndGg7IGogPSBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgeGkgPSBwb2x5UG9pbnRzW2ldLmxhdCwgeWkgPSBwb2x5UG9pbnRzW2ldLmxuZztcclxuICAgICAgICAgICAgICAgICAgICB2YXIgeGogPSBwb2x5UG9pbnRzW2pdLmxhdCwgeWogPSBwb2x5UG9pbnRzW2pdLmxuZztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludGVyc2VjdCA9ICgoeWkgPiB5KSAhPSAoeWogPiB5KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHggPCAoeGogLSB4aSkgKiAoeSAtIHlpKSAvICh5aiAtIHlpKSArIHhpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0KSBpbnNpZGUgPSAhaW5zaWRlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBpbnNpZGU7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyBAbWV0aG9kIGFkZFZlcnRleCgpOiB2b2lkXHJcbiAgICAgICAgLy8gQWRkIGEgdmVydGV4IHRvIHRoZSBlbmQgb2YgdGhlIHBvbHlsaW5lXHJcbiAgICAgICAgLy8gQWRkIGEgdmVydGV4IHRvIHRoZSBlbmQgb2YgdGhlIHBvbHlsaW5lXHJcbiAgICAgICAgYWRkVmVydGV4OiBmdW5jdGlvbiAobGF0bG5nLCBzYW1lKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXJzTGVuZ3RoID0gdGhpcy5fbWFya2Vycy5sZW5ndGg7XHJcbiAgICAgICAgICAgIC8vIG1hcmtlcnNMZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMiBiZWZvcmUgaW50ZXJzZWN0aW9ucyBjYW4gb2NjdXJcclxuICAgICAgICAgICAgdmFyIGluUG9seWdvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoc2FtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmVhY2hMYXllcihmdW5jdGlvbiAocG9seSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb2x5IGluc3RhbmNlb2YgTC5Qb2x5Z29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnNpZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBsYXRsbmcubGF0LCB5ID0gbGF0bG5nLmxuZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IHBvbHkuZ2V0TGF0TG5ncygpLmxlbmd0aDsgaWkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvbHlQb2ludHMgPSBwb2x5LmdldExhdExuZ3MoKVtpaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IHBvbHlQb2ludHMubGVuZ3RoIC0gMTsgaSA8IHBvbHlQb2ludHMubGVuZ3RoOyBqID0gaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhpID0gcG9seVBvaW50c1tpXS5sYXQsIHlpID0gcG9seVBvaW50c1tpXS5sbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhqID0gcG9seVBvaW50c1tqXS5sYXQsIHlqID0gcG9seVBvaW50c1tqXS5sbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcnNlY3QgPSAoKHlpID4geSkgIT0gKHlqID4geSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICh4IDwgKHhqIC0geGkpICogKHkgLSB5aSkgLyAoeWogLSB5aSkgKyB4aSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyc2VjdCkgaW5zaWRlID0gIWluc2lkZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zaWRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3BvbHkuc2V0U3R5bGUoeyBjb2xvcjogJ2JsdWUnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qb2x5Z29uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHZhciBwb2ludFNuYXAgPSB0aGlzLnBvaW50U25hcCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgaWYgKCFpblBvbHlnb24gJiYgbWFya2Vyc0xlbmd0aCA+PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbGF0TG5nVGVzdCA9IGxhdGxuZztcclxuICAgICAgICAgICAgICAgIHZhciBsYXN0TGF0TG5nID0gdGhpcy5fbWFya2Vyc1ttYXJrZXJzTGVuZ3RoIC0gMV0uZ2V0TGF0TG5nKCk7XHJcbiAgICAgICAgICAgICAgICBpblBvbHlnb24gPSB0aGlzLmxpbmVJblBvbHlnb24obGF0TG5nVGVzdCwgbGFzdExhdExuZyk7XHJcbiAgICAgICAgICAgICAgICB2YXIgbGFzdExpbmUgPSBMLnBvbHlsaW5lKFtsYXN0TGF0TG5nLCBsYXRMbmdUZXN0XSwge29wYWNpdHk6IFwiMFwifSkuYWRkVG8odGhpcy5fbWFwKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGlnbmUgaW50ZXJzZWN0IHVuIHBvbHlnb24gT1Ugc2kgcG9pbnQvbGlnbmUgaW4gUG9seWdvbiBPVSBzaSBwb2ludCBuJ2VzdCBwYXMgc3VyIHVuIHBvaW50IHNuYXAgb3UgZGFucyBsZSB2aWRlXHJcbiAgICAgICAgICAgIGlmICgobWFya2Vyc0xlbmd0aCA+PSAyICYmICF0aGlzLm9wdGlvbnMuYWxsb3dJbnRlcnNlY3Rpb24gJiYgdGhpcy5fcG9seS5uZXdMYXRMbmdJbnRlcnNlY3RzKGxhdGxuZykpIHx8IGluUG9seWdvbiB8fCAoIXBvaW50U25hcCAmJiAhc2FtZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dFcnJvclRvb2x0aXAoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9lcnJvclNob3duKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oaWRlRXJyb3JUb29sdGlwKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlcnMucHVzaCh0aGlzLl9jcmVhdGVNYXJrZXIobGF0bG5nKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9wb2x5LmFkZExhdExuZyhsYXRsbmcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvbHkuZ2V0TGF0TG5ncygpLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmFkZExheWVyKHRoaXMuX3BvbHkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92ZXJ0ZXhDaGFuZ2VkKGxhdGxuZywgdHJ1ZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgcG9pbnRTbmFwOiBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICB2YXIgZ3VpZGVMYXllcnMgPSB0aGlzLl9zbmFwcGVyLl9ndWlkZXM7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3VpZGVMYXllcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ3VpZGVMYXllcnNbaV0uX2xhdGxuZ3MubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGd1aWRlTGF5ZXJzW2ldLl9sYXRsbmdzW2pdLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGd1aWRlTGF5ZXJzW2ldLl9sYXRsbmdzW2pdW2tdLmxhdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc25hcHBlci5fbWFya2Vyc1swXS5fbGF0bG5nLmxhdCA9PSBndWlkZUxheWVyc1tpXS5fbGF0bG5nc1tqXVtrXS5sYXQgJiYgdGhpcy5fc25hcHBlci5fbWFya2Vyc1swXS5fbGF0bG5nLmxuZyA9PSBndWlkZUxheWVyc1tpXS5fbGF0bG5nc1tqXVtrXS5sbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBndWlkZUxheWVyc1tpXS5fbGF0bG5nc1tqXVtrXS5sZW5ndGg7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zbmFwcGVyLl9tYXJrZXJzWzBdLl9sYXRsbmcubGF0ID09IGd1aWRlTGF5ZXJzW2ldLl9sYXRsbmdzW2pdW2tdW2xdLmxhdCAmJiB0aGlzLl9zbmFwcGVyLl9tYXJrZXJzWzBdLl9sYXRsbmcubG5nID09IGd1aWRlTGF5ZXJzW2ldLl9sYXRsbmdzW2pdW2tdW2xdLmxuZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgY29tcGxldGVTaGFwZSgpOiB2b2lkXHJcbiAgICAgICAgLy8gQ2xvc2VzIHRoZSBwb2x5bGluZSBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgbGFzdCBwb2ludHNcclxuICAgICAgICBjb21wbGV0ZVNoYXBlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXJrZXJzLmxlbmd0aCA8PSAxKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVDcmVhdGVkRXZlbnQoKTtcclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlcGVhdE1vZGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBpc19pbl9wb2x5Z29uOiBmdW5jdGlvbiAoJHZlcnRpY2VzX3gsICR2ZXJ0aWNlc195LCBwb2ludCkge1xyXG4gICAgICAgICAgICAkYyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAkaSA9ICRqID0gJGMgPSAwO1xyXG4gICAgICAgICAgICAkbG9uZ2l0dWRlX3ggPSBwb2ludC5sbmc7XHJcbiAgICAgICAgICAgICRsYXRpdHVkZV95ID0gcG9pbnQubGF0O1xyXG5cclxuICAgICAgICAgICAgZm9yICgkaSA9IDAsICRqID0gMi0xOyAkaSA8IDI7ICRqID0gJGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCgkdmVydGljZXNfeVskaV0gPiAgJGxhdGl0dWRlX3kgIT0gKCR2ZXJ0aWNlc195WyRqXSA+ICRsYXRpdHVkZV95KSkgJiYgKCRsb25naXR1ZGVfeCA8ICgkdmVydGljZXNfeFskal0gLSAkdmVydGljZXNfeFskaV0pICogKCRsYXRpdHVkZV95IC0gJHZlcnRpY2VzX3lbJGldKSAvICgkdmVydGljZXNfeVskal0gLSAkdmVydGljZXNfeVskaV0pICsgJHZlcnRpY2VzX3hbJGldKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICRjID0gISRjO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gJGM7XHJcbiAgICAgICAgfSxcclxuXHJcblxyXG4gICAgICAgIHBvaW50T25Qb2x5Z29uOiBmdW5jdGlvbihsYXRMbmcpe1xyXG4gICAgICAgICAgICB0aGlzLl9tYXAuZWFjaExheWVyKGZ1bmN0aW9uIChwb2x5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9seSBpbnN0YW5jZW9mIEwuUG9seWdvbikge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgcG9seUJvdW5kcyA9IHBvbHkuZ2V0Qm91bmRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvbHlCb3VuZHMuY29udGFpbnMobGF0TG5nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGF0TG5nUG9seSA9IHBvbHkuX2xhdGxuZ3NbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZW5naHQgPSBsYXRMbmdQb2x5Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaiA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGkgPCBsZW5naHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaiA9PSBsZW5naHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBMLnBvbHlsaW5lKFtwb2x5Ll9sYXRsbmdzWzBdW2ldLCBwb2x5Ll9sYXRsbmdzWzBdW2pdXSwge29wYWNpdHk6IFwiMFwifSkuYWRkVG8ocG9seS5fbWFwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb2x5TGluZUJvdW5kcyA9IGxpbmUuZ2V0Qm91bmRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwb2x5TGluZUJvdW5kcy5jb250YWlucyhsYXRMbmcpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkgPT0gMCAmJiBqID09IGxlbmdodCAtIDEpIHx8IChqID09IDAgJiYgaSA9PSBsZW5naHQgLSAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRMbmdQb2x5LnNwbGljZSgwLCAwLCBMLmxhdExuZyhsYXRMbmcubGF0LCBsYXRMbmcubG5nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcmtlclBvbHkgPSBpICsgajtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyUG9seSA9IG1hcmtlclBvbHkgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRMbmdQb2x5LnNwbGljZShNYXRoLmNlaWwobWFya2VyUG9seSksIDAsIEwubGF0TG5nKGxhdExuZy5sYXQsIGxhdExuZy5sbmcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHkuX21hcC5yZW1vdmVMYXllcihsaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5Ll9sYXRsbmdzWzBdID0gbGF0TG5nUG9seTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5LmVkaXRpbmcubGF0bG5nc1swXVswXSA9IGxhdExuZ1BvbHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9seS5yZWRyYXcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHkuX21hcC5yZW1vdmVMYXllcihsaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBsaW5lSW5Qb2x5Z29uOiBmdW5jdGlvbiAobGF0TG5nVGVzdCwgbGFzdExhdExuZykge1xyXG4gICAgICAgICAgICB2YXIgaW5Qb2x5Z29uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZhciBsYXN0TGluZSA9IEwucG9seWxpbmUoW2xhc3RMYXRMbmcsIGxhdExuZ1Rlc3RdLCB7b3BhY2l0eTogXCIwXCJ9KS5hZGRUbyh0aGlzLl9tYXApO1xyXG4gICAgICAgICAgICBsYXRMbmdUZXN0LmxuZyA9IChNYXRoLnJvdW5kKGxhdExuZ1Rlc3QubG5nICogMTAwMDAwMCkgLyAxMDAwMDAwKTtcclxuICAgICAgICAgICAgbGF0TG5nVGVzdC5sYXQgPSAoTWF0aC5yb3VuZChsYXRMbmdUZXN0LmxhdCAqIDEwMDAwMDApIC8gMTAwMDAwMCk7XHJcbiAgICAgICAgICAgIGxhc3RMYXRMbmcubG5nID0gKE1hdGgucm91bmQobGFzdExhdExuZy5sbmcgKiAxMDAwMDAwKSAvIDEwMDAwMDApO1xyXG4gICAgICAgICAgICBsYXN0TGF0TG5nLmxhdCA9IChNYXRoLnJvdW5kKGxhc3RMYXRMbmcubGF0ICogMTAwMDAwMCkgLyAxMDAwMDAwKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIG51bSA9IDAuMTsgbnVtIDw9IDAuOTsgbnVtICs9IDAuMSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBvaW50ID0gTC5HZW9tZXRyeVV0aWwuaW50ZXJwb2xhdGVPbkxpbmUodGhpcy5fbWFwLCBsYXN0TGluZSwgbnVtKTtcclxuICAgICAgICAgICAgICAgIHZhciB0YWJPblBvbHkgPSBbXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5lYWNoTGF5ZXIoZnVuY3Rpb24gKHBvbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9seSBpbnN0YW5jZW9mIEwuUG9seWdvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmVmb3JlLCBhZnRlciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9seS5nZXRMYXRMbmdzKCkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb2x5UG9pbnRzID0gcG9seS5nZXRMYXRMbmdzKClbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcG9seVBvaW50c1swXS5sYXQpey8vYW50ZW5uZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5UG9pbnRzID0gcG9seVBvaW50c1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcG9seVBvaW50cy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb2x5UG9pbnRzW2pdLmVxdWFscyhsYXN0TGF0TG5nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBqIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBqICsgMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlID0gcG9seVBvaW50cy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGogPT0gcG9seVBvaW50cy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvbHlQb2ludHNbYmVmb3JlXS5lcXVhbHMobGF0TG5nVGVzdCkgfHwgcG9seVBvaW50c1thZnRlcl0uZXF1YWxzKGxhdExuZ1Rlc3QpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJPblBvbHkucHVzaChwb2x5Lm9wdGlvbnMuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZWFjaExheWVyKGZ1bmN0aW9uIChwb2x5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvbHkgaW5zdGFuY2VvZiBMLlBvbHlnb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJPblBvbHkuaW5jbHVkZXMocG9seS5vcHRpb25zLmlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluc2lkZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBwb2ludC5sYXRMbmcubGF0LCB5ID0gcG9pbnQubGF0TG5nLmxuZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBwb2x5LmdldExhdExuZ3MoKS5sZW5ndGg7IGlpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9seVBvaW50cyA9IHBvbHkuZ2V0TGF0TG5ncygpW2lpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IHBvbHlQb2ludHMubGVuZ3RoIC0gMTsgaSA8IHBvbHlQb2ludHMubGVuZ3RoOyBqID0gaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aSA9IHBvbHlQb2ludHNbaV0ubGF0LCB5aSA9IHBvbHlQb2ludHNbaV0ubG5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeGogPSBwb2x5UG9pbnRzW2pdLmxhdCwgeWogPSBwb2x5UG9pbnRzW2pdLmxuZztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcnNlY3QgPSAoKHlpID4geSkgIT0gKHlqID4geSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoeCA8ICh4aiAtIHhpKSAqICh5IC0geWkpIC8gKHlqIC0geWkpICsgeGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0KSBpbnNpZGUgPSAhaW5zaWRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBvbHlnb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKGxhc3RMaW5lKTtcclxuICAgICAgICAgICAgcmV0dXJuIGluUG9seWdvbjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZmluaXNoU2hhcGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdmaW5pc2hzaGFwZScpO1xyXG4gICAgICAgICAgICB2YXIgbGF0bG5ncyA9IHRoaXMuX3BvbHkuX2RlZmF1bHRTaGFwZSA/IHRoaXMuX3BvbHkuX2RlZmF1bHRTaGFwZSgpIDogdGhpcy5fcG9seS5nZXRMYXRMbmdzKCk7XHJcbiAgICAgICAgICAgIHZhciBpbnRlcnNlY3RzID0gdGhpcy5fcG9seS5uZXdMYXRMbmdJbnRlcnNlY3RzKGxhdGxuZ3NbbGF0bG5ncy5sZW5ndGggLSAxXSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgbWFya2Vyc0xlbmd0aCA9IHRoaXMuX21hcmtlcnMubGVuZ3RoO1xyXG4gICAgICAgICAgICB2YXIgbGF0TG5nVGVzdCA9IHRoaXMuX21hcmtlcnNbMF0uZ2V0TGF0TG5nKCk7XHJcbiAgICAgICAgICAgIHZhciBsYXN0TGF0TG5nID0gdGhpcy5fbWFya2Vyc1ttYXJrZXJzTGVuZ3RoIC0gMV0uZ2V0TGF0TG5nKCk7XHJcbiAgICAgICAgICAgIHZhciBpblBvbHlnb24gPSB0aGlzLmxpbmVJblBvbHlnb24obGF0TG5nVGVzdCwgbGFzdExhdExuZyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoKCF0aGlzLm9wdGlvbnMuYWxsb3dJbnRlcnNlY3Rpb24gJiYgaW50ZXJzZWN0cykgfHwgIXRoaXMuX3NoYXBlSXNWYWxpZCgpIHx8IGluUG9seWdvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvd0Vycm9yVG9vbHRpcCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9maXJlQ3JlYXRlZEV2ZW50KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlcGVhdE1vZGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBDYWxsZWQgdG8gdmVyaWZ5IHRoZSBzaGFwZSBpcyB2YWxpZCB3aGVuIHRoZSB1c2VyIHRyaWVzIHRvIGZpbmlzaCBpdFxyXG4gICAgICAgIC8vIFJldHVybiBmYWxzZSBpZiB0aGUgc2hhcGUgaXMgbm90IHZhbGlkXHJcbiAgICAgICAgX3NoYXBlSXNWYWxpZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25ab29tRW5kOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXJrZXJzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVHdWlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uTW91c2VNb3ZlOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgbmV3UG9zID0gdGhpcy5fbWFwLm1vdXNlRXZlbnRUb0xheWVyUG9pbnQoZS5vcmlnaW5hbEV2ZW50KTtcclxuICAgICAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcobmV3UG9zKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNhdmUgbGF0bG5nXHJcbiAgICAgICAgICAgIC8vIHNob3VsZCB0aGlzIGJlIG1vdmVkIHRvIF91cGRhdGVHdWlkZSgpID9cclxuICAgICAgICAgICAgdGhpcy5fY3VycmVudExhdExuZyA9IGxhdGxuZztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRvb2x0aXAobGF0bG5nKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZ3VpZGUgbGluZVxyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVHdWlkZShuZXdQb3MpO1xyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBtb3VzZSBtYXJrZXIgcG9zaXRpb25cclxuICAgICAgICAgICAgdGhpcy5fbW91c2VNYXJrZXIuc2V0TGF0TG5nKGxhdGxuZyk7XHJcblxyXG4gICAgICAgICAgICBMLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KGUub3JpZ2luYWxFdmVudCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3ZlcnRleENoYW5nZWQ6IGZ1bmN0aW9uIChsYXRsbmcsIGFkZGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5EUkFXVkVSVEVYLCB7bGF5ZXJzOiB0aGlzLl9tYXJrZXJHcm91cH0pO1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVGaW5pc2hIYW5kbGVyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVSdW5uaW5nTWVhc3VyZShsYXRsbmcsIGFkZGVkKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NsZWFyR3VpZGVzKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVUb29sdGlwKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uTW91c2VEb3duOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NsaWNrSGFuZGxlZCAmJiAhdGhpcy5fdG91Y2hIYW5kbGVkICYmICF0aGlzLl9kaXNhYmxlTWFya2Vycykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb25Nb3VzZU1vdmUoZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0hhbmRsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzYWJsZU5ld01hcmtlcnMoKTtcclxuICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbEV2ZW50ID0gZS5vcmlnaW5hbEV2ZW50O1xyXG4gICAgICAgICAgICAgICAgdmFyIGNsaWVudFggPSBvcmlnaW5hbEV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2xpZW50WSA9IG9yaWdpbmFsRXZlbnQuY2xpZW50WTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9pbnQuY2FsbCh0aGlzLCBjbGllbnRYLCBjbGllbnRZKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9zdGFydFBvaW50OiBmdW5jdGlvbiAoY2xpZW50WCwgY2xpZW50WSkge1xyXG4gICAgICAgICAgICB0aGlzLl9tb3VzZURvd25PcmlnaW4gPSBMLnBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbk1vdXNlVXA6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBvcmlnaW5hbEV2ZW50ID0gZS5vcmlnaW5hbEV2ZW50O1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50WCA9IG9yaWdpbmFsRXZlbnQuY2xpZW50WDtcclxuICAgICAgICAgICAgdmFyIGNsaWVudFkgPSBvcmlnaW5hbEV2ZW50LmNsaWVudFk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZFBvaW50LmNhbGwodGhpcywgY2xpZW50WCwgY2xpZW50WSwgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrSGFuZGxlZCA9IG51bGw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2VuZFBvaW50OiBmdW5jdGlvbiAoY2xpZW50WCwgY2xpZW50WSwgZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbW91c2VEb3duT3JpZ2luKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZHJhZ0NoZWNrRGlzdGFuY2UgPSBMLnBvaW50KGNsaWVudFgsIGNsaWVudFkpXHJcbiAgICAgICAgICAgICAgICAgICAgLmRpc3RhbmNlVG8odGhpcy5fbW91c2VEb3duT3JpZ2luKTtcclxuICAgICAgICAgICAgICAgIHZhciBsYXN0UHREaXN0YW5jZSA9IHRoaXMuX2NhbGN1bGF0ZUZpbmlzaERpc3RhbmNlKGUubGF0bG5nKTtcclxuICAgICAgICAgICAgICAgIGlmIChsYXN0UHREaXN0YW5jZSA8IDEwICYmIEwuQnJvd3Nlci50b3VjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaFNoYXBlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGRyYWdDaGVja0Rpc3RhbmNlKSA8IDkgKiAod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc25hcHBlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2FtZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc25hcHBlci5fbWFya2Vyc1swXS5fbGF0bG5nLmxhdCA9PSBlLmxhdGxuZy5sYXQgJiYgdGhpcy5fc25hcHBlci5fbWFya2Vyc1swXS5fbGF0bG5nLmxuZyA9PSBlLmxhdGxuZy5sbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkVmVydGV4KHRoaXMuX3NuYXBwZXIuX21hcmtlcnNbMF0uX2xhdGxuZywgc2FtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRWZXJ0ZXgoZS5sYXRsbmcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVOZXdNYXJrZXJzKCk7IC8vIGFmdGVyIGEgc2hvcnQgcGF1c2UsIGVuYWJsZSBuZXcgbWFya2Vyc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX21vdXNlRG93bk9yaWdpbiA9IG51bGw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gb250b3VjaCBwcmV2ZW50ZWQgYnkgY2xpY2tIYW5kbGVkIGZsYWcgYmVjYXVzZSBzb21lIGJyb3dzZXJzIGZpcmUgYm90aCBjbGljay90b3VjaCBldmVudHMsXHJcbiAgICAgICAgLy8gY2F1c2luZyB1bndhbnRlZCBiZWhhdmlvclxyXG4gICAgICAgIF9vblRvdWNoOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxFdmVudCA9IGUub3JpZ2luYWxFdmVudDtcclxuICAgICAgICAgICAgdmFyIGNsaWVudFg7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnRZO1xyXG4gICAgICAgICAgICBpZiAob3JpZ2luYWxFdmVudC50b3VjaGVzICYmIG9yaWdpbmFsRXZlbnQudG91Y2hlc1swXSAmJiAhdGhpcy5fY2xpY2tIYW5kbGVkICYmICF0aGlzLl90b3VjaEhhbmRsZWQgJiYgIXRoaXMuX2Rpc2FibGVNYXJrZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRYID0gb3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFg7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRZID0gb3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlTmV3TWFya2VycygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG91Y2hIYW5kbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9pbnQuY2FsbCh0aGlzLCBjbGllbnRYLCBjbGllbnRZKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2VuZFBvaW50LmNhbGwodGhpcywgY2xpZW50WCwgY2xpZW50WSwgZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b3VjaEhhbmRsZWQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrSGFuZGxlZCA9IG51bGw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uTW91c2VPdXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rvb2x0aXApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAuX29uTW91c2VPdXQuY2FsbCh0aGlzLl90b29sdGlwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBpZiB3ZSBhcmUgY3VycmVudGx5IHdpdGhpbiBjbG9zZSBlbm91Z2ggZGlzdGFuY2VcclxuICAgICAgICAvLyBvZiB0aGUgY2xvc2luZyBwb2ludCAoZmlyc3QgcG9pbnQgZm9yIHNoYXBlcywgbGFzdCBwb2ludCBmb3IgbGluZXMpXHJcbiAgICAgICAgLy8gdGhpcyBpcyBzZW1pLXVnbHkgY29kZSBidXQgdGhlIG9ubHkgcmVsaWFibGUgd2F5IGkgZm91bmQgdG8gZ2V0IHRoZSBqb2IgZG9uZVxyXG4gICAgICAgIC8vIG5vdGU6IGNhbGN1bGF0aW5nIHBvaW50LmRpc3RhbmNlVG8gYmV0d2VlbiBtb3VzZURvd25PcmlnaW4gYW5kIGxhc3QgbWFya2VyIGRpZCBOT1Qgd29ya1xyXG4gICAgICAgIF9jYWxjdWxhdGVGaW5pc2hEaXN0YW5jZTogZnVuY3Rpb24gKHBvdGVudGlhbExhdExuZykge1xyXG4gICAgICAgICAgICB2YXIgbGFzdFB0RGlzdGFuY2VcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcmtlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZpbmlzaE1hcmtlcjtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09IEwuRHJhdy5Qb2x5bGluZS5UWVBFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoTWFya2VyID0gdGhpcy5fbWFya2Vyc1t0aGlzLl9tYXJrZXJzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IEwuRHJhdy5Qb2x5Z29uLlRZUEUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hNYXJrZXIgPSB0aGlzLl9tYXJrZXJzWzBdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIgbGFzdE1hcmtlclBvaW50ID0gdGhpcy5fbWFwLmxhdExuZ1RvQ29udGFpbmVyUG9pbnQoZmluaXNoTWFya2VyLmdldExhdExuZygpKSxcclxuICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxNYXJrZXIgPSBuZXcgTC5NYXJrZXIocG90ZW50aWFsTGF0TG5nLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246IHRoaXMub3B0aW9ucy5pY29uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXhPZmZzZXQ6IHRoaXMub3B0aW9ucy56SW5kZXhPZmZzZXQgKiAyXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcG90ZW50aWFsTWFya2VyUGludCA9IHRoaXMuX21hcC5sYXRMbmdUb0NvbnRhaW5lclBvaW50KHBvdGVudGlhbE1hcmtlci5nZXRMYXRMbmcoKSk7XHJcbiAgICAgICAgICAgICAgICBsYXN0UHREaXN0YW5jZSA9IGxhc3RNYXJrZXJQb2ludC5kaXN0YW5jZVRvKHBvdGVudGlhbE1hcmtlclBpbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGFzdFB0RGlzdGFuY2UgPSBJbmZpbml0eTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbGFzdFB0RGlzdGFuY2U7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3VwZGF0ZUZpbmlzaEhhbmRsZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG1hcmtlckNvdW50ID0gdGhpcy5fbWFya2Vycy5sZW5ndGg7XHJcbiAgICAgICAgICAgIC8vIFRoZSBsYXN0IG1hcmtlciBzaG91bGQgaGF2ZSBhIGNsaWNrIGhhbmRsZXIgdG8gY2xvc2UgdGhlIHBvbHlsaW5lXHJcbiAgICAgICAgICAgIGlmIChtYXJrZXJDb3VudCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcmtlcnNbbWFya2VyQ291bnQgLSAxXS5vbignY2xpY2snLCB0aGlzLl9maW5pc2hTaGFwZSwgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgb2xkIG1hcmtlciBjbGljayBoYW5kbGVyIChhcyBvbmx5IHRoZSBsYXN0IHBvaW50IHNob3VsZCBjbG9zZSB0aGUgcG9seWxpbmUpXHJcbiAgICAgICAgICAgIGlmIChtYXJrZXJDb3VudCA+IDIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcmtlcnNbbWFya2VyQ291bnQgLSAyXS5vZmYoJ2NsaWNrJywgdGhpcy5fZmluaXNoU2hhcGUsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NyZWF0ZU1hcmtlcjogZnVuY3Rpb24gKGxhdGxuZykge1xyXG4gICAgICAgICAgICB2YXIgbWFya2VyID0gbmV3IEwuTWFya2VyKGxhdGxuZywge1xyXG4gICAgICAgICAgICAgICAgaWNvbjogdGhpcy5vcHRpb25zLmljb24sXHJcbiAgICAgICAgICAgICAgICB6SW5kZXhPZmZzZXQ6IHRoaXMub3B0aW9ucy56SW5kZXhPZmZzZXQgKiAyXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbWFya2VyR3JvdXAuYWRkTGF5ZXIobWFya2VyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBtYXJrZXI7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3VwZGF0ZUd1aWRlOiBmdW5jdGlvbiAobmV3UG9zKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXJDb3VudCA9IHRoaXMuX21hcmtlcnMgPyB0aGlzLl9tYXJrZXJzLmxlbmd0aCA6IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAobWFya2VyQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdQb3MgPSBuZXdQb3MgfHwgdGhpcy5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9jdXJyZW50TGF0TG5nKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBndWlkZSBsaW5lXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGVhckd1aWRlcygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd0d1aWRlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbWFya2Vyc1ttYXJrZXJDb3VudCAtIDFdLmdldExhdExuZygpKSxcclxuICAgICAgICAgICAgICAgICAgICBuZXdQb3NcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfdXBkYXRlVG9vbHRpcDogZnVuY3Rpb24gKGxhdExuZykge1xyXG4gICAgICAgICAgICB2YXIgdGV4dCA9IHRoaXMuX2dldFRvb2x0aXBUZXh0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAobGF0TG5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b29sdGlwLnVwZGF0ZVBvc2l0aW9uKGxhdExuZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fZXJyb3JTaG93bikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbHRpcC51cGRhdGVDb250ZW50KHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2RyYXdHdWlkZTogZnVuY3Rpb24gKHBvaW50QSwgcG9pbnRCKSB7XHJcbiAgICAgICAgICAgIHZhciBsZW5ndGggPSBNYXRoLmZsb29yKE1hdGguc3FydChNYXRoLnBvdygocG9pbnRCLnggLSBwb2ludEEueCksIDIpICsgTWF0aC5wb3coKHBvaW50Qi55IC0gcG9pbnRBLnkpLCAyKSkpLFxyXG4gICAgICAgICAgICAgICAgZ3VpZGVsaW5lRGlzdGFuY2UgPSB0aGlzLm9wdGlvbnMuZ3VpZGVsaW5lRGlzdGFuY2UsXHJcbiAgICAgICAgICAgICAgICBtYXhHdWlkZUxpbmVMZW5ndGggPSB0aGlzLm9wdGlvbnMubWF4R3VpZGVMaW5lTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgLy8gT25seSBkcmF3IGEgZ3VpZGVsaW5lIHdpdGggYSBtYXggbGVuZ3RoXHJcbiAgICAgICAgICAgICAgICBpID0gbGVuZ3RoID4gbWF4R3VpZGVMaW5lTGVuZ3RoID8gbGVuZ3RoIC0gbWF4R3VpZGVMaW5lTGVuZ3RoIDogZ3VpZGVsaW5lRGlzdGFuY2UsXHJcbiAgICAgICAgICAgICAgICBmcmFjdGlvbixcclxuICAgICAgICAgICAgICAgIGRhc2hQb2ludCxcclxuICAgICAgICAgICAgICAgIGRhc2g7XHJcblxyXG4gICAgICAgICAgICAvL2NyZWF0ZSB0aGUgZ3VpZGVzIGNvbnRhaW5lciBpZiB3ZSBoYXZlbid0IHlldFxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2d1aWRlc0NvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ3VpZGVzQ29udGFpbmVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2xlYWZsZXQtZHJhdy1ndWlkZXMnLCB0aGlzLl9vdmVybGF5UGFuZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vZHJhdyBhIGRhc2ggZXZlcnkgR3VpbGRlTGluZURpc3RhbmNlXHJcbiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpICs9IHRoaXMub3B0aW9ucy5ndWlkZWxpbmVEaXN0YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgLy93b3JrIG91dCBmcmFjdGlvbiBhbG9uZyBsaW5lIHdlIGFyZVxyXG4gICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBpIC8gbGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vY2FsY3VsYXRlIG5ldyB4LHkgcG9pbnRcclxuICAgICAgICAgICAgICAgIGRhc2hQb2ludCA9IHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBNYXRoLmZsb29yKChwb2ludEEueCAqICgxIC0gZnJhY3Rpb24pKSArIChmcmFjdGlvbiAqIHBvaW50Qi54KSksXHJcbiAgICAgICAgICAgICAgICAgICAgeTogTWF0aC5mbG9vcigocG9pbnRBLnkgKiAoMSAtIGZyYWN0aW9uKSkgKyAoZnJhY3Rpb24gKiBwb2ludEIueSkpXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIC8vYWRkIGd1aWRlIGRhc2ggdG8gZ3VpZGUgY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICBkYXNoID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2xlYWZsZXQtZHJhdy1ndWlkZS1kYXNoJywgdGhpcy5fZ3VpZGVzQ29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIGRhc2guc3R5bGUuYmFja2dyb3VuZENvbG9yID1cclxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5fZXJyb3JTaG93biA/IHRoaXMub3B0aW9ucy5zaGFwZU9wdGlvbnMuY29sb3IgOiB0aGlzLm9wdGlvbnMuZHJhd0Vycm9yLmNvbG9yO1xyXG5cclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5zZXRQb3NpdGlvbihkYXNoLCBkYXNoUG9pbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3VwZGF0ZUd1aWRlQ29sb3I6IGZ1bmN0aW9uIChjb2xvcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3VpZGVzQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMuX2d1aWRlc0NvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2d1aWRlc0NvbnRhaW5lci5jaGlsZE5vZGVzW2ldLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlcyBhbGwgY2hpbGQgZWxlbWVudHMgKGd1aWRlIGRhc2hlcykgZnJvbSB0aGUgZ3VpZGVzIGNvbnRhaW5lclxyXG4gICAgICAgIF9jbGVhckd1aWRlczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3VpZGVzQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5fZ3VpZGVzQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ndWlkZXNDb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fZ3VpZGVzQ29udGFpbmVyLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldFRvb2x0aXBUZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzaG93TGVuZ3RoID0gdGhpcy5vcHRpb25zLnNob3dMZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBsYWJlbFRleHQsIGRpc3RhbmNlU3RyO1xyXG4gICAgICAgICAgICBpZiAoTC5Ccm93c2VyLnRvdWNoKSB7XHJcbiAgICAgICAgICAgICAgICBzaG93TGVuZ3RoID0gZmFsc2U7IC8vIGlmIHRoZXJlJ3MgYSBiZXR0ZXIgcGxhY2UgdG8gcHV0IHRoaXMsIGZlZWwgZnJlZSB0byBtb3ZlIGl0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcmtlcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBsYWJlbFRleHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5wb2x5bGluZS50b29sdGlwLnN0YXJ0XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2VTdHIgPSBzaG93TGVuZ3RoID8gdGhpcy5fZ2V0TWVhc3VyZW1lbnRTdHJpbmcoKSA6ICcnO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXJrZXJzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsVGV4dCA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5wb2x5bGluZS50b29sdGlwLmNvbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRleHQ6IGRpc3RhbmNlU3RyXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxUZXh0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBMLmRyYXdMb2NhbC5kcmF3LmhhbmRsZXJzLnBvbHlsaW5lLnRvb2x0aXAuZW5kLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJ0ZXh0OiBkaXN0YW5jZVN0clxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGxhYmVsVGV4dDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfdXBkYXRlUnVubmluZ01lYXN1cmU6IGZ1bmN0aW9uIChsYXRsbmcsIGFkZGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXJzTGVuZ3RoID0gdGhpcy5fbWFya2Vycy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBwcmV2aW91c01hcmtlckluZGV4LCBkaXN0YW5jZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXJrZXJzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRSdW5uaW5nVG90YWwgPSAwO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcHJldmlvdXNNYXJrZXJJbmRleCA9IG1hcmtlcnNMZW5ndGggLSAoYWRkZWQgPyAyIDogMSk7XHJcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IHRoaXMuX21hcC5kaXN0YW5jZShsYXRsbmcsIHRoaXMuX21hcmtlcnNbcHJldmlvdXNNYXJrZXJJbmRleF0uZ2V0TGF0TG5nKCkpICogKHRoaXMub3B0aW9ucy5mYWN0b3IgfHwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRSdW5uaW5nVG90YWwgKz0gZGlzdGFuY2UgKiAoYWRkZWQgPyAxIDogLTEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldE1lYXN1cmVtZW50U3RyaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50TGF0TG5nID0gdGhpcy5fY3VycmVudExhdExuZyxcclxuICAgICAgICAgICAgICAgIHByZXZpb3VzTGF0TG5nID0gdGhpcy5fbWFya2Vyc1t0aGlzLl9tYXJrZXJzLmxlbmd0aCAtIDFdLmdldExhdExuZygpLFxyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2U7XHJcblxyXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGxhc3QgZml4ZWQgcG9pbnQgdG8gdGhlIG1vdXNlIHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGRpc3RhbmNlID0gcHJldmlvdXNMYXRMbmcgJiYgY3VycmVudExhdExuZyA/IHRoaXMuX21lYXN1cmVtZW50UnVubmluZ1RvdGFsICsgdGhpcy5fbWFwLmRpc3RhbmNlKGN1cnJlbnRMYXRMbmcsIHByZXZpb3VzTGF0TG5nKSAqICh0aGlzLm9wdGlvbnMuZmFjdG9yIHx8IDEpIDogdGhpcy5fbWVhc3VyZW1lbnRSdW5uaW5nVG90YWwgfHwgMDtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBMLkdlb21ldHJ5VXRpbC5yZWFkYWJsZURpc3RhbmNlKGRpc3RhbmNlLCB0aGlzLm9wdGlvbnMubWV0cmljLCB0aGlzLm9wdGlvbnMuZmVldCwgdGhpcy5vcHRpb25zLm5hdXRpYywgdGhpcy5vcHRpb25zLnByZWNpc2lvbik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Nob3dFcnJvclRvb2x0aXA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3JTaG93biA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgdG9vbHRpcFxyXG4gICAgICAgICAgICB0aGlzLl90b29sdGlwXHJcbiAgICAgICAgICAgICAgICAuc2hvd0FzRXJyb3IoKVxyXG4gICAgICAgICAgICAgICAgLnVwZGF0ZUNvbnRlbnQoe3RleHQ6IHRoaXMub3B0aW9ucy5kcmF3RXJyb3IubWVzc2FnZX0pO1xyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIHNoYXBlXHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUd1aWRlQ29sb3IodGhpcy5vcHRpb25zLmRyYXdFcnJvci5jb2xvcik7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvbHkuc2V0U3R5bGUoe2NvbG9yOiB0aGlzLm9wdGlvbnMuZHJhd0Vycm9yLmNvbG9yfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBIaWRlIHRoZSBlcnJvciBhZnRlciAyIHNlY29uZHNcclxuICAgICAgICAgICAgdGhpcy5fY2xlYXJIaWRlRXJyb3JUaW1lb3V0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2hpZGVFcnJvclRpbWVvdXQgPSBzZXRUaW1lb3V0KEwuVXRpbC5iaW5kKHRoaXMuX2hpZGVFcnJvclRvb2x0aXAsIHRoaXMpLCB0aGlzLm9wdGlvbnMuZHJhd0Vycm9yLnRpbWVvdXQpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9oaWRlRXJyb3JUb29sdGlwOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yU2hvd24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NsZWFySGlkZUVycm9yVGltZW91dCgpO1xyXG5cclxuICAgICAgICAgICAgLy8gUmV2ZXJ0IHRvb2x0aXBcclxuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFxyXG4gICAgICAgICAgICAgICAgLnJlbW92ZUVycm9yKClcclxuICAgICAgICAgICAgICAgIC51cGRhdGVDb250ZW50KHRoaXMuX2dldFRvb2x0aXBUZXh0KCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gUmV2ZXJ0IHNoYXBlXHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUd1aWRlQ29sb3IodGhpcy5vcHRpb25zLnNoYXBlT3B0aW9ucy5jb2xvcik7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvbHkuc2V0U3R5bGUoe2NvbG9yOiB0aGlzLm9wdGlvbnMuc2hhcGVPcHRpb25zLmNvbG9yfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NsZWFySGlkZUVycm9yVGltZW91dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faGlkZUVycm9yVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2hpZGVFcnJvclRpbWVvdXQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGlkZUVycm9yVGltZW91dCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBkaXNhYmxlIG5ldyBtYXJrZXJzIHRlbXBvcmFyaWx5O1xyXG4gICAgICAgIC8vIHRoaXMgaXMgdG8gcHJldmVudCBkdXBsaWNhdGVkIHRvdWNoL2NsaWNrIGV2ZW50cyBpbiBzb21lIGJyb3dzZXJzXHJcbiAgICAgICAgX2Rpc2FibGVOZXdNYXJrZXJzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVNYXJrZXJzID0gdHJ1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzZWUgX2Rpc2FibGVOZXdNYXJrZXJzXHJcbiAgICAgICAgX2VuYWJsZU5ld01hcmtlcnM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlTWFya2VycyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcyksIDUwKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfY2xlYW5VcFNoYXBlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXJrZXJzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcmtlcnNbdGhpcy5fbWFya2Vycy5sZW5ndGggLSAxXS5vZmYoJ2NsaWNrJywgdGhpcy5fZmluaXNoU2hhcGUsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2ZpcmVDcmVhdGVkRXZlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHBvbHkgPSBuZXcgdGhpcy5Qb2x5KHRoaXMuX3BvbHkuZ2V0TGF0TG5ncygpLCB0aGlzLm9wdGlvbnMuc2hhcGVPcHRpb25zKTtcclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLl9maXJlQ3JlYXRlZEV2ZW50LmNhbGwodGhpcywgcG9seSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuRHJhdy5Qb2x5Z29uXHJcbiAgICAgKiBAYWthIERyYXcuUG9seWdvblxyXG4gICAgICogQGluaGVyaXRzIEwuRHJhdy5Qb2x5bGluZVxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuUG9seWdvbiA9IEwuRHJhdy5Qb2x5bGluZS5leHRlbmQoe1xyXG4gICAgICAgIHN0YXRpY3M6IHtcclxuICAgICAgICAgICAgVFlQRTogJ3BvbHlnb24nXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgUG9seTogTC5Qb2x5Z29uLFxyXG5cclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHNob3dBcmVhOiBmYWxzZSxcclxuICAgICAgICAgICAgc2hvd0xlbmd0aDogZmFsc2UsXHJcbiAgICAgICAgICAgIHNoYXBlT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjMzM4OGZmJyxcclxuICAgICAgICAgICAgICAgIHdlaWdodDogNCxcclxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNSxcclxuICAgICAgICAgICAgICAgIGZpbGw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBmaWxsQ29sb3I6IG51bGwsIC8vc2FtZSBhcyBjb2xvciBieSBkZWZhdWx0XHJcbiAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMC4yLFxyXG4gICAgICAgICAgICAgICAgY2xpY2thYmxlOiB0cnVlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIC8vIFdoZXRoZXIgdG8gdXNlIHRoZSBtZXRyaWMgbWVhc3VyZW1lbnQgc3lzdGVtICh0cnV0aHkpIG9yIG5vdCAoZmFsc3kpLlxyXG4gICAgICAgICAgICAvLyBBbHNvIGRlZmluZXMgdGhlIHVuaXRzIHRvIHVzZSBmb3IgdGhlIG1ldHJpYyBzeXN0ZW0gYXMgYW4gYXJyYXkgb2ZcclxuICAgICAgICAgICAgLy8gc3RyaW5ncyAoZS5nLiBgWydoYScsICdtJ11gKS5cclxuICAgICAgICAgICAgbWV0cmljOiB0cnVlLFxyXG4gICAgICAgICAgICBmZWV0OiB0cnVlLCAvLyBXaGVuIG5vdCBtZXRyaWMsIHRvIHVzZSBmZWV0IGluc3RlYWQgb2YgeWFyZHMgZm9yIGRpc3BsYXkuXHJcbiAgICAgICAgICAgIG5hdXRpYzogZmFsc2UsIC8vIFdoZW4gbm90IG1ldHJpYywgbm90IGZlZXQgdXNlIG5hdXRpYyBtaWxlIGZvciBkaXNwbGF5XHJcbiAgICAgICAgICAgIC8vIERlZmluZXMgdGhlIHByZWNpc2lvbiBmb3IgZWFjaCB0eXBlIG9mIHVuaXQgKGUuZy4ge2ttOiAyLCBmdDogMH1cclxuICAgICAgICAgICAgcHJlY2lzaW9uOiB7fVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgaW5pdGlhbGl6ZSgpOiB2b2lkXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG1hcCwgb3B0aW9ucykge1xyXG4gICAgICAgICAgICBMLkRyYXcuUG9seWxpbmUucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBtYXAsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdHlwZSBzbyBzdXBlciBjYW4gZmlyZSwgbmVlZCB0byBkbyB0aGlzIGFzIGNhbm5vdCBkbyB0aGlzLlRZUEUgOihcclxuICAgICAgICAgICAgdGhpcy50eXBlID0gTC5EcmF3LlBvbHlnb24uVFlQRTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfdXBkYXRlRmluaXNoSGFuZGxlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbWFya2VyQ291bnQgPSB0aGlzLl9tYXJrZXJzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBtYXJrZXIgc2hvdWxkIGhhdmUgYSBjbGljayBoYW5kbGVyIHRvIGNsb3NlIHRoZSBwb2x5Z29uXHJcbiAgICAgICAgICAgIGlmIChtYXJrZXJDb3VudCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2Vyc1swXS5vbignY2xpY2snLCB0aGlzLl9maW5pc2hTaGFwZSwgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEFkZCBhbmQgdXBkYXRlIHRoZSBkb3VibGUgY2xpY2sgaGFuZGxlclxyXG4gICAgICAgICAgICBpZiAobWFya2VyQ291bnQgPiAyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXJrZXJzW21hcmtlckNvdW50IC0gMV0ub24oJ2RibGNsaWNrJywgdGhpcy5fZmluaXNoU2hhcGUsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gT25seSBuZWVkIHRvIHJlbW92ZSBoYW5kbGVyIGlmIGhhcyBiZWVuIGFkZGVkIGJlZm9yZVxyXG4gICAgICAgICAgICAgICAgaWYgKG1hcmtlckNvdW50ID4gMykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcmtlcnNbbWFya2VyQ291bnQgLSAyXS5vZmYoJ2RibGNsaWNrJywgdGhpcy5fZmluaXNoU2hhcGUsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldFRvb2x0aXBUZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciB0ZXh0LCBzdWJ0ZXh0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcmtlcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5wb2x5Z29uLnRvb2x0aXAuc3RhcnQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbWFya2Vycy5sZW5ndGggPCAzKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5wb2x5Z29uLnRvb2x0aXAuY29udDtcclxuICAgICAgICAgICAgICAgIHN1YnRleHQgPSB0aGlzLl9nZXRNZWFzdXJlbWVudFN0cmluZygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IEwuZHJhd0xvY2FsLmRyYXcuaGFuZGxlcnMucG9seWdvbi50b29sdGlwLmVuZDtcclxuICAgICAgICAgICAgICAgIHN1YnRleHQgPSB0aGlzLl9nZXRNZWFzdXJlbWVudFN0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIHN1YnRleHQ6IHN1YnRleHRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZ2V0TWVhc3VyZW1lbnRTdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGFyZWEgPSB0aGlzLl9hcmVhLFxyXG4gICAgICAgICAgICAgICAgbWVhc3VyZW1lbnRTdHJpbmcgPSAnJztcclxuXHJcblxyXG4gICAgICAgICAgICBpZiAoIWFyZWEgJiYgIXRoaXMub3B0aW9ucy5zaG93TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBtZWFzdXJlbWVudFN0cmluZyA9IEwuRHJhdy5Qb2x5bGluZS5wcm90b3R5cGUuX2dldE1lYXN1cmVtZW50U3RyaW5nLmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChhcmVhKSB7XHJcbiAgICAgICAgICAgICAgICBtZWFzdXJlbWVudFN0cmluZyArPSAnPGJyPicgKyBMLkdlb21ldHJ5VXRpbC5yZWFkYWJsZUFyZWEoYXJlYSwgdGhpcy5vcHRpb25zLm1ldHJpYywgdGhpcy5vcHRpb25zLnByZWNpc2lvbik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBtZWFzdXJlbWVudFN0cmluZztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfc2hhcGVJc1ZhbGlkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXJrZXJzLmxlbmd0aCA+PSAzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF92ZXJ0ZXhDaGFuZ2VkOiBmdW5jdGlvbiAobGF0bG5nLCBhZGRlZCkge1xyXG4gICAgICAgICAgICB2YXIgbGF0TG5ncztcclxuXHJcbiAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgc2hvdyB0aGUgYXJlYVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hbGxvd0ludGVyc2VjdGlvbiAmJiB0aGlzLm9wdGlvbnMuc2hvd0FyZWEpIHtcclxuICAgICAgICAgICAgICAgIGxhdExuZ3MgPSB0aGlzLl9wb2x5LmdldExhdExuZ3MoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hcmVhID0gTC5HZW9tZXRyeVV0aWwuZ2VvZGVzaWNBcmVhKGxhdExuZ3MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBMLkRyYXcuUG9seWxpbmUucHJvdG90eXBlLl92ZXJ0ZXhDaGFuZ2VkLmNhbGwodGhpcywgbGF0bG5nLCBhZGRlZCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NsZWFuVXBTaGFwZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbWFya2VyQ291bnQgPSB0aGlzLl9tYXJrZXJzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIGlmIChtYXJrZXJDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcmtlcnNbMF0ub2ZmKCdjbGljaycsIHRoaXMuX2ZpbmlzaFNoYXBlLCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobWFya2VyQ291bnQgPiAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFya2Vyc1ttYXJrZXJDb3VudCAtIDFdLm9mZignZGJsY2xpY2snLCB0aGlzLl9maW5pc2hTaGFwZSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgTC5TaW1wbGVTaGFwZSA9IHt9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5EcmF3LlNpbXBsZVNoYXBlXHJcbiAgICAgKiBAYWthIERyYXcuU2ltcGxlU2hhcGVcclxuICAgICAqIEBpbmhlcml0cyBMLkRyYXcuRmVhdHVyZVxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuU2ltcGxlU2hhcGUgPSBMLkRyYXcuRmVhdHVyZS5leHRlbmQoe1xyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgcmVwZWF0TW9kZTogZmFsc2VcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGluaXRpYWxpemUoKTogdm9pZFxyXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChtYXAsIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5fZW5kTGFiZWxUZXh0ID0gTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5zaW1wbGVzaGFwZS50b29sdGlwLmVuZDtcclxuXHJcbiAgICAgICAgICAgIEwuRHJhdy5GZWF0dXJlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbWFwLCBvcHRpb25zKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGFkZEhvb2tzKCk6IHZvaWRcclxuICAgICAgICAvLyBBZGQgbGlzdGVuZXIgaG9va3MgdG8gdGhpcyBoYW5kbGVyLlxyXG4gICAgICAgIGFkZEhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIEwuRHJhdy5GZWF0dXJlLnByb3RvdHlwZS5hZGRIb29rcy5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXBEcmFnZ2FibGUgPSB0aGlzLl9tYXAuZHJhZ2dpbmcuZW5hYmxlZCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXBEcmFnZ2FibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZHJhZ2dpbmcuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vVE9ETyByZWZhY3RvcjogbW92ZSBjdXJzb3IgdG8gc3R5bGVzXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbHRpcC51cGRhdGVDb250ZW50KHt0ZXh0OiB0aGlzLl9pbml0aWFsTGFiZWxUZXh0fSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwXHJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdtb3VzZWRvd24nLCB0aGlzLl9vbk1vdXNlRG93biwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAub24oJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbigndG91Y2hzdGFydCcsIHRoaXMuX29uTW91c2VEb3duLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbigndG91Y2htb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCByZW1vdmVIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVyIGhvb2tzIGZyb20gdGhpcyBoYW5kbGVyLlxyXG4gICAgICAgIHJlbW92ZUhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIEwuRHJhdy5GZWF0dXJlLnByb3RvdHlwZS5yZW1vdmVIb29rcy5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWFwRHJhZ2dhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLmRyYWdnaW5nLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vVE9ETyByZWZhY3RvcjogbW92ZSBjdXJzb3IgdG8gc3R5bGVzXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc3R5bGUuY3Vyc29yID0gJyc7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZignbW91c2Vkb3duJywgdGhpcy5fb25Nb3VzZURvd24sIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZigndG91Y2hzdGFydCcsIHRoaXMuX29uTW91c2VEb3duLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vZmYoJ3RvdWNobW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBMLkRvbUV2ZW50Lm9mZihkb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgTC5Eb21FdmVudC5vZmYoZG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX29uTW91c2VVcCwgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGJveCBlbGVtZW50IGRvZXNuJ3QgZXhpc3QgdGhleSBtdXN0IG5vdCBoYXZlIG1vdmVkIHRoZSBtb3VzZSwgc28gZG9uJ3QgbmVlZCB0byBkZXN0cm95L3JldHVyblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NoYXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX3NoYXBlKTtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fc2hhcGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5faXNEcmF3aW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldFRvb2x0aXBUZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLl9lbmRMYWJlbFRleHRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Nb3VzZURvd246IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzRHJhd2luZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0TGF0TG5nID0gZS5sYXRsbmc7XHJcblxyXG4gICAgICAgICAgICBMLkRvbUV2ZW50XHJcbiAgICAgICAgICAgICAgICAub24oZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9uKGRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9vbk1vdXNlVXAsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAucHJldmVudERlZmF1bHQoZS5vcmlnaW5hbEV2ZW50KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXRsbmcgPSBlLmxhdGxuZztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAudXBkYXRlUG9zaXRpb24obGF0bG5nKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzRHJhd2luZykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbHRpcC51cGRhdGVDb250ZW50KHRoaXMuX2dldFRvb2x0aXBUZXh0KCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd1NoYXBlKGxhdGxuZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Nb3VzZVVwOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zaGFwZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyZUNyZWF0ZWRFdmVudCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZXBlYXRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuRHJhdy5SZWN0YW5nbGVcclxuICAgICAqIEBha2EgRHJhdy5SZWN0YW5nbGVcclxuICAgICAqIEBpbmhlcml0cyBMLkRyYXcuU2ltcGxlU2hhcGVcclxuICAgICAqL1xyXG4gICAgTC5EcmF3LlJlY3RhbmdsZSA9IEwuRHJhdy5TaW1wbGVTaGFwZS5leHRlbmQoe1xyXG4gICAgICAgIHN0YXRpY3M6IHtcclxuICAgICAgICAgICAgVFlQRTogJ3JlY3RhbmdsZSdcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHNoYXBlT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjMzM4OGZmJyxcclxuICAgICAgICAgICAgICAgIHdlaWdodDogNCxcclxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNSxcclxuICAgICAgICAgICAgICAgIGZpbGw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBmaWxsQ29sb3I6IG51bGwsIC8vc2FtZSBhcyBjb2xvciBieSBkZWZhdWx0XHJcbiAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMC4yLFxyXG4gICAgICAgICAgICAgICAgc2hvd0FyZWE6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjbGlja2FibGU6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbWV0cmljOiB0cnVlIC8vIFdoZXRoZXIgdG8gdXNlIHRoZSBtZXRyaWMgbWVhc3VyZW1lbnQgc3lzdGVtIG9yIGltcGVyaWFsXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKCk6IHZvaWRcclxuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAobWFwLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHR5cGUgc28gc3VwZXIgY2FuIGZpcmUsIG5lZWQgdG8gZG8gdGhpcyBhcyBjYW5ub3QgZG8gdGhpcy5UWVBFIDooXHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEwuRHJhdy5SZWN0YW5nbGUuVFlQRTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxMYWJlbFRleHQgPSBMLmRyYXdMb2NhbC5kcmF3LmhhbmRsZXJzLnJlY3RhbmdsZS50b29sdGlwLnN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgTC5EcmF3LlNpbXBsZVNoYXBlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbWFwLCBvcHRpb25zKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGRpc2FibGUoKTogdm9pZFxyXG4gICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9lbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2lzQ3VycmVudGx5VHdvQ2xpY2tEcmF3aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIEwuRHJhdy5TaW1wbGVTaGFwZS5wcm90b3R5cGUuZGlzYWJsZS5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbk1vdXNlVXA6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fc2hhcGUgJiYgIXRoaXMuX2lzQ3VycmVudGx5VHdvQ2xpY2tEcmF3aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0N1cnJlbnRseVR3b0NsaWNrRHJhd2luZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBjbG9zaW5nIGNsaWNrIGlzIG9uIG1hcFxyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNDdXJyZW50bHlUd29DbGlja0RyYXdpbmcgJiYgIV9oYXNBbmNlc3RvcihlLnRhcmdldCwgJ2xlYWZsZXQtcGFuZScpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIEwuRHJhdy5TaW1wbGVTaGFwZS5wcm90b3R5cGUuX29uTW91c2VVcC5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9kcmF3U2hhcGU6IGZ1bmN0aW9uIChsYXRsbmcpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zaGFwZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hhcGUgPSBuZXcgTC5SZWN0YW5nbGUobmV3IEwuTGF0TG5nQm91bmRzKHRoaXMuX3N0YXJ0TGF0TG5nLCBsYXRsbmcpLCB0aGlzLm9wdGlvbnMuc2hhcGVPcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5hZGRMYXllcih0aGlzLl9zaGFwZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaGFwZS5zZXRCb3VuZHMobmV3IEwuTGF0TG5nQm91bmRzKHRoaXMuX3N0YXJ0TGF0TG5nLCBsYXRsbmcpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9maXJlQ3JlYXRlZEV2ZW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciByZWN0YW5nbGUgPSBuZXcgTC5SZWN0YW5nbGUodGhpcy5fc2hhcGUuZ2V0Qm91bmRzKCksIHRoaXMub3B0aW9ucy5zaGFwZU9wdGlvbnMpO1xyXG4gICAgICAgICAgICBMLkRyYXcuU2ltcGxlU2hhcGUucHJvdG90eXBlLl9maXJlQ3JlYXRlZEV2ZW50LmNhbGwodGhpcywgcmVjdGFuZ2xlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZ2V0VG9vbHRpcFRleHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHRvb2x0aXBUZXh0ID0gTC5EcmF3LlNpbXBsZVNoYXBlLnByb3RvdHlwZS5fZ2V0VG9vbHRpcFRleHQuY2FsbCh0aGlzKSxcclxuICAgICAgICAgICAgICAgIHNoYXBlID0gdGhpcy5fc2hhcGUsXHJcbiAgICAgICAgICAgICAgICBzaG93QXJlYSA9IHRoaXMub3B0aW9ucy5zaG93QXJlYSxcclxuICAgICAgICAgICAgICAgIGxhdExuZ3MsIGFyZWEsIHN1YnRleHQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hhcGUpIHtcclxuICAgICAgICAgICAgICAgIGxhdExuZ3MgPSB0aGlzLl9zaGFwZS5fZGVmYXVsdFNoYXBlID8gdGhpcy5fc2hhcGUuX2RlZmF1bHRTaGFwZSgpIDogdGhpcy5fc2hhcGUuZ2V0TGF0TG5ncygpO1xyXG4gICAgICAgICAgICAgICAgYXJlYSA9IEwuR2VvbWV0cnlVdGlsLmdlb2Rlc2ljQXJlYShsYXRMbmdzKTtcclxuICAgICAgICAgICAgICAgIHN1YnRleHQgPSBzaG93QXJlYSA/IEwuR2VvbWV0cnlVdGlsLnJlYWRhYmxlQXJlYShhcmVhLCB0aGlzLm9wdGlvbnMubWV0cmljKSA6ICcnXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiB0b29sdGlwVGV4dC50ZXh0LFxyXG4gICAgICAgICAgICAgICAgc3VidGV4dDogc3VidGV4dFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGZ1bmN0aW9uIF9oYXNBbmNlc3RvcihlbCwgY2xzKSB7XHJcbiAgICAgICAgd2hpbGUgKChlbCA9IGVsLnBhcmVudEVsZW1lbnQpICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMoY2xzKSkgO1xyXG4gICAgICAgIHJldHVybiBlbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5EcmF3Lk1hcmtlclxyXG4gICAgICogQGFrYSBEcmF3Lk1hcmtlclxyXG4gICAgICogQGluaGVyaXRzIEwuRHJhdy5GZWF0dXJlXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdy5NYXJrZXIgPSBMLkRyYXcuRmVhdHVyZS5leHRlbmQoe1xyXG4gICAgICAgIHN0YXRpY3M6IHtcclxuICAgICAgICAgICAgVFlQRTogJ21hcmtlcidcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLFxyXG4gICAgICAgICAgICByZXBlYXRNb2RlOiBmYWxzZSxcclxuICAgICAgICAgICAgekluZGV4T2Zmc2V0OiAyMDAwIC8vIFRoaXMgc2hvdWxkIGJlID4gdGhhbiB0aGUgaGlnaGVzdCB6LWluZGV4IGFueSBtYXJrZXJzXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKCk6IHZvaWRcclxuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAobWFwLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHR5cGUgc28gc3VwZXIgY2FuIGZpcmUsIG5lZWQgdG8gZG8gdGhpcyBhcyBjYW5ub3QgZG8gdGhpcy5UWVBFIDooXHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEwuRHJhdy5NYXJrZXIuVFlQRTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxMYWJlbFRleHQgPSBMLmRyYXdMb2NhbC5kcmF3LmhhbmRsZXJzLm1hcmtlci50b29sdGlwLnN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBtYXAsIG9wdGlvbnMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgYWRkSG9va3MoKTogdm9pZFxyXG4gICAgICAgIC8vIEFkZCBsaXN0ZW5lciBob29rcyB0byB0aGlzIGhhbmRsZXIuXHJcbiAgICAgICAgYWRkSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLmFkZEhvb2tzLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b29sdGlwLnVwZGF0ZUNvbnRlbnQoe3RleHQ6IHRoaXMuX2luaXRpYWxMYWJlbFRleHR9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTYW1lIG1vdXNlTWFya2VyIGFzIGluIERyYXcuUG9seWxpbmVcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW91c2VNYXJrZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3VzZU1hcmtlciA9IEwubWFya2VyKHRoaXMuX21hcC5nZXRDZW50ZXIoKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBMLmRpdkljb24oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnbGVhZmxldC1tb3VzZS1tYXJrZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkFuY2hvcjogWzIwLCAyMF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uU2l6ZTogWzQwLCA0MF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHpJbmRleE9mZnNldDogdGhpcy5vcHRpb25zLnpJbmRleE9mZnNldFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX21vdXNlTWFya2VyXHJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdjbGljaycsIHRoaXMuX29uQ2xpY2ssIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLmFkZFRvKHRoaXMuX21hcCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAub24oJ2NsaWNrJywgdGhpcy5fb25Ub3VjaCwgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHJlbW92ZUhvb2tzKCk6IHZvaWRcclxuICAgICAgICAvLyBSZW1vdmUgbGlzdGVuZXIgaG9va3MgZnJvbSB0aGlzIGhhbmRsZXIuXHJcbiAgICAgICAgcmVtb3ZlSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLnJlbW92ZUhvb2tzLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWFya2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFya2VyLm9mZignY2xpY2snLCB0aGlzLl9vbkNsaWNrLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgLm9mZignY2xpY2snLCB0aGlzLl9vbkNsaWNrLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAub2ZmKCdjbGljaycsIHRoaXMuX29uVG91Y2gsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVMYXllcih0aGlzLl9tYXJrZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9tYXJrZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbW91c2VNYXJrZXIub2ZmKCdjbGljaycsIHRoaXMuX29uQ2xpY2ssIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX21vdXNlTWFya2VyKTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9tb3VzZU1hcmtlcjtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXRsbmcgPSBlLmxhdGxuZztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAudXBkYXRlUG9zaXRpb24obGF0bG5nKTtcclxuICAgICAgICAgICAgdGhpcy5fbW91c2VNYXJrZXIuc2V0TGF0TG5nKGxhdGxuZyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX21hcmtlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2VyID0gdGhpcy5fY3JlYXRlTWFya2VyKGxhdGxuZyk7XHJcbiAgICAgICAgICAgICAgICAvLyBCaW5kIHRvIGJvdGggbWFya2VyIGFuZCBtYXAgdG8gbWFrZSBzdXJlIHdlIGdldCB0aGUgY2xpY2sgZXZlbnQuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXJrZXIub24oJ2NsaWNrJywgdGhpcy5fb25DbGljaywgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXBcclxuICAgICAgICAgICAgICAgICAgICAub24oJ2NsaWNrJywgdGhpcy5fb25DbGljaywgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAuYWRkTGF5ZXIodGhpcy5fbWFya2VyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxhdGxuZyA9IHRoaXMuX21vdXNlTWFya2VyLmdldExhdExuZygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2VyLnNldExhdExuZyhsYXRsbmcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NyZWF0ZU1hcmtlcjogZnVuY3Rpb24gKGxhdGxuZykge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEwuTWFya2VyKGxhdGxuZywge1xyXG4gICAgICAgICAgICAgICAgaWNvbjogdGhpcy5vcHRpb25zLmljb24sXHJcbiAgICAgICAgICAgICAgICB6SW5kZXhPZmZzZXQ6IHRoaXMub3B0aW9ucy56SW5kZXhPZmZzZXRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uQ2xpY2s6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fZmlyZUNyZWF0ZWRFdmVudCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVwZWF0TW9kZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vblRvdWNoOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAvLyBjYWxsZWQgb24gY2xpY2sgJiB0YXAsIG9ubHkgcmVhbGx5IGRvZXMgYW55IHRoaW5nIG9uIHRhcFxyXG4gICAgICAgICAgICB0aGlzLl9vbk1vdXNlTW92ZShlKTsgLy8gY3JlYXRlcyAmIHBsYWNlcyBtYXJrZXJcclxuICAgICAgICAgICAgdGhpcy5fb25DbGljaygpOyAvLyBwZXJtYW5lbnRseSBwbGFjZXMgbWFya2VyICYgZW5kcyBpbnRlcmFjdGlvblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9maXJlQ3JlYXRlZEV2ZW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgTC5NYXJrZXIuVG91Y2godGhpcy5fbWFya2VyLmdldExhdExuZygpLCB7aWNvbjogdGhpcy5vcHRpb25zLmljb259KTtcclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLl9maXJlQ3JlYXRlZEV2ZW50LmNhbGwodGhpcywgbWFya2VyKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5EcmF3LkNpcmNsZU1hcmtlclxyXG4gICAgICogQGFrYSBEcmF3LkNpcmNsZU1hcmtlclxyXG4gICAgICogQGluaGVyaXRzIEwuRHJhdy5NYXJrZXJcclxuICAgICAqL1xyXG4gICAgTC5EcmF3LkNpcmNsZU1hcmtlciA9IEwuRHJhdy5NYXJrZXIuZXh0ZW5kKHtcclxuICAgICAgICBzdGF0aWNzOiB7XHJcbiAgICAgICAgICAgIFRZUEU6ICdjaXJjbGVtYXJrZXInXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICBzdHJva2U6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbG9yOiAnIzMzODhmZicsXHJcbiAgICAgICAgICAgIHdlaWdodDogNCxcclxuICAgICAgICAgICAgb3BhY2l0eTogMC41LFxyXG4gICAgICAgICAgICBmaWxsOiB0cnVlLFxyXG4gICAgICAgICAgICBmaWxsQ29sb3I6IG51bGwsIC8vc2FtZSBhcyBjb2xvciBieSBkZWZhdWx0XHJcbiAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAwLjIsXHJcbiAgICAgICAgICAgIGNsaWNrYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgekluZGV4T2Zmc2V0OiAyMDAwIC8vIFRoaXMgc2hvdWxkIGJlID4gdGhhbiB0aGUgaGlnaGVzdCB6LWluZGV4IGFueSBtYXJrZXJzXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKCk6IHZvaWRcclxuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAobWFwLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHR5cGUgc28gc3VwZXIgY2FuIGZpcmUsIG5lZWQgdG8gZG8gdGhpcyBhcyBjYW5ub3QgZG8gdGhpcy5UWVBFIDooXHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEwuRHJhdy5DaXJjbGVNYXJrZXIuVFlQRTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxMYWJlbFRleHQgPSBMLmRyYXdMb2NhbC5kcmF3LmhhbmRsZXJzLmNpcmNsZW1hcmtlci50b29sdGlwLnN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBtYXAsIG9wdGlvbnMpO1xyXG4gICAgICAgIH0sXHJcblxyXG5cclxuICAgICAgICBfZmlyZUNyZWF0ZWRFdmVudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgY2lyY2xlTWFya2VyID0gbmV3IEwuQ2lyY2xlTWFya2VyKHRoaXMuX21hcmtlci5nZXRMYXRMbmcoKSwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLl9maXJlQ3JlYXRlZEV2ZW50LmNhbGwodGhpcywgY2lyY2xlTWFya2VyKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfY3JlYXRlTWFya2VyOiBmdW5jdGlvbiAobGF0bG5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTC5DaXJjbGVNYXJrZXIobGF0bG5nLCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkRyYXcuQ2lyY2xlXHJcbiAgICAgKiBAYWthIERyYXcuQ2lyY2xlXHJcbiAgICAgKiBAaW5oZXJpdHMgTC5EcmF3LlNpbXBsZVNoYXBlXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdy5DaXJjbGUgPSBMLkRyYXcuU2ltcGxlU2hhcGUuZXh0ZW5kKHtcclxuICAgICAgICBzdGF0aWNzOiB7XHJcbiAgICAgICAgICAgIFRZUEU6ICdjaXJjbGUnXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICBzaGFwZU9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgIHN0cm9rZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG9yOiAnIzMzODhmZicsXHJcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IDQsXHJcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjUsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgZmlsbENvbG9yOiBudWxsLCAvL3NhbWUgYXMgY29sb3IgYnkgZGVmYXVsdFxyXG4gICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDAuMixcclxuICAgICAgICAgICAgICAgIGNsaWNrYWJsZTogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaG93UmFkaXVzOiB0cnVlLFxyXG4gICAgICAgICAgICBtZXRyaWM6IHRydWUsIC8vIFdoZXRoZXIgdG8gdXNlIHRoZSBtZXRyaWMgbWVhc3VyZW1lbnQgc3lzdGVtIG9yIGltcGVyaWFsXHJcbiAgICAgICAgICAgIGZlZXQ6IHRydWUsIC8vIFdoZW4gbm90IG1ldHJpYywgdXNlIGZlZXQgaW5zdGVhZCBvZiB5YXJkcyBmb3IgZGlzcGxheVxyXG4gICAgICAgICAgICBuYXV0aWM6IGZhbHNlIC8vIFdoZW4gbm90IG1ldHJpYywgbm90IGZlZXQgdXNlIG5hdXRpYyBtaWxlIGZvciBkaXNwbGF5XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKCk6IHZvaWRcclxuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAobWFwLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHR5cGUgc28gc3VwZXIgY2FuIGZpcmUsIG5lZWQgdG8gZG8gdGhpcyBhcyBjYW5ub3QgZG8gdGhpcy5UWVBFIDooXHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEwuRHJhdy5DaXJjbGUuVFlQRTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxMYWJlbFRleHQgPSBMLmRyYXdMb2NhbC5kcmF3LmhhbmRsZXJzLmNpcmNsZS50b29sdGlwLnN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgTC5EcmF3LlNpbXBsZVNoYXBlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbWFwLCBvcHRpb25zKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZHJhd1NoYXBlOiBmdW5jdGlvbiAobGF0bG5nKSB7XHJcbiAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IHRoaXMuX21hcC5kaXN0YW5jZSh0aGlzLl9zdGFydExhdExuZywgbGF0bG5nKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zaGFwZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hhcGUgPSBuZXcgTC5DaXJjbGUodGhpcy5fc3RhcnRMYXRMbmcsIGRpc3RhbmNlLCB0aGlzLm9wdGlvbnMuc2hhcGVPcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5hZGRMYXllcih0aGlzLl9zaGFwZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaGFwZS5zZXRSYWRpdXMoZGlzdGFuY2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2ZpcmVDcmVhdGVkRXZlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGNpcmNsZSA9IG5ldyBMLkNpcmNsZSh0aGlzLl9zdGFydExhdExuZywgdGhpcy5fc2hhcGUuZ2V0UmFkaXVzKCksIHRoaXMub3B0aW9ucy5zaGFwZU9wdGlvbnMpO1xyXG4gICAgICAgICAgICBMLkRyYXcuU2ltcGxlU2hhcGUucHJvdG90eXBlLl9maXJlQ3JlYXRlZEV2ZW50LmNhbGwodGhpcywgY2lyY2xlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXRsbmcgPSBlLmxhdGxuZyxcclxuICAgICAgICAgICAgICAgIHNob3dSYWRpdXMgPSB0aGlzLm9wdGlvbnMuc2hvd1JhZGl1cyxcclxuICAgICAgICAgICAgICAgIHVzZU1ldHJpYyA9IHRoaXMub3B0aW9ucy5tZXRyaWMsXHJcbiAgICAgICAgICAgICAgICByYWRpdXM7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl90b29sdGlwLnVwZGF0ZVBvc2l0aW9uKGxhdGxuZyk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0RyYXdpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdTaGFwZShsYXRsbmcpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbmV3IHJhZGl1cyAocm91bmRlZCB0byAxIGRwKVxyXG4gICAgICAgICAgICAgICAgcmFkaXVzID0gdGhpcy5fc2hhcGUuZ2V0UmFkaXVzKCkudG9GaXhlZCgxKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgc3VidGV4dCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNob3dSYWRpdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWJ0ZXh0ID0gTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5jaXJjbGUucmFkaXVzICsgJzogJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEwuR2VvbWV0cnlVdGlsLnJlYWRhYmxlRGlzdGFuY2UocmFkaXVzLCB1c2VNZXRyaWMsIHRoaXMub3B0aW9ucy5mZWV0LCB0aGlzLm9wdGlvbnMubmF1dGljKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAudXBkYXRlQ29udGVudCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5fZW5kTGFiZWxUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHN1YnRleHQ6IHN1YnRleHRcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIEwuRWRpdCA9IEwuRWRpdCB8fCB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkVkaXQuTWFya2VyXHJcbiAgICAgKiBAYWthIEVkaXQuTWFya2VyXHJcbiAgICAgKi9cclxuICAgIEwuRWRpdC5NYXJrZXIgPSBMLkhhbmRsZXIuZXh0ZW5kKHtcclxuICAgICAgICAvLyBAbWV0aG9kIGluaXRpYWxpemUoKTogdm9pZFxyXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChtYXJrZXIsIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWFya2VyID0gbWFya2VyO1xyXG4gICAgICAgICAgICBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBhZGRIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gQWRkIGxpc3RlbmVyIGhvb2tzIHRvIHRoaXMgaGFuZGxlclxyXG4gICAgICAgIGFkZEhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXIgPSB0aGlzLl9tYXJrZXI7XHJcblxyXG4gICAgICAgICAgICBtYXJrZXIuZHJhZ2dpbmcuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIHRoaXMuX29uRHJhZ0VuZCwgbWFya2VyKTtcclxuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlTWFya2VySGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCByZW1vdmVIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVyIGhvb2tzIGZyb20gdGhpcyBoYW5kbGVyXHJcbiAgICAgICAgcmVtb3ZlSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG1hcmtlciA9IHRoaXMuX21hcmtlcjtcclxuXHJcbiAgICAgICAgICAgIG1hcmtlci5kcmFnZ2luZy5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgIG1hcmtlci5vZmYoJ2RyYWdlbmQnLCB0aGlzLl9vbkRyYWdFbmQsIG1hcmtlcik7XHJcbiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZU1hcmtlckhpZ2hsaWdodCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbkRyYWdFbmQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXllciA9IGUudGFyZ2V0O1xyXG4gICAgICAgICAgICBsYXllci5lZGl0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShMLkRyYXcuRXZlbnQuRURJVE1PVkUsIHtsYXllcjogbGF5ZXJ9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfdG9nZ2xlTWFya2VySGlnaGxpZ2h0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBpY29uID0gdGhpcy5fbWFya2VyLl9pY29uO1xyXG5cclxuICAgICAgICAgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhpcyBsYXllciBpcyBhIG1hcmtlciBidXQgZG9lc24ndCBoYXZlIGFuIGljb24uIE1hcmtlcnNcclxuICAgICAgICAgICAgLy8gc2hvdWxkIHVzdWFsbHkgaGF2ZSBpY29ucy4gSWYgdXNpbmcgTGVhZmxldC5kcmF3IHdpdGggTGVhZmxldC5tYXJrZXJjbHVzdGVyIHRoZXJlXHJcbiAgICAgICAgICAgIC8vIGlzIGEgY2hhbmNlIHRoYXQgYSBtYXJrZXIgZG9lc24ndC5cclxuICAgICAgICAgICAgaWYgKCFpY29uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgcXVpdGUgbmF1Z2h0eSwgYnV0IEkgZG9uJ3Qgc2VlIGFub3RoZXIgd2F5IG9mIGRvaW5nIGl0LiAoc2hvcnQgb2Ygc2V0dGluZyBhIG5ldyBpY29uKVxyXG4gICAgICAgICAgICBpY29uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgICAgICAgICBpZiAoTC5Eb21VdGlsLmhhc0NsYXNzKGljb24sICdsZWFmbGV0LWVkaXQtbWFya2VyLXNlbGVjdGVkJykpIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyhpY29uLCAnbGVhZmxldC1lZGl0LW1hcmtlci1zZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICAgICAgLy8gT2Zmc2V0IGFzIHRoZSBib3JkZXIgd2lsbCBtYWtlIHRoZSBpY29uIG1vdmUuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vZmZzZXRNYXJrZXIoaWNvbiwgLTQpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyhpY29uLCAnbGVhZmxldC1lZGl0LW1hcmtlci1zZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICAgICAgLy8gT2Zmc2V0IGFzIHRoZSBib3JkZXIgd2lsbCBtYWtlIHRoZSBpY29uIG1vdmUuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vZmZzZXRNYXJrZXIoaWNvbiwgNCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGljb24uc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vZmZzZXRNYXJrZXI6IGZ1bmN0aW9uIChpY29uLCBvZmZzZXQpIHtcclxuICAgICAgICAgICAgdmFyIGljb25NYXJnaW5Ub3AgPSBwYXJzZUludChpY29uLnN0eWxlLm1hcmdpblRvcCwgMTApIC0gb2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgaWNvbk1hcmdpbkxlZnQgPSBwYXJzZUludChpY29uLnN0eWxlLm1hcmdpbkxlZnQsIDEwKSAtIG9mZnNldDtcclxuXHJcbiAgICAgICAgICAgIGljb24uc3R5bGUubWFyZ2luVG9wID0gaWNvbk1hcmdpblRvcCArICdweCc7XHJcbiAgICAgICAgICAgIGljb24uc3R5bGUubWFyZ2luTGVmdCA9IGljb25NYXJnaW5MZWZ0ICsgJ3B4JztcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBMLk1hcmtlci5hZGRJbml0SG9vayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKEwuRWRpdC5NYXJrZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0aW5nID0gbmV3IEwuRWRpdC5NYXJrZXIodGhpcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRpbmcuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgTC5FZGl0ID0gTC5FZGl0IHx8IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuRWRpdC5Qb2x5bGluZVxyXG4gICAgICogQGFrYSBMLkVkaXQuUG9seVxyXG4gICAgICogQGFrYSBFZGl0LlBvbHlcclxuICAgICAqL1xyXG4gICAgTC5FZGl0LlBvbHkgPSBMLkhhbmRsZXIuZXh0ZW5kKHtcclxuICAgICAgICBvcHRpb25zOiB7fSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKCk6IHZvaWRcclxuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAocG9seSwgb3B0aW9ucykge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5sYXRsbmdzID0gW3BvbHkuX2xhdGxuZ3NdO1xyXG4gICAgICAgICAgICBpZiAocG9seS5faG9sZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGF0bG5ncyA9IHRoaXMubGF0bG5ncy5jb25jYXQocG9seS5faG9sZXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9wb2x5ID0gcG9seTtcclxuICAgICAgICAgICAgTC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fcG9seS5vbigncmV2ZXJ0LWVkaXRlZCcsIHRoaXMuX3VwZGF0ZUxhdExuZ3MsIHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIENvbXBhdGliaWxpdHkgbWV0aG9kIHRvIG5vcm1hbGl6ZSBQb2x5KiBvYmplY3RzXHJcbiAgICAgICAgLy8gYmV0d2VlbiAwLjcueCBhbmQgMS4wK1xyXG4gICAgICAgIF9kZWZhdWx0U2hhcGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCFMLlBvbHlsaW5lLl9mbGF0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcG9seS5fbGF0bG5ncztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gTC5Qb2x5bGluZS5fZmxhdCh0aGlzLl9wb2x5Ll9sYXRsbmdzKSA/IHRoaXMuX3BvbHkuX2xhdGxuZ3MgOiB0aGlzLl9wb2x5Ll9sYXRsbmdzWzBdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9lYWNoVmVydGV4SGFuZGxlcjogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fdmVydGljZXNIYW5kbGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sodGhpcy5fdmVydGljZXNIYW5kbGVyc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGFkZEhvb2tzKCk6IHZvaWRcclxuICAgICAgICAvLyBBZGQgbGlzdGVuZXIgaG9va3MgdG8gdGhpcyBoYW5kbGVyXHJcbiAgICAgICAgYWRkSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5faW5pdEhhbmRsZXJzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VhY2hWZXJ0ZXhIYW5kbGVyKGZ1bmN0aW9uIChoYW5kbGVyKSB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmFkZEhvb2tzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgcmVtb3ZlSG9va3MoKTogdm9pZFxyXG4gICAgICAgIC8vIFJlbW92ZSBsaXN0ZW5lciBob29rcyBmcm9tIHRoaXMgaGFuZGxlclxyXG4gICAgICAgIHJlbW92ZUhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VhY2hWZXJ0ZXhIYW5kbGVyKGZ1bmN0aW9uIChoYW5kbGVyKSB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVyLnJlbW92ZUhvb2tzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgdXBkYXRlTWFya2VycygpOiB2b2lkXHJcbiAgICAgICAgLy8gRmlyZSBhbiB1cGRhdGUgZm9yIGVhY2ggdmVydGV4IGhhbmRsZXJcclxuICAgICAgICB1cGRhdGVNYXJrZXJzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VhY2hWZXJ0ZXhIYW5kbGVyKGZ1bmN0aW9uIChoYW5kbGVyKSB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVyLnVwZGF0ZU1hcmtlcnMoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2luaXRIYW5kbGVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl92ZXJ0aWNlc0hhbmRsZXJzID0gW107XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sYXRsbmdzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92ZXJ0aWNlc0hhbmRsZXJzLnB1c2gobmV3IEwuRWRpdC5Qb2x5VmVydGljZXNFZGl0KHRoaXMuX3BvbHksIHRoaXMubGF0bG5nc1tpXSwgdGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfdXBkYXRlTGF0TG5nczogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXRsbmdzID0gW2UubGF5ZXIuX2xhdGxuZ3NdO1xyXG4gICAgICAgICAgICBpZiAoZS5sYXllci5faG9sZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGF0bG5ncyA9IHRoaXMubGF0bG5ncy5jb25jYXQoZS5sYXllci5faG9sZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuRWRpdC5Qb2x5VmVydGljZXNFZGl0XHJcbiAgICAgKiBAYWthIEVkaXQuUG9seVZlcnRpY2VzRWRpdFxyXG4gICAgICovXHJcbiAgICBMLkVkaXQuUG9seVZlcnRpY2VzRWRpdCA9IEwuSGFuZGxlci5leHRlbmQoe1xyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgYWxsb3dJbnRlcnNlY3Rpb246IGZhbHNlLFxyXG4gICAgICAgICAgICBpY29uOiBuZXcgTC5EaXZJY29uKHtcclxuICAgICAgICAgICAgICAgIGljb25TaXplOiBuZXcgTC5Qb2ludCg4LCA4KSxcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2xlYWZsZXQtZGl2LWljb24gbGVhZmxldC1lZGl0aW5nLWljb24nXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB0b3VjaEljb246IG5ldyBMLkRpdkljb24oe1xyXG4gICAgICAgICAgICAgICAgaWNvblNpemU6IG5ldyBMLlBvaW50KDIwLCAyMCksXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdsZWFmbGV0LWRpdi1pY29uIGxlYWZsZXQtZWRpdGluZy1pY29uIGxlYWZsZXQtdG91Y2gtaWNvbidcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGRyYXdFcnJvcjoge1xyXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjYjAwYjAwJyxcclxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDEwMDBcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbnRpYWxpemUoKTogdm9pZFxyXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChwb2x5LCBsYXRsbmdzLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHRvdWNoLCBzd2l0Y2ggdG8gdG91Y2ggaWNvblxyXG4gICAgICAgICAgICBpZiAoTC5Ccm93c2VyLnRvdWNoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaWNvbiA9IHRoaXMub3B0aW9ucy50b3VjaEljb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcG9seSA9IHBvbHk7XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRyYXdFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kcmF3RXJyb3IgPSBMLlV0aWwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMuZHJhd0Vycm9yLCBvcHRpb25zLmRyYXdFcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2xhdGxuZ3MgPSBsYXRsbmdzO1xyXG5cclxuICAgICAgICAgICAgTC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIENvbXBhdGliaWxpdHkgbWV0aG9kIHRvIG5vcm1hbGl6ZSBQb2x5KiBvYmplY3RzXHJcbiAgICAgICAgLy8gYmV0d2VlbiAwLjcueCBhbmQgMS4wK1xyXG4gICAgICAgIF9kZWZhdWx0U2hhcGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCFMLlBvbHlsaW5lLl9mbGF0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGF0bG5ncztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gTC5Qb2x5bGluZS5fZmxhdCh0aGlzLl9sYXRsbmdzKSA/IHRoaXMuX2xhdGxuZ3MgOiB0aGlzLl9sYXRsbmdzWzBdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgYWRkSG9va3MoKTogdm9pZFxyXG4gICAgICAgIC8vIEFkZCBsaXN0ZW5lciBob29rcyB0byB0aGlzIGhhbmRsZXIuXHJcbiAgICAgICAgYWRkSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHBvbHkgPSB0aGlzLl9wb2x5O1xyXG5cclxuICAgICAgICAgICAgaWYgKCEocG9seSBpbnN0YW5jZW9mIEwuUG9seWdvbikpIHtcclxuICAgICAgICAgICAgICAgIHBvbHkub3B0aW9ucy5maWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9seS5vcHRpb25zLmVkaXRpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBwb2x5Lm9wdGlvbnMuZWRpdGluZy5maWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHBvbHkuc2V0U3R5bGUocG9seS5vcHRpb25zLmVkaXRpbmcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvbHkuX21hcCkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcCA9IHRoaXMuX3BvbHkuX21hcDsgLy8gU2V0IG1hcFxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbWFya2VyR3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0TWFya2VycygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9seS5fbWFwLmFkZExheWVyKHRoaXMuX21hcmtlckdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgcmVtb3ZlSG9va3MoKTogdm9pZFxyXG4gICAgICAgIC8vIFJlbW92ZSBsaXN0ZW5lciBob29rcyBmcm9tIHRoaXMgaGFuZGxlci5cclxuICAgICAgICByZW1vdmVIb29rczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcG9seSA9IHRoaXMuX3BvbHk7XHJcblxyXG4gICAgICAgICAgICBwb2x5LnNldFN0eWxlKHBvbHkub3B0aW9ucy5vcmlnaW5hbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocG9seS5fbWFwKSB7XHJcbiAgICAgICAgICAgICAgICBwb2x5Ll9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fbWFya2VyR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcmtlckdyb3VwO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcmtlcnM7XHJcbiAgICAgICAgICAgICAgICBwb2x5LmZpcmUoJ2VkaXRzdG9wJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHVwZGF0ZU1hcmtlcnMoKTogdm9pZFxyXG4gICAgICAgIC8vIENsZWFyIG1hcmtlcnMgYW5kIHVwZGF0ZSB0aGVpciBsb2NhdGlvblxyXG4gICAgICAgIHVwZGF0ZU1hcmtlcnM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWFya2VyR3JvdXAuY2xlYXJMYXllcnMoKTtcclxuICAgICAgICAgICAgdGhpcy5faW5pdE1hcmtlcnMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfaW5pdE1hcmtlcnM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9tYXJrZXJHcm91cCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2VyR3JvdXAgPSBuZXcgTC5MYXllckdyb3VwKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fbWFya2VycyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgdmFyIGxhdGxuZ3MgPSB0aGlzLl9kZWZhdWx0U2hhcGUoKSxcclxuICAgICAgICAgICAgICAgIGksIGosIGxlbiwgbWFya2VyO1xyXG5cclxuICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gbGF0bG5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG5cclxuICAgICAgICAgICAgICAgIG1hcmtlciA9IHRoaXMuX2NyZWF0ZU1hcmtlcihsYXRsbmdzW2ldLCBpKTtcclxuICAgICAgICAgICAgICAgLy8gbWFya2VyLm9uKCdjbGljaycsIHRoaXMuX29uTWFya2VyQ2xpY2ssIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2Vycy5wdXNoKG1hcmtlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBtYXJrZXJMZWZ0LCBtYXJrZXJSaWdodDtcclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiAhKEwuUG9seWdvbiAmJiAodGhpcy5fcG9seSBpbnN0YW5jZW9mIEwuUG9seWdvbikpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbWFya2VyTGVmdCA9IHRoaXMuX21hcmtlcnNbal07XHJcbiAgICAgICAgICAgICAgICBtYXJrZXJSaWdodCA9IHRoaXMuX21hcmtlcnNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlTWlkZGxlTWFya2VyKG1hcmtlckxlZnQsIG1hcmtlclJpZ2h0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVByZXZOZXh0KG1hcmtlckxlZnQsIG1hcmtlclJpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9jcmVhdGVNYXJrZXI6IGZ1bmN0aW9uIChsYXRsbmcsIGluZGV4KSB7XHJcbiAgICAgICAgICAgIC8vIEV4dGVuZGluZyBMLk1hcmtlciBpbiBUb3VjaEV2ZW50cy5qcyB0byBpbmNsdWRlIHRvdWNoLlxyXG4gICAgICAgICAgICB2YXIgbWFya2VyID0gbmV3IEwuTWFya2VyLlRvdWNoKGxhdGxuZywge1xyXG4gICAgICAgICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgaWNvbjogdGhpcy5vcHRpb25zLmljb24sXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbWFya2VyLl9vcmlnTGF0TG5nID0gbGF0bG5nO1xyXG4gICAgICAgICAgICBtYXJrZXIuX2luZGV4ID0gaW5kZXg7XHJcblxyXG4gICAgICAgICAgICBtYXJrZXJcclxuICAgICAgICAgICAgICAgIC5vbignZHJhZ3N0YXJ0JywgdGhpcy5fb25NYXJrZXJEcmFnU3RhcnQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ2RyYWcnLCB0aGlzLl9vbk1hcmtlckRyYWcsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ2RyYWdlbmQnLCB0aGlzLl9maXJlRWRpdCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC8vIC5vbignZHJhZ2VuZCcsIHRoaXMuX29uTWFya2VyRHJhZ0VuZCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbigndG91Y2htb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ3RvdWNoZW5kJywgdGhpcy5fZmlyZUVkaXQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ01TUG9pbnRlck1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbignTVNQb2ludGVyVXAnLCB0aGlzLl9maXJlRWRpdCwgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJHcm91cC5hZGRMYXllcihtYXJrZXIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1hcmtlcjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25NYXJrZXJEcmFnU3RhcnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9seS5maXJlKCdlZGl0c3RhcnQnKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfc3BsaWNlTGF0TG5nczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbGF0bG5ncyA9IHRoaXMuX2RlZmF1bHRTaGFwZSgpO1xyXG4gICAgICAgICAgICB2YXIgcmVtb3ZlZCA9IFtdLnNwbGljZS5hcHBseShsYXRsbmdzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb2x5Ll9jb252ZXJ0TGF0TG5ncyhsYXRsbmdzLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5fcG9seS5yZWRyYXcoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlbW92ZWQ7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3JlbW92ZU1hcmtlcjogZnVuY3Rpb24gKG1hcmtlcikge1xyXG4gICAgICAgICAgICB2YXIgaSA9IG1hcmtlci5faW5kZXg7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJHcm91cC5yZW1vdmVMYXllcihtYXJrZXIpO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5fc3BsaWNlTGF0TG5ncyhpLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlSW5kZXhlcyhpLCAtMSk7XHJcblxyXG4gICAgICAgICAgICBtYXJrZXJcclxuICAgICAgICAgICAgICAgIC5vZmYoJ2RyYWdzdGFydCcsIHRoaXMuX29uTWFya2VyRHJhZ1N0YXJ0LCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZignZHJhZycsIHRoaXMuX29uTWFya2VyRHJhZywgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ2RyYWdlbmQnLCB0aGlzLl9maXJlRWRpdCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ3RvdWNobW92ZScsIHRoaXMuX29uTWFya2VyRHJhZywgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ3RvdWNoZW5kJywgdGhpcy5fZmlyZUVkaXQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgLy8gIC5vZmYoJ2NsaWNrJywgdGhpcy5fb25NYXJrZXJDbGljaywgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ01TUG9pbnRlck1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ01TUG9pbnRlclVwJywgdGhpcy5fZmlyZUVkaXQsIHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9maXJlRWRpdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wb2x5LmVkaXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvbHkuZmlyZSgnZWRpdCcpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb2x5Ll9tYXAuZmlyZShMLkRyYXcuRXZlbnQuRURJVFZFUlRFWCwge2xheWVyczogdGhpcy5fbWFya2VyR3JvdXAsIHBvbHk6IHRoaXMuX3BvbHl9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25NYXJrZXJEcmFnOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgbWFya2VyID0gZS50YXJnZXQ7XHJcbiAgICAgICAgICAgIHZhciBwb2x5ID0gdGhpcy5fcG9seTtcclxuXHJcbiAgICAgICAgICAgIEwuZXh0ZW5kKG1hcmtlci5fb3JpZ0xhdExuZywgbWFya2VyLl9sYXRsbmcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1hcmtlci5fbWlkZGxlTGVmdCkge1xyXG4gICAgICAgICAgICAgICAgbWFya2VyLl9taWRkbGVMZWZ0LnNldExhdExuZyh0aGlzLl9nZXRNaWRkbGVMYXRMbmcobWFya2VyLl9wcmV2LCBtYXJrZXIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobWFya2VyLl9taWRkbGVSaWdodCkge1xyXG4gICAgICAgICAgICAgICAgbWFya2VyLl9taWRkbGVSaWdodC5zZXRMYXRMbmcodGhpcy5fZ2V0TWlkZGxlTGF0TG5nKG1hcmtlciwgbWFya2VyLl9uZXh0KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGlmIChwb2x5Lm9wdGlvbnMucG9seSkge1xyXG4gICAgICAgICAgICAvLyAgICAgdmFyIHRvb2x0aXAgPSBwb2x5Ll9tYXAuX2VkaXRUb29sdGlwOyAvLyBBY2Nlc3MgdGhlIHRvb2x0aXBcclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgLy8gICAgIC8vIElmIHdlIGRvbid0IGFsbG93IGludGVyc2VjdGlvbnMgYW5kIHRoZSBwb2x5Z29uIGludGVyc2VjdHNcclxuICAgICAgICAgICAgLy8gICAgIGlmICghcG9seS5vcHRpb25zLnBvbHkuYWxsb3dJbnRlcnNlY3Rpb24gJiYgcG9seS5pbnRlcnNlY3RzKCkpIHtcclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgLy8gICAgICAgICB2YXIgb3JpZ2luYWxDb2xvciA9IHBvbHkub3B0aW9ucy5jb2xvcjtcclxuICAgICAgICAgICAgLy8gICAgICAgICBwb2x5LnNldFN0eWxlKHtjb2xvcjogdGhpcy5vcHRpb25zLmRyYXdFcnJvci5jb2xvcn0pO1xyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIE1hbnVhbGx5IHRyaWdnZXIgJ2RyYWdlbmQnIGJlaGF2aW9yIG9uIG1hcmtlciB3ZSBhcmUgYWJvdXQgdG8gcmVtb3ZlXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gV09SS0FST1VORDogaW50cm9kdWNlZCBpbiAxLjAuMC1yYzIsIG1heSBiZSByZWxhdGVkIHRvICM0NDg0XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgaWYgKEwudmVyc2lvbi5pbmRleE9mKCcwLjcnKSAhPT0gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBtYXJrZXIuZHJhZ2dpbmcuX2RyYWdnYWJsZS5fb25VcChlKTtcclxuICAgICAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5fb25NYXJrZXJDbGljayhlKTsgLy8gUmVtb3ZlIHZpb2xhdGluZyBtYXJrZXJcclxuICAgICAgICAgICAgLy8gICAgICAgICAvLyBGSVhNRTogUmVzZXQgdGhlIG1hcmtlciB0byBpdCdzIG9yaWdpbmFsIHBvc2l0aW9uIChpbnN0ZWFkIG9mIHJlbW92ZSlcclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgLy8gICAgICAgICBpZiAodG9vbHRpcCkge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB0b29sdGlwLnVwZGF0ZUNvbnRlbnQoe1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGV4dDogTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5wb2x5bGluZS5lcnJvclxyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gUmVzZXQgZXZlcnl0aGluZyBiYWNrIHRvIG5vcm1hbCBhZnRlciBhIHNlY29uZFxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBwb2x5LnNldFN0eWxlKHtjb2xvcjogb3JpZ2luYWxDb2xvcn0pO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBpZiAodG9vbHRpcCkge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgdG9vbHRpcC51cGRhdGVDb250ZW50KHtcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB0ZXh0OiBMLmRyYXdMb2NhbC5lZGl0LmhhbmRsZXJzLmVkaXQudG9vbHRpcC50ZXh0LFxyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHN1YnRleHQ6IEwuZHJhd0xvY2FsLmVkaXQuaGFuZGxlcnMuZWRpdC50b29sdGlwLnN1YnRleHRcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgdmFyIHRhYkxhdExuZ3MgPSBbXVxyXG4gICAgICAgICAgICBmb3IodmFyIGogaW4gdGhpcy5fbWFya2Vycyl7XHJcbiAgICAgICAgICAgICAgICB0YWJMYXRMbmdzLnB1c2godGhpcy5fbWFya2Vyc1tqXS5nZXRMYXRMbmcoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcG9seS5zZXRMYXRMbmdzKHRhYkxhdExuZ3MpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb2x5LmVkaXRpbmcubGF0bG5nc1swXVswXSA9IHRhYkxhdExuZ3M7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9wb2x5LnJlZHJhdygpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb2x5LmZpcmUoJ2VkaXRkcmFnJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uTWFya2VyQ2xpY2s6IGZ1bmN0aW9uIChlKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgbWluUG9pbnRzID0gTC5Qb2x5Z29uICYmICh0aGlzLl9wb2x5IGluc3RhbmNlb2YgTC5Qb2x5Z29uKSA/IDQgOiAzLFxyXG4gICAgICAgICAgICAgICAgbWFya2VyID0gZS50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiByZW1vdmluZyB0aGlzIHBvaW50IHdvdWxkIGNyZWF0ZSBhbiBpbnZhbGlkIHBvbHlsaW5lL3BvbHlnb24gZG9uJ3QgcmVtb3ZlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWZhdWx0U2hhcGUoKS5sZW5ndGggPCBtaW5Qb2ludHMpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBtYXJrZXJcclxuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlTWFya2VyKG1hcmtlcik7XHJcblxyXG4gICAgICAgICAgICAvLyB1cGRhdGUgcHJldi9uZXh0IGxpbmtzIG9mIGFkamFjZW50IG1hcmtlcnNcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUHJldk5leHQobWFya2VyLl9wcmV2LCBtYXJrZXIuX25leHQpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVtb3ZlIGdob3N0IG1hcmtlcnMgbmVhciB0aGUgcmVtb3ZlZCBtYXJrZXJcclxuICAgICAgICAgICAgaWYgKG1hcmtlci5fbWlkZGxlTGVmdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2VyR3JvdXAucmVtb3ZlTGF5ZXIobWFya2VyLl9taWRkbGVMZWZ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobWFya2VyLl9taWRkbGVSaWdodCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2VyR3JvdXAucmVtb3ZlTGF5ZXIobWFya2VyLl9taWRkbGVSaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGdob3N0IG1hcmtlciBpbiBwbGFjZSBvZiB0aGUgcmVtb3ZlZCBvbmVcclxuICAgICAgICAgICAgaWYgKG1hcmtlci5fcHJldiAmJiBtYXJrZXIuX25leHQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZU1pZGRsZU1hcmtlcihtYXJrZXIuX3ByZXYsIG1hcmtlci5fbmV4dCk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFtYXJrZXIuX3ByZXYpIHtcclxuICAgICAgICAgICAgICAgIG1hcmtlci5fbmV4dC5fbWlkZGxlTGVmdCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFtYXJrZXIuX25leHQpIHtcclxuICAgICAgICAgICAgICAgIG1hcmtlci5fcHJldi5fbWlkZGxlUmlnaHQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9maXJlRWRpdCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vblRvdWNoTW92ZTogZnVuY3Rpb24gKGUpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBsYXllclBvaW50ID0gdGhpcy5fbWFwLm1vdXNlRXZlbnRUb0xheWVyUG9pbnQoZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0pLFxyXG4gICAgICAgICAgICAgICAgbGF0bG5nID0gdGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhsYXllclBvaW50KSxcclxuICAgICAgICAgICAgICAgIG1hcmtlciA9IGUudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgTC5leHRlbmQobWFya2VyLl9vcmlnTGF0TG5nLCBsYXRsbmcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1hcmtlci5fbWlkZGxlTGVmdCkge1xyXG4gICAgICAgICAgICAgICAgbWFya2VyLl9taWRkbGVMZWZ0LnNldExhdExuZyh0aGlzLl9nZXRNaWRkbGVMYXRMbmcobWFya2VyLl9wcmV2LCBtYXJrZXIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobWFya2VyLl9taWRkbGVSaWdodCkge1xyXG4gICAgICAgICAgICAgICAgbWFya2VyLl9taWRkbGVSaWdodC5zZXRMYXRMbmcodGhpcy5fZ2V0TWlkZGxlTGF0TG5nKG1hcmtlciwgbWFya2VyLl9uZXh0KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3BvbHkucmVkcmF3KCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTWFya2VycygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF91cGRhdGVJbmRleGVzOiBmdW5jdGlvbiAoaW5kZXgsIGRlbHRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlckdyb3VwLmVhY2hMYXllcihmdW5jdGlvbiAobWFya2VyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWFya2VyLl9pbmRleCA+IGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyLl9pbmRleCArPSBkZWx0YTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NyZWF0ZU1pZGRsZU1hcmtlcjogZnVuY3Rpb24gKG1hcmtlcjEsIG1hcmtlcjIpIHtcclxuICAgICAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuX2dldE1pZGRsZUxhdExuZyhtYXJrZXIxLCBtYXJrZXIyKSxcclxuICAgICAgICAgICAgICAgIG1hcmtlciA9IHRoaXMuX2NyZWF0ZU1hcmtlcihsYXRsbmcpLFxyXG4gICAgICAgICAgICAgICAgb25DbGljayxcclxuICAgICAgICAgICAgICAgIG9uRHJhZ1N0YXJ0LFxyXG4gICAgICAgICAgICAgICAgb25EcmFnRW5kO1xyXG5cclxuICAgICAgICAgICAgbWFya2VyLnNldE9wYWNpdHkoMC42KTtcclxuXHJcbiAgICAgICAgICAgIG1hcmtlcjEuX21pZGRsZVJpZ2h0ID0gbWFya2VyMi5fbWlkZGxlTGVmdCA9IG1hcmtlcjtcclxuXHJcbiAgICAgICAgICAgIG9uRHJhZ1N0YXJ0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgbWFya2VyLm9mZigndG91Y2htb3ZlJywgb25EcmFnU3RhcnQsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGkgPSBtYXJrZXIyLl9pbmRleDtcclxuXHJcbiAgICAgICAgICAgICAgICBtYXJrZXIuX2luZGV4ID0gaTtcclxuXHJcbiAgICAgICAgICAgICAgICBtYXJrZXJcclxuICAgICAgICAgICAgICAgICAgICAub2ZmKCdjbGljaycsIG9uQ2xpY2ssIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdjbGljaycsIHRoaXMuX29uTWFya2VyQ2xpY2ssIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxhdGxuZy5sYXQgPSBtYXJrZXIuZ2V0TGF0TG5nKCkubGF0O1xyXG4gICAgICAgICAgICAgICAgbGF0bG5nLmxuZyA9IG1hcmtlci5nZXRMYXRMbmcoKS5sbmc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zcGxpY2VMYXRMbmdzKGksIDAsIGxhdGxuZyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXJrZXJzLnNwbGljZShpLCAwLCBtYXJrZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIG1hcmtlci5zZXRPcGFjaXR5KDEpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUluZGV4ZXMoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICBtYXJrZXIyLl9pbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlUHJldk5leHQobWFya2VyMSwgbWFya2VyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVByZXZOZXh0KG1hcmtlciwgbWFya2VyMik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2x5LmZpcmUoJ2VkaXRzdGFydCcpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgb25EcmFnRW5kID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgbWFya2VyLm9mZignZHJhZ3N0YXJ0Jywgb25EcmFnU3RhcnQsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgbWFya2VyLm9mZignZHJhZ2VuZCcsIG9uRHJhZ0VuZCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICBtYXJrZXIub2ZmKCd0b3VjaG1vdmUnLCBvbkRyYWdTdGFydCwgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuaW50ZXJzZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlTWlkZGxlTWFya2VyKG1hcmtlcjEsIG1hcmtlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlTWlkZGxlTWFya2VyKG1hcmtlciwgbWFya2VyMik7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBtYXJrZXIyLl9pbmRleC0tO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gbWFya2VyMi5faW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3BsaWNlTGF0TG5ncyhpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVJbmRleGVzKGksIC0xKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVQcmV2TmV4dChtYXJrZXIxLCBtYXJrZXIyKTtcclxuICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0T3BhY2l0eSgwLjYpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvbHkucmVkcmF3KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNYXJrZXJzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBvbkNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgb25EcmFnU3RhcnQuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIG9uRHJhZ0VuZC5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyZUVkaXQoKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIG1hcmtlclxyXG4gICAgICAgICAgICAgICAgLy8ub24oJ2NsaWNrJywgb25DbGljaywgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbignZHJhZ3N0YXJ0Jywgb25EcmFnU3RhcnQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ2RyYWdlbmQnLCBvbkRyYWdFbmQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ3RvdWNobW92ZScsIG9uRHJhZ1N0YXJ0LCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlckdyb3VwLmFkZExheWVyKG1hcmtlcik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3VwZGF0ZVByZXZOZXh0OiBmdW5jdGlvbiAobWFya2VyMSwgbWFya2VyMikge1xyXG4gICAgICAgICAgICBpZiAobWFya2VyMSkge1xyXG4gICAgICAgICAgICAgICAgbWFya2VyMS5fbmV4dCA9IG1hcmtlcjI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG1hcmtlcjIpIHtcclxuICAgICAgICAgICAgICAgIG1hcmtlcjIuX3ByZXYgPSBtYXJrZXIxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldE1pZGRsZUxhdExuZzogZnVuY3Rpb24gKG1hcmtlcjEsIG1hcmtlcjIpIHtcclxuICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX3BvbHkuX21hcCxcclxuICAgICAgICAgICAgICAgIHAxID0gbWFwLnByb2plY3QobWFya2VyMS5nZXRMYXRMbmcoKSksXHJcbiAgICAgICAgICAgICAgICBwMiA9IG1hcC5wcm9qZWN0KG1hcmtlcjIuZ2V0TGF0TG5nKCkpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1hcC51bnByb2plY3QocDEuX2FkZChwMikuX2RpdmlkZUJ5KDIpKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBMLlBvbHlsaW5lLmFkZEluaXRIb29rKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGhhbmRsZXIgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4gVGhpcyBpcyB0byBzdXBwb3J0IHZlcnNpb25zIG9mIExlYWZsZXQgdGhhdCBzdGlsbCBoYXZlIEwuSGFuZGxlci5Qb2x5RWRpdFxyXG4gICAgICAgIGlmICh0aGlzLmVkaXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEwuRWRpdC5Qb2x5KSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVkaXRpbmcgPSBuZXcgTC5FZGl0LlBvbHkodGhpcywgdGhpcy5vcHRpb25zLnBvbHkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0aW5nLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uKCdhZGQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRpbmcgJiYgdGhpcy5lZGl0aW5nLmVuYWJsZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0aW5nLmFkZEhvb2tzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5vbigncmVtb3ZlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0aW5nICYmIHRoaXMuZWRpdGluZy5lbmFibGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdGluZy5yZW1vdmVIb29rcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgTC5FZGl0ID0gTC5FZGl0IHx8IHt9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5FZGl0LlNpbXBsZVNoYXBlXHJcbiAgICAgKiBAYWthIEVkaXQuU2ltcGxlU2hhcGVcclxuICAgICAqL1xyXG4gICAgTC5FZGl0LlNpbXBsZVNoYXBlID0gTC5IYW5kbGVyLmV4dGVuZCh7XHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICBtb3ZlSWNvbjogbmV3IEwuRGl2SWNvbih7XHJcbiAgICAgICAgICAgICAgICBpY29uU2l6ZTogbmV3IEwuUG9pbnQoOCwgOCksXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdsZWFmbGV0LWRpdi1pY29uIGxlYWZsZXQtZWRpdGluZy1pY29uIGxlYWZsZXQtZWRpdC1tb3ZlJ1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgcmVzaXplSWNvbjogbmV3IEwuRGl2SWNvbih7XHJcbiAgICAgICAgICAgICAgICBpY29uU2l6ZTogbmV3IEwuUG9pbnQoOCwgOCksXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdsZWFmbGV0LWRpdi1pY29uIGxlYWZsZXQtZWRpdGluZy1pY29uIGxlYWZsZXQtZWRpdC1yZXNpemUnXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB0b3VjaE1vdmVJY29uOiBuZXcgTC5EaXZJY29uKHtcclxuICAgICAgICAgICAgICAgIGljb25TaXplOiBuZXcgTC5Qb2ludCgyMCwgMjApLFxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnbGVhZmxldC1kaXYtaWNvbiBsZWFmbGV0LWVkaXRpbmctaWNvbiBsZWFmbGV0LWVkaXQtbW92ZSBsZWFmbGV0LXRvdWNoLWljb24nXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB0b3VjaFJlc2l6ZUljb246IG5ldyBMLkRpdkljb24oe1xyXG4gICAgICAgICAgICAgICAgaWNvblNpemU6IG5ldyBMLlBvaW50KDIwLCAyMCksXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdsZWFmbGV0LWRpdi1pY29uIGxlYWZsZXQtZWRpdGluZy1pY29uIGxlYWZsZXQtZWRpdC1yZXNpemUgbGVhZmxldC10b3VjaC1pY29uJ1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGludGlhbGl6ZSgpOiB2b2lkXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKHNoYXBlLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHRvdWNoLCBzd2l0Y2ggdG8gdG91Y2ggaWNvblxyXG4gICAgICAgICAgICBpZiAoTC5Ccm93c2VyLnRvdWNoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubW92ZUljb24gPSB0aGlzLm9wdGlvbnMudG91Y2hNb3ZlSWNvbjtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5yZXNpemVJY29uID0gdGhpcy5vcHRpb25zLnRvdWNoUmVzaXplSWNvbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fc2hhcGUgPSBzaGFwZTtcclxuICAgICAgICAgICAgTC5VdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBhZGRIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gQWRkIGxpc3RlbmVyIGhvb2tzIHRvIHRoaXMgaGFuZGxlclxyXG4gICAgICAgIGFkZEhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzaGFwZSA9IHRoaXMuX3NoYXBlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc2hhcGUuX21hcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwID0gdGhpcy5fc2hhcGUuX21hcDtcclxuICAgICAgICAgICAgICAgIHNoYXBlLnNldFN0eWxlKHNoYXBlLm9wdGlvbnMuZWRpdGluZyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNoYXBlLl9tYXApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAgPSBzaGFwZS5fbWFwO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbWFya2VyR3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdE1hcmtlcnMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLmFkZExheWVyKHRoaXMuX21hcmtlckdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgcmVtb3ZlSG9va3MoKTogdm9pZFxyXG4gICAgICAgIC8vIFJlbW92ZSBsaXN0ZW5lciBob29rcyBmcm9tIHRoaXMgaGFuZGxlclxyXG4gICAgICAgIHJlbW92ZUhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzaGFwZSA9IHRoaXMuX3NoYXBlO1xyXG5cclxuICAgICAgICAgICAgc2hhcGUuc2V0U3R5bGUoc2hhcGUub3B0aW9ucy5vcmlnaW5hbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hhcGUuX21hcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdW5iaW5kTWFya2VyKHRoaXMuX21vdmVNYXJrZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5fcmVzaXplTWFya2Vycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmJpbmRNYXJrZXIodGhpcy5fcmVzaXplTWFya2Vyc1tpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNpemVNYXJrZXJzID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fbWFya2VyR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcmtlckdyb3VwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXAgPSBudWxsO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgdXBkYXRlTWFya2VycygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBlZGl0IG1hcmtlcnMgZnJvbSB0aGlzIGxheWVyXHJcbiAgICAgICAgdXBkYXRlTWFya2VyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJHcm91cC5jbGVhckxheWVycygpO1xyXG4gICAgICAgICAgICB0aGlzLl9pbml0TWFya2VycygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9pbml0TWFya2VyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX21hcmtlckdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXJrZXJHcm91cCA9IG5ldyBMLkxheWVyR3JvdXAoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gQ3JlYXRlIGNlbnRlciBtYXJrZXJcclxuICAgICAgICAgICAgdGhpcy5fY3JlYXRlTW92ZU1hcmtlcigpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ3JlYXRlIGVkZ2UgbWFya2VyXHJcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVJlc2l6ZU1hcmtlcigpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9jcmVhdGVNb3ZlTWFya2VyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIENoaWxkcmVuIG92ZXJyaWRlXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NyZWF0ZVJlc2l6ZU1hcmtlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBDaGlsZHJlbiBvdmVycmlkZVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9jcmVhdGVNYXJrZXI6IGZ1bmN0aW9uIChsYXRsbmcsIGljb24pIHtcclxuICAgICAgICAgICAgLy8gRXh0ZW5kaW5nIEwuTWFya2VyIGluIFRvdWNoRXZlbnRzLmpzIHRvIGluY2x1ZGUgdG91Y2guXHJcbiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgTC5NYXJrZXIuVG91Y2gobGF0bG5nLCB7XHJcbiAgICAgICAgICAgICAgICBkcmFnZ2FibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBpY29uOiBpY29uLFxyXG4gICAgICAgICAgICAgICAgekluZGV4T2Zmc2V0OiAxMFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2JpbmRNYXJrZXIobWFya2VyKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlckdyb3VwLmFkZExheWVyKG1hcmtlcik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbWFya2VyO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9iaW5kTWFya2VyOiBmdW5jdGlvbiAobWFya2VyKSB7XHJcbiAgICAgICAgICAgIG1hcmtlclxyXG4gICAgICAgICAgICAgICAgLm9uKCdkcmFnc3RhcnQnLCB0aGlzLl9vbk1hcmtlckRyYWdTdGFydCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbignZHJhZycsIHRoaXMuX29uTWFya2VyRHJhZywgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbignZHJhZ2VuZCcsIHRoaXMuX29uTWFya2VyRHJhZ0VuZCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbigndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2hTdGFydCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbigndG91Y2htb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ01TUG9pbnRlck1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbigndG91Y2hlbmQnLCB0aGlzLl9vblRvdWNoRW5kLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9uKCdNU1BvaW50ZXJVcCcsIHRoaXMuX29uVG91Y2hFbmQsIHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF91bmJpbmRNYXJrZXI6IGZ1bmN0aW9uIChtYXJrZXIpIHtcclxuICAgICAgICAgICAgbWFya2VyXHJcbiAgICAgICAgICAgICAgICAub2ZmKCdkcmFnc3RhcnQnLCB0aGlzLl9vbk1hcmtlckRyYWdTdGFydCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ2RyYWcnLCB0aGlzLl9vbk1hcmtlckRyYWcsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub2ZmKCdkcmFnZW5kJywgdGhpcy5fb25NYXJrZXJEcmFnRW5kLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZigndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2hTdGFydCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZignTVNQb2ludGVyTW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZigndG91Y2hlbmQnLCB0aGlzLl9vblRvdWNoRW5kLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZignTVNQb2ludGVyVXAnLCB0aGlzLl9vblRvdWNoRW5kLCB0aGlzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25NYXJrZXJEcmFnU3RhcnQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBlLnRhcmdldDtcclxuICAgICAgICAgICAgbWFya2VyLnNldE9wYWNpdHkoMCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zaGFwZS5maXJlKCdlZGl0c3RhcnQnKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZmlyZUVkaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2hhcGUuZWRpdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fc2hhcGUuZmlyZSgnZWRpdCcpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbk1hcmtlckRyYWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBlLnRhcmdldCxcclxuICAgICAgICAgICAgICAgIGxhdGxuZyA9IG1hcmtlci5nZXRMYXRMbmcoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChtYXJrZXIgPT09IHRoaXMuX21vdmVNYXJrZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21vdmUobGF0bG5nKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZShsYXRsbmcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zaGFwZS5yZWRyYXcoKTtcclxuICAgICAgICAgICAgdGhpcy5fc2hhcGUuZmlyZSgnZWRpdGRyYWcnKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25NYXJrZXJEcmFnRW5kOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgbWFya2VyID0gZS50YXJnZXQ7XHJcbiAgICAgICAgICAgIG1hcmtlci5zZXRPcGFjaXR5KDEpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZmlyZUVkaXQoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Ub3VjaFN0YXJ0OiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBMLkVkaXQuU2ltcGxlU2hhcGUucHJvdG90eXBlLl9vbk1hcmtlckRyYWdTdGFydC5jYWxsKHRoaXMsIGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLl9nZXRDb3JuZXJzKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgLy8gU2F2ZSBhIHJlZmVyZW5jZSB0byB0aGUgb3Bwb3NpdGUgcG9pbnRcclxuICAgICAgICAgICAgICAgIHZhciBjb3JuZXJzID0gdGhpcy5fZ2V0Q29ybmVycygpLFxyXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IGUudGFyZ2V0LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb3JuZXJJbmRleCA9IG1hcmtlci5fY29ybmVySW5kZXg7XHJcblxyXG4gICAgICAgICAgICAgICAgbWFya2VyLnNldE9wYWNpdHkoMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ29weWVkIGZyb20gRWRpdC5SZWN0YW5nbGUuanMgbGluZSAyMyBfb25NYXJrZXJEcmFnU3RhcnQoKVxyXG4gICAgICAgICAgICAgICAgLy8gTGF0bG5nIGlzIG51bGwgb3RoZXJ3aXNlLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3Bwb3NpdGVDb3JuZXIgPSBjb3JuZXJzWyhjdXJyZW50Q29ybmVySW5kZXggKyAyKSAlIDRdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQ29ybmVyTWFya2VycygwLCBjdXJyZW50Q29ybmVySW5kZXgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zaGFwZS5maXJlKCdlZGl0c3RhcnQnKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Ub3VjaE1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXllclBvaW50ID0gdGhpcy5fbWFwLm1vdXNlRXZlbnRUb0xheWVyUG9pbnQoZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0pLFxyXG4gICAgICAgICAgICAgICAgbGF0bG5nID0gdGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhsYXllclBvaW50KSxcclxuICAgICAgICAgICAgICAgIG1hcmtlciA9IGUudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKG1hcmtlciA9PT0gdGhpcy5fbW92ZU1hcmtlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZShsYXRsbmcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplKGxhdGxuZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3NoYXBlLnJlZHJhdygpO1xyXG5cclxuICAgICAgICAgICAgLy8gcHJldmVudCB0b3VjaGNhbmNlbCBpbiBJT1NcclxuICAgICAgICAgICAgLy8gZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uVG91Y2hFbmQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBlLnRhcmdldDtcclxuICAgICAgICAgICAgbWFya2VyLnNldE9wYWNpdHkoMSk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTWFya2VycygpO1xyXG4gICAgICAgICAgICB0aGlzLl9maXJlRWRpdCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9tb3ZlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIENoaWxkcmVuIG92ZXJyaWRlXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Jlc2l6ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBDaGlsZHJlbiBvdmVycmlkZVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICBMLkVkaXQgPSBMLkVkaXQgfHwge307XHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkVkaXQuUmVjdGFuZ2xlXHJcbiAgICAgKiBAYWthIEVkaXQuUmVjdGFuZ2xlXHJcbiAgICAgKiBAaW5oZXJpdHMgTC5FZGl0LlNpbXBsZVNoYXBlXHJcbiAgICAgKi9cclxuICAgIEwuRWRpdC5SZWN0YW5nbGUgPSBMLkVkaXQuU2ltcGxlU2hhcGUuZXh0ZW5kKHtcclxuICAgICAgICBfY3JlYXRlTW92ZU1hcmtlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgYm91bmRzID0gdGhpcy5fc2hhcGUuZ2V0Qm91bmRzKCksXHJcbiAgICAgICAgICAgICAgICBjZW50ZXIgPSBib3VuZHMuZ2V0Q2VudGVyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tb3ZlTWFya2VyID0gdGhpcy5fY3JlYXRlTWFya2VyKGNlbnRlciwgdGhpcy5vcHRpb25zLm1vdmVJY29uKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfY3JlYXRlUmVzaXplTWFya2VyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBjb3JuZXJzID0gdGhpcy5fZ2V0Q29ybmVycygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fcmVzaXplTWFya2VycyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjb3JuZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplTWFya2Vycy5wdXNoKHRoaXMuX2NyZWF0ZU1hcmtlcihjb3JuZXJzW2ldLCB0aGlzLm9wdGlvbnMucmVzaXplSWNvbikpO1xyXG4gICAgICAgICAgICAgICAgLy8gTW9ua2V5IGluIHRoZSBjb3JuZXIgaW5kZXggYXMgd2Ugd2lsbCBuZWVkIHRvIGtub3cgdGhpcyBmb3IgZHJhZ2dpbmdcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZU1hcmtlcnNbaV0uX2Nvcm5lckluZGV4ID0gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbk1hcmtlckRyYWdTdGFydDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgTC5FZGl0LlNpbXBsZVNoYXBlLnByb3RvdHlwZS5fb25NYXJrZXJEcmFnU3RhcnQuY2FsbCh0aGlzLCBlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNhdmUgYSByZWZlcmVuY2UgdG8gdGhlIG9wcG9zaXRlIHBvaW50XHJcbiAgICAgICAgICAgIHZhciBjb3JuZXJzID0gdGhpcy5fZ2V0Q29ybmVycygpLFxyXG4gICAgICAgICAgICAgICAgbWFya2VyID0gZS50YXJnZXQsXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Q29ybmVySW5kZXggPSBtYXJrZXIuX2Nvcm5lckluZGV4O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fb3Bwb3NpdGVDb3JuZXIgPSBjb3JuZXJzWyhjdXJyZW50Q29ybmVySW5kZXggKyAyKSAlIDRdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQ29ybmVyTWFya2VycygwLCBjdXJyZW50Q29ybmVySW5kZXgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbk1hcmtlckRyYWdFbmQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBlLnRhcmdldCxcclxuICAgICAgICAgICAgICAgIGJvdW5kcywgY2VudGVyO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVzZXQgbW92ZSBtYXJrZXIgcG9zaXRpb24gdG8gdGhlIGNlbnRlclxyXG4gICAgICAgICAgICBpZiAobWFya2VyID09PSB0aGlzLl9tb3ZlTWFya2VyKSB7XHJcbiAgICAgICAgICAgICAgICBib3VuZHMgPSB0aGlzLl9zaGFwZS5nZXRCb3VuZHMoKTtcclxuICAgICAgICAgICAgICAgIGNlbnRlciA9IGJvdW5kcy5nZXRDZW50ZXIoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBtYXJrZXIuc2V0TGF0TG5nKGNlbnRlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNvcm5lck1hcmtlcnMoMSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9yZXBvc2l0aW9uQ29ybmVyTWFya2VycygpO1xyXG5cclxuICAgICAgICAgICAgTC5FZGl0LlNpbXBsZVNoYXBlLnByb3RvdHlwZS5fb25NYXJrZXJEcmFnRW5kLmNhbGwodGhpcywgZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX21vdmU6IGZ1bmN0aW9uIChuZXdDZW50ZXIpIHtcclxuICAgICAgICAgICAgdmFyIGxhdGxuZ3MgPSB0aGlzLl9zaGFwZS5fZGVmYXVsdFNoYXBlID8gdGhpcy5fc2hhcGUuX2RlZmF1bHRTaGFwZSgpIDogdGhpcy5fc2hhcGUuZ2V0TGF0TG5ncygpLFxyXG4gICAgICAgICAgICAgICAgYm91bmRzID0gdGhpcy5fc2hhcGUuZ2V0Qm91bmRzKCksXHJcbiAgICAgICAgICAgICAgICBjZW50ZXIgPSBib3VuZHMuZ2V0Q2VudGVyKCksXHJcbiAgICAgICAgICAgICAgICBvZmZzZXQsIG5ld0xhdExuZ3MgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIC8vIE9mZnNldCB0aGUgbGF0bG5ncyB0byB0aGUgbmV3IGNlbnRlclxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxhdGxuZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBbbGF0bG5nc1tpXS5sYXQgLSBjZW50ZXIubGF0LCBsYXRsbmdzW2ldLmxuZyAtIGNlbnRlci5sbmddO1xyXG4gICAgICAgICAgICAgICAgbmV3TGF0TG5ncy5wdXNoKFtuZXdDZW50ZXIubGF0ICsgb2Zmc2V0WzBdLCBuZXdDZW50ZXIubG5nICsgb2Zmc2V0WzFdXSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3NoYXBlLnNldExhdExuZ3MobmV3TGF0TG5ncyk7XHJcblxyXG4gICAgICAgICAgICAvLyBSZXBvc2l0aW9uIHRoZSByZXNpemUgbWFya2Vyc1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvc2l0aW9uQ29ybmVyTWFya2VycygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUoTC5EcmF3LkV2ZW50LkVESVRNT1ZFLCB7bGF5ZXI6IHRoaXMuX3NoYXBlfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Jlc2l6ZTogZnVuY3Rpb24gKGxhdGxuZykge1xyXG4gICAgICAgICAgICB2YXIgYm91bmRzO1xyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzaGFwZSBiYXNlZCBvbiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGlzIGNvcm5lciBhbmQgdGhlIG9wcG9zaXRlIHBvaW50XHJcbiAgICAgICAgICAgIHRoaXMuX3NoYXBlLnNldEJvdW5kcyhMLmxhdExuZ0JvdW5kcyhsYXRsbmcsIHRoaXMuX29wcG9zaXRlQ29ybmVyKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBSZXBvc2l0aW9uIHRoZSBtb3ZlIG1hcmtlclxyXG4gICAgICAgICAgICBib3VuZHMgPSB0aGlzLl9zaGFwZS5nZXRCb3VuZHMoKTtcclxuICAgICAgICAgICAgdGhpcy5fbW92ZU1hcmtlci5zZXRMYXRMbmcoYm91bmRzLmdldENlbnRlcigpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5FRElUUkVTSVpFLCB7bGF5ZXI6IHRoaXMuX3NoYXBlfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldENvcm5lcnM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX3NoYXBlLmdldEJvdW5kcygpLFxyXG4gICAgICAgICAgICAgICAgbncgPSBib3VuZHMuZ2V0Tm9ydGhXZXN0KCksXHJcbiAgICAgICAgICAgICAgICBuZSA9IGJvdW5kcy5nZXROb3J0aEVhc3QoKSxcclxuICAgICAgICAgICAgICAgIHNlID0gYm91bmRzLmdldFNvdXRoRWFzdCgpLFxyXG4gICAgICAgICAgICAgICAgc3cgPSBib3VuZHMuZ2V0U291dGhXZXN0KCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gW253LCBuZSwgc2UsIHN3XTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfdG9nZ2xlQ29ybmVyTWFya2VyczogZnVuY3Rpb24gKG9wYWNpdHkpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLl9yZXNpemVNYXJrZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplTWFya2Vyc1tpXS5zZXRPcGFjaXR5KG9wYWNpdHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3JlcG9zaXRpb25Db3JuZXJNYXJrZXJzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBjb3JuZXJzID0gdGhpcy5fZ2V0Q29ybmVycygpO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLl9yZXNpemVNYXJrZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplTWFya2Vyc1tpXS5zZXRMYXRMbmcoY29ybmVyc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBMLlJlY3RhbmdsZS5hZGRJbml0SG9vayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKEwuRWRpdC5SZWN0YW5nbGUpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0aW5nID0gbmV3IEwuRWRpdC5SZWN0YW5nbGUodGhpcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRpbmcuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgTC5FZGl0ID0gTC5FZGl0IHx8IHt9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5FZGl0LkNpcmNsZU1hcmtlclxyXG4gICAgICogQGFrYSBFZGl0LkNpcmNsZVxyXG4gICAgICogQGluaGVyaXRzIEwuRWRpdC5TaW1wbGVTaGFwZVxyXG4gICAgICovXHJcbiAgICBMLkVkaXQuQ2lyY2xlTWFya2VyID0gTC5FZGl0LlNpbXBsZVNoYXBlLmV4dGVuZCh7XHJcbiAgICAgICAgX2NyZWF0ZU1vdmVNYXJrZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGNlbnRlciA9IHRoaXMuX3NoYXBlLmdldExhdExuZygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbW92ZU1hcmtlciA9IHRoaXMuX2NyZWF0ZU1hcmtlcihjZW50ZXIsIHRoaXMub3B0aW9ucy5tb3ZlSWNvbik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NyZWF0ZVJlc2l6ZU1hcmtlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBUbyBhdm9pZCBhbiB1bmRlZmluZWQgY2hlY2sgaW4gTC5FZGl0LlNpbXBsZVNoYXBlLnJlbW92ZUhvb2tzXHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZU1hcmtlcnMgPSBbXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfbW92ZTogZnVuY3Rpb24gKGxhdGxuZykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcmVzaXplTWFya2Vycy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHZhciByZXNpemVtYXJrZXJQb2ludCA9IHRoaXMuX2dldFJlc2l6ZU1hcmtlclBvaW50KGxhdGxuZyk7XHJcbiAgICAgICAgICAgICAgICAvLyBNb3ZlIHRoZSByZXNpemUgbWFya2VyXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNpemVNYXJrZXJzWzBdLnNldExhdExuZyhyZXNpemVtYXJrZXJQb2ludCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIGNpcmNsZVxyXG4gICAgICAgICAgICB0aGlzLl9zaGFwZS5zZXRMYXRMbmcobGF0bG5nKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5FRElUTU9WRSwge2xheWVyOiB0aGlzLl9zaGFwZX0pO1xyXG4gICAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBMLkNpcmNsZU1hcmtlci5hZGRJbml0SG9vayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKEwuRWRpdC5DaXJjbGVNYXJrZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0aW5nID0gbmV3IEwuRWRpdC5DaXJjbGVNYXJrZXIodGhpcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRpbmcuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub24oJ2FkZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGluZyAmJiB0aGlzLmVkaXRpbmcuZW5hYmxlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRpbmcuYWRkSG9va3MoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLm9uKCdyZW1vdmUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRpbmcgJiYgdGhpcy5lZGl0aW5nLmVuYWJsZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0aW5nLnJlbW92ZUhvb2tzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICBMLkVkaXQgPSBMLkVkaXQgfHwge307XHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkVkaXQuQ2lyY2xlXHJcbiAgICAgKiBAYWthIEVkaXQuQ2lyY2xlXHJcbiAgICAgKiBAaW5oZXJpdHMgTC5FZGl0LkNpcmNsZU1hcmtlclxyXG4gICAgICovXHJcbiAgICBMLkVkaXQuQ2lyY2xlID0gTC5FZGl0LkNpcmNsZU1hcmtlci5leHRlbmQoe1xyXG5cclxuICAgICAgICBfY3JlYXRlUmVzaXplTWFya2VyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLl9zaGFwZS5nZXRMYXRMbmcoKSxcclxuICAgICAgICAgICAgICAgIHJlc2l6ZW1hcmtlclBvaW50ID0gdGhpcy5fZ2V0UmVzaXplTWFya2VyUG9pbnQoY2VudGVyKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZU1hcmtlcnMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5fcmVzaXplTWFya2Vycy5wdXNoKHRoaXMuX2NyZWF0ZU1hcmtlcihyZXNpemVtYXJrZXJQb2ludCwgdGhpcy5vcHRpb25zLnJlc2l6ZUljb24pKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZ2V0UmVzaXplTWFya2VyUG9pbnQ6IGZ1bmN0aW9uIChsYXRsbmcpIHtcclxuICAgICAgICAgICAgLy8gRnJvbSBMLnNoYXBlLmdldEJvdW5kcygpXHJcbiAgICAgICAgICAgIHZhciBkZWx0YSA9IHRoaXMuX3NoYXBlLl9yYWRpdXMgKiBNYXRoLmNvcyhNYXRoLlBJIC8gNCksXHJcbiAgICAgICAgICAgICAgICBwb2ludCA9IHRoaXMuX21hcC5wcm9qZWN0KGxhdGxuZyk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXAudW5wcm9qZWN0KFtwb2ludC54ICsgZGVsdGEsIHBvaW50LnkgLSBkZWx0YV0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9yZXNpemU6IGZ1bmN0aW9uIChsYXRsbmcpIHtcclxuICAgICAgICAgICAgdmFyIG1vdmVMYXRMbmcgPSB0aGlzLl9tb3ZlTWFya2VyLmdldExhdExuZygpLFxyXG4gICAgICAgICAgICAgICAgcmFkaXVzID0gdGhpcy5fbWFwLmRpc3RhbmNlKG1vdmVMYXRMbmcsIGxhdGxuZyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zaGFwZS5zZXRSYWRpdXMocmFkaXVzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5FRElUUkVTSVpFLCB7bGF5ZXI6IHRoaXMuX3NoYXBlfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgTC5DaXJjbGUuYWRkSW5pdEhvb2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmIChMLkVkaXQuQ2lyY2xlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdGluZyA9IG5ldyBMLkVkaXQuQ2lyY2xlKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0aW5nLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uKCdhZGQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRpbmcgJiYgdGhpcy5lZGl0aW5nLmVuYWJsZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0aW5nLmFkZEhvb2tzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5vbigncmVtb3ZlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0aW5nICYmIHRoaXMuZWRpdGluZy5lbmFibGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdGluZy5yZW1vdmVIb29rcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgTC5NYXAubWVyZ2VPcHRpb25zKHtcclxuICAgICAgICB0b3VjaEV4dGVuZDogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5NYXAuVG91Y2hFeHRlbmRcclxuICAgICAqIEBha2EgVG91Y2hFeHRlbmRcclxuICAgICAqL1xyXG4gICAgTC5NYXAuVG91Y2hFeHRlbmQgPSBMLkhhbmRsZXIuZXh0ZW5kKHtcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKCk6IHZvaWRcclxuICAgICAgICAvLyBTZXRzIFRvdWNoRXh0ZW5kIHByaXZhdGUgYWNjZXNzb3IgdmFyaWFibGVzXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG1hcCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IG1hcC5fY29udGFpbmVyO1xyXG4gICAgICAgICAgICB0aGlzLl9wYW5lID0gbWFwLl9wYW5lcy5vdmVybGF5UGFuZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGFkZEhvb2tzKCk6IHZvaWRcclxuICAgICAgICAvLyBBZGRzIGRvbSBsaXN0ZW5lciBldmVudHMgdG8gdGhlIG1hcCBjb250YWluZXJcclxuICAgICAgICBhZGRIb29rczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBMLkRvbUV2ZW50Lm9uKHRoaXMuX2NvbnRhaW5lciwgJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblRvdWNoU3RhcnQsIHRoaXMpO1xyXG4gICAgICAgICAgICBMLkRvbUV2ZW50Lm9uKHRoaXMuX2NvbnRhaW5lciwgJ3RvdWNoZW5kJywgdGhpcy5fb25Ub3VjaEVuZCwgdGhpcyk7XHJcbiAgICAgICAgICAgIEwuRG9tRXZlbnQub24odGhpcy5fY29udGFpbmVyLCAndG91Y2htb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUsIHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGV0ZWN0SUUoKSkge1xyXG4gICAgICAgICAgICAgICAgTC5Eb21FdmVudC5vbih0aGlzLl9jb250YWluZXIsICdNU1BvaW50ZXJEb3duJywgdGhpcy5fb25Ub3VjaFN0YXJ0LCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQub24odGhpcy5fY29udGFpbmVyLCAnTVNQb2ludGVyVXAnLCB0aGlzLl9vblRvdWNoRW5kLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQub24odGhpcy5fY29udGFpbmVyLCAnTVNQb2ludGVyTW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQub24odGhpcy5fY29udGFpbmVyLCAnTVNQb2ludGVyQ2FuY2VsJywgdGhpcy5fb25Ub3VjaENhbmNlbCwgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgTC5Eb21FdmVudC5vbih0aGlzLl9jb250YWluZXIsICd0b3VjaGNhbmNlbCcsIHRoaXMuX29uVG91Y2hDYW5jZWwsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgTC5Eb21FdmVudC5vbih0aGlzLl9jb250YWluZXIsICd0b3VjaGxlYXZlJywgdGhpcy5fb25Ub3VjaExlYXZlLCB0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgcmVtb3ZlSG9va3MoKTogdm9pZFxyXG4gICAgICAgIC8vIFJlbW92ZXMgZG9tIGxpc3RlbmVyIGV2ZW50cyBmcm9tIHRoZSBtYXAgY29udGFpbmVyXHJcbiAgICAgICAgcmVtb3ZlSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgTC5Eb21FdmVudC5vZmYodGhpcy5fY29udGFpbmVyLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2hTdGFydCk7XHJcbiAgICAgICAgICAgIEwuRG9tRXZlbnQub2ZmKHRoaXMuX2NvbnRhaW5lciwgJ3RvdWNoZW5kJywgdGhpcy5fb25Ub3VjaEVuZCk7XHJcbiAgICAgICAgICAgIEwuRG9tRXZlbnQub2ZmKHRoaXMuX2NvbnRhaW5lciwgJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RldGVjdElFKCkpIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQub2ZmKHRoaXMuX2NvbnRhaW5lciwgJ01TUG9pbnRlckRvd20nLCB0aGlzLl9vblRvdWNoU3RhcnQpO1xyXG4gICAgICAgICAgICAgICAgTC5Eb21FdmVudC5vZmYodGhpcy5fY29udGFpbmVyLCAnTVNQb2ludGVyVXAnLCB0aGlzLl9vblRvdWNoRW5kKTtcclxuICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQub2ZmKHRoaXMuX2NvbnRhaW5lciwgJ01TUG9pbnRlck1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XHJcbiAgICAgICAgICAgICAgICBMLkRvbUV2ZW50Lm9mZih0aGlzLl9jb250YWluZXIsICdNU1BvaW50ZXJDYW5jZWwnLCB0aGlzLl9vblRvdWNoQ2FuY2VsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQub2ZmKHRoaXMuX2NvbnRhaW5lciwgJ3RvdWNoY2FuY2VsJywgdGhpcy5fb25Ub3VjaENhbmNlbCk7XHJcbiAgICAgICAgICAgICAgICBMLkRvbUV2ZW50Lm9mZih0aGlzLl9jb250YWluZXIsICd0b3VjaGxlYXZlJywgdGhpcy5fb25Ub3VjaExlYXZlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF90b3VjaEV2ZW50OiBmdW5jdGlvbiAoZSwgdHlwZSkge1xyXG4gICAgICAgICAgICAvLyAjVE9ETzogZml4IHRoZSBwYWdlWCBlcnJvciB0aGF0IGlzIGRvIGEgYnVnIGluIEFuZHJvaWQgd2hlcmUgYSBzaW5nbGUgdG91Y2ggdHJpZ2dlcnMgdHdvIGNsaWNrIGV2ZW50c1xyXG4gICAgICAgICAgICAvLyBfZmlsdGVyQ2xpY2sgaXMgd2hhdCBsZWFmbGV0IHVzZXMgYXMgYSB3b3JrYXJvdW5kLlxyXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgcHJvYmxlbSB3aXRoIG1vcmUgdGhpbmdzIHRoYW4ganVzdCBhbmRyb2lkLiBBbm90aGVyIHByb2JsZW0gaXMgdG91Y2hFbmQgaGFzIG5vIHRvdWNoZXMgaW5cclxuICAgICAgICAgICAgLy8gaXRzIHRvdWNoIGxpc3QuXHJcbiAgICAgICAgICAgIHZhciB0b3VjaEV2ZW50ID0ge307XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZS50b3VjaGVzICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlLnRvdWNoZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdG91Y2hFdmVudCA9IGUudG91Y2hlc1swXTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlLnBvaW50ZXJUeXBlID09PSAndG91Y2gnKSB7XHJcbiAgICAgICAgICAgICAgICB0b3VjaEV2ZW50ID0gZTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZmlsdGVyQ2xpY2soZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXJQb2ludCA9IHRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0b3VjaEV2ZW50KSxcclxuICAgICAgICAgICAgICAgIGxheWVyUG9pbnQgPSB0aGlzLl9tYXAubW91c2VFdmVudFRvTGF5ZXJQb2ludCh0b3VjaEV2ZW50KSxcclxuICAgICAgICAgICAgICAgIGxhdGxuZyA9IHRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcobGF5ZXJQb2ludCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZSh0eXBlLCB7XHJcbiAgICAgICAgICAgICAgICBsYXRsbmc6IGxhdGxuZyxcclxuICAgICAgICAgICAgICAgIGxheWVyUG9pbnQ6IGxheWVyUG9pbnQsXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJQb2ludDogY29udGFpbmVyUG9pbnQsXHJcbiAgICAgICAgICAgICAgICBwYWdlWDogdG91Y2hFdmVudC5wYWdlWCxcclxuICAgICAgICAgICAgICAgIHBhZ2VZOiB0b3VjaEV2ZW50LnBhZ2VZLFxyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKiogQm9ycm93ZWQgZnJvbSBMZWFmbGV0IGFuZCBtb2RpZmllZCBmb3IgYm9vbCBvcHMgKiovXHJcbiAgICAgICAgX2ZpbHRlckNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgdGltZVN0YW1wID0gKGUudGltZVN0YW1wIHx8IGUub3JpZ2luYWxFdmVudC50aW1lU3RhbXApLFxyXG4gICAgICAgICAgICAgICAgZWxhcHNlZCA9IEwuRG9tRXZlbnQuX2xhc3RDbGljayAmJiAodGltZVN0YW1wIC0gTC5Eb21FdmVudC5fbGFzdENsaWNrKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGFyZSB0aGV5IGNsb3NlciB0b2dldGhlciB0aGFuIDUwMG1zIHlldCBtb3JlIHRoYW4gMTAwbXM/XHJcbiAgICAgICAgICAgIC8vIEFuZHJvaWQgdHlwaWNhbGx5IHRyaWdnZXJzIHRoZW0gfjMwMG1zIGFwYXJ0IHdoaWxlIG11bHRpcGxlIGxpc3RlbmVyc1xyXG4gICAgICAgICAgICAvLyBvbiB0aGUgc2FtZSBldmVudCBzaG91bGQgYmUgdHJpZ2dlcmVkIGZhciBmYXN0ZXI7XHJcbiAgICAgICAgICAgIC8vIG9yIGNoZWNrIGlmIGNsaWNrIGlzIHNpbXVsYXRlZCBvbiB0aGUgZWxlbWVudCwgYW5kIGlmIGl0IGlzLCByZWplY3QgYW55IG5vbi1zaW11bGF0ZWQgZXZlbnRzXHJcbiAgICAgICAgICAgIGlmICgoZWxhcHNlZCAmJiBlbGFwc2VkID4gMTAwICYmIGVsYXBzZWQgPCA1MDApIHx8IChlLnRhcmdldC5fc2ltdWxhdGVkQ2xpY2sgJiYgIWUuX3NpbXVsYXRlZCkpIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQuc3RvcChlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBMLkRvbUV2ZW50Ll9sYXN0Q2xpY2sgPSB0aW1lU3RhbXA7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vblRvdWNoU3RhcnQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fbWFwLl9sb2FkZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHR5cGUgPSAndG91Y2hzdGFydCc7XHJcbiAgICAgICAgICAgIHRoaXMuX3RvdWNoRXZlbnQoZSwgdHlwZSk7XHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vblRvdWNoRW5kOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX21hcC5fbG9hZGVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciB0eXBlID0gJ3RvdWNoZW5kJztcclxuICAgICAgICAgICAgdGhpcy5fdG91Y2hFdmVudChlLCB0eXBlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Ub3VjaENhbmNlbDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9tYXAuX2xvYWRlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgdHlwZSA9ICd0b3VjaGNhbmNlbCc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZXRlY3RJRSgpKSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlID0gJ3BvaW50ZXJjYW5jZWwnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3RvdWNoRXZlbnQoZSwgdHlwZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uVG91Y2hMZWF2ZTogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9tYXAuX2xvYWRlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgdHlwZSA9ICd0b3VjaGxlYXZlJztcclxuICAgICAgICAgICAgdGhpcy5fdG91Y2hFdmVudChlLCB0eXBlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Ub3VjaE1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fbWFwLl9sb2FkZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHR5cGUgPSAndG91Y2htb3ZlJztcclxuICAgICAgICAgICAgdGhpcy5fdG91Y2hFdmVudChlLCB0eXBlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZGV0ZWN0SUU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XHJcblxyXG4gICAgICAgICAgICB2YXIgbXNpZSA9IHVhLmluZGV4T2YoJ01TSUUgJyk7XHJcbiAgICAgICAgICAgIGlmIChtc2llID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gSUUgMTAgb3Igb2xkZXIgPT4gcmV0dXJuIHZlcnNpb24gbnVtYmVyXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodWEuc3Vic3RyaW5nKG1zaWUgKyA1LCB1YS5pbmRleE9mKCcuJywgbXNpZSkpLCAxMCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciB0cmlkZW50ID0gdWEuaW5kZXhPZignVHJpZGVudC8nKTtcclxuICAgICAgICAgICAgaWYgKHRyaWRlbnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJRSAxMSA9PiByZXR1cm4gdmVyc2lvbiBudW1iZXJcclxuICAgICAgICAgICAgICAgIHZhciBydiA9IHVhLmluZGV4T2YoJ3J2OicpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHVhLnN1YnN0cmluZyhydiArIDMsIHVhLmluZGV4T2YoJy4nLCBydikpLCAxMCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBlZGdlID0gdWEuaW5kZXhPZignRWRnZS8nKTtcclxuICAgICAgICAgICAgaWYgKGVkZ2UgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJRSAxMiA9PiByZXR1cm4gdmVyc2lvbiBudW1iZXJcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh1YS5zdWJzdHJpbmcoZWRnZSArIDUsIHVhLmluZGV4T2YoJy4nLCBlZGdlKSksIDEwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gb3RoZXIgYnJvd3NlclxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgTC5NYXAuYWRkSW5pdEhvb2soJ2FkZEhhbmRsZXInLCAndG91Y2hFeHRlbmQnLCBMLk1hcC5Ub3VjaEV4dGVuZCk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuTWFya2VyLlRvdWNoXHJcbiAgICAgKiBAYWthIE1hcmtlci5Ub3VjaFxyXG4gICAgICpcclxuICAgICAqIFRoaXMgaXNuJ3QgZnVsbCBUb3VjaCBzdXBwb3J0LiBUaGlzIGlzIGp1c3QgdG8gZ2V0IG1hcmtlcnMgdG8gYWxzbyBzdXBwb3J0IGRvbSB0b3VjaCBldmVudHMgYWZ0ZXIgY3JlYXRpb25cclxuICAgICAqICNUT0RPOiBmaW5kIGEgYmV0dGVyIHdheSBvZiBnZXR0aW5nIG1hcmtlcnMgdG8gc3VwcG9ydCB0b3VjaC5cclxuICAgICAqL1xyXG4gICAgTC5NYXJrZXIuVG91Y2ggPSBMLk1hcmtlci5leHRlbmQoe1xyXG5cclxuICAgICAgICBfaW5pdEludGVyYWN0aW9uOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5hZGRJbnRlcmFjdGl2ZVRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgLy8gMC43Lnggc3VwcG9ydFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRJbnRlcmFjdGlvbkxlZ2FjeSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFRPRE8gdGhpcyBtYXkgbmVlZCBiZSB1cGRhdGVkIHRvIHJlLWFkZCB0b3VjaCBldmVudHMgZm9yIDEuMCtcclxuICAgICAgICAgICAgcmV0dXJuIEwuTWFya2VyLnByb3RvdHlwZS5faW5pdEludGVyYWN0aW9uLmFwcGx5KHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIFRoaXMgaXMgYW4gZXhhY3QgY29weSBvZiBodHRwczovL2dpdGh1Yi5jb20vTGVhZmxldC9MZWFmbGV0L2Jsb2IvdjAuNy9zcmMvbGF5ZXIvbWFya2VyL01hcmtlci5qc1xyXG4gICAgICAgIC8vIHdpdGggdGhlIGFkZGl0aW9uIG9mIHRoZSB0b3VjaCBldmVudHNcclxuICAgICAgICBfaW5pdEludGVyYWN0aW9uTGVnYWN5OiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5jbGlja2FibGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVE9ETyByZWZhY3RvciBpbnRvIHNvbWV0aGluZyBzaGFyZWQgd2l0aCBNYXAvUGF0aC9ldGMuIHRvIERSWSBpdCB1cFxyXG5cclxuICAgICAgICAgICAgdmFyIGljb24gPSB0aGlzLl9pY29uLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRzID0gWydkYmxjbGljaycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ21vdXNlZG93bicsXHJcbiAgICAgICAgICAgICAgICAgICAgJ21vdXNlb3ZlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgJ21vdXNlb3V0JyxcclxuICAgICAgICAgICAgICAgICAgICAnY29udGV4dG1lbnUnLFxyXG4gICAgICAgICAgICAgICAgICAgICd0b3VjaHN0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICAndG91Y2hlbmQnLFxyXG4gICAgICAgICAgICAgICAgICAgICd0b3VjaG1vdmUnXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RldGVjdElFKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudHMuY29uY2F0KFsnTVNQb2ludGVyRG93bicsXHJcbiAgICAgICAgICAgICAgICAgICAgJ01TUG9pbnRlclVwJyxcclxuICAgICAgICAgICAgICAgICAgICAnTVNQb2ludGVyTW92ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgJ01TUG9pbnRlckNhbmNlbCddKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50cy5jb25jYXQoWyd0b3VjaGNhbmNlbCddKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKGljb24sICdsZWFmbGV0LWNsaWNrYWJsZScpO1xyXG4gICAgICAgICAgICBMLkRvbUV2ZW50Lm9uKGljb24sICdjbGljaycsIHRoaXMuX29uTW91c2VDbGljaywgdGhpcyk7XHJcbiAgICAgICAgICAgIEwuRG9tRXZlbnQub24oaWNvbiwgJ2tleXByZXNzJywgdGhpcy5fb25LZXlQcmVzcywgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgTC5Eb21FdmVudC5vbihpY29uLCBldmVudHNbaV0sIHRoaXMuX2ZpcmVNb3VzZUV2ZW50LCB0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKEwuSGFuZGxlci5NYXJrZXJEcmFnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdnaW5nID0gbmV3IEwuSGFuZGxlci5NYXJrZXJEcmFnKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnZ2luZy5lbmFibGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9kZXRlY3RJRTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcclxuXHJcbiAgICAgICAgICAgIHZhciBtc2llID0gdWEuaW5kZXhPZignTVNJRSAnKTtcclxuICAgICAgICAgICAgaWYgKG1zaWUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJRSAxMCBvciBvbGRlciA9PiByZXR1cm4gdmVyc2lvbiBudW1iZXJcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh1YS5zdWJzdHJpbmcobXNpZSArIDUsIHVhLmluZGV4T2YoJy4nLCBtc2llKSksIDEwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHRyaWRlbnQgPSB1YS5pbmRleE9mKCdUcmlkZW50LycpO1xyXG4gICAgICAgICAgICBpZiAodHJpZGVudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIElFIDExID0+IHJldHVybiB2ZXJzaW9uIG51bWJlclxyXG4gICAgICAgICAgICAgICAgdmFyIHJ2ID0gdWEuaW5kZXhPZigncnY6Jyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodWEuc3Vic3RyaW5nKHJ2ICsgMywgdWEuaW5kZXhPZignLicsIHJ2KSksIDEwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGVkZ2UgPSB1YS5pbmRleE9mKCdFZGdlLycpO1xyXG4gICAgICAgICAgICBpZiAoZWRnZSA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIElFIDEyID0+IHJldHVybiB2ZXJzaW9uIG51bWJlclxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHVhLnN1YnN0cmluZyhlZGdlICsgNSwgdWEuaW5kZXhPZignLicsIGVkZ2UpKSwgMTApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBvdGhlciBicm93c2VyXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5MYXRMbmdVdGlsXHJcbiAgICAgKiBAYWthIExhdExuZ1V0aWxcclxuICAgICAqL1xyXG4gICAgTC5MYXRMbmdVdGlsID0ge1xyXG4gICAgICAgIC8vIENsb25lcyBhIExhdExuZ3NbXSwgcmV0dXJucyBbXVtdXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgY2xvbmVMYXRMbmdzKExhdExuZ3NbXSk6IEwuTGF0TG5nc1tdXHJcbiAgICAgICAgLy8gQ2xvbmUgdGhlIGxhdExuZyBwb2ludCBvciBwb2ludHMgb3IgbmVzdGVkIHBvaW50cyBhbmQgcmV0dXJuIGFuIGFycmF5IHdpdGggdGhvc2UgcG9pbnRzXHJcbiAgICAgICAgY2xvbmVMYXRMbmdzOiBmdW5jdGlvbiAobGF0bG5ncykge1xyXG4gICAgICAgICAgICB2YXIgY2xvbmUgPSBbXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsYXRsbmdzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG5lc3RlZCBhcnJheSAoUG9seWxpbmUvUG9seWdvbilcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxhdGxuZ3NbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xvbmUucHVzaChMLkxhdExuZ1V0aWwuY2xvbmVMYXRMbmdzKGxhdGxuZ3NbaV0pKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xvbmUucHVzaCh0aGlzLmNsb25lTGF0TG5nKGxhdGxuZ3NbaV0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY2xvbmU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBjbG9uZUxhdExuZyhMYXRMbmcpOiBMLkxhdExuZ1xyXG4gICAgICAgIC8vIENsb25lIHRoZSBsYXRMbmcgYW5kIHJldHVybiBhIG5ldyBMYXRMbmcgb2JqZWN0LlxyXG4gICAgICAgIGNsb25lTGF0TG5nOiBmdW5jdGlvbiAobGF0bG5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBMLmxhdExuZyhsYXRsbmcubGF0LCBsYXRsbmcubG5nKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICB2YXIgZGVmYXVsdFByZWNpc2lvbiA9IHtcclxuICAgICAgICAgICAga206IDIsXHJcbiAgICAgICAgICAgIGhhOiAyLFxyXG4gICAgICAgICAgICBtOiAwLFxyXG4gICAgICAgICAgICBtaTogMixcclxuICAgICAgICAgICAgYWM6IDIsXHJcbiAgICAgICAgICAgIHlkOiAwLFxyXG4gICAgICAgICAgICBmdDogMCxcclxuICAgICAgICAgICAgbm06IDJcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNsYXNzIEwuR2VvbWV0cnlVdGlsXHJcbiAgICAgICAgICogQGFrYSBHZW9tZXRyeVV0aWxcclxuICAgICAgICAgKi9cclxuICAgICAgICBMLkdlb21ldHJ5VXRpbCA9IEwuZXh0ZW5kKEwuR2VvbWV0cnlVdGlsIHx8IHt9LCB7XHJcbiAgICAgICAgICAgIC8vIFBvcnRlZCBmcm9tIHRoZSBPcGVuTGF5ZXJzIGltcGxlbWVudGF0aW9uLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL29wZW5sYXllcnMvb3BlbmxheWVycy9ibG9iL21hc3Rlci9saWIvT3BlbkxheWVycy9HZW9tZXRyeS9MaW5lYXJSaW5nLmpzI0wyNzBcclxuXHJcbiAgICAgICAgICAgIC8vIEBtZXRob2QgZ2VvZGVzaWNBcmVhKCk6IG51bWJlclxyXG4gICAgICAgICAgICBnZW9kZXNpY0FyZWE6IGZ1bmN0aW9uIChsYXRMbmdzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcG9pbnRzQ291bnQgPSBsYXRMbmdzLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICBhcmVhID0gMC4wLFxyXG4gICAgICAgICAgICAgICAgICAgIGQyciA9IE1hdGguUEkgLyAxODAsXHJcbiAgICAgICAgICAgICAgICAgICAgcDEsIHAyO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwb2ludHNDb3VudCA+IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50c0NvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcDEgPSBsYXRMbmdzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwMiA9IGxhdExuZ3NbKGkgKyAxKSAlIHBvaW50c0NvdW50XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJlYSArPSAoKHAyLmxuZyAtIHAxLmxuZykgKiBkMnIpICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyICsgTWF0aC5zaW4ocDEubGF0ICogZDJyKSArIE1hdGguc2luKHAyLmxhdCAqIGQycikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBhcmVhID0gYXJlYSAqIDYzNzgxMzcuMCAqIDYzNzgxMzcuMCAvIDIuMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMoYXJlYSk7XHJcbiAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAvLyBAbWV0aG9kIGZvcm1hdHRlZE51bWJlcihuLCBwcmVjaXNpb24pOiBzdHJpbmdcclxuICAgICAgICAgICAgLy8gUmV0dXJucyBuIGluIHNwZWNpZmllZCBudW1iZXIgZm9ybWF0IChpZiBkZWZpbmVkKSBhbmQgcHJlY2lzaW9uXHJcbiAgICAgICAgICAgIGZvcm1hdHRlZE51bWJlcjogZnVuY3Rpb24gKG4sIHByZWNpc2lvbikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvcm1hdHRlZCA9IHBhcnNlRmxvYXQobikudG9GaXhlZChwcmVjaXNpb24pLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEwuZHJhd0xvY2FsLmZvcm1hdCAmJiBMLmRyYXdMb2NhbC5mb3JtYXQubnVtZXJpYyxcclxuICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXJzID0gZm9ybWF0ICYmIGZvcm1hdC5kZWxpbWl0ZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgIHRob3VzYW5kcyA9IGRlbGltaXRlcnMgJiYgZGVsaW1pdGVycy50aG91c2FuZHMsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVjaW1hbCA9IGRlbGltaXRlcnMgJiYgZGVsaW1pdGVycy5kZWNpbWFsO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aG91c2FuZHMgfHwgZGVjaW1hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzcGxpdFZhbHVlID0gZm9ybWF0dGVkLnNwbGl0KCcuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkID0gdGhvdXNhbmRzID8gc3BsaXRWYWx1ZVswXS5yZXBsYWNlKC8oXFxkKSg/PShcXGR7M30pKyg/IVxcZCkpL2csICckMScgKyB0aG91c2FuZHMpIDogc3BsaXRWYWx1ZVswXTtcclxuICAgICAgICAgICAgICAgICAgICBkZWNpbWFsID0gZGVjaW1hbCB8fCAnLic7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0VmFsdWUubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQgKyBkZWNpbWFsICsgc3BsaXRWYWx1ZVsxXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlZDtcclxuICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIC8vIEBtZXRob2QgcmVhZGFibGVBcmVhKGFyZWEsIGlzTWV0cmljLCBwcmVjaXNpb24pOiBzdHJpbmdcclxuICAgICAgICAgICAgLy8gUmV0dXJucyBhIHJlYWRhYmxlIGFyZWEgc3RyaW5nIGluIHlhcmRzIG9yIG1ldHJpYy5cclxuICAgICAgICAgICAgLy8gVGhlIHZhbHVlIHdpbGwgYmUgcm91bmRlZCBhcyBkZWZpbmVkIGJ5IHRoZSBwcmVjaXNpb24gb3B0aW9uIG9iamVjdC5cclxuICAgICAgICAgICAgcmVhZGFibGVBcmVhOiBmdW5jdGlvbiAoYXJlYSwgaXNNZXRyaWMsIHByZWNpc2lvbikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGFyZWFTdHIsXHJcbiAgICAgICAgICAgICAgICAgICAgdW5pdHMsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uID0gTC5VdGlsLmV4dGVuZCh7fSwgZGVmYXVsdFByZWNpc2lvbiwgcHJlY2lzaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNNZXRyaWMpIHtcclxuICAgICAgICAgICAgICAgICAgICB1bml0cyA9IFsnaGEnLCAnbSddO1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlb2YgaXNNZXRyaWM7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzID0gW2lzTWV0cmljXTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdib29sZWFuJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0cyA9IGlzTWV0cmljO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZWEgPj0gMTAwMDAwMCAmJiB1bml0cy5pbmRleE9mKCdrbScpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmVhU3RyID0gTC5HZW9tZXRyeVV0aWwuZm9ybWF0dGVkTnVtYmVyKGFyZWEgKiAwLjAwMDAwMSwgcHJlY2lzaW9uWydrbSddKSArICcga23Csic7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmVhID49IDEwMDAwICYmIHVuaXRzLmluZGV4T2YoJ2hhJykgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHIgPSBMLkdlb21ldHJ5VXRpbC5mb3JtYXR0ZWROdW1iZXIoYXJlYSAqIDAuMDAwMSwgcHJlY2lzaW9uWydoYSddKSArICcgaGEnO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHIgPSBMLkdlb21ldHJ5VXRpbC5mb3JtYXR0ZWROdW1iZXIoYXJlYSwgcHJlY2lzaW9uWydtJ10pICsgJyBtwrInO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYSAvPSAwLjgzNjEyNzsgLy8gU3F1YXJlIHlhcmRzIGluIDEgbWV0ZXJcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZWEgPj0gMzA5NzYwMCkgeyAvLzMwOTc2MDAgc3F1YXJlIHlhcmRzIGluIDEgc3F1YXJlIG1pbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJlYVN0ciA9IEwuR2VvbWV0cnlVdGlsLmZvcm1hdHRlZE51bWJlcihhcmVhIC8gMzA5NzYwMCwgcHJlY2lzaW9uWydtaSddKSArICcgbWnCsic7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmVhID49IDQ4NDApIHsgLy80ODQwIHNxdWFyZSB5YXJkcyBpbiAxIGFjcmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJlYVN0ciA9IEwuR2VvbWV0cnlVdGlsLmZvcm1hdHRlZE51bWJlcihhcmVhIC8gNDg0MCwgcHJlY2lzaW9uWydhYyddKSArICcgYWNyZXMnO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHIgPSBMLkdlb21ldHJ5VXRpbC5mb3JtYXR0ZWROdW1iZXIoYXJlYSwgcHJlY2lzaW9uWyd5ZCddKSArICcgeWTCsic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBhcmVhU3RyO1xyXG4gICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgLy8gQG1ldGhvZCByZWFkYWJsZURpc3RhbmNlKGRpc3RhbmNlLCB1bml0cyk6IHN0cmluZ1xyXG4gICAgICAgICAgICAvLyBDb252ZXJ0cyBhIG1ldHJpYyBkaXN0YW5jZSB0byBvbmUgb2YgWyBmZWV0LCBuYXV0aWNhbE1pbGUsIG1ldHJpYyBvciB5YXJkcyBdIHN0cmluZ1xyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAvLyBAYWx0ZXJuYXRpdmVcclxuICAgICAgICAgICAgLy8gQG1ldGhvZCByZWFkYWJsZURpc3RhbmNlKGRpc3RhbmNlLCBpc01ldHJpYywgdXNlRmVldCwgaXNOYXV0aWNhbE1pbGUsIHByZWNpc2lvbik6IHN0cmluZ1xyXG4gICAgICAgICAgICAvLyBDb252ZXJ0cyBtZXRyaWMgZGlzdGFuY2UgdG8gZGlzdGFuY2Ugc3RyaW5nLlxyXG4gICAgICAgICAgICAvLyBUaGUgdmFsdWUgd2lsbCBiZSByb3VuZGVkIGFzIGRlZmluZWQgYnkgdGhlIHByZWNpc2lvbiBvcHRpb24gb2JqZWN0LlxyXG4gICAgICAgICAgICByZWFkYWJsZURpc3RhbmNlOiBmdW5jdGlvbiAoZGlzdGFuY2UsIGlzTWV0cmljLCBpc0ZlZXQsIGlzTmF1dGljYWxNaWxlLCBwcmVjaXNpb24pIHtcclxuICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZVN0cixcclxuICAgICAgICAgICAgICAgICAgICB1bml0cyxcclxuICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24gPSBMLlV0aWwuZXh0ZW5kKHt9LCBkZWZhdWx0UHJlY2lzaW9uLCBwcmVjaXNpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpc01ldHJpYykge1xyXG4gICAgICAgICAgICAgICAgICAgIHVuaXRzID0gdHlwZW9mIGlzTWV0cmljID09ICdzdHJpbmcnID8gaXNNZXRyaWMgOiAnbWV0cmljJztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNGZWV0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW5pdHMgPSAnZmVldCc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTmF1dGljYWxNaWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW5pdHMgPSAnbmF1dGljYWxNaWxlJztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW5pdHMgPSAneWFyZHMnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHN3aXRjaCAodW5pdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdtZXRyaWMnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG93IG1ldHJlcyB3aGVuIGRpc3RhbmNlIGlzIDwgMWttLCB0aGVuIHNob3cga21cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlID4gMTAwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VTdHIgPSBMLkdlb21ldHJ5VXRpbC5mb3JtYXR0ZWROdW1iZXIoZGlzdGFuY2UgLyAxMDAwLCBwcmVjaXNpb25bJ2ttJ10pICsgJyBrbSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZVN0ciA9IEwuR2VvbWV0cnlVdGlsLmZvcm1hdHRlZE51bWJlcihkaXN0YW5jZSwgcHJlY2lzaW9uWydtJ10pICsgJyBtJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdmZWV0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgKj0gMS4wOTM2MSAqIDM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlU3RyID0gTC5HZW9tZXRyeVV0aWwuZm9ybWF0dGVkTnVtYmVyKGRpc3RhbmNlLCBwcmVjaXNpb25bJ2Z0J10pICsgJyBmdCc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICduYXV0aWNhbE1pbGUnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSAqPSAwLjUzOTk2O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZVN0ciA9IEwuR2VvbWV0cnlVdGlsLmZvcm1hdHRlZE51bWJlcihkaXN0YW5jZSAvIDEwMDAsIHByZWNpc2lvblsnbm0nXSkgKyAnIG5tJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAneWFyZHMnOlxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlICo9IDEuMDkzNjE7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPiAxNzYwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZVN0ciA9IEwuR2VvbWV0cnlVdGlsLmZvcm1hdHRlZE51bWJlcihkaXN0YW5jZSAvIDE3NjAsIHByZWNpc2lvblsnbWknXSkgKyAnIG1pbGVzJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlU3RyID0gTC5HZW9tZXRyeVV0aWwuZm9ybWF0dGVkTnVtYmVyKGRpc3RhbmNlLCBwcmVjaXNpb25bJ3lkJ10pICsgJyB5ZCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdGFuY2VTdHI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9KSgpO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkxpbmVVdGlsXHJcbiAgICAgKiBAYWthIFV0aWxcclxuICAgICAqIEBha2EgTC5VdGlsc1xyXG4gICAgICovXHJcbiAgICBMLlV0aWwuZXh0ZW5kKEwuTGluZVV0aWwsIHtcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBzZWdtZW50c0ludGVyc2VjdCgpOiBib29sZWFuXHJcbiAgICAgICAgLy8gQ2hlY2tzIHRvIHNlZSBpZiB0d28gbGluZSBzZWdtZW50cyBpbnRlcnNlY3QuIERvZXMgbm90IGhhbmRsZSBkZWdlbmVyYXRlIGNhc2VzLlxyXG4gICAgICAgIC8vIGh0dHA6Ly9jb21wZ2VvbS5jcy51aXVjLmVkdS9+amVmZmUvdGVhY2hpbmcvMzczL25vdGVzL3gwNi1zd2VlcGxpbmUucGRmXHJcbiAgICAgICAgc2VnbWVudHNJbnRlcnNlY3Q6IGZ1bmN0aW9uICgvKlBvaW50Ki8gcCwgLypQb2ludCovIHAxLCAvKlBvaW50Ki8gcDIsIC8qUG9pbnQqLyBwMykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2hlY2tDb3VudGVyY2xvY2t3aXNlKHAsIHAyLCBwMykgIT09XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja0NvdW50ZXJjbG9ja3dpc2UocDEsIHAyLCBwMykgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrQ291bnRlcmNsb2Nrd2lzZShwLCBwMSwgcDIpICE9PVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tDb3VudGVyY2xvY2t3aXNlKHAsIHAxLCBwMyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHBvaW50cyBhcmUgaW4gY291bnRlcmNsb2Nrd2lzZSBvcmRlclxyXG4gICAgICAgIF9jaGVja0NvdW50ZXJjbG9ja3dpc2U6IGZ1bmN0aW9uICgvKlBvaW50Ki8gcCwgLypQb2ludCovIHAxLCAvKlBvaW50Ki8gcDIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChwMi55IC0gcC55KSAqIChwMS54IC0gcC54KSA+IChwMS55IC0gcC55KSAqIChwMi54IC0gcC54KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5Qb2x5bGluZVxyXG4gICAgICogQGFrYSBQb2x5bGluZVxyXG4gICAgICovXHJcbiAgICBMLlBvbHlsaW5lLmluY2x1ZGUoe1xyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGludGVyc2VjdHMoKTogYm9vbGVhblxyXG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIHBvbHlsaW5lIGhhcyBhbnkgbGluZXNlZ21lbnRzIHRoYXQgaW50ZXJzZWN0LlxyXG4gICAgICAgIC8vIE5PVEU6IGRvZXMgbm90IHN1cHBvcnQgZGV0ZWN0aW5nIGludGVyc2VjdGlvbiBmb3IgZGVnZW5lcmF0ZSBjYXNlcy5cclxuICAgICAgICBpbnRlcnNlY3RzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBwb2ludHMgPSB0aGlzLl9nZXRQcm9qZWN0ZWRQb2ludHMoKSxcclxuICAgICAgICAgICAgICAgIGxlbiA9IHBvaW50cyA/IHBvaW50cy5sZW5ndGggOiAwLFxyXG4gICAgICAgICAgICAgICAgaSwgcCwgcDE7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90b29GZXdQb2ludHNGb3JJbnRlcnNlY3Rpb24oKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDM7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgcCA9IHBvaW50c1tpIC0gMV07XHJcbiAgICAgICAgICAgICAgICBwMSA9IHBvaW50c1tpXTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xpbmVTZWdtZW50c0ludGVyc2VjdHNSYW5nZShwLCBwMSwgaSAtIDIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIG5ld0xhdExuZ0ludGVyc2VjdHMoKTogYm9vbGVhblxyXG4gICAgICAgIC8vIENoZWNrIGZvciBpbnRlcnNlY3Rpb24gaWYgbmV3IGxhdGxuZyB3YXMgYWRkZWQgdG8gdGhpcyBwb2x5bGluZS5cclxuICAgICAgICAvLyBOT1RFOiBkb2VzIG5vdCBzdXBwb3J0IGRldGVjdGluZyBpbnRlcnNlY3Rpb24gZm9yIGRlZ2VuZXJhdGUgY2FzZXMuXHJcbiAgICAgICAgbmV3TGF0TG5nSW50ZXJzZWN0czogZnVuY3Rpb24gKGxhdGxuZywgc2tpcEZpcnN0KSB7XHJcbiAgICAgICAgICAgIC8vIENhbm5vdCBjaGVjayBhIHBvbHlsaW5lIGZvciBpbnRlcnNlY3RpbmcgbGF0cy9sbmdzIHdoZW4gbm90IGFkZGVkIHRvIHRoZSBtYXBcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9tYXApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV3UG9pbnRJbnRlcnNlY3RzKHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQobGF0bG5nKSwgc2tpcEZpcnN0KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIG5ld1BvaW50SW50ZXJzZWN0cygpOiBib29sZWFuXHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGludGVyc2VjdGlvbiBpZiBuZXcgcG9pbnQgd2FzIGFkZGVkIHRvIHRoaXMgcG9seWxpbmUuXHJcbiAgICAgICAgLy8gbmV3UG9pbnQgbXVzdCBiZSBhIGxheWVyIHBvaW50LlxyXG4gICAgICAgIC8vIE5PVEU6IGRvZXMgbm90IHN1cHBvcnQgZGV0ZWN0aW5nIGludGVyc2VjdGlvbiBmb3IgZGVnZW5lcmF0ZSBjYXNlcy5cclxuICAgICAgICBuZXdQb2ludEludGVyc2VjdHM6IGZ1bmN0aW9uIChuZXdQb2ludCwgc2tpcEZpcnN0KSB7XHJcbiAgICAgICAgICAgIHZhciBwb2ludHMgPSB0aGlzLl9nZXRQcm9qZWN0ZWRQb2ludHMoKSxcclxuICAgICAgICAgICAgICAgIGxlbiA9IHBvaW50cyA/IHBvaW50cy5sZW5ndGggOiAwLFxyXG4gICAgICAgICAgICAgICAgbGFzdFBvaW50ID0gcG9pbnRzID8gcG9pbnRzW2xlbiAtIDFdIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBwcmV2aW91cyBsaW5lIHNlZ21lbnQuIFByZXZpb3VzIGxpbmUgc2VnbWVudCBkb2Vzbid0IG5lZWQgdGVzdGluZy5cclxuICAgICAgICAgICAgICAgIG1heEluZGV4ID0gbGVuIC0gMjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90b29GZXdQb2ludHNGb3JJbnRlcnNlY3Rpb24oMSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVTZWdtZW50c0ludGVyc2VjdHNSYW5nZShsYXN0UG9pbnQsIG5ld1BvaW50LCBtYXhJbmRleCwgc2tpcEZpcnN0ID8gMSA6IDApO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIFBvbHlsaW5lcyB3aXRoIDIgc2lkZXMgY2FuIG9ubHkgaW50ZXJzZWN0IGluIGNhc2VzIHdoZXJlIHBvaW50cyBhcmUgY29sbGluZWFyICh3ZSBkb24ndCBzdXBwb3J0IGRldGVjdGluZyB0aGVzZSkuXHJcbiAgICAgICAgLy8gQ2Fubm90IGhhdmUgaW50ZXJzZWN0aW9uIHdoZW4gPCAzIGxpbmUgc2VnbWVudHMgKDwgNCBwb2ludHMpXHJcbiAgICAgICAgX3Rvb0Zld1BvaW50c0ZvckludGVyc2VjdGlvbjogZnVuY3Rpb24gKGV4dHJhUG9pbnRzKSB7XHJcbiAgICAgICAgICAgIHZhciBwb2ludHMgPSB0aGlzLl9nZXRQcm9qZWN0ZWRQb2ludHMoKSxcclxuICAgICAgICAgICAgICAgIGxlbiA9IHBvaW50cyA/IHBvaW50cy5sZW5ndGggOiAwO1xyXG4gICAgICAgICAgICAvLyBJbmNyZW1lbnQgbGVuZ3RoIGJ5IGV4dHJhUG9pbnRzIGlmIHByZXNlbnRcclxuICAgICAgICAgICAgbGVuICs9IGV4dHJhUG9pbnRzIHx8IDA7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gIXBvaW50cyB8fCBsZW4gPD0gMztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBDaGVja3MgYSBsaW5lIHNlZ21lbnQgaW50ZXJzZWN0aW9ucyB3aXRoIGFueSBsaW5lIHNlZ21lbnRzIGJlZm9yZSBpdHMgcHJlZGVjZXNzb3IuXHJcbiAgICAgICAgLy8gRG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgcHJlZGVjZXNzb3IgYXMgd2lsbCBuZXZlciBpbnRlcnNlY3QuXHJcbiAgICAgICAgX2xpbmVTZWdtZW50c0ludGVyc2VjdHNSYW5nZTogZnVuY3Rpb24gKHAsIHAxLCBtYXhJbmRleCwgbWluSW5kZXgpIHtcclxuICAgICAgICAgICAgdmFyIHBvaW50cyA9IHRoaXMuX2dldFByb2plY3RlZFBvaW50cygpLFxyXG4gICAgICAgICAgICAgICAgcDIsIHAzO1xyXG5cclxuICAgICAgICAgICAgbWluSW5kZXggPSBtaW5JbmRleCB8fCAwO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2hlY2sgYWxsIHByZXZpb3VzIGxpbmUgc2VnbWVudHMgKGJlc2lkZSB0aGUgaW1tZWRpYXRlbHkgcHJldmlvdXMpIGZvciBpbnRlcnNlY3Rpb25zXHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSBtYXhJbmRleDsgaiA+IG1pbkluZGV4OyBqLS0pIHtcclxuICAgICAgICAgICAgICAgIHAyID0gcG9pbnRzW2ogLSAxXTtcclxuICAgICAgICAgICAgICAgIHAzID0gcG9pbnRzW2pdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChMLkxpbmVVdGlsLnNlZ21lbnRzSW50ZXJzZWN0KHAsIHAxLCBwMiwgcDMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZ2V0UHJvamVjdGVkUG9pbnRzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fZGVmYXVsdFNoYXBlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3JpZ2luYWxQb2ludHM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHBvaW50cyA9IFtdLFxyXG4gICAgICAgICAgICAgICAgX3NoYXBlID0gdGhpcy5fZGVmYXVsdFNoYXBlKCk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9zaGFwZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcG9pbnRzLnB1c2godGhpcy5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludChfc2hhcGVbaV0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcG9pbnRzO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLlBvbHlnb25cclxuICAgICAqIEBha2EgUG9seWdvblxyXG4gICAgICovXHJcbiAgICBMLlBvbHlnb24uaW5jbHVkZSh7XHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgaW50ZXJzZWN0cygpOiBib29sZWFuXHJcbiAgICAgICAgLy8gQ2hlY2tzIGEgcG9seWdvbiBmb3IgYW55IGludGVyc2VjdGluZyBsaW5lIHNlZ21lbnRzLiBJZ25vcmVzIGhvbGVzLlxyXG4gICAgICAgIGludGVyc2VjdHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHBvbHlsaW5lSW50ZXJzZWN0cyxcclxuICAgICAgICAgICAgICAgIHBvaW50cyA9IHRoaXMuX2dldFByb2plY3RlZFBvaW50cygpLFxyXG4gICAgICAgICAgICAgICAgbGVuLCBmaXJzdFBvaW50LCBsYXN0UG9pbnQsIG1heEluZGV4O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rvb0Zld1BvaW50c0ZvckludGVyc2VjdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHBvbHlsaW5lSW50ZXJzZWN0cyA9IEwuUG9seWxpbmUucHJvdG90eXBlLmludGVyc2VjdHMuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIGFscmVhZHkgZm91bmQgYW4gaW50ZXJzZWN0aW9uIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGFueSBtb3JlLlxyXG4gICAgICAgICAgICBpZiAocG9seWxpbmVJbnRlcnNlY3RzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGVuID0gcG9pbnRzLmxlbmd0aDtcclxuICAgICAgICAgICAgZmlyc3RQb2ludCA9IHBvaW50c1swXTtcclxuICAgICAgICAgICAgbGFzdFBvaW50ID0gcG9pbnRzW2xlbiAtIDFdO1xyXG4gICAgICAgICAgICBtYXhJbmRleCA9IGxlbiAtIDI7XHJcblxyXG4gICAgICAgICAgICAvLyBDaGVjayB0aGUgbGluZSBzZWdtZW50IGJldHdlZW4gbGFzdCBhbmQgZmlyc3QgcG9pbnQuIERvbid0IG5lZWQgdG8gY2hlY2sgdGhlIGZpcnN0IGxpbmUgc2VnbWVudCAobWluSW5kZXggPSAxKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbGluZVNlZ21lbnRzSW50ZXJzZWN0c1JhbmdlKGxhc3RQb2ludCwgZmlyc3RQb2ludCwgbWF4SW5kZXgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkNvbnRyb2wuRHJhd1xyXG4gICAgICogQGFrYSBMLkRyYXdcclxuICAgICAqL1xyXG4gICAgTC5Db250cm9sLkRyYXcgPSBMLkNvbnRyb2wuZXh0ZW5kKHtcclxuXHJcbiAgICAgICAgLy8gT3B0aW9uc1xyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgcG9zaXRpb246ICd0b3BsZWZ0JyxcclxuICAgICAgICAgICAgZHJhdzoge30sXHJcbiAgICAgICAgICAgIGVkaXQ6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKCk6IHZvaWRcclxuICAgICAgICAvLyBJbml0aWFsaXplcyBkcmF3IGNvbnRyb2wsIHRvb2xiYXJzIGZyb20gdGhlIG9wdGlvbnNcclxuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICBpZiAoTC52ZXJzaW9uIDwgJzAuNycpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTGVhZmxldC5kcmF3IDAuMi4zKyByZXF1aXJlcyBMZWFmbGV0IDAuNy4wKy4gRG93bmxvYWQgbGF0ZXN0IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL0xlYWZsZXQvTGVhZmxldC8nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTC5Db250cm9sLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICB2YXIgdG9vbGJhcjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJzID0ge307XHJcblxyXG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIHRvb2xiYXJzXHJcbiAgICAgICAgICAgIGlmIChMLkRyYXdUb29sYmFyICYmIHRoaXMub3B0aW9ucy5kcmF3KSB7XHJcbiAgICAgICAgICAgICAgICB0b29sYmFyID0gbmV3IEwuRHJhd1Rvb2xiYXIodGhpcy5vcHRpb25zLmRyYXcpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJzW0wuRHJhd1Rvb2xiYXIuVFlQRV0gPSB0b29sYmFyO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIExpc3RlbiBmb3Igd2hlbiB0b29sYmFyIGlzIGVuYWJsZWRcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJzW0wuRHJhd1Rvb2xiYXIuVFlQRV0ub24oJ2VuYWJsZScsIHRoaXMuX3Rvb2xiYXJFbmFibGVkLCB0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKEwuRWRpdFRvb2xiYXIgJiYgdGhpcy5vcHRpb25zLmVkaXQpIHtcclxuICAgICAgICAgICAgICAgIHRvb2xiYXIgPSBuZXcgTC5FZGl0VG9vbGJhcih0aGlzLm9wdGlvbnMuZWRpdCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbGJhcnNbTC5FZGl0VG9vbGJhci5UWVBFXSA9IHRvb2xiYXI7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gTGlzdGVuIGZvciB3aGVuIHRvb2xiYXIgaXMgZW5hYmxlZFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbGJhcnNbTC5FZGl0VG9vbGJhci5UWVBFXS5vbignZW5hYmxlJywgdGhpcy5fdG9vbGJhckVuYWJsZWQsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEwudG9vbGJhciA9IHRoaXM7IC8vc2V0IGdsb2JhbCB2YXIgZm9yIGVkaXRpbmcgdGhlIHRvb2xiYXJcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIG9uQWRkKCk6IGNvbnRhaW5lclxyXG4gICAgICAgIC8vIEFkZHMgdGhlIHRvb2xiYXIgY29udGFpbmVyIHRvIHRoZSBtYXBcclxuICAgICAgICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xyXG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2xlYWZsZXQtZHJhdycpLFxyXG4gICAgICAgICAgICAgICAgYWRkZWRUb3BDbGFzcyA9IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdG9wQ2xhc3NOYW1lID0gJ2xlYWZsZXQtZHJhdy10b29sYmFyLXRvcCcsXHJcbiAgICAgICAgICAgICAgICB0b29sYmFyQ29udGFpbmVyO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgdG9vbGJhcklkIGluIHRoaXMuX3Rvb2xiYXJzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdG9vbGJhcnMuaGFzT3duUHJvcGVydHkodG9vbGJhcklkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvb2xiYXJDb250YWluZXIgPSB0aGlzLl90b29sYmFyc1t0b29sYmFySWRdLmFkZFRvb2xiYXIobWFwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2xiYXJDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGNsYXNzIHRvIHRoZSBmaXJzdCB0b29sYmFyIHRvIHJlbW92ZSB0aGUgbWFyZ2luXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWRkZWRUb3BDbGFzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFMLkRvbVV0aWwuaGFzQ2xhc3ModG9vbGJhckNvbnRhaW5lciwgdG9wQ2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyh0b29sYmFyQ29udGFpbmVyLmNoaWxkTm9kZXNbMF0sIHRvcENsYXNzTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZFRvcENsYXNzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRvb2xiYXJDb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIG9uUmVtb3ZlKCk6IHZvaWRcclxuICAgICAgICAvLyBSZW1vdmVzIHRoZSB0b29sYmFycyBmcm9tIHRoZSBtYXAgdG9vbGJhciBjb250YWluZXJcclxuICAgICAgICBvblJlbW92ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciB0b29sYmFySWQgaW4gdGhpcy5fdG9vbGJhcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b29sYmFycy5oYXNPd25Qcm9wZXJ0eSh0b29sYmFySWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdG9vbGJhcnNbdG9vbGJhcklkXS5yZW1vdmVUb29sYmFyKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHNldERyYXdpbmdPcHRpb25zKG9wdGlvbnMpOiB2b2lkXHJcbiAgICAgICAgLy8gU2V0cyBvcHRpb25zIHRvIGFsbCB0b29sYmFyIGluc3RhbmNlc1xyXG4gICAgICAgIHNldERyYXdpbmdPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICBmb3IgKHZhciB0b29sYmFySWQgaW4gdGhpcy5fdG9vbGJhcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b29sYmFyc1t0b29sYmFySWRdIGluc3RhbmNlb2YgTC5EcmF3VG9vbGJhcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJzW3Rvb2xiYXJJZF0uc2V0T3B0aW9ucyhvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF90b29sYmFyRW5hYmxlZDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdmFyIGVuYWJsZWRUb29sYmFyID0gZS50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciB0b29sYmFySWQgaW4gdGhpcy5fdG9vbGJhcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b29sYmFyc1t0b29sYmFySWRdICE9PSBlbmFibGVkVG9vbGJhcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJzW3Rvb2xiYXJJZF0uZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgTC5NYXAubWVyZ2VPcHRpb25zKHtcclxuICAgICAgICBkcmF3Q29udHJvbFRvb2x0aXBzOiB0cnVlLFxyXG4gICAgICAgIGRyYXdDb250cm9sOiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgTC5NYXAuYWRkSW5pdEhvb2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZHJhd0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgdGhpcy5kcmF3Q29udHJvbCA9IG5ldyBMLkNvbnRyb2wuRHJhdygpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZENvbnRyb2wodGhpcy5kcmF3Q29udHJvbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuRHJhdy5Ub29sYmFyXHJcbiAgICAgKiBAYWthIFRvb2xiYXJcclxuICAgICAqXHJcbiAgICAgKiBUaGUgdG9vbGJhciBjbGFzcyBvZiB0aGUgQVBJIOKAlCBpdCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdWlcclxuICAgICAqIFRoaXMgd2lsbCBiZSBkZXByZWNpYXRlZFxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKlxyXG4gICAgICogYGBganNcclxuICAgICAqICAgIHZhciB0b29sYmFyID0gTC5Ub29sYmFyKCk7XHJcbiAgICAgKiAgICB0b29sYmFyLmFkZFRvb2xiYXIobWFwKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqICMjIyBEaXNhYmxpbmcgYSB0b29sYmFyXHJcbiAgICAgKlxyXG4gICAgICogSWYgeW91IGRvIG5vdCB3YW50IGEgcGFydGljdWxhciB0b29sYmFyIGluIHlvdXIgYXBwIHlvdSBjYW4gdHVybiBpdCBvZmYgYnkgc2V0dGluZyB0aGUgdG9vbGJhciB0byBmYWxzZS5cclxuICAgICAqXHJcbiAgICAgKiBgYGBqc1xyXG4gICAgICogICAgICB2YXIgZHJhd0NvbnRyb2wgPSBuZXcgTC5Db250cm9sLkRyYXcoe1xyXG4gKiAgICAgICAgICBkcmF3OiBmYWxzZSxcclxuICogICAgICAgICAgZWRpdDoge1xyXG4gKiAgICAgICAgICAgICAgZmVhdHVyZUdyb3VwOiBlZGl0YWJsZUxheWVyc1xyXG4gKiAgICAgICAgICB9XHJcbiAqICAgICAgfSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiAjIyMgRGlzYWJsaW5nIGEgdG9vbGJhciBpdGVtXHJcbiAgICAgKlxyXG4gICAgICogSWYgeW91IHdhbnQgdG8gdHVybiBvZmYgYSBwYXJ0aWN1bGFyIHRvb2xiYXIgaXRlbSwgc2V0IGl0IHRvIGZhbHNlLiBUaGUgZm9sbG93aW5nIGRpc2FibGVzIGRyYXdpbmcgcG9seWdvbnMgYW5kXHJcbiAgICAgKiBtYXJrZXJzLiBJdCBhbHNvIHR1cm5zIG9mZiB0aGUgYWJpbGl0eSB0byBlZGl0IGxheWVycy5cclxuICAgICAqXHJcbiAgICAgKiBgYGBqc1xyXG4gICAgICogICAgICB2YXIgZHJhd0NvbnRyb2wgPSBuZXcgTC5Db250cm9sLkRyYXcoe1xyXG4gKiAgICAgICAgICBkcmF3OiB7XHJcbiAqICAgICAgICAgICAgICBwb2x5Z29uOiBmYWxzZSxcclxuICogICAgICAgICAgICAgIG1hcmtlcjogZmFsc2VcclxuICogICAgICAgICAgfSxcclxuICogICAgICAgICAgZWRpdDoge1xyXG4gKiAgICAgICAgICAgICAgZmVhdHVyZUdyb3VwOiBlZGl0YWJsZUxheWVycyxcclxuICogICAgICAgICAgICAgIGVkaXQ6IGZhbHNlXHJcbiAqICAgICAgICAgIH1cclxuICogICAgICB9KTtcclxuICAgICAqIGBgYFxyXG4gICAgICovXHJcbiAgICBMLlRvb2xiYXIgPSBMLkNsYXNzLmV4dGVuZCh7XHJcbiAgICAgICAgaW5jbHVkZXM6IFtMLk1peGluLkV2ZW50c10sXHJcblxyXG4gICAgICAgIC8vIEBzZWN0aW9uIE1ldGhvZHMgZm9yIG1vZGlmeWluZyB0aGUgdG9vbGJhclxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGluaXRpYWxpemUob3B0aW9ucyk6IHZvaWRcclxuICAgICAgICAvLyBUb29sYmFyIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgTC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbW9kZXMgPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aW9uQnV0dG9ucyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVNb2RlID0gbnVsbDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGVuYWJsZWQoKTogYm9vbGVhblxyXG4gICAgICAgIC8vIEdldHMgYSB0cnVlL2ZhbHNlIG9mIHdoZXRoZXIgdGhlIHRvb2xiYXIgaXMgZW5hYmxlZFxyXG4gICAgICAgIGVuYWJsZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZU1vZGUgIT09IG51bGw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBkaXNhYmxlKCk6IHZvaWRcclxuICAgICAgICAvLyBEaXNhYmxlcyB0aGUgdG9vbGJhclxyXG4gICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmVuYWJsZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVNb2RlLmhhbmRsZXIuZGlzYWJsZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgYWRkVG9vbGJhcihtYXApOiBMLkRvbVV0aWxcclxuICAgICAgICAvLyBBZGRzIHRoZSB0b29sYmFyIHRvIHRoZSBtYXAgYW5kIHJldHVybnMgdGhlIHRvb2xiYXIgZG9tIGVsZW1lbnRcclxuICAgICAgICBhZGRUb29sYmFyOiBmdW5jdGlvbiAobWFwKSB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnLCAnbGVhZmxldC1kcmF3LXNlY3Rpb24nKSxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkluZGV4ID0gMCxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNsYXNzUHJlZml4ID0gdGhpcy5fdG9vbGJhckNsYXNzIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgbW9kZUhhbmRsZXJzID0gdGhpcy5nZXRNb2RlSGFuZGxlcnMobWFwKSxcclxuICAgICAgICAgICAgICAgIGk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl90b29sYmFyQ29udGFpbmVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2xlYWZsZXQtZHJhdy10b29sYmFyIGxlYWZsZXQtYmFyJyk7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcCA9IG1hcDtcclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb2RlSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChtb2RlSGFuZGxlcnNbaV0uZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRNb2RlSGFuZGxlcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZUhhbmRsZXJzW2ldLmhhbmRsZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJDb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkluZGV4KyssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNsYXNzUHJlZml4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlSGFuZGxlcnNbaV0udGl0bGVcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBpZiBubyBidXR0b25zIHdlcmUgYWRkZWQsIGRvIG5vdCBhZGQgdGhlIHRvb2xiYXJcclxuICAgICAgICAgICAgaWYgKCFidXR0b25JbmRleCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTYXZlIGJ1dHRvbiBpbmRleCBvZiB0aGUgbGFzdCBidXR0b24sIC0xIGFzIHdlIHdvdWxkIGhhdmUgKysgYWZ0ZXIgdGhlIGxhc3QgYnV0dG9uXHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RCdXR0b25JbmRleCA9IC0tYnV0dG9uSW5kZXg7XHJcblxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgZW1wdHkgYWN0aW9ucyBwYXJ0IG9mIHRoZSB0b29sYmFyXHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGlvbnNDb250YWluZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCd1bCcsICdsZWFmbGV0LWRyYXctYWN0aW9ucycpO1xyXG5cclxuICAgICAgICAgICAgLy8gQWRkIGRyYXcgYW5kIGNhbmNlbCBjb250YWluZXJzIHRvIHRoZSBjb250cm9sIGNvbnRhaW5lclxyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fdG9vbGJhckNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9hY3Rpb25zQ29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCByZW1vdmVUb29sYmFyKCk6IHZvaWRcclxuICAgICAgICAvLyBSZW1vdmVzIHRoZSB0b29sYmFyIGFuZCBkcm9wcyB0aGUgaGFuZGxlciBldmVudCBsaXN0ZW5lcnNcclxuICAgICAgICByZW1vdmVUb29sYmFyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIERpc3Bvc2UgZWFjaCBoYW5kbGVyXHJcbiAgICAgICAgICAgIGZvciAodmFyIGhhbmRsZXJJZCBpbiB0aGlzLl9tb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21vZGVzLmhhc093blByb3BlcnR5KGhhbmRsZXJJZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBVbmJpbmQgaGFuZGxlciBidXR0b25cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwb3NlQnV0dG9uKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2Rlc1toYW5kbGVySWRdLmJ1dHRvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZXNbaGFuZGxlcklkXS5oYW5kbGVyLmVuYWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZXNbaGFuZGxlcklkXS5oYW5kbGVyXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGlzIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZXNbaGFuZGxlcklkXS5oYW5kbGVyLmRpc2FibGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVW5iaW5kIGhhbmRsZXJcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2Rlc1toYW5kbGVySWRdLmhhbmRsZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgLm9mZignZW5hYmxlZCcsIHRoaXMuX2hhbmRsZXJBY3RpdmF0ZWQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vZmYoJ2Rpc2FibGVkJywgdGhpcy5faGFuZGxlckRlYWN0aXZhdGVkLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9tb2RlcyA9IHt9O1xyXG5cclxuICAgICAgICAgICAgLy8gRGlzcG9zZSB0aGUgYWN0aW9ucyB0b29sYmFyXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5fYWN0aW9uQnV0dG9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2VCdXR0b24oXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWN0aW9uQnV0dG9uc1tpXS5idXR0b24sXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWN0aW9uQnV0dG9uc1tpXS5jYWxsYmFjayxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGlvbkJ1dHRvbnMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aW9uc0NvbnRhaW5lciA9IG51bGw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2luaXRNb2RlSGFuZGxlcjogZnVuY3Rpb24gKGhhbmRsZXIsIGNvbnRhaW5lciwgYnV0dG9uSW5kZXgsIGNsYXNzTmFtZVByZWRpeCwgYnV0dG9uVGl0bGUpIHtcclxuICAgICAgICAgICAgdmFyIHR5cGUgPSBoYW5kbGVyLnR5cGU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tb2Rlc1t0eXBlXSA9IHt9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbW9kZXNbdHlwZV0uaGFuZGxlciA9IGhhbmRsZXI7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tb2Rlc1t0eXBlXS5idXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBidXR0b25UaXRsZSxcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lUHJlZGl4ICsgJy0nICsgdHlwZSxcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuX21vZGVzW3R5cGVdLmhhbmRsZXIuZW5hYmxlLFxyXG4gICAgICAgICAgICAgICAgY29udGV4dDogdGhpcy5fbW9kZXNbdHlwZV0uaGFuZGxlclxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21vZGVzW3R5cGVdLmJ1dHRvbkluZGV4ID0gYnV0dG9uSW5kZXg7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tb2Rlc1t0eXBlXS5oYW5kbGVyXHJcbiAgICAgICAgICAgICAgICAub24oJ2VuYWJsZWQnLCB0aGlzLl9oYW5kbGVyQWN0aXZhdGVkLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9uKCdkaXNhYmxlZCcsIHRoaXMuX2hhbmRsZXJEZWFjdGl2YXRlZCwgdGhpcyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyogRGV0ZWN0IGlPUyBiYXNlZCBvbiBicm93c2VyIFVzZXIgQWdlbnQsIGJhc2VkIG9uOlxyXG5cdCAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzkwMzk4ODUgKi9cclxuICAgICAgICBfZGV0ZWN0SU9TOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBpT1MgPSAoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgIXdpbmRvdy5NU1N0cmVhbSk7XHJcbiAgICAgICAgICAgIHJldHVybiBpT1M7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NyZWF0ZUJ1dHRvbjogZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBsaW5rID0gTC5Eb21VdGlsLmNyZWF0ZSgnYScsIG9wdGlvbnMuY2xhc3NOYW1lIHx8ICcnLCBvcHRpb25zLmNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIC8vIFNjcmVlbiByZWFkZXIgdGFnXHJcbiAgICAgICAgICAgIHZhciBzciA9IEwuRG9tVXRpbC5jcmVhdGUoJ3NwYW4nLCAnc3Itb25seScsIG9wdGlvbnMuY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgIGxpbmsuaHJlZiA9ICcjJztcclxuICAgICAgICAgICAgbGluay5hcHBlbmRDaGlsZChzcik7XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50aXRsZSkge1xyXG4gICAgICAgICAgICAgICAgbGluay50aXRsZSA9IG9wdGlvbnMudGl0bGU7XHJcbiAgICAgICAgICAgICAgICBzci5pbm5lckhUTUwgPSBvcHRpb25zLnRpdGxlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBsaW5rLmlubmVySFRNTCA9IG9wdGlvbnMudGV4dDtcclxuICAgICAgICAgICAgICAgIHNyLmlubmVySFRNTCA9IG9wdGlvbnMudGV4dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogaU9TIGRvZXMgbm90IHVzZSBjbGljayBldmVudHMgKi9cclxuICAgICAgICAgICAgdmFyIGJ1dHRvbkV2ZW50ID0gdGhpcy5fZGV0ZWN0SU9TKCkgPyAndG91Y2hzdGFydCcgOiAnY2xpY2snO1xyXG5cclxuICAgICAgICAgICAgTC5Eb21FdmVudFxyXG4gICAgICAgICAgICAgICAgLm9uKGxpbmssICdjbGljaycsIEwuRG9tRXZlbnQuc3RvcFByb3BhZ2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgLm9uKGxpbmssICdtb3VzZWRvd24nLCBMLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbilcclxuICAgICAgICAgICAgICAgIC5vbihsaW5rLCAnZGJsY2xpY2snLCBMLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbilcclxuICAgICAgICAgICAgICAgIC5vbihsaW5rLCAndG91Y2hzdGFydCcsIEwuRG9tRXZlbnQuc3RvcFByb3BhZ2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgLm9uKGxpbmssICdjbGljaycsIEwuRG9tRXZlbnQucHJldmVudERlZmF1bHQpXHJcbiAgICAgICAgICAgICAgICAub24obGluaywgYnV0dG9uRXZlbnQsIG9wdGlvbnMuY2FsbGJhY2ssIG9wdGlvbnMuY29udGV4dCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbGluaztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZGlzcG9zZUJ1dHRvbjogZnVuY3Rpb24gKGJ1dHRvbiwgY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgLyogaU9TIGRvZXMgbm90IHVzZSBjbGljayBldmVudHMgKi9cclxuICAgICAgICAgICAgdmFyIGJ1dHRvbkV2ZW50ID0gdGhpcy5fZGV0ZWN0SU9TKCkgPyAndG91Y2hzdGFydCcgOiAnY2xpY2snO1xyXG5cclxuICAgICAgICAgICAgTC5Eb21FdmVudFxyXG4gICAgICAgICAgICAgICAgLm9mZihidXR0b24sICdjbGljaycsIEwuRG9tRXZlbnQuc3RvcFByb3BhZ2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgLm9mZihidXR0b24sICdtb3VzZWRvd24nLCBMLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbilcclxuICAgICAgICAgICAgICAgIC5vZmYoYnV0dG9uLCAnZGJsY2xpY2snLCBMLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbilcclxuICAgICAgICAgICAgICAgIC5vZmYoYnV0dG9uLCAndG91Y2hzdGFydCcsIEwuRG9tRXZlbnQuc3RvcFByb3BhZ2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgLm9mZihidXR0b24sICdjbGljaycsIEwuRG9tRXZlbnQucHJldmVudERlZmF1bHQpXHJcbiAgICAgICAgICAgICAgICAub2ZmKGJ1dHRvbiwgYnV0dG9uRXZlbnQsIGNhbGxiYWNrKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfaGFuZGxlckFjdGl2YXRlZDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgLy8gRGlzYWJsZSBhY3RpdmUgbW9kZSAoaWYgcHJlc2VudClcclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBDYWNoZSBuZXcgYWN0aXZlIGZlYXR1cmVcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlTW9kZSA9IHRoaXMuX21vZGVzW2UuaGFuZGxlcl07XHJcblxyXG4gICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fYWN0aXZlTW9kZS5idXR0b24sICdsZWFmbGV0LWRyYXctdG9vbGJhci1idXR0b24tZW5hYmxlZCcpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fc2hvd0FjdGlvbnNUb29sYmFyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2VuYWJsZScpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9oYW5kbGVyRGVhY3RpdmF0ZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5faGlkZUFjdGlvbnNUb29sYmFyKCk7XHJcblxyXG4gICAgICAgICAgICBMLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5fYWN0aXZlTW9kZS5idXR0b24sICdsZWFmbGV0LWRyYXctdG9vbGJhci1idXR0b24tZW5hYmxlZCcpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlTW9kZSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Rpc2FibGUnKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfY3JlYXRlQWN0aW9uczogZnVuY3Rpb24gKGhhbmRsZXIpIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2FjdGlvbnNDb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICBidXR0b25zID0gdGhpcy5nZXRBY3Rpb25zKGhhbmRsZXIpLFxyXG4gICAgICAgICAgICAgICAgbCA9IGJ1dHRvbnMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgbGksIGRpLCBkbCwgYnV0dG9uO1xyXG5cclxuICAgICAgICAgICAgLy8gRGlzcG9zZSB0aGUgYWN0aW9ucyB0b29sYmFyICh0b2RvOiBkaXNwb3NlIG9ubHkgbm90IHVzZWQgYnV0dG9ucylcclxuICAgICAgICAgICAgZm9yIChkaSA9IDAsIGRsID0gdGhpcy5fYWN0aW9uQnV0dG9ucy5sZW5ndGg7IGRpIDwgZGw7IGRpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2VCdXR0b24odGhpcy5fYWN0aW9uQnV0dG9uc1tkaV0uYnV0dG9uLCB0aGlzLl9hY3Rpb25CdXR0b25zW2RpXS5jYWxsYmFjayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fYWN0aW9uQnV0dG9ucyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBvbGQgYnV0dG9uc1xyXG4gICAgICAgICAgICB3aGlsZSAoY29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjb250YWluZXIuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoJ2VuYWJsZWQnIGluIGJ1dHRvbnNbaV0gJiYgIWJ1dHRvbnNbaV0uZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxpID0gTC5Eb21VdGlsLmNyZWF0ZSgnbGknLCAnJywgY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICBidXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBidXR0b25zW2ldLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGJ1dHRvbnNbaV0udGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IGxpLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBidXR0b25zW2ldLmNhbGxiYWNrLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGJ1dHRvbnNbaV0uY29udGV4dFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aW9uQnV0dG9ucy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b246IGJ1dHRvbixcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogYnV0dG9uc1tpXS5jYWxsYmFja1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfc2hvd0FjdGlvbnNUb29sYmFyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBidXR0b25JbmRleCA9IHRoaXMuX2FjdGl2ZU1vZGUuYnV0dG9uSW5kZXgsXHJcbiAgICAgICAgICAgICAgICBsYXN0QnV0dG9uSW5kZXggPSB0aGlzLl9sYXN0QnV0dG9uSW5kZXgsXHJcbiAgICAgICAgICAgICAgICB0b29sYmFyUG9zaXRpb24gPSB0aGlzLl9hY3RpdmVNb2RlLmJ1dHRvbi5vZmZzZXRUb3AgLSAxO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVjcmVhdGUgYWN0aW9uIGJ1dHRvbnMgb24gZXZlcnkgY2xpY2tcclxuICAgICAgICAgICAgdGhpcy5fY3JlYXRlQWN0aW9ucyh0aGlzLl9hY3RpdmVNb2RlLmhhbmRsZXIpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ29ycmVjdGx5IHBvc2l0aW9uIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGlvbnNDb250YWluZXIuc3R5bGUudG9wID0gdG9vbGJhclBvc2l0aW9uICsgJ3B4JztcclxuXHJcbiAgICAgICAgICAgIGlmIChidXR0b25JbmRleCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX3Rvb2xiYXJDb250YWluZXIsICdsZWFmbGV0LWRyYXctdG9vbGJhci1ub3RvcCcpO1xyXG4gICAgICAgICAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2FjdGlvbnNDb250YWluZXIsICdsZWFmbGV0LWRyYXctYWN0aW9ucy10b3AnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGJ1dHRvbkluZGV4ID09PSBsYXN0QnV0dG9uSW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl90b29sYmFyQ29udGFpbmVyLCAnbGVhZmxldC1kcmF3LXRvb2xiYXItbm9ib3R0b20nKTtcclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl9hY3Rpb25zQ29udGFpbmVyLCAnbGVhZmxldC1kcmF3LWFjdGlvbnMtYm90dG9tJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGlvbnNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2hpZGVBY3Rpb25zVG9vbGJhcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9hY3Rpb25zQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgICAgICAgICBMLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5fdG9vbGJhckNvbnRhaW5lciwgJ2xlYWZsZXQtZHJhdy10b29sYmFyLW5vdG9wJyk7XHJcbiAgICAgICAgICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl90b29sYmFyQ29udGFpbmVyLCAnbGVhZmxldC1kcmF3LXRvb2xiYXItbm9ib3R0b20nKTtcclxuICAgICAgICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX2FjdGlvbnNDb250YWluZXIsICdsZWFmbGV0LWRyYXctYWN0aW9ucy10b3AnKTtcclxuICAgICAgICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX2FjdGlvbnNDb250YWluZXIsICdsZWFmbGV0LWRyYXctYWN0aW9ucy1ib3R0b20nKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgTC5EcmF3ID0gTC5EcmF3IHx8IHt9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5EcmF3LlRvb2x0aXBcclxuICAgICAqIEBha2EgVG9vbHRpcFxyXG4gICAgICpcclxuICAgICAqIFRoZSB0b29sdGlwIGNsYXNzIOKAlCBpdCBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIHRvb2x0aXAgd2hpbGUgZHJhd2luZ1xyXG4gICAgICogVGhpcyB3aWxsIGJlIGRlcHJlY2lhdGVkXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqXHJcbiAgICAgKiBgYGBqc1xyXG4gICAgICogICAgdmFyIHRvb2x0aXAgPSBMLkRyYXcuVG9vbHRpcCgpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuVG9vbHRpcCA9IEwuQ2xhc3MuZXh0ZW5kKHtcclxuXHJcbiAgICAgICAgLy8gQHNlY3Rpb24gTWV0aG9kcyBmb3IgbW9kaWZ5aW5nIGRyYXcgc3RhdGVcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKG1hcCk6IHZvaWRcclxuICAgICAgICAvLyBUb29sdGlwIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG1hcCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwUGFuZSA9IG1hcC5fcGFuZXMucG9wdXBQYW5lO1xyXG4gICAgICAgICAgICB0aGlzLl92aXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBtYXAub3B0aW9ucy5kcmF3Q29udHJvbFRvb2x0aXBzID9cclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5jcmVhdGUoJ2RpdicsICdsZWFmbGV0LWRyYXctdG9vbHRpcCcsIHRoaXMuX3BvcHVwUGFuZSkgOiBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLl9zaW5nbGVMaW5lTGFiZWwgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW91c2VvdXQnLCB0aGlzLl9vbk1vdXNlT3V0LCB0aGlzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGRpc3Bvc2UoKTogdm9pZFxyXG4gICAgICAgIC8vIFJlbW92ZSBUb29sdGlwIERPTSBhbmQgdW5iaW5kIGV2ZW50c1xyXG4gICAgICAgIGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW91c2VvdXQnLCB0aGlzLl9vbk1vdXNlT3V0LCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BvcHVwUGFuZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgdXBkYXRlQ29udGVudChsYWJlbFRleHQpOiB0aGlzXHJcbiAgICAgICAgLy8gQ2hhbmdlcyB0aGUgdG9vbHRpcCB0ZXh0IHRvIHN0cmluZyBpbiBmdW5jdGlvbiBjYWxsXHJcbiAgICAgICAgdXBkYXRlQ29udGVudDogZnVuY3Rpb24gKGxhYmVsVGV4dCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGFiZWxUZXh0LnN1YnRleHQgPSBsYWJlbFRleHQuc3VidGV4dCB8fCAnJztcclxuXHJcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgdmVydGljYWwgcG9zaXRpb24gKG9ubHkgaWYgY2hhbmdlZClcclxuICAgICAgICAgICAgaWYgKGxhYmVsVGV4dC5zdWJ0ZXh0Lmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5fc2luZ2xlTGluZUxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fY29udGFpbmVyLCAnbGVhZmxldC1kcmF3LXRvb2x0aXAtc2luZ2xlJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaW5nbGVMaW5lTGFiZWwgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxhYmVsVGV4dC5zdWJ0ZXh0Lmxlbmd0aCA+IDAgJiYgdGhpcy5fc2luZ2xlTGluZUxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICBMLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5fY29udGFpbmVyLCAnbGVhZmxldC1kcmF3LXRvb2x0aXAtc2luZ2xlJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaW5nbGVMaW5lTGFiZWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmlubmVySFRNTCA9XHJcbiAgICAgICAgICAgICAgICAobGFiZWxUZXh0LnN1YnRleHQubGVuZ3RoID4gMCA/XHJcbiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwibGVhZmxldC1kcmF3LXRvb2x0aXAtc3VidGV4dFwiPicgKyBsYWJlbFRleHQuc3VidGV4dCArICc8L3NwYW4+JyArICc8YnIgLz4nIDogJycpICtcclxuICAgICAgICAgICAgICAgICc8c3Bhbj4nICsgbGFiZWxUZXh0LnRleHQgKyAnPC9zcGFuPic7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWxhYmVsVGV4dC50ZXh0ICYmICFsYWJlbFRleHQuc3VidGV4dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Zpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaW5oZXJpdCc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgdXBkYXRlUG9zaXRpb24obGF0bG5nKTogdGhpc1xyXG4gICAgICAgIC8vIENoYW5nZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSB0b29sdGlwXHJcbiAgICAgICAgdXBkYXRlUG9zaXRpb246IGZ1bmN0aW9uIChsYXRsbmcpIHtcclxuICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQobGF0bG5nKSxcclxuICAgICAgICAgICAgICAgIHRvb2x0aXBDb250YWluZXIgPSB0aGlzLl9jb250YWluZXI7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBDb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdpbmhlcml0JztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5zZXRQb3NpdGlvbih0b29sdGlwQ29udGFpbmVyLCBwb3MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHNob3dBc0Vycm9yKCk6IHRoaXNcclxuICAgICAgICAvLyBBcHBsaWVzIGVycm9yIGNsYXNzIHRvIHRvb2x0aXBcclxuICAgICAgICBzaG93QXNFcnJvcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fY29udGFpbmVyLCAnbGVhZmxldC1lcnJvci1kcmF3LXRvb2x0aXAnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHJlbW92ZUVycm9yKCk6IHRoaXNcclxuICAgICAgICAvLyBSZW1vdmVzIHRoZSBlcnJvciBjbGFzcyBmcm9tIHRoZSB0b29sdGlwXHJcbiAgICAgICAgcmVtb3ZlRXJyb3I6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX2NvbnRhaW5lciwgJ2xlYWZsZXQtZXJyb3ItZHJhdy10b29sdGlwJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uTW91c2VPdXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkRyYXdUb29sYmFyXHJcbiAgICAgKiBAYWthIFRvb2xiYXJcclxuICAgICAqL1xyXG4gICAgTC5EcmF3VG9vbGJhciA9IEwuVG9vbGJhci5leHRlbmQoe1xyXG5cclxuICAgICAgICBzdGF0aWNzOiB7XHJcbiAgICAgICAgICAgIFRZUEU6ICdkcmF3J1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgcG9seWxpbmU6IHt9LFxyXG4gICAgICAgICAgICBwb2x5Z29uOiB7fSxcclxuICAgICAgICAgICAgcmVjdGFuZ2xlOiB7fSxcclxuICAgICAgICAgICAgY2lyY2xlOiB7fSxcclxuICAgICAgICAgICAgbWFya2VyOiB7fSxcclxuICAgICAgICAgICAgY2lyY2xlbWFya2VyOiB7fVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgaW5pdGlhbGl6ZSgpOiB2b2lkXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIG9wdGlvbnMgYXJlIG1lcmdlZCBjb3JyZWN0bHkgc2luY2UgTC5leHRlbmQgaXMgb25seSBzaGFsbG93XHJcbiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KHR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNbdHlwZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1t0eXBlXSA9IEwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnNbdHlwZV0sIG9wdGlvbnNbdHlwZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fdG9vbGJhckNsYXNzID0gJ2xlYWZsZXQtZHJhdy1kcmF3JztcclxuICAgICAgICAgICAgTC5Ub29sYmFyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBnZXRNb2RlSGFuZGxlcnMoKTogb2JqZWN0XHJcbiAgICAgICAgLy8gR2V0IG1vZGUgaGFuZGxlcnMgaW5mb3JtYXRpb25cclxuICAgICAgICBnZXRNb2RlSGFuZGxlcnM6IGZ1bmN0aW9uIChtYXApIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLm9wdGlvbnMucG9seWxpbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogbmV3IEwuRHJhdy5Qb2x5bGluZShtYXAsIHRoaXMub3B0aW9ucy5wb2x5bGluZSksXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci5idXR0b25zLnBvbHlsaW5lXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMub3B0aW9ucy5wb2x5Z29uLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IG5ldyBMLkRyYXcuUG9seWdvbihtYXAsIHRoaXMub3B0aW9ucy5wb2x5Z29uKSxcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogTC5kcmF3TG9jYWwuZHJhdy50b29sYmFyLmJ1dHRvbnMucG9seWdvblxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLm9wdGlvbnMucmVjdGFuZ2xlLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IG5ldyBMLkRyYXcuUmVjdGFuZ2xlKG1hcCwgdGhpcy5vcHRpb25zLnJlY3RhbmdsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci5idXR0b25zLnJlY3RhbmdsZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLm9wdGlvbnMuY2lyY2xlLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IG5ldyBMLkRyYXcuQ2lyY2xlKG1hcCwgdGhpcy5vcHRpb25zLmNpcmNsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci5idXR0b25zLmNpcmNsZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLm9wdGlvbnMubWFya2VyLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IG5ldyBMLkRyYXcuTWFya2VyKG1hcCwgdGhpcy5vcHRpb25zLm1hcmtlciksXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci5idXR0b25zLm1hcmtlclxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLm9wdGlvbnMuY2lyY2xlbWFya2VyLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IG5ldyBMLkRyYXcuQ2lyY2xlTWFya2VyKG1hcCwgdGhpcy5vcHRpb25zLmNpcmNsZW1hcmtlciksXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci5idXR0b25zLmNpcmNsZW1hcmtlclxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgZ2V0QWN0aW9ucygpOiBvYmplY3RcclxuICAgICAgICAvLyBHZXQgYWN0aW9uIGluZm9ybWF0aW9uXHJcbiAgICAgICAgZ2V0QWN0aW9uczogZnVuY3Rpb24gKGhhbmRsZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgIC8vIHtcclxuICAgICAgICAgICAgICAgIC8vICAgICBlbmFibGVkOiBoYW5kbGVyLmNvbXBsZXRlU2hhcGUsXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdGl0bGU6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci5maW5pc2gudGl0bGUsXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdGV4dDogTC5kcmF3TG9jYWwuZHJhdy50b29sYmFyLmZpbmlzaC50ZXh0LFxyXG4gICAgICAgICAgICAgICAgLy8gICAgIGNhbGxiYWNrOiBoYW5kbGVyLmNvbXBsZXRlU2hhcGUsXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgY29udGV4dDogaGFuZGxlclxyXG4gICAgICAgICAgICAgICAgLy8gfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBoYW5kbGVyLmRlbGV0ZUxhc3RWZXJ0ZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci51bmRvLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci51bmRvLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGhhbmRsZXIuZGVsZXRlTGFzdFZlcnRleCxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBMLmRyYXdMb2NhbC5kcmF3LnRvb2xiYXIuYWN0aW9ucy50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBMLmRyYXdMb2NhbC5kcmF3LnRvb2xiYXIuYWN0aW9ucy50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLmRpc2FibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpc1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2Qgc2V0T3B0aW9ucygpOiB2b2lkXHJcbiAgICAgICAgLy8gU2V0cyB0aGUgb3B0aW9ucyB0byB0aGUgdG9vbGJhclxyXG4gICAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5fbW9kZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tb2Rlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KHR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZXNbdHlwZV0uaGFuZGxlci5zZXRPcHRpb25zKG9wdGlvbnNbdHlwZV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8qTC5NYXAubWVyZ2VPcHRpb25zKHtcclxuIGVkaXRDb250cm9sOiB0cnVlXHJcbiB9KTsqL1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5FZGl0VG9vbGJhclxyXG4gICAgICogQGFrYSBFZGl0VG9vbGJhclxyXG4gICAgICovXHJcbiAgICBMLkVkaXRUb29sYmFyID0gTC5Ub29sYmFyLmV4dGVuZCh7XHJcbiAgICAgICAgc3RhdGljczoge1xyXG4gICAgICAgICAgICBUWVBFOiAnZWRpdCdcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGVkaXQ6IHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkUGF0aE9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBkYXNoQXJyYXk6ICcxMCwgMTAnLFxyXG5cclxuICAgICAgICAgICAgICAgICAgICBmaWxsOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJyNmZTU3YTEnLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAwLjEsXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZXRoZXIgdG8gdXNlciB0aGUgZXhpc3RpbmcgbGF5ZXJzIGNvbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgbWFpbnRhaW5Db2xvcjogZmFsc2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcmVtb3ZlOiB7fSxcclxuICAgICAgICAgICAgcG9seTogbnVsbCxcclxuICAgICAgICAgICAgZmVhdHVyZUdyb3VwOiBudWxsIC8qIFJFUVVJUkVEISBUT0RPOiBwZXJoYXBzIGlmIG5vdCBzZXQgdGhlbiBhbGwgbGF5ZXJzIG9uIHRoZSBtYXAgYXJlIHNlbGVjdGFibGU/ICovXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbnRpYWxpemUoKTogdm9pZFxyXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIE5lZWQgdG8gc2V0IHRoaXMgbWFudWFsbHkgc2luY2UgbnVsbCBpcyBhbiBhY2NlcHRhYmxlIHZhbHVlIGhlcmVcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZWRpdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmVkaXQuc2VsZWN0ZWRQYXRoT3B0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmVkaXQuc2VsZWN0ZWRQYXRoT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5lZGl0LnNlbGVjdGVkUGF0aE9wdGlvbnM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLmVkaXQuc2VsZWN0ZWRQYXRoT3B0aW9ucyA9IEwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMuZWRpdC5zZWxlY3RlZFBhdGhPcHRpb25zLCBvcHRpb25zLmVkaXQuc2VsZWN0ZWRQYXRoT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbW92ZSkge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5yZW1vdmUgPSBMLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLnJlbW92ZSwgb3B0aW9ucy5yZW1vdmUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5wb2x5KSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLnBvbHkgPSBMLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLnBvbHksIG9wdGlvbnMucG9seSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJDbGFzcyA9ICdsZWFmbGV0LWRyYXctZWRpdCc7XHJcbiAgICAgICAgICAgIEwuVG9vbGJhci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRGZWF0dXJlQ291bnQgPSAwO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgZ2V0TW9kZUhhbmRsZXJzKCk6IG9iamVjdFxyXG4gICAgICAgIC8vIEdldCBtb2RlIGhhbmRsZXJzIGluZm9ybWF0aW9uXHJcbiAgICAgICAgZ2V0TW9kZUhhbmRsZXJzOiBmdW5jdGlvbiAobWFwKSB7XHJcbiAgICAgICAgICAgIHZhciBmZWF0dXJlR3JvdXAgPSB0aGlzLm9wdGlvbnMuZmVhdHVyZUdyb3VwO1xyXG4gICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMub3B0aW9ucy5lZGl0LFxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IG5ldyBMLkVkaXRUb29sYmFyLkVkaXQobWFwLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVHcm91cDogZmVhdHVyZUdyb3VwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhdGhPcHRpb25zOiB0aGlzLm9wdGlvbnMuZWRpdC5zZWxlY3RlZFBhdGhPcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2x5OiB0aGlzLm9wdGlvbnMucG9seVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBMLmRyYXdMb2NhbC5lZGl0LnRvb2xiYXIuYnV0dG9ucy5lZGl0XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMub3B0aW9ucy5yZW1vdmUsXHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogbmV3IEwuRWRpdFRvb2xiYXIuRGVsZXRlKG1hcCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlR3JvdXA6IGZlYXR1cmVHcm91cFxyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBMLmRyYXdMb2NhbC5lZGl0LnRvb2xiYXIuYnV0dG9ucy5yZW1vdmVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGdldEFjdGlvbnMoKTogb2JqZWN0XHJcbiAgICAgICAgLy8gR2V0IGFjdGlvbnMgaW5mb3JtYXRpb25cclxuICAgICAgICBnZXRBY3Rpb25zOiBmdW5jdGlvbiAoaGFuZGxlcikge1xyXG4gICAgICAgICAgICB2YXIgYWN0aW9ucyA9IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogTC5kcmF3TG9jYWwuZWRpdC50b29sYmFyLmFjdGlvbnMuc2F2ZS50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBMLmRyYXdMb2NhbC5lZGl0LnRvb2xiYXIuYWN0aW9ucy5zYXZlLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuX3NhdmUsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogTC5kcmF3TG9jYWwuZWRpdC50b29sYmFyLmFjdGlvbnMuY2FuY2VsLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IEwuZHJhd0xvY2FsLmVkaXQudG9vbGJhci5hY3Rpb25zLmNhbmNlbC50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLmRpc2FibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpc1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGhhbmRsZXIucmVtb3ZlQWxsTGF5ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBMLmRyYXdMb2NhbC5lZGl0LnRvb2xiYXIuYWN0aW9ucy5jbGVhckFsbC50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBMLmRyYXdMb2NhbC5lZGl0LnRvb2xiYXIuYWN0aW9ucy5jbGVhckFsbC50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLl9jbGVhckFsbExheWVycyxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBhZGRUb29sYmFyKG1hcCk6IEwuRG9tVXRpbFxyXG4gICAgICAgIC8vIEFkZHMgdGhlIHRvb2xiYXIgdG8gdGhlIG1hcFxyXG4gICAgICAgIGFkZFRvb2xiYXI6IGZ1bmN0aW9uIChtYXApIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IEwuVG9vbGJhci5wcm90b3R5cGUuYWRkVG9vbGJhci5jYWxsKHRoaXMsIG1hcCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jaGVja0Rpc2FibGVkKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmVhdHVyZUdyb3VwLm9uKCdsYXllcmFkZCBsYXllcnJlbW92ZScsIHRoaXMuX2NoZWNrRGlzYWJsZWQsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHJlbW92ZVRvb2xiYXIoKTogdm9pZFxyXG4gICAgICAgIC8vIFJlbW92ZXMgdGhlIHRvb2xiYXIgZnJvbSB0aGUgbWFwXHJcbiAgICAgICAgcmVtb3ZlVG9vbGJhcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmVhdHVyZUdyb3VwLm9mZignbGF5ZXJhZGQgbGF5ZXJyZW1vdmUnLCB0aGlzLl9jaGVja0Rpc2FibGVkLCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIEwuVG9vbGJhci5wcm90b3R5cGUucmVtb3ZlVG9vbGJhci5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgZGlzYWJsZSgpOiB2b2lkXHJcbiAgICAgICAgLy8gRGlzYWJsZXMgdGhlIHRvb2xiYXJcclxuICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lbmFibGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlTW9kZS5oYW5kbGVyLnJldmVydExheWVycygpO1xyXG5cclxuICAgICAgICAgICAgTC5Ub29sYmFyLnByb3RvdHlwZS5kaXNhYmxlLmNhbGwodGhpcyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3NhdmU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlTW9kZS5oYW5kbGVyLnNhdmUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZU1vZGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZU1vZGUuaGFuZGxlci5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfY2xlYXJBbGxMYXllcnM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlTW9kZS5oYW5kbGVyLnJlbW92ZUFsbExheWVycygpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlTW9kZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlTW9kZS5oYW5kbGVyLmRpc2FibGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9jaGVja0Rpc2FibGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBmZWF0dXJlR3JvdXAgPSB0aGlzLm9wdGlvbnMuZmVhdHVyZUdyb3VwLFxyXG4gICAgICAgICAgICAgICAgaGFzTGF5ZXJzID0gZmVhdHVyZUdyb3VwLmdldExheWVycygpLmxlbmd0aCAhPT0gMCxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWRpdCkge1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uID0gdGhpcy5fbW9kZXNbTC5FZGl0VG9vbGJhci5FZGl0LlRZUEVdLmJ1dHRvbjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaGFzTGF5ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKGJ1dHRvbiwgJ2xlYWZsZXQtZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKGJ1dHRvbiwgJ2xlYWZsZXQtZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKFxyXG4gICAgICAgICAgICAgICAgICAgICd0aXRsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzTGF5ZXJzID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgTC5kcmF3TG9jYWwuZWRpdC50b29sYmFyLmJ1dHRvbnMuZWRpdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IEwuZHJhd0xvY2FsLmVkaXQudG9vbGJhci5idXR0b25zLmVkaXREaXNhYmxlZFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZW1vdmUpIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbiA9IHRoaXMuX21vZGVzW0wuRWRpdFRvb2xiYXIuRGVsZXRlLlRZUEVdLmJ1dHRvbjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaGFzTGF5ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKGJ1dHRvbiwgJ2xlYWZsZXQtZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKGJ1dHRvbiwgJ2xlYWZsZXQtZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKFxyXG4gICAgICAgICAgICAgICAgICAgICd0aXRsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzTGF5ZXJzID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgTC5kcmF3TG9jYWwuZWRpdC50b29sYmFyLmJ1dHRvbnMucmVtb3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogTC5kcmF3TG9jYWwuZWRpdC50b29sYmFyLmJ1dHRvbnMucmVtb3ZlRGlzYWJsZWRcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5FZGl0VG9vbGJhci5FZGl0XHJcbiAgICAgKiBAYWthIEVkaXRUb29sYmFyLkVkaXRcclxuICAgICAqL1xyXG4gICAgTC5FZGl0VG9vbGJhci5FZGl0ID0gTC5IYW5kbGVyLmV4dGVuZCh7XHJcbiAgICAgICAgc3RhdGljczoge1xyXG4gICAgICAgICAgICBUWVBFOiAnZWRpdCdcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBpbmNsdWRlczogTC5NaXhpbi5FdmVudHMsXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgaW50aWFsaXplKCk6IHZvaWRcclxuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAobWFwLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIEwuSGFuZGxlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG1hcCk7XHJcblxyXG4gICAgICAgICAgICBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICAvLyBTdG9yZSB0aGUgc2VsZWN0YWJsZSBsYXllciBncm91cCBmb3IgZWFzZSBvZiBhY2Nlc3NcclxuICAgICAgICAgICAgdGhpcy5fZmVhdHVyZUdyb3VwID0gb3B0aW9ucy5mZWF0dXJlR3JvdXA7XHJcblxyXG4gICAgICAgICAgICBpZiAoISh0aGlzLl9mZWF0dXJlR3JvdXAgaW5zdGFuY2VvZiBMLkZlYXR1cmVHcm91cCkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5mZWF0dXJlR3JvdXAgbXVzdCBiZSBhIEwuRmVhdHVyZUdyb3VwJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3VuZWRpdGVkTGF5ZXJQcm9wcyA9IHt9O1xyXG5cclxuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdHlwZSBzbyBzdXBlciBjYW4gZmlyZSwgbmVlZCB0byBkbyB0aGlzIGFzIGNhbm5vdCBkbyB0aGlzLlRZUEUgOihcclxuICAgICAgICAgICAgdGhpcy50eXBlID0gTC5FZGl0VG9vbGJhci5FZGl0LlRZUEU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBlbmFibGUoKTogdm9pZFxyXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZWRpdCB0b29sYmFyXHJcbiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9lbmFibGVkIHx8ICF0aGlzLl9oYXNBdmFpbGFibGVMYXllcnMoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZW5hYmxlZCcsIHtoYW5kbGVyOiB0aGlzLnR5cGV9KTtcclxuICAgICAgICAgICAgLy90aGlzIGRpc2FibGUgb3RoZXIgaGFuZGxlcnNcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5FRElUU1RBUlQsIHtoYW5kbGVyOiB0aGlzLnR5cGV9KTtcclxuICAgICAgICAgICAgLy9hbGxvdyBkcmF3TGF5ZXIgdG8gYmUgdXBkYXRlZCBiZWZvcmUgYmVnaW5uaW5nIGVkaXRpb24uXHJcblxyXG4gICAgICAgICAgICBMLkhhbmRsZXIucHJvdG90eXBlLmVuYWJsZS5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9mZWF0dXJlR3JvdXBcclxuICAgICAgICAgICAgICAgIC5vbignbGF5ZXJhZGQnLCB0aGlzLl9lbmFibGVMYXllckVkaXQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ2xheWVycmVtb3ZlJywgdGhpcy5fZGlzYWJsZUxheWVyRWRpdCwgdGhpcyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBkaXNhYmxlKCk6IHZvaWRcclxuICAgICAgICAvLyBEaXNhYmxlIHRoZSBlZGl0IHRvb2xiYXJcclxuICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2ZlYXR1cmVHcm91cFxyXG4gICAgICAgICAgICAgICAgLm9mZignbGF5ZXJhZGQnLCB0aGlzLl9lbmFibGVMYXllckVkaXQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub2ZmKCdsYXllcnJlbW92ZScsIHRoaXMuX2Rpc2FibGVMYXllckVkaXQsIHRoaXMpO1xyXG4gICAgICAgICAgICBMLkhhbmRsZXIucHJvdG90eXBlLmRpc2FibGUuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUoTC5EcmF3LkV2ZW50LkVESVRTVE9QLCB7aGFuZGxlcjogdGhpcy50eXBlfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZGlzYWJsZWQnLCB7aGFuZGxlcjogdGhpcy50eXBlfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBhZGRIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gQWRkIGxpc3RlbmVyIGhvb2tzIGZvciB0aGlzIGhhbmRsZXJcclxuICAgICAgICBhZGRIb29rczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1hcCkge1xyXG4gICAgICAgICAgICAgICAgbWFwLmdldENvbnRhaW5lcigpLmZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmVhdHVyZUdyb3VwLmVhY2hMYXllcih0aGlzLl9lbmFibGVMYXllckVkaXQsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAgPSBuZXcgTC5EcmF3LlRvb2x0aXAodGhpcy5fbWFwKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAudXBkYXRlQ29udGVudCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogTC5kcmF3TG9jYWwuZWRpdC5oYW5kbGVycy5lZGl0LnRvb2x0aXAudGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBzdWJ0ZXh0OiBMLmRyYXdMb2NhbC5lZGl0LmhhbmRsZXJzLmVkaXQudG9vbHRpcC5zdWJ0ZXh0XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBRdWlja2x5IGFjY2VzcyB0aGUgdG9vbHRpcCB0byB1cGRhdGUgZm9yIGludGVyc2VjdGlvbiBjaGVja2luZ1xyXG4gICAgICAgICAgICAgICAgbWFwLl9lZGl0VG9vbHRpcCA9IHRoaXMuX3Rvb2x0aXA7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVG9vbHRpcCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcFxyXG4gICAgICAgICAgICAgICAgICAgIC5vbignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAub24oJ01TUG9pbnRlck1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAub24oTC5EcmF3LkV2ZW50LkVESVRWRVJURVgsIHRoaXMuX3VwZGF0ZVRvb2x0aXAsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCByZW1vdmVIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVyIGhvb2tzIGZvciB0aGlzIGhhbmRsZXJcclxuICAgICAgICByZW1vdmVIb29rczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCBzZWxlY3RlZCBsYXllcnMuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mZWF0dXJlR3JvdXAuZWFjaExheWVyKHRoaXMuX2Rpc2FibGVMYXllckVkaXQsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBiYWNrdXBzIG9mIHRoZSBvcmlnaW5hbCBsYXllcnNcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VuZWRpdGVkTGF5ZXJQcm9wcyA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbHRpcCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZigndG91Y2htb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZignTVNQb2ludGVyTW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vZmYoTC5EcmF3LkV2ZW50LkVESVRWRVJURVgsIHRoaXMuX3VwZGF0ZVRvb2x0aXAsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCByZXZlcnRMYXllcnMoKTogdm9pZFxyXG4gICAgICAgIC8vIFJldmVydCBlYWNoIGxheWVyJ3MgZ2VvbWV0cnkgY2hhbmdlc1xyXG4gICAgICAgIHJldmVydExheWVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9mZWF0dXJlR3JvdXAuZWFjaExheWVyKGZ1bmN0aW9uIChsYXllcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmV2ZXJ0TGF5ZXIobGF5ZXIpO1xyXG4gICAgICAgICAgICB9LCB0aGlzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHNhdmUoKTogdm9pZFxyXG4gICAgICAgIC8vIFNhdmUgdGhlIGxheWVyIGdlb21ldHJpZXNcclxuICAgICAgICBzYXZlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBlZGl0ZWRMYXllcnMgPSBuZXcgTC5MYXllckdyb3VwKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZlYXR1cmVHcm91cC5lYWNoTGF5ZXIoZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIuZWRpdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdGVkTGF5ZXJzLmFkZExheWVyKGxheWVyKTtcclxuICAgICAgICAgICAgICAgICAgICBsYXllci5lZGl0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5FRElURUQsIHtsYXllcnM6IGVkaXRlZExheWVyc30pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9iYWNrdXBMYXllcjogZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgICAgIHZhciBpZCA9IEwuVXRpbC5zdGFtcChsYXllcik7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3VuZWRpdGVkTGF5ZXJQcm9wc1tpZF0pIHtcclxuICAgICAgICAgICAgICAgIC8vIFBvbHlsaW5lLCBQb2x5Z29uIG9yIFJlY3RhbmdsZVxyXG4gICAgICAgICAgICAgICAgaWYgKGxheWVyIGluc3RhbmNlb2YgTC5Qb2x5bGluZSB8fCBsYXllciBpbnN0YW5jZW9mIEwuUG9seWdvbiB8fCBsYXllciBpbnN0YW5jZW9mIEwuUmVjdGFuZ2xlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5lZGl0ZWRMYXllclByb3BzW2lkXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGF0bG5nczogTC5MYXRMbmdVdGlsLmNsb25lTGF0TG5ncyhsYXllci5nZXRMYXRMbmdzKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXIgaW5zdGFuY2VvZiBMLkNpcmNsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZWRpdGVkTGF5ZXJQcm9wc1tpZF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhdGxuZzogTC5MYXRMbmdVdGlsLmNsb25lTGF0TG5nKGxheWVyLmdldExhdExuZygpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiBsYXllci5nZXRSYWRpdXMoKVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyIGluc3RhbmNlb2YgTC5NYXJrZXIgfHwgbGF5ZXIgaW5zdGFuY2VvZiBMLkNpcmNsZU1hcmtlcikgeyAvLyBNYXJrZXJcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmVkaXRlZExheWVyUHJvcHNbaWRdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXRsbmc6IEwuTGF0TG5nVXRpbC5jbG9uZUxhdExuZyhsYXllci5nZXRMYXRMbmcoKSlcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldFRvb2x0aXBUZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogTC5kcmF3TG9jYWwuZWRpdC5oYW5kbGVycy5lZGl0LnRvb2x0aXAudGV4dCxcclxuICAgICAgICAgICAgICAgIHN1YnRleHQ6IEwuZHJhd0xvY2FsLmVkaXQuaGFuZGxlcnMuZWRpdC50b29sdGlwLnN1YnRleHRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3VwZGF0ZVRvb2x0aXA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcC51cGRhdGVDb250ZW50KHRoaXMuX2dldFRvb2x0aXBUZXh0KCkpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9yZXZlcnRMYXllcjogZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgICAgIHZhciBpZCA9IEwuVXRpbC5zdGFtcChsYXllcik7XHJcbiAgICAgICAgICAgIGxheWVyLmVkaXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fdW5lZGl0ZWRMYXllclByb3BzLmhhc093blByb3BlcnR5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gUG9seWxpbmUsIFBvbHlnb24gb3IgUmVjdGFuZ2xlXHJcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIgaW5zdGFuY2VvZiBMLlBvbHlsaW5lIHx8IGxheWVyIGluc3RhbmNlb2YgTC5Qb2x5Z29uIHx8IGxheWVyIGluc3RhbmNlb2YgTC5SZWN0YW5nbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXllci5zZXRMYXRMbmdzKHRoaXMuX3VuZWRpdGVkTGF5ZXJQcm9wc1tpZF0ubGF0bG5ncyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyIGluc3RhbmNlb2YgTC5DaXJjbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXllci5zZXRMYXRMbmcodGhpcy5fdW5lZGl0ZWRMYXllclByb3BzW2lkXS5sYXRsbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxheWVyLnNldFJhZGl1cyh0aGlzLl91bmVkaXRlZExheWVyUHJvcHNbaWRdLnJhZGl1cyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyIGluc3RhbmNlb2YgTC5NYXJrZXIgfHwgbGF5ZXIgaW5zdGFuY2VvZiBMLkNpcmNsZU1hcmtlcikgeyAvLyBNYXJrZXIgb3IgQ2lyY2xlTWFya2VyXHJcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIuc2V0TGF0TG5nKHRoaXMuX3VuZWRpdGVkTGF5ZXJQcm9wc1tpZF0ubGF0bG5nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsYXllci5maXJlKCdyZXZlcnQtZWRpdGVkJywge2xheWVyOiBsYXllcn0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2VuYWJsZUxheWVyRWRpdDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdmFyIGxheWVyID0gZS5sYXllciB8fCBlLnRhcmdldCB8fCBlLFxyXG4gICAgICAgICAgICAgICAgcGF0aE9wdGlvbnMsIHBvbHk7XHJcblxyXG4gICAgICAgICAgICAvLyBCYWNrIHVwIHRoaXMgbGF5ZXIgKGlmIGhhdmVuJ3QgYmVmb3JlKVxyXG4gICAgICAgICAgICB0aGlzLl9iYWNrdXBMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvbHkpIHtcclxuICAgICAgICAgICAgICAgIHBvbHkgPSBMLlV0aWwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMucG9seSk7XHJcbiAgICAgICAgICAgICAgICBsYXllci5vcHRpb25zLnBvbHkgPSBwb2x5O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTZXQgZGlmZmVyZW50IHN0eWxlIGZvciBlZGl0aW5nIG1vZGVcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWxlY3RlZFBhdGhPcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBwYXRoT3B0aW9ucyA9IEwuVXRpbC5leHRlbmQoe30sIHRoaXMub3B0aW9ucy5zZWxlY3RlZFBhdGhPcHRpb25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGV4aXN0aW5nIGNvbG9yIG9mIHRoZSBsYXllclxyXG4gICAgICAgICAgICAgICAgaWYgKHBhdGhPcHRpb25zLm1haW50YWluQ29sb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXRoT3B0aW9ucy5jb2xvciA9IGxheWVyLm9wdGlvbnMuY29sb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aE9wdGlvbnMuZmlsbENvbG9yID0gbGF5ZXIub3B0aW9ucy5maWxsQ29sb3I7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGF5ZXIub3B0aW9ucy5vcmlnaW5hbCA9IEwuZXh0ZW5kKHt9LCBsYXllci5vcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIGxheWVyLm9wdGlvbnMuZWRpdGluZyA9IHBhdGhPcHRpb25zO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxheWVyIGluc3RhbmNlb2YgTC5NYXJrZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChsYXllci5lZGl0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIuZWRpdGluZy5lbmFibGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxheWVyLmRyYWdnaW5nLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgbGF5ZXJcclxuICAgICAgICAgICAgICAgICAgICAub24oJ2RyYWdlbmQnLCB0aGlzLl9vbk1hcmtlckRyYWdFbmQpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gI1RPRE86IHJlbW92ZSB3aGVuIGxlYWZsZXQgZmluYWxseSBmaXhlcyB0aGVpciBkcmFnZ2FibGUgc28gaXQncyB0b3VjaCBmcmllbmRseSBhZ2Fpbi5cclxuICAgICAgICAgICAgICAgICAgICAub24oJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbignTVNQb2ludGVyTW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbigndG91Y2hlbmQnLCB0aGlzLl9vbk1hcmtlckRyYWdFbmQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdNU1BvaW50ZXJVcCcsIHRoaXMuX29uTWFya2VyRHJhZ0VuZCwgdGhpcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsYXllci5lZGl0aW5nLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2Rpc2FibGVMYXllckVkaXQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXllciA9IGUubGF5ZXIgfHwgZS50YXJnZXQgfHwgZTtcclxuXHJcbiAgICAgICAgICAgIGxheWVyLmVkaXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAobGF5ZXIuZWRpdGluZykge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuZWRpdGluZy5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRlbGV0ZSBsYXllci5vcHRpb25zLmVkaXRpbmc7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBsYXllci5vcHRpb25zLm9yaWdpbmFsO1xyXG4gICAgICAgICAgICAvLyBSZXNldCBsYXllciBzdHlsZXMgdG8gdGhhdCBvZiBiZWZvcmUgc2VsZWN0XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZFBhdGhPcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIgaW5zdGFuY2VvZiBMLk1hcmtlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RvZ2dsZU1hcmtlckhpZ2hsaWdodChsYXllcik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBsYXllciBzdHlsZSB0byB3aGF0IGlzIHdhcyBiZWZvcmUgYmVpbmcgc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgICAgICBsYXllci5zZXRTdHlsZShsYXllci5vcHRpb25zLnByZXZpb3VzT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBjYWNoZWQgb3B0aW9ucyBmb3IgdGhlIGxheWVyIG9iamVjdFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsYXllci5vcHRpb25zLnByZXZpb3VzT3B0aW9ucztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxheWVyIGluc3RhbmNlb2YgTC5NYXJrZXIpIHtcclxuICAgICAgICAgICAgICAgIGxheWVyLmRyYWdnaW5nLmRpc2FibGUoKTtcclxuICAgICAgICAgICAgICAgIGxheWVyXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZignZHJhZ2VuZCcsIHRoaXMuX29uTWFya2VyRHJhZ0VuZCwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAub2ZmKCd0b3VjaG1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAub2ZmKCdNU1BvaW50ZXJNb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZigndG91Y2hlbmQnLCB0aGlzLl9vbk1hcmtlckRyYWdFbmQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZignTVNQb2ludGVyVXAnLCB0aGlzLl9vbk1hcmtlckRyYWdFbmQsIHRoaXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuZWRpdGluZy5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAudXBkYXRlUG9zaXRpb24oZS5sYXRsbmcpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbk1hcmtlckRyYWdFbmQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXllciA9IGUudGFyZ2V0O1xyXG4gICAgICAgICAgICBsYXllci5lZGl0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShMLkRyYXcuRXZlbnQuRURJVE1PVkUsIHtsYXllcjogbGF5ZXJ9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Ub3VjaE1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciB0b3VjaEV2ZW50ID0gZS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLFxyXG4gICAgICAgICAgICAgICAgbGF5ZXJQb2ludCA9IHRoaXMuX21hcC5tb3VzZUV2ZW50VG9MYXllclBvaW50KHRvdWNoRXZlbnQpLFxyXG4gICAgICAgICAgICAgICAgbGF0bG5nID0gdGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhsYXllclBvaW50KTtcclxuICAgICAgICAgICAgZS50YXJnZXQuc2V0TGF0TG5nKGxhdGxuZyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2hhc0F2YWlsYWJsZUxheWVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmVhdHVyZUdyb3VwLmdldExheWVycygpLmxlbmd0aCAhPT0gMDtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5FZGl0VG9vbGJhci5EZWxldGVcclxuICAgICAqIEBha2EgRWRpdFRvb2xiYXIuRGVsZXRlXHJcbiAgICAgKi9cclxuICAgIEwuRWRpdFRvb2xiYXIuRGVsZXRlID0gTC5IYW5kbGVyLmV4dGVuZCh7XHJcbiAgICAgICAgc3RhdGljczoge1xyXG4gICAgICAgICAgICBUWVBFOiAncmVtb3ZlJyAvLyBub3QgZGVsZXRlIGFzIGRlbGV0ZSBpcyByZXNlcnZlZCBpbiBqc1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGluY2x1ZGVzOiBMLk1peGluLkV2ZW50cyxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbnRpYWxpemUoKTogdm9pZFxyXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChtYXAsIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgTC5IYW5kbGVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbWFwKTtcclxuXHJcbiAgICAgICAgICAgIEwuVXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgLy8gU3RvcmUgdGhlIHNlbGVjdGFibGUgbGF5ZXIgZ3JvdXAgZm9yIGVhc2Ugb2YgYWNjZXNzXHJcbiAgICAgICAgICAgIHRoaXMuX2RlbGV0YWJsZUxheWVycyA9IHRoaXMub3B0aW9ucy5mZWF0dXJlR3JvdXA7XHJcblxyXG4gICAgICAgICAgICBpZiAoISh0aGlzLl9kZWxldGFibGVMYXllcnMgaW5zdGFuY2VvZiBMLkZlYXR1cmVHcm91cCkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5mZWF0dXJlR3JvdXAgbXVzdCBiZSBhIEwuRmVhdHVyZUdyb3VwJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHR5cGUgc28gc3VwZXIgY2FuIGZpcmUsIG5lZWQgdG8gZG8gdGhpcyBhcyBjYW5ub3QgZG8gdGhpcy5UWVBFIDooXHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEwuRWRpdFRvb2xiYXIuRGVsZXRlLlRZUEU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBlbmFibGUoKTogdm9pZFxyXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZGVsZXRlIHRvb2xiYXJcclxuICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2VuYWJsZWQgfHwgIXRoaXMuX2hhc0F2YWlsYWJsZUxheWVycygpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5maXJlKCdlbmFibGVkJywge2hhbmRsZXI6IHRoaXMudHlwZX0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUoTC5EcmF3LkV2ZW50LkRFTEVURVNUQVJULCB7aGFuZGxlcjogdGhpcy50eXBlfSk7XHJcblxyXG4gICAgICAgICAgICBMLkhhbmRsZXIucHJvdG90eXBlLmVuYWJsZS5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZGVsZXRhYmxlTGF5ZXJzXHJcbiAgICAgICAgICAgICAgICAub24oJ2xheWVyYWRkJywgdGhpcy5fZW5hYmxlTGF5ZXJEZWxldGUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ2xheWVycmVtb3ZlJywgdGhpcy5fZGlzYWJsZUxheWVyRGVsZXRlLCB0aGlzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGRpc2FibGUoKTogdm9pZFxyXG4gICAgICAgIC8vIERpc2FibGUgdGhlIGRlbGV0ZSB0b29sYmFyXHJcbiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fZGVsZXRhYmxlTGF5ZXJzXHJcbiAgICAgICAgICAgICAgICAub2ZmKCdsYXllcmFkZCcsIHRoaXMuX2VuYWJsZUxheWVyRGVsZXRlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZignbGF5ZXJyZW1vdmUnLCB0aGlzLl9kaXNhYmxlTGF5ZXJEZWxldGUsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgTC5IYW5kbGVyLnByb3RvdHlwZS5kaXNhYmxlLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShMLkRyYXcuRXZlbnQuREVMRVRFU1RPUCwge2hhbmRsZXI6IHRoaXMudHlwZX0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maXJlKCdkaXNhYmxlZCcsIHtoYW5kbGVyOiB0aGlzLnR5cGV9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGFkZEhvb2tzKCk6IHZvaWRcclxuICAgICAgICAvLyBBZGQgbGlzdGVuZXIgaG9va3MgdG8gdGhpcyBoYW5kbGVyXHJcbiAgICAgICAgYWRkSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcDtcclxuXHJcbiAgICAgICAgICAgIGlmIChtYXApIHtcclxuICAgICAgICAgICAgICAgIG1hcC5nZXRDb250YWluZXIoKS5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2RlbGV0YWJsZUxheWVycy5lYWNoTGF5ZXIodGhpcy5fZW5hYmxlTGF5ZXJEZWxldGUsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVsZXRlZExheWVycyA9IG5ldyBMLkxheWVyR3JvdXAoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b29sdGlwID0gbmV3IEwuRHJhdy5Ub29sdGlwKHRoaXMuX21hcCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b29sdGlwLnVwZGF0ZUNvbnRlbnQoe3RleHQ6IEwuZHJhd0xvY2FsLmVkaXQuaGFuZGxlcnMucmVtb3ZlLnRvb2x0aXAudGV4dH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCByZW1vdmVIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVyIGhvb2tzIGZyb20gdGhpcyBoYW5kbGVyXHJcbiAgICAgICAgcmVtb3ZlSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVsZXRhYmxlTGF5ZXJzLmVhY2hMYXllcih0aGlzLl9kaXNhYmxlTGF5ZXJEZWxldGUsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVsZXRlZExheWVycyA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbHRpcC5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b29sdGlwID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHJldmVydExheWVycygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmV2ZXJ0IHRoZSBkZWxldGVkIGxheWVycyBiYWNrIHRvIHRoZWlyIHByaW9yIHN0YXRlLlxyXG4gICAgICAgIHJldmVydExheWVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBJdGVyYXRlIG9mIHRoZSBkZWxldGVkIGxheWVycyBhbmQgYWRkIHRoZW0gYmFjayBpbnRvIHRoZSBmZWF0dXJlR3JvdXBcclxuICAgICAgICAgICAgdGhpcy5fZGVsZXRlZExheWVycy5lYWNoTGF5ZXIoZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWxldGFibGVMYXllcnMuYWRkTGF5ZXIobGF5ZXIpO1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuZmlyZSgncmV2ZXJ0LWRlbGV0ZWQnLCB7bGF5ZXI6IGxheWVyfSk7XHJcbiAgICAgICAgICAgIH0sIHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2Qgc2F2ZSgpOiB2b2lkXHJcbiAgICAgICAgLy8gU2F2ZSBkZWxldGVkIGxheWVyc1xyXG4gICAgICAgIHNhdmU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUoTC5EcmF3LkV2ZW50LkRFTEVURUQsIHtsYXllcnM6IHRoaXMuX2RlbGV0ZWRMYXllcnN9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHJlbW92ZUFsbExheWVycygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIGFsbCBkZWxhdGVhYmxlIGxheWVyc1xyXG4gICAgICAgIHJlbW92ZUFsbExheWVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBJdGVyYXRlIG9mIHRoZSBkZWxhdGVhYmxlIGxheWVycyBhbmQgYWRkIHJlbW92ZSB0aGVtXHJcbiAgICAgICAgICAgIHRoaXMuX2RlbGV0YWJsZUxheWVycy5lYWNoTGF5ZXIoZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVMYXllcih7bGF5ZXI6IGxheWVyfSk7XHJcbiAgICAgICAgICAgIH0sIHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZW5hYmxlTGF5ZXJEZWxldGU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXllciA9IGUubGF5ZXIgfHwgZS50YXJnZXQgfHwgZTtcclxuXHJcbiAgICAgICAgICAgIGxheWVyLm9uKCdjbGljaycsIHRoaXMuX3JlbW92ZUxheWVyLCB0aGlzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZGlzYWJsZUxheWVyRGVsZXRlOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgbGF5ZXIgPSBlLmxheWVyIHx8IGUudGFyZ2V0IHx8IGU7XHJcblxyXG4gICAgICAgICAgICBsYXllci5vZmYoJ2NsaWNrJywgdGhpcy5fcmVtb3ZlTGF5ZXIsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gdGhlIGRlbGV0ZWQgbGF5ZXJzIHNvIHdlIGNhbid0IGFjY2lkZW50YWxseSByZXZlcnQgaWYgdGhlIHVzZXIgcHJlc3NlcyBjYW5jZWxcclxuICAgICAgICAgICAgdGhpcy5fZGVsZXRlZExheWVycy5yZW1vdmVMYXllcihsYXllcik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3JlbW92ZUxheWVyOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgbGF5ZXIgPSBlLmxheWVyIHx8IGUudGFyZ2V0IHx8IGU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9kZWxldGFibGVMYXllcnMucmVtb3ZlTGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZGVsZXRlZExheWVycy5hZGRMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgICAgICBsYXllci5maXJlKCdkZWxldGVkJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uTW91c2VNb3ZlOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLl90b29sdGlwLnVwZGF0ZVBvc2l0aW9uKGUubGF0bG5nKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfaGFzQXZhaWxhYmxlTGF5ZXJzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxldGFibGVMYXllcnMuZ2V0TGF5ZXJzKCkubGVuZ3RoICE9PSAwO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbn0od2luZG93LCBkb2N1bWVudCkpO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1sZWFmbGV0LmRyYXctc3JjLm1hcCIsIi8vSU1BR0VTXHJcbmltcG9ydCBpbWdTYXZlIGZyb20gJy4uL2ltYWdlcy9zZWN0by9zYXZlLnBuZyc7XHJcbmltcG9ydCBpbWdNYXJrZXJCbGFjayBmcm9tICcuLi9pbWFnZXMvc2VjdG8vaWNvbl9tYXJrZXJfYmxhY2sucG5nJztcclxuaW1wb3J0IGltZ01hcmtlclJlZCBmcm9tICcuLi9pbWFnZXMvc2VjdG8vaWNvbl9tYXJrZXJfcmVkLnBuZyc7XHJcbmltcG9ydCBpbWdDaXJjbGUgZnJvbSAnLi4vaW1hZ2VzL3NlY3RvL2NpcmNsZS5wbmcnO1xyXG5pbXBvcnQgaW1nTWFpc29uIGZyb20gJy4uL2ltYWdlcy9zZWN0by9tYWlzb24ucG5nJztcclxuaW1wb3J0IGltZ1VuZG8gZnJvbSAnLi4vaW1hZ2VzL3NlY3RvL3VuZG8ucG5nJztcclxuaW1wb3J0IGltZ1JlZnJlc2ggZnJvbSAnLi4vaW1hZ2VzL3NlY3RvL3JlZnJlc2gucG5nJztcclxuaW1wb3J0IGltZ1Bhc3RpbGxlIGZyb20gJy4uL2ltYWdlcy9zZWN0by9wYXN0aWxsZS5wbmcnO1xyXG5pbXBvcnQgaW1nQkREIGZyb20gJy4uL2ltYWdlcy9zZWN0by9iZGQucG5nJztcclxuaW1wb3J0IGltZ0NyZWF0aW9uQXNzaXN0IGZyb20gJy4uL2ltYWdlcy9zZWN0by9jcmVhdGlvbl9hc3Npc3QucG5nJztcclxuaW1wb3J0IGltZ0NsaWVudHMgZnJvbSAnLi4vaW1hZ2VzL3NlY3RvL2NsaWVudHMzMC5wbmcnO1xyXG5pbXBvcnQgaW1nQWdlbnRzIGZyb20gJy4uL2ltYWdlcy9zZWN0by9hZ2VudHMucG5nJ1xyXG5pbXBvcnQgaW1nTnVtYmVyIGZyb20gJy4uL2ltYWdlcy9zZWN0by9udW1iZXIucG5nJztcclxuaW1wb3J0IGltZ0RlbnNpdGUgZnJvbSAnLi4vaW1hZ2VzL3NlY3RvL2RlbnNpdGUxLnBuZyc7XHJcbmltcG9ydCBpbWdDbGllbnRzT3V0IGZyb20gJy4uL2ltYWdlcy9zZWN0by9jbGllbnRzT3V0LnBuZyc7XHJcblxyXG4vL1NUWUxFXHJcbmltcG9ydCAnbGVhZmxldC9kaXN0L2xlYWZsZXQuY3NzJztcclxuaW1wb3J0ICcuLi9zdHlsZXMvc2VjdG9yaXNhdGlvbi5jc3MnO1xyXG5pbXBvcnQgJy4uL3N0eWxlcy90aW1lbGluZS5jc3MnO1xyXG5pbXBvcnQgJ2xlYWZsZXQvZGlzdC9sZWFmbGV0LXNyYyc7XHJcbmltcG9ydCAnYm9vdHN0cmFwLXRhYmxlL2Rpc3QvYm9vdHN0cmFwLXRhYmxlLm1pbi5jc3MnO1xyXG5cclxuLy9KU1xyXG5pbXBvcnQgJ2Jvb3RzdHJhcC10YWJsZS9kaXN0L2Jvb3RzdHJhcC10YWJsZS5qcyc7XHJcbmltcG9ydCAnYm9vdHN0cmFwLXRhYmxlL2Rpc3QvYm9vdHN0cmFwLXRhYmxlLWxvY2FsZS1hbGwubWluLmpzJztcclxuaW1wb3J0ICcuL21hcC9sZWFmbGV0LmRyYXctY3VzdG9tLmpzJztcclxuaW1wb3J0ICdsZWFmbGV0L2Rpc3QvbGVhZmxldC1zcmMuanMnO1xyXG5pbXBvcnQgJy4vbWFwL2xlYWZsZXQtc2VhcmNoLmpzJztcclxuXHJcbi8vJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xyXG4kKGRvY3VtZW50KS5vbigncmVhZHkgdHVyYm86bG9hZCcsIGZ1bmN0aW9uKCkge1xyXG4gICAgLypyZWRpbWVuc2lvbm5lbWVudCBjYXJ0ZSovXHJcbiAgICAkKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgaGVpZ2h0ID0gMzQ0O1xyXG4gICAgICAgIHZhciB3aWR0aCA9IDYwO1xyXG4gICAgICAgIGlmKCQoJyNmaWx0ZXItY29udGFpbmVyJykuaGFzQ2xhc3MoJ2FjdGl2ZScpKXtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gNDgyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZighJCgnI2Jsb2NSaWdodCcpLmhhc0NsYXNzKCdhY3RpdmUnKSl7XHJcbiAgICAgICAgICAgIHdpZHRoID0gOTc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQoJyNzZWN0b3Jpc2F0aW9uTWFwJykuY3NzKCd3aWR0aCcsIHdpZHRoICsgJyUnKTtcclxuICAgICAgICB2YXIgc0ggPSAkKHdpbmRvdykuaGVpZ2h0KCkgLSBoZWlnaHQ7XHJcbiAgICAgICAgJCgnI3NlY3RvcmlzYXRpb25NYXAnKS5jc3MoJ2hlaWdodCcsIChzSCArIDMwKSArICdweCcpO1xyXG4gICAgICAgICQoJyNibG9jVGFiJykuY3NzKCdoZWlnaHQnLCBzSCArICdweCcpO1xyXG4gICAgICAgICQoJyNleHBsYWluTWUnKS5jc3MoJ2hlaWdodCcsIHNIICsgJ3B4Jyk7XHJcbiAgICAgICAgJCgnI2NvbnRhaW5lck1hcCcpLmNzcygnaGVpZ2h0JywgKHNIICsgMzApICsgJ3B4Jyk7XHJcbiAgICB9KTtcclxuICAgICQoJy5keC1kYXRhZ3JpZC1zZWFyY2gtcGFuZWwnKS5jc3MoJ3dpZHRoJywgJzI1MHB4Jyk7XHJcbiAgICAkKHdpbmRvdykudHJpZ2dlcigncmVzaXplJyk7XHJcblxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbHRlci1pbWFnZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYoISQoJyNsaXN0ZUFnZW50cycpLmhhc0NsYXNzKCd2aXNpYmxlJykpe1xyXG4gICAgICAgICAgICAkKCcjbGlzdGVBZ2VudHMnKS5hZGRDbGFzcygndmlzaWJsZScpO1xyXG4gICAgICAgICAgICAkKCcjbGlzdGVBZ2VudHMnKS5zaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQod2luZG93KS50cmlnZ2VyKCdyZXNpemUnKTtcclxuICAgIH0pXHJcblxyXG5cclxuICAgICQoJyNtaW5pbWl6ZS10YWInKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgJCgnI2Jsb2NSaWdodCcpLnRvZ2dsZUNsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAkKHdpbmRvdykudHJpZ2dlcigncmVzaXplJyk7XHJcbiAgICB9KTtcclxuICAgIC8qZmluIHJlZGltZW5zaW9ubmVtZW50IGNhcnRlKi9cclxuXHJcbiAgICAvKlZBUklBQkxFUyovXHJcbiAgICB2YXIgdGFiQ29sb3IgPSBbJ1NQUklOR0dSRUVOJywgJ2FxdWEnLCAneWVsbG93JywgJ0RFRVBQSU5LJywgJ1NURUVMQkxVRScsICdncmVlbicsICdHT0xERU5ST0QnLCAnREVFUFNLWUJMVUUnLCAnbWFnZW50YScsICdwdXJwbGUnLCAnb3JhbmdlJywgJ0RBUktSRUQnLCAnbWFyb29uJ107XHJcbiAgICB2YXIgdGFiQW50ZW5uZXMgPSBbJ1ZFUkdOSUVVWCcsICdIQU5OSVFVRVQnLCAnR09TTkVUJywgJ0NIRVpFJywgJ0xBSEFMTEUnXTtcclxuICAgIHZhciBjb2xvcnMgPSBbXTtcclxuICAgIHZhciBmaWxsQ29sb3JXaXRob3V0QWdlbnQgPSAnYmxhY2snO1xyXG4gICAgdmFyIGNvbG9yV2l0aG91dEFnZW50ID0gJ3JlZCc7XHJcbiAgICB2YXIgY29sb3JXaXRoQWdlbnQgPSAnIzAwMCc7XHJcbiAgICB2YXIgdGFiQWdlbnRzID0gSlNPTi5wYXJzZSgkKCcjdGFiQWdlbnRzJylbMF0uaW5uZXJIVE1MKTtcclxuICAgIHZhciBzaXRlVXNlciA9ICQoJyNzaXRlJylbMF0uaW5uZXJIVE1MO1xyXG4gICAgY29uc29sZS5pbmZvKGFnZW50cyk7XHJcbiAgICB2YXIgdGFiTmJDbGllbnRzID0gW107XHJcbiAgICBmb3IgKHZhciBpIGluIHRhYkFnZW50cykge1xyXG4gICAgICAgIGlmICghdGFiTmJDbGllbnRzW3RhYkFnZW50c1tpXVsnY29kZV9hZ2VudCddXSkge1xyXG4gICAgICAgICAgICB0YWJOYkNsaWVudHNbdGFiQWdlbnRzW2ldWydjb2RlX2FnZW50J11dID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRhYk5iQ2xpZW50c1t0YWJBZ2VudHNbaV1bJ2NvZGVfYWdlbnQnXV1bJ25iQ2xpZW50cyddID0gdGFiQWdlbnRzW2ldWyduYl9jbGllbnRzJ107XHJcbiAgICAgICAgdGFiTmJDbGllbnRzW3RhYkFnZW50c1tpXVsnY29kZV9hZ2VudCddXVsnZmFtaWxsZTAnXSA9IHRhYkFnZW50c1tpXVsnZmFtaWxsZTAnXTtcclxuICAgICAgICB0YWJOYkNsaWVudHNbdGFiQWdlbnRzW2ldWydjb2RlX2FnZW50J11dWydmYW1pbGxlMSddID0gdGFiQWdlbnRzW2ldWydmYW1pbGxlMSddO1xyXG4gICAgICAgIHRhYk5iQ2xpZW50c1t0YWJBZ2VudHNbaV1bJ2NvZGVfYWdlbnQnXV1bJ2ZhbWlsbGUyJ10gPSB0YWJBZ2VudHNbaV1bJ2ZhbWlsbGUyJ107XHJcbiAgICAgICAgdGFiTmJDbGllbnRzW3RhYkFnZW50c1tpXVsnY29kZV9hZ2VudCddXVsnZmFtaWxsZTMnXSA9IHRhYkFnZW50c1tpXVsnZmFtaWxsZTMnXTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgbGFzdElkID0gMDtcclxuICAgIHZhciBtYXJrZXJEZWNvdXBhZ2UgPSBuZXcgTC5sYXllckdyb3VwKCk7XHJcbiAgICB2YXIgbWFya2VyMSA9ICcnO1xyXG4gICAgdmFyIG1hcmtlcjIgPSAnJztcclxuICAgIHZhciBmdXNpb24gPSBmYWxzZTtcclxuICAgIHZhciBkZWNvdXBhZ2UgPSBmYWxzZTtcclxuICAgIHZhciBtb2RpZmljYXRpb24gPSBmYWxzZTtcclxuICAgIHZhciBjcmVhdGlvbiA9IGZhbHNlO1xyXG4gICAgdmFyIGFzc2lzdCA9IGZhbHNlO1xyXG4gICAgdmFyIGNvbnRhaW5lckNsaWNrID0gZmFsc2U7XHJcbiAgICB2YXIgc2hvd1Rvb2x0aXAgPSBmYWxzZTtcclxuICAgIC8vdmFyIGFnZW50cyA9ICcnO1xyXG4gICAgdmFyIHNob3dBZ2VudHMgPSB0cnVlO1xyXG4gICAgdmFyIHNob3dBZ2VudHNPZlNlY3RldXJzID0gdHJ1ZTtcclxuICAgIHZhciBkZW5zaXRlQ2xpZW50cyA9ICcnO1xyXG4gICAgdmFyIHNob3dEZW5zaXRlID0gZmFsc2U7XHJcbiAgICB2YXIgY2xpZW50c1dpdGhvdXRTZWN0ZXVyID0gbmV3IEwuRmVhdHVyZUdyb3VwKCk7XHJcbiAgICB2YXIgZ2VvanNvbkNsaWVudHMgPSAnJztcclxuICAgIHZhciBzaG93Q2xpZW50cyA9IGZhbHNlO1xyXG4gICAgdmFyIHRhYkRlbnNpdGUgPSBbXTtcclxuICAgIHZhciBzZWN0ZXVyc0J5UmVzcG9uc2FibGUgPSBbXTtcclxuICAgIHZhciBzZWN0ZXVyc1NlbGVjdCA9ICcnO1xyXG4gICAgdmFyIGhpc3RvcmlxdWVBY3Rpb25zID0gW107IC8vQ29udGllbnQgbGEgbGlzdGUgZGVzIGFjdGlvbnMgZmFpdGVzIGRlcHVpcyBsYSBkZXJuacOocmUgc2F1dmVnYXJkZVxyXG4gICAgdmFyIGhpc3RvUG9seWdvbiA9ICcnO1xyXG4gICAgdmFyIGZsYWdVbmRvID0gZmFsc2U7XHJcbiAgICB2YXIgZXZlbnRBY3RpZiA9IGZhbHNlO1xyXG5cclxuICAgIHZhciBvcHRpb25zQ2lyY2xlQ2xpZW50cyA9IHtcclxuICAgICAgICByYWRpdXM6IDMsXHJcbiAgICAgICAgb3BhY2l0eTogMSxcclxuICAgICAgICBmaWxsQ29sb3I6IFwiI2UyMDYxM1wiLFxyXG4gICAgICAgIGNvbG9yOiBcIiMwMDBcIixcclxuICAgICAgICB3ZWlnaHQ6IDEsXHJcbiAgICAgICAgZmlsbE9wYWNpdHk6IDEsXHJcbiAgICB9O1xyXG4gICAgLypGSU4gVkFSSUFCTEVTKi9cclxuXHJcbiAgICAvKklDT05TKi9cclxuICAgIHZhciBtYXJrZXJJY29uID0gTC5pY29uKHtcclxuICAgICAgICBpY29uVXJsOiBpbWdNYXJrZXJCbGFjayxcclxuICAgICAgICBpY29uQW5jaG9yOiBbMTIsIDIxXSwgLy8gcG9pbnQgb2YgdGhlIGljb24gd2hpY2ggd2lsbCBjb3JyZXNwb25kIHRvIG1hcmtlcidzIGxvY2F0aW9uXHJcbiAgICB9KTtcclxuXHJcbiAgICB2YXIgbWFya2VySWNvblJlZCA9IEwuaWNvbih7XHJcbiAgICAgICAgaWNvblVybDogaW1nTWFya2VyUmVkLFxyXG4gICAgICAgIGljb25BbmNob3I6IFsxMiwgMjFdLCAvLyBwb2ludCBvZiB0aGUgaWNvbiB3aGljaCB3aWxsIGNvcnJlc3BvbmQgdG8gbWFya2VyJ3MgbG9jYXRpb25cclxuICAgIH0pO1xyXG4gICAgdmFyIGNpcmNsZUljb24gPSBMLmljb24oe1xyXG4gICAgICAgIGljb25Vcmw6IGltZ0NpcmNsZSxcclxuICAgICAgICBpY29uU2l6ZTogWzE0LCAxNF0sIC8vIHNpemUgb2YgdGhlIGljb25cclxuICAgICAgICBpY29uQW5jaG9yOiBbNywgN10sIC8vIHBvaW50IG9mIHRoZSBpY29uIHdoaWNoIHdpbGwgY29ycmVzcG9uZCB0byBtYXJrZXIncyBsb2NhdGlvblxyXG4gICAgfSk7XHJcbiAgICB2YXIgaG9tZUljb24gPSBMLmljb24oe1xyXG4gICAgICAgIGljb25Vcmw6IGltZ01haXNvbixcclxuICAgICAgICBpY29uU2l6ZTogWzIwLCAyMF0sIC8vIHNpemUgb2YgdGhlIGljb25cclxuICAgICAgICBpY29uQW5jaG9yOiBbMTAsIDEwXSwgLy8gcG9pbnQgb2YgdGhlIGljb24gd2hpY2ggd2lsbCBjb3JyZXNwb25kIHRvIG1hcmtlcidzIGxvY2F0aW9uXHJcbiAgICB9KTtcclxuICAgIC8qRklOIElDT05TKi9cclxuXHJcbiAgICAvKkRFQ0xBUkFUSU9OIE1BUCovXHJcbiAgICB2YXIgem9vbSA9IDExO1xyXG4gICAgdmFyIGNvb3JkcyA9IFs0OC44NzY0NTc2NDQzNjY4MTYsIDIuMzY0NDYzODA2MTUyMzQzOF07XHJcbiAgICBpZiAoc2l0ZVVzZXIgPT0gXCJCUk9OXCIpIHtcclxuICAgICAgICBjb29yZHMgPSBbNDUuNzUsIDQuODVdO1xyXG4gICAgfSBlbHNlIGlmIChzaXRlVXNlciA9PSBcIkhBTk5JUVVFVFwiKSB7XHJcbiAgICAgICAgY29vcmRzID0gWzQ4LjM4NSwgMi45NTFdO1xyXG4gICAgICAgIHpvb20gPSAxMDtcclxuICAgIH0gZWxzZSBpZiAoc2l0ZVVzZXIgPT0gXCJHT1NORVRcIikge1xyXG4gICAgICAgIGNvb3JkcyA9IFs0OS40MjksIDIuMDhdO1xyXG4gICAgICAgIHpvb20gPSA5O1xyXG4gICAgfSBlbHNlIGlmIChzaXRlVXNlciA9PSBcIkxBSEFMTEVcIikge1xyXG4gICAgICAgIGNvb3JkcyA9IFs0OC44LCAyLjE5MDAwNTJdO1xyXG4gICAgICAgIHpvb20gPSAxMjtcclxuICAgIH0gZWxzZSBpZiAoc2l0ZVVzZXIgPT0gXCJWRVJHTklFVVhcIikge1xyXG4gICAgICAgIGNvb3JkcyA9IFs0OC42MiwgMS43ODAwMDc2XTtcclxuICAgICAgICB6b29tID0gMTA7XHJcbiAgICB9IGVsc2UgaWYgKHNpdGVVc2VyID09IFwiQ0hFWkVcIikge1xyXG4gICAgICAgIGNvb3JkcyA9IFs0OC41MzA5Mjc1LCAyLjE5MzkwODFdO1xyXG4gICAgICAgIHpvb20gPSAxMDtcclxuICAgIH1cclxuICAgIC8vIGlmICh0YWJBbnRlbm5lcy5pbmNsdWRlcyhzaXRlVXNlcikpIHtcclxuICAgIC8vICAgICB2YXIgdGFiRWRpdEFjdGlvbnMgPSBbXHJcbiAgICAvLyAgICAgICAgIExlYWZsZXRUb29sYmFyLlRvb2xiYXJBY3Rpb24uZXh0ZW5kKG1vZGlmaWVyU2VjdGV1cigpKSxcclxuICAgIC8vICAgICAgICAgTGVhZmxldFRvb2xiYXIuVG9vbGJhckFjdGlvbi5leHRlbmQoY2FsY3VsRGlzdGFuY2VTZWN0ZXVyKCkpXHJcbiAgICAvLyAgICAgXTtcclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgdmFyIHRhYkVkaXRBY3Rpb25zID0gW1xyXG4gICAgLy8gICAgICAgICBMZWFmbGV0VG9vbGJhci5FZGl0QWN0aW9uLlBvcHVwLkVkaXQsXHJcbiAgICAvLyAgICAgICAgIExlYWZsZXRUb29sYmFyLlRvb2xiYXJBY3Rpb24uZXh0ZW5kKGRlbGV0ZVNlY3RldXIoKSksXHJcbiAgICAvLyAgICAgICAgIExlYWZsZXRUb29sYmFyLlRvb2xiYXJBY3Rpb24uZXh0ZW5kKGRlY291cGVyU2VjdGV1cigpKSxcclxuICAgIC8vICAgICAgICAgTGVhZmxldFRvb2xiYXIuVG9vbGJhckFjdGlvbi5leHRlbmQoZnVzaW9uU2VjdGV1cigpKSxcclxuICAgIC8vICAgICAgICAgTGVhZmxldFRvb2xiYXIuVG9vbGJhckFjdGlvbi5leHRlbmQobW9kaWZpZXJTZWN0ZXVyKCkpLFxyXG4gICAgLy8gICAgICAgICBMZWFmbGV0VG9vbGJhci5Ub29sYmFyQWN0aW9uLmV4dGVuZChjYWxjdWxEaXN0YW5jZVNlY3RldXIoKSlcclxuICAgIC8vICAgICBdO1xyXG4gICAgLy8gfVxyXG4gICAgLy8gdmFyIG1hcFNlY3RvID0gTC5tYXAoJ3NlY3RvcmlzYXRpb25NYXAnKS5zZXRWaWV3KGNvb3Jkcywgem9vbSksXHJcbiAgICAvLyAgICAgZHJhd25JdGVtcyA9IG5ldyBMLkZlYXR1cmVHcm91cCgpLmFkZFRvKG1hcFNlY3RvKSxcclxuICAgIC8vICAgICBlZGl0QWN0aW9ucyA9IHRhYkVkaXRBY3Rpb25zO1xyXG4gICAgdmFyIG1hcFNlY3RvID0gTC5tYXAoJ3NlY3RvcmlzYXRpb25NYXAnKS5zZXRWaWV3KGNvb3Jkcywgem9vbSk7XHJcbiAgICBtYXBTZWN0by56b29tQ29udHJvbC5fem9vbUluQnV0dG9uLnRpdGxlID0gXCJab29tIGF2YW50XCI7XHJcbiAgICBtYXBTZWN0by56b29tQ29udHJvbC5fem9vbU91dEJ1dHRvbi50aXRsZSA9IFwiWm9vbSBhcnJpw6hyZVwiO1xyXG4gICAgdmFyIHNjYWxlID0gTC5jb250cm9sLnNjYWxlKHtwb3NpdGlvbjogJ2JvdHRvbXJpZ2h0J30pLmFkZFRvKG1hcFNlY3RvKTtcclxuICAgIC8qRklOIERFQ0xBUkFUSU9OIE1BUCovXHJcblxyXG5cclxuXHJcbiAgICAvKkZPTkQgREUgQ0FSVEUqL1xyXG4gICAgdmFyIGdsY01hcHNHR2ggPSBMLnRpbGVMYXllcignaHR0cDovL3NmY3AuZnJpc3F1ZXQuY29tLz90PXt6fS97eH0ve3l9JnRoPWdnbCcsIHtcclxuICAgICAgICBtYXhab29tOiAxOCxcclxuICAgICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXHJcbiAgICAgICAgYXR0cmlidXRpb246ICc8YSB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiaHR0cHM6Ly9pY29uZXM4LmZyXCI+SWNvbnM4PC9hPidcclxuICAgIH0pO1xyXG4gICAgZ2xjTWFwc0dHaC5hZGRUbyhtYXBTZWN0byk7XHJcblxyXG4gICAgdmFyIHBsYW4gPSBMLnRpbGVMYXllcignaHR0cDovL3tzfS50aWxlLm9zbS5vcmcve3p9L3t4fS97eX0ucG5nJywge1xyXG4gICAgICAgIGF0dHJpYnV0aW9uOiAnJmNvcHk7IDxhIGhyZWY9XCJodHRwczovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIj5PcGVuU3RyZWV0TWFwPC9hPiBjb250cmlidXRvcnMgfCAmY29weSA8YSB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiaHR0cHM6Ly9pY29uZXM4LmZyXCI+SWNvbnM4PC9hPicsXHJcbiAgICB9KVxyXG5cclxuICAgIHZhciBFc3JpX1dvcmxkSW1hZ2VyeSA9IEwudGlsZUxheWVyKCdodHRwczovL3NlcnZlci5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX0ltYWdlcnkvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLCB7XHJcbiAgICAgICAgYXR0cmlidXRpb246ICdUaWxlcyAmY29weTsgRXNyaSB8ICZjb3B5IDxhIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCJodHRwczovL2ljb25lczguZnJcIj5JY29uczg8L2E+J1xyXG4gICAgfSk7XHJcblxyXG4gICAgdmFyIEVzcmlfV29ybGRUb3BvTWFwID0gTC50aWxlTGF5ZXIoJ2h0dHBzOi8vc2VydmVyLmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfVG9wb19NYXAvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLCB7XHJcbiAgICAgICAgYXR0cmlidXRpb246ICdUaWxlcyAmY29weTsgRXNyaSB8ICZjb3B5IDxhIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCJodHRwczovL2ljb25lczguZnJcIj5JY29uczg8L2E+J1xyXG4gICAgfSk7XHJcblxyXG4gICAgdmFyIHBsYW4yID0gTC50aWxlTGF5ZXIoJ2h0dHA6Ly97c30udGlsZS5vc20ub3JnL3t6fS97eH0ve3l9LnBuZycsIHtcclxuICAgICAgICBhdHRyaWJ1dGlvbjogJyZjb3B5OyA8YSBocmVmPVwiaHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCI+T3BlblN0cmVldE1hcDwvYT4gY29udHJpYnV0b3JzIHwgJmNvcHkgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgaHJlZj1cImh0dHBzOi8vaWNvbmVzOC5mclwiPkljb25zODwvYT4nLFxyXG4gICAgfSlcclxuXHJcbiAgICB2YXIgaGlzdG9NYXAgPSBMLm1hcCgnaGlzdG9NYXAnKS5zZXRWaWV3KGNvb3JkcywgMTEpO1xyXG4gICAgaGlzdG9NYXAuem9vbUNvbnRyb2wuX3pvb21JbkJ1dHRvbi50aXRsZSA9IFwiWm9vbSBhdmFudFwiO1xyXG4gICAgaGlzdG9NYXAuem9vbUNvbnRyb2wuX3pvb21PdXRCdXR0b24udGl0bGUgPSBcIlpvb20gYXJyacOocmVcIjtcclxuICAgIHBsYW4yLmFkZFRvKGhpc3RvTWFwKTtcclxuXHJcbiAgICB2YXIgYmFzZUxheWVycyA9IHtcclxuICAgICAgICAnR29vZ2xlIE1hcCc6IGdsY01hcHNHR2gsXHJcbiAgICAgICAgJ1BsYW4nOiBwbGFuLFxyXG4gICAgICAgICdTYXRlbGxpdGUnOiBFc3JpX1dvcmxkSW1hZ2VyeSxcclxuICAgICAgICAnVG9wb2dyYXBoaXF1ZSc6IEVzcmlfV29ybGRUb3BvTWFwXHJcbiAgICB9O1xyXG4gICAgTC5jb250cm9sLmxheWVycyhiYXNlTGF5ZXJzKS5hZGRUbyhtYXBTZWN0byk7XHJcbiAgICAvKkZJTiBGT05EIERFIENBUlRFKi9cclxuXHJcbiAgICAvKkxBWUVSUyovXHJcbiAgICB2YXIgZ3VpZGVMYXllcnMgPSBbXTtcclxuXHJcbiAgICB2YXIgbGF5ZXJzQWRqYWNlbnQgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgIHZhciBhZ2VudHNBZGphY2VudCA9IG5ldyBMLkZlYXR1cmVHcm91cCgpO1xyXG4gICAgdmFyIGNpcmNsZUd1aWRlID0gbmV3IEwuRmVhdHVyZUdyb3VwKCk7XHJcbiAgICB2YXIgYW50ZW5uZXMgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgIG1hcFNlY3RvLmFkZExheWVyKGFudGVubmVzKTtcclxuXHJcbiAgICB2YXIgZWRpdGFibGVMYXllcnMgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgIG1hcFNlY3RvLmFkZExheWVyKGVkaXRhYmxlTGF5ZXJzKTtcclxuXHJcbiAgICB2YXIgYmlnUG9seWdvbiA9IG5ldyBMLkZlYXR1cmVHcm91cCgpO1xyXG4gICAgbWFwU2VjdG8uYWRkTGF5ZXIoYmlnUG9seWdvbik7XHJcbiAgICB2YXIgYmlnUG9seWdvbkFudGVubmVzID0gbmV3IEwuRmVhdHVyZUdyb3VwKCk7XHJcbiAgICBtYXBTZWN0by5hZGRMYXllcihiaWdQb2x5Z29uQW50ZW5uZXMpO1xyXG5cclxuICAgIHZhciBhZ2VudHNPZlNlY3RldXJzID0gbmV3IEwuRmVhdHVyZUdyb3VwKCk7XHJcbiAgICBtYXBTZWN0by5hZGRMYXllcihhZ2VudHNPZlNlY3RldXJzKTtcclxuICAgIHZhciBoaXN0b0FnZW50c09mU2VjdGV1cnMgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgIGhpc3RvTWFwLmFkZExheWVyKGhpc3RvQWdlbnRzT2ZTZWN0ZXVycyk7XHJcblxyXG5cclxuICAgIHZhciBhZ2VudHMgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgIG1hcFNlY3RvLmFkZExheWVyKGFnZW50cyk7XHJcbiAgICAvKkZJTiBMQVlFUlMqL1xyXG5cclxuICAgIC8qQ09OVFJPTCovXHJcblxyXG4gICAgaWYgKHRhYkFudGVubmVzLmluY2x1ZGVzKHNpdGVVc2VyKSkge1xyXG4gICAgICAgIHZhciBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcHJpZ2h0JyxcclxuICAgICAgICAgICAgZHJhdzoge1xyXG4gICAgICAgICAgICAgICAgcG9seWxpbmU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcG9seWdvbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBjaXJjbGU6IGZhbHNlLCAvLyBUdXJucyBvZmYgdGhpcyBkcmF3aW5nIHRvb2xcclxuICAgICAgICAgICAgICAgIHJlY3RhbmdsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBtYXJrZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY2lyY2xlbWFya2VyOiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlZGl0OiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhciBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcHJpZ2h0JyxcclxuICAgICAgICAgICAgZHJhdzoge1xyXG4gICAgICAgICAgICAgICAgcG9seWxpbmU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcG9seWdvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyMwMDAnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDJcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGFsbG93SW50ZXJzZWN0aW9uOiBmYWxzZSwgLy8gUmVzdHJpY3RzIHNoYXBlcyB0byBzaW1wbGUgcG9seWdvbnNcclxuICAgICAgICAgICAgICAgICAgICBzaG93QXJlYTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBkcmF3RXJyb3I6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZWQnLCAvLyBDb2xvciB0aGUgc2hhcGUgd2lsbCB0dXJuIHdoZW4gaW50ZXJzZWN0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnPHN0cm9uZz5PaCBub24gITxzdHJvbmc+IFZvdXMgbmUgcG91dmV6IHBhcyB0cmFjZXIgw6dhICEnIC8vIE1lc3NhZ2UgdGhhdCB3aWxsIHNob3cgd2hlbiBpbnRlcnNlY3RcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGd1aWRlTGF5ZXJzOiBndWlkZUxheWVyc1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNpcmNsZTogZmFsc2UsIC8vIFR1cm5zIG9mZiB0aGlzIGRyYXdpbmcgdG9vbFxyXG4gICAgICAgICAgICAgICAgcmVjdGFuZ2xlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG1hcmtlcjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBjaXJjbGVtYXJrZXI6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkaXQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHZhciBkcmF3Q29udHJvbCA9IG5ldyBMLkNvbnRyb2wuRHJhdyhvcHRpb25zKTtcclxuICAgIG1hcFNlY3RvLmFkZENvbnRyb2woZHJhd0NvbnRyb2wpO1xyXG5cclxuICAgIG1hcFNlY3RvLmFkZENvbnRyb2wobmV3IEwuQ29udHJvbC5TZWFyY2goe1xyXG4gICAgICAgIHVybDogJ2h0dHBzOi8vbm9taW5hdGltLm9wZW5zdHJlZXRtYXAub3JnL3NlYXJjaD9mb3JtYXQ9anNvbiZxPXtzfScsXHJcbiAgICAgICAgdGV4dFBsYWNlaG9sZGVyOiAnQWRyZXNzZSwgdmlsbGUuLi4nLFxyXG4gICAgICAgIHRleHRFcnI6ICdMb2NhbGlzYXRpb24gbm9uIHRyb3V2w6knLFxyXG4gICAgICAgIGpzb25wUGFyYW06ICdqc29uX2NhbGxiYWNrJyxcclxuICAgICAgICBwcm9wZXJ0eU5hbWU6ICdkaXNwbGF5X25hbWUnLFxyXG4gICAgICAgIHByb3BlcnR5TG9jOiBbJ2xhdCcsICdsb24nXSxcclxuICAgICAgICAvL21hcmtlcjogTC5jaXJjbGVNYXJrZXIoWzAsMF0se3JhZGl1czozMH0pLFxyXG4gICAgICAgIGhpZGVNYXJrZXJPbkNvbGxhcHNlOiB0cnVlLFxyXG4gICAgICAgIGF1dG9Db2xsYXBzZTogdHJ1ZSxcclxuICAgICAgICBhdXRvVHlwZTogZmFsc2UsXHJcbiAgICAgICAgbWluTGVuZ3RoOiAyLFxyXG4gICAgICAgIHpvb206IDE0XHJcbiAgICB9KSk7XHJcblxyXG4gICAgdmFyIGN1c3RvbUNvbnRyb2xVbmRvID0gTC5Db250cm9sLmV4dGVuZCh7XHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcGxlZnQnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkFkZDogZnVuY3Rpb24gKG1hcFNlY3RvKSB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnLCAnbGVhZmxldC1iYXIgbGVhZmxldC1jb250cm9sIGxlYWZsZXQtY29udHJvbC1jdXN0b20nKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBcIlJldG91ciBhcnJpw6hyZVwiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBcInVuZG9cIik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxpbWcgc3JjPVwiJytpbWdVbmRvKydcIiBzdHlsZT1cImhlaWdodDogMjRweDttYXJnaW46IDFweDtjdXJzb3I6IHBvaW50ZXI7XCI+JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRTaXplID0gXCIzMHB4IDMwcHhcIjtcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gJzMwcHgnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJzMwcHgnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdW5kbygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbWFwU2VjdG8uYWRkQ29udHJvbChuZXcgY3VzdG9tQ29udHJvbFVuZG8oKSk7XHJcblxyXG4gICAgdmFyIGN1c3RvbUNvbnRyb2xSZWZyZXNoID0gTC5Db250cm9sLmV4dGVuZCh7XHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcGxlZnQnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkFkZDogZnVuY3Rpb24gKG1hcFNlY3RvKSB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnLCAnbGVhZmxldC1iYXIgbGVhZmxldC1jb250cm9sIGxlYWZsZXQtY29udHJvbC1jdXN0b20nKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBcIlJhZnJhw65jaGlyIC8gRWZmYWNlciBsZXMgbW9kaWZpY2F0aW9ucyBub24gZW5yZWdpc3Ryw6llc1wiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBcInJlZnJlc2hcIik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxpbWcgc3JjPVwiJytpbWdSZWZyZXNoKydcIiBzdHlsZT1cImhlaWdodDogMjRweDttYXJnaW46IDFweDtjdXJzb3I6IHBvaW50ZXI7XCI+JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRTaXplID0gXCIzMHB4IDMwcHhcIjtcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gJzMwcHgnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJzMwcHgnO1xyXG5cclxuICAgICAgICAgICAgY29udGFpbmVyLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZWZyZXNoKCcnLCAnJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBtYXBTZWN0by5hZGRDb250cm9sKG5ldyBjdXN0b21Db250cm9sUmVmcmVzaCgpKTtcclxuXHJcbiAgICB2YXIgY3VzdG9tQ29udHJvbFNhdmUgPSBMLkNvbnRyb2wuZXh0ZW5kKHtcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wbGVmdCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQWRkOiBmdW5jdGlvbiAobWFwU2VjdG8pIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IEwuRG9tVXRpbC5jcmVhdGUoJ2RpdicsICdsZWFmbGV0LWJhciBsZWFmbGV0LWNvbnRyb2wgbGVhZmxldC1jb250cm9sLWN1c3RvbScpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCd0aXRsZScsIFwiU2F1dmVnYXJkZSBkZXMgc2VjdGV1cnNcIik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2lkJywgXCJzYXZlXCIpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3doaXRlJztcclxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8aW1nIHNyYz1cIicraW1nU2F2ZSsnXCIgc3R5bGU9XCJoZWlnaHQ6IDI0cHg7bWFyZ2luOiAxcHg7Y3Vyc29yOiBwb2ludGVyO1wiPiA8aW1nIHNyYz1cIicraW1nUGFzdGlsbGUrJ1wiIGlkPVwicGFzdGlsbGVcIiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTtyaWdodDowO2JvdHRvbTogMDtcIj4nO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuYmFja2dyb3VuZFNpemUgPSBcIjMwcHggMzBweFwiO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSAnMzBweCc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSAnMzBweCc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcblxyXG4gICAgICAgICAgICBjb250YWluZXIub25jbGljayA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChoaXN0b3JpcXVlQWN0aW9ucy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnI3NhdmVNZSAjaGlzdG9yaXF1ZUFjdGlvbnMnKVswXS5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGhpc3RvcmlxdWVBY3Rpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3NhdmVNZSAjaGlzdG9yaXF1ZUFjdGlvbnMnKVswXS5pbm5lckhUTUwgKz0gJzxsaT4nICsgaGlzdG9yaXF1ZUFjdGlvbnNbaV1bJ3RleHRlJ10gKyAnPC9saT4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICQoJyNzYXZlTW9kaWYnKVswXS5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICQoJyNkZWxldGVNb2RpZicpWzBdLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICQoJyNzYXZlTWUgI2hpc3RvcmlxdWVBY3Rpb25zJylbMF0uaW5uZXJIVE1MID0gJ0F1Y3VuZSBtb2RpZmljYXRpb24gZW4gY291cnMuJztcclxuICAgICAgICAgICAgICAgICAgICAkKCcjc2F2ZU1vZGlmJylbMF0uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICQoJyNkZWxldGVNb2RpZicpWzBdLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAkKCcjc2F2ZU1lJykubW9kYWwoJ3Nob3cnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkKFwiI2RlbGV0ZU1vZGlmXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgJCgnI2RlbGV0ZU1vZGlmJykub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKCcjc2F2ZU1lJykubW9kYWwoJ2hpZGUnKTtcclxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIG1hcFNlY3RvLmFkZENvbnRyb2wobmV3IGN1c3RvbUNvbnRyb2xTYXZlKCkpO1xyXG5cclxuICAgIGlmIChzaXRlVXNlciA9PSAnTUVBVVgnKSB7XHJcbiAgICAgICAgdmFyIGN1c3RvbUNvbnRyb2xTYXZlID0gTC5Db250cm9sLmV4dGVuZCh7XHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wbGVmdCdcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25BZGQ6IGZ1bmN0aW9uIChtYXBTZWN0bykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IEwuRG9tVXRpbC5jcmVhdGUoJ2RpdicsICdsZWFmbGV0LWJhciBsZWFmbGV0LWNvbnRyb2wgbGVhZmxldC1jb250cm9sLWN1c3RvbScpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBcIlN5bmNocm9uaXNhdGlvblwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2lkJywgXCJzeW5jaHJvXCIpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxpbWcgc3JjPVwiJytpbWdCREQrJ1wiIHN0eWxlPVwiaGVpZ2h0OiAyNHB4O21hcmdpbjogMXB4O2N1cnNvcjogcG9pbnRlcjtcIj4nO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRTaXplID0gXCIzMHB4IDMwcHhcIjtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICczMHB4JztcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSAnMzBweCc7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN5bmNocm8oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbWFwU2VjdG8uYWRkQ29udHJvbChuZXcgY3VzdG9tQ29udHJvbFNhdmUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgJCgnYm9keScpLm9uKCdzdWJtaXQnLCAnZm9ybSNmb3JtX3NhdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICB2YXIgZm9ybSA9ICQodGhpcyk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBpZiAoaGlzdG9yaXF1ZUFjdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdkYXRlTWVwJyk7XHJcbiAgICAgICAgICAgIHZhciBzYW1lID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5pbm5lckhUTUwgPT0gJCgnI2RhdGVNZXAnKS52YWwoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNhbWUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAkKCcjc2F2ZU1lJykubW9kYWwoJ2hpZGUnKTtcclxuICAgICAgICAgICAgICAgICQoJyNhbGVydERhdGUnKS5tb2RhbCgnc2hvdycpO1xyXG4gICAgICAgICAgICAgICAgJChcIiNjb25maXJtRWNyYXNlXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgJCgnI2NvbmZpcm1FY3Jhc2UnKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICQoJyNhbGVydERhdGUnKS5tb2RhbCgnaGlkZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNhdmVWZXJzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNhdmVWZXJzaW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdmFyIGN1c3RvbUNvbnRyb2xDcmVhdGlvbkFzc2lzdCA9IEwuQ29udHJvbC5leHRlbmQoe1xyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgcG9zaXRpb246ICd0b3ByaWdodCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQWRkOiBmdW5jdGlvbiAobWFwU2VjdG8pIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IEwuRG9tVXRpbC5jcmVhdGUoJ2RpdicsICdsZWFmbGV0LWJhciBsZWFmbGV0LWNvbnRyb2wgbGVhZmxldC1jb250cm9sLWN1c3RvbScpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCd0aXRsZScsIFwiQ3LDqWF0aW9uIGFzc2lzdMOpZSBzZWN0ZXVyXCIpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdpZCcsIFwiY3JlYXRpb25Bc3Npc3RcIik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxpbWcgc3JjPVwiJytpbWdDcmVhdGlvbkFzc2lzdCsnXCIgc3R5bGU9XCJoZWlnaHQ6IDI0cHg7bWFyZ2luOiAxcHg7Y3Vyc29yOiBwb2ludGVyO1wiPic7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IFwiMzBweCAzMHB4XCI7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICczMHB4JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICczMHB4JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaGlkZUZ1bmN0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgJCgnI2xlZ2VuZGUgcCN0ZXh0ZScpWzBdLmlubmVySFRNTCA9IFwiU8OpbGVjdGlvbm5leiBkZXV4IHBvaW50cyBub24gYWRqYWNlbnQgcG91ciBjcsOpZXIgdW4gc2VjdGV1clwiO1xyXG4gICAgICAgICAgICAgICAgJCgnI2V4cGxhaW5NZScpLnNob3coKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhc3Npc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyQ2xpY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgY2lyY2xlR3VpZGUgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgICAgICAgICAgICAgIG1hcFNlY3RvLmFkZExheWVyKGNpcmNsZUd1aWRlKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50QWN0aWYgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYmlnUG9seWdvbi5fbGF0bG5ncy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgYmlnUG9seWdvbi5fbGF0bG5nc1tqXS5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmlnUG9seWdvbi5fbGF0bG5nc1tqXVtrXS5sYXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgTC5NYXJrZXIoYmlnUG9seWdvbi5fbGF0bG5nc1tqXVtrXSwge3BvczogaywgaWNvbjogbWFya2VySWNvbn0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlR3VpZGUuYWRkTGF5ZXIobWFya2VyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrTWFya2VyQXNzaXN0KHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IGJpZ1BvbHlnb24uX2xhdGxuZ3Nbal1ba10ubGVuZ3RoOyBsKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFya2VyID0gbmV3IEwuTWFya2VyKGJpZ1BvbHlnb24uX2xhdGxuZ3Nbal1ba11bbF0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiBsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBtYXJrZXJJY29uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlR3VpZGUuYWRkTGF5ZXIobWFya2VyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tNYXJrZXJBc3Npc3QodGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghdGFiQW50ZW5uZXMuaW5jbHVkZXMoc2l0ZVVzZXIpKSB7XHJcbiAgICAgICAgbWFwU2VjdG8uYWRkQ29udHJvbChuZXcgY3VzdG9tQ29udHJvbENyZWF0aW9uQXNzaXN0KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBjdXN0b21Db250cm9sTmJDbGllbnRzID0gTC5Db250cm9sLmV4dGVuZCh7XHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcHJpZ2h0J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25BZGQ6IGZ1bmN0aW9uIChtYXBTZWN0bykge1xyXG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2xlYWZsZXQtYmFyIGxlYWZsZXQtY29udHJvbCBsZWFmbGV0LWNvbnRyb2wtY3VzdG9tJyk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgXCJBZmZpY2hlciBsZSBub21icmUgZGUgY2xpZW50cyBwYXIgc2VjdGV1cnNcIik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2lkJywgXCJuYkNsaWVudHNcIik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxpbWcgc3JjPVwiJytpbWdDbGllbnRzKydcIiAgc3R5bGU9XCJoZWlnaHQ6IDI0cHg7bWFyZ2luOiAxcHg7Y3Vyc29yOiBwb2ludGVyO1wiPic7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IFwiMzBweCAzMHB4XCI7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICczMHB4JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICczMHB4JztcclxuXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgbWFwU2VjdG8uZWFjaExheWVyKGZ1bmN0aW9uIChsYXllcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXllciBpbnN0YW5jZW9mIEwuUG9seWdvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci50b2dnbGVUb29sdGlwKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBzaG93VG9vbHRpcCA9ICFzaG93VG9vbHRpcDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbWFwU2VjdG8uYWRkQ29udHJvbChuZXcgY3VzdG9tQ29udHJvbE5iQ2xpZW50cygpKTtcclxuXHJcbiAgICB2YXIgY3VzdG9tQ29udHJvbEFnZW50cyA9IEwuQ29udHJvbC5leHRlbmQoe1xyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgcG9zaXRpb246ICd0b3ByaWdodCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQWRkOiBmdW5jdGlvbiAobWFwU2VjdG8pIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IEwuRG9tVXRpbC5jcmVhdGUoJ2RpdicsICdsZWFmbGV0LWJhciBsZWFmbGV0LWNvbnRyb2wgbGVhZmxldC1jb250cm9sLWN1c3RvbScpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCd0aXRsZScsIFwiQWZmaWNoZXIgbGVzIGFnZW50c1wiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBcImFnZW50c1wiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGltZyBzcmM9XCInK2ltZ0FnZW50cysnXCIgc3R5bGU9XCJoZWlnaHQ6IDI0cHg7bWFyZ2luOiAxcHg7Y3Vyc29yOiBwb2ludGVyO1wiPic7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IFwiMzBweCAzMHB4XCI7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICczMHB4JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICczMHB4JztcclxuXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2hvd0FnZW50cyA9IGJpbmRFbGVtZW50cyhzaG93QWdlbnRzLCBhZ2VudHMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbWFwU2VjdG8uYWRkQ29udHJvbChuZXcgY3VzdG9tQ29udHJvbEFnZW50cygpKTtcclxuXHJcbiAgICB2YXIgY3VzdG9tQ29udHJvbEFnZW50c09mU2VjdGV1cnMgPSBMLkNvbnRyb2wuZXh0ZW5kKHtcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wcmlnaHQnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkFkZDogZnVuY3Rpb24gKG1hcFNlY3RvKSB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnLCAnbGVhZmxldC1iYXIgbGVhZmxldC1jb250cm9sIGxlYWZsZXQtY29udHJvbC1jdXN0b20nKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBcIkFmZmljaGVyIGwnYWdlbnQgcHJpbmNpcGFsIGRlcyBzZWN0ZXVyc1wiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBcInByaW5jaXBhbFwiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGltZyBzcmM9XCInK2ltZ051bWJlcisnXCIgc3R5bGU9XCJoZWlnaHQ6IDI0cHg7bWFyZ2luOiAxcHg7Y3Vyc29yOiBwb2ludGVyO1wiPic7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IFwiMzBweCAzMHB4XCI7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICczMHB4JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICczMHB4JztcclxuXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2hvd0FnZW50c09mU2VjdGV1cnMgPSBiaW5kRWxlbWVudHMoc2hvd0FnZW50c09mU2VjdGV1cnMsIGFnZW50c09mU2VjdGV1cnMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbWFwU2VjdG8uYWRkQ29udHJvbChuZXcgY3VzdG9tQ29udHJvbEFnZW50c09mU2VjdGV1cnMoKSk7XHJcblxyXG4gICAgdmFyIGN1c3RvbUNvbnRyb2xEZW5zaXRlQ2xpZW50cyA9IEwuQ29udHJvbC5leHRlbmQoe1xyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgcG9zaXRpb246ICd0b3ByaWdodCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQWRkOiBmdW5jdGlvbiAobWFwU2VjdG8pIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IEwuRG9tVXRpbC5jcmVhdGUoJ2RpdicsICdsZWFmbGV0LWJhciBsZWFmbGV0LWNvbnRyb2wgbGVhZmxldC1jb250cm9sLWN1c3RvbScpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCd0aXRsZScsIFwiQWZmaWNoZXIgbGEgZGVuc2l0w6kgY2xpZW50XCIpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdpZCcsIFwiZGVuc2l0ZVwiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGltZyBzcmM9XCInK2ltZ0RlbnNpdGUrJ1wiIHN0eWxlPVwiaGVpZ2h0OiAyNHB4O21hcmdpbjogMXB4O2N1cnNvcjogcG9pbnRlcjtcIj4nO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuYmFja2dyb3VuZFNpemUgPSBcIjMwcHggMzBweFwiO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSAnMzBweCc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSAnMzBweCc7XHJcblxyXG4gICAgICAgICAgICBjb250YWluZXIub25jbGljayA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHNob3dEZW5zaXRlID0gYmluZEVsZW1lbnRzKHNob3dEZW5zaXRlLCBkZW5zaXRlQ2xpZW50cyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBtYXBTZWN0by5hZGRDb250cm9sKG5ldyBjdXN0b21Db250cm9sRGVuc2l0ZUNsaWVudHMoKSk7XHJcblxyXG5cclxuICAgIHZhciBjdXN0b21Db250cm9sQ2xpZW50ID0gTC5Db250cm9sLmV4dGVuZCh7XHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcHJpZ2h0J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25BZGQ6IGZ1bmN0aW9uIChtYXBTZWN0bykge1xyXG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2xlYWZsZXQtYmFyIGxlYWZsZXQtY29udHJvbCBsZWFmbGV0LWNvbnRyb2wtY3VzdG9tJyk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgXCJBZmZpY2hlciBsZXMgY2xpZW50cyBob3JzIHNlY3RldXJzXCIpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdpZCcsIFwiY2xpZW50c1wiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBpZD1cIm5iQ2xpZW50SG9yc1NlY3RldXJcIiBjbGFzcz1cImFsZXJ0ZXNcIiBzdHlsZT1cImZvbnQtc2l6ZToxMHB4O21hcmdpbjowcHg7XCI+MDwvZGl2PjxpbWcgc3JjPVwiJytpbWdDbGllbnRzT3V0KydcIiBzdHlsZT1cImhlaWdodDogMjRweDttYXJnaW46IDFweDtjdXJzb3I6IHBvaW50ZXI7XCI+JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRTaXplID0gXCIzMHB4IDMwcHhcIjtcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gJzMwcHgnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJzQ1cHgnO1xyXG5cclxuICAgICAgICAgICAgY29udGFpbmVyLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBzaG93Q2xpZW50cyA9IGJpbmRFbGVtZW50cyhzaG93Q2xpZW50cywgY2xpZW50c1dpdGhvdXRTZWN0ZXVyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIG1hcFNlY3RvLmFkZENvbnRyb2wobmV3IGN1c3RvbUNvbnRyb2xDbGllbnQoKSk7XHJcbiAgICAvKkZJTiBDT05UUk9MKi9cclxuXHJcbiAgICBpbml0U2VjdG8oKTtcclxuXHJcbiAgICAvKlRJTUVMSU5FKi9cclxuICAgIHZhciB0aW1lbGluZXMgPSAkKCcuY2QtaG9yaXpvbnRhbC10aW1lbGluZScpLFxyXG4gICAgICAgIGV2ZW50c01pbkRpc3RhbmNlID0gMTc7XHJcblxyXG4gICAgKHRpbWVsaW5lcy5sZW5ndGggPiAwKSAmJiBpbml0VGltZWxpbmUodGltZWxpbmVzLCBmYWxzZSk7XHJcblxyXG4gICAgZnVuY3Rpb24gaW5pdFRpbWVsaW5lKHRpbWVsaW5lcywgcmVsb2FkKSB7XHJcbiAgICAgICAgdGltZWxpbmVzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgdGltZWxpbmUgPSAkKHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgdGltZWxpbmVDb21wb25lbnRzID0ge307XHJcbiAgICAgICAgICAgIC8vY2FjaGUgdGltZWxpbmUgY29tcG9uZW50c1xyXG4gICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lV3JhcHBlciddID0gdGltZWxpbmUuZmluZCgnLmV2ZW50cy13cmFwcGVyJyk7XHJcbiAgICAgICAgICAgIHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzV3JhcHBlciddID0gdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZVdyYXBwZXInXS5jaGlsZHJlbignLmV2ZW50cycpO1xyXG4gICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ2ZpbGxpbmdMaW5lJ10gPSB0aW1lbGluZUNvbXBvbmVudHNbJ2V2ZW50c1dyYXBwZXInXS5jaGlsZHJlbignLmZpbGxpbmctbGluZScpO1xyXG4gICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lRXZlbnRzJ10gPSB0aW1lbGluZUNvbXBvbmVudHNbJ2V2ZW50c1dyYXBwZXInXS5maW5kKCdsaS5saXN0ZUhpc3RvJyk7XHJcbiAgICAgICAgICAgIHRpbWVsaW5lQ29tcG9uZW50c1sndGltZWxpbmVWZXJzaW9uJ10gPSB0aW1lbGluZUNvbXBvbmVudHNbJ2V2ZW50c1dyYXBwZXInXS5maW5kKCdsaS5saXN0ZUhpc3RvLnZlcnNpb25BY3R1ZWxsZScpO1xyXG4gICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lTGlua3MnXSA9IHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzV3JhcHBlciddLmZpbmQoJ2EnKTtcclxuICAgICAgICAgICAgdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZURhdGVzJ10gPSB0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lRXZlbnRzJ107XHJcbiAgICAgICAgICAgIC8vdGltZWxpbmVDb21wb25lbnRzWydldmVudHNNaW5MYXBzZSddID0gbWluTGFwc2UodGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZURhdGVzJ10pO1xyXG4gICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lTmF2aWdhdGlvbiddID0gdGltZWxpbmUuZmluZCgnLmNkLXRpbWVsaW5lLW5hdmlnYXRpb24nKTtcclxuICAgICAgICAgICAgdGltZWxpbmVDb21wb25lbnRzWydldmVudHNDb250ZW50J10gPSB0aW1lbGluZS5jaGlsZHJlbignLmV2ZW50cy1jb250ZW50Jyk7XHJcblxyXG4gICAgICAgICAgICAvL2Fzc2lnbiBhIGxlZnQgcG9zdGlvbiB0byB0aGUgc2luZ2xlIGV2ZW50cyBhbG9uZyB0aGUgdGltZWxpbmVcclxuICAgICAgICAgICAgZXZlbnRzTWluRGlzdGFuY2UgPSAyNTA7XHJcbiAgICAgICAgICAgIHZhciB0aW1lbGluZVRvdFdpZHRoID0gKHRpbWVsaW5lQ29tcG9uZW50c1sndGltZWxpbmVEYXRlcyddLmxlbmd0aCArIDEpICogZXZlbnRzTWluRGlzdGFuY2U7XHJcbiAgICAgICAgICAgIHNldERhdGVQb3NpdGlvbih0aW1lbGluZUNvbXBvbmVudHMsIGV2ZW50c01pbkRpc3RhbmNlKTtcclxuICAgICAgICAgICAgLy9hc3NpZ24gYSB3aWR0aCB0byB0aGUgdGltZWxpbmVcclxuICAgICAgICAgICAgc2V0VGltZWxpbmVXaWR0aCh0aW1lbGluZUNvbXBvbmVudHMsIHRpbWVsaW5lVG90V2lkdGgpO1xyXG4gICAgICAgICAgICAvL3RoZSB0aW1lbGluZSBoYXMgYmVlbiBpbml0aWFsaXplIC0gc2hvdyBpdFxyXG4gICAgICAgICAgICB0aW1lbGluZS5hZGRDbGFzcygnbG9hZGVkJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXJlbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoVGltZWxpbmUgPSBOdW1iZXIodGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZVdyYXBwZXInXS5jc3MoJ3dpZHRoJykucmVwbGFjZSgncHgnLCAnJykpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG1pZGRsZSA9IHdpZHRoVGltZWxpbmUgLyAyO1xyXG4gICAgICAgICAgICAgICAgdmFyIGxlZnRWZXJzaW9uID0gTnVtYmVyKHRpbWVsaW5lQ29tcG9uZW50c1sndGltZWxpbmVWZXJzaW9uJ10uY3NzKCdsZWZ0JykucmVwbGFjZSgncHgnLCAnJykpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbXB0RGVjYWxhZ2UgPSAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gd2lkdGhUaW1lbGluZTsgaSA8IGxlZnRWZXJzaW9uOyBpICs9IG1pZGRsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXB0RGVjYWxhZ2UrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjb21wdERlY2FsYWdlID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNsaWRlKHRpbWVsaW5lQ29tcG9uZW50cywgdGltZWxpbmVUb3RXaWR0aCwgJ25leHQnLCBjb21wdERlY2FsYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9kZXRlY3QgY2xpY2sgb24gdGhlIG5leHQgYXJyb3dcclxuICAgICAgICAgICAgdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZU5hdmlnYXRpb24nXS5vbignY2xpY2snLCAnLm5leHQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVTbGlkZSh0aW1lbGluZUNvbXBvbmVudHMsIHRpbWVsaW5lVG90V2lkdGgsICduZXh0JywgMSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvL2RldGVjdCBjbGljayBvbiB0aGUgcHJldiBhcnJvd1xyXG4gICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lTmF2aWdhdGlvbiddLm9uKCdjbGljaycsICcucHJldicsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZVNsaWRlKHRpbWVsaW5lQ29tcG9uZW50cywgdGltZWxpbmVUb3RXaWR0aCwgJ3ByZXYnLCAxKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vZGV0ZWN0IGNsaWNrIG9uIHRoZSBhIHNpbmdsZSBldmVudCAtIHNob3cgbmV3IGV2ZW50IGNvbnRlbnRcclxuICAgICAgICAgICAgdGltZWxpbmVDb21wb25lbnRzWydldmVudHNXcmFwcGVyJ10ub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgIHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzV3JhcHBlciddLm9uKCdjbGljaycsICdhJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHRoaXNMaW5rID0gJCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gdGhpc0xpbmtbMF0uaWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGhpc3RvcmlxdWVBY3Rpb25zLmxlbmd0aCA8PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd0xvYWRNb2RhbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2godmVyc2lvbiwgdGhpc0xpbmtbMF0uZmlyc3RFbGVtZW50Q2hpbGQuaW5uZXJIVE1MKTtcclxuICAgICAgICAgICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lTGlua3MnXS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzTGluay5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVPbGRlckV2ZW50cyh0aGlzTGluayk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRmlsbGluZyh0aGlzTGluaywgdGltZWxpbmVDb21wb25lbnRzWydmaWxsaW5nTGluZSddLCB0aW1lbGluZVRvdFdpZHRoKTtcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVWaXNpYmxlQ29udGVudCh0aGlzTGluaywgdGltZWxpbmVDb21wb25lbnRzWydldmVudHNDb250ZW50J10pO1xyXG4gICAgICAgICAgICAgICAgICAgIGhpZGVMb2FkTW9kYWwoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnI2FsZXJ0VmVyc2lvbicpLm1vZGFsKCdzaG93Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgJChcIiNjb25maXJtVmVyc2lvblwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCcjY29uZmlybVZlcnNpb24nKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCcjYWxlcnRWZXJzaW9uJykubW9kYWwoJ2hpZGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0xvYWRNb2RhbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoKHZlcnNpb24sIHRoaXNMaW5rWzBdLmZpcnN0RWxlbWVudENoaWxkLmlubmVySFRNTCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVsaW5lQ29tcG9uZW50c1sndGltZWxpbmVMaW5rcyddLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzTGluay5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlT2xkZXJFdmVudHModGhpc0xpbmspO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVGaWxsaW5nKHRoaXNMaW5rLCB0aW1lbGluZUNvbXBvbmVudHNbJ2ZpbGxpbmdMaW5lJ10sIHRpbWVsaW5lVG90V2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVWaXNpYmxlQ29udGVudCh0aGlzTGluaywgdGltZWxpbmVDb21wb25lbnRzWydldmVudHNDb250ZW50J10pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRlTG9hZE1vZGFsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy9vbiBzd2lwZSwgc2hvdyBuZXh0L3ByZXYgZXZlbnQgY29udGVudFxyXG4gICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ2V2ZW50c0NvbnRlbnQnXS5vbignc3dpcGVsZWZ0JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG1xID0gY2hlY2tNUSgpO1xyXG4gICAgICAgICAgICAgICAgKCBtcSA9PSAnbW9iaWxlJyApICYmIHNob3dOZXdDb250ZW50KHRpbWVsaW5lQ29tcG9uZW50cywgdGltZWxpbmVUb3RXaWR0aCwgJ25leHQnKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzQ29udGVudCddLm9uKCdzd2lwZXJpZ2h0JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG1xID0gY2hlY2tNUSgpO1xyXG4gICAgICAgICAgICAgICAgKCBtcSA9PSAnbW9iaWxlJyApICYmIHNob3dOZXdDb250ZW50KHRpbWVsaW5lQ29tcG9uZW50cywgdGltZWxpbmVUb3RXaWR0aCwgJ3ByZXYnKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvL2tleWJvYXJkIG5hdmlnYXRpb25cclxuICAgICAgICAgICAgJChkb2N1bWVudCkua2V5dXAoZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT0gJzM3JyAmJiBlbGVtZW50SW5WaWV3cG9ydCh0aW1lbGluZS5nZXQoMCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd05ld0NvbnRlbnQodGltZWxpbmVDb21wb25lbnRzLCB0aW1lbGluZVRvdFdpZHRoLCAncHJldicpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC53aGljaCA9PSAnMzknICYmIGVsZW1lbnRJblZpZXdwb3J0KHRpbWVsaW5lLmdldCgwKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93TmV3Q29udGVudCh0aW1lbGluZUNvbXBvbmVudHMsIHRpbWVsaW5lVG90V2lkdGgsICduZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZVNsaWRlKHRpbWVsaW5lQ29tcG9uZW50cywgdGltZWxpbmVUb3RXaWR0aCwgc3RyaW5nLCBkZWNhbGFnZSkge1xyXG4gICAgICAgIC8vcmV0cmlldmUgdHJhbnNsYXRlWCB2YWx1ZSBvZiB0aW1lbGluZUNvbXBvbmVudHNbJ2V2ZW50c1dyYXBwZXInXVxyXG4gICAgICAgIHZhciB0cmFuc2xhdGVWYWx1ZSA9IGdldFRyYW5zbGF0ZVZhbHVlKHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzV3JhcHBlciddKSxcclxuICAgICAgICAgICAgd3JhcHBlcldpZHRoID0gTnVtYmVyKHRpbWVsaW5lQ29tcG9uZW50c1sndGltZWxpbmVXcmFwcGVyJ10uY3NzKCd3aWR0aCcpLnJlcGxhY2UoJ3B4JywgJycpKTtcclxuICAgICAgICAvL3RyYW5zbGF0ZSB0aGUgdGltZWxpbmUgdG8gdGhlIGxlZnQoJ25leHQnKS9yaWdodCgncHJldicpXHJcbiAgICAgICAgKHN0cmluZyA9PSAnbmV4dCcpXHJcbiAgICAgICAgICAgID8gdHJhbnNsYXRlVGltZWxpbmUodGltZWxpbmVDb21wb25lbnRzLCAodHJhbnNsYXRlVmFsdWUgLSB3cmFwcGVyV2lkdGggKyBldmVudHNNaW5EaXN0YW5jZSkgKiBkZWNhbGFnZSwgd3JhcHBlcldpZHRoIC0gdGltZWxpbmVUb3RXaWR0aClcclxuICAgICAgICAgICAgOiB0cmFuc2xhdGVUaW1lbGluZSh0aW1lbGluZUNvbXBvbmVudHMsIHRyYW5zbGF0ZVZhbHVlICsgd3JhcHBlcldpZHRoIC0gZXZlbnRzTWluRGlzdGFuY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dOZXdDb250ZW50KHRpbWVsaW5lQ29tcG9uZW50cywgdGltZWxpbmVUb3RXaWR0aCwgc3RyaW5nKSB7XHJcbiAgICAgICAgLy9nbyBmcm9tIG9uZSBldmVudCB0byB0aGUgbmV4dC9wcmV2aW91cyBvbmVcclxuICAgICAgICB2YXIgdmlzaWJsZUNvbnRlbnQgPSB0aW1lbGluZUNvbXBvbmVudHNbJ2V2ZW50c0NvbnRlbnQnXS5maW5kKCcuc2VsZWN0ZWQnKSxcclxuICAgICAgICAgICAgbmV3Q29udGVudCA9ICggc3RyaW5nID09ICduZXh0JyApID8gdmlzaWJsZUNvbnRlbnQubmV4dCgpIDogdmlzaWJsZUNvbnRlbnQucHJldigpO1xyXG5cclxuICAgICAgICBpZiAobmV3Q29udGVudC5sZW5ndGggPiAwKSB7IC8vaWYgdGhlcmUncyBhIG5leHQvcHJldiBldmVudCAtIHNob3cgaXRcclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkRGF0ZSA9IHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzV3JhcHBlciddLmZpbmQoJy5zZWxlY3RlZCcpLFxyXG4gICAgICAgICAgICAgICAgbmV3RXZlbnQgPSAoIHN0cmluZyA9PSAnbmV4dCcgKSA/IHNlbGVjdGVkRGF0ZS5wYXJlbnQoJ2xpJykubmV4dCgnbGknKS5jaGlsZHJlbignYScpIDogc2VsZWN0ZWREYXRlLnBhcmVudCgnbGknKS5wcmV2KCdsaScpLmNoaWxkcmVuKCdhJyk7XHJcblxyXG4gICAgICAgICAgICB1cGRhdGVGaWxsaW5nKG5ld0V2ZW50LCB0aW1lbGluZUNvbXBvbmVudHNbJ2ZpbGxpbmdMaW5lJ10sIHRpbWVsaW5lVG90V2lkdGgpO1xyXG4gICAgICAgICAgICB1cGRhdGVWaXNpYmxlQ29udGVudChuZXdFdmVudCwgdGltZWxpbmVDb21wb25lbnRzWydldmVudHNDb250ZW50J10pO1xyXG4gICAgICAgICAgICBuZXdFdmVudC5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgc2VsZWN0ZWREYXRlLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICB1cGRhdGVPbGRlckV2ZW50cyhuZXdFdmVudCk7XHJcbiAgICAgICAgICAgIHVwZGF0ZVRpbWVsaW5lUG9zaXRpb24oc3RyaW5nLCBuZXdFdmVudCwgdGltZWxpbmVDb21wb25lbnRzLCB0aW1lbGluZVRvdFdpZHRoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdXBkYXRlVGltZWxpbmVQb3NpdGlvbihzdHJpbmcsIGV2ZW50LCB0aW1lbGluZUNvbXBvbmVudHMsIHRpbWVsaW5lVG90V2lkdGgpIHtcclxuICAgICAgICAvL3RyYW5zbGF0ZSB0aW1lbGluZSB0byB0aGUgbGVmdC9yaWdodCBhY2NvcmRpbmcgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWxlY3RlZCBldmVudFxyXG4gICAgICAgIHZhciBldmVudFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZXZlbnQuZ2V0KDApLCBudWxsKSxcclxuICAgICAgICAgICAgZXZlbnRMZWZ0ID0gTnVtYmVyKGV2ZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImxlZnRcIikucmVwbGFjZSgncHgnLCAnJykpLFxyXG4gICAgICAgICAgICB0aW1lbGluZVdpZHRoID0gTnVtYmVyKHRpbWVsaW5lQ29tcG9uZW50c1sndGltZWxpbmVXcmFwcGVyJ10uY3NzKCd3aWR0aCcpLnJlcGxhY2UoJ3B4JywgJycpKSxcclxuICAgICAgICAgICAgdGltZWxpbmVUb3RXaWR0aCA9IE51bWJlcih0aW1lbGluZUNvbXBvbmVudHNbJ2V2ZW50c1dyYXBwZXInXS5jc3MoJ3dpZHRoJykucmVwbGFjZSgncHgnLCAnJykpO1xyXG4gICAgICAgIHZhciB0aW1lbGluZVRyYW5zbGF0ZSA9IGdldFRyYW5zbGF0ZVZhbHVlKHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzV3JhcHBlciddKTtcclxuXHJcbiAgICAgICAgaWYgKChzdHJpbmcgPT0gJ25leHQnICYmIGV2ZW50TGVmdCA+IHRpbWVsaW5lV2lkdGggLSB0aW1lbGluZVRyYW5zbGF0ZSkgfHwgKHN0cmluZyA9PSAncHJldicgJiYgZXZlbnRMZWZ0IDwgLXRpbWVsaW5lVHJhbnNsYXRlKSkge1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVUaW1lbGluZSh0aW1lbGluZUNvbXBvbmVudHMsIC1ldmVudExlZnQgKyB0aW1lbGluZVdpZHRoIC8gMiwgdGltZWxpbmVXaWR0aCAtIHRpbWVsaW5lVG90V2lkdGgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVUaW1lbGluZSh0aW1lbGluZUNvbXBvbmVudHMsIHZhbHVlLCB0b3RXaWR0aCkge1xyXG4gICAgICAgIHZhciBldmVudHNXcmFwcGVyID0gdGltZWxpbmVDb21wb25lbnRzWydldmVudHNXcmFwcGVyJ10uZ2V0KDApO1xyXG4gICAgICAgIHZhbHVlID0gKHZhbHVlID4gMCkgPyAwIDogdmFsdWU7IC8vb25seSBuZWdhdGl2ZSB0cmFuc2xhdGUgdmFsdWVcclxuICAgICAgICB2YWx1ZSA9ICggISh0eXBlb2YgdG90V2lkdGggPT09ICd1bmRlZmluZWQnKSAmJiB2YWx1ZSA8IHRvdFdpZHRoICkgPyB0b3RXaWR0aCA6IHZhbHVlOyAvL2RvIG5vdCB0cmFuc2xhdGUgbW9yZSB0aGFuIHRpbWVsaW5lIHdpZHRoXHJcbiAgICAgICAgc2V0VHJhbnNmb3JtVmFsdWUoZXZlbnRzV3JhcHBlciwgJ3RyYW5zbGF0ZVgnLCB2YWx1ZSArICdweCcpO1xyXG4gICAgICAgIC8vdXBkYXRlIG5hdmlnYXRpb24gYXJyb3dzIHZpc2liaWxpdHlcclxuICAgICAgICAodmFsdWUgPT0gMCApID8gdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZU5hdmlnYXRpb24nXS5maW5kKCcucHJldicpLmFkZENsYXNzKCdpbmFjdGl2ZScpIDogdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZU5hdmlnYXRpb24nXS5maW5kKCcucHJldicpLnJlbW92ZUNsYXNzKCdpbmFjdGl2ZScpO1xyXG4gICAgICAgICh2YWx1ZSA9PSB0b3RXaWR0aCApID8gdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZU5hdmlnYXRpb24nXS5maW5kKCcubmV4dCcpLmFkZENsYXNzKCdpbmFjdGl2ZScpIDogdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZU5hdmlnYXRpb24nXS5maW5kKCcubmV4dCcpLnJlbW92ZUNsYXNzKCdpbmFjdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZUZpbGxpbmcoc2VsZWN0ZWRFdmVudCwgZmlsbGluZywgdG90V2lkdGgpIHtcclxuICAgICAgICAvL2NoYW5nZSAuZmlsbGluZy1saW5lIGxlbmd0aCBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGV2ZW50XHJcbiAgICAgICAgdmFyIGV2ZW50U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzZWxlY3RlZEV2ZW50LmdldCgwKSwgbnVsbCksXHJcbiAgICAgICAgICAgIGV2ZW50TGVmdCA9IGV2ZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImxlZnRcIiksXHJcbiAgICAgICAgICAgIGV2ZW50V2lkdGggPSBldmVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiKTtcclxuICAgICAgICBldmVudExlZnQgPSBOdW1iZXIoZXZlbnRMZWZ0LnJlcGxhY2UoJyUnLCAnJykpICsgTnVtYmVyKGV2ZW50V2lkdGgucmVwbGFjZSgnJScsICcnKSkgLyAyO1xyXG4gICAgICAgIHZhciBzY2FsZVZhbHVlID0gZXZlbnRMZWZ0IC8gdG90V2lkdGg7XHJcbiAgICAgICAgc2V0VHJhbnNmb3JtVmFsdWUoZmlsbGluZy5nZXQoMCksICdzY2FsZVgnLCBzY2FsZVZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXREYXRlUG9zaXRpb24odGltZWxpbmVDb21wb25lbnRzLCBtaW4pIHtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZURhdGVzJ10ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZUV2ZW50cyddLmVxKGkpLmNzcygnbGVmdCcsIChpKSAqIG1pbiArICdweCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXRUaW1lbGluZVdpZHRoKHRpbWVsaW5lQ29tcG9uZW50cywgdG90YWxXaWR0aCkge1xyXG4gICAgICAgIHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzV3JhcHBlciddLmNzcygnd2lkdGgnLCB0b3RhbFdpZHRoICsgJ3B4Jyk7XHJcbiAgICAgICAgdXBkYXRlRmlsbGluZyh0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lRXZlbnRzJ10uZXEoMCksIHRpbWVsaW5lQ29tcG9uZW50c1snZmlsbGluZ0xpbmUnXSwgdG90YWxXaWR0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdXBkYXRlVmlzaWJsZUNvbnRlbnQoZXZlbnQsIGV2ZW50c0NvbnRlbnQpIHtcclxuICAgICAgICB2YXIgZXZlbnREYXRlID0gZXZlbnQuZGF0YSgnZGF0ZScpLFxyXG4gICAgICAgICAgICB2aXNpYmxlQ29udGVudCA9IGV2ZW50c0NvbnRlbnQuZmluZCgnLnNlbGVjdGVkJyksXHJcbiAgICAgICAgICAgIHNlbGVjdGVkQ29udGVudCA9IGV2ZW50c0NvbnRlbnQuZmluZCgnW2RhdGEtZGF0ZT1cIicgKyBldmVudERhdGUgKyAnXCJdJyksXHJcbiAgICAgICAgICAgIHNlbGVjdGVkQ29udGVudEhlaWdodCA9IHNlbGVjdGVkQ29udGVudC5oZWlnaHQoKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGVkQ29udGVudC5pbmRleCgpID4gdmlzaWJsZUNvbnRlbnQuaW5kZXgoKSkge1xyXG4gICAgICAgICAgICB2YXIgY2xhc3NFbmV0ZXJpbmcgPSAnc2VsZWN0ZWQgZW50ZXItcmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgY2xhc3NMZWF2aW5nID0gJ2xlYXZlLWxlZnQnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBjbGFzc0VuZXRlcmluZyA9ICdzZWxlY3RlZCBlbnRlci1sZWZ0JyxcclxuICAgICAgICAgICAgICAgIGNsYXNzTGVhdmluZyA9ICdsZWF2ZS1yaWdodCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZWxlY3RlZENvbnRlbnQuYXR0cignY2xhc3MnLCBjbGFzc0VuZXRlcmluZyk7XHJcbiAgICAgICAgdmlzaWJsZUNvbnRlbnQuYXR0cignY2xhc3MnLCBjbGFzc0xlYXZpbmcpLm9uZSgnd2Via2l0QW5pbWF0aW9uRW5kIG9hbmltYXRpb25lbmQgbXNBbmltYXRpb25FbmQgYW5pbWF0aW9uZW5kJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2aXNpYmxlQ29udGVudC5yZW1vdmVDbGFzcygnbGVhdmUtcmlnaHQgbGVhdmUtbGVmdCcpO1xyXG4gICAgICAgICAgICBzZWxlY3RlZENvbnRlbnQucmVtb3ZlQ2xhc3MoJ2VudGVyLWxlZnQgZW50ZXItcmlnaHQnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBldmVudHNDb250ZW50LmNzcygnaGVpZ2h0Jywgc2VsZWN0ZWRDb250ZW50SGVpZ2h0ICsgJ3B4Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdXBkYXRlT2xkZXJFdmVudHMoZXZlbnQpIHtcclxuICAgICAgICBldmVudC5wYXJlbnQoJ2xpJykucHJldkFsbCgnbGknKS5jaGlsZHJlbignYScpLmFkZENsYXNzKCdvbGRlci1ldmVudCcpLmVuZCgpLmVuZCgpLm5leHRBbGwoJ2xpJykuY2hpbGRyZW4oJ2EnKS5yZW1vdmVDbGFzcygnb2xkZXItZXZlbnQnKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRUcmFuc2xhdGVWYWx1ZSh0aW1lbGluZSkge1xyXG4gICAgICAgIHZhciB0aW1lbGluZVN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGltZWxpbmUuZ2V0KDApLCBudWxsKSxcclxuICAgICAgICAgICAgdGltZWxpbmVUcmFuc2xhdGUgPSB0aW1lbGluZVN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCItd2Via2l0LXRyYW5zZm9ybVwiKSB8fFxyXG4gICAgICAgICAgICAgICAgdGltZWxpbmVTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiLW1vei10cmFuc2Zvcm1cIikgfHxcclxuICAgICAgICAgICAgICAgIHRpbWVsaW5lU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi1tcy10cmFuc2Zvcm1cIikgfHxcclxuICAgICAgICAgICAgICAgIHRpbWVsaW5lU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi1vLXRyYW5zZm9ybVwiKSB8fFxyXG4gICAgICAgICAgICAgICAgdGltZWxpbmVTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwidHJhbnNmb3JtXCIpO1xyXG5cclxuICAgICAgICBpZiAodGltZWxpbmVUcmFuc2xhdGUuaW5kZXhPZignKCcpID49IDApIHtcclxuICAgICAgICAgICAgdmFyIHRpbWVsaW5lVHJhbnNsYXRlID0gdGltZWxpbmVUcmFuc2xhdGUuc3BsaXQoJygnKVsxXTtcclxuICAgICAgICAgICAgdGltZWxpbmVUcmFuc2xhdGUgPSB0aW1lbGluZVRyYW5zbGF0ZS5zcGxpdCgnKScpWzBdO1xyXG4gICAgICAgICAgICB0aW1lbGluZVRyYW5zbGF0ZSA9IHRpbWVsaW5lVHJhbnNsYXRlLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgICAgIHZhciB0cmFuc2xhdGVWYWx1ZSA9IHRpbWVsaW5lVHJhbnNsYXRlWzRdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciB0cmFuc2xhdGVWYWx1ZSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRyYW5zbGF0ZVZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXRUcmFuc2Zvcm1WYWx1ZShlbGVtZW50LCBwcm9wZXJ0eSwgdmFsdWUpIHtcclxuICAgICAgICBlbGVtZW50LnN0eWxlW1wiLXdlYmtpdC10cmFuc2Zvcm1cIl0gPSBwcm9wZXJ0eSArIFwiKFwiICsgdmFsdWUgKyBcIilcIjtcclxuICAgICAgICBlbGVtZW50LnN0eWxlW1wiLW1vei10cmFuc2Zvcm1cIl0gPSBwcm9wZXJ0eSArIFwiKFwiICsgdmFsdWUgKyBcIilcIjtcclxuICAgICAgICBlbGVtZW50LnN0eWxlW1wiLW1zLXRyYW5zZm9ybVwiXSA9IHByb3BlcnR5ICsgXCIoXCIgKyB2YWx1ZSArIFwiKVwiO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGVbXCItby10cmFuc2Zvcm1cIl0gPSBwcm9wZXJ0eSArIFwiKFwiICsgdmFsdWUgKyBcIilcIjtcclxuICAgICAgICBlbGVtZW50LnN0eWxlW1widHJhbnNmb3JtXCJdID0gcHJvcGVydHkgKyBcIihcIiArIHZhbHVlICsgXCIpXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLy9iYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU0MjkzOC9ob3ctZG8taS1nZXQtdGhlLW51bWJlci1vZi1kYXlzLWJldHdlZW4tdHdvLWRhdGVzLWluLWphdmFzY3JpcHRcclxuICAgIGZ1bmN0aW9uIHBhcnNlRGF0ZShldmVudHMpIHtcclxuICAgICAgICB2YXIgZGF0ZUFycmF5cyA9IFtdO1xyXG4gICAgICAgIGV2ZW50cy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGRhdGVDb21wID0gJCh0aGlzKS5kYXRhKCdkYXRlJykuc3BsaXQoJy8nKSxcclxuICAgICAgICAgICAgICAgIG5ld0RhdGUgPSBuZXcgRGF0ZShkYXRlQ29tcFsyXSwgZGF0ZUNvbXBbMV0gLSAxLCBkYXRlQ29tcFswXSk7XHJcbiAgICAgICAgICAgIGRhdGVBcnJheXMucHVzaChuZXdEYXRlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gZGF0ZUFycmF5cztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwYXJzZURhdGUyKGV2ZW50cykge1xyXG4gICAgICAgIHZhciBkYXRlQXJyYXlzID0gW107XHJcbiAgICAgICAgZXZlbnRzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgc2luZ2xlRGF0ZSA9ICQodGhpcyksXHJcbiAgICAgICAgICAgICAgICBkYXRlQ29tcCA9IHNpbmdsZURhdGUuZGF0YSgnZGF0ZScpLnNwbGl0KCdUJyk7XHJcbiAgICAgICAgICAgIGlmIChkYXRlQ29tcC5sZW5ndGggPiAxKSB7IC8vYm90aCBERC9NTS9ZRUFSIGFuZCB0aW1lIGFyZSBwcm92aWRlZFxyXG4gICAgICAgICAgICAgICAgdmFyIGRheUNvbXAgPSBkYXRlQ29tcFswXS5zcGxpdCgnLycpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpbWVDb21wID0gZGF0ZUNvbXBbMV0uc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRlQ29tcFswXS5pbmRleE9mKCc6JykgPj0gMCkgeyAvL29ubHkgdGltZSBpcyBwcm92aWRlXHJcbiAgICAgICAgICAgICAgICB2YXIgZGF5Q29tcCA9IFtcIjIwMDBcIiwgXCIwXCIsIFwiMFwiXSxcclxuICAgICAgICAgICAgICAgICAgICB0aW1lQ29tcCA9IGRhdGVDb21wWzBdLnNwbGl0KCc6Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vb25seSBERC9NTS9ZRUFSXHJcbiAgICAgICAgICAgICAgICB2YXIgZGF5Q29tcCA9IGRhdGVDb21wWzBdLnNwbGl0KCcvJyksXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZUNvbXAgPSBbXCIwXCIsIFwiMFwiXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgbmV3RGF0ZSA9IG5ldyBEYXRlKGRheUNvbXBbMl0sIGRheUNvbXBbMV0gLSAxLCBkYXlDb21wWzBdLCB0aW1lQ29tcFswXSwgdGltZUNvbXBbMV0pO1xyXG4gICAgICAgICAgICBkYXRlQXJyYXlzLnB1c2gobmV3RGF0ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGRhdGVBcnJheXM7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGF5ZGlmZihmaXJzdCwgc2Vjb25kKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKHNlY29uZCAtIGZpcnN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbWluTGFwc2UoZGF0ZXMpIHtcclxuICAgICAgICAvL2RldGVybWluZSB0aGUgbWluaW11bSBkaXN0YW5jZSBhbW9uZyBldmVudHNcclxuICAgICAgICB2YXIgZGF0ZURpc3RhbmNlcyA9IFtdO1xyXG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBkYXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBkYXlkaWZmKGRhdGVzW2kgLSAxXSwgZGF0ZXNbaV0pO1xyXG4gICAgICAgICAgICBkYXRlRGlzdGFuY2VzLnB1c2goZGlzdGFuY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTWF0aC5taW4uYXBwbHkobnVsbCwgZGF0ZURpc3RhbmNlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAgICBIb3cgdG8gdGVsbCBpZiBhIERPTSBlbGVtZW50IGlzIHZpc2libGUgaW4gdGhlIGN1cnJlbnQgdmlld3BvcnQ/XHJcbiAgICAgICAgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjM5OTkvaG93LXRvLXRlbGwtaWYtYS1kb20tZWxlbWVudC1pcy12aXNpYmxlLWluLXRoZS1jdXJyZW50LXZpZXdwb3J0XHJcbiAgICAqL1xyXG4gICAgZnVuY3Rpb24gZWxlbWVudEluVmlld3BvcnQoZWwpIHtcclxuICAgICAgICB2YXIgdG9wID0gZWwub2Zmc2V0VG9wO1xyXG4gICAgICAgIHZhciBsZWZ0ID0gZWwub2Zmc2V0TGVmdDtcclxuICAgICAgICB2YXIgd2lkdGggPSBlbC5vZmZzZXRXaWR0aDtcclxuICAgICAgICB2YXIgaGVpZ2h0ID0gZWwub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgICAgICB3aGlsZSAoZWwub2Zmc2V0UGFyZW50KSB7XHJcbiAgICAgICAgICAgIGVsID0gZWwub2Zmc2V0UGFyZW50O1xyXG4gICAgICAgICAgICB0b3AgKz0gZWwub2Zmc2V0VG9wO1xyXG4gICAgICAgICAgICBsZWZ0ICs9IGVsLm9mZnNldExlZnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0b3AgPCAod2luZG93LnBhZ2VZT2Zmc2V0ICsgd2luZG93LmlubmVySGVpZ2h0KSAmJlxyXG4gICAgICAgICAgICBsZWZ0IDwgKHdpbmRvdy5wYWdlWE9mZnNldCArIHdpbmRvdy5pbm5lcldpZHRoKSAmJlxyXG4gICAgICAgICAgICAodG9wICsgaGVpZ2h0KSA+IHdpbmRvdy5wYWdlWU9mZnNldCAmJlxyXG4gICAgICAgICAgICAobGVmdCArIHdpZHRoKSA+IHdpbmRvdy5wYWdlWE9mZnNldFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2hlY2tNUSgpIHtcclxuICAgICAgICAvL2NoZWNrIGlmIG1vYmlsZSBvciBkZXNrdG9wIGRldmljZVxyXG4gICAgICAgIHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2QtaG9yaXpvbnRhbC10aW1lbGluZScpLCAnOjpiZWZvcmUnKS5nZXRQcm9wZXJ0eVZhbHVlKCdjb250ZW50JykucmVwbGFjZSgvJy9nLCBcIlwiKS5yZXBsYWNlKC9cIi9nLCBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKkZJTiBUSU1FTElORSovXHJcblxyXG5cclxuICAgIC8qRk9OQ1RJT05TIEJPT1NUUkFQIFRBQkxFKi9cclxuICAgIGZ1bmN0aW9uIHRvdGFsRm9ybWF0dGVyKGRhdGEpIHtcclxuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmZpZWxkXHJcbiAgICAgICAgcmV0dXJuIGRhdGEubWFwKGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgcmV0dXJuICtyb3dbZmllbGRdXHJcbiAgICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uIChzdW0sIGkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN1bSArIGlcclxuICAgICAgICB9LCAwKVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGZvb3RlclN0eWxlKHJvdywgaW5kZXgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjc3M6IHtcclxuICAgICAgICAgICAgICAgIFwidGV4dC1hbGlnblwiOiBcImNlbnRlclwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuICAgIC8qRklOIEZPTkNUSU9OUyBCT09TVFJBUCBUQUJMRSovXHJcblxyXG4gICAgLypGT05DVElPTlMqL1xyXG5cclxuICAgIGZ1bmN0aW9uIGluaXRTZWN0byh2ZXJzaW9uLCBkYXRlTWVwLCB2aWFCdXR0b24pIHtcclxuXHJcbiAgICAgICAgLy9zaG93TG9hZE1vZGFsKCk7XHJcbiAgICAgICAgLy8gaWYgKHZlcnNpb24gPT0gdW5kZWZpbmVkIHx8IHZlcnNpb24gPT0gJycpIHtcclxuICAgICAgICAvLyAgICAgLy9nZXRCaWdQb2x5Z29uKCdiYXNlJyk7IC8vcGVybWV0IGQnYXZvaXIgbGVzIGNvbnRvdXJzIG5vaXJzIGRlcyBwb2x5Z29ucyBkZXMgc2VjdGV1cnMgZXQgbm9uIGdyaXMuXHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gdmFyIGluaXRIaXN0b1BvbHlnb24gPSBmYWxzZTtcclxuICAgICAgICAvLyBpZiAoaGlzdG9Qb2x5Z29uID09ICcnKSB7XHJcbiAgICAgICAgLy8gICAgIGluaXRIaXN0b1BvbHlnb24gPSB0cnVlO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogXCJqc29uXCIsXHJcbiAgICAgICAgICAgIHVybDogXCIvbWFwL2dldF9zZWN0ZXVyc1wiLFxyXG4gICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgc2VjdGV1cnMgPSBKU09OLnBhcnNlKHJlc3VsdFsnc2VjdGV1cnMnXSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2VjdGV1cnMgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAvL2xhc3RJZCA9IHJlc3VsdFsnbGFzdElkJ107XHJcbiAgICAgICAgICAgICAgICB2YXIgbGF0TG9uZyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgIHNlY3RldXJzLmZvckVhY2goZnVuY3Rpb24gKHNlY3RldXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VjdGV1ci5jb29yZG9ubmVlcy50eXBlID09IFwiUG9seWdvblwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3RldXIuY29vcmRvbm5lZXMuY29vcmRpbmF0ZXNbMF0uZm9yRWFjaChmdW5jdGlvbiAobG9jYXRpb25BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0TG9uZy5wdXNoKFtsb2NhdGlvbkFycmF5WzFdLCBsb2NhdGlvbkFycmF5WzBdXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvbHlnb24gPSBMLnBvbHlnb24obGF0TG9uZywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWQ6IGN1cnJlbnRGZWF0dXJlLmlkUG9seWdvbiwgLy9wb3VyIGwnZW5yZWdpc3RyZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5iQ2xpZW50czogY3VycmVudEZlYXR1cmUubmJDbGllbnRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFtaWxsZTA6IGN1cnJlbnRGZWF0dXJlLmZhbWlsbGUwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFtaWxsZTE6IGN1cnJlbnRGZWF0dXJlLmZhbWlsbGUxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFtaWxsZTI6IGN1cnJlbnRGZWF0dXJlLmZhbWlsbGUyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFtaWxsZTM6IGN1cnJlbnRGZWF0dXJlLmZhbWlsbGUzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9tU2VjdGV1cjogY3VycmVudEZlYXR1cmUubm9tU2VjdGV1cixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGVBZ2VudDogY3VycmVudEZlYXR1cmUuY29kZUFnZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcGxlYW50MTogY3VycmVudEZlYXR1cmUuc3VwcGxlYW50MSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBsZWFudDI6IGN1cnJlbnRGZWF0dXJlLnN1cHBsZWFudDIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwbGVhbnQzOiBjdXJyZW50RmVhdHVyZS5zdXBwbGVhbnQzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcGxlYW50NDogY3VycmVudEZlYXR1cmUuc3VwcGxlYW50NCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpdGU6IGN1cnJlbnRGZWF0dXJlLnNpdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlR3JvdXBlOiBjdXJyZW50RmVhdHVyZS5jb2RlR3JvdXBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5hZGRUbyhtYXBTZWN0byk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aXRob3V0QWdlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0ZXVyLmFnZW50U2VjdGV1cnMuc29tZShmdW5jdGlvbiAoYWdlbnQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWdlbnQucmFuZ190cmkgPT0gMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWNvbG9yc1thZ2VudC51dGlsaXNhdGV1cl9hZ2VudC5ncm91cGVfYWZmZWN0YXRpb25dKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yc1thZ2VudC51dGlsaXNhdGV1cl9hZ2VudC5ncm91cGVfYWZmZWN0YXRpb25dID0gdGFiQ29sb3JbY291bnRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5Z29uLnNldFN0eWxlKGdldFN0eWxlKGFnZW50LnV0aWxpc2F0ZXVyX2FnZW50Lmdyb3VwZV9hZmZlY3RhdGlvbikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXRBZ2VudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaXJjbGUgPSBuZXcgTC5DaXJjbGVNYXJrZXIocG9seWdvbi5nZXRDZW50ZXIoKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpdXM6IDAuMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUFnZW50OiBhZ2VudC51dGlsaXNhdGV1cl9hZ2VudC5pbml0aWFsZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5iaW5kVG9vbHRpcCgnJyArIGFnZW50LnV0aWxpc2F0ZXVyX2FnZW50LmluaXRpYWxlcywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtYW5lbnQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIm15LWxhYmVsc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnRzT2ZTZWN0ZXVycy5hZGRMYXllcihjaXJjbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYod2l0aG91dEFnZW50KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHlnb24uc2V0U3R5bGUoZ2V0U3R5bGUoJycpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kVG9vbHRpcE5iQ2xpZW50cyhzZWN0ZXVyLCBwb2x5Z29uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGluaXRIaXN0b1BvbHlnb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhpc3RvUG9seWdvbiA9IEwucG9seWdvbihsYXRMb25nKS5hZGRUbyhoaXN0b01hcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChjdXJyZW50RmVhdHVyZS5jb2RlQWdlbnQgPT0gJycpIHsgLy9mYWlyZSByZXNzb3J0aXIgbGVzIHNlY3RldXJzIHNhbnMgYWdlbnRzIHByaW5jaXBhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcG9seWdvbi5zZXRTdHlsZShnZXRTdHlsZSgnJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgLy8gaWYgKGluaXRIaXN0b1BvbHlnb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vICAgICBoaXN0b1BvbHlnb24uc2V0U3R5bGUoZ2V0U3R5bGUoJycpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHBvbHlnb24uc2V0U3R5bGUoZ2V0U3R5bGUoY3VycmVudEZlYXR1cmUuY29kZUdyb3VwZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgLy8gaWYgKGluaXRIaXN0b1BvbHlnb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vICAgICBoaXN0b1BvbHlnb24uc2V0U3R5bGUoZ2V0U3R5bGUoY3VycmVudEZlYXR1cmUuY29kZUdyb3VwZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXNlY3RldXJzQnlSZXNwb25zYWJsZVtjdXJyZW50RmVhdHVyZS5jb2RlR3JvdXBlXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc2VjdGV1cnNCeVJlc3BvbnNhYmxlW2N1cnJlbnRGZWF0dXJlLmNvZGVHcm91cGVdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFzZWN0ZXVyc0J5UmVzcG9uc2FibGVbY3VycmVudEZlYXR1cmUuY29kZUdyb3VwZV1bY3VycmVudEZlYXR1cmUuY29kZUFnZW50XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc2VjdGV1cnNCeVJlc3BvbnNhYmxlW2N1cnJlbnRGZWF0dXJlLmNvZGVHcm91cGVdW2N1cnJlbnRGZWF0dXJlLmNvZGVBZ2VudF0gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWN0ZXVyc0J5UmVzcG9uc2FibGVbY3VycmVudEZlYXR1cmUuY29kZUdyb3VwZV1bY3VycmVudEZlYXR1cmUuY29kZUFnZW50XVtjdXJyZW50RmVhdHVyZS5pZFBvbHlnb25dID0gcG9seWdvbi50b0dlb0pTT04oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWRpdGFibGVMYXllcnMuYWRkTGF5ZXIocG9seWdvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChjdXJyZW50RmVhdHVyZSAmJiBjdXJyZW50RmVhdHVyZS5jb2RlQWdlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHZhciBjaXJjbGUgPSBuZXcgTC5DaXJjbGVNYXJrZXIocG9seWdvbi5nZXRDZW50ZXIoKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHJhZGl1czogMC4xLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIG9wYWNpdHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgY29kZUFnZW50OiBjdXJyZW50RmVhdHVyZS5jb2RlQWdlbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIH0pLmJpbmRUb29sdGlwKCcnICsgY3VycmVudEZlYXR1cmUuY29kZUFnZW50LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgcGVybWFuZW50OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIGRpcmVjdGlvbjogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBjbGFzc05hbWU6IFwibXktbGFiZWxzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWdlbnRzT2ZTZWN0ZXVycy5hZGRMYXllcihjaXJjbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaWYgKGluaXRIaXN0b1BvbHlnb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB2YXIgaGlzdG9DaXJjbGUgPSBuZXcgTC5DaXJjbGVNYXJrZXIoaGlzdG9Qb2x5Z29uLmdldENlbnRlcigpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHJhZGl1czogMC4xLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBvcGFjaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBjb2RlQWdlbnQ6IGN1cnJlbnRGZWF0dXJlLmNvZGVBZ2VudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0pLmJpbmRUb29sdGlwKCcnICsgY3VycmVudEZlYXR1cmUuY29kZUFnZW50LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHBlcm1hbmVudDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGlyZWN0aW9uOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBjbGFzc05hbWU6IFwibXktbGFiZWxzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBoaXN0b0FnZW50c09mU2VjdGV1cnMuYWRkTGF5ZXIoaGlzdG9DaXJjbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXRMb25nID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRFdmVuZW1lbnRMYXllcihwb2x5Z29uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIC8vYWRkSGlzdG8oJ0luaXRpYWxpc2F0aW9uJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBnZXREZW5zaXRlKHZlcnNpb24sIHRydWUsIGRhdGVNZXApO1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgKHZpYUJ1dHRvbikge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgICQoJy5ldmVudHMnKVswXS5pbm5lckhUTUwgPSByZXN1bHQudGltZWxpbmU7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgaW5pdFRpbWVsaW5lKHRpbWVsaW5lcywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAvLyBjYWxjdWxOYkNsaWVudHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGdldEFnZW50cygpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRBZ2VudHMoKSB7XHJcbiAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgZGF0YVR5cGU6IFwianNvblwiLFxyXG4gICAgICAgICAgICB1cmw6IFwiL2FnZW50cy9kb21pY2lsZVwiLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKGRhdGEpXHJcbiAgICAgICAgICAgICAgICAvL2dlb2pzb25BZ2VudHMgPSBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChhZ2VudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwb2ludCA9IFswLCAwXTtcclxuICAgICAgICAgICAgICAgICAgICBpZihhZ2VudC5jb29yZG9ubmVlcyAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgPSBbYWdlbnQuY29vcmRvbm5lZXMubGF0aXR1ZGUsIGFnZW50LmNvb3Jkb25uZWVzLmxvbmdpdHVkZV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBMLm1hcmtlcihwb2ludCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByYWRpdXM6IDYsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogXCIjMjg1MjlhXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcIiNmZmZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29kZUFnZW50OiBhZ2VudC5wcm9wZXJ0aWVzLmNvZGVBZ2VudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29kZUdyb3VwZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmNvZGVHcm91cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldGFpbEFnZW50OiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBDb250ZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBjaXJjbGVJY29uXHJcbiAgICAgICAgICAgICAgICAgICAgfSkuYWRkVG8obWFwU2VjdG8pO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kUG9wdXAoYWdlbnQubm9tQ29tcGxldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYWdlbnRzLmFkZExheWVyKG1hcmtlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyBhZ2VudHMgPSBMLmdlb0pTT04oZGF0YSwge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIHBvaW50VG9MYXllcjogZnVuY3Rpb24gKGZlYXR1cmUsIGxhdGxuZykge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICByZXR1cm4gTC5tYXJrZXIobGF0bG5nLCB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICByYWRpdXM6IDYsXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBmaWxsQ29sb3I6IFwiIzI4NTI5YVwiLFxyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgY29sb3I6IFwiI2ZmZlwiLFxyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgd2VpZ2h0OiAxLFxyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgb3BhY2l0eTogMSxcclxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgY29kZUFnZW50OiBmZWF0dXJlLnByb3BlcnRpZXMuY29kZUFnZW50LFxyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgY29kZUdyb3VwZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmNvZGVHcm91cGUsXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkZXRhaWxBZ2VudDogZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwQ29udGVudCxcclxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGljb246IGNpcmNsZUljb25cclxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgfSxcclxuICAgICAgICAgICAgICAgIC8vICAgICBvbkVhY2hGZWF0dXJlOiBmdW5jdGlvbiAoZmVhdHVyZSwgbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBsYXllci5iaW5kUG9wdXAoZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwQ29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB9KS5hZGRUbyhtYXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0QmlnUG9seWdvbih0eXBlLCB2ZXJzaW9uKSB7XHJcbiAgICAgICAgLy8gaWYgKCF2ZXJzaW9uKSB7XHJcbiAgICAgICAgLy8gICAgIHZhciBqc29uID0gJ3tcInR5cGVcIjogXCJGZWF0dXJlQ29sbGVjdGlvblwiLFwiZmVhdHVyZXNcIjogWyc7XHJcbiAgICAgICAgLy8gICAgIHZhciBmZWF0dXJlcyA9IFwiXCI7XHJcbiAgICAgICAgLy8gICAgIG1hcC5lYWNoTGF5ZXIoZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAobGF5ZXIub3B0aW9ucyAmJiBsYXllci5vcHRpb25zLmlkKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgZmVhdHVyZXMgKz0gSlNPTi5zdHJpbmdpZnkobGF5ZXJUb0pTT04obGF5ZXIpKSArIFwiLFwiO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9KTtcclxuICAgICAgICAvLyAgICAgdmVyc2lvbiA9IGpzb24gKyBmZWF0dXJlcy5zbGljZSgwLCAtMSkgKyAnXX0nO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6IFwianNvblwiLFxyXG4gICAgICAgICAgICB1cmw6IFwie3sgcGF0aCgnZ2V0X2JpZ19wb2x5Z29uJykgfX1cIixcclxuICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICAgICAgICAgIHNlY3RldXJzOiB2ZXJzaW9uXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBiaWdQb2x5Z29uID0gTC5HZW9KU09OLmdlb21ldHJ5VG9MYXllcihKU09OLnBhcnNlKGRhdGEuYmlnUG9seWdvbiksIG9wdGlvbnMucG9pbnRUb0xheWVyLCBvcHRpb25zLmNvb3Jkc1RvTGF0TG5nKTtcclxuICAgICAgICAgICAgICAgIGd1aWRlTGF5ZXJzLnNwbGljZSgwLCBndWlkZUxheWVycy5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgZ3VpZGVMYXllcnMucHVzaChiaWdQb2x5Z29uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5iaWdQb2x5Z29uQW50ZW5uZXMgIT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXAucmVtb3ZlTGF5ZXIoYW50ZW5uZXNHbG9iYWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcC5yZW1vdmVMYXllcihhbnRlbm5lcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYW50ZW5uZXNHbG9iYWwgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgICAgICAgICAgICAgICAgICBhbnRlbm5lcyA9IG5ldyBMLkZlYXR1cmVHcm91cCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJpZ1BvbHlnb25BbnRlbm5lcyA9IEwuR2VvSlNPTi5nZW9tZXRyeVRvTGF5ZXIoSlNPTi5wYXJzZShkYXRhLmJpZ1BvbHlnb25BbnRlbm5lcyksIG9wdGlvbnMucG9pbnRUb0xheWVyLCBvcHRpb25zLmNvb3Jkc1RvTGF0TG5nKTtcclxuICAgICAgICAgICAgICAgICAgICBndWlkZUxheWVycy5wdXNoKGJpZ1BvbHlnb25BbnRlbm5lcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5hbnRlbm5lcy5sZW5ndGg7IGkrKykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYW50ZW5uZXMuYWRkTGF5ZXIoIEwuR2VvSlNPTi5nZW9tZXRyeVRvTGF5ZXIoSlNPTi5wYXJzZShkYXRhLmFudGVubmVzW2ldWydzZWN0ZXVyJ10pKSwgb3B0aW9ucy5wb2ludFRvTGF5ZXIsIG9wdGlvbnMuY29vcmRzVG9MYXRMbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBhbnRlbm5lc0dsb2JhbC5hZGRMYXllcihiaWdQb2x5Z29uQW50ZW5uZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFudGVubmVzR2xvYmFsLmFkZFRvKG1hcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYW50ZW5uZXMuYWRkVG8obWFwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYW50ZW5uZXMuZWFjaExheWVyKGZ1bmN0aW9uIChsYXllcil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLm9wdGlvbnMuYW50ZW5uZSA9IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci5zZXRTdHlsZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogJzAnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAnMCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGFudGVubmVzR2xvYmFsLmVhY2hMYXllcihmdW5jdGlvbiAobGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIuc2V0U3R5bGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdncmF5JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDogMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ2dyYXknLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncG9seWdvbkFudGVubmVzJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9wb3VyIHBhc3NlciBsZXMgYW50ZW5uZXMgYXUgc2Vjb25kIHBsYW4gZXQgbmUgcGFzIGJsb3F1ZXIgbCdhY3Rpb24gZHUgY2xpYyBzdXIgdW4gc2VjdGV1clxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzdmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwic3ZnLmxlYWZsZXQtem9vbS1hbmltYXRlZCBnXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdmFyIHBhdGhBbnRlbm5lcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIucG9seWdvbkFudGVubmVzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXRoQW50ZW5uZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwicG9seWdvbkFudGVubmVzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFudGVubmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN2Zy5yZW1vdmVDaGlsZChwYXRoQW50ZW5uZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdmcucHJlcGVuZChwYXRoQW50ZW5uZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaWYgKGFnZW50cyA9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGdldEFnZW50cygpO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgLy8gaWYgKHR5cGUgPT0gJ2xvY2FsJykge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGhpZGVMb2FkTW9kYWwoKTtcclxuICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFN0eWxlKGNvZGVHcm91cGUpIHtcclxuICAgICAgICB2YXIgb3B0aW9ucyA9IHtmaWxsT3BhY2l0eTogMC4yLCBjb2xvcjogY29sb3JXaXRob3V0QWdlbnQsIHdlaWdodDogMiwgZmlsbENvbG9yOiBmaWxsQ29sb3JXaXRob3V0QWdlbnR9O1xyXG4gICAgICAgIGlmIChjb2RlR3JvdXBlICE9ICcnKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7ZmlsbE9wYWNpdHk6IDAuMiwgY29sb3I6IGNvbG9yV2l0aEFnZW50LCB3ZWlnaHQ6IDIsIGZpbGxDb2xvcjogY29sb3JzW2NvZGVHcm91cGVdfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBiaW5kVG9vbHRpcE5iQ2xpZW50cyhzZWN0ZXVyLCBwb2x5Z29uKSB7XHJcbiAgICAgICAgcG9seWdvbi5iaW5kVG9vbHRpcChzZWN0ZXVyLm5iRXF1aXBlbWVudC5uYl90b3RhbCArIFwiIGNsaWVudHNcIixcclxuICAgICAgICAgICAge3Blcm1hbmVudDogdHJ1ZSwgZGlyZWN0aW9uOiBcImNlbnRlclwifVxyXG4gICAgICAgICkuY2xvc2VUb29sdGlwKCk7XHJcbiAgICAgICAgLy8gdmFyIGNvdW50Q2xpZW50cyA9IGdldENvdW50Q2xpZW50cyhvcHRpb25zKTtcclxuICAgICAgICAvLyBpZiAoY291bnRDbGllbnRzICE9IDApIHtcclxuICAgICAgICAvLyAgICAgbGF5ZXIuYmluZFRvb2x0aXAoY291bnRDbGllbnRzICsgXCIgY2xpZW50c1wiLFxyXG4gICAgICAgIC8vICAgICAgICAge3Blcm1hbmVudDogdHJ1ZSwgZGlyZWN0aW9uOiBcImNlbnRlclwifVxyXG4gICAgICAgIC8vICAgICApLmNsb3NlVG9vbHRpcCgpO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIGxheWVyLmJpbmRUb29sdGlwKG9wdGlvbnNbJ25iQ2xpZW50cyddICsgXCIgY2xpZW50c1wiLFxyXG4gICAgICAgIC8vICAgICAgICAge3Blcm1hbmVudDogdHJ1ZSwgZGlyZWN0aW9uOiBcImNlbnRlclwifVxyXG4gICAgICAgIC8vICAgICApLmNsb3NlVG9vbHRpcCgpO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpbml0RXZlbmVtZW50TGF5ZXIocG9seWdvbikge1xyXG4gICAgICAgIC8vIHBvbHlnb24ub24oJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgLy8gICAgIGlmICgkKCcjZXhwbGFpbk1lJykuaGFzQ2xhc3MoJ2Rpc3RhbmNlJykpIHtcclxuICAgICAgICAvLyAgICAgICAgICQoJyNleHBsYWluTWUnKS5oaWRlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICAkKCcjZXhwbGFpbk1lJykucmVtb3ZlQ2xhc3MoJ2Rpc3RhbmNlJyk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgICAgbWFwLmVhY2hMYXllcihmdW5jdGlvbiAobGF5ZXIpIHtcclxuICAgICAgICAvLyAgICAgICAgIGlmIChsYXllciBpbnN0YW5jZW9mIEwuUG9seWdvbikge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGlmIChsYXllci5vcHRpb25zICYmIGxheWVyLm9wdGlvbnMuaWQgIT0gcG9seWdvbi5vcHRpb25zLmlkKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGxheWVyLm9wdGlvbnMub3BlblRvb2xiYXIgPSBmYWxzZTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgaWYoIWxheWVyLm9wdGlvbnMuYW50ZW5uZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBsYXllci5zZXRTdHlsZSh7ZmlsbE9wYWNpdHk6ICcwLjInLCBmaWxsOiAndXJsKCknfSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9KTtcclxuICAgICAgICAvLyAgICAgYWdlbnRzLmVhY2hMYXllcihmdW5jdGlvbiAobGF5ZXIpIHtcclxuICAgICAgICAvLyAgICAgICAgIGxheWVyLnNldEljb24oY2lyY2xlSWNvbik7XHJcbiAgICAgICAgLy8gICAgIH0pO1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmluZm8oJ3BvcHVwJyk7XHJcbiAgICAgICAgLy8gICAgIGlmIChwb2x5Z29uLm9wdGlvbnMgJiYgIXBvbHlnb24ub3B0aW9ucy5vcGVuVG9vbGJhcikge1xyXG4gICAgICAgIC8vICAgICAgICAgaWYgKCFmdXNpb24pIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBwb2x5Z29uLnNldFN0eWxlKHtmaWxsT3BhY2l0eTogJzAuNid9KTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBuZXcgTGVhZmxldFRvb2xiYXIuRWRpdFRvb2xiYXIuUG9wdXAoZXZlbnQubGF0bG5nLCB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGFjdGlvbnM6IGVkaXRBY3Rpb25zXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfSkuYWRkVG8obWFwLCBwb2x5Z29uKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBwb2x5Z29uLm9wdGlvbnMub3BlblRvb2xiYXIgPSB0cnVlO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICQoJyNsZWdlbmRlIHAjdGV4dGUnKVswXS5pbm5lckhUTUwgPSAocG9seWdvbi5vcHRpb25zLm5vbVNlY3RldXIgPyBwb2x5Z29uLm9wdGlvbnMubm9tU2VjdGV1ciA6ICdTZWN0ZXVyICcgKyBwb2x5Z29uLm9wdGlvbnMuaWQpICsgXCI8YnIvPlwiO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICQoJyNsZWdlbmRlIHAjdGV4dGUnKVswXS5pbm5lckhUTUwgKz0gJ0xhIHN1cGVyZmljaWUgZHUgc2VjdGV1ciBlc3QgOiAnICsgTC5HZW9tZXRyeVV0aWwucmVhZGFibGVBcmVhKEwuR2VvbWV0cnlVdGlsLmdlb2Rlc2ljQXJlYShwb2x5Z29uLmdldExhdExuZ3MoKVswXSksICdrbScpICsgJy48YnIvPic7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgaWYgKHBvbHlnb24ub3B0aW9ucy5jb2RlQWdlbnQpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgYWdlbnRzLmVhY2hMYXllcihmdW5jdGlvbiAobGF5ZXIpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlmIChsYXllci5vcHRpb25zLmNvZGVBZ2VudCA9PSBwb2x5Z29uLm9wdGlvbnMuc3VwcGxlYW50MSB8fCBsYXllci5vcHRpb25zLmNvZGVBZ2VudCA9PSBwb2x5Z29uLm9wdGlvbnMuc3VwcGxlYW50MiB8fCBsYXllci5vcHRpb25zLmNvZGVBZ2VudCA9PSBwb2x5Z29uLm9wdGlvbnMuc3VwcGxlYW50MyB8fCBsYXllci5vcHRpb25zLmNvZGVBZ2VudCA9PSBwb2x5Z29uLm9wdGlvbnMuc3VwcGxlYW50NCkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGF5ZXIuc2V0U3R5bGUoe2ZpbGxDb2xvcjogJyM2NjYnfSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBpZiAobGF5ZXIub3B0aW9ucy5jb2RlQWdlbnQgPT0gcG9seWdvbi5vcHRpb25zLmNvZGVBZ2VudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnNldEljb24oaG9tZUljb24pO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vICQoJyNsZWdlbmRlIHAjdGV4dGUnKVswXS5pbm5lckhUTUwgKz0gJ0lsIHkgYSAnICsgKE1hdGgucm91bmQocG9seWdvbi5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKS5kaXN0YW5jZVRvKGxheWVyLmdldExhdExuZygpKSkgLyAxMDAwKSArICcgS21zIGVudHJlIGxcXCdhZ2VudCAnICsgcG9seWdvbi5vcHRpb25zLmNvZGVBZ2VudCArICcgZXQgbGUgY2VudHJlIGR1IHNlY3RldXIgJyArIHBvbHlnb24ub3B0aW9ucy5pZCArICcuJztcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBHcC5TZXJ2aWNlcy5yb3V0ZSh7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9pbnQ6IHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHBvbHlnb24uZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCkubG5nLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogcG9seWdvbi5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKS5sYXRcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kUG9pbnQ6IHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IGxheWVyLmdldExhdExuZygpLmxuZyxcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IGxheWVyLmdldExhdExuZygpLmxhdFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaDogJ1ZvaXR1cmUnLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdm9pZEZlYXR1cmU6IFtdLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVByZWZlcmVuY2U6ICdmYXN0ZXN0JyxcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpS2V5OiBcImNob2lzaXJnZW9wb3J0YWlsXCIsXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2VzczogZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xlZ2VuZGUgcCN0ZXh0ZScpWzBdLmlubmVySFRNTCArPSAnSWwgeSBhICcgKyByZXN1bHRbJ3RvdGFsRGlzdGFuY2UnXSArICdzIGVudHJlIGxcXCdhZ2VudCAnICsgcG9seWdvbi5vcHRpb25zLmNvZGVBZ2VudCArICcgZXQgbGUgY2VudHJlIGR1IHNlY3RldXIgJyArIHBvbHlnb24ub3B0aW9ucy5pZCArICcuJztcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZhaWx1cmU6IGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKGVycm9yKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgJCgnI2V4cGxhaW5NZScpLmFkZENsYXNzKCdkaXN0YW5jZScpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICQoJyNleHBsYWluTWUnKS5zaG93KCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAobWFwLl90b29sYmFycyAmJiBtYXAuX3Rvb2xiYXJzWzRdKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgbWFwLnJlbW92ZUxheWVyKG1hcC5fbGF5ZXJzW21hcC5fdG9vbGJhcnNbNF0uX2xlYWZsZXRfaWRdKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgICAgIHBvbHlnb24ub3B0aW9ucy5vcGVuVG9vbGJhciA9IGZhbHNlO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyAvLyAkKFwiYm9keVwiKS5vbignY2xpY2snLFwiI3RhYmxlX2NsaWVudHMgdHJcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIHBvbHlnb24ub24oJ2RyYXctcG9wdXA6ZWRpdGVkJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAvLyAgICAgaGlkZUZ1bmN0aW9ucygpO1xyXG4gICAgICAgIC8vICAgICBtb2RpZmljYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIC8vICAgICBkcmF3UG9wdXBFZGl0ZWQodGhpcyk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBwb2x5Z29uLm9uKCdlZGl0c3RhcnQnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmluZm8oJ2VkaXRzdGFydCcpO1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmluZm8oZSk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgLy8gcG9seWdvbi5vbignZWRpdHN0b3AnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIC8vICAgICBzaG93RnVuY3Rpb25zKCk7XHJcbiAgICAgICAgLy8gICAgIG1vZGlmaWNhdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmluZm8oJ2VkaXRzdG9wJyk7XHJcbiAgICAgICAgLy8gICAgIGFkZEhpc3RvKCdMZSBzZWN0ZXVyICcgKyAodGhpcy5vcHRpb25zLm5vbVNlY3RldXIgPyB0aGlzLm9wdGlvbnMubm9tU2VjdGV1ciA6IHRoaXMub3B0aW9ucy5pZCkgKyAnIGEgw6l0w6kgbW9kaWZpw6kuJyk7XHJcbiAgICAgICAgLy8gICAgIGdldEJpZ1BvbHlnb24oJ2xvY2FsJyk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyAgICAgLy9pbml0QWdlbnRzT2ZTZWN0ZXVycygnJyk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgcG9seWdvbi5vbignbW91c2VvdmVyIG1vdXNlb3V0JywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgcG9seWdvbi50b2dnbGVUb29sdGlwKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gYmluZEVsZW1lbnRzKGZsYWcsIGxheWVycykge1xyXG4gICAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgICAgIG1hcFNlY3RvLnJlbW92ZUxheWVyKGxheWVycyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWFwU2VjdG8uYWRkTGF5ZXIobGF5ZXJzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICFmbGFnO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBmdW5jdGlvbiBnZXRDb3VudENsaWVudHMob3B0aW9ucykge1xyXG4gICAgLy8gICAgIHZhciBmaWVsZHMgPSBbJ2ZhbWlsbGUwJywgJ2ZhbWlsbGUxJywgJ2ZhbWlsbGUyJywgJ2ZhbWlsbGUzJ107XHJcbiAgICAvLyAgICAgdmFyIGZpbHRyZUZhbWlsbGUgPSAkKCcjdGFibGVfY2xpZW50cycpLmJvb3RzdHJhcFRhYmxlKCdnZXRWaXNpYmxlQ29sdW1ucycpLm1hcChmdW5jdGlvbiAoaXQpIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIGl0LmZpZWxkO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gICAgIHZhciBjb3VudENsaWVudHMgPSAwO1xyXG4gICAgLy8gICAgIGZvciAodmFyIGkgaW4gZmlsdHJlRmFtaWxsZSkge1xyXG4gICAgLy8gICAgICAgICBpZiAoZmllbGRzLmluZGV4T2YoZmlsdHJlRmFtaWxsZVtpXSkgIT0gLTEpIHtcclxuICAgIC8vICAgICAgICAgICAgIGNvdW50Q2xpZW50cyArPSBwYXJzZUludChvcHRpb25zW2ZpbHRyZUZhbWlsbGVbaV1dKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICByZXR1cm4gY291bnRDbGllbnRzO1xyXG4gICAgLy8gfVxyXG4gICAgLypGSU4gRk9OQ1RJT05TKi9cclxuXHJcbn0pO1xyXG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiXSwic291cmNlUm9vdCI6IiJ9";
        
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);

        
        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);

        return; yield '';
    }

    /**
     * @codeCoverageIgnore
     */
    public function getTemplateName()
    {
        return "@public_path/build/secto.js";
    }

    /**
     * @codeCoverageIgnore
     */
    public function isTraitable()
    {
        return false;
    }

    /**
     * @codeCoverageIgnore
     */
    public function getDebugInfo()
    {
        return array (  7106 => 7061,  44 => 1,);
    }

    public function getSourceContext()
    {
        return new Source("(self[\"webpackChunk\"] = self[\"webpackChunk\"] || []).push([[\"secto\"],{

/***/ \"./assets/images/secto/agents.png\":
/*!****************************************!*\\
  !*** ./assets/images/secto/agents.png ***!
  \\****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/agents.ff1dc136.png\";

/***/ }),

/***/ \"./assets/images/secto/bdd.png\":
/*!*************************************!*\\
  !*** ./assets/images/secto/bdd.png ***!
  \\*************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/bdd.be7d3a77.png\";

/***/ }),

/***/ \"./assets/images/secto/circle.png\":
/*!****************************************!*\\
  !*** ./assets/images/secto/circle.png ***!
  \\****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/circle.b491ce2e.png\";

/***/ }),

/***/ \"./assets/images/secto/clients30.png\":
/*!*******************************************!*\\
  !*** ./assets/images/secto/clients30.png ***!
  \\*******************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/clients30.fbd5fcb9.png\";

/***/ }),

/***/ \"./assets/images/secto/clientsOut.png\":
/*!********************************************!*\\
  !*** ./assets/images/secto/clientsOut.png ***!
  \\********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/clientsOut.56de179b.png\";

/***/ }),

/***/ \"./assets/images/secto/creation_assist.png\":
/*!*************************************************!*\\
  !*** ./assets/images/secto/creation_assist.png ***!
  \\*************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/creation_assist.e7cd96e2.png\";

/***/ }),

/***/ \"./assets/images/secto/densite1.png\":
/*!******************************************!*\\
  !*** ./assets/images/secto/densite1.png ***!
  \\******************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/densite1.43286f31.png\";

/***/ }),

/***/ \"./assets/images/secto/icon_marker_black.png\":
/*!***************************************************!*\\
  !*** ./assets/images/secto/icon_marker_black.png ***!
  \\***************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/icon_marker_black.bfa480fc.png\";

/***/ }),

/***/ \"./assets/images/secto/icon_marker_red.png\":
/*!*************************************************!*\\
  !*** ./assets/images/secto/icon_marker_red.png ***!
  \\*************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/icon_marker_red.d988b994.png\";

/***/ }),

/***/ \"./assets/images/secto/maison.png\":
/*!****************************************!*\\
  !*** ./assets/images/secto/maison.png ***!
  \\****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/maison.6000e52e.png\";

/***/ }),

/***/ \"./assets/images/secto/number.png\":
/*!****************************************!*\\
  !*** ./assets/images/secto/number.png ***!
  \\****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/number.f29d5d5a.png\";

/***/ }),

/***/ \"./assets/images/secto/pastille.png\":
/*!******************************************!*\\
  !*** ./assets/images/secto/pastille.png ***!
  \\******************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/pastille.9a231ce3.png\";

/***/ }),

/***/ \"./assets/images/secto/refresh.png\":
/*!*****************************************!*\\
  !*** ./assets/images/secto/refresh.png ***!
  \\*****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/refresh.961546ea.png\";

/***/ }),

/***/ \"./assets/images/secto/save.png\":
/*!**************************************!*\\
  !*** ./assets/images/secto/save.png ***!
  \\**************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/save.86e68346.png\";

/***/ }),

/***/ \"./assets/images/secto/undo.png\":
/*!**************************************!*\\
  !*** ./assets/images/secto/undo.png ***!
  \\**************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

\"use strict\";
module.exports = __webpack_require__.p + \"images/undo.9cb1531e.png\";

/***/ }),

/***/ \"./assets/js/map/leaflet-search.js\":
/*!*****************************************!*\\
  !*** ./assets/js/map/leaflet-search.js ***!
  \\*****************************************/
/***/ ((module, exports, __webpack_require__) => {

var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;__webpack_require__(/*! core-js/modules/es.regexp.exec.js */ \"./node_modules/core-js/modules/es.regexp.exec.js\");

__webpack_require__(/*! core-js/modules/es.string.split.js */ \"./node_modules/core-js/modules/es.string.split.js\");

__webpack_require__(/*! core-js/modules/es.object.to-string.js */ \"./node_modules/core-js/modules/es.object.to-string.js\");

__webpack_require__(/*! core-js/modules/web.timers.js */ \"./node_modules/core-js/modules/web.timers.js\");

__webpack_require__(/*! core-js/modules/es.string.replace.js */ \"./node_modules/core-js/modules/es.string.replace.js\");

__webpack_require__(/*! core-js/modules/es.regexp.constructor.js */ \"./node_modules/core-js/modules/es.regexp.constructor.js\");

__webpack_require__(/*! core-js/modules/es.regexp.to-string.js */ \"./node_modules/core-js/modules/es.regexp.to-string.js\");

__webpack_require__(/*! core-js/modules/es.array.index-of.js */ \"./node_modules/core-js/modules/es.array.index-of.js\");

__webpack_require__(/*! core-js/modules/es.date.to-string.js */ \"./node_modules/core-js/modules/es.date.to-string.js\");

__webpack_require__(/*! core-js/modules/es.parse-int.js */ \"./node_modules/core-js/modules/es.parse-int.js\");

__webpack_require__(/*! core-js/modules/es.string.search.js */ \"./node_modules/core-js/modules/es.string.search.js\");

/*
\tName\t\t\t\t\tData passed\t\t\t   Description

\tManaged Events:
\t search:locationfound\t{latlng, title, layer} fired after moved and show markerLocation
\t search:expanded\t\t{}\t\t\t\t\t   fired after control was expanded
\t search:collapsed\t\t{}\t\t\t\t\t   fired after control was collapsed
 \t search:cancel\t\t\t{}\t\t\t\t\t   fired after cancel button clicked

\tPublic methods:
\t setLayer()\t\t\t\tL.LayerGroup()         set layer search at runtime
\t showAlert()            'Text message'         show alert message
\t searchText()\t\t\t'Text searched'        search text by external code
*/
//TODO implement can do research on multiple sources layers and remote\t\t
//TODO history: false,\t\t//show latest searches in tooltip\t\t
//FIXME option condition problem {autoCollapse: true, markerLocation: true} not show location
//FIXME option condition problem {autoCollapse: false }
//
//TODO here insert function  search inputText FIRST in _recordsCache keys and if not find results.. 
//  run one of callbacks search(sourceData,jsonpUrl or options.layer) and run this.showTooltip
//
//TODO change structure of _recordsCache
//\tlike this: _recordsCache = {\"text-key1\": {loc:[lat,lng], ..other attributes.. }, {\"text-key2\": {loc:[lat,lng]}...}, ...}
//\tin this mode every record can have a free structure of attributes, only 'loc' is required
//TODO important optimization!!! always append data in this._recordsCache
//  now _recordsCache content is emptied and replaced with new data founded
//  always appending data on _recordsCache give the possibility of caching ajax, jsonp and layersearch!
//
//TODO here insert function  search inputText FIRST in _recordsCache keys and if not find results.. 
//  run one of callbacks search(sourceData,jsonpUrl or options.layer) and run this.showTooltip
//
//TODO change structure of _recordsCache
//\tlike this: _recordsCache = {\"text-key1\": {loc:[lat,lng], ..other attributes.. }, {\"text-key2\": {loc:[lat,lng]}...}, ...}
//\tin this way every record can have a free structure of attributes, only 'loc' is required
(function (factory) {
  if (true) {
    //AMD
    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! leaflet */ \"./node_modules/leaflet/dist/leaflet-src.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  } else {}
})(function (L) {
  L.Control.Search = L.Control.extend({
    includes: L.version[0] === '1' ? L.Evented.prototype : L.Mixin.Events,
    options: {
      url: '',
      //url for search by ajax request, ex: \"search.php?q={s}\". Can be function to returns string for dynamic parameter setting
      layer: null,
      //layer where search markers(is a L.LayerGroup)\t\t\t\t
      sourceData: null,
      //function to fill _recordsCache, passed searching text by first param and callback in second\t\t\t\t
      //TODO implements uniq option 'sourceData' to recognizes source type: url,array,callback or layer\t\t\t\t
      jsonpParam: null,
      //jsonp param name for search by jsonp service, ex: \"callback\"
      propertyLoc: 'loc',
      //field for remapping location, using array: ['latname','lonname'] for select double fields(ex. ['lat','lon'] ) support dotted format: 'prop.subprop.title'
      propertyName: 'title',
      //property in marker.options(or feature.properties for vector layer) trough filter elements in layer,
      formatData: null,
      //callback for reformat all data from source to indexed data object
      filterData: null,
      //callback for filtering data from text searched, params: textSearch, allRecords
      moveToLocation: null,
      //callback run on location found, params: latlng, title, map
      buildTip: null,
      //function to return row tip html node(or html string), receive text tooltip in first param
      container: '',
      //container id to insert Search Control\t\t
      zoom: null,
      //default zoom level for move to location
      minLength: 1,
      //minimal text length for autocomplete
      initial: true,
      //search elements only by initial text
      casesensitive: false,
      //search elements in case sensitive text
      autoType: true,
      //complete input with first suggested result and select this filled-in text.
      delayType: 400,
      //delay while typing for show tooltip
      tooltipLimit: -1,
      //limit max results to show in tooltip. -1 for no limit, 0 for no results
      tipAutoSubmit: true,
      //auto map panTo when click on tooltip
      firstTipSubmit: false,
      //auto select first result con enter click
      autoResize: true,
      //autoresize on input change
      collapsed: true,
      //collapse search control at startup
      autoCollapse: false,
      //collapse search control after submit(on button or on tips if enabled tipAutoSubmit)
      autoCollapseTime: 1200,
      //delay for autoclosing alert and collapse after blur
      textErr: 'Location not found',
      //error message
      textCancel: 'Cancel',
      //title in cancel button\t\t
      textPlaceholder: 'Search...',
      //placeholder value\t\t\t
      hideMarkerOnCollapse: false,
      //remove circle and marker on search control collapsed\t\t
      position: 'topleft',
      marker: {
        //custom L.Marker or false for hide
        icon: false,
        //custom L.Icon for maker location or false for hide
        animate: true,
        //animate a circle over location found
        circle: {
          //draw a circle in location found
          radius: 10,
          weight: 3,
          color: '#e03',
          stroke: true,
          fill: false
        }
      }
    },
    _getPath: function _getPath(obj, prop) {
      var parts = prop.split('.'),
          last = parts.pop(),
          len = parts.length,
          cur = parts[0],
          i = 1;
      if (len > 0) while ((obj = obj[cur]) && i < len) {
        cur = parts[i++];
      }
      if (obj) return obj[last];
    },
    _isObject: function _isObject(obj) {
      return Object.prototype.toString.call(obj) === \"[object Object]\";
    },
    initialize: function initialize(options) {
      L.Util.setOptions(this, options || {});
      this._inputMinSize = this.options.textPlaceholder ? this.options.textPlaceholder.length : 10;
      this._layer = this.options.layer || new L.LayerGroup();
      this._filterData = this.options.filterData || this._defaultFilterData;
      this._formatData = this.options.formatData || this._defaultFormatData;
      this._moveToLocation = this.options.moveToLocation || this._defaultMoveToLocation;
      this._autoTypeTmp = this.options.autoType; //useful for disable autoType temporarily in delete/backspace keydown

      this._countertips = 0; //number of tips items

      this._recordsCache = {}; //key,value table! to store locations! format: key,latlng

      this._curReq = null;
    },
    onAdd: function onAdd(map) {
      this._map = map;
      this._container = L.DomUtil.create('div', 'leaflet-control-search');
      this._input = this._createInput(this.options.textPlaceholder, 'search-input');
      this._tooltip = this._createTooltip('search-tooltip');
      this._cancel = this._createCancel(this.options.textCancel, 'search-cancel');
      this._button = this._createButton(this.options.textPlaceholder, 'search-button');
      this._alert = this._createAlert('search-alert');
      if (this.options.collapsed === false) this.expand(this.options.collapsed);

      if (this.options.marker) {
        if (this.options.marker instanceof L.Marker || this.options.marker instanceof L.CircleMarker) this._markerSearch = this.options.marker;else if (this._isObject(this.options.marker)) this._markerSearch = new L.Control.Search.Marker([0, 0], this.options.marker);
        this._markerSearch._isMarkerSearch = true;
      }

      this.setLayer(this._layer);
      map.on({
        // \t\t'layeradd': this._onLayerAddRemove,
        // \t\t'layerremove': this._onLayerAddRemove
        'resize': this._handleAutoresize
      }, this);
      return this._container;
    },
    addTo: function addTo(map) {
      if (this.options.container) {
        this._container = this.onAdd(map);
        this._wrapper = L.DomUtil.get(this.options.container);
        this._wrapper.style.position = 'relative';

        this._wrapper.appendChild(this._container);
      } else L.Control.prototype.addTo.call(this, map);

      return this;
    },
    onRemove: function onRemove(map) {
      this._recordsCache = {}; // map.off({
      // \t\t'layeradd': this._onLayerAddRemove,
      // \t\t'layerremove': this._onLayerAddRemove
      // \t}, this);

      map.off({
        // \t\t'layeradd': this._onLayerAddRemove,
        // \t\t'layerremove': this._onLayerAddRemove
        'resize': this._handleAutoresize
      }, this);
    },
    // _onLayerAddRemove: function(e) {
    // \t//without this, run setLayer also for each Markers!! to optimize!
    // \tif(e.layer instanceof L.LayerGroup)
    // \t\tif( L.stamp(e.layer) != L.stamp(this._layer) )
    // \t\t\tthis.setLayer(e.layer);
    // },
    setLayer: function setLayer(layer) {
      //set search layer at runtime
      //this.options.layer = layer; //setting this, run only this._recordsFromLayer()
      this._layer = layer;

      this._layer.addTo(this._map);

      return this;
    },
    showAlert: function showAlert(text) {
      var self = this;
      text = text || this.options.textErr;
      this._alert.style.display = 'block';
      this._alert.innerHTML = text;
      clearTimeout(this.timerAlert);
      this.timerAlert = setTimeout(function () {
        self.hideAlert();
      }, this.options.autoCollapseTime);
      return this;
    },
    hideAlert: function hideAlert() {
      this._alert.style.display = 'none';
      return this;
    },
    cancel: function cancel() {
      this._input.value = '';

      this._handleKeypress({
        keyCode: 8
      }); //simulate backspace keypress


      this._input.size = this._inputMinSize;

      this._input.focus();

      this._cancel.style.display = 'none';

      this._hideTooltip();

      this.fire('search:cancel');
      return this;
    },
    expand: function expand(toggle) {
      toggle = typeof toggle === 'boolean' ? toggle : true;
      this._input.style.display = 'block';
      L.DomUtil.addClass(this._container, 'search-exp');

      if (toggle !== false) {
        this._input.focus();

        this._map.on('dragstart click', this.collapse, this);
      }

      this.fire('search:expanded');
      return this;
    },
    collapse: function collapse() {
      this._hideTooltip();

      this.cancel();
      this._alert.style.display = 'none';

      this._input.blur();

      if (this.options.collapsed) {
        this._input.style.display = 'none';
        this._cancel.style.display = 'none';
        L.DomUtil.removeClass(this._container, 'search-exp');

        if (this.options.hideMarkerOnCollapse) {
          this._map.removeLayer(this._markerSearch);
        }

        this._map.off('dragstart click', this.collapse, this);
      }

      this.fire('search:collapsed');
      return this;
    },
    collapseDelayed: function collapseDelayed() {
      //collapse after delay, used on_input blur
      var self = this;
      if (!this.options.autoCollapse) return this;
      clearTimeout(this.timerCollapse);
      this.timerCollapse = setTimeout(function () {
        self.collapse();
      }, this.options.autoCollapseTime);
      return this;
    },
    collapseDelayedStop: function collapseDelayedStop() {
      clearTimeout(this.timerCollapse);
      return this;
    },
    ////start DOM creations
    _createAlert: function _createAlert(className) {
      var alert = L.DomUtil.create('div', className, this._container);
      alert.style.display = 'none';
      L.DomEvent.on(alert, 'click', L.DomEvent.stop, this).on(alert, 'click', this.hideAlert, this);
      return alert;
    },
    _createInput: function _createInput(text, className) {
      var self = this;
      var label = L.DomUtil.create('label', className, this._container);
      var input = L.DomUtil.create('input', className, this._container);
      input.type = 'text';
      input.size = this._inputMinSize;
      input.value = '';
      input.autocomplete = 'off';
      input.autocorrect = 'off';
      input.autocapitalize = 'off';
      input.placeholder = text;
      input.style.display = 'none';
      input.role = 'search';
      input.id = input.role + input.type + input.size;
      label.htmlFor = input.id;
      label.style.display = 'none';
      label.value = text;
      L.DomEvent.disableClickPropagation(input).on(input, 'keyup', this._handleKeypress, this).on(input, 'paste', function (e) {
        setTimeout(function (e) {
          self._handleKeypress(e);
        }, 10, e);
      }, this).on(input, 'blur', this.collapseDelayed, this).on(input, 'focus', this.collapseDelayedStop, this);
      return input;
    },
    _createCancel: function _createCancel(title, className) {
      var cancel = L.DomUtil.create('a', className, this._container);
      cancel.href = '#';
      cancel.title = title;
      cancel.style.display = 'none';
      cancel.innerHTML = \"<span>&otimes;</span>\"; //imageless(see css)

      L.DomEvent.on(cancel, 'click', L.DomEvent.stop, this).on(cancel, 'click', this.cancel, this);
      return cancel;
    },
    _createButton: function _createButton(title, className) {
      var button = L.DomUtil.create('a', className, this._container);
      button.href = '#';
      button.title = title;
      L.DomEvent.on(button, 'click', L.DomEvent.stop, this).on(button, 'click', this._handleSubmit, this).on(button, 'focus', this.collapseDelayedStop, this).on(button, 'blur', this.collapseDelayed, this);
      return button;
    },
    _createTooltip: function _createTooltip(className) {
      var self = this;
      var tool = L.DomUtil.create('ul', className, this._container);
      tool.style.display = 'none';
      L.DomEvent.disableClickPropagation(tool).on(tool, 'blur', this.collapseDelayed, this).on(tool, 'mousewheel', function (e) {
        self.collapseDelayedStop();
        L.DomEvent.stopPropagation(e); //disable zoom map
      }, this).on(tool, 'mouseover', function (e) {
        self.collapseDelayedStop();
      }, this);
      return tool;
    },
    _createTip: function _createTip(text, val) {
      //val is object in recordCache, usually is Latlng
      var tip;

      if (this.options.buildTip) {
        tip = this.options.buildTip.call(this, text, val); //custom tip node or html string

        if (typeof tip === 'string') {
          var tmpNode = L.DomUtil.create('div');
          tmpNode.innerHTML = tip;
          tip = tmpNode.firstChild;
        }
      } else {
        tip = L.DomUtil.create('li', '');
        tip.innerHTML = text;
      }

      L.DomUtil.addClass(tip, 'search-tip');
      tip._text = text; //value replaced in this._input and used by _autoType

      if (this.options.tipAutoSubmit) L.DomEvent.disableClickPropagation(tip).on(tip, 'click', L.DomEvent.stop, this).on(tip, 'click', function (e) {
        this._input.value = text;

        this._handleAutoresize();

        this._input.focus();

        this._hideTooltip();

        this._handleSubmit();
      }, this);
      return tip;
    },
    //////end DOM creations
    _getUrl: function _getUrl(text) {
      return typeof this.options.url === 'function' ? this.options.url(text) : this.options.url;
    },
    _defaultFilterData: function _defaultFilterData(text, records) {
      var I,
          icase,
          regSearch,
          frecords = {};
      text = text.replace(/[.*+?^\${}()|[\\]\\\\]/g, ''); //sanitize remove all special characters

      if (text === '') return [];
      I = this.options.initial ? '^' : ''; //search only initial text

      icase = !this.options.casesensitive ? 'i' : undefined;
      regSearch = new RegExp(I + text, icase); //TODO use .filter or .map

      for (var key in records) {
        if (regSearch.test(key)) frecords[key] = records[key];
      }

      return frecords;
    },
    showTooltip: function showTooltip(records) {
      this._countertips = 0;
      this._tooltip.innerHTML = '';
      this._tooltip.currentSelection = -1; //inizialized for _handleArrowSelect()

      if (this.options.tooltipLimit) {
        for (var key in records) //fill tooltip
        {
          if (this._countertips === this.options.tooltipLimit) break;
          this._countertips++;

          this._tooltip.appendChild(this._createTip(key, records[key]));
        }
      }

      if (this._countertips > 0) {
        this._tooltip.style.display = 'block';
        if (this._autoTypeTmp) this._autoType();
        this._autoTypeTmp = this.options.autoType; //reset default value
      } else this._hideTooltip();

      this._tooltip.scrollTop = 0;
      return this._countertips;
    },
    _hideTooltip: function _hideTooltip() {
      this._tooltip.style.display = 'none';
      this._tooltip.innerHTML = '';
      return 0;
    },
    _defaultFormatData: function _defaultFormatData(json) {
      //default callback for format data to indexed data
      var self = this,
          propName = this.options.propertyName,
          propLoc = this.options.propertyLoc,
          i,
          jsonret = {};
      if (L.Util.isArray(propLoc)) for (i in json) {
        jsonret[self._getPath(json[i], propName)] = L.latLng(json[i][propLoc[0]], json[i][propLoc[1]]);
      } else for (i in json) {
        jsonret[self._getPath(json[i], propName)] = L.latLng(self._getPath(json[i], propLoc));
      } //TODO throw new Error(\"propertyName '\"+propName+\"' not found in JSON data\");

      return jsonret;
    },
    _recordsFromJsonp: function _recordsFromJsonp(text, callAfter) {
      //extract searched records from remote jsonp service
      L.Control.Search.callJsonp = callAfter;
      var script = L.DomUtil.create('script', 'leaflet-search-jsonp', document.getElementsByTagName('body')[0]),
          url = L.Util.template(this._getUrl(text) + '&' + this.options.jsonpParam + '=L.Control.Search.callJsonp', {
        s: text
      }); //parsing url
      //rnd = '&_='+Math.floor(Math.random()*10000);
      //TODO add rnd param or randomize callback name! in recordsFromJsonp

      script.type = 'text/javascript';
      script.src = url;
      return {
        abort: function abort() {
          script.parentNode.removeChild(script);
        }
      };
    },
    _recordsFromAjax: function _recordsFromAjax(text, callAfter) {
      //Ajax request
      if (window.XMLHttpRequest === undefined) {
        window.XMLHttpRequest = function () {
          try {
            return new ActiveXObject(\"Microsoft.XMLHTTP.6.0\");
          } catch (e1) {
            try {
              return new ActiveXObject(\"Microsoft.XMLHTTP.3.0\");
            } catch (e2) {
              throw new Error(\"XMLHttpRequest is not supported\");
            }
          }
        };
      }

      var IE8or9 = L.Browser.ie && !window.atob && document.querySelector,
          request = IE8or9 ? new XDomainRequest() : new XMLHttpRequest(),
          url = L.Util.template(this._getUrl(text), {
        s: text
      }); //rnd = '&_='+Math.floor(Math.random()*10000);
      //TODO add rnd param or randomize callback name! in recordsFromAjax\t\t\t

      request.open(\"GET\", url);

      request.onload = function () {
        callAfter(JSON.parse(request.responseText));
      };

      request.onreadystatechange = function () {
        if (request.readyState === 4 && request.status === 200) {
          this.onload();
        }
      };

      request.send();
      return request;
    },
    _searchInLayer: function _searchInLayer(layer, retRecords, propName) {
      var self = this,
          loc;
      if (layer instanceof L.Control.Search.Marker) return;

      if (layer instanceof L.Marker || layer instanceof L.CircleMarker) {
        if (self._getPath(layer.options, propName)) {
          loc = layer.getLatLng();
          loc.layer = layer;
          retRecords[self._getPath(layer.options, propName)] = loc;
        } else if (self._getPath(layer.feature.properties, propName)) {
          loc = layer.getLatLng();
          loc.layer = layer;
          retRecords[self._getPath(layer.feature.properties, propName)] = loc;
        } else {
          //throw new Error(\"propertyName '\"+propName+\"' not found in marker\"); 
          console.warn(\"propertyName '\" + propName + \"' not found in marker\");
        }
      } else if (layer instanceof L.Path || layer instanceof L.Polyline || layer instanceof L.Polygon) {
        if (self._getPath(layer.options, propName)) {
          loc = layer.getBounds().getCenter();
          loc.layer = layer;
          retRecords[self._getPath(layer.options, propName)] = loc;
        } else if (self._getPath(layer.feature.properties, propName)) {
          loc = layer.getBounds().getCenter();
          loc.layer = layer;
          retRecords[self._getPath(layer.feature.properties, propName)] = loc;
        } else {
          //throw new Error(\"propertyName '\"+propName+\"' not found in shape\"); 
          console.warn(\"propertyName '\" + propName + \"' not found in shape\");
        }
      } else if (layer.hasOwnProperty('feature')) //GeoJSON
        {
          if (layer.feature.properties.hasOwnProperty(propName)) {
            if (layer.getLatLng && typeof layer.getLatLng === 'function') {
              loc = layer.getLatLng();
              loc.layer = layer;
              retRecords[layer.feature.properties[propName]] = loc;
            } else if (layer.getBounds && typeof layer.getBounds === 'function') {
              loc = layer.getBounds().getCenter();
              loc.layer = layer;
              retRecords[layer.feature.properties[propName]] = loc;
            } else {
              console.warn(\"Unknown type of Layer\");
            }
          } else {
            //throw new Error(\"propertyName '\"+propName+\"' not found in feature\");
            console.warn(\"propertyName '\" + propName + \"' not found in feature\");
          }
        } else if (layer instanceof L.LayerGroup) {
        layer.eachLayer(function (layer) {
          self._searchInLayer(layer, retRecords, propName);
        });
      }
    },
    _recordsFromLayer: function _recordsFromLayer() {
      //return table: key,value from layer
      var self = this,
          retRecords = {},
          propName = this.options.propertyName;

      this._layer.eachLayer(function (layer) {
        self._searchInLayer(layer, retRecords, propName);
      });

      return retRecords;
    },
    _autoType: function _autoType() {
      //TODO implements autype without selection(useful for mobile device)
      var start = this._input.value.length,
          firstRecord = this._tooltip.firstChild ? this._tooltip.firstChild._text : '',
          end = firstRecord.length;

      if (firstRecord.indexOf(this._input.value) === 0) {
        // If prefix match
        this._input.value = firstRecord;

        this._handleAutoresize();

        if (this._input.createTextRange) {
          var selRange = this._input.createTextRange();

          selRange.collapse(true);
          selRange.moveStart('character', start);
          selRange.moveEnd('character', end);
          selRange.select();
        } else if (this._input.setSelectionRange) {
          this._input.setSelectionRange(start, end);
        } else if (this._input.selectionStart) {
          this._input.selectionStart = start;
          this._input.selectionEnd = end;
        }
      }
    },
    _hideAutoType: function _hideAutoType() {
      // deselect text:
      var sel;

      if ((sel = this._input.selection) && sel.empty) {
        sel.empty();
      } else if (this._input.createTextRange) {
        sel = this._input.createTextRange();
        sel.collapse(true);
        var end = this._input.value.length;
        sel.moveStart('character', end);
        sel.moveEnd('character', end);
        sel.select();
      } else {
        if (this._input.getSelection) {
          this._input.getSelection().removeAllRanges();
        }

        this._input.selectionStart = this._input.selectionEnd;
      }
    },
    _handleKeypress: function _handleKeypress(e) {
      //run _input keyup event
      var self = this;

      switch (e.keyCode) {
        case 27:
          //Esc
          this.collapse();
          break;

        case 13:
          //Enter
          if (this._countertips == 1 || this.options.firstTipSubmit && this._countertips > 0) {
            if (this._tooltip.currentSelection == -1) {
              this._handleArrowSelect(1);
            }
          }

          this._handleSubmit(); //do search


          break;

        case 38:
          //Up
          this._handleArrowSelect(-1);

          break;

        case 40:
          //Down
          this._handleArrowSelect(1);

          break;

        case 8: //Backspace

        case 45: //Insert

        case 46:
          //Delete
          this._autoTypeTmp = false; //disable temporarily autoType

          break;

        case 37: //Left

        case 39: //Right

        case 16: //Shift

        case 17: //Ctrl

        case 35: //End

        case 36:
          //Home
          break;

        default:
          //All keys
          if (this._input.value.length) this._cancel.style.display = 'block';else this._cancel.style.display = 'none';

          if (this._input.value.length >= this.options.minLength) {
            clearTimeout(this.timerKeypress); //cancel last search request while type in\t\t\t\t

            this.timerKeypress = setTimeout(function () {
              //delay before request, for limit jsonp/ajax request
              self._fillRecordsCache();
            }, this.options.delayType);
          } else this._hideTooltip();

      }

      this._handleAutoresize();
    },
    searchText: function searchText(text) {
      var code = text.charCodeAt(text.length);
      this._input.value = text;
      this._input.style.display = 'block';
      L.DomUtil.addClass(this._container, 'search-exp');
      this._autoTypeTmp = false;

      this._handleKeypress({
        keyCode: code
      });
    },
    _fillRecordsCache: function _fillRecordsCache() {
      var self = this,
          inputText = this._input.value,
          records;
      if (this._curReq && this._curReq.abort) this._curReq.abort(); //abort previous requests

      L.DomUtil.addClass(this._container, 'search-load'); // if(this._layer)
      // {
      // \t//TODO _recordsFromLayer must return array of objects, formatted from _formatData
      // \tthis._recordsCache = this._recordsFromLayer();
      //
      // \trecords = this._filterData( this._input.value, this._recordsCache );
      //
      // \tthis.showTooltip( records );
      //
      // \tL.DomUtil.removeClass(this._container, 'search-load');
      // }
      // else
      // {

      if (this.options.sourceData) this._retrieveData = this.options.sourceData;else if (this.options.url) //jsonp or ajax
        this._retrieveData = this.options.jsonpParam ? this._recordsFromJsonp : this._recordsFromAjax;
      this._curReq = this._retrieveData.call(this, inputText, function (data) {
        self._recordsCache = self._formatData.call(self, data); //TODO refact!

        if (self.options.sourceData) records = self._filterData(self._input.value, self._recordsCache);else records = self._recordsCache;
        self.showTooltip(records);
        L.DomUtil.removeClass(self._container, 'search-load');
      }); // }
    },
    _handleAutoresize: function _handleAutoresize() {
      var maxWidth;

      if (this._input.style.maxWidth !== this._map._container.offsetWidth) {
        maxWidth = this._map._container.clientWidth; // other side margin + padding + width border + width search-button + width search-cancel

        maxWidth -= 10 + 20 + 1 + 30 + 22;
        this._input.style.maxWidth = maxWidth.toString() + 'px';
      }

      if (this.options.autoResize && this._container.offsetWidth + 20 < this._map._container.offsetWidth) {
        this._input.size = this._input.value.length < this._inputMinSize ? this._inputMinSize : this._input.value.length;
      }
    },
    _handleArrowSelect: function _handleArrowSelect(velocity) {
      var searchTips = this._tooltip.hasChildNodes() ? this._tooltip.childNodes : [];

      for (i = 0; i < searchTips.length; i++) {
        L.DomUtil.removeClass(searchTips[i], 'search-tip-select');
      }

      if (velocity == 1 && this._tooltip.currentSelection >= searchTips.length - 1) {
        // If at end of list.
        L.DomUtil.addClass(searchTips[this._tooltip.currentSelection], 'search-tip-select');
      } else if (velocity == -1 && this._tooltip.currentSelection <= 0) {
        // Going back up to the search box.
        this._tooltip.currentSelection = -1;
      } else if (this._tooltip.style.display != 'none') {
        this._tooltip.currentSelection += velocity;
        L.DomUtil.addClass(searchTips[this._tooltip.currentSelection], 'search-tip-select');
        this._input.value = searchTips[this._tooltip.currentSelection]._text; // scroll:

        var tipOffsetTop = searchTips[this._tooltip.currentSelection].offsetTop;

        if (tipOffsetTop + searchTips[this._tooltip.currentSelection].clientHeight >= this._tooltip.scrollTop + this._tooltip.clientHeight) {
          this._tooltip.scrollTop = tipOffsetTop - this._tooltip.clientHeight + searchTips[this._tooltip.currentSelection].clientHeight;
        } else if (tipOffsetTop <= this._tooltip.scrollTop) {
          this._tooltip.scrollTop = tipOffsetTop;
        }
      }
    },
    _handleSubmit: function _handleSubmit() {
      //button and tooltip click and enter submit
      this._hideAutoType();

      this.hideAlert();

      this._hideTooltip();

      if (this._input.style.display == 'none') //on first click show _input only
        this.expand();else {
        if (this._input.value === '') //hide _input only
          this.collapse();else {
          var loc = this._getLocation(this._input.value);

          if (loc === false) this.showAlert();else {
            this.showLocation(loc, this._input.value);
            this.fire('search:locationfound', {
              latlng: loc,
              text: this._input.value,
              layer: loc.layer ? loc.layer : null
            });
          }
        }
      }
    },
    _getLocation: function _getLocation(key) {
      //extract latlng from _recordsCache
      if (this._recordsCache.hasOwnProperty(key)) return this._recordsCache[key]; //then after use .loc attribute
      else return false;
    },
    _defaultMoveToLocation: function _defaultMoveToLocation(latlng, title, map) {
      if (this.options.zoom) this._map.setView(latlng, this.options.zoom);else this._map.panTo(latlng);
    },
    showLocation: function showLocation(latlng, title) {
      //set location on map from _recordsCache
      var self = this;

      self._map.once('moveend zoomend', function (e) {
        if (self._markerSearch) {
          self._markerSearch.addTo(self._map).setLatLng(latlng);
        }
      });

      self._moveToLocation(latlng, title, self._map); //FIXME autoCollapse option hide self._markerSearch before visualized!!


      if (self.options.autoCollapse) self.collapse();
      return self;
    }
  });
  L.Control.Search.Marker = L.Marker.extend({
    includes: L.version[0] === '1' ? L.Evented.prototype : L.Mixin.Events,
    options: {
      icon: new L.Icon.Default(),
      animate: true,
      circle: {
        radius: 10,
        weight: 3,
        color: '#e03',
        stroke: true,
        fill: false
      }
    },
    initialize: function initialize(latlng, options) {
      L.setOptions(this, options);
      if (options.icon === true) options.icon = new L.Icon.Default();
      L.Marker.prototype.initialize.call(this, latlng, options);
      if (L.Control.Search.prototype._isObject(this.options.circle)) this._circleLoc = new L.CircleMarker(latlng, this.options.circle);
    },
    onAdd: function onAdd(map) {
      L.Marker.prototype.onAdd.call(this, map);

      if (this._circleLoc) {
        map.addLayer(this._circleLoc);
        if (this.options.animate) this.animate();
      }
    },
    onRemove: function onRemove(map) {
      L.Marker.prototype.onRemove.call(this, map);
      if (this._circleLoc) map.removeLayer(this._circleLoc);
    },
    setLatLng: function setLatLng(latlng) {
      L.Marker.prototype.setLatLng.call(this, latlng);
      if (this._circleLoc) this._circleLoc.setLatLng(latlng);
      return this;
    },
    _initIcon: function _initIcon() {
      if (this.options.icon) L.Marker.prototype._initIcon.call(this);
    },
    _removeIcon: function _removeIcon() {
      if (this.options.icon) L.Marker.prototype._removeIcon.call(this);
    },
    animate: function animate() {
      //TODO refact animate() more smooth! like this: http://goo.gl/DDlRs
      if (this._circleLoc) {
        var circle = this._circleLoc,
            tInt = 200,
            //time interval
        ss = 5,
            //frames
        mr = parseInt(circle._radius / ss),
            oldrad = this.options.circle.radius,
            newrad = circle._radius * 2,
            acc = 0;
        circle._timerAnimLoc = setInterval(function () {
          acc += 0.5;
          mr += acc; //adding acceleration

          newrad -= mr;
          circle.setRadius(newrad);

          if (newrad < oldrad) {
            clearInterval(circle._timerAnimLoc);
            circle.setRadius(oldrad); //reset radius
            //if(typeof afterAnimCall == 'function')
            //afterAnimCall();
            //TODO use create event 'animateEnd' in L.Control.Search.Marker 
          }
        }, tInt);
      }

      return this;
    }
  });
  L.Map.addInitHook(function () {
    if (this.options.searchControl) {
      this.searchControl = L.control.search(this.options.searchControl);
      this.addControl(this.searchControl);
    }
  });

  L.control.search = function (options) {
    return new L.Control.Search(options);
  };

  return L.Control.Search;
});

/***/ }),

/***/ \"./assets/js/map/leaflet.draw-custom.js\":
/*!**********************************************!*\\
  !*** ./assets/js/map/leaflet.draw-custom.js ***!
  \\**********************************************/
/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {

function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }

__webpack_require__(/*! core-js/modules/es.array.splice.js */ \"./node_modules/core-js/modules/es.array.splice.js\");

__webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");

__webpack_require__(/*! core-js/modules/web.timers.js */ \"./node_modules/core-js/modules/web.timers.js\");

__webpack_require__(/*! core-js/modules/es.function.bind.js */ \"./node_modules/core-js/modules/es.function.bind.js\");

__webpack_require__(/*! core-js/modules/es.number.to-fixed.js */ \"./node_modules/core-js/modules/es.number.to-fixed.js\");

__webpack_require__(/*! core-js/modules/es.parse-int.js */ \"./node_modules/core-js/modules/es.parse-int.js\");

__webpack_require__(/*! core-js/modules/es.array.concat.js */ \"./node_modules/core-js/modules/es.array.concat.js\");

__webpack_require__(/*! core-js/modules/es.array.fill.js */ \"./node_modules/core-js/modules/es.array.fill.js\");

__webpack_require__(/*! core-js/modules/es.array.index-of.js */ \"./node_modules/core-js/modules/es.array.index-of.js\");

__webpack_require__(/*! core-js/modules/es.array.is-array.js */ \"./node_modules/core-js/modules/es.array.is-array.js\");

__webpack_require__(/*! core-js/modules/es.parse-float.js */ \"./node_modules/core-js/modules/es.parse-float.js\");

__webpack_require__(/*! core-js/modules/es.regexp.exec.js */ \"./node_modules/core-js/modules/es.regexp.exec.js\");

__webpack_require__(/*! core-js/modules/es.string.split.js */ \"./node_modules/core-js/modules/es.string.split.js\");

__webpack_require__(/*! core-js/modules/es.string.replace.js */ \"./node_modules/core-js/modules/es.string.replace.js\");

__webpack_require__(/*! core-js/modules/es.symbol.js */ \"./node_modules/core-js/modules/es.symbol.js\");

__webpack_require__(/*! core-js/modules/es.symbol.description.js */ \"./node_modules/core-js/modules/es.symbol.description.js\");

__webpack_require__(/*! core-js/modules/es.object.to-string.js */ \"./node_modules/core-js/modules/es.object.to-string.js\");

__webpack_require__(/*! core-js/modules/es.symbol.iterator.js */ \"./node_modules/core-js/modules/es.symbol.iterator.js\");

__webpack_require__(/*! core-js/modules/es.array.iterator.js */ \"./node_modules/core-js/modules/es.array.iterator.js\");

__webpack_require__(/*! core-js/modules/es.string.iterator.js */ \"./node_modules/core-js/modules/es.string.iterator.js\");

__webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ \"./node_modules/core-js/modules/web.dom-collections.iterator.js\");

/*
 Leaflet.draw 0.4.12, a plugin that adds drawing and editing tools to Leaflet powered maps.
 (c) 2012-2017, Jacob Toye, Jon West, Smartrak, Leaflet

 https://github.com/Leaflet/Leaflet.draw
 http://leafletjs.com
 */
(function (window, document, undefined) {
  /**
   * Leaflet.draw assumes that you have already included the Leaflet library.
   */
  L.drawVersion = \"0.4.12\";
  /**
   * @class L.Draw
   * @aka Draw
   *
   *
   * To add the draw toolbar set the option drawControl: true in the map options.
   *
   * @example
   * ```js
   *      var map = L.map('map', {drawControl: true}).setView([51.505, -0.09], 13);
   *
   *      L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
  *          attribution: '&copy; <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'
  *      }).addTo(map);
   * ```
   *
   * ### Adding the edit toolbar
   * To use the edit toolbar you must initialise the Leaflet.draw control and manually add it to the map.
   *
   * ```js
   *      var map = L.map('map').setView([51.505, -0.09], 13);
   *
   *      L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
  *          attribution: '&copy; <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'
  *      }).addTo(map);
   *
   *      // FeatureGroup is to store editable layers
   *      var drawnItems = new L.FeatureGroup();
   *      map.addLayer(drawnItems);
   *
   *      var drawControl = new L.Control.Draw({
  *          edit: {
  *              featureGroup: drawnItems
  *          }
  *      });
   *      map.addControl(drawControl);
   * ```
   *
   * The key here is the featureGroup option. This tells the plugin which FeatureGroup contains the layers that
   * should be editable. The featureGroup can contain 0 or more features with geometry types Point, LineString, and Polygon.
   * Leaflet.draw does not work with multigeometry features such as MultiPoint, MultiLineString, MultiPolygon,
   * or GeometryCollection. If you need to add multigeometry features to the draw plugin, convert them to a
   * FeatureCollection of non-multigeometries (Points, LineStrings, or Polygons).
   */

  L.Draw = {};
  /**
   * @class L.drawLocal
   * @aka L.drawLocal
   *
   * The core toolbar class of the API — it is used to create the toolbar ui
   *
   * @example
   * ```js
   *      var modifiedDraw = L.drawLocal.extend({
  *          draw: {
  *              toolbar: {
  *                  buttons: {
  *                      polygon: 'Draw an awesome polygon'
  *                  }
  *              }
  *          }
  *      });
   * ```
   *
   * The default state for the control is the draw toolbar just below the zoom control.
   *  This will allow map users to draw vectors and markers.
   *  **Please note the edit toolbar is not enabled by default.**
   */

  L.drawLocal = {
    // format: {
    // \tnumeric: {
    // \t\tdelimiters: {
    // \t\t\tthousands: ',',
    // \t\t\tdecimal: '.'
    // \t\t}
    // \t}
    // },
    draw: {
      toolbar: {
        // #TODO: this should be reorganized where actions are nested in actions
        // ex: actions.undo  or actions.cancel
        actions: {
          title: 'Cancel drawing',
          text: 'Cancel'
        },
        finish: {
          title: 'Finish drawing',
          text: 'Finish'
        },
        undo: {
          title: 'Delete last point drawn',
          text: 'Delete last point'
        },
        buttons: {
          polyline: 'Draw a polyline',
          polygon: 'Draw a polygon',
          rectangle: 'Draw a rectangle',
          circle: 'Draw a circle',
          marker: 'Draw a marker',
          circlemarker: 'Draw a circlemarker'
        }
      },
      handlers: {
        circle: {
          tooltip: {
            start: 'Click and drag to draw circle.'
          },
          radius: 'Radius'
        },
        circlemarker: {
          tooltip: {
            start: 'Click map to place circle marker.'
          }
        },
        marker: {
          tooltip: {
            start: 'Click map to place marker.'
          }
        },
        polygon: {
          tooltip: {
            start: 'Click to start drawing shape.',
            cont: 'Click to continue drawing shape.',
            end: 'Click first point to close this shape.'
          }
        },
        polyline: {
          error: '<strong>Error:</strong> shape edges cannot cross!',
          tooltip: {
            start: 'Click to start drawing line.',
            cont: 'Click to continue drawing line.',
            end: 'Click last point to finish line.'
          }
        },
        rectangle: {
          tooltip: {
            start: 'Click and drag to draw rectangle.'
          }
        },
        simpleshape: {
          tooltip: {
            end: 'Release mouse to finish drawing.'
          }
        }
      }
    },
    edit: {
      toolbar: {
        actions: {
          save: {
            title: 'Save changes',
            text: 'Save'
          },
          cancel: {
            title: 'Cancel editing, discards all changes',
            text: 'Cancel'
          },
          clearAll: {
            title: 'Clear all layers',
            text: 'Clear All'
          }
        },
        buttons: {
          edit: 'Edit layers',
          editDisabled: 'No layers to edit',
          remove: 'Delete layers',
          removeDisabled: 'No layers to delete'
        }
      },
      handlers: {
        edit: {
          tooltip: {
            text: 'Drag handles or markers to edit features.',
            subtext: 'Click cancel to undo changes.'
          }
        },
        remove: {
          tooltip: {
            text: 'Click on a feature to remove.'
          }
        }
      }
    }
  };
  /**
   * ### Events
   * Once you have successfully added the Leaflet.draw plugin to your map you will want to respond to the different
   * actions users can initiate. The following events will be triggered on the map:
   *
   * @class L.Draw.Event
   * @aka Draw.Event
   *
   * Use `L.Draw.Event.EVENTNAME` constants to ensure events are correct.
   *
   * @example
   * ```js
   * map.on(L.Draw.Event.CREATED; function (e) {
  *    var type = e.layerType,
  *        layer = e.layer;
  *
  *    if (type === 'marker') {
  *        // Do marker specific actions
  *    }
  *
  *    // Do whatever else you need to. (save to db; add to map etc)
  *    map.addLayer(layer);
  *});
   * ```
   */

  L.Draw.Event = {};
  /**
   * @event draw:created: PolyLine; Polygon; Rectangle; Circle; Marker | String
   *
   * Layer that was just created.
   * The type of layer this is. One of: `polyline`; `polygon`; `rectangle`; `circle`; `marker`
   * Triggered when a new vector or marker has been created.
   *
   */

  L.Draw.Event.CREATED = 'draw:created';
  /**
   * @event draw:edited: LayerGroup
   *
   * List of all layers just edited on the map.
   *
   *
   * Triggered when layers in the FeatureGroup; initialised with the plugin; have been edited and saved.
   *
   * @example
   * ```js
   *      map.on('draw:edited', function (e) {
   *          var layers = e.layers;
   *          layers.eachLayer(function (layer) {
   *              //do whatever you want; most likely save back to db
   *          });
   *      });
   * ```
   */

  L.Draw.Event.EDITED = 'draw:edited';
  /**
   * @event draw:deleted: LayerGroup
   *
   * List of all layers just removed from the map.
   *
   * Triggered when layers have been removed (and saved) from the FeatureGroup.
   */

  L.Draw.Event.DELETED = 'draw:deleted';
  /**
   * @event draw:drawstart: String
   *
   * The type of layer this is. One of:`polyline`; `polygon`; `rectangle`; `circle`; `marker`
   *
   * Triggered when the user has chosen to draw a particular vector or marker.
   */

  L.Draw.Event.DRAWSTART = 'draw:drawstart';
  /**
   * @event draw:drawstop: String
   *
   * The type of layer this is. One of: `polyline`; `polygon`; `rectangle`; `circle`; `marker`
   *
   * Triggered when the user has finished a particular vector or marker.
   */

  L.Draw.Event.DRAWSTOP = 'draw:drawstop';
  /**
   * @event draw:drawvertex: LayerGroup
   *
   * List of all layers just being added from the map.
   *
   * Triggered when a vertex is created on a polyline or polygon.
   */

  L.Draw.Event.DRAWVERTEX = 'draw:drawvertex';
  /**
   * @event draw:editstart: String
   *
   * The type of edit this is. One of: `edit`
   *
   * Triggered when the user starts edit mode by clicking the edit tool button.
   */

  L.Draw.Event.EDITSTART = 'draw:editstart';
  /**
   * @event draw:editmove: ILayer
   *
   *  Layer that was just moved.
   *
   * Triggered as the user moves a rectangle; circle or marker.
   */

  L.Draw.Event.EDITMOVE = 'draw:editmove';
  /**
   * @event draw:editresize: ILayer
   *
   * Layer that was just moved.
   *
   * Triggered as the user resizes a rectangle or circle.
   */

  L.Draw.Event.EDITRESIZE = 'draw:editresize';
  /**
   * @event draw:editvertex: LayerGroup
   *
   * List of all layers just being edited from the map.
   *
   * Triggered when a vertex is edited on a polyline or polygon.
   */

  L.Draw.Event.EDITVERTEX = 'draw:editvertex';
  /**
   * @event draw:editstop: String
   *
   * The type of edit this is. One of: `edit`
   *
   * Triggered when the user has finshed editing (edit mode) and saves edits.
   */

  L.Draw.Event.EDITSTOP = 'draw:editstop';
  /**
   * @event draw:deletestart: String
   *
   * The type of edit this is. One of: `remove`
   *
   * Triggered when the user starts remove mode by clicking the remove tool button.
   */

  L.Draw.Event.DELETESTART = 'draw:deletestart';
  /**
   * @event draw:deletestop: String
   *
   * The type of edit this is. One of: `remove`
   *
   * Triggered when the user has finished removing shapes (remove mode) and saves.
   */

  L.Draw.Event.DELETESTOP = 'draw:deletestop';
  L.Draw = L.Draw || {};
  /**
   * @class L.Draw.Feature
   * @aka Draw.Feature
   */

  L.Draw.Feature = L.Handler.extend({
    includes: L.Mixin.Events,
    // @method initialize(): void
    initialize: function initialize(map, options) {
      this._map = map;
      this._container = map._container;
      this._overlayPane = map._panes.overlayPane;
      this._popupPane = map._panes.popupPane; // Merge default shapeOptions options with custom shapeOptions

      if (options && options.shapeOptions) {
        options.shapeOptions = L.Util.extend({}, this.options.shapeOptions, options.shapeOptions);
      }

      L.setOptions(this, options);
    },
    // @method enable(): void
    // Enables this handler
    enable: function enable() {
      if (this._enabled) {
        return;
      }

      L.Handler.prototype.enable.call(this);
      this.fire('enabled', {
        handler: this.type
      });

      this._map.fire(L.Draw.Event.DRAWSTART, {
        layerType: this.type
      });
    },
    // @method disable(): void
    disable: function disable() {
      if (!this._enabled) {
        return;
      }

      L.Handler.prototype.disable.call(this);

      this._map.fire(L.Draw.Event.DRAWSTOP, {
        layerType: this.type
      });

      this.fire('disabled', {
        handler: this.type
      });
    },
    // @method addHooks(): void
    // Add's event listeners to this handler
    addHooks: function addHooks() {
      var map = this._map;

      if (map) {
        L.DomUtil.disableTextSelection();
        map.getContainer().focus();
        this._tooltip = new L.Draw.Tooltip(this._map);
        L.DomEvent.on(this._container, 'keyup', this._cancelDrawing, this);
      }
    },
    // @method removeHooks(): void
    // Removes event listeners from this handler
    removeHooks: function removeHooks() {
      if (this._map) {
        L.DomUtil.enableTextSelection();

        this._tooltip.dispose();

        this._tooltip = null;
        L.DomEvent.off(this._container, 'keyup', this._cancelDrawing, this);
      }
    },
    // @method setOptions(object): void
    // Sets new options to this handler
    setOptions: function setOptions(options) {
      L.setOptions(this, options);
    },
    _fireCreatedEvent: function _fireCreatedEvent(layer) {
      this._map.fire(L.Draw.Event.CREATED, {
        layer: layer,
        layerType: this.type
      });
    },
    // Cancel drawing when the escape key is pressed
    _cancelDrawing: function _cancelDrawing(e) {
      if (e.keyCode === 27) {
        this._map.fire('draw:canceled', {
          layerType: this.type
        });

        this.disable();
      }
    }
  });
  /**
   * @class L.Draw.Polyline
   * @aka Draw.Polyline
   * @inherits L.Draw.Feature
   */

  L.Draw.Polyline = L.Draw.Feature.extend({
    statics: {
      TYPE: 'polyline'
    },
    Poly: L.Polyline,
    options: {
      allowIntersection: true,
      repeatMode: false,
      drawError: {
        color: '#b00b00',
        timeout: 2500
      },
      icon: new L.DivIcon({
        iconSize: new L.Point(8, 8),
        className: 'leaflet-div-icon leaflet-editing-icon'
      }),
      touchIcon: new L.DivIcon({
        iconSize: new L.Point(20, 20),
        className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
      }),
      guidelineDistance: 20,
      maxGuideLineLength: 4000,
      shapeOptions: {
        stroke: true,
        color: '#3388ff',
        weight: 4,
        opacity: 0.5,
        fill: false,
        clickable: true
      },
      metric: true,
      // Whether to use the metric measurement system or imperial
      feet: true,
      // When not metric, to use feet instead of yards for display.
      nautic: false,
      // When not metric, not feet use nautic mile for display
      showLength: true,
      // Whether to display distance in the tooltip
      zIndexOffset: 2000,
      // This should be > than the highest z-index any map layers
      factor: 1 // To change distance calculation

    },
    // @method initialize(): void
    initialize: function initialize(map, options) {
      // if touch, switch to touch icon
      if (L.Browser.touch) {
        this.options.icon = this.options.touchIcon;
      } // Need to set this here to ensure the correct message is used.


      this.options.drawError.message = L.drawLocal.draw.handlers.polyline.error; // Merge default drawError options with custom options

      if (options && options.drawError) {
        options.drawError = L.Util.extend({}, this.options.drawError, options.drawError);
      } // Save the type so super can fire, need to do this as cannot do this.TYPE :(


      this.type = L.Draw.Polyline.TYPE;
      L.Draw.Feature.prototype.initialize.call(this, map, options);
    },
    // @method addHooks(): void
    // Add listener hooks to this handler
    addHooks: function addHooks() {
      L.Draw.Feature.prototype.addHooks.call(this);

      if (this._map) {
        this._markers = [];
        this._markerGroup = new L.LayerGroup();

        this._map.addLayer(this._markerGroup);

        this._poly = new L.Polyline([], this.options.shapeOptions);

        this._tooltip.updateContent(this._getTooltipText()); // Make a transparent marker that will used to catch click events. These click
        // events will create the vertices. We need to do this so we can ensure that
        // we can create vertices over other map layers (markers, vector layers). We
        // also do not want to trigger any click handlers of objects we are clicking on
        // while drawing.


        if (!this._mouseMarker) {
          this._mouseMarker = L.marker(this._map.getCenter(), {
            icon: L.divIcon({
              className: 'leaflet-mouse-marker',
              iconAnchor: [20, 20],
              iconSize: [40, 40]
            }),
            opacity: 0,
            zIndexOffset: this.options.zIndexOffset
          });
        }

        this._mouseMarker.on('mouseout', this._onMouseOut, this).on('mousemove', this._onMouseMove, this) // Necessary to prevent 0.8 stutter
        .on('mousedown', this._onMouseDown, this).on('mouseup', this._onMouseUp, this) // Necessary for 0.8 compatibility
        .addTo(this._map);

        this._map.on('mouseup', this._onMouseUp, this) // Necessary for 0.7 compatibility
        .on('mousemove', this._onMouseMove, this).on('zoomlevelschange', this._onZoomEnd, this).on('touchstart', this._onTouch, this).on('zoomend', this._onZoomEnd, this);
      }
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler.
    removeHooks: function removeHooks() {
      L.Draw.Feature.prototype.removeHooks.call(this);

      this._clearHideErrorTimeout();

      this._cleanUpShape(); // remove markers from map


      this._map.removeLayer(this._markerGroup);

      delete this._markerGroup;
      delete this._markers;

      this._map.removeLayer(this._poly);

      delete this._poly;

      this._mouseMarker.off('mousedown', this._onMouseDown, this).off('mouseout', this._onMouseOut, this).off('mouseup', this._onMouseUp, this).off('mousemove', this._onMouseMove, this);

      this._map.removeLayer(this._mouseMarker);

      delete this._mouseMarker; // clean up DOM

      this._clearGuides();

      this._map.off('mouseup', this._onMouseUp, this).off('mousemove', this._onMouseMove, this).off('zoomlevelschange', this._onZoomEnd, this).off('zoomend', this._onZoomEnd, this).off('touchstart', this._onTouch, this).off('click', this._onTouch, this);
    },
    // @method deleteLastVertex(): void
    // Remove the last vertex from the polyline, removes polyline from map if only one point exists.
    deleteLastVertex: function deleteLastVertex() {
      if (this._markers.length <= 1) {
        return;
      }

      var lastMarker = this._markers.pop(),
          poly = this._poly,
          // Replaces .spliceLatLngs()
      latlngs = poly.getLatLngs(),
          latlng = latlngs.splice(-1, 1)[0];

      this._poly.setLatLngs(latlngs);

      this._markerGroup.removeLayer(lastMarker);

      if (poly.getLatLngs().length < 2) {
        this._map.removeLayer(poly);
      }

      this._vertexChanged(latlng, false);
    },
    // @method isMarkerInsidePolygon(): void
    isMarkerInsidePolygon: function isMarkerInsidePolygon(latLng, poly) {
      var inside = false;
      var x = latLng.lat,
          y = latLng.lng;

      for (var ii = 0; ii < poly.getLatLngs().length; ii++) {
        var polyPoints = poly.getLatLngs()[ii];

        for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {
          var xi = polyPoints[i].lat,
              yi = polyPoints[i].lng;
          var xj = polyPoints[j].lat,
              yj = polyPoints[j].lng;
          var intersect = yi > y != yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
          if (intersect) inside = !inside;
        }
      }

      return inside;
    },
    // @method addVertex(): void
    // Add a vertex to the end of the polyline
    // Add a vertex to the end of the polyline
    addVertex: function addVertex(latlng, same) {
      var markersLength = this._markers.length; // markersLength must be greater than or equal to 2 before intersections can occur

      var inPolygon = false;

      if (same) {
        this._map.eachLayer(function (poly) {
          if (poly instanceof L.Polygon) {
            var inside = false;
            var x = latlng.lat,
                y = latlng.lng;

            for (var ii = 0; ii < poly.getLatLngs().length; ii++) {
              var polyPoints = poly.getLatLngs()[ii];

              for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {
                var xi = polyPoints[i].lat,
                    yi = polyPoints[i].lng;
                var xj = polyPoints[j].lat,
                    yj = polyPoints[j].lng;
                var intersect = yi > y != yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
                if (intersect) inside = !inside;
              }
            }

            if (inside) {
              //poly.setStyle({ color: 'blue' });
              inPolygon = true;
            }
          }
        });
      } else {
        var pointSnap = this.pointSnap();
      }

      if (!inPolygon && markersLength >= 1) {
        var latLngTest = latlng;

        var lastLatLng = this._markers[markersLength - 1].getLatLng();

        inPolygon = this.lineInPolygon(latLngTest, lastLatLng);
        var lastLine = L.polyline([lastLatLng, latLngTest], {
          opacity: \"0\"
        }).addTo(this._map);
      } //Si ligne intersect un polygon OU si point/ligne in Polygon OU si point n'est pas sur un point snap ou dans le vide


      if (markersLength >= 2 && !this.options.allowIntersection && this._poly.newLatLngIntersects(latlng) || inPolygon || !pointSnap && !same) {
        this._showErrorTooltip();

        return;
      } else if (this._errorShown) {
        this._hideErrorTooltip();
      }

      this._markers.push(this._createMarker(latlng));

      this._poly.addLatLng(latlng);

      if (this._poly.getLatLngs().length === 2) {
        this._map.addLayer(this._poly);
      }

      this._vertexChanged(latlng, true);
    },
    pointSnap: function pointSnap() {
      var guideLayers = this._snapper._guides;

      for (var i = 0; i < guideLayers.length; i++) {
        for (var j = 0; j < guideLayers[i]._latlngs.length; j++) {
          for (var k = 0; k < guideLayers[i]._latlngs[j].length; k++) {
            if (guideLayers[i]._latlngs[j][k].lat) {
              if (this._snapper._markers[0]._latlng.lat == guideLayers[i]._latlngs[j][k].lat && this._snapper._markers[0]._latlng.lng == guideLayers[i]._latlngs[j][k].lng) {
                return true;
              }
            } else {
              for (var l = 0; l < guideLayers[i]._latlngs[j][k].length; l++) {
                if (this._snapper._markers[0]._latlng.lat == guideLayers[i]._latlngs[j][k][l].lat && this._snapper._markers[0]._latlng.lng == guideLayers[i]._latlngs[j][k][l].lng) {
                  return true;
                }
              }
            }
          }
        }
      }

      return false;
    },
    // @method completeShape(): void
    // Closes the polyline between the first and last points
    completeShape: function completeShape() {
      if (this._markers.length <= 1) {
        return;
      }

      this._fireCreatedEvent();

      this.disable();

      if (this.options.repeatMode) {
        this.enable();
      }
    },
    is_in_polygon: function is_in_polygon(\$vertices_x, \$vertices_y, point) {
      \$c = false;
      \$i = \$j = \$c = 0;
      \$longitude_x = point.lng;
      \$latitude_y = point.lat;

      for (\$i = 0, \$j = 2 - 1; \$i < 2; \$j = \$i++) {
        if (\$vertices_y[\$i] > \$latitude_y != \$vertices_y[\$j] > \$latitude_y && \$longitude_x < (\$vertices_x[\$j] - \$vertices_x[\$i]) * (\$latitude_y - \$vertices_y[\$i]) / (\$vertices_y[\$j] - \$vertices_y[\$i]) + \$vertices_x[\$i]) {
          \$c = !\$c;
        }
      }

      return \$c;
    },
    pointOnPolygon: function pointOnPolygon(latLng) {
      this._map.eachLayer(function (poly) {
        if (poly instanceof L.Polygon) {
          var polyBounds = poly.getBounds();

          if (polyBounds.contains(latLng)) {
            var latLngPoly = poly._latlngs[0];
            var lenght = latLngPoly.length;
            var i = 0;
            var j = 1;

            while (i < lenght) {
              if (j == lenght) {
                j = 0;
              }

              var line = L.polyline([poly._latlngs[0][i], poly._latlngs[0][j]], {
                opacity: \"0\"
              }).addTo(poly._map);
              var polyLineBounds = line.getBounds();

              if (polyLineBounds.contains(latLng)) {
                if (i == 0 && j == lenght - 1 || j == 0 && i == lenght - 1) {
                  latLngPoly.splice(0, 0, L.latLng(latLng.lat, latLng.lng));
                } else {
                  var markerPoly = i + j;
                  markerPoly = markerPoly / 2;
                  latLngPoly.splice(Math.ceil(markerPoly), 0, L.latLng(latLng.lat, latLng.lng));
                }

                poly._map.removeLayer(line);

                poly._latlngs[0] = latLngPoly;
                poly.editing.latlngs[0][0] = latLngPoly;
                poly.redraw();
                return true;
              }

              poly._map.removeLayer(line);

              i++;
              j++;
            }
          }
        }
      });

      return false;
    },
    lineInPolygon: function lineInPolygon(latLngTest, lastLatLng) {
      var inPolygon = false;
      var lastLine = L.polyline([lastLatLng, latLngTest], {
        opacity: \"0\"
      }).addTo(this._map);
      latLngTest.lng = Math.round(latLngTest.lng * 1000000) / 1000000;
      latLngTest.lat = Math.round(latLngTest.lat * 1000000) / 1000000;
      lastLatLng.lng = Math.round(lastLatLng.lng * 1000000) / 1000000;
      lastLatLng.lat = Math.round(lastLatLng.lat * 1000000) / 1000000;

      for (var num = 0.1; num <= 0.9; num += 0.1) {
        var point = L.GeometryUtil.interpolateOnLine(this._map, lastLine, num);
        var tabOnPoly = [];

        this._map.eachLayer(function (poly) {
          if (poly instanceof L.Polygon) {
            var before,
                after = 0;

            for (var i = 0; i < poly.getLatLngs().length; i++) {
              var polyPoints = poly.getLatLngs()[i];

              if (!polyPoints[0].lat) {
                //antennes
                polyPoints = polyPoints[0];
              }

              for (var j = 0; j < polyPoints.length; j++) {
                if (polyPoints[j].equals(lastLatLng)) {
                  before = j - 1;
                  after = j + 1;

                  if (j == 0) {
                    before = polyPoints.length - 1;
                  } else if (j == polyPoints.length - 1) {
                    after = 0;
                  }

                  if (polyPoints[before].equals(latLngTest) || polyPoints[after].equals(latLngTest)) {
                    tabOnPoly.push(poly.options.id);
                  }
                }
              }
            }
          }
        });

        this._map.eachLayer(function (poly) {
          if (poly instanceof L.Polygon) {
            if (!tabOnPoly.includes(poly.options.id)) {
              var inside = false;
              var x = point.latLng.lat,
                  y = point.latLng.lng;

              for (var ii = 0; ii < poly.getLatLngs().length; ii++) {
                var polyPoints = poly.getLatLngs()[ii];

                for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {
                  var xi = polyPoints[i].lat,
                      yi = polyPoints[i].lng;
                  var xj = polyPoints[j].lat,
                      yj = polyPoints[j].lng;
                  var intersect = yi > y != yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
                  if (intersect) inside = !inside;
                }
              }

              if (inside) {
                inPolygon = true;
              }
            } else {
              return;
            }
          }
        });
      }

      this._map.removeLayer(lastLine);

      return inPolygon;
    },
    _finishShape: function _finishShape() {
      console.info('finishshape');
      var latlngs = this._poly._defaultShape ? this._poly._defaultShape() : this._poly.getLatLngs();

      var intersects = this._poly.newLatLngIntersects(latlngs[latlngs.length - 1]);

      var markersLength = this._markers.length;

      var latLngTest = this._markers[0].getLatLng();

      var lastLatLng = this._markers[markersLength - 1].getLatLng();

      var inPolygon = this.lineInPolygon(latLngTest, lastLatLng);

      if (!this.options.allowIntersection && intersects || !this._shapeIsValid() || inPolygon) {
        this._showErrorTooltip();

        return;
      }

      this._fireCreatedEvent();

      this.disable();

      if (this.options.repeatMode) {
        this.enable();
      }
    },
    // Called to verify the shape is valid when the user tries to finish it
    // Return false if the shape is not valid
    _shapeIsValid: function _shapeIsValid() {
      return true;
    },
    _onZoomEnd: function _onZoomEnd() {
      if (this._markers !== null) {
        this._updateGuide();
      }
    },
    _onMouseMove: function _onMouseMove(e) {
      var newPos = this._map.mouseEventToLayerPoint(e.originalEvent);

      var latlng = this._map.layerPointToLatLng(newPos); // Save latlng
      // should this be moved to _updateGuide() ?


      this._currentLatLng = latlng;

      this._updateTooltip(latlng); // Update the guide line


      this._updateGuide(newPos); // Update the mouse marker position


      this._mouseMarker.setLatLng(latlng);

      L.DomEvent.preventDefault(e.originalEvent);
    },
    _vertexChanged: function _vertexChanged(latlng, added) {
      this._map.fire(L.Draw.Event.DRAWVERTEX, {
        layers: this._markerGroup
      });

      this._updateFinishHandler();

      this._updateRunningMeasure(latlng, added);

      this._clearGuides();

      this._updateTooltip();
    },
    _onMouseDown: function _onMouseDown(e) {
      if (!this._clickHandled && !this._touchHandled && !this._disableMarkers) {
        this._onMouseMove(e);

        this._clickHandled = true;

        this._disableNewMarkers();

        var originalEvent = e.originalEvent;
        var clientX = originalEvent.clientX;
        var clientY = originalEvent.clientY;

        this._startPoint.call(this, clientX, clientY);
      }
    },
    _startPoint: function _startPoint(clientX, clientY) {
      this._mouseDownOrigin = L.point(clientX, clientY);
    },
    _onMouseUp: function _onMouseUp(e) {
      var originalEvent = e.originalEvent;
      var clientX = originalEvent.clientX;
      var clientY = originalEvent.clientY;

      this._endPoint.call(this, clientX, clientY, e);

      this._clickHandled = null;
    },
    _endPoint: function _endPoint(clientX, clientY, e) {
      if (this._mouseDownOrigin) {
        var dragCheckDistance = L.point(clientX, clientY).distanceTo(this._mouseDownOrigin);

        var lastPtDistance = this._calculateFinishDistance(e.latlng);

        if (lastPtDistance < 10 && L.Browser.touch) {
          this._finishShape();
        } else if (Math.abs(dragCheckDistance) < 9 * (window.devicePixelRatio || 1)) {
          if (this._snapper) {
            var same = false;

            if (this._snapper._markers[0]._latlng.lat == e.latlng.lat && this._snapper._markers[0]._latlng.lng == e.latlng.lng) {
              same = true;
            }

            this.addVertex(this._snapper._markers[0]._latlng, same);
          } else {
            this.addVertex(e.latlng, false);
          }
        }

        this._enableNewMarkers(); // after a short pause, enable new markers

      }

      this._mouseDownOrigin = null;
    },
    // ontouch prevented by clickHandled flag because some browsers fire both click/touch events,
    // causing unwanted behavior
    _onTouch: function _onTouch(e) {
      var originalEvent = e.originalEvent;
      var clientX;
      var clientY;

      if (originalEvent.touches && originalEvent.touches[0] && !this._clickHandled && !this._touchHandled && !this._disableMarkers) {
        clientX = originalEvent.touches[0].clientX;
        clientY = originalEvent.touches[0].clientY;

        this._disableNewMarkers();

        this._touchHandled = true;

        this._startPoint.call(this, clientX, clientY);

        this._endPoint.call(this, clientX, clientY, e);

        this._touchHandled = null;
      }

      this._clickHandled = null;
    },
    _onMouseOut: function _onMouseOut() {
      if (this._tooltip) {
        this._tooltip._onMouseOut.call(this._tooltip);
      }
    },
    // calculate if we are currently within close enough distance
    // of the closing point (first point for shapes, last point for lines)
    // this is semi-ugly code but the only reliable way i found to get the job done
    // note: calculating point.distanceTo between mouseDownOrigin and last marker did NOT work
    _calculateFinishDistance: function _calculateFinishDistance(potentialLatLng) {
      var lastPtDistance;

      if (this._markers.length > 0) {
        var finishMarker;

        if (this.type === L.Draw.Polyline.TYPE) {
          finishMarker = this._markers[this._markers.length - 1];
        } else if (this.type === L.Draw.Polygon.TYPE) {
          finishMarker = this._markers[0];
        } else {
          return Infinity;
        }

        var lastMarkerPoint = this._map.latLngToContainerPoint(finishMarker.getLatLng()),
            potentialMarker = new L.Marker(potentialLatLng, {
          icon: this.options.icon,
          zIndexOffset: this.options.zIndexOffset * 2
        });

        var potentialMarkerPint = this._map.latLngToContainerPoint(potentialMarker.getLatLng());

        lastPtDistance = lastMarkerPoint.distanceTo(potentialMarkerPint);
      } else {
        lastPtDistance = Infinity;
      }

      return lastPtDistance;
    },
    _updateFinishHandler: function _updateFinishHandler() {
      var markerCount = this._markers.length; // The last marker should have a click handler to close the polyline

      if (markerCount > 1) {
        this._markers[markerCount - 1].on('click', this._finishShape, this);
      } // Remove the old marker click handler (as only the last point should close the polyline)


      if (markerCount > 2) {
        this._markers[markerCount - 2].off('click', this._finishShape, this);
      }
    },
    _createMarker: function _createMarker(latlng) {
      var marker = new L.Marker(latlng, {
        icon: this.options.icon,
        zIndexOffset: this.options.zIndexOffset * 2
      });

      this._markerGroup.addLayer(marker);

      return marker;
    },
    _updateGuide: function _updateGuide(newPos) {
      var markerCount = this._markers ? this._markers.length : 0;

      if (markerCount > 0) {
        newPos = newPos || this._map.latLngToLayerPoint(this._currentLatLng); // draw the guide line

        this._clearGuides();

        this._drawGuide(this._map.latLngToLayerPoint(this._markers[markerCount - 1].getLatLng()), newPos);
      }
    },
    _updateTooltip: function _updateTooltip(latLng) {
      var text = this._getTooltipText();

      if (latLng) {
        this._tooltip.updatePosition(latLng);
      }

      if (!this._errorShown) {
        this._tooltip.updateContent(text);
      }
    },
    _drawGuide: function _drawGuide(pointA, pointB) {
      var length = Math.floor(Math.sqrt(Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2))),
          guidelineDistance = this.options.guidelineDistance,
          maxGuideLineLength = this.options.maxGuideLineLength,
          // Only draw a guideline with a max length
      i = length > maxGuideLineLength ? length - maxGuideLineLength : guidelineDistance,
          fraction,
          dashPoint,
          dash; //create the guides container if we haven't yet

      if (!this._guidesContainer) {
        this._guidesContainer = L.DomUtil.create('div', 'leaflet-draw-guides', this._overlayPane);
      } //draw a dash every GuildeLineDistance


      for (; i < length; i += this.options.guidelineDistance) {
        //work out fraction along line we are
        fraction = i / length; //calculate new x,y point

        dashPoint = {
          x: Math.floor(pointA.x * (1 - fraction) + fraction * pointB.x),
          y: Math.floor(pointA.y * (1 - fraction) + fraction * pointB.y)
        }; //add guide dash to guide container

        dash = L.DomUtil.create('div', 'leaflet-draw-guide-dash', this._guidesContainer);
        dash.style.backgroundColor = !this._errorShown ? this.options.shapeOptions.color : this.options.drawError.color;
        L.DomUtil.setPosition(dash, dashPoint);
      }
    },
    _updateGuideColor: function _updateGuideColor(color) {
      if (this._guidesContainer) {
        for (var i = 0, l = this._guidesContainer.childNodes.length; i < l; i++) {
          this._guidesContainer.childNodes[i].style.backgroundColor = color;
        }
      }
    },
    // removes all child elements (guide dashes) from the guides container
    _clearGuides: function _clearGuides() {
      if (this._guidesContainer) {
        while (this._guidesContainer.firstChild) {
          this._guidesContainer.removeChild(this._guidesContainer.firstChild);
        }
      }
    },
    _getTooltipText: function _getTooltipText() {
      var showLength = this.options.showLength,
          labelText,
          distanceStr;

      if (L.Browser.touch) {
        showLength = false; // if there's a better place to put this, feel free to move it
      }

      if (this._markers.length === 0) {
        labelText = {
          text: L.drawLocal.draw.handlers.polyline.tooltip.start
        };
      } else {
        distanceStr = showLength ? this._getMeasurementString() : '';

        if (this._markers.length === 1) {
          labelText = {
            text: L.drawLocal.draw.handlers.polyline.tooltip.cont,
            subtext: distanceStr
          };
        } else {
          labelText = {
            text: L.drawLocal.draw.handlers.polyline.tooltip.end,
            subtext: distanceStr
          };
        }
      }

      return labelText;
    },
    _updateRunningMeasure: function _updateRunningMeasure(latlng, added) {
      var markersLength = this._markers.length,
          previousMarkerIndex,
          distance;

      if (this._markers.length === 1) {
        this._measurementRunningTotal = 0;
      } else {
        previousMarkerIndex = markersLength - (added ? 2 : 1);
        distance = this._map.distance(latlng, this._markers[previousMarkerIndex].getLatLng()) * (this.options.factor || 1);
        this._measurementRunningTotal += distance * (added ? 1 : -1);
      }
    },
    _getMeasurementString: function _getMeasurementString() {
      var currentLatLng = this._currentLatLng,
          previousLatLng = this._markers[this._markers.length - 1].getLatLng(),
          distance; // calculate the distance from the last fixed point to the mouse position


      distance = previousLatLng && currentLatLng ? this._measurementRunningTotal + this._map.distance(currentLatLng, previousLatLng) * (this.options.factor || 1) : this._measurementRunningTotal || 0;
      return L.GeometryUtil.readableDistance(distance, this.options.metric, this.options.feet, this.options.nautic, this.options.precision);
    },
    _showErrorTooltip: function _showErrorTooltip() {
      this._errorShown = true; // Update tooltip

      this._tooltip.showAsError().updateContent({
        text: this.options.drawError.message
      }); // Update shape


      this._updateGuideColor(this.options.drawError.color);

      this._poly.setStyle({
        color: this.options.drawError.color
      }); // Hide the error after 2 seconds


      this._clearHideErrorTimeout();

      this._hideErrorTimeout = setTimeout(L.Util.bind(this._hideErrorTooltip, this), this.options.drawError.timeout);
    },
    _hideErrorTooltip: function _hideErrorTooltip() {
      this._errorShown = false;

      this._clearHideErrorTimeout(); // Revert tooltip


      this._tooltip.removeError().updateContent(this._getTooltipText()); // Revert shape


      this._updateGuideColor(this.options.shapeOptions.color);

      this._poly.setStyle({
        color: this.options.shapeOptions.color
      });
    },
    _clearHideErrorTimeout: function _clearHideErrorTimeout() {
      if (this._hideErrorTimeout) {
        clearTimeout(this._hideErrorTimeout);
        this._hideErrorTimeout = null;
      }
    },
    // disable new markers temporarily;
    // this is to prevent duplicated touch/click events in some browsers
    _disableNewMarkers: function _disableNewMarkers() {
      this._disableMarkers = true;
    },
    // see _disableNewMarkers
    _enableNewMarkers: function _enableNewMarkers() {
      setTimeout(function () {
        this._disableMarkers = false;
      }.bind(this), 50);
    },
    _cleanUpShape: function _cleanUpShape() {
      if (this._markers.length > 1) {
        this._markers[this._markers.length - 1].off('click', this._finishShape, this);
      }
    },
    _fireCreatedEvent: function _fireCreatedEvent() {
      var poly = new this.Poly(this._poly.getLatLngs(), this.options.shapeOptions);

      L.Draw.Feature.prototype._fireCreatedEvent.call(this, poly);
    }
  });
  /**
   * @class L.Draw.Polygon
   * @aka Draw.Polygon
   * @inherits L.Draw.Polyline
   */

  L.Draw.Polygon = L.Draw.Polyline.extend({
    statics: {
      TYPE: 'polygon'
    },
    Poly: L.Polygon,
    options: {
      showArea: false,
      showLength: false,
      shapeOptions: {
        stroke: true,
        color: '#3388ff',
        weight: 4,
        opacity: 0.5,
        fill: true,
        fillColor: null,
        //same as color by default
        fillOpacity: 0.2,
        clickable: true
      },
      // Whether to use the metric measurement system (truthy) or not (falsy).
      // Also defines the units to use for the metric system as an array of
      // strings (e.g. `['ha', 'm']`).
      metric: true,
      feet: true,
      // When not metric, to use feet instead of yards for display.
      nautic: false,
      // When not metric, not feet use nautic mile for display
      // Defines the precision for each type of unit (e.g. {km: 2, ft: 0}
      precision: {}
    },
    // @method initialize(): void
    initialize: function initialize(map, options) {
      L.Draw.Polyline.prototype.initialize.call(this, map, options); // Save the type so super can fire, need to do this as cannot do this.TYPE :(

      this.type = L.Draw.Polygon.TYPE;
    },
    _updateFinishHandler: function _updateFinishHandler() {
      var markerCount = this._markers.length; // The first marker should have a click handler to close the polygon

      if (markerCount === 1) {
        this._markers[0].on('click', this._finishShape, this);
      } // Add and update the double click handler


      if (markerCount > 2) {
        this._markers[markerCount - 1].on('dblclick', this._finishShape, this); // Only need to remove handler if has been added before


        if (markerCount > 3) {
          this._markers[markerCount - 2].off('dblclick', this._finishShape, this);
        }
      }
    },
    _getTooltipText: function _getTooltipText() {
      var text, subtext;

      if (this._markers.length === 0) {
        text = L.drawLocal.draw.handlers.polygon.tooltip.start;
      } else if (this._markers.length < 3) {
        text = L.drawLocal.draw.handlers.polygon.tooltip.cont;
        subtext = this._getMeasurementString();
      } else {
        text = L.drawLocal.draw.handlers.polygon.tooltip.end;
        subtext = this._getMeasurementString();
      }

      return {
        text: text,
        subtext: subtext
      };
    },
    _getMeasurementString: function _getMeasurementString() {
      var area = this._area,
          measurementString = '';

      if (!area && !this.options.showLength) {
        return null;
      }

      if (this.options.showLength) {
        measurementString = L.Draw.Polyline.prototype._getMeasurementString.call(this);
      }

      if (area) {
        measurementString += '<br>' + L.GeometryUtil.readableArea(area, this.options.metric, this.options.precision);
      }

      return measurementString;
    },
    _shapeIsValid: function _shapeIsValid() {
      return this._markers.length >= 3;
    },
    _vertexChanged: function _vertexChanged(latlng, added) {
      var latLngs; // Check to see if we should show the area

      if (!this.options.allowIntersection && this.options.showArea) {
        latLngs = this._poly.getLatLngs();
        this._area = L.GeometryUtil.geodesicArea(latLngs);
      }

      L.Draw.Polyline.prototype._vertexChanged.call(this, latlng, added);
    },
    _cleanUpShape: function _cleanUpShape() {
      var markerCount = this._markers.length;

      if (markerCount > 0) {
        this._markers[0].off('click', this._finishShape, this);

        if (markerCount > 2) {
          this._markers[markerCount - 1].off('dblclick', this._finishShape, this);
        }
      }
    }
  });
  L.SimpleShape = {};
  /**
   * @class L.Draw.SimpleShape
   * @aka Draw.SimpleShape
   * @inherits L.Draw.Feature
   */

  L.Draw.SimpleShape = L.Draw.Feature.extend({
    options: {
      repeatMode: false
    },
    // @method initialize(): void
    initialize: function initialize(map, options) {
      this._endLabelText = L.drawLocal.draw.handlers.simpleshape.tooltip.end;
      L.Draw.Feature.prototype.initialize.call(this, map, options);
    },
    // @method addHooks(): void
    // Add listener hooks to this handler.
    addHooks: function addHooks() {
      L.Draw.Feature.prototype.addHooks.call(this);

      if (this._map) {
        this._mapDraggable = this._map.dragging.enabled();

        if (this._mapDraggable) {
          this._map.dragging.disable();
        } //TODO refactor: move cursor to styles


        this._container.style.cursor = 'crosshair';

        this._tooltip.updateContent({
          text: this._initialLabelText
        });

        this._map.on('mousedown', this._onMouseDown, this).on('mousemove', this._onMouseMove, this).on('touchstart', this._onMouseDown, this).on('touchmove', this._onMouseMove, this);
      }
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler.
    removeHooks: function removeHooks() {
      L.Draw.Feature.prototype.removeHooks.call(this);

      if (this._map) {
        if (this._mapDraggable) {
          this._map.dragging.enable();
        } //TODO refactor: move cursor to styles


        this._container.style.cursor = '';

        this._map.off('mousedown', this._onMouseDown, this).off('mousemove', this._onMouseMove, this).off('touchstart', this._onMouseDown, this).off('touchmove', this._onMouseMove, this);

        L.DomEvent.off(document, 'mouseup', this._onMouseUp, this);
        L.DomEvent.off(document, 'touchend', this._onMouseUp, this); // If the box element doesn't exist they must not have moved the mouse, so don't need to destroy/return

        if (this._shape) {
          this._map.removeLayer(this._shape);

          delete this._shape;
        }
      }

      this._isDrawing = false;
    },
    _getTooltipText: function _getTooltipText() {
      return {
        text: this._endLabelText
      };
    },
    _onMouseDown: function _onMouseDown(e) {
      this._isDrawing = true;
      this._startLatLng = e.latlng;
      L.DomEvent.on(document, 'mouseup', this._onMouseUp, this).on(document, 'touchend', this._onMouseUp, this).preventDefault(e.originalEvent);
    },
    _onMouseMove: function _onMouseMove(e) {
      var latlng = e.latlng;

      this._tooltip.updatePosition(latlng);

      if (this._isDrawing) {
        this._tooltip.updateContent(this._getTooltipText());

        this._drawShape(latlng);
      }
    },
    _onMouseUp: function _onMouseUp() {
      if (this._shape) {
        this._fireCreatedEvent();
      }

      this.disable();

      if (this.options.repeatMode) {
        this.enable();
      }
    }
  });
  /**
   * @class L.Draw.Rectangle
   * @aka Draw.Rectangle
   * @inherits L.Draw.SimpleShape
   */

  L.Draw.Rectangle = L.Draw.SimpleShape.extend({
    statics: {
      TYPE: 'rectangle'
    },
    options: {
      shapeOptions: {
        stroke: true,
        color: '#3388ff',
        weight: 4,
        opacity: 0.5,
        fill: true,
        fillColor: null,
        //same as color by default
        fillOpacity: 0.2,
        showArea: true,
        clickable: true
      },
      metric: true // Whether to use the metric measurement system or imperial

    },
    // @method initialize(): void
    initialize: function initialize(map, options) {
      // Save the type so super can fire, need to do this as cannot do this.TYPE :(
      this.type = L.Draw.Rectangle.TYPE;
      this._initialLabelText = L.drawLocal.draw.handlers.rectangle.tooltip.start;
      L.Draw.SimpleShape.prototype.initialize.call(this, map, options);
    },
    // @method disable(): void
    disable: function disable() {
      if (!this._enabled) {
        return;
      }

      this._isCurrentlyTwoClickDrawing = false;
      L.Draw.SimpleShape.prototype.disable.call(this);
    },
    _onMouseUp: function _onMouseUp(e) {
      if (!this._shape && !this._isCurrentlyTwoClickDrawing) {
        this._isCurrentlyTwoClickDrawing = true;
        return;
      } // Make sure closing click is on map


      if (this._isCurrentlyTwoClickDrawing && !_hasAncestor(e.target, 'leaflet-pane')) {
        return;
      }

      L.Draw.SimpleShape.prototype._onMouseUp.call(this);
    },
    _drawShape: function _drawShape(latlng) {
      if (!this._shape) {
        this._shape = new L.Rectangle(new L.LatLngBounds(this._startLatLng, latlng), this.options.shapeOptions);

        this._map.addLayer(this._shape);
      } else {
        this._shape.setBounds(new L.LatLngBounds(this._startLatLng, latlng));
      }
    },
    _fireCreatedEvent: function _fireCreatedEvent() {
      var rectangle = new L.Rectangle(this._shape.getBounds(), this.options.shapeOptions);

      L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, rectangle);
    },
    _getTooltipText: function _getTooltipText() {
      var tooltipText = L.Draw.SimpleShape.prototype._getTooltipText.call(this),
          shape = this._shape,
          showArea = this.options.showArea,
          latLngs,
          area,
          subtext;

      if (shape) {
        latLngs = this._shape._defaultShape ? this._shape._defaultShape() : this._shape.getLatLngs();
        area = L.GeometryUtil.geodesicArea(latLngs);
        subtext = showArea ? L.GeometryUtil.readableArea(area, this.options.metric) : '';
      }

      return {
        text: tooltipText.text,
        subtext: subtext
      };
    }
  });

  function _hasAncestor(el, cls) {
    while ((el = el.parentElement) && !el.classList.contains(cls)) {
      ;
    }

    return el;
  }
  /**
   * @class L.Draw.Marker
   * @aka Draw.Marker
   * @inherits L.Draw.Feature
   */


  L.Draw.Marker = L.Draw.Feature.extend({
    statics: {
      TYPE: 'marker'
    },
    options: {
      icon: new L.Icon.Default(),
      repeatMode: false,
      zIndexOffset: 2000 // This should be > than the highest z-index any markers

    },
    // @method initialize(): void
    initialize: function initialize(map, options) {
      // Save the type so super can fire, need to do this as cannot do this.TYPE :(
      this.type = L.Draw.Marker.TYPE;
      this._initialLabelText = L.drawLocal.draw.handlers.marker.tooltip.start;
      L.Draw.Feature.prototype.initialize.call(this, map, options);
    },
    // @method addHooks(): void
    // Add listener hooks to this handler.
    addHooks: function addHooks() {
      L.Draw.Feature.prototype.addHooks.call(this);

      if (this._map) {
        this._tooltip.updateContent({
          text: this._initialLabelText
        }); // Same mouseMarker as in Draw.Polyline


        if (!this._mouseMarker) {
          this._mouseMarker = L.marker(this._map.getCenter(), {
            icon: L.divIcon({
              className: 'leaflet-mouse-marker',
              iconAnchor: [20, 20],
              iconSize: [40, 40]
            }),
            opacity: 0,
            zIndexOffset: this.options.zIndexOffset
          });
        }

        this._mouseMarker.on('click', this._onClick, this).addTo(this._map);

        this._map.on('mousemove', this._onMouseMove, this);

        this._map.on('click', this._onTouch, this);
      }
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler.
    removeHooks: function removeHooks() {
      L.Draw.Feature.prototype.removeHooks.call(this);

      if (this._map) {
        if (this._marker) {
          this._marker.off('click', this._onClick, this);

          this._map.off('click', this._onClick, this).off('click', this._onTouch, this).removeLayer(this._marker);

          delete this._marker;
        }

        this._mouseMarker.off('click', this._onClick, this);

        this._map.removeLayer(this._mouseMarker);

        delete this._mouseMarker;

        this._map.off('mousemove', this._onMouseMove, this);
      }
    },
    _onMouseMove: function _onMouseMove(e) {
      var latlng = e.latlng;

      this._tooltip.updatePosition(latlng);

      this._mouseMarker.setLatLng(latlng);

      if (!this._marker) {
        this._marker = this._createMarker(latlng); // Bind to both marker and map to make sure we get the click event.

        this._marker.on('click', this._onClick, this);

        this._map.on('click', this._onClick, this).addLayer(this._marker);
      } else {
        latlng = this._mouseMarker.getLatLng();

        this._marker.setLatLng(latlng);
      }
    },
    _createMarker: function _createMarker(latlng) {
      return new L.Marker(latlng, {
        icon: this.options.icon,
        zIndexOffset: this.options.zIndexOffset
      });
    },
    _onClick: function _onClick() {
      this._fireCreatedEvent();

      this.disable();

      if (this.options.repeatMode) {
        this.enable();
      }
    },
    _onTouch: function _onTouch(e) {
      // called on click & tap, only really does any thing on tap
      this._onMouseMove(e); // creates & places marker


      this._onClick(); // permanently places marker & ends interaction

    },
    _fireCreatedEvent: function _fireCreatedEvent() {
      var marker = new L.Marker.Touch(this._marker.getLatLng(), {
        icon: this.options.icon
      });

      L.Draw.Feature.prototype._fireCreatedEvent.call(this, marker);
    }
  });
  /**
   * @class L.Draw.CircleMarker
   * @aka Draw.CircleMarker
   * @inherits L.Draw.Marker
   */

  L.Draw.CircleMarker = L.Draw.Marker.extend({
    statics: {
      TYPE: 'circlemarker'
    },
    options: {
      stroke: true,
      color: '#3388ff',
      weight: 4,
      opacity: 0.5,
      fill: true,
      fillColor: null,
      //same as color by default
      fillOpacity: 0.2,
      clickable: true,
      zIndexOffset: 2000 // This should be > than the highest z-index any markers

    },
    // @method initialize(): void
    initialize: function initialize(map, options) {
      // Save the type so super can fire, need to do this as cannot do this.TYPE :(
      this.type = L.Draw.CircleMarker.TYPE;
      this._initialLabelText = L.drawLocal.draw.handlers.circlemarker.tooltip.start;
      L.Draw.Feature.prototype.initialize.call(this, map, options);
    },
    _fireCreatedEvent: function _fireCreatedEvent() {
      var circleMarker = new L.CircleMarker(this._marker.getLatLng(), this.options);

      L.Draw.Feature.prototype._fireCreatedEvent.call(this, circleMarker);
    },
    _createMarker: function _createMarker(latlng) {
      return new L.CircleMarker(latlng, this.options);
    }
  });
  /**
   * @class L.Draw.Circle
   * @aka Draw.Circle
   * @inherits L.Draw.SimpleShape
   */

  L.Draw.Circle = L.Draw.SimpleShape.extend({
    statics: {
      TYPE: 'circle'
    },
    options: {
      shapeOptions: {
        stroke: true,
        color: '#3388ff',
        weight: 4,
        opacity: 0.5,
        fill: true,
        fillColor: null,
        //same as color by default
        fillOpacity: 0.2,
        clickable: true
      },
      showRadius: true,
      metric: true,
      // Whether to use the metric measurement system or imperial
      feet: true,
      // When not metric, use feet instead of yards for display
      nautic: false // When not metric, not feet use nautic mile for display

    },
    // @method initialize(): void
    initialize: function initialize(map, options) {
      // Save the type so super can fire, need to do this as cannot do this.TYPE :(
      this.type = L.Draw.Circle.TYPE;
      this._initialLabelText = L.drawLocal.draw.handlers.circle.tooltip.start;
      L.Draw.SimpleShape.prototype.initialize.call(this, map, options);
    },
    _drawShape: function _drawShape(latlng) {
      var distance = this._map.distance(this._startLatLng, latlng);

      if (!this._shape) {
        this._shape = new L.Circle(this._startLatLng, distance, this.options.shapeOptions);

        this._map.addLayer(this._shape);
      } else {
        this._shape.setRadius(distance);
      }
    },
    _fireCreatedEvent: function _fireCreatedEvent() {
      var circle = new L.Circle(this._startLatLng, this._shape.getRadius(), this.options.shapeOptions);

      L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, circle);
    },
    _onMouseMove: function _onMouseMove(e) {
      var latlng = e.latlng,
          showRadius = this.options.showRadius,
          useMetric = this.options.metric,
          radius;

      this._tooltip.updatePosition(latlng);

      if (this._isDrawing) {
        this._drawShape(latlng); // Get the new radius (rounded to 1 dp)


        radius = this._shape.getRadius().toFixed(1);
        var subtext = '';

        if (showRadius) {
          subtext = L.drawLocal.draw.handlers.circle.radius + ': ' + L.GeometryUtil.readableDistance(radius, useMetric, this.options.feet, this.options.nautic);
        }

        this._tooltip.updateContent({
          text: this._endLabelText,
          subtext: subtext
        });
      }
    }
  });
  L.Edit = L.Edit || {};
  /**
   * @class L.Edit.Marker
   * @aka Edit.Marker
   */

  L.Edit.Marker = L.Handler.extend({
    // @method initialize(): void
    initialize: function initialize(marker, options) {
      this._marker = marker;
      L.setOptions(this, options);
    },
    // @method addHooks(): void
    // Add listener hooks to this handler
    addHooks: function addHooks() {
      var marker = this._marker;
      marker.dragging.enable();
      marker.on('dragend', this._onDragEnd, marker);

      this._toggleMarkerHighlight();
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler
    removeHooks: function removeHooks() {
      var marker = this._marker;
      marker.dragging.disable();
      marker.off('dragend', this._onDragEnd, marker);

      this._toggleMarkerHighlight();
    },
    _onDragEnd: function _onDragEnd(e) {
      var layer = e.target;
      layer.edited = true;

      this._map.fire(L.Draw.Event.EDITMOVE, {
        layer: layer
      });
    },
    _toggleMarkerHighlight: function _toggleMarkerHighlight() {
      var icon = this._marker._icon; // Don't do anything if this layer is a marker but doesn't have an icon. Markers
      // should usually have icons. If using Leaflet.draw with Leaflet.markercluster there
      // is a chance that a marker doesn't.

      if (!icon) {
        return;
      } // This is quite naughty, but I don't see another way of doing it. (short of setting a new icon)


      icon.style.display = 'none';

      if (L.DomUtil.hasClass(icon, 'leaflet-edit-marker-selected')) {
        L.DomUtil.removeClass(icon, 'leaflet-edit-marker-selected'); // Offset as the border will make the icon move.

        this._offsetMarker(icon, -4);
      } else {
        L.DomUtil.addClass(icon, 'leaflet-edit-marker-selected'); // Offset as the border will make the icon move.

        this._offsetMarker(icon, 4);
      }

      icon.style.display = '';
    },
    _offsetMarker: function _offsetMarker(icon, offset) {
      var iconMarginTop = parseInt(icon.style.marginTop, 10) - offset,
          iconMarginLeft = parseInt(icon.style.marginLeft, 10) - offset;
      icon.style.marginTop = iconMarginTop + 'px';
      icon.style.marginLeft = iconMarginLeft + 'px';
    }
  });
  L.Marker.addInitHook(function () {
    if (L.Edit.Marker) {
      this.editing = new L.Edit.Marker(this);

      if (this.options.editable) {
        this.editing.enable();
      }
    }
  });
  L.Edit = L.Edit || {};
  /**
   * @class L.Edit.Polyline
   * @aka L.Edit.Poly
   * @aka Edit.Poly
   */

  L.Edit.Poly = L.Handler.extend({
    options: {},
    // @method initialize(): void
    initialize: function initialize(poly, options) {
      this.latlngs = [poly._latlngs];

      if (poly._holes) {
        this.latlngs = this.latlngs.concat(poly._holes);
      }

      this._poly = poly;
      L.setOptions(this, options);

      this._poly.on('revert-edited', this._updateLatLngs, this);
    },
    // Compatibility method to normalize Poly* objects
    // between 0.7.x and 1.0+
    _defaultShape: function _defaultShape() {
      if (!L.Polyline._flat) {
        return this._poly._latlngs;
      }

      return L.Polyline._flat(this._poly._latlngs) ? this._poly._latlngs : this._poly._latlngs[0];
    },
    _eachVertexHandler: function _eachVertexHandler(callback) {
      for (var i = 0; i < this._verticesHandlers.length; i++) {
        callback(this._verticesHandlers[i]);
      }
    },
    // @method addHooks(): void
    // Add listener hooks to this handler
    addHooks: function addHooks() {
      this._initHandlers();

      this._eachVertexHandler(function (handler) {
        handler.addHooks();
      });
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler
    removeHooks: function removeHooks() {
      this._eachVertexHandler(function (handler) {
        handler.removeHooks();
      });
    },
    // @method updateMarkers(): void
    // Fire an update for each vertex handler
    updateMarkers: function updateMarkers() {
      this._eachVertexHandler(function (handler) {
        handler.updateMarkers();
      });
    },
    _initHandlers: function _initHandlers() {
      this._verticesHandlers = [];

      for (var i = 0; i < this.latlngs.length; i++) {
        this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(this._poly, this.latlngs[i], this.options));
      }
    },
    _updateLatLngs: function _updateLatLngs(e) {
      this.latlngs = [e.layer._latlngs];

      if (e.layer._holes) {
        this.latlngs = this.latlngs.concat(e.layer._holes);
      }
    }
  });
  /**
   * @class L.Edit.PolyVerticesEdit
   * @aka Edit.PolyVerticesEdit
   */

  L.Edit.PolyVerticesEdit = L.Handler.extend({
    options: {
      allowIntersection: false,
      icon: new L.DivIcon({
        iconSize: new L.Point(8, 8),
        className: 'leaflet-div-icon leaflet-editing-icon'
      }),
      touchIcon: new L.DivIcon({
        iconSize: new L.Point(20, 20),
        className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
      }),
      drawError: {
        color: '#b00b00',
        timeout: 1000
      }
    },
    // @method intialize(): void
    initialize: function initialize(poly, latlngs, options) {
      // if touch, switch to touch icon
      if (L.Browser.touch) {
        this.options.icon = this.options.touchIcon;
      }

      this._poly = poly;

      if (options && options.drawError) {
        options.drawError = L.Util.extend({}, this.options.drawError, options.drawError);
      }

      this._latlngs = latlngs;
      L.setOptions(this, options);
    },
    // Compatibility method to normalize Poly* objects
    // between 0.7.x and 1.0+
    _defaultShape: function _defaultShape() {
      if (!L.Polyline._flat) {
        return this._latlngs;
      }

      return L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0];
    },
    // @method addHooks(): void
    // Add listener hooks to this handler.
    addHooks: function addHooks() {
      var poly = this._poly;

      if (!(poly instanceof L.Polygon)) {
        poly.options.fill = false;

        if (poly.options.editing) {
          poly.options.editing.fill = false;
        }
      }

      poly.setStyle(poly.options.editing);

      if (this._poly._map) {
        this._map = this._poly._map; // Set map

        if (!this._markerGroup) {
          this._initMarkers();
        }

        this._poly._map.addLayer(this._markerGroup);
      }
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler.
    removeHooks: function removeHooks() {
      var poly = this._poly;
      poly.setStyle(poly.options.original);

      if (poly._map) {
        poly._map.removeLayer(this._markerGroup);

        delete this._markerGroup;
        delete this._markers;
        poly.fire('editstop');
      }
    },
    // @method updateMarkers(): void
    // Clear markers and update their location
    updateMarkers: function updateMarkers() {
      this._markerGroup.clearLayers();

      this._initMarkers();
    },
    _initMarkers: function _initMarkers() {
      if (!this._markerGroup) {
        this._markerGroup = new L.LayerGroup();
      }

      this._markers = [];

      var latlngs = this._defaultShape(),
          i,
          j,
          len,
          marker;

      for (i = 0, len = latlngs.length; i < len; i++) {
        marker = this._createMarker(latlngs[i], i); // marker.on('click', this._onMarkerClick, this);

        this._markers.push(marker);
      }

      var markerLeft, markerRight;

      for (i = 0, j = len - 1; i < len; j = i++) {
        if (i === 0 && !(L.Polygon && this._poly instanceof L.Polygon)) {
          continue;
        }

        markerLeft = this._markers[j];
        markerRight = this._markers[i];

        this._createMiddleMarker(markerLeft, markerRight);

        this._updatePrevNext(markerLeft, markerRight);
      }
    },
    _createMarker: function _createMarker(latlng, index) {
      // Extending L.Marker in TouchEvents.js to include touch.
      var marker = new L.Marker.Touch(latlng, {
        draggable: true,
        icon: this.options.icon
      });
      marker._origLatLng = latlng;
      marker._index = index;
      marker.on('dragstart', this._onMarkerDragStart, this).on('drag', this._onMarkerDrag, this).on('dragend', this._fireEdit, this) // .on('dragend', this._onMarkerDragEnd, this)
      .on('touchmove', this._onTouchMove, this).on('touchend', this._fireEdit, this).on('MSPointerMove', this._onTouchMove, this).on('MSPointerUp', this._fireEdit, this);

      this._markerGroup.addLayer(marker);

      return marker;
    },
    _onMarkerDragStart: function _onMarkerDragStart() {
      this._poly.fire('editstart');
    },
    _spliceLatLngs: function _spliceLatLngs() {
      var latlngs = this._defaultShape();

      var removed = [].splice.apply(latlngs, arguments);

      this._poly._convertLatLngs(latlngs, true);

      this._poly.redraw();

      return removed;
    },
    _removeMarker: function _removeMarker(marker) {
      var i = marker._index;

      this._markerGroup.removeLayer(marker);

      this._markers.splice(i, 1);

      this._spliceLatLngs(i, 1);

      this._updateIndexes(i, -1);

      marker.off('dragstart', this._onMarkerDragStart, this).off('drag', this._onMarkerDrag, this).off('dragend', this._fireEdit, this).off('touchmove', this._onMarkerDrag, this).off('touchend', this._fireEdit, this) //  .off('click', this._onMarkerClick, this)
      .off('MSPointerMove', this._onTouchMove, this).off('MSPointerUp', this._fireEdit, this);
    },
    _fireEdit: function _fireEdit() {
      this._poly.edited = true;

      this._poly.fire('edit');

      this._poly._map.fire(L.Draw.Event.EDITVERTEX, {
        layers: this._markerGroup,
        poly: this._poly
      });
    },
    _onMarkerDrag: function _onMarkerDrag(e) {
      var marker = e.target;
      var poly = this._poly;
      L.extend(marker._origLatLng, marker._latlng);

      if (marker._middleLeft) {
        marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
      }

      if (marker._middleRight) {
        marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
      } // if (poly.options.poly) {
      //     var tooltip = poly._map._editTooltip; // Access the tooltip
      //
      //     // If we don't allow intersections and the polygon intersects
      //     if (!poly.options.poly.allowIntersection && poly.intersects()) {
      //
      //         var originalColor = poly.options.color;
      //         poly.setStyle({color: this.options.drawError.color});
      //
      //         // Manually trigger 'dragend' behavior on marker we are about to remove
      //         // WORKAROUND: introduced in 1.0.0-rc2, may be related to #4484
      //         if (L.version.indexOf('0.7') !== 0) {
      //             marker.dragging._draggable._onUp(e);
      //         }
      //         this._onMarkerClick(e); // Remove violating marker
      //         // FIXME: Reset the marker to it's original position (instead of remove)
      //
      //         if (tooltip) {
      //             tooltip.updateContent({
      //                 text: L.drawLocal.draw.handlers.polyline.error
      //             });
      //         }
      //
      //         // Reset everything back to normal after a second
      //         setTimeout(function () {
      //             poly.setStyle({color: originalColor});
      //             if (tooltip) {
      //                 tooltip.updateContent({
      //                     text: L.drawLocal.edit.handlers.edit.tooltip.text,
      //                     subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
      //                 });
      //             }
      //         }, 1000);
      //     }
      // }


      var tabLatLngs = [];

      for (var j in this._markers) {
        tabLatLngs.push(this._markers[j].getLatLng());
      }

      this._poly.setLatLngs(tabLatLngs);

      this._poly.editing.latlngs[0][0] = tabLatLngs;

      this._poly.redraw();

      this._poly.fire('editdrag');
    },
    _onMarkerClick: function _onMarkerClick(e) {
      var minPoints = L.Polygon && this._poly instanceof L.Polygon ? 4 : 3,
          marker = e.target; // If removing this point would create an invalid polyline/polygon don't remove

      if (this._defaultShape().length < minPoints) {
        return;
      } // remove the marker


      this._removeMarker(marker); // update prev/next links of adjacent markers


      this._updatePrevNext(marker._prev, marker._next); // remove ghost markers near the removed marker


      if (marker._middleLeft) {
        this._markerGroup.removeLayer(marker._middleLeft);
      }

      if (marker._middleRight) {
        this._markerGroup.removeLayer(marker._middleRight);
      } // create a ghost marker in place of the removed one


      if (marker._prev && marker._next) {
        this._createMiddleMarker(marker._prev, marker._next);
      } else if (!marker._prev) {
        marker._next._middleLeft = null;
      } else if (!marker._next) {
        marker._prev._middleRight = null;
      }

      this._fireEdit();
    },
    _onTouchMove: function _onTouchMove(e) {
      var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]),
          latlng = this._map.layerPointToLatLng(layerPoint),
          marker = e.target;

      L.extend(marker._origLatLng, latlng);

      if (marker._middleLeft) {
        marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
      }

      if (marker._middleRight) {
        marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
      }

      this._poly.redraw();

      this.updateMarkers();
    },
    _updateIndexes: function _updateIndexes(index, delta) {
      this._markerGroup.eachLayer(function (marker) {
        if (marker._index > index) {
          marker._index += delta;
        }
      });
    },
    _createMiddleMarker: function _createMiddleMarker(marker1, marker2) {
      var latlng = this._getMiddleLatLng(marker1, marker2),
          marker = this._createMarker(latlng),
          onClick,
          _onDragStart,
          _onDragEnd2;

      marker.setOpacity(0.6);
      marker1._middleRight = marker2._middleLeft = marker;

      _onDragStart = function onDragStart() {
        marker.off('touchmove', _onDragStart, this);
        var i = marker2._index;
        marker._index = i;
        marker.off('click', onClick, this).on('click', this._onMarkerClick, this);
        latlng.lat = marker.getLatLng().lat;
        latlng.lng = marker.getLatLng().lng;

        this._spliceLatLngs(i, 0, latlng);

        this._markers.splice(i, 0, marker);

        marker.setOpacity(1);

        this._updateIndexes(i, 1);

        marker2._index++;

        this._updatePrevNext(marker1, marker);

        this._updatePrevNext(marker, marker2);

        this._poly.fire('editstart');
      };

      _onDragEnd2 = function onDragEnd() {
        marker.off('dragstart', _onDragStart, this);
        marker.off('dragend', _onDragEnd2, this);
        marker.off('touchmove', _onDragStart, this);

        if (!this.intersect) {
          this._createMiddleMarker(marker1, marker);

          this._createMiddleMarker(marker, marker2);
        } else {
          marker2._index--;
          var i = marker2._index;

          this._spliceLatLngs(i, 1);

          this._updateIndexes(i, -1);

          this._updatePrevNext(marker1, marker2);

          marker.setOpacity(0.6);

          this._poly.redraw();

          this.updateMarkers();
        }
      };

      onClick = function onClick() {
        _onDragStart.call(this);

        _onDragEnd2.call(this);

        this._fireEdit();
      };

      marker //.on('click', onClick, this)
      .on('dragstart', _onDragStart, this).on('dragend', _onDragEnd2, this).on('touchmove', _onDragStart, this);

      this._markerGroup.addLayer(marker);
    },
    _updatePrevNext: function _updatePrevNext(marker1, marker2) {
      if (marker1) {
        marker1._next = marker2;
      }

      if (marker2) {
        marker2._prev = marker1;
      }
    },
    _getMiddleLatLng: function _getMiddleLatLng(marker1, marker2) {
      var map = this._poly._map,
          p1 = map.project(marker1.getLatLng()),
          p2 = map.project(marker2.getLatLng());
      return map.unproject(p1._add(p2)._divideBy(2));
    }
  });
  L.Polyline.addInitHook(function () {
    // Check to see if handler has already been initialized. This is to support versions of Leaflet that still have L.Handler.PolyEdit
    if (this.editing) {
      return;
    }

    if (L.Edit.Poly) {
      this.editing = new L.Edit.Poly(this, this.options.poly);

      if (this.options.editable) {
        this.editing.enable();
      }
    }

    this.on('add', function () {
      if (this.editing && this.editing.enabled()) {
        this.editing.addHooks();
      }
    });
    this.on('remove', function () {
      if (this.editing && this.editing.enabled()) {
        this.editing.removeHooks();
      }
    });
  });
  L.Edit = L.Edit || {};
  /**
   * @class L.Edit.SimpleShape
   * @aka Edit.SimpleShape
   */

  L.Edit.SimpleShape = L.Handler.extend({
    options: {
      moveIcon: new L.DivIcon({
        iconSize: new L.Point(8, 8),
        className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move'
      }),
      resizeIcon: new L.DivIcon({
        iconSize: new L.Point(8, 8),
        className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize'
      }),
      touchMoveIcon: new L.DivIcon({
        iconSize: new L.Point(20, 20),
        className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon'
      }),
      touchResizeIcon: new L.DivIcon({
        iconSize: new L.Point(20, 20),
        className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon'
      })
    },
    // @method intialize(): void
    initialize: function initialize(shape, options) {
      // if touch, switch to touch icon
      if (L.Browser.touch) {
        this.options.moveIcon = this.options.touchMoveIcon;
        this.options.resizeIcon = this.options.touchResizeIcon;
      }

      this._shape = shape;
      L.Util.setOptions(this, options);
    },
    // @method addHooks(): void
    // Add listener hooks to this handler
    addHooks: function addHooks() {
      var shape = this._shape;

      if (this._shape._map) {
        this._map = this._shape._map;
        shape.setStyle(shape.options.editing);

        if (shape._map) {
          this._map = shape._map;

          if (!this._markerGroup) {
            this._initMarkers();
          }

          this._map.addLayer(this._markerGroup);
        }
      }
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler
    removeHooks: function removeHooks() {
      var shape = this._shape;
      shape.setStyle(shape.options.original);

      if (shape._map) {
        this._unbindMarker(this._moveMarker);

        for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
          this._unbindMarker(this._resizeMarkers[i]);
        }

        this._resizeMarkers = null;

        this._map.removeLayer(this._markerGroup);

        delete this._markerGroup;
      }

      this._map = null;
    },
    // @method updateMarkers(): void
    // Remove the edit markers from this layer
    updateMarkers: function updateMarkers() {
      this._markerGroup.clearLayers();

      this._initMarkers();
    },
    _initMarkers: function _initMarkers() {
      if (!this._markerGroup) {
        this._markerGroup = new L.LayerGroup();
      } // Create center marker


      this._createMoveMarker(); // Create edge marker


      this._createResizeMarker();
    },
    _createMoveMarker: function _createMoveMarker() {// Children override
    },
    _createResizeMarker: function _createResizeMarker() {// Children override
    },
    _createMarker: function _createMarker(latlng, icon) {
      // Extending L.Marker in TouchEvents.js to include touch.
      var marker = new L.Marker.Touch(latlng, {
        draggable: true,
        icon: icon,
        zIndexOffset: 10
      });

      this._bindMarker(marker);

      this._markerGroup.addLayer(marker);

      return marker;
    },
    _bindMarker: function _bindMarker(marker) {
      marker.on('dragstart', this._onMarkerDragStart, this).on('drag', this._onMarkerDrag, this).on('dragend', this._onMarkerDragEnd, this).on('touchstart', this._onTouchStart, this).on('touchmove', this._onTouchMove, this).on('MSPointerMove', this._onTouchMove, this).on('touchend', this._onTouchEnd, this).on('MSPointerUp', this._onTouchEnd, this);
    },
    _unbindMarker: function _unbindMarker(marker) {
      marker.off('dragstart', this._onMarkerDragStart, this).off('drag', this._onMarkerDrag, this).off('dragend', this._onMarkerDragEnd, this).off('touchstart', this._onTouchStart, this).off('touchmove', this._onTouchMove, this).off('MSPointerMove', this._onTouchMove, this).off('touchend', this._onTouchEnd, this).off('MSPointerUp', this._onTouchEnd, this);
    },
    _onMarkerDragStart: function _onMarkerDragStart(e) {
      var marker = e.target;
      marker.setOpacity(0);

      this._shape.fire('editstart');
    },
    _fireEdit: function _fireEdit() {
      this._shape.edited = true;

      this._shape.fire('edit');
    },
    _onMarkerDrag: function _onMarkerDrag(e) {
      var marker = e.target,
          latlng = marker.getLatLng();

      if (marker === this._moveMarker) {
        this._move(latlng);
      } else {
        this._resize(latlng);
      }

      this._shape.redraw();

      this._shape.fire('editdrag');
    },
    _onMarkerDragEnd: function _onMarkerDragEnd(e) {
      var marker = e.target;
      marker.setOpacity(1);

      this._fireEdit();
    },
    _onTouchStart: function _onTouchStart(e) {
      L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e);

      if (typeof this._getCorners === 'function') {
        // Save a reference to the opposite point
        var corners = this._getCorners(),
            marker = e.target,
            currentCornerIndex = marker._cornerIndex;

        marker.setOpacity(0); // Copyed from Edit.Rectangle.js line 23 _onMarkerDragStart()
        // Latlng is null otherwise.

        this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];

        this._toggleCornerMarkers(0, currentCornerIndex);
      }

      this._shape.fire('editstart');
    },
    _onTouchMove: function _onTouchMove(e) {
      var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]),
          latlng = this._map.layerPointToLatLng(layerPoint),
          marker = e.target;

      if (marker === this._moveMarker) {
        this._move(latlng);
      } else {
        this._resize(latlng);
      }

      this._shape.redraw(); // prevent touchcancel in IOS
      // e.preventDefault();


      return false;
    },
    _onTouchEnd: function _onTouchEnd(e) {
      var marker = e.target;
      marker.setOpacity(1);
      this.updateMarkers();

      this._fireEdit();
    },
    _move: function _move() {// Children override
    },
    _resize: function _resize() {// Children override
    }
  });
  L.Edit = L.Edit || {};
  /**
   * @class L.Edit.Rectangle
   * @aka Edit.Rectangle
   * @inherits L.Edit.SimpleShape
   */

  L.Edit.Rectangle = L.Edit.SimpleShape.extend({
    _createMoveMarker: function _createMoveMarker() {
      var bounds = this._shape.getBounds(),
          center = bounds.getCenter();

      this._moveMarker = this._createMarker(center, this.options.moveIcon);
    },
    _createResizeMarker: function _createResizeMarker() {
      var corners = this._getCorners();

      this._resizeMarkers = [];

      for (var i = 0, l = corners.length; i < l; i++) {
        this._resizeMarkers.push(this._createMarker(corners[i], this.options.resizeIcon)); // Monkey in the corner index as we will need to know this for dragging


        this._resizeMarkers[i]._cornerIndex = i;
      }
    },
    _onMarkerDragStart: function _onMarkerDragStart(e) {
      L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e); // Save a reference to the opposite point


      var corners = this._getCorners(),
          marker = e.target,
          currentCornerIndex = marker._cornerIndex;

      this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];

      this._toggleCornerMarkers(0, currentCornerIndex);
    },
    _onMarkerDragEnd: function _onMarkerDragEnd(e) {
      var marker = e.target,
          bounds,
          center; // Reset move marker position to the center

      if (marker === this._moveMarker) {
        bounds = this._shape.getBounds();
        center = bounds.getCenter();
        marker.setLatLng(center);
      }

      this._toggleCornerMarkers(1);

      this._repositionCornerMarkers();

      L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this, e);
    },
    _move: function _move(newCenter) {
      var latlngs = this._shape._defaultShape ? this._shape._defaultShape() : this._shape.getLatLngs(),
          bounds = this._shape.getBounds(),
          center = bounds.getCenter(),
          offset,
          newLatLngs = []; // Offset the latlngs to the new center


      for (var i = 0, l = latlngs.length; i < l; i++) {
        offset = [latlngs[i].lat - center.lat, latlngs[i].lng - center.lng];
        newLatLngs.push([newCenter.lat + offset[0], newCenter.lng + offset[1]]);
      }

      this._shape.setLatLngs(newLatLngs); // Reposition the resize markers


      this._repositionCornerMarkers();

      this._map.fire(L.Draw.Event.EDITMOVE, {
        layer: this._shape
      });
    },
    _resize: function _resize(latlng) {
      var bounds; // Update the shape based on the current position of this corner and the opposite point

      this._shape.setBounds(L.latLngBounds(latlng, this._oppositeCorner)); // Reposition the move marker


      bounds = this._shape.getBounds();

      this._moveMarker.setLatLng(bounds.getCenter());

      this._map.fire(L.Draw.Event.EDITRESIZE, {
        layer: this._shape
      });
    },
    _getCorners: function _getCorners() {
      var bounds = this._shape.getBounds(),
          nw = bounds.getNorthWest(),
          ne = bounds.getNorthEast(),
          se = bounds.getSouthEast(),
          sw = bounds.getSouthWest();

      return [nw, ne, se, sw];
    },
    _toggleCornerMarkers: function _toggleCornerMarkers(opacity) {
      for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
        this._resizeMarkers[i].setOpacity(opacity);
      }
    },
    _repositionCornerMarkers: function _repositionCornerMarkers() {
      var corners = this._getCorners();

      for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
        this._resizeMarkers[i].setLatLng(corners[i]);
      }
    }
  });
  L.Rectangle.addInitHook(function () {
    if (L.Edit.Rectangle) {
      this.editing = new L.Edit.Rectangle(this);

      if (this.options.editable) {
        this.editing.enable();
      }
    }
  });
  L.Edit = L.Edit || {};
  /**
   * @class L.Edit.CircleMarker
   * @aka Edit.Circle
   * @inherits L.Edit.SimpleShape
   */

  L.Edit.CircleMarker = L.Edit.SimpleShape.extend({
    _createMoveMarker: function _createMoveMarker() {
      var center = this._shape.getLatLng();

      this._moveMarker = this._createMarker(center, this.options.moveIcon);
    },
    _createResizeMarker: function _createResizeMarker() {
      // To avoid an undefined check in L.Edit.SimpleShape.removeHooks
      this._resizeMarkers = [];
    },
    _move: function _move(latlng) {
      if (this._resizeMarkers.length) {
        var resizemarkerPoint = this._getResizeMarkerPoint(latlng); // Move the resize marker


        this._resizeMarkers[0].setLatLng(resizemarkerPoint);
      } // Move the circle


      this._shape.setLatLng(latlng);

      this._map.fire(L.Draw.Event.EDITMOVE, {
        layer: this._shape
      });
    }
  });
  L.CircleMarker.addInitHook(function () {
    if (L.Edit.CircleMarker) {
      this.editing = new L.Edit.CircleMarker(this);

      if (this.options.editable) {
        this.editing.enable();
      }
    }

    this.on('add', function () {
      if (this.editing && this.editing.enabled()) {
        this.editing.addHooks();
      }
    });
    this.on('remove', function () {
      if (this.editing && this.editing.enabled()) {
        this.editing.removeHooks();
      }
    });
  });
  L.Edit = L.Edit || {};
  /**
   * @class L.Edit.Circle
   * @aka Edit.Circle
   * @inherits L.Edit.CircleMarker
   */

  L.Edit.Circle = L.Edit.CircleMarker.extend({
    _createResizeMarker: function _createResizeMarker() {
      var center = this._shape.getLatLng(),
          resizemarkerPoint = this._getResizeMarkerPoint(center);

      this._resizeMarkers = [];

      this._resizeMarkers.push(this._createMarker(resizemarkerPoint, this.options.resizeIcon));
    },
    _getResizeMarkerPoint: function _getResizeMarkerPoint(latlng) {
      // From L.shape.getBounds()
      var delta = this._shape._radius * Math.cos(Math.PI / 4),
          point = this._map.project(latlng);

      return this._map.unproject([point.x + delta, point.y - delta]);
    },
    _resize: function _resize(latlng) {
      var moveLatLng = this._moveMarker.getLatLng(),
          radius = this._map.distance(moveLatLng, latlng);

      this._shape.setRadius(radius);

      this._map.fire(L.Draw.Event.EDITRESIZE, {
        layer: this._shape
      });
    }
  });
  L.Circle.addInitHook(function () {
    if (L.Edit.Circle) {
      this.editing = new L.Edit.Circle(this);

      if (this.options.editable) {
        this.editing.enable();
      }
    }

    this.on('add', function () {
      if (this.editing && this.editing.enabled()) {
        this.editing.addHooks();
      }
    });
    this.on('remove', function () {
      if (this.editing && this.editing.enabled()) {
        this.editing.removeHooks();
      }
    });
  });
  L.Map.mergeOptions({
    touchExtend: true
  });
  /**
   * @class L.Map.TouchExtend
   * @aka TouchExtend
   */

  L.Map.TouchExtend = L.Handler.extend({
    // @method initialize(): void
    // Sets TouchExtend private accessor variables
    initialize: function initialize(map) {
      this._map = map;
      this._container = map._container;
      this._pane = map._panes.overlayPane;
    },
    // @method addHooks(): void
    // Adds dom listener events to the map container
    addHooks: function addHooks() {
      L.DomEvent.on(this._container, 'touchstart', this._onTouchStart, this);
      L.DomEvent.on(this._container, 'touchend', this._onTouchEnd, this);
      L.DomEvent.on(this._container, 'touchmove', this._onTouchMove, this);

      if (this._detectIE()) {
        L.DomEvent.on(this._container, 'MSPointerDown', this._onTouchStart, this);
        L.DomEvent.on(this._container, 'MSPointerUp', this._onTouchEnd, this);
        L.DomEvent.on(this._container, 'MSPointerMove', this._onTouchMove, this);
        L.DomEvent.on(this._container, 'MSPointerCancel', this._onTouchCancel, this);
      } else {
        L.DomEvent.on(this._container, 'touchcancel', this._onTouchCancel, this);
        L.DomEvent.on(this._container, 'touchleave', this._onTouchLeave, this);
      }
    },
    // @method removeHooks(): void
    // Removes dom listener events from the map container
    removeHooks: function removeHooks() {
      L.DomEvent.off(this._container, 'touchstart', this._onTouchStart);
      L.DomEvent.off(this._container, 'touchend', this._onTouchEnd);
      L.DomEvent.off(this._container, 'touchmove', this._onTouchMove);

      if (this._detectIE()) {
        L.DomEvent.off(this._container, 'MSPointerDowm', this._onTouchStart);
        L.DomEvent.off(this._container, 'MSPointerUp', this._onTouchEnd);
        L.DomEvent.off(this._container, 'MSPointerMove', this._onTouchMove);
        L.DomEvent.off(this._container, 'MSPointerCancel', this._onTouchCancel);
      } else {
        L.DomEvent.off(this._container, 'touchcancel', this._onTouchCancel);
        L.DomEvent.off(this._container, 'touchleave', this._onTouchLeave);
      }
    },
    _touchEvent: function _touchEvent(e, type) {
      // #TODO: fix the pageX error that is do a bug in Android where a single touch triggers two click events
      // _filterClick is what leaflet uses as a workaround.
      // This is a problem with more things than just android. Another problem is touchEnd has no touches in
      // its touch list.
      var touchEvent = {};

      if (typeof e.touches !== 'undefined') {
        if (!e.touches.length) {
          return;
        }

        touchEvent = e.touches[0];
      } else if (e.pointerType === 'touch') {
        touchEvent = e;

        if (!this._filterClick(e)) {
          return;
        }
      } else {
        return;
      }

      var containerPoint = this._map.mouseEventToContainerPoint(touchEvent),
          layerPoint = this._map.mouseEventToLayerPoint(touchEvent),
          latlng = this._map.layerPointToLatLng(layerPoint);

      this._map.fire(type, {
        latlng: latlng,
        layerPoint: layerPoint,
        containerPoint: containerPoint,
        pageX: touchEvent.pageX,
        pageY: touchEvent.pageY,
        originalEvent: e
      });
    },

    /** Borrowed from Leaflet and modified for bool ops **/
    _filterClick: function _filterClick(e) {
      var timeStamp = e.timeStamp || e.originalEvent.timeStamp,
          elapsed = L.DomEvent._lastClick && timeStamp - L.DomEvent._lastClick; // are they closer together than 500ms yet more than 100ms?
      // Android typically triggers them ~300ms apart while multiple listeners
      // on the same event should be triggered far faster;
      // or check if click is simulated on the element, and if it is, reject any non-simulated events

      if (elapsed && elapsed > 100 && elapsed < 500 || e.target._simulatedClick && !e._simulated) {
        L.DomEvent.stop(e);
        return false;
      }

      L.DomEvent._lastClick = timeStamp;
      return true;
    },
    _onTouchStart: function _onTouchStart(e) {
      if (!this._map._loaded) {
        return;
      }

      var type = 'touchstart';

      this._touchEvent(e, type);
    },
    _onTouchEnd: function _onTouchEnd(e) {
      if (!this._map._loaded) {
        return;
      }

      var type = 'touchend';

      this._touchEvent(e, type);
    },
    _onTouchCancel: function _onTouchCancel(e) {
      if (!this._map._loaded) {
        return;
      }

      var type = 'touchcancel';

      if (this._detectIE()) {
        type = 'pointercancel';
      }

      this._touchEvent(e, type);
    },
    _onTouchLeave: function _onTouchLeave(e) {
      if (!this._map._loaded) {
        return;
      }

      var type = 'touchleave';

      this._touchEvent(e, type);
    },
    _onTouchMove: function _onTouchMove(e) {
      if (!this._map._loaded) {
        return;
      }

      var type = 'touchmove';

      this._touchEvent(e, type);
    },
    _detectIE: function _detectIE() {
      var ua = window.navigator.userAgent;
      var msie = ua.indexOf('MSIE ');

      if (msie > 0) {
        // IE 10 or older => return version number
        return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
      }

      var trident = ua.indexOf('Trident/');

      if (trident > 0) {
        // IE 11 => return version number
        var rv = ua.indexOf('rv:');
        return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
      }

      var edge = ua.indexOf('Edge/');

      if (edge > 0) {
        // IE 12 => return version number
        return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
      } // other browser


      return false;
    }
  });
  L.Map.addInitHook('addHandler', 'touchExtend', L.Map.TouchExtend);
  /**
   * @class L.Marker.Touch
   * @aka Marker.Touch
   *
   * This isn't full Touch support. This is just to get markers to also support dom touch events after creation
   * #TODO: find a better way of getting markers to support touch.
   */

  L.Marker.Touch = L.Marker.extend({
    _initInteraction: function _initInteraction() {
      if (!this.addInteractiveTarget) {
        // 0.7.x support
        return this._initInteractionLegacy();
      } // TODO this may need be updated to re-add touch events for 1.0+


      return L.Marker.prototype._initInteraction.apply(this);
    },
    // This is an exact copy of https://github.com/Leaflet/Leaflet/blob/v0.7/src/layer/marker/Marker.js
    // with the addition of the touch events
    _initInteractionLegacy: function _initInteractionLegacy() {
      if (!this.options.clickable) {
        return;
      } // TODO refactor into something shared with Map/Path/etc. to DRY it up


      var icon = this._icon,
          events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu', 'touchstart', 'touchend', 'touchmove'];

      if (this._detectIE) {
        events.concat(['MSPointerDown', 'MSPointerUp', 'MSPointerMove', 'MSPointerCancel']);
      } else {
        events.concat(['touchcancel']);
      }

      L.DomUtil.addClass(icon, 'leaflet-clickable');
      L.DomEvent.on(icon, 'click', this._onMouseClick, this);
      L.DomEvent.on(icon, 'keypress', this._onKeyPress, this);

      for (var i = 0; i < events.length; i++) {
        L.DomEvent.on(icon, events[i], this._fireMouseEvent, this);
      }

      if (L.Handler.MarkerDrag) {
        this.dragging = new L.Handler.MarkerDrag(this);

        if (this.options.draggable) {
          this.dragging.enable();
        }
      }
    },
    _detectIE: function _detectIE() {
      var ua = window.navigator.userAgent;
      var msie = ua.indexOf('MSIE ');

      if (msie > 0) {
        // IE 10 or older => return version number
        return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
      }

      var trident = ua.indexOf('Trident/');

      if (trident > 0) {
        // IE 11 => return version number
        var rv = ua.indexOf('rv:');
        return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
      }

      var edge = ua.indexOf('Edge/');

      if (edge > 0) {
        // IE 12 => return version number
        return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
      } // other browser


      return false;
    }
  });
  /**
   * @class L.LatLngUtil
   * @aka LatLngUtil
   */

  L.LatLngUtil = {
    // Clones a LatLngs[], returns [][]
    // @method cloneLatLngs(LatLngs[]): L.LatLngs[]
    // Clone the latLng point or points or nested points and return an array with those points
    cloneLatLngs: function cloneLatLngs(latlngs) {
      var clone = [];

      for (var i = 0, l = latlngs.length; i < l; i++) {
        // Check for nested array (Polyline/Polygon)
        if (Array.isArray(latlngs[i])) {
          clone.push(L.LatLngUtil.cloneLatLngs(latlngs[i]));
        } else {
          clone.push(this.cloneLatLng(latlngs[i]));
        }
      }

      return clone;
    },
    // @method cloneLatLng(LatLng): L.LatLng
    // Clone the latLng and return a new LatLng object.
    cloneLatLng: function cloneLatLng(latlng) {
      return L.latLng(latlng.lat, latlng.lng);
    }
  };

  (function () {
    var defaultPrecision = {
      km: 2,
      ha: 2,
      m: 0,
      mi: 2,
      ac: 2,
      yd: 0,
      ft: 0,
      nm: 2
    };
    /**
     * @class L.GeometryUtil
     * @aka GeometryUtil
     */

    L.GeometryUtil = L.extend(L.GeometryUtil || {}, {
      // Ported from the OpenLayers implementation. See https://github.com/openlayers/openlayers/blob/master/lib/OpenLayers/Geometry/LinearRing.js#L270
      // @method geodesicArea(): number
      geodesicArea: function geodesicArea(latLngs) {
        var pointsCount = latLngs.length,
            area = 0.0,
            d2r = Math.PI / 180,
            p1,
            p2;

        if (pointsCount > 2) {
          for (var i = 0; i < pointsCount; i++) {
            p1 = latLngs[i];
            p2 = latLngs[(i + 1) % pointsCount];
            area += (p2.lng - p1.lng) * d2r * (2 + Math.sin(p1.lat * d2r) + Math.sin(p2.lat * d2r));
          }

          area = area * 6378137.0 * 6378137.0 / 2.0;
        }

        return Math.abs(area);
      },
      // @method formattedNumber(n, precision): string
      // Returns n in specified number format (if defined) and precision
      formattedNumber: function formattedNumber(n, precision) {
        var formatted = parseFloat(n).toFixed(precision),
            format = L.drawLocal.format && L.drawLocal.format.numeric,
            delimiters = format && format.delimiters,
            thousands = delimiters && delimiters.thousands,
            decimal = delimiters && delimiters.decimal;

        if (thousands || decimal) {
          var splitValue = formatted.split('.');
          formatted = thousands ? splitValue[0].replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '\$1' + thousands) : splitValue[0];
          decimal = decimal || '.';

          if (splitValue.length > 1) {
            formatted = formatted + decimal + splitValue[1];
          }
        }

        return formatted;
      },
      // @method readableArea(area, isMetric, precision): string
      // Returns a readable area string in yards or metric.
      // The value will be rounded as defined by the precision option object.
      readableArea: function readableArea(area, isMetric, precision) {
        var areaStr,
            units,
            precision = L.Util.extend({}, defaultPrecision, precision);

        if (isMetric) {
          units = ['ha', 'm'];
          type = _typeof(isMetric);

          if (type === 'string') {
            units = [isMetric];
          } else if (type !== 'boolean') {
            units = isMetric;
          }

          if (area >= 1000000 && units.indexOf('km') !== -1) {
            areaStr = L.GeometryUtil.formattedNumber(area * 0.000001, precision['km']) + ' km²';
          } else if (area >= 10000 && units.indexOf('ha') !== -1) {
            areaStr = L.GeometryUtil.formattedNumber(area * 0.0001, precision['ha']) + ' ha';
          } else {
            areaStr = L.GeometryUtil.formattedNumber(area, precision['m']) + ' m²';
          }
        } else {
          area /= 0.836127; // Square yards in 1 meter

          if (area >= 3097600) {
            //3097600 square yards in 1 square mile
            areaStr = L.GeometryUtil.formattedNumber(area / 3097600, precision['mi']) + ' mi²';
          } else if (area >= 4840) {
            //4840 square yards in 1 acre
            areaStr = L.GeometryUtil.formattedNumber(area / 4840, precision['ac']) + ' acres';
          } else {
            areaStr = L.GeometryUtil.formattedNumber(area, precision['yd']) + ' yd²';
          }
        }

        return areaStr;
      },
      // @method readableDistance(distance, units): string
      // Converts a metric distance to one of [ feet, nauticalMile, metric or yards ] string
      //
      // @alternative
      // @method readableDistance(distance, isMetric, useFeet, isNauticalMile, precision): string
      // Converts metric distance to distance string.
      // The value will be rounded as defined by the precision option object.
      readableDistance: function readableDistance(distance, isMetric, isFeet, isNauticalMile, precision) {
        var distanceStr,
            units,
            precision = L.Util.extend({}, defaultPrecision, precision);

        if (isMetric) {
          units = typeof isMetric == 'string' ? isMetric : 'metric';
        } else if (isFeet) {
          units = 'feet';
        } else if (isNauticalMile) {
          units = 'nauticalMile';
        } else {
          units = 'yards';
        }

        switch (units) {
          case 'metric':
            // show metres when distance is < 1km, then show km
            if (distance > 1000) {
              distanceStr = L.GeometryUtil.formattedNumber(distance / 1000, precision['km']) + ' km';
            } else {
              distanceStr = L.GeometryUtil.formattedNumber(distance, precision['m']) + ' m';
            }

            break;

          case 'feet':
            distance *= 1.09361 * 3;
            distanceStr = L.GeometryUtil.formattedNumber(distance, precision['ft']) + ' ft';
            break;

          case 'nauticalMile':
            distance *= 0.53996;
            distanceStr = L.GeometryUtil.formattedNumber(distance / 1000, precision['nm']) + ' nm';
            break;

          case 'yards':
          default:
            distance *= 1.09361;

            if (distance > 1760) {
              distanceStr = L.GeometryUtil.formattedNumber(distance / 1760, precision['mi']) + ' miles';
            } else {
              distanceStr = L.GeometryUtil.formattedNumber(distance, precision['yd']) + ' yd';
            }

            break;
        }

        return distanceStr;
      }
    });
  })();
  /**
   * @class L.LineUtil
   * @aka Util
   * @aka L.Utils
   */


  L.Util.extend(L.LineUtil, {
    // @method segmentsIntersect(): boolean
    // Checks to see if two line segments intersect. Does not handle degenerate cases.
    // http://compgeom.cs.uiuc.edu/~jeffe/teaching/373/notes/x06-sweepline.pdf
    segmentsIntersect: function segmentsIntersect(
    /*Point*/
    p,
    /*Point*/
    p1,
    /*Point*/
    p2,
    /*Point*/
    p3) {
      return this._checkCounterclockwise(p, p2, p3) !== this._checkCounterclockwise(p1, p2, p3) && this._checkCounterclockwise(p, p1, p2) !== this._checkCounterclockwise(p, p1, p3);
    },
    // check to see if points are in counterclockwise order
    _checkCounterclockwise: function _checkCounterclockwise(
    /*Point*/
    p,
    /*Point*/
    p1,
    /*Point*/
    p2) {
      return (p2.y - p.y) * (p1.x - p.x) > (p1.y - p.y) * (p2.x - p.x);
    }
  });
  /**
   * @class L.Polyline
   * @aka Polyline
   */

  L.Polyline.include({
    // @method intersects(): boolean
    // Check to see if this polyline has any linesegments that intersect.
    // NOTE: does not support detecting intersection for degenerate cases.
    intersects: function intersects() {
      var points = this._getProjectedPoints(),
          len = points ? points.length : 0,
          i,
          p,
          p1;

      if (this._tooFewPointsForIntersection()) {
        return false;
      }

      for (i = len - 1; i >= 3; i--) {
        p = points[i - 1];
        p1 = points[i];

        if (this._lineSegmentsIntersectsRange(p, p1, i - 2)) {
          return true;
        }
      }

      return false;
    },
    // @method newLatLngIntersects(): boolean
    // Check for intersection if new latlng was added to this polyline.
    // NOTE: does not support detecting intersection for degenerate cases.
    newLatLngIntersects: function newLatLngIntersects(latlng, skipFirst) {
      // Cannot check a polyline for intersecting lats/lngs when not added to the map
      if (!this._map) {
        return false;
      }

      return this.newPointIntersects(this._map.latLngToLayerPoint(latlng), skipFirst);
    },
    // @method newPointIntersects(): boolean
    // Check for intersection if new point was added to this polyline.
    // newPoint must be a layer point.
    // NOTE: does not support detecting intersection for degenerate cases.
    newPointIntersects: function newPointIntersects(newPoint, skipFirst) {
      var points = this._getProjectedPoints(),
          len = points ? points.length : 0,
          lastPoint = points ? points[len - 1] : null,
          // The previous previous line segment. Previous line segment doesn't need testing.
      maxIndex = len - 2;

      if (this._tooFewPointsForIntersection(1)) {
        return false;
      }

      return this._lineSegmentsIntersectsRange(lastPoint, newPoint, maxIndex, skipFirst ? 1 : 0);
    },
    // Polylines with 2 sides can only intersect in cases where points are collinear (we don't support detecting these).
    // Cannot have intersection when < 3 line segments (< 4 points)
    _tooFewPointsForIntersection: function _tooFewPointsForIntersection(extraPoints) {
      var points = this._getProjectedPoints(),
          len = points ? points.length : 0; // Increment length by extraPoints if present


      len += extraPoints || 0;
      return !points || len <= 3;
    },
    // Checks a line segment intersections with any line segments before its predecessor.
    // Don't need to check the predecessor as will never intersect.
    _lineSegmentsIntersectsRange: function _lineSegmentsIntersectsRange(p, p1, maxIndex, minIndex) {
      var points = this._getProjectedPoints(),
          p2,
          p3;

      minIndex = minIndex || 0; // Check all previous line segments (beside the immediately previous) for intersections

      for (var j = maxIndex; j > minIndex; j--) {
        p2 = points[j - 1];
        p3 = points[j];

        if (L.LineUtil.segmentsIntersect(p, p1, p2, p3)) {
          return true;
        }
      }

      return false;
    },
    _getProjectedPoints: function _getProjectedPoints() {
      if (!this._defaultShape) {
        return this._originalPoints;
      }

      var points = [],
          _shape = this._defaultShape();

      for (var i = 0; i < _shape.length; i++) {
        points.push(this._map.latLngToLayerPoint(_shape[i]));
      }

      return points;
    }
  });
  /**
   * @class L.Polygon
   * @aka Polygon
   */

  L.Polygon.include({
    // @method intersects(): boolean
    // Checks a polygon for any intersecting line segments. Ignores holes.
    intersects: function intersects() {
      var polylineIntersects,
          points = this._getProjectedPoints(),
          len,
          firstPoint,
          lastPoint,
          maxIndex;

      if (this._tooFewPointsForIntersection()) {
        return false;
      }

      polylineIntersects = L.Polyline.prototype.intersects.call(this); // If already found an intersection don't need to check for any more.

      if (polylineIntersects) {
        return true;
      }

      len = points.length;
      firstPoint = points[0];
      lastPoint = points[len - 1];
      maxIndex = len - 2; // Check the line segment between last and first point. Don't need to check the first line segment (minIndex = 1)

      return this._lineSegmentsIntersectsRange(lastPoint, firstPoint, maxIndex, 1);
    }
  });
  /**
   * @class L.Control.Draw
   * @aka L.Draw
   */

  L.Control.Draw = L.Control.extend({
    // Options
    options: {
      position: 'topleft',
      draw: {},
      edit: false
    },
    // @method initialize(): void
    // Initializes draw control, toolbars from the options
    initialize: function initialize(options) {
      if (L.version < '0.7') {
        throw new Error('Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/');
      }

      L.Control.prototype.initialize.call(this, options);
      var toolbar;
      this._toolbars = {}; // Initialize toolbars

      if (L.DrawToolbar && this.options.draw) {
        toolbar = new L.DrawToolbar(this.options.draw);
        this._toolbars[L.DrawToolbar.TYPE] = toolbar; // Listen for when toolbar is enabled

        this._toolbars[L.DrawToolbar.TYPE].on('enable', this._toolbarEnabled, this);
      }

      if (L.EditToolbar && this.options.edit) {
        toolbar = new L.EditToolbar(this.options.edit);
        this._toolbars[L.EditToolbar.TYPE] = toolbar; // Listen for when toolbar is enabled

        this._toolbars[L.EditToolbar.TYPE].on('enable', this._toolbarEnabled, this);
      }

      L.toolbar = this; //set global var for editing the toolbar
    },
    // @method onAdd(): container
    // Adds the toolbar container to the map
    onAdd: function onAdd(map) {
      var container = L.DomUtil.create('div', 'leaflet-draw'),
          addedTopClass = false,
          topClassName = 'leaflet-draw-toolbar-top',
          toolbarContainer;

      for (var toolbarId in this._toolbars) {
        if (this._toolbars.hasOwnProperty(toolbarId)) {
          toolbarContainer = this._toolbars[toolbarId].addToolbar(map);

          if (toolbarContainer) {
            // Add class to the first toolbar to remove the margin
            if (!addedTopClass) {
              if (!L.DomUtil.hasClass(toolbarContainer, topClassName)) {
                L.DomUtil.addClass(toolbarContainer.childNodes[0], topClassName);
              }

              addedTopClass = true;
            }

            container.appendChild(toolbarContainer);
          }
        }
      }

      return container;
    },
    // @method onRemove(): void
    // Removes the toolbars from the map toolbar container
    onRemove: function onRemove() {
      for (var toolbarId in this._toolbars) {
        if (this._toolbars.hasOwnProperty(toolbarId)) {
          this._toolbars[toolbarId].removeToolbar();
        }
      }
    },
    // @method setDrawingOptions(options): void
    // Sets options to all toolbar instances
    setDrawingOptions: function setDrawingOptions(options) {
      for (var toolbarId in this._toolbars) {
        if (this._toolbars[toolbarId] instanceof L.DrawToolbar) {
          this._toolbars[toolbarId].setOptions(options);
        }
      }
    },
    _toolbarEnabled: function _toolbarEnabled(e) {
      var enabledToolbar = e.target;

      for (var toolbarId in this._toolbars) {
        if (this._toolbars[toolbarId] !== enabledToolbar) {
          this._toolbars[toolbarId].disable();
        }
      }
    }
  });
  L.Map.mergeOptions({
    drawControlTooltips: true,
    drawControl: false
  });
  L.Map.addInitHook(function () {
    if (this.options.drawControl) {
      this.drawControl = new L.Control.Draw();
      this.addControl(this.drawControl);
    }
  });
  /**
   * @class L.Draw.Toolbar
   * @aka Toolbar
   *
   * The toolbar class of the API — it is used to create the ui
   * This will be depreciated
   *
   * @example
   *
   * ```js
   *    var toolbar = L.Toolbar();
   *    toolbar.addToolbar(map);
   * ```
   *
   * ### Disabling a toolbar
   *
   * If you do not want a particular toolbar in your app you can turn it off by setting the toolbar to false.
   *
   * ```js
   *      var drawControl = new L.Control.Draw({
  *          draw: false,
  *          edit: {
  *              featureGroup: editableLayers
  *          }
  *      });
   * ```
   *
   * ### Disabling a toolbar item
   *
   * If you want to turn off a particular toolbar item, set it to false. The following disables drawing polygons and
   * markers. It also turns off the ability to edit layers.
   *
   * ```js
   *      var drawControl = new L.Control.Draw({
  *          draw: {
  *              polygon: false,
  *              marker: false
  *          },
  *          edit: {
  *              featureGroup: editableLayers,
  *              edit: false
  *          }
  *      });
   * ```
   */

  L.Toolbar = L.Class.extend({
    includes: [L.Mixin.Events],
    // @section Methods for modifying the toolbar
    // @method initialize(options): void
    // Toolbar constructor
    initialize: function initialize(options) {
      L.setOptions(this, options);
      this._modes = {};
      this._actionButtons = [];
      this._activeMode = null;
    },
    // @method enabled(): boolean
    // Gets a true/false of whether the toolbar is enabled
    enabled: function enabled() {
      return this._activeMode !== null;
    },
    // @method disable(): void
    // Disables the toolbar
    disable: function disable() {
      if (!this.enabled()) {
        return;
      }

      this._activeMode.handler.disable();
    },
    // @method addToolbar(map): L.DomUtil
    // Adds the toolbar to the map and returns the toolbar dom element
    addToolbar: function addToolbar(map) {
      var container = L.DomUtil.create('div', 'leaflet-draw-section'),
          buttonIndex = 0,
          buttonClassPrefix = this._toolbarClass || '',
          modeHandlers = this.getModeHandlers(map),
          i;
      this._toolbarContainer = L.DomUtil.create('div', 'leaflet-draw-toolbar leaflet-bar');
      this._map = map;

      for (i = 0; i < modeHandlers.length; i++) {
        if (modeHandlers[i].enabled) {
          this._initModeHandler(modeHandlers[i].handler, this._toolbarContainer, buttonIndex++, buttonClassPrefix, modeHandlers[i].title);
        }
      } // if no buttons were added, do not add the toolbar


      if (!buttonIndex) {
        return;
      } // Save button index of the last button, -1 as we would have ++ after the last button


      this._lastButtonIndex = --buttonIndex; // Create empty actions part of the toolbar

      this._actionsContainer = L.DomUtil.create('ul', 'leaflet-draw-actions'); // Add draw and cancel containers to the control container

      container.appendChild(this._toolbarContainer);
      container.appendChild(this._actionsContainer);
      return container;
    },
    // @method removeToolbar(): void
    // Removes the toolbar and drops the handler event listeners
    removeToolbar: function removeToolbar() {
      // Dispose each handler
      for (var handlerId in this._modes) {
        if (this._modes.hasOwnProperty(handlerId)) {
          // Unbind handler button
          this._disposeButton(this._modes[handlerId].button, this._modes[handlerId].handler.enable, this._modes[handlerId].handler); // Make sure is disabled


          this._modes[handlerId].handler.disable(); // Unbind handler


          this._modes[handlerId].handler.off('enabled', this._handlerActivated, this).off('disabled', this._handlerDeactivated, this);
        }
      }

      this._modes = {}; // Dispose the actions toolbar

      for (var i = 0, l = this._actionButtons.length; i < l; i++) {
        this._disposeButton(this._actionButtons[i].button, this._actionButtons[i].callback, this);
      }

      this._actionButtons = [];
      this._actionsContainer = null;
    },
    _initModeHandler: function _initModeHandler(handler, container, buttonIndex, classNamePredix, buttonTitle) {
      var type = handler.type;
      this._modes[type] = {};
      this._modes[type].handler = handler;
      this._modes[type].button = this._createButton({
        type: type,
        title: buttonTitle,
        className: classNamePredix + '-' + type,
        container: container,
        callback: this._modes[type].handler.enable,
        context: this._modes[type].handler
      });
      this._modes[type].buttonIndex = buttonIndex;

      this._modes[type].handler.on('enabled', this._handlerActivated, this).on('disabled', this._handlerDeactivated, this);
    },

    /* Detect iOS based on browser User Agent, based on:
    * http://stackoverflow.com/a/9039885 */
    _detectIOS: function _detectIOS() {
      var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
      return iOS;
    },
    _createButton: function _createButton(options) {
      var link = L.DomUtil.create('a', options.className || '', options.container); // Screen reader tag

      var sr = L.DomUtil.create('span', 'sr-only', options.container);
      link.href = '#';
      link.appendChild(sr);

      if (options.title) {
        link.title = options.title;
        sr.innerHTML = options.title;
      }

      if (options.text) {
        link.innerHTML = options.text;
        sr.innerHTML = options.text;
      }
      /* iOS does not use click events */


      var buttonEvent = this._detectIOS() ? 'touchstart' : 'click';
      L.DomEvent.on(link, 'click', L.DomEvent.stopPropagation).on(link, 'mousedown', L.DomEvent.stopPropagation).on(link, 'dblclick', L.DomEvent.stopPropagation).on(link, 'touchstart', L.DomEvent.stopPropagation).on(link, 'click', L.DomEvent.preventDefault).on(link, buttonEvent, options.callback, options.context);
      return link;
    },
    _disposeButton: function _disposeButton(button, callback) {
      /* iOS does not use click events */
      var buttonEvent = this._detectIOS() ? 'touchstart' : 'click';
      L.DomEvent.off(button, 'click', L.DomEvent.stopPropagation).off(button, 'mousedown', L.DomEvent.stopPropagation).off(button, 'dblclick', L.DomEvent.stopPropagation).off(button, 'touchstart', L.DomEvent.stopPropagation).off(button, 'click', L.DomEvent.preventDefault).off(button, buttonEvent, callback);
    },
    _handlerActivated: function _handlerActivated(e) {
      // Disable active mode (if present)
      this.disable(); // Cache new active feature

      this._activeMode = this._modes[e.handler];
      L.DomUtil.addClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled');

      this._showActionsToolbar();

      this.fire('enable');
    },
    _handlerDeactivated: function _handlerDeactivated() {
      this._hideActionsToolbar();

      L.DomUtil.removeClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled');
      this._activeMode = null;
      this.fire('disable');
    },
    _createActions: function _createActions(handler) {
      var container = this._actionsContainer,
          buttons = this.getActions(handler),
          l = buttons.length,
          li,
          di,
          dl,
          button; // Dispose the actions toolbar (todo: dispose only not used buttons)

      for (di = 0, dl = this._actionButtons.length; di < dl; di++) {
        this._disposeButton(this._actionButtons[di].button, this._actionButtons[di].callback);
      }

      this._actionButtons = []; // Remove all old buttons

      while (container.firstChild) {
        container.removeChild(container.firstChild);
      }

      for (var i = 0; i < l; i++) {
        if ('enabled' in buttons[i] && !buttons[i].enabled) {
          continue;
        }

        li = L.DomUtil.create('li', '', container);
        button = this._createButton({
          title: buttons[i].title,
          text: buttons[i].text,
          container: li,
          callback: buttons[i].callback,
          context: buttons[i].context
        });

        this._actionButtons.push({
          button: button,
          callback: buttons[i].callback
        });
      }
    },
    _showActionsToolbar: function _showActionsToolbar() {
      var buttonIndex = this._activeMode.buttonIndex,
          lastButtonIndex = this._lastButtonIndex,
          toolbarPosition = this._activeMode.button.offsetTop - 1; // Recreate action buttons on every click

      this._createActions(this._activeMode.handler); // Correctly position the cancel button


      this._actionsContainer.style.top = toolbarPosition + 'px';

      if (buttonIndex === 0) {
        L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop');
        L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-top');
      }

      if (buttonIndex === lastButtonIndex) {
        L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom');
        L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-bottom');
      }

      this._actionsContainer.style.display = 'block';
    },
    _hideActionsToolbar: function _hideActionsToolbar() {
      this._actionsContainer.style.display = 'none';
      L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop');
      L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom');
      L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-top');
      L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-bottom');
    }
  });
  L.Draw = L.Draw || {};
  /**
   * @class L.Draw.Tooltip
   * @aka Tooltip
   *
   * The tooltip class — it is used to display the tooltip while drawing
   * This will be depreciated
   *
   * @example
   *
   * ```js
   *    var tooltip = L.Draw.Tooltip();
   * ```
   *
   */

  L.Draw.Tooltip = L.Class.extend({
    // @section Methods for modifying draw state
    // @method initialize(map): void
    // Tooltip constructor
    initialize: function initialize(map) {
      this._map = map;
      this._popupPane = map._panes.popupPane;
      this._visible = false;
      this._container = map.options.drawControlTooltips ? L.DomUtil.create('div', 'leaflet-draw-tooltip', this._popupPane) : null;
      this._singleLineLabel = false;

      this._map.on('mouseout', this._onMouseOut, this);
    },
    // @method dispose(): void
    // Remove Tooltip DOM and unbind events
    dispose: function dispose() {
      this._map.off('mouseout', this._onMouseOut, this);

      if (this._container) {
        this._popupPane.removeChild(this._container);

        this._container = null;
      }
    },
    // @method updateContent(labelText): this
    // Changes the tooltip text to string in function call
    updateContent: function updateContent(labelText) {
      if (!this._container) {
        return this;
      }

      labelText.subtext = labelText.subtext || ''; // update the vertical position (only if changed)

      if (labelText.subtext.length === 0 && !this._singleLineLabel) {
        L.DomUtil.addClass(this._container, 'leaflet-draw-tooltip-single');
        this._singleLineLabel = true;
      } else if (labelText.subtext.length > 0 && this._singleLineLabel) {
        L.DomUtil.removeClass(this._container, 'leaflet-draw-tooltip-single');
        this._singleLineLabel = false;
      }

      this._container.innerHTML = (labelText.subtext.length > 0 ? '<span class=\"leaflet-draw-tooltip-subtext\">' + labelText.subtext + '</span>' + '<br />' : '') + '<span>' + labelText.text + '</span>';

      if (!labelText.text && !labelText.subtext) {
        this._visible = false;
        this._container.style.visibility = 'hidden';
      } else {
        this._visible = true;
        this._container.style.visibility = 'inherit';
      }

      return this;
    },
    // @method updatePosition(latlng): this
    // Changes the location of the tooltip
    updatePosition: function updatePosition(latlng) {
      var pos = this._map.latLngToLayerPoint(latlng),
          tooltipContainer = this._container;

      if (this._container) {
        if (this._visible) {
          tooltipContainer.style.visibility = 'inherit';
        }

        L.DomUtil.setPosition(tooltipContainer, pos);
      }

      return this;
    },
    // @method showAsError(): this
    // Applies error class to tooltip
    showAsError: function showAsError() {
      if (this._container) {
        L.DomUtil.addClass(this._container, 'leaflet-error-draw-tooltip');
      }

      return this;
    },
    // @method removeError(): this
    // Removes the error class from the tooltip
    removeError: function removeError() {
      if (this._container) {
        L.DomUtil.removeClass(this._container, 'leaflet-error-draw-tooltip');
      }

      return this;
    },
    _onMouseOut: function _onMouseOut() {
      if (this._container) {
        this._container.style.visibility = 'hidden';
      }
    }
  });
  /**
   * @class L.DrawToolbar
   * @aka Toolbar
   */

  L.DrawToolbar = L.Toolbar.extend({
    statics: {
      TYPE: 'draw'
    },
    options: {
      polyline: {},
      polygon: {},
      rectangle: {},
      circle: {},
      marker: {},
      circlemarker: {}
    },
    // @method initialize(): void
    initialize: function initialize(options) {
      // Ensure that the options are merged correctly since L.extend is only shallow
      for (var type in this.options) {
        if (this.options.hasOwnProperty(type)) {
          if (options[type]) {
            options[type] = L.extend({}, this.options[type], options[type]);
          }
        }
      }

      this._toolbarClass = 'leaflet-draw-draw';
      L.Toolbar.prototype.initialize.call(this, options);
    },
    // @method getModeHandlers(): object
    // Get mode handlers information
    getModeHandlers: function getModeHandlers(map) {
      return [{
        enabled: this.options.polyline,
        handler: new L.Draw.Polyline(map, this.options.polyline),
        title: L.drawLocal.draw.toolbar.buttons.polyline
      }, {
        enabled: this.options.polygon,
        handler: new L.Draw.Polygon(map, this.options.polygon),
        title: L.drawLocal.draw.toolbar.buttons.polygon
      }, {
        enabled: this.options.rectangle,
        handler: new L.Draw.Rectangle(map, this.options.rectangle),
        title: L.drawLocal.draw.toolbar.buttons.rectangle
      }, {
        enabled: this.options.circle,
        handler: new L.Draw.Circle(map, this.options.circle),
        title: L.drawLocal.draw.toolbar.buttons.circle
      }, {
        enabled: this.options.marker,
        handler: new L.Draw.Marker(map, this.options.marker),
        title: L.drawLocal.draw.toolbar.buttons.marker
      }, {
        enabled: this.options.circlemarker,
        handler: new L.Draw.CircleMarker(map, this.options.circlemarker),
        title: L.drawLocal.draw.toolbar.buttons.circlemarker
      }];
    },
    // @method getActions(): object
    // Get action information
    getActions: function getActions(handler) {
      return [// {
      //     enabled: handler.completeShape,
      //     title: L.drawLocal.draw.toolbar.finish.title,
      //     text: L.drawLocal.draw.toolbar.finish.text,
      //     callback: handler.completeShape,
      //     context: handler
      // },
      {
        enabled: handler.deleteLastVertex,
        title: L.drawLocal.draw.toolbar.undo.title,
        text: L.drawLocal.draw.toolbar.undo.text,
        callback: handler.deleteLastVertex,
        context: handler
      }, {
        title: L.drawLocal.draw.toolbar.actions.title,
        text: L.drawLocal.draw.toolbar.actions.text,
        callback: this.disable,
        context: this
      }];
    },
    // @method setOptions(): void
    // Sets the options to the toolbar
    setOptions: function setOptions(options) {
      L.setOptions(this, options);

      for (var type in this._modes) {
        if (this._modes.hasOwnProperty(type) && options.hasOwnProperty(type)) {
          this._modes[type].handler.setOptions(options[type]);
        }
      }
    }
  });
  /*L.Map.mergeOptions({
  editControl: true
  });*/

  /**
   * @class L.EditToolbar
   * @aka EditToolbar
   */

  L.EditToolbar = L.Toolbar.extend({
    statics: {
      TYPE: 'edit'
    },
    options: {
      edit: {
        selectedPathOptions: {
          dashArray: '10, 10',
          fill: true,
          fillColor: '#fe57a1',
          fillOpacity: 0.1,
          // Whether to user the existing layers color
          maintainColor: false
        }
      },
      remove: {},
      poly: null,
      featureGroup: null
      /* REQUIRED! TODO: perhaps if not set then all layers on the map are selectable? */

    },
    // @method intialize(): void
    initialize: function initialize(options) {
      // Need to set this manually since null is an acceptable value here
      if (options.edit) {
        if (typeof options.edit.selectedPathOptions === 'undefined') {
          options.edit.selectedPathOptions = this.options.edit.selectedPathOptions;
        }

        options.edit.selectedPathOptions = L.extend({}, this.options.edit.selectedPathOptions, options.edit.selectedPathOptions);
      }

      if (options.remove) {
        options.remove = L.extend({}, this.options.remove, options.remove);
      }

      if (options.poly) {
        options.poly = L.extend({}, this.options.poly, options.poly);
      }

      this._toolbarClass = 'leaflet-draw-edit';
      L.Toolbar.prototype.initialize.call(this, options);
      this._selectedFeatureCount = 0;
    },
    // @method getModeHandlers(): object
    // Get mode handlers information
    getModeHandlers: function getModeHandlers(map) {
      var featureGroup = this.options.featureGroup;
      return [{
        enabled: this.options.edit,
        handler: new L.EditToolbar.Edit(map, {
          featureGroup: featureGroup,
          selectedPathOptions: this.options.edit.selectedPathOptions,
          poly: this.options.poly
        }),
        title: L.drawLocal.edit.toolbar.buttons.edit
      }, {
        enabled: this.options.remove,
        handler: new L.EditToolbar.Delete(map, {
          featureGroup: featureGroup
        }),
        title: L.drawLocal.edit.toolbar.buttons.remove
      }];
    },
    // @method getActions(): object
    // Get actions information
    getActions: function getActions(handler) {
      var actions = [{
        title: L.drawLocal.edit.toolbar.actions.save.title,
        text: L.drawLocal.edit.toolbar.actions.save.text,
        callback: this._save,
        context: this
      }, {
        title: L.drawLocal.edit.toolbar.actions.cancel.title,
        text: L.drawLocal.edit.toolbar.actions.cancel.text,
        callback: this.disable,
        context: this
      }];

      if (handler.removeAllLayers) {
        actions.push({
          title: L.drawLocal.edit.toolbar.actions.clearAll.title,
          text: L.drawLocal.edit.toolbar.actions.clearAll.text,
          callback: this._clearAllLayers,
          context: this
        });
      }

      return actions;
    },
    // @method addToolbar(map): L.DomUtil
    // Adds the toolbar to the map
    addToolbar: function addToolbar(map) {
      var container = L.Toolbar.prototype.addToolbar.call(this, map);

      this._checkDisabled();

      this.options.featureGroup.on('layeradd layerremove', this._checkDisabled, this);
      return container;
    },
    // @method removeToolbar(): void
    // Removes the toolbar from the map
    removeToolbar: function removeToolbar() {
      this.options.featureGroup.off('layeradd layerremove', this._checkDisabled, this);
      L.Toolbar.prototype.removeToolbar.call(this);
    },
    // @method disable(): void
    // Disables the toolbar
    disable: function disable() {
      if (!this.enabled()) {
        return;
      }

      this._activeMode.handler.revertLayers();

      L.Toolbar.prototype.disable.call(this);
    },
    _save: function _save() {
      this._activeMode.handler.save();

      if (this._activeMode) {
        this._activeMode.handler.disable();
      }
    },
    _clearAllLayers: function _clearAllLayers() {
      this._activeMode.handler.removeAllLayers();

      if (this._activeMode) {
        this._activeMode.handler.disable();
      }
    },
    _checkDisabled: function _checkDisabled() {
      var featureGroup = this.options.featureGroup,
          hasLayers = featureGroup.getLayers().length !== 0,
          button;

      if (this.options.edit) {
        button = this._modes[L.EditToolbar.Edit.TYPE].button;

        if (hasLayers) {
          L.DomUtil.removeClass(button, 'leaflet-disabled');
        } else {
          L.DomUtil.addClass(button, 'leaflet-disabled');
        }

        button.setAttribute('title', hasLayers ? L.drawLocal.edit.toolbar.buttons.edit : L.drawLocal.edit.toolbar.buttons.editDisabled);
      }

      if (this.options.remove) {
        button = this._modes[L.EditToolbar.Delete.TYPE].button;

        if (hasLayers) {
          L.DomUtil.removeClass(button, 'leaflet-disabled');
        } else {
          L.DomUtil.addClass(button, 'leaflet-disabled');
        }

        button.setAttribute('title', hasLayers ? L.drawLocal.edit.toolbar.buttons.remove : L.drawLocal.edit.toolbar.buttons.removeDisabled);
      }
    }
  });
  /**
   * @class L.EditToolbar.Edit
   * @aka EditToolbar.Edit
   */

  L.EditToolbar.Edit = L.Handler.extend({
    statics: {
      TYPE: 'edit'
    },
    includes: L.Mixin.Events,
    // @method intialize(): void
    initialize: function initialize(map, options) {
      L.Handler.prototype.initialize.call(this, map);
      L.setOptions(this, options); // Store the selectable layer group for ease of access

      this._featureGroup = options.featureGroup;

      if (!(this._featureGroup instanceof L.FeatureGroup)) {
        throw new Error('options.featureGroup must be a L.FeatureGroup');
      }

      this._uneditedLayerProps = {}; // Save the type so super can fire, need to do this as cannot do this.TYPE :(

      this.type = L.EditToolbar.Edit.TYPE;
    },
    // @method enable(): void
    // Enable the edit toolbar
    enable: function enable() {
      if (this._enabled || !this._hasAvailableLayers()) {
        return;
      }

      this.fire('enabled', {
        handler: this.type
      }); //this disable other handlers

      this._map.fire(L.Draw.Event.EDITSTART, {
        handler: this.type
      }); //allow drawLayer to be updated before beginning edition.


      L.Handler.prototype.enable.call(this);

      this._featureGroup.on('layeradd', this._enableLayerEdit, this).on('layerremove', this._disableLayerEdit, this);
    },
    // @method disable(): void
    // Disable the edit toolbar
    disable: function disable() {
      if (!this._enabled) {
        return;
      }

      this._featureGroup.off('layeradd', this._enableLayerEdit, this).off('layerremove', this._disableLayerEdit, this);

      L.Handler.prototype.disable.call(this);

      this._map.fire(L.Draw.Event.EDITSTOP, {
        handler: this.type
      });

      this.fire('disabled', {
        handler: this.type
      });
    },
    // @method addHooks(): void
    // Add listener hooks for this handler
    addHooks: function addHooks() {
      var map = this._map;

      if (map) {
        map.getContainer().focus();

        this._featureGroup.eachLayer(this._enableLayerEdit, this);

        this._tooltip = new L.Draw.Tooltip(this._map);

        this._tooltip.updateContent({
          text: L.drawLocal.edit.handlers.edit.tooltip.text,
          subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
        }); // Quickly access the tooltip to update for intersection checking


        map._editTooltip = this._tooltip;

        this._updateTooltip();

        this._map.on('mousemove', this._onMouseMove, this).on('touchmove', this._onMouseMove, this).on('MSPointerMove', this._onMouseMove, this).on(L.Draw.Event.EDITVERTEX, this._updateTooltip, this);
      }
    },
    // @method removeHooks(): void
    // Remove listener hooks for this handler
    removeHooks: function removeHooks() {
      if (this._map) {
        // Clean up selected layers.
        this._featureGroup.eachLayer(this._disableLayerEdit, this); // Clear the backups of the original layers


        this._uneditedLayerProps = {};

        this._tooltip.dispose();

        this._tooltip = null;

        this._map.off('mousemove', this._onMouseMove, this).off('touchmove', this._onMouseMove, this).off('MSPointerMove', this._onMouseMove, this).off(L.Draw.Event.EDITVERTEX, this._updateTooltip, this);
      }
    },
    // @method revertLayers(): void
    // Revert each layer's geometry changes
    revertLayers: function revertLayers() {
      this._featureGroup.eachLayer(function (layer) {
        this._revertLayer(layer);
      }, this);
    },
    // @method save(): void
    // Save the layer geometries
    save: function save() {
      var editedLayers = new L.LayerGroup();

      this._featureGroup.eachLayer(function (layer) {
        if (layer.edited) {
          editedLayers.addLayer(layer);
          layer.edited = false;
        }
      });

      this._map.fire(L.Draw.Event.EDITED, {
        layers: editedLayers
      });
    },
    _backupLayer: function _backupLayer(layer) {
      var id = L.Util.stamp(layer);

      if (!this._uneditedLayerProps[id]) {
        // Polyline, Polygon or Rectangle
        if (layer instanceof L.Polyline || layer instanceof L.Polygon || layer instanceof L.Rectangle) {
          this._uneditedLayerProps[id] = {
            latlngs: L.LatLngUtil.cloneLatLngs(layer.getLatLngs())
          };
        } else if (layer instanceof L.Circle) {
          this._uneditedLayerProps[id] = {
            latlng: L.LatLngUtil.cloneLatLng(layer.getLatLng()),
            radius: layer.getRadius()
          };
        } else if (layer instanceof L.Marker || layer instanceof L.CircleMarker) {
          // Marker
          this._uneditedLayerProps[id] = {
            latlng: L.LatLngUtil.cloneLatLng(layer.getLatLng())
          };
        }
      }
    },
    _getTooltipText: function _getTooltipText() {
      return {
        text: L.drawLocal.edit.handlers.edit.tooltip.text,
        subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
      };
    },
    _updateTooltip: function _updateTooltip() {
      this._tooltip.updateContent(this._getTooltipText());
    },
    _revertLayer: function _revertLayer(layer) {
      var id = L.Util.stamp(layer);
      layer.edited = false;

      if (this._uneditedLayerProps.hasOwnProperty(id)) {
        // Polyline, Polygon or Rectangle
        if (layer instanceof L.Polyline || layer instanceof L.Polygon || layer instanceof L.Rectangle) {
          layer.setLatLngs(this._uneditedLayerProps[id].latlngs);
        } else if (layer instanceof L.Circle) {
          layer.setLatLng(this._uneditedLayerProps[id].latlng);
          layer.setRadius(this._uneditedLayerProps[id].radius);
        } else if (layer instanceof L.Marker || layer instanceof L.CircleMarker) {
          // Marker or CircleMarker
          layer.setLatLng(this._uneditedLayerProps[id].latlng);
        }

        layer.fire('revert-edited', {
          layer: layer
        });
      }
    },
    _enableLayerEdit: function _enableLayerEdit(e) {
      var layer = e.layer || e.target || e,
          pathOptions,
          poly; // Back up this layer (if haven't before)

      this._backupLayer(layer);

      if (this.options.poly) {
        poly = L.Util.extend({}, this.options.poly);
        layer.options.poly = poly;
      } // Set different style for editing mode


      if (this.options.selectedPathOptions) {
        pathOptions = L.Util.extend({}, this.options.selectedPathOptions); // Use the existing color of the layer

        if (pathOptions.maintainColor) {
          pathOptions.color = layer.options.color;
          pathOptions.fillColor = layer.options.fillColor;
        }

        layer.options.original = L.extend({}, layer.options);
        layer.options.editing = pathOptions;
      }

      if (layer instanceof L.Marker) {
        if (layer.editing) {
          layer.editing.enable();
        }

        layer.dragging.enable();
        layer.on('dragend', this._onMarkerDragEnd) // #TODO: remove when leaflet finally fixes their draggable so it's touch friendly again.
        .on('touchmove', this._onTouchMove, this).on('MSPointerMove', this._onTouchMove, this).on('touchend', this._onMarkerDragEnd, this).on('MSPointerUp', this._onMarkerDragEnd, this);
      } else {
        layer.editing.enable();
      }
    },
    _disableLayerEdit: function _disableLayerEdit(e) {
      var layer = e.layer || e.target || e;
      layer.edited = false;

      if (layer.editing) {
        layer.editing.disable();
      }

      delete layer.options.editing;
      delete layer.options.original; // Reset layer styles to that of before select

      if (this._selectedPathOptions) {
        if (layer instanceof L.Marker) {
          this._toggleMarkerHighlight(layer);
        } else {
          // reset the layer style to what is was before being selected
          layer.setStyle(layer.options.previousOptions); // remove the cached options for the layer object

          delete layer.options.previousOptions;
        }
      }

      if (layer instanceof L.Marker) {
        layer.dragging.disable();
        layer.off('dragend', this._onMarkerDragEnd, this).off('touchmove', this._onTouchMove, this).off('MSPointerMove', this._onTouchMove, this).off('touchend', this._onMarkerDragEnd, this).off('MSPointerUp', this._onMarkerDragEnd, this);
      } else {
        layer.editing.disable();
      }
    },
    _onMouseMove: function _onMouseMove(e) {
      this._tooltip.updatePosition(e.latlng);
    },
    _onMarkerDragEnd: function _onMarkerDragEnd(e) {
      var layer = e.target;
      layer.edited = true;

      this._map.fire(L.Draw.Event.EDITMOVE, {
        layer: layer
      });
    },
    _onTouchMove: function _onTouchMove(e) {
      var touchEvent = e.originalEvent.changedTouches[0],
          layerPoint = this._map.mouseEventToLayerPoint(touchEvent),
          latlng = this._map.layerPointToLatLng(layerPoint);

      e.target.setLatLng(latlng);
    },
    _hasAvailableLayers: function _hasAvailableLayers() {
      return this._featureGroup.getLayers().length !== 0;
    }
  });
  /**
   * @class L.EditToolbar.Delete
   * @aka EditToolbar.Delete
   */

  L.EditToolbar.Delete = L.Handler.extend({
    statics: {
      TYPE: 'remove' // not delete as delete is reserved in js

    },
    includes: L.Mixin.Events,
    // @method intialize(): void
    initialize: function initialize(map, options) {
      L.Handler.prototype.initialize.call(this, map);
      L.Util.setOptions(this, options); // Store the selectable layer group for ease of access

      this._deletableLayers = this.options.featureGroup;

      if (!(this._deletableLayers instanceof L.FeatureGroup)) {
        throw new Error('options.featureGroup must be a L.FeatureGroup');
      } // Save the type so super can fire, need to do this as cannot do this.TYPE :(


      this.type = L.EditToolbar.Delete.TYPE;
    },
    // @method enable(): void
    // Enable the delete toolbar
    enable: function enable() {
      if (this._enabled || !this._hasAvailableLayers()) {
        return;
      }

      this.fire('enabled', {
        handler: this.type
      });

      this._map.fire(L.Draw.Event.DELETESTART, {
        handler: this.type
      });

      L.Handler.prototype.enable.call(this);

      this._deletableLayers.on('layeradd', this._enableLayerDelete, this).on('layerremove', this._disableLayerDelete, this);
    },
    // @method disable(): void
    // Disable the delete toolbar
    disable: function disable() {
      if (!this._enabled) {
        return;
      }

      this._deletableLayers.off('layeradd', this._enableLayerDelete, this).off('layerremove', this._disableLayerDelete, this);

      L.Handler.prototype.disable.call(this);

      this._map.fire(L.Draw.Event.DELETESTOP, {
        handler: this.type
      });

      this.fire('disabled', {
        handler: this.type
      });
    },
    // @method addHooks(): void
    // Add listener hooks to this handler
    addHooks: function addHooks() {
      var map = this._map;

      if (map) {
        map.getContainer().focus();

        this._deletableLayers.eachLayer(this._enableLayerDelete, this);

        this._deletedLayers = new L.LayerGroup();
        this._tooltip = new L.Draw.Tooltip(this._map);

        this._tooltip.updateContent({
          text: L.drawLocal.edit.handlers.remove.tooltip.text
        });

        this._map.on('mousemove', this._onMouseMove, this);
      }
    },
    // @method removeHooks(): void
    // Remove listener hooks from this handler
    removeHooks: function removeHooks() {
      if (this._map) {
        this._deletableLayers.eachLayer(this._disableLayerDelete, this);

        this._deletedLayers = null;

        this._tooltip.dispose();

        this._tooltip = null;

        this._map.off('mousemove', this._onMouseMove, this);
      }
    },
    // @method revertLayers(): void
    // Revert the deleted layers back to their prior state.
    revertLayers: function revertLayers() {
      // Iterate of the deleted layers and add them back into the featureGroup
      this._deletedLayers.eachLayer(function (layer) {
        this._deletableLayers.addLayer(layer);

        layer.fire('revert-deleted', {
          layer: layer
        });
      }, this);
    },
    // @method save(): void
    // Save deleted layers
    save: function save() {
      this._map.fire(L.Draw.Event.DELETED, {
        layers: this._deletedLayers
      });
    },
    // @method removeAllLayers(): void
    // Remove all delateable layers
    removeAllLayers: function removeAllLayers() {
      // Iterate of the delateable layers and add remove them
      this._deletableLayers.eachLayer(function (layer) {
        this._removeLayer({
          layer: layer
        });
      }, this);

      this.save();
    },
    _enableLayerDelete: function _enableLayerDelete(e) {
      var layer = e.layer || e.target || e;
      layer.on('click', this._removeLayer, this);
    },
    _disableLayerDelete: function _disableLayerDelete(e) {
      var layer = e.layer || e.target || e;
      layer.off('click', this._removeLayer, this); // Remove from the deleted layers so we can't accidentally revert if the user presses cancel

      this._deletedLayers.removeLayer(layer);
    },
    _removeLayer: function _removeLayer(e) {
      var layer = e.layer || e.target || e;

      this._deletableLayers.removeLayer(layer);

      this._deletedLayers.addLayer(layer);

      layer.fire('deleted');
    },
    _onMouseMove: function _onMouseMove(e) {
      this._tooltip.updatePosition(e.latlng);
    },
    _hasAvailableLayers: function _hasAvailableLayers() {
      return this._deletableLayers.getLayers().length !== 0;
    }
  });
})(window, document);

/***/ }),

/***/ \"./assets/js/sectorisation.js\":
/*!************************************!*\\
  !*** ./assets/js/sectorisation.js ***!
  \\************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

\"use strict\";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.map.js */ \"./node_modules/core-js/modules/es.array.map.js\");
/* harmony import */ var core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");
/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.array.find.js */ \"./node_modules/core-js/modules/es.array.find.js\");
/* harmony import */ var core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var core_js_modules_es_number_constructor_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.number.constructor.js */ \"./node_modules/core-js/modules/es.number.constructor.js\");
/* harmony import */ var core_js_modules_es_number_constructor_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_number_constructor_js__WEBPACK_IMPORTED_MODULE_3__);
/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.regexp.exec.js */ \"./node_modules/core-js/modules/es.regexp.exec.js\");
/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ \"./node_modules/core-js/modules/es.string.replace.js\");
/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var core_js_modules_es_array_index_of_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.array.index-of.js */ \"./node_modules/core-js/modules/es.array.index-of.js\");
/* harmony import */ var core_js_modules_es_array_index_of_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_index_of_js__WEBPACK_IMPORTED_MODULE_6__);
/* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.string.split.js */ \"./node_modules/core-js/modules/es.string.split.js\");
/* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_7__);
/* harmony import */ var core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.date.to-string.js */ \"./node_modules/core-js/modules/es.date.to-string.js\");
/* harmony import */ var core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_8__);
/* harmony import */ var core_js_modules_es_array_reduce_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.array.reduce.js */ \"./node_modules/core-js/modules/es.array.reduce.js\");
/* harmony import */ var core_js_modules_es_array_reduce_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_reduce_js__WEBPACK_IMPORTED_MODULE_9__);
/* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.array.for-each.js */ \"./node_modules/core-js/modules/es.array.for-each.js\");
/* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_10__);
/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ \"./node_modules/core-js/modules/web.dom-collections.for-each.js\");
/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_11__);
/* harmony import */ var core_js_modules_es_array_some_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.array.some.js */ \"./node_modules/core-js/modules/es.array.some.js\");
/* harmony import */ var core_js_modules_es_array_some_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_some_js__WEBPACK_IMPORTED_MODULE_12__);
/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.array.splice.js */ \"./node_modules/core-js/modules/es.array.splice.js\");
/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_13__);
/* harmony import */ var _images_secto_save_png__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../images/secto/save.png */ \"./assets/images/secto/save.png\");
/* harmony import */ var _images_secto_icon_marker_black_png__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../images/secto/icon_marker_black.png */ \"./assets/images/secto/icon_marker_black.png\");
/* harmony import */ var _images_secto_icon_marker_red_png__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../images/secto/icon_marker_red.png */ \"./assets/images/secto/icon_marker_red.png\");
/* harmony import */ var _images_secto_circle_png__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../images/secto/circle.png */ \"./assets/images/secto/circle.png\");
/* harmony import */ var _images_secto_maison_png__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../images/secto/maison.png */ \"./assets/images/secto/maison.png\");
/* harmony import */ var _images_secto_undo_png__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../images/secto/undo.png */ \"./assets/images/secto/undo.png\");
/* harmony import */ var _images_secto_refresh_png__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../images/secto/refresh.png */ \"./assets/images/secto/refresh.png\");
/* harmony import */ var _images_secto_pastille_png__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../images/secto/pastille.png */ \"./assets/images/secto/pastille.png\");
/* harmony import */ var _images_secto_bdd_png__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../images/secto/bdd.png */ \"./assets/images/secto/bdd.png\");
/* harmony import */ var _images_secto_creation_assist_png__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../images/secto/creation_assist.png */ \"./assets/images/secto/creation_assist.png\");
/* harmony import */ var _images_secto_clients30_png__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../images/secto/clients30.png */ \"./assets/images/secto/clients30.png\");
/* harmony import */ var _images_secto_agents_png__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../images/secto/agents.png */ \"./assets/images/secto/agents.png\");
/* harmony import */ var _images_secto_number_png__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../images/secto/number.png */ \"./assets/images/secto/number.png\");
/* harmony import */ var _images_secto_densite1_png__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../images/secto/densite1.png */ \"./assets/images/secto/densite1.png\");
/* harmony import */ var _images_secto_clientsOut_png__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../images/secto/clientsOut.png */ \"./assets/images/secto/clientsOut.png\");
/* harmony import */ var leaflet_dist_leaflet_css__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! leaflet/dist/leaflet.css */ \"./node_modules/leaflet/dist/leaflet.css\");
/* harmony import */ var _styles_sectorisation_css__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../styles/sectorisation.css */ \"./assets/styles/sectorisation.css\");
/* harmony import */ var _styles_timeline_css__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../styles/timeline.css */ \"./assets/styles/timeline.css\");
/* harmony import */ var leaflet_dist_leaflet_src__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! leaflet/dist/leaflet-src.js */ \"./node_modules/leaflet/dist/leaflet-src.js\");
/* harmony import */ var leaflet_dist_leaflet_src__WEBPACK_IMPORTED_MODULE_32___default = /*#__PURE__*/__webpack_require__.n(leaflet_dist_leaflet_src__WEBPACK_IMPORTED_MODULE_32__);
/* harmony import */ var bootstrap_table_dist_bootstrap_table_min_css__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! bootstrap-table/dist/bootstrap-table.min.css */ \"./node_modules/bootstrap-table/dist/bootstrap-table.min.css\");
/* harmony import */ var bootstrap_table_dist_bootstrap_table_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! bootstrap-table/dist/bootstrap-table.js */ \"./node_modules/bootstrap-table/dist/bootstrap-table.js\");
/* harmony import */ var bootstrap_table_dist_bootstrap_table_js__WEBPACK_IMPORTED_MODULE_34___default = /*#__PURE__*/__webpack_require__.n(bootstrap_table_dist_bootstrap_table_js__WEBPACK_IMPORTED_MODULE_34__);
/* harmony import */ var bootstrap_table_dist_bootstrap_table_locale_all_min_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! bootstrap-table/dist/bootstrap-table-locale-all.min.js */ \"./node_modules/bootstrap-table/dist/bootstrap-table-locale-all.min.js\");
/* harmony import */ var bootstrap_table_dist_bootstrap_table_locale_all_min_js__WEBPACK_IMPORTED_MODULE_35___default = /*#__PURE__*/__webpack_require__.n(bootstrap_table_dist_bootstrap_table_locale_all_min_js__WEBPACK_IMPORTED_MODULE_35__);
/* harmony import */ var _map_leaflet_draw_custom_js__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./map/leaflet.draw-custom.js */ \"./assets/js/map/leaflet.draw-custom.js\");
/* harmony import */ var _map_leaflet_draw_custom_js__WEBPACK_IMPORTED_MODULE_36___default = /*#__PURE__*/__webpack_require__.n(_map_leaflet_draw_custom_js__WEBPACK_IMPORTED_MODULE_36__);
/* harmony import */ var _map_leaflet_search_js__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./map/leaflet-search.js */ \"./assets/js/map/leaflet-search.js\");
/* harmony import */ var _map_leaflet_search_js__WEBPACK_IMPORTED_MODULE_37___default = /*#__PURE__*/__webpack_require__.n(_map_leaflet_search_js__WEBPACK_IMPORTED_MODULE_37__);
/* provided dependency */ var \$ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");














//IMAGES














 //STYLE





 //JS





 //\$(document).ready(function () {

\$(document).on('ready turbo:load', function () {
  /*redimensionnement carte*/
  \$(window).resize(function () {
    var height = 344;
    var width = 60;

    if (\$('#filter-container').hasClass('active')) {
      height = 482;
    }

    if (!\$('#blocRight').hasClass('active')) {
      width = 97;
    }

    \$('#sectorisationMap').css('width', width + '%');
    var sH = \$(window).height() - height;
    \$('#sectorisationMap').css('height', sH + 30 + 'px');
    \$('#blocTab').css('height', sH + 'px');
    \$('#explainMe').css('height', sH + 'px');
    \$('#containerMap').css('height', sH + 30 + 'px');
  });
  \$('.dx-datagrid-search-panel').css('width', '250px');
  \$(window).trigger('resize');
  document.getElementById('filter-image').addEventListener('click', function () {
    if (!\$('#listeAgents').hasClass('visible')) {
      \$('#listeAgents').addClass('visible');
      \$('#listeAgents').show();
    }

    \$(window).trigger('resize');
  });
  \$('#minimize-tab').click(function () {
    \$('#blocRight').toggleClass('active');
    \$(window).trigger('resize');
  });
  /*fin redimensionnement carte*/

  /*VARIABLES*/

  var tabColor = ['SPRINGGREEN', 'aqua', 'yellow', 'DEEPPINK', 'STEELBLUE', 'green', 'GOLDENROD', 'DEEPSKYBLUE', 'magenta', 'purple', 'orange', 'DARKRED', 'maroon'];
  var tabAntennes = ['VERGNIEUX', 'HANNIQUET', 'GOSNET', 'CHEZE', 'LAHALLE'];
  var colors = [];
  var fillColorWithoutAgent = 'black';
  var colorWithoutAgent = 'red';
  var colorWithAgent = '#000';
  var tabAgents = JSON.parse(\$('#tabAgents')[0].innerHTML);
  var siteUser = \$('#site')[0].innerHTML;
  console.info(agents);
  var tabNbClients = [];

  for (var i in tabAgents) {
    if (!tabNbClients[tabAgents[i]['code_agent']]) {
      tabNbClients[tabAgents[i]['code_agent']] = [];
    }

    tabNbClients[tabAgents[i]['code_agent']]['nbClients'] = tabAgents[i]['nb_clients'];
    tabNbClients[tabAgents[i]['code_agent']]['famille0'] = tabAgents[i]['famille0'];
    tabNbClients[tabAgents[i]['code_agent']]['famille1'] = tabAgents[i]['famille1'];
    tabNbClients[tabAgents[i]['code_agent']]['famille2'] = tabAgents[i]['famille2'];
    tabNbClients[tabAgents[i]['code_agent']]['famille3'] = tabAgents[i]['famille3'];
  }

  var lastId = 0;
  var markerDecoupage = new L.layerGroup();
  var marker1 = '';
  var marker2 = '';
  var fusion = false;
  var decoupage = false;
  var modification = false;
  var creation = false;
  var assist = false;
  var containerClick = false;
  var showTooltip = false; //var agents = '';

  var showAgents = true;
  var showAgentsOfSecteurs = true;
  var densiteClients = '';
  var showDensite = false;
  var clientsWithoutSecteur = new L.FeatureGroup();
  var geojsonClients = '';
  var showClients = false;
  var tabDensite = [];
  var secteursByResponsable = [];
  var secteursSelect = '';
  var historiqueActions = []; //Contient la liste des actions faites depuis la dernière sauvegarde

  var histoPolygon = '';
  var flagUndo = false;
  var eventActif = false;
  var optionsCircleClients = {
    radius: 3,
    opacity: 1,
    fillColor: \"#e20613\",
    color: \"#000\",
    weight: 1,
    fillOpacity: 1
  };
  /*FIN VARIABLES*/

  /*ICONS*/

  var markerIcon = L.icon({
    iconUrl: _images_secto_icon_marker_black_png__WEBPACK_IMPORTED_MODULE_15__,
    iconAnchor: [12, 21] // point of the icon which will correspond to marker's location

  });
  var markerIconRed = L.icon({
    iconUrl: _images_secto_icon_marker_red_png__WEBPACK_IMPORTED_MODULE_16__,
    iconAnchor: [12, 21] // point of the icon which will correspond to marker's location

  });
  var circleIcon = L.icon({
    iconUrl: _images_secto_circle_png__WEBPACK_IMPORTED_MODULE_17__,
    iconSize: [14, 14],
    // size of the icon
    iconAnchor: [7, 7] // point of the icon which will correspond to marker's location

  });
  var homeIcon = L.icon({
    iconUrl: _images_secto_maison_png__WEBPACK_IMPORTED_MODULE_18__,
    iconSize: [20, 20],
    // size of the icon
    iconAnchor: [10, 10] // point of the icon which will correspond to marker's location

  });
  /*FIN ICONS*/

  /*DECLARATION MAP*/

  var zoom = 11;
  var coords = [48.876457644366816, 2.3644638061523438];

  if (siteUser == \"BRON\") {
    coords = [45.75, 4.85];
  } else if (siteUser == \"HANNIQUET\") {
    coords = [48.385, 2.951];
    zoom = 10;
  } else if (siteUser == \"GOSNET\") {
    coords = [49.429, 2.08];
    zoom = 9;
  } else if (siteUser == \"LAHALLE\") {
    coords = [48.8, 2.1900052];
    zoom = 12;
  } else if (siteUser == \"VERGNIEUX\") {
    coords = [48.62, 1.7800076];
    zoom = 10;
  } else if (siteUser == \"CHEZE\") {
    coords = [48.5309275, 2.1939081];
    zoom = 10;
  } // if (tabAntennes.includes(siteUser)) {
  //     var tabEditActions = [
  //         LeafletToolbar.ToolbarAction.extend(modifierSecteur()),
  //         LeafletToolbar.ToolbarAction.extend(calculDistanceSecteur())
  //     ];
  // } else {
  //     var tabEditActions = [
  //         LeafletToolbar.EditAction.Popup.Edit,
  //         LeafletToolbar.ToolbarAction.extend(deleteSecteur()),
  //         LeafletToolbar.ToolbarAction.extend(decouperSecteur()),
  //         LeafletToolbar.ToolbarAction.extend(fusionSecteur()),
  //         LeafletToolbar.ToolbarAction.extend(modifierSecteur()),
  //         LeafletToolbar.ToolbarAction.extend(calculDistanceSecteur())
  //     ];
  // }
  // var mapSecto = L.map('sectorisationMap').setView(coords, zoom),
  //     drawnItems = new L.FeatureGroup().addTo(mapSecto),
  //     editActions = tabEditActions;


  var mapSecto = L.map('sectorisationMap').setView(coords, zoom);
  mapSecto.zoomControl._zoomInButton.title = \"Zoom avant\";
  mapSecto.zoomControl._zoomOutButton.title = \"Zoom arrière\";
  var scale = L.control.scale({
    position: 'bottomright'
  }).addTo(mapSecto);
  /*FIN DECLARATION MAP*/

  /*FOND DE CARTE*/

  var glcMapsGGh = L.tileLayer('http://sfcp.frisquet.com/?t={z}/{x}/{y}&th=ggl', {
    maxZoom: 18,
    detectRetina: true,
    attribution: '<a target=\"_blank\" href=\"https://icones8.fr\">Icons8</a>'
  });
  glcMapsGGh.addTo(mapSecto);
  var plan = L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
    attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors | &copy <a target=\"_blank\" href=\"https://icones8.fr\">Icons8</a>'
  });
  var Esri_WorldImagery = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {
    attribution: 'Tiles &copy; Esri | &copy <a target=\"_blank\" href=\"https://icones8.fr\">Icons8</a>'
  });
  var Esri_WorldTopoMap = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', {
    attribution: 'Tiles &copy; Esri | &copy <a target=\"_blank\" href=\"https://icones8.fr\">Icons8</a>'
  });
  var plan2 = L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
    attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors | &copy <a target=\"_blank\" href=\"https://icones8.fr\">Icons8</a>'
  });
  var histoMap = L.map('histoMap').setView(coords, 11);
  histoMap.zoomControl._zoomInButton.title = \"Zoom avant\";
  histoMap.zoomControl._zoomOutButton.title = \"Zoom arrière\";
  plan2.addTo(histoMap);
  var baseLayers = {
    'Google Map': glcMapsGGh,
    'Plan': plan,
    'Satellite': Esri_WorldImagery,
    'Topographique': Esri_WorldTopoMap
  };
  L.control.layers(baseLayers).addTo(mapSecto);
  /*FIN FOND DE CARTE*/

  /*LAYERS*/

  var guideLayers = [];
  var layersAdjacent = new L.FeatureGroup();
  var agentsAdjacent = new L.FeatureGroup();
  var circleGuide = new L.FeatureGroup();
  var antennes = new L.FeatureGroup();
  mapSecto.addLayer(antennes);
  var editableLayers = new L.FeatureGroup();
  mapSecto.addLayer(editableLayers);
  var bigPolygon = new L.FeatureGroup();
  mapSecto.addLayer(bigPolygon);
  var bigPolygonAntennes = new L.FeatureGroup();
  mapSecto.addLayer(bigPolygonAntennes);
  var agentsOfSecteurs = new L.FeatureGroup();
  mapSecto.addLayer(agentsOfSecteurs);
  var histoAgentsOfSecteurs = new L.FeatureGroup();
  histoMap.addLayer(histoAgentsOfSecteurs);
  var agents = new L.FeatureGroup();
  mapSecto.addLayer(agents);
  /*FIN LAYERS*/

  /*CONTROL*/

  if (tabAntennes.includes(siteUser)) {
    var options = {
      position: 'topright',
      draw: {
        polyline: false,
        polygon: false,
        circle: false,
        // Turns off this drawing tool
        rectangle: false,
        marker: false,
        circlemarker: false
      },
      edit: false
    };
  } else {
    var options = {
      position: 'topright',
      draw: {
        polyline: false,
        polygon: {
          shapeOptions: {
            color: '#000',
            opacity: 1,
            weight: 2
          },
          allowIntersection: false,
          // Restricts shapes to simple polygons
          showArea: true,
          drawError: {
            color: 'red',
            // Color the shape will turn when intersects
            message: '<strong>Oh non !<strong> Vous ne pouvez pas tracer ça !' // Message that will show when intersect

          },
          guideLayers: guideLayers
        },
        circle: false,
        // Turns off this drawing tool
        rectangle: false,
        marker: false,
        circlemarker: false
      },
      edit: false
    };
  }

  var drawControl = new L.Control.Draw(options);
  mapSecto.addControl(drawControl);
  mapSecto.addControl(new L.Control.Search({
    url: 'https://nominatim.openstreetmap.org/search?format=json&q={s}',
    textPlaceholder: 'Adresse, ville...',
    textErr: 'Localisation non trouvé',
    jsonpParam: 'json_callback',
    propertyName: 'display_name',
    propertyLoc: ['lat', 'lon'],
    //marker: L.circleMarker([0,0],{radius:30}),
    hideMarkerOnCollapse: true,
    autoCollapse: true,
    autoType: false,
    minLength: 2,
    zoom: 14
  }));
  var customControlUndo = L.Control.extend({
    options: {
      position: 'topleft'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Retour arrière\");
      container.setAttribute('id', \"undo\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_undo_png__WEBPACK_IMPORTED_MODULE_19__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';
      container.style.position = 'relative';
      container.style.display = 'none';

      container.onclick = function () {
        undo();
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlUndo());
  var customControlRefresh = L.Control.extend({
    options: {
      position: 'topleft'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Rafraîchir / Effacer les modifications non enregistrées\");
      container.setAttribute('id', \"refresh\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_refresh_png__WEBPACK_IMPORTED_MODULE_20__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';

      container.onclick = function () {
        refresh('', '', true);
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlRefresh());
  var customControlSave = L.Control.extend({
    options: {
      position: 'topleft'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Sauvegarde des secteurs\");
      container.setAttribute('id', \"save\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_save_png__WEBPACK_IMPORTED_MODULE_14__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\"> <img src=\"' + _images_secto_pastille_png__WEBPACK_IMPORTED_MODULE_21__ + '\" id=\"pastille\" style=\"position: absolute;right:0;bottom: 0;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';
      container.style.position = 'relative';

      container.onclick = function () {
        if (historiqueActions.length > 1) {
          \$('#saveMe #historiqueActions')[0].innerHTML = '';

          for (var i in historiqueActions) {
            if (i > 0) {
              \$('#saveMe #historiqueActions')[0].innerHTML += '<li>' + historiqueActions[i]['texte'] + '</li>';
            }
          }

          \$('#saveModif')[0].disabled = false;
          \$('#deleteModif')[0].disabled = false;
        } else {
          \$('#saveMe #historiqueActions')[0].innerHTML = 'Aucune modification en cours.';
          \$('#saveModif')[0].disabled = true;
          \$('#deleteModif')[0].disabled = true;
        }

        \$('#saveMe').modal('show');
        \$(\"#deleteModif\").off(\"click\");
        \$('#deleteModif').on(\"click\", function (event) {
          \$('#saveMe').modal('hide');
          refresh();
        });
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlSave());

  if (siteUser == 'MEAUX') {
    var customControlSave = L.Control.extend({
      options: {
        position: 'topleft'
      },
      onAdd: function onAdd(mapSecto) {
        var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
        container.setAttribute('title', \"Synchronisation\");
        container.setAttribute('id', \"synchro\");
        container.style.backgroundColor = 'white';
        container.innerHTML = '<img src=\"' + _images_secto_bdd_png__WEBPACK_IMPORTED_MODULE_22__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
        container.style.backgroundSize = \"30px 30px\";
        container.style.width = '30px';
        container.style.height = '30px';
        container.style.position = 'relative';

        container.onclick = function () {
          synchro();
        };

        return container;
      }
    });
    mapSecto.addControl(new customControlSave());
  }

  \$('body').on('submit', 'form#form_save', function (event) {
    var form = \$(this);
    event.preventDefault();

    if (historiqueActions.length > 0) {
      var elements = document.getElementsByClassName('dateMep');
      var same = false;

      for (var i = 0; i < elements.length; i++) {
        if (elements[i].innerHTML == \$('#dateMep').val()) {
          same = true;
          break;
        }
      }

      if (same) {
        \$('#saveMe').modal('hide');
        \$('#alertDate').modal('show');
        \$(\"#confirmEcrase\").off(\"click\");
        \$('#confirmEcrase').on(\"click\", function (event) {
          \$('#alertDate').modal('hide');
          saveVersion();
        });
      } else {
        saveVersion();
      }
    }
  });
  var customControlCreationAssist = L.Control.extend({
    options: {
      position: 'topright'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Création assistée secteur\");
      container.setAttribute('id', \"creationAssist\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_creation_assist_png__WEBPACK_IMPORTED_MODULE_23__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';
      container.style.position = 'relative';

      container.onclick = function () {
        hideFunctions();
        \$('#legende p#texte')[0].innerHTML = \"Sélectionnez deux points non adjacent pour créer un secteur\";
        \$('#explainMe').show();
        assist = true;
        containerClick = true;
        circleGuide = new L.FeatureGroup();
        mapSecto.addLayer(circleGuide);
        eventActif = false;

        for (var j = 0; j < bigPolygon._latlngs.length; j++) {
          for (var k = 0; k < bigPolygon._latlngs[j].length; k++) {
            if (bigPolygon._latlngs[j][k].lat) {
              var marker = new L.Marker(bigPolygon._latlngs[j][k], {
                pos: k,
                icon: markerIcon
              });
              circleGuide.addLayer(marker);
              marker.on(\"click\", function (event) {
                clickMarkerAssist(this);
              });
            } else {
              for (var l = 0; l < bigPolygon._latlngs[j][k].length; l++) {
                var marker = new L.Marker(bigPolygon._latlngs[j][k][l], {
                  pos: l,
                  icon: markerIcon
                });
                circleGuide.addLayer(marker);
                marker.on(\"click\", function (event) {
                  clickMarkerAssist(this);
                });
              }
            }
          }
        }
      };

      return container;
    }
  });

  if (!tabAntennes.includes(siteUser)) {
    mapSecto.addControl(new customControlCreationAssist());
  }

  var customControlNbClients = L.Control.extend({
    options: {
      position: 'topright'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Afficher le nombre de clients par secteurs\");
      container.setAttribute('id', \"nbClients\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_clients30_png__WEBPACK_IMPORTED_MODULE_24__ + '\"  style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';

      container.onclick = function () {
        mapSecto.eachLayer(function (layer) {
          if (layer instanceof L.Polygon) {
            layer.toggleTooltip();
          }
        });
        showTooltip = !showTooltip;
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlNbClients());
  var customControlAgents = L.Control.extend({
    options: {
      position: 'topright'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Afficher les agents\");
      container.setAttribute('id', \"agents\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_agents_png__WEBPACK_IMPORTED_MODULE_25__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';

      container.onclick = function () {
        showAgents = bindElements(showAgents, agents);
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlAgents());
  var customControlAgentsOfSecteurs = L.Control.extend({
    options: {
      position: 'topright'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Afficher l'agent principal des secteurs\");
      container.setAttribute('id', \"principal\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_number_png__WEBPACK_IMPORTED_MODULE_26__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';

      container.onclick = function () {
        showAgentsOfSecteurs = bindElements(showAgentsOfSecteurs, agentsOfSecteurs);
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlAgentsOfSecteurs());
  var customControlDensiteClients = L.Control.extend({
    options: {
      position: 'topright'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Afficher la densité client\");
      container.setAttribute('id', \"densite\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<img src=\"' + _images_secto_densite1_png__WEBPACK_IMPORTED_MODULE_27__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '30px';

      container.onclick = function () {
        showDensite = bindElements(showDensite, densiteClients);
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlDensiteClients());
  var customControlClient = L.Control.extend({
    options: {
      position: 'topright'
    },
    onAdd: function onAdd(mapSecto) {
      var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
      container.setAttribute('title', \"Afficher les clients hors secteurs\");
      container.setAttribute('id', \"clients\");
      container.style.backgroundColor = 'white';
      container.innerHTML = '<div id=\"nbClientHorsSecteur\" class=\"alertes\" style=\"font-size:10px;margin:0px;\">0</div><img src=\"' + _images_secto_clientsOut_png__WEBPACK_IMPORTED_MODULE_28__ + '\" style=\"height: 24px;margin: 1px;cursor: pointer;\">';
      container.style.backgroundSize = \"30px 30px\";
      container.style.width = '30px';
      container.style.height = '45px';

      container.onclick = function () {
        showClients = bindElements(showClients, clientsWithoutSecteur);
      };

      return container;
    }
  });
  mapSecto.addControl(new customControlClient());
  /*FIN CONTROL*/

  initSecto();
  /*TIMELINE*/

  var timelines = \$('.cd-horizontal-timeline'),
      eventsMinDistance = 17;
  timelines.length > 0 && initTimeline(timelines, false);

  function initTimeline(timelines, reload) {
    timelines.each(function () {
      var timeline = \$(this),
          timelineComponents = {}; //cache timeline components

      timelineComponents['timelineWrapper'] = timeline.find('.events-wrapper');
      timelineComponents['eventsWrapper'] = timelineComponents['timelineWrapper'].children('.events');
      timelineComponents['fillingLine'] = timelineComponents['eventsWrapper'].children('.filling-line');
      timelineComponents['timelineEvents'] = timelineComponents['eventsWrapper'].find('li.listeHisto');
      timelineComponents['timelineVersion'] = timelineComponents['eventsWrapper'].find('li.listeHisto.versionActuelle');
      timelineComponents['timelineLinks'] = timelineComponents['eventsWrapper'].find('a');
      timelineComponents['timelineDates'] = timelineComponents['timelineEvents']; //timelineComponents['eventsMinLapse'] = minLapse(timelineComponents['timelineDates']);

      timelineComponents['timelineNavigation'] = timeline.find('.cd-timeline-navigation');
      timelineComponents['eventsContent'] = timeline.children('.events-content'); //assign a left postion to the single events along the timeline

      eventsMinDistance = 250;
      var timelineTotWidth = (timelineComponents['timelineDates'].length + 1) * eventsMinDistance;
      setDatePosition(timelineComponents, eventsMinDistance); //assign a width to the timeline

      setTimelineWidth(timelineComponents, timelineTotWidth); //the timeline has been initialize - show it

      timeline.addClass('loaded');

      if (!reload) {
        var widthTimeline = Number(timelineComponents['timelineWrapper'].css('width').replace('px', ''));
        var middle = widthTimeline / 2;
        var leftVersion = Number(timelineComponents['timelineVersion'].css('left').replace('px', ''));
        var comptDecalage = 0;

        for (i = widthTimeline; i < leftVersion; i += middle) {
          comptDecalage++;
        }

        if (comptDecalage > 0) {
          updateSlide(timelineComponents, timelineTotWidth, 'next', comptDecalage);
        }
      } //detect click on the next arrow


      timelineComponents['timelineNavigation'].on('click', '.next', function (event) {
        event.preventDefault();
        updateSlide(timelineComponents, timelineTotWidth, 'next', 1);
      }); //detect click on the prev arrow

      timelineComponents['timelineNavigation'].on('click', '.prev', function (event) {
        event.preventDefault();
        updateSlide(timelineComponents, timelineTotWidth, 'prev', 1);
      }); //detect click on the a single event - show new event content

      timelineComponents['eventsWrapper'].off(\"click\");
      timelineComponents['eventsWrapper'].on('click', 'a', function (event) {
        event.preventDefault();
        var thisLink = \$(this);
        var version = thisLink[0].id;

        if (historiqueActions.length <= 2) {
          showLoadModal();
          refresh(version, thisLink[0].firstElementChild.innerHTML);
          timelineComponents['timelineLinks'].removeClass('selected');
          thisLink.addClass('selected');
          updateOlderEvents(thisLink);
          updateFilling(thisLink, timelineComponents['fillingLine'], timelineTotWidth);
          updateVisibleContent(thisLink, timelineComponents['eventsContent']);
          hideLoadModal();
        } else {
          \$('#alertVersion').modal('show');
          \$(\"#confirmVersion\").off(\"click\");
          \$('#confirmVersion').on(\"click\", function (event) {
            \$('#alertVersion').modal('hide');
            showLoadModal();
            refresh(version, thisLink[0].firstElementChild.innerHTML);
            timelineComponents['timelineLinks'].removeClass('selected');
            thisLink.addClass('selected');
            updateOlderEvents(thisLink);
            updateFilling(thisLink, timelineComponents['fillingLine'], timelineTotWidth);
            updateVisibleContent(thisLink, timelineComponents['eventsContent']);
            hideLoadModal();
          });
        }
      }); //on swipe, show next/prev event content

      timelineComponents['eventsContent'].on('swipeleft', function () {
        var mq = checkMQ();
        mq == 'mobile' && showNewContent(timelineComponents, timelineTotWidth, 'next');
      });
      timelineComponents['eventsContent'].on('swiperight', function () {
        var mq = checkMQ();
        mq == 'mobile' && showNewContent(timelineComponents, timelineTotWidth, 'prev');
      }); //keyboard navigation

      \$(document).keyup(function (event) {
        if (event.which == '37' && elementInViewport(timeline.get(0))) {
          showNewContent(timelineComponents, timelineTotWidth, 'prev');
        } else if (event.which == '39' && elementInViewport(timeline.get(0))) {
          showNewContent(timelineComponents, timelineTotWidth, 'next');
        }
      });
    });
  }

  function updateSlide(timelineComponents, timelineTotWidth, string, decalage) {
    //retrieve translateX value of timelineComponents['eventsWrapper']
    var translateValue = getTranslateValue(timelineComponents['eventsWrapper']),
        wrapperWidth = Number(timelineComponents['timelineWrapper'].css('width').replace('px', '')); //translate the timeline to the left('next')/right('prev')

    string == 'next' ? translateTimeline(timelineComponents, (translateValue - wrapperWidth + eventsMinDistance) * decalage, wrapperWidth - timelineTotWidth) : translateTimeline(timelineComponents, translateValue + wrapperWidth - eventsMinDistance);
  }

  function showNewContent(timelineComponents, timelineTotWidth, string) {
    //go from one event to the next/previous one
    var visibleContent = timelineComponents['eventsContent'].find('.selected'),
        newContent = string == 'next' ? visibleContent.next() : visibleContent.prev();

    if (newContent.length > 0) {
      //if there's a next/prev event - show it
      var selectedDate = timelineComponents['eventsWrapper'].find('.selected'),
          newEvent = string == 'next' ? selectedDate.parent('li').next('li').children('a') : selectedDate.parent('li').prev('li').children('a');
      updateFilling(newEvent, timelineComponents['fillingLine'], timelineTotWidth);
      updateVisibleContent(newEvent, timelineComponents['eventsContent']);
      newEvent.addClass('selected');
      selectedDate.removeClass('selected');
      updateOlderEvents(newEvent);
      updateTimelinePosition(string, newEvent, timelineComponents, timelineTotWidth);
    }
  }

  function updateTimelinePosition(string, event, timelineComponents, timelineTotWidth) {
    //translate timeline to the left/right according to the position of the selected event
    var eventStyle = window.getComputedStyle(event.get(0), null),
        eventLeft = Number(eventStyle.getPropertyValue(\"left\").replace('px', '')),
        timelineWidth = Number(timelineComponents['timelineWrapper'].css('width').replace('px', '')),
        timelineTotWidth = Number(timelineComponents['eventsWrapper'].css('width').replace('px', ''));
    var timelineTranslate = getTranslateValue(timelineComponents['eventsWrapper']);

    if (string == 'next' && eventLeft > timelineWidth - timelineTranslate || string == 'prev' && eventLeft < -timelineTranslate) {
      translateTimeline(timelineComponents, -eventLeft + timelineWidth / 2, timelineWidth - timelineTotWidth);
    }
  }

  function translateTimeline(timelineComponents, value, totWidth) {
    var eventsWrapper = timelineComponents['eventsWrapper'].get(0);
    value = value > 0 ? 0 : value; //only negative translate value

    value = !(typeof totWidth === 'undefined') && value < totWidth ? totWidth : value; //do not translate more than timeline width

    setTransformValue(eventsWrapper, 'translateX', value + 'px'); //update navigation arrows visibility

    value == 0 ? timelineComponents['timelineNavigation'].find('.prev').addClass('inactive') : timelineComponents['timelineNavigation'].find('.prev').removeClass('inactive');
    value == totWidth ? timelineComponents['timelineNavigation'].find('.next').addClass('inactive') : timelineComponents['timelineNavigation'].find('.next').removeClass('inactive');
  }

  function updateFilling(selectedEvent, filling, totWidth) {
    //change .filling-line length according to the selected event
    var eventStyle = window.getComputedStyle(selectedEvent.get(0), null),
        eventLeft = eventStyle.getPropertyValue(\"left\"),
        eventWidth = eventStyle.getPropertyValue(\"width\");
    eventLeft = Number(eventLeft.replace('%', '')) + Number(eventWidth.replace('%', '')) / 2;
    var scaleValue = eventLeft / totWidth;
    setTransformValue(filling.get(0), 'scaleX', scaleValue);
  }

  function setDatePosition(timelineComponents, min) {
    for (i = 0; i < timelineComponents['timelineDates'].length; i++) {
      timelineComponents['timelineEvents'].eq(i).css('left', i * min + 'px');
    }
  }

  function setTimelineWidth(timelineComponents, totalWidth) {
    timelineComponents['eventsWrapper'].css('width', totalWidth + 'px');
    updateFilling(timelineComponents['timelineEvents'].eq(0), timelineComponents['fillingLine'], totalWidth);
  }

  function updateVisibleContent(event, eventsContent) {
    var eventDate = event.data('date'),
        visibleContent = eventsContent.find('.selected'),
        selectedContent = eventsContent.find('[data-date=\"' + eventDate + '\"]'),
        selectedContentHeight = selectedContent.height();

    if (selectedContent.index() > visibleContent.index()) {
      var classEnetering = 'selected enter-right',
          classLeaving = 'leave-left';
    } else {
      var classEnetering = 'selected enter-left',
          classLeaving = 'leave-right';
    }

    selectedContent.attr('class', classEnetering);
    visibleContent.attr('class', classLeaving).one('webkitAnimationEnd oanimationend msAnimationEnd animationend', function () {
      visibleContent.removeClass('leave-right leave-left');
      selectedContent.removeClass('enter-left enter-right');
    });
    eventsContent.css('height', selectedContentHeight + 'px');
  }

  function updateOlderEvents(event) {
    event.parent('li').prevAll('li').children('a').addClass('older-event').end().end().nextAll('li').children('a').removeClass('older-event');
  }

  function getTranslateValue(timeline) {
    var timelineStyle = window.getComputedStyle(timeline.get(0), null),
        timelineTranslate = timelineStyle.getPropertyValue(\"-webkit-transform\") || timelineStyle.getPropertyValue(\"-moz-transform\") || timelineStyle.getPropertyValue(\"-ms-transform\") || timelineStyle.getPropertyValue(\"-o-transform\") || timelineStyle.getPropertyValue(\"transform\");

    if (timelineTranslate.indexOf('(') >= 0) {
      var timelineTranslate = timelineTranslate.split('(')[1];
      timelineTranslate = timelineTranslate.split(')')[0];
      timelineTranslate = timelineTranslate.split(',');
      var translateValue = timelineTranslate[4];
    } else {
      var translateValue = 0;
    }

    return Number(translateValue);
  }

  function setTransformValue(element, property, value) {
    element.style[\"-webkit-transform\"] = property + \"(\" + value + \")\";
    element.style[\"-moz-transform\"] = property + \"(\" + value + \")\";
    element.style[\"-ms-transform\"] = property + \"(\" + value + \")\";
    element.style[\"-o-transform\"] = property + \"(\" + value + \")\";
    element.style[\"transform\"] = property + \"(\" + value + \")\";
  } //based on http://stackoverflow.com/questions/542938/how-do-i-get-the-number-of-days-between-two-dates-in-javascript


  function parseDate(events) {
    var dateArrays = [];
    events.each(function () {
      var dateComp = \$(this).data('date').split('/'),
          newDate = new Date(dateComp[2], dateComp[1] - 1, dateComp[0]);
      dateArrays.push(newDate);
    });
    return dateArrays;
  }

  function parseDate2(events) {
    var dateArrays = [];
    events.each(function () {
      var singleDate = \$(this),
          dateComp = singleDate.data('date').split('T');

      if (dateComp.length > 1) {
        //both DD/MM/YEAR and time are provided
        var dayComp = dateComp[0].split('/'),
            timeComp = dateComp[1].split(':');
      } else if (dateComp[0].indexOf(':') >= 0) {
        //only time is provide
        var dayComp = [\"2000\", \"0\", \"0\"],
            timeComp = dateComp[0].split(':');
      } else {
        //only DD/MM/YEAR
        var dayComp = dateComp[0].split('/'),
            timeComp = [\"0\", \"0\"];
      }

      var newDate = new Date(dayComp[2], dayComp[1] - 1, dayComp[0], timeComp[0], timeComp[1]);
      dateArrays.push(newDate);
    });
    return dateArrays;
  }

  function daydiff(first, second) {
    return Math.round(second - first);
  }

  function minLapse(dates) {
    //determine the minimum distance among events
    var dateDistances = [];

    for (i = 1; i < dates.length; i++) {
      var distance = daydiff(dates[i - 1], dates[i]);
      dateDistances.push(distance);
    }

    return Math.min.apply(null, dateDistances);
  }
  /*
      How to tell if a DOM element is visible in the current viewport?
      http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport
  */


  function elementInViewport(el) {
    var top = el.offsetTop;
    var left = el.offsetLeft;
    var width = el.offsetWidth;
    var height = el.offsetHeight;

    while (el.offsetParent) {
      el = el.offsetParent;
      top += el.offsetTop;
      left += el.offsetLeft;
    }

    return top < window.pageYOffset + window.innerHeight && left < window.pageXOffset + window.innerWidth && top + height > window.pageYOffset && left + width > window.pageXOffset;
  }

  function checkMQ() {
    //check if mobile or desktop device
    return window.getComputedStyle(document.querySelector('.cd-horizontal-timeline'), '::before').getPropertyValue('content').replace(/'/g, \"\").replace(/\"/g, \"\");
  }
  /*FIN TIMELINE*/

  /*FONCTIONS BOOSTRAP TABLE*/


  function totalFormatter(data) {
    var field = this.field;
    return data.map(function (row) {
      return +row[field];
    }).reduce(function (sum, i) {
      return sum + i;
    }, 0);
  }

  function footerStyle(row, index) {
    return {
      css: {
        \"text-align\": \"center\"
      }
    };
  }

  ;
  /*FIN FONCTIONS BOOSTRAP TABLE*/

  /*FONCTIONS*/

  function initSecto(version, dateMep, viaButton) {
    //showLoadModal();
    // if (version == undefined || version == '') {
    //     //getBigPolygon('base'); //permet d'avoir les contours noirs des polygons des secteurs et non gris.
    // }
    //
    // var initHistoPolygon = false;
    // if (histoPolygon == '') {
    //     initHistoPolygon = true;
    // }
    \$.ajax({
      method: \"POST\",
      dataType: \"json\",
      url: \"/map/get_secteurs\",
      data: JSON.stringify({
        version: version
      }),
      success: function success(result) {
        // result = JSON.parse(result);
        // var secteurs = JSON.parse(result['secteurs']);
        var secteurs = result; //lastId = result['lastId'];

        var latLong = [];
        var count = 0;
        secteurs.forEach(function (secteur) {
          if (secteur.coordonnees.type == \"Polygon\") {
            secteur.coordonnees.coordinates[0].forEach(function (locationArray) {
              latLong.push([locationArray[1], locationArray[0]]);
            });
            var polygon = L.polygon(latLong, {// id: currentFeature.idPolygon, //pour l'enregistrement
              // nbClients: currentFeature.nbClients,
              // famille0: currentFeature.famille0,
              // famille1: currentFeature.famille1,
              // famille2: currentFeature.famille2,
              // famille3: currentFeature.famille3,
              // nomSecteur: currentFeature.nomSecteur,
              // codeAgent: currentFeature.codeAgent,
              // suppleant1: currentFeature.suppleant1,
              // suppleant2: currentFeature.suppleant2,
              // suppleant3: currentFeature.suppleant3,
              // suppleant4: currentFeature.suppleant4,
              // site: currentFeature.site,
              // codeGroupe: currentFeature.codeGroupe,
            }).addTo(mapSecto);
            var withoutAgent = true;
            secteur.agentSecteurs.some(function (agent) {
              if (agent.rang_tri == 1) {
                if (!colors[agent.utilisateur_agent.groupe_affectation]) {
                  colors[agent.utilisateur_agent.groupe_affectation] = tabColor[count];
                  count += 1;
                }

                polygon.setStyle(getStyle(agent.utilisateur_agent.groupe_affectation));
                withoutAgent = false;
                var circle = new L.CircleMarker(polygon.getCenter(), {
                  radius: 0.1,
                  opacity: 0,
                  codeAgent: agent.utilisateur_agent.initiales
                }).bindTooltip('' + agent.utilisateur_agent.initiales, {
                  permanent: true,
                  direction: \"center\",
                  className: \"my-labels\"
                });
                agentsOfSecteurs.addLayer(circle);
                return true;
              }
            });

            if (withoutAgent) {
              polygon.setStyle(getStyle(''));
            }

            bindTooltipNbClients(secteur, polygon); // if (initHistoPolygon) {
            //     histoPolygon = L.polygon(latLong).addTo(histoMap);
            // }
            // if (currentFeature.codeAgent == '') { //faire ressortir les secteurs sans agents principal
            //     polygon.setStyle(getStyle(''));
            //     // if (initHistoPolygon) {
            //     //     histoPolygon.setStyle(getStyle(''));
            //     // }
            // } else {
            //     polygon.setStyle(getStyle(currentFeature.codeGroupe));
            //     // if (initHistoPolygon) {
            //     //     histoPolygon.setStyle(getStyle(currentFeature.codeGroupe));
            //     // }
            // }
            // if (!secteursByResponsable[currentFeature.codeGroupe]) {
            //     secteursByResponsable[currentFeature.codeGroupe] = [];
            // }
            // if (!secteursByResponsable[currentFeature.codeGroupe][currentFeature.codeAgent]) {
            //     secteursByResponsable[currentFeature.codeGroupe][currentFeature.codeAgent] = [];
            // }
            // secteursByResponsable[currentFeature.codeGroupe][currentFeature.codeAgent][currentFeature.idPolygon] = polygon.toGeoJSON();
            // editableLayers.addLayer(polygon);
            //
            // if (currentFeature && currentFeature.codeAgent) {
            //     var circle = new L.CircleMarker(polygon.getCenter(), {
            //         radius: 0.1,
            //         opacity: 0,
            //         codeAgent: currentFeature.codeAgent
            //     }).bindTooltip('' + currentFeature.codeAgent, {
            //         permanent: true,
            //         direction: \"center\",
            //         className: \"my-labels\"
            //     });
            //     agentsOfSecteurs.addLayer(circle);
            //
            //     if (initHistoPolygon) {
            //         var histoCircle = new L.CircleMarker(histoPolygon.getCenter(), {
            //             radius: 0.1,
            //             opacity: 0,
            //             codeAgent: currentFeature.codeAgent
            //         }).bindTooltip('' + currentFeature.codeAgent, {
            //             permanent: true,
            //             direction: \"center\",
            //             className: \"my-labels\"
            //         });
            //         histoAgentsOfSecteurs.addLayer(histoCircle);
            //     }
            // }

            latLong = [];
            initEvenementLayer(polygon);
          }
        }); //addHisto('Initialisation');
        // getDensite(version, true, dateMep);
        // if (viaButton) {
        //     \$('.events')[0].innerHTML = result.timeline;
        //     initTimeline(timelines, true);
        // }
        // calculNbClients();
      }
    });
    getAgents();
  }

  function getAgents() {
    \$.ajax({
      dataType: \"json\",
      url: \"/agents/domicile\",
      success: function success(data) {
        console.info(data); //geojsonAgents = JSON.parse(data);

        data.forEach(function (agent) {
          var point = [0, 0];

          if (agent.coordonnees != null) {
            point = [agent.coordonnees.latitude, agent.coordonnees.longitude];
          }

          var marker = L.marker(point, {
            radius: 6,
            fillColor: \"#28529a\",
            color: \"#fff\",
            weight: 1,
            opacity: 1,
            fillOpacity: 1,
            // codeAgent: agent.properties.codeAgent,
            // codeGroupe: feature.properties.codeGroupe,
            // detailAgent: feature.properties.popupContent,
            icon: circleIcon
          }).addTo(mapSecto);
          marker.bindPopup(agent.nomComplet);
          agents.addLayer(marker);
        }); // agents = L.geoJSON(data, {
        //     pointToLayer: function (feature, latlng) {
        //         return L.marker(latlng, {
        //             radius: 6,
        //             fillColor: \"#28529a\",
        //             color: \"#fff\",
        //             weight: 1,
        //             opacity: 1,
        //             fillOpacity: 1,
        //             codeAgent: feature.properties.codeAgent,
        //             codeGroupe: feature.properties.codeGroupe,
        //             detailAgent: feature.properties.popupContent,
        //             icon: circleIcon
        //         });
        //     },
        //     onEachFeature: function (feature, layer) {
        //         if (feature.properties && feature.properties.popupContent) {
        //             layer.bindPopup(feature.properties.popupContent);
        //         }
        //     }
        // }).addTo(map);
      }
    });
  }

  function getBigPolygon(type, version) {
    // if (!version) {
    //     var json = '{\"type\": \"FeatureCollection\",\"features\": [';
    //     var features = \"\";
    //     map.eachLayer(function (layer) {
    //         if (layer.options && layer.options.id) {
    //             features += JSON.stringify(layerToJSON(layer)) + \",\";
    //         }
    //     });
    //     version = json + features.slice(0, -1) + ']}';
    // }
    \$.ajax({
      method: 'POST',
      dataType: \"json\",
      url: \"{{ path('get_big_polygon') }}\",
      data: JSON.stringify({
        type: type,
        secteurs: version
      }),
      success: function success(data) {
        data = JSON.parse(data);
        bigPolygon = L.GeoJSON.geometryToLayer(JSON.parse(data.bigPolygon), options.pointToLayer, options.coordsToLatLng);
        guideLayers.splice(0, guideLayers.length);
        guideLayers.push(bigPolygon);

        if (data.bigPolygonAntennes != '') {
          map.removeLayer(antennesGlobal);
          map.removeLayer(antennes);
          antennesGlobal = new L.FeatureGroup();
          antennes = new L.FeatureGroup();
          bigPolygonAntennes = L.GeoJSON.geometryToLayer(JSON.parse(data.bigPolygonAntennes), options.pointToLayer, options.coordsToLatLng);
          guideLayers.push(bigPolygonAntennes);

          for (var i = 0; i < data.antennes.length; i++) {
            antennes.addLayer(L.GeoJSON.geometryToLayer(JSON.parse(data.antennes[i]['secteur'])), options.pointToLayer, options.coordsToLatLng);
          }

          antennesGlobal.addLayer(bigPolygonAntennes);
          antennesGlobal.addTo(map);
          antennes.addTo(map);
          antennes.eachLayer(function (layer) {
            layer.options.antenne = true, layer.setStyle({
              opacity: '0',
              fillOpacity: '0'
            });
          });
          antennesGlobal.eachLayer(function (layer) {
            layer.setStyle({
              color: 'gray',
              weight: 2,
              fillColor: 'gray',
              className: 'polygonAntennes'
            });
          }); //pour passer les antennes au second plan et ne pas bloquer l'action du clic sur un secteur

          var svg = document.querySelector(\"svg.leaflet-zoom-animated g\"); //var pathAntennes = document.querySelector(\".polygonAntennes\");

          var pathAntennes = document.getElementsByClassName(\"polygonAntennes\");

          for (var i = 0; i < pathAntennes.length; i++) {
            svg.removeChild(pathAntennes[i]);
            svg.prepend(pathAntennes[i]);
          }
        } // if (agents == '') {
        //     getAgents();
        // }
        // if (type == 'local') {
        //     hideLoadModal();
        // }

      }
    });
  }

  function getStyle(codeGroupe) {
    var options = {
      fillOpacity: 0.2,
      color: colorWithoutAgent,
      weight: 2,
      fillColor: fillColorWithoutAgent
    };

    if (codeGroupe != '') {
      options = {
        fillOpacity: 0.2,
        color: colorWithAgent,
        weight: 2,
        fillColor: colors[codeGroupe]
      };
    }

    return options;
  }

  function bindTooltipNbClients(secteur, polygon) {
    polygon.bindTooltip(secteur.nbEquipement.nb_total + \" clients\", {
      permanent: true,
      direction: \"center\"
    }).closeTooltip(); // var countClients = getCountClients(options);
    // if (countClients != 0) {
    //     layer.bindTooltip(countClients + \" clients\",
    //         {permanent: true, direction: \"center\"}
    //     ).closeTooltip();
    // } else {
    //     layer.bindTooltip(options['nbClients'] + \" clients\",
    //         {permanent: true, direction: \"center\"}
    //     ).closeTooltip();
    // }
  }

  function initEvenementLayer(polygon) {
    // polygon.on('click', function (event) {
    //     if (\$('#explainMe').hasClass('distance')) {
    //         \$('#explainMe').hide();
    //         \$('#explainMe').removeClass('distance');
    //     }
    //     map.eachLayer(function (layer) {
    //         if (layer instanceof L.Polygon) {
    //             if (layer.options && layer.options.id != polygon.options.id) {
    //                 layer.options.openToolbar = false;
    //             }
    //             if(!layer.options.antenne) {
    //                 layer.setStyle({fillOpacity: '0.2', fill: 'url()'});
    //             }
    //         }
    //     });
    //     agents.eachLayer(function (layer) {
    //         layer.setIcon(circleIcon);
    //     });
    //     console.info('popup');
    //     if (polygon.options && !polygon.options.openToolbar) {
    //         if (!fusion) {
    //             polygon.setStyle({fillOpacity: '0.6'});
    //             new LeafletToolbar.EditToolbar.Popup(event.latlng, {
    //                 actions: editActions
    //             }).addTo(map, polygon);
    //             polygon.options.openToolbar = true;
    //             \$('#legende p#texte')[0].innerHTML = (polygon.options.nomSecteur ? polygon.options.nomSecteur : 'Secteur ' + polygon.options.id) + \"<br/>\";
    //             \$('#legende p#texte')[0].innerHTML += 'La superficie du secteur est : ' + L.GeometryUtil.readableArea(L.GeometryUtil.geodesicArea(polygon.getLatLngs()[0]), 'km') + '.<br/>';
    //             if (polygon.options.codeAgent) {
    //                 agents.eachLayer(function (layer) {
    //                     if (layer.options.codeAgent == polygon.options.suppleant1 || layer.options.codeAgent == polygon.options.suppleant2 || layer.options.codeAgent == polygon.options.suppleant3 || layer.options.codeAgent == polygon.options.suppleant4) {
    //                         //layer.setStyle({fillColor: '#666'});
    //                     }
    //                     if (layer.options.codeAgent == polygon.options.codeAgent) {
    //                         layer.setIcon(homeIcon);
    //                         // \$('#legende p#texte')[0].innerHTML += 'Il y a ' + (Math.round(polygon.getBounds().getCenter().distanceTo(layer.getLatLng())) / 1000) + ' Kms entre l\\'agent ' + polygon.options.codeAgent + ' et le centre du secteur ' + polygon.options.id + '.';
    //                         Gp.Services.route({
    //                             startPoint: {
    //                                 x: polygon.getBounds().getCenter().lng,
    //                                 y: polygon.getBounds().getCenter().lat
    //                             },
    //                             endPoint: {
    //                                 x: layer.getLatLng().lng,
    //                                 y: layer.getLatLng().lat
    //                             },
    //                             graph: 'Voiture',
    //                             avoidFeature: [],
    //                             routePreference: 'fastest',
    //                             apiKey: \"choisirgeoportail\",
    //                             onSuccess: function (result) {
    //                                 \$('#legende p#texte')[0].innerHTML += 'Il y a ' + result['totalDistance'] + 's entre l\\'agent ' + polygon.options.codeAgent + ' et le centre du secteur ' + polygon.options.id + '.';
    //
    //                             },
    //                             onFailure: function (error) {
    //                                 console.info(error);
    //                             }
    //                         });
    //                     }
    //                 });
    //             }
    //             \$('#explainMe').addClass('distance');
    //             \$('#explainMe').show();
    //         }
    //     } else {
    //         if (map._toolbars && map._toolbars[4]) {
    //             map.removeLayer(map._layers[map._toolbars[4]._leaflet_id]);
    //         }
    //         polygon.options.openToolbar = false;
    //     }
    // });
    //
    // // \$(\"body\").on('click',\"#table_clients tr\", function () {
    // polygon.on('draw-popup:edited', function (e) {
    //     hideFunctions();
    //     modification = true;
    //     drawPopupEdited(this);
    // });
    //
    // polygon.on('editstart', function (e) {
    //     console.info('editstart');
    //     console.info(e);
    // });
    // polygon.on('editstop', function (e) {
    //     showFunctions();
    //     modification = false;
    //     console.info('editstop');
    //     addHisto('Le secteur ' + (this.options.nomSecteur ? this.options.nomSecteur : this.options.id) + ' a été modifié.');
    //     getBigPolygon('local');
    //
    //     //initAgentsOfSecteurs('');
    // });
    polygon.on('mouseover mouseout', function (e) {
      polygon.toggleTooltip();
    });
  }

  function bindElements(flag, layers) {
    if (flag) {
      mapSecto.removeLayer(layers);
    } else {
      mapSecto.addLayer(layers);
    }

    return !flag;
  } // function getCountClients(options) {
  //     var fields = ['famille0', 'famille1', 'famille2', 'famille3'];
  //     var filtreFamille = \$('#table_clients').bootstrapTable('getVisibleColumns').map(function (it) {
  //         return it.field;
  //     });
  //     var countClients = 0;
  //     for (var i in filtreFamille) {
  //         if (fields.indexOf(filtreFamille[i]) != -1) {
  //             countClients += parseInt(options[filtreFamille[i]]);
  //         }
  //     }
  //     return countClients;
  // }

  /*FIN FONCTIONS*/

});

/***/ }),

/***/ \"./assets/styles/sectorisation.css\":
/*!*****************************************!*\\
  !*** ./assets/styles/sectorisation.css ***!
  \\*****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

\"use strict\";
__webpack_require__.r(__webpack_exports__);
// extracted by mini-css-extract-plugin


/***/ }),

/***/ \"./assets/styles/timeline.css\":
/*!************************************!*\\
  !*** ./assets/styles/timeline.css ***!
  \\************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

\"use strict\";
__webpack_require__.r(__webpack_exports__);
// extracted by mini-css-extract-plugin


/***/ })

},
/******/ __webpack_require__ => { // webpackRuntimeModules
/******/ \"use strict\";
/******/ 
/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
/******/ __webpack_require__.O(0, [\"vendors-node_modules_core-js_internals_engine-user-agent_js-node_modules_core-js_internals_ex-b41e05\",\"vendors-node_modules_jquery_dist_jquery_js\",\"vendors-node_modules_core-js_internals_add-to-unscopables_js-node_modules_core-js_internals_a-5c631b\",\"vendors-node_modules_core-js_internals_array-method-has-species-support_js-node_modules_core--4e4faa\",\"vendors-node_modules_core-js_internals_function-bind_js-node_modules_core-js_modules_es_array-1797b9\",\"vendors-node_modules_bootstrap-table_dist_bootstrap-table-locale-all_min_js-node_modules_boot-3f0fd0\"], () => (__webpack_exec__(\"./assets/js/sectorisation.js\")));
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvanMvbWFwL2xlYWZsZXQtc2VhcmNoLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9qcy9tYXAvbGVhZmxldC5kcmF3LWN1c3RvbS5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvanMvc2VjdG9yaXNhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3R5bGVzL3NlY3RvcmlzYXRpb24uY3NzP2E1NTgiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3N0eWxlcy90aW1lbGluZS5jc3M/Y2Q3ZiJdLCJuYW1lcyI6WyJmYWN0b3J5IiwiZGVmaW5lIiwiTCIsIkNvbnRyb2wiLCJTZWFyY2giLCJleHRlbmQiLCJpbmNsdWRlcyIsInZlcnNpb24iLCJFdmVudGVkIiwicHJvdG90eXBlIiwiTWl4aW4iLCJFdmVudHMiLCJvcHRpb25zIiwidXJsIiwibGF5ZXIiLCJzb3VyY2VEYXRhIiwianNvbnBQYXJhbSIsInByb3BlcnR5TG9jIiwicHJvcGVydHlOYW1lIiwiZm9ybWF0RGF0YSIsImZpbHRlckRhdGEiLCJtb3ZlVG9Mb2NhdGlvbiIsImJ1aWxkVGlwIiwiY29udGFpbmVyIiwiem9vbSIsIm1pbkxlbmd0aCIsImluaXRpYWwiLCJjYXNlc2Vuc2l0aXZlIiwiYXV0b1R5cGUiLCJkZWxheVR5cGUiLCJ0b29sdGlwTGltaXQiLCJ0aXBBdXRvU3VibWl0IiwiZmlyc3RUaXBTdWJtaXQiLCJhdXRvUmVzaXplIiwiY29sbGFwc2VkIiwiYXV0b0NvbGxhcHNlIiwiYXV0b0NvbGxhcHNlVGltZSIsInRleHRFcnIiLCJ0ZXh0Q2FuY2VsIiwidGV4dFBsYWNlaG9sZGVyIiwiaGlkZU1hcmtlck9uQ29sbGFwc2UiLCJwb3NpdGlvbiIsIm1hcmtlciIsImljb24iLCJhbmltYXRlIiwiY2lyY2xlIiwicmFkaXVzIiwid2VpZ2h0IiwiY29sb3IiLCJzdHJva2UiLCJmaWxsIiwiX2dldFBhdGgiLCJvYmoiLCJwcm9wIiwicGFydHMiLCJzcGxpdCIsImxhc3QiLCJwb3AiLCJsZW4iLCJsZW5ndGgiLCJjdXIiLCJpIiwiX2lzT2JqZWN0IiwiT2JqZWN0IiwidG9TdHJpbmciLCJjYWxsIiwiaW5pdGlhbGl6ZSIsIlV0aWwiLCJzZXRPcHRpb25zIiwiX2lucHV0TWluU2l6ZSIsIl9sYXllciIsIkxheWVyR3JvdXAiLCJfZmlsdGVyRGF0YSIsIl9kZWZhdWx0RmlsdGVyRGF0YSIsIl9mb3JtYXREYXRhIiwiX2RlZmF1bHRGb3JtYXREYXRhIiwiX21vdmVUb0xvY2F0aW9uIiwiX2RlZmF1bHRNb3ZlVG9Mb2NhdGlvbiIsIl9hdXRvVHlwZVRtcCIsIl9jb3VudGVydGlwcyIsIl9yZWNvcmRzQ2FjaGUiLCJfY3VyUmVxIiwib25BZGQiLCJtYXAiLCJfbWFwIiwiX2NvbnRhaW5lciIsIkRvbVV0aWwiLCJjcmVhdGUiLCJfaW5wdXQiLCJfY3JlYXRlSW5wdXQiLCJfdG9vbHRpcCIsIl9jcmVhdGVUb29sdGlwIiwiX2NhbmNlbCIsIl9jcmVhdGVDYW5jZWwiLCJfYnV0dG9uIiwiX2NyZWF0ZUJ1dHRvbiIsIl9hbGVydCIsIl9jcmVhdGVBbGVydCIsImV4cGFuZCIsIk1hcmtlciIsIkNpcmNsZU1hcmtlciIsIl9tYXJrZXJTZWFyY2giLCJfaXNNYXJrZXJTZWFyY2giLCJzZXRMYXllciIsIm9uIiwiX2hhbmRsZUF1dG9yZXNpemUiLCJhZGRUbyIsIl93cmFwcGVyIiwiZ2V0Iiwic3R5bGUiLCJhcHBlbmRDaGlsZCIsIm9uUmVtb3ZlIiwib2ZmIiwic2hvd0FsZXJ0IiwidGV4dCIsInNlbGYiLCJkaXNwbGF5IiwiaW5uZXJIVE1MIiwiY2xlYXJUaW1lb3V0IiwidGltZXJBbGVydCIsInNldFRpbWVvdXQiLCJoaWRlQWxlcnQiLCJjYW5jZWwiLCJ2YWx1ZSIsIl9oYW5kbGVLZXlwcmVzcyIsImtleUNvZGUiLCJzaXplIiwiZm9jdXMiLCJfaGlkZVRvb2x0aXAiLCJmaXJlIiwidG9nZ2xlIiwiYWRkQ2xhc3MiLCJjb2xsYXBzZSIsImJsdXIiLCJyZW1vdmVDbGFzcyIsInJlbW92ZUxheWVyIiwiY29sbGFwc2VEZWxheWVkIiwidGltZXJDb2xsYXBzZSIsImNvbGxhcHNlRGVsYXllZFN0b3AiLCJjbGFzc05hbWUiLCJhbGVydCIsIkRvbUV2ZW50Iiwic3RvcCIsImxhYmVsIiwiaW5wdXQiLCJ0eXBlIiwiYXV0b2NvbXBsZXRlIiwiYXV0b2NvcnJlY3QiLCJhdXRvY2FwaXRhbGl6ZSIsInBsYWNlaG9sZGVyIiwicm9sZSIsImlkIiwiaHRtbEZvciIsImRpc2FibGVDbGlja1Byb3BhZ2F0aW9uIiwiZSIsInRpdGxlIiwiaHJlZiIsImJ1dHRvbiIsIl9oYW5kbGVTdWJtaXQiLCJ0b29sIiwic3RvcFByb3BhZ2F0aW9uIiwiX2NyZWF0ZVRpcCIsInZhbCIsInRpcCIsInRtcE5vZGUiLCJmaXJzdENoaWxkIiwiX3RleHQiLCJfZ2V0VXJsIiwicmVjb3JkcyIsIkkiLCJpY2FzZSIsInJlZ1NlYXJjaCIsImZyZWNvcmRzIiwicmVwbGFjZSIsInVuZGVmaW5lZCIsIlJlZ0V4cCIsImtleSIsInRlc3QiLCJzaG93VG9vbHRpcCIsImN1cnJlbnRTZWxlY3Rpb24iLCJfYXV0b1R5cGUiLCJzY3JvbGxUb3AiLCJqc29uIiwicHJvcE5hbWUiLCJwcm9wTG9jIiwianNvbnJldCIsImlzQXJyYXkiLCJsYXRMbmciLCJfcmVjb3Jkc0Zyb21Kc29ucCIsImNhbGxBZnRlciIsImNhbGxKc29ucCIsInNjcmlwdCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJ0ZW1wbGF0ZSIsInMiLCJzcmMiLCJhYm9ydCIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsIl9yZWNvcmRzRnJvbUFqYXgiLCJ3aW5kb3ciLCJYTUxIdHRwUmVxdWVzdCIsIkFjdGl2ZVhPYmplY3QiLCJlMSIsImUyIiwiRXJyb3IiLCJJRThvcjkiLCJCcm93c2VyIiwiaWUiLCJhdG9iIiwicXVlcnlTZWxlY3RvciIsInJlcXVlc3QiLCJYRG9tYWluUmVxdWVzdCIsIm9wZW4iLCJvbmxvYWQiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwic3RhdHVzIiwic2VuZCIsIl9zZWFyY2hJbkxheWVyIiwicmV0UmVjb3JkcyIsImxvYyIsImdldExhdExuZyIsImZlYXR1cmUiLCJwcm9wZXJ0aWVzIiwiY29uc29sZSIsIndhcm4iLCJQYXRoIiwiUG9seWxpbmUiLCJQb2x5Z29uIiwiZ2V0Qm91bmRzIiwiZ2V0Q2VudGVyIiwiaGFzT3duUHJvcGVydHkiLCJlYWNoTGF5ZXIiLCJfcmVjb3Jkc0Zyb21MYXllciIsInN0YXJ0IiwiZmlyc3RSZWNvcmQiLCJlbmQiLCJpbmRleE9mIiwiY3JlYXRlVGV4dFJhbmdlIiwic2VsUmFuZ2UiLCJtb3ZlU3RhcnQiLCJtb3ZlRW5kIiwic2VsZWN0Iiwic2V0U2VsZWN0aW9uUmFuZ2UiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsIl9oaWRlQXV0b1R5cGUiLCJzZWwiLCJzZWxlY3Rpb24iLCJlbXB0eSIsImdldFNlbGVjdGlvbiIsInJlbW92ZUFsbFJhbmdlcyIsIl9oYW5kbGVBcnJvd1NlbGVjdCIsInRpbWVyS2V5cHJlc3MiLCJfZmlsbFJlY29yZHNDYWNoZSIsInNlYXJjaFRleHQiLCJjb2RlIiwiY2hhckNvZGVBdCIsImlucHV0VGV4dCIsIl9yZXRyaWV2ZURhdGEiLCJkYXRhIiwibWF4V2lkdGgiLCJvZmZzZXRXaWR0aCIsImNsaWVudFdpZHRoIiwidmVsb2NpdHkiLCJzZWFyY2hUaXBzIiwiaGFzQ2hpbGROb2RlcyIsImNoaWxkTm9kZXMiLCJ0aXBPZmZzZXRUb3AiLCJvZmZzZXRUb3AiLCJjbGllbnRIZWlnaHQiLCJfZ2V0TG9jYXRpb24iLCJzaG93TG9jYXRpb24iLCJsYXRsbmciLCJzZXRWaWV3IiwicGFuVG8iLCJvbmNlIiwic2V0TGF0TG5nIiwiSWNvbiIsIkRlZmF1bHQiLCJfY2lyY2xlTG9jIiwiYWRkTGF5ZXIiLCJfaW5pdEljb24iLCJfcmVtb3ZlSWNvbiIsInRJbnQiLCJzcyIsIm1yIiwicGFyc2VJbnQiLCJfcmFkaXVzIiwib2xkcmFkIiwibmV3cmFkIiwiYWNjIiwiX3RpbWVyQW5pbUxvYyIsInNldEludGVydmFsIiwic2V0UmFkaXVzIiwiY2xlYXJJbnRlcnZhbCIsIk1hcCIsImFkZEluaXRIb29rIiwic2VhcmNoQ29udHJvbCIsImNvbnRyb2wiLCJzZWFyY2giLCJhZGRDb250cm9sIiwiZHJhd1ZlcnNpb24iLCJEcmF3IiwiZHJhd0xvY2FsIiwiZHJhdyIsInRvb2xiYXIiLCJhY3Rpb25zIiwiZmluaXNoIiwidW5kbyIsImJ1dHRvbnMiLCJwb2x5bGluZSIsInBvbHlnb24iLCJyZWN0YW5nbGUiLCJjaXJjbGVtYXJrZXIiLCJoYW5kbGVycyIsInRvb2x0aXAiLCJjb250IiwiZXJyb3IiLCJzaW1wbGVzaGFwZSIsImVkaXQiLCJzYXZlIiwiY2xlYXJBbGwiLCJlZGl0RGlzYWJsZWQiLCJyZW1vdmUiLCJyZW1vdmVEaXNhYmxlZCIsInN1YnRleHQiLCJFdmVudCIsIkNSRUFURUQiLCJFRElURUQiLCJERUxFVEVEIiwiRFJBV1NUQVJUIiwiRFJBV1NUT1AiLCJEUkFXVkVSVEVYIiwiRURJVFNUQVJUIiwiRURJVE1PVkUiLCJFRElUUkVTSVpFIiwiRURJVFZFUlRFWCIsIkVESVRTVE9QIiwiREVMRVRFU1RBUlQiLCJERUxFVEVTVE9QIiwiRmVhdHVyZSIsIkhhbmRsZXIiLCJfb3ZlcmxheVBhbmUiLCJfcGFuZXMiLCJvdmVybGF5UGFuZSIsIl9wb3B1cFBhbmUiLCJwb3B1cFBhbmUiLCJzaGFwZU9wdGlvbnMiLCJlbmFibGUiLCJfZW5hYmxlZCIsImhhbmRsZXIiLCJsYXllclR5cGUiLCJkaXNhYmxlIiwiYWRkSG9va3MiLCJkaXNhYmxlVGV4dFNlbGVjdGlvbiIsImdldENvbnRhaW5lciIsIlRvb2x0aXAiLCJfY2FuY2VsRHJhd2luZyIsInJlbW92ZUhvb2tzIiwiZW5hYmxlVGV4dFNlbGVjdGlvbiIsImRpc3Bvc2UiLCJfZmlyZUNyZWF0ZWRFdmVudCIsInN0YXRpY3MiLCJUWVBFIiwiUG9seSIsImFsbG93SW50ZXJzZWN0aW9uIiwicmVwZWF0TW9kZSIsImRyYXdFcnJvciIsInRpbWVvdXQiLCJEaXZJY29uIiwiaWNvblNpemUiLCJQb2ludCIsInRvdWNoSWNvbiIsImd1aWRlbGluZURpc3RhbmNlIiwibWF4R3VpZGVMaW5lTGVuZ3RoIiwib3BhY2l0eSIsImNsaWNrYWJsZSIsIm1ldHJpYyIsImZlZXQiLCJuYXV0aWMiLCJzaG93TGVuZ3RoIiwiekluZGV4T2Zmc2V0IiwiZmFjdG9yIiwidG91Y2giLCJtZXNzYWdlIiwiX21hcmtlcnMiLCJfbWFya2VyR3JvdXAiLCJfcG9seSIsInVwZGF0ZUNvbnRlbnQiLCJfZ2V0VG9vbHRpcFRleHQiLCJfbW91c2VNYXJrZXIiLCJkaXZJY29uIiwiaWNvbkFuY2hvciIsIl9vbk1vdXNlT3V0IiwiX29uTW91c2VNb3ZlIiwiX29uTW91c2VEb3duIiwiX29uTW91c2VVcCIsIl9vblpvb21FbmQiLCJfb25Ub3VjaCIsIl9jbGVhckhpZGVFcnJvclRpbWVvdXQiLCJfY2xlYW5VcFNoYXBlIiwiX2NsZWFyR3VpZGVzIiwiZGVsZXRlTGFzdFZlcnRleCIsImxhc3RNYXJrZXIiLCJwb2x5IiwibGF0bG5ncyIsImdldExhdExuZ3MiLCJzcGxpY2UiLCJzZXRMYXRMbmdzIiwiX3ZlcnRleENoYW5nZWQiLCJpc01hcmtlckluc2lkZVBvbHlnb24iLCJpbnNpZGUiLCJ4IiwibGF0IiwieSIsImxuZyIsImlpIiwicG9seVBvaW50cyIsImoiLCJ4aSIsInlpIiwieGoiLCJ5aiIsImludGVyc2VjdCIsImFkZFZlcnRleCIsInNhbWUiLCJtYXJrZXJzTGVuZ3RoIiwiaW5Qb2x5Z29uIiwicG9pbnRTbmFwIiwibGF0TG5nVGVzdCIsImxhc3RMYXRMbmciLCJsaW5lSW5Qb2x5Z29uIiwibGFzdExpbmUiLCJuZXdMYXRMbmdJbnRlcnNlY3RzIiwiX3Nob3dFcnJvclRvb2x0aXAiLCJfZXJyb3JTaG93biIsIl9oaWRlRXJyb3JUb29sdGlwIiwicHVzaCIsIl9jcmVhdGVNYXJrZXIiLCJhZGRMYXRMbmciLCJndWlkZUxheWVycyIsIl9zbmFwcGVyIiwiX2d1aWRlcyIsIl9sYXRsbmdzIiwiayIsIl9sYXRsbmciLCJsIiwiY29tcGxldGVTaGFwZSIsImlzX2luX3BvbHlnb24iLCIkdmVydGljZXNfeCIsIiR2ZXJ0aWNlc195IiwicG9pbnQiLCIkYyIsIiRpIiwiJGoiLCIkbG9uZ2l0dWRlX3giLCIkbGF0aXR1ZGVfeSIsInBvaW50T25Qb2x5Z29uIiwicG9seUJvdW5kcyIsImNvbnRhaW5zIiwibGF0TG5nUG9seSIsImxlbmdodCIsImxpbmUiLCJwb2x5TGluZUJvdW5kcyIsIm1hcmtlclBvbHkiLCJNYXRoIiwiY2VpbCIsImVkaXRpbmciLCJyZWRyYXciLCJyb3VuZCIsIm51bSIsIkdlb21ldHJ5VXRpbCIsImludGVycG9sYXRlT25MaW5lIiwidGFiT25Qb2x5IiwiYmVmb3JlIiwiYWZ0ZXIiLCJlcXVhbHMiLCJfZmluaXNoU2hhcGUiLCJpbmZvIiwiX2RlZmF1bHRTaGFwZSIsImludGVyc2VjdHMiLCJfc2hhcGVJc1ZhbGlkIiwiX3VwZGF0ZUd1aWRlIiwibmV3UG9zIiwibW91c2VFdmVudFRvTGF5ZXJQb2ludCIsIm9yaWdpbmFsRXZlbnQiLCJsYXllclBvaW50VG9MYXRMbmciLCJfY3VycmVudExhdExuZyIsIl91cGRhdGVUb29sdGlwIiwicHJldmVudERlZmF1bHQiLCJhZGRlZCIsImxheWVycyIsIl91cGRhdGVGaW5pc2hIYW5kbGVyIiwiX3VwZGF0ZVJ1bm5pbmdNZWFzdXJlIiwiX2NsaWNrSGFuZGxlZCIsIl90b3VjaEhhbmRsZWQiLCJfZGlzYWJsZU1hcmtlcnMiLCJfZGlzYWJsZU5ld01hcmtlcnMiLCJjbGllbnRYIiwiY2xpZW50WSIsIl9zdGFydFBvaW50IiwiX21vdXNlRG93bk9yaWdpbiIsIl9lbmRQb2ludCIsImRyYWdDaGVja0Rpc3RhbmNlIiwiZGlzdGFuY2VUbyIsImxhc3RQdERpc3RhbmNlIiwiX2NhbGN1bGF0ZUZpbmlzaERpc3RhbmNlIiwiYWJzIiwiZGV2aWNlUGl4ZWxSYXRpbyIsIl9lbmFibGVOZXdNYXJrZXJzIiwidG91Y2hlcyIsInBvdGVudGlhbExhdExuZyIsImZpbmlzaE1hcmtlciIsIkluZmluaXR5IiwibGFzdE1hcmtlclBvaW50IiwibGF0TG5nVG9Db250YWluZXJQb2ludCIsInBvdGVudGlhbE1hcmtlciIsInBvdGVudGlhbE1hcmtlclBpbnQiLCJtYXJrZXJDb3VudCIsImxhdExuZ1RvTGF5ZXJQb2ludCIsIl9kcmF3R3VpZGUiLCJ1cGRhdGVQb3NpdGlvbiIsInBvaW50QSIsInBvaW50QiIsImZsb29yIiwic3FydCIsInBvdyIsImZyYWN0aW9uIiwiZGFzaFBvaW50IiwiZGFzaCIsIl9ndWlkZXNDb250YWluZXIiLCJiYWNrZ3JvdW5kQ29sb3IiLCJzZXRQb3NpdGlvbiIsIl91cGRhdGVHdWlkZUNvbG9yIiwibGFiZWxUZXh0IiwiZGlzdGFuY2VTdHIiLCJfZ2V0TWVhc3VyZW1lbnRTdHJpbmciLCJwcmV2aW91c01hcmtlckluZGV4IiwiZGlzdGFuY2UiLCJfbWVhc3VyZW1lbnRSdW5uaW5nVG90YWwiLCJjdXJyZW50TGF0TG5nIiwicHJldmlvdXNMYXRMbmciLCJyZWFkYWJsZURpc3RhbmNlIiwicHJlY2lzaW9uIiwic2hvd0FzRXJyb3IiLCJzZXRTdHlsZSIsIl9oaWRlRXJyb3JUaW1lb3V0IiwiYmluZCIsInJlbW92ZUVycm9yIiwic2hvd0FyZWEiLCJmaWxsQ29sb3IiLCJmaWxsT3BhY2l0eSIsImFyZWEiLCJfYXJlYSIsIm1lYXN1cmVtZW50U3RyaW5nIiwicmVhZGFibGVBcmVhIiwibGF0TG5ncyIsImdlb2Rlc2ljQXJlYSIsIlNpbXBsZVNoYXBlIiwiX2VuZExhYmVsVGV4dCIsIl9tYXBEcmFnZ2FibGUiLCJkcmFnZ2luZyIsImVuYWJsZWQiLCJjdXJzb3IiLCJfaW5pdGlhbExhYmVsVGV4dCIsIl9zaGFwZSIsIl9pc0RyYXdpbmciLCJfc3RhcnRMYXRMbmciLCJfZHJhd1NoYXBlIiwiUmVjdGFuZ2xlIiwiX2lzQ3VycmVudGx5VHdvQ2xpY2tEcmF3aW5nIiwiX2hhc0FuY2VzdG9yIiwidGFyZ2V0IiwiTGF0TG5nQm91bmRzIiwic2V0Qm91bmRzIiwidG9vbHRpcFRleHQiLCJzaGFwZSIsImVsIiwiY2xzIiwicGFyZW50RWxlbWVudCIsImNsYXNzTGlzdCIsIl9vbkNsaWNrIiwiX21hcmtlciIsIlRvdWNoIiwiY2lyY2xlTWFya2VyIiwiQ2lyY2xlIiwic2hvd1JhZGl1cyIsImdldFJhZGl1cyIsInVzZU1ldHJpYyIsInRvRml4ZWQiLCJFZGl0IiwiX29uRHJhZ0VuZCIsIl90b2dnbGVNYXJrZXJIaWdobGlnaHQiLCJlZGl0ZWQiLCJfaWNvbiIsImhhc0NsYXNzIiwiX29mZnNldE1hcmtlciIsIm9mZnNldCIsImljb25NYXJnaW5Ub3AiLCJtYXJnaW5Ub3AiLCJpY29uTWFyZ2luTGVmdCIsIm1hcmdpbkxlZnQiLCJlZGl0YWJsZSIsIl9ob2xlcyIsImNvbmNhdCIsIl91cGRhdGVMYXRMbmdzIiwiX2ZsYXQiLCJfZWFjaFZlcnRleEhhbmRsZXIiLCJjYWxsYmFjayIsIl92ZXJ0aWNlc0hhbmRsZXJzIiwiX2luaXRIYW5kbGVycyIsInVwZGF0ZU1hcmtlcnMiLCJQb2x5VmVydGljZXNFZGl0IiwiX2luaXRNYXJrZXJzIiwib3JpZ2luYWwiLCJjbGVhckxheWVycyIsIm1hcmtlckxlZnQiLCJtYXJrZXJSaWdodCIsIl9jcmVhdGVNaWRkbGVNYXJrZXIiLCJfdXBkYXRlUHJldk5leHQiLCJpbmRleCIsImRyYWdnYWJsZSIsIl9vcmlnTGF0TG5nIiwiX2luZGV4IiwiX29uTWFya2VyRHJhZ1N0YXJ0IiwiX29uTWFya2VyRHJhZyIsIl9maXJlRWRpdCIsIl9vblRvdWNoTW92ZSIsIl9zcGxpY2VMYXRMbmdzIiwicmVtb3ZlZCIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2NvbnZlcnRMYXRMbmdzIiwiX3JlbW92ZU1hcmtlciIsIl91cGRhdGVJbmRleGVzIiwiX21pZGRsZUxlZnQiLCJfZ2V0TWlkZGxlTGF0TG5nIiwiX3ByZXYiLCJfbWlkZGxlUmlnaHQiLCJfbmV4dCIsInRhYkxhdExuZ3MiLCJfb25NYXJrZXJDbGljayIsIm1pblBvaW50cyIsImxheWVyUG9pbnQiLCJkZWx0YSIsIm1hcmtlcjEiLCJtYXJrZXIyIiwib25DbGljayIsIm9uRHJhZ1N0YXJ0Iiwib25EcmFnRW5kIiwic2V0T3BhY2l0eSIsInAxIiwicHJvamVjdCIsInAyIiwidW5wcm9qZWN0IiwiX2FkZCIsIl9kaXZpZGVCeSIsIm1vdmVJY29uIiwicmVzaXplSWNvbiIsInRvdWNoTW92ZUljb24iLCJ0b3VjaFJlc2l6ZUljb24iLCJfdW5iaW5kTWFya2VyIiwiX21vdmVNYXJrZXIiLCJfcmVzaXplTWFya2VycyIsIl9jcmVhdGVNb3ZlTWFya2VyIiwiX2NyZWF0ZVJlc2l6ZU1hcmtlciIsIl9iaW5kTWFya2VyIiwiX29uTWFya2VyRHJhZ0VuZCIsIl9vblRvdWNoU3RhcnQiLCJfb25Ub3VjaEVuZCIsIl9tb3ZlIiwiX3Jlc2l6ZSIsIl9nZXRDb3JuZXJzIiwiY29ybmVycyIsImN1cnJlbnRDb3JuZXJJbmRleCIsIl9jb3JuZXJJbmRleCIsIl9vcHBvc2l0ZUNvcm5lciIsIl90b2dnbGVDb3JuZXJNYXJrZXJzIiwiYm91bmRzIiwiY2VudGVyIiwiX3JlcG9zaXRpb25Db3JuZXJNYXJrZXJzIiwibmV3Q2VudGVyIiwibmV3TGF0TG5ncyIsImxhdExuZ0JvdW5kcyIsIm53IiwiZ2V0Tm9ydGhXZXN0IiwibmUiLCJnZXROb3J0aEVhc3QiLCJzZSIsImdldFNvdXRoRWFzdCIsInN3IiwiZ2V0U291dGhXZXN0IiwicmVzaXplbWFya2VyUG9pbnQiLCJfZ2V0UmVzaXplTWFya2VyUG9pbnQiLCJjb3MiLCJQSSIsIm1vdmVMYXRMbmciLCJtZXJnZU9wdGlvbnMiLCJ0b3VjaEV4dGVuZCIsIlRvdWNoRXh0ZW5kIiwiX3BhbmUiLCJfZGV0ZWN0SUUiLCJfb25Ub3VjaENhbmNlbCIsIl9vblRvdWNoTGVhdmUiLCJfdG91Y2hFdmVudCIsInRvdWNoRXZlbnQiLCJwb2ludGVyVHlwZSIsIl9maWx0ZXJDbGljayIsImNvbnRhaW5lclBvaW50IiwibW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQiLCJwYWdlWCIsInBhZ2VZIiwidGltZVN0YW1wIiwiZWxhcHNlZCIsIl9sYXN0Q2xpY2siLCJfc2ltdWxhdGVkQ2xpY2siLCJfc2ltdWxhdGVkIiwiX2xvYWRlZCIsInVhIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwibXNpZSIsInN1YnN0cmluZyIsInRyaWRlbnQiLCJydiIsImVkZ2UiLCJfaW5pdEludGVyYWN0aW9uIiwiYWRkSW50ZXJhY3RpdmVUYXJnZXQiLCJfaW5pdEludGVyYWN0aW9uTGVnYWN5IiwiZXZlbnRzIiwiX29uTW91c2VDbGljayIsIl9vbktleVByZXNzIiwiX2ZpcmVNb3VzZUV2ZW50IiwiTWFya2VyRHJhZyIsIkxhdExuZ1V0aWwiLCJjbG9uZUxhdExuZ3MiLCJjbG9uZSIsIkFycmF5IiwiY2xvbmVMYXRMbmciLCJkZWZhdWx0UHJlY2lzaW9uIiwia20iLCJoYSIsIm0iLCJtaSIsImFjIiwieWQiLCJmdCIsIm5tIiwicG9pbnRzQ291bnQiLCJkMnIiLCJzaW4iLCJmb3JtYXR0ZWROdW1iZXIiLCJuIiwiZm9ybWF0dGVkIiwicGFyc2VGbG9hdCIsImZvcm1hdCIsIm51bWVyaWMiLCJkZWxpbWl0ZXJzIiwidGhvdXNhbmRzIiwiZGVjaW1hbCIsInNwbGl0VmFsdWUiLCJpc01ldHJpYyIsImFyZWFTdHIiLCJ1bml0cyIsImlzRmVldCIsImlzTmF1dGljYWxNaWxlIiwiTGluZVV0aWwiLCJzZWdtZW50c0ludGVyc2VjdCIsInAiLCJwMyIsIl9jaGVja0NvdW50ZXJjbG9ja3dpc2UiLCJpbmNsdWRlIiwicG9pbnRzIiwiX2dldFByb2plY3RlZFBvaW50cyIsIl90b29GZXdQb2ludHNGb3JJbnRlcnNlY3Rpb24iLCJfbGluZVNlZ21lbnRzSW50ZXJzZWN0c1JhbmdlIiwic2tpcEZpcnN0IiwibmV3UG9pbnRJbnRlcnNlY3RzIiwibmV3UG9pbnQiLCJsYXN0UG9pbnQiLCJtYXhJbmRleCIsImV4dHJhUG9pbnRzIiwibWluSW5kZXgiLCJfb3JpZ2luYWxQb2ludHMiLCJwb2x5bGluZUludGVyc2VjdHMiLCJmaXJzdFBvaW50IiwiX3Rvb2xiYXJzIiwiRHJhd1Rvb2xiYXIiLCJfdG9vbGJhckVuYWJsZWQiLCJFZGl0VG9vbGJhciIsImFkZGVkVG9wQ2xhc3MiLCJ0b3BDbGFzc05hbWUiLCJ0b29sYmFyQ29udGFpbmVyIiwidG9vbGJhcklkIiwiYWRkVG9vbGJhciIsInJlbW92ZVRvb2xiYXIiLCJzZXREcmF3aW5nT3B0aW9ucyIsImVuYWJsZWRUb29sYmFyIiwiZHJhd0NvbnRyb2xUb29sdGlwcyIsImRyYXdDb250cm9sIiwiVG9vbGJhciIsIkNsYXNzIiwiX21vZGVzIiwiX2FjdGlvbkJ1dHRvbnMiLCJfYWN0aXZlTW9kZSIsImJ1dHRvbkluZGV4IiwiYnV0dG9uQ2xhc3NQcmVmaXgiLCJfdG9vbGJhckNsYXNzIiwibW9kZUhhbmRsZXJzIiwiZ2V0TW9kZUhhbmRsZXJzIiwiX3Rvb2xiYXJDb250YWluZXIiLCJfaW5pdE1vZGVIYW5kbGVyIiwiX2xhc3RCdXR0b25JbmRleCIsIl9hY3Rpb25zQ29udGFpbmVyIiwiaGFuZGxlcklkIiwiX2Rpc3Bvc2VCdXR0b24iLCJfaGFuZGxlckFjdGl2YXRlZCIsIl9oYW5kbGVyRGVhY3RpdmF0ZWQiLCJjbGFzc05hbWVQcmVkaXgiLCJidXR0b25UaXRsZSIsImNvbnRleHQiLCJfZGV0ZWN0SU9TIiwiaU9TIiwiTVNTdHJlYW0iLCJsaW5rIiwic3IiLCJidXR0b25FdmVudCIsIl9zaG93QWN0aW9uc1Rvb2xiYXIiLCJfaGlkZUFjdGlvbnNUb29sYmFyIiwiX2NyZWF0ZUFjdGlvbnMiLCJnZXRBY3Rpb25zIiwibGkiLCJkaSIsImRsIiwibGFzdEJ1dHRvbkluZGV4IiwidG9vbGJhclBvc2l0aW9uIiwidG9wIiwiX3Zpc2libGUiLCJfc2luZ2xlTGluZUxhYmVsIiwidmlzaWJpbGl0eSIsInBvcyIsInRvb2x0aXBDb250YWluZXIiLCJzZWxlY3RlZFBhdGhPcHRpb25zIiwiZGFzaEFycmF5IiwibWFpbnRhaW5Db2xvciIsImZlYXR1cmVHcm91cCIsIl9zZWxlY3RlZEZlYXR1cmVDb3VudCIsIkRlbGV0ZSIsIl9zYXZlIiwicmVtb3ZlQWxsTGF5ZXJzIiwiX2NsZWFyQWxsTGF5ZXJzIiwiX2NoZWNrRGlzYWJsZWQiLCJyZXZlcnRMYXllcnMiLCJoYXNMYXllcnMiLCJnZXRMYXllcnMiLCJzZXRBdHRyaWJ1dGUiLCJfZmVhdHVyZUdyb3VwIiwiRmVhdHVyZUdyb3VwIiwiX3VuZWRpdGVkTGF5ZXJQcm9wcyIsIl9oYXNBdmFpbGFibGVMYXllcnMiLCJfZW5hYmxlTGF5ZXJFZGl0IiwiX2Rpc2FibGVMYXllckVkaXQiLCJfZWRpdFRvb2x0aXAiLCJfcmV2ZXJ0TGF5ZXIiLCJlZGl0ZWRMYXllcnMiLCJfYmFja3VwTGF5ZXIiLCJzdGFtcCIsInBhdGhPcHRpb25zIiwiX3NlbGVjdGVkUGF0aE9wdGlvbnMiLCJwcmV2aW91c09wdGlvbnMiLCJjaGFuZ2VkVG91Y2hlcyIsIl9kZWxldGFibGVMYXllcnMiLCJfZW5hYmxlTGF5ZXJEZWxldGUiLCJfZGlzYWJsZUxheWVyRGVsZXRlIiwiX2RlbGV0ZWRMYXllcnMiLCJfcmVtb3ZlTGF5ZXIiLCIkIiwicmVzaXplIiwiaGVpZ2h0Iiwid2lkdGgiLCJjc3MiLCJzSCIsInRyaWdnZXIiLCJnZXRFbGVtZW50QnlJZCIsImFkZEV2ZW50TGlzdGVuZXIiLCJzaG93IiwiY2xpY2siLCJ0b2dnbGVDbGFzcyIsInRhYkNvbG9yIiwidGFiQW50ZW5uZXMiLCJjb2xvcnMiLCJmaWxsQ29sb3JXaXRob3V0QWdlbnQiLCJjb2xvcldpdGhvdXRBZ2VudCIsImNvbG9yV2l0aEFnZW50IiwidGFiQWdlbnRzIiwic2l0ZVVzZXIiLCJhZ2VudHMiLCJ0YWJOYkNsaWVudHMiLCJsYXN0SWQiLCJtYXJrZXJEZWNvdXBhZ2UiLCJsYXllckdyb3VwIiwiZnVzaW9uIiwiZGVjb3VwYWdlIiwibW9kaWZpY2F0aW9uIiwiY3JlYXRpb24iLCJhc3Npc3QiLCJjb250YWluZXJDbGljayIsInNob3dBZ2VudHMiLCJzaG93QWdlbnRzT2ZTZWN0ZXVycyIsImRlbnNpdGVDbGllbnRzIiwic2hvd0RlbnNpdGUiLCJjbGllbnRzV2l0aG91dFNlY3RldXIiLCJnZW9qc29uQ2xpZW50cyIsInNob3dDbGllbnRzIiwidGFiRGVuc2l0ZSIsInNlY3RldXJzQnlSZXNwb25zYWJsZSIsInNlY3RldXJzU2VsZWN0IiwiaGlzdG9yaXF1ZUFjdGlvbnMiLCJoaXN0b1BvbHlnb24iLCJmbGFnVW5kbyIsImV2ZW50QWN0aWYiLCJvcHRpb25zQ2lyY2xlQ2xpZW50cyIsIm1hcmtlckljb24iLCJpY29uVXJsIiwiaW1nTWFya2VyQmxhY2siLCJtYXJrZXJJY29uUmVkIiwiaW1nTWFya2VyUmVkIiwiY2lyY2xlSWNvbiIsImltZ0NpcmNsZSIsImhvbWVJY29uIiwiaW1nTWFpc29uIiwiY29vcmRzIiwibWFwU2VjdG8iLCJ6b29tQ29udHJvbCIsIl96b29tSW5CdXR0b24iLCJfem9vbU91dEJ1dHRvbiIsInNjYWxlIiwiZ2xjTWFwc0dHaCIsInRpbGVMYXllciIsIm1heFpvb20iLCJkZXRlY3RSZXRpbmEiLCJhdHRyaWJ1dGlvbiIsInBsYW4iLCJFc3JpX1dvcmxkSW1hZ2VyeSIsIkVzcmlfV29ybGRUb3BvTWFwIiwicGxhbjIiLCJoaXN0b01hcCIsImJhc2VMYXllcnMiLCJsYXllcnNBZGphY2VudCIsImFnZW50c0FkamFjZW50IiwiY2lyY2xlR3VpZGUiLCJhbnRlbm5lcyIsImVkaXRhYmxlTGF5ZXJzIiwiYmlnUG9seWdvbiIsImJpZ1BvbHlnb25BbnRlbm5lcyIsImFnZW50c09mU2VjdGV1cnMiLCJoaXN0b0FnZW50c09mU2VjdGV1cnMiLCJjdXN0b21Db250cm9sVW5kbyIsImltZ1VuZG8iLCJiYWNrZ3JvdW5kU2l6ZSIsIm9uY2xpY2siLCJjdXN0b21Db250cm9sUmVmcmVzaCIsImltZ1JlZnJlc2giLCJyZWZyZXNoIiwiY3VzdG9tQ29udHJvbFNhdmUiLCJpbWdTYXZlIiwiaW1nUGFzdGlsbGUiLCJkaXNhYmxlZCIsIm1vZGFsIiwiZXZlbnQiLCJpbWdCREQiLCJzeW5jaHJvIiwiZm9ybSIsImVsZW1lbnRzIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsInNhdmVWZXJzaW9uIiwiY3VzdG9tQ29udHJvbENyZWF0aW9uQXNzaXN0IiwiaW1nQ3JlYXRpb25Bc3Npc3QiLCJoaWRlRnVuY3Rpb25zIiwiY2xpY2tNYXJrZXJBc3Npc3QiLCJjdXN0b21Db250cm9sTmJDbGllbnRzIiwiaW1nQ2xpZW50cyIsInRvZ2dsZVRvb2x0aXAiLCJjdXN0b21Db250cm9sQWdlbnRzIiwiaW1nQWdlbnRzIiwiYmluZEVsZW1lbnRzIiwiY3VzdG9tQ29udHJvbEFnZW50c09mU2VjdGV1cnMiLCJpbWdOdW1iZXIiLCJjdXN0b21Db250cm9sRGVuc2l0ZUNsaWVudHMiLCJpbWdEZW5zaXRlIiwiY3VzdG9tQ29udHJvbENsaWVudCIsImltZ0NsaWVudHNPdXQiLCJpbml0U2VjdG8iLCJ0aW1lbGluZXMiLCJldmVudHNNaW5EaXN0YW5jZSIsImluaXRUaW1lbGluZSIsInJlbG9hZCIsImVhY2giLCJ0aW1lbGluZSIsInRpbWVsaW5lQ29tcG9uZW50cyIsImZpbmQiLCJjaGlsZHJlbiIsInRpbWVsaW5lVG90V2lkdGgiLCJzZXREYXRlUG9zaXRpb24iLCJzZXRUaW1lbGluZVdpZHRoIiwid2lkdGhUaW1lbGluZSIsIk51bWJlciIsIm1pZGRsZSIsImxlZnRWZXJzaW9uIiwiY29tcHREZWNhbGFnZSIsInVwZGF0ZVNsaWRlIiwidGhpc0xpbmsiLCJzaG93TG9hZE1vZGFsIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJ1cGRhdGVPbGRlckV2ZW50cyIsInVwZGF0ZUZpbGxpbmciLCJ1cGRhdGVWaXNpYmxlQ29udGVudCIsImhpZGVMb2FkTW9kYWwiLCJtcSIsImNoZWNrTVEiLCJzaG93TmV3Q29udGVudCIsImtleXVwIiwid2hpY2giLCJlbGVtZW50SW5WaWV3cG9ydCIsInN0cmluZyIsImRlY2FsYWdlIiwidHJhbnNsYXRlVmFsdWUiLCJnZXRUcmFuc2xhdGVWYWx1ZSIsIndyYXBwZXJXaWR0aCIsInRyYW5zbGF0ZVRpbWVsaW5lIiwidmlzaWJsZUNvbnRlbnQiLCJuZXdDb250ZW50IiwibmV4dCIsInByZXYiLCJzZWxlY3RlZERhdGUiLCJuZXdFdmVudCIsInBhcmVudCIsInVwZGF0ZVRpbWVsaW5lUG9zaXRpb24iLCJldmVudFN0eWxlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImV2ZW50TGVmdCIsImdldFByb3BlcnR5VmFsdWUiLCJ0aW1lbGluZVdpZHRoIiwidGltZWxpbmVUcmFuc2xhdGUiLCJ0b3RXaWR0aCIsImV2ZW50c1dyYXBwZXIiLCJzZXRUcmFuc2Zvcm1WYWx1ZSIsInNlbGVjdGVkRXZlbnQiLCJmaWxsaW5nIiwiZXZlbnRXaWR0aCIsInNjYWxlVmFsdWUiLCJtaW4iLCJlcSIsInRvdGFsV2lkdGgiLCJldmVudHNDb250ZW50IiwiZXZlbnREYXRlIiwic2VsZWN0ZWRDb250ZW50Iiwic2VsZWN0ZWRDb250ZW50SGVpZ2h0IiwiY2xhc3NFbmV0ZXJpbmciLCJjbGFzc0xlYXZpbmciLCJhdHRyIiwib25lIiwicHJldkFsbCIsIm5leHRBbGwiLCJ0aW1lbGluZVN0eWxlIiwiZWxlbWVudCIsInByb3BlcnR5IiwicGFyc2VEYXRlIiwiZGF0ZUFycmF5cyIsImRhdGVDb21wIiwibmV3RGF0ZSIsIkRhdGUiLCJwYXJzZURhdGUyIiwic2luZ2xlRGF0ZSIsImRheUNvbXAiLCJ0aW1lQ29tcCIsImRheWRpZmYiLCJmaXJzdCIsInNlY29uZCIsIm1pbkxhcHNlIiwiZGF0ZXMiLCJkYXRlRGlzdGFuY2VzIiwibGVmdCIsIm9mZnNldExlZnQiLCJvZmZzZXRIZWlnaHQiLCJvZmZzZXRQYXJlbnQiLCJwYWdlWU9mZnNldCIsImlubmVySGVpZ2h0IiwicGFnZVhPZmZzZXQiLCJpbm5lcldpZHRoIiwidG90YWxGb3JtYXR0ZXIiLCJmaWVsZCIsInJvdyIsInJlZHVjZSIsInN1bSIsImZvb3RlclN0eWxlIiwiZGF0ZU1lcCIsInZpYUJ1dHRvbiIsImFqYXgiLCJtZXRob2QiLCJkYXRhVHlwZSIsInN0cmluZ2lmeSIsInN1Y2Nlc3MiLCJyZXN1bHQiLCJzZWN0ZXVycyIsImxhdExvbmciLCJjb3VudCIsImZvckVhY2giLCJzZWN0ZXVyIiwiY29vcmRvbm5lZXMiLCJjb29yZGluYXRlcyIsImxvY2F0aW9uQXJyYXkiLCJ3aXRob3V0QWdlbnQiLCJhZ2VudFNlY3RldXJzIiwic29tZSIsImFnZW50IiwicmFuZ190cmkiLCJ1dGlsaXNhdGV1cl9hZ2VudCIsImdyb3VwZV9hZmZlY3RhdGlvbiIsImdldFN0eWxlIiwiY29kZUFnZW50IiwiaW5pdGlhbGVzIiwiYmluZFRvb2x0aXAiLCJwZXJtYW5lbnQiLCJkaXJlY3Rpb24iLCJiaW5kVG9vbHRpcE5iQ2xpZW50cyIsImluaXRFdmVuZW1lbnRMYXllciIsImdldEFnZW50cyIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiYmluZFBvcHVwIiwibm9tQ29tcGxldCIsImdldEJpZ1BvbHlnb24iLCJHZW9KU09OIiwiZ2VvbWV0cnlUb0xheWVyIiwicG9pbnRUb0xheWVyIiwiY29vcmRzVG9MYXRMbmciLCJhbnRlbm5lc0dsb2JhbCIsImFudGVubmUiLCJzdmciLCJwYXRoQW50ZW5uZXMiLCJwcmVwZW5kIiwiY29kZUdyb3VwZSIsIm5iRXF1aXBlbWVudCIsIm5iX3RvdGFsIiwiY2xvc2VUb29sdGlwIiwiZmxhZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBQSxXQUFPLENBQUNyTixFQUFSLENBQVcsb0JBQVgsRUFBaUMsVUFBVWtELENBQVYsRUFBYTtBQUMxQ21LLGFBQU8sQ0FBQytwQixhQUFSO0FBQ0gsS0FGRDtBQUdIOztBQUVELFdBQVNHLFlBQVQsQ0FBc0JpSyxJQUF0QixFQUE0Qi9vQixNQUE1QixFQUFvQztBQUNoQyxRQUFJK29CLElBQUosRUFBVTtBQUNOdE4sY0FBUSxDQUFDbnlCLFdBQVQsQ0FBcUIwVyxNQUFyQjtBQUNILEtBRkQsTUFFTztBQUNIeWIsY0FBUSxDQUFDNW9CLFFBQVQsQ0FBa0JtTixNQUFsQjtBQUNIOztBQUNELFdBQU8sQ0FBQytvQixJQUFSO0FBQ0gsR0F0MEN5QyxDQXkwQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBOztBQUVILENBeDFDRCxFOzs7Ozs7Ozs7Ozs7QUNoQ0E7Ozs7Ozs7Ozs7Ozs7QUNBQSIsImZpbGUiOiJzZWN0by5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcblx0TmFtZVx0XHRcdFx0XHREYXRhIHBhc3NlZFx0XHRcdCAgIERlc2NyaXB0aW9uXHJcblxyXG5cdE1hbmFnZWQgRXZlbnRzOlxyXG5cdCBzZWFyY2g6bG9jYXRpb25mb3VuZFx0e2xhdGxuZywgdGl0bGUsIGxheWVyfSBmaXJlZCBhZnRlciBtb3ZlZCBhbmQgc2hvdyBtYXJrZXJMb2NhdGlvblxyXG5cdCBzZWFyY2g6ZXhwYW5kZWRcdFx0e31cdFx0XHRcdFx0ICAgZmlyZWQgYWZ0ZXIgY29udHJvbCB3YXMgZXhwYW5kZWRcclxuXHQgc2VhcmNoOmNvbGxhcHNlZFx0XHR7fVx0XHRcdFx0XHQgICBmaXJlZCBhZnRlciBjb250cm9sIHdhcyBjb2xsYXBzZWRcclxuIFx0IHNlYXJjaDpjYW5jZWxcdFx0XHR7fVx0XHRcdFx0XHQgICBmaXJlZCBhZnRlciBjYW5jZWwgYnV0dG9uIGNsaWNrZWRcclxuXHJcblx0UHVibGljIG1ldGhvZHM6XHJcblx0IHNldExheWVyKClcdFx0XHRcdEwuTGF5ZXJHcm91cCgpICAgICAgICAgc2V0IGxheWVyIHNlYXJjaCBhdCBydW50aW1lXHJcblx0IHNob3dBbGVydCgpICAgICAgICAgICAgJ1RleHQgbWVzc2FnZScgICAgICAgICBzaG93IGFsZXJ0IG1lc3NhZ2VcclxuXHQgc2VhcmNoVGV4dCgpXHRcdFx0J1RleHQgc2VhcmNoZWQnICAgICAgICBzZWFyY2ggdGV4dCBieSBleHRlcm5hbCBjb2RlXHJcbiovXHJcblxyXG4vL1RPRE8gaW1wbGVtZW50IGNhbiBkbyByZXNlYXJjaCBvbiBtdWx0aXBsZSBzb3VyY2VzIGxheWVycyBhbmQgcmVtb3RlXHRcdFxyXG4vL1RPRE8gaGlzdG9yeTogZmFsc2UsXHRcdC8vc2hvdyBsYXRlc3Qgc2VhcmNoZXMgaW4gdG9vbHRpcFx0XHRcclxuLy9GSVhNRSBvcHRpb24gY29uZGl0aW9uIHByb2JsZW0ge2F1dG9Db2xsYXBzZTogdHJ1ZSwgbWFya2VyTG9jYXRpb246IHRydWV9IG5vdCBzaG93IGxvY2F0aW9uXHJcbi8vRklYTUUgb3B0aW9uIGNvbmRpdGlvbiBwcm9ibGVtIHthdXRvQ29sbGFwc2U6IGZhbHNlIH1cclxuLy9cclxuLy9UT0RPIGhlcmUgaW5zZXJ0IGZ1bmN0aW9uICBzZWFyY2ggaW5wdXRUZXh0IEZJUlNUIGluIF9yZWNvcmRzQ2FjaGUga2V5cyBhbmQgaWYgbm90IGZpbmQgcmVzdWx0cy4uIFxyXG4vLyAgcnVuIG9uZSBvZiBjYWxsYmFja3Mgc2VhcmNoKHNvdXJjZURhdGEsanNvbnBVcmwgb3Igb3B0aW9ucy5sYXllcikgYW5kIHJ1biB0aGlzLnNob3dUb29sdGlwXHJcbi8vXHJcbi8vVE9ETyBjaGFuZ2Ugc3RydWN0dXJlIG9mIF9yZWNvcmRzQ2FjaGVcclxuLy9cdGxpa2UgdGhpczogX3JlY29yZHNDYWNoZSA9IHtcInRleHQta2V5MVwiOiB7bG9jOltsYXQsbG5nXSwgLi5vdGhlciBhdHRyaWJ1dGVzLi4gfSwge1widGV4dC1rZXkyXCI6IHtsb2M6W2xhdCxsbmddfS4uLn0sIC4uLn1cclxuLy9cdGluIHRoaXMgbW9kZSBldmVyeSByZWNvcmQgY2FuIGhhdmUgYSBmcmVlIHN0cnVjdHVyZSBvZiBhdHRyaWJ1dGVzLCBvbmx5ICdsb2MnIGlzIHJlcXVpcmVkXHJcbi8vVE9ETyBpbXBvcnRhbnQgb3B0aW1pemF0aW9uISEhIGFsd2F5cyBhcHBlbmQgZGF0YSBpbiB0aGlzLl9yZWNvcmRzQ2FjaGVcclxuLy8gIG5vdyBfcmVjb3Jkc0NhY2hlIGNvbnRlbnQgaXMgZW1wdGllZCBhbmQgcmVwbGFjZWQgd2l0aCBuZXcgZGF0YSBmb3VuZGVkXHJcbi8vICBhbHdheXMgYXBwZW5kaW5nIGRhdGEgb24gX3JlY29yZHNDYWNoZSBnaXZlIHRoZSBwb3NzaWJpbGl0eSBvZiBjYWNoaW5nIGFqYXgsIGpzb25wIGFuZCBsYXllcnNlYXJjaCFcclxuLy9cclxuLy9UT0RPIGhlcmUgaW5zZXJ0IGZ1bmN0aW9uICBzZWFyY2ggaW5wdXRUZXh0IEZJUlNUIGluIF9yZWNvcmRzQ2FjaGUga2V5cyBhbmQgaWYgbm90IGZpbmQgcmVzdWx0cy4uIFxyXG4vLyAgcnVuIG9uZSBvZiBjYWxsYmFja3Mgc2VhcmNoKHNvdXJjZURhdGEsanNvbnBVcmwgb3Igb3B0aW9ucy5sYXllcikgYW5kIHJ1biB0aGlzLnNob3dUb29sdGlwXHJcbi8vXHJcbi8vVE9ETyBjaGFuZ2Ugc3RydWN0dXJlIG9mIF9yZWNvcmRzQ2FjaGVcclxuLy9cdGxpa2UgdGhpczogX3JlY29yZHNDYWNoZSA9IHtcInRleHQta2V5MVwiOiB7bG9jOltsYXQsbG5nXSwgLi5vdGhlciBhdHRyaWJ1dGVzLi4gfSwge1widGV4dC1rZXkyXCI6IHtsb2M6W2xhdCxsbmddfS4uLn0sIC4uLn1cclxuLy9cdGluIHRoaXMgd2F5IGV2ZXJ5IHJlY29yZCBjYW4gaGF2ZSBhIGZyZWUgc3RydWN0dXJlIG9mIGF0dHJpYnV0ZXMsIG9ubHkgJ2xvYycgaXMgcmVxdWlyZWRcclxuXHJcbihmdW5jdGlvbiAoZmFjdG9yeSkge1xyXG4gICAgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XHJcbiAgICAvL0FNRFxyXG4gICAgICAgIGRlZmluZShbJ2xlYWZsZXQnXSwgZmFjdG9yeSk7XHJcbiAgICB9IGVsc2UgaWYodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIC8vIE5vZGUvQ29tbW9uSlNcclxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnbGVhZmxldCcpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAvLyBCcm93c2VyIGdsb2JhbHNcclxuICAgICAgICBpZih0eXBlb2Ygd2luZG93LkwgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICB0aHJvdyAnTGVhZmxldCBtdXN0IGJlIGxvYWRlZCBmaXJzdCc7XHJcbiAgICAgICAgZmFjdG9yeSh3aW5kb3cuTCk7XHJcbiAgICB9XHJcbn0pKGZ1bmN0aW9uIChMKSB7XHJcblxyXG5cclxuTC5Db250cm9sLlNlYXJjaCA9IEwuQ29udHJvbC5leHRlbmQoe1xyXG5cdFxyXG5cdGluY2x1ZGVzOiBMLnZlcnNpb25bMF09PT0nMScgPyBMLkV2ZW50ZWQucHJvdG90eXBlIDogTC5NaXhpbi5FdmVudHMsXHJcblxyXG5cdG9wdGlvbnM6IHtcclxuXHRcdHVybDogJycsXHRcdFx0XHRcdFx0Ly91cmwgZm9yIHNlYXJjaCBieSBhamF4IHJlcXVlc3QsIGV4OiBcInNlYXJjaC5waHA/cT17c31cIi4gQ2FuIGJlIGZ1bmN0aW9uIHRvIHJldHVybnMgc3RyaW5nIGZvciBkeW5hbWljIHBhcmFtZXRlciBzZXR0aW5nXHJcblx0XHRsYXllcjogbnVsbCxcdFx0XHRcdFx0Ly9sYXllciB3aGVyZSBzZWFyY2ggbWFya2VycyhpcyBhIEwuTGF5ZXJHcm91cClcdFx0XHRcdFxyXG5cdFx0c291cmNlRGF0YTogbnVsbCxcdFx0XHRcdC8vZnVuY3Rpb24gdG8gZmlsbCBfcmVjb3Jkc0NhY2hlLCBwYXNzZWQgc2VhcmNoaW5nIHRleHQgYnkgZmlyc3QgcGFyYW0gYW5kIGNhbGxiYWNrIGluIHNlY29uZFx0XHRcdFx0XHJcblx0XHQvL1RPRE8gaW1wbGVtZW50cyB1bmlxIG9wdGlvbiAnc291cmNlRGF0YScgdG8gcmVjb2duaXplcyBzb3VyY2UgdHlwZTogdXJsLGFycmF5LGNhbGxiYWNrIG9yIGxheWVyXHRcdFx0XHRcclxuXHRcdGpzb25wUGFyYW06IG51bGwsXHRcdFx0XHQvL2pzb25wIHBhcmFtIG5hbWUgZm9yIHNlYXJjaCBieSBqc29ucCBzZXJ2aWNlLCBleDogXCJjYWxsYmFja1wiXHJcblx0XHRwcm9wZXJ0eUxvYzogJ2xvYycsXHRcdFx0XHQvL2ZpZWxkIGZvciByZW1hcHBpbmcgbG9jYXRpb24sIHVzaW5nIGFycmF5OiBbJ2xhdG5hbWUnLCdsb25uYW1lJ10gZm9yIHNlbGVjdCBkb3VibGUgZmllbGRzKGV4LiBbJ2xhdCcsJ2xvbiddICkgc3VwcG9ydCBkb3R0ZWQgZm9ybWF0OiAncHJvcC5zdWJwcm9wLnRpdGxlJ1xyXG5cdFx0cHJvcGVydHlOYW1lOiAndGl0bGUnLFx0XHRcdC8vcHJvcGVydHkgaW4gbWFya2VyLm9wdGlvbnMob3IgZmVhdHVyZS5wcm9wZXJ0aWVzIGZvciB2ZWN0b3IgbGF5ZXIpIHRyb3VnaCBmaWx0ZXIgZWxlbWVudHMgaW4gbGF5ZXIsXHJcblx0XHRmb3JtYXREYXRhOiBudWxsLFx0XHRcdFx0Ly9jYWxsYmFjayBmb3IgcmVmb3JtYXQgYWxsIGRhdGEgZnJvbSBzb3VyY2UgdG8gaW5kZXhlZCBkYXRhIG9iamVjdFxyXG5cdFx0ZmlsdGVyRGF0YTogbnVsbCxcdFx0XHRcdC8vY2FsbGJhY2sgZm9yIGZpbHRlcmluZyBkYXRhIGZyb20gdGV4dCBzZWFyY2hlZCwgcGFyYW1zOiB0ZXh0U2VhcmNoLCBhbGxSZWNvcmRzXHJcblx0XHRtb3ZlVG9Mb2NhdGlvbjogbnVsbCxcdFx0XHQvL2NhbGxiYWNrIHJ1biBvbiBsb2NhdGlvbiBmb3VuZCwgcGFyYW1zOiBsYXRsbmcsIHRpdGxlLCBtYXBcclxuXHRcdGJ1aWxkVGlwOiBudWxsLFx0XHRcdFx0XHQvL2Z1bmN0aW9uIHRvIHJldHVybiByb3cgdGlwIGh0bWwgbm9kZShvciBodG1sIHN0cmluZyksIHJlY2VpdmUgdGV4dCB0b29sdGlwIGluIGZpcnN0IHBhcmFtXHJcblx0XHRjb250YWluZXI6ICcnLFx0XHRcdFx0XHQvL2NvbnRhaW5lciBpZCB0byBpbnNlcnQgU2VhcmNoIENvbnRyb2xcdFx0XHJcblx0XHR6b29tOiBudWxsLFx0XHRcdFx0XHRcdC8vZGVmYXVsdCB6b29tIGxldmVsIGZvciBtb3ZlIHRvIGxvY2F0aW9uXHJcblx0XHRtaW5MZW5ndGg6IDEsXHRcdFx0XHRcdC8vbWluaW1hbCB0ZXh0IGxlbmd0aCBmb3IgYXV0b2NvbXBsZXRlXHJcblx0XHRpbml0aWFsOiB0cnVlLFx0XHRcdFx0XHQvL3NlYXJjaCBlbGVtZW50cyBvbmx5IGJ5IGluaXRpYWwgdGV4dFxyXG5cdFx0Y2FzZXNlbnNpdGl2ZTogZmFsc2UsXHRcdFx0Ly9zZWFyY2ggZWxlbWVudHMgaW4gY2FzZSBzZW5zaXRpdmUgdGV4dFxyXG5cdFx0YXV0b1R5cGU6IHRydWUsXHRcdFx0XHRcdC8vY29tcGxldGUgaW5wdXQgd2l0aCBmaXJzdCBzdWdnZXN0ZWQgcmVzdWx0IGFuZCBzZWxlY3QgdGhpcyBmaWxsZWQtaW4gdGV4dC5cclxuXHRcdGRlbGF5VHlwZTogNDAwLFx0XHRcdFx0XHQvL2RlbGF5IHdoaWxlIHR5cGluZyBmb3Igc2hvdyB0b29sdGlwXHJcblx0XHR0b29sdGlwTGltaXQ6IC0xLFx0XHRcdFx0Ly9saW1pdCBtYXggcmVzdWx0cyB0byBzaG93IGluIHRvb2x0aXAuIC0xIGZvciBubyBsaW1pdCwgMCBmb3Igbm8gcmVzdWx0c1xyXG5cdFx0dGlwQXV0b1N1Ym1pdDogdHJ1ZSxcdFx0XHQvL2F1dG8gbWFwIHBhblRvIHdoZW4gY2xpY2sgb24gdG9vbHRpcFxyXG5cdFx0Zmlyc3RUaXBTdWJtaXQ6IGZhbHNlLFx0XHRcdC8vYXV0byBzZWxlY3QgZmlyc3QgcmVzdWx0IGNvbiBlbnRlciBjbGlja1xyXG5cdFx0YXV0b1Jlc2l6ZTogdHJ1ZSxcdFx0XHRcdC8vYXV0b3Jlc2l6ZSBvbiBpbnB1dCBjaGFuZ2VcclxuXHRcdGNvbGxhcHNlZDogdHJ1ZSxcdFx0XHRcdC8vY29sbGFwc2Ugc2VhcmNoIGNvbnRyb2wgYXQgc3RhcnR1cFxyXG5cdFx0YXV0b0NvbGxhcHNlOiBmYWxzZSxcdFx0XHQvL2NvbGxhcHNlIHNlYXJjaCBjb250cm9sIGFmdGVyIHN1Ym1pdChvbiBidXR0b24gb3Igb24gdGlwcyBpZiBlbmFibGVkIHRpcEF1dG9TdWJtaXQpXHJcblx0XHRhdXRvQ29sbGFwc2VUaW1lOiAxMjAwLFx0XHRcdC8vZGVsYXkgZm9yIGF1dG9jbG9zaW5nIGFsZXJ0IGFuZCBjb2xsYXBzZSBhZnRlciBibHVyXHJcblx0XHR0ZXh0RXJyOiAnTG9jYXRpb24gbm90IGZvdW5kJyxcdC8vZXJyb3IgbWVzc2FnZVxyXG5cdFx0dGV4dENhbmNlbDogJ0NhbmNlbCcsXHRcdCAgICAvL3RpdGxlIGluIGNhbmNlbCBidXR0b25cdFx0XHJcblx0XHR0ZXh0UGxhY2Vob2xkZXI6ICdTZWFyY2guLi4nLCAgIC8vcGxhY2Vob2xkZXIgdmFsdWVcdFx0XHRcclxuXHRcdGhpZGVNYXJrZXJPbkNvbGxhcHNlOiBmYWxzZSwgICAgLy9yZW1vdmUgY2lyY2xlIGFuZCBtYXJrZXIgb24gc2VhcmNoIGNvbnRyb2wgY29sbGFwc2VkXHRcdFxyXG5cdFx0cG9zaXRpb246ICd0b3BsZWZ0JyxcdFx0XHJcblx0XHRtYXJrZXI6IHtcdFx0XHRcdFx0XHQvL2N1c3RvbSBMLk1hcmtlciBvciBmYWxzZSBmb3IgaGlkZVxyXG5cdFx0XHRpY29uOiBmYWxzZSxcdFx0XHRcdC8vY3VzdG9tIEwuSWNvbiBmb3IgbWFrZXIgbG9jYXRpb24gb3IgZmFsc2UgZm9yIGhpZGVcclxuXHRcdFx0YW5pbWF0ZTogdHJ1ZSxcdFx0XHRcdC8vYW5pbWF0ZSBhIGNpcmNsZSBvdmVyIGxvY2F0aW9uIGZvdW5kXHJcblx0XHRcdGNpcmNsZToge1x0XHRcdFx0XHQvL2RyYXcgYSBjaXJjbGUgaW4gbG9jYXRpb24gZm91bmRcclxuXHRcdFx0XHRyYWRpdXM6IDEwLFxyXG5cdFx0XHRcdHdlaWdodDogMyxcclxuXHRcdFx0XHRjb2xvcjogJyNlMDMnLFxyXG5cdFx0XHRcdHN0cm9rZTogdHJ1ZSxcclxuXHRcdFx0XHRmaWxsOiBmYWxzZVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0X2dldFBhdGg6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xyXG5cdFx0dmFyIHBhcnRzID0gcHJvcC5zcGxpdCgnLicpLFxyXG5cdFx0XHRsYXN0ID0gcGFydHMucG9wKCksXHJcblx0XHRcdGxlbiA9IHBhcnRzLmxlbmd0aCxcclxuXHRcdFx0Y3VyID0gcGFydHNbMF0sXHJcblx0XHRcdGkgPSAxO1xyXG5cclxuXHRcdGlmKGxlbiA+IDApXHJcblx0XHRcdHdoaWxlKChvYmogPSBvYmpbY3VyXSkgJiYgaSA8IGxlbilcclxuXHRcdFx0XHRjdXIgPSBwYXJ0c1tpKytdO1xyXG5cclxuXHRcdGlmKG9iailcclxuXHRcdFx0cmV0dXJuIG9ialtsYXN0XTtcclxuXHR9LFxyXG5cclxuXHRfaXNPYmplY3Q6IGZ1bmN0aW9uKG9iaikge1xyXG5cdFx0cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgT2JqZWN0XVwiO1xyXG5cdH0sXHJcblxyXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcclxuXHRcdEwuVXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMgfHwge30pO1xyXG5cdFx0dGhpcy5faW5wdXRNaW5TaXplID0gdGhpcy5vcHRpb25zLnRleHRQbGFjZWhvbGRlciA/IHRoaXMub3B0aW9ucy50ZXh0UGxhY2Vob2xkZXIubGVuZ3RoIDogMTA7XHJcblx0XHR0aGlzLl9sYXllciA9IHRoaXMub3B0aW9ucy5sYXllciB8fCBuZXcgTC5MYXllckdyb3VwKCk7XHJcblx0XHR0aGlzLl9maWx0ZXJEYXRhID0gdGhpcy5vcHRpb25zLmZpbHRlckRhdGEgfHwgdGhpcy5fZGVmYXVsdEZpbHRlckRhdGE7XHJcblx0XHR0aGlzLl9mb3JtYXREYXRhID0gdGhpcy5vcHRpb25zLmZvcm1hdERhdGEgfHwgdGhpcy5fZGVmYXVsdEZvcm1hdERhdGE7XHJcblx0XHR0aGlzLl9tb3ZlVG9Mb2NhdGlvbiA9IHRoaXMub3B0aW9ucy5tb3ZlVG9Mb2NhdGlvbiB8fCB0aGlzLl9kZWZhdWx0TW92ZVRvTG9jYXRpb247XHJcblx0XHR0aGlzLl9hdXRvVHlwZVRtcCA9IHRoaXMub3B0aW9ucy5hdXRvVHlwZTtcdC8vdXNlZnVsIGZvciBkaXNhYmxlIGF1dG9UeXBlIHRlbXBvcmFyaWx5IGluIGRlbGV0ZS9iYWNrc3BhY2Uga2V5ZG93blxyXG5cdFx0dGhpcy5fY291bnRlcnRpcHMgPSAwO1x0XHQvL251bWJlciBvZiB0aXBzIGl0ZW1zXHJcblx0XHR0aGlzLl9yZWNvcmRzQ2FjaGUgPSB7fTtcdC8va2V5LHZhbHVlIHRhYmxlISB0byBzdG9yZSBsb2NhdGlvbnMhIGZvcm1hdDoga2V5LGxhdGxuZ1xyXG5cdFx0dGhpcy5fY3VyUmVxID0gbnVsbDtcclxuXHR9LFxyXG5cclxuXHRvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xyXG5cdFx0dGhpcy5fbWFwID0gbWFwO1xyXG5cdFx0dGhpcy5fY29udGFpbmVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2xlYWZsZXQtY29udHJvbC1zZWFyY2gnKTtcclxuXHRcdHRoaXMuX2lucHV0ID0gdGhpcy5fY3JlYXRlSW5wdXQodGhpcy5vcHRpb25zLnRleHRQbGFjZWhvbGRlciwgJ3NlYXJjaC1pbnB1dCcpO1xyXG5cdFx0dGhpcy5fdG9vbHRpcCA9IHRoaXMuX2NyZWF0ZVRvb2x0aXAoJ3NlYXJjaC10b29sdGlwJyk7XHJcblx0XHR0aGlzLl9jYW5jZWwgPSB0aGlzLl9jcmVhdGVDYW5jZWwodGhpcy5vcHRpb25zLnRleHRDYW5jZWwsICdzZWFyY2gtY2FuY2VsJyk7XHJcblx0XHR0aGlzLl9idXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24odGhpcy5vcHRpb25zLnRleHRQbGFjZWhvbGRlciwgJ3NlYXJjaC1idXR0b24nKTtcclxuXHRcdHRoaXMuX2FsZXJ0ID0gdGhpcy5fY3JlYXRlQWxlcnQoJ3NlYXJjaC1hbGVydCcpO1xyXG5cclxuXHRcdGlmKHRoaXMub3B0aW9ucy5jb2xsYXBzZWQ9PT1mYWxzZSlcclxuXHRcdFx0dGhpcy5leHBhbmQodGhpcy5vcHRpb25zLmNvbGxhcHNlZCk7XHJcblxyXG5cdFx0aWYodGhpcy5vcHRpb25zLm1hcmtlcikge1xyXG5cdFx0XHRcclxuXHRcdFx0aWYodGhpcy5vcHRpb25zLm1hcmtlciBpbnN0YW5jZW9mIEwuTWFya2VyIHx8IHRoaXMub3B0aW9ucy5tYXJrZXIgaW5zdGFuY2VvZiBMLkNpcmNsZU1hcmtlcilcclxuXHRcdFx0XHR0aGlzLl9tYXJrZXJTZWFyY2ggPSB0aGlzLm9wdGlvbnMubWFya2VyO1xyXG5cclxuXHRcdFx0ZWxzZSBpZih0aGlzLl9pc09iamVjdCh0aGlzLm9wdGlvbnMubWFya2VyKSlcclxuXHRcdFx0XHR0aGlzLl9tYXJrZXJTZWFyY2ggPSBuZXcgTC5Db250cm9sLlNlYXJjaC5NYXJrZXIoWzAsMF0sIHRoaXMub3B0aW9ucy5tYXJrZXIpO1xyXG5cclxuXHRcdFx0dGhpcy5fbWFya2VyU2VhcmNoLl9pc01hcmtlclNlYXJjaCA9IHRydWU7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zZXRMYXllciggdGhpcy5fbGF5ZXIgKTtcclxuXHJcblx0XHRtYXAub24oe1xyXG5cdFx0XHQvLyBcdFx0J2xheWVyYWRkJzogdGhpcy5fb25MYXllckFkZFJlbW92ZSxcclxuXHRcdFx0Ly8gXHRcdCdsYXllcnJlbW92ZSc6IHRoaXMuX29uTGF5ZXJBZGRSZW1vdmVcclxuXHRcdFx0J3Jlc2l6ZSc6IHRoaXMuX2hhbmRsZUF1dG9yZXNpemVcclxuXHRcdFx0fSwgdGhpcyk7XHJcblx0XHRyZXR1cm4gdGhpcy5fY29udGFpbmVyO1xyXG5cdH0sXHJcblx0YWRkVG86IGZ1bmN0aW9uIChtYXApIHtcclxuXHJcblx0XHRpZih0aGlzLm9wdGlvbnMuY29udGFpbmVyKSB7XHJcblx0XHRcdHRoaXMuX2NvbnRhaW5lciA9IHRoaXMub25BZGQobWFwKTtcclxuXHRcdFx0dGhpcy5fd3JhcHBlciA9IEwuRG9tVXRpbC5nZXQodGhpcy5vcHRpb25zLmNvbnRhaW5lcik7XHJcblx0XHRcdHRoaXMuX3dyYXBwZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG5cdFx0XHR0aGlzLl93cmFwcGVyLmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lcik7XHJcblx0XHR9XHJcblx0XHRlbHNlXHJcblx0XHRcdEwuQ29udHJvbC5wcm90b3R5cGUuYWRkVG8uY2FsbCh0aGlzLCBtYXApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblxyXG5cdG9uUmVtb3ZlOiBmdW5jdGlvbihtYXApIHtcclxuXHRcdHRoaXMuX3JlY29yZHNDYWNoZSA9IHt9O1xyXG5cdFx0Ly8gbWFwLm9mZih7XHJcblx0XHQvLyBcdFx0J2xheWVyYWRkJzogdGhpcy5fb25MYXllckFkZFJlbW92ZSxcclxuXHRcdC8vIFx0XHQnbGF5ZXJyZW1vdmUnOiB0aGlzLl9vbkxheWVyQWRkUmVtb3ZlXHJcblx0XHQvLyBcdH0sIHRoaXMpO1xyXG5cdFx0bWFwLm9mZih7XHJcblx0XHRcdC8vIFx0XHQnbGF5ZXJhZGQnOiB0aGlzLl9vbkxheWVyQWRkUmVtb3ZlLFxyXG5cdFx0XHQvLyBcdFx0J2xheWVycmVtb3ZlJzogdGhpcy5fb25MYXllckFkZFJlbW92ZVxyXG5cdFx0XHQncmVzaXplJzogdGhpcy5faGFuZGxlQXV0b3Jlc2l6ZVxyXG5cdFx0XHR9LCB0aGlzKTtcclxuXHR9LFxyXG5cclxuXHQvLyBfb25MYXllckFkZFJlbW92ZTogZnVuY3Rpb24oZSkge1xyXG5cdC8vIFx0Ly93aXRob3V0IHRoaXMsIHJ1biBzZXRMYXllciBhbHNvIGZvciBlYWNoIE1hcmtlcnMhISB0byBvcHRpbWl6ZSFcclxuXHQvLyBcdGlmKGUubGF5ZXIgaW5zdGFuY2VvZiBMLkxheWVyR3JvdXApXHJcblx0Ly8gXHRcdGlmKCBMLnN0YW1wKGUubGF5ZXIpICE9IEwuc3RhbXAodGhpcy5fbGF5ZXIpIClcclxuXHQvLyBcdFx0XHR0aGlzLnNldExheWVyKGUubGF5ZXIpO1xyXG5cdC8vIH0sXHJcblxyXG5cdHNldExheWVyOiBmdW5jdGlvbihsYXllcikge1x0Ly9zZXQgc2VhcmNoIGxheWVyIGF0IHJ1bnRpbWVcclxuXHRcdC8vdGhpcy5vcHRpb25zLmxheWVyID0gbGF5ZXI7IC8vc2V0dGluZyB0aGlzLCBydW4gb25seSB0aGlzLl9yZWNvcmRzRnJvbUxheWVyKClcclxuXHRcdHRoaXMuX2xheWVyID0gbGF5ZXI7XHJcblx0XHR0aGlzLl9sYXllci5hZGRUbyh0aGlzLl9tYXApO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fSxcclxuXHRcclxuXHRzaG93QWxlcnQ6IGZ1bmN0aW9uKHRleHQpIHtcclxuXHRcdHZhciBzZWxmID0gdGhpcztcclxuXHRcdHRleHQgPSB0ZXh0IHx8IHRoaXMub3B0aW9ucy50ZXh0RXJyO1xyXG5cdFx0dGhpcy5fYWxlcnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblx0XHR0aGlzLl9hbGVydC5pbm5lckhUTUwgPSB0ZXh0O1xyXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMudGltZXJBbGVydCk7XHJcblx0XHRcclxuXHRcdHRoaXMudGltZXJBbGVydCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdHNlbGYuaGlkZUFsZXJ0KCk7XHJcblx0XHR9LHRoaXMub3B0aW9ucy5hdXRvQ29sbGFwc2VUaW1lKTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblx0XHJcblx0aGlkZUFsZXJ0OiBmdW5jdGlvbigpIHtcclxuXHRcdHRoaXMuX2FsZXJ0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cdFx0XHJcblx0Y2FuY2VsOiBmdW5jdGlvbigpIHtcclxuXHRcdHRoaXMuX2lucHV0LnZhbHVlID0gJyc7XHJcblx0XHR0aGlzLl9oYW5kbGVLZXlwcmVzcyh7IGtleUNvZGU6IDggfSk7Ly9zaW11bGF0ZSBiYWNrc3BhY2Uga2V5cHJlc3NcclxuXHRcdHRoaXMuX2lucHV0LnNpemUgPSB0aGlzLl9pbnB1dE1pblNpemU7XHJcblx0XHR0aGlzLl9pbnB1dC5mb2N1cygpO1xyXG5cdFx0dGhpcy5fY2FuY2VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHR0aGlzLl9oaWRlVG9vbHRpcCgpO1xyXG5cdFx0dGhpcy5maXJlKCdzZWFyY2g6Y2FuY2VsJyk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cdFxyXG5cdGV4cGFuZDogZnVuY3Rpb24odG9nZ2xlKSB7XHJcblx0XHR0b2dnbGUgPSB0eXBlb2YgdG9nZ2xlID09PSAnYm9vbGVhbicgPyB0b2dnbGUgOiB0cnVlO1xyXG5cdFx0dGhpcy5faW5wdXQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblx0XHRMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fY29udGFpbmVyLCAnc2VhcmNoLWV4cCcpO1xyXG5cdFx0aWYgKCB0b2dnbGUgIT09IGZhbHNlICkge1xyXG5cdFx0XHR0aGlzLl9pbnB1dC5mb2N1cygpO1xyXG5cdFx0XHR0aGlzLl9tYXAub24oJ2RyYWdzdGFydCBjbGljaycsIHRoaXMuY29sbGFwc2UsIHRoaXMpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5maXJlKCdzZWFyY2g6ZXhwYW5kZWQnKTtcclxuXHRcdHJldHVybiB0aGlzO1x0XHJcblx0fSxcclxuXHJcblx0Y29sbGFwc2U6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dGhpcy5faGlkZVRvb2x0aXAoKTtcclxuXHRcdHRoaXMuY2FuY2VsKCk7XHJcblx0XHR0aGlzLl9hbGVydC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0dGhpcy5faW5wdXQuYmx1cigpO1xyXG5cdFx0aWYodGhpcy5vcHRpb25zLmNvbGxhcHNlZClcclxuXHRcdHtcclxuXHRcdFx0dGhpcy5faW5wdXQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdFx0dGhpcy5fY2FuY2VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHRcdFx0XHJcblx0XHRcdEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9jb250YWluZXIsICdzZWFyY2gtZXhwJyk7XHRcdFxyXG5cdFx0XHRpZiAodGhpcy5vcHRpb25zLmhpZGVNYXJrZXJPbkNvbGxhcHNlKSB7XHJcblx0XHRcdFx0dGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX21hcmtlclNlYXJjaCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5fbWFwLm9mZignZHJhZ3N0YXJ0IGNsaWNrJywgdGhpcy5jb2xsYXBzZSwgdGhpcyk7XHJcblx0XHR9XHJcblx0XHR0aGlzLmZpcmUoJ3NlYXJjaDpjb2xsYXBzZWQnKTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblx0XHJcblx0Y29sbGFwc2VEZWxheWVkOiBmdW5jdGlvbigpIHtcdC8vY29sbGFwc2UgYWZ0ZXIgZGVsYXksIHVzZWQgb25faW5wdXQgYmx1clxyXG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xyXG5cdFx0aWYgKCF0aGlzLm9wdGlvbnMuYXV0b0NvbGxhcHNlKSByZXR1cm4gdGhpcztcclxuXHRcdGNsZWFyVGltZW91dCh0aGlzLnRpbWVyQ29sbGFwc2UpO1xyXG5cdFx0dGhpcy50aW1lckNvbGxhcHNlID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuXHRcdFx0c2VsZi5jb2xsYXBzZSgpO1xyXG5cdFx0fSwgdGhpcy5vcHRpb25zLmF1dG9Db2xsYXBzZVRpbWUpO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHRcdFxyXG5cdH0sXHJcblxyXG5cdGNvbGxhcHNlRGVsYXllZFN0b3A6IGZ1bmN0aW9uKCkge1xyXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMudGltZXJDb2xsYXBzZSk7XHJcblx0XHRyZXR1cm4gdGhpcztcdFx0XHJcblx0fSxcclxuXHJcblx0Ly8vL3N0YXJ0IERPTSBjcmVhdGlvbnNcclxuXHRfY3JlYXRlQWxlcnQ6IGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xyXG5cdFx0dmFyIGFsZXJ0ID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgY2xhc3NOYW1lLCB0aGlzLl9jb250YWluZXIpO1xyXG5cdFx0YWxlcnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcblx0XHRMLkRvbUV2ZW50XHJcblx0XHRcdC5vbihhbGVydCwgJ2NsaWNrJywgTC5Eb21FdmVudC5zdG9wLCB0aGlzKVxyXG5cdFx0XHQub24oYWxlcnQsICdjbGljaycsIHRoaXMuaGlkZUFsZXJ0LCB0aGlzKTtcclxuXHJcblx0XHRyZXR1cm4gYWxlcnQ7XHJcblx0fSxcclxuXHJcblx0X2NyZWF0ZUlucHV0OiBmdW5jdGlvbiAodGV4dCwgY2xhc3NOYW1lKSB7XHJcblx0XHR2YXIgc2VsZiA9IHRoaXM7XHJcblx0XHR2YXIgbGFiZWwgPSBMLkRvbVV0aWwuY3JlYXRlKCdsYWJlbCcsIGNsYXNzTmFtZSwgdGhpcy5fY29udGFpbmVyKTtcclxuXHRcdHZhciBpbnB1dCA9IEwuRG9tVXRpbC5jcmVhdGUoJ2lucHV0JywgY2xhc3NOYW1lLCB0aGlzLl9jb250YWluZXIpO1xyXG5cdFx0aW5wdXQudHlwZSA9ICd0ZXh0JztcclxuXHRcdGlucHV0LnNpemUgPSB0aGlzLl9pbnB1dE1pblNpemU7XHJcblx0XHRpbnB1dC52YWx1ZSA9ICcnO1xyXG5cdFx0aW5wdXQuYXV0b2NvbXBsZXRlID0gJ29mZic7XHJcblx0XHRpbnB1dC5hdXRvY29ycmVjdCA9ICdvZmYnO1xyXG5cdFx0aW5wdXQuYXV0b2NhcGl0YWxpemUgPSAnb2ZmJztcclxuXHRcdGlucHV0LnBsYWNlaG9sZGVyID0gdGV4dDtcclxuXHRcdGlucHV0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHRpbnB1dC5yb2xlID0gJ3NlYXJjaCc7XHJcblx0XHRpbnB1dC5pZCA9IGlucHV0LnJvbGUgKyBpbnB1dC50eXBlICsgaW5wdXQuc2l6ZTtcclxuXHRcdFxyXG5cdFx0bGFiZWwuaHRtbEZvciA9IGlucHV0LmlkO1xyXG5cdFx0bGFiZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdGxhYmVsLnZhbHVlID0gdGV4dDtcclxuXHJcblx0XHRMLkRvbUV2ZW50XHJcblx0XHRcdC5kaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbihpbnB1dClcclxuXHRcdFx0Lm9uKGlucHV0LCAna2V5dXAnLCB0aGlzLl9oYW5kbGVLZXlwcmVzcywgdGhpcylcclxuXHRcdFx0Lm9uKGlucHV0LCAncGFzdGUnLCBmdW5jdGlvbihlKSB7XHJcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbihlKSB7XHJcblx0XHRcdFx0XHRzZWxmLl9oYW5kbGVLZXlwcmVzcyhlKTtcclxuXHRcdFx0XHR9LDEwLGUpO1xyXG5cdFx0XHR9LCB0aGlzKVxyXG5cdFx0XHQub24oaW5wdXQsICdibHVyJywgdGhpcy5jb2xsYXBzZURlbGF5ZWQsIHRoaXMpXHJcblx0XHRcdC5vbihpbnB1dCwgJ2ZvY3VzJywgdGhpcy5jb2xsYXBzZURlbGF5ZWRTdG9wLCB0aGlzKTtcclxuXHRcdFxyXG5cdFx0cmV0dXJuIGlucHV0O1xyXG5cdH0sXHJcblxyXG5cdF9jcmVhdGVDYW5jZWw6IGZ1bmN0aW9uICh0aXRsZSwgY2xhc3NOYW1lKSB7XHJcblx0XHR2YXIgY2FuY2VsID0gTC5Eb21VdGlsLmNyZWF0ZSgnYScsIGNsYXNzTmFtZSwgdGhpcy5fY29udGFpbmVyKTtcclxuXHRcdGNhbmNlbC5ocmVmID0gJyMnO1xyXG5cdFx0Y2FuY2VsLnRpdGxlID0gdGl0bGU7XHJcblx0XHRjYW5jZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdGNhbmNlbC5pbm5lckhUTUwgPSBcIjxzcGFuPiZvdGltZXM7PC9zcGFuPlwiOy8vaW1hZ2VsZXNzKHNlZSBjc3MpXHJcblxyXG5cdFx0TC5Eb21FdmVudFxyXG5cdFx0XHQub24oY2FuY2VsLCAnY2xpY2snLCBMLkRvbUV2ZW50LnN0b3AsIHRoaXMpXHJcblx0XHRcdC5vbihjYW5jZWwsICdjbGljaycsIHRoaXMuY2FuY2VsLCB0aGlzKTtcclxuXHJcblx0XHRyZXR1cm4gY2FuY2VsO1xyXG5cdH0sXHJcblx0XHJcblx0X2NyZWF0ZUJ1dHRvbjogZnVuY3Rpb24gKHRpdGxlLCBjbGFzc05hbWUpIHtcclxuXHRcdHZhciBidXR0b24gPSBMLkRvbVV0aWwuY3JlYXRlKCdhJywgY2xhc3NOYW1lLCB0aGlzLl9jb250YWluZXIpO1xyXG5cdFx0YnV0dG9uLmhyZWYgPSAnIyc7XHJcblx0XHRidXR0b24udGl0bGUgPSB0aXRsZTtcclxuXHJcblx0XHRMLkRvbUV2ZW50XHJcblx0XHRcdC5vbihidXR0b24sICdjbGljaycsIEwuRG9tRXZlbnQuc3RvcCwgdGhpcylcclxuXHRcdFx0Lm9uKGJ1dHRvbiwgJ2NsaWNrJywgdGhpcy5faGFuZGxlU3VibWl0LCB0aGlzKVx0XHRcdFxyXG5cdFx0XHQub24oYnV0dG9uLCAnZm9jdXMnLCB0aGlzLmNvbGxhcHNlRGVsYXllZFN0b3AsIHRoaXMpXHJcblx0XHRcdC5vbihidXR0b24sICdibHVyJywgdGhpcy5jb2xsYXBzZURlbGF5ZWQsIHRoaXMpO1xyXG5cclxuXHRcdHJldHVybiBidXR0b247XHJcblx0fSxcclxuXHJcblx0X2NyZWF0ZVRvb2x0aXA6IGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xyXG5cdFx0dmFyIHNlbGYgPSB0aGlzO1x0XHRcclxuXHRcdHZhciB0b29sID0gTC5Eb21VdGlsLmNyZWF0ZSgndWwnLCBjbGFzc05hbWUsIHRoaXMuX2NvbnRhaW5lcik7XHJcblx0XHR0b29sLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHRMLkRvbUV2ZW50XHJcblx0XHRcdC5kaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbih0b29sKVxyXG5cdFx0XHQub24odG9vbCwgJ2JsdXInLCB0aGlzLmNvbGxhcHNlRGVsYXllZCwgdGhpcylcclxuXHRcdFx0Lm9uKHRvb2wsICdtb3VzZXdoZWVsJywgZnVuY3Rpb24oZSkge1xyXG5cdFx0XHRcdHNlbGYuY29sbGFwc2VEZWxheWVkU3RvcCgpO1xyXG5cdFx0XHRcdEwuRG9tRXZlbnQuc3RvcFByb3BhZ2F0aW9uKGUpOy8vZGlzYWJsZSB6b29tIG1hcFxyXG5cdFx0XHR9LCB0aGlzKVxyXG5cdFx0XHQub24odG9vbCwgJ21vdXNlb3ZlcicsIGZ1bmN0aW9uKGUpIHtcclxuXHRcdFx0XHRzZWxmLmNvbGxhcHNlRGVsYXllZFN0b3AoKTtcclxuXHRcdFx0fSwgdGhpcyk7XHJcblx0XHRyZXR1cm4gdG9vbDtcclxuXHR9LFxyXG5cclxuXHRfY3JlYXRlVGlwOiBmdW5jdGlvbih0ZXh0LCB2YWwpIHsvL3ZhbCBpcyBvYmplY3QgaW4gcmVjb3JkQ2FjaGUsIHVzdWFsbHkgaXMgTGF0bG5nXHJcblx0XHR2YXIgdGlwO1xyXG5cdFx0XHJcblx0XHRpZih0aGlzLm9wdGlvbnMuYnVpbGRUaXApXHJcblx0XHR7XHJcblx0XHRcdHRpcCA9IHRoaXMub3B0aW9ucy5idWlsZFRpcC5jYWxsKHRoaXMsIHRleHQsIHZhbCk7IC8vY3VzdG9tIHRpcCBub2RlIG9yIGh0bWwgc3RyaW5nXHJcblx0XHRcdGlmKHR5cGVvZiB0aXAgPT09ICdzdHJpbmcnKVxyXG5cdFx0XHR7XHJcblx0XHRcdFx0dmFyIHRtcE5vZGUgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnKTtcclxuXHRcdFx0XHR0bXBOb2RlLmlubmVySFRNTCA9IHRpcDtcclxuXHRcdFx0XHR0aXAgPSB0bXBOb2RlLmZpcnN0Q2hpbGQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGVsc2VcclxuXHRcdHtcclxuXHRcdFx0dGlwID0gTC5Eb21VdGlsLmNyZWF0ZSgnbGknLCAnJyk7XHJcblx0XHRcdHRpcC5pbm5lckhUTUwgPSB0ZXh0O1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHRMLkRvbVV0aWwuYWRkQ2xhc3ModGlwLCAnc2VhcmNoLXRpcCcpO1xyXG5cdFx0dGlwLl90ZXh0ID0gdGV4dDsgLy92YWx1ZSByZXBsYWNlZCBpbiB0aGlzLl9pbnB1dCBhbmQgdXNlZCBieSBfYXV0b1R5cGVcclxuXHJcblx0XHRpZih0aGlzLm9wdGlvbnMudGlwQXV0b1N1Ym1pdClcclxuXHRcdFx0TC5Eb21FdmVudFxyXG5cdFx0XHRcdC5kaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbih0aXApXHRcdFxyXG5cdFx0XHRcdC5vbih0aXAsICdjbGljaycsIEwuRG9tRXZlbnQuc3RvcCwgdGhpcylcclxuXHRcdFx0XHQub24odGlwLCAnY2xpY2snLCBmdW5jdGlvbihlKSB7XHJcblx0XHRcdFx0XHR0aGlzLl9pbnB1dC52YWx1ZSA9IHRleHQ7XHJcblx0XHRcdFx0XHR0aGlzLl9oYW5kbGVBdXRvcmVzaXplKCk7XHJcblx0XHRcdFx0XHR0aGlzLl9pbnB1dC5mb2N1cygpO1xyXG5cdFx0XHRcdFx0dGhpcy5faGlkZVRvb2x0aXAoKTtcdFxyXG5cdFx0XHRcdFx0dGhpcy5faGFuZGxlU3VibWl0KCk7XHJcblx0XHRcdFx0fSwgdGhpcyk7XHJcblxyXG5cdFx0cmV0dXJuIHRpcDtcclxuXHR9LFxyXG5cclxuXHQvLy8vLy9lbmQgRE9NIGNyZWF0aW9uc1xyXG5cclxuXHRfZ2V0VXJsOiBmdW5jdGlvbih0ZXh0KSB7XHJcblx0XHRyZXR1cm4gKHR5cGVvZiB0aGlzLm9wdGlvbnMudXJsID09PSAnZnVuY3Rpb24nKSA/IHRoaXMub3B0aW9ucy51cmwodGV4dCkgOiB0aGlzLm9wdGlvbnMudXJsO1xyXG5cdH0sXHJcblxyXG5cdF9kZWZhdWx0RmlsdGVyRGF0YTogZnVuY3Rpb24odGV4dCwgcmVjb3Jkcykge1xyXG5cdFxyXG5cdFx0dmFyIEksIGljYXNlLCByZWdTZWFyY2gsIGZyZWNvcmRzID0ge307XHJcblxyXG5cdFx0dGV4dCA9IHRleHQucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICcnKTsgIC8vc2FuaXRpemUgcmVtb3ZlIGFsbCBzcGVjaWFsIGNoYXJhY3RlcnNcclxuXHRcdGlmKHRleHQ9PT0nJylcclxuXHRcdFx0cmV0dXJuIFtdO1xyXG5cclxuXHRcdEkgPSB0aGlzLm9wdGlvbnMuaW5pdGlhbCA/ICdeJyA6ICcnOyAgLy9zZWFyY2ggb25seSBpbml0aWFsIHRleHRcclxuXHRcdGljYXNlID0gIXRoaXMub3B0aW9ucy5jYXNlc2Vuc2l0aXZlID8gJ2knIDogdW5kZWZpbmVkO1xyXG5cclxuXHRcdHJlZ1NlYXJjaCA9IG5ldyBSZWdFeHAoSSArIHRleHQsIGljYXNlKTtcclxuXHJcblx0XHQvL1RPRE8gdXNlIC5maWx0ZXIgb3IgLm1hcFxyXG5cdFx0Zm9yKHZhciBrZXkgaW4gcmVjb3Jkcykge1xyXG5cdFx0XHRpZiggcmVnU2VhcmNoLnRlc3Qoa2V5KSApXHJcblx0XHRcdFx0ZnJlY29yZHNba2V5XT0gcmVjb3Jkc1trZXldO1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHRyZXR1cm4gZnJlY29yZHM7XHJcblx0fSxcclxuXHJcblx0c2hvd1Rvb2x0aXA6IGZ1bmN0aW9uKHJlY29yZHMpIHtcclxuXHRcdFxyXG5cclxuXHRcdHRoaXMuX2NvdW50ZXJ0aXBzID0gMDtcclxuXHRcdHRoaXMuX3Rvb2x0aXAuaW5uZXJIVE1MID0gJyc7XHJcblx0XHR0aGlzLl90b29sdGlwLmN1cnJlbnRTZWxlY3Rpb24gPSAtMTsgIC8vaW5pemlhbGl6ZWQgZm9yIF9oYW5kbGVBcnJvd1NlbGVjdCgpXHJcblxyXG5cdFx0aWYodGhpcy5vcHRpb25zLnRvb2x0aXBMaW1pdClcclxuXHRcdHtcclxuXHRcdFx0Zm9yKHZhciBrZXkgaW4gcmVjb3JkcykvL2ZpbGwgdG9vbHRpcFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0aWYodGhpcy5fY291bnRlcnRpcHMgPT09IHRoaXMub3B0aW9ucy50b29sdGlwTGltaXQpXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcclxuXHRcdFx0XHR0aGlzLl9jb3VudGVydGlwcysrO1xyXG5cclxuXHRcdFx0XHR0aGlzLl90b29sdGlwLmFwcGVuZENoaWxkKCB0aGlzLl9jcmVhdGVUaXAoa2V5LCByZWNvcmRzW2tleV0pICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0aWYodGhpcy5fY291bnRlcnRpcHMgPiAwKVxyXG5cdFx0e1xyXG5cdFx0XHR0aGlzLl90b29sdGlwLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cdFx0XHRcclxuXHRcdFx0aWYodGhpcy5fYXV0b1R5cGVUbXApXHJcblx0XHRcdFx0dGhpcy5fYXV0b1R5cGUoKTtcclxuXHJcblx0XHRcdHRoaXMuX2F1dG9UeXBlVG1wID0gdGhpcy5vcHRpb25zLmF1dG9UeXBlOy8vcmVzZXQgZGVmYXVsdCB2YWx1ZVxyXG5cdFx0fVxyXG5cdFx0ZWxzZVxyXG5cdFx0XHR0aGlzLl9oaWRlVG9vbHRpcCgpO1xyXG5cclxuXHRcdHRoaXMuX3Rvb2x0aXAuc2Nyb2xsVG9wID0gMDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fY291bnRlcnRpcHM7XHJcblx0fSxcclxuXHJcblx0X2hpZGVUb29sdGlwOiBmdW5jdGlvbigpIHtcclxuXHRcdHRoaXMuX3Rvb2x0aXAuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdHRoaXMuX3Rvb2x0aXAuaW5uZXJIVE1MID0gJyc7XHJcblx0XHRyZXR1cm4gMDtcclxuXHR9LFxyXG5cclxuXHRfZGVmYXVsdEZvcm1hdERhdGE6IGZ1bmN0aW9uKGpzb24pIHtcdC8vZGVmYXVsdCBjYWxsYmFjayBmb3IgZm9ybWF0IGRhdGEgdG8gaW5kZXhlZCBkYXRhXHJcblx0XHR2YXIgc2VsZiA9IHRoaXMsXHJcblx0XHRcdHByb3BOYW1lID0gdGhpcy5vcHRpb25zLnByb3BlcnR5TmFtZSxcclxuXHRcdFx0cHJvcExvYyA9IHRoaXMub3B0aW9ucy5wcm9wZXJ0eUxvYyxcclxuXHRcdFx0aSwganNvbnJldCA9IHt9O1xyXG5cclxuXHRcdGlmKCBMLlV0aWwuaXNBcnJheShwcm9wTG9jKSApXHJcblx0XHRcdGZvcihpIGluIGpzb24pXHJcblx0XHRcdFx0anNvbnJldFsgc2VsZi5fZ2V0UGF0aChqc29uW2ldLHByb3BOYW1lKSBdPSBMLmxhdExuZygganNvbltpXVsgcHJvcExvY1swXSBdLCBqc29uW2ldWyBwcm9wTG9jWzFdIF0gKTtcclxuXHRcdGVsc2VcclxuXHRcdFx0Zm9yKGkgaW4ganNvbilcclxuXHRcdFx0XHRqc29ucmV0WyBzZWxmLl9nZXRQYXRoKGpzb25baV0scHJvcE5hbWUpIF09IEwubGF0TG5nKCBzZWxmLl9nZXRQYXRoKGpzb25baV0scHJvcExvYykgKTtcclxuXHRcdC8vVE9ETyB0aHJvdyBuZXcgRXJyb3IoXCJwcm9wZXJ0eU5hbWUgJ1wiK3Byb3BOYW1lK1wiJyBub3QgZm91bmQgaW4gSlNPTiBkYXRhXCIpO1xyXG5cdFx0cmV0dXJuIGpzb25yZXQ7XHJcblx0fSxcclxuXHJcblx0X3JlY29yZHNGcm9tSnNvbnA6IGZ1bmN0aW9uKHRleHQsIGNhbGxBZnRlcikgeyAgLy9leHRyYWN0IHNlYXJjaGVkIHJlY29yZHMgZnJvbSByZW1vdGUganNvbnAgc2VydmljZVxyXG5cdFx0TC5Db250cm9sLlNlYXJjaC5jYWxsSnNvbnAgPSBjYWxsQWZ0ZXI7XHJcblx0XHR2YXIgc2NyaXB0ID0gTC5Eb21VdGlsLmNyZWF0ZSgnc2NyaXB0JywnbGVhZmxldC1zZWFyY2gtanNvbnAnLCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdICksXHRcdFx0XHJcblx0XHRcdHVybCA9IEwuVXRpbC50ZW1wbGF0ZSh0aGlzLl9nZXRVcmwodGV4dCkrJyYnK3RoaXMub3B0aW9ucy5qc29ucFBhcmFtKyc9TC5Db250cm9sLlNlYXJjaC5jYWxsSnNvbnAnLCB7czogdGV4dH0pOyAvL3BhcnNpbmcgdXJsXHJcblx0XHRcdC8vcm5kID0gJyZfPScrTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjEwMDAwKTtcclxuXHRcdFx0Ly9UT0RPIGFkZCBybmQgcGFyYW0gb3IgcmFuZG9taXplIGNhbGxiYWNrIG5hbWUhIGluIHJlY29yZHNGcm9tSnNvbnBcclxuXHRcdHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XHJcblx0XHRzY3JpcHQuc3JjID0gdXJsO1xyXG5cdFx0cmV0dXJuIHsgYWJvcnQ6IGZ1bmN0aW9uKCkgeyBzY3JpcHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHQpOyB9IH07XHJcblx0fSxcclxuXHJcblx0X3JlY29yZHNGcm9tQWpheDogZnVuY3Rpb24odGV4dCwgY2FsbEFmdGVyKSB7XHQvL0FqYXggcmVxdWVzdFxyXG5cdFx0aWYgKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHdpbmRvdy5YTUxIdHRwUmVxdWVzdCA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxIVFRQLjYuMFwiKTsgfVxyXG5cdFx0XHRcdGNhdGNoICAoZTEpIHtcclxuXHRcdFx0XHRcdHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxIVFRQLjMuMFwiKTsgfVxyXG5cdFx0XHRcdFx0Y2F0Y2ggKGUyKSB7IHRocm93IG5ldyBFcnJvcihcIlhNTEh0dHBSZXF1ZXN0IGlzIG5vdCBzdXBwb3J0ZWRcIik7IH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0XHR2YXIgSUU4b3I5ID0gKCBMLkJyb3dzZXIuaWUgJiYgIXdpbmRvdy5hdG9iICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgKSxcclxuXHRcdFx0cmVxdWVzdCA9IElFOG9yOSA/IG5ldyBYRG9tYWluUmVxdWVzdCgpIDogbmV3IFhNTEh0dHBSZXF1ZXN0KCksXHJcblx0XHRcdHVybCA9IEwuVXRpbC50ZW1wbGF0ZSh0aGlzLl9nZXRVcmwodGV4dCksIHtzOiB0ZXh0fSk7XHJcblxyXG5cdFx0Ly9ybmQgPSAnJl89JytNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMTAwMDApO1xyXG5cdFx0Ly9UT0RPIGFkZCBybmQgcGFyYW0gb3IgcmFuZG9taXplIGNhbGxiYWNrIG5hbWUhIGluIHJlY29yZHNGcm9tQWpheFx0XHRcdFxyXG5cdFx0XHJcblx0XHRyZXF1ZXN0Lm9wZW4oXCJHRVRcIiwgdXJsKTtcclxuXHRcdFxyXG5cclxuXHRcdHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdGNhbGxBZnRlciggSlNPTi5wYXJzZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCkgKTtcclxuXHRcdH07XHJcblx0XHRyZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0ICAgIGlmKHJlcXVlc3QucmVhZHlTdGF0ZSA9PT0gNCAmJiByZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XHJcblx0XHQgICAgXHR0aGlzLm9ubG9hZCgpO1xyXG5cdFx0ICAgIH1cclxuXHRcdH07XHJcblxyXG5cdFx0cmVxdWVzdC5zZW5kKCk7XHJcblx0XHRyZXR1cm4gcmVxdWVzdDsgICBcclxuXHR9LFxyXG5cclxuICBfc2VhcmNoSW5MYXllcjogZnVuY3Rpb24obGF5ZXIsIHJldFJlY29yZHMsIHByb3BOYW1lKSB7XHJcbiAgICB2YXIgc2VsZiA9IHRoaXMsIGxvYztcclxuXHJcbiAgICBpZihsYXllciBpbnN0YW5jZW9mIEwuQ29udHJvbC5TZWFyY2guTWFya2VyKSByZXR1cm47XHJcblxyXG4gICAgaWYobGF5ZXIgaW5zdGFuY2VvZiBMLk1hcmtlciB8fCBsYXllciBpbnN0YW5jZW9mIEwuQ2lyY2xlTWFya2VyKVxyXG4gICAge1xyXG4gICAgICBpZihzZWxmLl9nZXRQYXRoKGxheWVyLm9wdGlvbnMscHJvcE5hbWUpKVxyXG4gICAgICB7XHJcbiAgICAgICAgbG9jID0gbGF5ZXIuZ2V0TGF0TG5nKCk7XHJcbiAgICAgICAgbG9jLmxheWVyID0gbGF5ZXI7XHJcbiAgICAgICAgcmV0UmVjb3Jkc1sgc2VsZi5fZ2V0UGF0aChsYXllci5vcHRpb25zLHByb3BOYW1lKSBdID0gbG9jO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYoc2VsZi5fZ2V0UGF0aChsYXllci5mZWF0dXJlLnByb3BlcnRpZXMscHJvcE5hbWUpKVxyXG4gICAgICB7XHJcbiAgICAgICAgbG9jID0gbGF5ZXIuZ2V0TGF0TG5nKCk7XHJcbiAgICAgICAgbG9jLmxheWVyID0gbGF5ZXI7XHJcbiAgICAgICAgcmV0UmVjb3Jkc1sgc2VsZi5fZ2V0UGF0aChsYXllci5mZWF0dXJlLnByb3BlcnRpZXMscHJvcE5hbWUpIF0gPSBsb2M7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJwcm9wZXJ0eU5hbWUgJ1wiK3Byb3BOYW1lK1wiJyBub3QgZm91bmQgaW4gbWFya2VyXCIpOyBcclxuICAgICAgICBjb25zb2xlLndhcm4oXCJwcm9wZXJ0eU5hbWUgJ1wiK3Byb3BOYW1lK1wiJyBub3QgZm91bmQgaW4gbWFya2VyXCIpOyBcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZihsYXllciBpbnN0YW5jZW9mIEwuUGF0aCB8fCBsYXllciBpbnN0YW5jZW9mIEwuUG9seWxpbmUgfHwgbGF5ZXIgaW5zdGFuY2VvZiBMLlBvbHlnb24pXHJcbiAgICB7XHJcbiAgICAgIGlmKHNlbGYuX2dldFBhdGgobGF5ZXIub3B0aW9ucyxwcm9wTmFtZSkpXHJcbiAgICAgIHtcclxuICAgICAgICBsb2MgPSBsYXllci5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTtcclxuICAgICAgICBsb2MubGF5ZXIgPSBsYXllcjtcclxuICAgICAgICByZXRSZWNvcmRzWyBzZWxmLl9nZXRQYXRoKGxheWVyLm9wdGlvbnMscHJvcE5hbWUpIF0gPSBsb2M7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZihzZWxmLl9nZXRQYXRoKGxheWVyLmZlYXR1cmUucHJvcGVydGllcyxwcm9wTmFtZSkpXHJcbiAgICAgIHtcclxuICAgICAgICBsb2MgPSBsYXllci5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTtcclxuICAgICAgICBsb2MubGF5ZXIgPSBsYXllcjtcclxuICAgICAgICByZXRSZWNvcmRzWyBzZWxmLl9nZXRQYXRoKGxheWVyLmZlYXR1cmUucHJvcGVydGllcyxwcm9wTmFtZSkgXSA9IGxvYztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvL3Rocm93IG5ldyBFcnJvcihcInByb3BlcnR5TmFtZSAnXCIrcHJvcE5hbWUrXCInIG5vdCBmb3VuZCBpbiBzaGFwZVwiKTsgXHJcbiAgICAgICAgY29uc29sZS53YXJuKFwicHJvcGVydHlOYW1lICdcIitwcm9wTmFtZStcIicgbm90IGZvdW5kIGluIHNoYXBlXCIpOyBcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZihsYXllci5oYXNPd25Qcm9wZXJ0eSgnZmVhdHVyZScpKS8vR2VvSlNPTlxyXG4gICAge1xyXG4gICAgICBpZihsYXllci5mZWF0dXJlLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYobGF5ZXIuZ2V0TGF0TG5nICYmIHR5cGVvZiBsYXllci5nZXRMYXRMbmcgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgIGxvYyA9IGxheWVyLmdldExhdExuZygpO1xyXG4gICAgICAgICAgbG9jLmxheWVyID0gbGF5ZXI7XHRcdFx0XHJcbiAgICAgICAgICByZXRSZWNvcmRzWyBsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbcHJvcE5hbWVdIF0gPSBsb2M7XHJcbiAgICAgICAgfSBlbHNlIGlmKGxheWVyLmdldEJvdW5kcyAmJiB0eXBlb2YgbGF5ZXIuZ2V0Qm91bmRzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICBsb2MgPSBsYXllci5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTtcclxuICAgICAgICAgIGxvYy5sYXllciA9IGxheWVyO1x0XHRcdFxyXG4gICAgICAgICAgcmV0UmVjb3Jkc1sgbGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW3Byb3BOYW1lXSBdID0gbG9jO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJVbmtub3duIHR5cGUgb2YgTGF5ZXJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vdGhyb3cgbmV3IEVycm9yKFwicHJvcGVydHlOYW1lICdcIitwcm9wTmFtZStcIicgbm90IGZvdW5kIGluIGZlYXR1cmVcIik7XHJcbiAgICAgICAgY29uc29sZS53YXJuKFwicHJvcGVydHlOYW1lICdcIitwcm9wTmFtZStcIicgbm90IGZvdW5kIGluIGZlYXR1cmVcIik7IFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKGxheWVyIGluc3RhbmNlb2YgTC5MYXllckdyb3VwKVxyXG4gICAge1xyXG4gICAgICBsYXllci5lYWNoTGF5ZXIoZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgc2VsZi5fc2VhcmNoSW5MYXllcihsYXllciwgcmV0UmVjb3JkcywgcHJvcE5hbWUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9LFxyXG5cdFxyXG5cdF9yZWNvcmRzRnJvbUxheWVyOiBmdW5jdGlvbigpIHtcdC8vcmV0dXJuIHRhYmxlOiBrZXksdmFsdWUgZnJvbSBsYXllclxyXG5cdFx0dmFyIHNlbGYgPSB0aGlzLFxyXG5cdFx0XHRyZXRSZWNvcmRzID0ge30sXHJcblx0XHRcdHByb3BOYW1lID0gdGhpcy5vcHRpb25zLnByb3BlcnR5TmFtZTtcclxuXHRcdFxyXG5cdFx0dGhpcy5fbGF5ZXIuZWFjaExheWVyKGZ1bmN0aW9uIChsYXllcikge1xyXG5cdFx0XHRzZWxmLl9zZWFyY2hJbkxheWVyKGxheWVyLCByZXRSZWNvcmRzLCBwcm9wTmFtZSk7XHJcblx0XHR9KTtcclxuXHRcdFxyXG5cdFx0cmV0dXJuIHJldFJlY29yZHM7XHJcblx0fSxcclxuXHRcclxuXHRfYXV0b1R5cGU6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHJcblx0XHQvL1RPRE8gaW1wbGVtZW50cyBhdXR5cGUgd2l0aG91dCBzZWxlY3Rpb24odXNlZnVsIGZvciBtb2JpbGUgZGV2aWNlKVxyXG5cdFx0XHJcblx0XHR2YXIgc3RhcnQgPSB0aGlzLl9pbnB1dC52YWx1ZS5sZW5ndGgsXHJcblx0XHRcdGZpcnN0UmVjb3JkID0gdGhpcy5fdG9vbHRpcC5maXJzdENoaWxkID8gdGhpcy5fdG9vbHRpcC5maXJzdENoaWxkLl90ZXh0IDogJycsXHJcblx0XHRcdGVuZCA9IGZpcnN0UmVjb3JkLmxlbmd0aDtcclxuXHJcblx0XHRpZiAoZmlyc3RSZWNvcmQuaW5kZXhPZih0aGlzLl9pbnB1dC52YWx1ZSkgPT09IDApIHsgLy8gSWYgcHJlZml4IG1hdGNoXHJcblx0XHRcdHRoaXMuX2lucHV0LnZhbHVlID0gZmlyc3RSZWNvcmQ7XHJcblx0XHRcdHRoaXMuX2hhbmRsZUF1dG9yZXNpemUoKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLl9pbnB1dC5jcmVhdGVUZXh0UmFuZ2UpIHtcclxuXHRcdFx0XHR2YXIgc2VsUmFuZ2UgPSB0aGlzLl9pbnB1dC5jcmVhdGVUZXh0UmFuZ2UoKTtcclxuXHRcdFx0XHRzZWxSYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuXHRcdFx0XHRzZWxSYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIHN0YXJ0KTtcclxuXHRcdFx0XHRzZWxSYW5nZS5tb3ZlRW5kKCdjaGFyYWN0ZXInLCBlbmQpO1xyXG5cdFx0XHRcdHNlbFJhbmdlLnNlbGVjdCgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgaWYodGhpcy5faW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcclxuXHRcdFx0XHR0aGlzLl9pbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIGlmKHRoaXMuX2lucHV0LnNlbGVjdGlvblN0YXJ0KSB7XHJcblx0XHRcdFx0dGhpcy5faW5wdXQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcclxuXHRcdFx0XHR0aGlzLl9pbnB1dC5zZWxlY3Rpb25FbmQgPSBlbmQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRfaGlkZUF1dG9UeXBlOiBmdW5jdGlvbigpIHtcdC8vIGRlc2VsZWN0IHRleHQ6XHJcblxyXG5cdFx0dmFyIHNlbDtcclxuXHRcdGlmICgoc2VsID0gdGhpcy5faW5wdXQuc2VsZWN0aW9uKSAmJiBzZWwuZW1wdHkpIHtcclxuXHRcdFx0c2VsLmVtcHR5KCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmICh0aGlzLl9pbnB1dC5jcmVhdGVUZXh0UmFuZ2UpIHtcclxuXHRcdFx0c2VsID0gdGhpcy5faW5wdXQuY3JlYXRlVGV4dFJhbmdlKCk7XHJcblx0XHRcdHNlbC5jb2xsYXBzZSh0cnVlKTtcclxuXHRcdFx0dmFyIGVuZCA9IHRoaXMuX2lucHV0LnZhbHVlLmxlbmd0aDtcclxuXHRcdFx0c2VsLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgZW5kKTtcclxuXHRcdFx0c2VsLm1vdmVFbmQoJ2NoYXJhY3RlcicsIGVuZCk7XHJcblx0XHRcdHNlbC5zZWxlY3QoKTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRpZiAodGhpcy5faW5wdXQuZ2V0U2VsZWN0aW9uKSB7XHJcblx0XHRcdFx0dGhpcy5faW5wdXQuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5faW5wdXQuc2VsZWN0aW9uU3RhcnQgPSB0aGlzLl9pbnB1dC5zZWxlY3Rpb25FbmQ7XHJcblx0XHR9XHJcblx0fSxcclxuXHRcclxuXHRfaGFuZGxlS2V5cHJlc3M6IGZ1bmN0aW9uIChlKSB7XHQvL3J1biBfaW5wdXQga2V5dXAgZXZlbnRcclxuXHRcdHZhciBzZWxmID0gdGhpcztcclxuXHJcblx0XHRzd2l0Y2goZS5rZXlDb2RlKVxyXG5cdFx0e1xyXG5cdFx0XHRjYXNlIDI3Oi8vRXNjXHJcblx0XHRcdFx0dGhpcy5jb2xsYXBzZSgpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAxMzovL0VudGVyXHJcblx0XHRcdFx0aWYodGhpcy5fY291bnRlcnRpcHMgPT0gMSB8fCAodGhpcy5vcHRpb25zLmZpcnN0VGlwU3VibWl0ICYmIHRoaXMuX2NvdW50ZXJ0aXBzID4gMCkpIHtcclxuICAgICAgICAgIFx0XHRcdGlmKHRoaXMuX3Rvb2x0aXAuY3VycmVudFNlbGVjdGlvbiA9PSAtMSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLl9oYW5kbGVBcnJvd1NlbGVjdCgxKTtcclxuICAgICAgICAgIFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy5faGFuZGxlU3VibWl0KCk7XHQvL2RvIHNlYXJjaFxyXG5cdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAzODovL1VwXHJcblx0XHRcdFx0dGhpcy5faGFuZGxlQXJyb3dTZWxlY3QoLTEpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSA0MDovL0Rvd25cclxuXHRcdFx0XHR0aGlzLl9oYW5kbGVBcnJvd1NlbGVjdCgxKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgIDg6Ly9CYWNrc3BhY2VcclxuXHRcdFx0Y2FzZSA0NTovL0luc2VydFxyXG5cdFx0XHRjYXNlIDQ2Oi8vRGVsZXRlXHJcblx0XHRcdFx0dGhpcy5fYXV0b1R5cGVUbXAgPSBmYWxzZTsvL2Rpc2FibGUgdGVtcG9yYXJpbHkgYXV0b1R5cGVcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgMzc6Ly9MZWZ0XHJcblx0XHRcdGNhc2UgMzk6Ly9SaWdodFxyXG5cdFx0XHRjYXNlIDE2Oi8vU2hpZnRcclxuXHRcdFx0Y2FzZSAxNzovL0N0cmxcclxuXHRcdFx0Y2FzZSAzNTovL0VuZFxyXG5cdFx0XHRjYXNlIDM2Oi8vSG9tZVxyXG5cdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDovL0FsbCBrZXlzXHJcblx0XHRcdFx0aWYodGhpcy5faW5wdXQudmFsdWUubGVuZ3RoKVxyXG5cdFx0XHRcdFx0dGhpcy5fY2FuY2VsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cdFx0XHRcdGVsc2VcclxuXHRcdFx0XHRcdHRoaXMuX2NhbmNlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuXHRcdFx0XHRpZih0aGlzLl9pbnB1dC52YWx1ZS5sZW5ndGggPj0gdGhpcy5vcHRpb25zLm1pbkxlbmd0aClcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRjbGVhclRpbWVvdXQodGhpcy50aW1lcktleXByZXNzKTtcdC8vY2FuY2VsIGxhc3Qgc2VhcmNoIHJlcXVlc3Qgd2hpbGUgdHlwZSBpblx0XHRcdFx0XHJcblx0XHRcdFx0XHR0aGlzLnRpbWVyS2V5cHJlc3MgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1x0Ly9kZWxheSBiZWZvcmUgcmVxdWVzdCwgZm9yIGxpbWl0IGpzb25wL2FqYXggcmVxdWVzdFxyXG5cclxuXHRcdFx0XHRcdFx0c2VsZi5fZmlsbFJlY29yZHNDYWNoZSgpO1xyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHR9LCB0aGlzLm9wdGlvbnMuZGVsYXlUeXBlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZWxzZVxyXG5cdFx0XHRcdFx0dGhpcy5faGlkZVRvb2x0aXAoKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9oYW5kbGVBdXRvcmVzaXplKCk7XHJcblx0fSxcclxuXHJcblx0c2VhcmNoVGV4dDogZnVuY3Rpb24odGV4dCkge1xyXG5cdFx0dmFyIGNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQodGV4dC5sZW5ndGgpO1xyXG5cclxuXHRcdHRoaXMuX2lucHV0LnZhbHVlID0gdGV4dDtcclxuXHJcblx0XHR0aGlzLl9pbnB1dC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuXHRcdEwuRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl9jb250YWluZXIsICdzZWFyY2gtZXhwJyk7XHJcblxyXG5cdFx0dGhpcy5fYXV0b1R5cGVUbXAgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLl9oYW5kbGVLZXlwcmVzcyh7a2V5Q29kZTogY29kZX0pO1xyXG5cdH0sXHJcblx0XHJcblx0X2ZpbGxSZWNvcmRzQ2FjaGU6IGZ1bmN0aW9uKCkge1xyXG5cclxuXHRcdHZhciBzZWxmID0gdGhpcyxcclxuXHRcdFx0aW5wdXRUZXh0ID0gdGhpcy5faW5wdXQudmFsdWUsIHJlY29yZHM7XHJcblxyXG5cdFx0aWYodGhpcy5fY3VyUmVxICYmIHRoaXMuX2N1clJlcS5hYm9ydClcclxuXHRcdFx0dGhpcy5fY3VyUmVxLmFib3J0KCk7XHJcblx0XHQvL2Fib3J0IHByZXZpb3VzIHJlcXVlc3RzXHJcblxyXG5cdFx0TC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2NvbnRhaW5lciwgJ3NlYXJjaC1sb2FkJyk7XHRcclxuXHJcblx0XHQvLyBpZih0aGlzLl9sYXllcilcclxuXHRcdC8vIHtcclxuXHRcdC8vIFx0Ly9UT0RPIF9yZWNvcmRzRnJvbUxheWVyIG11c3QgcmV0dXJuIGFycmF5IG9mIG9iamVjdHMsIGZvcm1hdHRlZCBmcm9tIF9mb3JtYXREYXRhXHJcblx0XHQvLyBcdHRoaXMuX3JlY29yZHNDYWNoZSA9IHRoaXMuX3JlY29yZHNGcm9tTGF5ZXIoKTtcclxuXHRcdC8vXHJcblx0XHQvLyBcdHJlY29yZHMgPSB0aGlzLl9maWx0ZXJEYXRhKCB0aGlzLl9pbnB1dC52YWx1ZSwgdGhpcy5fcmVjb3Jkc0NhY2hlICk7XHJcbiAgICAgICAgLy9cclxuXHRcdC8vIFx0dGhpcy5zaG93VG9vbHRpcCggcmVjb3JkcyApO1xyXG4gICAgICAgIC8vXHJcblx0XHQvLyBcdEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9jb250YWluZXIsICdzZWFyY2gtbG9hZCcpO1xyXG5cdFx0Ly8gfVxyXG5cdFx0Ly8gZWxzZVxyXG5cdFx0Ly8ge1xyXG5cdFx0XHRpZih0aGlzLm9wdGlvbnMuc291cmNlRGF0YSlcclxuXHRcdFx0XHR0aGlzLl9yZXRyaWV2ZURhdGEgPSB0aGlzLm9wdGlvbnMuc291cmNlRGF0YTtcclxuXHJcblx0XHRcdGVsc2UgaWYodGhpcy5vcHRpb25zLnVybClcdC8vanNvbnAgb3IgYWpheFxyXG5cdFx0XHRcdHRoaXMuX3JldHJpZXZlRGF0YSA9IHRoaXMub3B0aW9ucy5qc29ucFBhcmFtID8gdGhpcy5fcmVjb3Jkc0Zyb21Kc29ucCA6IHRoaXMuX3JlY29yZHNGcm9tQWpheDtcclxuXHJcblx0XHRcdHRoaXMuX2N1clJlcSA9IHRoaXMuX3JldHJpZXZlRGF0YS5jYWxsKHRoaXMsIGlucHV0VGV4dCwgZnVuY3Rpb24oZGF0YSkge1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdHNlbGYuX3JlY29yZHNDYWNoZSA9IHNlbGYuX2Zvcm1hdERhdGEuY2FsbChzZWxmLCBkYXRhKTtcclxuXHJcblx0XHRcdFx0Ly9UT0RPIHJlZmFjdCFcclxuXHRcdFx0XHRpZihzZWxmLm9wdGlvbnMuc291cmNlRGF0YSlcclxuXHRcdFx0XHRcdHJlY29yZHMgPSBzZWxmLl9maWx0ZXJEYXRhKCBzZWxmLl9pbnB1dC52YWx1ZSwgc2VsZi5fcmVjb3Jkc0NhY2hlICk7XHJcblx0XHRcdFx0ZWxzZVxyXG5cdFx0XHRcdFx0cmVjb3JkcyA9IHNlbGYuX3JlY29yZHNDYWNoZTtcclxuXHJcblx0XHRcdFx0c2VsZi5zaG93VG9vbHRpcCggcmVjb3JkcyApO1xyXG4gXHJcblx0XHRcdFx0TC5Eb21VdGlsLnJlbW92ZUNsYXNzKHNlbGYuX2NvbnRhaW5lciwgJ3NlYXJjaC1sb2FkJyk7XHJcblx0XHRcdH0pO1xyXG5cdFx0Ly8gfVxyXG5cdH0sXHJcblx0XHJcblx0X2hhbmRsZUF1dG9yZXNpemU6IGZ1bmN0aW9uKCkge1xyXG5cdCAgICB2YXIgbWF4V2lkdGg7XHJcblxyXG5cdFx0aWYgKHRoaXMuX2lucHV0LnN0eWxlLm1heFdpZHRoICE9PSB0aGlzLl9tYXAuX2NvbnRhaW5lci5vZmZzZXRXaWR0aCkge1xyXG5cdFx0XHRtYXhXaWR0aCA9IHRoaXMuX21hcC5fY29udGFpbmVyLmNsaWVudFdpZHRoO1xyXG5cclxuXHRcdFx0Ly8gb3RoZXIgc2lkZSBtYXJnaW4gKyBwYWRkaW5nICsgd2lkdGggYm9yZGVyICsgd2lkdGggc2VhcmNoLWJ1dHRvbiArIHdpZHRoIHNlYXJjaC1jYW5jZWxcclxuXHRcdFx0bWF4V2lkdGggLT0gMTAgKyAyMCArIDEgKyAzMCArIDIyOyBcclxuXHJcblx0XHRcdHRoaXMuX2lucHV0LnN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGgudG9TdHJpbmcoKSArICdweCc7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMub3B0aW9ucy5hdXRvUmVzaXplICYmICh0aGlzLl9jb250YWluZXIub2Zmc2V0V2lkdGggKyAyMCA8IHRoaXMuX21hcC5fY29udGFpbmVyLm9mZnNldFdpZHRoKSkge1xyXG5cdFx0XHR0aGlzLl9pbnB1dC5zaXplID0gdGhpcy5faW5wdXQudmFsdWUubGVuZ3RoIDwgdGhpcy5faW5wdXRNaW5TaXplID8gdGhpcy5faW5wdXRNaW5TaXplIDogdGhpcy5faW5wdXQudmFsdWUubGVuZ3RoO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdF9oYW5kbGVBcnJvd1NlbGVjdDogZnVuY3Rpb24odmVsb2NpdHkpIHtcclxuXHRcclxuXHRcdHZhciBzZWFyY2hUaXBzID0gdGhpcy5fdG9vbHRpcC5oYXNDaGlsZE5vZGVzKCkgPyB0aGlzLl90b29sdGlwLmNoaWxkTm9kZXMgOiBbXTtcclxuXHRcdFx0XHJcblx0XHRmb3IgKGk9MDsgaTxzZWFyY2hUaXBzLmxlbmd0aDsgaSsrKVxyXG5cdFx0XHRMLkRvbVV0aWwucmVtb3ZlQ2xhc3Moc2VhcmNoVGlwc1tpXSwgJ3NlYXJjaC10aXAtc2VsZWN0Jyk7XHJcblx0XHRcclxuXHRcdGlmICgodmVsb2NpdHkgPT0gMSApICYmICh0aGlzLl90b29sdGlwLmN1cnJlbnRTZWxlY3Rpb24gPj0gKHNlYXJjaFRpcHMubGVuZ3RoIC0gMSkpKSB7Ly8gSWYgYXQgZW5kIG9mIGxpc3QuXHJcblx0XHRcdEwuRG9tVXRpbC5hZGRDbGFzcyhzZWFyY2hUaXBzW3RoaXMuX3Rvb2x0aXAuY3VycmVudFNlbGVjdGlvbl0sICdzZWFyY2gtdGlwLXNlbGVjdCcpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZiAoKHZlbG9jaXR5ID09IC0xICkgJiYgKHRoaXMuX3Rvb2x0aXAuY3VycmVudFNlbGVjdGlvbiA8PSAwKSkgeyAvLyBHb2luZyBiYWNrIHVwIHRvIHRoZSBzZWFyY2ggYm94LlxyXG5cdFx0XHR0aGlzLl90b29sdGlwLmN1cnJlbnRTZWxlY3Rpb24gPSAtMTtcclxuXHRcdH1cclxuXHRcdGVsc2UgaWYgKHRoaXMuX3Rvb2x0aXAuc3R5bGUuZGlzcGxheSAhPSAnbm9uZScpIHtcclxuXHRcdFx0dGhpcy5fdG9vbHRpcC5jdXJyZW50U2VsZWN0aW9uICs9IHZlbG9jaXR5O1xyXG5cdFx0XHRcclxuXHRcdFx0TC5Eb21VdGlsLmFkZENsYXNzKHNlYXJjaFRpcHNbdGhpcy5fdG9vbHRpcC5jdXJyZW50U2VsZWN0aW9uXSwgJ3NlYXJjaC10aXAtc2VsZWN0Jyk7XHJcblx0XHRcdFxyXG5cdFx0XHR0aGlzLl9pbnB1dC52YWx1ZSA9IHNlYXJjaFRpcHNbdGhpcy5fdG9vbHRpcC5jdXJyZW50U2VsZWN0aW9uXS5fdGV4dDtcclxuXHJcblx0XHRcdC8vIHNjcm9sbDpcclxuXHRcdFx0dmFyIHRpcE9mZnNldFRvcCA9IHNlYXJjaFRpcHNbdGhpcy5fdG9vbHRpcC5jdXJyZW50U2VsZWN0aW9uXS5vZmZzZXRUb3A7XHJcblx0XHRcdFxyXG5cdFx0XHRpZiAodGlwT2Zmc2V0VG9wICsgc2VhcmNoVGlwc1t0aGlzLl90b29sdGlwLmN1cnJlbnRTZWxlY3Rpb25dLmNsaWVudEhlaWdodCA+PSB0aGlzLl90b29sdGlwLnNjcm9sbFRvcCArIHRoaXMuX3Rvb2x0aXAuY2xpZW50SGVpZ2h0KSB7XHJcblx0XHRcdFx0dGhpcy5fdG9vbHRpcC5zY3JvbGxUb3AgPSB0aXBPZmZzZXRUb3AgLSB0aGlzLl90b29sdGlwLmNsaWVudEhlaWdodCArIHNlYXJjaFRpcHNbdGhpcy5fdG9vbHRpcC5jdXJyZW50U2VsZWN0aW9uXS5jbGllbnRIZWlnaHQ7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSBpZiAodGlwT2Zmc2V0VG9wIDw9IHRoaXMuX3Rvb2x0aXAuc2Nyb2xsVG9wKSB7XHJcblx0XHRcdFx0dGhpcy5fdG9vbHRpcC5zY3JvbGxUb3AgPSB0aXBPZmZzZXRUb3A7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRfaGFuZGxlU3VibWl0OiBmdW5jdGlvbigpIHtcdC8vYnV0dG9uIGFuZCB0b29sdGlwIGNsaWNrIGFuZCBlbnRlciBzdWJtaXRcclxuXHJcblx0XHR0aGlzLl9oaWRlQXV0b1R5cGUoKTtcclxuXHRcdFxyXG5cdFx0dGhpcy5oaWRlQWxlcnQoKTtcclxuXHRcdHRoaXMuX2hpZGVUb29sdGlwKCk7XHJcblxyXG5cdFx0aWYodGhpcy5faW5wdXQuc3R5bGUuZGlzcGxheSA9PSAnbm9uZScpXHQvL29uIGZpcnN0IGNsaWNrIHNob3cgX2lucHV0IG9ubHlcclxuXHRcdFx0dGhpcy5leHBhbmQoKTtcclxuXHRcdGVsc2VcclxuXHRcdHtcclxuXHRcdFx0aWYodGhpcy5faW5wdXQudmFsdWUgPT09ICcnKVx0Ly9oaWRlIF9pbnB1dCBvbmx5XHJcblx0XHRcdFx0dGhpcy5jb2xsYXBzZSgpO1xyXG5cdFx0XHRlbHNlXHJcblx0XHRcdHtcclxuXHRcdFx0XHR2YXIgbG9jID0gdGhpcy5fZ2V0TG9jYXRpb24odGhpcy5faW5wdXQudmFsdWUpO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGlmKGxvYz09PWZhbHNlKVxyXG5cdFx0XHRcdFx0dGhpcy5zaG93QWxlcnQoKTtcclxuXHRcdFx0XHRlbHNlXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0dGhpcy5zaG93TG9jYXRpb24obG9jLCB0aGlzLl9pbnB1dC52YWx1ZSk7XHJcblx0XHRcdFx0XHR0aGlzLmZpcmUoJ3NlYXJjaDpsb2NhdGlvbmZvdW5kJywge1xyXG5cdFx0XHRcdFx0XHRcdGxhdGxuZzogbG9jLFxyXG5cdFx0XHRcdFx0XHRcdHRleHQ6IHRoaXMuX2lucHV0LnZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdGxheWVyOiBsb2MubGF5ZXIgPyBsb2MubGF5ZXIgOiBudWxsXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdF9nZXRMb2NhdGlvbjogZnVuY3Rpb24oa2V5KSB7XHQvL2V4dHJhY3QgbGF0bG5nIGZyb20gX3JlY29yZHNDYWNoZVxyXG5cclxuXHRcdGlmKCB0aGlzLl9yZWNvcmRzQ2FjaGUuaGFzT3duUHJvcGVydHkoa2V5KSApXHJcblx0XHRcdHJldHVybiB0aGlzLl9yZWNvcmRzQ2FjaGVba2V5XTsvL3RoZW4gYWZ0ZXIgdXNlIC5sb2MgYXR0cmlidXRlXHJcblx0XHRlbHNlXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHR9LFxyXG5cclxuXHRfZGVmYXVsdE1vdmVUb0xvY2F0aW9uOiBmdW5jdGlvbihsYXRsbmcsIHRpdGxlLCBtYXApIHtcclxuXHRcdGlmKHRoaXMub3B0aW9ucy56b29tKVxyXG4gXHRcdFx0dGhpcy5fbWFwLnNldFZpZXcobGF0bG5nLCB0aGlzLm9wdGlvbnMuem9vbSk7XHJcbiBcdFx0ZWxzZVxyXG5cdFx0XHR0aGlzLl9tYXAucGFuVG8obGF0bG5nKTtcclxuXHR9LFxyXG5cclxuXHRzaG93TG9jYXRpb246IGZ1bmN0aW9uKGxhdGxuZywgdGl0bGUpIHtcdC8vc2V0IGxvY2F0aW9uIG9uIG1hcCBmcm9tIF9yZWNvcmRzQ2FjaGVcclxuXHRcdHZhciBzZWxmID0gdGhpcztcclxuXHJcblx0XHRzZWxmLl9tYXAub25jZSgnbW92ZWVuZCB6b29tZW5kJywgZnVuY3Rpb24oZSkge1xyXG5cclxuXHRcdFx0aWYoc2VsZi5fbWFya2VyU2VhcmNoKSB7XHJcblx0XHRcdFx0c2VsZi5fbWFya2VyU2VhcmNoLmFkZFRvKHNlbGYuX21hcCkuc2V0TGF0TG5nKGxhdGxuZyk7XHJcblx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHR9KTtcclxuXHJcblx0XHRzZWxmLl9tb3ZlVG9Mb2NhdGlvbihsYXRsbmcsIHRpdGxlLCBzZWxmLl9tYXApO1xyXG5cdFx0Ly9GSVhNRSBhdXRvQ29sbGFwc2Ugb3B0aW9uIGhpZGUgc2VsZi5fbWFya2VyU2VhcmNoIGJlZm9yZSB2aXN1YWxpemVkISFcclxuXHRcdGlmKHNlbGYub3B0aW9ucy5hdXRvQ29sbGFwc2UpXHJcblx0XHRcdHNlbGYuY29sbGFwc2UoKTtcclxuXHJcblx0XHRyZXR1cm4gc2VsZjtcclxuXHR9XHJcbn0pO1xyXG5cclxuTC5Db250cm9sLlNlYXJjaC5NYXJrZXIgPSBMLk1hcmtlci5leHRlbmQoe1xyXG5cclxuXHRpbmNsdWRlczogTC52ZXJzaW9uWzBdPT09JzEnID8gTC5FdmVudGVkLnByb3RvdHlwZSA6IEwuTWl4aW4uRXZlbnRzLFxyXG5cdFxyXG5cdG9wdGlvbnM6IHtcclxuXHRcdGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLFxyXG5cdFx0YW5pbWF0ZTogdHJ1ZSxcclxuXHRcdGNpcmNsZToge1xyXG5cdFx0XHRyYWRpdXM6IDEwLFxyXG5cdFx0XHR3ZWlnaHQ6IDMsXHJcblx0XHRcdGNvbG9yOiAnI2UwMycsXHJcblx0XHRcdHN0cm9rZTogdHJ1ZSxcclxuXHRcdFx0ZmlsbDogZmFsc2VcclxuXHRcdH1cclxuXHR9LFxyXG5cdFxyXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uIChsYXRsbmcsIG9wdGlvbnMpIHtcclxuXHRcdEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcclxuXHJcblx0XHRpZihvcHRpb25zLmljb24gPT09IHRydWUpXHJcblx0XHRcdG9wdGlvbnMuaWNvbiA9IG5ldyBMLkljb24uRGVmYXVsdCgpO1xyXG5cclxuXHRcdEwuTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbGF0bG5nLCBvcHRpb25zKTtcclxuXHRcdFxyXG5cdFx0aWYoIEwuQ29udHJvbC5TZWFyY2gucHJvdG90eXBlLl9pc09iamVjdCh0aGlzLm9wdGlvbnMuY2lyY2xlKSApXHJcblx0XHRcdHRoaXMuX2NpcmNsZUxvYyA9IG5ldyBMLkNpcmNsZU1hcmtlcihsYXRsbmcsIHRoaXMub3B0aW9ucy5jaXJjbGUpO1xyXG5cdH0sXHJcblxyXG5cdG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XHJcblx0XHRMLk1hcmtlci5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApO1xyXG5cdFx0aWYodGhpcy5fY2lyY2xlTG9jKSB7XHJcblx0XHRcdG1hcC5hZGRMYXllcih0aGlzLl9jaXJjbGVMb2MpO1xyXG5cdFx0XHRpZih0aGlzLm9wdGlvbnMuYW5pbWF0ZSlcclxuXHRcdFx0XHR0aGlzLmFuaW1hdGUoKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xyXG5cdFx0TC5NYXJrZXIucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcywgbWFwKTtcclxuXHRcdGlmKHRoaXMuX2NpcmNsZUxvYylcclxuXHRcdFx0bWFwLnJlbW92ZUxheWVyKHRoaXMuX2NpcmNsZUxvYyk7XHJcblx0fSxcclxuXHRcclxuXHRzZXRMYXRMbmc6IGZ1bmN0aW9uIChsYXRsbmcpIHtcclxuXHRcdEwuTWFya2VyLnByb3RvdHlwZS5zZXRMYXRMbmcuY2FsbCh0aGlzLCBsYXRsbmcpO1xyXG5cdFx0aWYodGhpcy5fY2lyY2xlTG9jKVxyXG5cdFx0XHR0aGlzLl9jaXJjbGVMb2Muc2V0TGF0TG5nKGxhdGxuZyk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cdFxyXG5cdF9pbml0SWNvbjogZnVuY3Rpb24gKCkge1xyXG5cdFx0aWYodGhpcy5vcHRpb25zLmljb24pXHJcblx0XHRcdEwuTWFya2VyLnByb3RvdHlwZS5faW5pdEljb24uY2FsbCh0aGlzKTtcclxuXHR9LFxyXG5cclxuXHRfcmVtb3ZlSWNvbjogZnVuY3Rpb24gKCkge1xyXG5cdFx0aWYodGhpcy5vcHRpb25zLmljb24pXHJcblx0XHRcdEwuTWFya2VyLnByb3RvdHlwZS5fcmVtb3ZlSWNvbi5jYWxsKHRoaXMpO1xyXG5cdH0sXHJcblxyXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCkge1xyXG5cdC8vVE9ETyByZWZhY3QgYW5pbWF0ZSgpIG1vcmUgc21vb3RoISBsaWtlIHRoaXM6IGh0dHA6Ly9nb28uZ2wvRERsUnNcclxuXHRcdGlmKHRoaXMuX2NpcmNsZUxvYylcclxuXHRcdHtcclxuXHRcdFx0dmFyIGNpcmNsZSA9IHRoaXMuX2NpcmNsZUxvYyxcclxuXHRcdFx0XHR0SW50ID0gMjAwLFx0Ly90aW1lIGludGVydmFsXHJcblx0XHRcdFx0c3MgPSA1LFx0Ly9mcmFtZXNcclxuXHRcdFx0XHRtciA9IHBhcnNlSW50KGNpcmNsZS5fcmFkaXVzL3NzKSxcclxuXHRcdFx0XHRvbGRyYWQgPSB0aGlzLm9wdGlvbnMuY2lyY2xlLnJhZGl1cyxcclxuXHRcdFx0XHRuZXdyYWQgPSBjaXJjbGUuX3JhZGl1cyAqIDIsXHJcblx0XHRcdFx0YWNjID0gMDtcclxuXHJcblx0XHRcdGNpcmNsZS5fdGltZXJBbmltTG9jID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0YWNjICs9IDAuNTtcclxuXHRcdFx0XHRtciArPSBhY2M7XHQvL2FkZGluZyBhY2NlbGVyYXRpb25cclxuXHRcdFx0XHRuZXdyYWQgLT0gbXI7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0Y2lyY2xlLnNldFJhZGl1cyhuZXdyYWQpO1xyXG5cclxuXHRcdFx0XHRpZihuZXdyYWQ8b2xkcmFkKVxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdGNsZWFySW50ZXJ2YWwoY2lyY2xlLl90aW1lckFuaW1Mb2MpO1xyXG5cdFx0XHRcdFx0Y2lyY2xlLnNldFJhZGl1cyhvbGRyYWQpOy8vcmVzZXQgcmFkaXVzXHJcblx0XHRcdFx0XHQvL2lmKHR5cGVvZiBhZnRlckFuaW1DYWxsID09ICdmdW5jdGlvbicpXHJcblx0XHRcdFx0XHRcdC8vYWZ0ZXJBbmltQ2FsbCgpO1xyXG5cdFx0XHRcdFx0XHQvL1RPRE8gdXNlIGNyZWF0ZSBldmVudCAnYW5pbWF0ZUVuZCcgaW4gTC5Db250cm9sLlNlYXJjaC5NYXJrZXIgXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LCB0SW50KTtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG59KTtcclxuXHJcbkwuTWFwLmFkZEluaXRIb29rKGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2VhcmNoQ29udHJvbCkge1xyXG4gICAgICAgIHRoaXMuc2VhcmNoQ29udHJvbCA9IEwuY29udHJvbC5zZWFyY2godGhpcy5vcHRpb25zLnNlYXJjaENvbnRyb2wpO1xyXG4gICAgICAgIHRoaXMuYWRkQ29udHJvbCh0aGlzLnNlYXJjaENvbnRyb2wpO1xyXG4gICAgfVxyXG59KTtcclxuXHJcbkwuY29udHJvbC5zZWFyY2ggPSBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgcmV0dXJuIG5ldyBMLkNvbnRyb2wuU2VhcmNoKG9wdGlvbnMpO1xyXG59O1xyXG5cclxucmV0dXJuIEwuQ29udHJvbC5TZWFyY2g7XHJcblxyXG59KTtcclxuXHJcblxyXG4iLCIvKlxyXG4gTGVhZmxldC5kcmF3IDAuNC4xMiwgYSBwbHVnaW4gdGhhdCBhZGRzIGRyYXdpbmcgYW5kIGVkaXRpbmcgdG9vbHMgdG8gTGVhZmxldCBwb3dlcmVkIG1hcHMuXHJcbiAoYykgMjAxMi0yMDE3LCBKYWNvYiBUb3llLCBKb24gV2VzdCwgU21hcnRyYWssIExlYWZsZXRcclxuXHJcbiBodHRwczovL2dpdGh1Yi5jb20vTGVhZmxldC9MZWFmbGV0LmRyYXdcclxuIGh0dHA6Ly9sZWFmbGV0anMuY29tXHJcbiAqL1xyXG4oZnVuY3Rpb24gKHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBMZWFmbGV0LmRyYXcgYXNzdW1lcyB0aGF0IHlvdSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgdGhlIExlYWZsZXQgbGlicmFyeS5cclxuICAgICAqL1xyXG4gICAgTC5kcmF3VmVyc2lvbiA9IFwiMC40LjEyXCI7XHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkRyYXdcclxuICAgICAqIEBha2EgRHJhd1xyXG4gICAgICpcclxuICAgICAqXHJcbiAgICAgKiBUbyBhZGQgdGhlIGRyYXcgdG9vbGJhciBzZXQgdGhlIG9wdGlvbiBkcmF3Q29udHJvbDogdHJ1ZSBpbiB0aGUgbWFwIG9wdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGpzXHJcbiAgICAgKiAgICAgIHZhciBtYXAgPSBMLm1hcCgnbWFwJywge2RyYXdDb250cm9sOiB0cnVlfSkuc2V0VmlldyhbNTEuNTA1LCAtMC4wOV0sIDEzKTtcclxuICAgICAqXHJcbiAgICAgKiAgICAgIEwudGlsZUxheWVyKCdodHRwOi8ve3N9LnRpbGUub3NtLm9yZy97en0ve3h9L3t5fS5wbmcnLCB7XHJcbiAqICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJmNvcHk7IDxhIGhyZWY9XCJodHRwOi8vb3NtLm9yZy9jb3B5cmlnaHRcIj5PcGVuU3RyZWV0TWFwPC9hPiBjb250cmlidXRvcnMnXHJcbiAqICAgICAgfSkuYWRkVG8obWFwKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqICMjIyBBZGRpbmcgdGhlIGVkaXQgdG9vbGJhclxyXG4gICAgICogVG8gdXNlIHRoZSBlZGl0IHRvb2xiYXIgeW91IG11c3QgaW5pdGlhbGlzZSB0aGUgTGVhZmxldC5kcmF3IGNvbnRyb2wgYW5kIG1hbnVhbGx5IGFkZCBpdCB0byB0aGUgbWFwLlxyXG4gICAgICpcclxuICAgICAqIGBgYGpzXHJcbiAgICAgKiAgICAgIHZhciBtYXAgPSBMLm1hcCgnbWFwJykuc2V0VmlldyhbNTEuNTA1LCAtMC4wOV0sIDEzKTtcclxuICAgICAqXHJcbiAgICAgKiAgICAgIEwudGlsZUxheWVyKCdodHRwOi8ve3N9LnRpbGUub3NtLm9yZy97en0ve3h9L3t5fS5wbmcnLCB7XHJcbiAqICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJmNvcHk7IDxhIGhyZWY9XCJodHRwOi8vb3NtLm9yZy9jb3B5cmlnaHRcIj5PcGVuU3RyZWV0TWFwPC9hPiBjb250cmlidXRvcnMnXHJcbiAqICAgICAgfSkuYWRkVG8obWFwKTtcclxuICAgICAqXHJcbiAgICAgKiAgICAgIC8vIEZlYXR1cmVHcm91cCBpcyB0byBzdG9yZSBlZGl0YWJsZSBsYXllcnNcclxuICAgICAqICAgICAgdmFyIGRyYXduSXRlbXMgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgICAqICAgICAgbWFwLmFkZExheWVyKGRyYXduSXRlbXMpO1xyXG4gICAgICpcclxuICAgICAqICAgICAgdmFyIGRyYXdDb250cm9sID0gbmV3IEwuQ29udHJvbC5EcmF3KHtcclxuICogICAgICAgICAgZWRpdDoge1xyXG4gKiAgICAgICAgICAgICAgZmVhdHVyZUdyb3VwOiBkcmF3bkl0ZW1zXHJcbiAqICAgICAgICAgIH1cclxuICogICAgICB9KTtcclxuICAgICAqICAgICAgbWFwLmFkZENvbnRyb2woZHJhd0NvbnRyb2wpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGtleSBoZXJlIGlzIHRoZSBmZWF0dXJlR3JvdXAgb3B0aW9uLiBUaGlzIHRlbGxzIHRoZSBwbHVnaW4gd2hpY2ggRmVhdHVyZUdyb3VwIGNvbnRhaW5zIHRoZSBsYXllcnMgdGhhdFxyXG4gICAgICogc2hvdWxkIGJlIGVkaXRhYmxlLiBUaGUgZmVhdHVyZUdyb3VwIGNhbiBjb250YWluIDAgb3IgbW9yZSBmZWF0dXJlcyB3aXRoIGdlb21ldHJ5IHR5cGVzIFBvaW50LCBMaW5lU3RyaW5nLCBhbmQgUG9seWdvbi5cclxuICAgICAqIExlYWZsZXQuZHJhdyBkb2VzIG5vdCB3b3JrIHdpdGggbXVsdGlnZW9tZXRyeSBmZWF0dXJlcyBzdWNoIGFzIE11bHRpUG9pbnQsIE11bHRpTGluZVN0cmluZywgTXVsdGlQb2x5Z29uLFxyXG4gICAgICogb3IgR2VvbWV0cnlDb2xsZWN0aW9uLiBJZiB5b3UgbmVlZCB0byBhZGQgbXVsdGlnZW9tZXRyeSBmZWF0dXJlcyB0byB0aGUgZHJhdyBwbHVnaW4sIGNvbnZlcnQgdGhlbSB0byBhXHJcbiAgICAgKiBGZWF0dXJlQ29sbGVjdGlvbiBvZiBub24tbXVsdGlnZW9tZXRyaWVzIChQb2ludHMsIExpbmVTdHJpbmdzLCBvciBQb2x5Z29ucykuXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdyA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuZHJhd0xvY2FsXHJcbiAgICAgKiBAYWthIEwuZHJhd0xvY2FsXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGNvcmUgdG9vbGJhciBjbGFzcyBvZiB0aGUgQVBJIOKAlCBpdCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdG9vbGJhciB1aVxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBgYGBqc1xyXG4gICAgICogICAgICB2YXIgbW9kaWZpZWREcmF3ID0gTC5kcmF3TG9jYWwuZXh0ZW5kKHtcclxuICogICAgICAgICAgZHJhdzoge1xyXG4gKiAgICAgICAgICAgICAgdG9vbGJhcjoge1xyXG4gKiAgICAgICAgICAgICAgICAgIGJ1dHRvbnM6IHtcclxuICogICAgICAgICAgICAgICAgICAgICAgcG9seWdvbjogJ0RyYXcgYW4gYXdlc29tZSBwb2x5Z29uJ1xyXG4gKiAgICAgICAgICAgICAgICAgIH1cclxuICogICAgICAgICAgICAgIH1cclxuICogICAgICAgICAgfVxyXG4gKiAgICAgIH0pO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGRlZmF1bHQgc3RhdGUgZm9yIHRoZSBjb250cm9sIGlzIHRoZSBkcmF3IHRvb2xiYXIganVzdCBiZWxvdyB0aGUgem9vbSBjb250cm9sLlxyXG4gICAgICogIFRoaXMgd2lsbCBhbGxvdyBtYXAgdXNlcnMgdG8gZHJhdyB2ZWN0b3JzIGFuZCBtYXJrZXJzLlxyXG4gICAgICogICoqUGxlYXNlIG5vdGUgdGhlIGVkaXQgdG9vbGJhciBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0LioqXHJcbiAgICAgKi9cclxuICAgIEwuZHJhd0xvY2FsID0ge1xyXG4gICAgICAgIC8vIGZvcm1hdDoge1xyXG4gICAgICAgIC8vIFx0bnVtZXJpYzoge1xyXG4gICAgICAgIC8vIFx0XHRkZWxpbWl0ZXJzOiB7XHJcbiAgICAgICAgLy8gXHRcdFx0dGhvdXNhbmRzOiAnLCcsXHJcbiAgICAgICAgLy8gXHRcdFx0ZGVjaW1hbDogJy4nXHJcbiAgICAgICAgLy8gXHRcdH1cclxuICAgICAgICAvLyBcdH1cclxuICAgICAgICAvLyB9LFxyXG4gICAgICAgIGRyYXc6IHtcclxuICAgICAgICAgICAgdG9vbGJhcjoge1xyXG4gICAgICAgICAgICAgICAgLy8gI1RPRE86IHRoaXMgc2hvdWxkIGJlIHJlb3JnYW5pemVkIHdoZXJlIGFjdGlvbnMgYXJlIG5lc3RlZCBpbiBhY3Rpb25zXHJcbiAgICAgICAgICAgICAgICAvLyBleDogYWN0aW9ucy51bmRvICBvciBhY3Rpb25zLmNhbmNlbFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQ2FuY2VsIGRyYXdpbmcnLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdDYW5jZWwnXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmluaXNoOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdGaW5pc2ggZHJhd2luZycsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0ZpbmlzaCdcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB1bmRvOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdEZWxldGUgbGFzdCBwb2ludCBkcmF3bicsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0RlbGV0ZSBsYXN0IHBvaW50J1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBwb2x5bGluZTogJ0RyYXcgYSBwb2x5bGluZScsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9seWdvbjogJ0RyYXcgYSBwb2x5Z29uJyxcclxuICAgICAgICAgICAgICAgICAgICByZWN0YW5nbGU6ICdEcmF3IGEgcmVjdGFuZ2xlJyxcclxuICAgICAgICAgICAgICAgICAgICBjaXJjbGU6ICdEcmF3IGEgY2lyY2xlJyxcclxuICAgICAgICAgICAgICAgICAgICBtYXJrZXI6ICdEcmF3IGEgbWFya2VyJyxcclxuICAgICAgICAgICAgICAgICAgICBjaXJjbGVtYXJrZXI6ICdEcmF3IGEgY2lyY2xlbWFya2VyJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBoYW5kbGVyczoge1xyXG4gICAgICAgICAgICAgICAgY2lyY2xlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogJ0NsaWNrIGFuZCBkcmFnIHRvIGRyYXcgY2lyY2xlLidcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHJhZGl1czogJ1JhZGl1cydcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjaXJjbGVtYXJrZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiAnQ2xpY2sgbWFwIHRvIHBsYWNlIGNpcmNsZSBtYXJrZXIuJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBtYXJrZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiAnQ2xpY2sgbWFwIHRvIHBsYWNlIG1hcmtlci4nXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHBvbHlnb246IHtcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiAnQ2xpY2sgdG8gc3RhcnQgZHJhd2luZyBzaGFwZS4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250OiAnQ2xpY2sgdG8gY29udGludWUgZHJhd2luZyBzaGFwZS4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6ICdDbGljayBmaXJzdCBwb2ludCB0byBjbG9zZSB0aGlzIHNoYXBlLidcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgcG9seWxpbmU6IHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogJzxzdHJvbmc+RXJyb3I6PC9zdHJvbmc+IHNoYXBlIGVkZ2VzIGNhbm5vdCBjcm9zcyEnLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXA6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6ICdDbGljayB0byBzdGFydCBkcmF3aW5nIGxpbmUuJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udDogJ0NsaWNrIHRvIGNvbnRpbnVlIGRyYXdpbmcgbGluZS4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6ICdDbGljayBsYXN0IHBvaW50IHRvIGZpbmlzaCBsaW5lLidcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgcmVjdGFuZ2xlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogJ0NsaWNrIGFuZCBkcmFnIHRvIGRyYXcgcmVjdGFuZ2xlLidcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc2ltcGxlc2hhcGU6IHtcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogJ1JlbGVhc2UgbW91c2UgdG8gZmluaXNoIGRyYXdpbmcuJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZWRpdDoge1xyXG4gICAgICAgICAgICB0b29sYmFyOiB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2F2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ1NhdmUgY2hhbmdlcycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdTYXZlJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQ2FuY2VsIGVkaXRpbmcsIGRpc2NhcmRzIGFsbCBjaGFuZ2VzJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0NhbmNlbCdcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyQWxsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQ2xlYXIgYWxsIGxheWVycycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdDbGVhciBBbGwnXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0OiAnRWRpdCBsYXllcnMnLFxyXG4gICAgICAgICAgICAgICAgICAgIGVkaXREaXNhYmxlZDogJ05vIGxheWVycyB0byBlZGl0JyxcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmU6ICdEZWxldGUgbGF5ZXJzJyxcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVEaXNhYmxlZDogJ05vIGxheWVycyB0byBkZWxldGUnXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGhhbmRsZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBlZGl0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnRHJhZyBoYW5kbGVzIG9yIG1hcmtlcnMgdG8gZWRpdCBmZWF0dXJlcy4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJ0ZXh0OiAnQ2xpY2sgY2FuY2VsIHRvIHVuZG8gY2hhbmdlcy4nXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHJlbW92ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXA6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0NsaWNrIG9uIGEgZmVhdHVyZSB0byByZW1vdmUuJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIyMjIEV2ZW50c1xyXG4gICAgICogT25jZSB5b3UgaGF2ZSBzdWNjZXNzZnVsbHkgYWRkZWQgdGhlIExlYWZsZXQuZHJhdyBwbHVnaW4gdG8geW91ciBtYXAgeW91IHdpbGwgd2FudCB0byByZXNwb25kIHRvIHRoZSBkaWZmZXJlbnRcclxuICAgICAqIGFjdGlvbnMgdXNlcnMgY2FuIGluaXRpYXRlLiBUaGUgZm9sbG93aW5nIGV2ZW50cyB3aWxsIGJlIHRyaWdnZXJlZCBvbiB0aGUgbWFwOlxyXG4gICAgICpcclxuICAgICAqIEBjbGFzcyBMLkRyYXcuRXZlbnRcclxuICAgICAqIEBha2EgRHJhdy5FdmVudFxyXG4gICAgICpcclxuICAgICAqIFVzZSBgTC5EcmF3LkV2ZW50LkVWRU5UTkFNRWAgY29uc3RhbnRzIHRvIGVuc3VyZSBldmVudHMgYXJlIGNvcnJlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGpzXHJcbiAgICAgKiBtYXAub24oTC5EcmF3LkV2ZW50LkNSRUFURUQ7IGZ1bmN0aW9uIChlKSB7XHJcbiAqICAgIHZhciB0eXBlID0gZS5sYXllclR5cGUsXHJcbiAqICAgICAgICBsYXllciA9IGUubGF5ZXI7XHJcbiAqXHJcbiAqICAgIGlmICh0eXBlID09PSAnbWFya2VyJykge1xyXG4gKiAgICAgICAgLy8gRG8gbWFya2VyIHNwZWNpZmljIGFjdGlvbnNcclxuICogICAgfVxyXG4gKlxyXG4gKiAgICAvLyBEbyB3aGF0ZXZlciBlbHNlIHlvdSBuZWVkIHRvLiAoc2F2ZSB0byBkYjsgYWRkIHRvIG1hcCBldGMpXHJcbiAqICAgIG1hcC5hZGRMYXllcihsYXllcik7XHJcbiAqfSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqL1xyXG4gICAgTC5EcmF3LkV2ZW50ID0ge307XHJcbiAgICAvKipcclxuICAgICAqIEBldmVudCBkcmF3OmNyZWF0ZWQ6IFBvbHlMaW5lOyBQb2x5Z29uOyBSZWN0YW5nbGU7IENpcmNsZTsgTWFya2VyIHwgU3RyaW5nXHJcbiAgICAgKlxyXG4gICAgICogTGF5ZXIgdGhhdCB3YXMganVzdCBjcmVhdGVkLlxyXG4gICAgICogVGhlIHR5cGUgb2YgbGF5ZXIgdGhpcyBpcy4gT25lIG9mOiBgcG9seWxpbmVgOyBgcG9seWdvbmA7IGByZWN0YW5nbGVgOyBgY2lyY2xlYDsgYG1hcmtlcmBcclxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgbmV3IHZlY3RvciBvciBtYXJrZXIgaGFzIGJlZW4gY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdy5FdmVudC5DUkVBVEVEID0gJ2RyYXc6Y3JlYXRlZCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZXZlbnQgZHJhdzplZGl0ZWQ6IExheWVyR3JvdXBcclxuICAgICAqXHJcbiAgICAgKiBMaXN0IG9mIGFsbCBsYXllcnMganVzdCBlZGl0ZWQgb24gdGhlIG1hcC5cclxuICAgICAqXHJcbiAgICAgKlxyXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gbGF5ZXJzIGluIHRoZSBGZWF0dXJlR3JvdXA7IGluaXRpYWxpc2VkIHdpdGggdGhlIHBsdWdpbjsgaGF2ZSBiZWVuIGVkaXRlZCBhbmQgc2F2ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGpzXHJcbiAgICAgKiAgICAgIG1hcC5vbignZHJhdzplZGl0ZWQnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICogICAgICAgICAgdmFyIGxheWVycyA9IGUubGF5ZXJzO1xyXG4gICAgICogICAgICAgICAgbGF5ZXJzLmVhY2hMYXllcihmdW5jdGlvbiAobGF5ZXIpIHtcclxuICAgICAqICAgICAgICAgICAgICAvL2RvIHdoYXRldmVyIHlvdSB3YW50OyBtb3N0IGxpa2VseSBzYXZlIGJhY2sgdG8gZGJcclxuICAgICAqICAgICAgICAgIH0pO1xyXG4gICAgICogICAgICB9KTtcclxuICAgICAqIGBgYFxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuRXZlbnQuRURJVEVEID0gJ2RyYXc6ZWRpdGVkJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBldmVudCBkcmF3OmRlbGV0ZWQ6IExheWVyR3JvdXBcclxuICAgICAqXHJcbiAgICAgKiBMaXN0IG9mIGFsbCBsYXllcnMganVzdCByZW1vdmVkIGZyb20gdGhlIG1hcC5cclxuICAgICAqXHJcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBsYXllcnMgaGF2ZSBiZWVuIHJlbW92ZWQgKGFuZCBzYXZlZCkgZnJvbSB0aGUgRmVhdHVyZUdyb3VwLlxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuRXZlbnQuREVMRVRFRCA9ICdkcmF3OmRlbGV0ZWQnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGV2ZW50IGRyYXc6ZHJhd3N0YXJ0OiBTdHJpbmdcclxuICAgICAqXHJcbiAgICAgKiBUaGUgdHlwZSBvZiBsYXllciB0aGlzIGlzLiBPbmUgb2Y6YHBvbHlsaW5lYDsgYHBvbHlnb25gOyBgcmVjdGFuZ2xlYDsgYGNpcmNsZWA7IGBtYXJrZXJgXHJcbiAgICAgKlxyXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgaGFzIGNob3NlbiB0byBkcmF3IGEgcGFydGljdWxhciB2ZWN0b3Igb3IgbWFya2VyLlxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuRXZlbnQuRFJBV1NUQVJUID0gJ2RyYXc6ZHJhd3N0YXJ0JztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBldmVudCBkcmF3OmRyYXdzdG9wOiBTdHJpbmdcclxuICAgICAqXHJcbiAgICAgKiBUaGUgdHlwZSBvZiBsYXllciB0aGlzIGlzLiBPbmUgb2Y6IGBwb2x5bGluZWA7IGBwb2x5Z29uYDsgYHJlY3RhbmdsZWA7IGBjaXJjbGVgOyBgbWFya2VyYFxyXG4gICAgICpcclxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGhhcyBmaW5pc2hlZCBhIHBhcnRpY3VsYXIgdmVjdG9yIG9yIG1hcmtlci5cclxuICAgICAqL1xyXG5cclxuICAgIEwuRHJhdy5FdmVudC5EUkFXU1RPUCA9ICdkcmF3OmRyYXdzdG9wJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBldmVudCBkcmF3OmRyYXd2ZXJ0ZXg6IExheWVyR3JvdXBcclxuICAgICAqXHJcbiAgICAgKiBMaXN0IG9mIGFsbCBsYXllcnMganVzdCBiZWluZyBhZGRlZCBmcm9tIHRoZSBtYXAuXHJcbiAgICAgKlxyXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSB2ZXJ0ZXggaXMgY3JlYXRlZCBvbiBhIHBvbHlsaW5lIG9yIHBvbHlnb24uXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdy5FdmVudC5EUkFXVkVSVEVYID0gJ2RyYXc6ZHJhd3ZlcnRleCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZXZlbnQgZHJhdzplZGl0c3RhcnQ6IFN0cmluZ1xyXG4gICAgICpcclxuICAgICAqIFRoZSB0eXBlIG9mIGVkaXQgdGhpcyBpcy4gT25lIG9mOiBgZWRpdGBcclxuICAgICAqXHJcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBzdGFydHMgZWRpdCBtb2RlIGJ5IGNsaWNraW5nIHRoZSBlZGl0IHRvb2wgYnV0dG9uLlxyXG4gICAgICovXHJcblxyXG4gICAgTC5EcmF3LkV2ZW50LkVESVRTVEFSVCA9ICdkcmF3OmVkaXRzdGFydCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZXZlbnQgZHJhdzplZGl0bW92ZTogSUxheWVyXHJcbiAgICAgKlxyXG4gICAgICogIExheWVyIHRoYXQgd2FzIGp1c3QgbW92ZWQuXHJcbiAgICAgKlxyXG4gICAgICogVHJpZ2dlcmVkIGFzIHRoZSB1c2VyIG1vdmVzIGEgcmVjdGFuZ2xlOyBjaXJjbGUgb3IgbWFya2VyLlxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuRXZlbnQuRURJVE1PVkUgPSAnZHJhdzplZGl0bW92ZSc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZXZlbnQgZHJhdzplZGl0cmVzaXplOiBJTGF5ZXJcclxuICAgICAqXHJcbiAgICAgKiBMYXllciB0aGF0IHdhcyBqdXN0IG1vdmVkLlxyXG4gICAgICpcclxuICAgICAqIFRyaWdnZXJlZCBhcyB0aGUgdXNlciByZXNpemVzIGEgcmVjdGFuZ2xlIG9yIGNpcmNsZS5cclxuICAgICAqL1xyXG4gICAgTC5EcmF3LkV2ZW50LkVESVRSRVNJWkUgPSAnZHJhdzplZGl0cmVzaXplJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBldmVudCBkcmF3OmVkaXR2ZXJ0ZXg6IExheWVyR3JvdXBcclxuICAgICAqXHJcbiAgICAgKiBMaXN0IG9mIGFsbCBsYXllcnMganVzdCBiZWluZyBlZGl0ZWQgZnJvbSB0aGUgbWFwLlxyXG4gICAgICpcclxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgdmVydGV4IGlzIGVkaXRlZCBvbiBhIHBvbHlsaW5lIG9yIHBvbHlnb24uXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdy5FdmVudC5FRElUVkVSVEVYID0gJ2RyYXc6ZWRpdHZlcnRleCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZXZlbnQgZHJhdzplZGl0c3RvcDogU3RyaW5nXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHR5cGUgb2YgZWRpdCB0aGlzIGlzLiBPbmUgb2Y6IGBlZGl0YFxyXG4gICAgICpcclxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGhhcyBmaW5zaGVkIGVkaXRpbmcgKGVkaXQgbW9kZSkgYW5kIHNhdmVzIGVkaXRzLlxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuRXZlbnQuRURJVFNUT1AgPSAnZHJhdzplZGl0c3RvcCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZXZlbnQgZHJhdzpkZWxldGVzdGFydDogU3RyaW5nXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHR5cGUgb2YgZWRpdCB0aGlzIGlzLiBPbmUgb2Y6IGByZW1vdmVgXHJcbiAgICAgKlxyXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgc3RhcnRzIHJlbW92ZSBtb2RlIGJ5IGNsaWNraW5nIHRoZSByZW1vdmUgdG9vbCBidXR0b24uXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdy5FdmVudC5ERUxFVEVTVEFSVCA9ICdkcmF3OmRlbGV0ZXN0YXJ0JztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBldmVudCBkcmF3OmRlbGV0ZXN0b3A6IFN0cmluZ1xyXG4gICAgICpcclxuICAgICAqIFRoZSB0eXBlIG9mIGVkaXQgdGhpcyBpcy4gT25lIG9mOiBgcmVtb3ZlYFxyXG4gICAgICpcclxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGhhcyBmaW5pc2hlZCByZW1vdmluZyBzaGFwZXMgKHJlbW92ZSBtb2RlKSBhbmQgc2F2ZXMuXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdy5FdmVudC5ERUxFVEVTVE9QID0gJ2RyYXc6ZGVsZXRlc3RvcCc7XHJcblxyXG5cclxuICAgIEwuRHJhdyA9IEwuRHJhdyB8fCB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkRyYXcuRmVhdHVyZVxyXG4gICAgICogQGFrYSBEcmF3LkZlYXR1cmVcclxuICAgICAqL1xyXG4gICAgTC5EcmF3LkZlYXR1cmUgPSBMLkhhbmRsZXIuZXh0ZW5kKHtcclxuICAgICAgICBpbmNsdWRlczogTC5NaXhpbi5FdmVudHMsXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgaW5pdGlhbGl6ZSgpOiB2b2lkXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG1hcCwgb3B0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IG1hcC5fY29udGFpbmVyO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5UGFuZSA9IG1hcC5fcGFuZXMub3ZlcmxheVBhbmU7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwUGFuZSA9IG1hcC5fcGFuZXMucG9wdXBQYW5lO1xyXG5cclxuICAgICAgICAgICAgLy8gTWVyZ2UgZGVmYXVsdCBzaGFwZU9wdGlvbnMgb3B0aW9ucyB3aXRoIGN1c3RvbSBzaGFwZU9wdGlvbnNcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zaGFwZU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2hhcGVPcHRpb25zID0gTC5VdGlsLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLnNoYXBlT3B0aW9ucywgb3B0aW9ucy5zaGFwZU9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGVuYWJsZSgpOiB2b2lkXHJcbiAgICAgICAgLy8gRW5hYmxlcyB0aGlzIGhhbmRsZXJcclxuICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2VuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTC5IYW5kbGVyLnByb3RvdHlwZS5lbmFibGUuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZW5hYmxlZCcsIHtoYW5kbGVyOiB0aGlzLnR5cGV9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5EUkFXU1RBUlQsIHtsYXllclR5cGU6IHRoaXMudHlwZX0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgZGlzYWJsZSgpOiB2b2lkXHJcbiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTC5IYW5kbGVyLnByb3RvdHlwZS5kaXNhYmxlLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShMLkRyYXcuRXZlbnQuRFJBV1NUT1AsIHtsYXllclR5cGU6IHRoaXMudHlwZX0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maXJlKCdkaXNhYmxlZCcsIHtoYW5kbGVyOiB0aGlzLnR5cGV9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGFkZEhvb2tzKCk6IHZvaWRcclxuICAgICAgICAvLyBBZGQncyBldmVudCBsaXN0ZW5lcnMgdG8gdGhpcyBoYW5kbGVyXHJcbiAgICAgICAgYWRkSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcDtcclxuXHJcbiAgICAgICAgICAgIGlmIChtYXApIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5kaXNhYmxlVGV4dFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIG1hcC5nZXRDb250YWluZXIoKS5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAgPSBuZXcgTC5EcmF3LlRvb2x0aXAodGhpcy5fbWFwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBMLkRvbUV2ZW50Lm9uKHRoaXMuX2NvbnRhaW5lciwgJ2tleXVwJywgdGhpcy5fY2FuY2VsRHJhd2luZywgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHJlbW92ZUhvb2tzKCk6IHZvaWRcclxuICAgICAgICAvLyBSZW1vdmVzIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoaXMgaGFuZGxlclxyXG4gICAgICAgIHJlbW92ZUhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXApIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5lbmFibGVUZXh0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbHRpcC5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b29sdGlwID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICBMLkRvbUV2ZW50Lm9mZih0aGlzLl9jb250YWluZXIsICdrZXl1cCcsIHRoaXMuX2NhbmNlbERyYXdpbmcsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBzZXRPcHRpb25zKG9iamVjdCk6IHZvaWRcclxuICAgICAgICAvLyBTZXRzIG5ldyBvcHRpb25zIHRvIHRoaXMgaGFuZGxlclxyXG4gICAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZmlyZUNyZWF0ZWRFdmVudDogZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5DUkVBVEVELCB7bGF5ZXI6IGxheWVyLCBsYXllclR5cGU6IHRoaXMudHlwZX0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIENhbmNlbCBkcmF3aW5nIHdoZW4gdGhlIGVzY2FwZSBrZXkgaXMgcHJlc3NlZFxyXG4gICAgICAgIF9jYW5jZWxEcmF3aW5nOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAyNykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUoJ2RyYXc6Y2FuY2VsZWQnLCB7bGF5ZXJUeXBlOiB0aGlzLnR5cGV9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuRHJhdy5Qb2x5bGluZVxyXG4gICAgICogQGFrYSBEcmF3LlBvbHlsaW5lXHJcbiAgICAgKiBAaW5oZXJpdHMgTC5EcmF3LkZlYXR1cmVcclxuICAgICAqL1xyXG4gICAgTC5EcmF3LlBvbHlsaW5lID0gTC5EcmF3LkZlYXR1cmUuZXh0ZW5kKHtcclxuICAgICAgICBzdGF0aWNzOiB7XHJcbiAgICAgICAgICAgIFRZUEU6ICdwb2x5bGluZSdcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBQb2x5OiBMLlBvbHlsaW5lLFxyXG5cclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGFsbG93SW50ZXJzZWN0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICByZXBlYXRNb2RlOiBmYWxzZSxcclxuICAgICAgICAgICAgZHJhd0Vycm9yOiB7XHJcbiAgICAgICAgICAgICAgICBjb2xvcjogJyNiMDBiMDAnLFxyXG4gICAgICAgICAgICAgICAgdGltZW91dDogMjUwMFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBpY29uOiBuZXcgTC5EaXZJY29uKHtcclxuICAgICAgICAgICAgICAgIGljb25TaXplOiBuZXcgTC5Qb2ludCg4LCA4KSxcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2xlYWZsZXQtZGl2LWljb24gbGVhZmxldC1lZGl0aW5nLWljb24nXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB0b3VjaEljb246IG5ldyBMLkRpdkljb24oe1xyXG4gICAgICAgICAgICAgICAgaWNvblNpemU6IG5ldyBMLlBvaW50KDIwLCAyMCksXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdsZWFmbGV0LWRpdi1pY29uIGxlYWZsZXQtZWRpdGluZy1pY29uIGxlYWZsZXQtdG91Y2gtaWNvbidcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGd1aWRlbGluZURpc3RhbmNlOiAyMCxcclxuICAgICAgICAgICAgbWF4R3VpZGVMaW5lTGVuZ3RoOiA0MDAwLFxyXG4gICAgICAgICAgICBzaGFwZU9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgIHN0cm9rZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG9yOiAnIzMzODhmZicsXHJcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IDQsXHJcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjUsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGNsaWNrYWJsZTogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBtZXRyaWM6IHRydWUsIC8vIFdoZXRoZXIgdG8gdXNlIHRoZSBtZXRyaWMgbWVhc3VyZW1lbnQgc3lzdGVtIG9yIGltcGVyaWFsXHJcbiAgICAgICAgICAgIGZlZXQ6IHRydWUsIC8vIFdoZW4gbm90IG1ldHJpYywgdG8gdXNlIGZlZXQgaW5zdGVhZCBvZiB5YXJkcyBmb3IgZGlzcGxheS5cclxuICAgICAgICAgICAgbmF1dGljOiBmYWxzZSwgLy8gV2hlbiBub3QgbWV0cmljLCBub3QgZmVldCB1c2UgbmF1dGljIG1pbGUgZm9yIGRpc3BsYXlcclxuICAgICAgICAgICAgc2hvd0xlbmd0aDogdHJ1ZSwgLy8gV2hldGhlciB0byBkaXNwbGF5IGRpc3RhbmNlIGluIHRoZSB0b29sdGlwXHJcbiAgICAgICAgICAgIHpJbmRleE9mZnNldDogMjAwMCwgLy8gVGhpcyBzaG91bGQgYmUgPiB0aGFuIHRoZSBoaWdoZXN0IHotaW5kZXggYW55IG1hcCBsYXllcnNcclxuICAgICAgICAgICAgZmFjdG9yOiAxIC8vIFRvIGNoYW5nZSBkaXN0YW5jZSBjYWxjdWxhdGlvblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgaW5pdGlhbGl6ZSgpOiB2b2lkXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG1hcCwgb3B0aW9ucykge1xyXG4gICAgICAgICAgICAvLyBpZiB0b3VjaCwgc3dpdGNoIHRvIHRvdWNoIGljb25cclxuICAgICAgICAgICAgaWYgKEwuQnJvd3Nlci50b3VjaCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmljb24gPSB0aGlzLm9wdGlvbnMudG91Y2hJY29uO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBOZWVkIHRvIHNldCB0aGlzIGhlcmUgdG8gZW5zdXJlIHRoZSBjb3JyZWN0IG1lc3NhZ2UgaXMgdXNlZC5cclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYXdFcnJvci5tZXNzYWdlID0gTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5wb2x5bGluZS5lcnJvcjtcclxuXHJcbiAgICAgICAgICAgIC8vIE1lcmdlIGRlZmF1bHQgZHJhd0Vycm9yIG9wdGlvbnMgd2l0aCBjdXN0b20gb3B0aW9uc1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRyYXdFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kcmF3RXJyb3IgPSBMLlV0aWwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMuZHJhd0Vycm9yLCBvcHRpb25zLmRyYXdFcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHR5cGUgc28gc3VwZXIgY2FuIGZpcmUsIG5lZWQgdG8gZG8gdGhpcyBhcyBjYW5ub3QgZG8gdGhpcy5UWVBFIDooXHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEwuRHJhdy5Qb2x5bGluZS5UWVBFO1xyXG5cclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBtYXAsIG9wdGlvbnMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgYWRkSG9va3MoKTogdm9pZFxyXG4gICAgICAgIC8vIEFkZCBsaXN0ZW5lciBob29rcyB0byB0aGlzIGhhbmRsZXJcclxuICAgICAgICBhZGRIb29rczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBMLkRyYXcuRmVhdHVyZS5wcm90b3R5cGUuYWRkSG9va3MuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2VycyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcmtlckdyb3VwID0gbmV3IEwuTGF5ZXJHcm91cCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmFkZExheWVyKHRoaXMuX21hcmtlckdyb3VwKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2x5ID0gbmV3IEwuUG9seWxpbmUoW10sIHRoaXMub3B0aW9ucy5zaGFwZU9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAudXBkYXRlQ29udGVudCh0aGlzLl9nZXRUb29sdGlwVGV4dCgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBNYWtlIGEgdHJhbnNwYXJlbnQgbWFya2VyIHRoYXQgd2lsbCB1c2VkIHRvIGNhdGNoIGNsaWNrIGV2ZW50cy4gVGhlc2UgY2xpY2tcclxuICAgICAgICAgICAgICAgIC8vIGV2ZW50cyB3aWxsIGNyZWF0ZSB0aGUgdmVydGljZXMuIFdlIG5lZWQgdG8gZG8gdGhpcyBzbyB3ZSBjYW4gZW5zdXJlIHRoYXRcclxuICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBjcmVhdGUgdmVydGljZXMgb3ZlciBvdGhlciBtYXAgbGF5ZXJzIChtYXJrZXJzLCB2ZWN0b3IgbGF5ZXJzKS4gV2VcclxuICAgICAgICAgICAgICAgIC8vIGFsc28gZG8gbm90IHdhbnQgdG8gdHJpZ2dlciBhbnkgY2xpY2sgaGFuZGxlcnMgb2Ygb2JqZWN0cyB3ZSBhcmUgY2xpY2tpbmcgb25cclxuICAgICAgICAgICAgICAgIC8vIHdoaWxlIGRyYXdpbmcuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21vdXNlTWFya2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW91c2VNYXJrZXIgPSBMLm1hcmtlcih0aGlzLl9tYXAuZ2V0Q2VudGVyKCksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogTC5kaXZJY29uKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2xlYWZsZXQtbW91c2UtbWFya2VyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25BbmNob3I6IFsyMCwgMjBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblNpemU6IFs0MCwgNDBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXhPZmZzZXQ6IHRoaXMub3B0aW9ucy56SW5kZXhPZmZzZXRcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3VzZU1hcmtlclxyXG4gICAgICAgICAgICAgICAgICAgIC5vbignbW91c2VvdXQnLCB0aGlzLl9vbk1vdXNlT3V0LCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRoaXMpIC8vIE5lY2Vzc2FyeSB0byBwcmV2ZW50IDAuOCBzdHV0dGVyXHJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdtb3VzZWRvd24nLCB0aGlzLl9vbk1vdXNlRG93biwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAub24oJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIHRoaXMpIC8vIE5lY2Vzc2FyeSBmb3IgMC44IGNvbXBhdGliaWxpdHlcclxuICAgICAgICAgICAgICAgICAgICAuYWRkVG8odGhpcy5fbWFwKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXBcclxuICAgICAgICAgICAgICAgICAgICAub24oJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIHRoaXMpIC8vIE5lY2Vzc2FyeSBmb3IgMC43IGNvbXBhdGliaWxpdHlcclxuICAgICAgICAgICAgICAgICAgICAub24oJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbignem9vbWxldmVsc2NoYW5nZScsIHRoaXMuX29uWm9vbUVuZCwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAub24oJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblRvdWNoLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbignem9vbWVuZCcsIHRoaXMuX29uWm9vbUVuZCwgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCByZW1vdmVIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVyIGhvb2tzIGZyb20gdGhpcyBoYW5kbGVyLlxyXG4gICAgICAgIHJlbW92ZUhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIEwuRHJhdy5GZWF0dXJlLnByb3RvdHlwZS5yZW1vdmVIb29rcy5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY2xlYXJIaWRlRXJyb3JUaW1lb3V0KCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jbGVhblVwU2hhcGUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSBtYXJrZXJzIGZyb20gbWFwXHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzLl9tYXJrZXJHcm91cCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9tYXJrZXJHcm91cDtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcmtlcnM7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fcG9seSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wb2x5O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbW91c2VNYXJrZXJcclxuICAgICAgICAgICAgICAgIC5vZmYoJ21vdXNlZG93bicsIHRoaXMuX29uTW91c2VEb3duLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZignbW91c2VvdXQnLCB0aGlzLl9vbk1vdXNlT3V0LCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZignbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCB0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX21vdXNlTWFya2VyKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21vdXNlTWFya2VyO1xyXG5cclxuICAgICAgICAgICAgLy8gY2xlYW4gdXAgRE9NXHJcbiAgICAgICAgICAgIHRoaXMuX2NsZWFyR3VpZGVzKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXBcclxuICAgICAgICAgICAgICAgIC5vZmYoJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ3pvb21sZXZlbHNjaGFuZ2UnLCB0aGlzLl9vblpvb21FbmQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub2ZmKCd6b29tZW5kJywgdGhpcy5fb25ab29tRW5kLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZigndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2gsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub2ZmKCdjbGljaycsIHRoaXMuX29uVG91Y2gsIHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgZGVsZXRlTGFzdFZlcnRleCgpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBsYXN0IHZlcnRleCBmcm9tIHRoZSBwb2x5bGluZSwgcmVtb3ZlcyBwb2x5bGluZSBmcm9tIG1hcCBpZiBvbmx5IG9uZSBwb2ludCBleGlzdHMuXHJcbiAgICAgICAgZGVsZXRlTGFzdFZlcnRleDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWFya2Vycy5sZW5ndGggPD0gMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgbGFzdE1hcmtlciA9IHRoaXMuX21hcmtlcnMucG9wKCksXHJcbiAgICAgICAgICAgICAgICBwb2x5ID0gdGhpcy5fcG9seSxcclxuICAgICAgICAgICAgICAgIC8vIFJlcGxhY2VzIC5zcGxpY2VMYXRMbmdzKClcclxuICAgICAgICAgICAgICAgIGxhdGxuZ3MgPSBwb2x5LmdldExhdExuZ3MoKSxcclxuICAgICAgICAgICAgICAgIGxhdGxuZyA9IGxhdGxuZ3Muc3BsaWNlKC0xLCAxKVswXTtcclxuICAgICAgICAgICAgdGhpcy5fcG9seS5zZXRMYXRMbmdzKGxhdGxuZ3MpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbWFya2VyR3JvdXAucmVtb3ZlTGF5ZXIobGFzdE1hcmtlcik7XHJcblxyXG4gICAgICAgICAgICBpZiAocG9seS5nZXRMYXRMbmdzKCkubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHBvbHkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92ZXJ0ZXhDaGFuZ2VkKGxhdGxuZywgZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgaXNNYXJrZXJJbnNpZGVQb2x5Z29uKCk6IHZvaWRcclxuICAgICAgICBpc01hcmtlckluc2lkZVBvbHlnb246IGZ1bmN0aW9uIChsYXRMbmcsIHBvbHkpIHtcclxuICAgICAgICAgICAgdmFyIGluc2lkZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YXIgeCA9IGxhdExuZy5sYXQsIHkgPSBsYXRMbmcubG5nO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgcG9seS5nZXRMYXRMbmdzKCkubGVuZ3RoOyBpaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcG9seVBvaW50cyA9IHBvbHkuZ2V0TGF0TG5ncygpW2lpXTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gcG9seVBvaW50cy5sZW5ndGggLSAxOyBpIDwgcG9seVBvaW50cy5sZW5ndGg7IGogPSBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgeGkgPSBwb2x5UG9pbnRzW2ldLmxhdCwgeWkgPSBwb2x5UG9pbnRzW2ldLmxuZztcclxuICAgICAgICAgICAgICAgICAgICB2YXIgeGogPSBwb2x5UG9pbnRzW2pdLmxhdCwgeWogPSBwb2x5UG9pbnRzW2pdLmxuZztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludGVyc2VjdCA9ICgoeWkgPiB5KSAhPSAoeWogPiB5KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHggPCAoeGogLSB4aSkgKiAoeSAtIHlpKSAvICh5aiAtIHlpKSArIHhpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0KSBpbnNpZGUgPSAhaW5zaWRlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBpbnNpZGU7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyBAbWV0aG9kIGFkZFZlcnRleCgpOiB2b2lkXHJcbiAgICAgICAgLy8gQWRkIGEgdmVydGV4IHRvIHRoZSBlbmQgb2YgdGhlIHBvbHlsaW5lXHJcbiAgICAgICAgLy8gQWRkIGEgdmVydGV4IHRvIHRoZSBlbmQgb2YgdGhlIHBvbHlsaW5lXHJcbiAgICAgICAgYWRkVmVydGV4OiBmdW5jdGlvbiAobGF0bG5nLCBzYW1lKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXJzTGVuZ3RoID0gdGhpcy5fbWFya2Vycy5sZW5ndGg7XHJcbiAgICAgICAgICAgIC8vIG1hcmtlcnNMZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMiBiZWZvcmUgaW50ZXJzZWN0aW9ucyBjYW4gb2NjdXJcclxuICAgICAgICAgICAgdmFyIGluUG9seWdvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoc2FtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmVhY2hMYXllcihmdW5jdGlvbiAocG9seSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb2x5IGluc3RhbmNlb2YgTC5Qb2x5Z29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnNpZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBsYXRsbmcubGF0LCB5ID0gbGF0bG5nLmxuZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IHBvbHkuZ2V0TGF0TG5ncygpLmxlbmd0aDsgaWkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvbHlQb2ludHMgPSBwb2x5LmdldExhdExuZ3MoKVtpaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IHBvbHlQb2ludHMubGVuZ3RoIC0gMTsgaSA8IHBvbHlQb2ludHMubGVuZ3RoOyBqID0gaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhpID0gcG9seVBvaW50c1tpXS5sYXQsIHlpID0gcG9seVBvaW50c1tpXS5sbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhqID0gcG9seVBvaW50c1tqXS5sYXQsIHlqID0gcG9seVBvaW50c1tqXS5sbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcnNlY3QgPSAoKHlpID4geSkgIT0gKHlqID4geSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICh4IDwgKHhqIC0geGkpICogKHkgLSB5aSkgLyAoeWogLSB5aSkgKyB4aSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyc2VjdCkgaW5zaWRlID0gIWluc2lkZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zaWRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3BvbHkuc2V0U3R5bGUoeyBjb2xvcjogJ2JsdWUnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qb2x5Z29uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHZhciBwb2ludFNuYXAgPSB0aGlzLnBvaW50U25hcCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgaWYgKCFpblBvbHlnb24gJiYgbWFya2Vyc0xlbmd0aCA+PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbGF0TG5nVGVzdCA9IGxhdGxuZztcclxuICAgICAgICAgICAgICAgIHZhciBsYXN0TGF0TG5nID0gdGhpcy5fbWFya2Vyc1ttYXJrZXJzTGVuZ3RoIC0gMV0uZ2V0TGF0TG5nKCk7XHJcbiAgICAgICAgICAgICAgICBpblBvbHlnb24gPSB0aGlzLmxpbmVJblBvbHlnb24obGF0TG5nVGVzdCwgbGFzdExhdExuZyk7XHJcbiAgICAgICAgICAgICAgICB2YXIgbGFzdExpbmUgPSBMLnBvbHlsaW5lKFtsYXN0TGF0TG5nLCBsYXRMbmdUZXN0XSwge29wYWNpdHk6IFwiMFwifSkuYWRkVG8odGhpcy5fbWFwKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGlnbmUgaW50ZXJzZWN0IHVuIHBvbHlnb24gT1Ugc2kgcG9pbnQvbGlnbmUgaW4gUG9seWdvbiBPVSBzaSBwb2ludCBuJ2VzdCBwYXMgc3VyIHVuIHBvaW50IHNuYXAgb3UgZGFucyBsZSB2aWRlXHJcbiAgICAgICAgICAgIGlmICgobWFya2Vyc0xlbmd0aCA+PSAyICYmICF0aGlzLm9wdGlvbnMuYWxsb3dJbnRlcnNlY3Rpb24gJiYgdGhpcy5fcG9seS5uZXdMYXRMbmdJbnRlcnNlY3RzKGxhdGxuZykpIHx8IGluUG9seWdvbiB8fCAoIXBvaW50U25hcCAmJiAhc2FtZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dFcnJvclRvb2x0aXAoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9lcnJvclNob3duKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oaWRlRXJyb3JUb29sdGlwKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlcnMucHVzaCh0aGlzLl9jcmVhdGVNYXJrZXIobGF0bG5nKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9wb2x5LmFkZExhdExuZyhsYXRsbmcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvbHkuZ2V0TGF0TG5ncygpLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmFkZExheWVyKHRoaXMuX3BvbHkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92ZXJ0ZXhDaGFuZ2VkKGxhdGxuZywgdHJ1ZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgcG9pbnRTbmFwOiBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICB2YXIgZ3VpZGVMYXllcnMgPSB0aGlzLl9zbmFwcGVyLl9ndWlkZXM7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3VpZGVMYXllcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ3VpZGVMYXllcnNbaV0uX2xhdGxuZ3MubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGd1aWRlTGF5ZXJzW2ldLl9sYXRsbmdzW2pdLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGd1aWRlTGF5ZXJzW2ldLl9sYXRsbmdzW2pdW2tdLmxhdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc25hcHBlci5fbWFya2Vyc1swXS5fbGF0bG5nLmxhdCA9PSBndWlkZUxheWVyc1tpXS5fbGF0bG5nc1tqXVtrXS5sYXQgJiYgdGhpcy5fc25hcHBlci5fbWFya2Vyc1swXS5fbGF0bG5nLmxuZyA9PSBndWlkZUxheWVyc1tpXS5fbGF0bG5nc1tqXVtrXS5sbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBndWlkZUxheWVyc1tpXS5fbGF0bG5nc1tqXVtrXS5sZW5ndGg7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zbmFwcGVyLl9tYXJrZXJzWzBdLl9sYXRsbmcubGF0ID09IGd1aWRlTGF5ZXJzW2ldLl9sYXRsbmdzW2pdW2tdW2xdLmxhdCAmJiB0aGlzLl9zbmFwcGVyLl9tYXJrZXJzWzBdLl9sYXRsbmcubG5nID09IGd1aWRlTGF5ZXJzW2ldLl9sYXRsbmdzW2pdW2tdW2xdLmxuZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgY29tcGxldGVTaGFwZSgpOiB2b2lkXHJcbiAgICAgICAgLy8gQ2xvc2VzIHRoZSBwb2x5bGluZSBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgbGFzdCBwb2ludHNcclxuICAgICAgICBjb21wbGV0ZVNoYXBlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXJrZXJzLmxlbmd0aCA8PSAxKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVDcmVhdGVkRXZlbnQoKTtcclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlcGVhdE1vZGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBpc19pbl9wb2x5Z29uOiBmdW5jdGlvbiAoJHZlcnRpY2VzX3gsICR2ZXJ0aWNlc195LCBwb2ludCkge1xyXG4gICAgICAgICAgICAkYyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAkaSA9ICRqID0gJGMgPSAwO1xyXG4gICAgICAgICAgICAkbG9uZ2l0dWRlX3ggPSBwb2ludC5sbmc7XHJcbiAgICAgICAgICAgICRsYXRpdHVkZV95ID0gcG9pbnQubGF0O1xyXG5cclxuICAgICAgICAgICAgZm9yICgkaSA9IDAsICRqID0gMi0xOyAkaSA8IDI7ICRqID0gJGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCgkdmVydGljZXNfeVskaV0gPiAgJGxhdGl0dWRlX3kgIT0gKCR2ZXJ0aWNlc195WyRqXSA+ICRsYXRpdHVkZV95KSkgJiYgKCRsb25naXR1ZGVfeCA8ICgkdmVydGljZXNfeFskal0gLSAkdmVydGljZXNfeFskaV0pICogKCRsYXRpdHVkZV95IC0gJHZlcnRpY2VzX3lbJGldKSAvICgkdmVydGljZXNfeVskal0gLSAkdmVydGljZXNfeVskaV0pICsgJHZlcnRpY2VzX3hbJGldKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICRjID0gISRjO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gJGM7XHJcbiAgICAgICAgfSxcclxuXHJcblxyXG4gICAgICAgIHBvaW50T25Qb2x5Z29uOiBmdW5jdGlvbihsYXRMbmcpe1xyXG4gICAgICAgICAgICB0aGlzLl9tYXAuZWFjaExheWVyKGZ1bmN0aW9uIChwb2x5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9seSBpbnN0YW5jZW9mIEwuUG9seWdvbikge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgcG9seUJvdW5kcyA9IHBvbHkuZ2V0Qm91bmRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvbHlCb3VuZHMuY29udGFpbnMobGF0TG5nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGF0TG5nUG9seSA9IHBvbHkuX2xhdGxuZ3NbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZW5naHQgPSBsYXRMbmdQb2x5Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaiA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGkgPCBsZW5naHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaiA9PSBsZW5naHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBMLnBvbHlsaW5lKFtwb2x5Ll9sYXRsbmdzWzBdW2ldLCBwb2x5Ll9sYXRsbmdzWzBdW2pdXSwge29wYWNpdHk6IFwiMFwifSkuYWRkVG8ocG9seS5fbWFwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb2x5TGluZUJvdW5kcyA9IGxpbmUuZ2V0Qm91bmRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwb2x5TGluZUJvdW5kcy5jb250YWlucyhsYXRMbmcpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkgPT0gMCAmJiBqID09IGxlbmdodCAtIDEpIHx8IChqID09IDAgJiYgaSA9PSBsZW5naHQgLSAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRMbmdQb2x5LnNwbGljZSgwLCAwLCBMLmxhdExuZyhsYXRMbmcubGF0LCBsYXRMbmcubG5nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcmtlclBvbHkgPSBpICsgajtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyUG9seSA9IG1hcmtlclBvbHkgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRMbmdQb2x5LnNwbGljZShNYXRoLmNlaWwobWFya2VyUG9seSksIDAsIEwubGF0TG5nKGxhdExuZy5sYXQsIGxhdExuZy5sbmcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHkuX21hcC5yZW1vdmVMYXllcihsaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5Ll9sYXRsbmdzWzBdID0gbGF0TG5nUG9seTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5LmVkaXRpbmcubGF0bG5nc1swXVswXSA9IGxhdExuZ1BvbHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9seS5yZWRyYXcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHkuX21hcC5yZW1vdmVMYXllcihsaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBsaW5lSW5Qb2x5Z29uOiBmdW5jdGlvbiAobGF0TG5nVGVzdCwgbGFzdExhdExuZykge1xyXG4gICAgICAgICAgICB2YXIgaW5Qb2x5Z29uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZhciBsYXN0TGluZSA9IEwucG9seWxpbmUoW2xhc3RMYXRMbmcsIGxhdExuZ1Rlc3RdLCB7b3BhY2l0eTogXCIwXCJ9KS5hZGRUbyh0aGlzLl9tYXApO1xyXG4gICAgICAgICAgICBsYXRMbmdUZXN0LmxuZyA9IChNYXRoLnJvdW5kKGxhdExuZ1Rlc3QubG5nICogMTAwMDAwMCkgLyAxMDAwMDAwKTtcclxuICAgICAgICAgICAgbGF0TG5nVGVzdC5sYXQgPSAoTWF0aC5yb3VuZChsYXRMbmdUZXN0LmxhdCAqIDEwMDAwMDApIC8gMTAwMDAwMCk7XHJcbiAgICAgICAgICAgIGxhc3RMYXRMbmcubG5nID0gKE1hdGgucm91bmQobGFzdExhdExuZy5sbmcgKiAxMDAwMDAwKSAvIDEwMDAwMDApO1xyXG4gICAgICAgICAgICBsYXN0TGF0TG5nLmxhdCA9IChNYXRoLnJvdW5kKGxhc3RMYXRMbmcubGF0ICogMTAwMDAwMCkgLyAxMDAwMDAwKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIG51bSA9IDAuMTsgbnVtIDw9IDAuOTsgbnVtICs9IDAuMSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBvaW50ID0gTC5HZW9tZXRyeVV0aWwuaW50ZXJwb2xhdGVPbkxpbmUodGhpcy5fbWFwLCBsYXN0TGluZSwgbnVtKTtcclxuICAgICAgICAgICAgICAgIHZhciB0YWJPblBvbHkgPSBbXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5lYWNoTGF5ZXIoZnVuY3Rpb24gKHBvbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9seSBpbnN0YW5jZW9mIEwuUG9seWdvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmVmb3JlLCBhZnRlciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9seS5nZXRMYXRMbmdzKCkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb2x5UG9pbnRzID0gcG9seS5nZXRMYXRMbmdzKClbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcG9seVBvaW50c1swXS5sYXQpey8vYW50ZW5uZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5UG9pbnRzID0gcG9seVBvaW50c1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcG9seVBvaW50cy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb2x5UG9pbnRzW2pdLmVxdWFscyhsYXN0TGF0TG5nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBqIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBqICsgMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlID0gcG9seVBvaW50cy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGogPT0gcG9seVBvaW50cy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvbHlQb2ludHNbYmVmb3JlXS5lcXVhbHMobGF0TG5nVGVzdCkgfHwgcG9seVBvaW50c1thZnRlcl0uZXF1YWxzKGxhdExuZ1Rlc3QpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJPblBvbHkucHVzaChwb2x5Lm9wdGlvbnMuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZWFjaExheWVyKGZ1bmN0aW9uIChwb2x5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvbHkgaW5zdGFuY2VvZiBMLlBvbHlnb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJPblBvbHkuaW5jbHVkZXMocG9seS5vcHRpb25zLmlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluc2lkZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBwb2ludC5sYXRMbmcubGF0LCB5ID0gcG9pbnQubGF0TG5nLmxuZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBwb2x5LmdldExhdExuZ3MoKS5sZW5ndGg7IGlpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9seVBvaW50cyA9IHBvbHkuZ2V0TGF0TG5ncygpW2lpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IHBvbHlQb2ludHMubGVuZ3RoIC0gMTsgaSA8IHBvbHlQb2ludHMubGVuZ3RoOyBqID0gaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aSA9IHBvbHlQb2ludHNbaV0ubGF0LCB5aSA9IHBvbHlQb2ludHNbaV0ubG5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeGogPSBwb2x5UG9pbnRzW2pdLmxhdCwgeWogPSBwb2x5UG9pbnRzW2pdLmxuZztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcnNlY3QgPSAoKHlpID4geSkgIT0gKHlqID4geSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoeCA8ICh4aiAtIHhpKSAqICh5IC0geWkpIC8gKHlqIC0geWkpICsgeGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0KSBpbnNpZGUgPSAhaW5zaWRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBvbHlnb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKGxhc3RMaW5lKTtcclxuICAgICAgICAgICAgcmV0dXJuIGluUG9seWdvbjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZmluaXNoU2hhcGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdmaW5pc2hzaGFwZScpO1xyXG4gICAgICAgICAgICB2YXIgbGF0bG5ncyA9IHRoaXMuX3BvbHkuX2RlZmF1bHRTaGFwZSA/IHRoaXMuX3BvbHkuX2RlZmF1bHRTaGFwZSgpIDogdGhpcy5fcG9seS5nZXRMYXRMbmdzKCk7XHJcbiAgICAgICAgICAgIHZhciBpbnRlcnNlY3RzID0gdGhpcy5fcG9seS5uZXdMYXRMbmdJbnRlcnNlY3RzKGxhdGxuZ3NbbGF0bG5ncy5sZW5ndGggLSAxXSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgbWFya2Vyc0xlbmd0aCA9IHRoaXMuX21hcmtlcnMubGVuZ3RoO1xyXG4gICAgICAgICAgICB2YXIgbGF0TG5nVGVzdCA9IHRoaXMuX21hcmtlcnNbMF0uZ2V0TGF0TG5nKCk7XHJcbiAgICAgICAgICAgIHZhciBsYXN0TGF0TG5nID0gdGhpcy5fbWFya2Vyc1ttYXJrZXJzTGVuZ3RoIC0gMV0uZ2V0TGF0TG5nKCk7XHJcbiAgICAgICAgICAgIHZhciBpblBvbHlnb24gPSB0aGlzLmxpbmVJblBvbHlnb24obGF0TG5nVGVzdCwgbGFzdExhdExuZyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoKCF0aGlzLm9wdGlvbnMuYWxsb3dJbnRlcnNlY3Rpb24gJiYgaW50ZXJzZWN0cykgfHwgIXRoaXMuX3NoYXBlSXNWYWxpZCgpIHx8IGluUG9seWdvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvd0Vycm9yVG9vbHRpcCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9maXJlQ3JlYXRlZEV2ZW50KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlcGVhdE1vZGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBDYWxsZWQgdG8gdmVyaWZ5IHRoZSBzaGFwZSBpcyB2YWxpZCB3aGVuIHRoZSB1c2VyIHRyaWVzIHRvIGZpbmlzaCBpdFxyXG4gICAgICAgIC8vIFJldHVybiBmYWxzZSBpZiB0aGUgc2hhcGUgaXMgbm90IHZhbGlkXHJcbiAgICAgICAgX3NoYXBlSXNWYWxpZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25ab29tRW5kOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXJrZXJzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVHdWlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uTW91c2VNb3ZlOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgbmV3UG9zID0gdGhpcy5fbWFwLm1vdXNlRXZlbnRUb0xheWVyUG9pbnQoZS5vcmlnaW5hbEV2ZW50KTtcclxuICAgICAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcobmV3UG9zKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNhdmUgbGF0bG5nXHJcbiAgICAgICAgICAgIC8vIHNob3VsZCB0aGlzIGJlIG1vdmVkIHRvIF91cGRhdGVHdWlkZSgpID9cclxuICAgICAgICAgICAgdGhpcy5fY3VycmVudExhdExuZyA9IGxhdGxuZztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRvb2x0aXAobGF0bG5nKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZ3VpZGUgbGluZVxyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVHdWlkZShuZXdQb3MpO1xyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBtb3VzZSBtYXJrZXIgcG9zaXRpb25cclxuICAgICAgICAgICAgdGhpcy5fbW91c2VNYXJrZXIuc2V0TGF0TG5nKGxhdGxuZyk7XHJcblxyXG4gICAgICAgICAgICBMLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KGUub3JpZ2luYWxFdmVudCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3ZlcnRleENoYW5nZWQ6IGZ1bmN0aW9uIChsYXRsbmcsIGFkZGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5EUkFXVkVSVEVYLCB7bGF5ZXJzOiB0aGlzLl9tYXJrZXJHcm91cH0pO1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVGaW5pc2hIYW5kbGVyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVSdW5uaW5nTWVhc3VyZShsYXRsbmcsIGFkZGVkKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NsZWFyR3VpZGVzKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVUb29sdGlwKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uTW91c2VEb3duOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NsaWNrSGFuZGxlZCAmJiAhdGhpcy5fdG91Y2hIYW5kbGVkICYmICF0aGlzLl9kaXNhYmxlTWFya2Vycykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb25Nb3VzZU1vdmUoZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0hhbmRsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzYWJsZU5ld01hcmtlcnMoKTtcclxuICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbEV2ZW50ID0gZS5vcmlnaW5hbEV2ZW50O1xyXG4gICAgICAgICAgICAgICAgdmFyIGNsaWVudFggPSBvcmlnaW5hbEV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2xpZW50WSA9IG9yaWdpbmFsRXZlbnQuY2xpZW50WTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9pbnQuY2FsbCh0aGlzLCBjbGllbnRYLCBjbGllbnRZKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9zdGFydFBvaW50OiBmdW5jdGlvbiAoY2xpZW50WCwgY2xpZW50WSkge1xyXG4gICAgICAgICAgICB0aGlzLl9tb3VzZURvd25PcmlnaW4gPSBMLnBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbk1vdXNlVXA6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBvcmlnaW5hbEV2ZW50ID0gZS5vcmlnaW5hbEV2ZW50O1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50WCA9IG9yaWdpbmFsRXZlbnQuY2xpZW50WDtcclxuICAgICAgICAgICAgdmFyIGNsaWVudFkgPSBvcmlnaW5hbEV2ZW50LmNsaWVudFk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZFBvaW50LmNhbGwodGhpcywgY2xpZW50WCwgY2xpZW50WSwgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrSGFuZGxlZCA9IG51bGw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2VuZFBvaW50OiBmdW5jdGlvbiAoY2xpZW50WCwgY2xpZW50WSwgZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbW91c2VEb3duT3JpZ2luKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZHJhZ0NoZWNrRGlzdGFuY2UgPSBMLnBvaW50KGNsaWVudFgsIGNsaWVudFkpXHJcbiAgICAgICAgICAgICAgICAgICAgLmRpc3RhbmNlVG8odGhpcy5fbW91c2VEb3duT3JpZ2luKTtcclxuICAgICAgICAgICAgICAgIHZhciBsYXN0UHREaXN0YW5jZSA9IHRoaXMuX2NhbGN1bGF0ZUZpbmlzaERpc3RhbmNlKGUubGF0bG5nKTtcclxuICAgICAgICAgICAgICAgIGlmIChsYXN0UHREaXN0YW5jZSA8IDEwICYmIEwuQnJvd3Nlci50b3VjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaFNoYXBlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGRyYWdDaGVja0Rpc3RhbmNlKSA8IDkgKiAod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc25hcHBlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2FtZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc25hcHBlci5fbWFya2Vyc1swXS5fbGF0bG5nLmxhdCA9PSBlLmxhdGxuZy5sYXQgJiYgdGhpcy5fc25hcHBlci5fbWFya2Vyc1swXS5fbGF0bG5nLmxuZyA9PSBlLmxhdGxuZy5sbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkVmVydGV4KHRoaXMuX3NuYXBwZXIuX21hcmtlcnNbMF0uX2xhdGxuZywgc2FtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRWZXJ0ZXgoZS5sYXRsbmcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVOZXdNYXJrZXJzKCk7IC8vIGFmdGVyIGEgc2hvcnQgcGF1c2UsIGVuYWJsZSBuZXcgbWFya2Vyc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX21vdXNlRG93bk9yaWdpbiA9IG51bGw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gb250b3VjaCBwcmV2ZW50ZWQgYnkgY2xpY2tIYW5kbGVkIGZsYWcgYmVjYXVzZSBzb21lIGJyb3dzZXJzIGZpcmUgYm90aCBjbGljay90b3VjaCBldmVudHMsXHJcbiAgICAgICAgLy8gY2F1c2luZyB1bndhbnRlZCBiZWhhdmlvclxyXG4gICAgICAgIF9vblRvdWNoOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxFdmVudCA9IGUub3JpZ2luYWxFdmVudDtcclxuICAgICAgICAgICAgdmFyIGNsaWVudFg7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnRZO1xyXG4gICAgICAgICAgICBpZiAob3JpZ2luYWxFdmVudC50b3VjaGVzICYmIG9yaWdpbmFsRXZlbnQudG91Y2hlc1swXSAmJiAhdGhpcy5fY2xpY2tIYW5kbGVkICYmICF0aGlzLl90b3VjaEhhbmRsZWQgJiYgIXRoaXMuX2Rpc2FibGVNYXJrZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRYID0gb3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFg7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRZID0gb3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlTmV3TWFya2VycygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG91Y2hIYW5kbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9pbnQuY2FsbCh0aGlzLCBjbGllbnRYLCBjbGllbnRZKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2VuZFBvaW50LmNhbGwodGhpcywgY2xpZW50WCwgY2xpZW50WSwgZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b3VjaEhhbmRsZWQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrSGFuZGxlZCA9IG51bGw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uTW91c2VPdXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rvb2x0aXApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAuX29uTW91c2VPdXQuY2FsbCh0aGlzLl90b29sdGlwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBpZiB3ZSBhcmUgY3VycmVudGx5IHdpdGhpbiBjbG9zZSBlbm91Z2ggZGlzdGFuY2VcclxuICAgICAgICAvLyBvZiB0aGUgY2xvc2luZyBwb2ludCAoZmlyc3QgcG9pbnQgZm9yIHNoYXBlcywgbGFzdCBwb2ludCBmb3IgbGluZXMpXHJcbiAgICAgICAgLy8gdGhpcyBpcyBzZW1pLXVnbHkgY29kZSBidXQgdGhlIG9ubHkgcmVsaWFibGUgd2F5IGkgZm91bmQgdG8gZ2V0IHRoZSBqb2IgZG9uZVxyXG4gICAgICAgIC8vIG5vdGU6IGNhbGN1bGF0aW5nIHBvaW50LmRpc3RhbmNlVG8gYmV0d2VlbiBtb3VzZURvd25PcmlnaW4gYW5kIGxhc3QgbWFya2VyIGRpZCBOT1Qgd29ya1xyXG4gICAgICAgIF9jYWxjdWxhdGVGaW5pc2hEaXN0YW5jZTogZnVuY3Rpb24gKHBvdGVudGlhbExhdExuZykge1xyXG4gICAgICAgICAgICB2YXIgbGFzdFB0RGlzdGFuY2VcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcmtlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZpbmlzaE1hcmtlcjtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09IEwuRHJhdy5Qb2x5bGluZS5UWVBFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoTWFya2VyID0gdGhpcy5fbWFya2Vyc1t0aGlzLl9tYXJrZXJzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IEwuRHJhdy5Qb2x5Z29uLlRZUEUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hNYXJrZXIgPSB0aGlzLl9tYXJrZXJzWzBdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIgbGFzdE1hcmtlclBvaW50ID0gdGhpcy5fbWFwLmxhdExuZ1RvQ29udGFpbmVyUG9pbnQoZmluaXNoTWFya2VyLmdldExhdExuZygpKSxcclxuICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxNYXJrZXIgPSBuZXcgTC5NYXJrZXIocG90ZW50aWFsTGF0TG5nLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246IHRoaXMub3B0aW9ucy5pY29uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXhPZmZzZXQ6IHRoaXMub3B0aW9ucy56SW5kZXhPZmZzZXQgKiAyXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcG90ZW50aWFsTWFya2VyUGludCA9IHRoaXMuX21hcC5sYXRMbmdUb0NvbnRhaW5lclBvaW50KHBvdGVudGlhbE1hcmtlci5nZXRMYXRMbmcoKSk7XHJcbiAgICAgICAgICAgICAgICBsYXN0UHREaXN0YW5jZSA9IGxhc3RNYXJrZXJQb2ludC5kaXN0YW5jZVRvKHBvdGVudGlhbE1hcmtlclBpbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGFzdFB0RGlzdGFuY2UgPSBJbmZpbml0eTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbGFzdFB0RGlzdGFuY2U7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3VwZGF0ZUZpbmlzaEhhbmRsZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG1hcmtlckNvdW50ID0gdGhpcy5fbWFya2Vycy5sZW5ndGg7XHJcbiAgICAgICAgICAgIC8vIFRoZSBsYXN0IG1hcmtlciBzaG91bGQgaGF2ZSBhIGNsaWNrIGhhbmRsZXIgdG8gY2xvc2UgdGhlIHBvbHlsaW5lXHJcbiAgICAgICAgICAgIGlmIChtYXJrZXJDb3VudCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcmtlcnNbbWFya2VyQ291bnQgLSAxXS5vbignY2xpY2snLCB0aGlzLl9maW5pc2hTaGFwZSwgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgb2xkIG1hcmtlciBjbGljayBoYW5kbGVyIChhcyBvbmx5IHRoZSBsYXN0IHBvaW50IHNob3VsZCBjbG9zZSB0aGUgcG9seWxpbmUpXHJcbiAgICAgICAgICAgIGlmIChtYXJrZXJDb3VudCA+IDIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcmtlcnNbbWFya2VyQ291bnQgLSAyXS5vZmYoJ2NsaWNrJywgdGhpcy5fZmluaXNoU2hhcGUsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NyZWF0ZU1hcmtlcjogZnVuY3Rpb24gKGxhdGxuZykge1xyXG4gICAgICAgICAgICB2YXIgbWFya2VyID0gbmV3IEwuTWFya2VyKGxhdGxuZywge1xyXG4gICAgICAgICAgICAgICAgaWNvbjogdGhpcy5vcHRpb25zLmljb24sXHJcbiAgICAgICAgICAgICAgICB6SW5kZXhPZmZzZXQ6IHRoaXMub3B0aW9ucy56SW5kZXhPZmZzZXQgKiAyXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbWFya2VyR3JvdXAuYWRkTGF5ZXIobWFya2VyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBtYXJrZXI7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3VwZGF0ZUd1aWRlOiBmdW5jdGlvbiAobmV3UG9zKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXJDb3VudCA9IHRoaXMuX21hcmtlcnMgPyB0aGlzLl9tYXJrZXJzLmxlbmd0aCA6IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAobWFya2VyQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdQb3MgPSBuZXdQb3MgfHwgdGhpcy5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9jdXJyZW50TGF0TG5nKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBndWlkZSBsaW5lXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGVhckd1aWRlcygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd0d1aWRlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbWFya2Vyc1ttYXJrZXJDb3VudCAtIDFdLmdldExhdExuZygpKSxcclxuICAgICAgICAgICAgICAgICAgICBuZXdQb3NcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfdXBkYXRlVG9vbHRpcDogZnVuY3Rpb24gKGxhdExuZykge1xyXG4gICAgICAgICAgICB2YXIgdGV4dCA9IHRoaXMuX2dldFRvb2x0aXBUZXh0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAobGF0TG5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b29sdGlwLnVwZGF0ZVBvc2l0aW9uKGxhdExuZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fZXJyb3JTaG93bikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbHRpcC51cGRhdGVDb250ZW50KHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2RyYXdHdWlkZTogZnVuY3Rpb24gKHBvaW50QSwgcG9pbnRCKSB7XHJcbiAgICAgICAgICAgIHZhciBsZW5ndGggPSBNYXRoLmZsb29yKE1hdGguc3FydChNYXRoLnBvdygocG9pbnRCLnggLSBwb2ludEEueCksIDIpICsgTWF0aC5wb3coKHBvaW50Qi55IC0gcG9pbnRBLnkpLCAyKSkpLFxyXG4gICAgICAgICAgICAgICAgZ3VpZGVsaW5lRGlzdGFuY2UgPSB0aGlzLm9wdGlvbnMuZ3VpZGVsaW5lRGlzdGFuY2UsXHJcbiAgICAgICAgICAgICAgICBtYXhHdWlkZUxpbmVMZW5ndGggPSB0aGlzLm9wdGlvbnMubWF4R3VpZGVMaW5lTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgLy8gT25seSBkcmF3IGEgZ3VpZGVsaW5lIHdpdGggYSBtYXggbGVuZ3RoXHJcbiAgICAgICAgICAgICAgICBpID0gbGVuZ3RoID4gbWF4R3VpZGVMaW5lTGVuZ3RoID8gbGVuZ3RoIC0gbWF4R3VpZGVMaW5lTGVuZ3RoIDogZ3VpZGVsaW5lRGlzdGFuY2UsXHJcbiAgICAgICAgICAgICAgICBmcmFjdGlvbixcclxuICAgICAgICAgICAgICAgIGRhc2hQb2ludCxcclxuICAgICAgICAgICAgICAgIGRhc2g7XHJcblxyXG4gICAgICAgICAgICAvL2NyZWF0ZSB0aGUgZ3VpZGVzIGNvbnRhaW5lciBpZiB3ZSBoYXZlbid0IHlldFxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2d1aWRlc0NvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ3VpZGVzQ29udGFpbmVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2xlYWZsZXQtZHJhdy1ndWlkZXMnLCB0aGlzLl9vdmVybGF5UGFuZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vZHJhdyBhIGRhc2ggZXZlcnkgR3VpbGRlTGluZURpc3RhbmNlXHJcbiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpICs9IHRoaXMub3B0aW9ucy5ndWlkZWxpbmVEaXN0YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgLy93b3JrIG91dCBmcmFjdGlvbiBhbG9uZyBsaW5lIHdlIGFyZVxyXG4gICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBpIC8gbGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vY2FsY3VsYXRlIG5ldyB4LHkgcG9pbnRcclxuICAgICAgICAgICAgICAgIGRhc2hQb2ludCA9IHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBNYXRoLmZsb29yKChwb2ludEEueCAqICgxIC0gZnJhY3Rpb24pKSArIChmcmFjdGlvbiAqIHBvaW50Qi54KSksXHJcbiAgICAgICAgICAgICAgICAgICAgeTogTWF0aC5mbG9vcigocG9pbnRBLnkgKiAoMSAtIGZyYWN0aW9uKSkgKyAoZnJhY3Rpb24gKiBwb2ludEIueSkpXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIC8vYWRkIGd1aWRlIGRhc2ggdG8gZ3VpZGUgY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICBkYXNoID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2xlYWZsZXQtZHJhdy1ndWlkZS1kYXNoJywgdGhpcy5fZ3VpZGVzQ29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIGRhc2guc3R5bGUuYmFja2dyb3VuZENvbG9yID1cclxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5fZXJyb3JTaG93biA/IHRoaXMub3B0aW9ucy5zaGFwZU9wdGlvbnMuY29sb3IgOiB0aGlzLm9wdGlvbnMuZHJhd0Vycm9yLmNvbG9yO1xyXG5cclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5zZXRQb3NpdGlvbihkYXNoLCBkYXNoUG9pbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3VwZGF0ZUd1aWRlQ29sb3I6IGZ1bmN0aW9uIChjb2xvcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3VpZGVzQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMuX2d1aWRlc0NvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2d1aWRlc0NvbnRhaW5lci5jaGlsZE5vZGVzW2ldLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlcyBhbGwgY2hpbGQgZWxlbWVudHMgKGd1aWRlIGRhc2hlcykgZnJvbSB0aGUgZ3VpZGVzIGNvbnRhaW5lclxyXG4gICAgICAgIF9jbGVhckd1aWRlczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3VpZGVzQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5fZ3VpZGVzQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ndWlkZXNDb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fZ3VpZGVzQ29udGFpbmVyLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldFRvb2x0aXBUZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzaG93TGVuZ3RoID0gdGhpcy5vcHRpb25zLnNob3dMZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBsYWJlbFRleHQsIGRpc3RhbmNlU3RyO1xyXG4gICAgICAgICAgICBpZiAoTC5Ccm93c2VyLnRvdWNoKSB7XHJcbiAgICAgICAgICAgICAgICBzaG93TGVuZ3RoID0gZmFsc2U7IC8vIGlmIHRoZXJlJ3MgYSBiZXR0ZXIgcGxhY2UgdG8gcHV0IHRoaXMsIGZlZWwgZnJlZSB0byBtb3ZlIGl0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcmtlcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBsYWJlbFRleHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5wb2x5bGluZS50b29sdGlwLnN0YXJ0XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2VTdHIgPSBzaG93TGVuZ3RoID8gdGhpcy5fZ2V0TWVhc3VyZW1lbnRTdHJpbmcoKSA6ICcnO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXJrZXJzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsVGV4dCA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5wb2x5bGluZS50b29sdGlwLmNvbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRleHQ6IGRpc3RhbmNlU3RyXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxUZXh0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBMLmRyYXdMb2NhbC5kcmF3LmhhbmRsZXJzLnBvbHlsaW5lLnRvb2x0aXAuZW5kLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJ0ZXh0OiBkaXN0YW5jZVN0clxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGxhYmVsVGV4dDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfdXBkYXRlUnVubmluZ01lYXN1cmU6IGZ1bmN0aW9uIChsYXRsbmcsIGFkZGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXJzTGVuZ3RoID0gdGhpcy5fbWFya2Vycy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBwcmV2aW91c01hcmtlckluZGV4LCBkaXN0YW5jZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXJrZXJzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRSdW5uaW5nVG90YWwgPSAwO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcHJldmlvdXNNYXJrZXJJbmRleCA9IG1hcmtlcnNMZW5ndGggLSAoYWRkZWQgPyAyIDogMSk7XHJcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IHRoaXMuX21hcC5kaXN0YW5jZShsYXRsbmcsIHRoaXMuX21hcmtlcnNbcHJldmlvdXNNYXJrZXJJbmRleF0uZ2V0TGF0TG5nKCkpICogKHRoaXMub3B0aW9ucy5mYWN0b3IgfHwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRSdW5uaW5nVG90YWwgKz0gZGlzdGFuY2UgKiAoYWRkZWQgPyAxIDogLTEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldE1lYXN1cmVtZW50U3RyaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50TGF0TG5nID0gdGhpcy5fY3VycmVudExhdExuZyxcclxuICAgICAgICAgICAgICAgIHByZXZpb3VzTGF0TG5nID0gdGhpcy5fbWFya2Vyc1t0aGlzLl9tYXJrZXJzLmxlbmd0aCAtIDFdLmdldExhdExuZygpLFxyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2U7XHJcblxyXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGxhc3QgZml4ZWQgcG9pbnQgdG8gdGhlIG1vdXNlIHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGRpc3RhbmNlID0gcHJldmlvdXNMYXRMbmcgJiYgY3VycmVudExhdExuZyA/IHRoaXMuX21lYXN1cmVtZW50UnVubmluZ1RvdGFsICsgdGhpcy5fbWFwLmRpc3RhbmNlKGN1cnJlbnRMYXRMbmcsIHByZXZpb3VzTGF0TG5nKSAqICh0aGlzLm9wdGlvbnMuZmFjdG9yIHx8IDEpIDogdGhpcy5fbWVhc3VyZW1lbnRSdW5uaW5nVG90YWwgfHwgMDtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBMLkdlb21ldHJ5VXRpbC5yZWFkYWJsZURpc3RhbmNlKGRpc3RhbmNlLCB0aGlzLm9wdGlvbnMubWV0cmljLCB0aGlzLm9wdGlvbnMuZmVldCwgdGhpcy5vcHRpb25zLm5hdXRpYywgdGhpcy5vcHRpb25zLnByZWNpc2lvbik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Nob3dFcnJvclRvb2x0aXA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3JTaG93biA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgdG9vbHRpcFxyXG4gICAgICAgICAgICB0aGlzLl90b29sdGlwXHJcbiAgICAgICAgICAgICAgICAuc2hvd0FzRXJyb3IoKVxyXG4gICAgICAgICAgICAgICAgLnVwZGF0ZUNvbnRlbnQoe3RleHQ6IHRoaXMub3B0aW9ucy5kcmF3RXJyb3IubWVzc2FnZX0pO1xyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIHNoYXBlXHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUd1aWRlQ29sb3IodGhpcy5vcHRpb25zLmRyYXdFcnJvci5jb2xvcik7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvbHkuc2V0U3R5bGUoe2NvbG9yOiB0aGlzLm9wdGlvbnMuZHJhd0Vycm9yLmNvbG9yfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBIaWRlIHRoZSBlcnJvciBhZnRlciAyIHNlY29uZHNcclxuICAgICAgICAgICAgdGhpcy5fY2xlYXJIaWRlRXJyb3JUaW1lb3V0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2hpZGVFcnJvclRpbWVvdXQgPSBzZXRUaW1lb3V0KEwuVXRpbC5iaW5kKHRoaXMuX2hpZGVFcnJvclRvb2x0aXAsIHRoaXMpLCB0aGlzLm9wdGlvbnMuZHJhd0Vycm9yLnRpbWVvdXQpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9oaWRlRXJyb3JUb29sdGlwOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yU2hvd24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NsZWFySGlkZUVycm9yVGltZW91dCgpO1xyXG5cclxuICAgICAgICAgICAgLy8gUmV2ZXJ0IHRvb2x0aXBcclxuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFxyXG4gICAgICAgICAgICAgICAgLnJlbW92ZUVycm9yKClcclxuICAgICAgICAgICAgICAgIC51cGRhdGVDb250ZW50KHRoaXMuX2dldFRvb2x0aXBUZXh0KCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gUmV2ZXJ0IHNoYXBlXHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUd1aWRlQ29sb3IodGhpcy5vcHRpb25zLnNoYXBlT3B0aW9ucy5jb2xvcik7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvbHkuc2V0U3R5bGUoe2NvbG9yOiB0aGlzLm9wdGlvbnMuc2hhcGVPcHRpb25zLmNvbG9yfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NsZWFySGlkZUVycm9yVGltZW91dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faGlkZUVycm9yVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2hpZGVFcnJvclRpbWVvdXQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGlkZUVycm9yVGltZW91dCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBkaXNhYmxlIG5ldyBtYXJrZXJzIHRlbXBvcmFyaWx5O1xyXG4gICAgICAgIC8vIHRoaXMgaXMgdG8gcHJldmVudCBkdXBsaWNhdGVkIHRvdWNoL2NsaWNrIGV2ZW50cyBpbiBzb21lIGJyb3dzZXJzXHJcbiAgICAgICAgX2Rpc2FibGVOZXdNYXJrZXJzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVNYXJrZXJzID0gdHJ1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzZWUgX2Rpc2FibGVOZXdNYXJrZXJzXHJcbiAgICAgICAgX2VuYWJsZU5ld01hcmtlcnM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlTWFya2VycyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcyksIDUwKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfY2xlYW5VcFNoYXBlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXJrZXJzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcmtlcnNbdGhpcy5fbWFya2Vycy5sZW5ndGggLSAxXS5vZmYoJ2NsaWNrJywgdGhpcy5fZmluaXNoU2hhcGUsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2ZpcmVDcmVhdGVkRXZlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHBvbHkgPSBuZXcgdGhpcy5Qb2x5KHRoaXMuX3BvbHkuZ2V0TGF0TG5ncygpLCB0aGlzLm9wdGlvbnMuc2hhcGVPcHRpb25zKTtcclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLl9maXJlQ3JlYXRlZEV2ZW50LmNhbGwodGhpcywgcG9seSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuRHJhdy5Qb2x5Z29uXHJcbiAgICAgKiBAYWthIERyYXcuUG9seWdvblxyXG4gICAgICogQGluaGVyaXRzIEwuRHJhdy5Qb2x5bGluZVxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuUG9seWdvbiA9IEwuRHJhdy5Qb2x5bGluZS5leHRlbmQoe1xyXG4gICAgICAgIHN0YXRpY3M6IHtcclxuICAgICAgICAgICAgVFlQRTogJ3BvbHlnb24nXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgUG9seTogTC5Qb2x5Z29uLFxyXG5cclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHNob3dBcmVhOiBmYWxzZSxcclxuICAgICAgICAgICAgc2hvd0xlbmd0aDogZmFsc2UsXHJcbiAgICAgICAgICAgIHNoYXBlT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjMzM4OGZmJyxcclxuICAgICAgICAgICAgICAgIHdlaWdodDogNCxcclxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNSxcclxuICAgICAgICAgICAgICAgIGZpbGw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBmaWxsQ29sb3I6IG51bGwsIC8vc2FtZSBhcyBjb2xvciBieSBkZWZhdWx0XHJcbiAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMC4yLFxyXG4gICAgICAgICAgICAgICAgY2xpY2thYmxlOiB0cnVlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIC8vIFdoZXRoZXIgdG8gdXNlIHRoZSBtZXRyaWMgbWVhc3VyZW1lbnQgc3lzdGVtICh0cnV0aHkpIG9yIG5vdCAoZmFsc3kpLlxyXG4gICAgICAgICAgICAvLyBBbHNvIGRlZmluZXMgdGhlIHVuaXRzIHRvIHVzZSBmb3IgdGhlIG1ldHJpYyBzeXN0ZW0gYXMgYW4gYXJyYXkgb2ZcclxuICAgICAgICAgICAgLy8gc3RyaW5ncyAoZS5nLiBgWydoYScsICdtJ11gKS5cclxuICAgICAgICAgICAgbWV0cmljOiB0cnVlLFxyXG4gICAgICAgICAgICBmZWV0OiB0cnVlLCAvLyBXaGVuIG5vdCBtZXRyaWMsIHRvIHVzZSBmZWV0IGluc3RlYWQgb2YgeWFyZHMgZm9yIGRpc3BsYXkuXHJcbiAgICAgICAgICAgIG5hdXRpYzogZmFsc2UsIC8vIFdoZW4gbm90IG1ldHJpYywgbm90IGZlZXQgdXNlIG5hdXRpYyBtaWxlIGZvciBkaXNwbGF5XHJcbiAgICAgICAgICAgIC8vIERlZmluZXMgdGhlIHByZWNpc2lvbiBmb3IgZWFjaCB0eXBlIG9mIHVuaXQgKGUuZy4ge2ttOiAyLCBmdDogMH1cclxuICAgICAgICAgICAgcHJlY2lzaW9uOiB7fVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgaW5pdGlhbGl6ZSgpOiB2b2lkXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG1hcCwgb3B0aW9ucykge1xyXG4gICAgICAgICAgICBMLkRyYXcuUG9seWxpbmUucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBtYXAsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdHlwZSBzbyBzdXBlciBjYW4gZmlyZSwgbmVlZCB0byBkbyB0aGlzIGFzIGNhbm5vdCBkbyB0aGlzLlRZUEUgOihcclxuICAgICAgICAgICAgdGhpcy50eXBlID0gTC5EcmF3LlBvbHlnb24uVFlQRTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfdXBkYXRlRmluaXNoSGFuZGxlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbWFya2VyQ291bnQgPSB0aGlzLl9tYXJrZXJzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBtYXJrZXIgc2hvdWxkIGhhdmUgYSBjbGljayBoYW5kbGVyIHRvIGNsb3NlIHRoZSBwb2x5Z29uXHJcbiAgICAgICAgICAgIGlmIChtYXJrZXJDb3VudCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2Vyc1swXS5vbignY2xpY2snLCB0aGlzLl9maW5pc2hTaGFwZSwgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEFkZCBhbmQgdXBkYXRlIHRoZSBkb3VibGUgY2xpY2sgaGFuZGxlclxyXG4gICAgICAgICAgICBpZiAobWFya2VyQ291bnQgPiAyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXJrZXJzW21hcmtlckNvdW50IC0gMV0ub24oJ2RibGNsaWNrJywgdGhpcy5fZmluaXNoU2hhcGUsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gT25seSBuZWVkIHRvIHJlbW92ZSBoYW5kbGVyIGlmIGhhcyBiZWVuIGFkZGVkIGJlZm9yZVxyXG4gICAgICAgICAgICAgICAgaWYgKG1hcmtlckNvdW50ID4gMykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcmtlcnNbbWFya2VyQ291bnQgLSAyXS5vZmYoJ2RibGNsaWNrJywgdGhpcy5fZmluaXNoU2hhcGUsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldFRvb2x0aXBUZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciB0ZXh0LCBzdWJ0ZXh0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcmtlcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5wb2x5Z29uLnRvb2x0aXAuc3RhcnQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbWFya2Vycy5sZW5ndGggPCAzKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5wb2x5Z29uLnRvb2x0aXAuY29udDtcclxuICAgICAgICAgICAgICAgIHN1YnRleHQgPSB0aGlzLl9nZXRNZWFzdXJlbWVudFN0cmluZygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IEwuZHJhd0xvY2FsLmRyYXcuaGFuZGxlcnMucG9seWdvbi50b29sdGlwLmVuZDtcclxuICAgICAgICAgICAgICAgIHN1YnRleHQgPSB0aGlzLl9nZXRNZWFzdXJlbWVudFN0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIHN1YnRleHQ6IHN1YnRleHRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZ2V0TWVhc3VyZW1lbnRTdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGFyZWEgPSB0aGlzLl9hcmVhLFxyXG4gICAgICAgICAgICAgICAgbWVhc3VyZW1lbnRTdHJpbmcgPSAnJztcclxuXHJcblxyXG4gICAgICAgICAgICBpZiAoIWFyZWEgJiYgIXRoaXMub3B0aW9ucy5zaG93TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBtZWFzdXJlbWVudFN0cmluZyA9IEwuRHJhdy5Qb2x5bGluZS5wcm90b3R5cGUuX2dldE1lYXN1cmVtZW50U3RyaW5nLmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChhcmVhKSB7XHJcbiAgICAgICAgICAgICAgICBtZWFzdXJlbWVudFN0cmluZyArPSAnPGJyPicgKyBMLkdlb21ldHJ5VXRpbC5yZWFkYWJsZUFyZWEoYXJlYSwgdGhpcy5vcHRpb25zLm1ldHJpYywgdGhpcy5vcHRpb25zLnByZWNpc2lvbik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBtZWFzdXJlbWVudFN0cmluZztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfc2hhcGVJc1ZhbGlkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXJrZXJzLmxlbmd0aCA+PSAzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF92ZXJ0ZXhDaGFuZ2VkOiBmdW5jdGlvbiAobGF0bG5nLCBhZGRlZCkge1xyXG4gICAgICAgICAgICB2YXIgbGF0TG5ncztcclxuXHJcbiAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgc2hvdyB0aGUgYXJlYVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hbGxvd0ludGVyc2VjdGlvbiAmJiB0aGlzLm9wdGlvbnMuc2hvd0FyZWEpIHtcclxuICAgICAgICAgICAgICAgIGxhdExuZ3MgPSB0aGlzLl9wb2x5LmdldExhdExuZ3MoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hcmVhID0gTC5HZW9tZXRyeVV0aWwuZ2VvZGVzaWNBcmVhKGxhdExuZ3MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBMLkRyYXcuUG9seWxpbmUucHJvdG90eXBlLl92ZXJ0ZXhDaGFuZ2VkLmNhbGwodGhpcywgbGF0bG5nLCBhZGRlZCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NsZWFuVXBTaGFwZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbWFya2VyQ291bnQgPSB0aGlzLl9tYXJrZXJzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIGlmIChtYXJrZXJDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcmtlcnNbMF0ub2ZmKCdjbGljaycsIHRoaXMuX2ZpbmlzaFNoYXBlLCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobWFya2VyQ291bnQgPiAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFya2Vyc1ttYXJrZXJDb3VudCAtIDFdLm9mZignZGJsY2xpY2snLCB0aGlzLl9maW5pc2hTaGFwZSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgTC5TaW1wbGVTaGFwZSA9IHt9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5EcmF3LlNpbXBsZVNoYXBlXHJcbiAgICAgKiBAYWthIERyYXcuU2ltcGxlU2hhcGVcclxuICAgICAqIEBpbmhlcml0cyBMLkRyYXcuRmVhdHVyZVxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuU2ltcGxlU2hhcGUgPSBMLkRyYXcuRmVhdHVyZS5leHRlbmQoe1xyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgcmVwZWF0TW9kZTogZmFsc2VcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGluaXRpYWxpemUoKTogdm9pZFxyXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChtYXAsIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5fZW5kTGFiZWxUZXh0ID0gTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5zaW1wbGVzaGFwZS50b29sdGlwLmVuZDtcclxuXHJcbiAgICAgICAgICAgIEwuRHJhdy5GZWF0dXJlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbWFwLCBvcHRpb25zKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGFkZEhvb2tzKCk6IHZvaWRcclxuICAgICAgICAvLyBBZGQgbGlzdGVuZXIgaG9va3MgdG8gdGhpcyBoYW5kbGVyLlxyXG4gICAgICAgIGFkZEhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIEwuRHJhdy5GZWF0dXJlLnByb3RvdHlwZS5hZGRIb29rcy5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXBEcmFnZ2FibGUgPSB0aGlzLl9tYXAuZHJhZ2dpbmcuZW5hYmxlZCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXBEcmFnZ2FibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZHJhZ2dpbmcuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vVE9ETyByZWZhY3RvcjogbW92ZSBjdXJzb3IgdG8gc3R5bGVzXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbHRpcC51cGRhdGVDb250ZW50KHt0ZXh0OiB0aGlzLl9pbml0aWFsTGFiZWxUZXh0fSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwXHJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdtb3VzZWRvd24nLCB0aGlzLl9vbk1vdXNlRG93biwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAub24oJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbigndG91Y2hzdGFydCcsIHRoaXMuX29uTW91c2VEb3duLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbigndG91Y2htb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCByZW1vdmVIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVyIGhvb2tzIGZyb20gdGhpcyBoYW5kbGVyLlxyXG4gICAgICAgIHJlbW92ZUhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIEwuRHJhdy5GZWF0dXJlLnByb3RvdHlwZS5yZW1vdmVIb29rcy5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWFwRHJhZ2dhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLmRyYWdnaW5nLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vVE9ETyByZWZhY3RvcjogbW92ZSBjdXJzb3IgdG8gc3R5bGVzXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc3R5bGUuY3Vyc29yID0gJyc7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZignbW91c2Vkb3duJywgdGhpcy5fb25Nb3VzZURvd24sIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZigndG91Y2hzdGFydCcsIHRoaXMuX29uTW91c2VEb3duLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vZmYoJ3RvdWNobW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBMLkRvbUV2ZW50Lm9mZihkb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgTC5Eb21FdmVudC5vZmYoZG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX29uTW91c2VVcCwgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGJveCBlbGVtZW50IGRvZXNuJ3QgZXhpc3QgdGhleSBtdXN0IG5vdCBoYXZlIG1vdmVkIHRoZSBtb3VzZSwgc28gZG9uJ3QgbmVlZCB0byBkZXN0cm95L3JldHVyblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NoYXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX3NoYXBlKTtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fc2hhcGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5faXNEcmF3aW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldFRvb2x0aXBUZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLl9lbmRMYWJlbFRleHRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Nb3VzZURvd246IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzRHJhd2luZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0TGF0TG5nID0gZS5sYXRsbmc7XHJcblxyXG4gICAgICAgICAgICBMLkRvbUV2ZW50XHJcbiAgICAgICAgICAgICAgICAub24oZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9uKGRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9vbk1vdXNlVXAsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAucHJldmVudERlZmF1bHQoZS5vcmlnaW5hbEV2ZW50KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXRsbmcgPSBlLmxhdGxuZztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAudXBkYXRlUG9zaXRpb24obGF0bG5nKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzRHJhd2luZykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbHRpcC51cGRhdGVDb250ZW50KHRoaXMuX2dldFRvb2x0aXBUZXh0KCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd1NoYXBlKGxhdGxuZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Nb3VzZVVwOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zaGFwZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyZUNyZWF0ZWRFdmVudCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZXBlYXRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuRHJhdy5SZWN0YW5nbGVcclxuICAgICAqIEBha2EgRHJhdy5SZWN0YW5nbGVcclxuICAgICAqIEBpbmhlcml0cyBMLkRyYXcuU2ltcGxlU2hhcGVcclxuICAgICAqL1xyXG4gICAgTC5EcmF3LlJlY3RhbmdsZSA9IEwuRHJhdy5TaW1wbGVTaGFwZS5leHRlbmQoe1xyXG4gICAgICAgIHN0YXRpY3M6IHtcclxuICAgICAgICAgICAgVFlQRTogJ3JlY3RhbmdsZSdcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHNoYXBlT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjMzM4OGZmJyxcclxuICAgICAgICAgICAgICAgIHdlaWdodDogNCxcclxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNSxcclxuICAgICAgICAgICAgICAgIGZpbGw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBmaWxsQ29sb3I6IG51bGwsIC8vc2FtZSBhcyBjb2xvciBieSBkZWZhdWx0XHJcbiAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMC4yLFxyXG4gICAgICAgICAgICAgICAgc2hvd0FyZWE6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjbGlja2FibGU6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbWV0cmljOiB0cnVlIC8vIFdoZXRoZXIgdG8gdXNlIHRoZSBtZXRyaWMgbWVhc3VyZW1lbnQgc3lzdGVtIG9yIGltcGVyaWFsXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKCk6IHZvaWRcclxuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAobWFwLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHR5cGUgc28gc3VwZXIgY2FuIGZpcmUsIG5lZWQgdG8gZG8gdGhpcyBhcyBjYW5ub3QgZG8gdGhpcy5UWVBFIDooXHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEwuRHJhdy5SZWN0YW5nbGUuVFlQRTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxMYWJlbFRleHQgPSBMLmRyYXdMb2NhbC5kcmF3LmhhbmRsZXJzLnJlY3RhbmdsZS50b29sdGlwLnN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgTC5EcmF3LlNpbXBsZVNoYXBlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbWFwLCBvcHRpb25zKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGRpc2FibGUoKTogdm9pZFxyXG4gICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9lbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2lzQ3VycmVudGx5VHdvQ2xpY2tEcmF3aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIEwuRHJhdy5TaW1wbGVTaGFwZS5wcm90b3R5cGUuZGlzYWJsZS5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbk1vdXNlVXA6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fc2hhcGUgJiYgIXRoaXMuX2lzQ3VycmVudGx5VHdvQ2xpY2tEcmF3aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0N1cnJlbnRseVR3b0NsaWNrRHJhd2luZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBjbG9zaW5nIGNsaWNrIGlzIG9uIG1hcFxyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNDdXJyZW50bHlUd29DbGlja0RyYXdpbmcgJiYgIV9oYXNBbmNlc3RvcihlLnRhcmdldCwgJ2xlYWZsZXQtcGFuZScpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIEwuRHJhdy5TaW1wbGVTaGFwZS5wcm90b3R5cGUuX29uTW91c2VVcC5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9kcmF3U2hhcGU6IGZ1bmN0aW9uIChsYXRsbmcpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zaGFwZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hhcGUgPSBuZXcgTC5SZWN0YW5nbGUobmV3IEwuTGF0TG5nQm91bmRzKHRoaXMuX3N0YXJ0TGF0TG5nLCBsYXRsbmcpLCB0aGlzLm9wdGlvbnMuc2hhcGVPcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5hZGRMYXllcih0aGlzLl9zaGFwZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaGFwZS5zZXRCb3VuZHMobmV3IEwuTGF0TG5nQm91bmRzKHRoaXMuX3N0YXJ0TGF0TG5nLCBsYXRsbmcpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9maXJlQ3JlYXRlZEV2ZW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciByZWN0YW5nbGUgPSBuZXcgTC5SZWN0YW5nbGUodGhpcy5fc2hhcGUuZ2V0Qm91bmRzKCksIHRoaXMub3B0aW9ucy5zaGFwZU9wdGlvbnMpO1xyXG4gICAgICAgICAgICBMLkRyYXcuU2ltcGxlU2hhcGUucHJvdG90eXBlLl9maXJlQ3JlYXRlZEV2ZW50LmNhbGwodGhpcywgcmVjdGFuZ2xlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZ2V0VG9vbHRpcFRleHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHRvb2x0aXBUZXh0ID0gTC5EcmF3LlNpbXBsZVNoYXBlLnByb3RvdHlwZS5fZ2V0VG9vbHRpcFRleHQuY2FsbCh0aGlzKSxcclxuICAgICAgICAgICAgICAgIHNoYXBlID0gdGhpcy5fc2hhcGUsXHJcbiAgICAgICAgICAgICAgICBzaG93QXJlYSA9IHRoaXMub3B0aW9ucy5zaG93QXJlYSxcclxuICAgICAgICAgICAgICAgIGxhdExuZ3MsIGFyZWEsIHN1YnRleHQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hhcGUpIHtcclxuICAgICAgICAgICAgICAgIGxhdExuZ3MgPSB0aGlzLl9zaGFwZS5fZGVmYXVsdFNoYXBlID8gdGhpcy5fc2hhcGUuX2RlZmF1bHRTaGFwZSgpIDogdGhpcy5fc2hhcGUuZ2V0TGF0TG5ncygpO1xyXG4gICAgICAgICAgICAgICAgYXJlYSA9IEwuR2VvbWV0cnlVdGlsLmdlb2Rlc2ljQXJlYShsYXRMbmdzKTtcclxuICAgICAgICAgICAgICAgIHN1YnRleHQgPSBzaG93QXJlYSA/IEwuR2VvbWV0cnlVdGlsLnJlYWRhYmxlQXJlYShhcmVhLCB0aGlzLm9wdGlvbnMubWV0cmljKSA6ICcnXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiB0b29sdGlwVGV4dC50ZXh0LFxyXG4gICAgICAgICAgICAgICAgc3VidGV4dDogc3VidGV4dFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGZ1bmN0aW9uIF9oYXNBbmNlc3RvcihlbCwgY2xzKSB7XHJcbiAgICAgICAgd2hpbGUgKChlbCA9IGVsLnBhcmVudEVsZW1lbnQpICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMoY2xzKSkgO1xyXG4gICAgICAgIHJldHVybiBlbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5EcmF3Lk1hcmtlclxyXG4gICAgICogQGFrYSBEcmF3Lk1hcmtlclxyXG4gICAgICogQGluaGVyaXRzIEwuRHJhdy5GZWF0dXJlXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdy5NYXJrZXIgPSBMLkRyYXcuRmVhdHVyZS5leHRlbmQoe1xyXG4gICAgICAgIHN0YXRpY3M6IHtcclxuICAgICAgICAgICAgVFlQRTogJ21hcmtlcidcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLFxyXG4gICAgICAgICAgICByZXBlYXRNb2RlOiBmYWxzZSxcclxuICAgICAgICAgICAgekluZGV4T2Zmc2V0OiAyMDAwIC8vIFRoaXMgc2hvdWxkIGJlID4gdGhhbiB0aGUgaGlnaGVzdCB6LWluZGV4IGFueSBtYXJrZXJzXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKCk6IHZvaWRcclxuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAobWFwLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHR5cGUgc28gc3VwZXIgY2FuIGZpcmUsIG5lZWQgdG8gZG8gdGhpcyBhcyBjYW5ub3QgZG8gdGhpcy5UWVBFIDooXHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEwuRHJhdy5NYXJrZXIuVFlQRTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxMYWJlbFRleHQgPSBMLmRyYXdMb2NhbC5kcmF3LmhhbmRsZXJzLm1hcmtlci50b29sdGlwLnN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBtYXAsIG9wdGlvbnMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgYWRkSG9va3MoKTogdm9pZFxyXG4gICAgICAgIC8vIEFkZCBsaXN0ZW5lciBob29rcyB0byB0aGlzIGhhbmRsZXIuXHJcbiAgICAgICAgYWRkSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLmFkZEhvb2tzLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b29sdGlwLnVwZGF0ZUNvbnRlbnQoe3RleHQ6IHRoaXMuX2luaXRpYWxMYWJlbFRleHR9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTYW1lIG1vdXNlTWFya2VyIGFzIGluIERyYXcuUG9seWxpbmVcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW91c2VNYXJrZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3VzZU1hcmtlciA9IEwubWFya2VyKHRoaXMuX21hcC5nZXRDZW50ZXIoKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBMLmRpdkljb24oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnbGVhZmxldC1tb3VzZS1tYXJrZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkFuY2hvcjogWzIwLCAyMF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uU2l6ZTogWzQwLCA0MF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHpJbmRleE9mZnNldDogdGhpcy5vcHRpb25zLnpJbmRleE9mZnNldFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX21vdXNlTWFya2VyXHJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdjbGljaycsIHRoaXMuX29uQ2xpY2ssIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLmFkZFRvKHRoaXMuX21hcCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAub24oJ2NsaWNrJywgdGhpcy5fb25Ub3VjaCwgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHJlbW92ZUhvb2tzKCk6IHZvaWRcclxuICAgICAgICAvLyBSZW1vdmUgbGlzdGVuZXIgaG9va3MgZnJvbSB0aGlzIGhhbmRsZXIuXHJcbiAgICAgICAgcmVtb3ZlSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLnJlbW92ZUhvb2tzLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWFya2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFya2VyLm9mZignY2xpY2snLCB0aGlzLl9vbkNsaWNrLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgLm9mZignY2xpY2snLCB0aGlzLl9vbkNsaWNrLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAub2ZmKCdjbGljaycsIHRoaXMuX29uVG91Y2gsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVMYXllcih0aGlzLl9tYXJrZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9tYXJrZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbW91c2VNYXJrZXIub2ZmKCdjbGljaycsIHRoaXMuX29uQ2xpY2ssIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX21vdXNlTWFya2VyKTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9tb3VzZU1hcmtlcjtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXRsbmcgPSBlLmxhdGxuZztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAudXBkYXRlUG9zaXRpb24obGF0bG5nKTtcclxuICAgICAgICAgICAgdGhpcy5fbW91c2VNYXJrZXIuc2V0TGF0TG5nKGxhdGxuZyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX21hcmtlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2VyID0gdGhpcy5fY3JlYXRlTWFya2VyKGxhdGxuZyk7XHJcbiAgICAgICAgICAgICAgICAvLyBCaW5kIHRvIGJvdGggbWFya2VyIGFuZCBtYXAgdG8gbWFrZSBzdXJlIHdlIGdldCB0aGUgY2xpY2sgZXZlbnQuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXJrZXIub24oJ2NsaWNrJywgdGhpcy5fb25DbGljaywgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXBcclxuICAgICAgICAgICAgICAgICAgICAub24oJ2NsaWNrJywgdGhpcy5fb25DbGljaywgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAuYWRkTGF5ZXIodGhpcy5fbWFya2VyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxhdGxuZyA9IHRoaXMuX21vdXNlTWFya2VyLmdldExhdExuZygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2VyLnNldExhdExuZyhsYXRsbmcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NyZWF0ZU1hcmtlcjogZnVuY3Rpb24gKGxhdGxuZykge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEwuTWFya2VyKGxhdGxuZywge1xyXG4gICAgICAgICAgICAgICAgaWNvbjogdGhpcy5vcHRpb25zLmljb24sXHJcbiAgICAgICAgICAgICAgICB6SW5kZXhPZmZzZXQ6IHRoaXMub3B0aW9ucy56SW5kZXhPZmZzZXRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uQ2xpY2s6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fZmlyZUNyZWF0ZWRFdmVudCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVwZWF0TW9kZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vblRvdWNoOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAvLyBjYWxsZWQgb24gY2xpY2sgJiB0YXAsIG9ubHkgcmVhbGx5IGRvZXMgYW55IHRoaW5nIG9uIHRhcFxyXG4gICAgICAgICAgICB0aGlzLl9vbk1vdXNlTW92ZShlKTsgLy8gY3JlYXRlcyAmIHBsYWNlcyBtYXJrZXJcclxuICAgICAgICAgICAgdGhpcy5fb25DbGljaygpOyAvLyBwZXJtYW5lbnRseSBwbGFjZXMgbWFya2VyICYgZW5kcyBpbnRlcmFjdGlvblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9maXJlQ3JlYXRlZEV2ZW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgTC5NYXJrZXIuVG91Y2godGhpcy5fbWFya2VyLmdldExhdExuZygpLCB7aWNvbjogdGhpcy5vcHRpb25zLmljb259KTtcclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLl9maXJlQ3JlYXRlZEV2ZW50LmNhbGwodGhpcywgbWFya2VyKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5EcmF3LkNpcmNsZU1hcmtlclxyXG4gICAgICogQGFrYSBEcmF3LkNpcmNsZU1hcmtlclxyXG4gICAgICogQGluaGVyaXRzIEwuRHJhdy5NYXJrZXJcclxuICAgICAqL1xyXG4gICAgTC5EcmF3LkNpcmNsZU1hcmtlciA9IEwuRHJhdy5NYXJrZXIuZXh0ZW5kKHtcclxuICAgICAgICBzdGF0aWNzOiB7XHJcbiAgICAgICAgICAgIFRZUEU6ICdjaXJjbGVtYXJrZXInXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICBzdHJva2U6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbG9yOiAnIzMzODhmZicsXHJcbiAgICAgICAgICAgIHdlaWdodDogNCxcclxuICAgICAgICAgICAgb3BhY2l0eTogMC41LFxyXG4gICAgICAgICAgICBmaWxsOiB0cnVlLFxyXG4gICAgICAgICAgICBmaWxsQ29sb3I6IG51bGwsIC8vc2FtZSBhcyBjb2xvciBieSBkZWZhdWx0XHJcbiAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAwLjIsXHJcbiAgICAgICAgICAgIGNsaWNrYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgekluZGV4T2Zmc2V0OiAyMDAwIC8vIFRoaXMgc2hvdWxkIGJlID4gdGhhbiB0aGUgaGlnaGVzdCB6LWluZGV4IGFueSBtYXJrZXJzXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKCk6IHZvaWRcclxuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAobWFwLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHR5cGUgc28gc3VwZXIgY2FuIGZpcmUsIG5lZWQgdG8gZG8gdGhpcyBhcyBjYW5ub3QgZG8gdGhpcy5UWVBFIDooXHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEwuRHJhdy5DaXJjbGVNYXJrZXIuVFlQRTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxMYWJlbFRleHQgPSBMLmRyYXdMb2NhbC5kcmF3LmhhbmRsZXJzLmNpcmNsZW1hcmtlci50b29sdGlwLnN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBtYXAsIG9wdGlvbnMpO1xyXG4gICAgICAgIH0sXHJcblxyXG5cclxuICAgICAgICBfZmlyZUNyZWF0ZWRFdmVudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgY2lyY2xlTWFya2VyID0gbmV3IEwuQ2lyY2xlTWFya2VyKHRoaXMuX21hcmtlci5nZXRMYXRMbmcoKSwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgICAgICAgTC5EcmF3LkZlYXR1cmUucHJvdG90eXBlLl9maXJlQ3JlYXRlZEV2ZW50LmNhbGwodGhpcywgY2lyY2xlTWFya2VyKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfY3JlYXRlTWFya2VyOiBmdW5jdGlvbiAobGF0bG5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTC5DaXJjbGVNYXJrZXIobGF0bG5nLCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkRyYXcuQ2lyY2xlXHJcbiAgICAgKiBAYWthIERyYXcuQ2lyY2xlXHJcbiAgICAgKiBAaW5oZXJpdHMgTC5EcmF3LlNpbXBsZVNoYXBlXHJcbiAgICAgKi9cclxuICAgIEwuRHJhdy5DaXJjbGUgPSBMLkRyYXcuU2ltcGxlU2hhcGUuZXh0ZW5kKHtcclxuICAgICAgICBzdGF0aWNzOiB7XHJcbiAgICAgICAgICAgIFRZUEU6ICdjaXJjbGUnXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICBzaGFwZU9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgIHN0cm9rZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG9yOiAnIzMzODhmZicsXHJcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IDQsXHJcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjUsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgZmlsbENvbG9yOiBudWxsLCAvL3NhbWUgYXMgY29sb3IgYnkgZGVmYXVsdFxyXG4gICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDAuMixcclxuICAgICAgICAgICAgICAgIGNsaWNrYWJsZTogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaG93UmFkaXVzOiB0cnVlLFxyXG4gICAgICAgICAgICBtZXRyaWM6IHRydWUsIC8vIFdoZXRoZXIgdG8gdXNlIHRoZSBtZXRyaWMgbWVhc3VyZW1lbnQgc3lzdGVtIG9yIGltcGVyaWFsXHJcbiAgICAgICAgICAgIGZlZXQ6IHRydWUsIC8vIFdoZW4gbm90IG1ldHJpYywgdXNlIGZlZXQgaW5zdGVhZCBvZiB5YXJkcyBmb3IgZGlzcGxheVxyXG4gICAgICAgICAgICBuYXV0aWM6IGZhbHNlIC8vIFdoZW4gbm90IG1ldHJpYywgbm90IGZlZXQgdXNlIG5hdXRpYyBtaWxlIGZvciBkaXNwbGF5XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKCk6IHZvaWRcclxuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAobWFwLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHR5cGUgc28gc3VwZXIgY2FuIGZpcmUsIG5lZWQgdG8gZG8gdGhpcyBhcyBjYW5ub3QgZG8gdGhpcy5UWVBFIDooXHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEwuRHJhdy5DaXJjbGUuVFlQRTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxMYWJlbFRleHQgPSBMLmRyYXdMb2NhbC5kcmF3LmhhbmRsZXJzLmNpcmNsZS50b29sdGlwLnN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgTC5EcmF3LlNpbXBsZVNoYXBlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbWFwLCBvcHRpb25zKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZHJhd1NoYXBlOiBmdW5jdGlvbiAobGF0bG5nKSB7XHJcbiAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IHRoaXMuX21hcC5kaXN0YW5jZSh0aGlzLl9zdGFydExhdExuZywgbGF0bG5nKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zaGFwZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hhcGUgPSBuZXcgTC5DaXJjbGUodGhpcy5fc3RhcnRMYXRMbmcsIGRpc3RhbmNlLCB0aGlzLm9wdGlvbnMuc2hhcGVPcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5hZGRMYXllcih0aGlzLl9zaGFwZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaGFwZS5zZXRSYWRpdXMoZGlzdGFuY2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2ZpcmVDcmVhdGVkRXZlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGNpcmNsZSA9IG5ldyBMLkNpcmNsZSh0aGlzLl9zdGFydExhdExuZywgdGhpcy5fc2hhcGUuZ2V0UmFkaXVzKCksIHRoaXMub3B0aW9ucy5zaGFwZU9wdGlvbnMpO1xyXG4gICAgICAgICAgICBMLkRyYXcuU2ltcGxlU2hhcGUucHJvdG90eXBlLl9maXJlQ3JlYXRlZEV2ZW50LmNhbGwodGhpcywgY2lyY2xlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXRsbmcgPSBlLmxhdGxuZyxcclxuICAgICAgICAgICAgICAgIHNob3dSYWRpdXMgPSB0aGlzLm9wdGlvbnMuc2hvd1JhZGl1cyxcclxuICAgICAgICAgICAgICAgIHVzZU1ldHJpYyA9IHRoaXMub3B0aW9ucy5tZXRyaWMsXHJcbiAgICAgICAgICAgICAgICByYWRpdXM7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl90b29sdGlwLnVwZGF0ZVBvc2l0aW9uKGxhdGxuZyk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0RyYXdpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdTaGFwZShsYXRsbmcpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbmV3IHJhZGl1cyAocm91bmRlZCB0byAxIGRwKVxyXG4gICAgICAgICAgICAgICAgcmFkaXVzID0gdGhpcy5fc2hhcGUuZ2V0UmFkaXVzKCkudG9GaXhlZCgxKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgc3VidGV4dCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNob3dSYWRpdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWJ0ZXh0ID0gTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5jaXJjbGUucmFkaXVzICsgJzogJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEwuR2VvbWV0cnlVdGlsLnJlYWRhYmxlRGlzdGFuY2UocmFkaXVzLCB1c2VNZXRyaWMsIHRoaXMub3B0aW9ucy5mZWV0LCB0aGlzLm9wdGlvbnMubmF1dGljKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAudXBkYXRlQ29udGVudCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5fZW5kTGFiZWxUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHN1YnRleHQ6IHN1YnRleHRcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIEwuRWRpdCA9IEwuRWRpdCB8fCB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkVkaXQuTWFya2VyXHJcbiAgICAgKiBAYWthIEVkaXQuTWFya2VyXHJcbiAgICAgKi9cclxuICAgIEwuRWRpdC5NYXJrZXIgPSBMLkhhbmRsZXIuZXh0ZW5kKHtcclxuICAgICAgICAvLyBAbWV0aG9kIGluaXRpYWxpemUoKTogdm9pZFxyXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChtYXJrZXIsIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWFya2VyID0gbWFya2VyO1xyXG4gICAgICAgICAgICBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBhZGRIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gQWRkIGxpc3RlbmVyIGhvb2tzIHRvIHRoaXMgaGFuZGxlclxyXG4gICAgICAgIGFkZEhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXIgPSB0aGlzLl9tYXJrZXI7XHJcblxyXG4gICAgICAgICAgICBtYXJrZXIuZHJhZ2dpbmcuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIHRoaXMuX29uRHJhZ0VuZCwgbWFya2VyKTtcclxuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlTWFya2VySGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCByZW1vdmVIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVyIGhvb2tzIGZyb20gdGhpcyBoYW5kbGVyXHJcbiAgICAgICAgcmVtb3ZlSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG1hcmtlciA9IHRoaXMuX21hcmtlcjtcclxuXHJcbiAgICAgICAgICAgIG1hcmtlci5kcmFnZ2luZy5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgIG1hcmtlci5vZmYoJ2RyYWdlbmQnLCB0aGlzLl9vbkRyYWdFbmQsIG1hcmtlcik7XHJcbiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZU1hcmtlckhpZ2hsaWdodCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbkRyYWdFbmQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXllciA9IGUudGFyZ2V0O1xyXG4gICAgICAgICAgICBsYXllci5lZGl0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShMLkRyYXcuRXZlbnQuRURJVE1PVkUsIHtsYXllcjogbGF5ZXJ9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfdG9nZ2xlTWFya2VySGlnaGxpZ2h0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBpY29uID0gdGhpcy5fbWFya2VyLl9pY29uO1xyXG5cclxuICAgICAgICAgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhpcyBsYXllciBpcyBhIG1hcmtlciBidXQgZG9lc24ndCBoYXZlIGFuIGljb24uIE1hcmtlcnNcclxuICAgICAgICAgICAgLy8gc2hvdWxkIHVzdWFsbHkgaGF2ZSBpY29ucy4gSWYgdXNpbmcgTGVhZmxldC5kcmF3IHdpdGggTGVhZmxldC5tYXJrZXJjbHVzdGVyIHRoZXJlXHJcbiAgICAgICAgICAgIC8vIGlzIGEgY2hhbmNlIHRoYXQgYSBtYXJrZXIgZG9lc24ndC5cclxuICAgICAgICAgICAgaWYgKCFpY29uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgcXVpdGUgbmF1Z2h0eSwgYnV0IEkgZG9uJ3Qgc2VlIGFub3RoZXIgd2F5IG9mIGRvaW5nIGl0LiAoc2hvcnQgb2Ygc2V0dGluZyBhIG5ldyBpY29uKVxyXG4gICAgICAgICAgICBpY29uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgICAgICAgICBpZiAoTC5Eb21VdGlsLmhhc0NsYXNzKGljb24sICdsZWFmbGV0LWVkaXQtbWFya2VyLXNlbGVjdGVkJykpIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyhpY29uLCAnbGVhZmxldC1lZGl0LW1hcmtlci1zZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICAgICAgLy8gT2Zmc2V0IGFzIHRoZSBib3JkZXIgd2lsbCBtYWtlIHRoZSBpY29uIG1vdmUuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vZmZzZXRNYXJrZXIoaWNvbiwgLTQpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyhpY29uLCAnbGVhZmxldC1lZGl0LW1hcmtlci1zZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICAgICAgLy8gT2Zmc2V0IGFzIHRoZSBib3JkZXIgd2lsbCBtYWtlIHRoZSBpY29uIG1vdmUuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vZmZzZXRNYXJrZXIoaWNvbiwgNCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGljb24uc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vZmZzZXRNYXJrZXI6IGZ1bmN0aW9uIChpY29uLCBvZmZzZXQpIHtcclxuICAgICAgICAgICAgdmFyIGljb25NYXJnaW5Ub3AgPSBwYXJzZUludChpY29uLnN0eWxlLm1hcmdpblRvcCwgMTApIC0gb2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgaWNvbk1hcmdpbkxlZnQgPSBwYXJzZUludChpY29uLnN0eWxlLm1hcmdpbkxlZnQsIDEwKSAtIG9mZnNldDtcclxuXHJcbiAgICAgICAgICAgIGljb24uc3R5bGUubWFyZ2luVG9wID0gaWNvbk1hcmdpblRvcCArICdweCc7XHJcbiAgICAgICAgICAgIGljb24uc3R5bGUubWFyZ2luTGVmdCA9IGljb25NYXJnaW5MZWZ0ICsgJ3B4JztcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBMLk1hcmtlci5hZGRJbml0SG9vayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKEwuRWRpdC5NYXJrZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0aW5nID0gbmV3IEwuRWRpdC5NYXJrZXIodGhpcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRpbmcuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgTC5FZGl0ID0gTC5FZGl0IHx8IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuRWRpdC5Qb2x5bGluZVxyXG4gICAgICogQGFrYSBMLkVkaXQuUG9seVxyXG4gICAgICogQGFrYSBFZGl0LlBvbHlcclxuICAgICAqL1xyXG4gICAgTC5FZGl0LlBvbHkgPSBMLkhhbmRsZXIuZXh0ZW5kKHtcclxuICAgICAgICBvcHRpb25zOiB7fSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKCk6IHZvaWRcclxuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAocG9seSwgb3B0aW9ucykge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5sYXRsbmdzID0gW3BvbHkuX2xhdGxuZ3NdO1xyXG4gICAgICAgICAgICBpZiAocG9seS5faG9sZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGF0bG5ncyA9IHRoaXMubGF0bG5ncy5jb25jYXQocG9seS5faG9sZXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9wb2x5ID0gcG9seTtcclxuICAgICAgICAgICAgTC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fcG9seS5vbigncmV2ZXJ0LWVkaXRlZCcsIHRoaXMuX3VwZGF0ZUxhdExuZ3MsIHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIENvbXBhdGliaWxpdHkgbWV0aG9kIHRvIG5vcm1hbGl6ZSBQb2x5KiBvYmplY3RzXHJcbiAgICAgICAgLy8gYmV0d2VlbiAwLjcueCBhbmQgMS4wK1xyXG4gICAgICAgIF9kZWZhdWx0U2hhcGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCFMLlBvbHlsaW5lLl9mbGF0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcG9seS5fbGF0bG5ncztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gTC5Qb2x5bGluZS5fZmxhdCh0aGlzLl9wb2x5Ll9sYXRsbmdzKSA/IHRoaXMuX3BvbHkuX2xhdGxuZ3MgOiB0aGlzLl9wb2x5Ll9sYXRsbmdzWzBdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9lYWNoVmVydGV4SGFuZGxlcjogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fdmVydGljZXNIYW5kbGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sodGhpcy5fdmVydGljZXNIYW5kbGVyc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGFkZEhvb2tzKCk6IHZvaWRcclxuICAgICAgICAvLyBBZGQgbGlzdGVuZXIgaG9va3MgdG8gdGhpcyBoYW5kbGVyXHJcbiAgICAgICAgYWRkSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5faW5pdEhhbmRsZXJzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VhY2hWZXJ0ZXhIYW5kbGVyKGZ1bmN0aW9uIChoYW5kbGVyKSB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmFkZEhvb2tzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgcmVtb3ZlSG9va3MoKTogdm9pZFxyXG4gICAgICAgIC8vIFJlbW92ZSBsaXN0ZW5lciBob29rcyBmcm9tIHRoaXMgaGFuZGxlclxyXG4gICAgICAgIHJlbW92ZUhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VhY2hWZXJ0ZXhIYW5kbGVyKGZ1bmN0aW9uIChoYW5kbGVyKSB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVyLnJlbW92ZUhvb2tzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgdXBkYXRlTWFya2VycygpOiB2b2lkXHJcbiAgICAgICAgLy8gRmlyZSBhbiB1cGRhdGUgZm9yIGVhY2ggdmVydGV4IGhhbmRsZXJcclxuICAgICAgICB1cGRhdGVNYXJrZXJzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VhY2hWZXJ0ZXhIYW5kbGVyKGZ1bmN0aW9uIChoYW5kbGVyKSB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVyLnVwZGF0ZU1hcmtlcnMoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2luaXRIYW5kbGVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl92ZXJ0aWNlc0hhbmRsZXJzID0gW107XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sYXRsbmdzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92ZXJ0aWNlc0hhbmRsZXJzLnB1c2gobmV3IEwuRWRpdC5Qb2x5VmVydGljZXNFZGl0KHRoaXMuX3BvbHksIHRoaXMubGF0bG5nc1tpXSwgdGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfdXBkYXRlTGF0TG5nczogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXRsbmdzID0gW2UubGF5ZXIuX2xhdGxuZ3NdO1xyXG4gICAgICAgICAgICBpZiAoZS5sYXllci5faG9sZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGF0bG5ncyA9IHRoaXMubGF0bG5ncy5jb25jYXQoZS5sYXllci5faG9sZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuRWRpdC5Qb2x5VmVydGljZXNFZGl0XHJcbiAgICAgKiBAYWthIEVkaXQuUG9seVZlcnRpY2VzRWRpdFxyXG4gICAgICovXHJcbiAgICBMLkVkaXQuUG9seVZlcnRpY2VzRWRpdCA9IEwuSGFuZGxlci5leHRlbmQoe1xyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgYWxsb3dJbnRlcnNlY3Rpb246IGZhbHNlLFxyXG4gICAgICAgICAgICBpY29uOiBuZXcgTC5EaXZJY29uKHtcclxuICAgICAgICAgICAgICAgIGljb25TaXplOiBuZXcgTC5Qb2ludCg4LCA4KSxcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2xlYWZsZXQtZGl2LWljb24gbGVhZmxldC1lZGl0aW5nLWljb24nXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB0b3VjaEljb246IG5ldyBMLkRpdkljb24oe1xyXG4gICAgICAgICAgICAgICAgaWNvblNpemU6IG5ldyBMLlBvaW50KDIwLCAyMCksXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdsZWFmbGV0LWRpdi1pY29uIGxlYWZsZXQtZWRpdGluZy1pY29uIGxlYWZsZXQtdG91Y2gtaWNvbidcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGRyYXdFcnJvcjoge1xyXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjYjAwYjAwJyxcclxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDEwMDBcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbnRpYWxpemUoKTogdm9pZFxyXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChwb2x5LCBsYXRsbmdzLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHRvdWNoLCBzd2l0Y2ggdG8gdG91Y2ggaWNvblxyXG4gICAgICAgICAgICBpZiAoTC5Ccm93c2VyLnRvdWNoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaWNvbiA9IHRoaXMub3B0aW9ucy50b3VjaEljb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcG9seSA9IHBvbHk7XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRyYXdFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kcmF3RXJyb3IgPSBMLlV0aWwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMuZHJhd0Vycm9yLCBvcHRpb25zLmRyYXdFcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2xhdGxuZ3MgPSBsYXRsbmdzO1xyXG5cclxuICAgICAgICAgICAgTC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIENvbXBhdGliaWxpdHkgbWV0aG9kIHRvIG5vcm1hbGl6ZSBQb2x5KiBvYmplY3RzXHJcbiAgICAgICAgLy8gYmV0d2VlbiAwLjcueCBhbmQgMS4wK1xyXG4gICAgICAgIF9kZWZhdWx0U2hhcGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCFMLlBvbHlsaW5lLl9mbGF0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGF0bG5ncztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gTC5Qb2x5bGluZS5fZmxhdCh0aGlzLl9sYXRsbmdzKSA/IHRoaXMuX2xhdGxuZ3MgOiB0aGlzLl9sYXRsbmdzWzBdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgYWRkSG9va3MoKTogdm9pZFxyXG4gICAgICAgIC8vIEFkZCBsaXN0ZW5lciBob29rcyB0byB0aGlzIGhhbmRsZXIuXHJcbiAgICAgICAgYWRkSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHBvbHkgPSB0aGlzLl9wb2x5O1xyXG5cclxuICAgICAgICAgICAgaWYgKCEocG9seSBpbnN0YW5jZW9mIEwuUG9seWdvbikpIHtcclxuICAgICAgICAgICAgICAgIHBvbHkub3B0aW9ucy5maWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9seS5vcHRpb25zLmVkaXRpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBwb2x5Lm9wdGlvbnMuZWRpdGluZy5maWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHBvbHkuc2V0U3R5bGUocG9seS5vcHRpb25zLmVkaXRpbmcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvbHkuX21hcCkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcCA9IHRoaXMuX3BvbHkuX21hcDsgLy8gU2V0IG1hcFxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbWFya2VyR3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0TWFya2VycygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9seS5fbWFwLmFkZExheWVyKHRoaXMuX21hcmtlckdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgcmVtb3ZlSG9va3MoKTogdm9pZFxyXG4gICAgICAgIC8vIFJlbW92ZSBsaXN0ZW5lciBob29rcyBmcm9tIHRoaXMgaGFuZGxlci5cclxuICAgICAgICByZW1vdmVIb29rczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcG9seSA9IHRoaXMuX3BvbHk7XHJcblxyXG4gICAgICAgICAgICBwb2x5LnNldFN0eWxlKHBvbHkub3B0aW9ucy5vcmlnaW5hbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocG9seS5fbWFwKSB7XHJcbiAgICAgICAgICAgICAgICBwb2x5Ll9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fbWFya2VyR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcmtlckdyb3VwO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcmtlcnM7XHJcbiAgICAgICAgICAgICAgICBwb2x5LmZpcmUoJ2VkaXRzdG9wJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHVwZGF0ZU1hcmtlcnMoKTogdm9pZFxyXG4gICAgICAgIC8vIENsZWFyIG1hcmtlcnMgYW5kIHVwZGF0ZSB0aGVpciBsb2NhdGlvblxyXG4gICAgICAgIHVwZGF0ZU1hcmtlcnM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWFya2VyR3JvdXAuY2xlYXJMYXllcnMoKTtcclxuICAgICAgICAgICAgdGhpcy5faW5pdE1hcmtlcnMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfaW5pdE1hcmtlcnM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9tYXJrZXJHcm91cCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2VyR3JvdXAgPSBuZXcgTC5MYXllckdyb3VwKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fbWFya2VycyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgdmFyIGxhdGxuZ3MgPSB0aGlzLl9kZWZhdWx0U2hhcGUoKSxcclxuICAgICAgICAgICAgICAgIGksIGosIGxlbiwgbWFya2VyO1xyXG5cclxuICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gbGF0bG5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG5cclxuICAgICAgICAgICAgICAgIG1hcmtlciA9IHRoaXMuX2NyZWF0ZU1hcmtlcihsYXRsbmdzW2ldLCBpKTtcclxuICAgICAgICAgICAgICAgLy8gbWFya2VyLm9uKCdjbGljaycsIHRoaXMuX29uTWFya2VyQ2xpY2ssIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2Vycy5wdXNoKG1hcmtlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBtYXJrZXJMZWZ0LCBtYXJrZXJSaWdodDtcclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiAhKEwuUG9seWdvbiAmJiAodGhpcy5fcG9seSBpbnN0YW5jZW9mIEwuUG9seWdvbikpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbWFya2VyTGVmdCA9IHRoaXMuX21hcmtlcnNbal07XHJcbiAgICAgICAgICAgICAgICBtYXJrZXJSaWdodCA9IHRoaXMuX21hcmtlcnNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlTWlkZGxlTWFya2VyKG1hcmtlckxlZnQsIG1hcmtlclJpZ2h0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVByZXZOZXh0KG1hcmtlckxlZnQsIG1hcmtlclJpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9jcmVhdGVNYXJrZXI6IGZ1bmN0aW9uIChsYXRsbmcsIGluZGV4KSB7XHJcbiAgICAgICAgICAgIC8vIEV4dGVuZGluZyBMLk1hcmtlciBpbiBUb3VjaEV2ZW50cy5qcyB0byBpbmNsdWRlIHRvdWNoLlxyXG4gICAgICAgICAgICB2YXIgbWFya2VyID0gbmV3IEwuTWFya2VyLlRvdWNoKGxhdGxuZywge1xyXG4gICAgICAgICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgaWNvbjogdGhpcy5vcHRpb25zLmljb24sXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbWFya2VyLl9vcmlnTGF0TG5nID0gbGF0bG5nO1xyXG4gICAgICAgICAgICBtYXJrZXIuX2luZGV4ID0gaW5kZXg7XHJcblxyXG4gICAgICAgICAgICBtYXJrZXJcclxuICAgICAgICAgICAgICAgIC5vbignZHJhZ3N0YXJ0JywgdGhpcy5fb25NYXJrZXJEcmFnU3RhcnQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ2RyYWcnLCB0aGlzLl9vbk1hcmtlckRyYWcsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ2RyYWdlbmQnLCB0aGlzLl9maXJlRWRpdCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC8vIC5vbignZHJhZ2VuZCcsIHRoaXMuX29uTWFya2VyRHJhZ0VuZCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbigndG91Y2htb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ3RvdWNoZW5kJywgdGhpcy5fZmlyZUVkaXQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ01TUG9pbnRlck1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbignTVNQb2ludGVyVXAnLCB0aGlzLl9maXJlRWRpdCwgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJHcm91cC5hZGRMYXllcihtYXJrZXIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1hcmtlcjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25NYXJrZXJEcmFnU3RhcnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9seS5maXJlKCdlZGl0c3RhcnQnKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfc3BsaWNlTGF0TG5nczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbGF0bG5ncyA9IHRoaXMuX2RlZmF1bHRTaGFwZSgpO1xyXG4gICAgICAgICAgICB2YXIgcmVtb3ZlZCA9IFtdLnNwbGljZS5hcHBseShsYXRsbmdzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb2x5Ll9jb252ZXJ0TGF0TG5ncyhsYXRsbmdzLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5fcG9seS5yZWRyYXcoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlbW92ZWQ7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3JlbW92ZU1hcmtlcjogZnVuY3Rpb24gKG1hcmtlcikge1xyXG4gICAgICAgICAgICB2YXIgaSA9IG1hcmtlci5faW5kZXg7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJHcm91cC5yZW1vdmVMYXllcihtYXJrZXIpO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5fc3BsaWNlTGF0TG5ncyhpLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlSW5kZXhlcyhpLCAtMSk7XHJcblxyXG4gICAgICAgICAgICBtYXJrZXJcclxuICAgICAgICAgICAgICAgIC5vZmYoJ2RyYWdzdGFydCcsIHRoaXMuX29uTWFya2VyRHJhZ1N0YXJ0LCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZignZHJhZycsIHRoaXMuX29uTWFya2VyRHJhZywgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ2RyYWdlbmQnLCB0aGlzLl9maXJlRWRpdCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ3RvdWNobW92ZScsIHRoaXMuX29uTWFya2VyRHJhZywgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ3RvdWNoZW5kJywgdGhpcy5fZmlyZUVkaXQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgLy8gIC5vZmYoJ2NsaWNrJywgdGhpcy5fb25NYXJrZXJDbGljaywgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ01TUG9pbnRlck1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ01TUG9pbnRlclVwJywgdGhpcy5fZmlyZUVkaXQsIHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9maXJlRWRpdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wb2x5LmVkaXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvbHkuZmlyZSgnZWRpdCcpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb2x5Ll9tYXAuZmlyZShMLkRyYXcuRXZlbnQuRURJVFZFUlRFWCwge2xheWVyczogdGhpcy5fbWFya2VyR3JvdXAsIHBvbHk6IHRoaXMuX3BvbHl9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25NYXJrZXJEcmFnOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgbWFya2VyID0gZS50YXJnZXQ7XHJcbiAgICAgICAgICAgIHZhciBwb2x5ID0gdGhpcy5fcG9seTtcclxuXHJcbiAgICAgICAgICAgIEwuZXh0ZW5kKG1hcmtlci5fb3JpZ0xhdExuZywgbWFya2VyLl9sYXRsbmcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1hcmtlci5fbWlkZGxlTGVmdCkge1xyXG4gICAgICAgICAgICAgICAgbWFya2VyLl9taWRkbGVMZWZ0LnNldExhdExuZyh0aGlzLl9nZXRNaWRkbGVMYXRMbmcobWFya2VyLl9wcmV2LCBtYXJrZXIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobWFya2VyLl9taWRkbGVSaWdodCkge1xyXG4gICAgICAgICAgICAgICAgbWFya2VyLl9taWRkbGVSaWdodC5zZXRMYXRMbmcodGhpcy5fZ2V0TWlkZGxlTGF0TG5nKG1hcmtlciwgbWFya2VyLl9uZXh0KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGlmIChwb2x5Lm9wdGlvbnMucG9seSkge1xyXG4gICAgICAgICAgICAvLyAgICAgdmFyIHRvb2x0aXAgPSBwb2x5Ll9tYXAuX2VkaXRUb29sdGlwOyAvLyBBY2Nlc3MgdGhlIHRvb2x0aXBcclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgLy8gICAgIC8vIElmIHdlIGRvbid0IGFsbG93IGludGVyc2VjdGlvbnMgYW5kIHRoZSBwb2x5Z29uIGludGVyc2VjdHNcclxuICAgICAgICAgICAgLy8gICAgIGlmICghcG9seS5vcHRpb25zLnBvbHkuYWxsb3dJbnRlcnNlY3Rpb24gJiYgcG9seS5pbnRlcnNlY3RzKCkpIHtcclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgLy8gICAgICAgICB2YXIgb3JpZ2luYWxDb2xvciA9IHBvbHkub3B0aW9ucy5jb2xvcjtcclxuICAgICAgICAgICAgLy8gICAgICAgICBwb2x5LnNldFN0eWxlKHtjb2xvcjogdGhpcy5vcHRpb25zLmRyYXdFcnJvci5jb2xvcn0pO1xyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIE1hbnVhbGx5IHRyaWdnZXIgJ2RyYWdlbmQnIGJlaGF2aW9yIG9uIG1hcmtlciB3ZSBhcmUgYWJvdXQgdG8gcmVtb3ZlXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gV09SS0FST1VORDogaW50cm9kdWNlZCBpbiAxLjAuMC1yYzIsIG1heSBiZSByZWxhdGVkIHRvICM0NDg0XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgaWYgKEwudmVyc2lvbi5pbmRleE9mKCcwLjcnKSAhPT0gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBtYXJrZXIuZHJhZ2dpbmcuX2RyYWdnYWJsZS5fb25VcChlKTtcclxuICAgICAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5fb25NYXJrZXJDbGljayhlKTsgLy8gUmVtb3ZlIHZpb2xhdGluZyBtYXJrZXJcclxuICAgICAgICAgICAgLy8gICAgICAgICAvLyBGSVhNRTogUmVzZXQgdGhlIG1hcmtlciB0byBpdCdzIG9yaWdpbmFsIHBvc2l0aW9uIChpbnN0ZWFkIG9mIHJlbW92ZSlcclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgLy8gICAgICAgICBpZiAodG9vbHRpcCkge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB0b29sdGlwLnVwZGF0ZUNvbnRlbnQoe1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGV4dDogTC5kcmF3TG9jYWwuZHJhdy5oYW5kbGVycy5wb2x5bGluZS5lcnJvclxyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gUmVzZXQgZXZlcnl0aGluZyBiYWNrIHRvIG5vcm1hbCBhZnRlciBhIHNlY29uZFxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBwb2x5LnNldFN0eWxlKHtjb2xvcjogb3JpZ2luYWxDb2xvcn0pO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBpZiAodG9vbHRpcCkge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgdG9vbHRpcC51cGRhdGVDb250ZW50KHtcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB0ZXh0OiBMLmRyYXdMb2NhbC5lZGl0LmhhbmRsZXJzLmVkaXQudG9vbHRpcC50ZXh0LFxyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHN1YnRleHQ6IEwuZHJhd0xvY2FsLmVkaXQuaGFuZGxlcnMuZWRpdC50b29sdGlwLnN1YnRleHRcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgdmFyIHRhYkxhdExuZ3MgPSBbXVxyXG4gICAgICAgICAgICBmb3IodmFyIGogaW4gdGhpcy5fbWFya2Vycyl7XHJcbiAgICAgICAgICAgICAgICB0YWJMYXRMbmdzLnB1c2godGhpcy5fbWFya2Vyc1tqXS5nZXRMYXRMbmcoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcG9seS5zZXRMYXRMbmdzKHRhYkxhdExuZ3MpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb2x5LmVkaXRpbmcubGF0bG5nc1swXVswXSA9IHRhYkxhdExuZ3M7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9wb2x5LnJlZHJhdygpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb2x5LmZpcmUoJ2VkaXRkcmFnJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uTWFya2VyQ2xpY2s6IGZ1bmN0aW9uIChlKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgbWluUG9pbnRzID0gTC5Qb2x5Z29uICYmICh0aGlzLl9wb2x5IGluc3RhbmNlb2YgTC5Qb2x5Z29uKSA/IDQgOiAzLFxyXG4gICAgICAgICAgICAgICAgbWFya2VyID0gZS50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiByZW1vdmluZyB0aGlzIHBvaW50IHdvdWxkIGNyZWF0ZSBhbiBpbnZhbGlkIHBvbHlsaW5lL3BvbHlnb24gZG9uJ3QgcmVtb3ZlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWZhdWx0U2hhcGUoKS5sZW5ndGggPCBtaW5Qb2ludHMpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBtYXJrZXJcclxuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlTWFya2VyKG1hcmtlcik7XHJcblxyXG4gICAgICAgICAgICAvLyB1cGRhdGUgcHJldi9uZXh0IGxpbmtzIG9mIGFkamFjZW50IG1hcmtlcnNcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUHJldk5leHQobWFya2VyLl9wcmV2LCBtYXJrZXIuX25leHQpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVtb3ZlIGdob3N0IG1hcmtlcnMgbmVhciB0aGUgcmVtb3ZlZCBtYXJrZXJcclxuICAgICAgICAgICAgaWYgKG1hcmtlci5fbWlkZGxlTGVmdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2VyR3JvdXAucmVtb3ZlTGF5ZXIobWFya2VyLl9taWRkbGVMZWZ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobWFya2VyLl9taWRkbGVSaWdodCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2VyR3JvdXAucmVtb3ZlTGF5ZXIobWFya2VyLl9taWRkbGVSaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGdob3N0IG1hcmtlciBpbiBwbGFjZSBvZiB0aGUgcmVtb3ZlZCBvbmVcclxuICAgICAgICAgICAgaWYgKG1hcmtlci5fcHJldiAmJiBtYXJrZXIuX25leHQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZU1pZGRsZU1hcmtlcihtYXJrZXIuX3ByZXYsIG1hcmtlci5fbmV4dCk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFtYXJrZXIuX3ByZXYpIHtcclxuICAgICAgICAgICAgICAgIG1hcmtlci5fbmV4dC5fbWlkZGxlTGVmdCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFtYXJrZXIuX25leHQpIHtcclxuICAgICAgICAgICAgICAgIG1hcmtlci5fcHJldi5fbWlkZGxlUmlnaHQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9maXJlRWRpdCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vblRvdWNoTW92ZTogZnVuY3Rpb24gKGUpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBsYXllclBvaW50ID0gdGhpcy5fbWFwLm1vdXNlRXZlbnRUb0xheWVyUG9pbnQoZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0pLFxyXG4gICAgICAgICAgICAgICAgbGF0bG5nID0gdGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhsYXllclBvaW50KSxcclxuICAgICAgICAgICAgICAgIG1hcmtlciA9IGUudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgTC5leHRlbmQobWFya2VyLl9vcmlnTGF0TG5nLCBsYXRsbmcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1hcmtlci5fbWlkZGxlTGVmdCkge1xyXG4gICAgICAgICAgICAgICAgbWFya2VyLl9taWRkbGVMZWZ0LnNldExhdExuZyh0aGlzLl9nZXRNaWRkbGVMYXRMbmcobWFya2VyLl9wcmV2LCBtYXJrZXIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobWFya2VyLl9taWRkbGVSaWdodCkge1xyXG4gICAgICAgICAgICAgICAgbWFya2VyLl9taWRkbGVSaWdodC5zZXRMYXRMbmcodGhpcy5fZ2V0TWlkZGxlTGF0TG5nKG1hcmtlciwgbWFya2VyLl9uZXh0KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3BvbHkucmVkcmF3KCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTWFya2VycygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF91cGRhdGVJbmRleGVzOiBmdW5jdGlvbiAoaW5kZXgsIGRlbHRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlckdyb3VwLmVhY2hMYXllcihmdW5jdGlvbiAobWFya2VyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWFya2VyLl9pbmRleCA+IGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyLl9pbmRleCArPSBkZWx0YTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NyZWF0ZU1pZGRsZU1hcmtlcjogZnVuY3Rpb24gKG1hcmtlcjEsIG1hcmtlcjIpIHtcclxuICAgICAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuX2dldE1pZGRsZUxhdExuZyhtYXJrZXIxLCBtYXJrZXIyKSxcclxuICAgICAgICAgICAgICAgIG1hcmtlciA9IHRoaXMuX2NyZWF0ZU1hcmtlcihsYXRsbmcpLFxyXG4gICAgICAgICAgICAgICAgb25DbGljayxcclxuICAgICAgICAgICAgICAgIG9uRHJhZ1N0YXJ0LFxyXG4gICAgICAgICAgICAgICAgb25EcmFnRW5kO1xyXG5cclxuICAgICAgICAgICAgbWFya2VyLnNldE9wYWNpdHkoMC42KTtcclxuXHJcbiAgICAgICAgICAgIG1hcmtlcjEuX21pZGRsZVJpZ2h0ID0gbWFya2VyMi5fbWlkZGxlTGVmdCA9IG1hcmtlcjtcclxuXHJcbiAgICAgICAgICAgIG9uRHJhZ1N0YXJ0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgbWFya2VyLm9mZigndG91Y2htb3ZlJywgb25EcmFnU3RhcnQsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGkgPSBtYXJrZXIyLl9pbmRleDtcclxuXHJcbiAgICAgICAgICAgICAgICBtYXJrZXIuX2luZGV4ID0gaTtcclxuXHJcbiAgICAgICAgICAgICAgICBtYXJrZXJcclxuICAgICAgICAgICAgICAgICAgICAub2ZmKCdjbGljaycsIG9uQ2xpY2ssIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdjbGljaycsIHRoaXMuX29uTWFya2VyQ2xpY2ssIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxhdGxuZy5sYXQgPSBtYXJrZXIuZ2V0TGF0TG5nKCkubGF0O1xyXG4gICAgICAgICAgICAgICAgbGF0bG5nLmxuZyA9IG1hcmtlci5nZXRMYXRMbmcoKS5sbmc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zcGxpY2VMYXRMbmdzKGksIDAsIGxhdGxuZyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXJrZXJzLnNwbGljZShpLCAwLCBtYXJrZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIG1hcmtlci5zZXRPcGFjaXR5KDEpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUluZGV4ZXMoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICBtYXJrZXIyLl9pbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlUHJldk5leHQobWFya2VyMSwgbWFya2VyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVByZXZOZXh0KG1hcmtlciwgbWFya2VyMik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2x5LmZpcmUoJ2VkaXRzdGFydCcpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgb25EcmFnRW5kID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgbWFya2VyLm9mZignZHJhZ3N0YXJ0Jywgb25EcmFnU3RhcnQsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgbWFya2VyLm9mZignZHJhZ2VuZCcsIG9uRHJhZ0VuZCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICBtYXJrZXIub2ZmKCd0b3VjaG1vdmUnLCBvbkRyYWdTdGFydCwgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuaW50ZXJzZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlTWlkZGxlTWFya2VyKG1hcmtlcjEsIG1hcmtlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlTWlkZGxlTWFya2VyKG1hcmtlciwgbWFya2VyMik7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBtYXJrZXIyLl9pbmRleC0tO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gbWFya2VyMi5faW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3BsaWNlTGF0TG5ncyhpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVJbmRleGVzKGksIC0xKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVQcmV2TmV4dChtYXJrZXIxLCBtYXJrZXIyKTtcclxuICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0T3BhY2l0eSgwLjYpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvbHkucmVkcmF3KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNYXJrZXJzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBvbkNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgb25EcmFnU3RhcnQuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIG9uRHJhZ0VuZC5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyZUVkaXQoKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIG1hcmtlclxyXG4gICAgICAgICAgICAgICAgLy8ub24oJ2NsaWNrJywgb25DbGljaywgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbignZHJhZ3N0YXJ0Jywgb25EcmFnU3RhcnQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ2RyYWdlbmQnLCBvbkRyYWdFbmQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ3RvdWNobW92ZScsIG9uRHJhZ1N0YXJ0LCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlckdyb3VwLmFkZExheWVyKG1hcmtlcik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3VwZGF0ZVByZXZOZXh0OiBmdW5jdGlvbiAobWFya2VyMSwgbWFya2VyMikge1xyXG4gICAgICAgICAgICBpZiAobWFya2VyMSkge1xyXG4gICAgICAgICAgICAgICAgbWFya2VyMS5fbmV4dCA9IG1hcmtlcjI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG1hcmtlcjIpIHtcclxuICAgICAgICAgICAgICAgIG1hcmtlcjIuX3ByZXYgPSBtYXJrZXIxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldE1pZGRsZUxhdExuZzogZnVuY3Rpb24gKG1hcmtlcjEsIG1hcmtlcjIpIHtcclxuICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX3BvbHkuX21hcCxcclxuICAgICAgICAgICAgICAgIHAxID0gbWFwLnByb2plY3QobWFya2VyMS5nZXRMYXRMbmcoKSksXHJcbiAgICAgICAgICAgICAgICBwMiA9IG1hcC5wcm9qZWN0KG1hcmtlcjIuZ2V0TGF0TG5nKCkpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1hcC51bnByb2plY3QocDEuX2FkZChwMikuX2RpdmlkZUJ5KDIpKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBMLlBvbHlsaW5lLmFkZEluaXRIb29rKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGhhbmRsZXIgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4gVGhpcyBpcyB0byBzdXBwb3J0IHZlcnNpb25zIG9mIExlYWZsZXQgdGhhdCBzdGlsbCBoYXZlIEwuSGFuZGxlci5Qb2x5RWRpdFxyXG4gICAgICAgIGlmICh0aGlzLmVkaXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEwuRWRpdC5Qb2x5KSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVkaXRpbmcgPSBuZXcgTC5FZGl0LlBvbHkodGhpcywgdGhpcy5vcHRpb25zLnBvbHkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0aW5nLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uKCdhZGQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRpbmcgJiYgdGhpcy5lZGl0aW5nLmVuYWJsZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0aW5nLmFkZEhvb2tzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5vbigncmVtb3ZlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0aW5nICYmIHRoaXMuZWRpdGluZy5lbmFibGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdGluZy5yZW1vdmVIb29rcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgTC5FZGl0ID0gTC5FZGl0IHx8IHt9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5FZGl0LlNpbXBsZVNoYXBlXHJcbiAgICAgKiBAYWthIEVkaXQuU2ltcGxlU2hhcGVcclxuICAgICAqL1xyXG4gICAgTC5FZGl0LlNpbXBsZVNoYXBlID0gTC5IYW5kbGVyLmV4dGVuZCh7XHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICBtb3ZlSWNvbjogbmV3IEwuRGl2SWNvbih7XHJcbiAgICAgICAgICAgICAgICBpY29uU2l6ZTogbmV3IEwuUG9pbnQoOCwgOCksXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdsZWFmbGV0LWRpdi1pY29uIGxlYWZsZXQtZWRpdGluZy1pY29uIGxlYWZsZXQtZWRpdC1tb3ZlJ1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgcmVzaXplSWNvbjogbmV3IEwuRGl2SWNvbih7XHJcbiAgICAgICAgICAgICAgICBpY29uU2l6ZTogbmV3IEwuUG9pbnQoOCwgOCksXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdsZWFmbGV0LWRpdi1pY29uIGxlYWZsZXQtZWRpdGluZy1pY29uIGxlYWZsZXQtZWRpdC1yZXNpemUnXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB0b3VjaE1vdmVJY29uOiBuZXcgTC5EaXZJY29uKHtcclxuICAgICAgICAgICAgICAgIGljb25TaXplOiBuZXcgTC5Qb2ludCgyMCwgMjApLFxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnbGVhZmxldC1kaXYtaWNvbiBsZWFmbGV0LWVkaXRpbmctaWNvbiBsZWFmbGV0LWVkaXQtbW92ZSBsZWFmbGV0LXRvdWNoLWljb24nXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB0b3VjaFJlc2l6ZUljb246IG5ldyBMLkRpdkljb24oe1xyXG4gICAgICAgICAgICAgICAgaWNvblNpemU6IG5ldyBMLlBvaW50KDIwLCAyMCksXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdsZWFmbGV0LWRpdi1pY29uIGxlYWZsZXQtZWRpdGluZy1pY29uIGxlYWZsZXQtZWRpdC1yZXNpemUgbGVhZmxldC10b3VjaC1pY29uJ1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGludGlhbGl6ZSgpOiB2b2lkXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKHNoYXBlLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHRvdWNoLCBzd2l0Y2ggdG8gdG91Y2ggaWNvblxyXG4gICAgICAgICAgICBpZiAoTC5Ccm93c2VyLnRvdWNoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubW92ZUljb24gPSB0aGlzLm9wdGlvbnMudG91Y2hNb3ZlSWNvbjtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5yZXNpemVJY29uID0gdGhpcy5vcHRpb25zLnRvdWNoUmVzaXplSWNvbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fc2hhcGUgPSBzaGFwZTtcclxuICAgICAgICAgICAgTC5VdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBhZGRIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gQWRkIGxpc3RlbmVyIGhvb2tzIHRvIHRoaXMgaGFuZGxlclxyXG4gICAgICAgIGFkZEhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzaGFwZSA9IHRoaXMuX3NoYXBlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc2hhcGUuX21hcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwID0gdGhpcy5fc2hhcGUuX21hcDtcclxuICAgICAgICAgICAgICAgIHNoYXBlLnNldFN0eWxlKHNoYXBlLm9wdGlvbnMuZWRpdGluZyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNoYXBlLl9tYXApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAgPSBzaGFwZS5fbWFwO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbWFya2VyR3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdE1hcmtlcnMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLmFkZExheWVyKHRoaXMuX21hcmtlckdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgcmVtb3ZlSG9va3MoKTogdm9pZFxyXG4gICAgICAgIC8vIFJlbW92ZSBsaXN0ZW5lciBob29rcyBmcm9tIHRoaXMgaGFuZGxlclxyXG4gICAgICAgIHJlbW92ZUhvb2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzaGFwZSA9IHRoaXMuX3NoYXBlO1xyXG5cclxuICAgICAgICAgICAgc2hhcGUuc2V0U3R5bGUoc2hhcGUub3B0aW9ucy5vcmlnaW5hbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hhcGUuX21hcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdW5iaW5kTWFya2VyKHRoaXMuX21vdmVNYXJrZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5fcmVzaXplTWFya2Vycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmJpbmRNYXJrZXIodGhpcy5fcmVzaXplTWFya2Vyc1tpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNpemVNYXJrZXJzID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fbWFya2VyR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcmtlckdyb3VwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXAgPSBudWxsO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgdXBkYXRlTWFya2VycygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBlZGl0IG1hcmtlcnMgZnJvbSB0aGlzIGxheWVyXHJcbiAgICAgICAgdXBkYXRlTWFya2VyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJHcm91cC5jbGVhckxheWVycygpO1xyXG4gICAgICAgICAgICB0aGlzLl9pbml0TWFya2VycygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9pbml0TWFya2VyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX21hcmtlckdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXJrZXJHcm91cCA9IG5ldyBMLkxheWVyR3JvdXAoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gQ3JlYXRlIGNlbnRlciBtYXJrZXJcclxuICAgICAgICAgICAgdGhpcy5fY3JlYXRlTW92ZU1hcmtlcigpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ3JlYXRlIGVkZ2UgbWFya2VyXHJcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVJlc2l6ZU1hcmtlcigpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9jcmVhdGVNb3ZlTWFya2VyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIENoaWxkcmVuIG92ZXJyaWRlXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NyZWF0ZVJlc2l6ZU1hcmtlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBDaGlsZHJlbiBvdmVycmlkZVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9jcmVhdGVNYXJrZXI6IGZ1bmN0aW9uIChsYXRsbmcsIGljb24pIHtcclxuICAgICAgICAgICAgLy8gRXh0ZW5kaW5nIEwuTWFya2VyIGluIFRvdWNoRXZlbnRzLmpzIHRvIGluY2x1ZGUgdG91Y2guXHJcbiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgTC5NYXJrZXIuVG91Y2gobGF0bG5nLCB7XHJcbiAgICAgICAgICAgICAgICBkcmFnZ2FibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBpY29uOiBpY29uLFxyXG4gICAgICAgICAgICAgICAgekluZGV4T2Zmc2V0OiAxMFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2JpbmRNYXJrZXIobWFya2VyKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlckdyb3VwLmFkZExheWVyKG1hcmtlcik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbWFya2VyO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9iaW5kTWFya2VyOiBmdW5jdGlvbiAobWFya2VyKSB7XHJcbiAgICAgICAgICAgIG1hcmtlclxyXG4gICAgICAgICAgICAgICAgLm9uKCdkcmFnc3RhcnQnLCB0aGlzLl9vbk1hcmtlckRyYWdTdGFydCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbignZHJhZycsIHRoaXMuX29uTWFya2VyRHJhZywgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbignZHJhZ2VuZCcsIHRoaXMuX29uTWFya2VyRHJhZ0VuZCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbigndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2hTdGFydCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbigndG91Y2htb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ01TUG9pbnRlck1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vbigndG91Y2hlbmQnLCB0aGlzLl9vblRvdWNoRW5kLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9uKCdNU1BvaW50ZXJVcCcsIHRoaXMuX29uVG91Y2hFbmQsIHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF91bmJpbmRNYXJrZXI6IGZ1bmN0aW9uIChtYXJrZXIpIHtcclxuICAgICAgICAgICAgbWFya2VyXHJcbiAgICAgICAgICAgICAgICAub2ZmKCdkcmFnc3RhcnQnLCB0aGlzLl9vbk1hcmtlckRyYWdTdGFydCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ2RyYWcnLCB0aGlzLl9vbk1hcmtlckRyYWcsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub2ZmKCdkcmFnZW5kJywgdGhpcy5fb25NYXJrZXJEcmFnRW5kLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZigndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2hTdGFydCwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5vZmYoJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZignTVNQb2ludGVyTW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZigndG91Y2hlbmQnLCB0aGlzLl9vblRvdWNoRW5kLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZignTVNQb2ludGVyVXAnLCB0aGlzLl9vblRvdWNoRW5kLCB0aGlzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25NYXJrZXJEcmFnU3RhcnQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBlLnRhcmdldDtcclxuICAgICAgICAgICAgbWFya2VyLnNldE9wYWNpdHkoMCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zaGFwZS5maXJlKCdlZGl0c3RhcnQnKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZmlyZUVkaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2hhcGUuZWRpdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fc2hhcGUuZmlyZSgnZWRpdCcpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbk1hcmtlckRyYWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBlLnRhcmdldCxcclxuICAgICAgICAgICAgICAgIGxhdGxuZyA9IG1hcmtlci5nZXRMYXRMbmcoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChtYXJrZXIgPT09IHRoaXMuX21vdmVNYXJrZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21vdmUobGF0bG5nKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZShsYXRsbmcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zaGFwZS5yZWRyYXcoKTtcclxuICAgICAgICAgICAgdGhpcy5fc2hhcGUuZmlyZSgnZWRpdGRyYWcnKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25NYXJrZXJEcmFnRW5kOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgbWFya2VyID0gZS50YXJnZXQ7XHJcbiAgICAgICAgICAgIG1hcmtlci5zZXRPcGFjaXR5KDEpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZmlyZUVkaXQoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Ub3VjaFN0YXJ0OiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBMLkVkaXQuU2ltcGxlU2hhcGUucHJvdG90eXBlLl9vbk1hcmtlckRyYWdTdGFydC5jYWxsKHRoaXMsIGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLl9nZXRDb3JuZXJzKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgLy8gU2F2ZSBhIHJlZmVyZW5jZSB0byB0aGUgb3Bwb3NpdGUgcG9pbnRcclxuICAgICAgICAgICAgICAgIHZhciBjb3JuZXJzID0gdGhpcy5fZ2V0Q29ybmVycygpLFxyXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IGUudGFyZ2V0LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb3JuZXJJbmRleCA9IG1hcmtlci5fY29ybmVySW5kZXg7XHJcblxyXG4gICAgICAgICAgICAgICAgbWFya2VyLnNldE9wYWNpdHkoMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ29weWVkIGZyb20gRWRpdC5SZWN0YW5nbGUuanMgbGluZSAyMyBfb25NYXJrZXJEcmFnU3RhcnQoKVxyXG4gICAgICAgICAgICAgICAgLy8gTGF0bG5nIGlzIG51bGwgb3RoZXJ3aXNlLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3Bwb3NpdGVDb3JuZXIgPSBjb3JuZXJzWyhjdXJyZW50Q29ybmVySW5kZXggKyAyKSAlIDRdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQ29ybmVyTWFya2VycygwLCBjdXJyZW50Q29ybmVySW5kZXgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zaGFwZS5maXJlKCdlZGl0c3RhcnQnKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Ub3VjaE1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXllclBvaW50ID0gdGhpcy5fbWFwLm1vdXNlRXZlbnRUb0xheWVyUG9pbnQoZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0pLFxyXG4gICAgICAgICAgICAgICAgbGF0bG5nID0gdGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhsYXllclBvaW50KSxcclxuICAgICAgICAgICAgICAgIG1hcmtlciA9IGUudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKG1hcmtlciA9PT0gdGhpcy5fbW92ZU1hcmtlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZShsYXRsbmcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplKGxhdGxuZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3NoYXBlLnJlZHJhdygpO1xyXG5cclxuICAgICAgICAgICAgLy8gcHJldmVudCB0b3VjaGNhbmNlbCBpbiBJT1NcclxuICAgICAgICAgICAgLy8gZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uVG91Y2hFbmQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBlLnRhcmdldDtcclxuICAgICAgICAgICAgbWFya2VyLnNldE9wYWNpdHkoMSk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTWFya2VycygpO1xyXG4gICAgICAgICAgICB0aGlzLl9maXJlRWRpdCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9tb3ZlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIENoaWxkcmVuIG92ZXJyaWRlXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Jlc2l6ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBDaGlsZHJlbiBvdmVycmlkZVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICBMLkVkaXQgPSBMLkVkaXQgfHwge307XHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkVkaXQuUmVjdGFuZ2xlXHJcbiAgICAgKiBAYWthIEVkaXQuUmVjdGFuZ2xlXHJcbiAgICAgKiBAaW5oZXJpdHMgTC5FZGl0LlNpbXBsZVNoYXBlXHJcbiAgICAgKi9cclxuICAgIEwuRWRpdC5SZWN0YW5nbGUgPSBMLkVkaXQuU2ltcGxlU2hhcGUuZXh0ZW5kKHtcclxuICAgICAgICBfY3JlYXRlTW92ZU1hcmtlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgYm91bmRzID0gdGhpcy5fc2hhcGUuZ2V0Qm91bmRzKCksXHJcbiAgICAgICAgICAgICAgICBjZW50ZXIgPSBib3VuZHMuZ2V0Q2VudGVyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tb3ZlTWFya2VyID0gdGhpcy5fY3JlYXRlTWFya2VyKGNlbnRlciwgdGhpcy5vcHRpb25zLm1vdmVJY29uKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfY3JlYXRlUmVzaXplTWFya2VyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBjb3JuZXJzID0gdGhpcy5fZ2V0Q29ybmVycygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fcmVzaXplTWFya2VycyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjb3JuZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplTWFya2Vycy5wdXNoKHRoaXMuX2NyZWF0ZU1hcmtlcihjb3JuZXJzW2ldLCB0aGlzLm9wdGlvbnMucmVzaXplSWNvbikpO1xyXG4gICAgICAgICAgICAgICAgLy8gTW9ua2V5IGluIHRoZSBjb3JuZXIgaW5kZXggYXMgd2Ugd2lsbCBuZWVkIHRvIGtub3cgdGhpcyBmb3IgZHJhZ2dpbmdcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZU1hcmtlcnNbaV0uX2Nvcm5lckluZGV4ID0gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbk1hcmtlckRyYWdTdGFydDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgTC5FZGl0LlNpbXBsZVNoYXBlLnByb3RvdHlwZS5fb25NYXJrZXJEcmFnU3RhcnQuY2FsbCh0aGlzLCBlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNhdmUgYSByZWZlcmVuY2UgdG8gdGhlIG9wcG9zaXRlIHBvaW50XHJcbiAgICAgICAgICAgIHZhciBjb3JuZXJzID0gdGhpcy5fZ2V0Q29ybmVycygpLFxyXG4gICAgICAgICAgICAgICAgbWFya2VyID0gZS50YXJnZXQsXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Q29ybmVySW5kZXggPSBtYXJrZXIuX2Nvcm5lckluZGV4O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fb3Bwb3NpdGVDb3JuZXIgPSBjb3JuZXJzWyhjdXJyZW50Q29ybmVySW5kZXggKyAyKSAlIDRdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQ29ybmVyTWFya2VycygwLCBjdXJyZW50Q29ybmVySW5kZXgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbk1hcmtlckRyYWdFbmQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBlLnRhcmdldCxcclxuICAgICAgICAgICAgICAgIGJvdW5kcywgY2VudGVyO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVzZXQgbW92ZSBtYXJrZXIgcG9zaXRpb24gdG8gdGhlIGNlbnRlclxyXG4gICAgICAgICAgICBpZiAobWFya2VyID09PSB0aGlzLl9tb3ZlTWFya2VyKSB7XHJcbiAgICAgICAgICAgICAgICBib3VuZHMgPSB0aGlzLl9zaGFwZS5nZXRCb3VuZHMoKTtcclxuICAgICAgICAgICAgICAgIGNlbnRlciA9IGJvdW5kcy5nZXRDZW50ZXIoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBtYXJrZXIuc2V0TGF0TG5nKGNlbnRlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNvcm5lck1hcmtlcnMoMSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9yZXBvc2l0aW9uQ29ybmVyTWFya2VycygpO1xyXG5cclxuICAgICAgICAgICAgTC5FZGl0LlNpbXBsZVNoYXBlLnByb3RvdHlwZS5fb25NYXJrZXJEcmFnRW5kLmNhbGwodGhpcywgZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX21vdmU6IGZ1bmN0aW9uIChuZXdDZW50ZXIpIHtcclxuICAgICAgICAgICAgdmFyIGxhdGxuZ3MgPSB0aGlzLl9zaGFwZS5fZGVmYXVsdFNoYXBlID8gdGhpcy5fc2hhcGUuX2RlZmF1bHRTaGFwZSgpIDogdGhpcy5fc2hhcGUuZ2V0TGF0TG5ncygpLFxyXG4gICAgICAgICAgICAgICAgYm91bmRzID0gdGhpcy5fc2hhcGUuZ2V0Qm91bmRzKCksXHJcbiAgICAgICAgICAgICAgICBjZW50ZXIgPSBib3VuZHMuZ2V0Q2VudGVyKCksXHJcbiAgICAgICAgICAgICAgICBvZmZzZXQsIG5ld0xhdExuZ3MgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIC8vIE9mZnNldCB0aGUgbGF0bG5ncyB0byB0aGUgbmV3IGNlbnRlclxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxhdGxuZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBbbGF0bG5nc1tpXS5sYXQgLSBjZW50ZXIubGF0LCBsYXRsbmdzW2ldLmxuZyAtIGNlbnRlci5sbmddO1xyXG4gICAgICAgICAgICAgICAgbmV3TGF0TG5ncy5wdXNoKFtuZXdDZW50ZXIubGF0ICsgb2Zmc2V0WzBdLCBuZXdDZW50ZXIubG5nICsgb2Zmc2V0WzFdXSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3NoYXBlLnNldExhdExuZ3MobmV3TGF0TG5ncyk7XHJcblxyXG4gICAgICAgICAgICAvLyBSZXBvc2l0aW9uIHRoZSByZXNpemUgbWFya2Vyc1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvc2l0aW9uQ29ybmVyTWFya2VycygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUoTC5EcmF3LkV2ZW50LkVESVRNT1ZFLCB7bGF5ZXI6IHRoaXMuX3NoYXBlfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Jlc2l6ZTogZnVuY3Rpb24gKGxhdGxuZykge1xyXG4gICAgICAgICAgICB2YXIgYm91bmRzO1xyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzaGFwZSBiYXNlZCBvbiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGlzIGNvcm5lciBhbmQgdGhlIG9wcG9zaXRlIHBvaW50XHJcbiAgICAgICAgICAgIHRoaXMuX3NoYXBlLnNldEJvdW5kcyhMLmxhdExuZ0JvdW5kcyhsYXRsbmcsIHRoaXMuX29wcG9zaXRlQ29ybmVyKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBSZXBvc2l0aW9uIHRoZSBtb3ZlIG1hcmtlclxyXG4gICAgICAgICAgICBib3VuZHMgPSB0aGlzLl9zaGFwZS5nZXRCb3VuZHMoKTtcclxuICAgICAgICAgICAgdGhpcy5fbW92ZU1hcmtlci5zZXRMYXRMbmcoYm91bmRzLmdldENlbnRlcigpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5FRElUUkVTSVpFLCB7bGF5ZXI6IHRoaXMuX3NoYXBlfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldENvcm5lcnM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX3NoYXBlLmdldEJvdW5kcygpLFxyXG4gICAgICAgICAgICAgICAgbncgPSBib3VuZHMuZ2V0Tm9ydGhXZXN0KCksXHJcbiAgICAgICAgICAgICAgICBuZSA9IGJvdW5kcy5nZXROb3J0aEVhc3QoKSxcclxuICAgICAgICAgICAgICAgIHNlID0gYm91bmRzLmdldFNvdXRoRWFzdCgpLFxyXG4gICAgICAgICAgICAgICAgc3cgPSBib3VuZHMuZ2V0U291dGhXZXN0KCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gW253LCBuZSwgc2UsIHN3XTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfdG9nZ2xlQ29ybmVyTWFya2VyczogZnVuY3Rpb24gKG9wYWNpdHkpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLl9yZXNpemVNYXJrZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplTWFya2Vyc1tpXS5zZXRPcGFjaXR5KG9wYWNpdHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3JlcG9zaXRpb25Db3JuZXJNYXJrZXJzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBjb3JuZXJzID0gdGhpcy5fZ2V0Q29ybmVycygpO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLl9yZXNpemVNYXJrZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplTWFya2Vyc1tpXS5zZXRMYXRMbmcoY29ybmVyc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBMLlJlY3RhbmdsZS5hZGRJbml0SG9vayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKEwuRWRpdC5SZWN0YW5nbGUpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0aW5nID0gbmV3IEwuRWRpdC5SZWN0YW5nbGUodGhpcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRpbmcuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgTC5FZGl0ID0gTC5FZGl0IHx8IHt9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5FZGl0LkNpcmNsZU1hcmtlclxyXG4gICAgICogQGFrYSBFZGl0LkNpcmNsZVxyXG4gICAgICogQGluaGVyaXRzIEwuRWRpdC5TaW1wbGVTaGFwZVxyXG4gICAgICovXHJcbiAgICBMLkVkaXQuQ2lyY2xlTWFya2VyID0gTC5FZGl0LlNpbXBsZVNoYXBlLmV4dGVuZCh7XHJcbiAgICAgICAgX2NyZWF0ZU1vdmVNYXJrZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGNlbnRlciA9IHRoaXMuX3NoYXBlLmdldExhdExuZygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbW92ZU1hcmtlciA9IHRoaXMuX2NyZWF0ZU1hcmtlcihjZW50ZXIsIHRoaXMub3B0aW9ucy5tb3ZlSWNvbik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NyZWF0ZVJlc2l6ZU1hcmtlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBUbyBhdm9pZCBhbiB1bmRlZmluZWQgY2hlY2sgaW4gTC5FZGl0LlNpbXBsZVNoYXBlLnJlbW92ZUhvb2tzXHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZU1hcmtlcnMgPSBbXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfbW92ZTogZnVuY3Rpb24gKGxhdGxuZykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcmVzaXplTWFya2Vycy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHZhciByZXNpemVtYXJrZXJQb2ludCA9IHRoaXMuX2dldFJlc2l6ZU1hcmtlclBvaW50KGxhdGxuZyk7XHJcbiAgICAgICAgICAgICAgICAvLyBNb3ZlIHRoZSByZXNpemUgbWFya2VyXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNpemVNYXJrZXJzWzBdLnNldExhdExuZyhyZXNpemVtYXJrZXJQb2ludCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIGNpcmNsZVxyXG4gICAgICAgICAgICB0aGlzLl9zaGFwZS5zZXRMYXRMbmcobGF0bG5nKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5FRElUTU9WRSwge2xheWVyOiB0aGlzLl9zaGFwZX0pO1xyXG4gICAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBMLkNpcmNsZU1hcmtlci5hZGRJbml0SG9vayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKEwuRWRpdC5DaXJjbGVNYXJrZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0aW5nID0gbmV3IEwuRWRpdC5DaXJjbGVNYXJrZXIodGhpcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRpbmcuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub24oJ2FkZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGluZyAmJiB0aGlzLmVkaXRpbmcuZW5hYmxlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRpbmcuYWRkSG9va3MoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLm9uKCdyZW1vdmUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRpbmcgJiYgdGhpcy5lZGl0aW5nLmVuYWJsZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0aW5nLnJlbW92ZUhvb2tzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICBMLkVkaXQgPSBMLkVkaXQgfHwge307XHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkVkaXQuQ2lyY2xlXHJcbiAgICAgKiBAYWthIEVkaXQuQ2lyY2xlXHJcbiAgICAgKiBAaW5oZXJpdHMgTC5FZGl0LkNpcmNsZU1hcmtlclxyXG4gICAgICovXHJcbiAgICBMLkVkaXQuQ2lyY2xlID0gTC5FZGl0LkNpcmNsZU1hcmtlci5leHRlbmQoe1xyXG5cclxuICAgICAgICBfY3JlYXRlUmVzaXplTWFya2VyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLl9zaGFwZS5nZXRMYXRMbmcoKSxcclxuICAgICAgICAgICAgICAgIHJlc2l6ZW1hcmtlclBvaW50ID0gdGhpcy5fZ2V0UmVzaXplTWFya2VyUG9pbnQoY2VudGVyKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZU1hcmtlcnMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5fcmVzaXplTWFya2Vycy5wdXNoKHRoaXMuX2NyZWF0ZU1hcmtlcihyZXNpemVtYXJrZXJQb2ludCwgdGhpcy5vcHRpb25zLnJlc2l6ZUljb24pKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZ2V0UmVzaXplTWFya2VyUG9pbnQ6IGZ1bmN0aW9uIChsYXRsbmcpIHtcclxuICAgICAgICAgICAgLy8gRnJvbSBMLnNoYXBlLmdldEJvdW5kcygpXHJcbiAgICAgICAgICAgIHZhciBkZWx0YSA9IHRoaXMuX3NoYXBlLl9yYWRpdXMgKiBNYXRoLmNvcyhNYXRoLlBJIC8gNCksXHJcbiAgICAgICAgICAgICAgICBwb2ludCA9IHRoaXMuX21hcC5wcm9qZWN0KGxhdGxuZyk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXAudW5wcm9qZWN0KFtwb2ludC54ICsgZGVsdGEsIHBvaW50LnkgLSBkZWx0YV0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9yZXNpemU6IGZ1bmN0aW9uIChsYXRsbmcpIHtcclxuICAgICAgICAgICAgdmFyIG1vdmVMYXRMbmcgPSB0aGlzLl9tb3ZlTWFya2VyLmdldExhdExuZygpLFxyXG4gICAgICAgICAgICAgICAgcmFkaXVzID0gdGhpcy5fbWFwLmRpc3RhbmNlKG1vdmVMYXRMbmcsIGxhdGxuZyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zaGFwZS5zZXRSYWRpdXMocmFkaXVzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5FRElUUkVTSVpFLCB7bGF5ZXI6IHRoaXMuX3NoYXBlfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgTC5DaXJjbGUuYWRkSW5pdEhvb2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmIChMLkVkaXQuQ2lyY2xlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdGluZyA9IG5ldyBMLkVkaXQuQ2lyY2xlKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0aW5nLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uKCdhZGQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRpbmcgJiYgdGhpcy5lZGl0aW5nLmVuYWJsZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0aW5nLmFkZEhvb2tzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5vbigncmVtb3ZlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0aW5nICYmIHRoaXMuZWRpdGluZy5lbmFibGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdGluZy5yZW1vdmVIb29rcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgTC5NYXAubWVyZ2VPcHRpb25zKHtcclxuICAgICAgICB0b3VjaEV4dGVuZDogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5NYXAuVG91Y2hFeHRlbmRcclxuICAgICAqIEBha2EgVG91Y2hFeHRlbmRcclxuICAgICAqL1xyXG4gICAgTC5NYXAuVG91Y2hFeHRlbmQgPSBMLkhhbmRsZXIuZXh0ZW5kKHtcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKCk6IHZvaWRcclxuICAgICAgICAvLyBTZXRzIFRvdWNoRXh0ZW5kIHByaXZhdGUgYWNjZXNzb3IgdmFyaWFibGVzXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG1hcCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IG1hcC5fY29udGFpbmVyO1xyXG4gICAgICAgICAgICB0aGlzLl9wYW5lID0gbWFwLl9wYW5lcy5vdmVybGF5UGFuZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGFkZEhvb2tzKCk6IHZvaWRcclxuICAgICAgICAvLyBBZGRzIGRvbSBsaXN0ZW5lciBldmVudHMgdG8gdGhlIG1hcCBjb250YWluZXJcclxuICAgICAgICBhZGRIb29rczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBMLkRvbUV2ZW50Lm9uKHRoaXMuX2NvbnRhaW5lciwgJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblRvdWNoU3RhcnQsIHRoaXMpO1xyXG4gICAgICAgICAgICBMLkRvbUV2ZW50Lm9uKHRoaXMuX2NvbnRhaW5lciwgJ3RvdWNoZW5kJywgdGhpcy5fb25Ub3VjaEVuZCwgdGhpcyk7XHJcbiAgICAgICAgICAgIEwuRG9tRXZlbnQub24odGhpcy5fY29udGFpbmVyLCAndG91Y2htb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUsIHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGV0ZWN0SUUoKSkge1xyXG4gICAgICAgICAgICAgICAgTC5Eb21FdmVudC5vbih0aGlzLl9jb250YWluZXIsICdNU1BvaW50ZXJEb3duJywgdGhpcy5fb25Ub3VjaFN0YXJ0LCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQub24odGhpcy5fY29udGFpbmVyLCAnTVNQb2ludGVyVXAnLCB0aGlzLl9vblRvdWNoRW5kLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQub24odGhpcy5fY29udGFpbmVyLCAnTVNQb2ludGVyTW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQub24odGhpcy5fY29udGFpbmVyLCAnTVNQb2ludGVyQ2FuY2VsJywgdGhpcy5fb25Ub3VjaENhbmNlbCwgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgTC5Eb21FdmVudC5vbih0aGlzLl9jb250YWluZXIsICd0b3VjaGNhbmNlbCcsIHRoaXMuX29uVG91Y2hDYW5jZWwsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgTC5Eb21FdmVudC5vbih0aGlzLl9jb250YWluZXIsICd0b3VjaGxlYXZlJywgdGhpcy5fb25Ub3VjaExlYXZlLCB0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgcmVtb3ZlSG9va3MoKTogdm9pZFxyXG4gICAgICAgIC8vIFJlbW92ZXMgZG9tIGxpc3RlbmVyIGV2ZW50cyBmcm9tIHRoZSBtYXAgY29udGFpbmVyXHJcbiAgICAgICAgcmVtb3ZlSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgTC5Eb21FdmVudC5vZmYodGhpcy5fY29udGFpbmVyLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2hTdGFydCk7XHJcbiAgICAgICAgICAgIEwuRG9tRXZlbnQub2ZmKHRoaXMuX2NvbnRhaW5lciwgJ3RvdWNoZW5kJywgdGhpcy5fb25Ub3VjaEVuZCk7XHJcbiAgICAgICAgICAgIEwuRG9tRXZlbnQub2ZmKHRoaXMuX2NvbnRhaW5lciwgJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RldGVjdElFKCkpIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQub2ZmKHRoaXMuX2NvbnRhaW5lciwgJ01TUG9pbnRlckRvd20nLCB0aGlzLl9vblRvdWNoU3RhcnQpO1xyXG4gICAgICAgICAgICAgICAgTC5Eb21FdmVudC5vZmYodGhpcy5fY29udGFpbmVyLCAnTVNQb2ludGVyVXAnLCB0aGlzLl9vblRvdWNoRW5kKTtcclxuICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQub2ZmKHRoaXMuX2NvbnRhaW5lciwgJ01TUG9pbnRlck1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XHJcbiAgICAgICAgICAgICAgICBMLkRvbUV2ZW50Lm9mZih0aGlzLl9jb250YWluZXIsICdNU1BvaW50ZXJDYW5jZWwnLCB0aGlzLl9vblRvdWNoQ2FuY2VsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQub2ZmKHRoaXMuX2NvbnRhaW5lciwgJ3RvdWNoY2FuY2VsJywgdGhpcy5fb25Ub3VjaENhbmNlbCk7XHJcbiAgICAgICAgICAgICAgICBMLkRvbUV2ZW50Lm9mZih0aGlzLl9jb250YWluZXIsICd0b3VjaGxlYXZlJywgdGhpcy5fb25Ub3VjaExlYXZlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF90b3VjaEV2ZW50OiBmdW5jdGlvbiAoZSwgdHlwZSkge1xyXG4gICAgICAgICAgICAvLyAjVE9ETzogZml4IHRoZSBwYWdlWCBlcnJvciB0aGF0IGlzIGRvIGEgYnVnIGluIEFuZHJvaWQgd2hlcmUgYSBzaW5nbGUgdG91Y2ggdHJpZ2dlcnMgdHdvIGNsaWNrIGV2ZW50c1xyXG4gICAgICAgICAgICAvLyBfZmlsdGVyQ2xpY2sgaXMgd2hhdCBsZWFmbGV0IHVzZXMgYXMgYSB3b3JrYXJvdW5kLlxyXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgcHJvYmxlbSB3aXRoIG1vcmUgdGhpbmdzIHRoYW4ganVzdCBhbmRyb2lkLiBBbm90aGVyIHByb2JsZW0gaXMgdG91Y2hFbmQgaGFzIG5vIHRvdWNoZXMgaW5cclxuICAgICAgICAgICAgLy8gaXRzIHRvdWNoIGxpc3QuXHJcbiAgICAgICAgICAgIHZhciB0b3VjaEV2ZW50ID0ge307XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZS50b3VjaGVzICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlLnRvdWNoZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdG91Y2hFdmVudCA9IGUudG91Y2hlc1swXTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlLnBvaW50ZXJUeXBlID09PSAndG91Y2gnKSB7XHJcbiAgICAgICAgICAgICAgICB0b3VjaEV2ZW50ID0gZTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZmlsdGVyQ2xpY2soZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXJQb2ludCA9IHRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0b3VjaEV2ZW50KSxcclxuICAgICAgICAgICAgICAgIGxheWVyUG9pbnQgPSB0aGlzLl9tYXAubW91c2VFdmVudFRvTGF5ZXJQb2ludCh0b3VjaEV2ZW50KSxcclxuICAgICAgICAgICAgICAgIGxhdGxuZyA9IHRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcobGF5ZXJQb2ludCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZSh0eXBlLCB7XHJcbiAgICAgICAgICAgICAgICBsYXRsbmc6IGxhdGxuZyxcclxuICAgICAgICAgICAgICAgIGxheWVyUG9pbnQ6IGxheWVyUG9pbnQsXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJQb2ludDogY29udGFpbmVyUG9pbnQsXHJcbiAgICAgICAgICAgICAgICBwYWdlWDogdG91Y2hFdmVudC5wYWdlWCxcclxuICAgICAgICAgICAgICAgIHBhZ2VZOiB0b3VjaEV2ZW50LnBhZ2VZLFxyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKiogQm9ycm93ZWQgZnJvbSBMZWFmbGV0IGFuZCBtb2RpZmllZCBmb3IgYm9vbCBvcHMgKiovXHJcbiAgICAgICAgX2ZpbHRlckNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgdGltZVN0YW1wID0gKGUudGltZVN0YW1wIHx8IGUub3JpZ2luYWxFdmVudC50aW1lU3RhbXApLFxyXG4gICAgICAgICAgICAgICAgZWxhcHNlZCA9IEwuRG9tRXZlbnQuX2xhc3RDbGljayAmJiAodGltZVN0YW1wIC0gTC5Eb21FdmVudC5fbGFzdENsaWNrKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGFyZSB0aGV5IGNsb3NlciB0b2dldGhlciB0aGFuIDUwMG1zIHlldCBtb3JlIHRoYW4gMTAwbXM/XHJcbiAgICAgICAgICAgIC8vIEFuZHJvaWQgdHlwaWNhbGx5IHRyaWdnZXJzIHRoZW0gfjMwMG1zIGFwYXJ0IHdoaWxlIG11bHRpcGxlIGxpc3RlbmVyc1xyXG4gICAgICAgICAgICAvLyBvbiB0aGUgc2FtZSBldmVudCBzaG91bGQgYmUgdHJpZ2dlcmVkIGZhciBmYXN0ZXI7XHJcbiAgICAgICAgICAgIC8vIG9yIGNoZWNrIGlmIGNsaWNrIGlzIHNpbXVsYXRlZCBvbiB0aGUgZWxlbWVudCwgYW5kIGlmIGl0IGlzLCByZWplY3QgYW55IG5vbi1zaW11bGF0ZWQgZXZlbnRzXHJcbiAgICAgICAgICAgIGlmICgoZWxhcHNlZCAmJiBlbGFwc2VkID4gMTAwICYmIGVsYXBzZWQgPCA1MDApIHx8IChlLnRhcmdldC5fc2ltdWxhdGVkQ2xpY2sgJiYgIWUuX3NpbXVsYXRlZCkpIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQuc3RvcChlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBMLkRvbUV2ZW50Ll9sYXN0Q2xpY2sgPSB0aW1lU3RhbXA7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vblRvdWNoU3RhcnQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fbWFwLl9sb2FkZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHR5cGUgPSAndG91Y2hzdGFydCc7XHJcbiAgICAgICAgICAgIHRoaXMuX3RvdWNoRXZlbnQoZSwgdHlwZSk7XHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vblRvdWNoRW5kOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX21hcC5fbG9hZGVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciB0eXBlID0gJ3RvdWNoZW5kJztcclxuICAgICAgICAgICAgdGhpcy5fdG91Y2hFdmVudChlLCB0eXBlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Ub3VjaENhbmNlbDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9tYXAuX2xvYWRlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgdHlwZSA9ICd0b3VjaGNhbmNlbCc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZXRlY3RJRSgpKSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlID0gJ3BvaW50ZXJjYW5jZWwnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3RvdWNoRXZlbnQoZSwgdHlwZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uVG91Y2hMZWF2ZTogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9tYXAuX2xvYWRlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgdHlwZSA9ICd0b3VjaGxlYXZlJztcclxuICAgICAgICAgICAgdGhpcy5fdG91Y2hFdmVudChlLCB0eXBlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Ub3VjaE1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fbWFwLl9sb2FkZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHR5cGUgPSAndG91Y2htb3ZlJztcclxuICAgICAgICAgICAgdGhpcy5fdG91Y2hFdmVudChlLCB0eXBlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZGV0ZWN0SUU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XHJcblxyXG4gICAgICAgICAgICB2YXIgbXNpZSA9IHVhLmluZGV4T2YoJ01TSUUgJyk7XHJcbiAgICAgICAgICAgIGlmIChtc2llID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gSUUgMTAgb3Igb2xkZXIgPT4gcmV0dXJuIHZlcnNpb24gbnVtYmVyXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodWEuc3Vic3RyaW5nKG1zaWUgKyA1LCB1YS5pbmRleE9mKCcuJywgbXNpZSkpLCAxMCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciB0cmlkZW50ID0gdWEuaW5kZXhPZignVHJpZGVudC8nKTtcclxuICAgICAgICAgICAgaWYgKHRyaWRlbnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJRSAxMSA9PiByZXR1cm4gdmVyc2lvbiBudW1iZXJcclxuICAgICAgICAgICAgICAgIHZhciBydiA9IHVhLmluZGV4T2YoJ3J2OicpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHVhLnN1YnN0cmluZyhydiArIDMsIHVhLmluZGV4T2YoJy4nLCBydikpLCAxMCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBlZGdlID0gdWEuaW5kZXhPZignRWRnZS8nKTtcclxuICAgICAgICAgICAgaWYgKGVkZ2UgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJRSAxMiA9PiByZXR1cm4gdmVyc2lvbiBudW1iZXJcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh1YS5zdWJzdHJpbmcoZWRnZSArIDUsIHVhLmluZGV4T2YoJy4nLCBlZGdlKSksIDEwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gb3RoZXIgYnJvd3NlclxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgTC5NYXAuYWRkSW5pdEhvb2soJ2FkZEhhbmRsZXInLCAndG91Y2hFeHRlbmQnLCBMLk1hcC5Ub3VjaEV4dGVuZCk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuTWFya2VyLlRvdWNoXHJcbiAgICAgKiBAYWthIE1hcmtlci5Ub3VjaFxyXG4gICAgICpcclxuICAgICAqIFRoaXMgaXNuJ3QgZnVsbCBUb3VjaCBzdXBwb3J0LiBUaGlzIGlzIGp1c3QgdG8gZ2V0IG1hcmtlcnMgdG8gYWxzbyBzdXBwb3J0IGRvbSB0b3VjaCBldmVudHMgYWZ0ZXIgY3JlYXRpb25cclxuICAgICAqICNUT0RPOiBmaW5kIGEgYmV0dGVyIHdheSBvZiBnZXR0aW5nIG1hcmtlcnMgdG8gc3VwcG9ydCB0b3VjaC5cclxuICAgICAqL1xyXG4gICAgTC5NYXJrZXIuVG91Y2ggPSBMLk1hcmtlci5leHRlbmQoe1xyXG5cclxuICAgICAgICBfaW5pdEludGVyYWN0aW9uOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5hZGRJbnRlcmFjdGl2ZVRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgLy8gMC43Lnggc3VwcG9ydFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRJbnRlcmFjdGlvbkxlZ2FjeSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFRPRE8gdGhpcyBtYXkgbmVlZCBiZSB1cGRhdGVkIHRvIHJlLWFkZCB0b3VjaCBldmVudHMgZm9yIDEuMCtcclxuICAgICAgICAgICAgcmV0dXJuIEwuTWFya2VyLnByb3RvdHlwZS5faW5pdEludGVyYWN0aW9uLmFwcGx5KHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIFRoaXMgaXMgYW4gZXhhY3QgY29weSBvZiBodHRwczovL2dpdGh1Yi5jb20vTGVhZmxldC9MZWFmbGV0L2Jsb2IvdjAuNy9zcmMvbGF5ZXIvbWFya2VyL01hcmtlci5qc1xyXG4gICAgICAgIC8vIHdpdGggdGhlIGFkZGl0aW9uIG9mIHRoZSB0b3VjaCBldmVudHNcclxuICAgICAgICBfaW5pdEludGVyYWN0aW9uTGVnYWN5OiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5jbGlja2FibGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVE9ETyByZWZhY3RvciBpbnRvIHNvbWV0aGluZyBzaGFyZWQgd2l0aCBNYXAvUGF0aC9ldGMuIHRvIERSWSBpdCB1cFxyXG5cclxuICAgICAgICAgICAgdmFyIGljb24gPSB0aGlzLl9pY29uLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRzID0gWydkYmxjbGljaycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ21vdXNlZG93bicsXHJcbiAgICAgICAgICAgICAgICAgICAgJ21vdXNlb3ZlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgJ21vdXNlb3V0JyxcclxuICAgICAgICAgICAgICAgICAgICAnY29udGV4dG1lbnUnLFxyXG4gICAgICAgICAgICAgICAgICAgICd0b3VjaHN0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICAndG91Y2hlbmQnLFxyXG4gICAgICAgICAgICAgICAgICAgICd0b3VjaG1vdmUnXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RldGVjdElFKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudHMuY29uY2F0KFsnTVNQb2ludGVyRG93bicsXHJcbiAgICAgICAgICAgICAgICAgICAgJ01TUG9pbnRlclVwJyxcclxuICAgICAgICAgICAgICAgICAgICAnTVNQb2ludGVyTW92ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgJ01TUG9pbnRlckNhbmNlbCddKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50cy5jb25jYXQoWyd0b3VjaGNhbmNlbCddKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKGljb24sICdsZWFmbGV0LWNsaWNrYWJsZScpO1xyXG4gICAgICAgICAgICBMLkRvbUV2ZW50Lm9uKGljb24sICdjbGljaycsIHRoaXMuX29uTW91c2VDbGljaywgdGhpcyk7XHJcbiAgICAgICAgICAgIEwuRG9tRXZlbnQub24oaWNvbiwgJ2tleXByZXNzJywgdGhpcy5fb25LZXlQcmVzcywgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgTC5Eb21FdmVudC5vbihpY29uLCBldmVudHNbaV0sIHRoaXMuX2ZpcmVNb3VzZUV2ZW50LCB0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKEwuSGFuZGxlci5NYXJrZXJEcmFnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdnaW5nID0gbmV3IEwuSGFuZGxlci5NYXJrZXJEcmFnKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnZ2luZy5lbmFibGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9kZXRlY3RJRTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcclxuXHJcbiAgICAgICAgICAgIHZhciBtc2llID0gdWEuaW5kZXhPZignTVNJRSAnKTtcclxuICAgICAgICAgICAgaWYgKG1zaWUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJRSAxMCBvciBvbGRlciA9PiByZXR1cm4gdmVyc2lvbiBudW1iZXJcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh1YS5zdWJzdHJpbmcobXNpZSArIDUsIHVhLmluZGV4T2YoJy4nLCBtc2llKSksIDEwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHRyaWRlbnQgPSB1YS5pbmRleE9mKCdUcmlkZW50LycpO1xyXG4gICAgICAgICAgICBpZiAodHJpZGVudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIElFIDExID0+IHJldHVybiB2ZXJzaW9uIG51bWJlclxyXG4gICAgICAgICAgICAgICAgdmFyIHJ2ID0gdWEuaW5kZXhPZigncnY6Jyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodWEuc3Vic3RyaW5nKHJ2ICsgMywgdWEuaW5kZXhPZignLicsIHJ2KSksIDEwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGVkZ2UgPSB1YS5pbmRleE9mKCdFZGdlLycpO1xyXG4gICAgICAgICAgICBpZiAoZWRnZSA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIElFIDEyID0+IHJldHVybiB2ZXJzaW9uIG51bWJlclxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHVhLnN1YnN0cmluZyhlZGdlICsgNSwgdWEuaW5kZXhPZignLicsIGVkZ2UpKSwgMTApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBvdGhlciBicm93c2VyXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5MYXRMbmdVdGlsXHJcbiAgICAgKiBAYWthIExhdExuZ1V0aWxcclxuICAgICAqL1xyXG4gICAgTC5MYXRMbmdVdGlsID0ge1xyXG4gICAgICAgIC8vIENsb25lcyBhIExhdExuZ3NbXSwgcmV0dXJucyBbXVtdXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgY2xvbmVMYXRMbmdzKExhdExuZ3NbXSk6IEwuTGF0TG5nc1tdXHJcbiAgICAgICAgLy8gQ2xvbmUgdGhlIGxhdExuZyBwb2ludCBvciBwb2ludHMgb3IgbmVzdGVkIHBvaW50cyBhbmQgcmV0dXJuIGFuIGFycmF5IHdpdGggdGhvc2UgcG9pbnRzXHJcbiAgICAgICAgY2xvbmVMYXRMbmdzOiBmdW5jdGlvbiAobGF0bG5ncykge1xyXG4gICAgICAgICAgICB2YXIgY2xvbmUgPSBbXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsYXRsbmdzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG5lc3RlZCBhcnJheSAoUG9seWxpbmUvUG9seWdvbilcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxhdGxuZ3NbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xvbmUucHVzaChMLkxhdExuZ1V0aWwuY2xvbmVMYXRMbmdzKGxhdGxuZ3NbaV0pKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xvbmUucHVzaCh0aGlzLmNsb25lTGF0TG5nKGxhdGxuZ3NbaV0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY2xvbmU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBjbG9uZUxhdExuZyhMYXRMbmcpOiBMLkxhdExuZ1xyXG4gICAgICAgIC8vIENsb25lIHRoZSBsYXRMbmcgYW5kIHJldHVybiBhIG5ldyBMYXRMbmcgb2JqZWN0LlxyXG4gICAgICAgIGNsb25lTGF0TG5nOiBmdW5jdGlvbiAobGF0bG5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBMLmxhdExuZyhsYXRsbmcubGF0LCBsYXRsbmcubG5nKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICB2YXIgZGVmYXVsdFByZWNpc2lvbiA9IHtcclxuICAgICAgICAgICAga206IDIsXHJcbiAgICAgICAgICAgIGhhOiAyLFxyXG4gICAgICAgICAgICBtOiAwLFxyXG4gICAgICAgICAgICBtaTogMixcclxuICAgICAgICAgICAgYWM6IDIsXHJcbiAgICAgICAgICAgIHlkOiAwLFxyXG4gICAgICAgICAgICBmdDogMCxcclxuICAgICAgICAgICAgbm06IDJcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNsYXNzIEwuR2VvbWV0cnlVdGlsXHJcbiAgICAgICAgICogQGFrYSBHZW9tZXRyeVV0aWxcclxuICAgICAgICAgKi9cclxuICAgICAgICBMLkdlb21ldHJ5VXRpbCA9IEwuZXh0ZW5kKEwuR2VvbWV0cnlVdGlsIHx8IHt9LCB7XHJcbiAgICAgICAgICAgIC8vIFBvcnRlZCBmcm9tIHRoZSBPcGVuTGF5ZXJzIGltcGxlbWVudGF0aW9uLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL29wZW5sYXllcnMvb3BlbmxheWVycy9ibG9iL21hc3Rlci9saWIvT3BlbkxheWVycy9HZW9tZXRyeS9MaW5lYXJSaW5nLmpzI0wyNzBcclxuXHJcbiAgICAgICAgICAgIC8vIEBtZXRob2QgZ2VvZGVzaWNBcmVhKCk6IG51bWJlclxyXG4gICAgICAgICAgICBnZW9kZXNpY0FyZWE6IGZ1bmN0aW9uIChsYXRMbmdzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcG9pbnRzQ291bnQgPSBsYXRMbmdzLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICBhcmVhID0gMC4wLFxyXG4gICAgICAgICAgICAgICAgICAgIGQyciA9IE1hdGguUEkgLyAxODAsXHJcbiAgICAgICAgICAgICAgICAgICAgcDEsIHAyO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwb2ludHNDb3VudCA+IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50c0NvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcDEgPSBsYXRMbmdzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwMiA9IGxhdExuZ3NbKGkgKyAxKSAlIHBvaW50c0NvdW50XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJlYSArPSAoKHAyLmxuZyAtIHAxLmxuZykgKiBkMnIpICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyICsgTWF0aC5zaW4ocDEubGF0ICogZDJyKSArIE1hdGguc2luKHAyLmxhdCAqIGQycikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBhcmVhID0gYXJlYSAqIDYzNzgxMzcuMCAqIDYzNzgxMzcuMCAvIDIuMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMoYXJlYSk7XHJcbiAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAvLyBAbWV0aG9kIGZvcm1hdHRlZE51bWJlcihuLCBwcmVjaXNpb24pOiBzdHJpbmdcclxuICAgICAgICAgICAgLy8gUmV0dXJucyBuIGluIHNwZWNpZmllZCBudW1iZXIgZm9ybWF0IChpZiBkZWZpbmVkKSBhbmQgcHJlY2lzaW9uXHJcbiAgICAgICAgICAgIGZvcm1hdHRlZE51bWJlcjogZnVuY3Rpb24gKG4sIHByZWNpc2lvbikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvcm1hdHRlZCA9IHBhcnNlRmxvYXQobikudG9GaXhlZChwcmVjaXNpb24pLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEwuZHJhd0xvY2FsLmZvcm1hdCAmJiBMLmRyYXdMb2NhbC5mb3JtYXQubnVtZXJpYyxcclxuICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXJzID0gZm9ybWF0ICYmIGZvcm1hdC5kZWxpbWl0ZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgIHRob3VzYW5kcyA9IGRlbGltaXRlcnMgJiYgZGVsaW1pdGVycy50aG91c2FuZHMsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVjaW1hbCA9IGRlbGltaXRlcnMgJiYgZGVsaW1pdGVycy5kZWNpbWFsO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aG91c2FuZHMgfHwgZGVjaW1hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzcGxpdFZhbHVlID0gZm9ybWF0dGVkLnNwbGl0KCcuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkID0gdGhvdXNhbmRzID8gc3BsaXRWYWx1ZVswXS5yZXBsYWNlKC8oXFxkKSg/PShcXGR7M30pKyg/IVxcZCkpL2csICckMScgKyB0aG91c2FuZHMpIDogc3BsaXRWYWx1ZVswXTtcclxuICAgICAgICAgICAgICAgICAgICBkZWNpbWFsID0gZGVjaW1hbCB8fCAnLic7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0VmFsdWUubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQgKyBkZWNpbWFsICsgc3BsaXRWYWx1ZVsxXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlZDtcclxuICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIC8vIEBtZXRob2QgcmVhZGFibGVBcmVhKGFyZWEsIGlzTWV0cmljLCBwcmVjaXNpb24pOiBzdHJpbmdcclxuICAgICAgICAgICAgLy8gUmV0dXJucyBhIHJlYWRhYmxlIGFyZWEgc3RyaW5nIGluIHlhcmRzIG9yIG1ldHJpYy5cclxuICAgICAgICAgICAgLy8gVGhlIHZhbHVlIHdpbGwgYmUgcm91bmRlZCBhcyBkZWZpbmVkIGJ5IHRoZSBwcmVjaXNpb24gb3B0aW9uIG9iamVjdC5cclxuICAgICAgICAgICAgcmVhZGFibGVBcmVhOiBmdW5jdGlvbiAoYXJlYSwgaXNNZXRyaWMsIHByZWNpc2lvbikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGFyZWFTdHIsXHJcbiAgICAgICAgICAgICAgICAgICAgdW5pdHMsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uID0gTC5VdGlsLmV4dGVuZCh7fSwgZGVmYXVsdFByZWNpc2lvbiwgcHJlY2lzaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNNZXRyaWMpIHtcclxuICAgICAgICAgICAgICAgICAgICB1bml0cyA9IFsnaGEnLCAnbSddO1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlb2YgaXNNZXRyaWM7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzID0gW2lzTWV0cmljXTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdib29sZWFuJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0cyA9IGlzTWV0cmljO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZWEgPj0gMTAwMDAwMCAmJiB1bml0cy5pbmRleE9mKCdrbScpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmVhU3RyID0gTC5HZW9tZXRyeVV0aWwuZm9ybWF0dGVkTnVtYmVyKGFyZWEgKiAwLjAwMDAwMSwgcHJlY2lzaW9uWydrbSddKSArICcga23Csic7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmVhID49IDEwMDAwICYmIHVuaXRzLmluZGV4T2YoJ2hhJykgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHIgPSBMLkdlb21ldHJ5VXRpbC5mb3JtYXR0ZWROdW1iZXIoYXJlYSAqIDAuMDAwMSwgcHJlY2lzaW9uWydoYSddKSArICcgaGEnO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHIgPSBMLkdlb21ldHJ5VXRpbC5mb3JtYXR0ZWROdW1iZXIoYXJlYSwgcHJlY2lzaW9uWydtJ10pICsgJyBtwrInO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYSAvPSAwLjgzNjEyNzsgLy8gU3F1YXJlIHlhcmRzIGluIDEgbWV0ZXJcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZWEgPj0gMzA5NzYwMCkgeyAvLzMwOTc2MDAgc3F1YXJlIHlhcmRzIGluIDEgc3F1YXJlIG1pbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJlYVN0ciA9IEwuR2VvbWV0cnlVdGlsLmZvcm1hdHRlZE51bWJlcihhcmVhIC8gMzA5NzYwMCwgcHJlY2lzaW9uWydtaSddKSArICcgbWnCsic7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmVhID49IDQ4NDApIHsgLy80ODQwIHNxdWFyZSB5YXJkcyBpbiAxIGFjcmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJlYVN0ciA9IEwuR2VvbWV0cnlVdGlsLmZvcm1hdHRlZE51bWJlcihhcmVhIC8gNDg0MCwgcHJlY2lzaW9uWydhYyddKSArICcgYWNyZXMnO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHIgPSBMLkdlb21ldHJ5VXRpbC5mb3JtYXR0ZWROdW1iZXIoYXJlYSwgcHJlY2lzaW9uWyd5ZCddKSArICcgeWTCsic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBhcmVhU3RyO1xyXG4gICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgLy8gQG1ldGhvZCByZWFkYWJsZURpc3RhbmNlKGRpc3RhbmNlLCB1bml0cyk6IHN0cmluZ1xyXG4gICAgICAgICAgICAvLyBDb252ZXJ0cyBhIG1ldHJpYyBkaXN0YW5jZSB0byBvbmUgb2YgWyBmZWV0LCBuYXV0aWNhbE1pbGUsIG1ldHJpYyBvciB5YXJkcyBdIHN0cmluZ1xyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAvLyBAYWx0ZXJuYXRpdmVcclxuICAgICAgICAgICAgLy8gQG1ldGhvZCByZWFkYWJsZURpc3RhbmNlKGRpc3RhbmNlLCBpc01ldHJpYywgdXNlRmVldCwgaXNOYXV0aWNhbE1pbGUsIHByZWNpc2lvbik6IHN0cmluZ1xyXG4gICAgICAgICAgICAvLyBDb252ZXJ0cyBtZXRyaWMgZGlzdGFuY2UgdG8gZGlzdGFuY2Ugc3RyaW5nLlxyXG4gICAgICAgICAgICAvLyBUaGUgdmFsdWUgd2lsbCBiZSByb3VuZGVkIGFzIGRlZmluZWQgYnkgdGhlIHByZWNpc2lvbiBvcHRpb24gb2JqZWN0LlxyXG4gICAgICAgICAgICByZWFkYWJsZURpc3RhbmNlOiBmdW5jdGlvbiAoZGlzdGFuY2UsIGlzTWV0cmljLCBpc0ZlZXQsIGlzTmF1dGljYWxNaWxlLCBwcmVjaXNpb24pIHtcclxuICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZVN0cixcclxuICAgICAgICAgICAgICAgICAgICB1bml0cyxcclxuICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24gPSBMLlV0aWwuZXh0ZW5kKHt9LCBkZWZhdWx0UHJlY2lzaW9uLCBwcmVjaXNpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpc01ldHJpYykge1xyXG4gICAgICAgICAgICAgICAgICAgIHVuaXRzID0gdHlwZW9mIGlzTWV0cmljID09ICdzdHJpbmcnID8gaXNNZXRyaWMgOiAnbWV0cmljJztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNGZWV0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW5pdHMgPSAnZmVldCc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTmF1dGljYWxNaWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW5pdHMgPSAnbmF1dGljYWxNaWxlJztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW5pdHMgPSAneWFyZHMnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHN3aXRjaCAodW5pdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdtZXRyaWMnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG93IG1ldHJlcyB3aGVuIGRpc3RhbmNlIGlzIDwgMWttLCB0aGVuIHNob3cga21cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlID4gMTAwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VTdHIgPSBMLkdlb21ldHJ5VXRpbC5mb3JtYXR0ZWROdW1iZXIoZGlzdGFuY2UgLyAxMDAwLCBwcmVjaXNpb25bJ2ttJ10pICsgJyBrbSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZVN0ciA9IEwuR2VvbWV0cnlVdGlsLmZvcm1hdHRlZE51bWJlcihkaXN0YW5jZSwgcHJlY2lzaW9uWydtJ10pICsgJyBtJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdmZWV0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgKj0gMS4wOTM2MSAqIDM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlU3RyID0gTC5HZW9tZXRyeVV0aWwuZm9ybWF0dGVkTnVtYmVyKGRpc3RhbmNlLCBwcmVjaXNpb25bJ2Z0J10pICsgJyBmdCc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICduYXV0aWNhbE1pbGUnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSAqPSAwLjUzOTk2O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZVN0ciA9IEwuR2VvbWV0cnlVdGlsLmZvcm1hdHRlZE51bWJlcihkaXN0YW5jZSAvIDEwMDAsIHByZWNpc2lvblsnbm0nXSkgKyAnIG5tJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAneWFyZHMnOlxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlICo9IDEuMDkzNjE7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPiAxNzYwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZVN0ciA9IEwuR2VvbWV0cnlVdGlsLmZvcm1hdHRlZE51bWJlcihkaXN0YW5jZSAvIDE3NjAsIHByZWNpc2lvblsnbWknXSkgKyAnIG1pbGVzJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlU3RyID0gTC5HZW9tZXRyeVV0aWwuZm9ybWF0dGVkTnVtYmVyKGRpc3RhbmNlLCBwcmVjaXNpb25bJ3lkJ10pICsgJyB5ZCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdGFuY2VTdHI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9KSgpO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkxpbmVVdGlsXHJcbiAgICAgKiBAYWthIFV0aWxcclxuICAgICAqIEBha2EgTC5VdGlsc1xyXG4gICAgICovXHJcbiAgICBMLlV0aWwuZXh0ZW5kKEwuTGluZVV0aWwsIHtcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBzZWdtZW50c0ludGVyc2VjdCgpOiBib29sZWFuXHJcbiAgICAgICAgLy8gQ2hlY2tzIHRvIHNlZSBpZiB0d28gbGluZSBzZWdtZW50cyBpbnRlcnNlY3QuIERvZXMgbm90IGhhbmRsZSBkZWdlbmVyYXRlIGNhc2VzLlxyXG4gICAgICAgIC8vIGh0dHA6Ly9jb21wZ2VvbS5jcy51aXVjLmVkdS9+amVmZmUvdGVhY2hpbmcvMzczL25vdGVzL3gwNi1zd2VlcGxpbmUucGRmXHJcbiAgICAgICAgc2VnbWVudHNJbnRlcnNlY3Q6IGZ1bmN0aW9uICgvKlBvaW50Ki8gcCwgLypQb2ludCovIHAxLCAvKlBvaW50Ki8gcDIsIC8qUG9pbnQqLyBwMykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2hlY2tDb3VudGVyY2xvY2t3aXNlKHAsIHAyLCBwMykgIT09XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja0NvdW50ZXJjbG9ja3dpc2UocDEsIHAyLCBwMykgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrQ291bnRlcmNsb2Nrd2lzZShwLCBwMSwgcDIpICE9PVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tDb3VudGVyY2xvY2t3aXNlKHAsIHAxLCBwMyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHBvaW50cyBhcmUgaW4gY291bnRlcmNsb2Nrd2lzZSBvcmRlclxyXG4gICAgICAgIF9jaGVja0NvdW50ZXJjbG9ja3dpc2U6IGZ1bmN0aW9uICgvKlBvaW50Ki8gcCwgLypQb2ludCovIHAxLCAvKlBvaW50Ki8gcDIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChwMi55IC0gcC55KSAqIChwMS54IC0gcC54KSA+IChwMS55IC0gcC55KSAqIChwMi54IC0gcC54KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5Qb2x5bGluZVxyXG4gICAgICogQGFrYSBQb2x5bGluZVxyXG4gICAgICovXHJcbiAgICBMLlBvbHlsaW5lLmluY2x1ZGUoe1xyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGludGVyc2VjdHMoKTogYm9vbGVhblxyXG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIHBvbHlsaW5lIGhhcyBhbnkgbGluZXNlZ21lbnRzIHRoYXQgaW50ZXJzZWN0LlxyXG4gICAgICAgIC8vIE5PVEU6IGRvZXMgbm90IHN1cHBvcnQgZGV0ZWN0aW5nIGludGVyc2VjdGlvbiBmb3IgZGVnZW5lcmF0ZSBjYXNlcy5cclxuICAgICAgICBpbnRlcnNlY3RzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBwb2ludHMgPSB0aGlzLl9nZXRQcm9qZWN0ZWRQb2ludHMoKSxcclxuICAgICAgICAgICAgICAgIGxlbiA9IHBvaW50cyA/IHBvaW50cy5sZW5ndGggOiAwLFxyXG4gICAgICAgICAgICAgICAgaSwgcCwgcDE7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90b29GZXdQb2ludHNGb3JJbnRlcnNlY3Rpb24oKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDM7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgcCA9IHBvaW50c1tpIC0gMV07XHJcbiAgICAgICAgICAgICAgICBwMSA9IHBvaW50c1tpXTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xpbmVTZWdtZW50c0ludGVyc2VjdHNSYW5nZShwLCBwMSwgaSAtIDIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIG5ld0xhdExuZ0ludGVyc2VjdHMoKTogYm9vbGVhblxyXG4gICAgICAgIC8vIENoZWNrIGZvciBpbnRlcnNlY3Rpb24gaWYgbmV3IGxhdGxuZyB3YXMgYWRkZWQgdG8gdGhpcyBwb2x5bGluZS5cclxuICAgICAgICAvLyBOT1RFOiBkb2VzIG5vdCBzdXBwb3J0IGRldGVjdGluZyBpbnRlcnNlY3Rpb24gZm9yIGRlZ2VuZXJhdGUgY2FzZXMuXHJcbiAgICAgICAgbmV3TGF0TG5nSW50ZXJzZWN0czogZnVuY3Rpb24gKGxhdGxuZywgc2tpcEZpcnN0KSB7XHJcbiAgICAgICAgICAgIC8vIENhbm5vdCBjaGVjayBhIHBvbHlsaW5lIGZvciBpbnRlcnNlY3RpbmcgbGF0cy9sbmdzIHdoZW4gbm90IGFkZGVkIHRvIHRoZSBtYXBcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9tYXApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV3UG9pbnRJbnRlcnNlY3RzKHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQobGF0bG5nKSwgc2tpcEZpcnN0KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIG5ld1BvaW50SW50ZXJzZWN0cygpOiBib29sZWFuXHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGludGVyc2VjdGlvbiBpZiBuZXcgcG9pbnQgd2FzIGFkZGVkIHRvIHRoaXMgcG9seWxpbmUuXHJcbiAgICAgICAgLy8gbmV3UG9pbnQgbXVzdCBiZSBhIGxheWVyIHBvaW50LlxyXG4gICAgICAgIC8vIE5PVEU6IGRvZXMgbm90IHN1cHBvcnQgZGV0ZWN0aW5nIGludGVyc2VjdGlvbiBmb3IgZGVnZW5lcmF0ZSBjYXNlcy5cclxuICAgICAgICBuZXdQb2ludEludGVyc2VjdHM6IGZ1bmN0aW9uIChuZXdQb2ludCwgc2tpcEZpcnN0KSB7XHJcbiAgICAgICAgICAgIHZhciBwb2ludHMgPSB0aGlzLl9nZXRQcm9qZWN0ZWRQb2ludHMoKSxcclxuICAgICAgICAgICAgICAgIGxlbiA9IHBvaW50cyA/IHBvaW50cy5sZW5ndGggOiAwLFxyXG4gICAgICAgICAgICAgICAgbGFzdFBvaW50ID0gcG9pbnRzID8gcG9pbnRzW2xlbiAtIDFdIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBwcmV2aW91cyBsaW5lIHNlZ21lbnQuIFByZXZpb3VzIGxpbmUgc2VnbWVudCBkb2Vzbid0IG5lZWQgdGVzdGluZy5cclxuICAgICAgICAgICAgICAgIG1heEluZGV4ID0gbGVuIC0gMjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90b29GZXdQb2ludHNGb3JJbnRlcnNlY3Rpb24oMSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVTZWdtZW50c0ludGVyc2VjdHNSYW5nZShsYXN0UG9pbnQsIG5ld1BvaW50LCBtYXhJbmRleCwgc2tpcEZpcnN0ID8gMSA6IDApO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIFBvbHlsaW5lcyB3aXRoIDIgc2lkZXMgY2FuIG9ubHkgaW50ZXJzZWN0IGluIGNhc2VzIHdoZXJlIHBvaW50cyBhcmUgY29sbGluZWFyICh3ZSBkb24ndCBzdXBwb3J0IGRldGVjdGluZyB0aGVzZSkuXHJcbiAgICAgICAgLy8gQ2Fubm90IGhhdmUgaW50ZXJzZWN0aW9uIHdoZW4gPCAzIGxpbmUgc2VnbWVudHMgKDwgNCBwb2ludHMpXHJcbiAgICAgICAgX3Rvb0Zld1BvaW50c0ZvckludGVyc2VjdGlvbjogZnVuY3Rpb24gKGV4dHJhUG9pbnRzKSB7XHJcbiAgICAgICAgICAgIHZhciBwb2ludHMgPSB0aGlzLl9nZXRQcm9qZWN0ZWRQb2ludHMoKSxcclxuICAgICAgICAgICAgICAgIGxlbiA9IHBvaW50cyA/IHBvaW50cy5sZW5ndGggOiAwO1xyXG4gICAgICAgICAgICAvLyBJbmNyZW1lbnQgbGVuZ3RoIGJ5IGV4dHJhUG9pbnRzIGlmIHByZXNlbnRcclxuICAgICAgICAgICAgbGVuICs9IGV4dHJhUG9pbnRzIHx8IDA7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gIXBvaW50cyB8fCBsZW4gPD0gMztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBDaGVja3MgYSBsaW5lIHNlZ21lbnQgaW50ZXJzZWN0aW9ucyB3aXRoIGFueSBsaW5lIHNlZ21lbnRzIGJlZm9yZSBpdHMgcHJlZGVjZXNzb3IuXHJcbiAgICAgICAgLy8gRG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgcHJlZGVjZXNzb3IgYXMgd2lsbCBuZXZlciBpbnRlcnNlY3QuXHJcbiAgICAgICAgX2xpbmVTZWdtZW50c0ludGVyc2VjdHNSYW5nZTogZnVuY3Rpb24gKHAsIHAxLCBtYXhJbmRleCwgbWluSW5kZXgpIHtcclxuICAgICAgICAgICAgdmFyIHBvaW50cyA9IHRoaXMuX2dldFByb2plY3RlZFBvaW50cygpLFxyXG4gICAgICAgICAgICAgICAgcDIsIHAzO1xyXG5cclxuICAgICAgICAgICAgbWluSW5kZXggPSBtaW5JbmRleCB8fCAwO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2hlY2sgYWxsIHByZXZpb3VzIGxpbmUgc2VnbWVudHMgKGJlc2lkZSB0aGUgaW1tZWRpYXRlbHkgcHJldmlvdXMpIGZvciBpbnRlcnNlY3Rpb25zXHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSBtYXhJbmRleDsgaiA+IG1pbkluZGV4OyBqLS0pIHtcclxuICAgICAgICAgICAgICAgIHAyID0gcG9pbnRzW2ogLSAxXTtcclxuICAgICAgICAgICAgICAgIHAzID0gcG9pbnRzW2pdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChMLkxpbmVVdGlsLnNlZ21lbnRzSW50ZXJzZWN0KHAsIHAxLCBwMiwgcDMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZ2V0UHJvamVjdGVkUG9pbnRzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fZGVmYXVsdFNoYXBlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3JpZ2luYWxQb2ludHM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHBvaW50cyA9IFtdLFxyXG4gICAgICAgICAgICAgICAgX3NoYXBlID0gdGhpcy5fZGVmYXVsdFNoYXBlKCk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9zaGFwZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcG9pbnRzLnB1c2godGhpcy5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludChfc2hhcGVbaV0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcG9pbnRzO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLlBvbHlnb25cclxuICAgICAqIEBha2EgUG9seWdvblxyXG4gICAgICovXHJcbiAgICBMLlBvbHlnb24uaW5jbHVkZSh7XHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgaW50ZXJzZWN0cygpOiBib29sZWFuXHJcbiAgICAgICAgLy8gQ2hlY2tzIGEgcG9seWdvbiBmb3IgYW55IGludGVyc2VjdGluZyBsaW5lIHNlZ21lbnRzLiBJZ25vcmVzIGhvbGVzLlxyXG4gICAgICAgIGludGVyc2VjdHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHBvbHlsaW5lSW50ZXJzZWN0cyxcclxuICAgICAgICAgICAgICAgIHBvaW50cyA9IHRoaXMuX2dldFByb2plY3RlZFBvaW50cygpLFxyXG4gICAgICAgICAgICAgICAgbGVuLCBmaXJzdFBvaW50LCBsYXN0UG9pbnQsIG1heEluZGV4O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rvb0Zld1BvaW50c0ZvckludGVyc2VjdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHBvbHlsaW5lSW50ZXJzZWN0cyA9IEwuUG9seWxpbmUucHJvdG90eXBlLmludGVyc2VjdHMuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIGFscmVhZHkgZm91bmQgYW4gaW50ZXJzZWN0aW9uIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGFueSBtb3JlLlxyXG4gICAgICAgICAgICBpZiAocG9seWxpbmVJbnRlcnNlY3RzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGVuID0gcG9pbnRzLmxlbmd0aDtcclxuICAgICAgICAgICAgZmlyc3RQb2ludCA9IHBvaW50c1swXTtcclxuICAgICAgICAgICAgbGFzdFBvaW50ID0gcG9pbnRzW2xlbiAtIDFdO1xyXG4gICAgICAgICAgICBtYXhJbmRleCA9IGxlbiAtIDI7XHJcblxyXG4gICAgICAgICAgICAvLyBDaGVjayB0aGUgbGluZSBzZWdtZW50IGJldHdlZW4gbGFzdCBhbmQgZmlyc3QgcG9pbnQuIERvbid0IG5lZWQgdG8gY2hlY2sgdGhlIGZpcnN0IGxpbmUgc2VnbWVudCAobWluSW5kZXggPSAxKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbGluZVNlZ21lbnRzSW50ZXJzZWN0c1JhbmdlKGxhc3RQb2ludCwgZmlyc3RQb2ludCwgbWF4SW5kZXgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkNvbnRyb2wuRHJhd1xyXG4gICAgICogQGFrYSBMLkRyYXdcclxuICAgICAqL1xyXG4gICAgTC5Db250cm9sLkRyYXcgPSBMLkNvbnRyb2wuZXh0ZW5kKHtcclxuXHJcbiAgICAgICAgLy8gT3B0aW9uc1xyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgcG9zaXRpb246ICd0b3BsZWZ0JyxcclxuICAgICAgICAgICAgZHJhdzoge30sXHJcbiAgICAgICAgICAgIGVkaXQ6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKCk6IHZvaWRcclxuICAgICAgICAvLyBJbml0aWFsaXplcyBkcmF3IGNvbnRyb2wsIHRvb2xiYXJzIGZyb20gdGhlIG9wdGlvbnNcclxuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICBpZiAoTC52ZXJzaW9uIDwgJzAuNycpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTGVhZmxldC5kcmF3IDAuMi4zKyByZXF1aXJlcyBMZWFmbGV0IDAuNy4wKy4gRG93bmxvYWQgbGF0ZXN0IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL0xlYWZsZXQvTGVhZmxldC8nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTC5Db250cm9sLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICB2YXIgdG9vbGJhcjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJzID0ge307XHJcblxyXG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIHRvb2xiYXJzXHJcbiAgICAgICAgICAgIGlmIChMLkRyYXdUb29sYmFyICYmIHRoaXMub3B0aW9ucy5kcmF3KSB7XHJcbiAgICAgICAgICAgICAgICB0b29sYmFyID0gbmV3IEwuRHJhd1Rvb2xiYXIodGhpcy5vcHRpb25zLmRyYXcpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJzW0wuRHJhd1Rvb2xiYXIuVFlQRV0gPSB0b29sYmFyO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIExpc3RlbiBmb3Igd2hlbiB0b29sYmFyIGlzIGVuYWJsZWRcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJzW0wuRHJhd1Rvb2xiYXIuVFlQRV0ub24oJ2VuYWJsZScsIHRoaXMuX3Rvb2xiYXJFbmFibGVkLCB0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKEwuRWRpdFRvb2xiYXIgJiYgdGhpcy5vcHRpb25zLmVkaXQpIHtcclxuICAgICAgICAgICAgICAgIHRvb2xiYXIgPSBuZXcgTC5FZGl0VG9vbGJhcih0aGlzLm9wdGlvbnMuZWRpdCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbGJhcnNbTC5FZGl0VG9vbGJhci5UWVBFXSA9IHRvb2xiYXI7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gTGlzdGVuIGZvciB3aGVuIHRvb2xiYXIgaXMgZW5hYmxlZFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbGJhcnNbTC5FZGl0VG9vbGJhci5UWVBFXS5vbignZW5hYmxlJywgdGhpcy5fdG9vbGJhckVuYWJsZWQsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEwudG9vbGJhciA9IHRoaXM7IC8vc2V0IGdsb2JhbCB2YXIgZm9yIGVkaXRpbmcgdGhlIHRvb2xiYXJcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIG9uQWRkKCk6IGNvbnRhaW5lclxyXG4gICAgICAgIC8vIEFkZHMgdGhlIHRvb2xiYXIgY29udGFpbmVyIHRvIHRoZSBtYXBcclxuICAgICAgICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xyXG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2xlYWZsZXQtZHJhdycpLFxyXG4gICAgICAgICAgICAgICAgYWRkZWRUb3BDbGFzcyA9IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdG9wQ2xhc3NOYW1lID0gJ2xlYWZsZXQtZHJhdy10b29sYmFyLXRvcCcsXHJcbiAgICAgICAgICAgICAgICB0b29sYmFyQ29udGFpbmVyO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgdG9vbGJhcklkIGluIHRoaXMuX3Rvb2xiYXJzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdG9vbGJhcnMuaGFzT3duUHJvcGVydHkodG9vbGJhcklkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvb2xiYXJDb250YWluZXIgPSB0aGlzLl90b29sYmFyc1t0b29sYmFySWRdLmFkZFRvb2xiYXIobWFwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2xiYXJDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGNsYXNzIHRvIHRoZSBmaXJzdCB0b29sYmFyIHRvIHJlbW92ZSB0aGUgbWFyZ2luXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWRkZWRUb3BDbGFzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFMLkRvbVV0aWwuaGFzQ2xhc3ModG9vbGJhckNvbnRhaW5lciwgdG9wQ2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyh0b29sYmFyQ29udGFpbmVyLmNoaWxkTm9kZXNbMF0sIHRvcENsYXNzTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZFRvcENsYXNzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRvb2xiYXJDb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIG9uUmVtb3ZlKCk6IHZvaWRcclxuICAgICAgICAvLyBSZW1vdmVzIHRoZSB0b29sYmFycyBmcm9tIHRoZSBtYXAgdG9vbGJhciBjb250YWluZXJcclxuICAgICAgICBvblJlbW92ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciB0b29sYmFySWQgaW4gdGhpcy5fdG9vbGJhcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b29sYmFycy5oYXNPd25Qcm9wZXJ0eSh0b29sYmFySWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdG9vbGJhcnNbdG9vbGJhcklkXS5yZW1vdmVUb29sYmFyKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHNldERyYXdpbmdPcHRpb25zKG9wdGlvbnMpOiB2b2lkXHJcbiAgICAgICAgLy8gU2V0cyBvcHRpb25zIHRvIGFsbCB0b29sYmFyIGluc3RhbmNlc1xyXG4gICAgICAgIHNldERyYXdpbmdPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICBmb3IgKHZhciB0b29sYmFySWQgaW4gdGhpcy5fdG9vbGJhcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b29sYmFyc1t0b29sYmFySWRdIGluc3RhbmNlb2YgTC5EcmF3VG9vbGJhcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJzW3Rvb2xiYXJJZF0uc2V0T3B0aW9ucyhvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF90b29sYmFyRW5hYmxlZDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdmFyIGVuYWJsZWRUb29sYmFyID0gZS50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciB0b29sYmFySWQgaW4gdGhpcy5fdG9vbGJhcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b29sYmFyc1t0b29sYmFySWRdICE9PSBlbmFibGVkVG9vbGJhcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJzW3Rvb2xiYXJJZF0uZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgTC5NYXAubWVyZ2VPcHRpb25zKHtcclxuICAgICAgICBkcmF3Q29udHJvbFRvb2x0aXBzOiB0cnVlLFxyXG4gICAgICAgIGRyYXdDb250cm9sOiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgTC5NYXAuYWRkSW5pdEhvb2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZHJhd0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgdGhpcy5kcmF3Q29udHJvbCA9IG5ldyBMLkNvbnRyb2wuRHJhdygpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZENvbnRyb2wodGhpcy5kcmF3Q29udHJvbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNsYXNzIEwuRHJhdy5Ub29sYmFyXHJcbiAgICAgKiBAYWthIFRvb2xiYXJcclxuICAgICAqXHJcbiAgICAgKiBUaGUgdG9vbGJhciBjbGFzcyBvZiB0aGUgQVBJIOKAlCBpdCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdWlcclxuICAgICAqIFRoaXMgd2lsbCBiZSBkZXByZWNpYXRlZFxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKlxyXG4gICAgICogYGBganNcclxuICAgICAqICAgIHZhciB0b29sYmFyID0gTC5Ub29sYmFyKCk7XHJcbiAgICAgKiAgICB0b29sYmFyLmFkZFRvb2xiYXIobWFwKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqICMjIyBEaXNhYmxpbmcgYSB0b29sYmFyXHJcbiAgICAgKlxyXG4gICAgICogSWYgeW91IGRvIG5vdCB3YW50IGEgcGFydGljdWxhciB0b29sYmFyIGluIHlvdXIgYXBwIHlvdSBjYW4gdHVybiBpdCBvZmYgYnkgc2V0dGluZyB0aGUgdG9vbGJhciB0byBmYWxzZS5cclxuICAgICAqXHJcbiAgICAgKiBgYGBqc1xyXG4gICAgICogICAgICB2YXIgZHJhd0NvbnRyb2wgPSBuZXcgTC5Db250cm9sLkRyYXcoe1xyXG4gKiAgICAgICAgICBkcmF3OiBmYWxzZSxcclxuICogICAgICAgICAgZWRpdDoge1xyXG4gKiAgICAgICAgICAgICAgZmVhdHVyZUdyb3VwOiBlZGl0YWJsZUxheWVyc1xyXG4gKiAgICAgICAgICB9XHJcbiAqICAgICAgfSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiAjIyMgRGlzYWJsaW5nIGEgdG9vbGJhciBpdGVtXHJcbiAgICAgKlxyXG4gICAgICogSWYgeW91IHdhbnQgdG8gdHVybiBvZmYgYSBwYXJ0aWN1bGFyIHRvb2xiYXIgaXRlbSwgc2V0IGl0IHRvIGZhbHNlLiBUaGUgZm9sbG93aW5nIGRpc2FibGVzIGRyYXdpbmcgcG9seWdvbnMgYW5kXHJcbiAgICAgKiBtYXJrZXJzLiBJdCBhbHNvIHR1cm5zIG9mZiB0aGUgYWJpbGl0eSB0byBlZGl0IGxheWVycy5cclxuICAgICAqXHJcbiAgICAgKiBgYGBqc1xyXG4gICAgICogICAgICB2YXIgZHJhd0NvbnRyb2wgPSBuZXcgTC5Db250cm9sLkRyYXcoe1xyXG4gKiAgICAgICAgICBkcmF3OiB7XHJcbiAqICAgICAgICAgICAgICBwb2x5Z29uOiBmYWxzZSxcclxuICogICAgICAgICAgICAgIG1hcmtlcjogZmFsc2VcclxuICogICAgICAgICAgfSxcclxuICogICAgICAgICAgZWRpdDoge1xyXG4gKiAgICAgICAgICAgICAgZmVhdHVyZUdyb3VwOiBlZGl0YWJsZUxheWVycyxcclxuICogICAgICAgICAgICAgIGVkaXQ6IGZhbHNlXHJcbiAqICAgICAgICAgIH1cclxuICogICAgICB9KTtcclxuICAgICAqIGBgYFxyXG4gICAgICovXHJcbiAgICBMLlRvb2xiYXIgPSBMLkNsYXNzLmV4dGVuZCh7XHJcbiAgICAgICAgaW5jbHVkZXM6IFtMLk1peGluLkV2ZW50c10sXHJcblxyXG4gICAgICAgIC8vIEBzZWN0aW9uIE1ldGhvZHMgZm9yIG1vZGlmeWluZyB0aGUgdG9vbGJhclxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGluaXRpYWxpemUob3B0aW9ucyk6IHZvaWRcclxuICAgICAgICAvLyBUb29sYmFyIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgTC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbW9kZXMgPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aW9uQnV0dG9ucyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVNb2RlID0gbnVsbDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGVuYWJsZWQoKTogYm9vbGVhblxyXG4gICAgICAgIC8vIEdldHMgYSB0cnVlL2ZhbHNlIG9mIHdoZXRoZXIgdGhlIHRvb2xiYXIgaXMgZW5hYmxlZFxyXG4gICAgICAgIGVuYWJsZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZU1vZGUgIT09IG51bGw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBkaXNhYmxlKCk6IHZvaWRcclxuICAgICAgICAvLyBEaXNhYmxlcyB0aGUgdG9vbGJhclxyXG4gICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmVuYWJsZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVNb2RlLmhhbmRsZXIuZGlzYWJsZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgYWRkVG9vbGJhcihtYXApOiBMLkRvbVV0aWxcclxuICAgICAgICAvLyBBZGRzIHRoZSB0b29sYmFyIHRvIHRoZSBtYXAgYW5kIHJldHVybnMgdGhlIHRvb2xiYXIgZG9tIGVsZW1lbnRcclxuICAgICAgICBhZGRUb29sYmFyOiBmdW5jdGlvbiAobWFwKSB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnLCAnbGVhZmxldC1kcmF3LXNlY3Rpb24nKSxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkluZGV4ID0gMCxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNsYXNzUHJlZml4ID0gdGhpcy5fdG9vbGJhckNsYXNzIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgbW9kZUhhbmRsZXJzID0gdGhpcy5nZXRNb2RlSGFuZGxlcnMobWFwKSxcclxuICAgICAgICAgICAgICAgIGk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl90b29sYmFyQ29udGFpbmVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2xlYWZsZXQtZHJhdy10b29sYmFyIGxlYWZsZXQtYmFyJyk7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcCA9IG1hcDtcclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb2RlSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChtb2RlSGFuZGxlcnNbaV0uZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRNb2RlSGFuZGxlcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZUhhbmRsZXJzW2ldLmhhbmRsZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJDb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkluZGV4KyssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNsYXNzUHJlZml4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlSGFuZGxlcnNbaV0udGl0bGVcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBpZiBubyBidXR0b25zIHdlcmUgYWRkZWQsIGRvIG5vdCBhZGQgdGhlIHRvb2xiYXJcclxuICAgICAgICAgICAgaWYgKCFidXR0b25JbmRleCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTYXZlIGJ1dHRvbiBpbmRleCBvZiB0aGUgbGFzdCBidXR0b24sIC0xIGFzIHdlIHdvdWxkIGhhdmUgKysgYWZ0ZXIgdGhlIGxhc3QgYnV0dG9uXHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RCdXR0b25JbmRleCA9IC0tYnV0dG9uSW5kZXg7XHJcblxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgZW1wdHkgYWN0aW9ucyBwYXJ0IG9mIHRoZSB0b29sYmFyXHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGlvbnNDb250YWluZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCd1bCcsICdsZWFmbGV0LWRyYXctYWN0aW9ucycpO1xyXG5cclxuICAgICAgICAgICAgLy8gQWRkIGRyYXcgYW5kIGNhbmNlbCBjb250YWluZXJzIHRvIHRoZSBjb250cm9sIGNvbnRhaW5lclxyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fdG9vbGJhckNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9hY3Rpb25zQ29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCByZW1vdmVUb29sYmFyKCk6IHZvaWRcclxuICAgICAgICAvLyBSZW1vdmVzIHRoZSB0b29sYmFyIGFuZCBkcm9wcyB0aGUgaGFuZGxlciBldmVudCBsaXN0ZW5lcnNcclxuICAgICAgICByZW1vdmVUb29sYmFyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIERpc3Bvc2UgZWFjaCBoYW5kbGVyXHJcbiAgICAgICAgICAgIGZvciAodmFyIGhhbmRsZXJJZCBpbiB0aGlzLl9tb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21vZGVzLmhhc093blByb3BlcnR5KGhhbmRsZXJJZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBVbmJpbmQgaGFuZGxlciBidXR0b25cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwb3NlQnV0dG9uKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2Rlc1toYW5kbGVySWRdLmJ1dHRvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZXNbaGFuZGxlcklkXS5oYW5kbGVyLmVuYWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZXNbaGFuZGxlcklkXS5oYW5kbGVyXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGlzIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZXNbaGFuZGxlcklkXS5oYW5kbGVyLmRpc2FibGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVW5iaW5kIGhhbmRsZXJcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2Rlc1toYW5kbGVySWRdLmhhbmRsZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgLm9mZignZW5hYmxlZCcsIHRoaXMuX2hhbmRsZXJBY3RpdmF0ZWQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vZmYoJ2Rpc2FibGVkJywgdGhpcy5faGFuZGxlckRlYWN0aXZhdGVkLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9tb2RlcyA9IHt9O1xyXG5cclxuICAgICAgICAgICAgLy8gRGlzcG9zZSB0aGUgYWN0aW9ucyB0b29sYmFyXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5fYWN0aW9uQnV0dG9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2VCdXR0b24oXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWN0aW9uQnV0dG9uc1tpXS5idXR0b24sXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWN0aW9uQnV0dG9uc1tpXS5jYWxsYmFjayxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGlvbkJ1dHRvbnMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aW9uc0NvbnRhaW5lciA9IG51bGw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2luaXRNb2RlSGFuZGxlcjogZnVuY3Rpb24gKGhhbmRsZXIsIGNvbnRhaW5lciwgYnV0dG9uSW5kZXgsIGNsYXNzTmFtZVByZWRpeCwgYnV0dG9uVGl0bGUpIHtcclxuICAgICAgICAgICAgdmFyIHR5cGUgPSBoYW5kbGVyLnR5cGU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tb2Rlc1t0eXBlXSA9IHt9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbW9kZXNbdHlwZV0uaGFuZGxlciA9IGhhbmRsZXI7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tb2Rlc1t0eXBlXS5idXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBidXR0b25UaXRsZSxcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lUHJlZGl4ICsgJy0nICsgdHlwZSxcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuX21vZGVzW3R5cGVdLmhhbmRsZXIuZW5hYmxlLFxyXG4gICAgICAgICAgICAgICAgY29udGV4dDogdGhpcy5fbW9kZXNbdHlwZV0uaGFuZGxlclxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21vZGVzW3R5cGVdLmJ1dHRvbkluZGV4ID0gYnV0dG9uSW5kZXg7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tb2Rlc1t0eXBlXS5oYW5kbGVyXHJcbiAgICAgICAgICAgICAgICAub24oJ2VuYWJsZWQnLCB0aGlzLl9oYW5kbGVyQWN0aXZhdGVkLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9uKCdkaXNhYmxlZCcsIHRoaXMuX2hhbmRsZXJEZWFjdGl2YXRlZCwgdGhpcyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyogRGV0ZWN0IGlPUyBiYXNlZCBvbiBicm93c2VyIFVzZXIgQWdlbnQsIGJhc2VkIG9uOlxyXG5cdCAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzkwMzk4ODUgKi9cclxuICAgICAgICBfZGV0ZWN0SU9TOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBpT1MgPSAoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgIXdpbmRvdy5NU1N0cmVhbSk7XHJcbiAgICAgICAgICAgIHJldHVybiBpT1M7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NyZWF0ZUJ1dHRvbjogZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBsaW5rID0gTC5Eb21VdGlsLmNyZWF0ZSgnYScsIG9wdGlvbnMuY2xhc3NOYW1lIHx8ICcnLCBvcHRpb25zLmNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIC8vIFNjcmVlbiByZWFkZXIgdGFnXHJcbiAgICAgICAgICAgIHZhciBzciA9IEwuRG9tVXRpbC5jcmVhdGUoJ3NwYW4nLCAnc3Itb25seScsIG9wdGlvbnMuY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgIGxpbmsuaHJlZiA9ICcjJztcclxuICAgICAgICAgICAgbGluay5hcHBlbmRDaGlsZChzcik7XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50aXRsZSkge1xyXG4gICAgICAgICAgICAgICAgbGluay50aXRsZSA9IG9wdGlvbnMudGl0bGU7XHJcbiAgICAgICAgICAgICAgICBzci5pbm5lckhUTUwgPSBvcHRpb25zLnRpdGxlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBsaW5rLmlubmVySFRNTCA9IG9wdGlvbnMudGV4dDtcclxuICAgICAgICAgICAgICAgIHNyLmlubmVySFRNTCA9IG9wdGlvbnMudGV4dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogaU9TIGRvZXMgbm90IHVzZSBjbGljayBldmVudHMgKi9cclxuICAgICAgICAgICAgdmFyIGJ1dHRvbkV2ZW50ID0gdGhpcy5fZGV0ZWN0SU9TKCkgPyAndG91Y2hzdGFydCcgOiAnY2xpY2snO1xyXG5cclxuICAgICAgICAgICAgTC5Eb21FdmVudFxyXG4gICAgICAgICAgICAgICAgLm9uKGxpbmssICdjbGljaycsIEwuRG9tRXZlbnQuc3RvcFByb3BhZ2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgLm9uKGxpbmssICdtb3VzZWRvd24nLCBMLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbilcclxuICAgICAgICAgICAgICAgIC5vbihsaW5rLCAnZGJsY2xpY2snLCBMLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbilcclxuICAgICAgICAgICAgICAgIC5vbihsaW5rLCAndG91Y2hzdGFydCcsIEwuRG9tRXZlbnQuc3RvcFByb3BhZ2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgLm9uKGxpbmssICdjbGljaycsIEwuRG9tRXZlbnQucHJldmVudERlZmF1bHQpXHJcbiAgICAgICAgICAgICAgICAub24obGluaywgYnV0dG9uRXZlbnQsIG9wdGlvbnMuY2FsbGJhY2ssIG9wdGlvbnMuY29udGV4dCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbGluaztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZGlzcG9zZUJ1dHRvbjogZnVuY3Rpb24gKGJ1dHRvbiwgY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgLyogaU9TIGRvZXMgbm90IHVzZSBjbGljayBldmVudHMgKi9cclxuICAgICAgICAgICAgdmFyIGJ1dHRvbkV2ZW50ID0gdGhpcy5fZGV0ZWN0SU9TKCkgPyAndG91Y2hzdGFydCcgOiAnY2xpY2snO1xyXG5cclxuICAgICAgICAgICAgTC5Eb21FdmVudFxyXG4gICAgICAgICAgICAgICAgLm9mZihidXR0b24sICdjbGljaycsIEwuRG9tRXZlbnQuc3RvcFByb3BhZ2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgLm9mZihidXR0b24sICdtb3VzZWRvd24nLCBMLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbilcclxuICAgICAgICAgICAgICAgIC5vZmYoYnV0dG9uLCAnZGJsY2xpY2snLCBMLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbilcclxuICAgICAgICAgICAgICAgIC5vZmYoYnV0dG9uLCAndG91Y2hzdGFydCcsIEwuRG9tRXZlbnQuc3RvcFByb3BhZ2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgLm9mZihidXR0b24sICdjbGljaycsIEwuRG9tRXZlbnQucHJldmVudERlZmF1bHQpXHJcbiAgICAgICAgICAgICAgICAub2ZmKGJ1dHRvbiwgYnV0dG9uRXZlbnQsIGNhbGxiYWNrKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfaGFuZGxlckFjdGl2YXRlZDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgLy8gRGlzYWJsZSBhY3RpdmUgbW9kZSAoaWYgcHJlc2VudClcclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBDYWNoZSBuZXcgYWN0aXZlIGZlYXR1cmVcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlTW9kZSA9IHRoaXMuX21vZGVzW2UuaGFuZGxlcl07XHJcblxyXG4gICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fYWN0aXZlTW9kZS5idXR0b24sICdsZWFmbGV0LWRyYXctdG9vbGJhci1idXR0b24tZW5hYmxlZCcpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fc2hvd0FjdGlvbnNUb29sYmFyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2VuYWJsZScpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9oYW5kbGVyRGVhY3RpdmF0ZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5faGlkZUFjdGlvbnNUb29sYmFyKCk7XHJcblxyXG4gICAgICAgICAgICBMLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5fYWN0aXZlTW9kZS5idXR0b24sICdsZWFmbGV0LWRyYXctdG9vbGJhci1idXR0b24tZW5hYmxlZCcpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlTW9kZSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Rpc2FibGUnKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfY3JlYXRlQWN0aW9uczogZnVuY3Rpb24gKGhhbmRsZXIpIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2FjdGlvbnNDb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICBidXR0b25zID0gdGhpcy5nZXRBY3Rpb25zKGhhbmRsZXIpLFxyXG4gICAgICAgICAgICAgICAgbCA9IGJ1dHRvbnMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgbGksIGRpLCBkbCwgYnV0dG9uO1xyXG5cclxuICAgICAgICAgICAgLy8gRGlzcG9zZSB0aGUgYWN0aW9ucyB0b29sYmFyICh0b2RvOiBkaXNwb3NlIG9ubHkgbm90IHVzZWQgYnV0dG9ucylcclxuICAgICAgICAgICAgZm9yIChkaSA9IDAsIGRsID0gdGhpcy5fYWN0aW9uQnV0dG9ucy5sZW5ndGg7IGRpIDwgZGw7IGRpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2VCdXR0b24odGhpcy5fYWN0aW9uQnV0dG9uc1tkaV0uYnV0dG9uLCB0aGlzLl9hY3Rpb25CdXR0b25zW2RpXS5jYWxsYmFjayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fYWN0aW9uQnV0dG9ucyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBvbGQgYnV0dG9uc1xyXG4gICAgICAgICAgICB3aGlsZSAoY29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjb250YWluZXIuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoJ2VuYWJsZWQnIGluIGJ1dHRvbnNbaV0gJiYgIWJ1dHRvbnNbaV0uZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxpID0gTC5Eb21VdGlsLmNyZWF0ZSgnbGknLCAnJywgY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICBidXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBidXR0b25zW2ldLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGJ1dHRvbnNbaV0udGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IGxpLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBidXR0b25zW2ldLmNhbGxiYWNrLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGJ1dHRvbnNbaV0uY29udGV4dFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aW9uQnV0dG9ucy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b246IGJ1dHRvbixcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogYnV0dG9uc1tpXS5jYWxsYmFja1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfc2hvd0FjdGlvbnNUb29sYmFyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBidXR0b25JbmRleCA9IHRoaXMuX2FjdGl2ZU1vZGUuYnV0dG9uSW5kZXgsXHJcbiAgICAgICAgICAgICAgICBsYXN0QnV0dG9uSW5kZXggPSB0aGlzLl9sYXN0QnV0dG9uSW5kZXgsXHJcbiAgICAgICAgICAgICAgICB0b29sYmFyUG9zaXRpb24gPSB0aGlzLl9hY3RpdmVNb2RlLmJ1dHRvbi5vZmZzZXRUb3AgLSAxO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVjcmVhdGUgYWN0aW9uIGJ1dHRvbnMgb24gZXZlcnkgY2xpY2tcclxuICAgICAgICAgICAgdGhpcy5fY3JlYXRlQWN0aW9ucyh0aGlzLl9hY3RpdmVNb2RlLmhhbmRsZXIpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ29ycmVjdGx5IHBvc2l0aW9uIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGlvbnNDb250YWluZXIuc3R5bGUudG9wID0gdG9vbGJhclBvc2l0aW9uICsgJ3B4JztcclxuXHJcbiAgICAgICAgICAgIGlmIChidXR0b25JbmRleCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX3Rvb2xiYXJDb250YWluZXIsICdsZWFmbGV0LWRyYXctdG9vbGJhci1ub3RvcCcpO1xyXG4gICAgICAgICAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2FjdGlvbnNDb250YWluZXIsICdsZWFmbGV0LWRyYXctYWN0aW9ucy10b3AnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGJ1dHRvbkluZGV4ID09PSBsYXN0QnV0dG9uSW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl90b29sYmFyQ29udGFpbmVyLCAnbGVhZmxldC1kcmF3LXRvb2xiYXItbm9ib3R0b20nKTtcclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl9hY3Rpb25zQ29udGFpbmVyLCAnbGVhZmxldC1kcmF3LWFjdGlvbnMtYm90dG9tJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGlvbnNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2hpZGVBY3Rpb25zVG9vbGJhcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9hY3Rpb25zQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgICAgICAgICBMLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5fdG9vbGJhckNvbnRhaW5lciwgJ2xlYWZsZXQtZHJhdy10b29sYmFyLW5vdG9wJyk7XHJcbiAgICAgICAgICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl90b29sYmFyQ29udGFpbmVyLCAnbGVhZmxldC1kcmF3LXRvb2xiYXItbm9ib3R0b20nKTtcclxuICAgICAgICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX2FjdGlvbnNDb250YWluZXIsICdsZWFmbGV0LWRyYXctYWN0aW9ucy10b3AnKTtcclxuICAgICAgICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX2FjdGlvbnNDb250YWluZXIsICdsZWFmbGV0LWRyYXctYWN0aW9ucy1ib3R0b20nKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgTC5EcmF3ID0gTC5EcmF3IHx8IHt9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5EcmF3LlRvb2x0aXBcclxuICAgICAqIEBha2EgVG9vbHRpcFxyXG4gICAgICpcclxuICAgICAqIFRoZSB0b29sdGlwIGNsYXNzIOKAlCBpdCBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIHRvb2x0aXAgd2hpbGUgZHJhd2luZ1xyXG4gICAgICogVGhpcyB3aWxsIGJlIGRlcHJlY2lhdGVkXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqXHJcbiAgICAgKiBgYGBqc1xyXG4gICAgICogICAgdmFyIHRvb2x0aXAgPSBMLkRyYXcuVG9vbHRpcCgpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBMLkRyYXcuVG9vbHRpcCA9IEwuQ2xhc3MuZXh0ZW5kKHtcclxuXHJcbiAgICAgICAgLy8gQHNlY3Rpb24gTWV0aG9kcyBmb3IgbW9kaWZ5aW5nIGRyYXcgc3RhdGVcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbml0aWFsaXplKG1hcCk6IHZvaWRcclxuICAgICAgICAvLyBUb29sdGlwIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG1hcCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwUGFuZSA9IG1hcC5fcGFuZXMucG9wdXBQYW5lO1xyXG4gICAgICAgICAgICB0aGlzLl92aXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBtYXAub3B0aW9ucy5kcmF3Q29udHJvbFRvb2x0aXBzID9cclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5jcmVhdGUoJ2RpdicsICdsZWFmbGV0LWRyYXctdG9vbHRpcCcsIHRoaXMuX3BvcHVwUGFuZSkgOiBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLl9zaW5nbGVMaW5lTGFiZWwgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW91c2VvdXQnLCB0aGlzLl9vbk1vdXNlT3V0LCB0aGlzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGRpc3Bvc2UoKTogdm9pZFxyXG4gICAgICAgIC8vIFJlbW92ZSBUb29sdGlwIERPTSBhbmQgdW5iaW5kIGV2ZW50c1xyXG4gICAgICAgIGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW91c2VvdXQnLCB0aGlzLl9vbk1vdXNlT3V0LCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BvcHVwUGFuZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgdXBkYXRlQ29udGVudChsYWJlbFRleHQpOiB0aGlzXHJcbiAgICAgICAgLy8gQ2hhbmdlcyB0aGUgdG9vbHRpcCB0ZXh0IHRvIHN0cmluZyBpbiBmdW5jdGlvbiBjYWxsXHJcbiAgICAgICAgdXBkYXRlQ29udGVudDogZnVuY3Rpb24gKGxhYmVsVGV4dCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGFiZWxUZXh0LnN1YnRleHQgPSBsYWJlbFRleHQuc3VidGV4dCB8fCAnJztcclxuXHJcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgdmVydGljYWwgcG9zaXRpb24gKG9ubHkgaWYgY2hhbmdlZClcclxuICAgICAgICAgICAgaWYgKGxhYmVsVGV4dC5zdWJ0ZXh0Lmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5fc2luZ2xlTGluZUxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fY29udGFpbmVyLCAnbGVhZmxldC1kcmF3LXRvb2x0aXAtc2luZ2xlJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaW5nbGVMaW5lTGFiZWwgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxhYmVsVGV4dC5zdWJ0ZXh0Lmxlbmd0aCA+IDAgJiYgdGhpcy5fc2luZ2xlTGluZUxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICBMLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5fY29udGFpbmVyLCAnbGVhZmxldC1kcmF3LXRvb2x0aXAtc2luZ2xlJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaW5nbGVMaW5lTGFiZWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmlubmVySFRNTCA9XHJcbiAgICAgICAgICAgICAgICAobGFiZWxUZXh0LnN1YnRleHQubGVuZ3RoID4gMCA/XHJcbiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwibGVhZmxldC1kcmF3LXRvb2x0aXAtc3VidGV4dFwiPicgKyBsYWJlbFRleHQuc3VidGV4dCArICc8L3NwYW4+JyArICc8YnIgLz4nIDogJycpICtcclxuICAgICAgICAgICAgICAgICc8c3Bhbj4nICsgbGFiZWxUZXh0LnRleHQgKyAnPC9zcGFuPic7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWxhYmVsVGV4dC50ZXh0ICYmICFsYWJlbFRleHQuc3VidGV4dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Zpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaW5oZXJpdCc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgdXBkYXRlUG9zaXRpb24obGF0bG5nKTogdGhpc1xyXG4gICAgICAgIC8vIENoYW5nZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSB0b29sdGlwXHJcbiAgICAgICAgdXBkYXRlUG9zaXRpb246IGZ1bmN0aW9uIChsYXRsbmcpIHtcclxuICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQobGF0bG5nKSxcclxuICAgICAgICAgICAgICAgIHRvb2x0aXBDb250YWluZXIgPSB0aGlzLl9jb250YWluZXI7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBDb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdpbmhlcml0JztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5zZXRQb3NpdGlvbih0b29sdGlwQ29udGFpbmVyLCBwb3MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHNob3dBc0Vycm9yKCk6IHRoaXNcclxuICAgICAgICAvLyBBcHBsaWVzIGVycm9yIGNsYXNzIHRvIHRvb2x0aXBcclxuICAgICAgICBzaG93QXNFcnJvcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fY29udGFpbmVyLCAnbGVhZmxldC1lcnJvci1kcmF3LXRvb2x0aXAnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHJlbW92ZUVycm9yKCk6IHRoaXNcclxuICAgICAgICAvLyBSZW1vdmVzIHRoZSBlcnJvciBjbGFzcyBmcm9tIHRoZSB0b29sdGlwXHJcbiAgICAgICAgcmVtb3ZlRXJyb3I6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX2NvbnRhaW5lciwgJ2xlYWZsZXQtZXJyb3ItZHJhdy10b29sdGlwJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uTW91c2VPdXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjbGFzcyBMLkRyYXdUb29sYmFyXHJcbiAgICAgKiBAYWthIFRvb2xiYXJcclxuICAgICAqL1xyXG4gICAgTC5EcmF3VG9vbGJhciA9IEwuVG9vbGJhci5leHRlbmQoe1xyXG5cclxuICAgICAgICBzdGF0aWNzOiB7XHJcbiAgICAgICAgICAgIFRZUEU6ICdkcmF3J1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgcG9seWxpbmU6IHt9LFxyXG4gICAgICAgICAgICBwb2x5Z29uOiB7fSxcclxuICAgICAgICAgICAgcmVjdGFuZ2xlOiB7fSxcclxuICAgICAgICAgICAgY2lyY2xlOiB7fSxcclxuICAgICAgICAgICAgbWFya2VyOiB7fSxcclxuICAgICAgICAgICAgY2lyY2xlbWFya2VyOiB7fVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgaW5pdGlhbGl6ZSgpOiB2b2lkXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIG9wdGlvbnMgYXJlIG1lcmdlZCBjb3JyZWN0bHkgc2luY2UgTC5leHRlbmQgaXMgb25seSBzaGFsbG93XHJcbiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KHR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNbdHlwZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1t0eXBlXSA9IEwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnNbdHlwZV0sIG9wdGlvbnNbdHlwZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fdG9vbGJhckNsYXNzID0gJ2xlYWZsZXQtZHJhdy1kcmF3JztcclxuICAgICAgICAgICAgTC5Ub29sYmFyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBnZXRNb2RlSGFuZGxlcnMoKTogb2JqZWN0XHJcbiAgICAgICAgLy8gR2V0IG1vZGUgaGFuZGxlcnMgaW5mb3JtYXRpb25cclxuICAgICAgICBnZXRNb2RlSGFuZGxlcnM6IGZ1bmN0aW9uIChtYXApIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLm9wdGlvbnMucG9seWxpbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogbmV3IEwuRHJhdy5Qb2x5bGluZShtYXAsIHRoaXMub3B0aW9ucy5wb2x5bGluZSksXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci5idXR0b25zLnBvbHlsaW5lXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMub3B0aW9ucy5wb2x5Z29uLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IG5ldyBMLkRyYXcuUG9seWdvbihtYXAsIHRoaXMub3B0aW9ucy5wb2x5Z29uKSxcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogTC5kcmF3TG9jYWwuZHJhdy50b29sYmFyLmJ1dHRvbnMucG9seWdvblxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLm9wdGlvbnMucmVjdGFuZ2xlLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IG5ldyBMLkRyYXcuUmVjdGFuZ2xlKG1hcCwgdGhpcy5vcHRpb25zLnJlY3RhbmdsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci5idXR0b25zLnJlY3RhbmdsZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLm9wdGlvbnMuY2lyY2xlLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IG5ldyBMLkRyYXcuQ2lyY2xlKG1hcCwgdGhpcy5vcHRpb25zLmNpcmNsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci5idXR0b25zLmNpcmNsZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLm9wdGlvbnMubWFya2VyLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IG5ldyBMLkRyYXcuTWFya2VyKG1hcCwgdGhpcy5vcHRpb25zLm1hcmtlciksXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci5idXR0b25zLm1hcmtlclxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLm9wdGlvbnMuY2lyY2xlbWFya2VyLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IG5ldyBMLkRyYXcuQ2lyY2xlTWFya2VyKG1hcCwgdGhpcy5vcHRpb25zLmNpcmNsZW1hcmtlciksXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci5idXR0b25zLmNpcmNsZW1hcmtlclxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgZ2V0QWN0aW9ucygpOiBvYmplY3RcclxuICAgICAgICAvLyBHZXQgYWN0aW9uIGluZm9ybWF0aW9uXHJcbiAgICAgICAgZ2V0QWN0aW9uczogZnVuY3Rpb24gKGhhbmRsZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgIC8vIHtcclxuICAgICAgICAgICAgICAgIC8vICAgICBlbmFibGVkOiBoYW5kbGVyLmNvbXBsZXRlU2hhcGUsXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdGl0bGU6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci5maW5pc2gudGl0bGUsXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdGV4dDogTC5kcmF3TG9jYWwuZHJhdy50b29sYmFyLmZpbmlzaC50ZXh0LFxyXG4gICAgICAgICAgICAgICAgLy8gICAgIGNhbGxiYWNrOiBoYW5kbGVyLmNvbXBsZXRlU2hhcGUsXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgY29udGV4dDogaGFuZGxlclxyXG4gICAgICAgICAgICAgICAgLy8gfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBoYW5kbGVyLmRlbGV0ZUxhc3RWZXJ0ZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci51bmRvLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IEwuZHJhd0xvY2FsLmRyYXcudG9vbGJhci51bmRvLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGhhbmRsZXIuZGVsZXRlTGFzdFZlcnRleCxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBMLmRyYXdMb2NhbC5kcmF3LnRvb2xiYXIuYWN0aW9ucy50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBMLmRyYXdMb2NhbC5kcmF3LnRvb2xiYXIuYWN0aW9ucy50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLmRpc2FibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpc1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2Qgc2V0T3B0aW9ucygpOiB2b2lkXHJcbiAgICAgICAgLy8gU2V0cyB0aGUgb3B0aW9ucyB0byB0aGUgdG9vbGJhclxyXG4gICAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5fbW9kZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tb2Rlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KHR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZXNbdHlwZV0uaGFuZGxlci5zZXRPcHRpb25zKG9wdGlvbnNbdHlwZV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8qTC5NYXAubWVyZ2VPcHRpb25zKHtcclxuIGVkaXRDb250cm9sOiB0cnVlXHJcbiB9KTsqL1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5FZGl0VG9vbGJhclxyXG4gICAgICogQGFrYSBFZGl0VG9vbGJhclxyXG4gICAgICovXHJcbiAgICBMLkVkaXRUb29sYmFyID0gTC5Ub29sYmFyLmV4dGVuZCh7XHJcbiAgICAgICAgc3RhdGljczoge1xyXG4gICAgICAgICAgICBUWVBFOiAnZWRpdCdcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGVkaXQ6IHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkUGF0aE9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBkYXNoQXJyYXk6ICcxMCwgMTAnLFxyXG5cclxuICAgICAgICAgICAgICAgICAgICBmaWxsOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJyNmZTU3YTEnLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAwLjEsXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZXRoZXIgdG8gdXNlciB0aGUgZXhpc3RpbmcgbGF5ZXJzIGNvbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgbWFpbnRhaW5Db2xvcjogZmFsc2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcmVtb3ZlOiB7fSxcclxuICAgICAgICAgICAgcG9seTogbnVsbCxcclxuICAgICAgICAgICAgZmVhdHVyZUdyb3VwOiBudWxsIC8qIFJFUVVJUkVEISBUT0RPOiBwZXJoYXBzIGlmIG5vdCBzZXQgdGhlbiBhbGwgbGF5ZXJzIG9uIHRoZSBtYXAgYXJlIHNlbGVjdGFibGU/ICovXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbnRpYWxpemUoKTogdm9pZFxyXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIE5lZWQgdG8gc2V0IHRoaXMgbWFudWFsbHkgc2luY2UgbnVsbCBpcyBhbiBhY2NlcHRhYmxlIHZhbHVlIGhlcmVcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZWRpdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmVkaXQuc2VsZWN0ZWRQYXRoT3B0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmVkaXQuc2VsZWN0ZWRQYXRoT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5lZGl0LnNlbGVjdGVkUGF0aE9wdGlvbnM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLmVkaXQuc2VsZWN0ZWRQYXRoT3B0aW9ucyA9IEwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMuZWRpdC5zZWxlY3RlZFBhdGhPcHRpb25zLCBvcHRpb25zLmVkaXQuc2VsZWN0ZWRQYXRoT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbW92ZSkge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5yZW1vdmUgPSBMLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLnJlbW92ZSwgb3B0aW9ucy5yZW1vdmUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5wb2x5KSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLnBvbHkgPSBMLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLnBvbHksIG9wdGlvbnMucG9seSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJDbGFzcyA9ICdsZWFmbGV0LWRyYXctZWRpdCc7XHJcbiAgICAgICAgICAgIEwuVG9vbGJhci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRGZWF0dXJlQ291bnQgPSAwO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgZ2V0TW9kZUhhbmRsZXJzKCk6IG9iamVjdFxyXG4gICAgICAgIC8vIEdldCBtb2RlIGhhbmRsZXJzIGluZm9ybWF0aW9uXHJcbiAgICAgICAgZ2V0TW9kZUhhbmRsZXJzOiBmdW5jdGlvbiAobWFwKSB7XHJcbiAgICAgICAgICAgIHZhciBmZWF0dXJlR3JvdXAgPSB0aGlzLm9wdGlvbnMuZmVhdHVyZUdyb3VwO1xyXG4gICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMub3B0aW9ucy5lZGl0LFxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IG5ldyBMLkVkaXRUb29sYmFyLkVkaXQobWFwLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVHcm91cDogZmVhdHVyZUdyb3VwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhdGhPcHRpb25zOiB0aGlzLm9wdGlvbnMuZWRpdC5zZWxlY3RlZFBhdGhPcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2x5OiB0aGlzLm9wdGlvbnMucG9seVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBMLmRyYXdMb2NhbC5lZGl0LnRvb2xiYXIuYnV0dG9ucy5lZGl0XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMub3B0aW9ucy5yZW1vdmUsXHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogbmV3IEwuRWRpdFRvb2xiYXIuRGVsZXRlKG1hcCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlR3JvdXA6IGZlYXR1cmVHcm91cFxyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBMLmRyYXdMb2NhbC5lZGl0LnRvb2xiYXIuYnV0dG9ucy5yZW1vdmVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGdldEFjdGlvbnMoKTogb2JqZWN0XHJcbiAgICAgICAgLy8gR2V0IGFjdGlvbnMgaW5mb3JtYXRpb25cclxuICAgICAgICBnZXRBY3Rpb25zOiBmdW5jdGlvbiAoaGFuZGxlcikge1xyXG4gICAgICAgICAgICB2YXIgYWN0aW9ucyA9IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogTC5kcmF3TG9jYWwuZWRpdC50b29sYmFyLmFjdGlvbnMuc2F2ZS50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBMLmRyYXdMb2NhbC5lZGl0LnRvb2xiYXIuYWN0aW9ucy5zYXZlLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuX3NhdmUsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogTC5kcmF3TG9jYWwuZWRpdC50b29sYmFyLmFjdGlvbnMuY2FuY2VsLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IEwuZHJhd0xvY2FsLmVkaXQudG9vbGJhci5hY3Rpb25zLmNhbmNlbC50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLmRpc2FibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpc1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGhhbmRsZXIucmVtb3ZlQWxsTGF5ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBMLmRyYXdMb2NhbC5lZGl0LnRvb2xiYXIuYWN0aW9ucy5jbGVhckFsbC50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBMLmRyYXdMb2NhbC5lZGl0LnRvb2xiYXIuYWN0aW9ucy5jbGVhckFsbC50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLl9jbGVhckFsbExheWVycyxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBhZGRUb29sYmFyKG1hcCk6IEwuRG9tVXRpbFxyXG4gICAgICAgIC8vIEFkZHMgdGhlIHRvb2xiYXIgdG8gdGhlIG1hcFxyXG4gICAgICAgIGFkZFRvb2xiYXI6IGZ1bmN0aW9uIChtYXApIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IEwuVG9vbGJhci5wcm90b3R5cGUuYWRkVG9vbGJhci5jYWxsKHRoaXMsIG1hcCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jaGVja0Rpc2FibGVkKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmVhdHVyZUdyb3VwLm9uKCdsYXllcmFkZCBsYXllcnJlbW92ZScsIHRoaXMuX2NoZWNrRGlzYWJsZWQsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHJlbW92ZVRvb2xiYXIoKTogdm9pZFxyXG4gICAgICAgIC8vIFJlbW92ZXMgdGhlIHRvb2xiYXIgZnJvbSB0aGUgbWFwXHJcbiAgICAgICAgcmVtb3ZlVG9vbGJhcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmVhdHVyZUdyb3VwLm9mZignbGF5ZXJhZGQgbGF5ZXJyZW1vdmUnLCB0aGlzLl9jaGVja0Rpc2FibGVkLCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIEwuVG9vbGJhci5wcm90b3R5cGUucmVtb3ZlVG9vbGJhci5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgZGlzYWJsZSgpOiB2b2lkXHJcbiAgICAgICAgLy8gRGlzYWJsZXMgdGhlIHRvb2xiYXJcclxuICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lbmFibGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlTW9kZS5oYW5kbGVyLnJldmVydExheWVycygpO1xyXG5cclxuICAgICAgICAgICAgTC5Ub29sYmFyLnByb3RvdHlwZS5kaXNhYmxlLmNhbGwodGhpcyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3NhdmU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlTW9kZS5oYW5kbGVyLnNhdmUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZU1vZGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZU1vZGUuaGFuZGxlci5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfY2xlYXJBbGxMYXllcnM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlTW9kZS5oYW5kbGVyLnJlbW92ZUFsbExheWVycygpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlTW9kZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlTW9kZS5oYW5kbGVyLmRpc2FibGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9jaGVja0Rpc2FibGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBmZWF0dXJlR3JvdXAgPSB0aGlzLm9wdGlvbnMuZmVhdHVyZUdyb3VwLFxyXG4gICAgICAgICAgICAgICAgaGFzTGF5ZXJzID0gZmVhdHVyZUdyb3VwLmdldExheWVycygpLmxlbmd0aCAhPT0gMCxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWRpdCkge1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uID0gdGhpcy5fbW9kZXNbTC5FZGl0VG9vbGJhci5FZGl0LlRZUEVdLmJ1dHRvbjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaGFzTGF5ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKGJ1dHRvbiwgJ2xlYWZsZXQtZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKGJ1dHRvbiwgJ2xlYWZsZXQtZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKFxyXG4gICAgICAgICAgICAgICAgICAgICd0aXRsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzTGF5ZXJzID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgTC5kcmF3TG9jYWwuZWRpdC50b29sYmFyLmJ1dHRvbnMuZWRpdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IEwuZHJhd0xvY2FsLmVkaXQudG9vbGJhci5idXR0b25zLmVkaXREaXNhYmxlZFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZW1vdmUpIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbiA9IHRoaXMuX21vZGVzW0wuRWRpdFRvb2xiYXIuRGVsZXRlLlRZUEVdLmJ1dHRvbjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaGFzTGF5ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKGJ1dHRvbiwgJ2xlYWZsZXQtZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKGJ1dHRvbiwgJ2xlYWZsZXQtZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKFxyXG4gICAgICAgICAgICAgICAgICAgICd0aXRsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzTGF5ZXJzID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgTC5kcmF3TG9jYWwuZWRpdC50b29sYmFyLmJ1dHRvbnMucmVtb3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogTC5kcmF3TG9jYWwuZWRpdC50b29sYmFyLmJ1dHRvbnMucmVtb3ZlRGlzYWJsZWRcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5FZGl0VG9vbGJhci5FZGl0XHJcbiAgICAgKiBAYWthIEVkaXRUb29sYmFyLkVkaXRcclxuICAgICAqL1xyXG4gICAgTC5FZGl0VG9vbGJhci5FZGl0ID0gTC5IYW5kbGVyLmV4dGVuZCh7XHJcbiAgICAgICAgc3RhdGljczoge1xyXG4gICAgICAgICAgICBUWVBFOiAnZWRpdCdcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBpbmNsdWRlczogTC5NaXhpbi5FdmVudHMsXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2QgaW50aWFsaXplKCk6IHZvaWRcclxuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAobWFwLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIEwuSGFuZGxlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG1hcCk7XHJcblxyXG4gICAgICAgICAgICBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICAvLyBTdG9yZSB0aGUgc2VsZWN0YWJsZSBsYXllciBncm91cCBmb3IgZWFzZSBvZiBhY2Nlc3NcclxuICAgICAgICAgICAgdGhpcy5fZmVhdHVyZUdyb3VwID0gb3B0aW9ucy5mZWF0dXJlR3JvdXA7XHJcblxyXG4gICAgICAgICAgICBpZiAoISh0aGlzLl9mZWF0dXJlR3JvdXAgaW5zdGFuY2VvZiBMLkZlYXR1cmVHcm91cCkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5mZWF0dXJlR3JvdXAgbXVzdCBiZSBhIEwuRmVhdHVyZUdyb3VwJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3VuZWRpdGVkTGF5ZXJQcm9wcyA9IHt9O1xyXG5cclxuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdHlwZSBzbyBzdXBlciBjYW4gZmlyZSwgbmVlZCB0byBkbyB0aGlzIGFzIGNhbm5vdCBkbyB0aGlzLlRZUEUgOihcclxuICAgICAgICAgICAgdGhpcy50eXBlID0gTC5FZGl0VG9vbGJhci5FZGl0LlRZUEU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBlbmFibGUoKTogdm9pZFxyXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZWRpdCB0b29sYmFyXHJcbiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9lbmFibGVkIHx8ICF0aGlzLl9oYXNBdmFpbGFibGVMYXllcnMoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZW5hYmxlZCcsIHtoYW5kbGVyOiB0aGlzLnR5cGV9KTtcclxuICAgICAgICAgICAgLy90aGlzIGRpc2FibGUgb3RoZXIgaGFuZGxlcnNcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5FRElUU1RBUlQsIHtoYW5kbGVyOiB0aGlzLnR5cGV9KTtcclxuICAgICAgICAgICAgLy9hbGxvdyBkcmF3TGF5ZXIgdG8gYmUgdXBkYXRlZCBiZWZvcmUgYmVnaW5uaW5nIGVkaXRpb24uXHJcblxyXG4gICAgICAgICAgICBMLkhhbmRsZXIucHJvdG90eXBlLmVuYWJsZS5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9mZWF0dXJlR3JvdXBcclxuICAgICAgICAgICAgICAgIC5vbignbGF5ZXJhZGQnLCB0aGlzLl9lbmFibGVMYXllckVkaXQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ2xheWVycmVtb3ZlJywgdGhpcy5fZGlzYWJsZUxheWVyRWRpdCwgdGhpcyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBkaXNhYmxlKCk6IHZvaWRcclxuICAgICAgICAvLyBEaXNhYmxlIHRoZSBlZGl0IHRvb2xiYXJcclxuICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2ZlYXR1cmVHcm91cFxyXG4gICAgICAgICAgICAgICAgLm9mZignbGF5ZXJhZGQnLCB0aGlzLl9lbmFibGVMYXllckVkaXQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub2ZmKCdsYXllcnJlbW92ZScsIHRoaXMuX2Rpc2FibGVMYXllckVkaXQsIHRoaXMpO1xyXG4gICAgICAgICAgICBMLkhhbmRsZXIucHJvdG90eXBlLmRpc2FibGUuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUoTC5EcmF3LkV2ZW50LkVESVRTVE9QLCB7aGFuZGxlcjogdGhpcy50eXBlfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZGlzYWJsZWQnLCB7aGFuZGxlcjogdGhpcy50eXBlfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBhZGRIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gQWRkIGxpc3RlbmVyIGhvb2tzIGZvciB0aGlzIGhhbmRsZXJcclxuICAgICAgICBhZGRIb29rczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1hcCkge1xyXG4gICAgICAgICAgICAgICAgbWFwLmdldENvbnRhaW5lcigpLmZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmVhdHVyZUdyb3VwLmVhY2hMYXllcih0aGlzLl9lbmFibGVMYXllckVkaXQsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAgPSBuZXcgTC5EcmF3LlRvb2x0aXAodGhpcy5fbWFwKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAudXBkYXRlQ29udGVudCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogTC5kcmF3TG9jYWwuZWRpdC5oYW5kbGVycy5lZGl0LnRvb2x0aXAudGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBzdWJ0ZXh0OiBMLmRyYXdMb2NhbC5lZGl0LmhhbmRsZXJzLmVkaXQudG9vbHRpcC5zdWJ0ZXh0XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBRdWlja2x5IGFjY2VzcyB0aGUgdG9vbHRpcCB0byB1cGRhdGUgZm9yIGludGVyc2VjdGlvbiBjaGVja2luZ1xyXG4gICAgICAgICAgICAgICAgbWFwLl9lZGl0VG9vbHRpcCA9IHRoaXMuX3Rvb2x0aXA7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVG9vbHRpcCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcFxyXG4gICAgICAgICAgICAgICAgICAgIC5vbignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAub24oJ01TUG9pbnRlck1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAub24oTC5EcmF3LkV2ZW50LkVESVRWRVJURVgsIHRoaXMuX3VwZGF0ZVRvb2x0aXAsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCByZW1vdmVIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVyIGhvb2tzIGZvciB0aGlzIGhhbmRsZXJcclxuICAgICAgICByZW1vdmVIb29rczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCBzZWxlY3RlZCBsYXllcnMuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mZWF0dXJlR3JvdXAuZWFjaExheWVyKHRoaXMuX2Rpc2FibGVMYXllckVkaXQsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBiYWNrdXBzIG9mIHRoZSBvcmlnaW5hbCBsYXllcnNcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VuZWRpdGVkTGF5ZXJQcm9wcyA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbHRpcCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZigndG91Y2htb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZignTVNQb2ludGVyTW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vZmYoTC5EcmF3LkV2ZW50LkVESVRWRVJURVgsIHRoaXMuX3VwZGF0ZVRvb2x0aXAsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCByZXZlcnRMYXllcnMoKTogdm9pZFxyXG4gICAgICAgIC8vIFJldmVydCBlYWNoIGxheWVyJ3MgZ2VvbWV0cnkgY2hhbmdlc1xyXG4gICAgICAgIHJldmVydExheWVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9mZWF0dXJlR3JvdXAuZWFjaExheWVyKGZ1bmN0aW9uIChsYXllcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmV2ZXJ0TGF5ZXIobGF5ZXIpO1xyXG4gICAgICAgICAgICB9LCB0aGlzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHNhdmUoKTogdm9pZFxyXG4gICAgICAgIC8vIFNhdmUgdGhlIGxheWVyIGdlb21ldHJpZXNcclxuICAgICAgICBzYXZlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBlZGl0ZWRMYXllcnMgPSBuZXcgTC5MYXllckdyb3VwKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZlYXR1cmVHcm91cC5lYWNoTGF5ZXIoZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIuZWRpdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdGVkTGF5ZXJzLmFkZExheWVyKGxheWVyKTtcclxuICAgICAgICAgICAgICAgICAgICBsYXllci5lZGl0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKEwuRHJhdy5FdmVudC5FRElURUQsIHtsYXllcnM6IGVkaXRlZExheWVyc30pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9iYWNrdXBMYXllcjogZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgICAgIHZhciBpZCA9IEwuVXRpbC5zdGFtcChsYXllcik7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3VuZWRpdGVkTGF5ZXJQcm9wc1tpZF0pIHtcclxuICAgICAgICAgICAgICAgIC8vIFBvbHlsaW5lLCBQb2x5Z29uIG9yIFJlY3RhbmdsZVxyXG4gICAgICAgICAgICAgICAgaWYgKGxheWVyIGluc3RhbmNlb2YgTC5Qb2x5bGluZSB8fCBsYXllciBpbnN0YW5jZW9mIEwuUG9seWdvbiB8fCBsYXllciBpbnN0YW5jZW9mIEwuUmVjdGFuZ2xlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5lZGl0ZWRMYXllclByb3BzW2lkXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGF0bG5nczogTC5MYXRMbmdVdGlsLmNsb25lTGF0TG5ncyhsYXllci5nZXRMYXRMbmdzKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXIgaW5zdGFuY2VvZiBMLkNpcmNsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZWRpdGVkTGF5ZXJQcm9wc1tpZF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhdGxuZzogTC5MYXRMbmdVdGlsLmNsb25lTGF0TG5nKGxheWVyLmdldExhdExuZygpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiBsYXllci5nZXRSYWRpdXMoKVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyIGluc3RhbmNlb2YgTC5NYXJrZXIgfHwgbGF5ZXIgaW5zdGFuY2VvZiBMLkNpcmNsZU1hcmtlcikgeyAvLyBNYXJrZXJcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmVkaXRlZExheWVyUHJvcHNbaWRdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXRsbmc6IEwuTGF0TG5nVXRpbC5jbG9uZUxhdExuZyhsYXllci5nZXRMYXRMbmcoKSlcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldFRvb2x0aXBUZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogTC5kcmF3TG9jYWwuZWRpdC5oYW5kbGVycy5lZGl0LnRvb2x0aXAudGV4dCxcclxuICAgICAgICAgICAgICAgIHN1YnRleHQ6IEwuZHJhd0xvY2FsLmVkaXQuaGFuZGxlcnMuZWRpdC50b29sdGlwLnN1YnRleHRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3VwZGF0ZVRvb2x0aXA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcC51cGRhdGVDb250ZW50KHRoaXMuX2dldFRvb2x0aXBUZXh0KCkpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9yZXZlcnRMYXllcjogZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgICAgIHZhciBpZCA9IEwuVXRpbC5zdGFtcChsYXllcik7XHJcbiAgICAgICAgICAgIGxheWVyLmVkaXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fdW5lZGl0ZWRMYXllclByb3BzLmhhc093blByb3BlcnR5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gUG9seWxpbmUsIFBvbHlnb24gb3IgUmVjdGFuZ2xlXHJcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIgaW5zdGFuY2VvZiBMLlBvbHlsaW5lIHx8IGxheWVyIGluc3RhbmNlb2YgTC5Qb2x5Z29uIHx8IGxheWVyIGluc3RhbmNlb2YgTC5SZWN0YW5nbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXllci5zZXRMYXRMbmdzKHRoaXMuX3VuZWRpdGVkTGF5ZXJQcm9wc1tpZF0ubGF0bG5ncyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyIGluc3RhbmNlb2YgTC5DaXJjbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXllci5zZXRMYXRMbmcodGhpcy5fdW5lZGl0ZWRMYXllclByb3BzW2lkXS5sYXRsbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxheWVyLnNldFJhZGl1cyh0aGlzLl91bmVkaXRlZExheWVyUHJvcHNbaWRdLnJhZGl1cyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyIGluc3RhbmNlb2YgTC5NYXJrZXIgfHwgbGF5ZXIgaW5zdGFuY2VvZiBMLkNpcmNsZU1hcmtlcikgeyAvLyBNYXJrZXIgb3IgQ2lyY2xlTWFya2VyXHJcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIuc2V0TGF0TG5nKHRoaXMuX3VuZWRpdGVkTGF5ZXJQcm9wc1tpZF0ubGF0bG5nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsYXllci5maXJlKCdyZXZlcnQtZWRpdGVkJywge2xheWVyOiBsYXllcn0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2VuYWJsZUxheWVyRWRpdDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdmFyIGxheWVyID0gZS5sYXllciB8fCBlLnRhcmdldCB8fCBlLFxyXG4gICAgICAgICAgICAgICAgcGF0aE9wdGlvbnMsIHBvbHk7XHJcblxyXG4gICAgICAgICAgICAvLyBCYWNrIHVwIHRoaXMgbGF5ZXIgKGlmIGhhdmVuJ3QgYmVmb3JlKVxyXG4gICAgICAgICAgICB0aGlzLl9iYWNrdXBMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvbHkpIHtcclxuICAgICAgICAgICAgICAgIHBvbHkgPSBMLlV0aWwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMucG9seSk7XHJcbiAgICAgICAgICAgICAgICBsYXllci5vcHRpb25zLnBvbHkgPSBwb2x5O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTZXQgZGlmZmVyZW50IHN0eWxlIGZvciBlZGl0aW5nIG1vZGVcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWxlY3RlZFBhdGhPcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBwYXRoT3B0aW9ucyA9IEwuVXRpbC5leHRlbmQoe30sIHRoaXMub3B0aW9ucy5zZWxlY3RlZFBhdGhPcHRpb25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGV4aXN0aW5nIGNvbG9yIG9mIHRoZSBsYXllclxyXG4gICAgICAgICAgICAgICAgaWYgKHBhdGhPcHRpb25zLm1haW50YWluQ29sb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXRoT3B0aW9ucy5jb2xvciA9IGxheWVyLm9wdGlvbnMuY29sb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aE9wdGlvbnMuZmlsbENvbG9yID0gbGF5ZXIub3B0aW9ucy5maWxsQ29sb3I7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGF5ZXIub3B0aW9ucy5vcmlnaW5hbCA9IEwuZXh0ZW5kKHt9LCBsYXllci5vcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIGxheWVyLm9wdGlvbnMuZWRpdGluZyA9IHBhdGhPcHRpb25zO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxheWVyIGluc3RhbmNlb2YgTC5NYXJrZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChsYXllci5lZGl0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIuZWRpdGluZy5lbmFibGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxheWVyLmRyYWdnaW5nLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgbGF5ZXJcclxuICAgICAgICAgICAgICAgICAgICAub24oJ2RyYWdlbmQnLCB0aGlzLl9vbk1hcmtlckRyYWdFbmQpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gI1RPRE86IHJlbW92ZSB3aGVuIGxlYWZsZXQgZmluYWxseSBmaXhlcyB0aGVpciBkcmFnZ2FibGUgc28gaXQncyB0b3VjaCBmcmllbmRseSBhZ2Fpbi5cclxuICAgICAgICAgICAgICAgICAgICAub24oJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbignTVNQb2ludGVyTW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbigndG91Y2hlbmQnLCB0aGlzLl9vbk1hcmtlckRyYWdFbmQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdNU1BvaW50ZXJVcCcsIHRoaXMuX29uTWFya2VyRHJhZ0VuZCwgdGhpcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsYXllci5lZGl0aW5nLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2Rpc2FibGVMYXllckVkaXQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXllciA9IGUubGF5ZXIgfHwgZS50YXJnZXQgfHwgZTtcclxuXHJcbiAgICAgICAgICAgIGxheWVyLmVkaXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAobGF5ZXIuZWRpdGluZykge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuZWRpdGluZy5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRlbGV0ZSBsYXllci5vcHRpb25zLmVkaXRpbmc7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBsYXllci5vcHRpb25zLm9yaWdpbmFsO1xyXG4gICAgICAgICAgICAvLyBSZXNldCBsYXllciBzdHlsZXMgdG8gdGhhdCBvZiBiZWZvcmUgc2VsZWN0XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZFBhdGhPcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIgaW5zdGFuY2VvZiBMLk1hcmtlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RvZ2dsZU1hcmtlckhpZ2hsaWdodChsYXllcik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBsYXllciBzdHlsZSB0byB3aGF0IGlzIHdhcyBiZWZvcmUgYmVpbmcgc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgICAgICBsYXllci5zZXRTdHlsZShsYXllci5vcHRpb25zLnByZXZpb3VzT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBjYWNoZWQgb3B0aW9ucyBmb3IgdGhlIGxheWVyIG9iamVjdFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsYXllci5vcHRpb25zLnByZXZpb3VzT3B0aW9ucztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxheWVyIGluc3RhbmNlb2YgTC5NYXJrZXIpIHtcclxuICAgICAgICAgICAgICAgIGxheWVyLmRyYWdnaW5nLmRpc2FibGUoKTtcclxuICAgICAgICAgICAgICAgIGxheWVyXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZignZHJhZ2VuZCcsIHRoaXMuX29uTWFya2VyRHJhZ0VuZCwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAub2ZmKCd0b3VjaG1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAub2ZmKCdNU1BvaW50ZXJNb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZigndG91Y2hlbmQnLCB0aGlzLl9vbk1hcmtlckRyYWdFbmQsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZignTVNQb2ludGVyVXAnLCB0aGlzLl9vbk1hcmtlckRyYWdFbmQsIHRoaXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuZWRpdGluZy5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXAudXBkYXRlUG9zaXRpb24oZS5sYXRsbmcpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbk1hcmtlckRyYWdFbmQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXllciA9IGUudGFyZ2V0O1xyXG4gICAgICAgICAgICBsYXllci5lZGl0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShMLkRyYXcuRXZlbnQuRURJVE1PVkUsIHtsYXllcjogbGF5ZXJ9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Ub3VjaE1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciB0b3VjaEV2ZW50ID0gZS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLFxyXG4gICAgICAgICAgICAgICAgbGF5ZXJQb2ludCA9IHRoaXMuX21hcC5tb3VzZUV2ZW50VG9MYXllclBvaW50KHRvdWNoRXZlbnQpLFxyXG4gICAgICAgICAgICAgICAgbGF0bG5nID0gdGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhsYXllclBvaW50KTtcclxuICAgICAgICAgICAgZS50YXJnZXQuc2V0TGF0TG5nKGxhdGxuZyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2hhc0F2YWlsYWJsZUxheWVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmVhdHVyZUdyb3VwLmdldExheWVycygpLmxlbmd0aCAhPT0gMDtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAY2xhc3MgTC5FZGl0VG9vbGJhci5EZWxldGVcclxuICAgICAqIEBha2EgRWRpdFRvb2xiYXIuRGVsZXRlXHJcbiAgICAgKi9cclxuICAgIEwuRWRpdFRvb2xiYXIuRGVsZXRlID0gTC5IYW5kbGVyLmV4dGVuZCh7XHJcbiAgICAgICAgc3RhdGljczoge1xyXG4gICAgICAgICAgICBUWVBFOiAncmVtb3ZlJyAvLyBub3QgZGVsZXRlIGFzIGRlbGV0ZSBpcyByZXNlcnZlZCBpbiBqc1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGluY2x1ZGVzOiBMLk1peGluLkV2ZW50cyxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBpbnRpYWxpemUoKTogdm9pZFxyXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChtYXAsIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgTC5IYW5kbGVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbWFwKTtcclxuXHJcbiAgICAgICAgICAgIEwuVXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgLy8gU3RvcmUgdGhlIHNlbGVjdGFibGUgbGF5ZXIgZ3JvdXAgZm9yIGVhc2Ugb2YgYWNjZXNzXHJcbiAgICAgICAgICAgIHRoaXMuX2RlbGV0YWJsZUxheWVycyA9IHRoaXMub3B0aW9ucy5mZWF0dXJlR3JvdXA7XHJcblxyXG4gICAgICAgICAgICBpZiAoISh0aGlzLl9kZWxldGFibGVMYXllcnMgaW5zdGFuY2VvZiBMLkZlYXR1cmVHcm91cCkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5mZWF0dXJlR3JvdXAgbXVzdCBiZSBhIEwuRmVhdHVyZUdyb3VwJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHR5cGUgc28gc3VwZXIgY2FuIGZpcmUsIG5lZWQgdG8gZG8gdGhpcyBhcyBjYW5ub3QgZG8gdGhpcy5UWVBFIDooXHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEwuRWRpdFRvb2xiYXIuRGVsZXRlLlRZUEU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCBlbmFibGUoKTogdm9pZFxyXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZGVsZXRlIHRvb2xiYXJcclxuICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2VuYWJsZWQgfHwgIXRoaXMuX2hhc0F2YWlsYWJsZUxheWVycygpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5maXJlKCdlbmFibGVkJywge2hhbmRsZXI6IHRoaXMudHlwZX0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUoTC5EcmF3LkV2ZW50LkRFTEVURVNUQVJULCB7aGFuZGxlcjogdGhpcy50eXBlfSk7XHJcblxyXG4gICAgICAgICAgICBMLkhhbmRsZXIucHJvdG90eXBlLmVuYWJsZS5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZGVsZXRhYmxlTGF5ZXJzXHJcbiAgICAgICAgICAgICAgICAub24oJ2xheWVyYWRkJywgdGhpcy5fZW5hYmxlTGF5ZXJEZWxldGUsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAub24oJ2xheWVycmVtb3ZlJywgdGhpcy5fZGlzYWJsZUxheWVyRGVsZXRlLCB0aGlzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGRpc2FibGUoKTogdm9pZFxyXG4gICAgICAgIC8vIERpc2FibGUgdGhlIGRlbGV0ZSB0b29sYmFyXHJcbiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fZGVsZXRhYmxlTGF5ZXJzXHJcbiAgICAgICAgICAgICAgICAub2ZmKCdsYXllcmFkZCcsIHRoaXMuX2VuYWJsZUxheWVyRGVsZXRlLCB0aGlzKVxyXG4gICAgICAgICAgICAgICAgLm9mZignbGF5ZXJyZW1vdmUnLCB0aGlzLl9kaXNhYmxlTGF5ZXJEZWxldGUsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgTC5IYW5kbGVyLnByb3RvdHlwZS5kaXNhYmxlLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShMLkRyYXcuRXZlbnQuREVMRVRFU1RPUCwge2hhbmRsZXI6IHRoaXMudHlwZX0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maXJlKCdkaXNhYmxlZCcsIHtoYW5kbGVyOiB0aGlzLnR5cGV9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIGFkZEhvb2tzKCk6IHZvaWRcclxuICAgICAgICAvLyBBZGQgbGlzdGVuZXIgaG9va3MgdG8gdGhpcyBoYW5kbGVyXHJcbiAgICAgICAgYWRkSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcDtcclxuXHJcbiAgICAgICAgICAgIGlmIChtYXApIHtcclxuICAgICAgICAgICAgICAgIG1hcC5nZXRDb250YWluZXIoKS5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2RlbGV0YWJsZUxheWVycy5lYWNoTGF5ZXIodGhpcy5fZW5hYmxlTGF5ZXJEZWxldGUsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVsZXRlZExheWVycyA9IG5ldyBMLkxheWVyR3JvdXAoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b29sdGlwID0gbmV3IEwuRHJhdy5Ub29sdGlwKHRoaXMuX21hcCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b29sdGlwLnVwZGF0ZUNvbnRlbnQoe3RleHQ6IEwuZHJhd0xvY2FsLmVkaXQuaGFuZGxlcnMucmVtb3ZlLnRvb2x0aXAudGV4dH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQG1ldGhvZCByZW1vdmVIb29rcygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVyIGhvb2tzIGZyb20gdGhpcyBoYW5kbGVyXHJcbiAgICAgICAgcmVtb3ZlSG9va3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVsZXRhYmxlTGF5ZXJzLmVhY2hMYXllcih0aGlzLl9kaXNhYmxlTGF5ZXJEZWxldGUsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVsZXRlZExheWVycyA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9vbHRpcC5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b29sdGlwID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHJldmVydExheWVycygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmV2ZXJ0IHRoZSBkZWxldGVkIGxheWVycyBiYWNrIHRvIHRoZWlyIHByaW9yIHN0YXRlLlxyXG4gICAgICAgIHJldmVydExheWVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBJdGVyYXRlIG9mIHRoZSBkZWxldGVkIGxheWVycyBhbmQgYWRkIHRoZW0gYmFjayBpbnRvIHRoZSBmZWF0dXJlR3JvdXBcclxuICAgICAgICAgICAgdGhpcy5fZGVsZXRlZExheWVycy5lYWNoTGF5ZXIoZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWxldGFibGVMYXllcnMuYWRkTGF5ZXIobGF5ZXIpO1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuZmlyZSgncmV2ZXJ0LWRlbGV0ZWQnLCB7bGF5ZXI6IGxheWVyfSk7XHJcbiAgICAgICAgICAgIH0sIHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEBtZXRob2Qgc2F2ZSgpOiB2b2lkXHJcbiAgICAgICAgLy8gU2F2ZSBkZWxldGVkIGxheWVyc1xyXG4gICAgICAgIHNhdmU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUoTC5EcmF3LkV2ZW50LkRFTEVURUQsIHtsYXllcnM6IHRoaXMuX2RlbGV0ZWRMYXllcnN9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBAbWV0aG9kIHJlbW92ZUFsbExheWVycygpOiB2b2lkXHJcbiAgICAgICAgLy8gUmVtb3ZlIGFsbCBkZWxhdGVhYmxlIGxheWVyc1xyXG4gICAgICAgIHJlbW92ZUFsbExheWVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBJdGVyYXRlIG9mIHRoZSBkZWxhdGVhYmxlIGxheWVycyBhbmQgYWRkIHJlbW92ZSB0aGVtXHJcbiAgICAgICAgICAgIHRoaXMuX2RlbGV0YWJsZUxheWVycy5lYWNoTGF5ZXIoZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVMYXllcih7bGF5ZXI6IGxheWVyfSk7XHJcbiAgICAgICAgICAgIH0sIHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZW5hYmxlTGF5ZXJEZWxldGU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXllciA9IGUubGF5ZXIgfHwgZS50YXJnZXQgfHwgZTtcclxuXHJcbiAgICAgICAgICAgIGxheWVyLm9uKCdjbGljaycsIHRoaXMuX3JlbW92ZUxheWVyLCB0aGlzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZGlzYWJsZUxheWVyRGVsZXRlOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgbGF5ZXIgPSBlLmxheWVyIHx8IGUudGFyZ2V0IHx8IGU7XHJcblxyXG4gICAgICAgICAgICBsYXllci5vZmYoJ2NsaWNrJywgdGhpcy5fcmVtb3ZlTGF5ZXIsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gdGhlIGRlbGV0ZWQgbGF5ZXJzIHNvIHdlIGNhbid0IGFjY2lkZW50YWxseSByZXZlcnQgaWYgdGhlIHVzZXIgcHJlc3NlcyBjYW5jZWxcclxuICAgICAgICAgICAgdGhpcy5fZGVsZXRlZExheWVycy5yZW1vdmVMYXllcihsYXllcik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3JlbW92ZUxheWVyOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgbGF5ZXIgPSBlLmxheWVyIHx8IGUudGFyZ2V0IHx8IGU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9kZWxldGFibGVMYXllcnMucmVtb3ZlTGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZGVsZXRlZExheWVycy5hZGRMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgICAgICBsYXllci5maXJlKCdkZWxldGVkJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uTW91c2VNb3ZlOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLl90b29sdGlwLnVwZGF0ZVBvc2l0aW9uKGUubGF0bG5nKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfaGFzQXZhaWxhYmxlTGF5ZXJzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxldGFibGVMYXllcnMuZ2V0TGF5ZXJzKCkubGVuZ3RoICE9PSAwO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbn0od2luZG93LCBkb2N1bWVudCkpO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1sZWFmbGV0LmRyYXctc3JjLm1hcCIsIi8vSU1BR0VTXHJcbmltcG9ydCBpbWdTYXZlIGZyb20gJy4uL2ltYWdlcy9zZWN0by9zYXZlLnBuZyc7XHJcbmltcG9ydCBpbWdNYXJrZXJCbGFjayBmcm9tICcuLi9pbWFnZXMvc2VjdG8vaWNvbl9tYXJrZXJfYmxhY2sucG5nJztcclxuaW1wb3J0IGltZ01hcmtlclJlZCBmcm9tICcuLi9pbWFnZXMvc2VjdG8vaWNvbl9tYXJrZXJfcmVkLnBuZyc7XHJcbmltcG9ydCBpbWdDaXJjbGUgZnJvbSAnLi4vaW1hZ2VzL3NlY3RvL2NpcmNsZS5wbmcnO1xyXG5pbXBvcnQgaW1nTWFpc29uIGZyb20gJy4uL2ltYWdlcy9zZWN0by9tYWlzb24ucG5nJztcclxuaW1wb3J0IGltZ1VuZG8gZnJvbSAnLi4vaW1hZ2VzL3NlY3RvL3VuZG8ucG5nJztcclxuaW1wb3J0IGltZ1JlZnJlc2ggZnJvbSAnLi4vaW1hZ2VzL3NlY3RvL3JlZnJlc2gucG5nJztcclxuaW1wb3J0IGltZ1Bhc3RpbGxlIGZyb20gJy4uL2ltYWdlcy9zZWN0by9wYXN0aWxsZS5wbmcnO1xyXG5pbXBvcnQgaW1nQkREIGZyb20gJy4uL2ltYWdlcy9zZWN0by9iZGQucG5nJztcclxuaW1wb3J0IGltZ0NyZWF0aW9uQXNzaXN0IGZyb20gJy4uL2ltYWdlcy9zZWN0by9jcmVhdGlvbl9hc3Npc3QucG5nJztcclxuaW1wb3J0IGltZ0NsaWVudHMgZnJvbSAnLi4vaW1hZ2VzL3NlY3RvL2NsaWVudHMzMC5wbmcnO1xyXG5pbXBvcnQgaW1nQWdlbnRzIGZyb20gJy4uL2ltYWdlcy9zZWN0by9hZ2VudHMucG5nJ1xyXG5pbXBvcnQgaW1nTnVtYmVyIGZyb20gJy4uL2ltYWdlcy9zZWN0by9udW1iZXIucG5nJztcclxuaW1wb3J0IGltZ0RlbnNpdGUgZnJvbSAnLi4vaW1hZ2VzL3NlY3RvL2RlbnNpdGUxLnBuZyc7XHJcbmltcG9ydCBpbWdDbGllbnRzT3V0IGZyb20gJy4uL2ltYWdlcy9zZWN0by9jbGllbnRzT3V0LnBuZyc7XHJcblxyXG4vL1NUWUxFXHJcbmltcG9ydCAnbGVhZmxldC9kaXN0L2xlYWZsZXQuY3NzJztcclxuaW1wb3J0ICcuLi9zdHlsZXMvc2VjdG9yaXNhdGlvbi5jc3MnO1xyXG5pbXBvcnQgJy4uL3N0eWxlcy90aW1lbGluZS5jc3MnO1xyXG5pbXBvcnQgJ2xlYWZsZXQvZGlzdC9sZWFmbGV0LXNyYyc7XHJcbmltcG9ydCAnYm9vdHN0cmFwLXRhYmxlL2Rpc3QvYm9vdHN0cmFwLXRhYmxlLm1pbi5jc3MnO1xyXG5cclxuLy9KU1xyXG5pbXBvcnQgJ2Jvb3RzdHJhcC10YWJsZS9kaXN0L2Jvb3RzdHJhcC10YWJsZS5qcyc7XHJcbmltcG9ydCAnYm9vdHN0cmFwLXRhYmxlL2Rpc3QvYm9vdHN0cmFwLXRhYmxlLWxvY2FsZS1hbGwubWluLmpzJztcclxuaW1wb3J0ICcuL21hcC9sZWFmbGV0LmRyYXctY3VzdG9tLmpzJztcclxuaW1wb3J0ICdsZWFmbGV0L2Rpc3QvbGVhZmxldC1zcmMuanMnO1xyXG5pbXBvcnQgJy4vbWFwL2xlYWZsZXQtc2VhcmNoLmpzJztcclxuXHJcbi8vJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xyXG4kKGRvY3VtZW50KS5vbigncmVhZHkgdHVyYm86bG9hZCcsIGZ1bmN0aW9uKCkge1xyXG4gICAgLypyZWRpbWVuc2lvbm5lbWVudCBjYXJ0ZSovXHJcbiAgICAkKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgaGVpZ2h0ID0gMzQ0O1xyXG4gICAgICAgIHZhciB3aWR0aCA9IDYwO1xyXG4gICAgICAgIGlmKCQoJyNmaWx0ZXItY29udGFpbmVyJykuaGFzQ2xhc3MoJ2FjdGl2ZScpKXtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gNDgyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZighJCgnI2Jsb2NSaWdodCcpLmhhc0NsYXNzKCdhY3RpdmUnKSl7XHJcbiAgICAgICAgICAgIHdpZHRoID0gOTc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQoJyNzZWN0b3Jpc2F0aW9uTWFwJykuY3NzKCd3aWR0aCcsIHdpZHRoICsgJyUnKTtcclxuICAgICAgICB2YXIgc0ggPSAkKHdpbmRvdykuaGVpZ2h0KCkgLSBoZWlnaHQ7XHJcbiAgICAgICAgJCgnI3NlY3RvcmlzYXRpb25NYXAnKS5jc3MoJ2hlaWdodCcsIChzSCArIDMwKSArICdweCcpO1xyXG4gICAgICAgICQoJyNibG9jVGFiJykuY3NzKCdoZWlnaHQnLCBzSCArICdweCcpO1xyXG4gICAgICAgICQoJyNleHBsYWluTWUnKS5jc3MoJ2hlaWdodCcsIHNIICsgJ3B4Jyk7XHJcbiAgICAgICAgJCgnI2NvbnRhaW5lck1hcCcpLmNzcygnaGVpZ2h0JywgKHNIICsgMzApICsgJ3B4Jyk7XHJcbiAgICB9KTtcclxuICAgICQoJy5keC1kYXRhZ3JpZC1zZWFyY2gtcGFuZWwnKS5jc3MoJ3dpZHRoJywgJzI1MHB4Jyk7XHJcbiAgICAkKHdpbmRvdykudHJpZ2dlcigncmVzaXplJyk7XHJcblxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbHRlci1pbWFnZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYoISQoJyNsaXN0ZUFnZW50cycpLmhhc0NsYXNzKCd2aXNpYmxlJykpe1xyXG4gICAgICAgICAgICAkKCcjbGlzdGVBZ2VudHMnKS5hZGRDbGFzcygndmlzaWJsZScpO1xyXG4gICAgICAgICAgICAkKCcjbGlzdGVBZ2VudHMnKS5zaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQod2luZG93KS50cmlnZ2VyKCdyZXNpemUnKTtcclxuICAgIH0pXHJcblxyXG5cclxuICAgICQoJyNtaW5pbWl6ZS10YWInKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgJCgnI2Jsb2NSaWdodCcpLnRvZ2dsZUNsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAkKHdpbmRvdykudHJpZ2dlcigncmVzaXplJyk7XHJcbiAgICB9KTtcclxuICAgIC8qZmluIHJlZGltZW5zaW9ubmVtZW50IGNhcnRlKi9cclxuXHJcbiAgICAvKlZBUklBQkxFUyovXHJcbiAgICB2YXIgdGFiQ29sb3IgPSBbJ1NQUklOR0dSRUVOJywgJ2FxdWEnLCAneWVsbG93JywgJ0RFRVBQSU5LJywgJ1NURUVMQkxVRScsICdncmVlbicsICdHT0xERU5ST0QnLCAnREVFUFNLWUJMVUUnLCAnbWFnZW50YScsICdwdXJwbGUnLCAnb3JhbmdlJywgJ0RBUktSRUQnLCAnbWFyb29uJ107XHJcbiAgICB2YXIgdGFiQW50ZW5uZXMgPSBbJ1ZFUkdOSUVVWCcsICdIQU5OSVFVRVQnLCAnR09TTkVUJywgJ0NIRVpFJywgJ0xBSEFMTEUnXTtcclxuICAgIHZhciBjb2xvcnMgPSBbXTtcclxuICAgIHZhciBmaWxsQ29sb3JXaXRob3V0QWdlbnQgPSAnYmxhY2snO1xyXG4gICAgdmFyIGNvbG9yV2l0aG91dEFnZW50ID0gJ3JlZCc7XHJcbiAgICB2YXIgY29sb3JXaXRoQWdlbnQgPSAnIzAwMCc7XHJcbiAgICB2YXIgdGFiQWdlbnRzID0gSlNPTi5wYXJzZSgkKCcjdGFiQWdlbnRzJylbMF0uaW5uZXJIVE1MKTtcclxuICAgIHZhciBzaXRlVXNlciA9ICQoJyNzaXRlJylbMF0uaW5uZXJIVE1MO1xyXG4gICAgY29uc29sZS5pbmZvKGFnZW50cyk7XHJcbiAgICB2YXIgdGFiTmJDbGllbnRzID0gW107XHJcbiAgICBmb3IgKHZhciBpIGluIHRhYkFnZW50cykge1xyXG4gICAgICAgIGlmICghdGFiTmJDbGllbnRzW3RhYkFnZW50c1tpXVsnY29kZV9hZ2VudCddXSkge1xyXG4gICAgICAgICAgICB0YWJOYkNsaWVudHNbdGFiQWdlbnRzW2ldWydjb2RlX2FnZW50J11dID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRhYk5iQ2xpZW50c1t0YWJBZ2VudHNbaV1bJ2NvZGVfYWdlbnQnXV1bJ25iQ2xpZW50cyddID0gdGFiQWdlbnRzW2ldWyduYl9jbGllbnRzJ107XHJcbiAgICAgICAgdGFiTmJDbGllbnRzW3RhYkFnZW50c1tpXVsnY29kZV9hZ2VudCddXVsnZmFtaWxsZTAnXSA9IHRhYkFnZW50c1tpXVsnZmFtaWxsZTAnXTtcclxuICAgICAgICB0YWJOYkNsaWVudHNbdGFiQWdlbnRzW2ldWydjb2RlX2FnZW50J11dWydmYW1pbGxlMSddID0gdGFiQWdlbnRzW2ldWydmYW1pbGxlMSddO1xyXG4gICAgICAgIHRhYk5iQ2xpZW50c1t0YWJBZ2VudHNbaV1bJ2NvZGVfYWdlbnQnXV1bJ2ZhbWlsbGUyJ10gPSB0YWJBZ2VudHNbaV1bJ2ZhbWlsbGUyJ107XHJcbiAgICAgICAgdGFiTmJDbGllbnRzW3RhYkFnZW50c1tpXVsnY29kZV9hZ2VudCddXVsnZmFtaWxsZTMnXSA9IHRhYkFnZW50c1tpXVsnZmFtaWxsZTMnXTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgbGFzdElkID0gMDtcclxuICAgIHZhciBtYXJrZXJEZWNvdXBhZ2UgPSBuZXcgTC5sYXllckdyb3VwKCk7XHJcbiAgICB2YXIgbWFya2VyMSA9ICcnO1xyXG4gICAgdmFyIG1hcmtlcjIgPSAnJztcclxuICAgIHZhciBmdXNpb24gPSBmYWxzZTtcclxuICAgIHZhciBkZWNvdXBhZ2UgPSBmYWxzZTtcclxuICAgIHZhciBtb2RpZmljYXRpb24gPSBmYWxzZTtcclxuICAgIHZhciBjcmVhdGlvbiA9IGZhbHNlO1xyXG4gICAgdmFyIGFzc2lzdCA9IGZhbHNlO1xyXG4gICAgdmFyIGNvbnRhaW5lckNsaWNrID0gZmFsc2U7XHJcbiAgICB2YXIgc2hvd1Rvb2x0aXAgPSBmYWxzZTtcclxuICAgIC8vdmFyIGFnZW50cyA9ICcnO1xyXG4gICAgdmFyIHNob3dBZ2VudHMgPSB0cnVlO1xyXG4gICAgdmFyIHNob3dBZ2VudHNPZlNlY3RldXJzID0gdHJ1ZTtcclxuICAgIHZhciBkZW5zaXRlQ2xpZW50cyA9ICcnO1xyXG4gICAgdmFyIHNob3dEZW5zaXRlID0gZmFsc2U7XHJcbiAgICB2YXIgY2xpZW50c1dpdGhvdXRTZWN0ZXVyID0gbmV3IEwuRmVhdHVyZUdyb3VwKCk7XHJcbiAgICB2YXIgZ2VvanNvbkNsaWVudHMgPSAnJztcclxuICAgIHZhciBzaG93Q2xpZW50cyA9IGZhbHNlO1xyXG4gICAgdmFyIHRhYkRlbnNpdGUgPSBbXTtcclxuICAgIHZhciBzZWN0ZXVyc0J5UmVzcG9uc2FibGUgPSBbXTtcclxuICAgIHZhciBzZWN0ZXVyc1NlbGVjdCA9ICcnO1xyXG4gICAgdmFyIGhpc3RvcmlxdWVBY3Rpb25zID0gW107IC8vQ29udGllbnQgbGEgbGlzdGUgZGVzIGFjdGlvbnMgZmFpdGVzIGRlcHVpcyBsYSBkZXJuacOocmUgc2F1dmVnYXJkZVxyXG4gICAgdmFyIGhpc3RvUG9seWdvbiA9ICcnO1xyXG4gICAgdmFyIGZsYWdVbmRvID0gZmFsc2U7XHJcbiAgICB2YXIgZXZlbnRBY3RpZiA9IGZhbHNlO1xyXG5cclxuICAgIHZhciBvcHRpb25zQ2lyY2xlQ2xpZW50cyA9IHtcclxuICAgICAgICByYWRpdXM6IDMsXHJcbiAgICAgICAgb3BhY2l0eTogMSxcclxuICAgICAgICBmaWxsQ29sb3I6IFwiI2UyMDYxM1wiLFxyXG4gICAgICAgIGNvbG9yOiBcIiMwMDBcIixcclxuICAgICAgICB3ZWlnaHQ6IDEsXHJcbiAgICAgICAgZmlsbE9wYWNpdHk6IDEsXHJcbiAgICB9O1xyXG4gICAgLypGSU4gVkFSSUFCTEVTKi9cclxuXHJcbiAgICAvKklDT05TKi9cclxuICAgIHZhciBtYXJrZXJJY29uID0gTC5pY29uKHtcclxuICAgICAgICBpY29uVXJsOiBpbWdNYXJrZXJCbGFjayxcclxuICAgICAgICBpY29uQW5jaG9yOiBbMTIsIDIxXSwgLy8gcG9pbnQgb2YgdGhlIGljb24gd2hpY2ggd2lsbCBjb3JyZXNwb25kIHRvIG1hcmtlcidzIGxvY2F0aW9uXHJcbiAgICB9KTtcclxuXHJcbiAgICB2YXIgbWFya2VySWNvblJlZCA9IEwuaWNvbih7XHJcbiAgICAgICAgaWNvblVybDogaW1nTWFya2VyUmVkLFxyXG4gICAgICAgIGljb25BbmNob3I6IFsxMiwgMjFdLCAvLyBwb2ludCBvZiB0aGUgaWNvbiB3aGljaCB3aWxsIGNvcnJlc3BvbmQgdG8gbWFya2VyJ3MgbG9jYXRpb25cclxuICAgIH0pO1xyXG4gICAgdmFyIGNpcmNsZUljb24gPSBMLmljb24oe1xyXG4gICAgICAgIGljb25Vcmw6IGltZ0NpcmNsZSxcclxuICAgICAgICBpY29uU2l6ZTogWzE0LCAxNF0sIC8vIHNpemUgb2YgdGhlIGljb25cclxuICAgICAgICBpY29uQW5jaG9yOiBbNywgN10sIC8vIHBvaW50IG9mIHRoZSBpY29uIHdoaWNoIHdpbGwgY29ycmVzcG9uZCB0byBtYXJrZXIncyBsb2NhdGlvblxyXG4gICAgfSk7XHJcbiAgICB2YXIgaG9tZUljb24gPSBMLmljb24oe1xyXG4gICAgICAgIGljb25Vcmw6IGltZ01haXNvbixcclxuICAgICAgICBpY29uU2l6ZTogWzIwLCAyMF0sIC8vIHNpemUgb2YgdGhlIGljb25cclxuICAgICAgICBpY29uQW5jaG9yOiBbMTAsIDEwXSwgLy8gcG9pbnQgb2YgdGhlIGljb24gd2hpY2ggd2lsbCBjb3JyZXNwb25kIHRvIG1hcmtlcidzIGxvY2F0aW9uXHJcbiAgICB9KTtcclxuICAgIC8qRklOIElDT05TKi9cclxuXHJcbiAgICAvKkRFQ0xBUkFUSU9OIE1BUCovXHJcbiAgICB2YXIgem9vbSA9IDExO1xyXG4gICAgdmFyIGNvb3JkcyA9IFs0OC44NzY0NTc2NDQzNjY4MTYsIDIuMzY0NDYzODA2MTUyMzQzOF07XHJcbiAgICBpZiAoc2l0ZVVzZXIgPT0gXCJCUk9OXCIpIHtcclxuICAgICAgICBjb29yZHMgPSBbNDUuNzUsIDQuODVdO1xyXG4gICAgfSBlbHNlIGlmIChzaXRlVXNlciA9PSBcIkhBTk5JUVVFVFwiKSB7XHJcbiAgICAgICAgY29vcmRzID0gWzQ4LjM4NSwgMi45NTFdO1xyXG4gICAgICAgIHpvb20gPSAxMDtcclxuICAgIH0gZWxzZSBpZiAoc2l0ZVVzZXIgPT0gXCJHT1NORVRcIikge1xyXG4gICAgICAgIGNvb3JkcyA9IFs0OS40MjksIDIuMDhdO1xyXG4gICAgICAgIHpvb20gPSA5O1xyXG4gICAgfSBlbHNlIGlmIChzaXRlVXNlciA9PSBcIkxBSEFMTEVcIikge1xyXG4gICAgICAgIGNvb3JkcyA9IFs0OC44LCAyLjE5MDAwNTJdO1xyXG4gICAgICAgIHpvb20gPSAxMjtcclxuICAgIH0gZWxzZSBpZiAoc2l0ZVVzZXIgPT0gXCJWRVJHTklFVVhcIikge1xyXG4gICAgICAgIGNvb3JkcyA9IFs0OC42MiwgMS43ODAwMDc2XTtcclxuICAgICAgICB6b29tID0gMTA7XHJcbiAgICB9IGVsc2UgaWYgKHNpdGVVc2VyID09IFwiQ0hFWkVcIikge1xyXG4gICAgICAgIGNvb3JkcyA9IFs0OC41MzA5Mjc1LCAyLjE5MzkwODFdO1xyXG4gICAgICAgIHpvb20gPSAxMDtcclxuICAgIH1cclxuICAgIC8vIGlmICh0YWJBbnRlbm5lcy5pbmNsdWRlcyhzaXRlVXNlcikpIHtcclxuICAgIC8vICAgICB2YXIgdGFiRWRpdEFjdGlvbnMgPSBbXHJcbiAgICAvLyAgICAgICAgIExlYWZsZXRUb29sYmFyLlRvb2xiYXJBY3Rpb24uZXh0ZW5kKG1vZGlmaWVyU2VjdGV1cigpKSxcclxuICAgIC8vICAgICAgICAgTGVhZmxldFRvb2xiYXIuVG9vbGJhckFjdGlvbi5leHRlbmQoY2FsY3VsRGlzdGFuY2VTZWN0ZXVyKCkpXHJcbiAgICAvLyAgICAgXTtcclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgdmFyIHRhYkVkaXRBY3Rpb25zID0gW1xyXG4gICAgLy8gICAgICAgICBMZWFmbGV0VG9vbGJhci5FZGl0QWN0aW9uLlBvcHVwLkVkaXQsXHJcbiAgICAvLyAgICAgICAgIExlYWZsZXRUb29sYmFyLlRvb2xiYXJBY3Rpb24uZXh0ZW5kKGRlbGV0ZVNlY3RldXIoKSksXHJcbiAgICAvLyAgICAgICAgIExlYWZsZXRUb29sYmFyLlRvb2xiYXJBY3Rpb24uZXh0ZW5kKGRlY291cGVyU2VjdGV1cigpKSxcclxuICAgIC8vICAgICAgICAgTGVhZmxldFRvb2xiYXIuVG9vbGJhckFjdGlvbi5leHRlbmQoZnVzaW9uU2VjdGV1cigpKSxcclxuICAgIC8vICAgICAgICAgTGVhZmxldFRvb2xiYXIuVG9vbGJhckFjdGlvbi5leHRlbmQobW9kaWZpZXJTZWN0ZXVyKCkpLFxyXG4gICAgLy8gICAgICAgICBMZWFmbGV0VG9vbGJhci5Ub29sYmFyQWN0aW9uLmV4dGVuZChjYWxjdWxEaXN0YW5jZVNlY3RldXIoKSlcclxuICAgIC8vICAgICBdO1xyXG4gICAgLy8gfVxyXG4gICAgLy8gdmFyIG1hcFNlY3RvID0gTC5tYXAoJ3NlY3RvcmlzYXRpb25NYXAnKS5zZXRWaWV3KGNvb3Jkcywgem9vbSksXHJcbiAgICAvLyAgICAgZHJhd25JdGVtcyA9IG5ldyBMLkZlYXR1cmVHcm91cCgpLmFkZFRvKG1hcFNlY3RvKSxcclxuICAgIC8vICAgICBlZGl0QWN0aW9ucyA9IHRhYkVkaXRBY3Rpb25zO1xyXG4gICAgdmFyIG1hcFNlY3RvID0gTC5tYXAoJ3NlY3RvcmlzYXRpb25NYXAnKS5zZXRWaWV3KGNvb3Jkcywgem9vbSk7XHJcbiAgICBtYXBTZWN0by56b29tQ29udHJvbC5fem9vbUluQnV0dG9uLnRpdGxlID0gXCJab29tIGF2YW50XCI7XHJcbiAgICBtYXBTZWN0by56b29tQ29udHJvbC5fem9vbU91dEJ1dHRvbi50aXRsZSA9IFwiWm9vbSBhcnJpw6hyZVwiO1xyXG4gICAgdmFyIHNjYWxlID0gTC5jb250cm9sLnNjYWxlKHtwb3NpdGlvbjogJ2JvdHRvbXJpZ2h0J30pLmFkZFRvKG1hcFNlY3RvKTtcclxuICAgIC8qRklOIERFQ0xBUkFUSU9OIE1BUCovXHJcblxyXG5cclxuXHJcbiAgICAvKkZPTkQgREUgQ0FSVEUqL1xyXG4gICAgdmFyIGdsY01hcHNHR2ggPSBMLnRpbGVMYXllcignaHR0cDovL3NmY3AuZnJpc3F1ZXQuY29tLz90PXt6fS97eH0ve3l9JnRoPWdnbCcsIHtcclxuICAgICAgICBtYXhab29tOiAxOCxcclxuICAgICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXHJcbiAgICAgICAgYXR0cmlidXRpb246ICc8YSB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiaHR0cHM6Ly9pY29uZXM4LmZyXCI+SWNvbnM4PC9hPidcclxuICAgIH0pO1xyXG4gICAgZ2xjTWFwc0dHaC5hZGRUbyhtYXBTZWN0byk7XHJcblxyXG4gICAgdmFyIHBsYW4gPSBMLnRpbGVMYXllcignaHR0cDovL3tzfS50aWxlLm9zbS5vcmcve3p9L3t4fS97eX0ucG5nJywge1xyXG4gICAgICAgIGF0dHJpYnV0aW9uOiAnJmNvcHk7IDxhIGhyZWY9XCJodHRwczovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIj5PcGVuU3RyZWV0TWFwPC9hPiBjb250cmlidXRvcnMgfCAmY29weSA8YSB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiaHR0cHM6Ly9pY29uZXM4LmZyXCI+SWNvbnM4PC9hPicsXHJcbiAgICB9KVxyXG5cclxuICAgIHZhciBFc3JpX1dvcmxkSW1hZ2VyeSA9IEwudGlsZUxheWVyKCdodHRwczovL3NlcnZlci5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX0ltYWdlcnkvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLCB7XHJcbiAgICAgICAgYXR0cmlidXRpb246ICdUaWxlcyAmY29weTsgRXNyaSB8ICZjb3B5IDxhIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCJodHRwczovL2ljb25lczguZnJcIj5JY29uczg8L2E+J1xyXG4gICAgfSk7XHJcblxyXG4gICAgdmFyIEVzcmlfV29ybGRUb3BvTWFwID0gTC50aWxlTGF5ZXIoJ2h0dHBzOi8vc2VydmVyLmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfVG9wb19NYXAvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLCB7XHJcbiAgICAgICAgYXR0cmlidXRpb246ICdUaWxlcyAmY29weTsgRXNyaSB8ICZjb3B5IDxhIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCJodHRwczovL2ljb25lczguZnJcIj5JY29uczg8L2E+J1xyXG4gICAgfSk7XHJcblxyXG4gICAgdmFyIHBsYW4yID0gTC50aWxlTGF5ZXIoJ2h0dHA6Ly97c30udGlsZS5vc20ub3JnL3t6fS97eH0ve3l9LnBuZycsIHtcclxuICAgICAgICBhdHRyaWJ1dGlvbjogJyZjb3B5OyA8YSBocmVmPVwiaHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCI+T3BlblN0cmVldE1hcDwvYT4gY29udHJpYnV0b3JzIHwgJmNvcHkgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgaHJlZj1cImh0dHBzOi8vaWNvbmVzOC5mclwiPkljb25zODwvYT4nLFxyXG4gICAgfSlcclxuXHJcbiAgICB2YXIgaGlzdG9NYXAgPSBMLm1hcCgnaGlzdG9NYXAnKS5zZXRWaWV3KGNvb3JkcywgMTEpO1xyXG4gICAgaGlzdG9NYXAuem9vbUNvbnRyb2wuX3pvb21JbkJ1dHRvbi50aXRsZSA9IFwiWm9vbSBhdmFudFwiO1xyXG4gICAgaGlzdG9NYXAuem9vbUNvbnRyb2wuX3pvb21PdXRCdXR0b24udGl0bGUgPSBcIlpvb20gYXJyacOocmVcIjtcclxuICAgIHBsYW4yLmFkZFRvKGhpc3RvTWFwKTtcclxuXHJcbiAgICB2YXIgYmFzZUxheWVycyA9IHtcclxuICAgICAgICAnR29vZ2xlIE1hcCc6IGdsY01hcHNHR2gsXHJcbiAgICAgICAgJ1BsYW4nOiBwbGFuLFxyXG4gICAgICAgICdTYXRlbGxpdGUnOiBFc3JpX1dvcmxkSW1hZ2VyeSxcclxuICAgICAgICAnVG9wb2dyYXBoaXF1ZSc6IEVzcmlfV29ybGRUb3BvTWFwXHJcbiAgICB9O1xyXG4gICAgTC5jb250cm9sLmxheWVycyhiYXNlTGF5ZXJzKS5hZGRUbyhtYXBTZWN0byk7XHJcbiAgICAvKkZJTiBGT05EIERFIENBUlRFKi9cclxuXHJcbiAgICAvKkxBWUVSUyovXHJcbiAgICB2YXIgZ3VpZGVMYXllcnMgPSBbXTtcclxuXHJcbiAgICB2YXIgbGF5ZXJzQWRqYWNlbnQgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgIHZhciBhZ2VudHNBZGphY2VudCA9IG5ldyBMLkZlYXR1cmVHcm91cCgpO1xyXG4gICAgdmFyIGNpcmNsZUd1aWRlID0gbmV3IEwuRmVhdHVyZUdyb3VwKCk7XHJcbiAgICB2YXIgYW50ZW5uZXMgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgIG1hcFNlY3RvLmFkZExheWVyKGFudGVubmVzKTtcclxuXHJcbiAgICB2YXIgZWRpdGFibGVMYXllcnMgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgIG1hcFNlY3RvLmFkZExheWVyKGVkaXRhYmxlTGF5ZXJzKTtcclxuXHJcbiAgICB2YXIgYmlnUG9seWdvbiA9IG5ldyBMLkZlYXR1cmVHcm91cCgpO1xyXG4gICAgbWFwU2VjdG8uYWRkTGF5ZXIoYmlnUG9seWdvbik7XHJcbiAgICB2YXIgYmlnUG9seWdvbkFudGVubmVzID0gbmV3IEwuRmVhdHVyZUdyb3VwKCk7XHJcbiAgICBtYXBTZWN0by5hZGRMYXllcihiaWdQb2x5Z29uQW50ZW5uZXMpO1xyXG5cclxuICAgIHZhciBhZ2VudHNPZlNlY3RldXJzID0gbmV3IEwuRmVhdHVyZUdyb3VwKCk7XHJcbiAgICBtYXBTZWN0by5hZGRMYXllcihhZ2VudHNPZlNlY3RldXJzKTtcclxuICAgIHZhciBoaXN0b0FnZW50c09mU2VjdGV1cnMgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgIGhpc3RvTWFwLmFkZExheWVyKGhpc3RvQWdlbnRzT2ZTZWN0ZXVycyk7XHJcblxyXG5cclxuICAgIHZhciBhZ2VudHMgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgIG1hcFNlY3RvLmFkZExheWVyKGFnZW50cyk7XHJcbiAgICAvKkZJTiBMQVlFUlMqL1xyXG5cclxuICAgIC8qQ09OVFJPTCovXHJcblxyXG4gICAgaWYgKHRhYkFudGVubmVzLmluY2x1ZGVzKHNpdGVVc2VyKSkge1xyXG4gICAgICAgIHZhciBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcHJpZ2h0JyxcclxuICAgICAgICAgICAgZHJhdzoge1xyXG4gICAgICAgICAgICAgICAgcG9seWxpbmU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcG9seWdvbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBjaXJjbGU6IGZhbHNlLCAvLyBUdXJucyBvZmYgdGhpcyBkcmF3aW5nIHRvb2xcclxuICAgICAgICAgICAgICAgIHJlY3RhbmdsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBtYXJrZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY2lyY2xlbWFya2VyOiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlZGl0OiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhciBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcHJpZ2h0JyxcclxuICAgICAgICAgICAgZHJhdzoge1xyXG4gICAgICAgICAgICAgICAgcG9seWxpbmU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcG9seWdvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyMwMDAnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDJcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGFsbG93SW50ZXJzZWN0aW9uOiBmYWxzZSwgLy8gUmVzdHJpY3RzIHNoYXBlcyB0byBzaW1wbGUgcG9seWdvbnNcclxuICAgICAgICAgICAgICAgICAgICBzaG93QXJlYTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBkcmF3RXJyb3I6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZWQnLCAvLyBDb2xvciB0aGUgc2hhcGUgd2lsbCB0dXJuIHdoZW4gaW50ZXJzZWN0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnPHN0cm9uZz5PaCBub24gITxzdHJvbmc+IFZvdXMgbmUgcG91dmV6IHBhcyB0cmFjZXIgw6dhICEnIC8vIE1lc3NhZ2UgdGhhdCB3aWxsIHNob3cgd2hlbiBpbnRlcnNlY3RcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGd1aWRlTGF5ZXJzOiBndWlkZUxheWVyc1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNpcmNsZTogZmFsc2UsIC8vIFR1cm5zIG9mZiB0aGlzIGRyYXdpbmcgdG9vbFxyXG4gICAgICAgICAgICAgICAgcmVjdGFuZ2xlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG1hcmtlcjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBjaXJjbGVtYXJrZXI6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkaXQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHZhciBkcmF3Q29udHJvbCA9IG5ldyBMLkNvbnRyb2wuRHJhdyhvcHRpb25zKTtcclxuICAgIG1hcFNlY3RvLmFkZENvbnRyb2woZHJhd0NvbnRyb2wpO1xyXG5cclxuICAgIG1hcFNlY3RvLmFkZENvbnRyb2wobmV3IEwuQ29udHJvbC5TZWFyY2goe1xyXG4gICAgICAgIHVybDogJ2h0dHBzOi8vbm9taW5hdGltLm9wZW5zdHJlZXRtYXAub3JnL3NlYXJjaD9mb3JtYXQ9anNvbiZxPXtzfScsXHJcbiAgICAgICAgdGV4dFBsYWNlaG9sZGVyOiAnQWRyZXNzZSwgdmlsbGUuLi4nLFxyXG4gICAgICAgIHRleHRFcnI6ICdMb2NhbGlzYXRpb24gbm9uIHRyb3V2w6knLFxyXG4gICAgICAgIGpzb25wUGFyYW06ICdqc29uX2NhbGxiYWNrJyxcclxuICAgICAgICBwcm9wZXJ0eU5hbWU6ICdkaXNwbGF5X25hbWUnLFxyXG4gICAgICAgIHByb3BlcnR5TG9jOiBbJ2xhdCcsICdsb24nXSxcclxuICAgICAgICAvL21hcmtlcjogTC5jaXJjbGVNYXJrZXIoWzAsMF0se3JhZGl1czozMH0pLFxyXG4gICAgICAgIGhpZGVNYXJrZXJPbkNvbGxhcHNlOiB0cnVlLFxyXG4gICAgICAgIGF1dG9Db2xsYXBzZTogdHJ1ZSxcclxuICAgICAgICBhdXRvVHlwZTogZmFsc2UsXHJcbiAgICAgICAgbWluTGVuZ3RoOiAyLFxyXG4gICAgICAgIHpvb206IDE0XHJcbiAgICB9KSk7XHJcblxyXG4gICAgdmFyIGN1c3RvbUNvbnRyb2xVbmRvID0gTC5Db250cm9sLmV4dGVuZCh7XHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcGxlZnQnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkFkZDogZnVuY3Rpb24gKG1hcFNlY3RvKSB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnLCAnbGVhZmxldC1iYXIgbGVhZmxldC1jb250cm9sIGxlYWZsZXQtY29udHJvbC1jdXN0b20nKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBcIlJldG91ciBhcnJpw6hyZVwiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBcInVuZG9cIik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxpbWcgc3JjPVwiJytpbWdVbmRvKydcIiBzdHlsZT1cImhlaWdodDogMjRweDttYXJnaW46IDFweDtjdXJzb3I6IHBvaW50ZXI7XCI+JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRTaXplID0gXCIzMHB4IDMwcHhcIjtcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gJzMwcHgnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJzMwcHgnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdW5kbygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbWFwU2VjdG8uYWRkQ29udHJvbChuZXcgY3VzdG9tQ29udHJvbFVuZG8oKSk7XHJcblxyXG4gICAgdmFyIGN1c3RvbUNvbnRyb2xSZWZyZXNoID0gTC5Db250cm9sLmV4dGVuZCh7XHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcGxlZnQnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkFkZDogZnVuY3Rpb24gKG1hcFNlY3RvKSB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnLCAnbGVhZmxldC1iYXIgbGVhZmxldC1jb250cm9sIGxlYWZsZXQtY29udHJvbC1jdXN0b20nKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBcIlJhZnJhw65jaGlyIC8gRWZmYWNlciBsZXMgbW9kaWZpY2F0aW9ucyBub24gZW5yZWdpc3Ryw6llc1wiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBcInJlZnJlc2hcIik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxpbWcgc3JjPVwiJytpbWdSZWZyZXNoKydcIiBzdHlsZT1cImhlaWdodDogMjRweDttYXJnaW46IDFweDtjdXJzb3I6IHBvaW50ZXI7XCI+JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRTaXplID0gXCIzMHB4IDMwcHhcIjtcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gJzMwcHgnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJzMwcHgnO1xyXG5cclxuICAgICAgICAgICAgY29udGFpbmVyLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZWZyZXNoKCcnLCAnJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBtYXBTZWN0by5hZGRDb250cm9sKG5ldyBjdXN0b21Db250cm9sUmVmcmVzaCgpKTtcclxuXHJcbiAgICB2YXIgY3VzdG9tQ29udHJvbFNhdmUgPSBMLkNvbnRyb2wuZXh0ZW5kKHtcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wbGVmdCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQWRkOiBmdW5jdGlvbiAobWFwU2VjdG8pIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IEwuRG9tVXRpbC5jcmVhdGUoJ2RpdicsICdsZWFmbGV0LWJhciBsZWFmbGV0LWNvbnRyb2wgbGVhZmxldC1jb250cm9sLWN1c3RvbScpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCd0aXRsZScsIFwiU2F1dmVnYXJkZSBkZXMgc2VjdGV1cnNcIik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2lkJywgXCJzYXZlXCIpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3doaXRlJztcclxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8aW1nIHNyYz1cIicraW1nU2F2ZSsnXCIgc3R5bGU9XCJoZWlnaHQ6IDI0cHg7bWFyZ2luOiAxcHg7Y3Vyc29yOiBwb2ludGVyO1wiPiA8aW1nIHNyYz1cIicraW1nUGFzdGlsbGUrJ1wiIGlkPVwicGFzdGlsbGVcIiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTtyaWdodDowO2JvdHRvbTogMDtcIj4nO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuYmFja2dyb3VuZFNpemUgPSBcIjMwcHggMzBweFwiO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSAnMzBweCc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSAnMzBweCc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcblxyXG4gICAgICAgICAgICBjb250YWluZXIub25jbGljayA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChoaXN0b3JpcXVlQWN0aW9ucy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnI3NhdmVNZSAjaGlzdG9yaXF1ZUFjdGlvbnMnKVswXS5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGhpc3RvcmlxdWVBY3Rpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3NhdmVNZSAjaGlzdG9yaXF1ZUFjdGlvbnMnKVswXS5pbm5lckhUTUwgKz0gJzxsaT4nICsgaGlzdG9yaXF1ZUFjdGlvbnNbaV1bJ3RleHRlJ10gKyAnPC9saT4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICQoJyNzYXZlTW9kaWYnKVswXS5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICQoJyNkZWxldGVNb2RpZicpWzBdLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICQoJyNzYXZlTWUgI2hpc3RvcmlxdWVBY3Rpb25zJylbMF0uaW5uZXJIVE1MID0gJ0F1Y3VuZSBtb2RpZmljYXRpb24gZW4gY291cnMuJztcclxuICAgICAgICAgICAgICAgICAgICAkKCcjc2F2ZU1vZGlmJylbMF0uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICQoJyNkZWxldGVNb2RpZicpWzBdLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAkKCcjc2F2ZU1lJykubW9kYWwoJ3Nob3cnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkKFwiI2RlbGV0ZU1vZGlmXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgJCgnI2RlbGV0ZU1vZGlmJykub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKCcjc2F2ZU1lJykubW9kYWwoJ2hpZGUnKTtcclxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIG1hcFNlY3RvLmFkZENvbnRyb2wobmV3IGN1c3RvbUNvbnRyb2xTYXZlKCkpO1xyXG5cclxuICAgIGlmIChzaXRlVXNlciA9PSAnTUVBVVgnKSB7XHJcbiAgICAgICAgdmFyIGN1c3RvbUNvbnRyb2xTYXZlID0gTC5Db250cm9sLmV4dGVuZCh7XHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wbGVmdCdcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25BZGQ6IGZ1bmN0aW9uIChtYXBTZWN0bykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IEwuRG9tVXRpbC5jcmVhdGUoJ2RpdicsICdsZWFmbGV0LWJhciBsZWFmbGV0LWNvbnRyb2wgbGVhZmxldC1jb250cm9sLWN1c3RvbScpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBcIlN5bmNocm9uaXNhdGlvblwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2lkJywgXCJzeW5jaHJvXCIpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxpbWcgc3JjPVwiJytpbWdCREQrJ1wiIHN0eWxlPVwiaGVpZ2h0OiAyNHB4O21hcmdpbjogMXB4O2N1cnNvcjogcG9pbnRlcjtcIj4nO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRTaXplID0gXCIzMHB4IDMwcHhcIjtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICczMHB4JztcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSAnMzBweCc7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN5bmNocm8oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbWFwU2VjdG8uYWRkQ29udHJvbChuZXcgY3VzdG9tQ29udHJvbFNhdmUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgJCgnYm9keScpLm9uKCdzdWJtaXQnLCAnZm9ybSNmb3JtX3NhdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICB2YXIgZm9ybSA9ICQodGhpcyk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBpZiAoaGlzdG9yaXF1ZUFjdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdkYXRlTWVwJyk7XHJcbiAgICAgICAgICAgIHZhciBzYW1lID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5pbm5lckhUTUwgPT0gJCgnI2RhdGVNZXAnKS52YWwoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNhbWUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAkKCcjc2F2ZU1lJykubW9kYWwoJ2hpZGUnKTtcclxuICAgICAgICAgICAgICAgICQoJyNhbGVydERhdGUnKS5tb2RhbCgnc2hvdycpO1xyXG4gICAgICAgICAgICAgICAgJChcIiNjb25maXJtRWNyYXNlXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgJCgnI2NvbmZpcm1FY3Jhc2UnKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICQoJyNhbGVydERhdGUnKS5tb2RhbCgnaGlkZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNhdmVWZXJzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNhdmVWZXJzaW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdmFyIGN1c3RvbUNvbnRyb2xDcmVhdGlvbkFzc2lzdCA9IEwuQ29udHJvbC5leHRlbmQoe1xyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgcG9zaXRpb246ICd0b3ByaWdodCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQWRkOiBmdW5jdGlvbiAobWFwU2VjdG8pIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IEwuRG9tVXRpbC5jcmVhdGUoJ2RpdicsICdsZWFmbGV0LWJhciBsZWFmbGV0LWNvbnRyb2wgbGVhZmxldC1jb250cm9sLWN1c3RvbScpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCd0aXRsZScsIFwiQ3LDqWF0aW9uIGFzc2lzdMOpZSBzZWN0ZXVyXCIpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdpZCcsIFwiY3JlYXRpb25Bc3Npc3RcIik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxpbWcgc3JjPVwiJytpbWdDcmVhdGlvbkFzc2lzdCsnXCIgc3R5bGU9XCJoZWlnaHQ6IDI0cHg7bWFyZ2luOiAxcHg7Y3Vyc29yOiBwb2ludGVyO1wiPic7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IFwiMzBweCAzMHB4XCI7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICczMHB4JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICczMHB4JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaGlkZUZ1bmN0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgJCgnI2xlZ2VuZGUgcCN0ZXh0ZScpWzBdLmlubmVySFRNTCA9IFwiU8OpbGVjdGlvbm5leiBkZXV4IHBvaW50cyBub24gYWRqYWNlbnQgcG91ciBjcsOpZXIgdW4gc2VjdGV1clwiO1xyXG4gICAgICAgICAgICAgICAgJCgnI2V4cGxhaW5NZScpLnNob3coKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhc3Npc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyQ2xpY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgY2lyY2xlR3VpZGUgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgICAgICAgICAgICAgIG1hcFNlY3RvLmFkZExheWVyKGNpcmNsZUd1aWRlKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50QWN0aWYgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYmlnUG9seWdvbi5fbGF0bG5ncy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgYmlnUG9seWdvbi5fbGF0bG5nc1tqXS5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmlnUG9seWdvbi5fbGF0bG5nc1tqXVtrXS5sYXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgTC5NYXJrZXIoYmlnUG9seWdvbi5fbGF0bG5nc1tqXVtrXSwge3BvczogaywgaWNvbjogbWFya2VySWNvbn0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlR3VpZGUuYWRkTGF5ZXIobWFya2VyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrTWFya2VyQXNzaXN0KHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IGJpZ1BvbHlnb24uX2xhdGxuZ3Nbal1ba10ubGVuZ3RoOyBsKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFya2VyID0gbmV3IEwuTWFya2VyKGJpZ1BvbHlnb24uX2xhdGxuZ3Nbal1ba11bbF0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiBsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBtYXJrZXJJY29uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlR3VpZGUuYWRkTGF5ZXIobWFya2VyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tNYXJrZXJBc3Npc3QodGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghdGFiQW50ZW5uZXMuaW5jbHVkZXMoc2l0ZVVzZXIpKSB7XHJcbiAgICAgICAgbWFwU2VjdG8uYWRkQ29udHJvbChuZXcgY3VzdG9tQ29udHJvbENyZWF0aW9uQXNzaXN0KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBjdXN0b21Db250cm9sTmJDbGllbnRzID0gTC5Db250cm9sLmV4dGVuZCh7XHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcHJpZ2h0J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25BZGQ6IGZ1bmN0aW9uIChtYXBTZWN0bykge1xyXG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2xlYWZsZXQtYmFyIGxlYWZsZXQtY29udHJvbCBsZWFmbGV0LWNvbnRyb2wtY3VzdG9tJyk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgXCJBZmZpY2hlciBsZSBub21icmUgZGUgY2xpZW50cyBwYXIgc2VjdGV1cnNcIik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2lkJywgXCJuYkNsaWVudHNcIik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxpbWcgc3JjPVwiJytpbWdDbGllbnRzKydcIiAgc3R5bGU9XCJoZWlnaHQ6IDI0cHg7bWFyZ2luOiAxcHg7Y3Vyc29yOiBwb2ludGVyO1wiPic7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IFwiMzBweCAzMHB4XCI7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICczMHB4JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICczMHB4JztcclxuXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgbWFwU2VjdG8uZWFjaExheWVyKGZ1bmN0aW9uIChsYXllcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXllciBpbnN0YW5jZW9mIEwuUG9seWdvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci50b2dnbGVUb29sdGlwKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBzaG93VG9vbHRpcCA9ICFzaG93VG9vbHRpcDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbWFwU2VjdG8uYWRkQ29udHJvbChuZXcgY3VzdG9tQ29udHJvbE5iQ2xpZW50cygpKTtcclxuXHJcbiAgICB2YXIgY3VzdG9tQ29udHJvbEFnZW50cyA9IEwuQ29udHJvbC5leHRlbmQoe1xyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgcG9zaXRpb246ICd0b3ByaWdodCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQWRkOiBmdW5jdGlvbiAobWFwU2VjdG8pIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IEwuRG9tVXRpbC5jcmVhdGUoJ2RpdicsICdsZWFmbGV0LWJhciBsZWFmbGV0LWNvbnRyb2wgbGVhZmxldC1jb250cm9sLWN1c3RvbScpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCd0aXRsZScsIFwiQWZmaWNoZXIgbGVzIGFnZW50c1wiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBcImFnZW50c1wiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGltZyBzcmM9XCInK2ltZ0FnZW50cysnXCIgc3R5bGU9XCJoZWlnaHQ6IDI0cHg7bWFyZ2luOiAxcHg7Y3Vyc29yOiBwb2ludGVyO1wiPic7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IFwiMzBweCAzMHB4XCI7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICczMHB4JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICczMHB4JztcclxuXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2hvd0FnZW50cyA9IGJpbmRFbGVtZW50cyhzaG93QWdlbnRzLCBhZ2VudHMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbWFwU2VjdG8uYWRkQ29udHJvbChuZXcgY3VzdG9tQ29udHJvbEFnZW50cygpKTtcclxuXHJcbiAgICB2YXIgY3VzdG9tQ29udHJvbEFnZW50c09mU2VjdGV1cnMgPSBMLkNvbnRyb2wuZXh0ZW5kKHtcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wcmlnaHQnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkFkZDogZnVuY3Rpb24gKG1hcFNlY3RvKSB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnLCAnbGVhZmxldC1iYXIgbGVhZmxldC1jb250cm9sIGxlYWZsZXQtY29udHJvbC1jdXN0b20nKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBcIkFmZmljaGVyIGwnYWdlbnQgcHJpbmNpcGFsIGRlcyBzZWN0ZXVyc1wiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBcInByaW5jaXBhbFwiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGltZyBzcmM9XCInK2ltZ051bWJlcisnXCIgc3R5bGU9XCJoZWlnaHQ6IDI0cHg7bWFyZ2luOiAxcHg7Y3Vyc29yOiBwb2ludGVyO1wiPic7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IFwiMzBweCAzMHB4XCI7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICczMHB4JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICczMHB4JztcclxuXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2hvd0FnZW50c09mU2VjdGV1cnMgPSBiaW5kRWxlbWVudHMoc2hvd0FnZW50c09mU2VjdGV1cnMsIGFnZW50c09mU2VjdGV1cnMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbWFwU2VjdG8uYWRkQ29udHJvbChuZXcgY3VzdG9tQ29udHJvbEFnZW50c09mU2VjdGV1cnMoKSk7XHJcblxyXG4gICAgdmFyIGN1c3RvbUNvbnRyb2xEZW5zaXRlQ2xpZW50cyA9IEwuQ29udHJvbC5leHRlbmQoe1xyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgcG9zaXRpb246ICd0b3ByaWdodCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQWRkOiBmdW5jdGlvbiAobWFwU2VjdG8pIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IEwuRG9tVXRpbC5jcmVhdGUoJ2RpdicsICdsZWFmbGV0LWJhciBsZWFmbGV0LWNvbnRyb2wgbGVhZmxldC1jb250cm9sLWN1c3RvbScpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCd0aXRsZScsIFwiQWZmaWNoZXIgbGEgZGVuc2l0w6kgY2xpZW50XCIpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdpZCcsIFwiZGVuc2l0ZVwiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGltZyBzcmM9XCInK2ltZ0RlbnNpdGUrJ1wiIHN0eWxlPVwiaGVpZ2h0OiAyNHB4O21hcmdpbjogMXB4O2N1cnNvcjogcG9pbnRlcjtcIj4nO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuYmFja2dyb3VuZFNpemUgPSBcIjMwcHggMzBweFwiO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSAnMzBweCc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSAnMzBweCc7XHJcblxyXG4gICAgICAgICAgICBjb250YWluZXIub25jbGljayA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHNob3dEZW5zaXRlID0gYmluZEVsZW1lbnRzKHNob3dEZW5zaXRlLCBkZW5zaXRlQ2xpZW50cyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBtYXBTZWN0by5hZGRDb250cm9sKG5ldyBjdXN0b21Db250cm9sRGVuc2l0ZUNsaWVudHMoKSk7XHJcblxyXG5cclxuICAgIHZhciBjdXN0b21Db250cm9sQ2xpZW50ID0gTC5Db250cm9sLmV4dGVuZCh7XHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcHJpZ2h0J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25BZGQ6IGZ1bmN0aW9uIChtYXBTZWN0bykge1xyXG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2xlYWZsZXQtYmFyIGxlYWZsZXQtY29udHJvbCBsZWFmbGV0LWNvbnRyb2wtY3VzdG9tJyk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgXCJBZmZpY2hlciBsZXMgY2xpZW50cyBob3JzIHNlY3RldXJzXCIpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdpZCcsIFwiY2xpZW50c1wiKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBpZD1cIm5iQ2xpZW50SG9yc1NlY3RldXJcIiBjbGFzcz1cImFsZXJ0ZXNcIiBzdHlsZT1cImZvbnQtc2l6ZToxMHB4O21hcmdpbjowcHg7XCI+MDwvZGl2PjxpbWcgc3JjPVwiJytpbWdDbGllbnRzT3V0KydcIiBzdHlsZT1cImhlaWdodDogMjRweDttYXJnaW46IDFweDtjdXJzb3I6IHBvaW50ZXI7XCI+JztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRTaXplID0gXCIzMHB4IDMwcHhcIjtcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gJzMwcHgnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJzQ1cHgnO1xyXG5cclxuICAgICAgICAgICAgY29udGFpbmVyLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBzaG93Q2xpZW50cyA9IGJpbmRFbGVtZW50cyhzaG93Q2xpZW50cywgY2xpZW50c1dpdGhvdXRTZWN0ZXVyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIG1hcFNlY3RvLmFkZENvbnRyb2wobmV3IGN1c3RvbUNvbnRyb2xDbGllbnQoKSk7XHJcbiAgICAvKkZJTiBDT05UUk9MKi9cclxuXHJcbiAgICBpbml0U2VjdG8oKTtcclxuXHJcbiAgICAvKlRJTUVMSU5FKi9cclxuICAgIHZhciB0aW1lbGluZXMgPSAkKCcuY2QtaG9yaXpvbnRhbC10aW1lbGluZScpLFxyXG4gICAgICAgIGV2ZW50c01pbkRpc3RhbmNlID0gMTc7XHJcblxyXG4gICAgKHRpbWVsaW5lcy5sZW5ndGggPiAwKSAmJiBpbml0VGltZWxpbmUodGltZWxpbmVzLCBmYWxzZSk7XHJcblxyXG4gICAgZnVuY3Rpb24gaW5pdFRpbWVsaW5lKHRpbWVsaW5lcywgcmVsb2FkKSB7XHJcbiAgICAgICAgdGltZWxpbmVzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgdGltZWxpbmUgPSAkKHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgdGltZWxpbmVDb21wb25lbnRzID0ge307XHJcbiAgICAgICAgICAgIC8vY2FjaGUgdGltZWxpbmUgY29tcG9uZW50c1xyXG4gICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lV3JhcHBlciddID0gdGltZWxpbmUuZmluZCgnLmV2ZW50cy13cmFwcGVyJyk7XHJcbiAgICAgICAgICAgIHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzV3JhcHBlciddID0gdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZVdyYXBwZXInXS5jaGlsZHJlbignLmV2ZW50cycpO1xyXG4gICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ2ZpbGxpbmdMaW5lJ10gPSB0aW1lbGluZUNvbXBvbmVudHNbJ2V2ZW50c1dyYXBwZXInXS5jaGlsZHJlbignLmZpbGxpbmctbGluZScpO1xyXG4gICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lRXZlbnRzJ10gPSB0aW1lbGluZUNvbXBvbmVudHNbJ2V2ZW50c1dyYXBwZXInXS5maW5kKCdsaS5saXN0ZUhpc3RvJyk7XHJcbiAgICAgICAgICAgIHRpbWVsaW5lQ29tcG9uZW50c1sndGltZWxpbmVWZXJzaW9uJ10gPSB0aW1lbGluZUNvbXBvbmVudHNbJ2V2ZW50c1dyYXBwZXInXS5maW5kKCdsaS5saXN0ZUhpc3RvLnZlcnNpb25BY3R1ZWxsZScpO1xyXG4gICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lTGlua3MnXSA9IHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzV3JhcHBlciddLmZpbmQoJ2EnKTtcclxuICAgICAgICAgICAgdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZURhdGVzJ10gPSB0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lRXZlbnRzJ107XHJcbiAgICAgICAgICAgIC8vdGltZWxpbmVDb21wb25lbnRzWydldmVudHNNaW5MYXBzZSddID0gbWluTGFwc2UodGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZURhdGVzJ10pO1xyXG4gICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lTmF2aWdhdGlvbiddID0gdGltZWxpbmUuZmluZCgnLmNkLXRpbWVsaW5lLW5hdmlnYXRpb24nKTtcclxuICAgICAgICAgICAgdGltZWxpbmVDb21wb25lbnRzWydldmVudHNDb250ZW50J10gPSB0aW1lbGluZS5jaGlsZHJlbignLmV2ZW50cy1jb250ZW50Jyk7XHJcblxyXG4gICAgICAgICAgICAvL2Fzc2lnbiBhIGxlZnQgcG9zdGlvbiB0byB0aGUgc2luZ2xlIGV2ZW50cyBhbG9uZyB0aGUgdGltZWxpbmVcclxuICAgICAgICAgICAgZXZlbnRzTWluRGlzdGFuY2UgPSAyNTA7XHJcbiAgICAgICAgICAgIHZhciB0aW1lbGluZVRvdFdpZHRoID0gKHRpbWVsaW5lQ29tcG9uZW50c1sndGltZWxpbmVEYXRlcyddLmxlbmd0aCArIDEpICogZXZlbnRzTWluRGlzdGFuY2U7XHJcbiAgICAgICAgICAgIHNldERhdGVQb3NpdGlvbih0aW1lbGluZUNvbXBvbmVudHMsIGV2ZW50c01pbkRpc3RhbmNlKTtcclxuICAgICAgICAgICAgLy9hc3NpZ24gYSB3aWR0aCB0byB0aGUgdGltZWxpbmVcclxuICAgICAgICAgICAgc2V0VGltZWxpbmVXaWR0aCh0aW1lbGluZUNvbXBvbmVudHMsIHRpbWVsaW5lVG90V2lkdGgpO1xyXG4gICAgICAgICAgICAvL3RoZSB0aW1lbGluZSBoYXMgYmVlbiBpbml0aWFsaXplIC0gc2hvdyBpdFxyXG4gICAgICAgICAgICB0aW1lbGluZS5hZGRDbGFzcygnbG9hZGVkJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXJlbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoVGltZWxpbmUgPSBOdW1iZXIodGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZVdyYXBwZXInXS5jc3MoJ3dpZHRoJykucmVwbGFjZSgncHgnLCAnJykpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG1pZGRsZSA9IHdpZHRoVGltZWxpbmUgLyAyO1xyXG4gICAgICAgICAgICAgICAgdmFyIGxlZnRWZXJzaW9uID0gTnVtYmVyKHRpbWVsaW5lQ29tcG9uZW50c1sndGltZWxpbmVWZXJzaW9uJ10uY3NzKCdsZWZ0JykucmVwbGFjZSgncHgnLCAnJykpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbXB0RGVjYWxhZ2UgPSAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gd2lkdGhUaW1lbGluZTsgaSA8IGxlZnRWZXJzaW9uOyBpICs9IG1pZGRsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXB0RGVjYWxhZ2UrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjb21wdERlY2FsYWdlID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNsaWRlKHRpbWVsaW5lQ29tcG9uZW50cywgdGltZWxpbmVUb3RXaWR0aCwgJ25leHQnLCBjb21wdERlY2FsYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9kZXRlY3QgY2xpY2sgb24gdGhlIG5leHQgYXJyb3dcclxuICAgICAgICAgICAgdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZU5hdmlnYXRpb24nXS5vbignY2xpY2snLCAnLm5leHQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVTbGlkZSh0aW1lbGluZUNvbXBvbmVudHMsIHRpbWVsaW5lVG90V2lkdGgsICduZXh0JywgMSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvL2RldGVjdCBjbGljayBvbiB0aGUgcHJldiBhcnJvd1xyXG4gICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lTmF2aWdhdGlvbiddLm9uKCdjbGljaycsICcucHJldicsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZVNsaWRlKHRpbWVsaW5lQ29tcG9uZW50cywgdGltZWxpbmVUb3RXaWR0aCwgJ3ByZXYnLCAxKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vZGV0ZWN0IGNsaWNrIG9uIHRoZSBhIHNpbmdsZSBldmVudCAtIHNob3cgbmV3IGV2ZW50IGNvbnRlbnRcclxuICAgICAgICAgICAgdGltZWxpbmVDb21wb25lbnRzWydldmVudHNXcmFwcGVyJ10ub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgIHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzV3JhcHBlciddLm9uKCdjbGljaycsICdhJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHRoaXNMaW5rID0gJCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gdGhpc0xpbmtbMF0uaWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGhpc3RvcmlxdWVBY3Rpb25zLmxlbmd0aCA8PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd0xvYWRNb2RhbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2godmVyc2lvbiwgdGhpc0xpbmtbMF0uZmlyc3RFbGVtZW50Q2hpbGQuaW5uZXJIVE1MKTtcclxuICAgICAgICAgICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lTGlua3MnXS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzTGluay5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVPbGRlckV2ZW50cyh0aGlzTGluayk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRmlsbGluZyh0aGlzTGluaywgdGltZWxpbmVDb21wb25lbnRzWydmaWxsaW5nTGluZSddLCB0aW1lbGluZVRvdFdpZHRoKTtcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVWaXNpYmxlQ29udGVudCh0aGlzTGluaywgdGltZWxpbmVDb21wb25lbnRzWydldmVudHNDb250ZW50J10pO1xyXG4gICAgICAgICAgICAgICAgICAgIGhpZGVMb2FkTW9kYWwoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnI2FsZXJ0VmVyc2lvbicpLm1vZGFsKCdzaG93Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgJChcIiNjb25maXJtVmVyc2lvblwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCcjY29uZmlybVZlcnNpb24nKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCcjYWxlcnRWZXJzaW9uJykubW9kYWwoJ2hpZGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0xvYWRNb2RhbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoKHZlcnNpb24sIHRoaXNMaW5rWzBdLmZpcnN0RWxlbWVudENoaWxkLmlubmVySFRNTCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVsaW5lQ29tcG9uZW50c1sndGltZWxpbmVMaW5rcyddLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzTGluay5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlT2xkZXJFdmVudHModGhpc0xpbmspO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVGaWxsaW5nKHRoaXNMaW5rLCB0aW1lbGluZUNvbXBvbmVudHNbJ2ZpbGxpbmdMaW5lJ10sIHRpbWVsaW5lVG90V2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVWaXNpYmxlQ29udGVudCh0aGlzTGluaywgdGltZWxpbmVDb21wb25lbnRzWydldmVudHNDb250ZW50J10pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRlTG9hZE1vZGFsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy9vbiBzd2lwZSwgc2hvdyBuZXh0L3ByZXYgZXZlbnQgY29udGVudFxyXG4gICAgICAgICAgICB0aW1lbGluZUNvbXBvbmVudHNbJ2V2ZW50c0NvbnRlbnQnXS5vbignc3dpcGVsZWZ0JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG1xID0gY2hlY2tNUSgpO1xyXG4gICAgICAgICAgICAgICAgKCBtcSA9PSAnbW9iaWxlJyApICYmIHNob3dOZXdDb250ZW50KHRpbWVsaW5lQ29tcG9uZW50cywgdGltZWxpbmVUb3RXaWR0aCwgJ25leHQnKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzQ29udGVudCddLm9uKCdzd2lwZXJpZ2h0JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG1xID0gY2hlY2tNUSgpO1xyXG4gICAgICAgICAgICAgICAgKCBtcSA9PSAnbW9iaWxlJyApICYmIHNob3dOZXdDb250ZW50KHRpbWVsaW5lQ29tcG9uZW50cywgdGltZWxpbmVUb3RXaWR0aCwgJ3ByZXYnKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvL2tleWJvYXJkIG5hdmlnYXRpb25cclxuICAgICAgICAgICAgJChkb2N1bWVudCkua2V5dXAoZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT0gJzM3JyAmJiBlbGVtZW50SW5WaWV3cG9ydCh0aW1lbGluZS5nZXQoMCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd05ld0NvbnRlbnQodGltZWxpbmVDb21wb25lbnRzLCB0aW1lbGluZVRvdFdpZHRoLCAncHJldicpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC53aGljaCA9PSAnMzknICYmIGVsZW1lbnRJblZpZXdwb3J0KHRpbWVsaW5lLmdldCgwKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93TmV3Q29udGVudCh0aW1lbGluZUNvbXBvbmVudHMsIHRpbWVsaW5lVG90V2lkdGgsICduZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZVNsaWRlKHRpbWVsaW5lQ29tcG9uZW50cywgdGltZWxpbmVUb3RXaWR0aCwgc3RyaW5nLCBkZWNhbGFnZSkge1xyXG4gICAgICAgIC8vcmV0cmlldmUgdHJhbnNsYXRlWCB2YWx1ZSBvZiB0aW1lbGluZUNvbXBvbmVudHNbJ2V2ZW50c1dyYXBwZXInXVxyXG4gICAgICAgIHZhciB0cmFuc2xhdGVWYWx1ZSA9IGdldFRyYW5zbGF0ZVZhbHVlKHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzV3JhcHBlciddKSxcclxuICAgICAgICAgICAgd3JhcHBlcldpZHRoID0gTnVtYmVyKHRpbWVsaW5lQ29tcG9uZW50c1sndGltZWxpbmVXcmFwcGVyJ10uY3NzKCd3aWR0aCcpLnJlcGxhY2UoJ3B4JywgJycpKTtcclxuICAgICAgICAvL3RyYW5zbGF0ZSB0aGUgdGltZWxpbmUgdG8gdGhlIGxlZnQoJ25leHQnKS9yaWdodCgncHJldicpXHJcbiAgICAgICAgKHN0cmluZyA9PSAnbmV4dCcpXHJcbiAgICAgICAgICAgID8gdHJhbnNsYXRlVGltZWxpbmUodGltZWxpbmVDb21wb25lbnRzLCAodHJhbnNsYXRlVmFsdWUgLSB3cmFwcGVyV2lkdGggKyBldmVudHNNaW5EaXN0YW5jZSkgKiBkZWNhbGFnZSwgd3JhcHBlcldpZHRoIC0gdGltZWxpbmVUb3RXaWR0aClcclxuICAgICAgICAgICAgOiB0cmFuc2xhdGVUaW1lbGluZSh0aW1lbGluZUNvbXBvbmVudHMsIHRyYW5zbGF0ZVZhbHVlICsgd3JhcHBlcldpZHRoIC0gZXZlbnRzTWluRGlzdGFuY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dOZXdDb250ZW50KHRpbWVsaW5lQ29tcG9uZW50cywgdGltZWxpbmVUb3RXaWR0aCwgc3RyaW5nKSB7XHJcbiAgICAgICAgLy9nbyBmcm9tIG9uZSBldmVudCB0byB0aGUgbmV4dC9wcmV2aW91cyBvbmVcclxuICAgICAgICB2YXIgdmlzaWJsZUNvbnRlbnQgPSB0aW1lbGluZUNvbXBvbmVudHNbJ2V2ZW50c0NvbnRlbnQnXS5maW5kKCcuc2VsZWN0ZWQnKSxcclxuICAgICAgICAgICAgbmV3Q29udGVudCA9ICggc3RyaW5nID09ICduZXh0JyApID8gdmlzaWJsZUNvbnRlbnQubmV4dCgpIDogdmlzaWJsZUNvbnRlbnQucHJldigpO1xyXG5cclxuICAgICAgICBpZiAobmV3Q29udGVudC5sZW5ndGggPiAwKSB7IC8vaWYgdGhlcmUncyBhIG5leHQvcHJldiBldmVudCAtIHNob3cgaXRcclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkRGF0ZSA9IHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzV3JhcHBlciddLmZpbmQoJy5zZWxlY3RlZCcpLFxyXG4gICAgICAgICAgICAgICAgbmV3RXZlbnQgPSAoIHN0cmluZyA9PSAnbmV4dCcgKSA/IHNlbGVjdGVkRGF0ZS5wYXJlbnQoJ2xpJykubmV4dCgnbGknKS5jaGlsZHJlbignYScpIDogc2VsZWN0ZWREYXRlLnBhcmVudCgnbGknKS5wcmV2KCdsaScpLmNoaWxkcmVuKCdhJyk7XHJcblxyXG4gICAgICAgICAgICB1cGRhdGVGaWxsaW5nKG5ld0V2ZW50LCB0aW1lbGluZUNvbXBvbmVudHNbJ2ZpbGxpbmdMaW5lJ10sIHRpbWVsaW5lVG90V2lkdGgpO1xyXG4gICAgICAgICAgICB1cGRhdGVWaXNpYmxlQ29udGVudChuZXdFdmVudCwgdGltZWxpbmVDb21wb25lbnRzWydldmVudHNDb250ZW50J10pO1xyXG4gICAgICAgICAgICBuZXdFdmVudC5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgc2VsZWN0ZWREYXRlLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICB1cGRhdGVPbGRlckV2ZW50cyhuZXdFdmVudCk7XHJcbiAgICAgICAgICAgIHVwZGF0ZVRpbWVsaW5lUG9zaXRpb24oc3RyaW5nLCBuZXdFdmVudCwgdGltZWxpbmVDb21wb25lbnRzLCB0aW1lbGluZVRvdFdpZHRoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdXBkYXRlVGltZWxpbmVQb3NpdGlvbihzdHJpbmcsIGV2ZW50LCB0aW1lbGluZUNvbXBvbmVudHMsIHRpbWVsaW5lVG90V2lkdGgpIHtcclxuICAgICAgICAvL3RyYW5zbGF0ZSB0aW1lbGluZSB0byB0aGUgbGVmdC9yaWdodCBhY2NvcmRpbmcgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWxlY3RlZCBldmVudFxyXG4gICAgICAgIHZhciBldmVudFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZXZlbnQuZ2V0KDApLCBudWxsKSxcclxuICAgICAgICAgICAgZXZlbnRMZWZ0ID0gTnVtYmVyKGV2ZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImxlZnRcIikucmVwbGFjZSgncHgnLCAnJykpLFxyXG4gICAgICAgICAgICB0aW1lbGluZVdpZHRoID0gTnVtYmVyKHRpbWVsaW5lQ29tcG9uZW50c1sndGltZWxpbmVXcmFwcGVyJ10uY3NzKCd3aWR0aCcpLnJlcGxhY2UoJ3B4JywgJycpKSxcclxuICAgICAgICAgICAgdGltZWxpbmVUb3RXaWR0aCA9IE51bWJlcih0aW1lbGluZUNvbXBvbmVudHNbJ2V2ZW50c1dyYXBwZXInXS5jc3MoJ3dpZHRoJykucmVwbGFjZSgncHgnLCAnJykpO1xyXG4gICAgICAgIHZhciB0aW1lbGluZVRyYW5zbGF0ZSA9IGdldFRyYW5zbGF0ZVZhbHVlKHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzV3JhcHBlciddKTtcclxuXHJcbiAgICAgICAgaWYgKChzdHJpbmcgPT0gJ25leHQnICYmIGV2ZW50TGVmdCA+IHRpbWVsaW5lV2lkdGggLSB0aW1lbGluZVRyYW5zbGF0ZSkgfHwgKHN0cmluZyA9PSAncHJldicgJiYgZXZlbnRMZWZ0IDwgLXRpbWVsaW5lVHJhbnNsYXRlKSkge1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVUaW1lbGluZSh0aW1lbGluZUNvbXBvbmVudHMsIC1ldmVudExlZnQgKyB0aW1lbGluZVdpZHRoIC8gMiwgdGltZWxpbmVXaWR0aCAtIHRpbWVsaW5lVG90V2lkdGgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVUaW1lbGluZSh0aW1lbGluZUNvbXBvbmVudHMsIHZhbHVlLCB0b3RXaWR0aCkge1xyXG4gICAgICAgIHZhciBldmVudHNXcmFwcGVyID0gdGltZWxpbmVDb21wb25lbnRzWydldmVudHNXcmFwcGVyJ10uZ2V0KDApO1xyXG4gICAgICAgIHZhbHVlID0gKHZhbHVlID4gMCkgPyAwIDogdmFsdWU7IC8vb25seSBuZWdhdGl2ZSB0cmFuc2xhdGUgdmFsdWVcclxuICAgICAgICB2YWx1ZSA9ICggISh0eXBlb2YgdG90V2lkdGggPT09ICd1bmRlZmluZWQnKSAmJiB2YWx1ZSA8IHRvdFdpZHRoICkgPyB0b3RXaWR0aCA6IHZhbHVlOyAvL2RvIG5vdCB0cmFuc2xhdGUgbW9yZSB0aGFuIHRpbWVsaW5lIHdpZHRoXHJcbiAgICAgICAgc2V0VHJhbnNmb3JtVmFsdWUoZXZlbnRzV3JhcHBlciwgJ3RyYW5zbGF0ZVgnLCB2YWx1ZSArICdweCcpO1xyXG4gICAgICAgIC8vdXBkYXRlIG5hdmlnYXRpb24gYXJyb3dzIHZpc2liaWxpdHlcclxuICAgICAgICAodmFsdWUgPT0gMCApID8gdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZU5hdmlnYXRpb24nXS5maW5kKCcucHJldicpLmFkZENsYXNzKCdpbmFjdGl2ZScpIDogdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZU5hdmlnYXRpb24nXS5maW5kKCcucHJldicpLnJlbW92ZUNsYXNzKCdpbmFjdGl2ZScpO1xyXG4gICAgICAgICh2YWx1ZSA9PSB0b3RXaWR0aCApID8gdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZU5hdmlnYXRpb24nXS5maW5kKCcubmV4dCcpLmFkZENsYXNzKCdpbmFjdGl2ZScpIDogdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZU5hdmlnYXRpb24nXS5maW5kKCcubmV4dCcpLnJlbW92ZUNsYXNzKCdpbmFjdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZUZpbGxpbmcoc2VsZWN0ZWRFdmVudCwgZmlsbGluZywgdG90V2lkdGgpIHtcclxuICAgICAgICAvL2NoYW5nZSAuZmlsbGluZy1saW5lIGxlbmd0aCBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGV2ZW50XHJcbiAgICAgICAgdmFyIGV2ZW50U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzZWxlY3RlZEV2ZW50LmdldCgwKSwgbnVsbCksXHJcbiAgICAgICAgICAgIGV2ZW50TGVmdCA9IGV2ZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImxlZnRcIiksXHJcbiAgICAgICAgICAgIGV2ZW50V2lkdGggPSBldmVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiKTtcclxuICAgICAgICBldmVudExlZnQgPSBOdW1iZXIoZXZlbnRMZWZ0LnJlcGxhY2UoJyUnLCAnJykpICsgTnVtYmVyKGV2ZW50V2lkdGgucmVwbGFjZSgnJScsICcnKSkgLyAyO1xyXG4gICAgICAgIHZhciBzY2FsZVZhbHVlID0gZXZlbnRMZWZ0IC8gdG90V2lkdGg7XHJcbiAgICAgICAgc2V0VHJhbnNmb3JtVmFsdWUoZmlsbGluZy5nZXQoMCksICdzY2FsZVgnLCBzY2FsZVZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXREYXRlUG9zaXRpb24odGltZWxpbmVDb21wb25lbnRzLCBtaW4pIHtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZURhdGVzJ10ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGltZWxpbmVDb21wb25lbnRzWyd0aW1lbGluZUV2ZW50cyddLmVxKGkpLmNzcygnbGVmdCcsIChpKSAqIG1pbiArICdweCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXRUaW1lbGluZVdpZHRoKHRpbWVsaW5lQ29tcG9uZW50cywgdG90YWxXaWR0aCkge1xyXG4gICAgICAgIHRpbWVsaW5lQ29tcG9uZW50c1snZXZlbnRzV3JhcHBlciddLmNzcygnd2lkdGgnLCB0b3RhbFdpZHRoICsgJ3B4Jyk7XHJcbiAgICAgICAgdXBkYXRlRmlsbGluZyh0aW1lbGluZUNvbXBvbmVudHNbJ3RpbWVsaW5lRXZlbnRzJ10uZXEoMCksIHRpbWVsaW5lQ29tcG9uZW50c1snZmlsbGluZ0xpbmUnXSwgdG90YWxXaWR0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdXBkYXRlVmlzaWJsZUNvbnRlbnQoZXZlbnQsIGV2ZW50c0NvbnRlbnQpIHtcclxuICAgICAgICB2YXIgZXZlbnREYXRlID0gZXZlbnQuZGF0YSgnZGF0ZScpLFxyXG4gICAgICAgICAgICB2aXNpYmxlQ29udGVudCA9IGV2ZW50c0NvbnRlbnQuZmluZCgnLnNlbGVjdGVkJyksXHJcbiAgICAgICAgICAgIHNlbGVjdGVkQ29udGVudCA9IGV2ZW50c0NvbnRlbnQuZmluZCgnW2RhdGEtZGF0ZT1cIicgKyBldmVudERhdGUgKyAnXCJdJyksXHJcbiAgICAgICAgICAgIHNlbGVjdGVkQ29udGVudEhlaWdodCA9IHNlbGVjdGVkQ29udGVudC5oZWlnaHQoKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGVkQ29udGVudC5pbmRleCgpID4gdmlzaWJsZUNvbnRlbnQuaW5kZXgoKSkge1xyXG4gICAgICAgICAgICB2YXIgY2xhc3NFbmV0ZXJpbmcgPSAnc2VsZWN0ZWQgZW50ZXItcmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgY2xhc3NMZWF2aW5nID0gJ2xlYXZlLWxlZnQnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBjbGFzc0VuZXRlcmluZyA9ICdzZWxlY3RlZCBlbnRlci1sZWZ0JyxcclxuICAgICAgICAgICAgICAgIGNsYXNzTGVhdmluZyA9ICdsZWF2ZS1yaWdodCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZWxlY3RlZENvbnRlbnQuYXR0cignY2xhc3MnLCBjbGFzc0VuZXRlcmluZyk7XHJcbiAgICAgICAgdmlzaWJsZUNvbnRlbnQuYXR0cignY2xhc3MnLCBjbGFzc0xlYXZpbmcpLm9uZSgnd2Via2l0QW5pbWF0aW9uRW5kIG9hbmltYXRpb25lbmQgbXNBbmltYXRpb25FbmQgYW5pbWF0aW9uZW5kJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2aXNpYmxlQ29udGVudC5yZW1vdmVDbGFzcygnbGVhdmUtcmlnaHQgbGVhdmUtbGVmdCcpO1xyXG4gICAgICAgICAgICBzZWxlY3RlZENvbnRlbnQucmVtb3ZlQ2xhc3MoJ2VudGVyLWxlZnQgZW50ZXItcmlnaHQnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBldmVudHNDb250ZW50LmNzcygnaGVpZ2h0Jywgc2VsZWN0ZWRDb250ZW50SGVpZ2h0ICsgJ3B4Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdXBkYXRlT2xkZXJFdmVudHMoZXZlbnQpIHtcclxuICAgICAgICBldmVudC5wYXJlbnQoJ2xpJykucHJldkFsbCgnbGknKS5jaGlsZHJlbignYScpLmFkZENsYXNzKCdvbGRlci1ldmVudCcpLmVuZCgpLmVuZCgpLm5leHRBbGwoJ2xpJykuY2hpbGRyZW4oJ2EnKS5yZW1vdmVDbGFzcygnb2xkZXItZXZlbnQnKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRUcmFuc2xhdGVWYWx1ZSh0aW1lbGluZSkge1xyXG4gICAgICAgIHZhciB0aW1lbGluZVN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGltZWxpbmUuZ2V0KDApLCBudWxsKSxcclxuICAgICAgICAgICAgdGltZWxpbmVUcmFuc2xhdGUgPSB0aW1lbGluZVN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCItd2Via2l0LXRyYW5zZm9ybVwiKSB8fFxyXG4gICAgICAgICAgICAgICAgdGltZWxpbmVTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiLW1vei10cmFuc2Zvcm1cIikgfHxcclxuICAgICAgICAgICAgICAgIHRpbWVsaW5lU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi1tcy10cmFuc2Zvcm1cIikgfHxcclxuICAgICAgICAgICAgICAgIHRpbWVsaW5lU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi1vLXRyYW5zZm9ybVwiKSB8fFxyXG4gICAgICAgICAgICAgICAgdGltZWxpbmVTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwidHJhbnNmb3JtXCIpO1xyXG5cclxuICAgICAgICBpZiAodGltZWxpbmVUcmFuc2xhdGUuaW5kZXhPZignKCcpID49IDApIHtcclxuICAgICAgICAgICAgdmFyIHRpbWVsaW5lVHJhbnNsYXRlID0gdGltZWxpbmVUcmFuc2xhdGUuc3BsaXQoJygnKVsxXTtcclxuICAgICAgICAgICAgdGltZWxpbmVUcmFuc2xhdGUgPSB0aW1lbGluZVRyYW5zbGF0ZS5zcGxpdCgnKScpWzBdO1xyXG4gICAgICAgICAgICB0aW1lbGluZVRyYW5zbGF0ZSA9IHRpbWVsaW5lVHJhbnNsYXRlLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgICAgIHZhciB0cmFuc2xhdGVWYWx1ZSA9IHRpbWVsaW5lVHJhbnNsYXRlWzRdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciB0cmFuc2xhdGVWYWx1ZSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRyYW5zbGF0ZVZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXRUcmFuc2Zvcm1WYWx1ZShlbGVtZW50LCBwcm9wZXJ0eSwgdmFsdWUpIHtcclxuICAgICAgICBlbGVtZW50LnN0eWxlW1wiLXdlYmtpdC10cmFuc2Zvcm1cIl0gPSBwcm9wZXJ0eSArIFwiKFwiICsgdmFsdWUgKyBcIilcIjtcclxuICAgICAgICBlbGVtZW50LnN0eWxlW1wiLW1vei10cmFuc2Zvcm1cIl0gPSBwcm9wZXJ0eSArIFwiKFwiICsgdmFsdWUgKyBcIilcIjtcclxuICAgICAgICBlbGVtZW50LnN0eWxlW1wiLW1zLXRyYW5zZm9ybVwiXSA9IHByb3BlcnR5ICsgXCIoXCIgKyB2YWx1ZSArIFwiKVwiO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGVbXCItby10cmFuc2Zvcm1cIl0gPSBwcm9wZXJ0eSArIFwiKFwiICsgdmFsdWUgKyBcIilcIjtcclxuICAgICAgICBlbGVtZW50LnN0eWxlW1widHJhbnNmb3JtXCJdID0gcHJvcGVydHkgKyBcIihcIiArIHZhbHVlICsgXCIpXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLy9iYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU0MjkzOC9ob3ctZG8taS1nZXQtdGhlLW51bWJlci1vZi1kYXlzLWJldHdlZW4tdHdvLWRhdGVzLWluLWphdmFzY3JpcHRcclxuICAgIGZ1bmN0aW9uIHBhcnNlRGF0ZShldmVudHMpIHtcclxuICAgICAgICB2YXIgZGF0ZUFycmF5cyA9IFtdO1xyXG4gICAgICAgIGV2ZW50cy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGRhdGVDb21wID0gJCh0aGlzKS5kYXRhKCdkYXRlJykuc3BsaXQoJy8nKSxcclxuICAgICAgICAgICAgICAgIG5ld0RhdGUgPSBuZXcgRGF0ZShkYXRlQ29tcFsyXSwgZGF0ZUNvbXBbMV0gLSAxLCBkYXRlQ29tcFswXSk7XHJcbiAgICAgICAgICAgIGRhdGVBcnJheXMucHVzaChuZXdEYXRlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gZGF0ZUFycmF5cztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwYXJzZURhdGUyKGV2ZW50cykge1xyXG4gICAgICAgIHZhciBkYXRlQXJyYXlzID0gW107XHJcbiAgICAgICAgZXZlbnRzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgc2luZ2xlRGF0ZSA9ICQodGhpcyksXHJcbiAgICAgICAgICAgICAgICBkYXRlQ29tcCA9IHNpbmdsZURhdGUuZGF0YSgnZGF0ZScpLnNwbGl0KCdUJyk7XHJcbiAgICAgICAgICAgIGlmIChkYXRlQ29tcC5sZW5ndGggPiAxKSB7IC8vYm90aCBERC9NTS9ZRUFSIGFuZCB0aW1lIGFyZSBwcm92aWRlZFxyXG4gICAgICAgICAgICAgICAgdmFyIGRheUNvbXAgPSBkYXRlQ29tcFswXS5zcGxpdCgnLycpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpbWVDb21wID0gZGF0ZUNvbXBbMV0uc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRlQ29tcFswXS5pbmRleE9mKCc6JykgPj0gMCkgeyAvL29ubHkgdGltZSBpcyBwcm92aWRlXHJcbiAgICAgICAgICAgICAgICB2YXIgZGF5Q29tcCA9IFtcIjIwMDBcIiwgXCIwXCIsIFwiMFwiXSxcclxuICAgICAgICAgICAgICAgICAgICB0aW1lQ29tcCA9IGRhdGVDb21wWzBdLnNwbGl0KCc6Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vb25seSBERC9NTS9ZRUFSXHJcbiAgICAgICAgICAgICAgICB2YXIgZGF5Q29tcCA9IGRhdGVDb21wWzBdLnNwbGl0KCcvJyksXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZUNvbXAgPSBbXCIwXCIsIFwiMFwiXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgbmV3RGF0ZSA9IG5ldyBEYXRlKGRheUNvbXBbMl0sIGRheUNvbXBbMV0gLSAxLCBkYXlDb21wWzBdLCB0aW1lQ29tcFswXSwgdGltZUNvbXBbMV0pO1xyXG4gICAgICAgICAgICBkYXRlQXJyYXlzLnB1c2gobmV3RGF0ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGRhdGVBcnJheXM7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGF5ZGlmZihmaXJzdCwgc2Vjb25kKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKHNlY29uZCAtIGZpcnN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbWluTGFwc2UoZGF0ZXMpIHtcclxuICAgICAgICAvL2RldGVybWluZSB0aGUgbWluaW11bSBkaXN0YW5jZSBhbW9uZyBldmVudHNcclxuICAgICAgICB2YXIgZGF0ZURpc3RhbmNlcyA9IFtdO1xyXG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBkYXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBkYXlkaWZmKGRhdGVzW2kgLSAxXSwgZGF0ZXNbaV0pO1xyXG4gICAgICAgICAgICBkYXRlRGlzdGFuY2VzLnB1c2goZGlzdGFuY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTWF0aC5taW4uYXBwbHkobnVsbCwgZGF0ZURpc3RhbmNlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAgICBIb3cgdG8gdGVsbCBpZiBhIERPTSBlbGVtZW50IGlzIHZpc2libGUgaW4gdGhlIGN1cnJlbnQgdmlld3BvcnQ/XHJcbiAgICAgICAgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjM5OTkvaG93LXRvLXRlbGwtaWYtYS1kb20tZWxlbWVudC1pcy12aXNpYmxlLWluLXRoZS1jdXJyZW50LXZpZXdwb3J0XHJcbiAgICAqL1xyXG4gICAgZnVuY3Rpb24gZWxlbWVudEluVmlld3BvcnQoZWwpIHtcclxuICAgICAgICB2YXIgdG9wID0gZWwub2Zmc2V0VG9wO1xyXG4gICAgICAgIHZhciBsZWZ0ID0gZWwub2Zmc2V0TGVmdDtcclxuICAgICAgICB2YXIgd2lkdGggPSBlbC5vZmZzZXRXaWR0aDtcclxuICAgICAgICB2YXIgaGVpZ2h0ID0gZWwub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgICAgICB3aGlsZSAoZWwub2Zmc2V0UGFyZW50KSB7XHJcbiAgICAgICAgICAgIGVsID0gZWwub2Zmc2V0UGFyZW50O1xyXG4gICAgICAgICAgICB0b3AgKz0gZWwub2Zmc2V0VG9wO1xyXG4gICAgICAgICAgICBsZWZ0ICs9IGVsLm9mZnNldExlZnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0b3AgPCAod2luZG93LnBhZ2VZT2Zmc2V0ICsgd2luZG93LmlubmVySGVpZ2h0KSAmJlxyXG4gICAgICAgICAgICBsZWZ0IDwgKHdpbmRvdy5wYWdlWE9mZnNldCArIHdpbmRvdy5pbm5lcldpZHRoKSAmJlxyXG4gICAgICAgICAgICAodG9wICsgaGVpZ2h0KSA+IHdpbmRvdy5wYWdlWU9mZnNldCAmJlxyXG4gICAgICAgICAgICAobGVmdCArIHdpZHRoKSA+IHdpbmRvdy5wYWdlWE9mZnNldFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2hlY2tNUSgpIHtcclxuICAgICAgICAvL2NoZWNrIGlmIG1vYmlsZSBvciBkZXNrdG9wIGRldmljZVxyXG4gICAgICAgIHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2QtaG9yaXpvbnRhbC10aW1lbGluZScpLCAnOjpiZWZvcmUnKS5nZXRQcm9wZXJ0eVZhbHVlKCdjb250ZW50JykucmVwbGFjZSgvJy9nLCBcIlwiKS5yZXBsYWNlKC9cIi9nLCBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKkZJTiBUSU1FTElORSovXHJcblxyXG5cclxuICAgIC8qRk9OQ1RJT05TIEJPT1NUUkFQIFRBQkxFKi9cclxuICAgIGZ1bmN0aW9uIHRvdGFsRm9ybWF0dGVyKGRhdGEpIHtcclxuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmZpZWxkXHJcbiAgICAgICAgcmV0dXJuIGRhdGEubWFwKGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgcmV0dXJuICtyb3dbZmllbGRdXHJcbiAgICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uIChzdW0sIGkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN1bSArIGlcclxuICAgICAgICB9LCAwKVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGZvb3RlclN0eWxlKHJvdywgaW5kZXgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjc3M6IHtcclxuICAgICAgICAgICAgICAgIFwidGV4dC1hbGlnblwiOiBcImNlbnRlclwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuICAgIC8qRklOIEZPTkNUSU9OUyBCT09TVFJBUCBUQUJMRSovXHJcblxyXG4gICAgLypGT05DVElPTlMqL1xyXG5cclxuICAgIGZ1bmN0aW9uIGluaXRTZWN0byh2ZXJzaW9uLCBkYXRlTWVwLCB2aWFCdXR0b24pIHtcclxuXHJcbiAgICAgICAgLy9zaG93TG9hZE1vZGFsKCk7XHJcbiAgICAgICAgLy8gaWYgKHZlcnNpb24gPT0gdW5kZWZpbmVkIHx8IHZlcnNpb24gPT0gJycpIHtcclxuICAgICAgICAvLyAgICAgLy9nZXRCaWdQb2x5Z29uKCdiYXNlJyk7IC8vcGVybWV0IGQnYXZvaXIgbGVzIGNvbnRvdXJzIG5vaXJzIGRlcyBwb2x5Z29ucyBkZXMgc2VjdGV1cnMgZXQgbm9uIGdyaXMuXHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gdmFyIGluaXRIaXN0b1BvbHlnb24gPSBmYWxzZTtcclxuICAgICAgICAvLyBpZiAoaGlzdG9Qb2x5Z29uID09ICcnKSB7XHJcbiAgICAgICAgLy8gICAgIGluaXRIaXN0b1BvbHlnb24gPSB0cnVlO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogXCJqc29uXCIsXHJcbiAgICAgICAgICAgIHVybDogXCIvbWFwL2dldF9zZWN0ZXVyc1wiLFxyXG4gICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgc2VjdGV1cnMgPSBKU09OLnBhcnNlKHJlc3VsdFsnc2VjdGV1cnMnXSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2VjdGV1cnMgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAvL2xhc3RJZCA9IHJlc3VsdFsnbGFzdElkJ107XHJcbiAgICAgICAgICAgICAgICB2YXIgbGF0TG9uZyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgIHNlY3RldXJzLmZvckVhY2goZnVuY3Rpb24gKHNlY3RldXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VjdGV1ci5jb29yZG9ubmVlcy50eXBlID09IFwiUG9seWdvblwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3RldXIuY29vcmRvbm5lZXMuY29vcmRpbmF0ZXNbMF0uZm9yRWFjaChmdW5jdGlvbiAobG9jYXRpb25BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0TG9uZy5wdXNoKFtsb2NhdGlvbkFycmF5WzFdLCBsb2NhdGlvbkFycmF5WzBdXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvbHlnb24gPSBMLnBvbHlnb24obGF0TG9uZywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWQ6IGN1cnJlbnRGZWF0dXJlLmlkUG9seWdvbiwgLy9wb3VyIGwnZW5yZWdpc3RyZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5iQ2xpZW50czogY3VycmVudEZlYXR1cmUubmJDbGllbnRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFtaWxsZTA6IGN1cnJlbnRGZWF0dXJlLmZhbWlsbGUwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFtaWxsZTE6IGN1cnJlbnRGZWF0dXJlLmZhbWlsbGUxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFtaWxsZTI6IGN1cnJlbnRGZWF0dXJlLmZhbWlsbGUyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFtaWxsZTM6IGN1cnJlbnRGZWF0dXJlLmZhbWlsbGUzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9tU2VjdGV1cjogY3VycmVudEZlYXR1cmUubm9tU2VjdGV1cixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGVBZ2VudDogY3VycmVudEZlYXR1cmUuY29kZUFnZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcGxlYW50MTogY3VycmVudEZlYXR1cmUuc3VwcGxlYW50MSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBsZWFudDI6IGN1cnJlbnRGZWF0dXJlLnN1cHBsZWFudDIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwbGVhbnQzOiBjdXJyZW50RmVhdHVyZS5zdXBwbGVhbnQzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcGxlYW50NDogY3VycmVudEZlYXR1cmUuc3VwcGxlYW50NCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpdGU6IGN1cnJlbnRGZWF0dXJlLnNpdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlR3JvdXBlOiBjdXJyZW50RmVhdHVyZS5jb2RlR3JvdXBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5hZGRUbyhtYXBTZWN0byk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aXRob3V0QWdlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0ZXVyLmFnZW50U2VjdGV1cnMuc29tZShmdW5jdGlvbiAoYWdlbnQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWdlbnQucmFuZ190cmkgPT0gMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWNvbG9yc1thZ2VudC51dGlsaXNhdGV1cl9hZ2VudC5ncm91cGVfYWZmZWN0YXRpb25dKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yc1thZ2VudC51dGlsaXNhdGV1cl9hZ2VudC5ncm91cGVfYWZmZWN0YXRpb25dID0gdGFiQ29sb3JbY291bnRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5Z29uLnNldFN0eWxlKGdldFN0eWxlKGFnZW50LnV0aWxpc2F0ZXVyX2FnZW50Lmdyb3VwZV9hZmZlY3RhdGlvbikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXRBZ2VudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaXJjbGUgPSBuZXcgTC5DaXJjbGVNYXJrZXIocG9seWdvbi5nZXRDZW50ZXIoKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpdXM6IDAuMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUFnZW50OiBhZ2VudC51dGlsaXNhdGV1cl9hZ2VudC5pbml0aWFsZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5iaW5kVG9vbHRpcCgnJyArIGFnZW50LnV0aWxpc2F0ZXVyX2FnZW50LmluaXRpYWxlcywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtYW5lbnQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIm15LWxhYmVsc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnRzT2ZTZWN0ZXVycy5hZGRMYXllcihjaXJjbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYod2l0aG91dEFnZW50KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHlnb24uc2V0U3R5bGUoZ2V0U3R5bGUoJycpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kVG9vbHRpcE5iQ2xpZW50cyhzZWN0ZXVyLCBwb2x5Z29uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGluaXRIaXN0b1BvbHlnb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhpc3RvUG9seWdvbiA9IEwucG9seWdvbihsYXRMb25nKS5hZGRUbyhoaXN0b01hcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChjdXJyZW50RmVhdHVyZS5jb2RlQWdlbnQgPT0gJycpIHsgLy9mYWlyZSByZXNzb3J0aXIgbGVzIHNlY3RldXJzIHNhbnMgYWdlbnRzIHByaW5jaXBhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcG9seWdvbi5zZXRTdHlsZShnZXRTdHlsZSgnJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgLy8gaWYgKGluaXRIaXN0b1BvbHlnb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vICAgICBoaXN0b1BvbHlnb24uc2V0U3R5bGUoZ2V0U3R5bGUoJycpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHBvbHlnb24uc2V0U3R5bGUoZ2V0U3R5bGUoY3VycmVudEZlYXR1cmUuY29kZUdyb3VwZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgLy8gaWYgKGluaXRIaXN0b1BvbHlnb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vICAgICBoaXN0b1BvbHlnb24uc2V0U3R5bGUoZ2V0U3R5bGUoY3VycmVudEZlYXR1cmUuY29kZUdyb3VwZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXNlY3RldXJzQnlSZXNwb25zYWJsZVtjdXJyZW50RmVhdHVyZS5jb2RlR3JvdXBlXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc2VjdGV1cnNCeVJlc3BvbnNhYmxlW2N1cnJlbnRGZWF0dXJlLmNvZGVHcm91cGVdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFzZWN0ZXVyc0J5UmVzcG9uc2FibGVbY3VycmVudEZlYXR1cmUuY29kZUdyb3VwZV1bY3VycmVudEZlYXR1cmUuY29kZUFnZW50XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc2VjdGV1cnNCeVJlc3BvbnNhYmxlW2N1cnJlbnRGZWF0dXJlLmNvZGVHcm91cGVdW2N1cnJlbnRGZWF0dXJlLmNvZGVBZ2VudF0gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWN0ZXVyc0J5UmVzcG9uc2FibGVbY3VycmVudEZlYXR1cmUuY29kZUdyb3VwZV1bY3VycmVudEZlYXR1cmUuY29kZUFnZW50XVtjdXJyZW50RmVhdHVyZS5pZFBvbHlnb25dID0gcG9seWdvbi50b0dlb0pTT04oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWRpdGFibGVMYXllcnMuYWRkTGF5ZXIocG9seWdvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChjdXJyZW50RmVhdHVyZSAmJiBjdXJyZW50RmVhdHVyZS5jb2RlQWdlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHZhciBjaXJjbGUgPSBuZXcgTC5DaXJjbGVNYXJrZXIocG9seWdvbi5nZXRDZW50ZXIoKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHJhZGl1czogMC4xLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIG9wYWNpdHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgY29kZUFnZW50OiBjdXJyZW50RmVhdHVyZS5jb2RlQWdlbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIH0pLmJpbmRUb29sdGlwKCcnICsgY3VycmVudEZlYXR1cmUuY29kZUFnZW50LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgcGVybWFuZW50OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIGRpcmVjdGlvbjogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBjbGFzc05hbWU6IFwibXktbGFiZWxzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWdlbnRzT2ZTZWN0ZXVycy5hZGRMYXllcihjaXJjbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaWYgKGluaXRIaXN0b1BvbHlnb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB2YXIgaGlzdG9DaXJjbGUgPSBuZXcgTC5DaXJjbGVNYXJrZXIoaGlzdG9Qb2x5Z29uLmdldENlbnRlcigpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHJhZGl1czogMC4xLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBvcGFjaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBjb2RlQWdlbnQ6IGN1cnJlbnRGZWF0dXJlLmNvZGVBZ2VudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0pLmJpbmRUb29sdGlwKCcnICsgY3VycmVudEZlYXR1cmUuY29kZUFnZW50LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHBlcm1hbmVudDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGlyZWN0aW9uOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBjbGFzc05hbWU6IFwibXktbGFiZWxzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBoaXN0b0FnZW50c09mU2VjdGV1cnMuYWRkTGF5ZXIoaGlzdG9DaXJjbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXRMb25nID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRFdmVuZW1lbnRMYXllcihwb2x5Z29uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIC8vYWRkSGlzdG8oJ0luaXRpYWxpc2F0aW9uJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBnZXREZW5zaXRlKHZlcnNpb24sIHRydWUsIGRhdGVNZXApO1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgKHZpYUJ1dHRvbikge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgICQoJy5ldmVudHMnKVswXS5pbm5lckhUTUwgPSByZXN1bHQudGltZWxpbmU7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgaW5pdFRpbWVsaW5lKHRpbWVsaW5lcywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAvLyBjYWxjdWxOYkNsaWVudHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGdldEFnZW50cygpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRBZ2VudHMoKSB7XHJcbiAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgZGF0YVR5cGU6IFwianNvblwiLFxyXG4gICAgICAgICAgICB1cmw6IFwiL2FnZW50cy9kb21pY2lsZVwiLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKGRhdGEpXHJcbiAgICAgICAgICAgICAgICAvL2dlb2pzb25BZ2VudHMgPSBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChhZ2VudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwb2ludCA9IFswLCAwXTtcclxuICAgICAgICAgICAgICAgICAgICBpZihhZ2VudC5jb29yZG9ubmVlcyAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgPSBbYWdlbnQuY29vcmRvbm5lZXMubGF0aXR1ZGUsIGFnZW50LmNvb3Jkb25uZWVzLmxvbmdpdHVkZV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBMLm1hcmtlcihwb2ludCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByYWRpdXM6IDYsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogXCIjMjg1MjlhXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcIiNmZmZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29kZUFnZW50OiBhZ2VudC5wcm9wZXJ0aWVzLmNvZGVBZ2VudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29kZUdyb3VwZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmNvZGVHcm91cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldGFpbEFnZW50OiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBDb250ZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBjaXJjbGVJY29uXHJcbiAgICAgICAgICAgICAgICAgICAgfSkuYWRkVG8obWFwU2VjdG8pO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kUG9wdXAoYWdlbnQubm9tQ29tcGxldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYWdlbnRzLmFkZExheWVyKG1hcmtlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyBhZ2VudHMgPSBMLmdlb0pTT04oZGF0YSwge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIHBvaW50VG9MYXllcjogZnVuY3Rpb24gKGZlYXR1cmUsIGxhdGxuZykge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICByZXR1cm4gTC5tYXJrZXIobGF0bG5nLCB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICByYWRpdXM6IDYsXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBmaWxsQ29sb3I6IFwiIzI4NTI5YVwiLFxyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgY29sb3I6IFwiI2ZmZlwiLFxyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgd2VpZ2h0OiAxLFxyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgb3BhY2l0eTogMSxcclxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgY29kZUFnZW50OiBmZWF0dXJlLnByb3BlcnRpZXMuY29kZUFnZW50LFxyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgY29kZUdyb3VwZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmNvZGVHcm91cGUsXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkZXRhaWxBZ2VudDogZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwQ29udGVudCxcclxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGljb246IGNpcmNsZUljb25cclxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgfSxcclxuICAgICAgICAgICAgICAgIC8vICAgICBvbkVhY2hGZWF0dXJlOiBmdW5jdGlvbiAoZmVhdHVyZSwgbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBsYXllci5iaW5kUG9wdXAoZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwQ29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB9KS5hZGRUbyhtYXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0QmlnUG9seWdvbih0eXBlLCB2ZXJzaW9uKSB7XHJcbiAgICAgICAgLy8gaWYgKCF2ZXJzaW9uKSB7XHJcbiAgICAgICAgLy8gICAgIHZhciBqc29uID0gJ3tcInR5cGVcIjogXCJGZWF0dXJlQ29sbGVjdGlvblwiLFwiZmVhdHVyZXNcIjogWyc7XHJcbiAgICAgICAgLy8gICAgIHZhciBmZWF0dXJlcyA9IFwiXCI7XHJcbiAgICAgICAgLy8gICAgIG1hcC5lYWNoTGF5ZXIoZnVuY3Rpb24gKGxheWVyKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAobGF5ZXIub3B0aW9ucyAmJiBsYXllci5vcHRpb25zLmlkKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgZmVhdHVyZXMgKz0gSlNPTi5zdHJpbmdpZnkobGF5ZXJUb0pTT04obGF5ZXIpKSArIFwiLFwiO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9KTtcclxuICAgICAgICAvLyAgICAgdmVyc2lvbiA9IGpzb24gKyBmZWF0dXJlcy5zbGljZSgwLCAtMSkgKyAnXX0nO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6IFwianNvblwiLFxyXG4gICAgICAgICAgICB1cmw6IFwie3sgcGF0aCgnZ2V0X2JpZ19wb2x5Z29uJykgfX1cIixcclxuICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICAgICAgICAgIHNlY3RldXJzOiB2ZXJzaW9uXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBiaWdQb2x5Z29uID0gTC5HZW9KU09OLmdlb21ldHJ5VG9MYXllcihKU09OLnBhcnNlKGRhdGEuYmlnUG9seWdvbiksIG9wdGlvbnMucG9pbnRUb0xheWVyLCBvcHRpb25zLmNvb3Jkc1RvTGF0TG5nKTtcclxuICAgICAgICAgICAgICAgIGd1aWRlTGF5ZXJzLnNwbGljZSgwLCBndWlkZUxheWVycy5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgZ3VpZGVMYXllcnMucHVzaChiaWdQb2x5Z29uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5iaWdQb2x5Z29uQW50ZW5uZXMgIT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXAucmVtb3ZlTGF5ZXIoYW50ZW5uZXNHbG9iYWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcC5yZW1vdmVMYXllcihhbnRlbm5lcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYW50ZW5uZXNHbG9iYWwgPSBuZXcgTC5GZWF0dXJlR3JvdXAoKTtcclxuICAgICAgICAgICAgICAgICAgICBhbnRlbm5lcyA9IG5ldyBMLkZlYXR1cmVHcm91cCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJpZ1BvbHlnb25BbnRlbm5lcyA9IEwuR2VvSlNPTi5nZW9tZXRyeVRvTGF5ZXIoSlNPTi5wYXJzZShkYXRhLmJpZ1BvbHlnb25BbnRlbm5lcyksIG9wdGlvbnMucG9pbnRUb0xheWVyLCBvcHRpb25zLmNvb3Jkc1RvTGF0TG5nKTtcclxuICAgICAgICAgICAgICAgICAgICBndWlkZUxheWVycy5wdXNoKGJpZ1BvbHlnb25BbnRlbm5lcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5hbnRlbm5lcy5sZW5ndGg7IGkrKykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYW50ZW5uZXMuYWRkTGF5ZXIoIEwuR2VvSlNPTi5nZW9tZXRyeVRvTGF5ZXIoSlNPTi5wYXJzZShkYXRhLmFudGVubmVzW2ldWydzZWN0ZXVyJ10pKSwgb3B0aW9ucy5wb2ludFRvTGF5ZXIsIG9wdGlvbnMuY29vcmRzVG9MYXRMbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBhbnRlbm5lc0dsb2JhbC5hZGRMYXllcihiaWdQb2x5Z29uQW50ZW5uZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFudGVubmVzR2xvYmFsLmFkZFRvKG1hcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYW50ZW5uZXMuYWRkVG8obWFwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYW50ZW5uZXMuZWFjaExheWVyKGZ1bmN0aW9uIChsYXllcil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLm9wdGlvbnMuYW50ZW5uZSA9IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci5zZXRTdHlsZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogJzAnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAnMCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGFudGVubmVzR2xvYmFsLmVhY2hMYXllcihmdW5jdGlvbiAobGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIuc2V0U3R5bGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdncmF5JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDogMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ2dyYXknLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncG9seWdvbkFudGVubmVzJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9wb3VyIHBhc3NlciBsZXMgYW50ZW5uZXMgYXUgc2Vjb25kIHBsYW4gZXQgbmUgcGFzIGJsb3F1ZXIgbCdhY3Rpb24gZHUgY2xpYyBzdXIgdW4gc2VjdGV1clxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzdmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwic3ZnLmxlYWZsZXQtem9vbS1hbmltYXRlZCBnXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdmFyIHBhdGhBbnRlbm5lcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIucG9seWdvbkFudGVubmVzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXRoQW50ZW5uZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwicG9seWdvbkFudGVubmVzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFudGVubmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN2Zy5yZW1vdmVDaGlsZChwYXRoQW50ZW5uZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdmcucHJlcGVuZChwYXRoQW50ZW5uZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaWYgKGFnZW50cyA9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGdldEFnZW50cygpO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgLy8gaWYgKHR5cGUgPT0gJ2xvY2FsJykge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGhpZGVMb2FkTW9kYWwoKTtcclxuICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFN0eWxlKGNvZGVHcm91cGUpIHtcclxuICAgICAgICB2YXIgb3B0aW9ucyA9IHtmaWxsT3BhY2l0eTogMC4yLCBjb2xvcjogY29sb3JXaXRob3V0QWdlbnQsIHdlaWdodDogMiwgZmlsbENvbG9yOiBmaWxsQ29sb3JXaXRob3V0QWdlbnR9O1xyXG4gICAgICAgIGlmIChjb2RlR3JvdXBlICE9ICcnKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7ZmlsbE9wYWNpdHk6IDAuMiwgY29sb3I6IGNvbG9yV2l0aEFnZW50LCB3ZWlnaHQ6IDIsIGZpbGxDb2xvcjogY29sb3JzW2NvZGVHcm91cGVdfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBiaW5kVG9vbHRpcE5iQ2xpZW50cyhzZWN0ZXVyLCBwb2x5Z29uKSB7XHJcbiAgICAgICAgcG9seWdvbi5iaW5kVG9vbHRpcChzZWN0ZXVyLm5iRXF1aXBlbWVudC5uYl90b3RhbCArIFwiIGNsaWVudHNcIixcclxuICAgICAgICAgICAge3Blcm1hbmVudDogdHJ1ZSwgZGlyZWN0aW9uOiBcImNlbnRlclwifVxyXG4gICAgICAgICkuY2xvc2VUb29sdGlwKCk7XHJcbiAgICAgICAgLy8gdmFyIGNvdW50Q2xpZW50cyA9IGdldENvdW50Q2xpZW50cyhvcHRpb25zKTtcclxuICAgICAgICAvLyBpZiAoY291bnRDbGllbnRzICE9IDApIHtcclxuICAgICAgICAvLyAgICAgbGF5ZXIuYmluZFRvb2x0aXAoY291bnRDbGllbnRzICsgXCIgY2xpZW50c1wiLFxyXG4gICAgICAgIC8vICAgICAgICAge3Blcm1hbmVudDogdHJ1ZSwgZGlyZWN0aW9uOiBcImNlbnRlclwifVxyXG4gICAgICAgIC8vICAgICApLmNsb3NlVG9vbHRpcCgpO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIGxheWVyLmJpbmRUb29sdGlwKG9wdGlvbnNbJ25iQ2xpZW50cyddICsgXCIgY2xpZW50c1wiLFxyXG4gICAgICAgIC8vICAgICAgICAge3Blcm1hbmVudDogdHJ1ZSwgZGlyZWN0aW9uOiBcImNlbnRlclwifVxyXG4gICAgICAgIC8vICAgICApLmNsb3NlVG9vbHRpcCgpO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpbml0RXZlbmVtZW50TGF5ZXIocG9seWdvbikge1xyXG4gICAgICAgIC8vIHBvbHlnb24ub24oJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgLy8gICAgIGlmICgkKCcjZXhwbGFpbk1lJykuaGFzQ2xhc3MoJ2Rpc3RhbmNlJykpIHtcclxuICAgICAgICAvLyAgICAgICAgICQoJyNleHBsYWluTWUnKS5oaWRlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICAkKCcjZXhwbGFpbk1lJykucmVtb3ZlQ2xhc3MoJ2Rpc3RhbmNlJyk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgICAgbWFwLmVhY2hMYXllcihmdW5jdGlvbiAobGF5ZXIpIHtcclxuICAgICAgICAvLyAgICAgICAgIGlmIChsYXllciBpbnN0YW5jZW9mIEwuUG9seWdvbikge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGlmIChsYXllci5vcHRpb25zICYmIGxheWVyLm9wdGlvbnMuaWQgIT0gcG9seWdvbi5vcHRpb25zLmlkKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGxheWVyLm9wdGlvbnMub3BlblRvb2xiYXIgPSBmYWxzZTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgaWYoIWxheWVyLm9wdGlvbnMuYW50ZW5uZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBsYXllci5zZXRTdHlsZSh7ZmlsbE9wYWNpdHk6ICcwLjInLCBmaWxsOiAndXJsKCknfSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9KTtcclxuICAgICAgICAvLyAgICAgYWdlbnRzLmVhY2hMYXllcihmdW5jdGlvbiAobGF5ZXIpIHtcclxuICAgICAgICAvLyAgICAgICAgIGxheWVyLnNldEljb24oY2lyY2xlSWNvbik7XHJcbiAgICAgICAgLy8gICAgIH0pO1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmluZm8oJ3BvcHVwJyk7XHJcbiAgICAgICAgLy8gICAgIGlmIChwb2x5Z29uLm9wdGlvbnMgJiYgIXBvbHlnb24ub3B0aW9ucy5vcGVuVG9vbGJhcikge1xyXG4gICAgICAgIC8vICAgICAgICAgaWYgKCFmdXNpb24pIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBwb2x5Z29uLnNldFN0eWxlKHtmaWxsT3BhY2l0eTogJzAuNid9KTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBuZXcgTGVhZmxldFRvb2xiYXIuRWRpdFRvb2xiYXIuUG9wdXAoZXZlbnQubGF0bG5nLCB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGFjdGlvbnM6IGVkaXRBY3Rpb25zXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfSkuYWRkVG8obWFwLCBwb2x5Z29uKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBwb2x5Z29uLm9wdGlvbnMub3BlblRvb2xiYXIgPSB0cnVlO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICQoJyNsZWdlbmRlIHAjdGV4dGUnKVswXS5pbm5lckhUTUwgPSAocG9seWdvbi5vcHRpb25zLm5vbVNlY3RldXIgPyBwb2x5Z29uLm9wdGlvbnMubm9tU2VjdGV1ciA6ICdTZWN0ZXVyICcgKyBwb2x5Z29uLm9wdGlvbnMuaWQpICsgXCI8YnIvPlwiO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICQoJyNsZWdlbmRlIHAjdGV4dGUnKVswXS5pbm5lckhUTUwgKz0gJ0xhIHN1cGVyZmljaWUgZHUgc2VjdGV1ciBlc3QgOiAnICsgTC5HZW9tZXRyeVV0aWwucmVhZGFibGVBcmVhKEwuR2VvbWV0cnlVdGlsLmdlb2Rlc2ljQXJlYShwb2x5Z29uLmdldExhdExuZ3MoKVswXSksICdrbScpICsgJy48YnIvPic7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgaWYgKHBvbHlnb24ub3B0aW9ucy5jb2RlQWdlbnQpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgYWdlbnRzLmVhY2hMYXllcihmdW5jdGlvbiAobGF5ZXIpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlmIChsYXllci5vcHRpb25zLmNvZGVBZ2VudCA9PSBwb2x5Z29uLm9wdGlvbnMuc3VwcGxlYW50MSB8fCBsYXllci5vcHRpb25zLmNvZGVBZ2VudCA9PSBwb2x5Z29uLm9wdGlvbnMuc3VwcGxlYW50MiB8fCBsYXllci5vcHRpb25zLmNvZGVBZ2VudCA9PSBwb2x5Z29uLm9wdGlvbnMuc3VwcGxlYW50MyB8fCBsYXllci5vcHRpb25zLmNvZGVBZ2VudCA9PSBwb2x5Z29uLm9wdGlvbnMuc3VwcGxlYW50NCkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGF5ZXIuc2V0U3R5bGUoe2ZpbGxDb2xvcjogJyM2NjYnfSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBpZiAobGF5ZXIub3B0aW9ucy5jb2RlQWdlbnQgPT0gcG9seWdvbi5vcHRpb25zLmNvZGVBZ2VudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnNldEljb24oaG9tZUljb24pO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vICQoJyNsZWdlbmRlIHAjdGV4dGUnKVswXS5pbm5lckhUTUwgKz0gJ0lsIHkgYSAnICsgKE1hdGgucm91bmQocG9seWdvbi5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKS5kaXN0YW5jZVRvKGxheWVyLmdldExhdExuZygpKSkgLyAxMDAwKSArICcgS21zIGVudHJlIGxcXCdhZ2VudCAnICsgcG9seWdvbi5vcHRpb25zLmNvZGVBZ2VudCArICcgZXQgbGUgY2VudHJlIGR1IHNlY3RldXIgJyArIHBvbHlnb24ub3B0aW9ucy5pZCArICcuJztcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBHcC5TZXJ2aWNlcy5yb3V0ZSh7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9pbnQ6IHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHBvbHlnb24uZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCkubG5nLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogcG9seWdvbi5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKS5sYXRcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kUG9pbnQ6IHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IGxheWVyLmdldExhdExuZygpLmxuZyxcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IGxheWVyLmdldExhdExuZygpLmxhdFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaDogJ1ZvaXR1cmUnLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdm9pZEZlYXR1cmU6IFtdLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVByZWZlcmVuY2U6ICdmYXN0ZXN0JyxcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpS2V5OiBcImNob2lzaXJnZW9wb3J0YWlsXCIsXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2VzczogZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xlZ2VuZGUgcCN0ZXh0ZScpWzBdLmlubmVySFRNTCArPSAnSWwgeSBhICcgKyByZXN1bHRbJ3RvdGFsRGlzdGFuY2UnXSArICdzIGVudHJlIGxcXCdhZ2VudCAnICsgcG9seWdvbi5vcHRpb25zLmNvZGVBZ2VudCArICcgZXQgbGUgY2VudHJlIGR1IHNlY3RldXIgJyArIHBvbHlnb24ub3B0aW9ucy5pZCArICcuJztcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZhaWx1cmU6IGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKGVycm9yKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgJCgnI2V4cGxhaW5NZScpLmFkZENsYXNzKCdkaXN0YW5jZScpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICQoJyNleHBsYWluTWUnKS5zaG93KCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAobWFwLl90b29sYmFycyAmJiBtYXAuX3Rvb2xiYXJzWzRdKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgbWFwLnJlbW92ZUxheWVyKG1hcC5fbGF5ZXJzW21hcC5fdG9vbGJhcnNbNF0uX2xlYWZsZXRfaWRdKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgICAgIHBvbHlnb24ub3B0aW9ucy5vcGVuVG9vbGJhciA9IGZhbHNlO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyAvLyAkKFwiYm9keVwiKS5vbignY2xpY2snLFwiI3RhYmxlX2NsaWVudHMgdHJcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIHBvbHlnb24ub24oJ2RyYXctcG9wdXA6ZWRpdGVkJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAvLyAgICAgaGlkZUZ1bmN0aW9ucygpO1xyXG4gICAgICAgIC8vICAgICBtb2RpZmljYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIC8vICAgICBkcmF3UG9wdXBFZGl0ZWQodGhpcyk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBwb2x5Z29uLm9uKCdlZGl0c3RhcnQnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmluZm8oJ2VkaXRzdGFydCcpO1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmluZm8oZSk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgLy8gcG9seWdvbi5vbignZWRpdHN0b3AnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIC8vICAgICBzaG93RnVuY3Rpb25zKCk7XHJcbiAgICAgICAgLy8gICAgIG1vZGlmaWNhdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmluZm8oJ2VkaXRzdG9wJyk7XHJcbiAgICAgICAgLy8gICAgIGFkZEhpc3RvKCdMZSBzZWN0ZXVyICcgKyAodGhpcy5vcHRpb25zLm5vbVNlY3RldXIgPyB0aGlzLm9wdGlvbnMubm9tU2VjdGV1ciA6IHRoaXMub3B0aW9ucy5pZCkgKyAnIGEgw6l0w6kgbW9kaWZpw6kuJyk7XHJcbiAgICAgICAgLy8gICAgIGdldEJpZ1BvbHlnb24oJ2xvY2FsJyk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyAgICAgLy9pbml0QWdlbnRzT2ZTZWN0ZXVycygnJyk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgcG9seWdvbi5vbignbW91c2VvdmVyIG1vdXNlb3V0JywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgcG9seWdvbi50b2dnbGVUb29sdGlwKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gYmluZEVsZW1lbnRzKGZsYWcsIGxheWVycykge1xyXG4gICAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgICAgIG1hcFNlY3RvLnJlbW92ZUxheWVyKGxheWVycyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWFwU2VjdG8uYWRkTGF5ZXIobGF5ZXJzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICFmbGFnO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBmdW5jdGlvbiBnZXRDb3VudENsaWVudHMob3B0aW9ucykge1xyXG4gICAgLy8gICAgIHZhciBmaWVsZHMgPSBbJ2ZhbWlsbGUwJywgJ2ZhbWlsbGUxJywgJ2ZhbWlsbGUyJywgJ2ZhbWlsbGUzJ107XHJcbiAgICAvLyAgICAgdmFyIGZpbHRyZUZhbWlsbGUgPSAkKCcjdGFibGVfY2xpZW50cycpLmJvb3RzdHJhcFRhYmxlKCdnZXRWaXNpYmxlQ29sdW1ucycpLm1hcChmdW5jdGlvbiAoaXQpIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIGl0LmZpZWxkO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gICAgIHZhciBjb3VudENsaWVudHMgPSAwO1xyXG4gICAgLy8gICAgIGZvciAodmFyIGkgaW4gZmlsdHJlRmFtaWxsZSkge1xyXG4gICAgLy8gICAgICAgICBpZiAoZmllbGRzLmluZGV4T2YoZmlsdHJlRmFtaWxsZVtpXSkgIT0gLTEpIHtcclxuICAgIC8vICAgICAgICAgICAgIGNvdW50Q2xpZW50cyArPSBwYXJzZUludChvcHRpb25zW2ZpbHRyZUZhbWlsbGVbaV1dKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICByZXR1cm4gY291bnRDbGllbnRzO1xyXG4gICAgLy8gfVxyXG4gICAgLypGSU4gRk9OQ1RJT05TKi9cclxuXHJcbn0pO1xyXG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiXSwic291cmNlUm9vdCI6IiJ9", "@public_path/build/secto.js", "/builds/dev/refonte_sav/public/build/secto.js");
    }
}
