Say, Pi

Speak to Pi with OpenAI's Whisper

目前为 2023-09-22 提交的版本。查看 最新版本

// ==UserScript==
// @name         Say, Pi
// @namespace    http://www.saypi.ai/
// @version      1.3.8
// @description  Speak to Pi with OpenAI's Whisper
// @author       Ross Cadogan
// @match        https://pi.ai/talk
// @inject-into  page
// @license      MIT
// ==/UserScript==

/******/ (() => { // webpackBootstrap
/******/ 	"use strict";
/******/ 	var __webpack_modules__ = ({

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

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (/* binding */ AnimationModule)
/* harmony export */ });
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
var AnimationModule = /*#__PURE__*/function () {
  function AnimationModule() {
    _classCallCheck(this, AnimationModule);
  }
  _createClass(AnimationModule, null, [{
    key: "startAnimation",
    value: function startAnimation(animation) {
      this.stopOtherAnimations(animation);
      var rectangles = document.querySelectorAll(this.rectanglesSelector);
      rectangles.forEach(function (rect) {
        return rect.classList.add(animation);
      });
    }
  }, {
    key: "stopAnimation",
    value: function stopAnimation(animation) {
      var rectangles = document.querySelectorAll(this.rectanglesSelector);
      rectangles.forEach(function (rect) {
        return rect.classList.remove(animation);
      });
    }
  }, {
    key: "stopAllAnimations",
    value: function stopAllAnimations() {
      var _this = this;
      this.talkButtonAnimations.forEach(function (animation) {
        return _this.stopAnimation(animation);
      });
    }
  }, {
    key: "stopOtherAnimations",
    value: function stopOtherAnimations(keepAnimation) {
      var _this2 = this;
      this.talkButtonAnimations.forEach(function (animation) {
        if (animation !== keepAnimation) {
          _this2.stopAnimation(animation);
        }
      });
    }
  }]);
  return AnimationModule;
}();
_defineProperty(AnimationModule, "rectanglesSelector", ".outermost, .second, .third, .fourth, .fifth, .innermost");
_defineProperty(AnimationModule, "talkButtonAnimations", ["loading", "piSpeaking", "userSpeaking", "transcribing", "paused"]);


/***/ }),

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

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   buttonModule: () => (/* binding */ buttonModule),
/* harmony export */   "default": () => (/* binding */ ButtonModule)
/* harmony export */ });
/* harmony import */ var _UserAgentModule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./UserAgentModule */ "./src/UserAgentModule.js");
/* harmony import */ var _EventBus__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EventBus */ "./src/EventBus.js");
/* harmony import */ var _StateMachineService_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./StateMachineService.js */ "./src/StateMachineService.js");
/* harmony import */ var _icons_exit_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./icons/exit.svg */ "./src/icons/exit.svg");
/* harmony import */ var _icons_maximize_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./icons/maximize.svg */ "./src/icons/maximize.svg");
/* harmony import */ var _icons_rectangles_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./icons/rectangles.svg */ "./src/icons/rectangles.svg");
/* harmony import */ var _icons_waveform_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icons/waveform.svg */ "./src/icons/waveform.svg");
/* harmony import */ var _icons_muted_microphone_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./icons/muted_microphone.svg */ "./src/icons/muted_microphone.svg");
/* harmony import */ var _icons_play_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./icons/play.svg */ "./src/icons/play.svg");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }









var ButtonModule = /*#__PURE__*/function () {
  function ButtonModule() {
    _classCallCheck(this, ButtonModule);
    this.playButton = null;
    this.actor = _StateMachineService_js__WEBPACK_IMPORTED_MODULE_2__["default"].actor;
    // Binding methods to the current instance
    this.handlePlayButtonClick = this.handlePlayButtonClick.bind(this);
    this.registerOtherEvents();
  }
  _createClass(ButtonModule, [{
    key: "registerOtherEvents",
    value: function registerOtherEvents() {
      _EventBus__WEBPACK_IMPORTED_MODULE_1__["default"].on("saypi:autoSubmit", ButtonModule.handleAutoSubmit);
    }

    // Function to create a new button
  }, {
    key: "createButton",
    value: function createButton(label, callback) {
      var button = document.createElement("button");
      button.textContent = label;
      button.onclick = callback;
      return button;
    }

    // Function to style a given button
  }, {
    key: "styleButton",
    value: function styleButton(button, styles) {
      for (var key in styles) {
        if (styles.hasOwnProperty(key)) {
          button.style[key] = styles[key];
        }
      }
    }
  }, {
    key: "addTalkIcon",
    value: function addTalkIcon(button) {
      var _this = this;
      this.updateIconContent(button);
      window.matchMedia("(max-width: 768px)").addListener(function () {
        _this.updateIconContent(button);
      });
      this.setupClassObserver(button);
    }
  }, {
    key: "updateIconContent",
    value: function updateIconContent(iconContainer) {
      if ((0,_UserAgentModule__WEBPACK_IMPORTED_MODULE_0__.isMobileView)()) {
        iconContainer.innerHTML = _icons_rectangles_svg__WEBPACK_IMPORTED_MODULE_5__["default"];
      } else {
        iconContainer.innerHTML = _icons_waveform_svg__WEBPACK_IMPORTED_MODULE_6__["default"];
      }
    }
  }, {
    key: "setupClassObserver",
    value: function setupClassObserver(button) {
      var _this2 = this;
      var targetNode = document.documentElement; // The <html> element

      var config = {
        attributes: true,
        attributeFilter: ["class"]
      };
      var callback = function callback(mutationsList, observer) {
        var _iterator = _createForOfIteratorHelper(mutationsList),
          _step;
        try {
          for (_iterator.s(); !(_step = _iterator.n()).done;) {
            var mutation = _step.value;
            if (mutation.type === "attributes") {
              if (mutation.attributeName === "class") {
                if (document.documentElement.classList.contains("mobile-view")) {
                  // 'mobile-view' class was added
                  _this2.updateIconContent(button);
                } else {
                  // 'mobile-view' class was removed
                  _this2.updateIconContent(button);
                }
              }
            }
          }
        } catch (err) {
          _iterator.e(err);
        } finally {
          _iterator.f();
        }
      };
      var observer = new MutationObserver(callback);

      // Start observing the target node for configured mutations
      observer.observe(targetNode, config);

      // Later, you can stop observing by calling:
      // observer.disconnect();
    }

    // Simulate an "Enter" keypress event on a form
  }, {
    key: "createExitButton",
    value: function createExitButton() {
      var label = "Exit Voice-Controlled Mobile Mode";
      var button = this.createButton("", function () {
        (0,_UserAgentModule__WEBPACK_IMPORTED_MODULE_0__.exitMobileMode)();
      });
      button.id = "saypi-exitButton";
      button.type = "button";
      button.className = "exit-button fixed rounded-full bg-cream-550 enabled:hover:bg-cream-650";
      button.setAttribute("aria-label", label);
      button.setAttribute("title", label);
      button.innerHTML = _icons_exit_svg__WEBPACK_IMPORTED_MODULE_3__["default"];
      document.body.appendChild(button);
      return button;
    }
  }, {
    key: "createEnterButton",
    value: function createEnterButton() {
      var label = "Enter Voice-Controlled Mobile Mode";
      var button = this.createButton("", function () {
        (0,_UserAgentModule__WEBPACK_IMPORTED_MODULE_0__.enterMobileMode)();
      });
      button.id = "saypi-enterButton";
      button.type = "button";
      button.className = "enter-button fixed rounded-full bg-cream-550 enabled:hover:bg-cream-650";
      button.setAttribute("aria-label", label);
      button.setAttribute("title", label);
      button.innerHTML = _icons_maximize_svg__WEBPACK_IMPORTED_MODULE_4__["default"];
      document.body.appendChild(button);
      return button;
    }
  }, {
    key: "createPlayButton",
    value: function createPlayButton() {
      var label = "Hear Pi's response";
      this.playButton = this.createButton("", function () {});
      this.playButton.id = "saypi-playButton";
      this.playButton.type = "button";
      this.playButton.className = "hidden play-button";
      this.playButton.setAttribute("aria-label", label);
      this.playButton.setAttribute("title", label);
      this.playButton.addEventListener("click", this.handlePlayButtonClick);
      this.playButton.innerHTML = _icons_play_svg__WEBPACK_IMPORTED_MODULE_8__["default"];
      document.body.appendChild(this.playButton);
      console.log("Play button created, and added to the DOM.");
      return this.playButton;
    }
  }, {
    key: "showPlayButton",
    value: function showPlayButton() {
      if (!this.playButton) {
        this.createPlayButton();
      }
      this.playButton.classList.remove("hidden");
    }
  }, {
    key: "hidePlayButton",
    value: function hidePlayButton() {
      if (this.playButton) {
        this.playButton.classList.add("hidden");
      }
    }
  }, {
    key: "handlePlayButtonClick",
    value: function handlePlayButtonClick() {
      this.actor.send("saypi:unblock");
      _EventBus__WEBPACK_IMPORTED_MODULE_1__["default"].emit("audio:reload");
    }
  }, {
    key: "showNotification",
    value: function showNotification(details) {
      var icon = details.icon;
      var iconSVG;
      if (icon === "muted-microphone") {
        iconSVG = _icons_muted_microphone_svg__WEBPACK_IMPORTED_MODULE_7__["default"];
      }
      var notification = document.getElementById("saypi-notification");
      if (notification) {
        notification.classList.remove("hidden");
        notification.innerHTML = iconSVG;
      } else {
        var _notification = document.createElement("div");
        _notification.id = "saypi-notification";
        _notification.className = "notification";
        _notification.innerHTML = iconSVG;
        document.body.appendChild(_notification);
      }
    }
  }, {
    key: "dismissNotification",
    value: function dismissNotification() {
      var notification = document.getElementById("saypi-notification");
      if (notification) {
        notification.classList.add("hidden");
      }
    }
  }], [{
    key: "simulateFormSubmit",
    value: function simulateFormSubmit() {
      var submitButton = document.getElementById("saypi-submitButton");
      if (submitButton) {
        submitButton.click();
      } else {
        /* hit enter key in the prompt textarea, might not work as expected on "new ui layout" */
        var textarea = document.getElementById("saypi-prompt");
        var enterEvent = new KeyboardEvent("keydown", {
          bubbles: true,
          key: "Enter",
          keyCode: 13,
          which: 13
        });
        textarea.dispatchEvent(enterEvent);
      }
    }

    // Function to handle auto-submit based on the button's data attribute
  }, {
    key: "handleAutoSubmit",
    value: function handleAutoSubmit() {
      var talkButton = document.getElementById("saypi-talkButton");
      if (talkButton.dataset.autosubmit === "false") {
        console.log("Autosubmit is disabled");
      } else {
        ButtonModule.simulateFormSubmit();
      }
    }
  }]);
  return ButtonModule;
}(); // Singleton

var buttonModule = new ButtonModule();

/***/ }),

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

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js");
/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__);

/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new (events__WEBPACK_IMPORTED_MODULE_0___default())());

/***/ }),

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

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (/* binding */ EventModule)
/* harmony export */ });
/* harmony import */ var _EventBus_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EventBus.js */ "./src/EventBus.js");
/* harmony import */ var _StateMachineService_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./StateMachineService.js */ "./src/StateMachineService.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }


var USER_SPEAKING = "saypi:userSpeaking";
var USER_STOPPED_SPEAKING = "saypi:userStoppedSpeaking";
var USER_FINISHED_SPEAKING = "saypi:userFinishedSpeaking";
var TRANSCRIBING = "saypi:transcribing";
var PI_SPEAKING = "saypi:piSpeaking";
var PI_STOPPED_SPEAKING = "saypi:piStoppedSpeaking";
var PI_FINISHED_SPEAKING = "saypi:piFinishedSpeaking";
var PAUSE = "saypi:safariBlocked";
var READY = "saypi:ready";
var PLAY = "saypi:play";
var EventModule = /*#__PURE__*/function () {
  function EventModule() {
    _classCallCheck(this, EventModule);
  }
  _createClass(EventModule, null, [{
    key: "init",
    value: function init() {
      // All the event listeners can be added here
      this.registerStateMachineEvents(_StateMachineService_js__WEBPACK_IMPORTED_MODULE_1__["default"].actor);
      // Any other initializations...
    }
  }, {
    key: "cleanup",
    value: function cleanup() {
      // Remove event listeners if needed, or any other cleanup operations
      window.removeEventListener("saypi:transcribed", this.handleTranscriptionResponse);
    }
  }, {
    key: "simulateTyping",
    value: function simulateTyping(element, text) {
      var words = text.split(" ");
      var i = 0;
      var typeWord = function typeWord() {
        if (i < words.length) {
          EventModule.setNativeValue(element, element.value + words[i++] + " ");
          requestAnimationFrame(typeWord);
        } else {
          _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].emit("saypi:autoSubmit");
        }
      };
      typeWord();
    }
  }, {
    key: "setNativeValue",
    value: function setNativeValue(element, value) {
      var lastValue = element.value;
      element.value = value;
      var event = new Event("input", {
        target: element,
        bubbles: true
      });
      // React 15
      event.simulated = true;
      // React 16-17
      var tracker = element._valueTracker;
      if (tracker) {
        tracker.setValue(lastValue);
      }
      element.dispatchEvent(event);
    }
  }, {
    key: "handleTalkMouseDown",
    value: function handleTalkMouseDown() {
      _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].emit("audio:startRecording");
    }
  }, {
    key: "handleTalkMouseUp",
    value: function handleTalkMouseUp() {
      _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].emit("audio:stopRecording");
    }
  }, {
    key: "handleTalkDoubleClick",
    value: function handleTalkDoubleClick(button) {
      // Toggle the CSS classes to indicate the mode
      button.classList.toggle("autoSubmit");
      if (button.getAttribute("data-autosubmit") === "true") {
        button.setAttribute("data-autosubmit", "false");
        console.log("autosubmit disabled");
      } else {
        button.setAttribute("data-autosubmit", "true");
        console.log("autosubmit enabled");
      }
    }
  }, {
    key: "handleTalkTouchStart",
    value: function handleTalkTouchStart(button, e) {
      e.preventDefault();
      _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].emit("audio:startRecording");
    }
  }, {
    key: "handleTalkTouchEnd",
    value: function handleTalkTouchEnd(button) {
      _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].emit("audio:stopRecording");
    }
  }, {
    key: "registerOtherAudioButtonEvents",
    value: function registerOtherAudioButtonEvents(button) {
      // "warm up" the microphone by acquiring it before the user presses the button
      button.addEventListener("mouseenter", function () {
        _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].emit("audio:setupRecording");
      });
      button.addEventListener("mouseleave", function () {
        _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].emit("audio:tearDownRecording");
      });
      window.addEventListener("beforeunload", function () {
        _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].emit("audio:tearDownRecording");
      });
      button.addEventListener("touchcancel", function () {
        _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].emit("audio:tearDownRecording");
      });
    }
  }, {
    key: "registerStateMachineEvents",
    value: function registerStateMachineEvents(actor) {
      _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].on(USER_SPEAKING, function () {
        actor.send(USER_SPEAKING);
      });
      [USER_STOPPED_SPEAKING, USER_FINISHED_SPEAKING].forEach(function (eventName) {
        _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].on(eventName, function (detail) {
          if (detail) {
            actor.send(_objectSpread({
              type: eventName
            }, detail));
          } else {
            console.warn("Received ".concat(eventName, " without details."));
          }
        });
      });
      _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].on(TRANSCRIBING, function () {
        actor.send(TRANSCRIBING);
      });
      [PI_SPEAKING, PI_STOPPED_SPEAKING, PI_FINISHED_SPEAKING].forEach(function (eventName) {
        _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].on(eventName, function () {
          actor.send(eventName);
        });
      });
      [PAUSE, READY, PLAY].forEach(function (eventName) {
        _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].on(eventName, function () {
          actor.send(eventName);
        });
      });
    }

    /* events to direct the audio module to start/stop recording */
  }, {
    key: "registerHotkey",
    value: function registerHotkey() {
      var ctrlDown = false;
      document.addEventListener("keydown", function (event) {
        if (event.ctrlKey && event.code === "Space" && !ctrlDown) {
          ctrlDown = true;
          _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].emit("audio:startRecording");
        }
      });
      document.addEventListener("keyup", function (event) {
        if (ctrlDown && event.code === "Space") {
          ctrlDown = false;
          _EventBus_js__WEBPACK_IMPORTED_MODULE_0__["default"].emit("audio:stopRecording");
        }
      });
    }
  }]);
  return EventModule;
}();


/***/ }),

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

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   serializeStateValue: () => (/* binding */ serializeStateValue)
/* harmony export */ });
function serializeStateValue(stateValue) {
  if (typeof stateValue === "string") {
    return stateValue;
  }
  return Object.keys(stateValue).map(function (key) {
    return "".concat(key, ":").concat(serializeStateValue(stateValue[key]));
  }).join(",");
}

/***/ }),

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

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var xstate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! xstate */ "./node_modules/xstate/es/interpreter.js");
/* harmony import */ var _state_machines_SayPiMachine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./state-machines/SayPiMachine */ "./src/state-machines/SayPiMachine.js");
/* harmony import */ var _LoggingModule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./LoggingModule */ "./src/LoggingModule.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }




/**
 * A singleton service that manages the state machine.
 */
var StateMachineService = /*#__PURE__*/_createClass(function StateMachineService() {
  _classCallCheck(this, StateMachineService);
  this.actor = (0,xstate__WEBPACK_IMPORTED_MODULE_2__.interpret)(_state_machines_SayPiMachine__WEBPACK_IMPORTED_MODULE_0__.machine).onTransition(function (state) {
    if (state.changed) {
      var fromState = state.history ? (0,_LoggingModule__WEBPACK_IMPORTED_MODULE_1__.serializeStateValue)(state.history.value) : "N/A";
      var toState = (0,_LoggingModule__WEBPACK_IMPORTED_MODULE_1__.serializeStateValue)(state.value);
      console.log("Say, Pi Machine transitioned from ".concat(fromState, " to ").concat(toState, " with ").concat(state.event.type));
    }
  });
  this.actor.start();
}); // Singleton
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new StateMachineService());

/***/ }),

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

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   handleTranscriptionResponse: () => (/* binding */ handleTranscriptionResponse),
/* harmony export */   uploadAudio: () => (/* binding */ uploadAudio)
/* harmony export */ });
/* harmony import */ var _StateMachineService_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./StateMachineService.js */ "./src/StateMachineService.js");
/* harmony import */ var _UserAgentModule_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./UserAgentModule.js */ "./src/UserAgentModule.js");
/* harmony import */ var _EventBus_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EventBus.js */ "./src/EventBus.js");
/* harmony import */ var _EventModule_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EventModule.js */ "./src/EventModule.js");




var config = {
  appServerUrl: "https://app.saypi.ai",
  apiServerUrl: "https://api.saypi.ai"
};
function uploadAudio(audioBlob, audioDurationMillis) {
  // Create a FormData object
  var formData = new FormData();
  var audioFilename = "audio.webm";
  if (audioBlob.type === "audio/mp4") {
    audioFilename = "audio.mp4";
  }
  // Add the audio blob to the FormData object
  formData.append("audio", audioBlob, audioFilename);
  // Get the user's preferred language
  var language = navigator.language;
  var startTime = new Date().getTime();
  // Post the audio to the server for transcription
  fetch(config.apiServerUrl + "/transcribe?language=" + language, {
    method: "POST",
    body: formData
  }).then(function (response) {
    if (!response.ok) {
      throw Error(response.statusText);
    }
    return response.json();
  }).then(function (responseJson) {
    var endTime = new Date().getTime();
    var transcriptionDurationMillis = endTime - startTime;
    console.log("Transcribed " + Math.round(audioDurationMillis / 1000) + "s of audio in " + Math.round(transcriptionDurationMillis / 1000) + "s");
    if (responseJson.text.length === 0) {
      _StateMachineService_js__WEBPACK_IMPORTED_MODULE_0__["default"].actor.send("saypi:transcribedEmpty");
    } else {
      _StateMachineService_js__WEBPACK_IMPORTED_MODULE_0__["default"].actor.send("saypi:transcribed", {
        text: responseJson.text
      });
    }
  })["catch"](function (error) {
    console.error("Looks like there was a problem: ", error);
    _StateMachineService_js__WEBPACK_IMPORTED_MODULE_0__["default"].actor.send("saypi:transcribeFailed");
  });
}
function handleTranscriptionResponse(transcript) {
  console.log("Transcript: " + transcript);
  var textarea = document.getElementById("saypi-prompt");
  if ((0,_UserAgentModule_js__WEBPACK_IMPORTED_MODULE_1__.isMobileView)()) {
    // if transcript is > 1000 characters, truncate it to 999 characters plus an ellipsis
    if (transcript.length > 1000) {
      transcript = transcript.substring(0, 999) + "…";
      console.warn("Transcript was too long for Pi. Truncated to 999 characters, losing the following text: ... " + transcript.substring(999));
    }
    _EventModule_js__WEBPACK_IMPORTED_MODULE_3__["default"].setNativeValue(textarea, transcript);
    _EventBus_js__WEBPACK_IMPORTED_MODULE_2__["default"].emit("saypi:autoSubmit");
  } else {
    _EventModule_js__WEBPACK_IMPORTED_MODULE_3__["default"].simulateTyping(textarea, transcript + " ");
  }
}

/***/ }),

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

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   addDeviceFlags: () => (/* binding */ addDeviceFlags),
/* harmony export */   addUserAgentFlags: () => (/* binding */ addUserAgentFlags),
/* harmony export */   addViewFlags: () => (/* binding */ addViewFlags),
/* harmony export */   enterMobileMode: () => (/* binding */ enterMobileMode),
/* harmony export */   exitMobileMode: () => (/* binding */ exitMobileMode),
/* harmony export */   isMobileDevice: () => (/* binding */ isMobileDevice),
/* harmony export */   isMobileView: () => (/* binding */ isMobileView),
/* harmony export */   isSafari: () => (/* binding */ isSafari)
/* harmony export */ });
function isSafari() {
  return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
}
function isMobileDevice() {
  return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || window.matchMedia("(max-width: 768px)").matches;
}

// this function determines whether to show the mobile view or not
function isMobileView() {
  var userViewPreference = null;
  try {
    userViewPreference = localStorage.getItem("userViewPreference");
  } catch (e) {
    console.warn("Could not access localStorage: ", e);
  }
  var prefersMobile = false;
  if (userViewPreference) {
    prefersMobile = userViewPreference === "mobile";
  }

  // Make sure isMobileDevice is defined or imported
  return isMobileDevice() && prefersMobile;
}
function exitMobileMode() {
  localStorage.setItem("userViewPreference", "desktop"); // Save preference

  var element = document.documentElement;
  element.classList.remove("mobile-view");
  element.classList.add("desktop-view");
}
function enterMobileMode() {
  localStorage.setItem("userViewPreference", "mobile"); // Save preference

  var element = document.documentElement;
  element.classList.remove("desktop-view");
  element.classList.add("mobile-view");
}
function addUserAgentFlags() {
  var isFirefoxAndroid = /Firefox/.test(navigator.userAgent) && /Android/.test(navigator.userAgent);
  var element = document.documentElement;
  if (isFirefoxAndroid) {
    element.classList.add("firefox-android");
  }
  addDeviceFlags(element);
  addViewFlags(element);
}
function addDeviceFlags(element) {
  if (isMobileDevice()) {
    element.classList.add("mobile-device");
  }
}
function addViewFlags(element) {
  if (isMobileView()) {
    element.classList.remove("desktop-view");
    element.classList.add("mobile-view");
  } else {
    element.classList.remove("mobile-view");
    element.classList.add("desktop-view");
  }
}

/***/ }),

/***/ "./src/state-machines/SayPiMachine.js":
/*!********************************************!*\
  !*** ./src/state-machines/SayPiMachine.js ***!
  \********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   machine: () => (/* binding */ machine)
/* harmony export */ });
/* harmony import */ var _ButtonModule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ButtonModule */ "./src/ButtonModule.js");
/* harmony import */ var xstate__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! xstate */ "./node_modules/xstate/es/Machine.js");
/* harmony import */ var _AnimationModule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../AnimationModule */ "./src/AnimationModule.js");
/* harmony import */ var _UserAgentModule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../UserAgentModule */ "./src/UserAgentModule.js");
/* harmony import */ var _TranscriptionModule__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../TranscriptionModule */ "./src/TranscriptionModule.js");
/* harmony import */ var _EventBus__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EventBus */ "./src/EventBus.js");






var machine = (0,xstate__WEBPACK_IMPORTED_MODULE_5__.createMachine)({
  /** @xstate-layout N4IgpgJg5mDOIC5SwIYE8AKBLAdFiANmAMSpoAOWCArrGAE4DK5YKA1lgHZQDaADAF1EocgHtYWAC5ZRnYSAAeiAMwB2PjmUBOPgDYAjLq379y3QBoQaRPr5atOXaq26ALKoBMy-QA5TAX39LMmw8QhIySgRUADMUeiwAIQJRAGM2SH4hJBAxCWlZeSUEPktrEsDg9FD8IlJ0KMpmVg5uLPk8qRk5HOK1DW09Q2NTCytEVx8PHHddAFZVI2UF3V0+OcqQENxaBmb2Lih6iipd+gAxLixYAAtIfdbeQQ7xLsLexA97Vxw5vlVVMt1Ho5soyohQbpfh55otlJMtHMPJttjgzg9DscoujJKJyCwIBi2s8cp0Cj1QMUPHwfA4pnwzMo7LS5j4weMEB5XBotIs5qy-qtVr4UdUdnQmCwDtwsVRJPQUJxYKkEgAjQ7tUmvclFT7fX7-QELPgg9nlVzzHB8GFIrQ+BkA-mizC4VUpdKQWU0ThutJsTUibXdXUIWw6TSuNSqOa6NnU7zghAAn7qbzWjyqVweJGuZ2hX0eiBe+isCBoAO5IPvSmIVY82OLGF6GnKHyJtbKHAeG0xr4+TwefR53BNKWPL1NXH4+5jjUkwP5YMfUNZqGuLTdi3Z5ZzFyJ3k+HAblxOHyxnwLIdBLZinCjlqYyKnCVEp7ZBdvCmKT40unx3RMnaiJsom66HhmsJfMmMLKMOd5YK+E5YJcnDXHchKzsS76Vou1bfiuMK-N4yjeFo3JAloiZmPoOCePMCwAnoPiTBs16ovKirKmqj4NHKCpKiqWCqpk844Z+IaAYe+i9joJHdoiiZ+AaJr-HwvhsvoGZwRxAncTKT4IDpXFCWA5woFgRAQBWZJLqA5rWrRfILD4F5zK4u6WH0zGHmoYFfJGqwxtp-HGeq+m8YZIWCcJEAAKIALbkJI5aiTZeHFKUHJ8HBKQoBAPEnAg97Sm+Ly4V+xT6KuMwblyujbvye4cs4qiOM4bgxv8+g6D4cEMPQoj0LAxAKLAkgoJIYA4CgMSTfQAAUtgqQAlMcoT9YNsDWVWFWIJl5TZWxt4bUNI1jRNU0zXNi0qXwq2oidW36NhaW7SUiaHdenCiBAcDyNsZXicuAC0kyJsD-a-HBtRgIDOrLlmiaaXMmhzNJvbdn43W5kdLpoi+mFQHDtn4dmDl-IxUysoMqigaYXZ8lm3asussG4-m7oZBAxPpRCdoRr5g7uBesaJoCUL6O1UzeBmTKsVUePFY8PNvYYzG0X8NJ0Qs66gRa0KQaY1J+MFnHRYcKsSVmKOaX5ZFmPMYz2dMAL0aoLn8u5Wg5aIeUW1q5UhsjPl2gi7iZvCYvuUeXxuLMvjufLN5449lsIx4imuD8ksuNLmmAusfX0ANQ04EZ0WmeZllpzWCA6Puiw4DnsZePnctFyXsA4PFWCpLFxeDTX+H1xyJgLG1LjSfYbimGzgRAA */
  id: "sayPi",
  initial: "idle",
  states: {
    idle: {
      description: "Initial state.\nGentle pulsing animation.",
      entry: ["stopAllAnimations", "acquireMicrophone"],
      on: {
        "saypi:userSpeaking": {
          target: "userSpeaking"
        },
        "saypi:safariBlocked": {
          target: "blocked",
          cond: "isSafari"
        },
        "saypi:piSpeaking": {
          target: "piSpeaking"
        }
      }
    },
    userSpeaking: {
      description: "User is speaking and being recorded by the microphone.\nWaveform animation.",
      entry: [{
        type: "startAnimation",
        params: {
          animation: "userSpeaking"
        }
      }, "activateTalkButton"],
      exit: [{
        type: "stopAnimation",
        params: {
          animation: "userSpeaking"
        }
      }, "deactivateTalkButton"],
      on: {
        "saypi:userFinishedSpeaking": {
          target: "transcribing",
          cond: "longEnoughForUpload"
        },
        "saypi:userStoppedSpeaking": {
          target: "idle",
          cond: "tooShortForUpload"
        },
        "saypi:transcribing": {
          target: "transcribing"
        }
      }
    },
    blocked: {
      description: "Blocking action on Safari.\nUser must press play to hear Pi's response.\nBounce animation.",
      entry: [{
        type: "startAnimation",
        params: {
          animation: "paused"
        }
      }, "showPlayButton"],
      exit: [{
        type: "stopAnimation",
        params: {
          animation: "paused"
        }
      }, "hidePlayButton"],
      on: {
        "saypi:ready": {
          target: "blocked",
          internal: true,
          description: "Enough audio has been buffered to start playback.",
          actions: "showPlayButton"
        },
        "saypi:unblock": {
          target: "loading"
        }
      }
    },
    piSpeaking: {
      description: "Pi's synthesised speech audio is playing.\nPlayful animation.",
      entry: {
        type: "startAnimation",
        params: {
          animation: "piSpeaking"
        }
      },
      exit: {
        type: "stopAnimation",
        params: {
          animation: "piSpeaking"
        }
      },
      on: {
        "saypi:piStoppedSpeaking": {
          target: "idle"
        },
        "saypi:userSpeaking": {
          target: "userSpeaking"
        },
        "saypi:piFinishedSpeaking": {
          target: "idle"
        }
      }
    },
    transcribing: {
      description: "Transcribing audio to text.\nCard flip animation.",
      entry: [{
        type: "startAnimation",
        params: {
          animation: "transcribing"
        }
      }, {
        type: "transcribeAudio",
        params: {}
      }],
      exit: {
        type: "stopAnimation",
        params: {
          animation: "transcribing"
        }
      },
      on: {
        "saypi:transcribed": {
          target: "idle",
          actions: {
            type: "handleTranscriptionResponse",
            params: {}
          },
          description: "Successfully transcribed user audio to text."
        },
        "saypi:transcribeFailed": {
          target: "#sayPi.errors.transcribeFailed",
          description: "Received an error response from the /transcribe API"
        },
        "saypi:transcribedEmpty": {
          target: "#sayPi.errors.micError",
          description: "Received an empty response from the /transcribe API (no speech detected)"
        }
      }
    },
    loading: {
      description: "Pi's audio is loading.",
      entry: {
        type: "startAnimation",
        params: {
          animation: "loading"
        }
      },
      exit: {
        type: "stopAnimation",
        params: {
          animation: "loading"
        }
      },
      on: {
        "saypi:piSpeaking": {
          target: "piSpeaking"
        }
      }
    },
    errors: {
      description: "Error parent state.",
      after: {
        10000: [{
          target: "#sayPi.idle",
          actions: [],
          description: "Reset to the idle state and clear errors."
        }, {
          internal: false
        }]
      },
      initial: "transcribeFailed",
      states: {
        transcribeFailed: {
          description: "The /transcribe API responded with an error.",
          type: "final",
          entry: {
            type: "startAnimation",
            params: {
              animation: "error"
            }
          },
          exit: {
            type: "stopAnimation",
            params: {
              animation: "error"
            }
          }
        },
        micError: {
          type: "final",
          description: "No audio input detected",
          entry: {
            type: "showNotification",
            params: {
              icon: "muted-microphone"
            }
          },
          exit: {
            type: "dismissNotification",
            params: {}
          }
        }
      }
    }
  },
  predictableActionArguments: true,
  preserveActionOrder: true
}, {
  actions: {
    stopAllAnimations: function stopAllAnimations(context, event) {
      _AnimationModule__WEBPACK_IMPORTED_MODULE_1__["default"].stopAllAnimations();
    },
    startAnimation: function startAnimation(context, event, _ref) {
      var action = _ref.action;
      _AnimationModule__WEBPACK_IMPORTED_MODULE_1__["default"].startAnimation(action.params.animation);
    },
    stopAnimation: function stopAnimation(context, event, _ref2) {
      var action = _ref2.action;
      _AnimationModule__WEBPACK_IMPORTED_MODULE_1__["default"].stopAnimation(action.params.animation);
    },
    transcribeAudio: function transcribeAudio(context, event) {
      console.log("transcribeAudio", event);
      var audioBlob = event.blob;
      (0,_TranscriptionModule__WEBPACK_IMPORTED_MODULE_3__.uploadAudio)(audioBlob, event.duration);
    },
    handleTranscriptionResponse: function handleTranscriptionResponse(context, event) {
      console.log("handleTranscriptionResponse", event);
      var transcription = event.text;
      (0,_TranscriptionModule__WEBPACK_IMPORTED_MODULE_3__.handleTranscriptionResponse)(transcription);
    },
    showPlayButton: function showPlayButton(context, event) {
      _ButtonModule__WEBPACK_IMPORTED_MODULE_0__.buttonModule.showPlayButton();
    },
    hidePlayButton: function hidePlayButton(context, event) {
      _ButtonModule__WEBPACK_IMPORTED_MODULE_0__.buttonModule.hidePlayButton();
    },
    activateTalkButton: function activateTalkButton(context, event) {
      var talkButton = document.getElementById("saypi-talkButton");
      talkButton.classList.add("active"); // Add the active class (for Firefox on Android)
    },

    deactivateTalkButton: function deactivateTalkButton(context, event) {
      var talkButton = document.getElementById("saypi-talkButton");
      talkButton.classList.remove("active"); // Remove the active class (for Firefox on Android)
    },

    acquireMicrophone: function acquireMicrophone(context, event) {
      // warmup the microphone on idle in mobile view,
      // since there's no mouseover event to trigger it
      if ((0,_UserAgentModule__WEBPACK_IMPORTED_MODULE_2__.isMobileView)()) {
        _EventBus__WEBPACK_IMPORTED_MODULE_4__["default"].emit("audio:setupRecording");
      }
    },
    showNotification: function showNotification(context, event, _ref3) {
      var action = _ref3.action;
      var icon = action.params.icon;
      var message = action.params.message;
      _ButtonModule__WEBPACK_IMPORTED_MODULE_0__.buttonModule.showNotification({
        icon: icon,
        message: message
      });
    },
    dismissNotification: function dismissNotification(context, event) {
      _ButtonModule__WEBPACK_IMPORTED_MODULE_0__.buttonModule.dismissNotification();
    }
  },
  services: {},
  guards: {
    tooShortForUpload: function tooShortForUpload(context, event) {
      return event.duration < 1000;
    },
    longEnoughForUpload: function longEnoughForUpload(context, event) {
      return event.duration >= 1000;
    },
    isSafari: function isSafari(context, event) {
      return (0,_UserAgentModule__WEBPACK_IMPORTED_MODULE_2__.isSafari)();
    }
  },
  delays: {}
});

/***/ }),

/***/ "./node_modules/css-loader/dist/cjs.js!./src/styles/rectangles.css":
/*!*************************************************************************!*\
  !*** ./node_modules/css-loader/dist/cjs.js!./src/styles/rectangles.css ***!
  \*************************************************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
// Imports


var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
___CSS_LOADER_EXPORT___.push([module.id, `@keyframes pulse_outermost {
  0%,
  100% {
    transform: scale(1);
  }
  50% {
    transform: scale(0.92);
  }
}
.outermost {
  animation: pulse_outermost 5s infinite;
  transform-origin: center;
}

@keyframes pulse_second {
  0%,
  100% {
    transform: scale(1);
  }
  50% {
    transform: scale(0.856);
  }
}
.second {
  animation: pulse_second 5s infinite;
  transform-origin: center;
}

@keyframes pulse_third {
  0%,
  100% {
    transform: scale(1);
  }
  50% {
    transform: scale(0.792);
  }
}
.third {
  animation: pulse_third 5s infinite;
  transform-origin: center;
}

@keyframes pulse_fourth {
  0%,
  100% {
    transform: scale(1);
  }
  50% {
    transform: scale(0.728);
  }
}
.fourth {
  animation: pulse_fourth 5s infinite;
  transform-origin: center;
}

@keyframes pulse_fifth {
  0%,
  100% {
    transform: scale(1);
  }
  50% {
    transform: scale(0.664);
  }
}
.fifth {
  animation: pulse_fifth 5s infinite;
  transform-origin: center;
}

@keyframes pulse_innermost {
  0%,
  100% {
    transform: scale(1);
  }
  50% {
    transform: scale(0.6);
  }
}
.innermost {
  animation: pulse_innermost 5s infinite;
  transform-origin: center;
}

/* bounce animation to indicate Pi is paused awaiting permission to speak */
@keyframes bounce_outermost {
  0%,
  20%,
  50%,
  80%,
  100% {
    transform: translateY(0);
  }
  40% {
    transform: translateY(-5%);
  }
  60% {
    transform: translateY(-3%);
  }
}
.outermost.paused {
  animation-name: bounce_outermost;
  animation-duration: 2s;
  animation-iteration-count: infinite;
}

@keyframes bounce_second {
  0%,
  20%,
  50%,
  80%,
  100% {
    transform: translateY(0);
  }
  40% {
    transform: translateY(-5.8%);
  }
  60% {
    transform: translateY(-3.48%);
  }
}
.second.paused {
  animation-name: bounce_second;
  animation-duration: 2s;
  animation-iteration-count: infinite;
}

@keyframes bounce_third {
  0%,
  20%,
  50%,
  80%,
  100% {
    transform: translateY(0);
  }
  40% {
    transform: translateY(-6.6%);
  }
  60% {
    transform: translateY(-3.96%);
  }
}
.third.paused {
  animation-name: bounce_third;
  animation-duration: 2s;
  animation-iteration-count: infinite;
}

@keyframes bounce_fourth {
  0%,
  20%,
  50%,
  80%,
  100% {
    transform: translateY(0);
  }
  40% {
    transform: translateY(-7.4%);
  }
  60% {
    transform: translateY(-4.44%);
  }
}
.fourth.paused {
  animation-name: bounce_fourth;
  animation-duration: 2s;
  animation-iteration-count: infinite;
}

@keyframes bounce_fifth {
  0%,
  20%,
  50%,
  80%,
  100% {
    transform: translateY(0);
  }
  40% {
    transform: translateY(-8.2%);
  }
  60% {
    transform: translateY(-4.92%);
  }
}
.fifth.paused {
  animation-name: bounce_fifth;
  animation-duration: 2s;
  animation-iteration-count: infinite;
}

@keyframes bounce_innermost {
  0%,
  20%,
  50%,
  80%,
  100% {
    transform: translateY(0);
  }
  40% {
    transform: translateY(-9%);
  }
  60% {
    transform: translateY(-5.4%);
  }
}
.innermost.paused {
  animation-name: bounce_innermost;
  animation-duration: 2s;
  animation-iteration-count: infinite;
}

/* playful animation to indicate Pi is speaking */
@keyframes speaking_outermost {
  0%,
  100% {
    transform: scale(1) rotate(0deg);
  }
  25% {
    transform: scale(0.995);
  }
  50% {
    transform: scale(0.9);
  }
  75% {
    transform: scale(0.895);
  }
}
.outermost.piSpeaking {
  animation: speaking_outermost 2s infinite;
  transform-origin: center;
}

@keyframes speaking_second {
  0%,
  100% {
    transform: scale(1) rotate(0deg);
  }
  25% {
    transform: scale(0.98) rotate(-1deg);
  }
  50% {
    transform: scale(0.87) rotate(0deg);
  }
  75% {
    transform: scale(0.865) rotate(1deg);
  }
}
.second.piSpeaking {
  animation: speaking_second 2s infinite;
  transform-origin: center;
}

@keyframes speaking_third {
  0%,
  100% {
    transform: scale(1) rotate(0deg);
  }
  25% {
    transform: scale(0.965) rotate(-2deg);
  }
  50% {
    transform: scale(0.84) rotate(0deg);
  }
  75% {
    transform: scale(0.835) rotate(2deg);
  }
}
.third.piSpeaking {
  animation: speaking_third 2s infinite;
  transform-origin: center;
}

@keyframes speaking_fourth {
  0%,
  100% {
    transform: scale(1) rotate(0deg);
  }
  25% {
    transform: scale(0.95) rotate(-3deg);
  }
  50% {
    transform: scale(0.81) rotate(0deg);
  }
  75% {
    transform: scale(0.805) rotate(3deg);
  }
}
.fourth.piSpeaking {
  animation: speaking_fourth 2s infinite;
  transform-origin: center;
}

@keyframes speaking_fifth {
  0%,
  100% {
    transform: scale(1) rotate(0deg);
  }
  25% {
    transform: scale(0.935) rotate(-4deg);
  }
  50% {
    transform: scale(0.78) rotate(0deg);
  }
  75% {
    transform: scale(0.775) rotate(4deg);
  }
}
.fifth.piSpeaking {
  animation: speaking_fifth 2s infinite;
  transform-origin: center;
}

@keyframes speaking_innermost {
  0%,
  100% {
    transform: scale(1) rotate(0deg);
  }
  25% {
    transform: scale(0.92) rotate(-5deg);
  }
  50% {
    transform: scale(0.75) rotate(0deg);
  }
  75% {
    transform: scale(0.745) rotate(5deg);
  }
}
.innermost.piSpeaking {
  animation: speaking_innermost 2s infinite;
  transform-origin: center;
}

/* wave animation to indicate user is speaking */
@keyframes userSpeakingAnimation {
  50% {
    transform: scaleY(0.05) scaleX(var(--width-factor))
      translateX(calc(-50% + var(--spread-amount)));
  }
  100% {
    transform: scaleY(1) scaleX(var(--width-factor))
      translateX(calc(-50% + var(--spread-amount)));
  }
}
/* user speaking oscillation animation */
@keyframes waveform_outermost {
  0%,
  100% {
    transform: scaleY(1) scaleX(1);
  }
  25%,
  75% {
    transform: scaleY(0.9) scaleX(0.9);
  }
}

@keyframes waveform_second {
  0%,
  100% {
    transform: scaleY(0.9) scaleX(0.9);
  }
  25%,
  75% {
    transform: scaleY(0.8) scaleX(0.8);
  }
}

@keyframes waveform_third {
  0%,
  100% {
    transform: scaleY(0.8) scaleX(0.8);
  }
  25%,
  75% {
    transform: scaleY(0.7) scaleX(0.7);
  }
}

@keyframes waveform_fourth {
  0%,
  100% {
    transform: scaleY(0.7) scaleX(0.7);
  }
  25%,
  75% {
    transform: scaleY(0.6) scaleX(0.6);
  }
}

@keyframes waveform_fifth {
  0%,
  100% {
    transform: scaleY(0.6) scaleX(0.6);
  }
  25%,
  75% {
    transform: scaleY(0.5) scaleX(0.5);
  }
}

@keyframes waveform_innermost {
  0%,
  100% {
    transform: scaleY(0.5) scaleX(0.5);
  }
  25%,
  75% {
    transform: scaleY(0.4) scaleX(0.4);
  }
}

.outermost.userSpeaking {
  animation: waveform_outermost 0.7s infinite alternate;
}

.second.userSpeaking {
  animation: waveform_second 0.65s infinite alternate;
}

.third.userSpeaking {
  animation: waveform_third 0.6s infinite alternate;
}

.fourth.userSpeaking {
  animation: waveform_fourth 0.55s infinite alternate;
}

.fifth.userSpeaking {
  animation: waveform_fifth 0.5s infinite alternate;
}

.innermost.userSpeaking {
  animation: waveform_innermost 0.45s infinite alternate;
}

/* flipcard animation to indicate Say, Pi is transcribing audio to text */
@keyframes transcribingFlip {
  0%,
  100% {
    transform: rotateY(0deg);
    fill: var(--original-color);
  }
  50% {
    transform: rotateY(180deg);
    fill: var(--transcribing-color);
  }
}

.outermost.transcribing {
  --original-color: #e4f2d1;
  --transcribing-color: #b3e0fe;
  animation: transcribingFlip 1.5s infinite;
}

.second.transcribing {
  --original-color: #cce8b5;
  --transcribing-color: #89c2ff;
  animation: transcribingFlip 1.6s infinite;
}

.third.transcribing {
  --original-color: #b3db95;
  --transcribing-color: #5fa4ff;
  animation: transcribingFlip 1.7s infinite;
}

.fourth.transcribing {
  --original-color: #9bd078;
  --transcribing-color: #3586ff;
  animation: transcribingFlip 1.8s infinite;
}

.fifth.transcribing {
  --original-color: #83c55c;
  --transcribing-color: #0b69e3;
  animation: transcribingFlip 1.9s infinite;
}

.innermost.transcribing {
  --original-color: #428a2f;
  --transcribing-color: #0053bf;
  animation: transcribingFlip 2s infinite;
}

/* heartbeat animation to indicate Pi is preparing to speak */
@keyframes heartbeat {
  0%,
  100% {
    opacity: 1;
    fill: var(--original-color);
  }
  50% {
    opacity: 0.5;
    fill: rgb(245 238 223); /* bg-cream-550 */
  }
}

.outermost.loading {
  --original-color: #e4f2d1;
  animation: heartbeat 2s infinite;
  animation-delay: 0s;
}

.second.loading {
  --original-color: #cce8b5;
  animation: heartbeat 2s infinite;
  animation-delay: 0.4s;
}

.third.loading {
  --original-color: #b3db95;
  animation: heartbeat 2s infinite;
  animation-delay: 0.8s;
}

.fourth.loading {
  --original-color: #9bd078;
  animation: heartbeat 2s infinite;
  animation-delay: 1.2s;
}

.fifth.loading {
  --original-color: #83c55c;
  animation: heartbeat 2s infinite;
  animation-delay: 1.6s;
}

.innermost.loading {
  --original-color: #428a2f;
  animation: heartbeat 2s infinite;
  animation-delay: 2s;
}

/* toned-down dissary animation to indicate an error */
/* toned-down error animation with reduced opacity */
@keyframes errorAnimation {
  0% {
    transform: rotate(0deg) translate(0%, 0%);
  }
  25% {
    transform: rotate(-5deg) translate(-5%, 5%);
  }
  50% {
    transform: rotate(5deg) translate(5%, -5%);
  }
  75% {
    transform: rotate(-5deg) translate(-5%, 5%);
  }
  100% {
    transform: rotate(0deg) translate(0%, 0%);
  }
}

.outermost.error {
  animation: errorAnimation 25s 1;
  fill: #ff0000;
  fill-opacity: 0.7;
}

.second.error {
  animation: errorAnimation 25s 1;
  fill: #ff3300;
  fill-opacity: 0.7;
}

.third.error {
  animation: errorAnimation 25s 1;
  fill: #ff6600;
  fill-opacity: 0.7;
}

.fourth.error {
  animation: errorAnimation 25s 1;
  fill: #ff9900;
  fill-opacity: 0.7;
}

.fifth.error {
  animation: errorAnimation 25s 1;
  fill: #ffcc00;
  fill-opacity: 0.7;
}

.innermost.error {
  animation: errorAnimation 25s 1;
  fill: #ffff00;
  fill-opacity: 0.7;
}
`, "",{"version":3,"sources":["webpack://./src/styles/rectangles.css"],"names":[],"mappings":"AAAA;EACE;;IAEE,mBAAmB;EACrB;EACA;IACE,sBAAsB;EACxB;AACF;AACA;EACE,sCAAsC;EACtC,wBAAwB;AAC1B;;AAEA;EACE;;IAEE,mBAAmB;EACrB;EACA;IACE,uBAAuB;EACzB;AACF;AACA;EACE,mCAAmC;EACnC,wBAAwB;AAC1B;;AAEA;EACE;;IAEE,mBAAmB;EACrB;EACA;IACE,uBAAuB;EACzB;AACF;AACA;EACE,kCAAkC;EAClC,wBAAwB;AAC1B;;AAEA;EACE;;IAEE,mBAAmB;EACrB;EACA;IACE,uBAAuB;EACzB;AACF;AACA;EACE,mCAAmC;EACnC,wBAAwB;AAC1B;;AAEA;EACE;;IAEE,mBAAmB;EACrB;EACA;IACE,uBAAuB;EACzB;AACF;AACA;EACE,kCAAkC;EAClC,wBAAwB;AAC1B;;AAEA;EACE;;IAEE,mBAAmB;EACrB;EACA;IACE,qBAAqB;EACvB;AACF;AACA;EACE,sCAAsC;EACtC,wBAAwB;AAC1B;;AAEA,2EAA2E;AAC3E;EACE;;;;;IAKE,wBAAwB;EAC1B;EACA;IACE,0BAA0B;EAC5B;EACA;IACE,0BAA0B;EAC5B;AACF;AACA;EACE,gCAAgC;EAChC,sBAAsB;EACtB,mCAAmC;AACrC;;AAEA;EACE;;;;;IAKE,wBAAwB;EAC1B;EACA;IACE,4BAA4B;EAC9B;EACA;IACE,6BAA6B;EAC/B;AACF;AACA;EACE,6BAA6B;EAC7B,sBAAsB;EACtB,mCAAmC;AACrC;;AAEA;EACE;;;;;IAKE,wBAAwB;EAC1B;EACA;IACE,4BAA4B;EAC9B;EACA;IACE,6BAA6B;EAC/B;AACF;AACA;EACE,4BAA4B;EAC5B,sBAAsB;EACtB,mCAAmC;AACrC;;AAEA;EACE;;;;;IAKE,wBAAwB;EAC1B;EACA;IACE,4BAA4B;EAC9B;EACA;IACE,6BAA6B;EAC/B;AACF;AACA;EACE,6BAA6B;EAC7B,sBAAsB;EACtB,mCAAmC;AACrC;;AAEA;EACE;;;;;IAKE,wBAAwB;EAC1B;EACA;IACE,4BAA4B;EAC9B;EACA;IACE,6BAA6B;EAC/B;AACF;AACA;EACE,4BAA4B;EAC5B,sBAAsB;EACtB,mCAAmC;AACrC;;AAEA;EACE;;;;;IAKE,wBAAwB;EAC1B;EACA;IACE,0BAA0B;EAC5B;EACA;IACE,4BAA4B;EAC9B;AACF;AACA;EACE,gCAAgC;EAChC,sBAAsB;EACtB,mCAAmC;AACrC;;AAEA,iDAAiD;AACjD;EACE;;IAEE,gCAAgC;EAClC;EACA;IACE,uBAAuB;EACzB;EACA;IACE,qBAAqB;EACvB;EACA;IACE,uBAAuB;EACzB;AACF;AACA;EACE,yCAAyC;EACzC,wBAAwB;AAC1B;;AAEA;EACE;;IAEE,gCAAgC;EAClC;EACA;IACE,oCAAoC;EACtC;EACA;IACE,mCAAmC;EACrC;EACA;IACE,oCAAoC;EACtC;AACF;AACA;EACE,sCAAsC;EACtC,wBAAwB;AAC1B;;AAEA;EACE;;IAEE,gCAAgC;EAClC;EACA;IACE,qCAAqC;EACvC;EACA;IACE,mCAAmC;EACrC;EACA;IACE,oCAAoC;EACtC;AACF;AACA;EACE,qCAAqC;EACrC,wBAAwB;AAC1B;;AAEA;EACE;;IAEE,gCAAgC;EAClC;EACA;IACE,oCAAoC;EACtC;EACA;IACE,mCAAmC;EACrC;EACA;IACE,oCAAoC;EACtC;AACF;AACA;EACE,sCAAsC;EACtC,wBAAwB;AAC1B;;AAEA;EACE;;IAEE,gCAAgC;EAClC;EACA;IACE,qCAAqC;EACvC;EACA;IACE,mCAAmC;EACrC;EACA;IACE,oCAAoC;EACtC;AACF;AACA;EACE,qCAAqC;EACrC,wBAAwB;AAC1B;;AAEA;EACE;;IAEE,gCAAgC;EAClC;EACA;IACE,oCAAoC;EACtC;EACA;IACE,mCAAmC;EACrC;EACA;IACE,oCAAoC;EACtC;AACF;AACA;EACE,yCAAyC;EACzC,wBAAwB;AAC1B;;AAEA,gDAAgD;AAChD;EACE;IACE;mDAC+C;EACjD;EACA;IACE;mDAC+C;EACjD;AACF;AACA,wCAAwC;AACxC;EACE;;IAEE,8BAA8B;EAChC;EACA;;IAEE,kCAAkC;EACpC;AACF;;AAEA;EACE;;IAEE,kCAAkC;EACpC;EACA;;IAEE,kCAAkC;EACpC;AACF;;AAEA;EACE;;IAEE,kCAAkC;EACpC;EACA;;IAEE,kCAAkC;EACpC;AACF;;AAEA;EACE;;IAEE,kCAAkC;EACpC;EACA;;IAEE,kCAAkC;EACpC;AACF;;AAEA;EACE;;IAEE,kCAAkC;EACpC;EACA;;IAEE,kCAAkC;EACpC;AACF;;AAEA;EACE;;IAEE,kCAAkC;EACpC;EACA;;IAEE,kCAAkC;EACpC;AACF;;AAEA;EACE,qDAAqD;AACvD;;AAEA;EACE,mDAAmD;AACrD;;AAEA;EACE,iDAAiD;AACnD;;AAEA;EACE,mDAAmD;AACrD;;AAEA;EACE,iDAAiD;AACnD;;AAEA;EACE,sDAAsD;AACxD;;AAEA,yEAAyE;AACzE;EACE;;IAEE,wBAAwB;IACxB,2BAA2B;EAC7B;EACA;IACE,0BAA0B;IAC1B,+BAA+B;EACjC;AACF;;AAEA;EACE,yBAAyB;EACzB,6BAA6B;EAC7B,yCAAyC;AAC3C;;AAEA;EACE,yBAAyB;EACzB,6BAA6B;EAC7B,yCAAyC;AAC3C;;AAEA;EACE,yBAAyB;EACzB,6BAA6B;EAC7B,yCAAyC;AAC3C;;AAEA;EACE,yBAAyB;EACzB,6BAA6B;EAC7B,yCAAyC;AAC3C;;AAEA;EACE,yBAAyB;EACzB,6BAA6B;EAC7B,yCAAyC;AAC3C;;AAEA;EACE,yBAAyB;EACzB,6BAA6B;EAC7B,uCAAuC;AACzC;;AAEA,6DAA6D;AAC7D;EACE;;IAEE,UAAU;IACV,2BAA2B;EAC7B;EACA;IACE,YAAY;IACZ,sBAAsB,EAAE,iBAAiB;EAC3C;AACF;;AAEA;EACE,yBAAyB;EACzB,gCAAgC;EAChC,mBAAmB;AACrB;;AAEA;EACE,yBAAyB;EACzB,gCAAgC;EAChC,qBAAqB;AACvB;;AAEA;EACE,yBAAyB;EACzB,gCAAgC;EAChC,qBAAqB;AACvB;;AAEA;EACE,yBAAyB;EACzB,gCAAgC;EAChC,qBAAqB;AACvB;;AAEA;EACE,yBAAyB;EACzB,gCAAgC;EAChC,qBAAqB;AACvB;;AAEA;EACE,yBAAyB;EACzB,gCAAgC;EAChC,mBAAmB;AACrB;;AAEA,sDAAsD;AACtD,oDAAoD;AACpD;EACE;IACE,yCAAyC;EAC3C;EACA;IACE,2CAA2C;EAC7C;EACA;IACE,0CAA0C;EAC5C;EACA;IACE,2CAA2C;EAC7C;EACA;IACE,yCAAyC;EAC3C;AACF;;AAEA;EACE,+BAA+B;EAC/B,aAAa;EACb,iBAAiB;AACnB;;AAEA;EACE,+BAA+B;EAC/B,aAAa;EACb,iBAAiB;AACnB;;AAEA;EACE,+BAA+B;EAC/B,aAAa;EACb,iBAAiB;AACnB;;AAEA;EACE,+BAA+B;EAC/B,aAAa;EACb,iBAAiB;AACnB;;AAEA;EACE,+BAA+B;EAC/B,aAAa;EACb,iBAAiB;AACnB;;AAEA;EACE,+BAA+B;EAC/B,aAAa;EACb,iBAAiB;AACnB","sourcesContent":["@keyframes pulse_outermost {\n  0%,\n  100% {\n    transform: scale(1);\n  }\n  50% {\n    transform: scale(0.92);\n  }\n}\n.outermost {\n  animation: pulse_outermost 5s infinite;\n  transform-origin: center;\n}\n\n@keyframes pulse_second {\n  0%,\n  100% {\n    transform: scale(1);\n  }\n  50% {\n    transform: scale(0.856);\n  }\n}\n.second {\n  animation: pulse_second 5s infinite;\n  transform-origin: center;\n}\n\n@keyframes pulse_third {\n  0%,\n  100% {\n    transform: scale(1);\n  }\n  50% {\n    transform: scale(0.792);\n  }\n}\n.third {\n  animation: pulse_third 5s infinite;\n  transform-origin: center;\n}\n\n@keyframes pulse_fourth {\n  0%,\n  100% {\n    transform: scale(1);\n  }\n  50% {\n    transform: scale(0.728);\n  }\n}\n.fourth {\n  animation: pulse_fourth 5s infinite;\n  transform-origin: center;\n}\n\n@keyframes pulse_fifth {\n  0%,\n  100% {\n    transform: scale(1);\n  }\n  50% {\n    transform: scale(0.664);\n  }\n}\n.fifth {\n  animation: pulse_fifth 5s infinite;\n  transform-origin: center;\n}\n\n@keyframes pulse_innermost {\n  0%,\n  100% {\n    transform: scale(1);\n  }\n  50% {\n    transform: scale(0.6);\n  }\n}\n.innermost {\n  animation: pulse_innermost 5s infinite;\n  transform-origin: center;\n}\n\n/* bounce animation to indicate Pi is paused awaiting permission to speak */\n@keyframes bounce_outermost {\n  0%,\n  20%,\n  50%,\n  80%,\n  100% {\n    transform: translateY(0);\n  }\n  40% {\n    transform: translateY(-5%);\n  }\n  60% {\n    transform: translateY(-3%);\n  }\n}\n.outermost.paused {\n  animation-name: bounce_outermost;\n  animation-duration: 2s;\n  animation-iteration-count: infinite;\n}\n\n@keyframes bounce_second {\n  0%,\n  20%,\n  50%,\n  80%,\n  100% {\n    transform: translateY(0);\n  }\n  40% {\n    transform: translateY(-5.8%);\n  }\n  60% {\n    transform: translateY(-3.48%);\n  }\n}\n.second.paused {\n  animation-name: bounce_second;\n  animation-duration: 2s;\n  animation-iteration-count: infinite;\n}\n\n@keyframes bounce_third {\n  0%,\n  20%,\n  50%,\n  80%,\n  100% {\n    transform: translateY(0);\n  }\n  40% {\n    transform: translateY(-6.6%);\n  }\n  60% {\n    transform: translateY(-3.96%);\n  }\n}\n.third.paused {\n  animation-name: bounce_third;\n  animation-duration: 2s;\n  animation-iteration-count: infinite;\n}\n\n@keyframes bounce_fourth {\n  0%,\n  20%,\n  50%,\n  80%,\n  100% {\n    transform: translateY(0);\n  }\n  40% {\n    transform: translateY(-7.4%);\n  }\n  60% {\n    transform: translateY(-4.44%);\n  }\n}\n.fourth.paused {\n  animation-name: bounce_fourth;\n  animation-duration: 2s;\n  animation-iteration-count: infinite;\n}\n\n@keyframes bounce_fifth {\n  0%,\n  20%,\n  50%,\n  80%,\n  100% {\n    transform: translateY(0);\n  }\n  40% {\n    transform: translateY(-8.2%);\n  }\n  60% {\n    transform: translateY(-4.92%);\n  }\n}\n.fifth.paused {\n  animation-name: bounce_fifth;\n  animation-duration: 2s;\n  animation-iteration-count: infinite;\n}\n\n@keyframes bounce_innermost {\n  0%,\n  20%,\n  50%,\n  80%,\n  100% {\n    transform: translateY(0);\n  }\n  40% {\n    transform: translateY(-9%);\n  }\n  60% {\n    transform: translateY(-5.4%);\n  }\n}\n.innermost.paused {\n  animation-name: bounce_innermost;\n  animation-duration: 2s;\n  animation-iteration-count: infinite;\n}\n\n/* playful animation to indicate Pi is speaking */\n@keyframes speaking_outermost {\n  0%,\n  100% {\n    transform: scale(1) rotate(0deg);\n  }\n  25% {\n    transform: scale(0.995);\n  }\n  50% {\n    transform: scale(0.9);\n  }\n  75% {\n    transform: scale(0.895);\n  }\n}\n.outermost.piSpeaking {\n  animation: speaking_outermost 2s infinite;\n  transform-origin: center;\n}\n\n@keyframes speaking_second {\n  0%,\n  100% {\n    transform: scale(1) rotate(0deg);\n  }\n  25% {\n    transform: scale(0.98) rotate(-1deg);\n  }\n  50% {\n    transform: scale(0.87) rotate(0deg);\n  }\n  75% {\n    transform: scale(0.865) rotate(1deg);\n  }\n}\n.second.piSpeaking {\n  animation: speaking_second 2s infinite;\n  transform-origin: center;\n}\n\n@keyframes speaking_third {\n  0%,\n  100% {\n    transform: scale(1) rotate(0deg);\n  }\n  25% {\n    transform: scale(0.965) rotate(-2deg);\n  }\n  50% {\n    transform: scale(0.84) rotate(0deg);\n  }\n  75% {\n    transform: scale(0.835) rotate(2deg);\n  }\n}\n.third.piSpeaking {\n  animation: speaking_third 2s infinite;\n  transform-origin: center;\n}\n\n@keyframes speaking_fourth {\n  0%,\n  100% {\n    transform: scale(1) rotate(0deg);\n  }\n  25% {\n    transform: scale(0.95) rotate(-3deg);\n  }\n  50% {\n    transform: scale(0.81) rotate(0deg);\n  }\n  75% {\n    transform: scale(0.805) rotate(3deg);\n  }\n}\n.fourth.piSpeaking {\n  animation: speaking_fourth 2s infinite;\n  transform-origin: center;\n}\n\n@keyframes speaking_fifth {\n  0%,\n  100% {\n    transform: scale(1) rotate(0deg);\n  }\n  25% {\n    transform: scale(0.935) rotate(-4deg);\n  }\n  50% {\n    transform: scale(0.78) rotate(0deg);\n  }\n  75% {\n    transform: scale(0.775) rotate(4deg);\n  }\n}\n.fifth.piSpeaking {\n  animation: speaking_fifth 2s infinite;\n  transform-origin: center;\n}\n\n@keyframes speaking_innermost {\n  0%,\n  100% {\n    transform: scale(1) rotate(0deg);\n  }\n  25% {\n    transform: scale(0.92) rotate(-5deg);\n  }\n  50% {\n    transform: scale(0.75) rotate(0deg);\n  }\n  75% {\n    transform: scale(0.745) rotate(5deg);\n  }\n}\n.innermost.piSpeaking {\n  animation: speaking_innermost 2s infinite;\n  transform-origin: center;\n}\n\n/* wave animation to indicate user is speaking */\n@keyframes userSpeakingAnimation {\n  50% {\n    transform: scaleY(0.05) scaleX(var(--width-factor))\n      translateX(calc(-50% + var(--spread-amount)));\n  }\n  100% {\n    transform: scaleY(1) scaleX(var(--width-factor))\n      translateX(calc(-50% + var(--spread-amount)));\n  }\n}\n/* user speaking oscillation animation */\n@keyframes waveform_outermost {\n  0%,\n  100% {\n    transform: scaleY(1) scaleX(1);\n  }\n  25%,\n  75% {\n    transform: scaleY(0.9) scaleX(0.9);\n  }\n}\n\n@keyframes waveform_second {\n  0%,\n  100% {\n    transform: scaleY(0.9) scaleX(0.9);\n  }\n  25%,\n  75% {\n    transform: scaleY(0.8) scaleX(0.8);\n  }\n}\n\n@keyframes waveform_third {\n  0%,\n  100% {\n    transform: scaleY(0.8) scaleX(0.8);\n  }\n  25%,\n  75% {\n    transform: scaleY(0.7) scaleX(0.7);\n  }\n}\n\n@keyframes waveform_fourth {\n  0%,\n  100% {\n    transform: scaleY(0.7) scaleX(0.7);\n  }\n  25%,\n  75% {\n    transform: scaleY(0.6) scaleX(0.6);\n  }\n}\n\n@keyframes waveform_fifth {\n  0%,\n  100% {\n    transform: scaleY(0.6) scaleX(0.6);\n  }\n  25%,\n  75% {\n    transform: scaleY(0.5) scaleX(0.5);\n  }\n}\n\n@keyframes waveform_innermost {\n  0%,\n  100% {\n    transform: scaleY(0.5) scaleX(0.5);\n  }\n  25%,\n  75% {\n    transform: scaleY(0.4) scaleX(0.4);\n  }\n}\n\n.outermost.userSpeaking {\n  animation: waveform_outermost 0.7s infinite alternate;\n}\n\n.second.userSpeaking {\n  animation: waveform_second 0.65s infinite alternate;\n}\n\n.third.userSpeaking {\n  animation: waveform_third 0.6s infinite alternate;\n}\n\n.fourth.userSpeaking {\n  animation: waveform_fourth 0.55s infinite alternate;\n}\n\n.fifth.userSpeaking {\n  animation: waveform_fifth 0.5s infinite alternate;\n}\n\n.innermost.userSpeaking {\n  animation: waveform_innermost 0.45s infinite alternate;\n}\n\n/* flipcard animation to indicate Say, Pi is transcribing audio to text */\n@keyframes transcribingFlip {\n  0%,\n  100% {\n    transform: rotateY(0deg);\n    fill: var(--original-color);\n  }\n  50% {\n    transform: rotateY(180deg);\n    fill: var(--transcribing-color);\n  }\n}\n\n.outermost.transcribing {\n  --original-color: #e4f2d1;\n  --transcribing-color: #b3e0fe;\n  animation: transcribingFlip 1.5s infinite;\n}\n\n.second.transcribing {\n  --original-color: #cce8b5;\n  --transcribing-color: #89c2ff;\n  animation: transcribingFlip 1.6s infinite;\n}\n\n.third.transcribing {\n  --original-color: #b3db95;\n  --transcribing-color: #5fa4ff;\n  animation: transcribingFlip 1.7s infinite;\n}\n\n.fourth.transcribing {\n  --original-color: #9bd078;\n  --transcribing-color: #3586ff;\n  animation: transcribingFlip 1.8s infinite;\n}\n\n.fifth.transcribing {\n  --original-color: #83c55c;\n  --transcribing-color: #0b69e3;\n  animation: transcribingFlip 1.9s infinite;\n}\n\n.innermost.transcribing {\n  --original-color: #428a2f;\n  --transcribing-color: #0053bf;\n  animation: transcribingFlip 2s infinite;\n}\n\n/* heartbeat animation to indicate Pi is preparing to speak */\n@keyframes heartbeat {\n  0%,\n  100% {\n    opacity: 1;\n    fill: var(--original-color);\n  }\n  50% {\n    opacity: 0.5;\n    fill: rgb(245 238 223); /* bg-cream-550 */\n  }\n}\n\n.outermost.loading {\n  --original-color: #e4f2d1;\n  animation: heartbeat 2s infinite;\n  animation-delay: 0s;\n}\n\n.second.loading {\n  --original-color: #cce8b5;\n  animation: heartbeat 2s infinite;\n  animation-delay: 0.4s;\n}\n\n.third.loading {\n  --original-color: #b3db95;\n  animation: heartbeat 2s infinite;\n  animation-delay: 0.8s;\n}\n\n.fourth.loading {\n  --original-color: #9bd078;\n  animation: heartbeat 2s infinite;\n  animation-delay: 1.2s;\n}\n\n.fifth.loading {\n  --original-color: #83c55c;\n  animation: heartbeat 2s infinite;\n  animation-delay: 1.6s;\n}\n\n.innermost.loading {\n  --original-color: #428a2f;\n  animation: heartbeat 2s infinite;\n  animation-delay: 2s;\n}\n\n/* toned-down dissary animation to indicate an error */\n/* toned-down error animation with reduced opacity */\n@keyframes errorAnimation {\n  0% {\n    transform: rotate(0deg) translate(0%, 0%);\n  }\n  25% {\n    transform: rotate(-5deg) translate(-5%, 5%);\n  }\n  50% {\n    transform: rotate(5deg) translate(5%, -5%);\n  }\n  75% {\n    transform: rotate(-5deg) translate(-5%, 5%);\n  }\n  100% {\n    transform: rotate(0deg) translate(0%, 0%);\n  }\n}\n\n.outermost.error {\n  animation: errorAnimation 25s 1;\n  fill: #ff0000;\n  fill-opacity: 0.7;\n}\n\n.second.error {\n  animation: errorAnimation 25s 1;\n  fill: #ff3300;\n  fill-opacity: 0.7;\n}\n\n.third.error {\n  animation: errorAnimation 25s 1;\n  fill: #ff6600;\n  fill-opacity: 0.7;\n}\n\n.fourth.error {\n  animation: errorAnimation 25s 1;\n  fill: #ff9900;\n  fill-opacity: 0.7;\n}\n\n.fifth.error {\n  animation: errorAnimation 25s 1;\n  fill: #ffcc00;\n  fill-opacity: 0.7;\n}\n\n.innermost.error {\n  animation: errorAnimation 25s 1;\n  fill: #ffff00;\n  fill-opacity: 0.7;\n}\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);


/***/ }),

/***/ "./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./src/styles/common.scss":
/*!*********************************************************************************************************************************************************************!*\
  !*** ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./src/styles/common.scss ***!
  \*********************************************************************************************************************************************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
// Imports


var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
___CSS_LOADER_EXPORT___.push([module.id, `.hidden {
  display: none !important;
}

#saypi-playButton.play-button {
  /* position over the talk button, but under any controls */
  z-index: 70; /* talk button z-index is 59 or 60 */
  background-color: rgba(0, 0, 0, 0); /* transparent without holes */
  border: none;
}

.mobile-device {
  /* maximize (mobile view) button is only displayed on compatible devices */
}
.mobile-device #saypi-enterButton,
.mobile-device #saypi-exitButton {
  position: fixed;
  top: 4rem;
  left: 1.25rem;
  width: 3rem;
  height: 3rem;
  padding: 6px;
  border: 0;
  z-index: 60;
}`, "",{"version":3,"sources":["webpack://./src/styles/common.scss"],"names":[],"mappings":"AAAA;EACE,wBAAA;AACF;;AACA;EACE,0DAAA;EACA,WAAA,EAAA,oCAAA;EACA,kCAAA,EAAA,8BAAA;EACA,YAAA;AAEF;;AACA;EACE,0EAAA;AAEF;AADE;;EAEE,eAAA;EACA,SAAA;EACA,aAAA;EACA,WAAA;EACA,YAAA;EACA,YAAA;EACA,SAAA;EACA,WAAA;AAGJ","sourcesContent":[".hidden {\n  display: none !important;\n}\n#saypi-playButton.play-button {\n  /* position over the talk button, but under any controls */\n  z-index: 70; /* talk button z-index is 59 or 60 */\n  background-color: rgba(0, 0, 0, 0); /* transparent without holes */\n  border: none;\n}\n\n.mobile-device {\n  /* maximize (mobile view) button is only displayed on compatible devices */\n  #saypi-enterButton,\n  #saypi-exitButton {\n    position: fixed;\n    top: 4rem;\n    left: 1.25rem;\n    width: 3rem;\n    height: 3rem;\n    padding: 6px;\n    border: 0;\n    z-index: 60;\n  }\n}\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);


/***/ }),

/***/ "./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./src/styles/desktop.scss":
/*!**********************************************************************************************************************************************************************!*\
  !*** ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./src/styles/desktop.scss ***!
  \**********************************************************************************************************************************************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
// Imports


var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
___CSS_LOADER_EXPORT___.push([module.id, `@keyframes pulse {
  0% {
    transform: scale(1);
  }
  50% {
    transform: scale(0.9);
  }
  100% {
    transform: scale(1);
  }
}
html.desktop-view #saypi-talkButton,
html.desktop-view .play-button {
  margin: 0.5rem;
  border-radius: 18px;
  height: 2.25rem;
  width: 5rem;
  display: block; /* For Safari */
}
html.desktop-view #saypi-playButton {
  position: fixed;
  top: 50%; /* Center vertically */
  left: 50%; /* Center horizontally */
  max-width: 500px; /* Maximum width */
  width: 100%;
  transform: translate(-50%, -50%); /* Necessary for perfect centering */
  text-align: center; /* To center the inner contents, if any */
}
html.desktop-view #saypi-playButton svg {
  padding: 2.5rem;
}
html.desktop-view html:not(.firefox-android) #saypi-talkButton:active .waveform,
html.desktop-view #saypi-talkButton.active .waveform {
  animation: pulse 1s infinite;
}
html.desktop-view #saypi-talkButton .waveform {
  fill: #776d6d;
}
html.desktop-view #saypi-talkButton.autoSubmit .waveform {
  fill: rgb(65, 138, 47); /* Pi's text-brand-green-600 */
}
html.desktop-view #saypi-notification > svg {
  width: 3rem;
  height: 3rem;
  bottom: 4rem;
  right: 12rem;
  position: fixed;
}
html.desktop-view #saypi-exitButton {
  display: none;
}`, "",{"version":3,"sources":["webpack://./src/styles/desktop.scss"],"names":[],"mappings":"AACE;EACE;IACE,mBAAA;EAAJ;EAEE;IACE,qBAAA;EAAJ;EAEE;IACE,mBAAA;EAAJ;AACF;AAEE;;EAEE,cAAA;EACA,mBAAA;EACA,eAAA;EACA,WAAA;EACA,cAAA,EAAA,eAAA;AAAJ;AAGE;EACE,eAAA;EACA,QAAA,EAAA,sBAAA;EACA,SAAA,EAAA,wBAAA;EACA,gBAAA,EAAA,kBAAA;EACA,WAAA;EACA,gCAAA,EAAA,oCAAA;EACA,kBAAA,EAAA,yCAAA;AADJ;AAGI;EACE,eAAA;AADN;AAKE;;EAEE,4BAAA;AAHJ;AAKE;EACE,aAAA;AAHJ;AAKE;EACE,sBAAA,EAAA,8BAAA;AAHJ;AAME;EACE,WAAA;EACA,YAAA;EACA,YAAA;EACA,YAAA;EACA,eAAA;AAJJ;AAOE;EACE,aAAA;AALJ","sourcesContent":["html.desktop-view {\n  @keyframes pulse {\n    0% {\n      transform: scale(1);\n    }\n    50% {\n      transform: scale(0.9);\n    }\n    100% {\n      transform: scale(1);\n    }\n  }\n  #saypi-talkButton,\n  .play-button {\n    margin: 0.5rem;\n    border-radius: 18px;\n    height: 2.25rem;\n    width: 5rem;\n    display: block; /* For Safari */\n  }\n\n  #saypi-playButton {\n    position: fixed;\n    top: 50%; /* Center vertically */\n    left: 50%; /* Center horizontally */\n    max-width: 500px; /* Maximum width */\n    width: 100%;\n    transform: translate(-50%, -50%); /* Necessary for perfect centering */\n    text-align: center; /* To center the inner contents, if any */\n\n    svg {\n      padding: 2.5rem;\n    }\n  }\n\n  html:not(.firefox-android) #saypi-talkButton:active .waveform,\n  #saypi-talkButton.active .waveform {\n    animation: pulse 1s infinite;\n  }\n  #saypi-talkButton .waveform {\n    fill: #776d6d;\n  }\n  #saypi-talkButton.autoSubmit .waveform {\n    fill: rgb(65 138 47); /* Pi's text-brand-green-600 */\n  }\n\n  #saypi-notification > svg {\n    width: 3rem;\n    height: 3rem;\n    bottom: 4rem;\n    right: 12rem;\n    position: fixed;\n  }\n\n  #saypi-exitButton {\n    display: none;\n  }\n}\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);


/***/ }),

/***/ "./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./src/styles/mobile.scss":
/*!*********************************************************************************************************************************************************************!*\
  !*** ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./src/styles/mobile.scss ***!
  \*********************************************************************************************************************************************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
// Imports


var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
___CSS_LOADER_EXPORT___.push([module.id, `html.mobile-view {
  /* Pi controls: ellipsis, experiences */
  /* Pi controls: mute/unmute */
  /* fix an alignment issue with the "new ui layout" */
}
html.mobile-view #saypi-panel,
html.mobile-view .play-button,
html.mobile-view .notification {
  width: 100%;
  position: fixed;
  left: 0;
  background-color: rgba(245, 238, 223, 0.98);
  height: 100vh;
  top: 0;
}
html.mobile-view #saypi-playButton {
  background-color: rgba(245, 238, 223, 0.55);
}
html.mobile-view #saypi-playButton svg {
  padding: 2.5rem;
}
html.mobile-view #saypi-talkButton {
  width: 100%;
  height: 100%;
  background-color: transparent;
  border-radius: 0;
  margin: 0;
}
html.mobile-view #saypi-notification {
  z-index: 100;
  background-color: transparent;
}
html.mobile-view #saypi-notification svg {
  width: 75%;
  height: 100%;
  margin: auto;
}
html.mobile-view #__next > main > div > div > div.fixed.top-4.right-6 > button,
html.mobile-view #saypi-experiences-button {
  transform: scale(1.5);
}
html.mobile-view #saypi-audio-controls {
  /* hide the voice options */
  /* scale the mute button */
}
html.mobile-view #saypi-audio-controls div.p-1 {
  display: none;
}
html.mobile-view #saypi-audio-controls button.group {
  transform: scale(2) !important;
  z-index: 50;
  /* hide the voice selector twisty */
}
html.mobile-view #saypi-audio-controls button.group + button {
  display: none;
}
html.mobile-view .text-body-chat-m {
  padding-top: 0;
}
html.mobile-view #saypi-enterButton {
  display: none;
}
html.mobile-view #saypi-footer {
  display: none;
}
html.mobile-view #saypi-prompt {
  /* hides virtual keyboard on android */
  display: none;
}
html.mobile-view #saypi-submitButton {
  display: none;
}`, "",{"version":3,"sources":["webpack://./src/styles/mobile.scss"],"names":[],"mappings":"AAAA;EAsCE,uCAAA;EAMA,6BAAA;EAiBA,oDAAA;AAzDF;AAHE;;;EAGE,WAAA;EACA,eAAA;EACA,OAAA;EACA,2CAAA;EAEA,aAAA;EACA,MAAA;AAIJ;AADE;EACE,2CAAA;AAGJ;AAFI;EACE,eAAA;AAIN;AAAE;EACE,WAAA;EACA,YAAA;EACA,6BAAA;EACA,gBAAA;EACA,SAAA;AAEJ;AACE;EACE,YAAA;EACA,6BAAA;AACJ;AAAI;EACE,UAAA;EACA,YAAA;EACA,YAAA;AAEN;AAGE;;EAEE,qBAAA;AADJ;AAKE;EACE,2BAAA;EAIA,0BAAA;AANJ;AAGI;EACE,aAAA;AADN;AAII;EACE,8BAAA;EACA,WAAA;EACA,mCAAA;AAFN;AAGM;EACE,aAAA;AADR;AAOE;EACE,cAAA;AALJ;AAQE;EACE,aAAA;AANJ;AASE;EACE,aAAA;AAPJ;AAUE;EACE,sCAAA;EACA,aAAA;AARJ;AAWE;EACE,aAAA;AATJ","sourcesContent":["html.mobile-view {\n  #saypi-panel,\n  .play-button,\n  .notification {\n    width: 100%;\n    position: fixed;\n    left: 0;\n    background-color: rgba(245, 238, 223, 0.98);\n\n    height: 100vh;\n    top: 0;\n  }\n\n  #saypi-playButton {\n    background-color: rgba(245, 238, 223, 0.55);\n    svg {\n      padding: 2.5rem;\n    }\n  }\n\n  #saypi-talkButton {\n    width: 100%;\n    height: 100%;\n    background-color: transparent;\n    border-radius: 0;\n    margin: 0;\n  }\n\n  #saypi-notification {\n    z-index: 100;\n    background-color: transparent;\n    svg {\n      width: 75%;\n      height: 100%;\n      margin: auto;\n    }\n  }\n\n  /* Pi controls: ellipsis, experiences */\n  #__next > main > div > div > div.fixed.top-4.right-6 > button,\n  #saypi-experiences-button {\n    transform: scale(1.5);\n  }\n\n  /* Pi controls: mute/unmute */\n  #saypi-audio-controls {\n    /* hide the voice options */\n    div.p-1 {\n      display: none;\n    }\n    /* scale the mute button */\n    button.group {\n      transform: scale(2) !important;\n      z-index: 50;\n      /* hide the voice selector twisty */\n      + button {\n        display: none;\n      }\n    }\n  }\n\n  /* fix an alignment issue with the \"new ui layout\" */\n  .text-body-chat-m {\n    padding-top: 0;\n  }\n\n  #saypi-enterButton {\n    display: none;\n  }\n\n  #saypi-footer {\n    display: none;\n  }\n\n  #saypi-prompt {\n    /* hides virtual keyboard on android */\n    display: none;\n  }\n\n  #saypi-submitButton {\n    display: none;\n  }\n}\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);


/***/ }),

/***/ "./node_modules/css-loader/dist/runtime/api.js":
/*!*****************************************************!*\
  !*** ./node_modules/css-loader/dist/runtime/api.js ***!
  \*****************************************************/
/***/ ((module) => {



/*
  MIT License http://www.opensource.org/licenses/mit-license.php
  Author Tobias Koppers @sokra
*/
module.exports = function (cssWithMappingToString) {
  var list = [];

  // return the list of modules as css string
  list.toString = function toString() {
    return this.map(function (item) {
      var content = "";
      var needLayer = typeof item[5] !== "undefined";
      if (item[4]) {
        content += "@supports (".concat(item[4], ") {");
      }
      if (item[2]) {
        content += "@media ".concat(item[2], " {");
      }
      if (needLayer) {
        content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {");
      }
      content += cssWithMappingToString(item);
      if (needLayer) {
        content += "}";
      }
      if (item[2]) {
        content += "}";
      }
      if (item[4]) {
        content += "}";
      }
      return content;
    }).join("");
  };

  // import a list of modules into the list
  list.i = function i(modules, media, dedupe, supports, layer) {
    if (typeof modules === "string") {
      modules = [[null, modules, undefined]];
    }
    var alreadyImportedModules = {};
    if (dedupe) {
      for (var k = 0; k < this.length; k++) {
        var id = this[k][0];
        if (id != null) {
          alreadyImportedModules[id] = true;
        }
      }
    }
    for (var _k = 0; _k < modules.length; _k++) {
      var item = [].concat(modules[_k]);
      if (dedupe && alreadyImportedModules[item[0]]) {
        continue;
      }
      if (typeof layer !== "undefined") {
        if (typeof item[5] === "undefined") {
          item[5] = layer;
        } else {
          item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}");
          item[5] = layer;
        }
      }
      if (media) {
        if (!item[2]) {
          item[2] = media;
        } else {
          item[1] = "@media ".concat(item[2], " {").concat(item[1], "}");
          item[2] = media;
        }
      }
      if (supports) {
        if (!item[4]) {
          item[4] = "".concat(supports);
        } else {
          item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}");
          item[4] = supports;
        }
      }
      list.push(item);
    }
  };
  return list;
};

/***/ }),

/***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js":
/*!************************************************************!*\
  !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***!
  \************************************************************/
/***/ ((module) => {



module.exports = function (item) {
  var content = item[1];
  var cssMapping = item[3];
  if (!cssMapping) {
    return content;
  }
  if (typeof btoa === "function") {
    var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));
    var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);
    var sourceMapping = "/*# ".concat(data, " */");
    return [content].concat([sourceMapping]).join("\n");
  }
  return [content].join("\n");
};

/***/ }),

/***/ "./node_modules/events/events.js":
/*!***************************************!*\
  !*** ./node_modules/events/events.js ***!
  \***************************************/
/***/ ((module) => {

// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.



var R = typeof Reflect === 'object' ? Reflect : null
var ReflectApply = R && typeof R.apply === 'function'
  ? R.apply
  : function ReflectApply(target, receiver, args) {
    return Function.prototype.apply.call(target, receiver, args);
  }

var ReflectOwnKeys
if (R && typeof R.ownKeys === 'function') {
  ReflectOwnKeys = R.ownKeys
} else if (Object.getOwnPropertySymbols) {
  ReflectOwnKeys = function ReflectOwnKeys(target) {
    return Object.getOwnPropertyNames(target)
      .concat(Object.getOwnPropertySymbols(target));
  };
} else {
  ReflectOwnKeys = function ReflectOwnKeys(target) {
    return Object.getOwnPropertyNames(target);
  };
}

function ProcessEmitWarning(warning) {
  if (console && console.warn) console.warn(warning);
}

var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {
  return value !== value;
}

function EventEmitter() {
  EventEmitter.init.call(this);
}
module.exports = EventEmitter;
module.exports.once = once;

// Backwards-compat with node 0.10.x
EventEmitter.EventEmitter = EventEmitter;

EventEmitter.prototype._events = undefined;
EventEmitter.prototype._eventsCount = 0;
EventEmitter.prototype._maxListeners = undefined;

// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
var defaultMaxListeners = 10;

function checkListener(listener) {
  if (typeof listener !== 'function') {
    throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
  }
}

Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
  enumerable: true,
  get: function() {
    return defaultMaxListeners;
  },
  set: function(arg) {
    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
      throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');
    }
    defaultMaxListeners = arg;
  }
});

EventEmitter.init = function() {

  if (this._events === undefined ||
      this._events === Object.getPrototypeOf(this)._events) {
    this._events = Object.create(null);
    this._eventsCount = 0;
  }

  this._maxListeners = this._maxListeners || undefined;
};

// Obviously not all Emitters should be limited to 10. This function allows
// that to be increased. Set to zero for unlimited.
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
    throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');
  }
  this._maxListeners = n;
  return this;
};

function _getMaxListeners(that) {
  if (that._maxListeners === undefined)
    return EventEmitter.defaultMaxListeners;
  return that._maxListeners;
}

EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
  return _getMaxListeners(this);
};

EventEmitter.prototype.emit = function emit(type) {
  var args = [];
  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
  var doError = (type === 'error');

  var events = this._events;
  if (events !== undefined)
    doError = (doError && events.error === undefined);
  else if (!doError)
    return false;

  // If there is no 'error' event listener then throw.
  if (doError) {
    var er;
    if (args.length > 0)
      er = args[0];
    if (er instanceof Error) {
      // Note: The comments on the `throw` lines are intentional, they show
      // up in Node's output if this results in an unhandled exception.
      throw er; // Unhandled 'error' event
    }
    // At least give some kind of context to the user
    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));
    err.context = er;
    throw err; // Unhandled 'error' event
  }

  var handler = events[type];

  if (handler === undefined)
    return false;

  if (typeof handler === 'function') {
    ReflectApply(handler, this, args);
  } else {
    var len = handler.length;
    var listeners = arrayClone(handler, len);
    for (var i = 0; i < len; ++i)
      ReflectApply(listeners[i], this, args);
  }

  return true;
};

function _addListener(target, type, listener, prepend) {
  var m;
  var events;
  var existing;

  checkListener(listener);

  events = target._events;
  if (events === undefined) {
    events = target._events = Object.create(null);
    target._eventsCount = 0;
  } else {
    // To avoid recursion in the case that type === "newListener"! Before
    // adding it to the listeners, first emit "newListener".
    if (events.newListener !== undefined) {
      target.emit('newListener', type,
                  listener.listener ? listener.listener : listener);

      // Re-assign `events` because a newListener handler could have caused the
      // this._events to be assigned to a new object
      events = target._events;
    }
    existing = events[type];
  }

  if (existing === undefined) {
    // Optimize the case of one listener. Don't need the extra array object.
    existing = events[type] = listener;
    ++target._eventsCount;
  } else {
    if (typeof existing === 'function') {
      // Adding the second element, need to change to array.
      existing = events[type] =
        prepend ? [listener, existing] : [existing, listener];
      // If we've already got an array, just append.
    } else if (prepend) {
      existing.unshift(listener);
    } else {
      existing.push(listener);
    }

    // Check for listener leak
    m = _getMaxListeners(target);
    if (m > 0 && existing.length > m && !existing.warned) {
      existing.warned = true;
      // No error code for this since it is a Warning
      // eslint-disable-next-line no-restricted-syntax
      var w = new Error('Possible EventEmitter memory leak detected. ' +
                          existing.length + ' ' + String(type) + ' listeners ' +
                          'added. Use emitter.setMaxListeners() to ' +
                          'increase limit');
      w.name = 'MaxListenersExceededWarning';
      w.emitter = target;
      w.type = type;
      w.count = existing.length;
      ProcessEmitWarning(w);
    }
  }

  return target;
}

EventEmitter.prototype.addListener = function addListener(type, listener) {
  return _addListener(this, type, listener, false);
};

EventEmitter.prototype.on = EventEmitter.prototype.addListener;

EventEmitter.prototype.prependListener =
    function prependListener(type, listener) {
      return _addListener(this, type, listener, true);
    };

function onceWrapper() {
  if (!this.fired) {
    this.target.removeListener(this.type, this.wrapFn);
    this.fired = true;
    if (arguments.length === 0)
      return this.listener.call(this.target);
    return this.listener.apply(this.target, arguments);
  }
}

function _onceWrap(target, type, listener) {
  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };
  var wrapped = onceWrapper.bind(state);
  wrapped.listener = listener;
  state.wrapFn = wrapped;
  return wrapped;
}

EventEmitter.prototype.once = function once(type, listener) {
  checkListener(listener);
  this.on(type, _onceWrap(this, type, listener));
  return this;
};

EventEmitter.prototype.prependOnceListener =
    function prependOnceListener(type, listener) {
      checkListener(listener);
      this.prependListener(type, _onceWrap(this, type, listener));
      return this;
    };

// Emits a 'removeListener' event if and only if the listener was removed.
EventEmitter.prototype.removeListener =
    function removeListener(type, listener) {
      var list, events, position, i, originalListener;

      checkListener(listener);

      events = this._events;
      if (events === undefined)
        return this;

      list = events[type];
      if (list === undefined)
        return this;

      if (list === listener || list.listener === listener) {
        if (--this._eventsCount === 0)
          this._events = Object.create(null);
        else {
          delete events[type];
          if (events.removeListener)
            this.emit('removeListener', type, list.listener || listener);
        }
      } else if (typeof list !== 'function') {
        position = -1;

        for (i = list.length - 1; i >= 0; i--) {
          if (list[i] === listener || list[i].listener === listener) {
            originalListener = list[i].listener;
            position = i;
            break;
          }
        }

        if (position < 0)
          return this;

        if (position === 0)
          list.shift();
        else {
          spliceOne(list, position);
        }

        if (list.length === 1)
          events[type] = list[0];

        if (events.removeListener !== undefined)
          this.emit('removeListener', type, originalListener || listener);
      }

      return this;
    };

EventEmitter.prototype.off = EventEmitter.prototype.removeListener;

EventEmitter.prototype.removeAllListeners =
    function removeAllListeners(type) {
      var listeners, events, i;

      events = this._events;
      if (events === undefined)
        return this;

      // not listening for removeListener, no need to emit
      if (events.removeListener === undefined) {
        if (arguments.length === 0) {
          this._events = Object.create(null);
          this._eventsCount = 0;
        } else if (events[type] !== undefined) {
          if (--this._eventsCount === 0)
            this._events = Object.create(null);
          else
            delete events[type];
        }
        return this;
      }

      // emit removeListener for all listeners on all events
      if (arguments.length === 0) {
        var keys = Object.keys(events);
        var key;
        for (i = 0; i < keys.length; ++i) {
          key = keys[i];
          if (key === 'removeListener') continue;
          this.removeAllListeners(key);
        }
        this.removeAllListeners('removeListener');
        this._events = Object.create(null);
        this._eventsCount = 0;
        return this;
      }

      listeners = events[type];

      if (typeof listeners === 'function') {
        this.removeListener(type, listeners);
      } else if (listeners !== undefined) {
        // LIFO order
        for (i = listeners.length - 1; i >= 0; i--) {
          this.removeListener(type, listeners[i]);
        }
      }

      return this;
    };

function _listeners(target, type, unwrap) {
  var events = target._events;

  if (events === undefined)
    return [];

  var evlistener = events[type];
  if (evlistener === undefined)
    return [];

  if (typeof evlistener === 'function')
    return unwrap ? [evlistener.listener || evlistener] : [evlistener];

  return unwrap ?
    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
}

EventEmitter.prototype.listeners = function listeners(type) {
  return _listeners(this, type, true);
};

EventEmitter.prototype.rawListeners = function rawListeners(type) {
  return _listeners(this, type, false);
};

EventEmitter.listenerCount = function(emitter, type) {
  if (typeof emitter.listenerCount === 'function') {
    return emitter.listenerCount(type);
  } else {
    return listenerCount.call(emitter, type);
  }
};

EventEmitter.prototype.listenerCount = listenerCount;
function listenerCount(type) {
  var events = this._events;

  if (events !== undefined) {
    var evlistener = events[type];

    if (typeof evlistener === 'function') {
      return 1;
    } else if (evlistener !== undefined) {
      return evlistener.length;
    }
  }

  return 0;
}

EventEmitter.prototype.eventNames = function eventNames() {
  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
};

function arrayClone(arr, n) {
  var copy = new Array(n);
  for (var i = 0; i < n; ++i)
    copy[i] = arr[i];
  return copy;
}

function spliceOne(list, index) {
  for (; index + 1 < list.length; index++)
    list[index] = list[index + 1];
  list.pop();
}

function unwrapListeners(arr) {
  var ret = new Array(arr.length);
  for (var i = 0; i < ret.length; ++i) {
    ret[i] = arr[i].listener || arr[i];
  }
  return ret;
}

function once(emitter, name) {
  return new Promise(function (resolve, reject) {
    function errorListener(err) {
      emitter.removeListener(name, resolver);
      reject(err);
    }

    function resolver() {
      if (typeof emitter.removeListener === 'function') {
        emitter.removeListener('error', errorListener);
      }
      resolve([].slice.call(arguments));
    };

    eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
    if (name !== 'error') {
      addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
    }
  });
}

function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
  if (typeof emitter.on === 'function') {
    eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
  }
}

function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
  if (typeof emitter.on === 'function') {
    if (flags.once) {
      emitter.once(name, listener);
    } else {
      emitter.on(name, listener);
    }
  } else if (typeof emitter.addEventListener === 'function') {
    // EventTarget does not have `error` event semantics like Node
    // EventEmitters, we do not listen for `error` events here.
    emitter.addEventListener(name, function wrapListener(arg) {
      // IE does not have builtin `{ once: true }` support so we
      // have to do it manually.
      if (flags.once) {
        emitter.removeEventListener(name, wrapListener);
      }
      listener(arg);
    });
  } else {
    throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
  }
}


/***/ }),

/***/ "./node_modules/raw-loader/dist/cjs.js!./public/audioModule.bundle.js":
/*!****************************************************************************!*\
  !*** ./node_modules/raw-loader/dist/cjs.js!./public/audioModule.bundle.js ***!
  \****************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("function _typeof2(obj){\"@babel/helpers - typeof\";return _typeof2=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(obj){return typeof obj;}:function(obj){return obj&&\"function\"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?\"symbol\":typeof obj;},_typeof2(obj);}// ==UserScript==\n// @name         Say, Pi\n// @namespace    http://www.saypi.ai/\n// @version      1.3.8\n// @description  Speak to Pi with OpenAI's Whisper\n// @author       Ross Cadogan\n// @match        https://pi.ai/talk\n// @inject-into  page\n// @updateURL    https://app.saypi.ai/saypi.user.js\n// @downloadURL  https://app.saypi.ai/saypi.user.js\n// @license      MIT\n// ==/UserScript==\n/******/(function(){// webpackBootstrap\n/******/var __webpack_modules__={/***/\"./src/LoggingModule.js\":/*!******************************!*\\\n  !*** ./src/LoggingModule.js ***!\n  \\******************************/ /***/function srcLoggingModuleJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */serializeStateValue:function serializeStateValue(){return(/* binding */_serializeStateValue);}/* harmony export */});function _serializeStateValue(stateValue){if(typeof stateValue===\"string\"){return stateValue;}return Object.keys(stateValue).map(function(key){return\"\".concat(key,\":\").concat(_serializeStateValue(stateValue[key]));}).join(\",\");}/***/},/***/\"./src/UserAgentModule.js\":/*!********************************!*\\\n  !*** ./src/UserAgentModule.js ***!\n  \\********************************/ /***/function srcUserAgentModuleJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */addDeviceFlags:function addDeviceFlags(){return(/* binding */_addDeviceFlags);},/* harmony export */addUserAgentFlags:function addUserAgentFlags(){return(/* binding */_addUserAgentFlags);},/* harmony export */addViewFlags:function addViewFlags(){return(/* binding */_addViewFlags);},/* harmony export */enterMobileMode:function enterMobileMode(){return(/* binding */_enterMobileMode);},/* harmony export */exitMobileMode:function exitMobileMode(){return(/* binding */_exitMobileMode);},/* harmony export */isMobileDevice:function isMobileDevice(){return(/* binding */_isMobileDevice);},/* harmony export */isMobileView:function isMobileView(){return(/* binding */_isMobileView);},/* harmony export */isSafari:function isSafari(){return(/* binding */_isSafari);}/* harmony export */});function _isSafari(){return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);}function _isMobileDevice(){return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.matchMedia(\"(max-width: 768px)\").matches;}// this function determines whether to show the mobile view or not\nfunction _isMobileView(){var userViewPreference=null;try{userViewPreference=localStorage.getItem(\"userViewPreference\");}catch(e){console.warn(\"Could not access localStorage: \",e);}var prefersMobile=false;if(userViewPreference){prefersMobile=userViewPreference===\"mobile\";}// Make sure isMobileDevice is defined or imported\nreturn _isMobileDevice()&&prefersMobile;}function _exitMobileMode(){localStorage.setItem(\"userViewPreference\",\"desktop\");// Save preference\nvar element=document.documentElement;element.classList.remove(\"mobile-view\");element.classList.add(\"desktop-view\");}function _enterMobileMode(){localStorage.setItem(\"userViewPreference\",\"mobile\");// Save preference\nvar element=document.documentElement;element.classList.remove(\"desktop-view\");element.classList.add(\"mobile-view\");}function _addUserAgentFlags(){var isFirefoxAndroid=/Firefox/.test(navigator.userAgent)&&/Android/.test(navigator.userAgent);var element=document.documentElement;if(isFirefoxAndroid){element.classList.add(\"firefox-android\");}_addDeviceFlags(element);_addViewFlags(element);}function _addDeviceFlags(element){if(_isMobileDevice()){element.classList.add(\"mobile-device\");}}function _addViewFlags(element){if(_isMobileView()){element.classList.remove(\"desktop-view\");element.classList.add(\"mobile-view\");}else{element.classList.remove(\"mobile-view\");element.classList.add(\"desktop-view\");}}/***/},/***/\"./src/state-machines/AudioInputMachine.js\":/*!*************************************************!*\\\n  !*** ./src/state-machines/AudioInputMachine.js ***!\n  \\*************************************************/ /***/function srcStateMachinesAudioInputMachineJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */audioInputMachine:function audioInputMachine(){return(/* binding */_audioInputMachine);}/* harmony export */});/* harmony import */var xstate__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! xstate */\"./node_modules/xstate/es/Machine.js\");var EventBus=window.EventBus;var audioMimeType=\"audio/webm;codecs=opus\";var threshold=1000;// 1000 ms = 1 second, about the length of \"Hey, Pi\"\n// Declare a global variable for the mediaRecorder\nvar mediaRecorder;function setupRecording(callback){if(mediaRecorder){return;}// Get a stream from the user's microphone\nnavigator.mediaDevices.getUserMedia({audio:true}).then(function(stream){if(!MediaRecorder.isTypeSupported(audioMimeType)){// use MP4 for Safari\naudioMimeType=\"audio/mp4\";}// Create a new MediaRecorder object using the stream and specifying the MIME type\nvar options={mimeType:audioMimeType};mediaRecorder=new MediaRecorder(stream,options);mediaRecorder.addEventListener(\"dataavailable\",function(event){EventBus.emit(\"audio:dataavailable\",{data:event.data});});mediaRecorder.addEventListener(\"stop\",function(){EventBus.emit(\"audio:input:stop\");});}).then(function(){// Invoke the callback function\nif(typeof callback===\"function\"){callback();}})[\"catch\"](function(err){console.error(\"Error getting audio stream: \"+err);});}function tearDownRecording(){// Check if the MediaRecorder is set up\nif(!mediaRecorder){return;}// Stop any ongoing recording\nif(mediaRecorder.state===\"recording\"){mediaRecorder.stop();}// Clear the MediaRecorder variable\nmediaRecorder=null;}var _audioInputMachine=(0,xstate__WEBPACK_IMPORTED_MODULE_0__.createMachine)({/** @xstate-layout N4IgpgJg5mDOIC5QEMCuECWB7AkgOwAdUAXAOgCcwAbMZWSAYmQGMBHVDSgbQAYBdRKAJZYGYtjyCQAD0QBGAGwBmUgFYANCACeiJXIAcpBQHYAnAtP6l+gCw2lAJgU2Avi81pMuQiVIt2nBh4UAwQWHhgpEEAblgA1pGe2PhEZP4c5EFQCDFYzMji4bx8xVLCooWSSDKIqg6aOgj6xnJqCqo8qtbKpjwODm4e6Mk+aWwZWQxg5ORY5KQEVAUAZnMAtn7D3ql+44HBOXix+ZXFpdXlYhJSsghyxioa2oj9qqT97Q-Wdo4KgyBJba+dKcRiUGh0MDnIQiK7hG7yB5qBqIfStDo8HhyHj6Wz2Jxyf6AlLAvaUCBRCA0BiwYjIcjEaEgS6VBEIGxyFSWezGJ6NfTmUhyVQKRSmbFKZQtIlbEljALkihgZhzTDBGnELAEABKYHYcGIkCZLOu1VuJgUaiUvQUDj5iHFrRsAo6DnsFmMnRlXjluwVkCVKvIapCEAKyAAgtFkBglgAjGjG2Gss21Bw8NT6VSmJS8lFNO2kGwOcw8BQKHiS3OE9wA2WjP0ZAMEMB4EMAZU1BA1WqTFVNoFucjkOaMdvzphspiFjgeikrUprQx9DZBipbbayna1oXDUZj8cT-DKyYHNQQk5UVnTenHzwLb1MJYr5YX1e9Ix2a4DtK1LYgDB9nCVSDvII4qLa9oIJ6bz3OYSjOjYXTGKKbi1ngWAQHAUjEqMJ79vCqYIAAtAo+bEY+phUbyPDFs4T6obWuE7OCtD0BA+HAWyxb5sONhGFiqhfHivxLnWK5fmSWScSmoHsumRiIbmUH9NOw6WH0qiqNiVFKB+QLyk2HEXKehFyQ4+gOEWtjKfmQkqHBr6CdpSiqPpvrfhSGBUmAMlnrcShKBmSl5ve4rTsoDhzhWVbSkx9aSf6FKUEGIZ+WZ55dJaJgGKFjQMaQuJRXoMWLu5q5ks2rYdl26UgeetjTlRDi5VBT7GKQ1jFfOsVicxpJJaQv4EP+dVsnIJatBZE2epOWZOG1E2kC0Fb6AoVi5mWaEuEAA */context:{audioDataChunks:[]},id:\"audioInput\",initial:\"released\",states:{released:{on:{acquire:{target:\"acquiring\"}}},acquiring:{description:\"Acquiring the microphone. Waits until asynchronous call has completed.\",invoke:{src:\"acquireMediaRecorder\",onDone:{target:\"acquired\"},onError:{target:\"released\",actions:\"logError\"}}},acquired:{description:\"Microphone acquired and ready to start recording.\",initial:\"idle\",states:{idle:{on:{start:{target:\"recording\",actions:{type:\"startRecording\",cond:\"mediaRecorderAcquired\"}}}},recording:{on:{stopRequested:{target:\"pendingStop\",actions:{type:\"stopRecording\"}},dataAvailable:{actions:{type:\"addData\",params:{}},internal:true}}},pendingStop:{description:\"Waiting for the MediaRecorder to stop recording.\",on:{stop:{target:\"stopped\"},dataAvailable:{actions:{type:\"addData\",params:{}},internal:true}}},stopped:{entry:{type:\"sendData\",params:{},cond:\"hasData\"},always:\"idle\"}},on:{release:{target:\"released\",actions:{type:\"releaseMediaRecorder\"}}}}},predictableActionArguments:true,preserveActionOrder:true},{actions:{startRecording:function startRecording(context,event){// Clear the array for the next recording\ncontext.audioDataChunks=[];context.startTime=Date.now();// Start recording\nmediaRecorder.start();EventBus.emit(\"saypi:userSpeaking\");},stopRecording:function stopRecording(context,event){// TODO: do I need this state check?\nif(mediaRecorder&&mediaRecorder.state===\"recording\"){// Stop recording\nmediaRecorder.stop();// Record the stop time and calculate the duration\nvar stopTime=Date.now();var duration=stopTime-context.startTime;EventBus.emit(\"saypi:userStoppedSpeaking\",{duration:duration});}},addData:function addData(context,event){// Add the new data to the array\ncontext.audioDataChunks.push(event.data);},sendData:function sendData(context,event){// Create a Blob from the audio data chunks\nvar audioBlob=new Blob(context.audioDataChunks,{type:mediaRecorder.mimeType});// Get the stop time and calculate the duration\nvar stopTime=Date.now();var duration=stopTime-context.startTime;// If the duration is greater than the threshold, upload the audio for transcription\nif(duration>=threshold){// Upload the audio to the server for transcription\nEventBus.emit(\"saypi:userFinishedSpeaking\",{duration:duration,blob:audioBlob});}else{console.log(\"Recording was too short, not uploading for transcription\");}},releaseMediaRecorder:function releaseMediaRecorder(context,event){tearDownRecording();},logError:function logError(context,event){console.error(\"Error acquiring MediaRecorder: \",event.data);}},services:{acquireMediaRecorder:function acquireMediaRecorder(context,event,_ref){var send=_ref.send;return new Promise(function(resolve,reject){setupRecording(function(){if(mediaRecorder){resolve();}else{reject(new Error(\"Failed to acquire MediaRecorder\"));}});});}},guards:{mediaRecorderAcquired:function mediaRecorderAcquired(context,event){return mediaRecorder!==null;},hasData:function hasData(context,event){return context.audioDataChunks.length>0;}},delays:{}});/***/},/***/\"./src/state-machines/AudioOutputMachine.js\":/*!**************************************************!*\\\n  !*** ./src/state-machines/AudioOutputMachine.js ***!\n  \\**************************************************/ /***/function srcStateMachinesAudioOutputMachineJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */audioOutputMachine:function audioOutputMachine(){return(/* binding */_audioOutputMachine);}/* harmony export */});/* harmony import */var xstate__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(/*! xstate */\"./node_modules/xstate/es/Machine.js\");/* harmony import */var xstate__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(/*! xstate */\"./node_modules/xstate/es/index.js\");/* harmony import */var _UserAgentModule__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ../UserAgentModule */\"./src/UserAgentModule.js\");var EventBus=window.EventBus;var audioElement=document.querySelector(\"audio\");if(!audioElement){console.error(\"Audio element not found in output machine!\");}var _audioOutputMachine=(0,xstate__WEBPACK_IMPORTED_MODULE_1__.createMachine)({/** @xstate-layout N4IgpgJg5mDOIC5QEMCuECWB7A8qgLgA4EDEYAtofhpANoAMAuoqIVrBtVgHYsgCeiALQBGAOwBWADQgAHohEBOACzKAdMrEA2LQA4ATPq0iJW-QF9zMtJlwFi+NRggAbMCRdZkEWPmQAnfAZmJBA2Di5eUPkEQwk1aQFERX1FNXoM+hMAZnoJXRFsrUtrdGw8IgI1T28MbigPLwhIcjA-CGQ-YL5wzmwo0BiJfRlBBAKEzPpFDPFdbP1lEpAbcvsqmuaINX8wb34SQhdkfm7Q3si+GJEsrQTsmbNEsdTsybEDD7yCouXVu0qjk2kDURxOdQahDQsDAZ1Y7D6PCuySM90UIn0GKMym+o0Qqn0ai0C0+um+hWKVhWZQBDmqTRBYP4ELI3C2cLCCMu0RRdwkDwxWK0OPyeIQ4noan0Eg++i++UK+T+NIqdOB2yZLIAxshuEz8AALfxYVBQA0ci79ZEIRQytRibTTehaPLZbLzMXDMT23QzB1khW-Kn-VUbBka47M+okC1cq08m2o-nozGGYW4pIIB53Yn6UnkoOlWyhoHh0HQyCHSOxiLxwYKLLqIpiRZmbEZsbZZS6NSFPNygM-SlFtaA+neRkViAkXabGuIgZyBR5ntiG6KRRt9OizPKW32iSzfkFiTK4vrUsT7ZgNmVmFgADWdCYPTjSITpj5Yno2Qxz0QRSEn2-r0GIyjiOIlhUtwWDNPAoQhher61u+9YIEIWhikIRiEqewYqheTiuGAyELtaygjJm2hvKkIh6EoLbdj+Z6jmqTQQqR3JoXRvr2iINwykYJhmGKvGHkeHyHroujKHhI60mGV6cXWS6xBIaTJs60qiYSkhfHu+hFO6igsQpl5bDsewQGM8IoYuMQUeomlPGK+hZESCwgWBEFiKZJbjhZmr1MpqGqVoiirqoMnOq67rZGKCzqH2+aBsO1LnmO6rlqgMIQCF9kKAJRLiK2aYiroCXge8KVDn5hFZTeWz5dauTes52mZhIdq5jVFJQeYQA */id:\"audioOutput\",context:{autoplay:false,audioElement:audioElement},initial:\"idle\",states:{idle:{on:{loadstart:\"loading\"}},loading:{on:{loadedmetadata:\"loaded\"}},loaded:{initial:\"ready\",on:{emptied:\"idle\"},states:{ready:{description:\"Audio has loaded and is ready to start playing (further buffering may be required to reach the end).\",on:{play:\"playing\"},entry:{type:\"emitEvent\",params:{eventName:\"saypi:ready\"}}},playing:{on:{pause:\"paused\",ended:\"ended\",canplaythrough:{target:\"playing\",internal:true}},always:{target:\"paused\",cond:\"isSafariAutoPlay\",actions:[\"requestPause\",{type:\"emitEvent\",params:{eventName:\"saypi:safariBlocked\"}}]},entry:[{type:\"emitEvent\",params:{eventName:\"saypi:piSpeaking\"}}],exit:[{type:\"emitEvent\",params:{eventName:\"saypi:piStoppedSpeaking\"}},(0,xstate__WEBPACK_IMPORTED_MODULE_2__.assign)({autoplay:true,audioElement:function audioElement(context){return context.audioElement;}})]},paused:{on:{play:\"playing\",reload:{target:\"#audioOutput.loading\",description:\"Reload the audio stream for Safari. This is the only command that external modules can send the machine.\",actions:[(0,xstate__WEBPACK_IMPORTED_MODULE_2__.assign)(function(context){return{autoplay:false,audioElement:context.audioElement};}),\"requestReload\"],cond:\"isSafari\"}}},ended:{on:{seeked:{target:\"#audioOutput.loaded.ready\",description:\"An ended track is seeked back to earlier in the track.\"}},entry:[{type:\"emitEvent\",params:{eventName:\"saypi:piFinishedSpeaking\"}}]}}}},predictableActionArguments:true,preserveActionOrder:true},{actions:{emitEvent:function emitEvent(context,event,_ref){var action=_ref.action;EventBus.emit(action.params.eventName);},requestPause:function requestPause(context,event){context.audioElement.pause();},seekToEnd:function seekToEnd(context,event){var audio=context.audioElement;if(audio.duration&&!audio.ended&&audio.currentTime<audio.duration){audio.currentTime=audio.duration;// seek the audio to the end\naudio.play();// trigger the ended event\n}EventBus.emit(\"saypi:piFinishedSpeaking\");},requestReload:function requestReload(context){var audio=context.audioElement;audio.load();audio.play();}},guards:{isSafari:function isSafari(context,event){return(0,_UserAgentModule__WEBPACK_IMPORTED_MODULE_0__.isSafari)();},isSafariAutoPlay:function isSafariAutoPlay(context,event){return(0,_UserAgentModule__WEBPACK_IMPORTED_MODULE_0__.isSafari)()&&context.autoplay;}}});/***/},/***/\"./node_modules/xstate/es/Actor.js\":/*!*****************************************!*\\\n  !*** ./node_modules/xstate/es/Actor.js ***!\n  \\*****************************************/ /***/function node_modulesXstateEsActorJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */createDeferredActor:function createDeferredActor(){return(/* binding */_createDeferredActor);},/* harmony export */createInvocableActor:function createInvocableActor(){return(/* binding */_createInvocableActor);},/* harmony export */createNullActor:function createNullActor(){return(/* binding */_createNullActor);},/* harmony export */isActor:function isActor(){return(/* binding */_isActor);},/* harmony export */isSpawnedActor:function isSpawnedActor(){return(/* binding */_isSpawnedActor);},/* harmony export */toActorRef:function toActorRef(){return(/* binding */_toActorRef);}/* harmony export */});/* harmony import */var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(/*! ./_virtual/_tslib.js */\"./node_modules/xstate/es/_virtual/_tslib.js\");/* harmony import */var _utils_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./utils.js */\"./node_modules/xstate/es/utils.js\");/* harmony import */var _serviceScope_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(/*! ./serviceScope.js */\"./node_modules/xstate/es/serviceScope.js\");function _createNullActor(id){var _a;return _a={id:id,send:function send(){return void 0;},subscribe:function subscribe(){return{unsubscribe:function unsubscribe(){return void 0;}};},getSnapshot:function getSnapshot(){return undefined;},toJSON:function toJSON(){return{id:id};}},_a[_utils_js__WEBPACK_IMPORTED_MODULE_0__.symbolObservable]=function(){return this;},_a;}/**\r\n * Creates a deferred actor that is able to be invoked given the provided\r\n * invocation information in its `.meta` value.\r\n *\r\n * @param invokeDefinition The meta information needed to invoke the actor.\r\n */function _createInvocableActor(invokeDefinition,machine,context,_event){var _a;var invokeSrc=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toInvokeSource)(invokeDefinition.src);var serviceCreator=(_a=machine===null||machine===void 0?void 0:machine.options.services)===null||_a===void 0?void 0:_a[invokeSrc.type];var resolvedData=invokeDefinition.data?(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapContext)(invokeDefinition.data,context,_event):undefined;var tempActor=serviceCreator?_createDeferredActor(serviceCreator,invokeDefinition.id,resolvedData):_createNullActor(invokeDefinition.id);// @ts-ignore\ntempActor.meta=invokeDefinition;return tempActor;}function _createDeferredActor(entity,id,data){var tempActor=_createNullActor(id);// @ts-ignore\ntempActor.deferred=true;if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(entity)){// \"mute\" the existing service scope so potential spawned actors within the `.initialState` stay deferred here\nvar initialState_1=tempActor.state=(0,_serviceScope_js__WEBPACK_IMPORTED_MODULE_1__.provide)(undefined,function(){return(data?entity.withContext(data):entity).initialState;});tempActor.getSnapshot=function(){return initialState_1;};}return tempActor;}function _isActor(item){try{return typeof item.send==='function';}catch(e){return false;}}function _isSpawnedActor(item){return _isActor(item)&&'id'in item;}// TODO: refactor the return type, this could be written in a better way but it's best to avoid unneccessary breaking changes now\nfunction _toActorRef(actorRefLike){var _a;return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((_a={subscribe:function subscribe(){return{unsubscribe:function unsubscribe(){return void 0;}};},id:'anonymous',getSnapshot:function getSnapshot(){return undefined;}},_a[_utils_js__WEBPACK_IMPORTED_MODULE_0__.symbolObservable]=function(){return this;},_a),actorRefLike);}/***/},/***/\"./node_modules/xstate/es/Machine.js\":/*!*******************************************!*\\\n  !*** ./node_modules/xstate/es/Machine.js ***!\n  \\*******************************************/ /***/function node_modulesXstateEsMachineJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */Machine:function Machine(){return(/* binding */_Machine);},/* harmony export */createMachine:function createMachine(){return(/* binding */_createMachine);}/* harmony export */});/* harmony import */var _StateNode_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./StateNode.js */\"./node_modules/xstate/es/StateNode.js\");/* harmony import */var _environment_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(/*! ./environment.js */\"./node_modules/xstate/es/environment.js\");var warned=false;function _Machine(config,options,initialContext){if(initialContext===void 0){initialContext=config.context;}return new _StateNode_js__WEBPACK_IMPORTED_MODULE_0__.StateNode(config,options,initialContext);}function _createMachine(config,options){if(!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION&&!('predictableActionArguments'in config)&&!warned){warned=true;console.warn('It is highly recommended to set `predictableActionArguments` to `true` when using `createMachine`. https://xstate.js.org/docs/guides/actions.html');}return new _StateNode_js__WEBPACK_IMPORTED_MODULE_0__.StateNode(config,options);}/***/},/***/\"./node_modules/xstate/es/State.js\":/*!*****************************************!*\\\n  !*** ./node_modules/xstate/es/State.js ***!\n  \\*****************************************/ /***/function node_modulesXstateEsStateJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */State:function State(){return(/* binding */_State);},/* harmony export */bindActionToState:function bindActionToState(){return(/* binding */_bindActionToState);},/* harmony export */isState:function isState(){return(/* binding */_isState);},/* harmony export */isStateConfig:function isStateConfig(){return(/* binding */_isStateConfig);},/* harmony export */stateValuesEqual:function stateValuesEqual(){return(/* binding */_stateValuesEqual);}/* harmony export */});/* harmony import */var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(/*! ./_virtual/_tslib.js */\"./node_modules/xstate/es/_virtual/_tslib.js\");/* harmony import */var _constants_js__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(/*! ./constants.js */\"./node_modules/xstate/es/constants.js\");/* harmony import */var _utils_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./utils.js */\"./node_modules/xstate/es/utils.js\");/* harmony import */var _stateUtils_js__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(/*! ./stateUtils.js */\"./node_modules/xstate/es/stateUtils.js\");/* harmony import */var _actions_js__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(/*! ./actions.js */\"./node_modules/xstate/es/actions.js\");/* harmony import */var _environment_js__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(/*! ./environment.js */\"./node_modules/xstate/es/environment.js\");function _stateValuesEqual(a,b){if(a===b){return true;}if(a===undefined||b===undefined){return false;}if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(a)||(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(b)){return a===b;}var aKeys=Object.keys(a);var bKeys=Object.keys(b);return aKeys.length===bKeys.length&&aKeys.every(function(key){return _stateValuesEqual(a[key],b[key]);});}function _isStateConfig(state){if(_typeof2(state)!=='object'||state===null){return false;}return'value'in state&&'_event'in state;}/**\r\n * @deprecated Use `isStateConfig(object)` or `state instanceof State` instead.\r\n */var _isState=_isStateConfig;function _bindActionToState(action,state){var exec=action.exec;var boundAction=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)({},action),{exec:exec!==undefined?function(){return exec(state.context,state.event,{action:action,state:state,_event:state._event});}:undefined});return boundAction;}var _State=/*#__PURE__*/ /** @class */function(){/**\r\n   * Creates a new State instance.\r\n   * @param value The state value\r\n   * @param context The extended state\r\n   * @param historyValue The tree representing historical values of the state nodes\r\n   * @param history The previous state\r\n   * @param actions An array of action objects to execute as side-effects\r\n   * @param activities A mapping of activities and whether they are started (`true`) or stopped (`false`).\r\n   * @param meta\r\n   * @param events Internal event queue. Should be empty with run-to-completion semantics.\r\n   * @param configuration\r\n   */function State(config){var _this=this;var _a;this.actions=[];this.activities=_constants_js__WEBPACK_IMPORTED_MODULE_2__.EMPTY_ACTIVITY_MAP;this.meta={};this.events=[];this.value=config.value;this.context=config.context;this._event=config._event;this._sessionid=config._sessionid;this.event=this._event.data;this.historyValue=config.historyValue;this.history=config.history;this.actions=config.actions||[];this.activities=config.activities||_constants_js__WEBPACK_IMPORTED_MODULE_2__.EMPTY_ACTIVITY_MAP;this.meta=(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_3__.getMeta)(config.configuration);this.events=config.events||[];this.matches=this.matches.bind(this);this.toStrings=this.toStrings.bind(this);this.configuration=config.configuration;this.transitions=config.transitions;this.children=config.children;this.done=!!config.done;this.tags=(_a=Array.isArray(config.tags)?new Set(config.tags):config.tags)!==null&&_a!==void 0?_a:new Set();this.machine=config.machine;Object.defineProperty(this,'nextEvents',{get:function get(){return(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_3__.nextEvents)(_this.configuration);}});}/**\r\n   * Creates a new State instance for the given `stateValue` and `context`.\r\n   * @param stateValue\r\n   * @param context\r\n   */State.from=function(stateValue,context){if(stateValue instanceof State){if(stateValue.context!==context){return new State({value:stateValue.value,context:context,_event:stateValue._event,_sessionid:null,historyValue:stateValue.historyValue,history:stateValue.history,actions:[],activities:stateValue.activities,meta:{},events:[],configuration:[],transitions:[],children:{}});}return stateValue;}var _event=_actions_js__WEBPACK_IMPORTED_MODULE_4__.initEvent;return new State({value:stateValue,context:context,_event:_event,_sessionid:null,historyValue:undefined,history:undefined,actions:[],activities:undefined,meta:undefined,events:[],configuration:[],transitions:[],children:{}});};/**\r\n   * Creates a new State instance for the given `config`.\r\n   * @param config The state config\r\n   */State.create=function(config){return new State(config);};/**\r\n   * Creates a new `State` instance for the given `stateValue` and `context` with no actions (side-effects).\r\n   * @param stateValue\r\n   * @param context\r\n   */State.inert=function(stateValue,context){if(stateValue instanceof State){if(!stateValue.actions.length){return stateValue;}var _event=_actions_js__WEBPACK_IMPORTED_MODULE_4__.initEvent;return new State({value:stateValue.value,context:context,_event:_event,_sessionid:null,historyValue:stateValue.historyValue,history:stateValue.history,activities:stateValue.activities,configuration:stateValue.configuration,transitions:[],children:{}});}return State.from(stateValue,context);};/**\r\n   * Returns an array of all the string leaf state node paths.\r\n   * @param stateValue\r\n   * @param delimiter The character(s) that separate each subpath in the string state node path.\r\n   */State.prototype.toStrings=function(stateValue,delimiter){var _this=this;if(stateValue===void 0){stateValue=this.value;}if(delimiter===void 0){delimiter='.';}if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(stateValue)){return[stateValue];}var valueKeys=Object.keys(stateValue);return valueKeys.concat.apply(valueKeys,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__read)(valueKeys.map(function(key){return _this.toStrings(stateValue[key],delimiter).map(function(s){return key+delimiter+s;});})),false));};State.prototype.toJSON=function(){var _a=this;_a.configuration;_a.transitions;var tags=_a.tags;_a.machine;var jsonValues=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__rest)(_a,[\"configuration\",\"transitions\",\"tags\",\"machine\"]);return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)({},jsonValues),{tags:Array.from(tags)});};State.prototype.matches=function(parentStateValue){return(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.matchesState)(parentStateValue,this.value);};/**\r\n   * Whether the current state configuration has a state node with the specified `tag`.\r\n   * @param tag\r\n   */State.prototype.hasTag=function(tag){return this.tags.has(tag);};/**\r\n   * Determines whether sending the `event` will cause a non-forbidden transition\r\n   * to be selected, even if the transitions have no actions nor\r\n   * change the state value.\r\n   *\r\n   * @param event The event to test\r\n   * @returns Whether the event will cause a transition\r\n   */State.prototype.can=function(event){var _a;if(_environment_js__WEBPACK_IMPORTED_MODULE_5__.IS_PRODUCTION){(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(!!this.machine,\"state.can(...) used outside of a machine-created State object; this will always return false.\");}var transitionData=(_a=this.machine)===null||_a===void 0?void 0:_a.getTransitionData(this,event);return!!(transitionData===null||transitionData===void 0?void 0:transitionData.transitions.length)&&// Check that at least one transition is not forbidden\ntransitionData.transitions.some(function(t){return t.target!==undefined||t.actions.length;});};return State;}();/***/},/***/\"./node_modules/xstate/es/StateNode.js\":/*!*********************************************!*\\\n  !*** ./node_modules/xstate/es/StateNode.js ***!\n  \\*********************************************/ /***/function node_modulesXstateEsStateNodeJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */StateNode:function StateNode(){return(/* binding */_StateNode);}/* harmony export */});/* harmony import */var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(/*! ./_virtual/_tslib.js */\"./node_modules/xstate/es/_virtual/_tslib.js\");/* harmony import */var _utils_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./utils.js */\"./node_modules/xstate/es/utils.js\");/* harmony import */var _State_js__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__(/*! ./State.js */\"./node_modules/xstate/es/State.js\");/* harmony import */var _actionTypes_js__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__(/*! ./actionTypes.js */\"./node_modules/xstate/es/actionTypes.js\");/* harmony import */var _actions_js__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(/*! ./actions.js */\"./node_modules/xstate/es/actions.js\");/* harmony import */var _environment_js__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(/*! ./environment.js */\"./node_modules/xstate/es/environment.js\");/* harmony import */var _constants_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(/*! ./constants.js */\"./node_modules/xstate/es/constants.js\");/* harmony import */var _stateUtils_js__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(/*! ./stateUtils.js */\"./node_modules/xstate/es/stateUtils.js\");/* harmony import */var _Actor_js__WEBPACK_IMPORTED_MODULE_9__=__webpack_require__(/*! ./Actor.js */\"./node_modules/xstate/es/Actor.js\");/* harmony import */var _invokeUtils_js__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(/*! ./invokeUtils.js */\"./node_modules/xstate/es/invokeUtils.js\");var NULL_EVENT='';var STATE_IDENTIFIER='#';var WILDCARD='*';var EMPTY_OBJECT={};var isStateId=function isStateId(str){return str[0]===STATE_IDENTIFIER;};var createDefaultOptions=function createDefaultOptions(){return{actions:{},guards:{},services:{},activities:{},delays:{}};};var validateArrayifiedTransitions=function validateArrayifiedTransitions(stateNode,event,transitions){var hasNonLastUnguardedTarget=transitions.slice(0,-1).some(function(transition){return!('cond'in transition)&&!('in'in transition)&&((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(transition.target)||(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(transition.target));});var eventText=event===NULL_EVENT?'the transient event':\"event '\".concat(event,\"'\");(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(!hasNonLastUnguardedTarget,\"One or more transitions for \".concat(eventText,\" on state '\").concat(stateNode.id,\"' are unreachable. \")+\"Make sure that the default transition is the last one defined.\");};var _StateNode=/*#__PURE__*/ /** @class */function(){function StateNode(/**\r\n   * The raw config used to create the machine.\r\n   */config,options,/**\r\n   * The initial extended state\r\n   */_context,// TODO: this is unsafe, but we're removing it in v5 anyway\n_stateInfo){if(_context===void 0){_context='context'in config?config.context:undefined;}var _this=this;var _a;this.config=config;this._context=_context;/**\r\n     * The order this state node appears. Corresponds to the implicit SCXML document order.\r\n     */this.order=-1;this.__xstatenode=true;this.__cache={events:undefined,relativeValue:new Map(),initialStateValue:undefined,initialState:undefined,on:undefined,transitions:undefined,candidates:{},delayedTransitions:undefined};this.idMap={};this.tags=[];this.options=Object.assign(createDefaultOptions(),options);this.parent=_stateInfo===null||_stateInfo===void 0?void 0:_stateInfo.parent;this.key=this.config.key||(_stateInfo===null||_stateInfo===void 0?void 0:_stateInfo.key)||this.config.id||'(machine)';this.machine=this.parent?this.parent.machine:this;this.path=this.parent?this.parent.path.concat(this.key):[];this.delimiter=this.config.delimiter||(this.parent?this.parent.delimiter:_constants_js__WEBPACK_IMPORTED_MODULE_1__.STATE_DELIMITER);this.id=this.config.id||(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([this.machine.key],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(this.path),false).join(this.delimiter);this.version=this.parent?this.parent.version:this.config.version;this.type=this.config.type||(this.config.parallel?'parallel':this.config.states&&Object.keys(this.config.states).length?'compound':this.config.history?'history':'atomic');this.schema=this.parent?this.machine.schema:(_a=this.config.schema)!==null&&_a!==void 0?_a:{};this.description=this.config.description;if(!_environment_js__WEBPACK_IMPORTED_MODULE_3__.IS_PRODUCTION){(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(!('parallel'in this.config),\"The \\\"parallel\\\" property is deprecated and will be removed in version 4.1. \".concat(this.config.parallel?\"Replace with `type: 'parallel'`\":\"Use `type: '\".concat(this.type,\"'`\"),\" in the config for state node '\").concat(this.id,\"' instead.\"));}this.initial=this.config.initial;this.states=this.config.states?(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapValues)(this.config.states,function(stateConfig,key){var _a;var stateNode=new StateNode(stateConfig,{},undefined,{parent:_this,key:key});Object.assign(_this.idMap,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((_a={},_a[stateNode.id]=stateNode,_a),stateNode.idMap));return stateNode;}):EMPTY_OBJECT;// Document order\nvar order=0;function dfs(stateNode){var e_1,_a;stateNode.order=order++;try{for(var _b=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)((0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getAllChildren)(stateNode)),_c=_b.next();!_c.done;_c=_b.next()){var child=_c.value;dfs(child);}}catch(e_1_1){e_1={error:e_1_1};}finally{try{if(_c&&!_c.done&&(_a=_b[\"return\"]))_a.call(_b);}finally{if(e_1)throw e_1.error;}}}dfs(this);// History config\nthis.history=this.config.history===true?'shallow':this.config.history||false;this._transient=!!this.config.always||(!this.config.on?false:Array.isArray(this.config.on)?this.config.on.some(function(_a){var event=_a.event;return event===NULL_EVENT;}):NULL_EVENT in this.config.on);this.strict=!!this.config.strict;// TODO: deprecate (entry)\nthis.onEntry=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(this.config.entry||this.config.onEntry).map(function(action){return(0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActionObject)(action);});// TODO: deprecate (exit)\nthis.onExit=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(this.config.exit||this.config.onExit).map(function(action){return(0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActionObject)(action);});this.meta=this.config.meta;this.doneData=this.type==='final'?this.config.data:undefined;this.invoke=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(this.config.invoke).map(function(invokeConfig,i){var _a,_b;if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(invokeConfig)){var invokeId=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.createInvokeId)(_this.id,i);_this.machine.options.services=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((_a={},_a[invokeId]=invokeConfig,_a),_this.machine.options.services);return(0,_invokeUtils_js__WEBPACK_IMPORTED_MODULE_6__.toInvokeDefinition)({src:invokeId,id:invokeId});}else if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(invokeConfig.src)){var invokeId=invokeConfig.id||(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.createInvokeId)(_this.id,i);return(0,_invokeUtils_js__WEBPACK_IMPORTED_MODULE_6__.toInvokeDefinition)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},invokeConfig),{id:invokeId,src:invokeConfig.src}));}else if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(invokeConfig.src)||(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(invokeConfig.src)){var invokeId=invokeConfig.id||(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.createInvokeId)(_this.id,i);_this.machine.options.services=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((_b={},_b[invokeId]=invokeConfig.src,_b),_this.machine.options.services);return(0,_invokeUtils_js__WEBPACK_IMPORTED_MODULE_6__.toInvokeDefinition)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({id:invokeId},invokeConfig),{src:invokeId}));}else{var invokeSource=invokeConfig.src;return(0,_invokeUtils_js__WEBPACK_IMPORTED_MODULE_6__.toInvokeDefinition)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({id:(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.createInvokeId)(_this.id,i)},invokeConfig),{src:invokeSource}));}});this.activities=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(this.config.activities).concat(this.invoke).map(function(activity){return(0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActivityDefinition)(activity);});this.transition=this.transition.bind(this);this.tags=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(this.config.tags);// TODO: this is the real fix for initialization once\n// state node getters are deprecated\n// if (!this.parent) {\n//   this._init();\n// }\n}StateNode.prototype._init=function(){if(this.__cache.transitions){return;}(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getAllStateNodes)(this).forEach(function(stateNode){return stateNode.on;});};/**\r\n   * Clones this state machine with custom options and context.\r\n   *\r\n   * @param options Options (actions, guards, activities, services) to recursively merge with the existing options.\r\n   * @param context Custom context (will override predefined context)\r\n   */StateNode.prototype.withConfig=function(options,context){var _a=this.options,actions=_a.actions,activities=_a.activities,guards=_a.guards,services=_a.services,delays=_a.delays;return new StateNode(this.config,{actions:(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},actions),options.actions),activities:(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},activities),options.activities),guards:(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},guards),options.guards),services:(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},services),options.services),delays:(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},delays),options.delays)},context!==null&&context!==void 0?context:this.context);};/**\r\n   * Clones this state machine with custom context.\r\n   *\r\n   * @param context Custom context (will override predefined context, not recursive)\r\n   */StateNode.prototype.withContext=function(context){return new StateNode(this.config,this.options,context);};Object.defineProperty(StateNode.prototype,\"context\",{get:function get(){return(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(this._context)?this._context():this._context;},enumerable:false,configurable:true});Object.defineProperty(StateNode.prototype,\"definition\",{/**\r\n     * The well-structured state node definition.\r\n     */get:function get(){return{id:this.id,key:this.key,version:this.version,context:this.context,type:this.type,initial:this.initial,history:this.history,states:(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapValues)(this.states,function(state){return state.definition;}),on:this.on,transitions:this.transitions,entry:this.onEntry,exit:this.onExit,activities:this.activities||[],meta:this.meta,order:this.order||-1,data:this.doneData,invoke:this.invoke,description:this.description,tags:this.tags};},enumerable:false,configurable:true});StateNode.prototype.toJSON=function(){return this.definition;};Object.defineProperty(StateNode.prototype,\"on\",{/**\r\n     * The mapping of events to transitions.\r\n     */get:function get(){if(this.__cache.on){return this.__cache.on;}var transitions=this.transitions;return this.__cache.on=transitions.reduce(function(map,transition){map[transition.eventType]=map[transition.eventType]||[];map[transition.eventType].push(transition);return map;},{});},enumerable:false,configurable:true});Object.defineProperty(StateNode.prototype,\"after\",{get:function get(){return this.__cache.delayedTransitions||(this.__cache.delayedTransitions=this.getDelayedTransitions(),this.__cache.delayedTransitions);},enumerable:false,configurable:true});Object.defineProperty(StateNode.prototype,\"transitions\",{/**\r\n     * All the transitions that can be taken from this state node.\r\n     */get:function get(){return this.__cache.transitions||(this.__cache.transitions=this.formatTransitions(),this.__cache.transitions);},enumerable:false,configurable:true});StateNode.prototype.getCandidates=function(eventName){if(this.__cache.candidates[eventName]){return this.__cache.candidates[eventName];}var _transient=eventName===NULL_EVENT;var candidates=this.transitions.filter(function(transition){var sameEventType=transition.eventType===eventName;// null events should only match against eventless transitions\nreturn _transient?sameEventType:sameEventType||transition.eventType===WILDCARD;});this.__cache.candidates[eventName]=candidates;return candidates;};/**\r\n   * All delayed transitions from the config.\r\n   */StateNode.prototype.getDelayedTransitions=function(){var _this=this;var afterConfig=this.config.after;if(!afterConfig){return[];}var mutateEntryExit=function mutateEntryExit(delay,i){var delayRef=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(delay)?\"\".concat(_this.id,\":delay[\").concat(i,\"]\"):delay;var eventType=(0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.after)(delayRef,_this.id);_this.onEntry.push((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.send)(eventType,{delay:delay}));_this.onExit.push((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.cancel)(eventType));return eventType;};var delayedTransitions=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(afterConfig)?afterConfig.map(function(transition,i){var eventType=mutateEntryExit(transition.delay,i);return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},transition),{event:eventType});}):(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(Object.keys(afterConfig).map(function(delay,i){var configTransition=afterConfig[delay];var resolvedTransition=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(configTransition)?{target:configTransition}:configTransition;var resolvedDelay=!isNaN(+delay)?+delay:delay;var eventType=mutateEntryExit(resolvedDelay,i);return(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(resolvedTransition).map(function(transition){return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},transition),{event:eventType,delay:resolvedDelay});});}));return delayedTransitions.map(function(delayedTransition){var delay=delayedTransition.delay;return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},_this.formatTransition(delayedTransition)),{delay:delay});});};/**\r\n   * Returns the state nodes represented by the current state value.\r\n   *\r\n   * @param state The state value or State instance\r\n   */StateNode.prototype.getStateNodes=function(state){var _a;var _this=this;if(!state){return[];}var stateValue=state instanceof _State_js__WEBPACK_IMPORTED_MODULE_7__.State?state.value:(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStateValue)(state,this.delimiter);if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(stateValue)){var initialStateValue=this.getStateNode(stateValue).initial;return initialStateValue!==undefined?this.getStateNodes((_a={},_a[stateValue]=initialStateValue,_a)):[this,this.states[stateValue]];}var subStateKeys=Object.keys(stateValue);var subStateNodes=[this];subStateNodes.push.apply(subStateNodes,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(subStateKeys.map(function(subStateKey){return _this.getStateNode(subStateKey).getStateNodes(stateValue[subStateKey]);}))),false));return subStateNodes;};/**\r\n   * Returns `true` if this state node explicitly handles the given event.\r\n   *\r\n   * @param event The event in question\r\n   */StateNode.prototype.handles=function(event){var eventType=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.getEventType)(event);return this.events.includes(eventType);};/**\r\n   * Resolves the given `state` to a new `State` instance relative to this machine.\r\n   *\r\n   * This ensures that `.events` and `.nextEvents` represent the correct values.\r\n   *\r\n   * @param state The state to resolve\r\n   */StateNode.prototype.resolveState=function(state){var stateFromConfig=state instanceof _State_js__WEBPACK_IMPORTED_MODULE_7__.State?state:_State_js__WEBPACK_IMPORTED_MODULE_7__.State.create(state);var configuration=Array.from((0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getConfiguration)([],this.getStateNodes(stateFromConfig.value)));return new _State_js__WEBPACK_IMPORTED_MODULE_7__.State((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},stateFromConfig),{value:this.resolve(stateFromConfig.value),configuration:configuration,done:(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.isInFinalState)(configuration,this),tags:(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getTagsFromConfiguration)(configuration),machine:this.machine}));};StateNode.prototype.transitionLeafNode=function(stateValue,state,_event){var stateNode=this.getStateNode(stateValue);var next=stateNode.next(state,_event);if(!next||!next.transitions.length){return this.next(state,_event);}return next;};StateNode.prototype.transitionCompoundNode=function(stateValue,state,_event){var subStateKeys=Object.keys(stateValue);var stateNode=this.getStateNode(subStateKeys[0]);var next=stateNode._transition(stateValue[subStateKeys[0]],state,_event);if(!next||!next.transitions.length){return this.next(state,_event);}return next;};StateNode.prototype.transitionParallelNode=function(stateValue,state,_event){var e_2,_a;var transitionMap={};try{for(var _b=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(Object.keys(stateValue)),_c=_b.next();!_c.done;_c=_b.next()){var subStateKey=_c.value;var subStateValue=stateValue[subStateKey];if(!subStateValue){continue;}var subStateNode=this.getStateNode(subStateKey);var next=subStateNode._transition(subStateValue,state,_event);if(next){transitionMap[subStateKey]=next;}}}catch(e_2_1){e_2={error:e_2_1};}finally{try{if(_c&&!_c.done&&(_a=_b[\"return\"]))_a.call(_b);}finally{if(e_2)throw e_2.error;}}var stateTransitions=Object.keys(transitionMap).map(function(key){return transitionMap[key];});var enabledTransitions=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(stateTransitions.map(function(st){return st.transitions;}));var willTransition=stateTransitions.some(function(st){return st.transitions.length>0;});if(!willTransition){return this.next(state,_event);}var configuration=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(Object.keys(transitionMap).map(function(key){return transitionMap[key].configuration;}));return{transitions:enabledTransitions,exitSet:(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(stateTransitions.map(function(t){return t.exitSet;})),configuration:configuration,source:state,actions:(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(Object.keys(transitionMap).map(function(key){return transitionMap[key].actions;}))};};StateNode.prototype._transition=function(stateValue,state,_event){// leaf node\nif((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(stateValue)){return this.transitionLeafNode(stateValue,state,_event);}// hierarchical node\nif(Object.keys(stateValue).length===1){return this.transitionCompoundNode(stateValue,state,_event);}// orthogonal node\nreturn this.transitionParallelNode(stateValue,state,_event);};StateNode.prototype.getTransitionData=function(state,event){return this._transition(state.value,state,(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(event));};StateNode.prototype.next=function(state,_event){var e_3,_a;var _this=this;var eventName=_event.name;var actions=[];var nextStateNodes=[];var selectedTransition;try{for(var _b=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(this.getCandidates(eventName)),_c=_b.next();!_c.done;_c=_b.next()){var candidate=_c.value;var cond=candidate.cond,stateIn=candidate[\"in\"];var resolvedContext=state.context;var isInState=stateIn?(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(stateIn)&&isStateId(stateIn)?// Check if in state by ID\nstate.matches((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStateValue)(this.getStateNodeById(stateIn).path,this.delimiter)):// Check if in state by relative grandparent\n(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.matchesState)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStateValue)(stateIn,this.delimiter),(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.path)(this.path.slice(0,-2))(state.value)):true;var guardPassed=false;try{guardPassed=!cond||(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.evaluateGuard)(this.machine,cond,resolvedContext,_event,state);}catch(err){throw new Error(\"Unable to evaluate guard '\".concat(cond.name||cond.type,\"' in transition for event '\").concat(eventName,\"' in state node '\").concat(this.id,\"':\\n\").concat(err.message));}if(guardPassed&&isInState){if(candidate.target!==undefined){nextStateNodes=candidate.target;}actions.push.apply(actions,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(candidate.actions),false));selectedTransition=candidate;break;}}}catch(e_3_1){e_3={error:e_3_1};}finally{try{if(_c&&!_c.done&&(_a=_b[\"return\"]))_a.call(_b);}finally{if(e_3)throw e_3.error;}}if(!selectedTransition){return undefined;}if(!nextStateNodes.length){return{transitions:[selectedTransition],exitSet:[],configuration:state.value?[this]:[],source:state,actions:actions};}var allNextStateNodes=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(nextStateNodes.map(function(stateNode){return _this.getRelativeStateNodes(stateNode,state.historyValue);}));var isInternal=!!selectedTransition.internal;return{transitions:[selectedTransition],exitSet:isInternal?[]:(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(nextStateNodes.map(function(targetNode){return _this.getPotentiallyReenteringNodes(targetNode);})),configuration:allNextStateNodes,source:state,actions:actions};};// even though the name of this function mentions reentry nodes\n// we are pushing its result into `exitSet`\n// that's because what we exit might be reentered (it's an invariant of reentrancy)\nStateNode.prototype.getPotentiallyReenteringNodes=function(targetNode){if(this.order<targetNode.order){return[this];}var nodes=[];var marker=this;var possibleAncestor=targetNode;while(marker&&marker!==possibleAncestor){nodes.push(marker);marker=marker.parent;}if(marker!==possibleAncestor){// we never got to `possibleAncestor`, therefore the initial `marker` \"escapes\" it\n// it's in a different part of the tree so no states will be reentered for such an external transition\nreturn[];}nodes.push(possibleAncestor);return nodes;};StateNode.prototype.getActions=function(resolvedConfig,isDone,transition,currentContext,_event,prevState,predictableExec){var e_4,_a,e_5,_b;var _this=this;var prevConfig=prevState?(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getConfiguration)([],this.getStateNodes(prevState.value)):[];var entrySet=new Set();try{for(var _c=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(Array.from(resolvedConfig).sort(function(a,b){return a.order-b.order;})),_d=_c.next();!_d.done;_d=_c.next()){var sn=_d.value;if(!(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.has)(prevConfig,sn)||(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.has)(transition.exitSet,sn)||sn.parent&&entrySet.has(sn.parent)){entrySet.add(sn);}}}catch(e_4_1){e_4={error:e_4_1};}finally{try{if(_d&&!_d.done&&(_a=_c[\"return\"]))_a.call(_c);}finally{if(e_4)throw e_4.error;}}try{for(var prevConfig_1=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(prevConfig),prevConfig_1_1=prevConfig_1.next();!prevConfig_1_1.done;prevConfig_1_1=prevConfig_1.next()){var sn=prevConfig_1_1.value;if(!(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.has)(resolvedConfig,sn)||(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.has)(transition.exitSet,sn.parent)){transition.exitSet.push(sn);}}}catch(e_5_1){e_5={error:e_5_1};}finally{try{if(prevConfig_1_1&&!prevConfig_1_1.done&&(_b=prevConfig_1[\"return\"]))_b.call(prevConfig_1);}finally{if(e_5)throw e_5.error;}}transition.exitSet.sort(function(a,b){return b.order-a.order;});var entryStates=Array.from(entrySet).sort(function(a,b){return a.order-b.order;});var exitStates=new Set(transition.exitSet);var doneEvents=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(entryStates.map(function(sn){var events=[];if(sn.type!=='final'){return events;}var parent=sn.parent;if(!parent.parent){return events;}events.push((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.done)(sn.id,sn.doneData),// TODO: deprecate - final states should not emit done events for their own state.\n(0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.done)(parent.id,sn.doneData?(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapContext)(sn.doneData,currentContext,_event):undefined));var grandparent=parent.parent;if(grandparent.type==='parallel'){if((0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getChildren)(grandparent).every(function(parentNode){return(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.isInFinalState)(transition.configuration,parentNode);})){events.push((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.done)(grandparent.id));}}return events;}));var entryActions=entryStates.map(function(stateNode){var entryActions=stateNode.onEntry;var invokeActions=stateNode.activities.map(function(activity){return(0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.start)(activity);});return{type:'entry',actions:(0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActionObjects)(predictableExec?(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(entryActions),false),(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(invokeActions),false):(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(invokeActions),false),(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(entryActions),false),_this.machine.options.actions)};}).concat({type:'state_done',actions:doneEvents.map(function(event){return(0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.raise)(event);})});var exitActions=Array.from(exitStates).map(function(stateNode){return{type:'exit',actions:(0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActionObjects)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(stateNode.onExit),false),(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(stateNode.activities.map(function(activity){return(0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.stop)(activity);})),false),_this.machine.options.actions)};});var actions=exitActions.concat({type:'transition',actions:(0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActionObjects)(transition.actions,this.machine.options.actions)}).concat(entryActions);if(isDone){var stopActions=(0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActionObjects)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(resolvedConfig),false).sort(function(a,b){return b.order-a.order;}).map(function(stateNode){return stateNode.onExit;})),this.machine.options.actions).filter(function(action){return!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isRaisableAction)(action);});return actions.concat({type:'stop',actions:stopActions});}return actions;};/**\r\n   * Determines the next state given the current `state` and sent `event`.\r\n   *\r\n   * @param state The current State instance or state value\r\n   * @param event The event that was sent at the current state\r\n   * @param context The current context (extended state) of the current state\r\n   */StateNode.prototype.transition=function(state,event,context,exec){if(state===void 0){state=this.initialState;}var _event=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(event);var currentState;if(state instanceof _State_js__WEBPACK_IMPORTED_MODULE_7__.State){currentState=context===undefined?state:this.resolveState(_State_js__WEBPACK_IMPORTED_MODULE_7__.State.from(state,context));}else{var resolvedStateValue=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(state)?this.resolve((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.pathToStateValue)(this.getResolvedPath(state))):this.resolve(state);var resolvedContext=context!==null&&context!==void 0?context:this.machine.context;currentState=this.resolveState(_State_js__WEBPACK_IMPORTED_MODULE_7__.State.from(resolvedStateValue,resolvedContext));}if(!_environment_js__WEBPACK_IMPORTED_MODULE_3__.IS_PRODUCTION&&_event.name===WILDCARD){throw new Error(\"An event cannot have the wildcard type ('\".concat(WILDCARD,\"')\"));}if(this.strict){if(!this.events.includes(_event.name)&&!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isBuiltInEvent)(_event.name)){throw new Error(\"Machine '\".concat(this.id,\"' does not accept event '\").concat(_event.name,\"'\"));}}var stateTransition=this._transition(currentState.value,currentState,_event)||{transitions:[],configuration:[],exitSet:[],source:currentState,actions:[]};var prevConfig=(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getConfiguration)([],this.getStateNodes(currentState.value));var resolvedConfig=stateTransition.configuration.length?(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getConfiguration)(prevConfig,stateTransition.configuration):prevConfig;stateTransition.configuration=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(resolvedConfig),false);return this.resolveTransition(stateTransition,currentState,currentState.context,exec,_event);};StateNode.prototype.resolveRaisedTransition=function(state,_event,originalEvent,predictableExec){var _a;var currentActions=state.actions;state=this.transition(state,_event,undefined,predictableExec);// Save original event to state\n// TODO: this should be the raised event! Delete in V5 (breaking)\nstate._event=originalEvent;state.event=originalEvent.data;(_a=state.actions).unshift.apply(_a,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(currentActions),false));return state;};StateNode.prototype.resolveTransition=function(stateTransition,currentState,context,predictableExec,_event){var e_6,_a,e_7,_b;var _this=this;if(_event===void 0){_event=_actions_js__WEBPACK_IMPORTED_MODULE_5__.initEvent;}var configuration=stateTransition.configuration;// Transition will \"apply\" if:\n// - this is the initial state (there is no current state)\n// - OR there are transitions\nvar willTransition=!currentState||stateTransition.transitions.length>0;var resolvedConfiguration=willTransition?stateTransition.configuration:currentState?currentState.configuration:[];var isDone=(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.isInFinalState)(resolvedConfiguration,this);var resolvedStateValue=willTransition?(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getValue)(this.machine,configuration):undefined;var historyValue=currentState?currentState.historyValue?currentState.historyValue:stateTransition.source?this.machine.historyValue(currentState.value):undefined:undefined;var actionBlocks=this.getActions(new Set(resolvedConfiguration),isDone,stateTransition,context,_event,currentState,predictableExec);var activities=currentState?(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},currentState.activities):{};try{for(var actionBlocks_1=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(actionBlocks),actionBlocks_1_1=actionBlocks_1.next();!actionBlocks_1_1.done;actionBlocks_1_1=actionBlocks_1.next()){var block=actionBlocks_1_1.value;try{for(var _c=(e_7=void 0,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(block.actions)),_d=_c.next();!_d.done;_d=_c.next()){var action=_d.value;if(action.type===_actionTypes_js__WEBPACK_IMPORTED_MODULE_8__.start){activities[action.activity.id||action.activity.type]=action;}else if(action.type===_actionTypes_js__WEBPACK_IMPORTED_MODULE_8__.stop){activities[action.activity.id||action.activity.type]=false;}}}catch(e_7_1){e_7={error:e_7_1};}finally{try{if(_d&&!_d.done&&(_b=_c[\"return\"]))_b.call(_c);}finally{if(e_7)throw e_7.error;}}}}catch(e_6_1){e_6={error:e_6_1};}finally{try{if(actionBlocks_1_1&&!actionBlocks_1_1.done&&(_a=actionBlocks_1[\"return\"]))_a.call(actionBlocks_1);}finally{if(e_6)throw e_6.error;}}var _e=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.resolveActions)(this,currentState,context,_event,actionBlocks,predictableExec,this.machine.config.predictableActionArguments||this.machine.config.preserveActionOrder),2),resolvedActions=_e[0],updatedContext=_e[1];var _f=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.partition)(resolvedActions,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isRaisableAction),2),raisedEvents=_f[0],nonRaisedActions=_f[1];var invokeActions=resolvedActions.filter(function(action){var _a;return action.type===_actionTypes_js__WEBPACK_IMPORTED_MODULE_8__.start&&((_a=action.activity)===null||_a===void 0?void 0:_a.type)===_actionTypes_js__WEBPACK_IMPORTED_MODULE_8__.invoke;});var children=invokeActions.reduce(function(acc,action){acc[action.activity.id]=(0,_Actor_js__WEBPACK_IMPORTED_MODULE_9__.createInvocableActor)(action.activity,_this.machine,updatedContext,_event);return acc;},currentState?(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},currentState.children):{});var nextState=new _State_js__WEBPACK_IMPORTED_MODULE_7__.State({value:resolvedStateValue||currentState.value,context:updatedContext,_event:_event,// Persist _sessionid between states\n_sessionid:currentState?currentState._sessionid:null,historyValue:resolvedStateValue?historyValue?(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.updateHistoryValue)(historyValue,resolvedStateValue):undefined:currentState?currentState.historyValue:undefined,history:!resolvedStateValue||stateTransition.source?currentState:undefined,actions:resolvedStateValue?nonRaisedActions:[],activities:resolvedStateValue?activities:currentState?currentState.activities:{},events:[],configuration:resolvedConfiguration,transitions:stateTransition.transitions,children:children,done:isDone,tags:(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getTagsFromConfiguration)(resolvedConfiguration),machine:this});var didUpdateContext=context!==updatedContext;nextState.changed=_event.name===_actionTypes_js__WEBPACK_IMPORTED_MODULE_8__.update||didUpdateContext;// Dispose of penultimate histories to prevent memory leaks\nvar history=nextState.history;if(history){delete history.history;}// There are transient transitions if the machine is not in a final state\n// and if some of the state nodes have transient (\"always\") transitions.\nvar hasAlwaysTransitions=!isDone&&(this._transient||configuration.some(function(stateNode){return stateNode._transient;}));// If there are no enabled transitions, check if there are transient transitions.\n// If there are transient transitions, continue checking for more transitions\n// because an transient transition should be triggered even if there are no\n// enabled transitions.\n//\n// If we're already working on an transient transition then stop to prevent an infinite loop.\n//\n// Otherwise, if there are no enabled nor transient transitions, we are done.\nif(!willTransition&&(!hasAlwaysTransitions||_event.name===NULL_EVENT)){return nextState;}var maybeNextState=nextState;if(!isDone){if(hasAlwaysTransitions){maybeNextState=this.resolveRaisedTransition(maybeNextState,{type:_actionTypes_js__WEBPACK_IMPORTED_MODULE_8__.nullEvent},_event,predictableExec);}while(raisedEvents.length){var raisedEvent=raisedEvents.shift();maybeNextState=this.resolveRaisedTransition(maybeNextState,raisedEvent._event,_event,predictableExec);}}// Detect if state changed\nvar changed=maybeNextState.changed||(history?!!maybeNextState.actions.length||didUpdateContext||_typeof2(history.value)!==_typeof2(maybeNextState.value)||!(0,_State_js__WEBPACK_IMPORTED_MODULE_7__.stateValuesEqual)(maybeNextState.value,history.value):undefined);maybeNextState.changed=changed;// Preserve original history after raised events\nmaybeNextState.history=history;return maybeNextState;};/**\r\n   * Returns the child state node from its relative `stateKey`, or throws.\r\n   */StateNode.prototype.getStateNode=function(stateKey){if(isStateId(stateKey)){return this.machine.getStateNodeById(stateKey);}if(!this.states){throw new Error(\"Unable to retrieve child state '\".concat(stateKey,\"' from '\").concat(this.id,\"'; no child states exist.\"));}var result=this.states[stateKey];if(!result){throw new Error(\"Child state '\".concat(stateKey,\"' does not exist on '\").concat(this.id,\"'\"));}return result;};/**\r\n   * Returns the state node with the given `stateId`, or throws.\r\n   *\r\n   * @param stateId The state ID. The prefix \"#\" is removed.\r\n   */StateNode.prototype.getStateNodeById=function(stateId){var resolvedStateId=isStateId(stateId)?stateId.slice(STATE_IDENTIFIER.length):stateId;if(resolvedStateId===this.id){return this;}var stateNode=this.machine.idMap[resolvedStateId];if(!stateNode){throw new Error(\"Child state node '#\".concat(resolvedStateId,\"' does not exist on machine '\").concat(this.id,\"'\"));}return stateNode;};/**\r\n   * Returns the relative state node from the given `statePath`, or throws.\r\n   *\r\n   * @param statePath The string or string array relative path to the state node.\r\n   */StateNode.prototype.getStateNodeByPath=function(statePath){if(typeof statePath==='string'&&isStateId(statePath)){try{return this.getStateNodeById(statePath.slice(1));}catch(e){// try individual paths\n// throw e;\n}}var arrayStatePath=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStatePath)(statePath,this.delimiter).slice();var currentStateNode=this;while(arrayStatePath.length){var key=arrayStatePath.shift();if(!key.length){break;}currentStateNode=currentStateNode.getStateNode(key);}return currentStateNode;};/**\r\n   * Resolves a partial state value with its full representation in this machine.\r\n   *\r\n   * @param stateValue The partial state value to resolve.\r\n   */StateNode.prototype.resolve=function(stateValue){var _a;var _this=this;if(!stateValue){return this.initialStateValue||EMPTY_OBJECT;// TODO: type-specific properties\n}switch(this.type){case'parallel':return(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapValues)(this.initialStateValue,function(subStateValue,subStateKey){return subStateValue?_this.getStateNode(subStateKey).resolve(stateValue[subStateKey]||subStateValue):EMPTY_OBJECT;});case'compound':if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(stateValue)){var subStateNode=this.getStateNode(stateValue);if(subStateNode.type==='parallel'||subStateNode.type==='compound'){return _a={},_a[stateValue]=subStateNode.initialStateValue,_a;}return stateValue;}if(!Object.keys(stateValue).length){return this.initialStateValue||{};}return(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapValues)(stateValue,function(subStateValue,subStateKey){return subStateValue?_this.getStateNode(subStateKey).resolve(subStateValue):EMPTY_OBJECT;});default:return stateValue||EMPTY_OBJECT;}};StateNode.prototype.getResolvedPath=function(stateIdentifier){if(isStateId(stateIdentifier)){var stateNode=this.machine.idMap[stateIdentifier.slice(STATE_IDENTIFIER.length)];if(!stateNode){throw new Error(\"Unable to find state node '\".concat(stateIdentifier,\"'\"));}return stateNode.path;}return(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStatePath)(stateIdentifier,this.delimiter);};Object.defineProperty(StateNode.prototype,\"initialStateValue\",{get:function get(){var _a;if(this.__cache.initialStateValue){return this.__cache.initialStateValue;}var initialStateValue;if(this.type==='parallel'){initialStateValue=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapFilterValues)(this.states,function(state){return state.initialStateValue||EMPTY_OBJECT;},function(stateNode){return!(stateNode.type==='history');});}else if(this.initial!==undefined){if(!this.states[this.initial]){throw new Error(\"Initial state '\".concat(this.initial,\"' not found on '\").concat(this.key,\"'\"));}initialStateValue=(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.isLeafNode)(this.states[this.initial])?this.initial:(_a={},_a[this.initial]=this.states[this.initial].initialStateValue,_a);}else{// The finite state value of a machine without child states is just an empty object\ninitialStateValue={};}this.__cache.initialStateValue=initialStateValue;return this.__cache.initialStateValue;},enumerable:false,configurable:true});StateNode.prototype.getInitialState=function(stateValue,context){this._init();// TODO: this should be in the constructor (see note in constructor)\nvar configuration=this.getStateNodes(stateValue);return this.resolveTransition({configuration:configuration,exitSet:[],transitions:[],source:undefined,actions:[]},undefined,context!==null&&context!==void 0?context:this.machine.context,undefined);};Object.defineProperty(StateNode.prototype,\"initialState\",{/**\r\n     * The initial State instance, which includes all actions to be executed from\r\n     * entering the initial state.\r\n     */get:function get(){var initialStateValue=this.initialStateValue;if(!initialStateValue){throw new Error(\"Cannot retrieve initial state from simple state '\".concat(this.id,\"'.\"));}return this.getInitialState(initialStateValue);},enumerable:false,configurable:true});Object.defineProperty(StateNode.prototype,\"target\",{/**\r\n     * The target state value of the history state node, if it exists. This represents the\r\n     * default state value to transition to if no history value exists yet.\r\n     */get:function get(){var target;if(this.type==='history'){var historyConfig=this.config;if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(historyConfig.target)){target=isStateId(historyConfig.target)?(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.pathToStateValue)(this.machine.getStateNodeById(historyConfig.target).path.slice(this.path.length-1)):historyConfig.target;}else{target=historyConfig.target;}}return target;},enumerable:false,configurable:true});/**\r\n   * Returns the leaf nodes from a state path relative to this state node.\r\n   *\r\n   * @param relativeStateId The relative state path to retrieve the state nodes\r\n   * @param history The previous state to retrieve history\r\n   * @param resolve Whether state nodes should resolve to initial child state nodes\r\n   */StateNode.prototype.getRelativeStateNodes=function(relativeStateId,historyValue,resolve){if(resolve===void 0){resolve=true;}return resolve?relativeStateId.type==='history'?relativeStateId.resolveHistory(historyValue):relativeStateId.initialStateNodes:[relativeStateId];};Object.defineProperty(StateNode.prototype,\"initialStateNodes\",{get:function get(){var _this=this;if((0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.isLeafNode)(this)){return[this];}// Case when state node is compound but no initial state is defined\nif(this.type==='compound'&&!this.initial){if(!_environment_js__WEBPACK_IMPORTED_MODULE_3__.IS_PRODUCTION){(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false,\"Compound state node '\".concat(this.id,\"' has no initial state.\"));}return[this];}var initialStateNodePaths=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStatePaths)(this.initialStateValue);return(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(initialStateNodePaths.map(function(initialPath){return _this.getFromRelativePath(initialPath);}));},enumerable:false,configurable:true});/**\r\n   * Retrieves state nodes from a relative path to this state node.\r\n   *\r\n   * @param relativePath The relative path from this state node\r\n   * @param historyValue\r\n   */StateNode.prototype.getFromRelativePath=function(relativePath){if(!relativePath.length){return[this];}var _a=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(relativePath),stateKey=_a[0],childStatePath=_a.slice(1);if(!this.states){throw new Error(\"Cannot retrieve subPath '\".concat(stateKey,\"' from node with no states\"));}var childStateNode=this.getStateNode(stateKey);if(childStateNode.type==='history'){return childStateNode.resolveHistory();}if(!this.states[stateKey]){throw new Error(\"Child state '\".concat(stateKey,\"' does not exist on '\").concat(this.id,\"'\"));}return this.states[stateKey].getFromRelativePath(childStatePath);};StateNode.prototype.historyValue=function(relativeStateValue){if(!Object.keys(this.states).length){return undefined;}return{current:relativeStateValue||this.initialStateValue,states:(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapFilterValues)(this.states,function(stateNode,key){if(!relativeStateValue){return stateNode.historyValue();}var subStateValue=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(relativeStateValue)?undefined:relativeStateValue[key];return stateNode.historyValue(subStateValue||stateNode.initialStateValue);},function(stateNode){return!stateNode.history;})};};/**\r\n   * Resolves to the historical value(s) of the parent state node,\r\n   * represented by state nodes.\r\n   *\r\n   * @param historyValue\r\n   */StateNode.prototype.resolveHistory=function(historyValue){var _this=this;if(this.type!=='history'){return[this];}var parent=this.parent;if(!historyValue){var historyTarget=this.target;return historyTarget?(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStatePaths)(historyTarget).map(function(relativeChildPath){return parent.getFromRelativePath(relativeChildPath);})):parent.initialStateNodes;}var subHistoryValue=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.nestedPath)(parent.path,'states')(historyValue).current;if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(subHistoryValue)){return[parent.getStateNode(subHistoryValue)];}return(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStatePaths)(subHistoryValue).map(function(subStatePath){return _this.history==='deep'?parent.getFromRelativePath(subStatePath):[parent.states[subStatePath[0]]];}));};Object.defineProperty(StateNode.prototype,\"stateIds\",{/**\r\n     * All the state node IDs of this state node and its descendant state nodes.\r\n     */get:function get(){var _this=this;var childStateIds=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(Object.keys(this.states).map(function(stateKey){return _this.states[stateKey].stateIds;}));return[this.id].concat(childStateIds);},enumerable:false,configurable:true});Object.defineProperty(StateNode.prototype,\"events\",{/**\r\n     * All the event types accepted by this state node and its descendants.\r\n     */get:function get(){var e_8,_a,e_9,_b;if(this.__cache.events){return this.__cache.events;}var states=this.states;var events=new Set(this.ownEvents);if(states){try{for(var _c=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(Object.keys(states)),_d=_c.next();!_d.done;_d=_c.next()){var stateId=_d.value;var state=states[stateId];if(state.states){try{for(var _e=(e_9=void 0,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(state.events)),_f=_e.next();!_f.done;_f=_e.next()){var event_1=_f.value;events.add(\"\".concat(event_1));}}catch(e_9_1){e_9={error:e_9_1};}finally{try{if(_f&&!_f.done&&(_b=_e[\"return\"]))_b.call(_e);}finally{if(e_9)throw e_9.error;}}}}}catch(e_8_1){e_8={error:e_8_1};}finally{try{if(_d&&!_d.done&&(_a=_c[\"return\"]))_a.call(_c);}finally{if(e_8)throw e_8.error;}}}return this.__cache.events=Array.from(events);},enumerable:false,configurable:true});Object.defineProperty(StateNode.prototype,\"ownEvents\",{/**\r\n     * All the events that have transitions directly from this state node.\r\n     *\r\n     * Excludes any inert events.\r\n     */get:function get(){var events=new Set(this.transitions.filter(function(transition){return!(!transition.target&&!transition.actions.length&&transition.internal);}).map(function(transition){return transition.eventType;}));return Array.from(events);},enumerable:false,configurable:true});StateNode.prototype.resolveTarget=function(_target){var _this=this;if(_target===undefined){// an undefined target signals that the state node should not transition from that state when receiving that event\nreturn undefined;}return _target.map(function(target){if(!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(target)){return target;}var isInternalTarget=target[0]===_this.delimiter;// If internal target is defined on machine,\n// do not include machine key on target\nif(isInternalTarget&&!_this.parent){return _this.getStateNodeByPath(target.slice(1));}var resolvedTarget=isInternalTarget?_this.key+target:target;if(_this.parent){try{var targetStateNode=_this.parent.getStateNodeByPath(resolvedTarget);return targetStateNode;}catch(err){throw new Error(\"Invalid transition definition for state node '\".concat(_this.id,\"':\\n\").concat(err.message));}}else{return _this.getStateNodeByPath(resolvedTarget);}});};StateNode.prototype.formatTransition=function(transitionConfig){var _this=this;var normalizedTarget=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.normalizeTarget)(transitionConfig.target);var internal='internal'in transitionConfig?transitionConfig.internal:normalizedTarget?normalizedTarget.some(function(_target){return(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(_target)&&_target[0]===_this.delimiter;}):true;var guards=this.machine.options.guards;var target=this.resolveTarget(normalizedTarget);var transition=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},transitionConfig),{actions:(0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActionObjects)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(transitionConfig.actions)),cond:(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toGuard)(transitionConfig.cond,guards),target:target,source:this,internal:internal,eventType:transitionConfig.event,toJSON:function toJSON(){return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},transition),{target:transition.target?transition.target.map(function(t){return\"#\".concat(t.id);}):undefined,source:\"#\".concat(_this.id)});}});return transition;};StateNode.prototype.formatTransitions=function(){var e_10,_a;var _this=this;var onConfig;if(!this.config.on){onConfig=[];}else if(Array.isArray(this.config.on)){onConfig=this.config.on;}else{var _b=this.config.on,_c=WILDCARD,_d=_b[_c],wildcardConfigs=_d===void 0?[]:_d,strictTransitionConfigs_1=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__rest)(_b,[_typeof2(_c)===\"symbol\"?_c:_c+\"\"]);onConfig=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(Object.keys(strictTransitionConfigs_1).map(function(key){if(!_environment_js__WEBPACK_IMPORTED_MODULE_3__.IS_PRODUCTION&&key===NULL_EVENT){(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false,\"Empty string transition configs (e.g., `{ on: { '': ... }}`) for transient transitions are deprecated. Specify the transition in the `{ always: ... }` property instead. \"+\"Please check the `on` configuration for \\\"#\".concat(_this.id,\"\\\".\"));}var transitionConfigArray=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toTransitionConfigArray)(key,strictTransitionConfigs_1[key]);if(!_environment_js__WEBPACK_IMPORTED_MODULE_3__.IS_PRODUCTION){validateArrayifiedTransitions(_this,key,transitionConfigArray);}return transitionConfigArray;}).concat((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toTransitionConfigArray)(WILDCARD,wildcardConfigs)));}var eventlessConfig=this.config.always?(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toTransitionConfigArray)('',this.config.always):[];var doneConfig=this.config.onDone?(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toTransitionConfigArray)(String((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.done)(this.id)),this.config.onDone):[];if(!_environment_js__WEBPACK_IMPORTED_MODULE_3__.IS_PRODUCTION){(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(!(this.config.onDone&&!this.parent),\"Root nodes cannot have an \\\".onDone\\\" transition. Please check the config of \\\"\".concat(this.id,\"\\\".\"));}var invokeConfig=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(this.invoke.map(function(invokeDef){var settleTransitions=[];if(invokeDef.onDone){settleTransitions.push.apply(settleTransitions,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toTransitionConfigArray)(String((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.doneInvoke)(invokeDef.id)),invokeDef.onDone)),false));}if(invokeDef.onError){settleTransitions.push.apply(settleTransitions,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toTransitionConfigArray)(String((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.error)(invokeDef.id)),invokeDef.onError)),false));}return settleTransitions;}));var delayedTransitions=this.after;var formattedTransitions=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(doneConfig),false),(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(invokeConfig),false),(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(onConfig),false),(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(eventlessConfig),false).map(function(transitionConfig){return(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(transitionConfig).map(function(transition){return _this.formatTransition(transition);});}));try{for(var delayedTransitions_1=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(delayedTransitions),delayedTransitions_1_1=delayedTransitions_1.next();!delayedTransitions_1_1.done;delayedTransitions_1_1=delayedTransitions_1.next()){var delayedTransition=delayedTransitions_1_1.value;formattedTransitions.push(delayedTransition);}}catch(e_10_1){e_10={error:e_10_1};}finally{try{if(delayedTransitions_1_1&&!delayedTransitions_1_1.done&&(_a=delayedTransitions_1[\"return\"]))_a.call(delayedTransitions_1);}finally{if(e_10)throw e_10.error;}}return formattedTransitions;};return StateNode;}();/***/},/***/\"./node_modules/xstate/es/_virtual/_tslib.js\":/*!***************************************************!*\\\n  !*** ./node_modules/xstate/es/_virtual/_tslib.js ***!\n  \\***************************************************/ /***/function node_modulesXstateEs_virtual_tslibJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */__assign:function __assign(){return(/* binding */_assign2);},/* harmony export */__read:function __read(){return(/* binding */_read);},/* harmony export */__rest:function __rest(){return(/* binding */_rest);},/* harmony export */__spreadArray:function __spreadArray(){return(/* binding */_spreadArray);},/* harmony export */__values:function __values(){return(/* binding */_values);}/* harmony export */});/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */var _assign2=function _assign(){_assign2=Object.assign||function __assign(t){for(var s,i=1,n=arguments.length;i<n;i++){s=arguments[i];for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))t[p]=s[p];}return t;};return _assign2.apply(this,arguments);};function _rest(s,e){var t={};for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p)&&e.indexOf(p)<0)t[p]=s[p];if(s!=null&&typeof Object.getOwnPropertySymbols===\"function\")for(var i=0,p=Object.getOwnPropertySymbols(s);i<p.length;i++){if(e.indexOf(p[i])<0&&Object.prototype.propertyIsEnumerable.call(s,p[i]))t[p[i]]=s[p[i]];}return t;}function _values(o){var s=typeof Symbol===\"function\"&&Symbol.iterator,m=s&&o[s],i=0;if(m)return m.call(o);if(o&&typeof o.length===\"number\")return{next:function next(){if(o&&i>=o.length)o=void 0;return{value:o&&o[i++],done:!o};}};throw new TypeError(s?\"Object is not iterable.\":\"Symbol.iterator is not defined.\");}function _read(o,n){var m=typeof Symbol===\"function\"&&o[Symbol.iterator];if(!m)return o;var i=m.call(o),r,ar=[],e;try{while((n===void 0||n-->0)&&!(r=i.next()).done)ar.push(r.value);}catch(error){e={error:error};}finally{try{if(r&&!r.done&&(m=i[\"return\"]))m.call(i);}finally{if(e)throw e.error;}}return ar;}function _spreadArray(to,from,pack){if(pack||arguments.length===2)for(var i=0,l=from.length,ar;i<l;i++){if(ar||!(i in from)){if(!ar)ar=Array.prototype.slice.call(from,0,i);ar[i]=from[i];}}return to.concat(ar||Array.prototype.slice.call(from));}/***/},/***/\"./node_modules/xstate/es/actionTypes.js\":/*!***********************************************!*\\\n  !*** ./node_modules/xstate/es/actionTypes.js ***!\n  \\***********************************************/ /***/function node_modulesXstateEsActionTypesJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */after:function after(){return(/* binding */_after);},/* harmony export */assign:function assign(){return(/* binding */_assign3);},/* harmony export */cancel:function cancel(){return(/* binding */_cancel);},/* harmony export */choose:function choose(){return(/* binding */_choose);},/* harmony export */doneState:function doneState(){return(/* binding */_doneState);},/* harmony export */error:function error(){return(/* binding */_error);},/* harmony export */errorExecution:function errorExecution(){return(/* binding */_errorExecution);},/* harmony export */errorPlatform:function errorPlatform(){return(/* binding */_errorPlatform);},/* harmony export */init:function init(){return(/* binding */_init);},/* harmony export */invoke:function invoke(){return(/* binding */_invoke);},/* harmony export */log:function log(){return(/* binding */_log);},/* harmony export */nullEvent:function nullEvent(){return(/* binding */_nullEvent);},/* harmony export */pure:function pure(){return(/* binding */_pure);},/* harmony export */raise:function raise(){return(/* binding */_raise);},/* harmony export */send:function send(){return(/* binding */_send);},/* harmony export */start:function start(){return(/* binding */_start);},/* harmony export */stop:function stop(){return(/* binding */_stop);},/* harmony export */update:function update(){return(/* binding */_update);}/* harmony export */});/* harmony import */var _types_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./types.js */\"./node_modules/xstate/es/types.js\");var _start=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Start;var _stop=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Stop;var _raise=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Raise;var _send=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Send;var _cancel=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Cancel;var _nullEvent=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.NullEvent;var _assign3=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Assign;var _after=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.After;var _doneState=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.DoneState;var _log=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Log;var _init=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Init;var _invoke=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Invoke;var _errorExecution=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.ErrorExecution;var _errorPlatform=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.ErrorPlatform;var _error=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.ErrorCustom;var _update=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Update;var _choose=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Choose;var _pure=_types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Pure;/***/},/***/\"./node_modules/xstate/es/actions.js\":/*!*******************************************!*\\\n  !*** ./node_modules/xstate/es/actions.js ***!\n  \\*******************************************/ /***/function node_modulesXstateEsActionsJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */actionTypes:function actionTypes(){return(/* reexport module object */_actionTypes_js__WEBPACK_IMPORTED_MODULE_0__);},/* harmony export */after:function after(){return(/* binding */_after2);},/* harmony export */assign:function assign(){return(/* binding */_assign4);},/* harmony export */cancel:function cancel(){return(/* binding */_cancel2);},/* harmony export */choose:function choose(){return(/* binding */_choose2);},/* harmony export */done:function done(){return(/* binding */_done);},/* harmony export */doneInvoke:function doneInvoke(){return(/* binding */_doneInvoke);},/* harmony export */error:function error(){return(/* binding */_error2);},/* harmony export */escalate:function escalate(){return(/* binding */_escalate);},/* harmony export */forwardTo:function forwardTo(){return(/* binding */_forwardTo);},/* harmony export */getActionFunction:function getActionFunction(){return(/* binding */_getActionFunction);},/* harmony export */initEvent:function initEvent(){return(/* binding */_initEvent);},/* harmony export */isActionObject:function isActionObject(){return(/* binding */_isActionObject);},/* harmony export */log:function log(){return(/* binding */_log2);},/* harmony export */pure:function pure(){return(/* binding */_pure2);},/* harmony export */raise:function raise(){return(/* binding */_raise2);},/* harmony export */resolveActions:function resolveActions(){return(/* binding */_resolveActions);},/* harmony export */resolveLog:function resolveLog(){return(/* binding */_resolveLog);},/* harmony export */resolveRaise:function resolveRaise(){return(/* binding */_resolveRaise);},/* harmony export */resolveSend:function resolveSend(){return(/* binding */_resolveSend);},/* harmony export */resolveStop:function resolveStop(){return(/* binding */_resolveStop);},/* harmony export */respond:function respond(){return(/* binding */_respond);},/* harmony export */send:function send(){return(/* binding */_send2);},/* harmony export */sendParent:function sendParent(){return(/* binding */_sendParent);},/* harmony export */sendTo:function sendTo(){return(/* binding */_sendTo);},/* harmony export */sendUpdate:function sendUpdate(){return(/* binding */_sendUpdate);},/* harmony export */start:function start(){return(/* binding */_start2);},/* harmony export */stop:function stop(){return(/* binding */_stop2);},/* harmony export */toActionObject:function toActionObject(){return(/* binding */_toActionObject);},/* harmony export */toActionObjects:function toActionObjects(){return(/* binding */_toActionObjects);},/* harmony export */toActivityDefinition:function toActivityDefinition(){return(/* binding */_toActivityDefinition);}/* harmony export */});/* harmony import */var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(/*! ./_virtual/_tslib.js */\"./node_modules/xstate/es/_virtual/_tslib.js\");/* harmony import */var _types_js__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(/*! ./types.js */\"./node_modules/xstate/es/types.js\");/* harmony import */var _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./actionTypes.js */\"./node_modules/xstate/es/actionTypes.js\");/* harmony import */var _utils_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(/*! ./utils.js */\"./node_modules/xstate/es/utils.js\");/* harmony import */var _environment_js__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(/*! ./environment.js */\"./node_modules/xstate/es/environment.js\");var _initEvent=/*#__PURE__*/(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toSCXMLEvent)({type:_actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.init});function _getActionFunction(actionType,actionFunctionMap){return actionFunctionMap?actionFunctionMap[actionType]||undefined:undefined;}function _toActionObject(action,actionFunctionMap){var actionObject;if((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isString)(action)||typeof action==='number'){var exec=_getActionFunction(action,actionFunctionMap);if((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(exec)){actionObject={type:action,exec:exec};}else if(exec){actionObject=exec;}else{actionObject={type:action,exec:undefined};}}else if((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(action)){actionObject={// Convert action to string if unnamed\ntype:action.name||action.toString(),exec:action};}else{var exec=_getActionFunction(action.type,actionFunctionMap);if((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(exec)){actionObject=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},action),{exec:exec});}else if(exec){var actionType=exec.type||action.type;actionObject=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},exec),action),{type:actionType});}else{actionObject=action;}}return actionObject;}var _toActionObjects=function _toActionObjects(action,actionFunctionMap){if(!action){return[];}var actions=(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(action)?action:[action];return actions.map(function(subAction){return _toActionObject(subAction,actionFunctionMap);});};function _toActivityDefinition(action){var actionObject=_toActionObject(action);return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({id:(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isString)(action)?action:actionObject.id},actionObject),{type:actionObject.type});}/**\r\n * Raises an event. This places the event in the internal event queue, so that\r\n * the event is immediately consumed by the machine in the current step.\r\n *\r\n * @param eventType The event to raise.\r\n */function _raise2(event,options){return{type:_actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.raise,event:typeof event==='function'?event:(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toEventObject)(event),delay:options?options.delay:undefined,id:options===null||options===void 0?void 0:options.id};}function _resolveRaise(action,ctx,_event,delaysMap){var meta={_event:_event};var resolvedEvent=(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toSCXMLEvent)((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(action.event)?action.event(ctx,_event.data,meta):action.event);var resolvedDelay;if((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isString)(action.delay)){var configDelay=delaysMap&&delaysMap[action.delay];resolvedDelay=(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(configDelay)?configDelay(ctx,_event.data,meta):configDelay;}else{resolvedDelay=(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(action.delay)?action.delay(ctx,_event.data,meta):action.delay;}return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},action),{type:_actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.raise,_event:resolvedEvent,delay:resolvedDelay});}/**\r\n * Sends an event. This returns an action that will be read by an interpreter to\r\n * send the event in the next step, after the current step is finished executing.\r\n *\r\n * @deprecated Use the `sendTo(...)` action creator instead.\r\n *\r\n * @param event The event to send.\r\n * @param options Options to pass into the send event:\r\n *  - `id` - The unique send event identifier (used with `cancel()`).\r\n *  - `delay` - The number of milliseconds to delay the sending of the event.\r\n *  - `to` - The target of this event (by default, the machine the event was sent from).\r\n */function _send2(event,options){return{to:options?options.to:undefined,type:_actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.send,event:(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(event)?event:(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toEventObject)(event),delay:options?options.delay:undefined,// TODO: don't auto-generate IDs here like that\n// there is too big chance of the ID collision\nid:options&&options.id!==undefined?options.id:(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(event)?event.name:(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.getEventType)(event)};}function _resolveSend(action,ctx,_event,delaysMap){var meta={_event:_event};// TODO: helper function for resolving Expr\nvar resolvedEvent=(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toSCXMLEvent)((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(action.event)?action.event(ctx,_event.data,meta):action.event);var resolvedDelay;if((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isString)(action.delay)){var configDelay=delaysMap&&delaysMap[action.delay];resolvedDelay=(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(configDelay)?configDelay(ctx,_event.data,meta):configDelay;}else{resolvedDelay=(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(action.delay)?action.delay(ctx,_event.data,meta):action.delay;}var resolvedTarget=(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(action.to)?action.to(ctx,_event.data,meta):action.to;return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},action),{to:resolvedTarget,_event:resolvedEvent,event:resolvedEvent.data,delay:resolvedDelay});}/**\r\n * Sends an event to this machine's parent.\r\n *\r\n * @param event The event to send to the parent machine.\r\n * @param options Options to pass into the send event.\r\n */function _sendParent(event,options){return _send2(event,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},options),{to:_types_js__WEBPACK_IMPORTED_MODULE_3__.SpecialTargets.Parent}));}/**\r\n * Sends an event to an actor.\r\n *\r\n * @param actor The `ActorRef` to send the event to.\r\n * @param event The event to send, or an expression that evaluates to the event to send\r\n * @param options Send action options\r\n * @returns An XState send action object\r\n */function _sendTo(actor,event,options){return _send2(event,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},options),{to:actor}));}/**\r\n * Sends an update event to this machine's parent.\r\n */function _sendUpdate(){return _sendParent(_actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.update);}/**\r\n * Sends an event back to the sender of the original event.\r\n *\r\n * @param event The event to send back to the sender\r\n * @param options Options to pass into the send event\r\n */function _respond(event,options){return _send2(event,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},options),{to:function to(_,__,_a){var _event=_a._event;return _event.origin;// TODO: handle when _event.origin is undefined\n}}));}var defaultLogExpr=function defaultLogExpr(context,event){return{context:context,event:event};};/**\r\n *\r\n * @param expr The expression function to evaluate which will be logged.\r\n *  Takes in 2 arguments:\r\n *  - `ctx` - the current state context\r\n *  - `event` - the event that caused this action to be executed.\r\n * @param label The label to give to the logged expression.\r\n */function _log2(expr,label){if(expr===void 0){expr=defaultLogExpr;}return{type:_actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.log,label:label,expr:expr};}var _resolveLog=function _resolveLog(action,ctx,_event){return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},action),{value:(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isString)(action.expr)?action.expr:action.expr(ctx,_event.data,{_event:_event})});};/**\r\n * Cancels an in-flight `send(...)` action. A canceled sent action will not\r\n * be executed, nor will its event be sent, unless it has already been sent\r\n * (e.g., if `cancel(...)` is called after the `send(...)` action's `delay`).\r\n *\r\n * @param sendId The `id` of the `send(...)` action to cancel.\r\n */var _cancel2=function _cancel2(sendId){return{type:_actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.cancel,sendId:sendId};};/**\r\n * Starts an activity.\r\n *\r\n * @param activity The activity to start.\r\n */function _start2(activity){var activityDef=_toActivityDefinition(activity);return{type:_types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.Start,activity:activityDef,exec:undefined};}/**\r\n * Stops an activity.\r\n *\r\n * @param actorRef The activity to stop.\r\n */function _stop2(actorRef){var activity=(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(actorRef)?actorRef:_toActivityDefinition(actorRef);return{type:_types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.Stop,activity:activity,exec:undefined};}function _resolveStop(action,context,_event){var actorRefOrString=(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(action.activity)?action.activity(context,_event.data):action.activity;var resolvedActorRef=typeof actorRefOrString==='string'?{id:actorRefOrString}:actorRefOrString;var actionObject={type:_types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.Stop,activity:resolvedActorRef};return actionObject;}/**\r\n * Updates the current context of the machine.\r\n *\r\n * @param assignment An object that represents the partial context to update.\r\n */var _assign4=function _assign4(assignment){return{type:_actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.assign,assignment:assignment};};function _isActionObject(action){return _typeof2(action)==='object'&&'type'in action;}/**\r\n * Returns an event type that represents an implicit event that\r\n * is sent after the specified `delay`.\r\n *\r\n * @param delayRef The delay in milliseconds\r\n * @param id The state node ID where this event is handled\r\n */function _after2(delayRef,id){var idSuffix=id?\"#\".concat(id):'';return\"\".concat(_types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.After,\"(\").concat(delayRef,\")\").concat(idSuffix);}/**\r\n * Returns an event that represents that a final state node\r\n * has been reached in the parent state node.\r\n *\r\n * @param id The final state node's parent state node `id`\r\n * @param data The data to pass into the event\r\n */function _done(id,data){var type=\"\".concat(_types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.DoneState,\".\").concat(id);var eventObject={type:type,data:data};eventObject.toString=function(){return type;};return eventObject;}/**\r\n * Returns an event that represents that an invoked service has terminated.\r\n *\r\n * An invoked service is terminated when it has reached a top-level final state node,\r\n * but not when it is canceled.\r\n *\r\n * @param id The final state node ID\r\n * @param data The data to pass into the event\r\n */function _doneInvoke(id,data){var type=\"\".concat(_types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.DoneInvoke,\".\").concat(id);var eventObject={type:type,data:data};eventObject.toString=function(){return type;};return eventObject;}function _error2(id,data){var type=\"\".concat(_types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.ErrorPlatform,\".\").concat(id);var eventObject={type:type,data:data};eventObject.toString=function(){return type;};return eventObject;}function _pure2(getActions){return{type:_types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.Pure,get:getActions};}/**\r\n * Forwards (sends) an event to a specified service.\r\n *\r\n * @param target The target service to forward the event to.\r\n * @param options Options to pass into the send action creator.\r\n */function _forwardTo(target,options){if(!_environment_js__WEBPACK_IMPORTED_MODULE_4__.IS_PRODUCTION&&(!target||typeof target==='function')){var originalTarget_1=target;target=function target(){var args=[];for(var _i=0;_i<arguments.length;_i++){args[_i]=arguments[_i];}var resolvedTarget=typeof originalTarget_1==='function'?originalTarget_1.apply(void 0,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(args),false)):originalTarget_1;if(!resolvedTarget){throw new Error(\"Attempted to forward event to undefined actor. This risks an infinite loop in the sender.\");}return resolvedTarget;};}return _send2(function(_,event){return event;},(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},options),{to:target}));}/**\r\n * Escalates an error by sending it as an event to this machine's parent.\r\n *\r\n * @param errorData The error data to send, or the expression function that\r\n * takes in the `context`, `event`, and `meta`, and returns the error data to send.\r\n * @param options Options to pass into the send action creator.\r\n */function _escalate(errorData,options){return _sendParent(function(context,event,meta){return{type:_actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.error,data:(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(errorData)?errorData(context,event,meta):errorData};},(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},options),{to:_types_js__WEBPACK_IMPORTED_MODULE_3__.SpecialTargets.Parent}));}function _choose2(conds){return{type:_types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.Choose,conds:conds};}var pluckAssigns=function pluckAssigns(actionBlocks){var e_1,_a;var assignActions=[];try{for(var actionBlocks_1=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(actionBlocks),actionBlocks_1_1=actionBlocks_1.next();!actionBlocks_1_1.done;actionBlocks_1_1=actionBlocks_1.next()){var block=actionBlocks_1_1.value;var i=0;while(i<block.actions.length){if(block.actions[i].type===_actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.assign){assignActions.push(block.actions[i]);block.actions.splice(i,1);continue;}i++;}}}catch(e_1_1){e_1={error:e_1_1};}finally{try{if(actionBlocks_1_1&&!actionBlocks_1_1.done&&(_a=actionBlocks_1[\"return\"]))_a.call(actionBlocks_1);}finally{if(e_1)throw e_1.error;}}return assignActions;};function _resolveActions(machine,currentState,currentContext,_event,actionBlocks,predictableExec,preserveActionOrder){if(preserveActionOrder===void 0){preserveActionOrder=false;}var assignActions=preserveActionOrder?[]:pluckAssigns(actionBlocks);var updatedContext=assignActions.length?(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.updateContext)(currentContext,_event,assignActions,currentState):currentContext;var preservedContexts=preserveActionOrder?[currentContext]:undefined;var deferredToBlockEnd=[];function handleAction(blockType,actionObject){var _a;switch(actionObject.type){case _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.raise:{var raisedAction=_resolveRaise(actionObject,updatedContext,_event,machine.options.delays);if(predictableExec&&typeof raisedAction.delay==='number'){predictableExec(raisedAction,updatedContext,_event);}return raisedAction;}case _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.send:var sendAction=_resolveSend(actionObject,updatedContext,_event,machine.options.delays);// TODO: fix ActionTypes.Init\nif(!_environment_js__WEBPACK_IMPORTED_MODULE_4__.IS_PRODUCTION){var configuredDelay=actionObject.delay;// warn after resolving as we can create better contextual message here\n(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.warn)(!(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isString)(configuredDelay)||typeof sendAction.delay==='number',// tslint:disable-next-line:max-line-length\n\"No delay reference for delay expression '\".concat(configuredDelay,\"' was found on machine '\").concat(machine.id,\"'\"));}if(predictableExec&&sendAction.to!==_types_js__WEBPACK_IMPORTED_MODULE_3__.SpecialTargets.Internal){if(blockType==='entry'){deferredToBlockEnd.push(sendAction);}else{predictableExec(sendAction,updatedContext,_event);}}return sendAction;case _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.log:{var resolved=_resolveLog(actionObject,updatedContext,_event);predictableExec===null||predictableExec===void 0?void 0:predictableExec(resolved,updatedContext,_event);return resolved;}case _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.choose:{var chooseAction=actionObject;var matchedActions=(_a=chooseAction.conds.find(function(condition){var guard=(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toGuard)(condition.cond,machine.options.guards);return!guard||(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.evaluateGuard)(machine,guard,updatedContext,_event,!predictableExec?currentState:undefined);}))===null||_a===void 0?void 0:_a.actions;if(!matchedActions){return[];}var _b=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(_resolveActions(machine,currentState,updatedContext,_event,[{type:blockType,actions:_toActionObjects((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toArray)(matchedActions),machine.options.actions)}],predictableExec,preserveActionOrder),2),resolvedActionsFromChoose=_b[0],resolvedContextFromChoose=_b[1];updatedContext=resolvedContextFromChoose;preservedContexts===null||preservedContexts===void 0?void 0:preservedContexts.push(updatedContext);return resolvedActionsFromChoose;}case _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.pure:{var matchedActions=actionObject.get(updatedContext,_event.data);if(!matchedActions){return[];}var _c=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(_resolveActions(machine,currentState,updatedContext,_event,[{type:blockType,actions:_toActionObjects((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toArray)(matchedActions),machine.options.actions)}],predictableExec,preserveActionOrder),2),resolvedActionsFromPure=_c[0],resolvedContext=_c[1];updatedContext=resolvedContext;preservedContexts===null||preservedContexts===void 0?void 0:preservedContexts.push(updatedContext);return resolvedActionsFromPure;}case _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.stop:{var resolved=_resolveStop(actionObject,updatedContext,_event);predictableExec===null||predictableExec===void 0?void 0:predictableExec(resolved,currentContext,_event);return resolved;}case _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.assign:{updatedContext=(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.updateContext)(updatedContext,_event,[actionObject],!predictableExec?currentState:undefined);preservedContexts===null||preservedContexts===void 0?void 0:preservedContexts.push(updatedContext);break;}default:var resolvedActionObject=_toActionObject(actionObject,machine.options.actions);var exec_1=resolvedActionObject.exec;if(predictableExec){predictableExec(resolvedActionObject,updatedContext,_event);}else if(exec_1&&preservedContexts){var contextIndex_1=preservedContexts.length-1;var wrapped=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({},resolvedActionObject),{exec:function exec(_ctx){var args=[];for(var _i=1;_i<arguments.length;_i++){args[_i-1]=arguments[_i];}exec_1.apply(void 0,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([preservedContexts[contextIndex_1]],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(args),false));}});resolvedActionObject=wrapped;}return resolvedActionObject;}}function processBlock(block){var e_2,_a;var resolvedActions=[];try{for(var _b=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(block.actions),_c=_b.next();!_c.done;_c=_b.next()){var action=_c.value;var resolved=handleAction(block.type,action);if(resolved){resolvedActions=resolvedActions.concat(resolved);}}}catch(e_2_1){e_2={error:e_2_1};}finally{try{if(_c&&!_c.done&&(_a=_b[\"return\"]))_a.call(_b);}finally{if(e_2)throw e_2.error;}}deferredToBlockEnd.forEach(function(action){predictableExec(action,updatedContext,_event);});deferredToBlockEnd.length=0;return resolvedActions;}var resolvedActions=(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.flatten)(actionBlocks.map(processBlock));return[resolvedActions,updatedContext];}/***/},/***/\"./node_modules/xstate/es/behaviors.js\":/*!*********************************************!*\\\n  !*** ./node_modules/xstate/es/behaviors.js ***!\n  \\*********************************************/ /***/function node_modulesXstateEsBehaviorsJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */fromPromise:function fromPromise(){return(/* binding */_fromPromise);},/* harmony export */fromReducer:function fromReducer(){return(/* binding */_fromReducer);},/* harmony export */spawnBehavior:function spawnBehavior(){return(/* binding */_spawnBehavior);}/* harmony export */});/* harmony import */var _actions_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./actions.js */\"./node_modules/xstate/es/actions.js\");/* harmony import */var _Actor_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(/*! ./Actor.js */\"./node_modules/xstate/es/Actor.js\");/* harmony import */var _utils_js__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(/*! ./utils.js */\"./node_modules/xstate/es/utils.js\");/**\r\n * Returns an actor behavior from a reducer and its initial state.\r\n *\r\n * @param transition The pure reducer that returns the next state given the current state and event.\r\n * @param initialState The initial state of the reducer.\r\n * @returns An actor behavior\r\n */function _fromReducer(transition,initialState){return{transition:transition,initialState:initialState};}function _fromPromise(promiseFn){var initialState={error:undefined,data:undefined,status:'pending'};return{transition:function transition(state,event,_a){var parent=_a.parent,id=_a.id,observers=_a.observers;switch(event.type){case'fulfill':parent===null||parent===void 0?void 0:parent.send((0,_actions_js__WEBPACK_IMPORTED_MODULE_0__.doneInvoke)(id,event.data));return{error:undefined,data:event.data,status:'fulfilled'};case'reject':parent===null||parent===void 0?void 0:parent.send((0,_actions_js__WEBPACK_IMPORTED_MODULE_0__.error)(id,event.error));observers.forEach(function(observer){observer.error(event.error);});return{error:event.error,data:undefined,status:'rejected'};default:return state;}},initialState:initialState,start:function start(_a){var self=_a.self;promiseFn().then(function(data){self.send({type:'fulfill',data:data});},function(reason){self.send({type:'reject',error:reason});});return initialState;}};}function _spawnBehavior(behavior,options){if(options===void 0){options={};}var state=behavior.initialState;var observers=new Set();var mailbox=[];var flushing=false;var flush=function flush(){if(flushing){return;}flushing=true;while(mailbox.length>0){var event_1=mailbox.shift();state=behavior.transition(state,event_1,actorCtx);observers.forEach(function(observer){return observer.next(state);});}flushing=false;};var actor=(0,_Actor_js__WEBPACK_IMPORTED_MODULE_1__.toActorRef)({id:options.id,send:function send(event){mailbox.push(event);flush();},getSnapshot:function getSnapshot(){return state;},subscribe:function subscribe(next,handleError,complete){var observer=(0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.toObserver)(next,handleError,complete);observers.add(observer);observer.next(state);return{unsubscribe:function unsubscribe(){observers[\"delete\"](observer);}};}});var actorCtx={parent:options.parent,self:actor,id:options.id||'anonymous',observers:observers};state=behavior.start?behavior.start(actorCtx):state;return actor;}/***/},/***/\"./node_modules/xstate/es/constants.js\":/*!*********************************************!*\\\n  !*** ./node_modules/xstate/es/constants.js ***!\n  \\*********************************************/ /***/function node_modulesXstateEsConstantsJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */DEFAULT_GUARD_TYPE:function DEFAULT_GUARD_TYPE(){return(/* binding */_DEFAULT_GUARD_TYPE);},/* harmony export */EMPTY_ACTIVITY_MAP:function EMPTY_ACTIVITY_MAP(){return(/* binding */_EMPTY_ACTIVITY_MAP);},/* harmony export */STATE_DELIMITER:function STATE_DELIMITER(){return(/* binding */_STATE_DELIMITER);},/* harmony export */TARGETLESS_KEY:function TARGETLESS_KEY(){return(/* binding */_TARGETLESS_KEY);}/* harmony export */});var _STATE_DELIMITER='.';var _EMPTY_ACTIVITY_MAP={};var _DEFAULT_GUARD_TYPE='xstate.guard';var _TARGETLESS_KEY='';/***/},/***/\"./node_modules/xstate/es/devTools.js\":/*!********************************************!*\\\n  !*** ./node_modules/xstate/es/devTools.js ***!\n  \\********************************************/ /***/function node_modulesXstateEsDevToolsJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */getGlobal:function getGlobal(){return(/* binding */_getGlobal);},/* harmony export */registerService:function registerService(){return(/* binding */_registerService);}/* harmony export */});/* harmony import */var _environment_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./environment.js */\"./node_modules/xstate/es/environment.js\");function _getGlobal(){if(typeof globalThis!=='undefined'){return globalThis;}if(typeof self!=='undefined'){return self;}if(typeof window!=='undefined'){return window;}if(typeof __webpack_require__.g!=='undefined'){return __webpack_require__.g;}if(!_environment_js__WEBPACK_IMPORTED_MODULE_0__.IS_PRODUCTION){console.warn('XState could not find a global object in this environment. Please let the maintainers know and raise an issue here: https://github.com/statelyai/xstate/issues');}}function getDevTools(){var global=_getGlobal();if(global&&'__xstate__'in global){return global.__xstate__;}return undefined;}function _registerService(service){if(!_getGlobal()){return;}var devTools=getDevTools();if(devTools){devTools.register(service);}}/***/},/***/\"./node_modules/xstate/es/environment.js\":/*!***********************************************!*\\\n  !*** ./node_modules/xstate/es/environment.js ***!\n  \\***********************************************/ /***/function node_modulesXstateEsEnvironmentJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */IS_PRODUCTION:function IS_PRODUCTION(){return(/* binding */_IS_PRODUCTION);}/* harmony export */});var _IS_PRODUCTION=\"development\"==='production';/***/},/***/\"./node_modules/xstate/es/index.js\":/*!*****************************************!*\\\n  !*** ./node_modules/xstate/es/index.js ***!\n  \\*****************************************/ /***/function node_modulesXstateEsIndexJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */ActionTypes:function ActionTypes(){return(/* reexport safe */_types_js__WEBPACK_IMPORTED_MODULE_10__.ActionTypes);},/* harmony export */Interpreter:function Interpreter(){return(/* reexport safe */_interpreter_js__WEBPACK_IMPORTED_MODULE_2__.Interpreter);},/* harmony export */InterpreterStatus:function InterpreterStatus(){return(/* reexport safe */_interpreter_js__WEBPACK_IMPORTED_MODULE_2__.InterpreterStatus);},/* harmony export */Machine:function Machine(){return(/* reexport safe */_Machine_js__WEBPACK_IMPORTED_MODULE_3__.Machine);},/* harmony export */SpecialTargets:function SpecialTargets(){return(/* reexport safe */_types_js__WEBPACK_IMPORTED_MODULE_10__.SpecialTargets);},/* harmony export */State:function State(){return(/* reexport safe */_State_js__WEBPACK_IMPORTED_MODULE_7__.State);},/* harmony export */StateNode:function StateNode(){return(/* reexport safe */_StateNode_js__WEBPACK_IMPORTED_MODULE_8__.StateNode);},/* harmony export */actions:function actions(){return(/* reexport module object */_actions_js__WEBPACK_IMPORTED_MODULE_0__);},/* harmony export */assign:function assign(){return(/* binding */_assign5);},/* harmony export */cancel:function cancel(){return(/* binding */_cancel3);},/* harmony export */choose:function choose(){return(/* binding */_choose3);},/* harmony export */createMachine:function createMachine(){return(/* reexport safe */_Machine_js__WEBPACK_IMPORTED_MODULE_3__.createMachine);},/* harmony export */createSchema:function createSchema(){return(/* reexport safe */_schema_js__WEBPACK_IMPORTED_MODULE_6__.createSchema);},/* harmony export */doneInvoke:function doneInvoke(){return(/* binding */_doneInvoke2);},/* harmony export */forwardTo:function forwardTo(){return(/* binding */_forwardTo2);},/* harmony export */interpret:function interpret(){return(/* reexport safe */_interpreter_js__WEBPACK_IMPORTED_MODULE_2__.interpret);},/* harmony export */log:function log(){return(/* binding */_log3);},/* harmony export */mapState:function mapState(){return(/* reexport safe */_mapState_js__WEBPACK_IMPORTED_MODULE_4__.mapState);},/* harmony export */matchState:function matchState(){return(/* reexport safe */_match_js__WEBPACK_IMPORTED_MODULE_5__.matchState);},/* harmony export */matchesState:function matchesState(){return(/* reexport safe */_utils_js__WEBPACK_IMPORTED_MODULE_11__.matchesState);},/* harmony export */pure:function pure(){return(/* binding */_pure3);},/* harmony export */raise:function raise(){return(/* binding */_raise3);},/* harmony export */send:function send(){return(/* binding */_send3);},/* harmony export */sendParent:function sendParent(){return(/* binding */_sendParent2);},/* harmony export */sendTo:function sendTo(){return(/* binding */_sendTo2);},/* harmony export */sendUpdate:function sendUpdate(){return(/* binding */_sendUpdate2);},/* harmony export */spawn:function spawn(){return(/* reexport safe */_interpreter_js__WEBPACK_IMPORTED_MODULE_2__.spawn);},/* harmony export */spawnBehavior:function spawnBehavior(){return(/* reexport safe */_behaviors_js__WEBPACK_IMPORTED_MODULE_9__.spawnBehavior);},/* harmony export */stop:function stop(){return(/* binding */_stop3);},/* harmony export */t:function t(){return(/* reexport safe */_schema_js__WEBPACK_IMPORTED_MODULE_6__.t);},/* harmony export */toActorRef:function toActorRef(){return(/* reexport safe */_Actor_js__WEBPACK_IMPORTED_MODULE_1__.toActorRef);},/* harmony export */toEventObject:function toEventObject(){return(/* reexport safe */_utils_js__WEBPACK_IMPORTED_MODULE_11__.toEventObject);},/* harmony export */toObserver:function toObserver(){return(/* reexport safe */_utils_js__WEBPACK_IMPORTED_MODULE_11__.toObserver);},/* harmony export */toSCXMLEvent:function toSCXMLEvent(){return(/* reexport safe */_utils_js__WEBPACK_IMPORTED_MODULE_11__.toSCXMLEvent);}/* harmony export */});/* harmony import */var _actions_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./actions.js */\"./node_modules/xstate/es/actions.js\");/* harmony import */var _Actor_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(/*! ./Actor.js */\"./node_modules/xstate/es/Actor.js\");/* harmony import */var _interpreter_js__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(/*! ./interpreter.js */\"./node_modules/xstate/es/interpreter.js\");/* harmony import */var _Machine_js__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(/*! ./Machine.js */\"./node_modules/xstate/es/Machine.js\");/* harmony import */var _mapState_js__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(/*! ./mapState.js */\"./node_modules/xstate/es/mapState.js\");/* harmony import */var _match_js__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(/*! ./match.js */\"./node_modules/xstate/es/match.js\");/* harmony import */var _schema_js__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(/*! ./schema.js */\"./node_modules/xstate/es/schema.js\");/* harmony import */var _State_js__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__(/*! ./State.js */\"./node_modules/xstate/es/State.js\");/* harmony import */var _StateNode_js__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__(/*! ./StateNode.js */\"./node_modules/xstate/es/StateNode.js\");/* harmony import */var _behaviors_js__WEBPACK_IMPORTED_MODULE_9__=__webpack_require__(/*! ./behaviors.js */\"./node_modules/xstate/es/behaviors.js\");/* harmony import */var _types_js__WEBPACK_IMPORTED_MODULE_10__=__webpack_require__(/*! ./types.js */\"./node_modules/xstate/es/types.js\");/* harmony import */var _utils_js__WEBPACK_IMPORTED_MODULE_11__=__webpack_require__(/*! ./utils.js */\"./node_modules/xstate/es/utils.js\");var _assign5=_actions_js__WEBPACK_IMPORTED_MODULE_0__.assign,_cancel3=_actions_js__WEBPACK_IMPORTED_MODULE_0__.cancel,_send3=_actions_js__WEBPACK_IMPORTED_MODULE_0__.send,_sendTo2=_actions_js__WEBPACK_IMPORTED_MODULE_0__.sendTo,_sendParent2=_actions_js__WEBPACK_IMPORTED_MODULE_0__.sendParent,_sendUpdate2=_actions_js__WEBPACK_IMPORTED_MODULE_0__.sendUpdate,_forwardTo2=_actions_js__WEBPACK_IMPORTED_MODULE_0__.forwardTo,_doneInvoke2=_actions_js__WEBPACK_IMPORTED_MODULE_0__.doneInvoke,_raise3=_actions_js__WEBPACK_IMPORTED_MODULE_0__.raise,_log3=_actions_js__WEBPACK_IMPORTED_MODULE_0__.log,_pure3=_actions_js__WEBPACK_IMPORTED_MODULE_0__.pure,_choose3=_actions_js__WEBPACK_IMPORTED_MODULE_0__.choose,_stop3=_actions_js__WEBPACK_IMPORTED_MODULE_0__.stop;/***/},/***/\"./node_modules/xstate/es/interpreter.js\":/*!***********************************************!*\\\n  !*** ./node_modules/xstate/es/interpreter.js ***!\n  \\***********************************************/ /***/function node_modulesXstateEsInterpreterJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */Interpreter:function Interpreter(){return(/* binding */_Interpreter);},/* harmony export */InterpreterStatus:function InterpreterStatus(){return(/* binding */_InterpreterStatus);},/* harmony export */interpret:function interpret(){return(/* binding */_interpret);},/* harmony export */spawn:function spawn(){return(/* binding */_spawn);}/* harmony export */});/* harmony import */var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(/*! ./_virtual/_tslib.js */\"./node_modules/xstate/es/_virtual/_tslib.js\");/* harmony import */var _types_js__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(/*! ./types.js */\"./node_modules/xstate/es/types.js\");/* harmony import */var _State_js__WEBPACK_IMPORTED_MODULE_9__=__webpack_require__(/*! ./State.js */\"./node_modules/xstate/es/State.js\");/* harmony import */var _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(/*! ./actionTypes.js */\"./node_modules/xstate/es/actionTypes.js\");/* harmony import */var _actions_js__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(/*! ./actions.js */\"./node_modules/xstate/es/actions.js\");/* harmony import */var _environment_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(/*! ./environment.js */\"./node_modules/xstate/es/environment.js\");/* harmony import */var _utils_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./utils.js */\"./node_modules/xstate/es/utils.js\");/* harmony import */var _scheduler_js__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__(/*! ./scheduler.js */\"./node_modules/xstate/es/scheduler.js\");/* harmony import */var _Actor_js__WEBPACK_IMPORTED_MODULE_10__=__webpack_require__(/*! ./Actor.js */\"./node_modules/xstate/es/Actor.js\");/* harmony import */var _registry_js__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(/*! ./registry.js */\"./node_modules/xstate/es/registry.js\");/* harmony import */var _devTools_js__WEBPACK_IMPORTED_MODULE_12__=__webpack_require__(/*! ./devTools.js */\"./node_modules/xstate/es/devTools.js\");/* harmony import */var _serviceScope_js__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__(/*! ./serviceScope.js */\"./node_modules/xstate/es/serviceScope.js\");/* harmony import */var _behaviors_js__WEBPACK_IMPORTED_MODULE_11__=__webpack_require__(/*! ./behaviors.js */\"./node_modules/xstate/es/behaviors.js\");var DEFAULT_SPAWN_OPTIONS={sync:false,autoForward:false};var _InterpreterStatus;(function(InterpreterStatus){InterpreterStatus[InterpreterStatus[\"NotStarted\"]=0]=\"NotStarted\";InterpreterStatus[InterpreterStatus[\"Running\"]=1]=\"Running\";InterpreterStatus[InterpreterStatus[\"Stopped\"]=2]=\"Stopped\";})(_InterpreterStatus||(_InterpreterStatus={}));var _Interpreter=/*#__PURE__*/ /** @class */function(){/**\r\n   * Creates a new Interpreter instance (i.e., service) for the given machine with the provided options, if any.\r\n   *\r\n   * @param machine The machine to be interpreted\r\n   * @param options Interpreter options\r\n   */function Interpreter(machine,options){if(options===void 0){options=Interpreter.defaultOptions;}var _this=this;this.machine=machine;this.delayedEventsMap={};this.listeners=new Set();this.contextListeners=new Set();this.stopListeners=new Set();this.doneListeners=new Set();this.eventListeners=new Set();this.sendListeners=new Set();/**\r\n     * Whether the service is started.\r\n     */this.initialized=false;this.status=_InterpreterStatus.NotStarted;this.children=new Map();this.forwardTo=new Set();this._outgoingQueue=[];/**\r\n     * Alias for Interpreter.prototype.start\r\n     */this.init=this.start;/**\r\n     * Sends an event to the running interpreter to trigger a transition.\r\n     *\r\n     * An array of events (batched) can be sent as well, which will send all\r\n     * batched events to the running interpreter. The listeners will be\r\n     * notified only **once** when all events are processed.\r\n     *\r\n     * @param event The event(s) to send\r\n     */this.send=function(event,payload){if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(event)){_this.batch(event);return _this.state;}var _event=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toEventObject)(event,payload));if(_this.status===_InterpreterStatus.Stopped){// do nothing\nif(!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION){(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false,\"Event \\\"\".concat(_event.name,\"\\\" was sent to stopped service \\\"\").concat(_this.machine.id,\"\\\". This service has already reached its final state, and will not transition.\\nEvent: \").concat(JSON.stringify(_event.data)));}return _this.state;}if(_this.status!==_InterpreterStatus.Running&&!_this.options.deferEvents){throw new Error(\"Event \\\"\".concat(_event.name,\"\\\" was sent to uninitialized service \\\"\").concat(_this.machine.id// tslint:disable-next-line:max-line-length\n,\"\\\". Make sure .start() is called for this service, or set { deferEvents: true } in the service options.\\nEvent: \").concat(JSON.stringify(_event.data)));}_this.scheduler.schedule(function(){// Forward copy of event to child actors\n_this.forward(_event);var nextState=_this._nextState(_event);_this.update(nextState,_event);});return _this._state;// TODO: deprecate (should return void)\n// tslint:disable-next-line:semicolon\n};this.sendTo=function(event,to,immediate){var isParent=_this.parent&&(to===_types_js__WEBPACK_IMPORTED_MODULE_2__.SpecialTargets.Parent||_this.parent.id===to);var target=isParent?_this.parent:(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(to)?to===_types_js__WEBPACK_IMPORTED_MODULE_2__.SpecialTargets.Internal?_this:_this.children.get(to)||_registry_js__WEBPACK_IMPORTED_MODULE_3__.registry.get(to):(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isActor)(to)?to:undefined;if(!target){if(!isParent){throw new Error(\"Unable to send event to child '\".concat(to,\"' from service '\").concat(_this.id,\"'.\"));}// tslint:disable-next-line:no-console\nif(!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION){(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false,\"Service '\".concat(_this.id,\"' has no parent: unable to send event \").concat(event.type));}return;}if('machine'in target){// perhaps those events should be rejected in the parent\n// but atm it doesn't have easy access to all of the information that is required to do it reliably\nif(_this.status!==_InterpreterStatus.Stopped||_this.parent!==target||// we need to send events to the parent from exit handlers of a machine that reached its final state\n_this.state.done){// Send SCXML events to machines\nvar scxmlEvent=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({},event),{name:event.name===_actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.error?\"\".concat((0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.error)(_this.id)):event.name,origin:_this.sessionId});if(!immediate&&_this.machine.config.predictableActionArguments){_this._outgoingQueue.push([target,scxmlEvent]);}else{target.send(scxmlEvent);}}}else{// Send normal events to other targets\nif(!immediate&&_this.machine.config.predictableActionArguments){_this._outgoingQueue.push([target,event.data]);}else{target.send(event.data);}}};this._exec=function(action,context,_event,actionFunctionMap){if(actionFunctionMap===void 0){actionFunctionMap=_this.machine.options.actions;}var actionOrExec=action.exec||(0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.getActionFunction)(action.type,actionFunctionMap);var exec=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(actionOrExec)?actionOrExec:actionOrExec?actionOrExec.exec:action.exec;if(exec){try{return exec(context,_event.data,!_this.machine.config.predictableActionArguments?{action:action,state:_this.state,_event:_event}:{action:action,_event:_event});}catch(err){if(_this.parent){_this.parent.send({type:'xstate.error',data:err});}throw err;}}switch(action.type){case _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.raise:{// if raise action reached the interpreter then it's a delayed one\nvar sendAction_1=action;_this.defer(sendAction_1);break;}case _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.send:var sendAction=action;if(typeof sendAction.delay==='number'){_this.defer(sendAction);return;}else{if(sendAction.to){_this.sendTo(sendAction._event,sendAction.to,_event===_actions_js__WEBPACK_IMPORTED_MODULE_6__.initEvent);}else{_this.send(sendAction._event);}}break;case _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.cancel:_this.cancel(action.sendId);break;case _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.start:{if(_this.status!==_InterpreterStatus.Running){return;}var activity=action.activity;// If the activity will be stopped right after it's started\n// (such as in transient states)\n// don't bother starting the activity.\nif(// in v4 with `predictableActionArguments` invokes are called eagerly when the `this.state` still points to the previous state\n!_this.machine.config.predictableActionArguments&&!_this.state.activities[activity.id||activity.type]){break;}// Invoked services\nif(activity.type===_types_js__WEBPACK_IMPORTED_MODULE_2__.ActionTypes.Invoke){var invokeSource=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toInvokeSource)(activity.src);var serviceCreator=_this.machine.options.services?_this.machine.options.services[invokeSource.type]:undefined;var id=activity.id,data=activity.data;if(!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION){(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(!('forward'in activity),// tslint:disable-next-line:max-line-length\n\"`forward` property is deprecated (found in invocation of '\".concat(activity.src,\"' in in machine '\").concat(_this.machine.id,\"'). \")+\"Please use `autoForward` instead.\");}var autoForward='autoForward'in activity?activity.autoForward:!!activity.forward;if(!serviceCreator){// tslint:disable-next-line:no-console\nif(!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION){(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false,\"No service found for invocation '\".concat(activity.src,\"' in machine '\").concat(_this.machine.id,\"'.\"));}return;}var resolvedData=data?(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapContext)(data,context,_event):undefined;if(typeof serviceCreator==='string'){// TODO: warn\nreturn;}var source=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(serviceCreator)?serviceCreator(context,_event.data,{data:resolvedData,src:invokeSource,meta:activity.meta}):serviceCreator;if(!source){// TODO: warn?\nreturn;}var options=void 0;if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(source)){source=resolvedData?source.withContext(resolvedData):source;options={autoForward:autoForward};}_this.spawn(source,id,options);}else{_this.spawnActivity(activity);}break;}case _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.stop:{_this.stopChild(action.activity.id);break;}case _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.log:var _a=action,label=_a.label,value=_a.value;if(label){_this.logger(label,value);}else{_this.logger(value);}break;default:if(!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION){(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false,\"No implementation found for action type '\".concat(action.type,\"'\"));}break;}};var resolvedOptions=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({},Interpreter.defaultOptions),options);var clock=resolvedOptions.clock,logger=resolvedOptions.logger,parent=resolvedOptions.parent,id=resolvedOptions.id;var resolvedId=id!==undefined?id:machine.id;this.id=resolvedId;this.logger=logger;this.clock=clock;this.parent=parent;this.options=resolvedOptions;this.scheduler=new _scheduler_js__WEBPACK_IMPORTED_MODULE_7__.Scheduler({deferEvents:this.options.deferEvents});this.sessionId=_registry_js__WEBPACK_IMPORTED_MODULE_3__.registry.bookId();}Object.defineProperty(Interpreter.prototype,\"initialState\",{get:function get(){var _this=this;if(this._initialState){return this._initialState;}return(0,_serviceScope_js__WEBPACK_IMPORTED_MODULE_8__.provide)(this,function(){_this._initialState=_this.machine.initialState;return _this._initialState;});},enumerable:false,configurable:true});Object.defineProperty(Interpreter.prototype,\"state\",{/**\r\n     * @deprecated Use `.getSnapshot()` instead.\r\n     */get:function get(){if(!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION){(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(this.status!==_InterpreterStatus.NotStarted,\"Attempted to read state from uninitialized service '\".concat(this.id,\"'. Make sure the service is started first.\"));}return this._state;},enumerable:false,configurable:true});/**\r\n   * Executes the actions of the given state, with that state's `context` and `event`.\r\n   *\r\n   * @param state The state whose actions will be executed\r\n   * @param actionsConfig The action implementations to use\r\n   */Interpreter.prototype.execute=function(state,actionsConfig){var e_1,_a;try{for(var _b=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(state.actions),_c=_b.next();!_c.done;_c=_b.next()){var action=_c.value;this.exec(action,state,actionsConfig);}}catch(e_1_1){e_1={error:e_1_1};}finally{try{if(_c&&!_c.done&&(_a=_b[\"return\"]))_a.call(_b);}finally{if(e_1)throw e_1.error;}}};Interpreter.prototype.update=function(state,_event){var e_2,_a,e_3,_b,e_4,_c,e_5,_d;var _this=this;// Attach session ID to state\nstate._sessionid=this.sessionId;// Update state\nthis._state=state;// Execute actions\nif((!this.machine.config.predictableActionArguments||// this is currently required to execute initial actions as the `initialState` gets cached\n// we can't just recompute it (and execute actions while doing so) because we try to preserve identity of actors created within initial assigns\n_event===_actions_js__WEBPACK_IMPORTED_MODULE_6__.initEvent)&&this.options.execute){this.execute(this.state);}else{var item=void 0;while(item=this._outgoingQueue.shift()){item[0].send(item[1]);}}// Update children\nthis.children.forEach(function(child){_this.state.children[child.id]=child;});// Dev tools\nif(this.devTools){this.devTools.send(_event.data,state);}// Execute listeners\nif(state.event){try{for(var _e=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.eventListeners),_f=_e.next();!_f.done;_f=_e.next()){var listener=_f.value;listener(state.event);}}catch(e_2_1){e_2={error:e_2_1};}finally{try{if(_f&&!_f.done&&(_a=_e[\"return\"]))_a.call(_e);}finally{if(e_2)throw e_2.error;}}}try{for(var _g=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.listeners),_h=_g.next();!_h.done;_h=_g.next()){var listener=_h.value;listener(state,state.event);}}catch(e_3_1){e_3={error:e_3_1};}finally{try{if(_h&&!_h.done&&(_b=_g[\"return\"]))_b.call(_g);}finally{if(e_3)throw e_3.error;}}try{for(var _j=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.contextListeners),_k=_j.next();!_k.done;_k=_j.next()){var contextListener=_k.value;contextListener(this.state.context,this.state.history?this.state.history.context:undefined);}}catch(e_4_1){e_4={error:e_4_1};}finally{try{if(_k&&!_k.done&&(_c=_j[\"return\"]))_c.call(_j);}finally{if(e_4)throw e_4.error;}}if(this.state.done){// get final child state node\nvar finalChildStateNode=state.configuration.find(function(sn){return sn.type==='final'&&sn.parent===_this.machine;});var doneData=finalChildStateNode&&finalChildStateNode.doneData?(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapContext)(finalChildStateNode.doneData,state.context,_event):undefined;this._doneEvent=(0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.doneInvoke)(this.id,doneData);try{for(var _l=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.doneListeners),_m=_l.next();!_m.done;_m=_l.next()){var listener=_m.value;listener(this._doneEvent);}}catch(e_5_1){e_5={error:e_5_1};}finally{try{if(_m&&!_m.done&&(_d=_l[\"return\"]))_d.call(_l);}finally{if(e_5)throw e_5.error;}}this._stop();this._stopChildren();_registry_js__WEBPACK_IMPORTED_MODULE_3__.registry.free(this.sessionId);}};/*\r\n   * Adds a listener that is notified whenever a state transition happens. The listener is called with\r\n   * the next state and the event object that caused the state transition.\r\n   *\r\n   * @param listener The state listener\r\n   */Interpreter.prototype.onTransition=function(listener){this.listeners.add(listener);// Send current state to listener\nif(this.status===_InterpreterStatus.Running){listener(this.state,this.state.event);}return this;};Interpreter.prototype.subscribe=function(nextListenerOrObserver,_,// TODO: error listener\ncompleteListener){var _this=this;var observer=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toObserver)(nextListenerOrObserver,_,completeListener);this.listeners.add(observer.next);// Send current state to listener\nif(this.status!==_InterpreterStatus.NotStarted){observer.next(this.state);}var completeOnce=function completeOnce(){_this.doneListeners[\"delete\"](completeOnce);_this.stopListeners[\"delete\"](completeOnce);observer.complete();};if(this.status===_InterpreterStatus.Stopped){observer.complete();}else{this.onDone(completeOnce);this.onStop(completeOnce);}return{unsubscribe:function unsubscribe(){_this.listeners[\"delete\"](observer.next);_this.doneListeners[\"delete\"](completeOnce);_this.stopListeners[\"delete\"](completeOnce);}};};/**\r\n   * Adds an event listener that is notified whenever an event is sent to the running interpreter.\r\n   * @param listener The event listener\r\n   */Interpreter.prototype.onEvent=function(listener){this.eventListeners.add(listener);return this;};/**\r\n   * Adds an event listener that is notified whenever a `send` event occurs.\r\n   * @param listener The event listener\r\n   */Interpreter.prototype.onSend=function(listener){this.sendListeners.add(listener);return this;};/**\r\n   * Adds a context listener that is notified whenever the state context changes.\r\n   * @param listener The context listener\r\n   */Interpreter.prototype.onChange=function(listener){this.contextListeners.add(listener);return this;};/**\r\n   * Adds a listener that is notified when the machine is stopped.\r\n   * @param listener The listener\r\n   */Interpreter.prototype.onStop=function(listener){this.stopListeners.add(listener);return this;};/**\r\n   * Adds a state listener that is notified when the statechart has reached its final state.\r\n   * @param listener The state listener\r\n   */Interpreter.prototype.onDone=function(listener){if(this.status===_InterpreterStatus.Stopped&&this._doneEvent){listener(this._doneEvent);}else{this.doneListeners.add(listener);}return this;};/**\r\n   * Removes a listener.\r\n   * @param listener The listener to remove\r\n   */Interpreter.prototype.off=function(listener){this.listeners[\"delete\"](listener);this.eventListeners[\"delete\"](listener);this.sendListeners[\"delete\"](listener);this.stopListeners[\"delete\"](listener);this.doneListeners[\"delete\"](listener);this.contextListeners[\"delete\"](listener);return this;};/**\r\n   * Starts the interpreter from the given state, or the initial state.\r\n   * @param initialState The state to start the statechart from\r\n   */Interpreter.prototype.start=function(initialState){var _this=this;if(this.status===_InterpreterStatus.Running){// Do not restart the service if it is already started\nreturn this;}// yes, it's a hack but we need the related cache to be populated for some things to work (like delayed transitions)\n// this is usually called by `machine.getInitialState` but if we rehydrate from a state we might bypass this call\n// we also don't want to call this method here as it resolves the full initial state which might involve calling assign actions\n// and that could potentially lead to some unwanted side-effects (even such as creating some rogue actors)\nthis.machine._init();_registry_js__WEBPACK_IMPORTED_MODULE_3__.registry.register(this.sessionId,this);this.initialized=true;this.status=_InterpreterStatus.Running;var resolvedState=initialState===undefined?this.initialState:(0,_serviceScope_js__WEBPACK_IMPORTED_MODULE_8__.provide)(this,function(){return(0,_State_js__WEBPACK_IMPORTED_MODULE_9__.isStateConfig)(initialState)?_this.machine.resolveState(initialState):_this.machine.resolveState(_State_js__WEBPACK_IMPORTED_MODULE_9__.State.from(initialState,_this.machine.context));});if(this.options.devTools){this.attachDev();}this.scheduler.initialize(function(){_this.update(resolvedState,_actions_js__WEBPACK_IMPORTED_MODULE_6__.initEvent);});return this;};Interpreter.prototype._stopChildren=function(){// TODO: think about converting those to actions\nthis.children.forEach(function(child){if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(child.stop)){child.stop();}});this.children.clear();};Interpreter.prototype._stop=function(){var e_6,_a,e_7,_b,e_8,_c,e_9,_d,e_10,_e;try{for(var _f=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.listeners),_g=_f.next();!_g.done;_g=_f.next()){var listener=_g.value;this.listeners[\"delete\"](listener);}}catch(e_6_1){e_6={error:e_6_1};}finally{try{if(_g&&!_g.done&&(_a=_f[\"return\"]))_a.call(_f);}finally{if(e_6)throw e_6.error;}}try{for(var _h=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.stopListeners),_j=_h.next();!_j.done;_j=_h.next()){var listener=_j.value;// call listener, then remove\nlistener();this.stopListeners[\"delete\"](listener);}}catch(e_7_1){e_7={error:e_7_1};}finally{try{if(_j&&!_j.done&&(_b=_h[\"return\"]))_b.call(_h);}finally{if(e_7)throw e_7.error;}}try{for(var _k=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.contextListeners),_l=_k.next();!_l.done;_l=_k.next()){var listener=_l.value;this.contextListeners[\"delete\"](listener);}}catch(e_8_1){e_8={error:e_8_1};}finally{try{if(_l&&!_l.done&&(_c=_k[\"return\"]))_c.call(_k);}finally{if(e_8)throw e_8.error;}}try{for(var _m=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.doneListeners),_o=_m.next();!_o.done;_o=_m.next()){var listener=_o.value;this.doneListeners[\"delete\"](listener);}}catch(e_9_1){e_9={error:e_9_1};}finally{try{if(_o&&!_o.done&&(_d=_m[\"return\"]))_d.call(_m);}finally{if(e_9)throw e_9.error;}}if(!this.initialized){// Interpreter already stopped; do nothing\nreturn this;}this.initialized=false;this.status=_InterpreterStatus.Stopped;this._initialState=undefined;try{// we are going to stop within the current sync frame\n// so we can safely just cancel this here as nothing async should be fired anyway\nfor(var _p=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(Object.keys(this.delayedEventsMap)),_q=_p.next();!_q.done;_q=_p.next()){var key=_q.value;this.clock.clearTimeout(this.delayedEventsMap[key]);}}catch(e_10_1){e_10={error:e_10_1};}finally{try{if(_q&&!_q.done&&(_e=_p[\"return\"]))_e.call(_p);}finally{if(e_10)throw e_10.error;}}// clear everything that might be enqueued\nthis.scheduler.clear();this.scheduler=new _scheduler_js__WEBPACK_IMPORTED_MODULE_7__.Scheduler({deferEvents:this.options.deferEvents});};/**\r\n   * Stops the interpreter and unsubscribe all listeners.\r\n   *\r\n   * This will also notify the `onStop` listeners.\r\n   */Interpreter.prototype.stop=function(){// TODO: add warning for stopping non-root interpreters\nvar _this=this;// grab the current scheduler as it will be replaced in _stop\nvar scheduler=this.scheduler;this._stop();// let what is currently processed to be finished\nscheduler.schedule(function(){// it feels weird to handle this here but we need to handle this even slightly \"out of band\"\nvar _event=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)({type:'xstate.stop'});var nextState=(0,_serviceScope_js__WEBPACK_IMPORTED_MODULE_8__.provide)(_this,function(){var exitActions=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__read)(_this.state.configuration),false).sort(function(a,b){return b.order-a.order;}).map(function(stateNode){return(0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.toActionObjects)(stateNode.onExit,_this.machine.options.actions);}));var _a=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__read)((0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.resolveActions)(_this.machine,_this.state,_this.state.context,_event,[{type:'exit',actions:exitActions}],_this.machine.config.predictableActionArguments?_this._exec:undefined,_this.machine.config.predictableActionArguments||_this.machine.config.preserveActionOrder),2),resolvedActions=_a[0],updatedContext=_a[1];var newState=new _State_js__WEBPACK_IMPORTED_MODULE_9__.State({value:_this.state.value,context:updatedContext,_event:_event,_sessionid:_this.sessionId,historyValue:undefined,history:_this.state,actions:resolvedActions.filter(function(action){return!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isRaisableAction)(action);}),activities:{},events:[],configuration:[],transitions:[],children:{},done:_this.state.done,tags:_this.state.tags,machine:_this.machine});newState.changed=true;return newState;});_this.update(nextState,_event);_this._stopChildren();_registry_js__WEBPACK_IMPORTED_MODULE_3__.registry.free(_this.sessionId);});return this;};Interpreter.prototype.batch=function(events){var _this=this;if(this.status===_InterpreterStatus.NotStarted&&this.options.deferEvents){// tslint:disable-next-line:no-console\nif(!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION){(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false,\"\".concat(events.length,\" event(s) were sent to uninitialized service \\\"\").concat(this.machine.id,\"\\\" and are deferred. Make sure .start() is called for this service.\\nEvent: \").concat(JSON.stringify(event)));}}else if(this.status!==_InterpreterStatus.Running){throw new Error(// tslint:disable-next-line:max-line-length\n\"\".concat(events.length,\" event(s) were sent to uninitialized service \\\"\").concat(this.machine.id,\"\\\". Make sure .start() is called for this service, or set { deferEvents: true } in the service options.\"));}if(!events.length){return;}var exec=!!this.machine.config.predictableActionArguments&&this._exec;this.scheduler.schedule(function(){var e_11,_a;var nextState=_this.state;var batchChanged=false;var batchedActions=[];var _loop_1=function _loop_1(event_1){var _event=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(event_1);_this.forward(_event);nextState=(0,_serviceScope_js__WEBPACK_IMPORTED_MODULE_8__.provide)(_this,function(){return _this.machine.transition(nextState,_event,undefined,exec||undefined);});batchedActions.push.apply(batchedActions,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__read)(_this.machine.config.predictableActionArguments?nextState.actions:nextState.actions.map(function(a){return(0,_State_js__WEBPACK_IMPORTED_MODULE_9__.bindActionToState)(a,nextState);})),false));batchChanged=batchChanged||!!nextState.changed;};try{for(var events_1=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(events),events_1_1=events_1.next();!events_1_1.done;events_1_1=events_1.next()){var event_1=events_1_1.value;_loop_1(event_1);}}catch(e_11_1){e_11={error:e_11_1};}finally{try{if(events_1_1&&!events_1_1.done&&(_a=events_1[\"return\"]))_a.call(events_1);}finally{if(e_11)throw e_11.error;}}nextState.changed=batchChanged;nextState.actions=batchedActions;_this.update(nextState,(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(events[events.length-1]));});};/**\r\n   * Returns a send function bound to this interpreter instance.\r\n   *\r\n   * @param event The event to be sent by the sender.\r\n   */Interpreter.prototype.sender=function(event){return this.send.bind(this,event);};Interpreter.prototype._nextState=function(event,exec){var _this=this;if(exec===void 0){exec=!!this.machine.config.predictableActionArguments&&this._exec;}var _event=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(event);if(_event.name.indexOf(_actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.errorPlatform)===0&&!this.state.nextEvents.some(function(nextEvent){return nextEvent.indexOf(_actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.errorPlatform)===0;})){throw _event.data.data;}var nextState=(0,_serviceScope_js__WEBPACK_IMPORTED_MODULE_8__.provide)(this,function(){return _this.machine.transition(_this.state,_event,undefined,exec||undefined);});return nextState;};/**\r\n   * Returns the next state given the interpreter's current state and the event.\r\n   *\r\n   * This is a pure method that does _not_ update the interpreter's state.\r\n   *\r\n   * @param event The event to determine the next state\r\n   */Interpreter.prototype.nextState=function(event){return this._nextState(event,false);};Interpreter.prototype.forward=function(event){var e_12,_a;try{for(var _b=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.forwardTo),_c=_b.next();!_c.done;_c=_b.next()){var id=_c.value;var child=this.children.get(id);if(!child){throw new Error(\"Unable to forward event '\".concat(event,\"' from interpreter '\").concat(this.id,\"' to nonexistant child '\").concat(id,\"'.\"));}child.send(event);}}catch(e_12_1){e_12={error:e_12_1};}finally{try{if(_c&&!_c.done&&(_a=_b[\"return\"]))_a.call(_b);}finally{if(e_12)throw e_12.error;}}};Interpreter.prototype.defer=function(sendAction){var _this=this;var timerId=this.clock.setTimeout(function(){if('to'in sendAction&&sendAction.to){_this.sendTo(sendAction._event,sendAction.to,true);}else{_this.send(sendAction._event);}},sendAction.delay);if(sendAction.id){this.delayedEventsMap[sendAction.id]=timerId;}};Interpreter.prototype.cancel=function(sendId){this.clock.clearTimeout(this.delayedEventsMap[sendId]);delete this.delayedEventsMap[sendId];};Interpreter.prototype.exec=function(action,state,actionFunctionMap){if(actionFunctionMap===void 0){actionFunctionMap=this.machine.options.actions;}this._exec(action,state.context,state._event,actionFunctionMap);};Interpreter.prototype.removeChild=function(childId){var _a;this.children[\"delete\"](childId);this.forwardTo[\"delete\"](childId);// this.state might not exist at the time this is called,\n// such as when a child is added then removed while initializing the state\n(_a=this.state)===null||_a===void 0?true:delete _a.children[childId];};Interpreter.prototype.stopChild=function(childId){var child=this.children.get(childId);if(!child){return;}this.removeChild(childId);if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(child.stop)){child.stop();}};Interpreter.prototype.spawn=function(entity,name,options){if(this.status!==_InterpreterStatus.Running){return(0,_Actor_js__WEBPACK_IMPORTED_MODULE_10__.createDeferredActor)(entity,name);}if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPromiseLike)(entity)){return this.spawnPromise(Promise.resolve(entity),name);}else if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(entity)){return this.spawnCallback(entity,name);}else if((0,_Actor_js__WEBPACK_IMPORTED_MODULE_10__.isSpawnedActor)(entity)){return this.spawnActor(entity,name);}else if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObservable)(entity)){return this.spawnObservable(entity,name);}else if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(entity)){return this.spawnMachine(entity,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({},options),{id:name}));}else if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isBehavior)(entity)){return this.spawnBehavior(entity,name);}else{throw new Error(\"Unable to spawn entity \\\"\".concat(name,\"\\\" of type \\\"\").concat(_typeof2(entity),\"\\\".\"));}};Interpreter.prototype.spawnMachine=function(machine,options){var _this=this;if(options===void 0){options={};}var childService=new Interpreter(machine,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({},this.options),{parent:this,id:options.id||machine.id}));var resolvedOptions=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({},DEFAULT_SPAWN_OPTIONS),options);if(resolvedOptions.sync){childService.onTransition(function(state){_this.send(_actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.update,{state:state,id:childService.id});});}var actor=childService;this.children.set(childService.id,actor);if(resolvedOptions.autoForward){this.forwardTo.add(childService.id);}childService.onDone(function(doneEvent){_this.removeChild(childService.id);_this.send((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(doneEvent,{origin:childService.id}));}).start();return actor;};Interpreter.prototype.spawnBehavior=function(behavior,id){var actorRef=(0,_behaviors_js__WEBPACK_IMPORTED_MODULE_11__.spawnBehavior)(behavior,{id:id,parent:this});this.children.set(id,actorRef);return actorRef;};Interpreter.prototype.spawnPromise=function(promise,id){var _a;var _this=this;var canceled=false;var resolvedData;promise.then(function(response){if(!canceled){resolvedData=response;_this.removeChild(id);_this.send((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)((0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.doneInvoke)(id,response),{origin:id}));}},function(errorData){if(!canceled){_this.removeChild(id);var errorEvent=(0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.error)(id,errorData);try{// Send \"error.platform.id\" to this (parent).\n_this.send((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(errorEvent,{origin:id}));}catch(error){(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.reportUnhandledExceptionOnInvocation)(errorData,error,id);if(_this.devTools){_this.devTools.send(errorEvent,_this.state);}if(_this.machine.strict){// it would be better to always stop the state machine if unhandled\n// exception/promise rejection happens but because we don't want to\n// break existing code so enforce it on strict mode only especially so\n// because documentation says that onError is optional\n_this.stop();}}}});var actor=(_a={id:id,send:function send(){return void 0;},subscribe:function subscribe(next,handleError,complete){var observer=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toObserver)(next,handleError,complete);var unsubscribed=false;promise.then(function(response){if(unsubscribed){return;}observer.next(response);if(unsubscribed){return;}observer.complete();},function(err){if(unsubscribed){return;}observer.error(err);});return{unsubscribe:function unsubscribe(){return unsubscribed=true;}};},stop:function stop(){canceled=true;},toJSON:function toJSON(){return{id:id};},getSnapshot:function getSnapshot(){return resolvedData;}},_a[_utils_js__WEBPACK_IMPORTED_MODULE_0__.symbolObservable]=function(){return this;},_a);this.children.set(id,actor);return actor;};Interpreter.prototype.spawnCallback=function(callback,id){var _a;var _this=this;var canceled=false;var receivers=new Set();var listeners=new Set();var emitted;var receive=function receive(e){emitted=e;listeners.forEach(function(listener){return listener(e);});if(canceled){return;}_this.send((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(e,{origin:id}));};var callbackStop;try{callbackStop=callback(receive,function(newListener){receivers.add(newListener);});}catch(err){this.send((0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.error)(id,err));}if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPromiseLike)(callbackStop)){// it turned out to be an async function, can't reliably check this before calling `callback`\n// because transpiled async functions are not recognizable\nreturn this.spawnPromise(callbackStop,id);}var actor=(_a={id:id,send:function send(event){return receivers.forEach(function(receiver){return receiver(event);});},subscribe:function subscribe(next){var observer=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toObserver)(next);listeners.add(observer.next);return{unsubscribe:function unsubscribe(){listeners[\"delete\"](observer.next);}};},stop:function stop(){canceled=true;if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(callbackStop)){callbackStop();}},toJSON:function toJSON(){return{id:id};},getSnapshot:function getSnapshot(){return emitted;}},_a[_utils_js__WEBPACK_IMPORTED_MODULE_0__.symbolObservable]=function(){return this;},_a);this.children.set(id,actor);return actor;};Interpreter.prototype.spawnObservable=function(source,id){var _a;var _this=this;var emitted;var subscription=source.subscribe(function(value){emitted=value;_this.send((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(value,{origin:id}));},function(err){_this.removeChild(id);_this.send((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)((0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.error)(id,err),{origin:id}));},function(){_this.removeChild(id);_this.send((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)((0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.doneInvoke)(id),{origin:id}));});var actor=(_a={id:id,send:function send(){return void 0;},subscribe:function subscribe(next,handleError,complete){return source.subscribe(next,handleError,complete);},stop:function stop(){return subscription.unsubscribe();},getSnapshot:function getSnapshot(){return emitted;},toJSON:function toJSON(){return{id:id};}},_a[_utils_js__WEBPACK_IMPORTED_MODULE_0__.symbolObservable]=function(){return this;},_a);this.children.set(id,actor);return actor;};Interpreter.prototype.spawnActor=function(actor,name){this.children.set(name,actor);return actor;};Interpreter.prototype.spawnActivity=function(activity){var implementation=this.machine.options&&this.machine.options.activities?this.machine.options.activities[activity.type]:undefined;if(!implementation){if(!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION){(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false,\"No implementation found for activity '\".concat(activity.type,\"'\"));}// tslint:disable-next-line:no-console\nreturn;}// Start implementation\nvar dispose=implementation(this.state.context,activity);this.spawnEffect(activity.id,dispose);};Interpreter.prototype.spawnEffect=function(id,dispose){var _a;this.children.set(id,(_a={id:id,send:function send(){return void 0;},subscribe:function subscribe(){return{unsubscribe:function unsubscribe(){return void 0;}};},stop:dispose||undefined,getSnapshot:function getSnapshot(){return undefined;},toJSON:function toJSON(){return{id:id};}},_a[_utils_js__WEBPACK_IMPORTED_MODULE_0__.symbolObservable]=function(){return this;},_a));};Interpreter.prototype.attachDev=function(){var global=(0,_devTools_js__WEBPACK_IMPORTED_MODULE_12__.getGlobal)();if(this.options.devTools&&global){if(global.__REDUX_DEVTOOLS_EXTENSION__){var devToolsOptions=_typeof2(this.options.devTools)==='object'?this.options.devTools:undefined;this.devTools=global.__REDUX_DEVTOOLS_EXTENSION__.connect((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({name:this.id,autoPause:true,stateSanitizer:function stateSanitizer(state){return{value:state.value,context:state.context,actions:state.actions};}},devToolsOptions),{features:(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({jump:false,skip:false},devToolsOptions?devToolsOptions.features:undefined)}),this.machine);this.devTools.init(this.state);}// add XState-specific dev tooling hook\n(0,_devTools_js__WEBPACK_IMPORTED_MODULE_12__.registerService)(this);}};Interpreter.prototype.toJSON=function(){return{id:this.id};};Interpreter.prototype[_utils_js__WEBPACK_IMPORTED_MODULE_0__.symbolObservable]=function(){return this;};Interpreter.prototype.getSnapshot=function(){if(this.status===_InterpreterStatus.NotStarted){return this.initialState;}return this._state;};/**\r\n   * The default interpreter options:\r\n   *\r\n   * - `clock` uses the global `setTimeout` and `clearTimeout` functions\r\n   * - `logger` uses the global `console.log()` method\r\n   */Interpreter.defaultOptions={execute:true,deferEvents:true,clock:{setTimeout:function(_setTimeout){function setTimeout(_x,_x2){return _setTimeout.apply(this,arguments);}setTimeout.toString=function(){return _setTimeout.toString();};return setTimeout;}(function(fn,ms){return setTimeout(fn,ms);}),clearTimeout:function(_clearTimeout){function clearTimeout(_x3){return _clearTimeout.apply(this,arguments);}clearTimeout.toString=function(){return _clearTimeout.toString();};return clearTimeout;}(function(id){return clearTimeout(id);})},logger:/*#__PURE__*/console.log.bind(console),devTools:false};Interpreter.interpret=_interpret;return Interpreter;}();var resolveSpawnOptions=function resolveSpawnOptions(nameOrOptions){if((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(nameOrOptions)){return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({},DEFAULT_SPAWN_OPTIONS),{name:nameOrOptions});}return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({},DEFAULT_SPAWN_OPTIONS),{name:(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.uniqueId)()}),nameOrOptions);};function _spawn(entity,nameOrOptions){var resolvedOptions=resolveSpawnOptions(nameOrOptions);return(0,_serviceScope_js__WEBPACK_IMPORTED_MODULE_8__.consume)(function(service){if(!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION){var isLazyEntity=(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(entity)||(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(entity);(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(!!service||isLazyEntity,\"Attempted to spawn an Actor (ID: \\\"\".concat((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(entity)?entity.id:'undefined',\"\\\") outside of a service. This will have no effect.\"));}if(service){return service.spawn(entity,resolvedOptions.name,resolvedOptions);}else{return(0,_Actor_js__WEBPACK_IMPORTED_MODULE_10__.createDeferredActor)(entity,resolvedOptions.name);}});}/**\r\n * Creates a new Interpreter instance for the given machine with the provided options, if any.\r\n *\r\n * @param machine The machine to interpret\r\n * @param options Interpreter options\r\n */function _interpret(machine,options){var interpreter=new _Interpreter(machine,options);return interpreter;}/***/},/***/\"./node_modules/xstate/es/invokeUtils.js\":/*!***********************************************!*\\\n  !*** ./node_modules/xstate/es/invokeUtils.js ***!\n  \\***********************************************/ /***/function node_modulesXstateEsInvokeUtilsJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */toInvokeDefinition:function toInvokeDefinition(){return(/* binding */_toInvokeDefinition);},/* harmony export */toInvokeSource:function toInvokeSource(){return(/* binding */_toInvokeSource);}/* harmony export */});/* harmony import */var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./_virtual/_tslib.js */\"./node_modules/xstate/es/_virtual/_tslib.js\");/* harmony import */var _actionTypes_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(/*! ./actionTypes.js */\"./node_modules/xstate/es/actionTypes.js\");function _toInvokeSource(src){if(typeof src==='string'){var simpleSrc={type:src};simpleSrc.toString=function(){return src;};// v4 compat - TODO: remove in v5\nreturn simpleSrc;}return src;}function _toInvokeDefinition(invokeConfig){return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__assign)({type:_actionTypes_js__WEBPACK_IMPORTED_MODULE_1__.invoke},invokeConfig),{toJSON:function toJSON(){invokeConfig.onDone;invokeConfig.onError;var invokeDef=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__rest)(invokeConfig,[\"onDone\",\"onError\"]);return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__assign)({},invokeDef),{type:_actionTypes_js__WEBPACK_IMPORTED_MODULE_1__.invoke,src:_toInvokeSource(invokeConfig.src)});}});}/***/},/***/\"./node_modules/xstate/es/mapState.js\":/*!********************************************!*\\\n  !*** ./node_modules/xstate/es/mapState.js ***!\n  \\********************************************/ /***/function node_modulesXstateEsMapStateJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */mapState:function mapState(){return(/* binding */_mapState);}/* harmony export */});/* harmony import */var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./_virtual/_tslib.js */\"./node_modules/xstate/es/_virtual/_tslib.js\");/* harmony import */var _utils_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(/*! ./utils.js */\"./node_modules/xstate/es/utils.js\");function _mapState(stateMap,stateId){var e_1,_a;var foundStateId;try{for(var _b=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__values)(Object.keys(stateMap)),_c=_b.next();!_c.done;_c=_b.next()){var mappedStateId=_c.value;if((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.matchesState)(mappedStateId,stateId)&&(!foundStateId||stateId.length>foundStateId.length)){foundStateId=mappedStateId;}}}catch(e_1_1){e_1={error:e_1_1};}finally{try{if(_c&&!_c.done&&(_a=_b[\"return\"]))_a.call(_b);}finally{if(e_1)throw e_1.error;}}return stateMap[foundStateId];}/***/},/***/\"./node_modules/xstate/es/match.js\":/*!*****************************************!*\\\n  !*** ./node_modules/xstate/es/match.js ***!\n  \\*****************************************/ /***/function node_modulesXstateEsMatchJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */matchState:function matchState(){return(/* binding */_matchState);}/* harmony export */});/* harmony import */var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(/*! ./_virtual/_tslib.js */\"./node_modules/xstate/es/_virtual/_tslib.js\");/* harmony import */var _State_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./State.js */\"./node_modules/xstate/es/State.js\");function _matchState(state,patterns,defaultValue){var e_1,_a;var resolvedState=_State_js__WEBPACK_IMPORTED_MODULE_0__.State.from(state,state instanceof _State_js__WEBPACK_IMPORTED_MODULE_0__.State?state.context:undefined);try{for(var patterns_1=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(patterns),patterns_1_1=patterns_1.next();!patterns_1_1.done;patterns_1_1=patterns_1.next()){var _b=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__read)(patterns_1_1.value,2),stateValue=_b[0],getValue=_b[1];if(resolvedState.matches(stateValue)){return getValue(resolvedState);}}}catch(e_1_1){e_1={error:e_1_1};}finally{try{if(patterns_1_1&&!patterns_1_1.done&&(_a=patterns_1[\"return\"]))_a.call(patterns_1);}finally{if(e_1)throw e_1.error;}}return defaultValue(resolvedState);}/***/},/***/\"./node_modules/xstate/es/registry.js\":/*!********************************************!*\\\n  !*** ./node_modules/xstate/es/registry.js ***!\n  \\********************************************/ /***/function node_modulesXstateEsRegistryJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */registry:function registry(){return(/* binding */_registry);}/* harmony export */});var children=/*#__PURE__*/new Map();var sessionIdIndex=0;var _registry={bookId:function bookId(){return\"x:\".concat(sessionIdIndex++);},register:function register(id,actor){children.set(id,actor);return id;},get:function get(id){return children.get(id);},free:function free(id){children[\"delete\"](id);}};/***/},/***/\"./node_modules/xstate/es/scheduler.js\":/*!*********************************************!*\\\n  !*** ./node_modules/xstate/es/scheduler.js ***!\n  \\*********************************************/ /***/function node_modulesXstateEsSchedulerJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */Scheduler:function Scheduler(){return(/* binding */_Scheduler);}/* harmony export */});/* harmony import */var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./_virtual/_tslib.js */\"./node_modules/xstate/es/_virtual/_tslib.js\");var defaultOptions={deferEvents:false};var _Scheduler=/*#__PURE__*/ /** @class */function(){function Scheduler(options){this.processingEvent=false;this.queue=[];this.initialized=false;this.options=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__assign)({},defaultOptions),options);}Scheduler.prototype.initialize=function(callback){this.initialized=true;if(callback){if(!this.options.deferEvents){this.schedule(callback);return;}this.process(callback);}this.flushEvents();};Scheduler.prototype.schedule=function(task){if(!this.initialized||this.processingEvent){this.queue.push(task);return;}if(this.queue.length!==0){throw new Error('Event queue should be empty when it is not processing events');}this.process(task);this.flushEvents();};Scheduler.prototype.clear=function(){this.queue=[];};Scheduler.prototype.flushEvents=function(){var nextCallback=this.queue.shift();while(nextCallback){this.process(nextCallback);nextCallback=this.queue.shift();}};Scheduler.prototype.process=function(callback){this.processingEvent=true;try{callback();}catch(e){// there is no use to keep the future events\n// as the situation is not anymore the same\nthis.clear();throw e;}finally{this.processingEvent=false;}};return Scheduler;}();/***/},/***/\"./node_modules/xstate/es/schema.js\":/*!******************************************!*\\\n  !*** ./node_modules/xstate/es/schema.js ***!\n  \\******************************************/ /***/function node_modulesXstateEsSchemaJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */createSchema:function createSchema(){return(/* binding */_createSchema);},/* harmony export */t:function t(){return(/* binding */_t);}/* harmony export */});function _createSchema(schema){return schema;}var _t=_createSchema;/***/},/***/\"./node_modules/xstate/es/serviceScope.js\":/*!************************************************!*\\\n  !*** ./node_modules/xstate/es/serviceScope.js ***!\n  \\************************************************/ /***/function node_modulesXstateEsServiceScopeJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */consume:function consume(){return(/* binding */_consume);},/* harmony export */provide:function provide(){return(/* binding */_provide);}/* harmony export */});/**\r\n * Maintains a stack of the current service in scope.\r\n * This is used to provide the correct service to spawn().\r\n */var serviceStack=[];var _provide=function _provide(service,fn){serviceStack.push(service);var result=fn(service);serviceStack.pop();return result;};var _consume=function _consume(fn){return fn(serviceStack[serviceStack.length-1]);};/***/},/***/\"./node_modules/xstate/es/stateUtils.js\":/*!**********************************************!*\\\n  !*** ./node_modules/xstate/es/stateUtils.js ***!\n  \\**********************************************/ /***/function node_modulesXstateEsStateUtilsJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */getAdjList:function getAdjList(){return(/* binding */_getAdjList);},/* harmony export */getAllChildren:function getAllChildren(){return(/* binding */_getAllChildren);},/* harmony export */getAllStateNodes:function getAllStateNodes(){return(/* binding */_getAllStateNodes);},/* harmony export */getChildren:function getChildren(){return(/* binding */_getChildren);},/* harmony export */getConfiguration:function getConfiguration(){return(/* binding */_getConfiguration);},/* harmony export */getMeta:function getMeta(){return(/* binding */_getMeta);},/* harmony export */getTagsFromConfiguration:function getTagsFromConfiguration(){return(/* binding */_getTagsFromConfiguration);},/* harmony export */getValue:function getValue(){return(/* binding */_getValue);},/* harmony export */has:function has(){return(/* binding */_has);},/* harmony export */isInFinalState:function isInFinalState(){return(/* binding */_isInFinalState);},/* harmony export */isLeafNode:function isLeafNode(){return(/* binding */_isLeafNode);},/* harmony export */nextEvents:function nextEvents(){return(/* binding */_nextEvents);}/* harmony export */});/* harmony import */var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(/*! ./_virtual/_tslib.js */\"./node_modules/xstate/es/_virtual/_tslib.js\");/* harmony import */var _utils_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./utils.js */\"./node_modules/xstate/es/utils.js\");var _isLeafNode=function _isLeafNode(stateNode){return stateNode.type==='atomic'||stateNode.type==='final';};function _getAllChildren(stateNode){return Object.keys(stateNode.states).map(function(key){return stateNode.states[key];});}function _getChildren(stateNode){return _getAllChildren(stateNode).filter(function(sn){return sn.type!=='history';});}function _getAllStateNodes(stateNode){var stateNodes=[stateNode];if(_isLeafNode(stateNode)){return stateNodes;}return stateNodes.concat((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(_getChildren(stateNode).map(_getAllStateNodes)));}function _getConfiguration(prevStateNodes,stateNodes){var e_1,_a,e_2,_b,e_3,_c,e_4,_d;var prevConfiguration=new Set(prevStateNodes);var prevAdjList=_getAdjList(prevConfiguration);var configuration=new Set(stateNodes);try{// add all ancestors\nfor(var configuration_1=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(configuration),configuration_1_1=configuration_1.next();!configuration_1_1.done;configuration_1_1=configuration_1.next()){var s=configuration_1_1.value;var m=s.parent;while(m&&!configuration.has(m)){configuration.add(m);m=m.parent;}}}catch(e_1_1){e_1={error:e_1_1};}finally{try{if(configuration_1_1&&!configuration_1_1.done&&(_a=configuration_1[\"return\"]))_a.call(configuration_1);}finally{if(e_1)throw e_1.error;}}var adjList=_getAdjList(configuration);try{// add descendants\nfor(var configuration_2=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(configuration),configuration_2_1=configuration_2.next();!configuration_2_1.done;configuration_2_1=configuration_2.next()){var s=configuration_2_1.value;// if previously active, add existing child nodes\nif(s.type==='compound'&&(!adjList.get(s)||!adjList.get(s).length)){if(prevAdjList.get(s)){prevAdjList.get(s).forEach(function(sn){return configuration.add(sn);});}else{s.initialStateNodes.forEach(function(sn){return configuration.add(sn);});}}else{if(s.type==='parallel'){try{for(var _e=(e_3=void 0,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(_getChildren(s))),_f=_e.next();!_f.done;_f=_e.next()){var child=_f.value;if(!configuration.has(child)){configuration.add(child);if(prevAdjList.get(child)){prevAdjList.get(child).forEach(function(sn){return configuration.add(sn);});}else{child.initialStateNodes.forEach(function(sn){return configuration.add(sn);});}}}}catch(e_3_1){e_3={error:e_3_1};}finally{try{if(_f&&!_f.done&&(_c=_e[\"return\"]))_c.call(_e);}finally{if(e_3)throw e_3.error;}}}}}}catch(e_2_1){e_2={error:e_2_1};}finally{try{if(configuration_2_1&&!configuration_2_1.done&&(_b=configuration_2[\"return\"]))_b.call(configuration_2);}finally{if(e_2)throw e_2.error;}}try{// add all ancestors\nfor(var configuration_3=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(configuration),configuration_3_1=configuration_3.next();!configuration_3_1.done;configuration_3_1=configuration_3.next()){var s=configuration_3_1.value;var m=s.parent;while(m&&!configuration.has(m)){configuration.add(m);m=m.parent;}}}catch(e_4_1){e_4={error:e_4_1};}finally{try{if(configuration_3_1&&!configuration_3_1.done&&(_d=configuration_3[\"return\"]))_d.call(configuration_3);}finally{if(e_4)throw e_4.error;}}return configuration;}function getValueFromAdj(baseNode,adjList){var childStateNodes=adjList.get(baseNode);if(!childStateNodes){return{};// todo: fix?\n}if(baseNode.type==='compound'){var childStateNode=childStateNodes[0];if(childStateNode){if(_isLeafNode(childStateNode)){return childStateNode.key;}}else{return{};}}var stateValue={};childStateNodes.forEach(function(csn){stateValue[csn.key]=getValueFromAdj(csn,adjList);});return stateValue;}function _getAdjList(configuration){var e_5,_a;var adjList=new Map();try{for(var configuration_4=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(configuration),configuration_4_1=configuration_4.next();!configuration_4_1.done;configuration_4_1=configuration_4.next()){var s=configuration_4_1.value;if(!adjList.has(s)){adjList.set(s,[]);}if(s.parent){if(!adjList.has(s.parent)){adjList.set(s.parent,[]);}adjList.get(s.parent).push(s);}}}catch(e_5_1){e_5={error:e_5_1};}finally{try{if(configuration_4_1&&!configuration_4_1.done&&(_a=configuration_4[\"return\"]))_a.call(configuration_4);}finally{if(e_5)throw e_5.error;}}return adjList;}function _getValue(rootNode,configuration){var config=_getConfiguration([rootNode],configuration);return getValueFromAdj(rootNode,_getAdjList(config));}function _has(iterable,item){if(Array.isArray(iterable)){return iterable.some(function(member){return member===item;});}if(iterable instanceof Set){return iterable.has(item);}return false;// TODO: fix\n}function _nextEvents(configuration){return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__read)(new Set((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__read)(configuration.map(function(sn){return sn.ownEvents;})),false)))),false);}function _isInFinalState(configuration,stateNode){if(stateNode.type==='compound'){return _getChildren(stateNode).some(function(s){return s.type==='final'&&_has(configuration,s);});}if(stateNode.type==='parallel'){return _getChildren(stateNode).every(function(sn){return _isInFinalState(configuration,sn);});}return false;}function _getMeta(configuration){if(configuration===void 0){configuration=[];}return configuration.reduce(function(acc,stateNode){if(stateNode.meta!==undefined){acc[stateNode.id]=stateNode.meta;}return acc;},{});}function _getTagsFromConfiguration(configuration){return new Set((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(configuration.map(function(sn){return sn.tags;})));}/***/},/***/\"./node_modules/xstate/es/types.js\":/*!*****************************************!*\\\n  !*** ./node_modules/xstate/es/types.js ***!\n  \\*****************************************/ /***/function node_modulesXstateEsTypesJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */ActionTypes:function ActionTypes(){return(/* binding */_ActionTypes);},/* harmony export */SpecialTargets:function SpecialTargets(){return(/* binding */_SpecialTargets);}/* harmony export */});var _ActionTypes;(function(ActionTypes){ActionTypes[\"Start\"]=\"xstate.start\";ActionTypes[\"Stop\"]=\"xstate.stop\";ActionTypes[\"Raise\"]=\"xstate.raise\";ActionTypes[\"Send\"]=\"xstate.send\";ActionTypes[\"Cancel\"]=\"xstate.cancel\";ActionTypes[\"NullEvent\"]=\"\";ActionTypes[\"Assign\"]=\"xstate.assign\";ActionTypes[\"After\"]=\"xstate.after\";ActionTypes[\"DoneState\"]=\"done.state\";ActionTypes[\"DoneInvoke\"]=\"done.invoke\";ActionTypes[\"Log\"]=\"xstate.log\";ActionTypes[\"Init\"]=\"xstate.init\";ActionTypes[\"Invoke\"]=\"xstate.invoke\";ActionTypes[\"ErrorExecution\"]=\"error.execution\";ActionTypes[\"ErrorCommunication\"]=\"error.communication\";ActionTypes[\"ErrorPlatform\"]=\"error.platform\";ActionTypes[\"ErrorCustom\"]=\"xstate.error\";ActionTypes[\"Update\"]=\"xstate.update\";ActionTypes[\"Pure\"]=\"xstate.pure\";ActionTypes[\"Choose\"]=\"xstate.choose\";})(_ActionTypes||(_ActionTypes={}));var _SpecialTargets;(function(SpecialTargets){SpecialTargets[\"Parent\"]=\"#_parent\";SpecialTargets[\"Internal\"]=\"#_internal\";})(_SpecialTargets||(_SpecialTargets={}));/***/},/***/\"./node_modules/xstate/es/utils.js\":/*!*****************************************!*\\\n  !*** ./node_modules/xstate/es/utils.js ***!\n  \\*****************************************/ /***/function node_modulesXstateEsUtilsJs(__unused_webpack_module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);/* harmony export */__webpack_require__.d(__webpack_exports__,{/* harmony export */createInvokeId:function createInvokeId(){return(/* binding */_createInvokeId);},/* harmony export */evaluateGuard:function evaluateGuard(){return(/* binding */_evaluateGuard);},/* harmony export */flatten:function flatten(){return(/* binding */_flatten);},/* harmony export */getActionType:function getActionType(){return(/* binding */_getActionType);},/* harmony export */getEventType:function getEventType(){return(/* binding */_getEventType);},/* harmony export */interopSymbols:function interopSymbols(){return(/* binding */_interopSymbols);},/* harmony export */isActor:function isActor(){return(/* binding */_isActor2);},/* harmony export */isArray:function isArray(){return(/* binding */_isArray);},/* harmony export */isBehavior:function isBehavior(){return(/* binding */_isBehavior);},/* harmony export */isBuiltInEvent:function isBuiltInEvent(){return(/* binding */_isBuiltInEvent);},/* harmony export */isFunction:function isFunction(){return(/* binding */_isFunction);},/* harmony export */isMachine:function isMachine(){return(/* binding */_isMachine);},/* harmony export */isObservable:function isObservable(){return(/* binding */_isObservable);},/* harmony export */isPromiseLike:function isPromiseLike(){return(/* binding */_isPromiseLike);},/* harmony export */isRaisableAction:function isRaisableAction(){return(/* binding */_isRaisableAction);},/* harmony export */isStateLike:function isStateLike(){return(/* binding */_isStateLike);},/* harmony export */isString:function isString(){return(/* binding */_isString);},/* harmony export */keys:function keys(){return(/* binding */_keys);},/* harmony export */mapContext:function mapContext(){return(/* binding */_mapContext);},/* harmony export */mapFilterValues:function mapFilterValues(){return(/* binding */_mapFilterValues);},/* harmony export */mapValues:function mapValues(){return(/* binding */_mapValues);},/* harmony export */matchesState:function matchesState(){return(/* binding */_matchesState);},/* harmony export */nestedPath:function nestedPath(){return(/* binding */_nestedPath);},/* harmony export */normalizeTarget:function normalizeTarget(){return(/* binding */_normalizeTarget);},/* harmony export */partition:function partition(){return(/* binding */_partition);},/* harmony export */path:function path(){return(/* binding */_path);},/* harmony export */pathToStateValue:function pathToStateValue(){return(/* binding */_pathToStateValue);},/* harmony export */pathsToStateValue:function pathsToStateValue(){return(/* binding */_pathsToStateValue);},/* harmony export */reportUnhandledExceptionOnInvocation:function reportUnhandledExceptionOnInvocation(){return(/* binding */_reportUnhandledExceptionOnInvocation);},/* harmony export */symbolObservable:function symbolObservable(){return(/* binding */_symbolObservable);},/* harmony export */toArray:function toArray(){return(/* binding */_toArray);},/* harmony export */toArrayStrict:function toArrayStrict(){return(/* binding */_toArrayStrict);},/* harmony export */toEventObject:function toEventObject(){return(/* binding */_toEventObject);},/* harmony export */toGuard:function toGuard(){return(/* binding */_toGuard);},/* harmony export */toInvokeSource:function toInvokeSource(){return(/* binding */_toInvokeSource2);},/* harmony export */toObserver:function toObserver(){return(/* binding */_toObserver);},/* harmony export */toSCXMLEvent:function toSCXMLEvent(){return(/* binding */_toSCXMLEvent);},/* harmony export */toStatePath:function toStatePath(){return(/* binding */_toStatePath);},/* harmony export */toStatePaths:function toStatePaths(){return(/* binding */_toStatePaths);},/* harmony export */toStateValue:function toStateValue(){return(/* binding */_toStateValue);},/* harmony export */toTransitionConfigArray:function toTransitionConfigArray(){return(/* binding */_toTransitionConfigArray);},/* harmony export */uniqueId:function uniqueId(){return(/* binding */_uniqueId);},/* harmony export */updateContext:function updateContext(){return(/* binding */_updateContext);},/* harmony export */updateHistoryStates:function updateHistoryStates(){return(/* binding */_updateHistoryStates);},/* harmony export */updateHistoryValue:function updateHistoryValue(){return(/* binding */_updateHistoryValue);},/* harmony export */warn:function warn(){return(/* binding */_warn);}/* harmony export */});/* harmony import */var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(/*! ./_virtual/_tslib.js */\"./node_modules/xstate/es/_virtual/_tslib.js\");/* harmony import */var _types_js__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(/*! ./types.js */\"./node_modules/xstate/es/types.js\");/* harmony import */var _actionTypes_js__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(/*! ./actionTypes.js */\"./node_modules/xstate/es/actionTypes.js\");/* harmony import */var _constants_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(/*! ./constants.js */\"./node_modules/xstate/es/constants.js\");/* harmony import */var _environment_js__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(/*! ./environment.js */\"./node_modules/xstate/es/environment.js\");var _a;function _keys(value){return Object.keys(value);}function _matchesState(parentStateId,childStateId,delimiter){if(delimiter===void 0){delimiter=_constants_js__WEBPACK_IMPORTED_MODULE_0__.STATE_DELIMITER;}var parentStateValue=_toStateValue(parentStateId,delimiter);var childStateValue=_toStateValue(childStateId,delimiter);if(_isString(childStateValue)){if(_isString(parentStateValue)){return childStateValue===parentStateValue;}// Parent more specific than child\nreturn false;}if(_isString(parentStateValue)){return parentStateValue in childStateValue;}return Object.keys(parentStateValue).every(function(key){if(!(key in childStateValue)){return false;}return _matchesState(parentStateValue[key],childStateValue[key]);});}function _getEventType(event){try{return _isString(event)||typeof event==='number'?\"\".concat(event):event.type;}catch(e){throw new Error('Events must be strings or objects with a string event.type property.');}}function _getActionType(action){try{return _isString(action)||typeof action==='number'?\"\".concat(action):_isFunction(action)?action.name:action.type;}catch(e){throw new Error('Actions must be strings or objects with a string action.type property.');}}function _toStatePath(stateId,delimiter){try{if(_isArray(stateId)){return stateId;}return stateId.toString().split(delimiter);}catch(e){throw new Error(\"'\".concat(stateId,\"' is not a valid state path.\"));}}function _isStateLike(state){return _typeof2(state)==='object'&&'value'in state&&'context'in state&&'event'in state&&'_event'in state;}function _toStateValue(stateValue,delimiter){if(_isStateLike(stateValue)){return stateValue.value;}if(_isArray(stateValue)){return _pathToStateValue(stateValue);}if(typeof stateValue!=='string'){return stateValue;}var statePath=_toStatePath(stateValue,delimiter);return _pathToStateValue(statePath);}function _pathToStateValue(statePath){if(statePath.length===1){return statePath[0];}var value={};var marker=value;for(var i=0;i<statePath.length-1;i++){if(i===statePath.length-2){marker[statePath[i]]=statePath[i+1];}else{marker[statePath[i]]={};marker=marker[statePath[i]];}}return value;}function _mapValues(collection,iteratee){var result={};var collectionKeys=Object.keys(collection);for(var i=0;i<collectionKeys.length;i++){var key=collectionKeys[i];result[key]=iteratee(collection[key],key,collection,i);}return result;}function _mapFilterValues(collection,iteratee,predicate){var e_1,_a;var result={};try{for(var _b=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(Object.keys(collection)),_c=_b.next();!_c.done;_c=_b.next()){var key=_c.value;var item=collection[key];if(!predicate(item)){continue;}result[key]=iteratee(item,key,collection);}}catch(e_1_1){e_1={error:e_1_1};}finally{try{if(_c&&!_c.done&&(_a=_b[\"return\"]))_a.call(_b);}finally{if(e_1)throw e_1.error;}}return result;}/**\r\n * Retrieves a value at the given path.\r\n * @param props The deep path to the prop of the desired value\r\n */var _path=function _path(props){return function(object){var e_2,_a;var result=object;try{for(var props_1=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(props),props_1_1=props_1.next();!props_1_1.done;props_1_1=props_1.next()){var prop=props_1_1.value;result=result[prop];}}catch(e_2_1){e_2={error:e_2_1};}finally{try{if(props_1_1&&!props_1_1.done&&(_a=props_1[\"return\"]))_a.call(props_1);}finally{if(e_2)throw e_2.error;}}return result;};};/**\r\n * Retrieves a value at the given path via the nested accessor prop.\r\n * @param props The deep path to the prop of the desired value\r\n */function _nestedPath(props,accessorProp){return function(object){var e_3,_a;var result=object;try{for(var props_2=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(props),props_2_1=props_2.next();!props_2_1.done;props_2_1=props_2.next()){var prop=props_2_1.value;result=result[accessorProp][prop];}}catch(e_3_1){e_3={error:e_3_1};}finally{try{if(props_2_1&&!props_2_1.done&&(_a=props_2[\"return\"]))_a.call(props_2);}finally{if(e_3)throw e_3.error;}}return result;};}function _toStatePaths(stateValue){if(!stateValue){return[[]];}if(_isString(stateValue)){return[[stateValue]];}var result=_flatten(Object.keys(stateValue).map(function(key){var subStateValue=stateValue[key];if(typeof subStateValue!=='string'&&(!subStateValue||!Object.keys(subStateValue).length)){return[[key]];}return _toStatePaths(stateValue[key]).map(function(subPath){return[key].concat(subPath);});}));return result;}function _pathsToStateValue(paths){var e_4,_a;var result={};if(paths&&paths.length===1&&paths[0].length===1){return paths[0][0];}try{for(var paths_1=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(paths),paths_1_1=paths_1.next();!paths_1_1.done;paths_1_1=paths_1.next()){var currentPath=paths_1_1.value;var marker=result;// tslint:disable-next-line:prefer-for-of\nfor(var i=0;i<currentPath.length;i++){var subPath=currentPath[i];if(i===currentPath.length-2){marker[subPath]=currentPath[i+1];break;}marker[subPath]=marker[subPath]||{};marker=marker[subPath];}}}catch(e_4_1){e_4={error:e_4_1};}finally{try{if(paths_1_1&&!paths_1_1.done&&(_a=paths_1[\"return\"]))_a.call(paths_1);}finally{if(e_4)throw e_4.error;}}return result;}function _flatten(array){var _a;return(_a=[]).concat.apply(_a,(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__spreadArray)([],(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__read)(array),false));}function _toArrayStrict(value){if(_isArray(value)){return value;}return[value];}function _toArray(value){if(value===undefined){return[];}return _toArrayStrict(value);}function _mapContext(mapper,context,_event){var e_5,_a;if(_isFunction(mapper)){return mapper(context,_event.data);}var result={};try{for(var _b=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(Object.keys(mapper)),_c=_b.next();!_c.done;_c=_b.next()){var key=_c.value;var subMapper=mapper[key];if(_isFunction(subMapper)){result[key]=subMapper(context,_event.data);}else{result[key]=subMapper;}}}catch(e_5_1){e_5={error:e_5_1};}finally{try{if(_c&&!_c.done&&(_a=_b[\"return\"]))_a.call(_b);}finally{if(e_5)throw e_5.error;}}return result;}function _isBuiltInEvent(eventType){return /^(done|error)\\./.test(eventType);}function _isPromiseLike(value){if(value instanceof Promise){return true;}// Check if shape matches the Promise/A+ specification for a \"thenable\".\nif(value!==null&&(_isFunction(value)||_typeof2(value)==='object')&&_isFunction(value.then)){return true;}return false;}function _isBehavior(value){return value!==null&&_typeof2(value)==='object'&&'transition'in value&&typeof value.transition==='function';}function _partition(items,predicate){var e_6,_a;var _b=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__read)([[],[]],2),truthy=_b[0],falsy=_b[1];try{for(var items_1=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(items),items_1_1=items_1.next();!items_1_1.done;items_1_1=items_1.next()){var item=items_1_1.value;if(predicate(item)){truthy.push(item);}else{falsy.push(item);}}}catch(e_6_1){e_6={error:e_6_1};}finally{try{if(items_1_1&&!items_1_1.done&&(_a=items_1[\"return\"]))_a.call(items_1);}finally{if(e_6)throw e_6.error;}}return[truthy,falsy];}function _updateHistoryStates(hist,stateValue){return _mapValues(hist.states,function(subHist,key){if(!subHist){return undefined;}var subStateValue=(_isString(stateValue)?undefined:stateValue[key])||(subHist?subHist.current:undefined);if(!subStateValue){return undefined;}return{current:subStateValue,states:_updateHistoryStates(subHist,subStateValue)};});}function _updateHistoryValue(hist,stateValue){return{current:stateValue,states:_updateHistoryStates(hist,stateValue)};}function _updateContext(context,_event,assignActions,state){if(!_environment_js__WEBPACK_IMPORTED_MODULE_2__.IS_PRODUCTION){_warn(!!context,'Attempting to update undefined context');}var updatedContext=context?assignActions.reduce(function(acc,assignAction){var e_7,_a;var assignment=assignAction.assignment;var meta={state:state,action:assignAction,_event:_event};var partialUpdate={};if(_isFunction(assignment)){partialUpdate=assignment(acc,_event.data,meta);}else{try{for(var _b=(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(Object.keys(assignment)),_c=_b.next();!_c.done;_c=_b.next()){var key=_c.value;var propAssignment=assignment[key];partialUpdate[key]=_isFunction(propAssignment)?propAssignment(acc,_event.data,meta):propAssignment;}}catch(e_7_1){e_7={error:e_7_1};}finally{try{if(_c&&!_c.done&&(_a=_b[\"return\"]))_a.call(_b);}finally{if(e_7)throw e_7.error;}}}return Object.assign({},acc,partialUpdate);},context):context;return updatedContext;}// tslint:disable-next-line:no-empty\nvar _warn=function _warn(){};if(!_environment_js__WEBPACK_IMPORTED_MODULE_2__.IS_PRODUCTION){_warn=function _warn(condition,message){var error=condition instanceof Error?condition:undefined;if(!error&&condition){return;}if(console!==undefined){var args=[\"Warning: \".concat(message)];if(error){args.push(error);}// tslint:disable-next-line:no-console\nconsole.warn.apply(console,args);}};}function _isArray(value){return Array.isArray(value);}// tslint:disable-next-line:ban-types\nfunction _isFunction(value){return typeof value==='function';}function _isString(value){return typeof value==='string';}function _toGuard(condition,guardMap){if(!condition){return undefined;}if(_isString(condition)){return{type:_constants_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_GUARD_TYPE,name:condition,predicate:guardMap?guardMap[condition]:undefined};}if(_isFunction(condition)){return{type:_constants_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_GUARD_TYPE,name:condition.name,predicate:condition};}return condition;}function _isObservable(value){try{return'subscribe'in value&&_isFunction(value.subscribe);}catch(e){return false;}}var _symbolObservable=/*#__PURE__*/function(){return typeof Symbol==='function'&&Symbol.observable||'@@observable';}();// TODO: to be removed in v5, left it out just to minimize the scope of the change and maintain compatibility with older versions of integration paackages\nvar _interopSymbols=(_a={},_a[_symbolObservable]=function(){return this;},_a[Symbol.observable]=function(){return this;},_a);function _isMachine(value){return!!value&&'__xstatenode'in value;}function _isActor2(value){return!!value&&typeof value.send==='function';}var _uniqueId=/*#__PURE__*/function(){var currentId=0;return function(){currentId++;return currentId.toString(16);};}();function _toEventObject(event,payload// id?: TEvent['type']\n){if(_isString(event)||typeof event==='number'){return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)({type:event},payload);}return event;}function _toSCXMLEvent(event,scxmlEvent){if(!_isString(event)&&'$$type'in event&&event.$$type==='scxml'){return event;}var eventObject=_toEventObject(event);return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)({name:eventObject.type,data:eventObject,$$type:'scxml',type:'external'},scxmlEvent);}function _toTransitionConfigArray(event,configLike){var transitions=_toArrayStrict(configLike).map(function(transitionLike){if(typeof transitionLike==='undefined'||typeof transitionLike==='string'||_isMachine(transitionLike)){return{target:transitionLike,event:event};}return(0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)({},transitionLike),{event:event});});return transitions;}function _normalizeTarget(target){if(target===undefined||target===_constants_js__WEBPACK_IMPORTED_MODULE_0__.TARGETLESS_KEY){return undefined;}return _toArray(target);}function _reportUnhandledExceptionOnInvocation(originalError,currentError,id){if(!_environment_js__WEBPACK_IMPORTED_MODULE_2__.IS_PRODUCTION){var originalStackTrace=originalError.stack?\" Stacktrace was '\".concat(originalError.stack,\"'\"):'';if(originalError===currentError){// tslint:disable-next-line:no-console\nconsole.error(\"Missing onError handler for invocation '\".concat(id,\"', error was '\").concat(originalError,\"'.\").concat(originalStackTrace));}else{var stackTrace=currentError.stack?\" Stacktrace was '\".concat(currentError.stack,\"'\"):'';// tslint:disable-next-line:no-console\nconsole.error(\"Missing onError handler and/or unhandled exception/promise rejection for invocation '\".concat(id,\"'. \")+\"Original error: '\".concat(originalError,\"'. \").concat(originalStackTrace,\" Current error is '\").concat(currentError,\"'.\").concat(stackTrace));}}}function _evaluateGuard(machine,guard,context,_event,state){var guards=machine.options.guards;var guardMeta={state:state,cond:guard,_event:_event};// TODO: do not hardcode!\nif(guard.type===_constants_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_GUARD_TYPE){return((guards===null||guards===void 0?void 0:guards[guard.name])||guard.predicate)(context,_event.data,guardMeta);}var condFn=guards===null||guards===void 0?void 0:guards[guard.type];if(!condFn){throw new Error(\"Guard '\".concat(guard.type,\"' is not implemented on machine '\").concat(machine.id,\"'.\"));}return condFn(context,_event.data,guardMeta);}function _toInvokeSource2(src){if(typeof src==='string'){return{type:src};}return src;}function _toObserver(nextHandler,errorHandler,completionHandler){var noop=function noop(){};var isObserver=_typeof2(nextHandler)==='object';var self=isObserver?nextHandler:null;return{next:((isObserver?nextHandler.next:nextHandler)||noop).bind(self),error:((isObserver?nextHandler.error:errorHandler)||noop).bind(self),complete:((isObserver?nextHandler.complete:completionHandler)||noop).bind(self)};}function _createInvokeId(stateNodeId,index){return\"\".concat(stateNodeId,\":invocation[\").concat(index,\"]\");}function _isRaisableAction(action){return(action.type===_actionTypes_js__WEBPACK_IMPORTED_MODULE_3__.raise||action.type===_actionTypes_js__WEBPACK_IMPORTED_MODULE_3__.send&&action.to===_types_js__WEBPACK_IMPORTED_MODULE_4__.SpecialTargets.Internal)&&typeof action.delay!=='number';}/***/}/******/};/************************************************************************/ /******/ // The module cache\n/******/var __webpack_module_cache__={};/******/ /******/ // The require function\n/******/function __webpack_require__(moduleId){/******/ // Check if module is in cache\n/******/var cachedModule=__webpack_module_cache__[moduleId];/******/if(cachedModule!==undefined){/******/return cachedModule.exports;/******/}/******/ // Create a new module (and put it into the cache)\n/******/var module=__webpack_module_cache__[moduleId]={/******/ // no module.id needed\n/******/ // no module.loaded needed\n/******/exports:{}/******/};/******/ /******/ // Execute the module function\n/******/__webpack_modules__[moduleId](module,module.exports,__webpack_require__);/******/ /******/ // Return the exports of the module\n/******/return module.exports;/******/}/******/ /************************************************************************/ /******/ /* webpack/runtime/define property getters */ /******/(function(){/******/ // define getter functions for harmony exports\n/******/__webpack_require__.d=function(exports,definition){/******/for(var key in definition){/******/if(__webpack_require__.o(definition,key)&&!__webpack_require__.o(exports,key)){/******/Object.defineProperty(exports,key,{enumerable:true,get:definition[key]});/******/}/******/}/******/};/******/})();/******/ /******/ /* webpack/runtime/global */ /******/(function(){/******/__webpack_require__.g=function(){/******/if((typeof globalThis===\"undefined\"?\"undefined\":_typeof2(globalThis))==='object')return globalThis;/******/try{/******/return this||new Function('return this')();/******/}catch(e){/******/if((typeof window===\"undefined\"?\"undefined\":_typeof2(window))==='object')return window;/******/}/******/}();/******/})();/******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/(function(){/******/__webpack_require__.o=function(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop);};/******/})();/******/ /******/ /* webpack/runtime/make namespace object */ /******/(function(){/******/ // define __esModule on exports\n/******/__webpack_require__.r=function(exports){/******/if(typeof Symbol!=='undefined'&&Symbol.toStringTag){/******/Object.defineProperty(exports,Symbol.toStringTag,{value:'Module'});/******/}/******/Object.defineProperty(exports,'__esModule',{value:true});/******/};/******/})();/******/ /************************************************************************/var __webpack_exports__={};// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.\n(function(){/*!****************************!*\\\n  !*** ./src/AudioModule.js ***!\n  \\****************************/function _typeof(obj){\"@babel/helpers - typeof\";return _typeof=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(obj){return typeof obj;}:function(obj){return obj&&\"function\"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?\"symbol\":typeof obj;},_typeof(obj);}function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);enumerableOnly&&(symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable;})),keys.push.apply(keys,symbols);}return keys;}function _objectSpread(target){for(var i=1;i<arguments.length;i++){var source=null!=arguments[i]?arguments[i]:{};i%2?ownKeys(Object(source),!0).forEach(function(key){_defineProperty(target,key,source[key]);}):Object.getOwnPropertyDescriptors?Object.defineProperties(target,Object.getOwnPropertyDescriptors(source)):ownKeys(Object(source)).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key));});}return target;}function _defineProperty(obj,key,value){key=_toPropertyKey(key);if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}function _toPropertyKey(arg){var key=_toPrimitive(arg,\"string\");return _typeof(key)===\"symbol\"?key:String(key);}function _toPrimitive(input,hint){if(_typeof(input)!==\"object\"||input===null)return input;var prim=input[Symbol.toPrimitive];if(prim!==undefined){var res=prim.call(input,hint||\"default\");if(_typeof(res)!==\"object\")return res;throw new TypeError(\"@@toPrimitive must return a primitive value.\");}return(hint===\"string\"?String:Number)(input);}// import state machines for audio input and output\nvar _require=__webpack_require__(/*! xstate */\"./node_modules/xstate/es/index.js\"),interpret=_require.interpret;var _require2=__webpack_require__(/*! ./state-machines/AudioInputMachine */\"./src/state-machines/AudioInputMachine.js\"),audioInputMachine=_require2.audioInputMachine;var _require3=__webpack_require__(/*! ./state-machines/AudioOutputMachine */\"./src/state-machines/AudioOutputMachine.js\"),audioOutputMachine=_require3.audioOutputMachine;var _require4=__webpack_require__(/*! ./LoggingModule */\"./src/LoggingModule.js\"),serializeStateValue=_require4.serializeStateValue;// depends on the injecting script (saypi.index.js) declaring the EventBus as a global variable\nvar EventBus=window.EventBus;// audio output (Pi)\nvar audioElement=document.querySelector(\"audio\");if(!audioElement){console.error(\"Audio element not found!\");}else{audioElement.preload=\"auto\";// enable aggressive preloading of audio\n}var audioOutputActor=interpret(audioOutputMachine).onTransition(function(state){if(state.changed){var fromState=state.history?serializeStateValue(state.history.value):\"N/A\";var toState=serializeStateValue(state.value);console.log(\"Audio Output Machine transitioned from \".concat(fromState,\" to \").concat(toState,\" with \").concat(state.event.type));console.log(state.context);}}).start();function registerAudioPlaybackEvents(audio,actor){var events=[\"loadstart\",\"loadedmetadata\",\"canplaythrough\",\"play\",\"pause\",\"ended\",\"seeked\",\"emptied\"];events.forEach(function(event){audio.addEventListener(event,function(){return actor.send(event);});});audio.addEventListener(\"playing\",function(){actor.send(\"play\");});}registerAudioPlaybackEvents(audioElement,audioOutputActor);// audio input (user)\nvar audioInputActor=interpret(audioInputMachine).start();/* These events are used to control/pass requests to the audio module from other modules */function registerAudioCommands(){// audio input (recording) commands\nEventBus.on(\"audio:setupRecording\",function(e){audioInputActor.send(\"acquire\");});EventBus.on(\"audio:tearDownRecording\",function(e){audioInputActor.send(\"release\");});EventBus.on(\"audio:startRecording\",function(e){// Check if Pi is currently speaking and stop her audio\naudioOutputActor.send(\"pause\");// Check if the MediaRecorder is acquired before starting?\naudioInputActor.send([\"acquire\",\"start\"]);});EventBus.on(\"audio:stopRecording\",function(e){audioInputActor.send(\"stopRequested\");/* resume or cancel Pi's audio */ /* TODO: reassess how to handle interruptions\n    audioOutputActor.send(\"play\"); // resume Pi's audio\n    audioOutputActor.send(\"stop\"); // cancel Pi's audio\n    */});// audio input (recording) events (pass MediaRecorder events -> audio input machine actor)\nEventBus.on(\"audio:dataavailable\",function(detail){audioInputActor.send(_objectSpread({type:\"dataAvailable\"},detail));});EventBus.on(\"audio:input:stop\",function(e){audioInputActor.send(\"stop\");});// audio output (playback) commands\nEventBus.on(\"audio:reload\",function(e){audioOutputActor.send(\"reload\");});}registerAudioCommands();})();/******/})();");

/***/ }),

/***/ "./src/icons/exit.svg":
/*!****************************!*\
  !*** ./src/icons/exit.svg ***!
  \****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg id=\"Layer_1\" data-name=\"Layer 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64.06 64.33\">\n  <defs>\n    <style>\n      .cls-1 {\n        fill: #24381b;\n      }\n\n      .cls-1, .cls-2 {\n        stroke-width: 0px;\n      }\n\n      .cls-2 {\n        fill: #dfd7c2;\n      }\n    </style>\n  </defs>\n  <path class=\"cls-2\" d=\"m31.71,64.32C14.77,64.46-.44,49.93,0,31.33.41,14.47,14.29-.32,32.7,0c16.91.3,31.8,14.32,31.36,33.14-.39,16.76-14.49,31.55-32.34,31.18Zm10.67-23.19c.06-.7-.41-1.12-.84-1.55-2-2-3.94-4.07-6.02-5.97-1.14-1.04-1.32-1.68-.06-2.82,2.13-1.93,4.07-4.08,6.1-6.12.78-.79,1.31-1.64.34-2.56-.92-.87-1.72-.28-2.43.45-2.17,2.21-4.39,4.39-6.52,6.65-.72.77-1.16.7-1.84-.02-2.06-2.17-4.19-4.28-6.29-6.41-.76-.77-1.59-1.68-2.66-.63-1.14,1.12-.19,1.98.62,2.79,2.07,2.09,4.09,4.22,6.2,6.26.77.75.82,1.2.02,1.97-2.21,2.1-4.33,4.3-6.49,6.45-.79.78-1.3,1.65-.32,2.56.92.85,1.71.26,2.43-.47,2.11-2.12,4.28-4.19,6.33-6.38.88-.94,1.37-.86,2.21.03,2.13,2.26,4.37,4.41,6.57,6.6.51.51,1.09.78,1.8.48.56-.24.85-.68.87-1.3Z\"/>\n  <path class=\"cls-1\" d=\"m42.47,41.27c-.02.62-.32,1.06-.87,1.3-.71.31-1.29.03-1.8-.48-2.2-2.2-4.44-4.35-6.57-6.6-.84-.89-1.33-.96-2.21-.03-2.04,2.19-4.22,4.25-6.33,6.38-.72.72-1.51,1.32-2.43.47-.98-.91-.47-1.78.32-2.56,2.16-2.15,4.28-4.35,6.49-6.45.81-.77.76-1.22-.02-1.97-2.11-2.04-4.13-4.17-6.2-6.26-.8-.81-1.75-1.67-.62-2.79,1.07-1.05,1.9-.14,2.66.63,2.1,2.13,4.23,4.24,6.29,6.41.69.73,1.12.79,1.84.02,2.13-2.26,4.35-4.43,6.52-6.65.72-.73,1.51-1.31,2.43-.45.97.92.44,1.78-.34,2.56-2.03,2.04-3.97,4.19-6.1,6.12-1.25,1.14-1.08,1.78.06,2.82,2.09,1.91,4.02,3.97,6.02,5.97.43.43.9.85.84,1.55Z\"/>\n</svg>");

/***/ }),

/***/ "./src/icons/maximize.svg":
/*!********************************!*\
  !*** ./src/icons/maximize.svg ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" zoomAndPan=\"magnify\" viewBox=\"0 0 768 767.999994\" preserveAspectRatio=\"xMidYMid meet\" version=\"1.0\"><path fill=\"#e4d8c1\" d=\"M 768.132812 379.535156 C 768.132812 169.089844 597.523438 -1.496094 387.050781 -1.496094 C 176.609375 -1.496094 5.996094 169.089844 5.996094 379.535156 C 5.996094 589.949219 176.609375 760.539062 387.050781 760.539062 C 597.523438 760.539062 768.132812 589.949219 768.132812 379.535156 \" fill-opacity=\"1\" fill-rule=\"nonzero\"/><path fill=\"#776d6d\" d=\"M 538.996094 223.152344 L 306.535156 229.855469 L 538.996094 455.695312 Z M 538.996094 223.152344 \" fill-opacity=\"1\" fill-rule=\"nonzero\"/><path fill=\"#776d6d\" d=\"M 235.105469 535.890625 L 467.597656 529.1875 L 235.105469 303.34375 Z M 235.105469 535.890625 \" fill-opacity=\"1\" fill-rule=\"nonzero\"/></svg>");

/***/ }),

/***/ "./src/icons/muted_microphone.svg":
/*!****************************************!*\
  !*** ./src/icons/muted_microphone.svg ***!
  \****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"500\" zoomAndPan=\"magnify\" viewBox=\"0 0 375 374.999991\" height=\"500\" preserveAspectRatio=\"xMidYMid meet\" version=\"1.0\"><path fill=\"#776d6d\" d=\"M 239.722656 126.441406 L 239.722656 122.300781 C 239.722656 93.507812 216.296875 70.078125 187.5 70.078125 C 158.703125 70.078125 135.277344 93.507812 135.277344 122.300781 L 135.277344 187.953125 C 135.277344 199.988281 139.410156 211.050781 146.273438 219.890625 Z M 239.722656 126.441406 \" fill-opacity=\"1\" fill-rule=\"nonzero\"/><path fill=\"#776d6d\" d=\"M 155.046875 228.792969 C 163.964844 235.898438 175.234375 240.175781 187.5 240.175781 C 216.296875 240.175781 239.722656 216.75 239.722656 187.953125 L 239.722656 144.113281 Z M 155.046875 228.792969 \" fill-opacity=\"1\" fill-rule=\"nonzero\"/><path fill=\"#776d6d\" d=\"M 187.5 0 C 83.945312 0 0 83.945312 0 187.5 C 0 291.054688 83.945312 375 187.5 375 C 291.054688 375 375 291.054688 375 187.5 C 375 83.945312 291.054688 0 187.5 0 Z M 287.484375 96.355469 L 254.640625 129.195312 L 254.640625 187.953125 C 254.640625 224.976562 224.523438 255.097656 187.5 255.097656 C 171.117188 255.097656 156.105469 249.183594 144.4375 239.402344 L 138.109375 245.730469 C 151.417969 257.121094 168.652344 264.046875 187.5 264.046875 C 229.457031 264.046875 263.59375 229.914062 263.59375 187.953125 C 263.59375 183.832031 266.933594 180.496094 271.054688 180.496094 C 275.175781 180.496094 278.515625 183.835938 278.515625 187.953125 C 278.515625 235.625 241.667969 274.828125 194.960938 278.640625 L 194.960938 304.921875 L 220.121094 304.921875 C 224.242188 304.921875 227.582031 308.261719 227.582031 312.382812 C 227.582031 316.5 224.242188 319.839844 220.121094 319.839844 L 154.875 319.839844 C 150.757812 319.839844 147.417969 316.5 147.417969 312.382812 C 147.417969 308.261719 150.757812 304.921875 154.875 304.921875 L 180.039062 304.921875 L 180.039062 278.636719 C 160.007812 277.003906 141.816406 268.824219 127.542969 256.296875 L 96.351562 287.484375 C 95.132812 288.703125 93.53125 289.316406 91.933594 289.316406 C 90.335938 289.316406 88.734375 288.703125 87.515625 287.484375 C 85.074219 285.042969 85.074219 281.085938 87.515625 278.644531 L 118.761719 247.398438 C 104.929688 231.4375 96.484375 210.6875 96.484375 187.953125 C 96.484375 183.832031 99.824219 180.496094 103.941406 180.496094 C 108.0625 180.496094 111.402344 183.835938 111.402344 187.953125 C 111.402344 206.574219 118.148438 223.628906 129.292969 236.867188 L 135.628906 230.53125 C 126.089844 218.9375 120.355469 204.105469 120.355469 187.953125 L 120.355469 122.300781 C 120.355469 85.28125 150.476562 55.160156 187.496094 55.160156 C 221.128906 55.160156 248.980469 80.039062 253.816406 112.34375 L 278.640625 87.515625 C 281.082031 85.078125 285.039062 85.078125 287.480469 87.515625 C 289.925781 89.957031 289.925781 93.914062 287.484375 96.355469 Z M 287.484375 96.355469 \" fill-opacity=\"1\" fill-rule=\"nonzero\"/></svg>");

/***/ }),

/***/ "./src/icons/play.svg":
/*!****************************!*\
  !*** ./src/icons/play.svg ***!
  \****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n    zoomAndPan=\"magnify\" viewBox=\"0 0 375 374.999991\"\n    preserveAspectRatio=\"xMidYMid meet\" version=\"1.0\">\n    <defs>\n        <filter x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\" id=\"ee10b8e1b3\">\n            <feColorMatrix values=\"0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0\"\n                color-interpolation-filters=\"sRGB\" />\n        </filter>\n        <mask id=\"e7d148bedc\">\n            <g filter=\"url(#ee10b8e1b3)\">\n                <rect x=\"-37.5\" width=\"450\" fill=\"#000000\" y=\"-37.499999\" height=\"449.999989\"\n                    fill-opacity=\"0.55\" />\n            </g>\n        </mask>\n        <clipPath id=\"9ca5135f77\">\n            <rect x=\"0\" width=\"375\" y=\"0\" height=\"375\" />\n        </clipPath>\n    </defs>\n    <g mask=\"url(#e7d148bedc)\">\n        <g transform=\"matrix(1, 0, 0, 1, 0, 0)\">\n            <g clip-path=\"url(#9ca5135f77)\">\n                <path fill=\"#418a2f\"\n                    d=\"M 375 187.5 C 375 190.570312 374.925781 193.636719 374.773438 196.699219 C 374.625 199.765625 374.398438 202.824219 374.097656 205.878906 C 373.796875 208.933594 373.421875 211.976562 372.96875 215.011719 C 372.519531 218.046875 371.996094 221.070312 371.398438 224.078125 C 370.796875 227.089844 370.125 230.082031 369.382812 233.058594 C 368.636719 236.035156 367.816406 238.992188 366.925781 241.929688 C 366.035156 244.863281 365.074219 247.777344 364.039062 250.667969 C 363.003906 253.554688 361.902344 256.417969 360.726562 259.253906 C 359.554688 262.089844 358.308594 264.894531 356.996094 267.667969 C 355.6875 270.441406 354.308594 273.179688 352.859375 275.886719 C 351.414062 278.59375 349.902344 281.261719 348.324219 283.894531 C 346.746094 286.527344 345.105469 289.117188 343.402344 291.667969 C 341.695312 294.222656 339.929688 296.730469 338.101562 299.195312 C 336.273438 301.660156 334.386719 304.078125 332.441406 306.449219 C 330.492188 308.820312 328.488281 311.144531 326.429688 313.417969 C 324.367188 315.691406 322.253906 317.914062 320.082031 320.082031 C 317.914062 322.253906 315.691406 324.367188 313.417969 326.429688 C 311.144531 328.488281 308.820312 330.492188 306.449219 332.441406 C 304.078125 334.386719 301.660156 336.273438 299.195312 338.101562 C 296.730469 339.929688 294.222656 341.695312 291.667969 343.402344 C 289.117188 345.105469 286.527344 346.746094 283.894531 348.324219 C 281.261719 349.902344 278.59375 351.414062 275.886719 352.859375 C 273.179688 354.308594 270.441406 355.6875 267.667969 356.996094 C 264.890625 358.308594 262.089844 359.554688 259.253906 360.726562 C 256.417969 361.902344 253.554688 363.003906 250.667969 364.039062 C 247.777344 365.074219 244.863281 366.035156 241.929688 366.925781 C 238.992188 367.816406 236.035156 368.636719 233.058594 369.378906 C 230.082031 370.125 227.089844 370.796875 224.078125 371.398438 C 221.070312 371.996094 218.046875 372.519531 215.011719 372.96875 C 211.976562 373.421875 208.933594 373.796875 205.878906 374.097656 C 202.824219 374.398438 199.765625 374.625 196.699219 374.773438 C 193.636719 374.925781 190.570312 375 187.5 375 C 184.429688 375 181.363281 374.925781 178.300781 374.773438 C 175.234375 374.625 172.175781 374.398438 169.121094 374.097656 C 166.066406 373.796875 163.023438 373.421875 159.988281 372.96875 C 156.953125 372.519531 153.929688 371.996094 150.921875 371.398438 C 147.910156 370.796875 144.917969 370.125 141.941406 369.378906 C 138.964844 368.636719 136.007812 367.816406 133.070312 366.925781 C 130.136719 366.035156 127.222656 365.074219 124.332031 364.039062 C 121.445312 363.003906 118.582031 361.902344 115.746094 360.726562 C 112.910156 359.554688 110.105469 358.308594 107.332031 356.996094 C 104.558594 355.6875 101.820312 354.308594 99.113281 352.859375 C 96.40625 351.414062 93.738281 349.902344 91.105469 348.324219 C 88.472656 346.746094 85.882812 345.105469 83.332031 343.402344 C 80.777344 341.695312 78.269531 339.929688 75.804688 338.101562 C 73.339844 336.273438 70.921875 334.386719 68.550781 332.4375 C 66.179688 330.492188 63.855469 328.488281 61.582031 326.429688 C 59.308594 324.367188 57.085938 322.253906 54.917969 320.082031 C 52.746094 317.914062 50.632812 315.691406 48.570312 313.417969 C 46.511719 311.144531 44.507812 308.820312 42.5625 306.449219 C 40.613281 304.078125 38.726562 301.660156 36.898438 299.195312 C 35.070312 296.730469 33.304688 294.222656 31.597656 291.667969 C 29.894531 289.117188 28.253906 286.527344 26.675781 283.894531 C 25.097656 281.261719 23.585938 278.59375 22.140625 275.886719 C 20.691406 273.179688 19.3125 270.441406 18.003906 267.667969 C 16.691406 264.894531 15.445312 262.089844 14.273438 259.253906 C 13.097656 256.417969 11.996094 253.554688 10.960938 250.667969 C 9.925781 247.777344 8.964844 244.863281 8.074219 241.929688 C 7.183594 238.992188 6.363281 236.035156 5.617188 233.058594 C 4.875 230.082031 4.203125 227.089844 3.601562 224.078125 C 3.003906 221.070312 2.480469 218.046875 2.03125 215.011719 C 1.578125 211.976562 1.203125 208.933594 0.902344 205.878906 C 0.601562 202.824219 0.375 199.765625 0.226562 196.699219 C 0.0742188 193.636719 0 190.570312 0 187.5 C 0 184.429688 0.0742188 181.363281 0.226562 178.300781 C 0.375 175.234375 0.601562 172.175781 0.902344 169.121094 C 1.203125 166.066406 1.578125 163.023438 2.03125 159.988281 C 2.480469 156.953125 3.003906 153.929688 3.601562 150.921875 C 4.203125 147.910156 4.875 144.917969 5.617188 141.941406 C 6.363281 138.964844 7.183594 136.007812 8.074219 133.070312 C 8.964844 130.136719 9.925781 127.222656 10.960938 124.332031 C 11.996094 121.445312 13.097656 118.582031 14.273438 115.746094 C 15.445312 112.910156 16.691406 110.105469 18.003906 107.332031 C 19.3125 104.558594 20.691406 101.820312 22.140625 99.113281 C 23.585938 96.40625 25.097656 93.738281 26.675781 91.105469 C 28.253906 88.472656 29.894531 85.882812 31.597656 83.332031 C 33.304688 80.777344 35.070312 78.269531 36.898438 75.804688 C 38.726562 73.339844 40.613281 70.921875 42.5625 68.550781 C 44.507812 66.179688 46.511719 63.855469 48.570312 61.582031 C 50.632812 59.308594 52.746094 57.085938 54.917969 54.917969 C 57.085938 52.746094 59.308594 50.632812 61.582031 48.570312 C 63.855469 46.511719 66.179688 44.507812 68.550781 42.558594 C 70.921875 40.613281 73.339844 38.726562 75.804688 36.898438 C 78.269531 35.070312 80.777344 33.304688 83.332031 31.597656 C 85.882812 29.894531 88.472656 28.253906 91.105469 26.675781 C 93.738281 25.097656 96.40625 23.585938 99.113281 22.140625 C 101.820312 20.691406 104.558594 19.3125 107.332031 18.003906 C 110.105469 16.691406 112.910156 15.445312 115.746094 14.273438 C 118.582031 13.097656 121.445312 11.996094 124.332031 10.960938 C 127.222656 9.925781 130.136719 8.964844 133.070312 8.074219 C 136.007812 7.183594 138.964844 6.363281 141.941406 5.621094 C 144.917969 4.875 147.910156 4.203125 150.921875 3.601562 C 153.929688 3.003906 156.953125 2.480469 159.988281 2.03125 C 163.023438 1.578125 166.066406 1.203125 169.121094 0.902344 C 172.175781 0.601562 175.234375 0.375 178.300781 0.226562 C 181.363281 0.0742188 184.429688 0 187.5 0 C 190.570312 0 193.636719 0.0742188 196.699219 0.226562 C 199.765625 0.375 202.824219 0.601562 205.878906 0.902344 C 208.933594 1.203125 211.976562 1.578125 215.011719 2.03125 C 218.046875 2.480469 221.070312 3.003906 224.078125 3.601562 C 227.089844 4.203125 230.082031 4.875 233.058594 5.617188 C 236.035156 6.363281 238.992188 7.183594 241.929688 8.074219 C 244.863281 8.964844 247.777344 9.925781 250.667969 10.960938 C 253.554688 11.996094 256.417969 13.097656 259.253906 14.273438 C 262.089844 15.445312 264.894531 16.691406 267.667969 18.003906 C 270.441406 19.3125 273.179688 20.691406 275.886719 22.140625 C 278.59375 23.585938 281.261719 25.097656 283.894531 26.675781 C 286.527344 28.253906 289.117188 29.894531 291.667969 31.597656 C 294.222656 33.304688 296.730469 35.070312 299.195312 36.898438 C 301.660156 38.726562 304.078125 40.613281 306.449219 42.558594 C 308.820312 44.507812 311.144531 46.511719 313.417969 48.570312 C 315.691406 50.632812 317.914062 52.746094 320.082031 54.917969 C 322.253906 57.085938 324.367188 59.308594 326.429688 61.582031 C 328.488281 63.855469 330.492188 66.179688 332.441406 68.550781 C 334.386719 70.921875 336.273438 73.339844 338.101562 75.804688 C 339.929688 78.269531 341.695312 80.777344 343.402344 83.332031 C 345.105469 85.882812 346.746094 88.472656 348.324219 91.105469 C 349.902344 93.738281 351.414062 96.40625 352.859375 99.113281 C 354.308594 101.820312 355.6875 104.558594 356.996094 107.332031 C 358.308594 110.105469 359.554688 112.910156 360.726562 115.746094 C 361.902344 118.582031 363.003906 121.445312 364.039062 124.332031 C 365.074219 127.222656 366.035156 130.136719 366.925781 133.070312 C 367.816406 136.007812 368.636719 138.964844 369.382812 141.941406 C 370.125 144.917969 370.796875 147.910156 371.398438 150.921875 C 371.996094 153.929688 372.519531 156.953125 372.96875 159.988281 C 373.421875 163.023438 373.796875 166.066406 374.097656 169.121094 C 374.398438 172.175781 374.625 175.234375 374.773438 178.300781 C 374.925781 181.363281 375 184.429688 375 187.5 Z M 375 187.5 \"\n                    fill-opacity=\"1\" fill-rule=\"nonzero\" />\n            </g>\n        </g>\n    </g>\n    <path fill=\"#ffffff\"\n        d=\"M 290.066406 188.304688 L 141.457031 280.796875 C 134.203125 288.050781 121.707031 282.914062 121.707031 272.636719 L 121.40625 102.566406 C 121.40625 92.289062 133.800781 87.152344 141.152344 94.40625 L 290.066406 171.882812 C 294.601562 176.519531 294.601562 183.773438 290.066406 188.304688 Z M 290.066406 188.304688 \"\n        fill-opacity=\"1\" fill-rule=\"nonzero\" />\n</svg>");

/***/ }),

/***/ "./src/icons/rectangles.svg":
/*!**********************************!*\
  !*** ./src/icons/rectangles.svg ***!
  \**********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg id=\"Layer_1\" data-name=\"Layer 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 307 640\">\n  <defs>\n    <style>\n      .innermost, .second, .third, .fourth, .fifth, .outermost {\n        stroke-width: 0px;\n      }\n      \n      .outermost {\n        fill: #e4f2d1;\n      }\n\n      .second {\n        fill: #cce8b5;\n      }\n\n      .third {\n        fill: #b3db95;\n      }\n\n      .fourth {\n        fill: #9bd078;\n      }\n\n      .fifth {\n        fill: #83c55c;\n      }\n\n      .innermost {\n        fill: #428a2f;\n      }\n    </style>\n  </defs>\n  <path class=\"outermost\" d=\"m306.9,320c0,105.3-.02,210.6.1,315.91,0,3.42-.67,4.1-4.09,4.09-99.6-.12-199.21-.12-298.81,0C.67,640,0,639.33,0,635.91.11,425.3.11,214.7,0,4.09,0,.67.67,0,4.09,0,103.7.12,203.3.12,302.91,0c3.42,0,4.1.67,4.09,4.09-.12,105.3-.1,210.6-.1,315.91Z\"/>\n  <path class=\"second\" d=\"m275.92,323c0,87.63,0,175.27,0,262.9,0,7.24-.55,7.93-7.86,7.98-14.66.09-29.31.03-43.97.03-60.96,0-121.92,0-182.88,0q-7.13,0-7.14-7.24c0-176.1,0-352.21,0-528.31q0-7.26,7.12-7.26c75.78,0,151.56,0,227.35,0q7.38,0,7.38,7.5c0,88.13,0,176.27,0,264.4Z\"/>\n  <path class=\"third\" d=\"m68.06,322.24c0-69.47,0-138.94,0-208.41,0-8.99,1.33-10.13,10.49-9.12,1.98.22,3.98.32,5.97.32,46.13.02,92.26.02,138.39,0,3.48,0,6.92-.23,10.41-.67,5.5-.7,8.74.46,8.73,7.25-.18,138.94-.13,277.88-.13,416.81,0,.33,0,.67,0,1q-.14,10.51-10.39,10.51c-52.13,0-104.25,0-156.38,0q-7.09,0-7.09-7.28c0-70.14,0-140.27,0-210.41Z\"/>\n  <path class=\"fourth\" d=\"m103.02,322.5c0-52.46,0-104.91,0-157.37,0-6.68.36-7.06,7.07-7.06,30.3-.01,60.6.07,90.9-.09,4.54-.02,6.08,1.33,6.07,5.98-.1,105.58-.1,211.16,0,316.74,0,4.18-1.27,5.37-5.38,5.35-29.3-.15-58.6-.08-87.9-.08q-10.76,0-10.76-11.09c0-50.79,0-101.58,0-152.37Z\"/>\n  <path class=\"fifth\" d=\"m173,322.2c0,35.29,0,70.58,0,105.88q0,6.89-6.99,6.9c-8.15,0-16.31-.13-24.46.06-3.47.08-4.68-1.09-4.61-4.59.18-9.65.06-19.31.06-28.96,0-58.26-.01-116.53.02-174.79,0-4.76-1.12-9.46-.14-14.3.51-2.54,1.39-3.38,3.8-3.36,8.82.06,17.64.14,26.46-.02,4.59-.09,5.95,1.85,5.94,6.33-.14,35.62-.08,71.25-.08,106.87Z\"/>\n  <path class=\"innermost\" d=\"m151.04,322.01c0-9.99.07-19.97-.05-29.96-.04-2.93.83-4.18,3.95-4.18,3.06,0,4.03,1.12,4.02,4.11-.09,19.97-.08,39.94.01,59.91.01,2.96-.84,4.16-3.96,4.14-3.03-.01-4.08-1.04-4.03-4.08.14-9.98.05-19.97.05-29.96Z\"/>\n</svg>");

/***/ }),

/***/ "./src/icons/waveform.svg":
/*!********************************!*\
  !*** ./src/icons/waveform.svg ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.0\" viewBox=\"0 0 56.25 30\" class=\"waveform\">\n    <defs>\n        <clipPath id=\"a\">\n            <path d=\"M.54 12H3v5H.54Zm0 0\"/>\n        </clipPath>\n        <clipPath id=\"b\">\n            <path d=\"M25 2.2h2v24.68h-2Zm0 0\"/>\n        </clipPath>\n        <clipPath id=\"c\">\n            <path d=\"M53 12h1.98v5H53Zm0 0\"/>\n        </clipPath>\n    </defs>\n    <g clip-path=\"url(#a)\">\n        <path d=\"M1.48 12.71c-.5 0-.9.4-.9.9v1.85a.9.9 0 0 0 1.8 0v-1.84c0-.5-.4-.9-.9-.9Zm0 0\"/>\n    </g>\n    <path d=\"M4.98 6.63c-.5 0-.9.4-.9.9v14.01a.9.9 0 0 0 1.81 0v-14c0-.5-.4-.92-.9-.92Zm3.51 3.1a.9.9 0 0 0-.9.91v7.79a.9.9 0 0 0 1.8 0v-7.79c0-.5-.4-.9-.9-.9ZM12 3.83a.9.9 0 0 0-.91.9v19.6a.9.9 0 0 0 1.8 0V4.74c0-.5-.4-.9-.9-.9Zm3.5 8.29a.9.9 0 0 0-.91.9v3.03a.9.9 0 0 0 1.81 0v-3.03c0-.5-.4-.9-.9-.9ZM19 6.8c-.5 0-.9.4-.9.9v13.68a.9.9 0 0 0 1.8 0V7.7c0-.5-.4-.9-.9-.9Zm3.58-2.97h-.01c-.5 0-.9.4-.9.9l-.13 19.6c0 .5.4.9.9.91.5 0 .9-.4.9-.9l.14-19.6a.9.9 0 0 0-.9-.9Zm0 0\"/>\n    <g clip-path=\"url(#b)\">\n        <path d=\"M26 2.2c-.5 0-.9.4-.9.9v22.86a.9.9 0 1 0 1.81 0V3.11a.9.9 0 0 0-.9-.91Zm0 0\"/>\n    </g>\n    <path d=\"M29.52 7.71a.9.9 0 0 0-.91.9v11.85a.9.9 0 0 0 1.81 0V8.62c0-.5-.4-.9-.9-.9Zm3.5 2.93a.9.9 0 0 0-.9.91v5.97a.9.9 0 0 0 1.8 0v-5.97c0-.5-.4-.9-.9-.9Zm3.5-5.78c-.5 0-.9.4-.9.9v17.55a.9.9 0 0 0 1.81 0V5.76c0-.5-.4-.9-.9-.9Zm3.51 3.34c-.5 0-.9.4-.9.9v10.87a.9.9 0 0 0 1.8 0V9.1a.9.9 0 0 0-.9-.91Zm3.5 3.08c-.5 0-.9.4-.9.91v4.7a.9.9 0 1 0 1.8 0v-4.7a.9.9 0 0 0-.9-.9Zm3.51-7.45a.9.9 0 0 0-.91.9v19.6a.9.9 0 0 0 1.81 0V4.74c0-.5-.4-.9-.9-.9Zm3.5 5.57a.9.9 0 0 0-.9.91v8.45a.9.9 0 0 0 1.8 0v-8.45c0-.5-.4-.9-.9-.9Zm0 0\"/>\n    <g clip-path=\"url(#c)\">\n        <path d=\"M54.04 12.96a.9.9 0 0 0-.9.91v1.33a.9.9 0 1 0 1.8 0v-1.32a.9.9 0 0 0-.9-.92Zm0 0\"/>\n    </g>\n</svg>");

/***/ }),

/***/ "./src/styles/rectangles.css":
/*!***********************************!*\
  !*** ./src/styles/rectangles.css ***!
  \***********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var _node_modules_css_loader_dist_cjs_js_rectangles_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!./rectangles.css */ "./node_modules/css-loader/dist/cjs.js!./src/styles/rectangles.css");

      
      
      
      
      
      
      
      
      

var options = {};

options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());

      options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
    
options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());

var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_rectangles_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);




       /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_rectangles_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_rectangles_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_rectangles_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);


/***/ }),

/***/ "./src/styles/common.scss":
/*!********************************!*\
  !*** ./src/styles/common.scss ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var _node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_common_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./common.scss */ "./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./src/styles/common.scss");

      
      
      
      
      
      
      
      
      

var options = {};

options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());

      options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
    
options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());

var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_common_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options);




       /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_common_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_common_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_common_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);


/***/ }),

/***/ "./src/styles/desktop.scss":
/*!*********************************!*\
  !*** ./src/styles/desktop.scss ***!
  \*********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var _node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_desktop_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./desktop.scss */ "./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./src/styles/desktop.scss");

      
      
      
      
      
      
      
      
      

var options = {};

options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());

      options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
    
options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());

var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_desktop_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options);




       /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_desktop_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_desktop_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_desktop_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);


/***/ }),

/***/ "./src/styles/mobile.scss":
/*!********************************!*\
  !*** ./src/styles/mobile.scss ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var _node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_mobile_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./mobile.scss */ "./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./src/styles/mobile.scss");

      
      
      
      
      
      
      
      
      

var options = {};

options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());

      options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
    
options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());

var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_mobile_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options);




       /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_mobile_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_mobile_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_3_use_1_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_3_use_2_mobile_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);


/***/ }),

/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":
/*!****************************************************************************!*\
  !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***!
  \****************************************************************************/
/***/ ((module) => {



var stylesInDOM = [];
function getIndexByIdentifier(identifier) {
  var result = -1;
  for (var i = 0; i < stylesInDOM.length; i++) {
    if (stylesInDOM[i].identifier === identifier) {
      result = i;
      break;
    }
  }
  return result;
}
function modulesToDom(list, options) {
  var idCountMap = {};
  var identifiers = [];
  for (var i = 0; i < list.length; i++) {
    var item = list[i];
    var id = options.base ? item[0] + options.base : item[0];
    var count = idCountMap[id] || 0;
    var identifier = "".concat(id, " ").concat(count);
    idCountMap[id] = count + 1;
    var indexByIdentifier = getIndexByIdentifier(identifier);
    var obj = {
      css: item[1],
      media: item[2],
      sourceMap: item[3],
      supports: item[4],
      layer: item[5]
    };
    if (indexByIdentifier !== -1) {
      stylesInDOM[indexByIdentifier].references++;
      stylesInDOM[indexByIdentifier].updater(obj);
    } else {
      var updater = addElementStyle(obj, options);
      options.byIndex = i;
      stylesInDOM.splice(i, 0, {
        identifier: identifier,
        updater: updater,
        references: 1
      });
    }
    identifiers.push(identifier);
  }
  return identifiers;
}
function addElementStyle(obj, options) {
  var api = options.domAPI(options);
  api.update(obj);
  var updater = function updater(newObj) {
    if (newObj) {
      if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {
        return;
      }
      api.update(obj = newObj);
    } else {
      api.remove();
    }
  };
  return updater;
}
module.exports = function (list, options) {
  options = options || {};
  list = list || [];
  var lastIdentifiers = modulesToDom(list, options);
  return function update(newList) {
    newList = newList || [];
    for (var i = 0; i < lastIdentifiers.length; i++) {
      var identifier = lastIdentifiers[i];
      var index = getIndexByIdentifier(identifier);
      stylesInDOM[index].references--;
    }
    var newLastIdentifiers = modulesToDom(newList, options);
    for (var _i = 0; _i < lastIdentifiers.length; _i++) {
      var _identifier = lastIdentifiers[_i];
      var _index = getIndexByIdentifier(_identifier);
      if (stylesInDOM[_index].references === 0) {
        stylesInDOM[_index].updater();
        stylesInDOM.splice(_index, 1);
      }
    }
    lastIdentifiers = newLastIdentifiers;
  };
};

/***/ }),

/***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js":
/*!********************************************************************!*\
  !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***!
  \********************************************************************/
/***/ ((module) => {



var memo = {};

/* istanbul ignore next  */
function getTarget(target) {
  if (typeof memo[target] === "undefined") {
    var styleTarget = document.querySelector(target);

    // Special case to return head of iframe instead of iframe itself
    if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {
      try {
        // This will throw an exception if access to iframe is blocked
        // due to cross-origin restrictions
        styleTarget = styleTarget.contentDocument.head;
      } catch (e) {
        // istanbul ignore next
        styleTarget = null;
      }
    }
    memo[target] = styleTarget;
  }
  return memo[target];
}

/* istanbul ignore next  */
function insertBySelector(insert, style) {
  var target = getTarget(insert);
  if (!target) {
    throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");
  }
  target.appendChild(style);
}
module.exports = insertBySelector;

/***/ }),

/***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js":
/*!**********************************************************************!*\
  !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***!
  \**********************************************************************/
/***/ ((module) => {



/* istanbul ignore next  */
function insertStyleElement(options) {
  var element = document.createElement("style");
  options.setAttributes(element, options.attributes);
  options.insert(element, options.options);
  return element;
}
module.exports = insertStyleElement;

/***/ }),

/***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js":
/*!**********************************************************************************!*\
  !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***!
  \**********************************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {



/* istanbul ignore next  */
function setAttributesWithoutAttributes(styleElement) {
  var nonce =  true ? __webpack_require__.nc : 0;
  if (nonce) {
    styleElement.setAttribute("nonce", nonce);
  }
}
module.exports = setAttributesWithoutAttributes;

/***/ }),

/***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js":
/*!***************************************************************!*\
  !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***!
  \***************************************************************/
/***/ ((module) => {



/* istanbul ignore next  */
function apply(styleElement, options, obj) {
  var css = "";
  if (obj.supports) {
    css += "@supports (".concat(obj.supports, ") {");
  }
  if (obj.media) {
    css += "@media ".concat(obj.media, " {");
  }
  var needLayer = typeof obj.layer !== "undefined";
  if (needLayer) {
    css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {");
  }
  css += obj.css;
  if (needLayer) {
    css += "}";
  }
  if (obj.media) {
    css += "}";
  }
  if (obj.supports) {
    css += "}";
  }
  var sourceMap = obj.sourceMap;
  if (sourceMap && typeof btoa !== "undefined") {
    css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");
  }

  // For old IE
  /* istanbul ignore if  */
  options.styleTagTransform(css, styleElement, options.options);
}
function removeStyleElement(styleElement) {
  // istanbul ignore if
  if (styleElement.parentNode === null) {
    return false;
  }
  styleElement.parentNode.removeChild(styleElement);
}

/* istanbul ignore next  */
function domAPI(options) {
  if (typeof document === "undefined") {
    return {
      update: function update() {},
      remove: function remove() {}
    };
  }
  var styleElement = options.insertStyleElement(options);
  return {
    update: function update(obj) {
      apply(styleElement, options, obj);
    },
    remove: function remove() {
      removeStyleElement(styleElement);
    }
  };
}
module.exports = domAPI;

/***/ }),

/***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js":
/*!*********************************************************************!*\
  !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***!
  \*********************************************************************/
/***/ ((module) => {



/* istanbul ignore next  */
function styleTagTransform(css, styleElement) {
  if (styleElement.styleSheet) {
    styleElement.styleSheet.cssText = css;
  } else {
    while (styleElement.firstChild) {
      styleElement.removeChild(styleElement.firstChild);
    }
    styleElement.appendChild(document.createTextNode(css));
  }
}
module.exports = styleTagTransform;

/***/ }),

/***/ "./node_modules/xstate/es/Actor.js":
/*!*****************************************!*\
  !*** ./node_modules/xstate/es/Actor.js ***!
  \*****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   createDeferredActor: () => (/* binding */ createDeferredActor),
/* harmony export */   createInvocableActor: () => (/* binding */ createInvocableActor),
/* harmony export */   createNullActor: () => (/* binding */ createNullActor),
/* harmony export */   isActor: () => (/* binding */ isActor),
/* harmony export */   isSpawnedActor: () => (/* binding */ isSpawnedActor),
/* harmony export */   toActorRef: () => (/* binding */ toActorRef)
/* harmony export */ });
/* harmony import */ var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_virtual/_tslib.js */ "./node_modules/xstate/es/_virtual/_tslib.js");
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./node_modules/xstate/es/utils.js");
/* harmony import */ var _serviceScope_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./serviceScope.js */ "./node_modules/xstate/es/serviceScope.js");




function createNullActor(id) {
  var _a;

  return _a = {
    id: id,
    send: function () {
      return void 0;
    },
    subscribe: function () {
      return {
        unsubscribe: function () {
          return void 0;
        }
      };
    },
    getSnapshot: function () {
      return undefined;
    },
    toJSON: function () {
      return {
        id: id
      };
    }
  }, _a[_utils_js__WEBPACK_IMPORTED_MODULE_0__.symbolObservable] = function () {
    return this;
  }, _a;
}
/**
 * Creates a deferred actor that is able to be invoked given the provided
 * invocation information in its `.meta` value.
 *
 * @param invokeDefinition The meta information needed to invoke the actor.
 */

function createInvocableActor(invokeDefinition, machine, context, _event) {
  var _a;

  var invokeSrc = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toInvokeSource)(invokeDefinition.src);
  var serviceCreator = (_a = machine === null || machine === void 0 ? void 0 : machine.options.services) === null || _a === void 0 ? void 0 : _a[invokeSrc.type];
  var resolvedData = invokeDefinition.data ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapContext)(invokeDefinition.data, context, _event) : undefined;
  var tempActor = serviceCreator ? createDeferredActor(serviceCreator, invokeDefinition.id, resolvedData) : createNullActor(invokeDefinition.id); // @ts-ignore

  tempActor.meta = invokeDefinition;
  return tempActor;
}
function createDeferredActor(entity, id, data) {
  var tempActor = createNullActor(id); // @ts-ignore

  tempActor.deferred = true;

  if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(entity)) {
    // "mute" the existing service scope so potential spawned actors within the `.initialState` stay deferred here
    var initialState_1 = tempActor.state = (0,_serviceScope_js__WEBPACK_IMPORTED_MODULE_1__.provide)(undefined, function () {
      return (data ? entity.withContext(data) : entity).initialState;
    });

    tempActor.getSnapshot = function () {
      return initialState_1;
    };
  }

  return tempActor;
}
function isActor(item) {
  try {
    return typeof item.send === 'function';
  } catch (e) {
    return false;
  }
}
function isSpawnedActor(item) {
  return isActor(item) && 'id' in item;
} // TODO: refactor the return type, this could be written in a better way but it's best to avoid unneccessary breaking changes now

function toActorRef(actorRefLike) {
  var _a;

  return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((_a = {
    subscribe: function () {
      return {
        unsubscribe: function () {
          return void 0;
        }
      };
    },
    id: 'anonymous',
    getSnapshot: function () {
      return undefined;
    }
  }, _a[_utils_js__WEBPACK_IMPORTED_MODULE_0__.symbolObservable] = function () {
    return this;
  }, _a), actorRefLike);
}




/***/ }),

/***/ "./node_modules/xstate/es/Machine.js":
/*!*******************************************!*\
  !*** ./node_modules/xstate/es/Machine.js ***!
  \*******************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   Machine: () => (/* binding */ Machine),
/* harmony export */   createMachine: () => (/* binding */ createMachine)
/* harmony export */ });
/* harmony import */ var _StateNode_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./StateNode.js */ "./node_modules/xstate/es/StateNode.js");
/* harmony import */ var _environment_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./environment.js */ "./node_modules/xstate/es/environment.js");



var warned = false;
function Machine(config, options, initialContext) {
  if (initialContext === void 0) {
    initialContext = config.context;
  }

  return new _StateNode_js__WEBPACK_IMPORTED_MODULE_0__.StateNode(config, options, initialContext);
}
function createMachine(config, options) {
  if (!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION && !('predictableActionArguments' in config) && !warned) {
    warned = true;
    console.warn('It is highly recommended to set `predictableActionArguments` to `true` when using `createMachine`. https://xstate.js.org/docs/guides/actions.html');
  }

  return new _StateNode_js__WEBPACK_IMPORTED_MODULE_0__.StateNode(config, options);
}




/***/ }),

/***/ "./node_modules/xstate/es/State.js":
/*!*****************************************!*\
  !*** ./node_modules/xstate/es/State.js ***!
  \*****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   State: () => (/* binding */ State),
/* harmony export */   bindActionToState: () => (/* binding */ bindActionToState),
/* harmony export */   isState: () => (/* binding */ isState),
/* harmony export */   isStateConfig: () => (/* binding */ isStateConfig),
/* harmony export */   stateValuesEqual: () => (/* binding */ stateValuesEqual)
/* harmony export */ });
/* harmony import */ var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_virtual/_tslib.js */ "./node_modules/xstate/es/_virtual/_tslib.js");
/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants.js */ "./node_modules/xstate/es/constants.js");
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./node_modules/xstate/es/utils.js");
/* harmony import */ var _stateUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stateUtils.js */ "./node_modules/xstate/es/stateUtils.js");
/* harmony import */ var _actions_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./actions.js */ "./node_modules/xstate/es/actions.js");
/* harmony import */ var _environment_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./environment.js */ "./node_modules/xstate/es/environment.js");







function stateValuesEqual(a, b) {
  if (a === b) {
    return true;
  }

  if (a === undefined || b === undefined) {
    return false;
  }

  if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(a) || (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(b)) {
    return a === b;
  }

  var aKeys = Object.keys(a);
  var bKeys = Object.keys(b);
  return aKeys.length === bKeys.length && aKeys.every(function (key) {
    return stateValuesEqual(a[key], b[key]);
  });
}
function isStateConfig(state) {
  if (typeof state !== 'object' || state === null) {
    return false;
  }

  return 'value' in state && '_event' in state;
}
/**
 * @deprecated Use `isStateConfig(object)` or `state instanceof State` instead.
 */

var isState = isStateConfig;
function bindActionToState(action, state) {
  var exec = action.exec;

  var boundAction = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)({}, action), {
    exec: exec !== undefined ? function () {
      return exec(state.context, state.event, {
        action: action,
        state: state,
        _event: state._event
      });
    } : undefined
  });

  return boundAction;
}

var State =
/*#__PURE__*/

/** @class */
function () {
  /**
   * Creates a new State instance.
   * @param value The state value
   * @param context The extended state
   * @param historyValue The tree representing historical values of the state nodes
   * @param history The previous state
   * @param actions An array of action objects to execute as side-effects
   * @param activities A mapping of activities and whether they are started (`true`) or stopped (`false`).
   * @param meta
   * @param events Internal event queue. Should be empty with run-to-completion semantics.
   * @param configuration
   */
  function State(config) {
    var _this = this;

    var _a;

    this.actions = [];
    this.activities = _constants_js__WEBPACK_IMPORTED_MODULE_2__.EMPTY_ACTIVITY_MAP;
    this.meta = {};
    this.events = [];
    this.value = config.value;
    this.context = config.context;
    this._event = config._event;
    this._sessionid = config._sessionid;
    this.event = this._event.data;
    this.historyValue = config.historyValue;
    this.history = config.history;
    this.actions = config.actions || [];
    this.activities = config.activities || _constants_js__WEBPACK_IMPORTED_MODULE_2__.EMPTY_ACTIVITY_MAP;
    this.meta = (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_3__.getMeta)(config.configuration);
    this.events = config.events || [];
    this.matches = this.matches.bind(this);
    this.toStrings = this.toStrings.bind(this);
    this.configuration = config.configuration;
    this.transitions = config.transitions;
    this.children = config.children;
    this.done = !!config.done;
    this.tags = (_a = Array.isArray(config.tags) ? new Set(config.tags) : config.tags) !== null && _a !== void 0 ? _a : new Set();
    this.machine = config.machine;
    Object.defineProperty(this, 'nextEvents', {
      get: function () {
        return (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_3__.nextEvents)(_this.configuration);
      }
    });
  }
  /**
   * Creates a new State instance for the given `stateValue` and `context`.
   * @param stateValue
   * @param context
   */


  State.from = function (stateValue, context) {
    if (stateValue instanceof State) {
      if (stateValue.context !== context) {
        return new State({
          value: stateValue.value,
          context: context,
          _event: stateValue._event,
          _sessionid: null,
          historyValue: stateValue.historyValue,
          history: stateValue.history,
          actions: [],
          activities: stateValue.activities,
          meta: {},
          events: [],
          configuration: [],
          transitions: [],
          children: {}
        });
      }

      return stateValue;
    }

    var _event = _actions_js__WEBPACK_IMPORTED_MODULE_4__.initEvent;
    return new State({
      value: stateValue,
      context: context,
      _event: _event,
      _sessionid: null,
      historyValue: undefined,
      history: undefined,
      actions: [],
      activities: undefined,
      meta: undefined,
      events: [],
      configuration: [],
      transitions: [],
      children: {}
    });
  };
  /**
   * Creates a new State instance for the given `config`.
   * @param config The state config
   */


  State.create = function (config) {
    return new State(config);
  };
  /**
   * Creates a new `State` instance for the given `stateValue` and `context` with no actions (side-effects).
   * @param stateValue
   * @param context
   */


  State.inert = function (stateValue, context) {
    if (stateValue instanceof State) {
      if (!stateValue.actions.length) {
        return stateValue;
      }

      var _event = _actions_js__WEBPACK_IMPORTED_MODULE_4__.initEvent;
      return new State({
        value: stateValue.value,
        context: context,
        _event: _event,
        _sessionid: null,
        historyValue: stateValue.historyValue,
        history: stateValue.history,
        activities: stateValue.activities,
        configuration: stateValue.configuration,
        transitions: [],
        children: {}
      });
    }

    return State.from(stateValue, context);
  };
  /**
   * Returns an array of all the string leaf state node paths.
   * @param stateValue
   * @param delimiter The character(s) that separate each subpath in the string state node path.
   */


  State.prototype.toStrings = function (stateValue, delimiter) {
    var _this = this;

    if (stateValue === void 0) {
      stateValue = this.value;
    }

    if (delimiter === void 0) {
      delimiter = '.';
    }

    if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(stateValue)) {
      return [stateValue];
    }

    var valueKeys = Object.keys(stateValue);
    return valueKeys.concat.apply(valueKeys, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__read)(valueKeys.map(function (key) {
      return _this.toStrings(stateValue[key], delimiter).map(function (s) {
        return key + delimiter + s;
      });
    })), false));
  };

  State.prototype.toJSON = function () {
    var _a = this;
        _a.configuration;
        _a.transitions;
        var tags = _a.tags;
        _a.machine;
        var jsonValues = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__rest)(_a, ["configuration", "transitions", "tags", "machine"]);

    return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)({}, jsonValues), {
      tags: Array.from(tags)
    });
  };

  State.prototype.matches = function (parentStateValue) {
    return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.matchesState)(parentStateValue, this.value);
  };
  /**
   * Whether the current state configuration has a state node with the specified `tag`.
   * @param tag
   */


  State.prototype.hasTag = function (tag) {
    return this.tags.has(tag);
  };
  /**
   * Determines whether sending the `event` will cause a non-forbidden transition
   * to be selected, even if the transitions have no actions nor
   * change the state value.
   *
   * @param event The event to test
   * @returns Whether the event will cause a transition
   */


  State.prototype.can = function (event) {
    var _a;

    if (_environment_js__WEBPACK_IMPORTED_MODULE_5__.IS_PRODUCTION) {
      (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(!!this.machine, "state.can(...) used outside of a machine-created State object; this will always return false.");
    }

    var transitionData = (_a = this.machine) === null || _a === void 0 ? void 0 : _a.getTransitionData(this, event);
    return !!(transitionData === null || transitionData === void 0 ? void 0 : transitionData.transitions.length) && // Check that at least one transition is not forbidden
    transitionData.transitions.some(function (t) {
      return t.target !== undefined || t.actions.length;
    });
  };

  return State;
}();




/***/ }),

/***/ "./node_modules/xstate/es/StateNode.js":
/*!*********************************************!*\
  !*** ./node_modules/xstate/es/StateNode.js ***!
  \*********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   StateNode: () => (/* binding */ StateNode)
/* harmony export */ });
/* harmony import */ var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_virtual/_tslib.js */ "./node_modules/xstate/es/_virtual/_tslib.js");
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./node_modules/xstate/es/utils.js");
/* harmony import */ var _State_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./State.js */ "./node_modules/xstate/es/State.js");
/* harmony import */ var _actionTypes_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./actionTypes.js */ "./node_modules/xstate/es/actionTypes.js");
/* harmony import */ var _actions_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./actions.js */ "./node_modules/xstate/es/actions.js");
/* harmony import */ var _environment_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./environment.js */ "./node_modules/xstate/es/environment.js");
/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants.js */ "./node_modules/xstate/es/constants.js");
/* harmony import */ var _stateUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stateUtils.js */ "./node_modules/xstate/es/stateUtils.js");
/* harmony import */ var _Actor_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Actor.js */ "./node_modules/xstate/es/Actor.js");
/* harmony import */ var _invokeUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./invokeUtils.js */ "./node_modules/xstate/es/invokeUtils.js");











var NULL_EVENT = '';
var STATE_IDENTIFIER = '#';
var WILDCARD = '*';
var EMPTY_OBJECT = {};

var isStateId = function (str) {
  return str[0] === STATE_IDENTIFIER;
};

var createDefaultOptions = function () {
  return {
    actions: {},
    guards: {},
    services: {},
    activities: {},
    delays: {}
  };
};

var validateArrayifiedTransitions = function (stateNode, event, transitions) {
  var hasNonLastUnguardedTarget = transitions.slice(0, -1).some(function (transition) {
    return !('cond' in transition) && !('in' in transition) && ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(transition.target) || (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(transition.target));
  });
  var eventText = event === NULL_EVENT ? 'the transient event' : "event '".concat(event, "'");
  (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(!hasNonLastUnguardedTarget, "One or more transitions for ".concat(eventText, " on state '").concat(stateNode.id, "' are unreachable. ") + "Make sure that the default transition is the last one defined.");
};

var StateNode =
/*#__PURE__*/

/** @class */
function () {
  function StateNode(
  /**
   * The raw config used to create the machine.
   */
  config, options,
  /**
   * The initial extended state
   */
  _context, // TODO: this is unsafe, but we're removing it in v5 anyway
  _stateInfo) {
    if (_context === void 0) {
      _context = 'context' in config ? config.context : undefined;
    }

    var _this = this;

    var _a;

    this.config = config;
    this._context = _context;
    /**
     * The order this state node appears. Corresponds to the implicit SCXML document order.
     */

    this.order = -1;
    this.__xstatenode = true;
    this.__cache = {
      events: undefined,
      relativeValue: new Map(),
      initialStateValue: undefined,
      initialState: undefined,
      on: undefined,
      transitions: undefined,
      candidates: {},
      delayedTransitions: undefined
    };
    this.idMap = {};
    this.tags = [];
    this.options = Object.assign(createDefaultOptions(), options);
    this.parent = _stateInfo === null || _stateInfo === void 0 ? void 0 : _stateInfo.parent;
    this.key = this.config.key || (_stateInfo === null || _stateInfo === void 0 ? void 0 : _stateInfo.key) || this.config.id || '(machine)';
    this.machine = this.parent ? this.parent.machine : this;
    this.path = this.parent ? this.parent.path.concat(this.key) : [];
    this.delimiter = this.config.delimiter || (this.parent ? this.parent.delimiter : _constants_js__WEBPACK_IMPORTED_MODULE_1__.STATE_DELIMITER);
    this.id = this.config.id || (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([this.machine.key], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(this.path), false).join(this.delimiter);
    this.version = this.parent ? this.parent.version : this.config.version;
    this.type = this.config.type || (this.config.parallel ? 'parallel' : this.config.states && Object.keys(this.config.states).length ? 'compound' : this.config.history ? 'history' : 'atomic');
    this.schema = this.parent ? this.machine.schema : (_a = this.config.schema) !== null && _a !== void 0 ? _a : {};
    this.description = this.config.description;

    if (!_environment_js__WEBPACK_IMPORTED_MODULE_3__.IS_PRODUCTION) {
      (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(!('parallel' in this.config), "The \"parallel\" property is deprecated and will be removed in version 4.1. ".concat(this.config.parallel ? "Replace with `type: 'parallel'`" : "Use `type: '".concat(this.type, "'`"), " in the config for state node '").concat(this.id, "' instead."));
    }

    this.initial = this.config.initial;
    this.states = this.config.states ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapValues)(this.config.states, function (stateConfig, key) {
      var _a;

      var stateNode = new StateNode(stateConfig, {}, undefined, {
        parent: _this,
        key: key
      });
      Object.assign(_this.idMap, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((_a = {}, _a[stateNode.id] = stateNode, _a), stateNode.idMap));
      return stateNode;
    }) : EMPTY_OBJECT; // Document order

    var order = 0;

    function dfs(stateNode) {
      var e_1, _a;

      stateNode.order = order++;

      try {
        for (var _b = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)((0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getAllChildren)(stateNode)), _c = _b.next(); !_c.done; _c = _b.next()) {
          var child = _c.value;
          dfs(child);
        }
      } catch (e_1_1) {
        e_1 = {
          error: e_1_1
        };
      } finally {
        try {
          if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
        } finally {
          if (e_1) throw e_1.error;
        }
      }
    }

    dfs(this); // History config

    this.history = this.config.history === true ? 'shallow' : this.config.history || false;
    this._transient = !!this.config.always || (!this.config.on ? false : Array.isArray(this.config.on) ? this.config.on.some(function (_a) {
      var event = _a.event;
      return event === NULL_EVENT;
    }) : NULL_EVENT in this.config.on);
    this.strict = !!this.config.strict; // TODO: deprecate (entry)

    this.onEntry = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(this.config.entry || this.config.onEntry).map(function (action) {
      return (0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActionObject)(action);
    }); // TODO: deprecate (exit)

    this.onExit = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(this.config.exit || this.config.onExit).map(function (action) {
      return (0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActionObject)(action);
    });
    this.meta = this.config.meta;
    this.doneData = this.type === 'final' ? this.config.data : undefined;
    this.invoke = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(this.config.invoke).map(function (invokeConfig, i) {
      var _a, _b;

      if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(invokeConfig)) {
        var invokeId = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.createInvokeId)(_this.id, i);
        _this.machine.options.services = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((_a = {}, _a[invokeId] = invokeConfig, _a), _this.machine.options.services);
        return (0,_invokeUtils_js__WEBPACK_IMPORTED_MODULE_6__.toInvokeDefinition)({
          src: invokeId,
          id: invokeId
        });
      } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(invokeConfig.src)) {
        var invokeId = invokeConfig.id || (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.createInvokeId)(_this.id, i);
        return (0,_invokeUtils_js__WEBPACK_IMPORTED_MODULE_6__.toInvokeDefinition)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, invokeConfig), {
          id: invokeId,
          src: invokeConfig.src
        }));
      } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(invokeConfig.src) || (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(invokeConfig.src)) {
        var invokeId = invokeConfig.id || (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.createInvokeId)(_this.id, i);
        _this.machine.options.services = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((_b = {}, _b[invokeId] = invokeConfig.src, _b), _this.machine.options.services);
        return (0,_invokeUtils_js__WEBPACK_IMPORTED_MODULE_6__.toInvokeDefinition)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({
          id: invokeId
        }, invokeConfig), {
          src: invokeId
        }));
      } else {
        var invokeSource = invokeConfig.src;
        return (0,_invokeUtils_js__WEBPACK_IMPORTED_MODULE_6__.toInvokeDefinition)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({
          id: (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.createInvokeId)(_this.id, i)
        }, invokeConfig), {
          src: invokeSource
        }));
      }
    });
    this.activities = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(this.config.activities).concat(this.invoke).map(function (activity) {
      return (0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActivityDefinition)(activity);
    });
    this.transition = this.transition.bind(this);
    this.tags = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(this.config.tags); // TODO: this is the real fix for initialization once
    // state node getters are deprecated
    // if (!this.parent) {
    //   this._init();
    // }
  }

  StateNode.prototype._init = function () {
    if (this.__cache.transitions) {
      return;
    }

    (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getAllStateNodes)(this).forEach(function (stateNode) {
      return stateNode.on;
    });
  };
  /**
   * Clones this state machine with custom options and context.
   *
   * @param options Options (actions, guards, activities, services) to recursively merge with the existing options.
   * @param context Custom context (will override predefined context)
   */


  StateNode.prototype.withConfig = function (options, context) {
    var _a = this.options,
        actions = _a.actions,
        activities = _a.activities,
        guards = _a.guards,
        services = _a.services,
        delays = _a.delays;
    return new StateNode(this.config, {
      actions: (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, actions), options.actions),
      activities: (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, activities), options.activities),
      guards: (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, guards), options.guards),
      services: (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, services), options.services),
      delays: (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, delays), options.delays)
    }, context !== null && context !== void 0 ? context : this.context);
  };
  /**
   * Clones this state machine with custom context.
   *
   * @param context Custom context (will override predefined context, not recursive)
   */


  StateNode.prototype.withContext = function (context) {
    return new StateNode(this.config, this.options, context);
  };

  Object.defineProperty(StateNode.prototype, "context", {
    get: function () {
      return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(this._context) ? this._context() : this._context;
    },
    enumerable: false,
    configurable: true
  });
  Object.defineProperty(StateNode.prototype, "definition", {
    /**
     * The well-structured state node definition.
     */
    get: function () {
      return {
        id: this.id,
        key: this.key,
        version: this.version,
        context: this.context,
        type: this.type,
        initial: this.initial,
        history: this.history,
        states: (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapValues)(this.states, function (state) {
          return state.definition;
        }),
        on: this.on,
        transitions: this.transitions,
        entry: this.onEntry,
        exit: this.onExit,
        activities: this.activities || [],
        meta: this.meta,
        order: this.order || -1,
        data: this.doneData,
        invoke: this.invoke,
        description: this.description,
        tags: this.tags
      };
    },
    enumerable: false,
    configurable: true
  });

  StateNode.prototype.toJSON = function () {
    return this.definition;
  };

  Object.defineProperty(StateNode.prototype, "on", {
    /**
     * The mapping of events to transitions.
     */
    get: function () {
      if (this.__cache.on) {
        return this.__cache.on;
      }

      var transitions = this.transitions;
      return this.__cache.on = transitions.reduce(function (map, transition) {
        map[transition.eventType] = map[transition.eventType] || [];
        map[transition.eventType].push(transition);
        return map;
      }, {});
    },
    enumerable: false,
    configurable: true
  });
  Object.defineProperty(StateNode.prototype, "after", {
    get: function () {
      return this.__cache.delayedTransitions || (this.__cache.delayedTransitions = this.getDelayedTransitions(), this.__cache.delayedTransitions);
    },
    enumerable: false,
    configurable: true
  });
  Object.defineProperty(StateNode.prototype, "transitions", {
    /**
     * All the transitions that can be taken from this state node.
     */
    get: function () {
      return this.__cache.transitions || (this.__cache.transitions = this.formatTransitions(), this.__cache.transitions);
    },
    enumerable: false,
    configurable: true
  });

  StateNode.prototype.getCandidates = function (eventName) {
    if (this.__cache.candidates[eventName]) {
      return this.__cache.candidates[eventName];
    }

    var transient = eventName === NULL_EVENT;
    var candidates = this.transitions.filter(function (transition) {
      var sameEventType = transition.eventType === eventName; // null events should only match against eventless transitions

      return transient ? sameEventType : sameEventType || transition.eventType === WILDCARD;
    });
    this.__cache.candidates[eventName] = candidates;
    return candidates;
  };
  /**
   * All delayed transitions from the config.
   */


  StateNode.prototype.getDelayedTransitions = function () {
    var _this = this;

    var afterConfig = this.config.after;

    if (!afterConfig) {
      return [];
    }

    var mutateEntryExit = function (delay, i) {
      var delayRef = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(delay) ? "".concat(_this.id, ":delay[").concat(i, "]") : delay;
      var eventType = (0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.after)(delayRef, _this.id);

      _this.onEntry.push((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.send)(eventType, {
        delay: delay
      }));

      _this.onExit.push((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.cancel)(eventType));

      return eventType;
    };

    var delayedTransitions = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(afterConfig) ? afterConfig.map(function (transition, i) {
      var eventType = mutateEntryExit(transition.delay, i);
      return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, transition), {
        event: eventType
      });
    }) : (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(Object.keys(afterConfig).map(function (delay, i) {
      var configTransition = afterConfig[delay];
      var resolvedTransition = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(configTransition) ? {
        target: configTransition
      } : configTransition;
      var resolvedDelay = !isNaN(+delay) ? +delay : delay;
      var eventType = mutateEntryExit(resolvedDelay, i);
      return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(resolvedTransition).map(function (transition) {
        return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, transition), {
          event: eventType,
          delay: resolvedDelay
        });
      });
    }));
    return delayedTransitions.map(function (delayedTransition) {
      var delay = delayedTransition.delay;
      return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, _this.formatTransition(delayedTransition)), {
        delay: delay
      });
    });
  };
  /**
   * Returns the state nodes represented by the current state value.
   *
   * @param state The state value or State instance
   */


  StateNode.prototype.getStateNodes = function (state) {
    var _a;

    var _this = this;

    if (!state) {
      return [];
    }

    var stateValue = state instanceof _State_js__WEBPACK_IMPORTED_MODULE_7__.State ? state.value : (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStateValue)(state, this.delimiter);

    if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(stateValue)) {
      var initialStateValue = this.getStateNode(stateValue).initial;
      return initialStateValue !== undefined ? this.getStateNodes((_a = {}, _a[stateValue] = initialStateValue, _a)) : [this, this.states[stateValue]];
    }

    var subStateKeys = Object.keys(stateValue);
    var subStateNodes = [this];
    subStateNodes.push.apply(subStateNodes, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(subStateKeys.map(function (subStateKey) {
      return _this.getStateNode(subStateKey).getStateNodes(stateValue[subStateKey]);
    }))), false));
    return subStateNodes;
  };
  /**
   * Returns `true` if this state node explicitly handles the given event.
   *
   * @param event The event in question
   */


  StateNode.prototype.handles = function (event) {
    var eventType = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.getEventType)(event);
    return this.events.includes(eventType);
  };
  /**
   * Resolves the given `state` to a new `State` instance relative to this machine.
   *
   * This ensures that `.events` and `.nextEvents` represent the correct values.
   *
   * @param state The state to resolve
   */


  StateNode.prototype.resolveState = function (state) {
    var stateFromConfig = state instanceof _State_js__WEBPACK_IMPORTED_MODULE_7__.State ? state : _State_js__WEBPACK_IMPORTED_MODULE_7__.State.create(state);
    var configuration = Array.from((0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getConfiguration)([], this.getStateNodes(stateFromConfig.value)));
    return new _State_js__WEBPACK_IMPORTED_MODULE_7__.State((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, stateFromConfig), {
      value: this.resolve(stateFromConfig.value),
      configuration: configuration,
      done: (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.isInFinalState)(configuration, this),
      tags: (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getTagsFromConfiguration)(configuration),
      machine: this.machine
    }));
  };

  StateNode.prototype.transitionLeafNode = function (stateValue, state, _event) {
    var stateNode = this.getStateNode(stateValue);
    var next = stateNode.next(state, _event);

    if (!next || !next.transitions.length) {
      return this.next(state, _event);
    }

    return next;
  };

  StateNode.prototype.transitionCompoundNode = function (stateValue, state, _event) {
    var subStateKeys = Object.keys(stateValue);
    var stateNode = this.getStateNode(subStateKeys[0]);

    var next = stateNode._transition(stateValue[subStateKeys[0]], state, _event);

    if (!next || !next.transitions.length) {
      return this.next(state, _event);
    }

    return next;
  };

  StateNode.prototype.transitionParallelNode = function (stateValue, state, _event) {
    var e_2, _a;

    var transitionMap = {};

    try {
      for (var _b = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(Object.keys(stateValue)), _c = _b.next(); !_c.done; _c = _b.next()) {
        var subStateKey = _c.value;
        var subStateValue = stateValue[subStateKey];

        if (!subStateValue) {
          continue;
        }

        var subStateNode = this.getStateNode(subStateKey);

        var next = subStateNode._transition(subStateValue, state, _event);

        if (next) {
          transitionMap[subStateKey] = next;
        }
      }
    } catch (e_2_1) {
      e_2 = {
        error: e_2_1
      };
    } finally {
      try {
        if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
      } finally {
        if (e_2) throw e_2.error;
      }
    }

    var stateTransitions = Object.keys(transitionMap).map(function (key) {
      return transitionMap[key];
    });
    var enabledTransitions = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(stateTransitions.map(function (st) {
      return st.transitions;
    }));
    var willTransition = stateTransitions.some(function (st) {
      return st.transitions.length > 0;
    });

    if (!willTransition) {
      return this.next(state, _event);
    }

    var configuration = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(Object.keys(transitionMap).map(function (key) {
      return transitionMap[key].configuration;
    }));
    return {
      transitions: enabledTransitions,
      exitSet: (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(stateTransitions.map(function (t) {
        return t.exitSet;
      })),
      configuration: configuration,
      source: state,
      actions: (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(Object.keys(transitionMap).map(function (key) {
        return transitionMap[key].actions;
      }))
    };
  };

  StateNode.prototype._transition = function (stateValue, state, _event) {
    // leaf node
    if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(stateValue)) {
      return this.transitionLeafNode(stateValue, state, _event);
    } // hierarchical node


    if (Object.keys(stateValue).length === 1) {
      return this.transitionCompoundNode(stateValue, state, _event);
    } // orthogonal node


    return this.transitionParallelNode(stateValue, state, _event);
  };

  StateNode.prototype.getTransitionData = function (state, event) {
    return this._transition(state.value, state, (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(event));
  };

  StateNode.prototype.next = function (state, _event) {
    var e_3, _a;

    var _this = this;

    var eventName = _event.name;
    var actions = [];
    var nextStateNodes = [];
    var selectedTransition;

    try {
      for (var _b = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(this.getCandidates(eventName)), _c = _b.next(); !_c.done; _c = _b.next()) {
        var candidate = _c.value;
        var cond = candidate.cond,
            stateIn = candidate.in;
        var resolvedContext = state.context;
        var isInState = stateIn ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(stateIn) && isStateId(stateIn) ? // Check if in state by ID
        state.matches((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStateValue)(this.getStateNodeById(stateIn).path, this.delimiter)) : // Check if in state by relative grandparent
        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.matchesState)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStateValue)(stateIn, this.delimiter), (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.path)(this.path.slice(0, -2))(state.value)) : true;
        var guardPassed = false;

        try {
          guardPassed = !cond || (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.evaluateGuard)(this.machine, cond, resolvedContext, _event, state);
        } catch (err) {
          throw new Error("Unable to evaluate guard '".concat(cond.name || cond.type, "' in transition for event '").concat(eventName, "' in state node '").concat(this.id, "':\n").concat(err.message));
        }

        if (guardPassed && isInState) {
          if (candidate.target !== undefined) {
            nextStateNodes = candidate.target;
          }

          actions.push.apply(actions, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(candidate.actions), false));
          selectedTransition = candidate;
          break;
        }
      }
    } catch (e_3_1) {
      e_3 = {
        error: e_3_1
      };
    } finally {
      try {
        if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
      } finally {
        if (e_3) throw e_3.error;
      }
    }

    if (!selectedTransition) {
      return undefined;
    }

    if (!nextStateNodes.length) {
      return {
        transitions: [selectedTransition],
        exitSet: [],
        configuration: state.value ? [this] : [],
        source: state,
        actions: actions
      };
    }

    var allNextStateNodes = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(nextStateNodes.map(function (stateNode) {
      return _this.getRelativeStateNodes(stateNode, state.historyValue);
    }));
    var isInternal = !!selectedTransition.internal;
    return {
      transitions: [selectedTransition],
      exitSet: isInternal ? [] : (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(nextStateNodes.map(function (targetNode) {
        return _this.getPotentiallyReenteringNodes(targetNode);
      })),
      configuration: allNextStateNodes,
      source: state,
      actions: actions
    };
  }; // even though the name of this function mentions reentry nodes
  // we are pushing its result into `exitSet`
  // that's because what we exit might be reentered (it's an invariant of reentrancy)


  StateNode.prototype.getPotentiallyReenteringNodes = function (targetNode) {
    if (this.order < targetNode.order) {
      return [this];
    }

    var nodes = [];
    var marker = this;
    var possibleAncestor = targetNode;

    while (marker && marker !== possibleAncestor) {
      nodes.push(marker);
      marker = marker.parent;
    }

    if (marker !== possibleAncestor) {
      // we never got to `possibleAncestor`, therefore the initial `marker` "escapes" it
      // it's in a different part of the tree so no states will be reentered for such an external transition
      return [];
    }

    nodes.push(possibleAncestor);
    return nodes;
  };

  StateNode.prototype.getActions = function (resolvedConfig, isDone, transition, currentContext, _event, prevState, predictableExec) {
    var e_4, _a, e_5, _b;

    var _this = this;

    var prevConfig = prevState ? (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getConfiguration)([], this.getStateNodes(prevState.value)) : [];
    var entrySet = new Set();

    try {
      for (var _c = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(Array.from(resolvedConfig).sort(function (a, b) {
        return a.order - b.order;
      })), _d = _c.next(); !_d.done; _d = _c.next()) {
        var sn = _d.value;

        if (!(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.has)(prevConfig, sn) || (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.has)(transition.exitSet, sn) || sn.parent && entrySet.has(sn.parent)) {
          entrySet.add(sn);
        }
      }
    } catch (e_4_1) {
      e_4 = {
        error: e_4_1
      };
    } finally {
      try {
        if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
      } finally {
        if (e_4) throw e_4.error;
      }
    }

    try {
      for (var prevConfig_1 = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(prevConfig), prevConfig_1_1 = prevConfig_1.next(); !prevConfig_1_1.done; prevConfig_1_1 = prevConfig_1.next()) {
        var sn = prevConfig_1_1.value;

        if (!(0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.has)(resolvedConfig, sn) || (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.has)(transition.exitSet, sn.parent)) {
          transition.exitSet.push(sn);
        }
      }
    } catch (e_5_1) {
      e_5 = {
        error: e_5_1
      };
    } finally {
      try {
        if (prevConfig_1_1 && !prevConfig_1_1.done && (_b = prevConfig_1.return)) _b.call(prevConfig_1);
      } finally {
        if (e_5) throw e_5.error;
      }
    }

    transition.exitSet.sort(function (a, b) {
      return b.order - a.order;
    });
    var entryStates = Array.from(entrySet).sort(function (a, b) {
      return a.order - b.order;
    });
    var exitStates = new Set(transition.exitSet);
    var doneEvents = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(entryStates.map(function (sn) {
      var events = [];

      if (sn.type !== 'final') {
        return events;
      }

      var parent = sn.parent;

      if (!parent.parent) {
        return events;
      }

      events.push((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.done)(sn.id, sn.doneData), // TODO: deprecate - final states should not emit done events for their own state.
      (0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.done)(parent.id, sn.doneData ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapContext)(sn.doneData, currentContext, _event) : undefined));
      var grandparent = parent.parent;

      if (grandparent.type === 'parallel') {
        if ((0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getChildren)(grandparent).every(function (parentNode) {
          return (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.isInFinalState)(transition.configuration, parentNode);
        })) {
          events.push((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.done)(grandparent.id));
        }
      }

      return events;
    }));
    var entryActions = entryStates.map(function (stateNode) {
      var entryActions = stateNode.onEntry;
      var invokeActions = stateNode.activities.map(function (activity) {
        return (0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.start)(activity);
      });
      return {
        type: 'entry',
        actions: (0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActionObjects)(predictableExec ? (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(entryActions), false), (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(invokeActions), false) : (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(invokeActions), false), (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(entryActions), false), _this.machine.options.actions)
      };
    }).concat({
      type: 'state_done',
      actions: doneEvents.map(function (event) {
        return (0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.raise)(event);
      })
    });
    var exitActions = Array.from(exitStates).map(function (stateNode) {
      return {
        type: 'exit',
        actions: (0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActionObjects)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(stateNode.onExit), false), (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(stateNode.activities.map(function (activity) {
          return (0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.stop)(activity);
        })), false), _this.machine.options.actions)
      };
    });
    var actions = exitActions.concat({
      type: 'transition',
      actions: (0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActionObjects)(transition.actions, this.machine.options.actions)
    }).concat(entryActions);

    if (isDone) {
      var stopActions = (0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActionObjects)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(resolvedConfig), false).sort(function (a, b) {
        return b.order - a.order;
      }).map(function (stateNode) {
        return stateNode.onExit;
      })), this.machine.options.actions).filter(function (action) {
        return !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isRaisableAction)(action);
      });
      return actions.concat({
        type: 'stop',
        actions: stopActions
      });
    }

    return actions;
  };
  /**
   * Determines the next state given the current `state` and sent `event`.
   *
   * @param state The current State instance or state value
   * @param event The event that was sent at the current state
   * @param context The current context (extended state) of the current state
   */


  StateNode.prototype.transition = function (state, event, context, exec) {
    if (state === void 0) {
      state = this.initialState;
    }

    var _event = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(event);

    var currentState;

    if (state instanceof _State_js__WEBPACK_IMPORTED_MODULE_7__.State) {
      currentState = context === undefined ? state : this.resolveState(_State_js__WEBPACK_IMPORTED_MODULE_7__.State.from(state, context));
    } else {
      var resolvedStateValue = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(state) ? this.resolve((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.pathToStateValue)(this.getResolvedPath(state))) : this.resolve(state);
      var resolvedContext = context !== null && context !== void 0 ? context : this.machine.context;
      currentState = this.resolveState(_State_js__WEBPACK_IMPORTED_MODULE_7__.State.from(resolvedStateValue, resolvedContext));
    }

    if (!_environment_js__WEBPACK_IMPORTED_MODULE_3__.IS_PRODUCTION && _event.name === WILDCARD) {
      throw new Error("An event cannot have the wildcard type ('".concat(WILDCARD, "')"));
    }

    if (this.strict) {
      if (!this.events.includes(_event.name) && !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isBuiltInEvent)(_event.name)) {
        throw new Error("Machine '".concat(this.id, "' does not accept event '").concat(_event.name, "'"));
      }
    }

    var stateTransition = this._transition(currentState.value, currentState, _event) || {
      transitions: [],
      configuration: [],
      exitSet: [],
      source: currentState,
      actions: []
    };
    var prevConfig = (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getConfiguration)([], this.getStateNodes(currentState.value));
    var resolvedConfig = stateTransition.configuration.length ? (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getConfiguration)(prevConfig, stateTransition.configuration) : prevConfig;
    stateTransition.configuration = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(resolvedConfig), false);
    return this.resolveTransition(stateTransition, currentState, currentState.context, exec, _event);
  };

  StateNode.prototype.resolveRaisedTransition = function (state, _event, originalEvent, predictableExec) {
    var _a;

    var currentActions = state.actions;
    state = this.transition(state, _event, undefined, predictableExec); // Save original event to state
    // TODO: this should be the raised event! Delete in V5 (breaking)

    state._event = originalEvent;
    state.event = originalEvent.data;

    (_a = state.actions).unshift.apply(_a, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(currentActions), false));

    return state;
  };

  StateNode.prototype.resolveTransition = function (stateTransition, currentState, context, predictableExec, _event) {
    var e_6, _a, e_7, _b;

    var _this = this;

    if (_event === void 0) {
      _event = _actions_js__WEBPACK_IMPORTED_MODULE_5__.initEvent;
    }

    var configuration = stateTransition.configuration; // Transition will "apply" if:
    // - this is the initial state (there is no current state)
    // - OR there are transitions

    var willTransition = !currentState || stateTransition.transitions.length > 0;
    var resolvedConfiguration = willTransition ? stateTransition.configuration : currentState ? currentState.configuration : [];
    var isDone = (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.isInFinalState)(resolvedConfiguration, this);
    var resolvedStateValue = willTransition ? (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getValue)(this.machine, configuration) : undefined;
    var historyValue = currentState ? currentState.historyValue ? currentState.historyValue : stateTransition.source ? this.machine.historyValue(currentState.value) : undefined : undefined;
    var actionBlocks = this.getActions(new Set(resolvedConfiguration), isDone, stateTransition, context, _event, currentState, predictableExec);
    var activities = currentState ? (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, currentState.activities) : {};

    try {
      for (var actionBlocks_1 = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(actionBlocks), actionBlocks_1_1 = actionBlocks_1.next(); !actionBlocks_1_1.done; actionBlocks_1_1 = actionBlocks_1.next()) {
        var block = actionBlocks_1_1.value;

        try {
          for (var _c = (e_7 = void 0, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(block.actions)), _d = _c.next(); !_d.done; _d = _c.next()) {
            var action = _d.value;

            if (action.type === _actionTypes_js__WEBPACK_IMPORTED_MODULE_8__.start) {
              activities[action.activity.id || action.activity.type] = action;
            } else if (action.type === _actionTypes_js__WEBPACK_IMPORTED_MODULE_8__.stop) {
              activities[action.activity.id || action.activity.type] = false;
            }
          }
        } catch (e_7_1) {
          e_7 = {
            error: e_7_1
          };
        } finally {
          try {
            if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
          } finally {
            if (e_7) throw e_7.error;
          }
        }
      }
    } catch (e_6_1) {
      e_6 = {
        error: e_6_1
      };
    } finally {
      try {
        if (actionBlocks_1_1 && !actionBlocks_1_1.done && (_a = actionBlocks_1.return)) _a.call(actionBlocks_1);
      } finally {
        if (e_6) throw e_6.error;
      }
    }

    var _e = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.resolveActions)(this, currentState, context, _event, actionBlocks, predictableExec, this.machine.config.predictableActionArguments || this.machine.config.preserveActionOrder), 2),
        resolvedActions = _e[0],
        updatedContext = _e[1];

    var _f = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.partition)(resolvedActions, _utils_js__WEBPACK_IMPORTED_MODULE_0__.isRaisableAction), 2),
        raisedEvents = _f[0],
        nonRaisedActions = _f[1];

    var invokeActions = resolvedActions.filter(function (action) {
      var _a;

      return action.type === _actionTypes_js__WEBPACK_IMPORTED_MODULE_8__.start && ((_a = action.activity) === null || _a === void 0 ? void 0 : _a.type) === _actionTypes_js__WEBPACK_IMPORTED_MODULE_8__.invoke;
    });
    var children = invokeActions.reduce(function (acc, action) {
      acc[action.activity.id] = (0,_Actor_js__WEBPACK_IMPORTED_MODULE_9__.createInvocableActor)(action.activity, _this.machine, updatedContext, _event);
      return acc;
    }, currentState ? (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, currentState.children) : {});
    var nextState = new _State_js__WEBPACK_IMPORTED_MODULE_7__.State({
      value: resolvedStateValue || currentState.value,
      context: updatedContext,
      _event: _event,
      // Persist _sessionid between states
      _sessionid: currentState ? currentState._sessionid : null,
      historyValue: resolvedStateValue ? historyValue ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.updateHistoryValue)(historyValue, resolvedStateValue) : undefined : currentState ? currentState.historyValue : undefined,
      history: !resolvedStateValue || stateTransition.source ? currentState : undefined,
      actions: resolvedStateValue ? nonRaisedActions : [],
      activities: resolvedStateValue ? activities : currentState ? currentState.activities : {},
      events: [],
      configuration: resolvedConfiguration,
      transitions: stateTransition.transitions,
      children: children,
      done: isDone,
      tags: (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.getTagsFromConfiguration)(resolvedConfiguration),
      machine: this
    });
    var didUpdateContext = context !== updatedContext;
    nextState.changed = _event.name === _actionTypes_js__WEBPACK_IMPORTED_MODULE_8__.update || didUpdateContext; // Dispose of penultimate histories to prevent memory leaks

    var history = nextState.history;

    if (history) {
      delete history.history;
    } // There are transient transitions if the machine is not in a final state
    // and if some of the state nodes have transient ("always") transitions.


    var hasAlwaysTransitions = !isDone && (this._transient || configuration.some(function (stateNode) {
      return stateNode._transient;
    })); // If there are no enabled transitions, check if there are transient transitions.
    // If there are transient transitions, continue checking for more transitions
    // because an transient transition should be triggered even if there are no
    // enabled transitions.
    //
    // If we're already working on an transient transition then stop to prevent an infinite loop.
    //
    // Otherwise, if there are no enabled nor transient transitions, we are done.

    if (!willTransition && (!hasAlwaysTransitions || _event.name === NULL_EVENT)) {
      return nextState;
    }

    var maybeNextState = nextState;

    if (!isDone) {
      if (hasAlwaysTransitions) {
        maybeNextState = this.resolveRaisedTransition(maybeNextState, {
          type: _actionTypes_js__WEBPACK_IMPORTED_MODULE_8__.nullEvent
        }, _event, predictableExec);
      }

      while (raisedEvents.length) {
        var raisedEvent = raisedEvents.shift();
        maybeNextState = this.resolveRaisedTransition(maybeNextState, raisedEvent._event, _event, predictableExec);
      }
    } // Detect if state changed


    var changed = maybeNextState.changed || (history ? !!maybeNextState.actions.length || didUpdateContext || typeof history.value !== typeof maybeNextState.value || !(0,_State_js__WEBPACK_IMPORTED_MODULE_7__.stateValuesEqual)(maybeNextState.value, history.value) : undefined);
    maybeNextState.changed = changed; // Preserve original history after raised events

    maybeNextState.history = history;
    return maybeNextState;
  };
  /**
   * Returns the child state node from its relative `stateKey`, or throws.
   */


  StateNode.prototype.getStateNode = function (stateKey) {
    if (isStateId(stateKey)) {
      return this.machine.getStateNodeById(stateKey);
    }

    if (!this.states) {
      throw new Error("Unable to retrieve child state '".concat(stateKey, "' from '").concat(this.id, "'; no child states exist."));
    }

    var result = this.states[stateKey];

    if (!result) {
      throw new Error("Child state '".concat(stateKey, "' does not exist on '").concat(this.id, "'"));
    }

    return result;
  };
  /**
   * Returns the state node with the given `stateId`, or throws.
   *
   * @param stateId The state ID. The prefix "#" is removed.
   */


  StateNode.prototype.getStateNodeById = function (stateId) {
    var resolvedStateId = isStateId(stateId) ? stateId.slice(STATE_IDENTIFIER.length) : stateId;

    if (resolvedStateId === this.id) {
      return this;
    }

    var stateNode = this.machine.idMap[resolvedStateId];

    if (!stateNode) {
      throw new Error("Child state node '#".concat(resolvedStateId, "' does not exist on machine '").concat(this.id, "'"));
    }

    return stateNode;
  };
  /**
   * Returns the relative state node from the given `statePath`, or throws.
   *
   * @param statePath The string or string array relative path to the state node.
   */


  StateNode.prototype.getStateNodeByPath = function (statePath) {
    if (typeof statePath === 'string' && isStateId(statePath)) {
      try {
        return this.getStateNodeById(statePath.slice(1));
      } catch (e) {// try individual paths
        // throw e;
      }
    }

    var arrayStatePath = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStatePath)(statePath, this.delimiter).slice();
    var currentStateNode = this;

    while (arrayStatePath.length) {
      var key = arrayStatePath.shift();

      if (!key.length) {
        break;
      }

      currentStateNode = currentStateNode.getStateNode(key);
    }

    return currentStateNode;
  };
  /**
   * Resolves a partial state value with its full representation in this machine.
   *
   * @param stateValue The partial state value to resolve.
   */


  StateNode.prototype.resolve = function (stateValue) {
    var _a;

    var _this = this;

    if (!stateValue) {
      return this.initialStateValue || EMPTY_OBJECT; // TODO: type-specific properties
    }

    switch (this.type) {
      case 'parallel':
        return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapValues)(this.initialStateValue, function (subStateValue, subStateKey) {
          return subStateValue ? _this.getStateNode(subStateKey).resolve(stateValue[subStateKey] || subStateValue) : EMPTY_OBJECT;
        });

      case 'compound':
        if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(stateValue)) {
          var subStateNode = this.getStateNode(stateValue);

          if (subStateNode.type === 'parallel' || subStateNode.type === 'compound') {
            return _a = {}, _a[stateValue] = subStateNode.initialStateValue, _a;
          }

          return stateValue;
        }

        if (!Object.keys(stateValue).length) {
          return this.initialStateValue || {};
        }

        return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapValues)(stateValue, function (subStateValue, subStateKey) {
          return subStateValue ? _this.getStateNode(subStateKey).resolve(subStateValue) : EMPTY_OBJECT;
        });

      default:
        return stateValue || EMPTY_OBJECT;
    }
  };

  StateNode.prototype.getResolvedPath = function (stateIdentifier) {
    if (isStateId(stateIdentifier)) {
      var stateNode = this.machine.idMap[stateIdentifier.slice(STATE_IDENTIFIER.length)];

      if (!stateNode) {
        throw new Error("Unable to find state node '".concat(stateIdentifier, "'"));
      }

      return stateNode.path;
    }

    return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStatePath)(stateIdentifier, this.delimiter);
  };

  Object.defineProperty(StateNode.prototype, "initialStateValue", {
    get: function () {
      var _a;

      if (this.__cache.initialStateValue) {
        return this.__cache.initialStateValue;
      }

      var initialStateValue;

      if (this.type === 'parallel') {
        initialStateValue = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapFilterValues)(this.states, function (state) {
          return state.initialStateValue || EMPTY_OBJECT;
        }, function (stateNode) {
          return !(stateNode.type === 'history');
        });
      } else if (this.initial !== undefined) {
        if (!this.states[this.initial]) {
          throw new Error("Initial state '".concat(this.initial, "' not found on '").concat(this.key, "'"));
        }

        initialStateValue = (0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.isLeafNode)(this.states[this.initial]) ? this.initial : (_a = {}, _a[this.initial] = this.states[this.initial].initialStateValue, _a);
      } else {
        // The finite state value of a machine without child states is just an empty object
        initialStateValue = {};
      }

      this.__cache.initialStateValue = initialStateValue;
      return this.__cache.initialStateValue;
    },
    enumerable: false,
    configurable: true
  });

  StateNode.prototype.getInitialState = function (stateValue, context) {
    this._init(); // TODO: this should be in the constructor (see note in constructor)


    var configuration = this.getStateNodes(stateValue);
    return this.resolveTransition({
      configuration: configuration,
      exitSet: [],
      transitions: [],
      source: undefined,
      actions: []
    }, undefined, context !== null && context !== void 0 ? context : this.machine.context, undefined);
  };

  Object.defineProperty(StateNode.prototype, "initialState", {
    /**
     * The initial State instance, which includes all actions to be executed from
     * entering the initial state.
     */
    get: function () {
      var initialStateValue = this.initialStateValue;

      if (!initialStateValue) {
        throw new Error("Cannot retrieve initial state from simple state '".concat(this.id, "'."));
      }

      return this.getInitialState(initialStateValue);
    },
    enumerable: false,
    configurable: true
  });
  Object.defineProperty(StateNode.prototype, "target", {
    /**
     * The target state value of the history state node, if it exists. This represents the
     * default state value to transition to if no history value exists yet.
     */
    get: function () {
      var target;

      if (this.type === 'history') {
        var historyConfig = this.config;

        if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(historyConfig.target)) {
          target = isStateId(historyConfig.target) ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.pathToStateValue)(this.machine.getStateNodeById(historyConfig.target).path.slice(this.path.length - 1)) : historyConfig.target;
        } else {
          target = historyConfig.target;
        }
      }

      return target;
    },
    enumerable: false,
    configurable: true
  });
  /**
   * Returns the leaf nodes from a state path relative to this state node.
   *
   * @param relativeStateId The relative state path to retrieve the state nodes
   * @param history The previous state to retrieve history
   * @param resolve Whether state nodes should resolve to initial child state nodes
   */

  StateNode.prototype.getRelativeStateNodes = function (relativeStateId, historyValue, resolve) {
    if (resolve === void 0) {
      resolve = true;
    }

    return resolve ? relativeStateId.type === 'history' ? relativeStateId.resolveHistory(historyValue) : relativeStateId.initialStateNodes : [relativeStateId];
  };

  Object.defineProperty(StateNode.prototype, "initialStateNodes", {
    get: function () {
      var _this = this;

      if ((0,_stateUtils_js__WEBPACK_IMPORTED_MODULE_4__.isLeafNode)(this)) {
        return [this];
      } // Case when state node is compound but no initial state is defined


      if (this.type === 'compound' && !this.initial) {
        if (!_environment_js__WEBPACK_IMPORTED_MODULE_3__.IS_PRODUCTION) {
          (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false, "Compound state node '".concat(this.id, "' has no initial state."));
        }

        return [this];
      }

      var initialStateNodePaths = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStatePaths)(this.initialStateValue);
      return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(initialStateNodePaths.map(function (initialPath) {
        return _this.getFromRelativePath(initialPath);
      }));
    },
    enumerable: false,
    configurable: true
  });
  /**
   * Retrieves state nodes from a relative path to this state node.
   *
   * @param relativePath The relative path from this state node
   * @param historyValue
   */

  StateNode.prototype.getFromRelativePath = function (relativePath) {
    if (!relativePath.length) {
      return [this];
    }

    var _a = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(relativePath),
        stateKey = _a[0],
        childStatePath = _a.slice(1);

    if (!this.states) {
      throw new Error("Cannot retrieve subPath '".concat(stateKey, "' from node with no states"));
    }

    var childStateNode = this.getStateNode(stateKey);

    if (childStateNode.type === 'history') {
      return childStateNode.resolveHistory();
    }

    if (!this.states[stateKey]) {
      throw new Error("Child state '".concat(stateKey, "' does not exist on '").concat(this.id, "'"));
    }

    return this.states[stateKey].getFromRelativePath(childStatePath);
  };

  StateNode.prototype.historyValue = function (relativeStateValue) {
    if (!Object.keys(this.states).length) {
      return undefined;
    }

    return {
      current: relativeStateValue || this.initialStateValue,
      states: (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapFilterValues)(this.states, function (stateNode, key) {
        if (!relativeStateValue) {
          return stateNode.historyValue();
        }

        var subStateValue = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(relativeStateValue) ? undefined : relativeStateValue[key];
        return stateNode.historyValue(subStateValue || stateNode.initialStateValue);
      }, function (stateNode) {
        return !stateNode.history;
      })
    };
  };
  /**
   * Resolves to the historical value(s) of the parent state node,
   * represented by state nodes.
   *
   * @param historyValue
   */


  StateNode.prototype.resolveHistory = function (historyValue) {
    var _this = this;

    if (this.type !== 'history') {
      return [this];
    }

    var parent = this.parent;

    if (!historyValue) {
      var historyTarget = this.target;
      return historyTarget ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStatePaths)(historyTarget).map(function (relativeChildPath) {
        return parent.getFromRelativePath(relativeChildPath);
      })) : parent.initialStateNodes;
    }

    var subHistoryValue = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.nestedPath)(parent.path, 'states')(historyValue).current;

    if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(subHistoryValue)) {
      return [parent.getStateNode(subHistoryValue)];
    }

    return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toStatePaths)(subHistoryValue).map(function (subStatePath) {
      return _this.history === 'deep' ? parent.getFromRelativePath(subStatePath) : [parent.states[subStatePath[0]]];
    }));
  };

  Object.defineProperty(StateNode.prototype, "stateIds", {
    /**
     * All the state node IDs of this state node and its descendant state nodes.
     */
    get: function () {
      var _this = this;

      var childStateIds = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(Object.keys(this.states).map(function (stateKey) {
        return _this.states[stateKey].stateIds;
      }));
      return [this.id].concat(childStateIds);
    },
    enumerable: false,
    configurable: true
  });
  Object.defineProperty(StateNode.prototype, "events", {
    /**
     * All the event types accepted by this state node and its descendants.
     */
    get: function () {
      var e_8, _a, e_9, _b;

      if (this.__cache.events) {
        return this.__cache.events;
      }

      var states = this.states;
      var events = new Set(this.ownEvents);

      if (states) {
        try {
          for (var _c = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(Object.keys(states)), _d = _c.next(); !_d.done; _d = _c.next()) {
            var stateId = _d.value;
            var state = states[stateId];

            if (state.states) {
              try {
                for (var _e = (e_9 = void 0, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(state.events)), _f = _e.next(); !_f.done; _f = _e.next()) {
                  var event_1 = _f.value;
                  events.add("".concat(event_1));
                }
              } catch (e_9_1) {
                e_9 = {
                  error: e_9_1
                };
              } finally {
                try {
                  if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
                } finally {
                  if (e_9) throw e_9.error;
                }
              }
            }
          }
        } catch (e_8_1) {
          e_8 = {
            error: e_8_1
          };
        } finally {
          try {
            if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
          } finally {
            if (e_8) throw e_8.error;
          }
        }
      }

      return this.__cache.events = Array.from(events);
    },
    enumerable: false,
    configurable: true
  });
  Object.defineProperty(StateNode.prototype, "ownEvents", {
    /**
     * All the events that have transitions directly from this state node.
     *
     * Excludes any inert events.
     */
    get: function () {
      var events = new Set(this.transitions.filter(function (transition) {
        return !(!transition.target && !transition.actions.length && transition.internal);
      }).map(function (transition) {
        return transition.eventType;
      }));
      return Array.from(events);
    },
    enumerable: false,
    configurable: true
  });

  StateNode.prototype.resolveTarget = function (_target) {
    var _this = this;

    if (_target === undefined) {
      // an undefined target signals that the state node should not transition from that state when receiving that event
      return undefined;
    }

    return _target.map(function (target) {
      if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(target)) {
        return target;
      }

      var isInternalTarget = target[0] === _this.delimiter; // If internal target is defined on machine,
      // do not include machine key on target

      if (isInternalTarget && !_this.parent) {
        return _this.getStateNodeByPath(target.slice(1));
      }

      var resolvedTarget = isInternalTarget ? _this.key + target : target;

      if (_this.parent) {
        try {
          var targetStateNode = _this.parent.getStateNodeByPath(resolvedTarget);

          return targetStateNode;
        } catch (err) {
          throw new Error("Invalid transition definition for state node '".concat(_this.id, "':\n").concat(err.message));
        }
      } else {
        return _this.getStateNodeByPath(resolvedTarget);
      }
    });
  };

  StateNode.prototype.formatTransition = function (transitionConfig) {
    var _this = this;

    var normalizedTarget = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.normalizeTarget)(transitionConfig.target);
    var internal = 'internal' in transitionConfig ? transitionConfig.internal : normalizedTarget ? normalizedTarget.some(function (_target) {
      return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(_target) && _target[0] === _this.delimiter;
    }) : true;
    var guards = this.machine.options.guards;
    var target = this.resolveTarget(normalizedTarget);

    var transition = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, transitionConfig), {
      actions: (0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.toActionObjects)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(transitionConfig.actions)),
      cond: (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toGuard)(transitionConfig.cond, guards),
      target: target,
      source: this,
      internal: internal,
      eventType: transitionConfig.event,
      toJSON: function () {
        return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, transition), {
          target: transition.target ? transition.target.map(function (t) {
            return "#".concat(t.id);
          }) : undefined,
          source: "#".concat(_this.id)
        });
      }
    });

    return transition;
  };

  StateNode.prototype.formatTransitions = function () {
    var e_10, _a;

    var _this = this;

    var onConfig;

    if (!this.config.on) {
      onConfig = [];
    } else if (Array.isArray(this.config.on)) {
      onConfig = this.config.on;
    } else {
      var _b = this.config.on,
          _c = WILDCARD,
          _d = _b[_c],
          wildcardConfigs = _d === void 0 ? [] : _d,
          strictTransitionConfigs_1 = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__rest)(_b, [typeof _c === "symbol" ? _c : _c + ""]);

      onConfig = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(Object.keys(strictTransitionConfigs_1).map(function (key) {
        if (!_environment_js__WEBPACK_IMPORTED_MODULE_3__.IS_PRODUCTION && key === NULL_EVENT) {
          (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false, "Empty string transition configs (e.g., `{ on: { '': ... }}`) for transient transitions are deprecated. Specify the transition in the `{ always: ... }` property instead. " + "Please check the `on` configuration for \"#".concat(_this.id, "\"."));
        }

        var transitionConfigArray = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toTransitionConfigArray)(key, strictTransitionConfigs_1[key]);

        if (!_environment_js__WEBPACK_IMPORTED_MODULE_3__.IS_PRODUCTION) {
          validateArrayifiedTransitions(_this, key, transitionConfigArray);
        }

        return transitionConfigArray;
      }).concat((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toTransitionConfigArray)(WILDCARD, wildcardConfigs)));
    }

    var eventlessConfig = this.config.always ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toTransitionConfigArray)('', this.config.always) : [];
    var doneConfig = this.config.onDone ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toTransitionConfigArray)(String((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.done)(this.id)), this.config.onDone) : [];

    if (!_environment_js__WEBPACK_IMPORTED_MODULE_3__.IS_PRODUCTION) {
      (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(!(this.config.onDone && !this.parent), "Root nodes cannot have an \".onDone\" transition. Please check the config of \"".concat(this.id, "\"."));
    }

    var invokeConfig = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(this.invoke.map(function (invokeDef) {
      var settleTransitions = [];

      if (invokeDef.onDone) {
        settleTransitions.push.apply(settleTransitions, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toTransitionConfigArray)(String((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.doneInvoke)(invokeDef.id)), invokeDef.onDone)), false));
      }

      if (invokeDef.onError) {
        settleTransitions.push.apply(settleTransitions, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toTransitionConfigArray)(String((0,_actions_js__WEBPACK_IMPORTED_MODULE_5__.error)(invokeDef.id)), invokeDef.onError)), false));
      }

      return settleTransitions;
    }));
    var delayedTransitions = this.after;
    var formattedTransitions = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(doneConfig), false), (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(invokeConfig), false), (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(onConfig), false), (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(eventlessConfig), false).map(function (transitionConfig) {
      return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toArray)(transitionConfig).map(function (transition) {
        return _this.formatTransition(transition);
      });
    }));

    try {
      for (var delayedTransitions_1 = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(delayedTransitions), delayedTransitions_1_1 = delayedTransitions_1.next(); !delayedTransitions_1_1.done; delayedTransitions_1_1 = delayedTransitions_1.next()) {
        var delayedTransition = delayedTransitions_1_1.value;
        formattedTransitions.push(delayedTransition);
      }
    } catch (e_10_1) {
      e_10 = {
        error: e_10_1
      };
    } finally {
      try {
        if (delayedTransitions_1_1 && !delayedTransitions_1_1.done && (_a = delayedTransitions_1.return)) _a.call(delayedTransitions_1);
      } finally {
        if (e_10) throw e_10.error;
      }
    }

    return formattedTransitions;
  };

  return StateNode;
}();




/***/ }),

/***/ "./node_modules/xstate/es/_virtual/_tslib.js":
/*!***************************************************!*\
  !*** ./node_modules/xstate/es/_virtual/_tslib.js ***!
  \***************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   __assign: () => (/* binding */ __assign),
/* harmony export */   __read: () => (/* binding */ __read),
/* harmony export */   __rest: () => (/* binding */ __rest),
/* harmony export */   __spreadArray: () => (/* binding */ __spreadArray),
/* harmony export */   __values: () => (/* binding */ __values)
/* harmony export */ });
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */

var __assign = function() {
    __assign = Object.assign || function __assign(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};

function __rest(s, e) {
    var t = {};
    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
        t[p] = s[p];
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                t[p[i]] = s[p[i]];
        }
    return t;
}

function __values(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
}

function __read(o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
}

function __spreadArray(to, from, pack) {
    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
        if (ar || !(i in from)) {
            if (!ar) ar = Array.prototype.slice.call(from, 0, i);
            ar[i] = from[i];
        }
    }
    return to.concat(ar || Array.prototype.slice.call(from));
}




/***/ }),

/***/ "./node_modules/xstate/es/actionTypes.js":
/*!***********************************************!*\
  !*** ./node_modules/xstate/es/actionTypes.js ***!
  \***********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   after: () => (/* binding */ after),
/* harmony export */   assign: () => (/* binding */ assign),
/* harmony export */   cancel: () => (/* binding */ cancel),
/* harmony export */   choose: () => (/* binding */ choose),
/* harmony export */   doneState: () => (/* binding */ doneState),
/* harmony export */   error: () => (/* binding */ error),
/* harmony export */   errorExecution: () => (/* binding */ errorExecution),
/* harmony export */   errorPlatform: () => (/* binding */ errorPlatform),
/* harmony export */   init: () => (/* binding */ init),
/* harmony export */   invoke: () => (/* binding */ invoke),
/* harmony export */   log: () => (/* binding */ log),
/* harmony export */   nullEvent: () => (/* binding */ nullEvent),
/* harmony export */   pure: () => (/* binding */ pure),
/* harmony export */   raise: () => (/* binding */ raise),
/* harmony export */   send: () => (/* binding */ send),
/* harmony export */   start: () => (/* binding */ start),
/* harmony export */   stop: () => (/* binding */ stop),
/* harmony export */   update: () => (/* binding */ update)
/* harmony export */ });
/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types.js */ "./node_modules/xstate/es/types.js");


var start = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Start;
var stop = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Stop;
var raise = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Raise;
var send = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Send;
var cancel = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Cancel;
var nullEvent = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.NullEvent;
var assign = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Assign;
var after = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.After;
var doneState = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.DoneState;
var log = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Log;
var init = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Init;
var invoke = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Invoke;
var errorExecution = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.ErrorExecution;
var errorPlatform = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.ErrorPlatform;
var error = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.ErrorCustom;
var update = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Update;
var choose = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Choose;
var pure = _types_js__WEBPACK_IMPORTED_MODULE_0__.ActionTypes.Pure;




/***/ }),

/***/ "./node_modules/xstate/es/actions.js":
/*!*******************************************!*\
  !*** ./node_modules/xstate/es/actions.js ***!
  \*******************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   actionTypes: () => (/* reexport module object */ _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__),
/* harmony export */   after: () => (/* binding */ after),
/* harmony export */   assign: () => (/* binding */ assign),
/* harmony export */   cancel: () => (/* binding */ cancel),
/* harmony export */   choose: () => (/* binding */ choose),
/* harmony export */   done: () => (/* binding */ done),
/* harmony export */   doneInvoke: () => (/* binding */ doneInvoke),
/* harmony export */   error: () => (/* binding */ error),
/* harmony export */   escalate: () => (/* binding */ escalate),
/* harmony export */   forwardTo: () => (/* binding */ forwardTo),
/* harmony export */   getActionFunction: () => (/* binding */ getActionFunction),
/* harmony export */   initEvent: () => (/* binding */ initEvent),
/* harmony export */   isActionObject: () => (/* binding */ isActionObject),
/* harmony export */   log: () => (/* binding */ log),
/* harmony export */   pure: () => (/* binding */ pure),
/* harmony export */   raise: () => (/* binding */ raise),
/* harmony export */   resolveActions: () => (/* binding */ resolveActions),
/* harmony export */   resolveLog: () => (/* binding */ resolveLog),
/* harmony export */   resolveRaise: () => (/* binding */ resolveRaise),
/* harmony export */   resolveSend: () => (/* binding */ resolveSend),
/* harmony export */   resolveStop: () => (/* binding */ resolveStop),
/* harmony export */   respond: () => (/* binding */ respond),
/* harmony export */   send: () => (/* binding */ send),
/* harmony export */   sendParent: () => (/* binding */ sendParent),
/* harmony export */   sendTo: () => (/* binding */ sendTo),
/* harmony export */   sendUpdate: () => (/* binding */ sendUpdate),
/* harmony export */   start: () => (/* binding */ start),
/* harmony export */   stop: () => (/* binding */ stop),
/* harmony export */   toActionObject: () => (/* binding */ toActionObject),
/* harmony export */   toActionObjects: () => (/* binding */ toActionObjects),
/* harmony export */   toActivityDefinition: () => (/* binding */ toActivityDefinition)
/* harmony export */ });
/* harmony import */ var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_virtual/_tslib.js */ "./node_modules/xstate/es/_virtual/_tslib.js");
/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./types.js */ "./node_modules/xstate/es/types.js");
/* harmony import */ var _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actionTypes.js */ "./node_modules/xstate/es/actionTypes.js");
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ "./node_modules/xstate/es/utils.js");
/* harmony import */ var _environment_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./environment.js */ "./node_modules/xstate/es/environment.js");








var initEvent = /*#__PURE__*/(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toSCXMLEvent)({
  type: _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.init
});
function getActionFunction(actionType, actionFunctionMap) {
  return actionFunctionMap ? actionFunctionMap[actionType] || undefined : undefined;
}
function toActionObject(action, actionFunctionMap) {
  var actionObject;

  if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isString)(action) || typeof action === 'number') {
    var exec = getActionFunction(action, actionFunctionMap);

    if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(exec)) {
      actionObject = {
        type: action,
        exec: exec
      };
    } else if (exec) {
      actionObject = exec;
    } else {
      actionObject = {
        type: action,
        exec: undefined
      };
    }
  } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(action)) {
    actionObject = {
      // Convert action to string if unnamed
      type: action.name || action.toString(),
      exec: action
    };
  } else {
    var exec = getActionFunction(action.type, actionFunctionMap);

    if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(exec)) {
      actionObject = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, action), {
        exec: exec
      });
    } else if (exec) {
      var actionType = exec.type || action.type;
      actionObject = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, exec), action), {
        type: actionType
      });
    } else {
      actionObject = action;
    }
  }

  return actionObject;
}
var toActionObjects = function (action, actionFunctionMap) {
  if (!action) {
    return [];
  }

  var actions = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(action) ? action : [action];
  return actions.map(function (subAction) {
    return toActionObject(subAction, actionFunctionMap);
  });
};
function toActivityDefinition(action) {
  var actionObject = toActionObject(action);
  return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({
    id: (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isString)(action) ? action : actionObject.id
  }, actionObject), {
    type: actionObject.type
  });
}
/**
 * Raises an event. This places the event in the internal event queue, so that
 * the event is immediately consumed by the machine in the current step.
 *
 * @param eventType The event to raise.
 */

function raise(event, options) {
  return {
    type: _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.raise,
    event: typeof event === 'function' ? event : (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toEventObject)(event),
    delay: options ? options.delay : undefined,
    id: options === null || options === void 0 ? void 0 : options.id
  };
}
function resolveRaise(action, ctx, _event, delaysMap) {
  var meta = {
    _event: _event
  };
  var resolvedEvent = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toSCXMLEvent)((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(action.event) ? action.event(ctx, _event.data, meta) : action.event);
  var resolvedDelay;

  if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isString)(action.delay)) {
    var configDelay = delaysMap && delaysMap[action.delay];
    resolvedDelay = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(configDelay) ? configDelay(ctx, _event.data, meta) : configDelay;
  } else {
    resolvedDelay = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(action.delay) ? action.delay(ctx, _event.data, meta) : action.delay;
  }

  return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, action), {
    type: _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.raise,
    _event: resolvedEvent,
    delay: resolvedDelay
  });
}
/**
 * Sends an event. This returns an action that will be read by an interpreter to
 * send the event in the next step, after the current step is finished executing.
 *
 * @deprecated Use the `sendTo(...)` action creator instead.
 *
 * @param event The event to send.
 * @param options Options to pass into the send event:
 *  - `id` - The unique send event identifier (used with `cancel()`).
 *  - `delay` - The number of milliseconds to delay the sending of the event.
 *  - `to` - The target of this event (by default, the machine the event was sent from).
 */

function send(event, options) {
  return {
    to: options ? options.to : undefined,
    type: _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.send,
    event: (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(event) ? event : (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toEventObject)(event),
    delay: options ? options.delay : undefined,
    // TODO: don't auto-generate IDs here like that
    // there is too big chance of the ID collision
    id: options && options.id !== undefined ? options.id : (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(event) ? event.name : (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.getEventType)(event)
  };
}
function resolveSend(action, ctx, _event, delaysMap) {
  var meta = {
    _event: _event
  }; // TODO: helper function for resolving Expr

  var resolvedEvent = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toSCXMLEvent)((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(action.event) ? action.event(ctx, _event.data, meta) : action.event);
  var resolvedDelay;

  if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isString)(action.delay)) {
    var configDelay = delaysMap && delaysMap[action.delay];
    resolvedDelay = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(configDelay) ? configDelay(ctx, _event.data, meta) : configDelay;
  } else {
    resolvedDelay = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(action.delay) ? action.delay(ctx, _event.data, meta) : action.delay;
  }

  var resolvedTarget = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(action.to) ? action.to(ctx, _event.data, meta) : action.to;
  return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, action), {
    to: resolvedTarget,
    _event: resolvedEvent,
    event: resolvedEvent.data,
    delay: resolvedDelay
  });
}
/**
 * Sends an event to this machine's parent.
 *
 * @param event The event to send to the parent machine.
 * @param options Options to pass into the send event.
 */

function sendParent(event, options) {
  return send(event, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, options), {
    to: _types_js__WEBPACK_IMPORTED_MODULE_3__.SpecialTargets.Parent
  }));
}
/**
 * Sends an event to an actor.
 *
 * @param actor The `ActorRef` to send the event to.
 * @param event The event to send, or an expression that evaluates to the event to send
 * @param options Send action options
 * @returns An XState send action object
 */

function sendTo(actor, event, options) {
  return send(event, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, options), {
    to: actor
  }));
}
/**
 * Sends an update event to this machine's parent.
 */

function sendUpdate() {
  return sendParent(_actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.update);
}
/**
 * Sends an event back to the sender of the original event.
 *
 * @param event The event to send back to the sender
 * @param options Options to pass into the send event
 */

function respond(event, options) {
  return send(event, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, options), {
    to: function (_, __, _a) {
      var _event = _a._event;
      return _event.origin; // TODO: handle when _event.origin is undefined
    }
  }));
}

var defaultLogExpr = function (context, event) {
  return {
    context: context,
    event: event
  };
};
/**
 *
 * @param expr The expression function to evaluate which will be logged.
 *  Takes in 2 arguments:
 *  - `ctx` - the current state context
 *  - `event` - the event that caused this action to be executed.
 * @param label The label to give to the logged expression.
 */


function log(expr, label) {
  if (expr === void 0) {
    expr = defaultLogExpr;
  }

  return {
    type: _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.log,
    label: label,
    expr: expr
  };
}
var resolveLog = function (action, ctx, _event) {
  return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, action), {
    value: (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isString)(action.expr) ? action.expr : action.expr(ctx, _event.data, {
      _event: _event
    })
  });
};
/**
 * Cancels an in-flight `send(...)` action. A canceled sent action will not
 * be executed, nor will its event be sent, unless it has already been sent
 * (e.g., if `cancel(...)` is called after the `send(...)` action's `delay`).
 *
 * @param sendId The `id` of the `send(...)` action to cancel.
 */

var cancel = function (sendId) {
  return {
    type: _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.cancel,
    sendId: sendId
  };
};
/**
 * Starts an activity.
 *
 * @param activity The activity to start.
 */

function start(activity) {
  var activityDef = toActivityDefinition(activity);
  return {
    type: _types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.Start,
    activity: activityDef,
    exec: undefined
  };
}
/**
 * Stops an activity.
 *
 * @param actorRef The activity to stop.
 */

function stop(actorRef) {
  var activity = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(actorRef) ? actorRef : toActivityDefinition(actorRef);
  return {
    type: _types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.Stop,
    activity: activity,
    exec: undefined
  };
}
function resolveStop(action, context, _event) {
  var actorRefOrString = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(action.activity) ? action.activity(context, _event.data) : action.activity;
  var resolvedActorRef = typeof actorRefOrString === 'string' ? {
    id: actorRefOrString
  } : actorRefOrString;
  var actionObject = {
    type: _types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.Stop,
    activity: resolvedActorRef
  };
  return actionObject;
}
/**
 * Updates the current context of the machine.
 *
 * @param assignment An object that represents the partial context to update.
 */

var assign = function (assignment) {
  return {
    type: _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.assign,
    assignment: assignment
  };
};
function isActionObject(action) {
  return typeof action === 'object' && 'type' in action;
}
/**
 * Returns an event type that represents an implicit event that
 * is sent after the specified `delay`.
 *
 * @param delayRef The delay in milliseconds
 * @param id The state node ID where this event is handled
 */

function after(delayRef, id) {
  var idSuffix = id ? "#".concat(id) : '';
  return "".concat(_types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.After, "(").concat(delayRef, ")").concat(idSuffix);
}
/**
 * Returns an event that represents that a final state node
 * has been reached in the parent state node.
 *
 * @param id The final state node's parent state node `id`
 * @param data The data to pass into the event
 */

function done(id, data) {
  var type = "".concat(_types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.DoneState, ".").concat(id);
  var eventObject = {
    type: type,
    data: data
  };

  eventObject.toString = function () {
    return type;
  };

  return eventObject;
}
/**
 * Returns an event that represents that an invoked service has terminated.
 *
 * An invoked service is terminated when it has reached a top-level final state node,
 * but not when it is canceled.
 *
 * @param id The final state node ID
 * @param data The data to pass into the event
 */

function doneInvoke(id, data) {
  var type = "".concat(_types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.DoneInvoke, ".").concat(id);
  var eventObject = {
    type: type,
    data: data
  };

  eventObject.toString = function () {
    return type;
  };

  return eventObject;
}
function error(id, data) {
  var type = "".concat(_types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.ErrorPlatform, ".").concat(id);
  var eventObject = {
    type: type,
    data: data
  };

  eventObject.toString = function () {
    return type;
  };

  return eventObject;
}
function pure(getActions) {
  return {
    type: _types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.Pure,
    get: getActions
  };
}
/**
 * Forwards (sends) an event to a specified service.
 *
 * @param target The target service to forward the event to.
 * @param options Options to pass into the send action creator.
 */

function forwardTo(target, options) {
  if (!_environment_js__WEBPACK_IMPORTED_MODULE_4__.IS_PRODUCTION && (!target || typeof target === 'function')) {
    var originalTarget_1 = target;

    target = function () {
      var args = [];

      for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
      }

      var resolvedTarget = typeof originalTarget_1 === 'function' ? originalTarget_1.apply(void 0, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(args), false)) : originalTarget_1;

      if (!resolvedTarget) {
        throw new Error("Attempted to forward event to undefined actor. This risks an infinite loop in the sender.");
      }

      return resolvedTarget;
    };
  }

  return send(function (_, event) {
    return event;
  }, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, options), {
    to: target
  }));
}
/**
 * Escalates an error by sending it as an event to this machine's parent.
 *
 * @param errorData The error data to send, or the expression function that
 * takes in the `context`, `event`, and `meta`, and returns the error data to send.
 * @param options Options to pass into the send action creator.
 */

function escalate(errorData, options) {
  return sendParent(function (context, event, meta) {
    return {
      type: _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.error,
      data: (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFunction)(errorData) ? errorData(context, event, meta) : errorData
    };
  }, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, options), {
    to: _types_js__WEBPACK_IMPORTED_MODULE_3__.SpecialTargets.Parent
  }));
}
function choose(conds) {
  return {
    type: _types_js__WEBPACK_IMPORTED_MODULE_3__.ActionTypes.Choose,
    conds: conds
  };
}

var pluckAssigns = function (actionBlocks) {
  var e_1, _a;

  var assignActions = [];

  try {
    for (var actionBlocks_1 = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(actionBlocks), actionBlocks_1_1 = actionBlocks_1.next(); !actionBlocks_1_1.done; actionBlocks_1_1 = actionBlocks_1.next()) {
      var block = actionBlocks_1_1.value;
      var i = 0;

      while (i < block.actions.length) {
        if (block.actions[i].type === _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.assign) {
          assignActions.push(block.actions[i]);
          block.actions.splice(i, 1);
          continue;
        }

        i++;
      }
    }
  } catch (e_1_1) {
    e_1 = {
      error: e_1_1
    };
  } finally {
    try {
      if (actionBlocks_1_1 && !actionBlocks_1_1.done && (_a = actionBlocks_1.return)) _a.call(actionBlocks_1);
    } finally {
      if (e_1) throw e_1.error;
    }
  }

  return assignActions;
};

function resolveActions(machine, currentState, currentContext, _event, actionBlocks, predictableExec, preserveActionOrder) {
  if (preserveActionOrder === void 0) {
    preserveActionOrder = false;
  }

  var assignActions = preserveActionOrder ? [] : pluckAssigns(actionBlocks);
  var updatedContext = assignActions.length ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.updateContext)(currentContext, _event, assignActions, currentState) : currentContext;
  var preservedContexts = preserveActionOrder ? [currentContext] : undefined;
  var deferredToBlockEnd = [];

  function handleAction(blockType, actionObject) {
    var _a;

    switch (actionObject.type) {
      case _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.raise:
        {
          var raisedAction = resolveRaise(actionObject, updatedContext, _event, machine.options.delays);

          if (predictableExec && typeof raisedAction.delay === 'number') {
            predictableExec(raisedAction, updatedContext, _event);
          }

          return raisedAction;
        }

      case _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.send:
        var sendAction = resolveSend(actionObject, updatedContext, _event, machine.options.delays); // TODO: fix ActionTypes.Init

        if (!_environment_js__WEBPACK_IMPORTED_MODULE_4__.IS_PRODUCTION) {
          var configuredDelay = actionObject.delay; // warn after resolving as we can create better contextual message here

          (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.warn)(!(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isString)(configuredDelay) || typeof sendAction.delay === 'number', // tslint:disable-next-line:max-line-length
          "No delay reference for delay expression '".concat(configuredDelay, "' was found on machine '").concat(machine.id, "'"));
        }

        if (predictableExec && sendAction.to !== _types_js__WEBPACK_IMPORTED_MODULE_3__.SpecialTargets.Internal) {
          if (blockType === 'entry') {
            deferredToBlockEnd.push(sendAction);
          } else {
            predictableExec(sendAction, updatedContext, _event);
          }
        }

        return sendAction;

      case _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.log:
        {
          var resolved = resolveLog(actionObject, updatedContext, _event);
          predictableExec === null || predictableExec === void 0 ? void 0 : predictableExec(resolved, updatedContext, _event);
          return resolved;
        }

      case _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.choose:
        {
          var chooseAction = actionObject;
          var matchedActions = (_a = chooseAction.conds.find(function (condition) {
            var guard = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toGuard)(condition.cond, machine.options.guards);
            return !guard || (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.evaluateGuard)(machine, guard, updatedContext, _event, !predictableExec ? currentState : undefined);
          })) === null || _a === void 0 ? void 0 : _a.actions;

          if (!matchedActions) {
            return [];
          }

          var _b = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(resolveActions(machine, currentState, updatedContext, _event, [{
            type: blockType,
            actions: toActionObjects((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toArray)(matchedActions), machine.options.actions)
          }], predictableExec, preserveActionOrder), 2),
              resolvedActionsFromChoose = _b[0],
              resolvedContextFromChoose = _b[1];

          updatedContext = resolvedContextFromChoose;
          preservedContexts === null || preservedContexts === void 0 ? void 0 : preservedContexts.push(updatedContext);
          return resolvedActionsFromChoose;
        }

      case _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.pure:
        {
          var matchedActions = actionObject.get(updatedContext, _event.data);

          if (!matchedActions) {
            return [];
          }

          var _c = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(resolveActions(machine, currentState, updatedContext, _event, [{
            type: blockType,
            actions: toActionObjects((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toArray)(matchedActions), machine.options.actions)
          }], predictableExec, preserveActionOrder), 2),
              resolvedActionsFromPure = _c[0],
              resolvedContext = _c[1];

          updatedContext = resolvedContext;
          preservedContexts === null || preservedContexts === void 0 ? void 0 : preservedContexts.push(updatedContext);
          return resolvedActionsFromPure;
        }

      case _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.stop:
        {
          var resolved = resolveStop(actionObject, updatedContext, _event);
          predictableExec === null || predictableExec === void 0 ? void 0 : predictableExec(resolved, currentContext, _event);
          return resolved;
        }

      case _actionTypes_js__WEBPACK_IMPORTED_MODULE_0__.assign:
        {
          updatedContext = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.updateContext)(updatedContext, _event, [actionObject], !predictableExec ? currentState : undefined);
          preservedContexts === null || preservedContexts === void 0 ? void 0 : preservedContexts.push(updatedContext);
          break;
        }

      default:
        var resolvedActionObject = toActionObject(actionObject, machine.options.actions);
        var exec_1 = resolvedActionObject.exec;

        if (predictableExec) {
          predictableExec(resolvedActionObject, updatedContext, _event);
        } else if (exec_1 && preservedContexts) {
          var contextIndex_1 = preservedContexts.length - 1;

          var wrapped = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__assign)({}, resolvedActionObject), {
            exec: function (_ctx) {
              var args = [];

              for (var _i = 1; _i < arguments.length; _i++) {
                args[_i - 1] = arguments[_i];
              }

              exec_1.apply(void 0, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__spreadArray)([preservedContexts[contextIndex_1]], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__read)(args), false));
            }
          });

          resolvedActionObject = wrapped;
        }

        return resolvedActionObject;
    }
  }

  function processBlock(block) {
    var e_2, _a;

    var resolvedActions = [];

    try {
      for (var _b = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_2__.__values)(block.actions), _c = _b.next(); !_c.done; _c = _b.next()) {
        var action = _c.value;
        var resolved = handleAction(block.type, action);

        if (resolved) {
          resolvedActions = resolvedActions.concat(resolved);
        }
      }
    } catch (e_2_1) {
      e_2 = {
        error: e_2_1
      };
    } finally {
      try {
        if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
      } finally {
        if (e_2) throw e_2.error;
      }
    }

    deferredToBlockEnd.forEach(function (action) {
      predictableExec(action, updatedContext, _event);
    });
    deferredToBlockEnd.length = 0;
    return resolvedActions;
  }

  var resolvedActions = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.flatten)(actionBlocks.map(processBlock));
  return [resolvedActions, updatedContext];
}




/***/ }),

/***/ "./node_modules/xstate/es/behaviors.js":
/*!*********************************************!*\
  !*** ./node_modules/xstate/es/behaviors.js ***!
  \*********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   fromPromise: () => (/* binding */ fromPromise),
/* harmony export */   fromReducer: () => (/* binding */ fromReducer),
/* harmony export */   spawnBehavior: () => (/* binding */ spawnBehavior)
/* harmony export */ });
/* harmony import */ var _actions_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions.js */ "./node_modules/xstate/es/actions.js");
/* harmony import */ var _Actor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Actor.js */ "./node_modules/xstate/es/Actor.js");
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils.js */ "./node_modules/xstate/es/utils.js");




/**
 * Returns an actor behavior from a reducer and its initial state.
 *
 * @param transition The pure reducer that returns the next state given the current state and event.
 * @param initialState The initial state of the reducer.
 * @returns An actor behavior
 */

function fromReducer(transition, initialState) {
  return {
    transition: transition,
    initialState: initialState
  };
}
function fromPromise(promiseFn) {
  var initialState = {
    error: undefined,
    data: undefined,
    status: 'pending'
  };
  return {
    transition: function (state, event, _a) {
      var parent = _a.parent,
          id = _a.id,
          observers = _a.observers;

      switch (event.type) {
        case 'fulfill':
          parent === null || parent === void 0 ? void 0 : parent.send((0,_actions_js__WEBPACK_IMPORTED_MODULE_0__.doneInvoke)(id, event.data));
          return {
            error: undefined,
            data: event.data,
            status: 'fulfilled'
          };

        case 'reject':
          parent === null || parent === void 0 ? void 0 : parent.send((0,_actions_js__WEBPACK_IMPORTED_MODULE_0__.error)(id, event.error));
          observers.forEach(function (observer) {
            observer.error(event.error);
          });
          return {
            error: event.error,
            data: undefined,
            status: 'rejected'
          };

        default:
          return state;
      }
    },
    initialState: initialState,
    start: function (_a) {
      var self = _a.self;
      promiseFn().then(function (data) {
        self.send({
          type: 'fulfill',
          data: data
        });
      }, function (reason) {
        self.send({
          type: 'reject',
          error: reason
        });
      });
      return initialState;
    }
  };
}
function spawnBehavior(behavior, options) {
  if (options === void 0) {
    options = {};
  }

  var state = behavior.initialState;
  var observers = new Set();
  var mailbox = [];
  var flushing = false;

  var flush = function () {
    if (flushing) {
      return;
    }

    flushing = true;

    while (mailbox.length > 0) {
      var event_1 = mailbox.shift();
      state = behavior.transition(state, event_1, actorCtx);
      observers.forEach(function (observer) {
        return observer.next(state);
      });
    }

    flushing = false;
  };

  var actor = (0,_Actor_js__WEBPACK_IMPORTED_MODULE_1__.toActorRef)({
    id: options.id,
    send: function (event) {
      mailbox.push(event);
      flush();
    },
    getSnapshot: function () {
      return state;
    },
    subscribe: function (next, handleError, complete) {
      var observer = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.toObserver)(next, handleError, complete);
      observers.add(observer);
      observer.next(state);
      return {
        unsubscribe: function () {
          observers.delete(observer);
        }
      };
    }
  });
  var actorCtx = {
    parent: options.parent,
    self: actor,
    id: options.id || 'anonymous',
    observers: observers
  };
  state = behavior.start ? behavior.start(actorCtx) : state;
  return actor;
}




/***/ }),

/***/ "./node_modules/xstate/es/constants.js":
/*!*********************************************!*\
  !*** ./node_modules/xstate/es/constants.js ***!
  \*********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   DEFAULT_GUARD_TYPE: () => (/* binding */ DEFAULT_GUARD_TYPE),
/* harmony export */   EMPTY_ACTIVITY_MAP: () => (/* binding */ EMPTY_ACTIVITY_MAP),
/* harmony export */   STATE_DELIMITER: () => (/* binding */ STATE_DELIMITER),
/* harmony export */   TARGETLESS_KEY: () => (/* binding */ TARGETLESS_KEY)
/* harmony export */ });
var STATE_DELIMITER = '.';
var EMPTY_ACTIVITY_MAP = {};
var DEFAULT_GUARD_TYPE = 'xstate.guard';
var TARGETLESS_KEY = '';




/***/ }),

/***/ "./node_modules/xstate/es/devTools.js":
/*!********************************************!*\
  !*** ./node_modules/xstate/es/devTools.js ***!
  \********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   getGlobal: () => (/* binding */ getGlobal),
/* harmony export */   registerService: () => (/* binding */ registerService)
/* harmony export */ });
/* harmony import */ var _environment_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./environment.js */ "./node_modules/xstate/es/environment.js");


function getGlobal() {
  if (typeof globalThis !== 'undefined') {
    return globalThis;
  }

  if (typeof self !== 'undefined') {
    return self;
  }

  if (typeof window !== 'undefined') {
    return window;
  }

  if (typeof __webpack_require__.g !== 'undefined') {
    return __webpack_require__.g;
  }

  if (!_environment_js__WEBPACK_IMPORTED_MODULE_0__.IS_PRODUCTION) {
    console.warn('XState could not find a global object in this environment. Please let the maintainers know and raise an issue here: https://github.com/statelyai/xstate/issues');
  }
}

function getDevTools() {
  var global = getGlobal();

  if (global && '__xstate__' in global) {
    return global.__xstate__;
  }

  return undefined;
}

function registerService(service) {
  if (!getGlobal()) {
    return;
  }

  var devTools = getDevTools();

  if (devTools) {
    devTools.register(service);
  }
}




/***/ }),

/***/ "./node_modules/xstate/es/environment.js":
/*!***********************************************!*\
  !*** ./node_modules/xstate/es/environment.js ***!
  \***********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   IS_PRODUCTION: () => (/* binding */ IS_PRODUCTION)
/* harmony export */ });
var IS_PRODUCTION = "development" === 'production';




/***/ }),

/***/ "./node_modules/xstate/es/interpreter.js":
/*!***********************************************!*\
  !*** ./node_modules/xstate/es/interpreter.js ***!
  \***********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   Interpreter: () => (/* binding */ Interpreter),
/* harmony export */   InterpreterStatus: () => (/* binding */ InterpreterStatus),
/* harmony export */   interpret: () => (/* binding */ interpret),
/* harmony export */   spawn: () => (/* binding */ spawn)
/* harmony export */ });
/* harmony import */ var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_virtual/_tslib.js */ "./node_modules/xstate/es/_virtual/_tslib.js");
/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./types.js */ "./node_modules/xstate/es/types.js");
/* harmony import */ var _State_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./State.js */ "./node_modules/xstate/es/State.js");
/* harmony import */ var _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./actionTypes.js */ "./node_modules/xstate/es/actionTypes.js");
/* harmony import */ var _actions_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./actions.js */ "./node_modules/xstate/es/actions.js");
/* harmony import */ var _environment_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./environment.js */ "./node_modules/xstate/es/environment.js");
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./node_modules/xstate/es/utils.js");
/* harmony import */ var _scheduler_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./scheduler.js */ "./node_modules/xstate/es/scheduler.js");
/* harmony import */ var _Actor_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Actor.js */ "./node_modules/xstate/es/Actor.js");
/* harmony import */ var _registry_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./registry.js */ "./node_modules/xstate/es/registry.js");
/* harmony import */ var _devTools_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./devTools.js */ "./node_modules/xstate/es/devTools.js");
/* harmony import */ var _serviceScope_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./serviceScope.js */ "./node_modules/xstate/es/serviceScope.js");
/* harmony import */ var _behaviors_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./behaviors.js */ "./node_modules/xstate/es/behaviors.js");














var DEFAULT_SPAWN_OPTIONS = {
  sync: false,
  autoForward: false
};
var InterpreterStatus;

(function (InterpreterStatus) {
  InterpreterStatus[InterpreterStatus["NotStarted"] = 0] = "NotStarted";
  InterpreterStatus[InterpreterStatus["Running"] = 1] = "Running";
  InterpreterStatus[InterpreterStatus["Stopped"] = 2] = "Stopped";
})(InterpreterStatus || (InterpreterStatus = {}));

var Interpreter =
/*#__PURE__*/

/** @class */
function () {
  /**
   * Creates a new Interpreter instance (i.e., service) for the given machine with the provided options, if any.
   *
   * @param machine The machine to be interpreted
   * @param options Interpreter options
   */
  function Interpreter(machine, options) {
    if (options === void 0) {
      options = Interpreter.defaultOptions;
    }

    var _this = this;

    this.machine = machine;
    this.delayedEventsMap = {};
    this.listeners = new Set();
    this.contextListeners = new Set();
    this.stopListeners = new Set();
    this.doneListeners = new Set();
    this.eventListeners = new Set();
    this.sendListeners = new Set();
    /**
     * Whether the service is started.
     */

    this.initialized = false;
    this.status = InterpreterStatus.NotStarted;
    this.children = new Map();
    this.forwardTo = new Set();
    this._outgoingQueue = [];
    /**
     * Alias for Interpreter.prototype.start
     */

    this.init = this.start;
    /**
     * Sends an event to the running interpreter to trigger a transition.
     *
     * An array of events (batched) can be sent as well, which will send all
     * batched events to the running interpreter. The listeners will be
     * notified only **once** when all events are processed.
     *
     * @param event The event(s) to send
     */

    this.send = function (event, payload) {
      if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(event)) {
        _this.batch(event);

        return _this.state;
      }

      var _event = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toEventObject)(event, payload));

      if (_this.status === InterpreterStatus.Stopped) {
        // do nothing
        if (!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION) {
          (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false, "Event \"".concat(_event.name, "\" was sent to stopped service \"").concat(_this.machine.id, "\". This service has already reached its final state, and will not transition.\nEvent: ").concat(JSON.stringify(_event.data)));
        }

        return _this.state;
      }

      if (_this.status !== InterpreterStatus.Running && !_this.options.deferEvents) {
        throw new Error("Event \"".concat(_event.name, "\" was sent to uninitialized service \"").concat(_this.machine.id // tslint:disable-next-line:max-line-length
        , "\". Make sure .start() is called for this service, or set { deferEvents: true } in the service options.\nEvent: ").concat(JSON.stringify(_event.data)));
      }

      _this.scheduler.schedule(function () {
        // Forward copy of event to child actors
        _this.forward(_event);

        var nextState = _this._nextState(_event);

        _this.update(nextState, _event);
      });

      return _this._state; // TODO: deprecate (should return void)
      // tslint:disable-next-line:semicolon
    };

    this.sendTo = function (event, to, immediate) {
      var isParent = _this.parent && (to === _types_js__WEBPACK_IMPORTED_MODULE_2__.SpecialTargets.Parent || _this.parent.id === to);
      var target = isParent ? _this.parent : (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(to) ? to === _types_js__WEBPACK_IMPORTED_MODULE_2__.SpecialTargets.Internal ? _this : _this.children.get(to) || _registry_js__WEBPACK_IMPORTED_MODULE_3__.registry.get(to) : (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isActor)(to) ? to : undefined;

      if (!target) {
        if (!isParent) {
          throw new Error("Unable to send event to child '".concat(to, "' from service '").concat(_this.id, "'."));
        } // tslint:disable-next-line:no-console


        if (!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION) {
          (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false, "Service '".concat(_this.id, "' has no parent: unable to send event ").concat(event.type));
        }

        return;
      }

      if ('machine' in target) {
        // perhaps those events should be rejected in the parent
        // but atm it doesn't have easy access to all of the information that is required to do it reliably
        if (_this.status !== InterpreterStatus.Stopped || _this.parent !== target || // we need to send events to the parent from exit handlers of a machine that reached its final state
        _this.state.done) {
          // Send SCXML events to machines
          var scxmlEvent = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({}, event), {
            name: event.name === _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.error ? "".concat((0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.error)(_this.id)) : event.name,
            origin: _this.sessionId
          });

          if (!immediate && _this.machine.config.predictableActionArguments) {
            _this._outgoingQueue.push([target, scxmlEvent]);
          } else {
            target.send(scxmlEvent);
          }
        }
      } else {
        // Send normal events to other targets
        if (!immediate && _this.machine.config.predictableActionArguments) {
          _this._outgoingQueue.push([target, event.data]);
        } else {
          target.send(event.data);
        }
      }
    };

    this._exec = function (action, context, _event, actionFunctionMap) {
      if (actionFunctionMap === void 0) {
        actionFunctionMap = _this.machine.options.actions;
      }

      var actionOrExec = action.exec || (0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.getActionFunction)(action.type, actionFunctionMap);
      var exec = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(actionOrExec) ? actionOrExec : actionOrExec ? actionOrExec.exec : action.exec;

      if (exec) {
        try {
          return exec(context, _event.data, !_this.machine.config.predictableActionArguments ? {
            action: action,
            state: _this.state,
            _event: _event
          } : {
            action: action,
            _event: _event
          });
        } catch (err) {
          if (_this.parent) {
            _this.parent.send({
              type: 'xstate.error',
              data: err
            });
          }

          throw err;
        }
      }

      switch (action.type) {
        case _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.raise:
          {
            // if raise action reached the interpreter then it's a delayed one
            var sendAction_1 = action;

            _this.defer(sendAction_1);

            break;
          }

        case _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.send:
          var sendAction = action;

          if (typeof sendAction.delay === 'number') {
            _this.defer(sendAction);

            return;
          } else {
            if (sendAction.to) {
              _this.sendTo(sendAction._event, sendAction.to, _event === _actions_js__WEBPACK_IMPORTED_MODULE_6__.initEvent);
            } else {
              _this.send(sendAction._event);
            }
          }

          break;

        case _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.cancel:
          _this.cancel(action.sendId);

          break;

        case _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.start:
          {
            if (_this.status !== InterpreterStatus.Running) {
              return;
            }

            var activity = action.activity; // If the activity will be stopped right after it's started
            // (such as in transient states)
            // don't bother starting the activity.

            if ( // in v4 with `predictableActionArguments` invokes are called eagerly when the `this.state` still points to the previous state
            !_this.machine.config.predictableActionArguments && !_this.state.activities[activity.id || activity.type]) {
              break;
            } // Invoked services


            if (activity.type === _types_js__WEBPACK_IMPORTED_MODULE_2__.ActionTypes.Invoke) {
              var invokeSource = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toInvokeSource)(activity.src);
              var serviceCreator = _this.machine.options.services ? _this.machine.options.services[invokeSource.type] : undefined;
              var id = activity.id,
                  data = activity.data;

              if (!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION) {
                (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(!('forward' in activity), // tslint:disable-next-line:max-line-length
                "`forward` property is deprecated (found in invocation of '".concat(activity.src, "' in in machine '").concat(_this.machine.id, "'). ") + "Please use `autoForward` instead.");
              }

              var autoForward = 'autoForward' in activity ? activity.autoForward : !!activity.forward;

              if (!serviceCreator) {
                // tslint:disable-next-line:no-console
                if (!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION) {
                  (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false, "No service found for invocation '".concat(activity.src, "' in machine '").concat(_this.machine.id, "'."));
                }

                return;
              }

              var resolvedData = data ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapContext)(data, context, _event) : undefined;

              if (typeof serviceCreator === 'string') {
                // TODO: warn
                return;
              }

              var source = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(serviceCreator) ? serviceCreator(context, _event.data, {
                data: resolvedData,
                src: invokeSource,
                meta: activity.meta
              }) : serviceCreator;

              if (!source) {
                // TODO: warn?
                return;
              }

              var options = void 0;

              if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(source)) {
                source = resolvedData ? source.withContext(resolvedData) : source;
                options = {
                  autoForward: autoForward
                };
              }

              _this.spawn(source, id, options);
            } else {
              _this.spawnActivity(activity);
            }

            break;
          }

        case _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.stop:
          {
            _this.stopChild(action.activity.id);

            break;
          }

        case _actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.log:
          var _a = action,
              label = _a.label,
              value = _a.value;

          if (label) {
            _this.logger(label, value);
          } else {
            _this.logger(value);
          }

          break;

        default:
          if (!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION) {
            (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false, "No implementation found for action type '".concat(action.type, "'"));
          }

          break;
      }
    };

    var resolvedOptions = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({}, Interpreter.defaultOptions), options);

    var clock = resolvedOptions.clock,
        logger = resolvedOptions.logger,
        parent = resolvedOptions.parent,
        id = resolvedOptions.id;
    var resolvedId = id !== undefined ? id : machine.id;
    this.id = resolvedId;
    this.logger = logger;
    this.clock = clock;
    this.parent = parent;
    this.options = resolvedOptions;
    this.scheduler = new _scheduler_js__WEBPACK_IMPORTED_MODULE_7__.Scheduler({
      deferEvents: this.options.deferEvents
    });
    this.sessionId = _registry_js__WEBPACK_IMPORTED_MODULE_3__.registry.bookId();
  }

  Object.defineProperty(Interpreter.prototype, "initialState", {
    get: function () {
      var _this = this;

      if (this._initialState) {
        return this._initialState;
      }

      return (0,_serviceScope_js__WEBPACK_IMPORTED_MODULE_8__.provide)(this, function () {
        _this._initialState = _this.machine.initialState;
        return _this._initialState;
      });
    },
    enumerable: false,
    configurable: true
  });
  Object.defineProperty(Interpreter.prototype, "state", {
    /**
     * @deprecated Use `.getSnapshot()` instead.
     */
    get: function () {
      if (!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION) {
        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(this.status !== InterpreterStatus.NotStarted, "Attempted to read state from uninitialized service '".concat(this.id, "'. Make sure the service is started first."));
      }

      return this._state;
    },
    enumerable: false,
    configurable: true
  });
  /**
   * Executes the actions of the given state, with that state's `context` and `event`.
   *
   * @param state The state whose actions will be executed
   * @param actionsConfig The action implementations to use
   */

  Interpreter.prototype.execute = function (state, actionsConfig) {
    var e_1, _a;

    try {
      for (var _b = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(state.actions), _c = _b.next(); !_c.done; _c = _b.next()) {
        var action = _c.value;
        this.exec(action, state, actionsConfig);
      }
    } catch (e_1_1) {
      e_1 = {
        error: e_1_1
      };
    } finally {
      try {
        if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
      } finally {
        if (e_1) throw e_1.error;
      }
    }
  };

  Interpreter.prototype.update = function (state, _event) {
    var e_2, _a, e_3, _b, e_4, _c, e_5, _d;

    var _this = this; // Attach session ID to state


    state._sessionid = this.sessionId; // Update state

    this._state = state; // Execute actions

    if ((!this.machine.config.predictableActionArguments || // this is currently required to execute initial actions as the `initialState` gets cached
    // we can't just recompute it (and execute actions while doing so) because we try to preserve identity of actors created within initial assigns
    _event === _actions_js__WEBPACK_IMPORTED_MODULE_6__.initEvent) && this.options.execute) {
      this.execute(this.state);
    } else {
      var item = void 0;

      while (item = this._outgoingQueue.shift()) {
        item[0].send(item[1]);
      }
    } // Update children


    this.children.forEach(function (child) {
      _this.state.children[child.id] = child;
    }); // Dev tools

    if (this.devTools) {
      this.devTools.send(_event.data, state);
    } // Execute listeners


    if (state.event) {
      try {
        for (var _e = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.eventListeners), _f = _e.next(); !_f.done; _f = _e.next()) {
          var listener = _f.value;
          listener(state.event);
        }
      } catch (e_2_1) {
        e_2 = {
          error: e_2_1
        };
      } finally {
        try {
          if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
        } finally {
          if (e_2) throw e_2.error;
        }
      }
    }

    try {
      for (var _g = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.listeners), _h = _g.next(); !_h.done; _h = _g.next()) {
        var listener = _h.value;
        listener(state, state.event);
      }
    } catch (e_3_1) {
      e_3 = {
        error: e_3_1
      };
    } finally {
      try {
        if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
      } finally {
        if (e_3) throw e_3.error;
      }
    }

    try {
      for (var _j = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.contextListeners), _k = _j.next(); !_k.done; _k = _j.next()) {
        var contextListener = _k.value;
        contextListener(this.state.context, this.state.history ? this.state.history.context : undefined);
      }
    } catch (e_4_1) {
      e_4 = {
        error: e_4_1
      };
    } finally {
      try {
        if (_k && !_k.done && (_c = _j.return)) _c.call(_j);
      } finally {
        if (e_4) throw e_4.error;
      }
    }

    if (this.state.done) {
      // get final child state node
      var finalChildStateNode = state.configuration.find(function (sn) {
        return sn.type === 'final' && sn.parent === _this.machine;
      });
      var doneData = finalChildStateNode && finalChildStateNode.doneData ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mapContext)(finalChildStateNode.doneData, state.context, _event) : undefined;
      this._doneEvent = (0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.doneInvoke)(this.id, doneData);

      try {
        for (var _l = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.doneListeners), _m = _l.next(); !_m.done; _m = _l.next()) {
          var listener = _m.value;
          listener(this._doneEvent);
        }
      } catch (e_5_1) {
        e_5 = {
          error: e_5_1
        };
      } finally {
        try {
          if (_m && !_m.done && (_d = _l.return)) _d.call(_l);
        } finally {
          if (e_5) throw e_5.error;
        }
      }

      this._stop();

      this._stopChildren();

      _registry_js__WEBPACK_IMPORTED_MODULE_3__.registry.free(this.sessionId);
    }
  };
  /*
   * Adds a listener that is notified whenever a state transition happens. The listener is called with
   * the next state and the event object that caused the state transition.
   *
   * @param listener The state listener
   */


  Interpreter.prototype.onTransition = function (listener) {
    this.listeners.add(listener); // Send current state to listener

    if (this.status === InterpreterStatus.Running) {
      listener(this.state, this.state.event);
    }

    return this;
  };

  Interpreter.prototype.subscribe = function (nextListenerOrObserver, _, // TODO: error listener
  completeListener) {
    var _this = this;

    var observer = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toObserver)(nextListenerOrObserver, _, completeListener);
    this.listeners.add(observer.next); // Send current state to listener

    if (this.status !== InterpreterStatus.NotStarted) {
      observer.next(this.state);
    }

    var completeOnce = function () {
      _this.doneListeners.delete(completeOnce);

      _this.stopListeners.delete(completeOnce);

      observer.complete();
    };

    if (this.status === InterpreterStatus.Stopped) {
      observer.complete();
    } else {
      this.onDone(completeOnce);
      this.onStop(completeOnce);
    }

    return {
      unsubscribe: function () {
        _this.listeners.delete(observer.next);

        _this.doneListeners.delete(completeOnce);

        _this.stopListeners.delete(completeOnce);
      }
    };
  };
  /**
   * Adds an event listener that is notified whenever an event is sent to the running interpreter.
   * @param listener The event listener
   */


  Interpreter.prototype.onEvent = function (listener) {
    this.eventListeners.add(listener);
    return this;
  };
  /**
   * Adds an event listener that is notified whenever a `send` event occurs.
   * @param listener The event listener
   */


  Interpreter.prototype.onSend = function (listener) {
    this.sendListeners.add(listener);
    return this;
  };
  /**
   * Adds a context listener that is notified whenever the state context changes.
   * @param listener The context listener
   */


  Interpreter.prototype.onChange = function (listener) {
    this.contextListeners.add(listener);
    return this;
  };
  /**
   * Adds a listener that is notified when the machine is stopped.
   * @param listener The listener
   */


  Interpreter.prototype.onStop = function (listener) {
    this.stopListeners.add(listener);
    return this;
  };
  /**
   * Adds a state listener that is notified when the statechart has reached its final state.
   * @param listener The state listener
   */


  Interpreter.prototype.onDone = function (listener) {
    if (this.status === InterpreterStatus.Stopped && this._doneEvent) {
      listener(this._doneEvent);
    } else {
      this.doneListeners.add(listener);
    }

    return this;
  };
  /**
   * Removes a listener.
   * @param listener The listener to remove
   */


  Interpreter.prototype.off = function (listener) {
    this.listeners.delete(listener);
    this.eventListeners.delete(listener);
    this.sendListeners.delete(listener);
    this.stopListeners.delete(listener);
    this.doneListeners.delete(listener);
    this.contextListeners.delete(listener);
    return this;
  };
  /**
   * Starts the interpreter from the given state, or the initial state.
   * @param initialState The state to start the statechart from
   */


  Interpreter.prototype.start = function (initialState) {
    var _this = this;

    if (this.status === InterpreterStatus.Running) {
      // Do not restart the service if it is already started
      return this;
    } // yes, it's a hack but we need the related cache to be populated for some things to work (like delayed transitions)
    // this is usually called by `machine.getInitialState` but if we rehydrate from a state we might bypass this call
    // we also don't want to call this method here as it resolves the full initial state which might involve calling assign actions
    // and that could potentially lead to some unwanted side-effects (even such as creating some rogue actors)


    this.machine._init();

    _registry_js__WEBPACK_IMPORTED_MODULE_3__.registry.register(this.sessionId, this);
    this.initialized = true;
    this.status = InterpreterStatus.Running;
    var resolvedState = initialState === undefined ? this.initialState : (0,_serviceScope_js__WEBPACK_IMPORTED_MODULE_8__.provide)(this, function () {
      return (0,_State_js__WEBPACK_IMPORTED_MODULE_9__.isStateConfig)(initialState) ? _this.machine.resolveState(initialState) : _this.machine.resolveState(_State_js__WEBPACK_IMPORTED_MODULE_9__.State.from(initialState, _this.machine.context));
    });

    if (this.options.devTools) {
      this.attachDev();
    }

    this.scheduler.initialize(function () {
      _this.update(resolvedState, _actions_js__WEBPACK_IMPORTED_MODULE_6__.initEvent);
    });
    return this;
  };

  Interpreter.prototype._stopChildren = function () {
    // TODO: think about converting those to actions
    this.children.forEach(function (child) {
      if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(child.stop)) {
        child.stop();
      }
    });
    this.children.clear();
  };

  Interpreter.prototype._stop = function () {
    var e_6, _a, e_7, _b, e_8, _c, e_9, _d, e_10, _e;

    try {
      for (var _f = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.listeners), _g = _f.next(); !_g.done; _g = _f.next()) {
        var listener = _g.value;
        this.listeners.delete(listener);
      }
    } catch (e_6_1) {
      e_6 = {
        error: e_6_1
      };
    } finally {
      try {
        if (_g && !_g.done && (_a = _f.return)) _a.call(_f);
      } finally {
        if (e_6) throw e_6.error;
      }
    }

    try {
      for (var _h = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.stopListeners), _j = _h.next(); !_j.done; _j = _h.next()) {
        var listener = _j.value; // call listener, then remove

        listener();
        this.stopListeners.delete(listener);
      }
    } catch (e_7_1) {
      e_7 = {
        error: e_7_1
      };
    } finally {
      try {
        if (_j && !_j.done && (_b = _h.return)) _b.call(_h);
      } finally {
        if (e_7) throw e_7.error;
      }
    }

    try {
      for (var _k = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.contextListeners), _l = _k.next(); !_l.done; _l = _k.next()) {
        var listener = _l.value;
        this.contextListeners.delete(listener);
      }
    } catch (e_8_1) {
      e_8 = {
        error: e_8_1
      };
    } finally {
      try {
        if (_l && !_l.done && (_c = _k.return)) _c.call(_k);
      } finally {
        if (e_8) throw e_8.error;
      }
    }

    try {
      for (var _m = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.doneListeners), _o = _m.next(); !_o.done; _o = _m.next()) {
        var listener = _o.value;
        this.doneListeners.delete(listener);
      }
    } catch (e_9_1) {
      e_9 = {
        error: e_9_1
      };
    } finally {
      try {
        if (_o && !_o.done && (_d = _m.return)) _d.call(_m);
      } finally {
        if (e_9) throw e_9.error;
      }
    }

    if (!this.initialized) {
      // Interpreter already stopped; do nothing
      return this;
    }

    this.initialized = false;
    this.status = InterpreterStatus.Stopped;
    this._initialState = undefined;

    try {
      // we are going to stop within the current sync frame
      // so we can safely just cancel this here as nothing async should be fired anyway
      for (var _p = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(Object.keys(this.delayedEventsMap)), _q = _p.next(); !_q.done; _q = _p.next()) {
        var key = _q.value;
        this.clock.clearTimeout(this.delayedEventsMap[key]);
      }
    } catch (e_10_1) {
      e_10 = {
        error: e_10_1
      };
    } finally {
      try {
        if (_q && !_q.done && (_e = _p.return)) _e.call(_p);
      } finally {
        if (e_10) throw e_10.error;
      }
    } // clear everything that might be enqueued


    this.scheduler.clear();
    this.scheduler = new _scheduler_js__WEBPACK_IMPORTED_MODULE_7__.Scheduler({
      deferEvents: this.options.deferEvents
    });
  };
  /**
   * Stops the interpreter and unsubscribe all listeners.
   *
   * This will also notify the `onStop` listeners.
   */


  Interpreter.prototype.stop = function () {
    // TODO: add warning for stopping non-root interpreters
    var _this = this; // grab the current scheduler as it will be replaced in _stop


    var scheduler = this.scheduler;

    this._stop(); // let what is currently processed to be finished


    scheduler.schedule(function () {
      // it feels weird to handle this here but we need to handle this even slightly "out of band"
      var _event = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)({
        type: 'xstate.stop'
      });

      var nextState = (0,_serviceScope_js__WEBPACK_IMPORTED_MODULE_8__.provide)(_this, function () {
        var exitActions = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__read)(_this.state.configuration), false).sort(function (a, b) {
          return b.order - a.order;
        }).map(function (stateNode) {
          return (0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.toActionObjects)(stateNode.onExit, _this.machine.options.actions);
        }));

        var _a = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__read)((0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.resolveActions)(_this.machine, _this.state, _this.state.context, _event, [{
          type: 'exit',
          actions: exitActions
        }], _this.machine.config.predictableActionArguments ? _this._exec : undefined, _this.machine.config.predictableActionArguments || _this.machine.config.preserveActionOrder), 2),
            resolvedActions = _a[0],
            updatedContext = _a[1];

        var newState = new _State_js__WEBPACK_IMPORTED_MODULE_9__.State({
          value: _this.state.value,
          context: updatedContext,
          _event: _event,
          _sessionid: _this.sessionId,
          historyValue: undefined,
          history: _this.state,
          actions: resolvedActions.filter(function (action) {
            return !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isRaisableAction)(action);
          }),
          activities: {},
          events: [],
          configuration: [],
          transitions: [],
          children: {},
          done: _this.state.done,
          tags: _this.state.tags,
          machine: _this.machine
        });
        newState.changed = true;
        return newState;
      });

      _this.update(nextState, _event);

      _this._stopChildren();

      _registry_js__WEBPACK_IMPORTED_MODULE_3__.registry.free(_this.sessionId);
    });
    return this;
  };

  Interpreter.prototype.batch = function (events) {
    var _this = this;

    if (this.status === InterpreterStatus.NotStarted && this.options.deferEvents) {
      // tslint:disable-next-line:no-console
      if (!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION) {
        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false, "".concat(events.length, " event(s) were sent to uninitialized service \"").concat(this.machine.id, "\" and are deferred. Make sure .start() is called for this service.\nEvent: ").concat(JSON.stringify(event)));
      }
    } else if (this.status !== InterpreterStatus.Running) {
      throw new Error( // tslint:disable-next-line:max-line-length
      "".concat(events.length, " event(s) were sent to uninitialized service \"").concat(this.machine.id, "\". Make sure .start() is called for this service, or set { deferEvents: true } in the service options."));
    }

    if (!events.length) {
      return;
    }

    var exec = !!this.machine.config.predictableActionArguments && this._exec;
    this.scheduler.schedule(function () {
      var e_11, _a;

      var nextState = _this.state;
      var batchChanged = false;
      var batchedActions = [];

      var _loop_1 = function (event_1) {
        var _event = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(event_1);

        _this.forward(_event);

        nextState = (0,_serviceScope_js__WEBPACK_IMPORTED_MODULE_8__.provide)(_this, function () {
          return _this.machine.transition(nextState, _event, undefined, exec || undefined);
        });
        batchedActions.push.apply(batchedActions, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__read)(_this.machine.config.predictableActionArguments ? nextState.actions : nextState.actions.map(function (a) {
          return (0,_State_js__WEBPACK_IMPORTED_MODULE_9__.bindActionToState)(a, nextState);
        })), false));
        batchChanged = batchChanged || !!nextState.changed;
      };

      try {
        for (var events_1 = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(events), events_1_1 = events_1.next(); !events_1_1.done; events_1_1 = events_1.next()) {
          var event_1 = events_1_1.value;

          _loop_1(event_1);
        }
      } catch (e_11_1) {
        e_11 = {
          error: e_11_1
        };
      } finally {
        try {
          if (events_1_1 && !events_1_1.done && (_a = events_1.return)) _a.call(events_1);
        } finally {
          if (e_11) throw e_11.error;
        }
      }

      nextState.changed = batchChanged;
      nextState.actions = batchedActions;

      _this.update(nextState, (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(events[events.length - 1]));
    });
  };
  /**
   * Returns a send function bound to this interpreter instance.
   *
   * @param event The event to be sent by the sender.
   */


  Interpreter.prototype.sender = function (event) {
    return this.send.bind(this, event);
  };

  Interpreter.prototype._nextState = function (event, exec) {
    var _this = this;

    if (exec === void 0) {
      exec = !!this.machine.config.predictableActionArguments && this._exec;
    }

    var _event = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(event);

    if (_event.name.indexOf(_actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.errorPlatform) === 0 && !this.state.nextEvents.some(function (nextEvent) {
      return nextEvent.indexOf(_actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.errorPlatform) === 0;
    })) {
      throw _event.data.data;
    }

    var nextState = (0,_serviceScope_js__WEBPACK_IMPORTED_MODULE_8__.provide)(this, function () {
      return _this.machine.transition(_this.state, _event, undefined, exec || undefined);
    });
    return nextState;
  };
  /**
   * Returns the next state given the interpreter's current state and the event.
   *
   * This is a pure method that does _not_ update the interpreter's state.
   *
   * @param event The event to determine the next state
   */


  Interpreter.prototype.nextState = function (event) {
    return this._nextState(event, false);
  };

  Interpreter.prototype.forward = function (event) {
    var e_12, _a;

    try {
      for (var _b = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__values)(this.forwardTo), _c = _b.next(); !_c.done; _c = _b.next()) {
        var id = _c.value;
        var child = this.children.get(id);

        if (!child) {
          throw new Error("Unable to forward event '".concat(event, "' from interpreter '").concat(this.id, "' to nonexistant child '").concat(id, "'."));
        }

        child.send(event);
      }
    } catch (e_12_1) {
      e_12 = {
        error: e_12_1
      };
    } finally {
      try {
        if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
      } finally {
        if (e_12) throw e_12.error;
      }
    }
  };

  Interpreter.prototype.defer = function (sendAction) {
    var _this = this;

    var timerId = this.clock.setTimeout(function () {
      if ('to' in sendAction && sendAction.to) {
        _this.sendTo(sendAction._event, sendAction.to, true);
      } else {
        _this.send(sendAction._event);
      }
    }, sendAction.delay);

    if (sendAction.id) {
      this.delayedEventsMap[sendAction.id] = timerId;
    }
  };

  Interpreter.prototype.cancel = function (sendId) {
    this.clock.clearTimeout(this.delayedEventsMap[sendId]);
    delete this.delayedEventsMap[sendId];
  };

  Interpreter.prototype.exec = function (action, state, actionFunctionMap) {
    if (actionFunctionMap === void 0) {
      actionFunctionMap = this.machine.options.actions;
    }

    this._exec(action, state.context, state._event, actionFunctionMap);
  };

  Interpreter.prototype.removeChild = function (childId) {
    var _a;

    this.children.delete(childId);
    this.forwardTo.delete(childId); // this.state might not exist at the time this is called,
    // such as when a child is added then removed while initializing the state

    (_a = this.state) === null || _a === void 0 ? true : delete _a.children[childId];
  };

  Interpreter.prototype.stopChild = function (childId) {
    var child = this.children.get(childId);

    if (!child) {
      return;
    }

    this.removeChild(childId);

    if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(child.stop)) {
      child.stop();
    }
  };

  Interpreter.prototype.spawn = function (entity, name, options) {
    if (this.status !== InterpreterStatus.Running) {
      return (0,_Actor_js__WEBPACK_IMPORTED_MODULE_10__.createDeferredActor)(entity, name);
    }

    if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPromiseLike)(entity)) {
      return this.spawnPromise(Promise.resolve(entity), name);
    } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(entity)) {
      return this.spawnCallback(entity, name);
    } else if ((0,_Actor_js__WEBPACK_IMPORTED_MODULE_10__.isSpawnedActor)(entity)) {
      return this.spawnActor(entity, name);
    } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObservable)(entity)) {
      return this.spawnObservable(entity, name);
    } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(entity)) {
      return this.spawnMachine(entity, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({}, options), {
        id: name
      }));
    } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isBehavior)(entity)) {
      return this.spawnBehavior(entity, name);
    } else {
      throw new Error("Unable to spawn entity \"".concat(name, "\" of type \"").concat(typeof entity, "\"."));
    }
  };

  Interpreter.prototype.spawnMachine = function (machine, options) {
    var _this = this;

    if (options === void 0) {
      options = {};
    }

    var childService = new Interpreter(machine, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({}, this.options), {
      parent: this,
      id: options.id || machine.id
    }));

    var resolvedOptions = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({}, DEFAULT_SPAWN_OPTIONS), options);

    if (resolvedOptions.sync) {
      childService.onTransition(function (state) {
        _this.send(_actionTypes_js__WEBPACK_IMPORTED_MODULE_5__.update, {
          state: state,
          id: childService.id
        });
      });
    }

    var actor = childService;
    this.children.set(childService.id, actor);

    if (resolvedOptions.autoForward) {
      this.forwardTo.add(childService.id);
    }

    childService.onDone(function (doneEvent) {
      _this.removeChild(childService.id);

      _this.send((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(doneEvent, {
        origin: childService.id
      }));
    }).start();
    return actor;
  };

  Interpreter.prototype.spawnBehavior = function (behavior, id) {
    var actorRef = (0,_behaviors_js__WEBPACK_IMPORTED_MODULE_11__.spawnBehavior)(behavior, {
      id: id,
      parent: this
    });
    this.children.set(id, actorRef);
    return actorRef;
  };

  Interpreter.prototype.spawnPromise = function (promise, id) {
    var _a;

    var _this = this;

    var canceled = false;
    var resolvedData;
    promise.then(function (response) {
      if (!canceled) {
        resolvedData = response;

        _this.removeChild(id);

        _this.send((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)((0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.doneInvoke)(id, response), {
          origin: id
        }));
      }
    }, function (errorData) {
      if (!canceled) {
        _this.removeChild(id);

        var errorEvent = (0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.error)(id, errorData);

        try {
          // Send "error.platform.id" to this (parent).
          _this.send((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(errorEvent, {
            origin: id
          }));
        } catch (error) {
          (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.reportUnhandledExceptionOnInvocation)(errorData, error, id);

          if (_this.devTools) {
            _this.devTools.send(errorEvent, _this.state);
          }

          if (_this.machine.strict) {
            // it would be better to always stop the state machine if unhandled
            // exception/promise rejection happens but because we don't want to
            // break existing code so enforce it on strict mode only especially so
            // because documentation says that onError is optional
            _this.stop();
          }
        }
      }
    });
    var actor = (_a = {
      id: id,
      send: function () {
        return void 0;
      },
      subscribe: function (next, handleError, complete) {
        var observer = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toObserver)(next, handleError, complete);
        var unsubscribed = false;
        promise.then(function (response) {
          if (unsubscribed) {
            return;
          }

          observer.next(response);

          if (unsubscribed) {
            return;
          }

          observer.complete();
        }, function (err) {
          if (unsubscribed) {
            return;
          }

          observer.error(err);
        });
        return {
          unsubscribe: function () {
            return unsubscribed = true;
          }
        };
      },
      stop: function () {
        canceled = true;
      },
      toJSON: function () {
        return {
          id: id
        };
      },
      getSnapshot: function () {
        return resolvedData;
      }
    }, _a[_utils_js__WEBPACK_IMPORTED_MODULE_0__.symbolObservable] = function () {
      return this;
    }, _a);
    this.children.set(id, actor);
    return actor;
  };

  Interpreter.prototype.spawnCallback = function (callback, id) {
    var _a;

    var _this = this;

    var canceled = false;
    var receivers = new Set();
    var listeners = new Set();
    var emitted;

    var receive = function (e) {
      emitted = e;
      listeners.forEach(function (listener) {
        return listener(e);
      });

      if (canceled) {
        return;
      }

      _this.send((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(e, {
        origin: id
      }));
    };

    var callbackStop;

    try {
      callbackStop = callback(receive, function (newListener) {
        receivers.add(newListener);
      });
    } catch (err) {
      this.send((0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.error)(id, err));
    }

    if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPromiseLike)(callbackStop)) {
      // it turned out to be an async function, can't reliably check this before calling `callback`
      // because transpiled async functions are not recognizable
      return this.spawnPromise(callbackStop, id);
    }

    var actor = (_a = {
      id: id,
      send: function (event) {
        return receivers.forEach(function (receiver) {
          return receiver(event);
        });
      },
      subscribe: function (next) {
        var observer = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toObserver)(next);
        listeners.add(observer.next);
        return {
          unsubscribe: function () {
            listeners.delete(observer.next);
          }
        };
      },
      stop: function () {
        canceled = true;

        if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(callbackStop)) {
          callbackStop();
        }
      },
      toJSON: function () {
        return {
          id: id
        };
      },
      getSnapshot: function () {
        return emitted;
      }
    }, _a[_utils_js__WEBPACK_IMPORTED_MODULE_0__.symbolObservable] = function () {
      return this;
    }, _a);
    this.children.set(id, actor);
    return actor;
  };

  Interpreter.prototype.spawnObservable = function (source, id) {
    var _a;

    var _this = this;

    var emitted;
    var subscription = source.subscribe(function (value) {
      emitted = value;

      _this.send((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)(value, {
        origin: id
      }));
    }, function (err) {
      _this.removeChild(id);

      _this.send((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)((0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.error)(id, err), {
        origin: id
      }));
    }, function () {
      _this.removeChild(id);

      _this.send((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toSCXMLEvent)((0,_actions_js__WEBPACK_IMPORTED_MODULE_6__.doneInvoke)(id), {
        origin: id
      }));
    });
    var actor = (_a = {
      id: id,
      send: function () {
        return void 0;
      },
      subscribe: function (next, handleError, complete) {
        return source.subscribe(next, handleError, complete);
      },
      stop: function () {
        return subscription.unsubscribe();
      },
      getSnapshot: function () {
        return emitted;
      },
      toJSON: function () {
        return {
          id: id
        };
      }
    }, _a[_utils_js__WEBPACK_IMPORTED_MODULE_0__.symbolObservable] = function () {
      return this;
    }, _a);
    this.children.set(id, actor);
    return actor;
  };

  Interpreter.prototype.spawnActor = function (actor, name) {
    this.children.set(name, actor);
    return actor;
  };

  Interpreter.prototype.spawnActivity = function (activity) {
    var implementation = this.machine.options && this.machine.options.activities ? this.machine.options.activities[activity.type] : undefined;

    if (!implementation) {
      if (!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION) {
        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(false, "No implementation found for activity '".concat(activity.type, "'"));
      } // tslint:disable-next-line:no-console


      return;
    } // Start implementation


    var dispose = implementation(this.state.context, activity);
    this.spawnEffect(activity.id, dispose);
  };

  Interpreter.prototype.spawnEffect = function (id, dispose) {
    var _a;

    this.children.set(id, (_a = {
      id: id,
      send: function () {
        return void 0;
      },
      subscribe: function () {
        return {
          unsubscribe: function () {
            return void 0;
          }
        };
      },
      stop: dispose || undefined,
      getSnapshot: function () {
        return undefined;
      },
      toJSON: function () {
        return {
          id: id
        };
      }
    }, _a[_utils_js__WEBPACK_IMPORTED_MODULE_0__.symbolObservable] = function () {
      return this;
    }, _a));
  };

  Interpreter.prototype.attachDev = function () {
    var global = (0,_devTools_js__WEBPACK_IMPORTED_MODULE_12__.getGlobal)();

    if (this.options.devTools && global) {
      if (global.__REDUX_DEVTOOLS_EXTENSION__) {
        var devToolsOptions = typeof this.options.devTools === 'object' ? this.options.devTools : undefined;
        this.devTools = global.__REDUX_DEVTOOLS_EXTENSION__.connect((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({
          name: this.id,
          autoPause: true,
          stateSanitizer: function (state) {
            return {
              value: state.value,
              context: state.context,
              actions: state.actions
            };
          }
        }, devToolsOptions), {
          features: (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({
            jump: false,
            skip: false
          }, devToolsOptions ? devToolsOptions.features : undefined)
        }), this.machine);
        this.devTools.init(this.state);
      } // add XState-specific dev tooling hook


      (0,_devTools_js__WEBPACK_IMPORTED_MODULE_12__.registerService)(this);
    }
  };

  Interpreter.prototype.toJSON = function () {
    return {
      id: this.id
    };
  };

  Interpreter.prototype[_utils_js__WEBPACK_IMPORTED_MODULE_0__.symbolObservable] = function () {
    return this;
  };

  Interpreter.prototype.getSnapshot = function () {
    if (this.status === InterpreterStatus.NotStarted) {
      return this.initialState;
    }

    return this._state;
  };
  /**
   * The default interpreter options:
   *
   * - `clock` uses the global `setTimeout` and `clearTimeout` functions
   * - `logger` uses the global `console.log()` method
   */


  Interpreter.defaultOptions = {
    execute: true,
    deferEvents: true,
    clock: {
      setTimeout: function (fn, ms) {
        return setTimeout(fn, ms);
      },
      clearTimeout: function (id) {
        return clearTimeout(id);
      }
    },
    logger: /*#__PURE__*/console.log.bind(console),
    devTools: false
  };
  Interpreter.interpret = interpret;
  return Interpreter;
}();

var resolveSpawnOptions = function (nameOrOptions) {
  if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isString)(nameOrOptions)) {
    return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({}, DEFAULT_SPAWN_OPTIONS), {
      name: nameOrOptions
    });
  }

  return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_4__.__assign)({}, DEFAULT_SPAWN_OPTIONS), {
    name: (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.uniqueId)()
  }), nameOrOptions);
};

function spawn(entity, nameOrOptions) {
  var resolvedOptions = resolveSpawnOptions(nameOrOptions);
  return (0,_serviceScope_js__WEBPACK_IMPORTED_MODULE_8__.consume)(function (service) {
    if (!_environment_js__WEBPACK_IMPORTED_MODULE_1__.IS_PRODUCTION) {
      var isLazyEntity = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(entity) || (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFunction)(entity);
      (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.warn)(!!service || isLazyEntity, "Attempted to spawn an Actor (ID: \"".concat((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isMachine)(entity) ? entity.id : 'undefined', "\") outside of a service. This will have no effect."));
    }

    if (service) {
      return service.spawn(entity, resolvedOptions.name, resolvedOptions);
    } else {
      return (0,_Actor_js__WEBPACK_IMPORTED_MODULE_10__.createDeferredActor)(entity, resolvedOptions.name);
    }
  });
}
/**
 * Creates a new Interpreter instance for the given machine with the provided options, if any.
 *
 * @param machine The machine to interpret
 * @param options Interpreter options
 */

function interpret(machine, options) {
  var interpreter = new Interpreter(machine, options);
  return interpreter;
}




/***/ }),

/***/ "./node_modules/xstate/es/invokeUtils.js":
/*!***********************************************!*\
  !*** ./node_modules/xstate/es/invokeUtils.js ***!
  \***********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   toInvokeDefinition: () => (/* binding */ toInvokeDefinition),
/* harmony export */   toInvokeSource: () => (/* binding */ toInvokeSource)
/* harmony export */ });
/* harmony import */ var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_virtual/_tslib.js */ "./node_modules/xstate/es/_virtual/_tslib.js");
/* harmony import */ var _actionTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./actionTypes.js */ "./node_modules/xstate/es/actionTypes.js");






function toInvokeSource(src) {
  if (typeof src === 'string') {
    var simpleSrc = {
      type: src
    };

    simpleSrc.toString = function () {
      return src;
    }; // v4 compat - TODO: remove in v5


    return simpleSrc;
  }

  return src;
}
function toInvokeDefinition(invokeConfig) {
  return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__assign)({
    type: _actionTypes_js__WEBPACK_IMPORTED_MODULE_1__.invoke
  }, invokeConfig), {
    toJSON: function () {
      invokeConfig.onDone;
          invokeConfig.onError;
          var invokeDef = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__rest)(invokeConfig, ["onDone", "onError"]);

      return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__assign)({}, invokeDef), {
        type: _actionTypes_js__WEBPACK_IMPORTED_MODULE_1__.invoke,
        src: toInvokeSource(invokeConfig.src)
      });
    }
  });
}




/***/ }),

/***/ "./node_modules/xstate/es/registry.js":
/*!********************************************!*\
  !*** ./node_modules/xstate/es/registry.js ***!
  \********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   registry: () => (/* binding */ registry)
/* harmony export */ });
var children = /*#__PURE__*/new Map();
var sessionIdIndex = 0;
var registry = {
  bookId: function () {
    return "x:".concat(sessionIdIndex++);
  },
  register: function (id, actor) {
    children.set(id, actor);
    return id;
  },
  get: function (id) {
    return children.get(id);
  },
  free: function (id) {
    children.delete(id);
  }
};




/***/ }),

/***/ "./node_modules/xstate/es/scheduler.js":
/*!*********************************************!*\
  !*** ./node_modules/xstate/es/scheduler.js ***!
  \*********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   Scheduler: () => (/* binding */ Scheduler)
/* harmony export */ });
/* harmony import */ var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_virtual/_tslib.js */ "./node_modules/xstate/es/_virtual/_tslib.js");


var defaultOptions = {
  deferEvents: false
};

var Scheduler =
/*#__PURE__*/

/** @class */
function () {
  function Scheduler(options) {
    this.processingEvent = false;
    this.queue = [];
    this.initialized = false;
    this.options = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_0__.__assign)({}, defaultOptions), options);
  }

  Scheduler.prototype.initialize = function (callback) {
    this.initialized = true;

    if (callback) {
      if (!this.options.deferEvents) {
        this.schedule(callback);
        return;
      }

      this.process(callback);
    }

    this.flushEvents();
  };

  Scheduler.prototype.schedule = function (task) {
    if (!this.initialized || this.processingEvent) {
      this.queue.push(task);
      return;
    }

    if (this.queue.length !== 0) {
      throw new Error('Event queue should be empty when it is not processing events');
    }

    this.process(task);
    this.flushEvents();
  };

  Scheduler.prototype.clear = function () {
    this.queue = [];
  };

  Scheduler.prototype.flushEvents = function () {
    var nextCallback = this.queue.shift();

    while (nextCallback) {
      this.process(nextCallback);
      nextCallback = this.queue.shift();
    }
  };

  Scheduler.prototype.process = function (callback) {
    this.processingEvent = true;

    try {
      callback();
    } catch (e) {
      // there is no use to keep the future events
      // as the situation is not anymore the same
      this.clear();
      throw e;
    } finally {
      this.processingEvent = false;
    }
  };

  return Scheduler;
}();




/***/ }),

/***/ "./node_modules/xstate/es/serviceScope.js":
/*!************************************************!*\
  !*** ./node_modules/xstate/es/serviceScope.js ***!
  \************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   consume: () => (/* binding */ consume),
/* harmony export */   provide: () => (/* binding */ provide)
/* harmony export */ });
/**
 * Maintains a stack of the current service in scope.
 * This is used to provide the correct service to spawn().
 */
var serviceStack = [];
var provide = function (service, fn) {
  serviceStack.push(service);
  var result = fn(service);
  serviceStack.pop();
  return result;
};
var consume = function (fn) {
  return fn(serviceStack[serviceStack.length - 1]);
};




/***/ }),

/***/ "./node_modules/xstate/es/stateUtils.js":
/*!**********************************************!*\
  !*** ./node_modules/xstate/es/stateUtils.js ***!
  \**********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   getAdjList: () => (/* binding */ getAdjList),
/* harmony export */   getAllChildren: () => (/* binding */ getAllChildren),
/* harmony export */   getAllStateNodes: () => (/* binding */ getAllStateNodes),
/* harmony export */   getChildren: () => (/* binding */ getChildren),
/* harmony export */   getConfiguration: () => (/* binding */ getConfiguration),
/* harmony export */   getMeta: () => (/* binding */ getMeta),
/* harmony export */   getTagsFromConfiguration: () => (/* binding */ getTagsFromConfiguration),
/* harmony export */   getValue: () => (/* binding */ getValue),
/* harmony export */   has: () => (/* binding */ has),
/* harmony export */   isInFinalState: () => (/* binding */ isInFinalState),
/* harmony export */   isLeafNode: () => (/* binding */ isLeafNode),
/* harmony export */   nextEvents: () => (/* binding */ nextEvents)
/* harmony export */ });
/* harmony import */ var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_virtual/_tslib.js */ "./node_modules/xstate/es/_virtual/_tslib.js");
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./node_modules/xstate/es/utils.js");



var isLeafNode = function (stateNode) {
  return stateNode.type === 'atomic' || stateNode.type === 'final';
};
function getAllChildren(stateNode) {
  return Object.keys(stateNode.states).map(function (key) {
    return stateNode.states[key];
  });
}
function getChildren(stateNode) {
  return getAllChildren(stateNode).filter(function (sn) {
    return sn.type !== 'history';
  });
}
function getAllStateNodes(stateNode) {
  var stateNodes = [stateNode];

  if (isLeafNode(stateNode)) {
    return stateNodes;
  }

  return stateNodes.concat((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(getChildren(stateNode).map(getAllStateNodes)));
}
function getConfiguration(prevStateNodes, stateNodes) {
  var e_1, _a, e_2, _b, e_3, _c, e_4, _d;

  var prevConfiguration = new Set(prevStateNodes);
  var prevAdjList = getAdjList(prevConfiguration);
  var configuration = new Set(stateNodes);

  try {
    // add all ancestors
    for (var configuration_1 = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(configuration), configuration_1_1 = configuration_1.next(); !configuration_1_1.done; configuration_1_1 = configuration_1.next()) {
      var s = configuration_1_1.value;
      var m = s.parent;

      while (m && !configuration.has(m)) {
        configuration.add(m);
        m = m.parent;
      }
    }
  } catch (e_1_1) {
    e_1 = {
      error: e_1_1
    };
  } finally {
    try {
      if (configuration_1_1 && !configuration_1_1.done && (_a = configuration_1.return)) _a.call(configuration_1);
    } finally {
      if (e_1) throw e_1.error;
    }
  }

  var adjList = getAdjList(configuration);

  try {
    // add descendants
    for (var configuration_2 = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(configuration), configuration_2_1 = configuration_2.next(); !configuration_2_1.done; configuration_2_1 = configuration_2.next()) {
      var s = configuration_2_1.value; // if previously active, add existing child nodes

      if (s.type === 'compound' && (!adjList.get(s) || !adjList.get(s).length)) {
        if (prevAdjList.get(s)) {
          prevAdjList.get(s).forEach(function (sn) {
            return configuration.add(sn);
          });
        } else {
          s.initialStateNodes.forEach(function (sn) {
            return configuration.add(sn);
          });
        }
      } else {
        if (s.type === 'parallel') {
          try {
            for (var _e = (e_3 = void 0, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(getChildren(s))), _f = _e.next(); !_f.done; _f = _e.next()) {
              var child = _f.value;

              if (!configuration.has(child)) {
                configuration.add(child);

                if (prevAdjList.get(child)) {
                  prevAdjList.get(child).forEach(function (sn) {
                    return configuration.add(sn);
                  });
                } else {
                  child.initialStateNodes.forEach(function (sn) {
                    return configuration.add(sn);
                  });
                }
              }
            }
          } catch (e_3_1) {
            e_3 = {
              error: e_3_1
            };
          } finally {
            try {
              if (_f && !_f.done && (_c = _e.return)) _c.call(_e);
            } finally {
              if (e_3) throw e_3.error;
            }
          }
        }
      }
    }
  } catch (e_2_1) {
    e_2 = {
      error: e_2_1
    };
  } finally {
    try {
      if (configuration_2_1 && !configuration_2_1.done && (_b = configuration_2.return)) _b.call(configuration_2);
    } finally {
      if (e_2) throw e_2.error;
    }
  }

  try {
    // add all ancestors
    for (var configuration_3 = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(configuration), configuration_3_1 = configuration_3.next(); !configuration_3_1.done; configuration_3_1 = configuration_3.next()) {
      var s = configuration_3_1.value;
      var m = s.parent;

      while (m && !configuration.has(m)) {
        configuration.add(m);
        m = m.parent;
      }
    }
  } catch (e_4_1) {
    e_4 = {
      error: e_4_1
    };
  } finally {
    try {
      if (configuration_3_1 && !configuration_3_1.done && (_d = configuration_3.return)) _d.call(configuration_3);
    } finally {
      if (e_4) throw e_4.error;
    }
  }

  return configuration;
}

function getValueFromAdj(baseNode, adjList) {
  var childStateNodes = adjList.get(baseNode);

  if (!childStateNodes) {
    return {}; // todo: fix?
  }

  if (baseNode.type === 'compound') {
    var childStateNode = childStateNodes[0];

    if (childStateNode) {
      if (isLeafNode(childStateNode)) {
        return childStateNode.key;
      }
    } else {
      return {};
    }
  }

  var stateValue = {};
  childStateNodes.forEach(function (csn) {
    stateValue[csn.key] = getValueFromAdj(csn, adjList);
  });
  return stateValue;
}

function getAdjList(configuration) {
  var e_5, _a;

  var adjList = new Map();

  try {
    for (var configuration_4 = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(configuration), configuration_4_1 = configuration_4.next(); !configuration_4_1.done; configuration_4_1 = configuration_4.next()) {
      var s = configuration_4_1.value;

      if (!adjList.has(s)) {
        adjList.set(s, []);
      }

      if (s.parent) {
        if (!adjList.has(s.parent)) {
          adjList.set(s.parent, []);
        }

        adjList.get(s.parent).push(s);
      }
    }
  } catch (e_5_1) {
    e_5 = {
      error: e_5_1
    };
  } finally {
    try {
      if (configuration_4_1 && !configuration_4_1.done && (_a = configuration_4.return)) _a.call(configuration_4);
    } finally {
      if (e_5) throw e_5.error;
    }
  }

  return adjList;
}
function getValue(rootNode, configuration) {
  var config = getConfiguration([rootNode], configuration);
  return getValueFromAdj(rootNode, getAdjList(config));
}
function has(iterable, item) {
  if (Array.isArray(iterable)) {
    return iterable.some(function (member) {
      return member === item;
    });
  }

  if (iterable instanceof Set) {
    return iterable.has(item);
  }

  return false; // TODO: fix
}
function nextEvents(configuration) {
  return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__read)(new Set((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__read)(configuration.map(function (sn) {
    return sn.ownEvents;
  })), false)))), false);
}
function isInFinalState(configuration, stateNode) {
  if (stateNode.type === 'compound') {
    return getChildren(stateNode).some(function (s) {
      return s.type === 'final' && has(configuration, s);
    });
  }

  if (stateNode.type === 'parallel') {
    return getChildren(stateNode).every(function (sn) {
      return isInFinalState(configuration, sn);
    });
  }

  return false;
}
function getMeta(configuration) {
  if (configuration === void 0) {
    configuration = [];
  }

  return configuration.reduce(function (acc, stateNode) {
    if (stateNode.meta !== undefined) {
      acc[stateNode.id] = stateNode.meta;
    }

    return acc;
  }, {});
}
function getTagsFromConfiguration(configuration) {
  return new Set((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.flatten)(configuration.map(function (sn) {
    return sn.tags;
  })));
}




/***/ }),

/***/ "./node_modules/xstate/es/types.js":
/*!*****************************************!*\
  !*** ./node_modules/xstate/es/types.js ***!
  \*****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   ActionTypes: () => (/* binding */ ActionTypes),
/* harmony export */   SpecialTargets: () => (/* binding */ SpecialTargets)
/* harmony export */ });
var ActionTypes;

(function (ActionTypes) {
  ActionTypes["Start"] = "xstate.start";
  ActionTypes["Stop"] = "xstate.stop";
  ActionTypes["Raise"] = "xstate.raise";
  ActionTypes["Send"] = "xstate.send";
  ActionTypes["Cancel"] = "xstate.cancel";
  ActionTypes["NullEvent"] = "";
  ActionTypes["Assign"] = "xstate.assign";
  ActionTypes["After"] = "xstate.after";
  ActionTypes["DoneState"] = "done.state";
  ActionTypes["DoneInvoke"] = "done.invoke";
  ActionTypes["Log"] = "xstate.log";
  ActionTypes["Init"] = "xstate.init";
  ActionTypes["Invoke"] = "xstate.invoke";
  ActionTypes["ErrorExecution"] = "error.execution";
  ActionTypes["ErrorCommunication"] = "error.communication";
  ActionTypes["ErrorPlatform"] = "error.platform";
  ActionTypes["ErrorCustom"] = "xstate.error";
  ActionTypes["Update"] = "xstate.update";
  ActionTypes["Pure"] = "xstate.pure";
  ActionTypes["Choose"] = "xstate.choose";
})(ActionTypes || (ActionTypes = {}));

var SpecialTargets;

(function (SpecialTargets) {
  SpecialTargets["Parent"] = "#_parent";
  SpecialTargets["Internal"] = "#_internal";
})(SpecialTargets || (SpecialTargets = {}));




/***/ }),

/***/ "./node_modules/xstate/es/utils.js":
/*!*****************************************!*\
  !*** ./node_modules/xstate/es/utils.js ***!
  \*****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   createInvokeId: () => (/* binding */ createInvokeId),
/* harmony export */   evaluateGuard: () => (/* binding */ evaluateGuard),
/* harmony export */   flatten: () => (/* binding */ flatten),
/* harmony export */   getActionType: () => (/* binding */ getActionType),
/* harmony export */   getEventType: () => (/* binding */ getEventType),
/* harmony export */   interopSymbols: () => (/* binding */ interopSymbols),
/* harmony export */   isActor: () => (/* binding */ isActor),
/* harmony export */   isArray: () => (/* binding */ isArray),
/* harmony export */   isBehavior: () => (/* binding */ isBehavior),
/* harmony export */   isBuiltInEvent: () => (/* binding */ isBuiltInEvent),
/* harmony export */   isFunction: () => (/* binding */ isFunction),
/* harmony export */   isMachine: () => (/* binding */ isMachine),
/* harmony export */   isObservable: () => (/* binding */ isObservable),
/* harmony export */   isPromiseLike: () => (/* binding */ isPromiseLike),
/* harmony export */   isRaisableAction: () => (/* binding */ isRaisableAction),
/* harmony export */   isStateLike: () => (/* binding */ isStateLike),
/* harmony export */   isString: () => (/* binding */ isString),
/* harmony export */   keys: () => (/* binding */ keys),
/* harmony export */   mapContext: () => (/* binding */ mapContext),
/* harmony export */   mapFilterValues: () => (/* binding */ mapFilterValues),
/* harmony export */   mapValues: () => (/* binding */ mapValues),
/* harmony export */   matchesState: () => (/* binding */ matchesState),
/* harmony export */   nestedPath: () => (/* binding */ nestedPath),
/* harmony export */   normalizeTarget: () => (/* binding */ normalizeTarget),
/* harmony export */   partition: () => (/* binding */ partition),
/* harmony export */   path: () => (/* binding */ path),
/* harmony export */   pathToStateValue: () => (/* binding */ pathToStateValue),
/* harmony export */   pathsToStateValue: () => (/* binding */ pathsToStateValue),
/* harmony export */   reportUnhandledExceptionOnInvocation: () => (/* binding */ reportUnhandledExceptionOnInvocation),
/* harmony export */   symbolObservable: () => (/* binding */ symbolObservable),
/* harmony export */   toArray: () => (/* binding */ toArray),
/* harmony export */   toArrayStrict: () => (/* binding */ toArrayStrict),
/* harmony export */   toEventObject: () => (/* binding */ toEventObject),
/* harmony export */   toGuard: () => (/* binding */ toGuard),
/* harmony export */   toInvokeSource: () => (/* binding */ toInvokeSource),
/* harmony export */   toObserver: () => (/* binding */ toObserver),
/* harmony export */   toSCXMLEvent: () => (/* binding */ toSCXMLEvent),
/* harmony export */   toStatePath: () => (/* binding */ toStatePath),
/* harmony export */   toStatePaths: () => (/* binding */ toStatePaths),
/* harmony export */   toStateValue: () => (/* binding */ toStateValue),
/* harmony export */   toTransitionConfigArray: () => (/* binding */ toTransitionConfigArray),
/* harmony export */   uniqueId: () => (/* binding */ uniqueId),
/* harmony export */   updateContext: () => (/* binding */ updateContext),
/* harmony export */   updateHistoryStates: () => (/* binding */ updateHistoryStates),
/* harmony export */   updateHistoryValue: () => (/* binding */ updateHistoryValue),
/* harmony export */   warn: () => (/* binding */ warn)
/* harmony export */ });
/* harmony import */ var _virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_virtual/_tslib.js */ "./node_modules/xstate/es/_virtual/_tslib.js");
/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./types.js */ "./node_modules/xstate/es/types.js");
/* harmony import */ var _actionTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./actionTypes.js */ "./node_modules/xstate/es/actionTypes.js");
/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants.js */ "./node_modules/xstate/es/constants.js");
/* harmony import */ var _environment_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./environment.js */ "./node_modules/xstate/es/environment.js");






var _a;
function keys(value) {
  return Object.keys(value);
}
function matchesState(parentStateId, childStateId, delimiter) {
  if (delimiter === void 0) {
    delimiter = _constants_js__WEBPACK_IMPORTED_MODULE_0__.STATE_DELIMITER;
  }

  var parentStateValue = toStateValue(parentStateId, delimiter);
  var childStateValue = toStateValue(childStateId, delimiter);

  if (isString(childStateValue)) {
    if (isString(parentStateValue)) {
      return childStateValue === parentStateValue;
    } // Parent more specific than child


    return false;
  }

  if (isString(parentStateValue)) {
    return parentStateValue in childStateValue;
  }

  return Object.keys(parentStateValue).every(function (key) {
    if (!(key in childStateValue)) {
      return false;
    }

    return matchesState(parentStateValue[key], childStateValue[key]);
  });
}
function getEventType(event) {
  try {
    return isString(event) || typeof event === 'number' ? "".concat(event) : event.type;
  } catch (e) {
    throw new Error('Events must be strings or objects with a string event.type property.');
  }
}
function getActionType(action) {
  try {
    return isString(action) || typeof action === 'number' ? "".concat(action) : isFunction(action) ? action.name : action.type;
  } catch (e) {
    throw new Error('Actions must be strings or objects with a string action.type property.');
  }
}
function toStatePath(stateId, delimiter) {
  try {
    if (isArray(stateId)) {
      return stateId;
    }

    return stateId.toString().split(delimiter);
  } catch (e) {
    throw new Error("'".concat(stateId, "' is not a valid state path."));
  }
}
function isStateLike(state) {
  return typeof state === 'object' && 'value' in state && 'context' in state && 'event' in state && '_event' in state;
}
function toStateValue(stateValue, delimiter) {
  if (isStateLike(stateValue)) {
    return stateValue.value;
  }

  if (isArray(stateValue)) {
    return pathToStateValue(stateValue);
  }

  if (typeof stateValue !== 'string') {
    return stateValue;
  }

  var statePath = toStatePath(stateValue, delimiter);
  return pathToStateValue(statePath);
}
function pathToStateValue(statePath) {
  if (statePath.length === 1) {
    return statePath[0];
  }

  var value = {};
  var marker = value;

  for (var i = 0; i < statePath.length - 1; i++) {
    if (i === statePath.length - 2) {
      marker[statePath[i]] = statePath[i + 1];
    } else {
      marker[statePath[i]] = {};
      marker = marker[statePath[i]];
    }
  }

  return value;
}
function mapValues(collection, iteratee) {
  var result = {};
  var collectionKeys = Object.keys(collection);

  for (var i = 0; i < collectionKeys.length; i++) {
    var key = collectionKeys[i];
    result[key] = iteratee(collection[key], key, collection, i);
  }

  return result;
}
function mapFilterValues(collection, iteratee, predicate) {
  var e_1, _a;

  var result = {};

  try {
    for (var _b = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(Object.keys(collection)), _c = _b.next(); !_c.done; _c = _b.next()) {
      var key = _c.value;
      var item = collection[key];

      if (!predicate(item)) {
        continue;
      }

      result[key] = iteratee(item, key, collection);
    }
  } catch (e_1_1) {
    e_1 = {
      error: e_1_1
    };
  } finally {
    try {
      if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
    } finally {
      if (e_1) throw e_1.error;
    }
  }

  return result;
}
/**
 * Retrieves a value at the given path.
 * @param props The deep path to the prop of the desired value
 */

var path = function (props) {
  return function (object) {
    var e_2, _a;

    var result = object;

    try {
      for (var props_1 = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(props), props_1_1 = props_1.next(); !props_1_1.done; props_1_1 = props_1.next()) {
        var prop = props_1_1.value;
        result = result[prop];
      }
    } catch (e_2_1) {
      e_2 = {
        error: e_2_1
      };
    } finally {
      try {
        if (props_1_1 && !props_1_1.done && (_a = props_1.return)) _a.call(props_1);
      } finally {
        if (e_2) throw e_2.error;
      }
    }

    return result;
  };
};
/**
 * Retrieves a value at the given path via the nested accessor prop.
 * @param props The deep path to the prop of the desired value
 */

function nestedPath(props, accessorProp) {
  return function (object) {
    var e_3, _a;

    var result = object;

    try {
      for (var props_2 = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(props), props_2_1 = props_2.next(); !props_2_1.done; props_2_1 = props_2.next()) {
        var prop = props_2_1.value;
        result = result[accessorProp][prop];
      }
    } catch (e_3_1) {
      e_3 = {
        error: e_3_1
      };
    } finally {
      try {
        if (props_2_1 && !props_2_1.done && (_a = props_2.return)) _a.call(props_2);
      } finally {
        if (e_3) throw e_3.error;
      }
    }

    return result;
  };
}
function toStatePaths(stateValue) {
  if (!stateValue) {
    return [[]];
  }

  if (isString(stateValue)) {
    return [[stateValue]];
  }

  var result = flatten(Object.keys(stateValue).map(function (key) {
    var subStateValue = stateValue[key];

    if (typeof subStateValue !== 'string' && (!subStateValue || !Object.keys(subStateValue).length)) {
      return [[key]];
    }

    return toStatePaths(stateValue[key]).map(function (subPath) {
      return [key].concat(subPath);
    });
  }));
  return result;
}
function pathsToStateValue(paths) {
  var e_4, _a;

  var result = {};

  if (paths && paths.length === 1 && paths[0].length === 1) {
    return paths[0][0];
  }

  try {
    for (var paths_1 = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(paths), paths_1_1 = paths_1.next(); !paths_1_1.done; paths_1_1 = paths_1.next()) {
      var currentPath = paths_1_1.value;
      var marker = result; // tslint:disable-next-line:prefer-for-of

      for (var i = 0; i < currentPath.length; i++) {
        var subPath = currentPath[i];

        if (i === currentPath.length - 2) {
          marker[subPath] = currentPath[i + 1];
          break;
        }

        marker[subPath] = marker[subPath] || {};
        marker = marker[subPath];
      }
    }
  } catch (e_4_1) {
    e_4 = {
      error: e_4_1
    };
  } finally {
    try {
      if (paths_1_1 && !paths_1_1.done && (_a = paths_1.return)) _a.call(paths_1);
    } finally {
      if (e_4) throw e_4.error;
    }
  }

  return result;
}
function flatten(array) {
  var _a;

  return (_a = []).concat.apply(_a, (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__spreadArray)([], (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__read)(array), false));
}
function toArrayStrict(value) {
  if (isArray(value)) {
    return value;
  }

  return [value];
}
function toArray(value) {
  if (value === undefined) {
    return [];
  }

  return toArrayStrict(value);
}
function mapContext(mapper, context, _event) {
  var e_5, _a;

  if (isFunction(mapper)) {
    return mapper(context, _event.data);
  }

  var result = {};

  try {
    for (var _b = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(Object.keys(mapper)), _c = _b.next(); !_c.done; _c = _b.next()) {
      var key = _c.value;
      var subMapper = mapper[key];

      if (isFunction(subMapper)) {
        result[key] = subMapper(context, _event.data);
      } else {
        result[key] = subMapper;
      }
    }
  } catch (e_5_1) {
    e_5 = {
      error: e_5_1
    };
  } finally {
    try {
      if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
    } finally {
      if (e_5) throw e_5.error;
    }
  }

  return result;
}
function isBuiltInEvent(eventType) {
  return /^(done|error)\./.test(eventType);
}
function isPromiseLike(value) {
  if (value instanceof Promise) {
    return true;
  } // Check if shape matches the Promise/A+ specification for a "thenable".


  if (value !== null && (isFunction(value) || typeof value === 'object') && isFunction(value.then)) {
    return true;
  }

  return false;
}
function isBehavior(value) {
  return value !== null && typeof value === 'object' && 'transition' in value && typeof value.transition === 'function';
}
function partition(items, predicate) {
  var e_6, _a;

  var _b = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__read)([[], []], 2),
      truthy = _b[0],
      falsy = _b[1];

  try {
    for (var items_1 = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {
      var item = items_1_1.value;

      if (predicate(item)) {
        truthy.push(item);
      } else {
        falsy.push(item);
      }
    }
  } catch (e_6_1) {
    e_6 = {
      error: e_6_1
    };
  } finally {
    try {
      if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
    } finally {
      if (e_6) throw e_6.error;
    }
  }

  return [truthy, falsy];
}
function updateHistoryStates(hist, stateValue) {
  return mapValues(hist.states, function (subHist, key) {
    if (!subHist) {
      return undefined;
    }

    var subStateValue = (isString(stateValue) ? undefined : stateValue[key]) || (subHist ? subHist.current : undefined);

    if (!subStateValue) {
      return undefined;
    }

    return {
      current: subStateValue,
      states: updateHistoryStates(subHist, subStateValue)
    };
  });
}
function updateHistoryValue(hist, stateValue) {
  return {
    current: stateValue,
    states: updateHistoryStates(hist, stateValue)
  };
}
function updateContext(context, _event, assignActions, state) {
  if (!_environment_js__WEBPACK_IMPORTED_MODULE_2__.IS_PRODUCTION) {
    warn(!!context, 'Attempting to update undefined context');
  }

  var updatedContext = context ? assignActions.reduce(function (acc, assignAction) {
    var e_7, _a;

    var assignment = assignAction.assignment;
    var meta = {
      state: state,
      action: assignAction,
      _event: _event
    };
    var partialUpdate = {};

    if (isFunction(assignment)) {
      partialUpdate = assignment(acc, _event.data, meta);
    } else {
      try {
        for (var _b = (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__values)(Object.keys(assignment)), _c = _b.next(); !_c.done; _c = _b.next()) {
          var key = _c.value;
          var propAssignment = assignment[key];
          partialUpdate[key] = isFunction(propAssignment) ? propAssignment(acc, _event.data, meta) : propAssignment;
        }
      } catch (e_7_1) {
        e_7 = {
          error: e_7_1
        };
      } finally {
        try {
          if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
        } finally {
          if (e_7) throw e_7.error;
        }
      }
    }

    return Object.assign({}, acc, partialUpdate);
  }, context) : context;
  return updatedContext;
} // tslint:disable-next-line:no-empty

var warn = function () {};

if (!_environment_js__WEBPACK_IMPORTED_MODULE_2__.IS_PRODUCTION) {
  warn = function (condition, message) {
    var error = condition instanceof Error ? condition : undefined;

    if (!error && condition) {
      return;
    }

    if (console !== undefined) {
      var args = ["Warning: ".concat(message)];

      if (error) {
        args.push(error);
      } // tslint:disable-next-line:no-console


      console.warn.apply(console, args);
    }
  };
}
function isArray(value) {
  return Array.isArray(value);
} // tslint:disable-next-line:ban-types

function isFunction(value) {
  return typeof value === 'function';
}
function isString(value) {
  return typeof value === 'string';
}
function toGuard(condition, guardMap) {
  if (!condition) {
    return undefined;
  }

  if (isString(condition)) {
    return {
      type: _constants_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_GUARD_TYPE,
      name: condition,
      predicate: guardMap ? guardMap[condition] : undefined
    };
  }

  if (isFunction(condition)) {
    return {
      type: _constants_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_GUARD_TYPE,
      name: condition.name,
      predicate: condition
    };
  }

  return condition;
}
function isObservable(value) {
  try {
    return 'subscribe' in value && isFunction(value.subscribe);
  } catch (e) {
    return false;
  }
}
var symbolObservable = /*#__PURE__*/function () {
  return typeof Symbol === 'function' && Symbol.observable || '@@observable';
}(); // TODO: to be removed in v5, left it out just to minimize the scope of the change and maintain compatibility with older versions of integration paackages

var interopSymbols = (_a = {}, _a[symbolObservable] = function () {
  return this;
}, _a[Symbol.observable] = function () {
  return this;
}, _a);
function isMachine(value) {
  return !!value && '__xstatenode' in value;
}
function isActor(value) {
  return !!value && typeof value.send === 'function';
}
var uniqueId = /*#__PURE__*/function () {
  var currentId = 0;
  return function () {
    currentId++;
    return currentId.toString(16);
  };
}();
function toEventObject(event, payload // id?: TEvent['type']
) {
  if (isString(event) || typeof event === 'number') {
    return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)({
      type: event
    }, payload);
  }

  return event;
}
function toSCXMLEvent(event, scxmlEvent) {
  if (!isString(event) && '$$type' in event && event.$$type === 'scxml') {
    return event;
  }

  var eventObject = toEventObject(event);
  return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)({
    name: eventObject.type,
    data: eventObject,
    $$type: 'scxml',
    type: 'external'
  }, scxmlEvent);
}
function toTransitionConfigArray(event, configLike) {
  var transitions = toArrayStrict(configLike).map(function (transitionLike) {
    if (typeof transitionLike === 'undefined' || typeof transitionLike === 'string' || isMachine(transitionLike)) {
      return {
        target: transitionLike,
        event: event
      };
    }

    return (0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)((0,_virtual_tslib_js__WEBPACK_IMPORTED_MODULE_1__.__assign)({}, transitionLike), {
      event: event
    });
  });
  return transitions;
}
function normalizeTarget(target) {
  if (target === undefined || target === _constants_js__WEBPACK_IMPORTED_MODULE_0__.TARGETLESS_KEY) {
    return undefined;
  }

  return toArray(target);
}
function reportUnhandledExceptionOnInvocation(originalError, currentError, id) {
  if (!_environment_js__WEBPACK_IMPORTED_MODULE_2__.IS_PRODUCTION) {
    var originalStackTrace = originalError.stack ? " Stacktrace was '".concat(originalError.stack, "'") : '';

    if (originalError === currentError) {
      // tslint:disable-next-line:no-console
      console.error("Missing onError handler for invocation '".concat(id, "', error was '").concat(originalError, "'.").concat(originalStackTrace));
    } else {
      var stackTrace = currentError.stack ? " Stacktrace was '".concat(currentError.stack, "'") : ''; // tslint:disable-next-line:no-console

      console.error("Missing onError handler and/or unhandled exception/promise rejection for invocation '".concat(id, "'. ") + "Original error: '".concat(originalError, "'. ").concat(originalStackTrace, " Current error is '").concat(currentError, "'.").concat(stackTrace));
    }
  }
}
function evaluateGuard(machine, guard, context, _event, state) {
  var guards = machine.options.guards;
  var guardMeta = {
    state: state,
    cond: guard,
    _event: _event
  }; // TODO: do not hardcode!

  if (guard.type === _constants_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_GUARD_TYPE) {
    return ((guards === null || guards === void 0 ? void 0 : guards[guard.name]) || guard.predicate)(context, _event.data, guardMeta);
  }

  var condFn = guards === null || guards === void 0 ? void 0 : guards[guard.type];

  if (!condFn) {
    throw new Error("Guard '".concat(guard.type, "' is not implemented on machine '").concat(machine.id, "'."));
  }

  return condFn(context, _event.data, guardMeta);
}
function toInvokeSource(src) {
  if (typeof src === 'string') {
    return {
      type: src
    };
  }

  return src;
}
function toObserver(nextHandler, errorHandler, completionHandler) {
  var noop = function () {};

  var isObserver = typeof nextHandler === 'object';
  var self = isObserver ? nextHandler : null;
  return {
    next: ((isObserver ? nextHandler.next : nextHandler) || noop).bind(self),
    error: ((isObserver ? nextHandler.error : errorHandler) || noop).bind(self),
    complete: ((isObserver ? nextHandler.complete : completionHandler) || noop).bind(self)
  };
}
function createInvokeId(stateNodeId, index) {
  return "".concat(stateNodeId, ":invocation[").concat(index, "]");
}
function isRaisableAction(action) {
  return (action.type === _actionTypes_js__WEBPACK_IMPORTED_MODULE_3__.raise || action.type === _actionTypes_js__WEBPACK_IMPORTED_MODULE_3__.send && action.to === _types_js__WEBPACK_IMPORTED_MODULE_4__.SpecialTargets.Internal) && typeof action.delay !== 'number';
}




/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			id: moduleId,
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/
/******/ 	/* webpack/runtime/compat get default export */
/******/ 	(() => {
/******/ 		// getDefaultExport function for compatibility with non-harmony modules
/******/ 		__webpack_require__.n = (module) => {
/******/ 			var getter = module && module.__esModule ?
/******/ 				() => (module['default']) :
/******/ 				() => (module);
/******/ 			__webpack_require__.d(getter, { a: getter });
/******/ 			return getter;
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/define property getters */
/******/ 	(() => {
/******/ 		// define getter functions for harmony exports
/******/ 		__webpack_require__.d = (exports, definition) => {
/******/ 			for(var key in definition) {
/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 				}
/******/ 			}
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/global */
/******/ 	(() => {
/******/ 		__webpack_require__.g = (function() {
/******/ 			if (typeof globalThis === 'object') return globalThis;
/******/ 			try {
/******/ 				return this || new Function('return this')();
/******/ 			} catch (e) {
/******/ 				if (typeof window === 'object') return window;
/******/ 			}
/******/ 		})();
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
/******/ 	(() => {
/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/make namespace object */
/******/ 	(() => {
/******/ 		// define __esModule on exports
/******/ 		__webpack_require__.r = (exports) => {
/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 			}
/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/nonce */
/******/ 	(() => {
/******/ 		__webpack_require__.nc = undefined;
/******/ 	})();
/******/ 	
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
(() => {
/*!****************************!*\
  !*** ./src/saypi.index.js ***!
  \****************************/
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _ButtonModule_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ButtonModule.js */ "./src/ButtonModule.js");
/* harmony import */ var _EventBus_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EventBus.js */ "./src/EventBus.js");
/* harmony import */ var _EventModule_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EventModule.js */ "./src/EventModule.js");
/* harmony import */ var _UserAgentModule_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./UserAgentModule.js */ "./src/UserAgentModule.js");
/* harmony import */ var _styles_common_scss__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./styles/common.scss */ "./src/styles/common.scss");
/* harmony import */ var _styles_desktop_scss__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./styles/desktop.scss */ "./src/styles/desktop.scss");
/* harmony import */ var _styles_mobile_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./styles/mobile.scss */ "./src/styles/mobile.scss");
/* harmony import */ var _styles_rectangles_css__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./styles/rectangles.css */ "./src/styles/rectangles.css");
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }








(function () {
  "use strict";

  var pageScript = (__webpack_require__(/*! raw-loader!../public/audioModule.bundle.js */ "./node_modules/raw-loader/dist/cjs.js!./public/audioModule.bundle.js")["default"]);
  (0,_UserAgentModule_js__WEBPACK_IMPORTED_MODULE_3__.addUserAgentFlags)();
  _EventModule_js__WEBPACK_IMPORTED_MODULE_2__["default"].init();
  setupEventBus();

  // Create a MutationObserver to listen for changes to the DOM
  // textareas are added to the DOM after the page loads
  var callback = function callback(mutationsList, observer) {
    var _iterator = _createForOfIteratorHelper(mutationsList),
      _step;
    try {
      for (_iterator.s(); !(_step = _iterator.n()).done;) {
        var mutation = _step.value;
        if (mutation.type === "childList") {
          // Iterate through added nodes
          mutation.addedNodes.forEach(function (node) {
            // Check if added node is a textarea with 'enterkeyhint' attribute
            if (node.nodeName === "TEXTAREA" && node.hasAttribute("enterkeyhint")) {
              // Stop observing to avoid any potential infinite loops
              observer.disconnect();

              // Do something with the textarea, like add an event listener
              annotateDOM(node);
              return;
            }

            // Check if added node contains a textarea with 'enterkeyhint' attribute
            if (node.querySelectorAll) {
              var textareas = node.querySelectorAll("textarea[enterkeyhint]");
              if (textareas.length > 0) {
                // Stop observing
                observer.disconnect();

                // Do something with the first textarea that has 'enterkeyhint'
                annotateDOM(textareas[0]);
                return;
              }
            }
          });
        }
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }
  };

  // Options for the observer (which mutations to observe)
  var config = {
    attributes: false,
    childList: true,
    subtree: true
  };

  // Create an observer instance linked to the callback function
  var observer = new MutationObserver(callback);

  // Start observing the target node for configured mutations
  observer.observe(document.body, config);
  function setupEventBus() {
    // Setting the correct context
    var context = window;
    if (GM_info.scriptHandler !== "Userscripts") {
      context = unsafeWindow;
    }
    context.EventBus = _EventBus_js__WEBPACK_IMPORTED_MODULE_1__["default"]; // Make the EventBus available to the page script
  }

  function annotateDOM(prompt) {
    // Add id attributes to important elements
    prompt.id = "saypi-prompt";
    var foundFooter = addIdFooter();
    var foundAudioControls = addIdAudioControls();
    var promptControlsContainer = prompt.parentElement.parentElement;
    addIdSubmitButton(promptControlsContainer);
    addTalkButton(promptControlsContainer);
    _ButtonModule_js__WEBPACK_IMPORTED_MODULE_0__.buttonModule.createEnterButton();
    _ButtonModule_js__WEBPACK_IMPORTED_MODULE_0__.buttonModule.createExitButton();
  }
  function addIdSubmitButton(container) {
    var submitButton = container.querySelector("button[type=button]");
    if (submitButton) {
      submitButton.id = "saypi-submitButton";
    }
  }
  function addIdFooter() {
    // Find all audio elements on the page
    var audioElements = document.querySelectorAll("audio");
    var found = false; // default to not found

    audioElements.forEach(function (audio) {
      var precedingDiv = audio.previousElementSibling;

      // If we've already found a div, we can skip further iterations
      if (found) return;

      // Check if the preceding element is a div
      if (precedingDiv && precedingDiv.tagName.toLowerCase() === "div") {
        // Assign an ID to the div
        precedingDiv.lastElementChild.id = "saypi-footer";
        found = true; // set to found
      }
    });

    return found;
  }
  function addIdAudioControls() {
    // Find all audio elements on the page
    var audioElements = document.querySelectorAll("audio");
    var found = false; // default to not found

    audioElements.forEach(function (audio) {
      var nextDiv = audio.nextElementSibling;

      // If we've already found a div, we can skip further iterations
      if (found) return;

      // Check if the preceding element is a div
      if (nextDiv && nextDiv.tagName.toLowerCase() === "div") {
        // Assign an ID to the div
        nextDiv.id = "saypi-audio-controls";
        found = true; // set to found
      }
    });

    return found;
  }
  function injectScript(callback) {
    var scriptElement = document.createElement("script");
    scriptElement.type = "text/javascript";
    scriptElement.id = "saypi-script";
    scriptElement.textContent = pageScript;
    document.body.appendChild(scriptElement);

    // Call the callback function after the script is added
    if (callback) {
      callback();
    }
  }
  function addTalkButton(container) {
    // Create a containing div
    var panel = document.createElement("div");
    panel.id = "saypi-panel";

    // Check if the container has any child elements
    if (container.childNodes.length > 0) {
      // Insert the panel as the second-to-last child
      container.insertBefore(panel, container.lastChild);
    } else {
      // If the container has no children, just append the panel
      container.appendChild(panel);
    }

    // Create the talk button using ButtonModule
    var label = "Talk (Hold Control + Space to use hotkey. Double click to toggle auto-submit on/off)";
    var button = _ButtonModule_js__WEBPACK_IMPORTED_MODULE_0__.buttonModule.createButton("", function () {}); // The callback is empty for now, but you can add functionalities if needed.

    button.id = "saypi-talkButton";
    button.type = "button";

    // Set ARIA label and tooltip
    button.setAttribute("aria-label", label);
    button.setAttribute("title", label);
    var classNames = "relative flex mt-1 mb-1 rounded-full px-2 py-3 text-center bg-cream-550 hover:bg-cream-650 hover:text-brand-green-700 text-muted";
    button.classList.add(classNames.split(" "));

    // Enable autosubmit by default
    button.dataset.autosubmit = "true";
    button.classList.add("autoSubmit");
    panel.appendChild(button);
    _ButtonModule_js__WEBPACK_IMPORTED_MODULE_0__.buttonModule.addTalkIcon(button);

    // Call the function to inject the script after the button has been added
    injectScript(registerAudioButtonEvents);
  }
  function registerAudioButtonEvents() {
    var button = document.getElementById("saypi-talkButton");

    // Attach the event listeners
    button.addEventListener("mousedown", _EventModule_js__WEBPACK_IMPORTED_MODULE_2__["default"].handleTalkMouseDown.bind(_EventModule_js__WEBPACK_IMPORTED_MODULE_2__["default"]));
    button.addEventListener("mouseup", _EventModule_js__WEBPACK_IMPORTED_MODULE_2__["default"].handleTalkMouseUp.bind(_EventModule_js__WEBPACK_IMPORTED_MODULE_2__["default"]));
    button.addEventListener("dblclick", function () {
      return _EventModule_js__WEBPACK_IMPORTED_MODULE_2__["default"].handleTalkDoubleClick(button);
    });
    button.addEventListener("touchstart", function (e) {
      return _EventModule_js__WEBPACK_IMPORTED_MODULE_2__["default"].handleTalkTouchStart(button, e);
    });
    button.addEventListener("touchend", function () {
      return _EventModule_js__WEBPACK_IMPORTED_MODULE_2__["default"].handleTalkTouchEnd(button);
    });
    _EventModule_js__WEBPACK_IMPORTED_MODULE_2__["default"].registerOtherAudioButtonEvents(button);
    _EventModule_js__WEBPACK_IMPORTED_MODULE_2__["default"].registerHotkey();
  }

  // Start observing the entire document for changes to child nodes and subtree
  observer.observe(document, {
    childList: true,
    subtree: true
  });
})();
})();

/******/ })()
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F5cGkudXNlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQXFCQSxlQUFlO0VBQUEsU0FBQUEsZ0JBQUE7SUFBQUMsZUFBQSxPQUFBRCxlQUFBO0VBQUE7RUFBQUUsWUFBQSxDQUFBRixlQUFBO0lBQUFHLEdBQUE7SUFBQUMsS0FBQSxFQVdsQyxTQUFBQyxlQUFzQkMsU0FBUyxFQUFFO01BQy9CLElBQUksQ0FBQ0MsbUJBQW1CLENBQUNELFNBQVMsQ0FBQztNQUVuQyxJQUFJRSxVQUFVLEdBQUdDLFFBQVEsQ0FBQ0MsZ0JBQWdCLENBQUMsSUFBSSxDQUFDQyxrQkFBa0IsQ0FBQztNQUNuRUgsVUFBVSxDQUFDSSxPQUFPLENBQUMsVUFBQ0MsSUFBSTtRQUFBLE9BQUtBLElBQUksQ0FBQ0MsU0FBUyxDQUFDQyxHQUFHLENBQUNULFNBQVMsQ0FBQztNQUFBLEVBQUM7SUFDN0Q7RUFBQztJQUFBSCxHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBWSxjQUFxQlYsU0FBUyxFQUFFO01BQzlCLElBQUlFLFVBQVUsR0FBR0MsUUFBUSxDQUFDQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUNDLGtCQUFrQixDQUFDO01BQ25FSCxVQUFVLENBQUNJLE9BQU8sQ0FBQyxVQUFDQyxJQUFJO1FBQUEsT0FBS0EsSUFBSSxDQUFDQyxTQUFTLENBQUNHLE1BQU0sQ0FBQ1gsU0FBUyxDQUFDO01BQUEsRUFBQztJQUNoRTtFQUFDO0lBQUFILEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFjLGtCQUFBLEVBQTJCO01BQUEsSUFBQUMsS0FBQTtNQUN6QixJQUFJLENBQUNDLG9CQUFvQixDQUFDUixPQUFPLENBQUMsVUFBQ04sU0FBUztRQUFBLE9BQzFDYSxLQUFJLENBQUNILGFBQWEsQ0FBQ1YsU0FBUyxDQUFDO01BQUEsQ0FDL0IsQ0FBQztJQUNIO0VBQUM7SUFBQUgsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQUcsb0JBQTJCYyxhQUFhLEVBQUU7TUFBQSxJQUFBQyxNQUFBO01BQ3hDLElBQUksQ0FBQ0Ysb0JBQW9CLENBQUNSLE9BQU8sQ0FBQyxVQUFDTixTQUFTLEVBQUs7UUFDL0MsSUFBSUEsU0FBUyxLQUFLZSxhQUFhLEVBQUU7VUFDL0JDLE1BQUksQ0FBQ04sYUFBYSxDQUFDVixTQUFTLENBQUM7UUFDL0I7TUFDRixDQUFDLENBQUM7SUFDSjtFQUFDO0VBQUEsT0FBQU4sZUFBQTtBQUFBO0FBQUF1QixlQUFBLENBbkNrQnZCLGVBQWUsd0JBRWhDLDBEQUEwRDtBQUFBdUIsZUFBQSxDQUZ6Q3ZCLGVBQWUsMEJBR0osQ0FDNUIsU0FBUyxFQUNULFlBQVksRUFDWixjQUFjLEVBQ2QsY0FBYyxFQUNkLFFBQVEsQ0FDVDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0x3QjtBQUNPO0FBQ3lCO0FBQ2hCO0FBQ1E7QUFDQTtBQUNKO0FBQ1k7QUFDaEI7QUFBQSxJQUN0Qm9DLFlBQVk7RUFDL0IsU0FBQUEsYUFBQSxFQUFjO0lBQUFuQyxlQUFBLE9BQUFtQyxZQUFBO0lBQ1osSUFBSSxDQUFDQyxVQUFVLEdBQUcsSUFBSTtJQUN0QixJQUFJLENBQUNDLEtBQUssR0FBR1QsK0RBQW1CLENBQUNTLEtBQUs7SUFDdEM7SUFDQSxJQUFJLENBQUNDLHFCQUFxQixHQUFHLElBQUksQ0FBQ0EscUJBQXFCLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbEUsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQyxDQUFDO0VBQzVCO0VBQUN2QyxZQUFBLENBQUFrQyxZQUFBO0lBQUFqQyxHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBcUMsb0JBQUEsRUFBc0I7TUFDcEJiLGlEQUFRLENBQUNjLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRU4sWUFBWSxDQUFDTyxnQkFBZ0IsQ0FBQztJQUNoRTs7SUFFQTtFQUFBO0lBQUF4QyxHQUFBO0lBQUFDLEtBQUEsRUFDQSxTQUFBd0MsYUFBYUMsS0FBSyxFQUFFQyxRQUFRLEVBQUU7TUFDNUIsSUFBTUMsTUFBTSxHQUFHdEMsUUFBUSxDQUFDdUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztNQUMvQ0QsTUFBTSxDQUFDRSxXQUFXLEdBQUdKLEtBQUs7TUFDMUJFLE1BQU0sQ0FBQ0csT0FBTyxHQUFHSixRQUFRO01BQ3pCLE9BQU9DLE1BQU07SUFDZjs7SUFFQTtFQUFBO0lBQUE1QyxHQUFBO0lBQUFDLEtBQUEsRUFDQSxTQUFBK0MsWUFBWUosTUFBTSxFQUFFSyxNQUFNLEVBQUU7TUFDMUIsS0FBSyxJQUFJakQsR0FBRyxJQUFJaUQsTUFBTSxFQUFFO1FBQ3RCLElBQUlBLE1BQU0sQ0FBQ0MsY0FBYyxDQUFDbEQsR0FBRyxDQUFDLEVBQUU7VUFDOUI0QyxNQUFNLENBQUNPLEtBQUssQ0FBQ25ELEdBQUcsQ0FBQyxHQUFHaUQsTUFBTSxDQUFDakQsR0FBRyxDQUFDO1FBQ2pDO01BQ0Y7SUFDRjtFQUFDO0lBQUFBLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFtRCxZQUFZUixNQUFNLEVBQUU7TUFBQSxJQUFBNUIsS0FBQTtNQUNsQixJQUFJLENBQUNxQyxpQkFBaUIsQ0FBQ1QsTUFBTSxDQUFDO01BRTlCVSxNQUFNLENBQUNDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDQyxXQUFXLENBQUMsWUFBTTtRQUN4RHhDLEtBQUksQ0FBQ3FDLGlCQUFpQixDQUFDVCxNQUFNLENBQUM7TUFDaEMsQ0FBQyxDQUFDO01BQ0YsSUFBSSxDQUFDYSxrQkFBa0IsQ0FBQ2IsTUFBTSxDQUFDO0lBQ2pDO0VBQUM7SUFBQTVDLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFvRCxrQkFBa0JLLGFBQWEsRUFBRTtNQUMvQixJQUFJbEMsOERBQVksQ0FBQyxDQUFDLEVBQUU7UUFDbEJrQyxhQUFhLENBQUNDLFNBQVMsR0FBRzlCLDZEQUFhO01BQ3pDLENBQUMsTUFBTTtRQUNMNkIsYUFBYSxDQUFDQyxTQUFTLEdBQUc3QiwyREFBVztNQUN2QztJQUNGO0VBQUM7SUFBQTlCLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUF3RCxtQkFBbUJiLE1BQU0sRUFBRTtNQUFBLElBQUF6QixNQUFBO01BQ3pCLElBQU15QyxVQUFVLEdBQUd0RCxRQUFRLENBQUN1RCxlQUFlLENBQUMsQ0FBQzs7TUFFN0MsSUFBTUMsTUFBTSxHQUFHO1FBQUVDLFVBQVUsRUFBRSxJQUFJO1FBQUVDLGVBQWUsRUFBRSxDQUFDLE9BQU87TUFBRSxDQUFDO01BRS9ELElBQU1yQixRQUFRLEdBQUcsU0FBWEEsUUFBUUEsQ0FBSXNCLGFBQWEsRUFBRUMsUUFBUSxFQUFLO1FBQUEsSUFBQUMsU0FBQSxHQUFBQywwQkFBQSxDQUN2QkgsYUFBYTtVQUFBSSxLQUFBO1FBQUE7VUFBbEMsS0FBQUYsU0FBQSxDQUFBRyxDQUFBLE1BQUFELEtBQUEsR0FBQUYsU0FBQSxDQUFBSSxDQUFBLElBQUFDLElBQUEsR0FBb0M7WUFBQSxJQUEzQkMsUUFBUSxHQUFBSixLQUFBLENBQUFwRSxLQUFBO1lBQ2YsSUFBSXdFLFFBQVEsQ0FBQ0MsSUFBSSxLQUFLLFlBQVksRUFBRTtjQUNsQyxJQUFJRCxRQUFRLENBQUNFLGFBQWEsS0FBSyxPQUFPLEVBQUU7Z0JBQ3RDLElBQUlyRSxRQUFRLENBQUN1RCxlQUFlLENBQUNsRCxTQUFTLENBQUNpRSxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7a0JBQzlEO2tCQUNBekQsTUFBSSxDQUFDa0MsaUJBQWlCLENBQUNULE1BQU0sQ0FBQztnQkFDaEMsQ0FBQyxNQUFNO2tCQUNMO2tCQUNBekIsTUFBSSxDQUFDa0MsaUJBQWlCLENBQUNULE1BQU0sQ0FBQztnQkFDaEM7Y0FDRjtZQUNGO1VBQ0Y7UUFBQyxTQUFBaUMsR0FBQTtVQUFBVixTQUFBLENBQUFXLENBQUEsQ0FBQUQsR0FBQTtRQUFBO1VBQUFWLFNBQUEsQ0FBQVksQ0FBQTtRQUFBO01BQ0gsQ0FBQztNQUVELElBQU1iLFFBQVEsR0FBRyxJQUFJYyxnQkFBZ0IsQ0FBQ3JDLFFBQVEsQ0FBQzs7TUFFL0M7TUFDQXVCLFFBQVEsQ0FBQ2UsT0FBTyxDQUFDckIsVUFBVSxFQUFFRSxNQUFNLENBQUM7O01BRXBDO01BQ0E7SUFDRjs7SUFFQTtFQUFBO0lBQUE5RCxHQUFBO0lBQUFDLEtBQUEsRUErQkEsU0FBQWlGLGlCQUFBLEVBQW1CO01BQ2pCLElBQU14QyxLQUFLLEdBQUcsbUNBQW1DO01BQ2pELElBQU1FLE1BQU0sR0FBRyxJQUFJLENBQUNILFlBQVksQ0FBQyxFQUFFLEVBQUUsWUFBTTtRQUN6Q2xCLGdFQUFjLENBQUMsQ0FBQztNQUNsQixDQUFDLENBQUM7TUFDRnFCLE1BQU0sQ0FBQ3VDLEVBQUUsR0FBRyxrQkFBa0I7TUFDOUJ2QyxNQUFNLENBQUM4QixJQUFJLEdBQUcsUUFBUTtNQUN0QjlCLE1BQU0sQ0FBQ3dDLFNBQVMsR0FDZCx3RUFBd0U7TUFDMUV4QyxNQUFNLENBQUN5QyxZQUFZLENBQUMsWUFBWSxFQUFFM0MsS0FBSyxDQUFDO01BQ3hDRSxNQUFNLENBQUN5QyxZQUFZLENBQUMsT0FBTyxFQUFFM0MsS0FBSyxDQUFDO01BQ25DRSxNQUFNLENBQUNlLFNBQVMsR0FBR2hDLHVEQUFXO01BQzlCckIsUUFBUSxDQUFDZ0YsSUFBSSxDQUFDQyxXQUFXLENBQUMzQyxNQUFNLENBQUM7TUFDakMsT0FBT0EsTUFBTTtJQUNmO0VBQUM7SUFBQTVDLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUF1RixrQkFBQSxFQUFvQjtNQUNsQixJQUFNOUMsS0FBSyxHQUFHLG9DQUFvQztNQUNsRCxJQUFNRSxNQUFNLEdBQUcsSUFBSSxDQUFDSCxZQUFZLENBQUMsRUFBRSxFQUFFLFlBQU07UUFDekNuQixpRUFBZSxDQUFDLENBQUM7TUFDbkIsQ0FBQyxDQUFDO01BQ0ZzQixNQUFNLENBQUN1QyxFQUFFLEdBQUcsbUJBQW1CO01BQy9CdkMsTUFBTSxDQUFDOEIsSUFBSSxHQUFHLFFBQVE7TUFDdEI5QixNQUFNLENBQUN3QyxTQUFTLEdBQ2QseUVBQXlFO01BQzNFeEMsTUFBTSxDQUFDeUMsWUFBWSxDQUFDLFlBQVksRUFBRTNDLEtBQUssQ0FBQztNQUN4Q0UsTUFBTSxDQUFDeUMsWUFBWSxDQUFDLE9BQU8sRUFBRTNDLEtBQUssQ0FBQztNQUNuQ0UsTUFBTSxDQUFDZSxTQUFTLEdBQUcvQiwyREFBZTtNQUNsQ3RCLFFBQVEsQ0FBQ2dGLElBQUksQ0FBQ0MsV0FBVyxDQUFDM0MsTUFBTSxDQUFDO01BQ2pDLE9BQU9BLE1BQU07SUFDZjtFQUFDO0lBQUE1QyxHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBd0YsaUJBQUEsRUFBbUI7TUFDakIsSUFBTS9DLEtBQUssR0FBRyxvQkFBb0I7TUFDbEMsSUFBSSxDQUFDUixVQUFVLEdBQUcsSUFBSSxDQUFDTyxZQUFZLENBQUMsRUFBRSxFQUFFLFlBQU0sQ0FBQyxDQUFDLENBQUM7TUFDakQsSUFBSSxDQUFDUCxVQUFVLENBQUNpRCxFQUFFLEdBQUcsa0JBQWtCO01BQ3ZDLElBQUksQ0FBQ2pELFVBQVUsQ0FBQ3dDLElBQUksR0FBRyxRQUFRO01BQy9CLElBQUksQ0FBQ3hDLFVBQVUsQ0FBQ2tELFNBQVMsR0FBRyxvQkFBb0I7TUFDaEQsSUFBSSxDQUFDbEQsVUFBVSxDQUFDbUQsWUFBWSxDQUFDLFlBQVksRUFBRTNDLEtBQUssQ0FBQztNQUNqRCxJQUFJLENBQUNSLFVBQVUsQ0FBQ21ELFlBQVksQ0FBQyxPQUFPLEVBQUUzQyxLQUFLLENBQUM7TUFDNUMsSUFBSSxDQUFDUixVQUFVLENBQUN3RCxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDdEQscUJBQXFCLENBQUM7TUFDckUsSUFBSSxDQUFDRixVQUFVLENBQUN5QixTQUFTLEdBQUczQix1REFBVztNQUN2QzFCLFFBQVEsQ0FBQ2dGLElBQUksQ0FBQ0MsV0FBVyxDQUFDLElBQUksQ0FBQ3JELFVBQVUsQ0FBQztNQUMxQ3lELE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLDRDQUE0QyxDQUFDO01BQ3pELE9BQU8sSUFBSSxDQUFDMUQsVUFBVTtJQUN4QjtFQUFDO0lBQUFsQyxHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBNEYsZUFBQSxFQUFpQjtNQUNmLElBQUksQ0FBQyxJQUFJLENBQUMzRCxVQUFVLEVBQUU7UUFDcEIsSUFBSSxDQUFDdUQsZ0JBQWdCLENBQUMsQ0FBQztNQUN6QjtNQUNBLElBQUksQ0FBQ3ZELFVBQVUsQ0FBQ3ZCLFNBQVMsQ0FBQ0csTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUM1QztFQUFDO0lBQUFkLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUE2RixlQUFBLEVBQWlCO01BQ2YsSUFBSSxJQUFJLENBQUM1RCxVQUFVLEVBQUU7UUFDbkIsSUFBSSxDQUFDQSxVQUFVLENBQUN2QixTQUFTLENBQUNDLEdBQUcsQ0FBQyxRQUFRLENBQUM7TUFDekM7SUFDRjtFQUFDO0lBQUFaLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFtQyxzQkFBQSxFQUF3QjtNQUN0QixJQUFJLENBQUNELEtBQUssQ0FBQzRELElBQUksQ0FBQyxlQUFlLENBQUM7TUFDaEN0RSxpREFBUSxDQUFDdUUsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMvQjtFQUFDO0lBQUFoRyxHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBZ0csaUJBQWlCQyxPQUFPLEVBQUU7TUFDeEIsSUFBTUMsSUFBSSxHQUFHRCxPQUFPLENBQUNDLElBQUk7TUFDekIsSUFBSUMsT0FBTztNQUNYLElBQUlELElBQUksS0FBSyxrQkFBa0IsRUFBRTtRQUMvQkMsT0FBTyxHQUFHckUsbUVBQWU7TUFDM0I7TUFFQSxJQUFNc0UsWUFBWSxHQUFHL0YsUUFBUSxDQUFDZ0csY0FBYyxDQUFDLG9CQUFvQixDQUFDO01BQ2xFLElBQUlELFlBQVksRUFBRTtRQUNoQkEsWUFBWSxDQUFDMUYsU0FBUyxDQUFDRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ3ZDdUYsWUFBWSxDQUFDMUMsU0FBUyxHQUFHeUMsT0FBTztNQUNsQyxDQUFDLE1BQU07UUFDTCxJQUFNQyxhQUFZLEdBQUcvRixRQUFRLENBQUN1QyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQ2xEd0QsYUFBWSxDQUFDbEIsRUFBRSxHQUFHLG9CQUFvQjtRQUN0Q2tCLGFBQVksQ0FBQ2pCLFNBQVMsR0FBRyxjQUFjO1FBQ3ZDaUIsYUFBWSxDQUFDMUMsU0FBUyxHQUFHeUMsT0FBTztRQUNoQzlGLFFBQVEsQ0FBQ2dGLElBQUksQ0FBQ0MsV0FBVyxDQUFDYyxhQUFZLENBQUM7TUFDekM7SUFDRjtFQUFDO0lBQUFyRyxHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBc0csb0JBQUEsRUFBc0I7TUFDcEIsSUFBTUYsWUFBWSxHQUFHL0YsUUFBUSxDQUFDZ0csY0FBYyxDQUFDLG9CQUFvQixDQUFDO01BQ2xFLElBQUlELFlBQVksRUFBRTtRQUNoQkEsWUFBWSxDQUFDMUYsU0FBUyxDQUFDQyxHQUFHLENBQUMsUUFBUSxDQUFDO01BQ3RDO0lBQ0Y7RUFBQztJQUFBWixHQUFBO0lBQUFDLEtBQUEsRUF4SEQsU0FBQXVHLG1CQUFBLEVBQTRCO01BQzFCLElBQU1DLFlBQVksR0FBR25HLFFBQVEsQ0FBQ2dHLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQztNQUNsRSxJQUFJRyxZQUFZLEVBQUU7UUFDaEJBLFlBQVksQ0FBQ0MsS0FBSyxDQUFDLENBQUM7TUFDdEIsQ0FBQyxNQUFNO1FBQ0w7UUFDQSxJQUFNQyxRQUFRLEdBQUdyRyxRQUFRLENBQUNnRyxjQUFjLENBQUMsY0FBYyxDQUFDO1FBRXhELElBQU1NLFVBQVUsR0FBRyxJQUFJQyxhQUFhLENBQUMsU0FBUyxFQUFFO1VBQzlDQyxPQUFPLEVBQUUsSUFBSTtVQUNiOUcsR0FBRyxFQUFFLE9BQU87VUFDWitHLE9BQU8sRUFBRSxFQUFFO1VBQ1hDLEtBQUssRUFBRTtRQUNULENBQUMsQ0FBQztRQUVGTCxRQUFRLENBQUNNLGFBQWEsQ0FBQ0wsVUFBVSxDQUFDO01BQ3BDO0lBQ0Y7O0lBRUE7RUFBQTtJQUFBNUcsR0FBQTtJQUFBQyxLQUFBLEVBQ0EsU0FBQXVDLGlCQUFBLEVBQTBCO01BQ3hCLElBQU0wRSxVQUFVLEdBQUc1RyxRQUFRLENBQUNnRyxjQUFjLENBQUMsa0JBQWtCLENBQUM7TUFFOUQsSUFBSVksVUFBVSxDQUFDQyxPQUFPLENBQUNDLFVBQVUsS0FBSyxPQUFPLEVBQUU7UUFDN0N6QixPQUFPLENBQUNDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQztNQUN2QyxDQUFDLE1BQU07UUFDTDNELFlBQVksQ0FBQ3VFLGtCQUFrQixDQUFDLENBQUM7TUFDbkM7SUFDRjtFQUFDO0VBQUEsT0FBQXZFLFlBQUE7QUFBQSxLQStGSDtBQXpNaUM7QUEwTTFCLElBQU1vRixZQUFZLEdBQUcsSUFBSXBGLFlBQVksQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FDdk5aO0FBRWxDLGlFQUFlLElBQUlxRiwrQ0FBWSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGSTtBQUNzQjtBQUUzRCxJQUFNQyxhQUFhLEdBQUcsb0JBQW9CO0FBQzFDLElBQU1DLHFCQUFxQixHQUFHLDJCQUEyQjtBQUN6RCxJQUFNQyxzQkFBc0IsR0FBRyw0QkFBNEI7QUFDM0QsSUFBTUMsWUFBWSxHQUFHLG9CQUFvQjtBQUN6QyxJQUFNQyxXQUFXLEdBQUcsa0JBQWtCO0FBQ3RDLElBQU1DLG1CQUFtQixHQUFHLHlCQUF5QjtBQUNyRCxJQUFNQyxvQkFBb0IsR0FBRywwQkFBMEI7QUFDdkQsSUFBTUMsS0FBSyxHQUFHLHFCQUFxQjtBQUNuQyxJQUFNQyxLQUFLLEdBQUcsYUFBYTtBQUMzQixJQUFNQyxJQUFJLEdBQUcsWUFBWTtBQUFDLElBRUxDLFdBQVc7RUFBQSxTQUFBQSxZQUFBO0lBQUFuSSxlQUFBLE9BQUFtSSxXQUFBO0VBQUE7RUFBQWxJLFlBQUEsQ0FBQWtJLFdBQUE7SUFBQWpJLEdBQUE7SUFBQUMsS0FBQSxFQUM5QixTQUFBaUksS0FBQSxFQUFjO01BQ1o7TUFDQSxJQUFJLENBQUNDLDBCQUEwQixDQUFDekcsK0RBQW1CLENBQUNTLEtBQUssQ0FBQztNQUMxRDtJQUNGO0VBQUM7SUFBQW5DLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFtSSxRQUFBLEVBQWlCO01BQ2Y7TUFDQTlFLE1BQU0sQ0FBQytFLG1CQUFtQixDQUN4QixtQkFBbUIsRUFDbkIsSUFBSSxDQUFDQywyQkFDUCxDQUFDO0lBQ0g7RUFBQztJQUFBdEksR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQXNJLGVBQXNCQyxPQUFPLEVBQUVDLElBQUksRUFBRTtNQUNuQyxJQUFNQyxLQUFLLEdBQUdELElBQUksQ0FBQ0UsS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUM3QixJQUFJQyxDQUFDLEdBQUcsQ0FBQztNQUVULElBQU1DLFFBQVEsR0FBRyxTQUFYQSxRQUFRQSxDQUFBLEVBQVM7UUFDckIsSUFBSUQsQ0FBQyxHQUFHRixLQUFLLENBQUNJLE1BQU0sRUFBRTtVQUNwQmIsV0FBVyxDQUFDYyxjQUFjLENBQUNQLE9BQU8sRUFBRUEsT0FBTyxDQUFDdkksS0FBSyxHQUFHeUksS0FBSyxDQUFDRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztVQUNyRUkscUJBQXFCLENBQUNILFFBQVEsQ0FBQztRQUNqQyxDQUFDLE1BQU07VUFDTHBILG9EQUFRLENBQUN1RSxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDbkM7TUFDRixDQUFDO01BRUQ2QyxRQUFRLENBQUMsQ0FBQztJQUNaO0VBQUM7SUFBQTdJLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUE4SSxlQUFzQlAsT0FBTyxFQUFFdkksS0FBSyxFQUFFO01BQ3BDLElBQUlnSixTQUFTLEdBQUdULE9BQU8sQ0FBQ3ZJLEtBQUs7TUFDN0J1SSxPQUFPLENBQUN2SSxLQUFLLEdBQUdBLEtBQUs7TUFDckIsSUFBSWlKLEtBQUssR0FBRyxJQUFJQyxLQUFLLENBQUMsT0FBTyxFQUFFO1FBQUVDLE1BQU0sRUFBRVosT0FBTztRQUFFMUIsT0FBTyxFQUFFO01BQUssQ0FBQyxDQUFDO01BQ2xFO01BQ0FvQyxLQUFLLENBQUNHLFNBQVMsR0FBRyxJQUFJO01BQ3RCO01BQ0EsSUFBSUMsT0FBTyxHQUFHZCxPQUFPLENBQUNlLGFBQWE7TUFDbkMsSUFBSUQsT0FBTyxFQUFFO1FBQ1hBLE9BQU8sQ0FBQ0UsUUFBUSxDQUFDUCxTQUFTLENBQUM7TUFDN0I7TUFDQVQsT0FBTyxDQUFDdkIsYUFBYSxDQUFDaUMsS0FBSyxDQUFDO0lBQzlCO0VBQUM7SUFBQWxKLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUF3SixvQkFBQSxFQUE2QjtNQUMzQmhJLG9EQUFRLENBQUN1RSxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDdkM7RUFBQztJQUFBaEcsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQXlKLGtCQUFBLEVBQTJCO01BQ3pCakksb0RBQVEsQ0FBQ3VFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUN0QztFQUFDO0lBQUFoRyxHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBMEosc0JBQTZCL0csTUFBTSxFQUFFO01BQ25DO01BQ0FBLE1BQU0sQ0FBQ2pDLFNBQVMsQ0FBQ2lKLE1BQU0sQ0FBQyxZQUFZLENBQUM7TUFDckMsSUFBSWhILE1BQU0sQ0FBQ2lILFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLE1BQU0sRUFBRTtRQUNyRGpILE1BQU0sQ0FBQ3lDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUM7UUFDL0NNLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLHFCQUFxQixDQUFDO01BQ3BDLENBQUMsTUFBTTtRQUNMaEQsTUFBTSxDQUFDeUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztRQUM5Q00sT0FBTyxDQUFDQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7TUFDbkM7SUFDRjtFQUFDO0lBQUE1RixHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBNkoscUJBQTRCbEgsTUFBTSxFQUFFa0MsQ0FBQyxFQUFFO01BQ3JDQSxDQUFDLENBQUNpRixjQUFjLENBQUMsQ0FBQztNQUNsQnRJLG9EQUFRLENBQUN1RSxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDdkM7RUFBQztJQUFBaEcsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQStKLG1CQUEwQnBILE1BQU0sRUFBRTtNQUNoQ25CLG9EQUFRLENBQUN1RSxJQUFJLENBQUMscUJBQXFCLENBQUM7SUFDdEM7RUFBQztJQUFBaEcsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQWdLLCtCQUFzQ3JILE1BQU0sRUFBRTtNQUM1QztNQUNBQSxNQUFNLENBQUM4QyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsWUFBTTtRQUMxQ2pFLG9EQUFRLENBQUN1RSxJQUFJLENBQUMsc0JBQXNCLENBQUM7TUFDdkMsQ0FBQyxDQUFDO01BQ0ZwRCxNQUFNLENBQUM4QyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsWUFBTTtRQUMxQ2pFLG9EQUFRLENBQUN1RSxJQUFJLENBQUMseUJBQXlCLENBQUM7TUFDMUMsQ0FBQyxDQUFDO01BQ0YxQyxNQUFNLENBQUNvQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsWUFBTTtRQUM1Q2pFLG9EQUFRLENBQUN1RSxJQUFJLENBQUMseUJBQXlCLENBQUM7TUFDMUMsQ0FBQyxDQUFDO01BQ0ZwRCxNQUFNLENBQUM4QyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsWUFBTTtRQUMzQ2pFLG9EQUFRLENBQUN1RSxJQUFJLENBQUMseUJBQXlCLENBQUM7TUFDMUMsQ0FBQyxDQUFDO0lBQ0o7RUFBQztJQUFBaEcsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQWtJLDJCQUFrQ2hHLEtBQUssRUFBRTtNQUN2Q1Ysb0RBQVEsQ0FBQ2MsRUFBRSxDQUFDZ0YsYUFBYSxFQUFFLFlBQU07UUFDL0JwRixLQUFLLENBQUM0RCxJQUFJLENBQUN3QixhQUFhLENBQUM7TUFDM0IsQ0FBQyxDQUFDO01BRUYsQ0FBQ0MscUJBQXFCLEVBQUVDLHNCQUFzQixDQUFDLENBQUNoSCxPQUFPLENBQUMsVUFBQ3lKLFNBQVMsRUFBSztRQUNyRXpJLG9EQUFRLENBQUNjLEVBQUUsQ0FBQzJILFNBQVMsRUFBRSxVQUFDQyxNQUFNLEVBQUs7VUFDakMsSUFBSUEsTUFBTSxFQUFFO1lBQ1ZoSSxLQUFLLENBQUM0RCxJQUFJLENBQUFxRSxhQUFBO2NBQUcxRixJQUFJLEVBQUV3RjtZQUFTLEdBQUtDLE1BQU0sQ0FBRSxDQUFDO1VBQzVDLENBQUMsTUFBTTtZQUNMeEUsT0FBTyxDQUFDMEUsSUFBSSxhQUFBQyxNQUFBLENBQWFKLFNBQVMsc0JBQW1CLENBQUM7VUFDeEQ7UUFDRixDQUFDLENBQUM7TUFDSixDQUFDLENBQUM7TUFFRnpJLG9EQUFRLENBQUNjLEVBQUUsQ0FBQ21GLFlBQVksRUFBRSxZQUFNO1FBQzlCdkYsS0FBSyxDQUFDNEQsSUFBSSxDQUFDMkIsWUFBWSxDQUFDO01BQzFCLENBQUMsQ0FBQztNQUVGLENBQUNDLFdBQVcsRUFBRUMsbUJBQW1CLEVBQUVDLG9CQUFvQixDQUFDLENBQUNwSCxPQUFPLENBQzlELFVBQUN5SixTQUFTLEVBQUs7UUFDYnpJLG9EQUFRLENBQUNjLEVBQUUsQ0FBQzJILFNBQVMsRUFBRSxZQUFNO1VBQzNCL0gsS0FBSyxDQUFDNEQsSUFBSSxDQUFDbUUsU0FBUyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztNQUNKLENBQ0YsQ0FBQztNQUVELENBQUNwQyxLQUFLLEVBQUVDLEtBQUssRUFBRUMsSUFBSSxDQUFDLENBQUN2SCxPQUFPLENBQUMsVUFBQ3lKLFNBQVMsRUFBSztRQUMxQ3pJLG9EQUFRLENBQUNjLEVBQUUsQ0FBQzJILFNBQVMsRUFBRSxZQUFNO1VBQzNCL0gsS0FBSyxDQUFDNEQsSUFBSSxDQUFDbUUsU0FBUyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztNQUNKLENBQUMsQ0FBQztJQUNKOztJQUVBO0VBQUE7SUFBQWxLLEdBQUE7SUFBQUMsS0FBQSxFQUVBLFNBQUFzSyxlQUFBLEVBQXdCO01BQ3RCLElBQUlDLFFBQVEsR0FBRyxLQUFLO01BRXBCbEssUUFBUSxDQUFDb0YsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFVBQUN3RCxLQUFLLEVBQUs7UUFDOUMsSUFBSUEsS0FBSyxDQUFDdUIsT0FBTyxJQUFJdkIsS0FBSyxDQUFDd0IsSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDRixRQUFRLEVBQUU7VUFDeERBLFFBQVEsR0FBRyxJQUFJO1VBQ2YvSSxvREFBUSxDQUFDdUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQ3ZDO01BQ0YsQ0FBQyxDQUFDO01BRUYxRixRQUFRLENBQUNvRixnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsVUFBQ3dELEtBQUssRUFBSztRQUM1QyxJQUFJc0IsUUFBUSxJQUFJdEIsS0FBSyxDQUFDd0IsSUFBSSxLQUFLLE9BQU8sRUFBRTtVQUN0Q0YsUUFBUSxHQUFHLEtBQUs7VUFDaEIvSSxvREFBUSxDQUFDdUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1FBQ3RDO01BQ0YsQ0FBQyxDQUFDO0lBQ0o7RUFBQztFQUFBLE9BQUFpQyxXQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztBQzVKSSxTQUFTMEMsbUJBQW1CQSxDQUFDQyxVQUFVLEVBQUU7RUFDOUMsSUFBSSxPQUFPQSxVQUFVLEtBQUssUUFBUSxFQUFFO0lBQ2xDLE9BQU9BLFVBQVU7RUFDbkI7RUFFQSxPQUFPQyxNQUFNLENBQUNDLElBQUksQ0FBQ0YsVUFBVSxDQUFDLENBQzNCRyxHQUFHLENBQUMsVUFBQy9LLEdBQUc7SUFBQSxVQUFBc0ssTUFBQSxDQUFRdEssR0FBRyxPQUFBc0ssTUFBQSxDQUFJSyxtQkFBbUIsQ0FBQ0MsVUFBVSxDQUFDNUssR0FBRyxDQUFDLENBQUM7RUFBQSxDQUFFLENBQUMsQ0FDOURnTCxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQ2Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUm1DO0FBQ3FCO0FBQ0Y7O0FBRXREO0FBQ0E7QUFDQTtBQUZBLElBR010SixtQkFBbUIsZ0JBQUEzQixZQUFBLENBQ3ZCLFNBQUEyQixvQkFBQSxFQUFjO0VBQUE1QixlQUFBLE9BQUE0QixtQkFBQTtFQUNaLElBQUksQ0FBQ1MsS0FBSyxHQUFHOEksaURBQVMsQ0FBQ0MsaUVBQU8sQ0FBQyxDQUFDQyxZQUFZLENBQUMsVUFBQ0MsS0FBSyxFQUFLO0lBQ3RELElBQUlBLEtBQUssQ0FBQ0MsT0FBTyxFQUFFO01BQ2pCLElBQU1DLFNBQVMsR0FBR0YsS0FBSyxDQUFDRyxPQUFPLEdBQzNCWixtRUFBbUIsQ0FBQ1MsS0FBSyxDQUFDRyxPQUFPLENBQUN0TCxLQUFLLENBQUMsR0FDeEMsS0FBSztNQUNULElBQU11TCxPQUFPLEdBQUdiLG1FQUFtQixDQUFDUyxLQUFLLENBQUNuTCxLQUFLLENBQUM7TUFDaEQwRixPQUFPLENBQUNDLEdBQUcsc0NBQUEwRSxNQUFBLENBQzRCZ0IsU0FBUyxVQUFBaEIsTUFBQSxDQUFPa0IsT0FBTyxZQUFBbEIsTUFBQSxDQUFTYyxLQUFLLENBQUNsQyxLQUFLLENBQUN4RSxJQUFJLENBQ3ZGLENBQUM7SUFDSDtFQUNGLENBQUMsQ0FBQztFQUNGLElBQUksQ0FBQ3ZDLEtBQUssQ0FBQ3NKLEtBQUssQ0FBQyxDQUFDO0FBQ3BCLENBQUMsR0FHSDtBQUNBLGlFQUFlLElBQUkvSixtQkFBbUIsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekJtQjtBQUNQO0FBQ2Y7QUFDTTtBQUUzQyxJQUFNb0MsTUFBTSxHQUFHO0VBQ2I0SCxZQUFZLEVBQUVDLHNCQUEwQjtFQUN4Q0csWUFBWSxFQUFFSCxzQkFBMEJJO0FBQzFDLENBQUM7QUFFTSxTQUFTQyxXQUFXQSxDQUFDQyxTQUFTLEVBQUVDLG1CQUFtQixFQUFFO0VBQzFEO0VBQ0EsSUFBSUMsUUFBUSxHQUFHLElBQUlDLFFBQVEsQ0FBQyxDQUFDO0VBQzdCLElBQUlDLGFBQWEsR0FBRyxZQUFZO0VBQ2hDLElBQUlKLFNBQVMsQ0FBQ3ZILElBQUksS0FBSyxXQUFXLEVBQUU7SUFDbEMySCxhQUFhLEdBQUcsV0FBVztFQUM3QjtFQUNBO0VBQ0FGLFFBQVEsQ0FBQ0csTUFBTSxDQUFDLE9BQU8sRUFBRUwsU0FBUyxFQUFFSSxhQUFhLENBQUM7RUFDbEQ7RUFDQSxJQUFJRSxRQUFRLEdBQUdDLFNBQVMsQ0FBQ0QsUUFBUTtFQUVqQyxJQUFNRSxTQUFTLEdBQUcsSUFBSUMsSUFBSSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLENBQUM7RUFDdEM7RUFDQUMsS0FBSyxDQUFDOUksTUFBTSxDQUFDZ0ksWUFBWSxHQUFHLHVCQUF1QixHQUFHUyxRQUFRLEVBQUU7SUFDOURNLE1BQU0sRUFBRSxNQUFNO0lBQ2R2SCxJQUFJLEVBQUU2RztFQUNSLENBQUMsQ0FBQyxDQUNDVyxJQUFJLENBQUMsVUFBVUMsUUFBUSxFQUFFO0lBQ3hCLElBQUksQ0FBQ0EsUUFBUSxDQUFDQyxFQUFFLEVBQUU7TUFDaEIsTUFBTUMsS0FBSyxDQUFDRixRQUFRLENBQUNHLFVBQVUsQ0FBQztJQUNsQztJQUNBLE9BQU9ILFFBQVEsQ0FBQ0ksSUFBSSxDQUFDLENBQUM7RUFDeEIsQ0FBQyxDQUFDLENBQ0RMLElBQUksQ0FBQyxVQUFVTSxZQUFZLEVBQUU7SUFDNUIsSUFBTUMsT0FBTyxHQUFHLElBQUlYLElBQUksQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLElBQU1XLDJCQUEyQixHQUFHRCxPQUFPLEdBQUdaLFNBQVM7SUFFdkQ5RyxPQUFPLENBQUNDLEdBQUcsQ0FDVCxjQUFjLEdBQ1oySCxJQUFJLENBQUNDLEtBQUssQ0FBQ3RCLG1CQUFtQixHQUFHLElBQUksQ0FBQyxHQUN0QyxnQkFBZ0IsR0FDaEJxQixJQUFJLENBQUNDLEtBQUssQ0FBQ0YsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLEdBQzlDLEdBQ0osQ0FBQztJQUVELElBQUlGLFlBQVksQ0FBQzNFLElBQUksQ0FBQ0ssTUFBTSxLQUFLLENBQUMsRUFBRTtNQUNsQ3BILCtEQUFtQixDQUFDUyxLQUFLLENBQUM0RCxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDMUQsQ0FBQyxNQUFNO01BQ0xyRSwrREFBbUIsQ0FBQ1MsS0FBSyxDQUFDNEQsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1FBQ2xEMEMsSUFBSSxFQUFFMkUsWUFBWSxDQUFDM0U7TUFDckIsQ0FBQyxDQUFDO0lBQ0o7RUFDRixDQUFDLENBQUMsU0FDSSxDQUFDLFVBQVVnRixLQUFLLEVBQUU7SUFDdEI5SCxPQUFPLENBQUM4SCxLQUFLLENBQUMsa0NBQWtDLEVBQUVBLEtBQUssQ0FBQztJQUN4RC9MLCtEQUFtQixDQUFDUyxLQUFLLENBQUM0RCxJQUFJLENBQUMsd0JBQXdCLENBQUM7RUFDMUQsQ0FBQyxDQUFDO0FBQ047QUFFTyxTQUFTdUMsMkJBQTJCQSxDQUFDb0YsVUFBVSxFQUFFO0VBQ3REL0gsT0FBTyxDQUFDQyxHQUFHLENBQUMsY0FBYyxHQUFHOEgsVUFBVSxDQUFDO0VBQ3hDLElBQU0vRyxRQUFRLEdBQUdyRyxRQUFRLENBQUNnRyxjQUFjLENBQUMsY0FBYyxDQUFDO0VBQ3hELElBQUk5RSxpRUFBWSxDQUFDLENBQUMsRUFBRTtJQUNsQjtJQUNBLElBQUlrTSxVQUFVLENBQUM1RSxNQUFNLEdBQUcsSUFBSSxFQUFFO01BQzVCNEUsVUFBVSxHQUFHQSxVQUFVLENBQUNDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRztNQUMvQ2hJLE9BQU8sQ0FBQzBFLElBQUksQ0FDViw4RkFBOEYsR0FDNUZxRCxVQUFVLENBQUNDLFNBQVMsQ0FBQyxHQUFHLENBQzVCLENBQUM7SUFDSDtJQUNBMUYsdURBQVcsQ0FBQ2MsY0FBYyxDQUFDcEMsUUFBUSxFQUFFK0csVUFBVSxDQUFDO0lBQ2hEak0sb0RBQVEsQ0FBQ3VFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztFQUNuQyxDQUFDLE1BQU07SUFDTGlDLHVEQUFXLENBQUNNLGNBQWMsQ0FBQzVCLFFBQVEsRUFBRStHLFVBQVUsR0FBRyxHQUFHLENBQUM7RUFDeEQ7QUFDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0VPLFNBQVNFLFFBQVFBLENBQUEsRUFBRztFQUN6QixPQUFPLGdDQUFnQyxDQUFDQyxJQUFJLENBQUNyQixTQUFTLENBQUNzQixTQUFTLENBQUM7QUFDbkU7QUFDTyxTQUFTQyxjQUFjQSxDQUFBLEVBQUc7RUFDL0IsT0FDRSxnRUFBZ0UsQ0FBQ0YsSUFBSSxDQUNuRXJCLFNBQVMsQ0FBQ3NCLFNBQ1osQ0FBQyxJQUFJeEssTUFBTSxDQUFDQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQ3lLLE9BQU87QUFFeEQ7O0FBRUE7QUFDTyxTQUFTeE0sWUFBWUEsQ0FBQSxFQUFHO0VBQzdCLElBQUl5TSxrQkFBa0IsR0FBRyxJQUFJO0VBRTdCLElBQUk7SUFDRkEsa0JBQWtCLEdBQUdDLFlBQVksQ0FBQ0MsT0FBTyxDQUFDLG9CQUFvQixDQUFDO0VBQ2pFLENBQUMsQ0FBQyxPQUFPckosQ0FBQyxFQUFFO0lBQ1ZhLE9BQU8sQ0FBQzBFLElBQUksQ0FBQyxpQ0FBaUMsRUFBRXZGLENBQUMsQ0FBQztFQUNwRDtFQUVBLElBQUlzSixhQUFhLEdBQUcsS0FBSztFQUN6QixJQUFJSCxrQkFBa0IsRUFBRTtJQUN0QkcsYUFBYSxHQUFHSCxrQkFBa0IsS0FBSyxRQUFRO0VBQ2pEOztFQUVBO0VBQ0EsT0FBT0YsY0FBYyxDQUFDLENBQUMsSUFBSUssYUFBYTtBQUMxQztBQUVPLFNBQVM3TSxjQUFjQSxDQUFBLEVBQUc7RUFDL0IyTSxZQUFZLENBQUNHLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDOztFQUV2RCxJQUFNN0YsT0FBTyxHQUFHbEksUUFBUSxDQUFDdUQsZUFBZTtFQUN4QzJFLE9BQU8sQ0FBQzdILFNBQVMsQ0FBQ0csTUFBTSxDQUFDLGFBQWEsQ0FBQztFQUN2QzBILE9BQU8sQ0FBQzdILFNBQVMsQ0FBQ0MsR0FBRyxDQUFDLGNBQWMsQ0FBQztBQUN2QztBQUVPLFNBQVNVLGVBQWVBLENBQUEsRUFBRztFQUNoQzRNLFlBQVksQ0FBQ0csT0FBTyxDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7O0VBRXRELElBQU03RixPQUFPLEdBQUdsSSxRQUFRLENBQUN1RCxlQUFlO0VBQ3hDMkUsT0FBTyxDQUFDN0gsU0FBUyxDQUFDRyxNQUFNLENBQUMsY0FBYyxDQUFDO0VBQ3hDMEgsT0FBTyxDQUFDN0gsU0FBUyxDQUFDQyxHQUFHLENBQUMsYUFBYSxDQUFDO0FBQ3RDO0FBRU8sU0FBUzBOLGlCQUFpQkEsQ0FBQSxFQUFHO0VBQ2xDLElBQU1DLGdCQUFnQixHQUNwQixTQUFTLENBQUNWLElBQUksQ0FBQ3JCLFNBQVMsQ0FBQ3NCLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQ0QsSUFBSSxDQUFDckIsU0FBUyxDQUFDc0IsU0FBUyxDQUFDO0VBQzVFLElBQU10RixPQUFPLEdBQUdsSSxRQUFRLENBQUN1RCxlQUFlO0VBRXhDLElBQUkwSyxnQkFBZ0IsRUFBRTtJQUNwQi9GLE9BQU8sQ0FBQzdILFNBQVMsQ0FBQ0MsR0FBRyxDQUFDLGlCQUFpQixDQUFDO0VBQzFDO0VBRUE0TixjQUFjLENBQUNoRyxPQUFPLENBQUM7RUFDdkJpRyxZQUFZLENBQUNqRyxPQUFPLENBQUM7QUFDdkI7QUFFTyxTQUFTZ0csY0FBY0EsQ0FBQ2hHLE9BQU8sRUFBRTtFQUN0QyxJQUFJdUYsY0FBYyxDQUFDLENBQUMsRUFBRTtJQUNwQnZGLE9BQU8sQ0FBQzdILFNBQVMsQ0FBQ0MsR0FBRyxDQUFDLGVBQWUsQ0FBQztFQUN4QztBQUNGO0FBRU8sU0FBUzZOLFlBQVlBLENBQUNqRyxPQUFPLEVBQUU7RUFDcEMsSUFBSWhILFlBQVksQ0FBQyxDQUFDLEVBQUU7SUFDbEJnSCxPQUFPLENBQUM3SCxTQUFTLENBQUNHLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDeEMwSCxPQUFPLENBQUM3SCxTQUFTLENBQUNDLEdBQUcsQ0FBQyxhQUFhLENBQUM7RUFDdEMsQ0FBQyxNQUFNO0lBQ0w0SCxPQUFPLENBQUM3SCxTQUFTLENBQUNHLE1BQU0sQ0FBQyxhQUFhLENBQUM7SUFDdkMwSCxPQUFPLENBQUM3SCxTQUFTLENBQUNDLEdBQUcsQ0FBQyxjQUFjLENBQUM7RUFDdkM7QUFDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6RStDO0FBQ1I7QUFDVTtBQUNXO0FBSTVCO0FBQ0c7QUFFNUIsSUFBTXNLLE9BQU8sR0FBR3dELHFEQUFhLENBQ2xDO0VBQ0U7RUFDQXZKLEVBQUUsRUFBRSxPQUFPO0VBQ1h3SixPQUFPLEVBQUUsTUFBTTtFQUNmQyxNQUFNLEVBQUU7SUFDTkMsSUFBSSxFQUFFO01BQ0pDLFdBQVcsRUFBRSwyQ0FBMkM7TUFDeERDLEtBQUssRUFBRSxDQUFDLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDO01BQ2pEeE0sRUFBRSxFQUFFO1FBQ0Ysb0JBQW9CLEVBQUU7VUFDcEI2RyxNQUFNLEVBQUU7UUFDVixDQUFDO1FBQ0QscUJBQXFCLEVBQUU7VUFDckJBLE1BQU0sRUFBRSxTQUFTO1VBQ2pCNEYsSUFBSSxFQUFFO1FBQ1IsQ0FBQztRQUNELGtCQUFrQixFQUFFO1VBQ2xCNUYsTUFBTSxFQUFFO1FBQ1Y7TUFDRjtJQUNGLENBQUM7SUFFRDZGLFlBQVksRUFBRTtNQUNaSCxXQUFXLEVBQ1QsNkVBQTZFO01BRS9FQyxLQUFLLEVBQUUsQ0FDTDtRQUNFckssSUFBSSxFQUFFLGdCQUFnQjtRQUN0QndLLE1BQU0sRUFBRTtVQUNOL08sU0FBUyxFQUFFO1FBQ2I7TUFDRixDQUFDLEVBQ0Qsb0JBQW9CLENBQ3JCO01BRURnUCxJQUFJLEVBQUUsQ0FDSjtRQUNFekssSUFBSSxFQUFFLGVBQWU7UUFDckJ3SyxNQUFNLEVBQUU7VUFDTi9PLFNBQVMsRUFBRTtRQUNiO01BQ0YsQ0FBQyxFQUNELHNCQUFzQixDQUN2QjtNQUVEb0MsRUFBRSxFQUFFO1FBQ0YsNEJBQTRCLEVBQUU7VUFDNUI2RyxNQUFNLEVBQUUsY0FBYztVQUN0QjRGLElBQUksRUFBRTtRQUNSLENBQUM7UUFDRCwyQkFBMkIsRUFBRTtVQUMzQjVGLE1BQU0sRUFBRSxNQUFNO1VBQ2Q0RixJQUFJLEVBQUU7UUFDUixDQUFDO1FBQ0Qsb0JBQW9CLEVBQUU7VUFDcEI1RixNQUFNLEVBQUU7UUFDVjtNQUNGO0lBQ0YsQ0FBQztJQUVEZ0csT0FBTyxFQUFFO01BQ1BOLFdBQVcsRUFDVCw0RkFBNEY7TUFDOUZDLEtBQUssRUFBRSxDQUNMO1FBQ0VySyxJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCd0ssTUFBTSxFQUFFO1VBQ04vTyxTQUFTLEVBQUU7UUFDYjtNQUNGLENBQUMsRUFDRCxnQkFBZ0IsQ0FDakI7TUFDRGdQLElBQUksRUFBRSxDQUNKO1FBQ0V6SyxJQUFJLEVBQUUsZUFBZTtRQUNyQndLLE1BQU0sRUFBRTtVQUNOL08sU0FBUyxFQUFFO1FBQ2I7TUFDRixDQUFDLEVBQ0QsZ0JBQWdCLENBQ2pCO01BQ0RvQyxFQUFFLEVBQUU7UUFDRixhQUFhLEVBQUU7VUFDYjZHLE1BQU0sRUFBRSxTQUFTO1VBQ2pCaUcsUUFBUSxFQUFFLElBQUk7VUFDZFAsV0FBVyxxREFBcUQ7VUFDaEVRLE9BQU8sRUFBRTtRQUNYLENBQUM7UUFFRCxlQUFlLEVBQUU7VUFDZmxHLE1BQU0sRUFBRTtRQUNWO01BQ0Y7SUFDRixDQUFDO0lBRURtRyxVQUFVLEVBQUU7TUFDVlQsV0FBVyxFQUNULCtEQUErRDtNQUNqRUMsS0FBSyxFQUFFO1FBQ0xySyxJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCd0ssTUFBTSxFQUFFO1VBQ04vTyxTQUFTLEVBQUU7UUFDYjtNQUNGLENBQUM7TUFDRGdQLElBQUksRUFBRTtRQUNKekssSUFBSSxFQUFFLGVBQWU7UUFDckJ3SyxNQUFNLEVBQUU7VUFDTi9PLFNBQVMsRUFBRTtRQUNiO01BQ0YsQ0FBQztNQUNEb0MsRUFBRSxFQUFFO1FBQ0YseUJBQXlCLEVBQUU7VUFDekI2RyxNQUFNLEVBQUU7UUFDVixDQUFDO1FBQ0Qsb0JBQW9CLEVBQUU7VUFDcEJBLE1BQU0sRUFBRTtRQUNWLENBQUM7UUFDRCwwQkFBMEIsRUFBRTtVQUMxQkEsTUFBTSxFQUFFO1FBQ1Y7TUFDRjtJQUNGLENBQUM7SUFFRG9HLFlBQVksRUFBRTtNQUNaVixXQUFXLEVBQUUsbURBQW1EO01BQ2hFQyxLQUFLLEVBQUUsQ0FDTDtRQUNFckssSUFBSSxFQUFFLGdCQUFnQjtRQUN0QndLLE1BQU0sRUFBRTtVQUNOL08sU0FBUyxFQUFFO1FBQ2I7TUFDRixDQUFDLEVBQ0Q7UUFDRXVFLElBQUksRUFBRSxpQkFBaUI7UUFDdkJ3SyxNQUFNLEVBQUUsQ0FBQztNQUNYLENBQUMsQ0FDRjtNQUNEQyxJQUFJLEVBQUU7UUFDSnpLLElBQUksRUFBRSxlQUFlO1FBQ3JCd0ssTUFBTSxFQUFFO1VBQ04vTyxTQUFTLEVBQUU7UUFDYjtNQUNGLENBQUM7TUFDRG9DLEVBQUUsRUFBRTtRQUNGLG1CQUFtQixFQUFFO1VBQ25CNkcsTUFBTSxFQUFFLE1BQU07VUFDZGtHLE9BQU8sRUFBRTtZQUNQNUssSUFBSSxFQUFFLDZCQUE2QjtZQUNuQ3dLLE1BQU0sRUFBRSxDQUFDO1VBQ1gsQ0FBQztVQUNESixXQUFXLEVBQUU7UUFDZixDQUFDO1FBRUQsd0JBQXdCLEVBQUU7VUFDeEIxRixNQUFNLEVBQUUsZ0NBQWdDO1VBQ3hDMEYsV0FBVyxFQUFFO1FBQ2YsQ0FBQztRQUVELHdCQUF3QixFQUFFO1VBQ3hCMUYsTUFBTSxFQUFFLHdCQUF3QjtVQUNoQzBGLFdBQVcsRUFDVDtRQUNKO01BQ0Y7SUFDRixDQUFDO0lBRURXLE9BQU8sRUFBRTtNQUNQWCxXQUFXLEVBQUUsd0JBQXdCO01BQ3JDQyxLQUFLLEVBQUU7UUFDTHJLLElBQUksRUFBRSxnQkFBZ0I7UUFDdEJ3SyxNQUFNLEVBQUU7VUFDTi9PLFNBQVMsRUFBRTtRQUNiO01BQ0YsQ0FBQztNQUNEZ1AsSUFBSSxFQUFFO1FBQ0p6SyxJQUFJLEVBQUUsZUFBZTtRQUNyQndLLE1BQU0sRUFBRTtVQUNOL08sU0FBUyxFQUFFO1FBQ2I7TUFDRixDQUFDO01BQ0RvQyxFQUFFLEVBQUU7UUFDRixrQkFBa0IsRUFBRTtVQUNsQjZHLE1BQU0sRUFBRTtRQUNWO01BQ0Y7SUFDRixDQUFDO0lBRURzRyxNQUFNLEVBQUU7TUFDTlosV0FBVyxFQUFFLHFCQUFxQjtNQUVsQ2EsS0FBSyxFQUFFO1FBQ0wsS0FBSyxFQUFFLENBQ0w7VUFDRXZHLE1BQU0sRUFBRSxhQUFhO1VBQ3JCa0csT0FBTyxFQUFFLEVBQUU7VUFDWFIsV0FBVyxFQUFFO1FBQ2YsQ0FBQyxFQUNEO1VBQ0VPLFFBQVEsRUFBRTtRQUNaLENBQUM7TUFFTCxDQUFDO01BRURWLE9BQU8sRUFBRSxrQkFBa0I7TUFFM0JDLE1BQU0sRUFBRTtRQUNOZ0IsZ0JBQWdCLEVBQUU7VUFDaEJkLFdBQVcsRUFBRSw4Q0FBOEM7VUFDM0RwSyxJQUFJLEVBQUUsT0FBTztVQUNicUssS0FBSyxFQUFFO1lBQ0xySyxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCd0ssTUFBTSxFQUFFO2NBQ04vTyxTQUFTLEVBQUU7WUFDYjtVQUNGLENBQUM7VUFFRGdQLElBQUksRUFBRTtZQUNKekssSUFBSSxFQUFFLGVBQWU7WUFDckJ3SyxNQUFNLEVBQUU7Y0FDTi9PLFNBQVMsRUFBRTtZQUNiO1VBQ0Y7UUFDRixDQUFDO1FBRUQwUCxRQUFRLEVBQUU7VUFDUm5MLElBQUksRUFBRSxPQUFPO1VBQ2JvSyxXQUFXLDJCQUEyQjtVQUN0Q0MsS0FBSyxFQUFFO1lBQ0xySyxJQUFJLEVBQUUsa0JBQWtCO1lBQ3hCd0ssTUFBTSxFQUFFO2NBQUUvSSxJQUFJLEVBQUU7WUFBbUI7VUFDckMsQ0FBQztVQUNEZ0osSUFBSSxFQUFFO1lBQ0p6SyxJQUFJLEVBQUUscUJBQXFCO1lBQzNCd0ssTUFBTSxFQUFFLENBQUM7VUFDWDtRQUNGO01BQ0Y7SUFDRjtFQUNGLENBQUM7RUFDRFksMEJBQTBCLEVBQUUsSUFBSTtFQUNoQ0MsbUJBQW1CLEVBQUU7QUFDdkIsQ0FBQyxFQUNEO0VBQ0VULE9BQU8sRUFBRTtJQUNQdk8saUJBQWlCLEVBQUUsU0FBQUEsa0JBQUNpUCxPQUFPLEVBQUU5RyxLQUFLLEVBQUs7TUFDckNySix3REFBZSxDQUFDa0IsaUJBQWlCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRURiLGNBQWMsRUFBRSxTQUFBQSxlQUFDOFAsT0FBTyxFQUFFOUcsS0FBSyxFQUFBK0csSUFBQSxFQUFpQjtNQUFBLElBQWJDLE1BQU0sR0FBQUQsSUFBQSxDQUFOQyxNQUFNO01BQ3ZDclEsd0RBQWUsQ0FBQ0ssY0FBYyxDQUFDZ1EsTUFBTSxDQUFDaEIsTUFBTSxDQUFDL08sU0FBUyxDQUFDO0lBQ3pELENBQUM7SUFFRFUsYUFBYSxFQUFFLFNBQUFBLGNBQUNtUCxPQUFPLEVBQUU5RyxLQUFLLEVBQUFpSCxLQUFBLEVBQWlCO01BQUEsSUFBYkQsTUFBTSxHQUFBQyxLQUFBLENBQU5ELE1BQU07TUFDdENyUSx3REFBZSxDQUFDZ0IsYUFBYSxDQUFDcVAsTUFBTSxDQUFDaEIsTUFBTSxDQUFDL08sU0FBUyxDQUFDO0lBQ3hELENBQUM7SUFFRGlRLGVBQWUsRUFBRSxTQUFBQSxnQkFBQ0osT0FBTyxFQUFFOUcsS0FBSyxFQUFLO01BQ25DdkQsT0FBTyxDQUFDQyxHQUFHLENBQUMsaUJBQWlCLEVBQUVzRCxLQUFLLENBQUM7TUFDckMsSUFBTStDLFNBQVMsR0FBRy9DLEtBQUssQ0FBQ21ILElBQUk7TUFDNUJyRSxpRUFBVyxDQUFDQyxTQUFTLEVBQUUvQyxLQUFLLENBQUNvSCxRQUFRLENBQUM7SUFDeEMsQ0FBQztJQUVEaEksMkJBQTJCLEVBQUUsU0FBQUEsNEJBQUMwSCxPQUFPLEVBQUU5RyxLQUFLLEVBQUs7TUFDL0N2RCxPQUFPLENBQUNDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRXNELEtBQUssQ0FBQztNQUNqRCxJQUFNcUgsYUFBYSxHQUFHckgsS0FBSyxDQUFDVCxJQUFJO01BQ2hDSCxpRkFBMkIsQ0FBQ2lJLGFBQWEsQ0FBQztJQUM1QyxDQUFDO0lBRUQxSyxjQUFjLEVBQUUsU0FBQUEsZUFBQ21LLE9BQU8sRUFBRTlHLEtBQUssRUFBSztNQUNsQzdCLHVEQUFZLENBQUN4QixjQUFjLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRURDLGNBQWMsRUFBRSxTQUFBQSxlQUFDa0ssT0FBTyxFQUFFOUcsS0FBSyxFQUFLO01BQ2xDN0IsdURBQVksQ0FBQ3ZCLGNBQWMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDBLLGtCQUFrQixFQUFFLFNBQUFBLG1CQUFDUixPQUFPLEVBQUU5RyxLQUFLLEVBQUs7TUFDdEMsSUFBTWhDLFVBQVUsR0FBRzVHLFFBQVEsQ0FBQ2dHLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQztNQUM5RFksVUFBVSxDQUFDdkcsU0FBUyxDQUFDQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDOztJQUVENlAsb0JBQW9CLEVBQUUsU0FBQUEscUJBQUNULE9BQU8sRUFBRTlHLEtBQUssRUFBSztNQUN4QyxJQUFNaEMsVUFBVSxHQUFHNUcsUUFBUSxDQUFDZ0csY0FBYyxDQUFDLGtCQUFrQixDQUFDO01BQzlEWSxVQUFVLENBQUN2RyxTQUFTLENBQUNHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7O0lBRUQ0UCxpQkFBaUIsRUFBRSxTQUFBQSxrQkFBQ1YsT0FBTyxFQUFFOUcsS0FBSyxFQUFLO01BQ3JDO01BQ0E7TUFDQSxJQUFJMUgsOERBQVksQ0FBQyxDQUFDLEVBQUU7UUFDbEJDLGlEQUFRLENBQUN1RSxJQUFJLENBQUMsc0JBQXNCLENBQUM7TUFDdkM7SUFDRixDQUFDO0lBRURDLGdCQUFnQixFQUFFLFNBQUFBLGlCQUFDK0osT0FBTyxFQUFFOUcsS0FBSyxFQUFBeUgsS0FBQSxFQUFpQjtNQUFBLElBQWJULE1BQU0sR0FBQVMsS0FBQSxDQUFOVCxNQUFNO01BQ3pDLElBQU0vSixJQUFJLEdBQUcrSixNQUFNLENBQUNoQixNQUFNLENBQUMvSSxJQUFJO01BQy9CLElBQU15SyxPQUFPLEdBQUdWLE1BQU0sQ0FBQ2hCLE1BQU0sQ0FBQzBCLE9BQU87TUFDckN2Six1REFBWSxDQUFDcEIsZ0JBQWdCLENBQUM7UUFBRUUsSUFBSSxFQUFKQSxJQUFJO1FBQUV5SyxPQUFPLEVBQVBBO01BQVEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRHJLLG1CQUFtQixFQUFFLFNBQUFBLG9CQUFDeUosT0FBTyxFQUFFOUcsS0FBSyxFQUFLO01BQ3ZDN0IsdURBQVksQ0FBQ2QsbUJBQW1CLENBQUMsQ0FBQztJQUNwQztFQUNGLENBQUM7RUFDRHNLLFFBQVEsRUFBRSxDQUFDLENBQUM7RUFDWkMsTUFBTSxFQUFFO0lBQ05DLGlCQUFpQixFQUFFLFNBQUFBLGtCQUFDZixPQUFPLEVBQUU5RyxLQUFLLEVBQUs7TUFDckMsT0FBT0EsS0FBSyxDQUFDb0gsUUFBUSxHQUFHLElBQUk7SUFDOUIsQ0FBQztJQUVEVSxtQkFBbUIsRUFBRSxTQUFBQSxvQkFBQ2hCLE9BQU8sRUFBRTlHLEtBQUssRUFBSztNQUN2QyxPQUFPQSxLQUFLLENBQUNvSCxRQUFRLElBQUksSUFBSTtJQUMvQixDQUFDO0lBRUQxQyxRQUFRLEVBQUUsU0FBQUEsU0FBQ29DLE9BQU8sRUFBRTlHLEtBQUssRUFBSztNQUM1QixPQUFPMEUsMERBQVEsQ0FBQyxDQUFDO0lBQ25CO0VBQ0YsQ0FBQztFQUNEcUQsTUFBTSxFQUFFLENBQUM7QUFDWCxDQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVVRDtBQUM2RztBQUNqQjtBQUM1Riw4QkFBOEIsbUZBQTJCLENBQUMsNEZBQXFDO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sNEZBQTRGLE1BQU0sWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLE1BQU0sWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLE1BQU0sWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLE1BQU0sWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLE1BQU0sWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLE1BQU0sWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssS0FBSyxZQUFZLGFBQWEsT0FBTyxZQUFZLE1BQU0sU0FBUyxZQUFZLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxTQUFTLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFNBQVMsWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssU0FBUyxZQUFZLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxTQUFTLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFNBQVMsWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLFlBQVksTUFBTSxNQUFNLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxNQUFNLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxNQUFNLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxNQUFNLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxNQUFNLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxNQUFNLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLEtBQUssWUFBWSxhQUFhLE9BQU8sWUFBWSxNQUFNLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLFlBQVksTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLEtBQUssTUFBTSxZQUFZLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxLQUFLLE1BQU0sWUFBWSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0s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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQSxrQ0FBa0MsUUFBUTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLHVDQUF1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LEVBQUU7RUFBSyxDQUFDLENBQUM7QUFDaEUsQ0FBQyxFQUFFLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vc3JjL0FuaW1hdGlvbk1vZHVsZS5qcyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vc3JjL0J1dHRvbk1vZHVsZS5qcyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vc3JjL0V2ZW50QnVzLmpzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9zcmMvRXZlbnRNb2R1bGUuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL3NyYy9Mb2dnaW5nTW9kdWxlLmpzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9zcmMvU3RhdGVNYWNoaW5lU2VydmljZS5qcyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vc3JjL1RyYW5zY3JpcHRpb25Nb2R1bGUuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL3NyYy9Vc2VyQWdlbnRNb2R1bGUuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL3NyYy9zdGF0ZS1tYWNoaW5lcy9TYXlQaU1hY2hpbmUuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL3NyYy9zdHlsZXMvcmVjdGFuZ2xlcy5jc3MiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL3NyYy9zdHlsZXMvY29tbW9uLnNjc3MiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL3NyYy9zdHlsZXMvZGVza3RvcC5zY3NzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9zcmMvc3R5bGVzL21vYmlsZS5zY3NzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL3B1YmxpYy9hdWRpb01vZHVsZS5idW5kbGUuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL3NyYy9pY29ucy9leGl0LnN2ZyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vc3JjL2ljb25zL21heGltaXplLnN2ZyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vc3JjL2ljb25zL211dGVkX21pY3JvcGhvbmUuc3ZnIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9zcmMvaWNvbnMvcGxheS5zdmciLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL3NyYy9pY29ucy9yZWN0YW5nbGVzLnN2ZyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vc3JjL2ljb25zL3dhdmVmb3JtLnN2ZyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vc3JjL3N0eWxlcy9yZWN0YW5nbGVzLmNzcz85NzQ1Iiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9zcmMvc3R5bGVzL2NvbW1vbi5zY3NzPzA0YzMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL3NyYy9zdHlsZXMvZGVza3RvcC5zY3NzP2RhZDciLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL3NyYy9zdHlsZXMvbW9iaWxlLnNjc3M/MWM4MyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL0FjdG9yLmpzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL01hY2hpbmUuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvU3RhdGUuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvU3RhdGVOb2RlLmpzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL192aXJ0dWFsL190c2xpYi5qcyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9hY3Rpb25UeXBlcy5qcyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9hY3Rpb25zLmpzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2JlaGF2aW9ycy5qcyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvZGV2VG9vbHMuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvZW52aXJvbm1lbnQuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvaW50ZXJwcmV0ZXIuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvaW52b2tlVXRpbHMuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvcmVnaXN0cnkuanMiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC8uL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvc2NoZWR1bGVyLmpzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3NlcnZpY2VTY29wZS5qcyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9zdGF0ZVV0aWxzLmpzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3R5cGVzLmpzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3V0aWxzLmpzIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0L3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vc2F5cGktdXNlcnNjcmlwdC93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3NheXBpLXVzZXJzY3JpcHQvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0L3dlYnBhY2svcnVudGltZS9ub25jZSIsIndlYnBhY2s6Ly9zYXlwaS11c2Vyc2NyaXB0Ly4vc3JjL3NheXBpLmluZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIEFuaW1hdGlvbk1vZHVsZSB7XG4gIHN0YXRpYyByZWN0YW5nbGVzU2VsZWN0b3IgPVxuICAgIFwiLm91dGVybW9zdCwgLnNlY29uZCwgLnRoaXJkLCAuZm91cnRoLCAuZmlmdGgsIC5pbm5lcm1vc3RcIjtcbiAgc3RhdGljIHRhbGtCdXR0b25BbmltYXRpb25zID0gW1xuICAgIFwibG9hZGluZ1wiLFxuICAgIFwicGlTcGVha2luZ1wiLFxuICAgIFwidXNlclNwZWFraW5nXCIsXG4gICAgXCJ0cmFuc2NyaWJpbmdcIixcbiAgICBcInBhdXNlZFwiLFxuICBdO1xuXG4gIHN0YXRpYyBzdGFydEFuaW1hdGlvbihhbmltYXRpb24pIHtcbiAgICB0aGlzLnN0b3BPdGhlckFuaW1hdGlvbnMoYW5pbWF0aW9uKTtcblxuICAgIGxldCByZWN0YW5nbGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnJlY3RhbmdsZXNTZWxlY3Rvcik7XG4gICAgcmVjdGFuZ2xlcy5mb3JFYWNoKChyZWN0KSA9PiByZWN0LmNsYXNzTGlzdC5hZGQoYW5pbWF0aW9uKSk7XG4gIH1cblxuICBzdGF0aWMgc3RvcEFuaW1hdGlvbihhbmltYXRpb24pIHtcbiAgICBsZXQgcmVjdGFuZ2xlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5yZWN0YW5nbGVzU2VsZWN0b3IpO1xuICAgIHJlY3RhbmdsZXMuZm9yRWFjaCgocmVjdCkgPT4gcmVjdC5jbGFzc0xpc3QucmVtb3ZlKGFuaW1hdGlvbikpO1xuICB9XG5cbiAgc3RhdGljIHN0b3BBbGxBbmltYXRpb25zKCkge1xuICAgIHRoaXMudGFsa0J1dHRvbkFuaW1hdGlvbnMuZm9yRWFjaCgoYW5pbWF0aW9uKSA9PlxuICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uKGFuaW1hdGlvbilcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIHN0b3BPdGhlckFuaW1hdGlvbnMoa2VlcEFuaW1hdGlvbikge1xuICAgIHRoaXMudGFsa0J1dHRvbkFuaW1hdGlvbnMuZm9yRWFjaCgoYW5pbWF0aW9uKSA9PiB7XG4gICAgICBpZiAoYW5pbWF0aW9uICE9PSBrZWVwQW5pbWF0aW9uKSB7XG4gICAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbihhbmltYXRpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBlbnRlck1vYmlsZU1vZGUsXG4gIGV4aXRNb2JpbGVNb2RlLFxuICBpc01vYmlsZVZpZXcsXG59IGZyb20gXCIuL1VzZXJBZ2VudE1vZHVsZVwiO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gXCIuL0V2ZW50QnVzXCI7XG5pbXBvcnQgU3RhdGVNYWNoaW5lU2VydmljZSBmcm9tIFwiLi9TdGF0ZU1hY2hpbmVTZXJ2aWNlLmpzXCI7XG5pbXBvcnQgZXhpdEljb25TVkcgZnJvbSBcIi4vaWNvbnMvZXhpdC5zdmdcIjtcbmltcG9ydCBtYXhpbWl6ZUljb25TVkcgZnJvbSBcIi4vaWNvbnMvbWF4aW1pemUuc3ZnXCI7XG5pbXBvcnQgcmVjdGFuZ2xlc1NWRyBmcm9tIFwiLi9pY29ucy9yZWN0YW5nbGVzLnN2Z1wiO1xuaW1wb3J0IHRhbGtJY29uU1ZHIGZyb20gXCIuL2ljb25zL3dhdmVmb3JtLnN2Z1wiO1xuaW1wb3J0IG11dGVkTWljSWNvblNWRyBmcm9tIFwiLi9pY29ucy9tdXRlZF9taWNyb3Bob25lLnN2Z1wiO1xuaW1wb3J0IHBsYXlJY29uU1ZHIGZyb20gXCIuL2ljb25zL3BsYXkuc3ZnXCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCdXR0b25Nb2R1bGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnBsYXlCdXR0b24gPSBudWxsO1xuICAgIHRoaXMuYWN0b3IgPSBTdGF0ZU1hY2hpbmVTZXJ2aWNlLmFjdG9yO1xuICAgIC8vIEJpbmRpbmcgbWV0aG9kcyB0byB0aGUgY3VycmVudCBpbnN0YW5jZVxuICAgIHRoaXMuaGFuZGxlUGxheUJ1dHRvbkNsaWNrID0gdGhpcy5oYW5kbGVQbGF5QnV0dG9uQ2xpY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyT3RoZXJFdmVudHMoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT3RoZXJFdmVudHMoKSB7XG4gICAgRXZlbnRCdXMub24oXCJzYXlwaTphdXRvU3VibWl0XCIsIEJ1dHRvbk1vZHVsZS5oYW5kbGVBdXRvU3VibWl0KTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBidXR0b25cbiAgY3JlYXRlQnV0dG9uKGxhYmVsLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gbGFiZWw7XG4gICAgYnV0dG9uLm9uY2xpY2sgPSBjYWxsYmFjaztcbiAgICByZXR1cm4gYnV0dG9uO1xuICB9XG5cbiAgLy8gRnVuY3Rpb24gdG8gc3R5bGUgYSBnaXZlbiBidXR0b25cbiAgc3R5bGVCdXR0b24oYnV0dG9uLCBzdHlsZXMpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoc3R5bGVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgYnV0dG9uLnN0eWxlW2tleV0gPSBzdHlsZXNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRUYWxrSWNvbihidXR0b24pIHtcbiAgICB0aGlzLnVwZGF0ZUljb25Db250ZW50KGJ1dHRvbik7XG5cbiAgICB3aW5kb3cubWF0Y2hNZWRpYShcIihtYXgtd2lkdGg6IDc2OHB4KVwiKS5hZGRMaXN0ZW5lcigoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUljb25Db250ZW50KGJ1dHRvbik7XG4gICAgfSk7XG4gICAgdGhpcy5zZXR1cENsYXNzT2JzZXJ2ZXIoYnV0dG9uKTtcbiAgfVxuXG4gIHVwZGF0ZUljb25Db250ZW50KGljb25Db250YWluZXIpIHtcbiAgICBpZiAoaXNNb2JpbGVWaWV3KCkpIHtcbiAgICAgIGljb25Db250YWluZXIuaW5uZXJIVE1MID0gcmVjdGFuZ2xlc1NWRztcbiAgICB9IGVsc2Uge1xuICAgICAgaWNvbkNvbnRhaW5lci5pbm5lckhUTUwgPSB0YWxrSWNvblNWRztcbiAgICB9XG4gIH1cblxuICBzZXR1cENsYXNzT2JzZXJ2ZXIoYnV0dG9uKSB7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsgLy8gVGhlIDxodG1sPiBlbGVtZW50XG5cbiAgICBjb25zdCBjb25maWcgPSB7IGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogW1wiY2xhc3NcIl0gfTtcblxuICAgIGNvbnN0IGNhbGxiYWNrID0gKG11dGF0aW9uc0xpc3QsIG9ic2VydmVyKSA9PiB7XG4gICAgICBmb3IgKGxldCBtdXRhdGlvbiBvZiBtdXRhdGlvbnNMaXN0KSB7XG4gICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSBcImF0dHJpYnV0ZXNcIikge1xuICAgICAgICAgIGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSBcImNsYXNzXCIpIHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwibW9iaWxlLXZpZXdcIikpIHtcbiAgICAgICAgICAgICAgLy8gJ21vYmlsZS12aWV3JyBjbGFzcyB3YXMgYWRkZWRcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVJY29uQ29udGVudChidXR0b24pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gJ21vYmlsZS12aWV3JyBjbGFzcyB3YXMgcmVtb3ZlZFxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUljb25Db250ZW50KGJ1dHRvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuXG4gICAgLy8gU3RhcnQgb2JzZXJ2aW5nIHRoZSB0YXJnZXQgbm9kZSBmb3IgY29uZmlndXJlZCBtdXRhdGlvbnNcbiAgICBvYnNlcnZlci5vYnNlcnZlKHRhcmdldE5vZGUsIGNvbmZpZyk7XG5cbiAgICAvLyBMYXRlciwgeW91IGNhbiBzdG9wIG9ic2VydmluZyBieSBjYWxsaW5nOlxuICAgIC8vIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIC8vIFNpbXVsYXRlIGFuIFwiRW50ZXJcIiBrZXlwcmVzcyBldmVudCBvbiBhIGZvcm1cbiAgc3RhdGljIHNpbXVsYXRlRm9ybVN1Ym1pdCgpIHtcbiAgICBjb25zdCBzdWJtaXRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNheXBpLXN1Ym1pdEJ1dHRvblwiKTtcbiAgICBpZiAoc3VibWl0QnV0dG9uKSB7XG4gICAgICBzdWJtaXRCdXR0b24uY2xpY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogaGl0IGVudGVyIGtleSBpbiB0aGUgcHJvbXB0IHRleHRhcmVhLCBtaWdodCBub3Qgd29yayBhcyBleHBlY3RlZCBvbiBcIm5ldyB1aSBsYXlvdXRcIiAqL1xuICAgICAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNheXBpLXByb21wdFwiKTtcblxuICAgICAgY29uc3QgZW50ZXJFdmVudCA9IG5ldyBLZXlib2FyZEV2ZW50KFwia2V5ZG93blwiLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGtleTogXCJFbnRlclwiLFxuICAgICAgICBrZXlDb2RlOiAxMyxcbiAgICAgICAgd2hpY2g6IDEzLFxuICAgICAgfSk7XG5cbiAgICAgIHRleHRhcmVhLmRpc3BhdGNoRXZlbnQoZW50ZXJFdmVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRnVuY3Rpb24gdG8gaGFuZGxlIGF1dG8tc3VibWl0IGJhc2VkIG9uIHRoZSBidXR0b24ncyBkYXRhIGF0dHJpYnV0ZVxuICBzdGF0aWMgaGFuZGxlQXV0b1N1Ym1pdCgpIHtcbiAgICBjb25zdCB0YWxrQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzYXlwaS10YWxrQnV0dG9uXCIpO1xuXG4gICAgaWYgKHRhbGtCdXR0b24uZGF0YXNldC5hdXRvc3VibWl0ID09PSBcImZhbHNlXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQXV0b3N1Ym1pdCBpcyBkaXNhYmxlZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgQnV0dG9uTW9kdWxlLnNpbXVsYXRlRm9ybVN1Ym1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUV4aXRCdXR0b24oKSB7XG4gICAgY29uc3QgbGFiZWwgPSBcIkV4aXQgVm9pY2UtQ29udHJvbGxlZCBNb2JpbGUgTW9kZVwiO1xuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuY3JlYXRlQnV0dG9uKFwiXCIsICgpID0+IHtcbiAgICAgIGV4aXRNb2JpbGVNb2RlKCk7XG4gICAgfSk7XG4gICAgYnV0dG9uLmlkID0gXCJzYXlwaS1leGl0QnV0dG9uXCI7XG4gICAgYnV0dG9uLnR5cGUgPSBcImJ1dHRvblwiO1xuICAgIGJ1dHRvbi5jbGFzc05hbWUgPVxuICAgICAgXCJleGl0LWJ1dHRvbiBmaXhlZCByb3VuZGVkLWZ1bGwgYmctY3JlYW0tNTUwIGVuYWJsZWQ6aG92ZXI6YmctY3JlYW0tNjUwXCI7XG4gICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgbGFiZWwpO1xuICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiLCBsYWJlbCk7XG4gICAgYnV0dG9uLmlubmVySFRNTCA9IGV4aXRJY29uU1ZHO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbiAgICByZXR1cm4gYnV0dG9uO1xuICB9XG5cbiAgY3JlYXRlRW50ZXJCdXR0b24oKSB7XG4gICAgY29uc3QgbGFiZWwgPSBcIkVudGVyIFZvaWNlLUNvbnRyb2xsZWQgTW9iaWxlIE1vZGVcIjtcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmNyZWF0ZUJ1dHRvbihcIlwiLCAoKSA9PiB7XG4gICAgICBlbnRlck1vYmlsZU1vZGUoKTtcbiAgICB9KTtcbiAgICBidXR0b24uaWQgPSBcInNheXBpLWVudGVyQnV0dG9uXCI7XG4gICAgYnV0dG9uLnR5cGUgPSBcImJ1dHRvblwiO1xuICAgIGJ1dHRvbi5jbGFzc05hbWUgPVxuICAgICAgXCJlbnRlci1idXR0b24gZml4ZWQgcm91bmRlZC1mdWxsIGJnLWNyZWFtLTU1MCBlbmFibGVkOmhvdmVyOmJnLWNyZWFtLTY1MFwiO1xuICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIGxhYmVsKTtcbiAgICBidXR0b24uc2V0QXR0cmlidXRlKFwidGl0bGVcIiwgbGFiZWwpO1xuICAgIGJ1dHRvbi5pbm5lckhUTUwgPSBtYXhpbWl6ZUljb25TVkc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChidXR0b24pO1xuICAgIHJldHVybiBidXR0b247XG4gIH1cblxuICBjcmVhdGVQbGF5QnV0dG9uKCkge1xuICAgIGNvbnN0IGxhYmVsID0gXCJIZWFyIFBpJ3MgcmVzcG9uc2VcIjtcbiAgICB0aGlzLnBsYXlCdXR0b24gPSB0aGlzLmNyZWF0ZUJ1dHRvbihcIlwiLCAoKSA9PiB7fSk7XG4gICAgdGhpcy5wbGF5QnV0dG9uLmlkID0gXCJzYXlwaS1wbGF5QnV0dG9uXCI7XG4gICAgdGhpcy5wbGF5QnV0dG9uLnR5cGUgPSBcImJ1dHRvblwiO1xuICAgIHRoaXMucGxheUJ1dHRvbi5jbGFzc05hbWUgPSBcImhpZGRlbiBwbGF5LWJ1dHRvblwiO1xuICAgIHRoaXMucGxheUJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIGxhYmVsKTtcbiAgICB0aGlzLnBsYXlCdXR0b24uc2V0QXR0cmlidXRlKFwidGl0bGVcIiwgbGFiZWwpO1xuICAgIHRoaXMucGxheUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5oYW5kbGVQbGF5QnV0dG9uQ2xpY2spO1xuICAgIHRoaXMucGxheUJ1dHRvbi5pbm5lckhUTUwgPSBwbGF5SWNvblNWRztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMucGxheUJ1dHRvbik7XG4gICAgY29uc29sZS5sb2coXCJQbGF5IGJ1dHRvbiBjcmVhdGVkLCBhbmQgYWRkZWQgdG8gdGhlIERPTS5cIik7XG4gICAgcmV0dXJuIHRoaXMucGxheUJ1dHRvbjtcbiAgfVxuXG4gIHNob3dQbGF5QnV0dG9uKCkge1xuICAgIGlmICghdGhpcy5wbGF5QnV0dG9uKSB7XG4gICAgICB0aGlzLmNyZWF0ZVBsYXlCdXR0b24oKTtcbiAgICB9XG4gICAgdGhpcy5wbGF5QnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRkZW5cIik7XG4gIH1cblxuICBoaWRlUGxheUJ1dHRvbigpIHtcbiAgICBpZiAodGhpcy5wbGF5QnV0dG9uKSB7XG4gICAgICB0aGlzLnBsYXlCdXR0b24uY2xhc3NMaXN0LmFkZChcImhpZGRlblwiKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVQbGF5QnV0dG9uQ2xpY2soKSB7XG4gICAgdGhpcy5hY3Rvci5zZW5kKFwic2F5cGk6dW5ibG9ja1wiKTtcbiAgICBFdmVudEJ1cy5lbWl0KFwiYXVkaW86cmVsb2FkXCIpO1xuICB9XG5cbiAgc2hvd05vdGlmaWNhdGlvbihkZXRhaWxzKSB7XG4gICAgY29uc3QgaWNvbiA9IGRldGFpbHMuaWNvbjtcbiAgICBsZXQgaWNvblNWRztcbiAgICBpZiAoaWNvbiA9PT0gXCJtdXRlZC1taWNyb3Bob25lXCIpIHtcbiAgICAgIGljb25TVkcgPSBtdXRlZE1pY0ljb25TVkc7XG4gICAgfVxuXG4gICAgY29uc3Qgbm90aWZpY2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzYXlwaS1ub3RpZmljYXRpb25cIik7XG4gICAgaWYgKG5vdGlmaWNhdGlvbikge1xuICAgICAgbm90aWZpY2F0aW9uLmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRkZW5cIik7XG4gICAgICBub3RpZmljYXRpb24uaW5uZXJIVE1MID0gaWNvblNWRztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIG5vdGlmaWNhdGlvbi5pZCA9IFwic2F5cGktbm90aWZpY2F0aW9uXCI7XG4gICAgICBub3RpZmljYXRpb24uY2xhc3NOYW1lID0gXCJub3RpZmljYXRpb25cIjtcbiAgICAgIG5vdGlmaWNhdGlvbi5pbm5lckhUTUwgPSBpY29uU1ZHO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub3RpZmljYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGRpc21pc3NOb3RpZmljYXRpb24oKSB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzYXlwaS1ub3RpZmljYXRpb25cIik7XG4gICAgaWYgKG5vdGlmaWNhdGlvbikge1xuICAgICAgbm90aWZpY2F0aW9uLmNsYXNzTGlzdC5hZGQoXCJoaWRkZW5cIik7XG4gICAgfVxuICB9XG59XG5cbi8vIFNpbmdsZXRvblxuZXhwb3J0IGNvbnN0IGJ1dHRvbk1vZHVsZSA9IG5ldyBCdXR0b25Nb2R1bGUoKTtcbiIsImltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcImV2ZW50c1wiO1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgRXZlbnRFbWl0dGVyKCk7XG4iLCJpbXBvcnQgRXZlbnRCdXMgZnJvbSBcIi4vRXZlbnRCdXMuanNcIjtcbmltcG9ydCBTdGF0ZU1hY2hpbmVTZXJ2aWNlIGZyb20gXCIuL1N0YXRlTWFjaGluZVNlcnZpY2UuanNcIjtcblxuY29uc3QgVVNFUl9TUEVBS0lORyA9IFwic2F5cGk6dXNlclNwZWFraW5nXCI7XG5jb25zdCBVU0VSX1NUT1BQRURfU1BFQUtJTkcgPSBcInNheXBpOnVzZXJTdG9wcGVkU3BlYWtpbmdcIjtcbmNvbnN0IFVTRVJfRklOSVNIRURfU1BFQUtJTkcgPSBcInNheXBpOnVzZXJGaW5pc2hlZFNwZWFraW5nXCI7XG5jb25zdCBUUkFOU0NSSUJJTkcgPSBcInNheXBpOnRyYW5zY3JpYmluZ1wiO1xuY29uc3QgUElfU1BFQUtJTkcgPSBcInNheXBpOnBpU3BlYWtpbmdcIjtcbmNvbnN0IFBJX1NUT1BQRURfU1BFQUtJTkcgPSBcInNheXBpOnBpU3RvcHBlZFNwZWFraW5nXCI7XG5jb25zdCBQSV9GSU5JU0hFRF9TUEVBS0lORyA9IFwic2F5cGk6cGlGaW5pc2hlZFNwZWFraW5nXCI7XG5jb25zdCBQQVVTRSA9IFwic2F5cGk6c2FmYXJpQmxvY2tlZFwiO1xuY29uc3QgUkVBRFkgPSBcInNheXBpOnJlYWR5XCI7XG5jb25zdCBQTEFZID0gXCJzYXlwaTpwbGF5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50TW9kdWxlIHtcbiAgc3RhdGljIGluaXQoKSB7XG4gICAgLy8gQWxsIHRoZSBldmVudCBsaXN0ZW5lcnMgY2FuIGJlIGFkZGVkIGhlcmVcbiAgICB0aGlzLnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnRzKFN0YXRlTWFjaGluZVNlcnZpY2UuYWN0b3IpO1xuICAgIC8vIEFueSBvdGhlciBpbml0aWFsaXphdGlvbnMuLi5cbiAgfVxuXG4gIHN0YXRpYyBjbGVhbnVwKCkge1xuICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgaWYgbmVlZGVkLCBvciBhbnkgb3RoZXIgY2xlYW51cCBvcGVyYXRpb25zXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBcInNheXBpOnRyYW5zY3JpYmVkXCIsXG4gICAgICB0aGlzLmhhbmRsZVRyYW5zY3JpcHRpb25SZXNwb25zZVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgc2ltdWxhdGVUeXBpbmcoZWxlbWVudCwgdGV4dCkge1xuICAgIGNvbnN0IHdvcmRzID0gdGV4dC5zcGxpdChcIiBcIik7XG4gICAgbGV0IGkgPSAwO1xuXG4gICAgY29uc3QgdHlwZVdvcmQgPSAoKSA9PiB7XG4gICAgICBpZiAoaSA8IHdvcmRzLmxlbmd0aCkge1xuICAgICAgICBFdmVudE1vZHVsZS5zZXROYXRpdmVWYWx1ZShlbGVtZW50LCBlbGVtZW50LnZhbHVlICsgd29yZHNbaSsrXSArIFwiIFwiKTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHR5cGVXb3JkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEV2ZW50QnVzLmVtaXQoXCJzYXlwaTphdXRvU3VibWl0XCIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0eXBlV29yZCgpO1xuICB9XG5cbiAgc3RhdGljIHNldE5hdGl2ZVZhbHVlKGVsZW1lbnQsIHZhbHVlKSB7XG4gICAgbGV0IGxhc3RWYWx1ZSA9IGVsZW1lbnQudmFsdWU7XG4gICAgZWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgIGxldCBldmVudCA9IG5ldyBFdmVudChcImlucHV0XCIsIHsgdGFyZ2V0OiBlbGVtZW50LCBidWJibGVzOiB0cnVlIH0pO1xuICAgIC8vIFJlYWN0IDE1XG4gICAgZXZlbnQuc2ltdWxhdGVkID0gdHJ1ZTtcbiAgICAvLyBSZWFjdCAxNi0xN1xuICAgIGxldCB0cmFja2VyID0gZWxlbWVudC5fdmFsdWVUcmFja2VyO1xuICAgIGlmICh0cmFja2VyKSB7XG4gICAgICB0cmFja2VyLnNldFZhbHVlKGxhc3RWYWx1ZSk7XG4gICAgfVxuICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH1cblxuICBzdGF0aWMgaGFuZGxlVGFsa01vdXNlRG93bigpIHtcbiAgICBFdmVudEJ1cy5lbWl0KFwiYXVkaW86c3RhcnRSZWNvcmRpbmdcIik7XG4gIH1cblxuICBzdGF0aWMgaGFuZGxlVGFsa01vdXNlVXAoKSB7XG4gICAgRXZlbnRCdXMuZW1pdChcImF1ZGlvOnN0b3BSZWNvcmRpbmdcIik7XG4gIH1cblxuICBzdGF0aWMgaGFuZGxlVGFsa0RvdWJsZUNsaWNrKGJ1dHRvbikge1xuICAgIC8vIFRvZ2dsZSB0aGUgQ1NTIGNsYXNzZXMgdG8gaW5kaWNhdGUgdGhlIG1vZGVcbiAgICBidXR0b24uY2xhc3NMaXN0LnRvZ2dsZShcImF1dG9TdWJtaXRcIik7XG4gICAgaWYgKGJ1dHRvbi5nZXRBdHRyaWJ1dGUoXCJkYXRhLWF1dG9zdWJtaXRcIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiZGF0YS1hdXRvc3VibWl0XCIsIFwiZmFsc2VcIik7XG4gICAgICBjb25zb2xlLmxvZyhcImF1dG9zdWJtaXQgZGlzYWJsZWRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWF1dG9zdWJtaXRcIiwgXCJ0cnVlXCIpO1xuICAgICAgY29uc29sZS5sb2coXCJhdXRvc3VibWl0IGVuYWJsZWRcIik7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGhhbmRsZVRhbGtUb3VjaFN0YXJ0KGJ1dHRvbiwgZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBFdmVudEJ1cy5lbWl0KFwiYXVkaW86c3RhcnRSZWNvcmRpbmdcIik7XG4gIH1cblxuICBzdGF0aWMgaGFuZGxlVGFsa1RvdWNoRW5kKGJ1dHRvbikge1xuICAgIEV2ZW50QnVzLmVtaXQoXCJhdWRpbzpzdG9wUmVjb3JkaW5nXCIpO1xuICB9XG5cbiAgc3RhdGljIHJlZ2lzdGVyT3RoZXJBdWRpb0J1dHRvbkV2ZW50cyhidXR0b24pIHtcbiAgICAvLyBcIndhcm0gdXBcIiB0aGUgbWljcm9waG9uZSBieSBhY3F1aXJpbmcgaXQgYmVmb3JlIHRoZSB1c2VyIHByZXNzZXMgdGhlIGJ1dHRvblxuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCAoKSA9PiB7XG4gICAgICBFdmVudEJ1cy5lbWl0KFwiYXVkaW86c2V0dXBSZWNvcmRpbmdcIik7XG4gICAgfSk7XG4gICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsICgpID0+IHtcbiAgICAgIEV2ZW50QnVzLmVtaXQoXCJhdWRpbzp0ZWFyRG93blJlY29yZGluZ1wiKTtcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCAoKSA9PiB7XG4gICAgICBFdmVudEJ1cy5lbWl0KFwiYXVkaW86dGVhckRvd25SZWNvcmRpbmdcIik7XG4gICAgfSk7XG4gICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGNhbmNlbFwiLCAoKSA9PiB7XG4gICAgICBFdmVudEJ1cy5lbWl0KFwiYXVkaW86dGVhckRvd25SZWNvcmRpbmdcIik7XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgcmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudHMoYWN0b3IpIHtcbiAgICBFdmVudEJ1cy5vbihVU0VSX1NQRUFLSU5HLCAoKSA9PiB7XG4gICAgICBhY3Rvci5zZW5kKFVTRVJfU1BFQUtJTkcpO1xuICAgIH0pO1xuXG4gICAgW1VTRVJfU1RPUFBFRF9TUEVBS0lORywgVVNFUl9GSU5JU0hFRF9TUEVBS0lOR10uZm9yRWFjaCgoZXZlbnROYW1lKSA9PiB7XG4gICAgICBFdmVudEJ1cy5vbihldmVudE5hbWUsIChkZXRhaWwpID0+IHtcbiAgICAgICAgaWYgKGRldGFpbCkge1xuICAgICAgICAgIGFjdG9yLnNlbmQoeyB0eXBlOiBldmVudE5hbWUsIC4uLmRldGFpbCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFJlY2VpdmVkICR7ZXZlbnROYW1lfSB3aXRob3V0IGRldGFpbHMuYCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgRXZlbnRCdXMub24oVFJBTlNDUklCSU5HLCAoKSA9PiB7XG4gICAgICBhY3Rvci5zZW5kKFRSQU5TQ1JJQklORyk7XG4gICAgfSk7XG5cbiAgICBbUElfU1BFQUtJTkcsIFBJX1NUT1BQRURfU1BFQUtJTkcsIFBJX0ZJTklTSEVEX1NQRUFLSU5HXS5mb3JFYWNoKFxuICAgICAgKGV2ZW50TmFtZSkgPT4ge1xuICAgICAgICBFdmVudEJ1cy5vbihldmVudE5hbWUsICgpID0+IHtcbiAgICAgICAgICBhY3Rvci5zZW5kKGV2ZW50TmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBbUEFVU0UsIFJFQURZLCBQTEFZXS5mb3JFYWNoKChldmVudE5hbWUpID0+IHtcbiAgICAgIEV2ZW50QnVzLm9uKGV2ZW50TmFtZSwgKCkgPT4ge1xuICAgICAgICBhY3Rvci5zZW5kKGV2ZW50TmFtZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qIGV2ZW50cyB0byBkaXJlY3QgdGhlIGF1ZGlvIG1vZHVsZSB0byBzdGFydC9zdG9wIHJlY29yZGluZyAqL1xuXG4gIHN0YXRpYyByZWdpc3RlckhvdGtleSgpIHtcbiAgICBsZXQgY3RybERvd24gPSBmYWxzZTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuY29kZSA9PT0gXCJTcGFjZVwiICYmICFjdHJsRG93bikge1xuICAgICAgICBjdHJsRG93biA9IHRydWU7XG4gICAgICAgIEV2ZW50QnVzLmVtaXQoXCJhdWRpbzpzdGFydFJlY29yZGluZ1wiKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCAoZXZlbnQpID0+IHtcbiAgICAgIGlmIChjdHJsRG93biAmJiBldmVudC5jb2RlID09PSBcIlNwYWNlXCIpIHtcbiAgICAgICAgY3RybERvd24gPSBmYWxzZTtcbiAgICAgICAgRXZlbnRCdXMuZW1pdChcImF1ZGlvOnN0b3BSZWNvcmRpbmdcIik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVTdGF0ZVZhbHVlKHN0YXRlVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBzdGF0ZVZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHN0YXRlVmFsdWU7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmtleXMoc3RhdGVWYWx1ZSlcbiAgICAubWFwKChrZXkpID0+IGAke2tleX06JHtzZXJpYWxpemVTdGF0ZVZhbHVlKHN0YXRlVmFsdWVba2V5XSl9YClcbiAgICAuam9pbihcIixcIik7XG59XG4iLCJpbXBvcnQgeyBpbnRlcnByZXQgfSBmcm9tIFwieHN0YXRlXCI7XG5pbXBvcnQgeyBtYWNoaW5lIH0gZnJvbSBcIi4vc3RhdGUtbWFjaGluZXMvU2F5UGlNYWNoaW5lXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVTdGF0ZVZhbHVlIH0gZnJvbSBcIi4vTG9nZ2luZ01vZHVsZVwiO1xuXG4vKipcbiAqIEEgc2luZ2xldG9uIHNlcnZpY2UgdGhhdCBtYW5hZ2VzIHRoZSBzdGF0ZSBtYWNoaW5lLlxuICovXG5jbGFzcyBTdGF0ZU1hY2hpbmVTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hY3RvciA9IGludGVycHJldChtYWNoaW5lKS5vblRyYW5zaXRpb24oKHN0YXRlKSA9PiB7XG4gICAgICBpZiAoc3RhdGUuY2hhbmdlZCkge1xuICAgICAgICBjb25zdCBmcm9tU3RhdGUgPSBzdGF0ZS5oaXN0b3J5XG4gICAgICAgICAgPyBzZXJpYWxpemVTdGF0ZVZhbHVlKHN0YXRlLmhpc3RvcnkudmFsdWUpXG4gICAgICAgICAgOiBcIk4vQVwiO1xuICAgICAgICBjb25zdCB0b1N0YXRlID0gc2VyaWFsaXplU3RhdGVWYWx1ZShzdGF0ZS52YWx1ZSk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBTYXksIFBpIE1hY2hpbmUgdHJhbnNpdGlvbmVkIGZyb20gJHtmcm9tU3RhdGV9IHRvICR7dG9TdGF0ZX0gd2l0aCAke3N0YXRlLmV2ZW50LnR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYWN0b3Iuc3RhcnQoKTtcbiAgfVxufVxuXG4vLyBTaW5nbGV0b25cbmV4cG9ydCBkZWZhdWx0IG5ldyBTdGF0ZU1hY2hpbmVTZXJ2aWNlKCk7XG4iLCJpbXBvcnQgU3RhdGVNYWNoaW5lU2VydmljZSBmcm9tIFwiLi9TdGF0ZU1hY2hpbmVTZXJ2aWNlLmpzXCI7XG5pbXBvcnQgeyBpc01vYmlsZVZpZXcgfSBmcm9tIFwiLi9Vc2VyQWdlbnRNb2R1bGUuanNcIjtcbmltcG9ydCBFdmVudEJ1cyBmcm9tIFwiLi9FdmVudEJ1cy5qc1wiO1xuaW1wb3J0IEV2ZW50TW9kdWxlIGZyb20gXCIuL0V2ZW50TW9kdWxlLmpzXCI7XG5cbmNvbnN0IGNvbmZpZyA9IHtcbiAgYXBwU2VydmVyVXJsOiBwcm9jZXNzLmVudi5BUFBfU0VSVkVSX1VSTCxcbiAgYXBpU2VydmVyVXJsOiBwcm9jZXNzLmVudi5BUElfU0VSVkVSX1VSTCxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGxvYWRBdWRpbyhhdWRpb0Jsb2IsIGF1ZGlvRHVyYXRpb25NaWxsaXMpIHtcbiAgLy8gQ3JlYXRlIGEgRm9ybURhdGEgb2JqZWN0XG4gIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICB2YXIgYXVkaW9GaWxlbmFtZSA9IFwiYXVkaW8ud2VibVwiO1xuICBpZiAoYXVkaW9CbG9iLnR5cGUgPT09IFwiYXVkaW8vbXA0XCIpIHtcbiAgICBhdWRpb0ZpbGVuYW1lID0gXCJhdWRpby5tcDRcIjtcbiAgfVxuICAvLyBBZGQgdGhlIGF1ZGlvIGJsb2IgdG8gdGhlIEZvcm1EYXRhIG9iamVjdFxuICBmb3JtRGF0YS5hcHBlbmQoXCJhdWRpb1wiLCBhdWRpb0Jsb2IsIGF1ZGlvRmlsZW5hbWUpO1xuICAvLyBHZXQgdGhlIHVzZXIncyBwcmVmZXJyZWQgbGFuZ3VhZ2VcbiAgdmFyIGxhbmd1YWdlID0gbmF2aWdhdG9yLmxhbmd1YWdlO1xuXG4gIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAvLyBQb3N0IHRoZSBhdWRpbyB0byB0aGUgc2VydmVyIGZvciB0cmFuc2NyaXB0aW9uXG4gIGZldGNoKGNvbmZpZy5hcGlTZXJ2ZXJVcmwgKyBcIi90cmFuc2NyaWJlP2xhbmd1YWdlPVwiICsgbGFuZ3VhZ2UsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGJvZHk6IGZvcm1EYXRhLFxuICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2VKc29uKSB7XG4gICAgICBjb25zdCBlbmRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICBjb25zdCB0cmFuc2NyaXB0aW9uRHVyYXRpb25NaWxsaXMgPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgXCJUcmFuc2NyaWJlZCBcIiArXG4gICAgICAgICAgTWF0aC5yb3VuZChhdWRpb0R1cmF0aW9uTWlsbGlzIC8gMTAwMCkgK1xuICAgICAgICAgIFwicyBvZiBhdWRpbyBpbiBcIiArXG4gICAgICAgICAgTWF0aC5yb3VuZCh0cmFuc2NyaXB0aW9uRHVyYXRpb25NaWxsaXMgLyAxMDAwKSArXG4gICAgICAgICAgXCJzXCJcbiAgICAgICk7XG5cbiAgICAgIGlmIChyZXNwb25zZUpzb24udGV4dC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgU3RhdGVNYWNoaW5lU2VydmljZS5hY3Rvci5zZW5kKFwic2F5cGk6dHJhbnNjcmliZWRFbXB0eVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFN0YXRlTWFjaGluZVNlcnZpY2UuYWN0b3Iuc2VuZChcInNheXBpOnRyYW5zY3JpYmVkXCIsIHtcbiAgICAgICAgICB0ZXh0OiByZXNwb25zZUpzb24udGV4dCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiTG9va3MgbGlrZSB0aGVyZSB3YXMgYSBwcm9ibGVtOiBcIiwgZXJyb3IpO1xuICAgICAgU3RhdGVNYWNoaW5lU2VydmljZS5hY3Rvci5zZW5kKFwic2F5cGk6dHJhbnNjcmliZUZhaWxlZFwiKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVRyYW5zY3JpcHRpb25SZXNwb25zZSh0cmFuc2NyaXB0KSB7XG4gIGNvbnNvbGUubG9nKFwiVHJhbnNjcmlwdDogXCIgKyB0cmFuc2NyaXB0KTtcbiAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNheXBpLXByb21wdFwiKTtcbiAgaWYgKGlzTW9iaWxlVmlldygpKSB7XG4gICAgLy8gaWYgdHJhbnNjcmlwdCBpcyA+IDEwMDAgY2hhcmFjdGVycywgdHJ1bmNhdGUgaXQgdG8gOTk5IGNoYXJhY3RlcnMgcGx1cyBhbiBlbGxpcHNpc1xuICAgIGlmICh0cmFuc2NyaXB0Lmxlbmd0aCA+IDEwMDApIHtcbiAgICAgIHRyYW5zY3JpcHQgPSB0cmFuc2NyaXB0LnN1YnN0cmluZygwLCA5OTkpICsgXCLigKZcIjtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJUcmFuc2NyaXB0IHdhcyB0b28gbG9uZyBmb3IgUGkuIFRydW5jYXRlZCB0byA5OTkgY2hhcmFjdGVycywgbG9zaW5nIHRoZSBmb2xsb3dpbmcgdGV4dDogLi4uIFwiICtcbiAgICAgICAgICB0cmFuc2NyaXB0LnN1YnN0cmluZyg5OTkpXG4gICAgICApO1xuICAgIH1cbiAgICBFdmVudE1vZHVsZS5zZXROYXRpdmVWYWx1ZSh0ZXh0YXJlYSwgdHJhbnNjcmlwdCk7XG4gICAgRXZlbnRCdXMuZW1pdChcInNheXBpOmF1dG9TdWJtaXRcIik7XG4gIH0gZWxzZSB7XG4gICAgRXZlbnRNb2R1bGUuc2ltdWxhdGVUeXBpbmcodGV4dGFyZWEsIHRyYW5zY3JpcHQgKyBcIiBcIik7XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc1NhZmFyaSgpIHtcbiAgcmV0dXJuIC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNNb2JpbGVEZXZpY2UoKSB7XG4gIHJldHVybiAoXG4gICAgL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KFxuICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudFxuICAgICkgfHwgd2luZG93Lm1hdGNoTWVkaWEoXCIobWF4LXdpZHRoOiA3NjhweClcIikubWF0Y2hlc1xuICApO1xufVxuXG4vLyB0aGlzIGZ1bmN0aW9uIGRldGVybWluZXMgd2hldGhlciB0byBzaG93IHRoZSBtb2JpbGUgdmlldyBvciBub3RcbmV4cG9ydCBmdW5jdGlvbiBpc01vYmlsZVZpZXcoKSB7XG4gIGxldCB1c2VyVmlld1ByZWZlcmVuY2UgPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgdXNlclZpZXdQcmVmZXJlbmNlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ1c2VyVmlld1ByZWZlcmVuY2VcIik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgYWNjZXNzIGxvY2FsU3RvcmFnZTogXCIsIGUpO1xuICB9XG5cbiAgbGV0IHByZWZlcnNNb2JpbGUgPSBmYWxzZTtcbiAgaWYgKHVzZXJWaWV3UHJlZmVyZW5jZSkge1xuICAgIHByZWZlcnNNb2JpbGUgPSB1c2VyVmlld1ByZWZlcmVuY2UgPT09IFwibW9iaWxlXCI7XG4gIH1cblxuICAvLyBNYWtlIHN1cmUgaXNNb2JpbGVEZXZpY2UgaXMgZGVmaW5lZCBvciBpbXBvcnRlZFxuICByZXR1cm4gaXNNb2JpbGVEZXZpY2UoKSAmJiBwcmVmZXJzTW9iaWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhpdE1vYmlsZU1vZGUoKSB7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwidXNlclZpZXdQcmVmZXJlbmNlXCIsIFwiZGVza3RvcFwiKTsgLy8gU2F2ZSBwcmVmZXJlbmNlXG5cbiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwibW9iaWxlLXZpZXdcIik7XG4gIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImRlc2t0b3Atdmlld1wiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudGVyTW9iaWxlTW9kZSgpIHtcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJ1c2VyVmlld1ByZWZlcmVuY2VcIiwgXCJtb2JpbGVcIik7IC8vIFNhdmUgcHJlZmVyZW5jZVxuXG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcImRlc2t0b3Atdmlld1wiKTtcbiAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwibW9iaWxlLXZpZXdcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRVc2VyQWdlbnRGbGFncygpIHtcbiAgY29uc3QgaXNGaXJlZm94QW5kcm9pZCA9XG4gICAgL0ZpcmVmb3gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL0FuZHJvaWQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgaWYgKGlzRmlyZWZveEFuZHJvaWQpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJmaXJlZm94LWFuZHJvaWRcIik7XG4gIH1cblxuICBhZGREZXZpY2VGbGFncyhlbGVtZW50KTtcbiAgYWRkVmlld0ZsYWdzKGVsZW1lbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRGV2aWNlRmxhZ3MoZWxlbWVudCkge1xuICBpZiAoaXNNb2JpbGVEZXZpY2UoKSkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcIm1vYmlsZS1kZXZpY2VcIik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFZpZXdGbGFncyhlbGVtZW50KSB7XG4gIGlmIChpc01vYmlsZVZpZXcoKSkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcImRlc2t0b3Atdmlld1wiKTtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJtb2JpbGUtdmlld1wiKTtcbiAgfSBlbHNlIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJtb2JpbGUtdmlld1wiKTtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJkZXNrdG9wLXZpZXdcIik7XG4gIH1cbn1cbiIsImltcG9ydCB7IGJ1dHRvbk1vZHVsZSB9IGZyb20gXCIuLi9CdXR0b25Nb2R1bGVcIjtcbmltcG9ydCB7IGNyZWF0ZU1hY2hpbmUgfSBmcm9tIFwieHN0YXRlXCI7XG5pbXBvcnQgQW5pbWF0aW9uTW9kdWxlIGZyb20gXCIuLi9BbmltYXRpb25Nb2R1bGVcIjtcbmltcG9ydCB7IGlzU2FmYXJpLCBpc01vYmlsZVZpZXcgfSBmcm9tIFwiLi4vVXNlckFnZW50TW9kdWxlXCI7XG5pbXBvcnQge1xuICB1cGxvYWRBdWRpbyxcbiAgaGFuZGxlVHJhbnNjcmlwdGlvblJlc3BvbnNlLFxufSBmcm9tIFwiLi4vVHJhbnNjcmlwdGlvbk1vZHVsZVwiO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gXCIuLi9FdmVudEJ1c1wiO1xuXG5leHBvcnQgY29uc3QgbWFjaGluZSA9IGNyZWF0ZU1hY2hpbmUoXG4gIHtcbiAgICAvKiogQHhzdGF0ZS1sYXlvdXQgTjRJZ3BnSmc1bURPSUM1U3dJWUU4QUtCTEFkRmlBTm1BTVNwb0FPV0NBcnJHQUU0REs1WUtBMWxnSFpRRGFBREFGMUVvY2dIdFlXQUM1WlJuWVNBQWVpQU13QjJQam1VQk9QZ0RZQWpMcTM3OXkzUUJvUWFSUHI1YXRPWGFxMjZBTEtvQk15LVFBNVRBWDM5TE1tdzhRaEl5U2dSVUFETVVlaXdBSVFKUkFHTTJTSDRoSkJBeENXbFplU1VFUGt0ckVzRGc5RkQ4SWxKMEtNcG1WZzV1TFBrOHFSazVIT0sxRFcwOVEyTlRDeXRFVng4UEhIZGRBRlpWSTJVRjNWMCtPY3FRRU54YUJtYjJMaWg2aWlwZCtnQXhMaXhZQUF0SWZkYmVRUTd4THNMZXhBOTdWeHc1dmxWVk10MUhvNXNveW9oUWJwZmg1NW90bEpNdEhNUEp0dGpnemc5RHNjb3VqSktKeUN3SUJpMnM4Y3AwQ2oxUU1VUEh3ZkE0cG53ek1vN0xTNWo0d2VNRUI1WEJvdElzNXF5LXF0VnI0VWRVZG5RbUN3RHR3c1ZSSlBRVUp4WUtrRWdBalE3dFVtdmNsRlQ3Zlg3LVFFTFBnZzlubFZ6ekhCOEdGSXJRK0JrQS1taXpDNFZVcGRLUVdVMFRodXRKc1RVaWJYZFhVSVd3NlRTdU5TcU9hNk5uVTd6Z2hBQW43cWJ6V2p5cVZ3ZUpHdVoyaFgwZWlCZStpc0NCb0FPNUlQdlNtSVZZODJPTEdGNkduS0h5SnRiS0hBZUcweHI0K1R3ZWZSNTNCTktXUEwxTlhINCs1ampVa3dQNVlNZlVOWnFHdUxUZGkzWjVaekZ5SjNrK0hBYmx4T0h5eG53TElkQkxaaW5DamxxWXlLbkNWRXA3WkJkdkNtS1Q0MHVueDNSTW5haUpzb202NkhobXNKZk1tTUxLTU9kNVlLK0U1WUpjbkRYSGNoS3pzUzc2Vm91MWJmaXVNSy1ONHlqZUZvM0pBbG9pWm1Qb09DZVBNQ3dBbm9QaVRCczE2b3ZLaXJLbXFqNE5IS0NwS2lxV0NxcGs4NDRaK0lhQVllK2k5am9KSGRvaWlaK0FhSnItSHd2aHN2b0dad1J4QW5jVEtUNElEcFhGQ1dBNXdvRmdSQVFCV1pKTHFBNXJXclJmSUxENEY1eks0dTZXSDB6R0htb1lGZkpHcXd4dHAtSEdlcSttOFlaSVdDY0pFQUFLSUFMYmtKSTVhaVRaZUhGS1VISjhIQktRb0JBUEVuQWc5N1NtK0x5NFYreFQ2S3VNd2JseXVqYnZ5ZTRjczRxaU9NNGJneHY4K2c2RDRjRU1QUW9qMExBeEFLTEFrZ29KSVlBNENnTVNUZlFBQVV0Z3FRQWxNY29UOVlOc0RXVldGV0lKbDVUWld4dDRiVU5JMWpSTlUwelhOaTBxWHdxMm9pZFczNk5oYVc3U1VpYUhkZW5DaUJBY0R5TnNaWGljdUFDMGt5SnNELWEtSEJ0UmdJRE9yTGxtaWFhWE1taHpOSnZiZG40M1c1a2RMcG9pK21GUUhEdG40ZG1EbC1JeFV5c29NcWlnYVlYWjhsbTNhc3Vzc0c0LW03b1pCQXhQcFJDZG9ScjVnN3VCZXNhSm9DVUw2TzFVemVCbVRLc1ZVZVBGWThQTnZZWXpHMFg4TkowUXM2NmdSYTBLUWFZMUorTUZuSFJZY0tzU1ZtS09hWDVaRm1QTVl6MmRNQUwwYW9Mbjh1NVdnNWFJZVVXMXE1VWhzalBsMmdpN2ladkNZdnVVZVh4dUxNdmp1ZkxONTQ0OWxzSXg0aW11RDhrc3VOTG1tQXVzZlgwQU5RMDRFWjBXbWVabGxweldDQTZQdWl3NERuc1plUG5jdEZ5WHNBNFBGV0NwTEZ4ZURUWCtIMXh5SmdMRzFMalNmWWJpbUd6Z1JBQSAqL1xuICAgIGlkOiBcInNheVBpXCIsXG4gICAgaW5pdGlhbDogXCJpZGxlXCIsXG4gICAgc3RhdGVzOiB7XG4gICAgICBpZGxlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkluaXRpYWwgc3RhdGUuXFxuR2VudGxlIHB1bHNpbmcgYW5pbWF0aW9uLlwiLFxuICAgICAgICBlbnRyeTogW1wic3RvcEFsbEFuaW1hdGlvbnNcIiwgXCJhY3F1aXJlTWljcm9waG9uZVwiXSxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBcInNheXBpOnVzZXJTcGVha2luZ1wiOiB7XG4gICAgICAgICAgICB0YXJnZXQ6IFwidXNlclNwZWFraW5nXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNheXBpOnNhZmFyaUJsb2NrZWRcIjoge1xuICAgICAgICAgICAgdGFyZ2V0OiBcImJsb2NrZWRcIixcbiAgICAgICAgICAgIGNvbmQ6IFwiaXNTYWZhcmlcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2F5cGk6cGlTcGVha2luZ1wiOiB7XG4gICAgICAgICAgICB0YXJnZXQ6IFwicGlTcGVha2luZ1wiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICB1c2VyU3BlYWtpbmc6IHtcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJVc2VyIGlzIHNwZWFraW5nIGFuZCBiZWluZyByZWNvcmRlZCBieSB0aGUgbWljcm9waG9uZS5cXG5XYXZlZm9ybSBhbmltYXRpb24uXCIsXG5cbiAgICAgICAgZW50cnk6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInN0YXJ0QW5pbWF0aW9uXCIsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgYW5pbWF0aW9uOiBcInVzZXJTcGVha2luZ1wiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiYWN0aXZhdGVUYWxrQnV0dG9uXCIsXG4gICAgICAgIF0sXG5cbiAgICAgICAgZXhpdDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RvcEFuaW1hdGlvblwiLFxuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgIGFuaW1hdGlvbjogXCJ1c2VyU3BlYWtpbmdcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImRlYWN0aXZhdGVUYWxrQnV0dG9uXCIsXG4gICAgICAgIF0sXG5cbiAgICAgICAgb246IHtcbiAgICAgICAgICBcInNheXBpOnVzZXJGaW5pc2hlZFNwZWFraW5nXCI6IHtcbiAgICAgICAgICAgIHRhcmdldDogXCJ0cmFuc2NyaWJpbmdcIixcbiAgICAgICAgICAgIGNvbmQ6IFwibG9uZ0Vub3VnaEZvclVwbG9hZFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzYXlwaTp1c2VyU3RvcHBlZFNwZWFraW5nXCI6IHtcbiAgICAgICAgICAgIHRhcmdldDogXCJpZGxlXCIsXG4gICAgICAgICAgICBjb25kOiBcInRvb1Nob3J0Rm9yVXBsb2FkXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNheXBpOnRyYW5zY3JpYmluZ1wiOiB7XG4gICAgICAgICAgICB0YXJnZXQ6IFwidHJhbnNjcmliaW5nXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGJsb2NrZWQ6IHtcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJCbG9ja2luZyBhY3Rpb24gb24gU2FmYXJpLlxcblVzZXIgbXVzdCBwcmVzcyBwbGF5IHRvIGhlYXIgUGkncyByZXNwb25zZS5cXG5Cb3VuY2UgYW5pbWF0aW9uLlwiLFxuICAgICAgICBlbnRyeTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RhcnRBbmltYXRpb25cIixcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICBhbmltYXRpb246IFwicGF1c2VkXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzaG93UGxheUJ1dHRvblwiLFxuICAgICAgICBdLFxuICAgICAgICBleGl0OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJzdG9wQW5pbWF0aW9uXCIsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgYW5pbWF0aW9uOiBcInBhdXNlZFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiaGlkZVBsYXlCdXR0b25cIixcbiAgICAgICAgXSxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBcInNheXBpOnJlYWR5XCI6IHtcbiAgICAgICAgICAgIHRhcmdldDogXCJibG9ja2VkXCIsXG4gICAgICAgICAgICBpbnRlcm5hbDogdHJ1ZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgRW5vdWdoIGF1ZGlvIGhhcyBiZWVuIGJ1ZmZlcmVkIHRvIHN0YXJ0IHBsYXliYWNrLmAsXG4gICAgICAgICAgICBhY3Rpb25zOiBcInNob3dQbGF5QnV0dG9uXCIsXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIFwic2F5cGk6dW5ibG9ja1wiOiB7XG4gICAgICAgICAgICB0YXJnZXQ6IFwibG9hZGluZ1wiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBwaVNwZWFraW5nOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIFwiUGkncyBzeW50aGVzaXNlZCBzcGVlY2ggYXVkaW8gaXMgcGxheWluZy5cXG5QbGF5ZnVsIGFuaW1hdGlvbi5cIixcbiAgICAgICAgZW50cnk6IHtcbiAgICAgICAgICB0eXBlOiBcInN0YXJ0QW5pbWF0aW9uXCIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBhbmltYXRpb246IFwicGlTcGVha2luZ1wiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGV4aXQ6IHtcbiAgICAgICAgICB0eXBlOiBcInN0b3BBbmltYXRpb25cIixcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogXCJwaVNwZWFraW5nXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBcInNheXBpOnBpU3RvcHBlZFNwZWFraW5nXCI6IHtcbiAgICAgICAgICAgIHRhcmdldDogXCJpZGxlXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNheXBpOnVzZXJTcGVha2luZ1wiOiB7XG4gICAgICAgICAgICB0YXJnZXQ6IFwidXNlclNwZWFraW5nXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNheXBpOnBpRmluaXNoZWRTcGVha2luZ1wiOiB7XG4gICAgICAgICAgICB0YXJnZXQ6IFwiaWRsZVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICB0cmFuc2NyaWJpbmc6IHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiVHJhbnNjcmliaW5nIGF1ZGlvIHRvIHRleHQuXFxuQ2FyZCBmbGlwIGFuaW1hdGlvbi5cIixcbiAgICAgICAgZW50cnk6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInN0YXJ0QW5pbWF0aW9uXCIsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgYW5pbWF0aW9uOiBcInRyYW5zY3JpYmluZ1wiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidHJhbnNjcmliZUF1ZGlvXCIsXG4gICAgICAgICAgICBwYXJhbXM6IHt9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGV4aXQ6IHtcbiAgICAgICAgICB0eXBlOiBcInN0b3BBbmltYXRpb25cIixcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogXCJ0cmFuc2NyaWJpbmdcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBvbjoge1xuICAgICAgICAgIFwic2F5cGk6dHJhbnNjcmliZWRcIjoge1xuICAgICAgICAgICAgdGFyZ2V0OiBcImlkbGVcIixcbiAgICAgICAgICAgIGFjdGlvbnM6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJoYW5kbGVUcmFuc2NyaXB0aW9uUmVzcG9uc2VcIixcbiAgICAgICAgICAgICAgcGFyYW1zOiB7fSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJTdWNjZXNzZnVsbHkgdHJhbnNjcmliZWQgdXNlciBhdWRpbyB0byB0ZXh0LlwiLFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBcInNheXBpOnRyYW5zY3JpYmVGYWlsZWRcIjoge1xuICAgICAgICAgICAgdGFyZ2V0OiBcIiNzYXlQaS5lcnJvcnMudHJhbnNjcmliZUZhaWxlZFwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiUmVjZWl2ZWQgYW4gZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgL3RyYW5zY3JpYmUgQVBJXCIsXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIFwic2F5cGk6dHJhbnNjcmliZWRFbXB0eVwiOiB7XG4gICAgICAgICAgICB0YXJnZXQ6IFwiI3NheVBpLmVycm9ycy5taWNFcnJvclwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgIFwiUmVjZWl2ZWQgYW4gZW1wdHkgcmVzcG9uc2UgZnJvbSB0aGUgL3RyYW5zY3JpYmUgQVBJIChubyBzcGVlY2ggZGV0ZWN0ZWQpXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGxvYWRpbmc6IHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUGkncyBhdWRpbyBpcyBsb2FkaW5nLlwiLFxuICAgICAgICBlbnRyeToge1xuICAgICAgICAgIHR5cGU6IFwic3RhcnRBbmltYXRpb25cIixcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogXCJsb2FkaW5nXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZXhpdDoge1xuICAgICAgICAgIHR5cGU6IFwic3RvcEFuaW1hdGlvblwiLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBcImxvYWRpbmdcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBvbjoge1xuICAgICAgICAgIFwic2F5cGk6cGlTcGVha2luZ1wiOiB7XG4gICAgICAgICAgICB0YXJnZXQ6IFwicGlTcGVha2luZ1wiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBlcnJvcnM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiRXJyb3IgcGFyZW50IHN0YXRlLlwiLFxuXG4gICAgICAgIGFmdGVyOiB7XG4gICAgICAgICAgMTAwMDA6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGFyZ2V0OiBcIiNzYXlQaS5pZGxlXCIsXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtdLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJSZXNldCB0byB0aGUgaWRsZSBzdGF0ZSBhbmQgY2xlYXIgZXJyb3JzLlwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaW50ZXJuYWw6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuXG4gICAgICAgIGluaXRpYWw6IFwidHJhbnNjcmliZUZhaWxlZFwiLFxuXG4gICAgICAgIHN0YXRlczoge1xuICAgICAgICAgIHRyYW5zY3JpYmVGYWlsZWQ6IHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSAvdHJhbnNjcmliZSBBUEkgcmVzcG9uZGVkIHdpdGggYW4gZXJyb3IuXCIsXG4gICAgICAgICAgICB0eXBlOiBcImZpbmFsXCIsXG4gICAgICAgICAgICBlbnRyeToge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0YXJ0QW5pbWF0aW9uXCIsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogXCJlcnJvclwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZXhpdDoge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0b3BBbmltYXRpb25cIixcbiAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBtaWNFcnJvcjoge1xuICAgICAgICAgICAgdHlwZTogXCJmaW5hbFwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBObyBhdWRpbyBpbnB1dCBkZXRlY3RlZGAsXG4gICAgICAgICAgICBlbnRyeToge1xuICAgICAgICAgICAgICB0eXBlOiBcInNob3dOb3RpZmljYXRpb25cIixcbiAgICAgICAgICAgICAgcGFyYW1zOiB7IGljb246IFwibXV0ZWQtbWljcm9waG9uZVwiIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXhpdDoge1xuICAgICAgICAgICAgICB0eXBlOiBcImRpc21pc3NOb3RpZmljYXRpb25cIixcbiAgICAgICAgICAgICAgcGFyYW1zOiB7fSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBwcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50czogdHJ1ZSxcbiAgICBwcmVzZXJ2ZUFjdGlvbk9yZGVyOiB0cnVlLFxuICB9LFxuICB7XG4gICAgYWN0aW9uczoge1xuICAgICAgc3RvcEFsbEFuaW1hdGlvbnM6IChjb250ZXh0LCBldmVudCkgPT4ge1xuICAgICAgICBBbmltYXRpb25Nb2R1bGUuc3RvcEFsbEFuaW1hdGlvbnMoKTtcbiAgICAgIH0sXG5cbiAgICAgIHN0YXJ0QW5pbWF0aW9uOiAoY29udGV4dCwgZXZlbnQsIHsgYWN0aW9uIH0pID0+IHtcbiAgICAgICAgQW5pbWF0aW9uTW9kdWxlLnN0YXJ0QW5pbWF0aW9uKGFjdGlvbi5wYXJhbXMuYW5pbWF0aW9uKTtcbiAgICAgIH0sXG5cbiAgICAgIHN0b3BBbmltYXRpb246IChjb250ZXh0LCBldmVudCwgeyBhY3Rpb24gfSkgPT4ge1xuICAgICAgICBBbmltYXRpb25Nb2R1bGUuc3RvcEFuaW1hdGlvbihhY3Rpb24ucGFyYW1zLmFuaW1hdGlvbik7XG4gICAgICB9LFxuXG4gICAgICB0cmFuc2NyaWJlQXVkaW86IChjb250ZXh0LCBldmVudCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcInRyYW5zY3JpYmVBdWRpb1wiLCBldmVudCk7XG4gICAgICAgIGNvbnN0IGF1ZGlvQmxvYiA9IGV2ZW50LmJsb2I7XG4gICAgICAgIHVwbG9hZEF1ZGlvKGF1ZGlvQmxvYiwgZXZlbnQuZHVyYXRpb24pO1xuICAgICAgfSxcblxuICAgICAgaGFuZGxlVHJhbnNjcmlwdGlvblJlc3BvbnNlOiAoY29udGV4dCwgZXZlbnQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJoYW5kbGVUcmFuc2NyaXB0aW9uUmVzcG9uc2VcIiwgZXZlbnQpO1xuICAgICAgICBjb25zdCB0cmFuc2NyaXB0aW9uID0gZXZlbnQudGV4dDtcbiAgICAgICAgaGFuZGxlVHJhbnNjcmlwdGlvblJlc3BvbnNlKHRyYW5zY3JpcHRpb24pO1xuICAgICAgfSxcblxuICAgICAgc2hvd1BsYXlCdXR0b246IChjb250ZXh0LCBldmVudCkgPT4ge1xuICAgICAgICBidXR0b25Nb2R1bGUuc2hvd1BsYXlCdXR0b24oKTtcbiAgICAgIH0sXG5cbiAgICAgIGhpZGVQbGF5QnV0dG9uOiAoY29udGV4dCwgZXZlbnQpID0+IHtcbiAgICAgICAgYnV0dG9uTW9kdWxlLmhpZGVQbGF5QnV0dG9uKCk7XG4gICAgICB9LFxuXG4gICAgICBhY3RpdmF0ZVRhbGtCdXR0b246IChjb250ZXh0LCBldmVudCkgPT4ge1xuICAgICAgICBjb25zdCB0YWxrQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzYXlwaS10YWxrQnV0dG9uXCIpO1xuICAgICAgICB0YWxrQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7IC8vIEFkZCB0aGUgYWN0aXZlIGNsYXNzIChmb3IgRmlyZWZveCBvbiBBbmRyb2lkKVxuICAgICAgfSxcblxuICAgICAgZGVhY3RpdmF0ZVRhbGtCdXR0b246IChjb250ZXh0LCBldmVudCkgPT4ge1xuICAgICAgICBjb25zdCB0YWxrQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzYXlwaS10YWxrQnV0dG9uXCIpO1xuICAgICAgICB0YWxrQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7IC8vIFJlbW92ZSB0aGUgYWN0aXZlIGNsYXNzIChmb3IgRmlyZWZveCBvbiBBbmRyb2lkKVxuICAgICAgfSxcblxuICAgICAgYWNxdWlyZU1pY3JvcGhvbmU6IChjb250ZXh0LCBldmVudCkgPT4ge1xuICAgICAgICAvLyB3YXJtdXAgdGhlIG1pY3JvcGhvbmUgb24gaWRsZSBpbiBtb2JpbGUgdmlldyxcbiAgICAgICAgLy8gc2luY2UgdGhlcmUncyBubyBtb3VzZW92ZXIgZXZlbnQgdG8gdHJpZ2dlciBpdFxuICAgICAgICBpZiAoaXNNb2JpbGVWaWV3KCkpIHtcbiAgICAgICAgICBFdmVudEJ1cy5lbWl0KFwiYXVkaW86c2V0dXBSZWNvcmRpbmdcIik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIHNob3dOb3RpZmljYXRpb246IChjb250ZXh0LCBldmVudCwgeyBhY3Rpb24gfSkgPT4ge1xuICAgICAgICBjb25zdCBpY29uID0gYWN0aW9uLnBhcmFtcy5pY29uO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYWN0aW9uLnBhcmFtcy5tZXNzYWdlO1xuICAgICAgICBidXR0b25Nb2R1bGUuc2hvd05vdGlmaWNhdGlvbih7IGljb24sIG1lc3NhZ2UgfSk7XG4gICAgICB9LFxuXG4gICAgICBkaXNtaXNzTm90aWZpY2F0aW9uOiAoY29udGV4dCwgZXZlbnQpID0+IHtcbiAgICAgICAgYnV0dG9uTW9kdWxlLmRpc21pc3NOb3RpZmljYXRpb24oKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzZXJ2aWNlczoge30sXG4gICAgZ3VhcmRzOiB7XG4gICAgICB0b29TaG9ydEZvclVwbG9hZDogKGNvbnRleHQsIGV2ZW50KSA9PiB7XG4gICAgICAgIHJldHVybiBldmVudC5kdXJhdGlvbiA8IDEwMDA7XG4gICAgICB9LFxuXG4gICAgICBsb25nRW5vdWdoRm9yVXBsb2FkOiAoY29udGV4dCwgZXZlbnQpID0+IHtcbiAgICAgICAgcmV0dXJuIGV2ZW50LmR1cmF0aW9uID49IDEwMDA7XG4gICAgICB9LFxuXG4gICAgICBpc1NhZmFyaTogKGNvbnRleHQsIGV2ZW50KSA9PiB7XG4gICAgICAgIHJldHVybiBpc1NhZmFyaSgpO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGRlbGF5czoge30sXG4gIH1cbik7XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgQGtleWZyYW1lcyBwdWxzZV9vdXRlcm1vc3Qge1xuICAwJSxcbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgfVxuICA1MCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC45Mik7XG4gIH1cbn1cbi5vdXRlcm1vc3Qge1xuICBhbmltYXRpb246IHB1bHNlX291dGVybW9zdCA1cyBpbmZpbml0ZTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xufVxuXG5Aa2V5ZnJhbWVzIHB1bHNlX3NlY29uZCB7XG4gIDAlLFxuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICB9XG4gIDUwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjg1Nik7XG4gIH1cbn1cbi5zZWNvbmQge1xuICBhbmltYXRpb246IHB1bHNlX3NlY29uZCA1cyBpbmZpbml0ZTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xufVxuXG5Aa2V5ZnJhbWVzIHB1bHNlX3RoaXJkIHtcbiAgMCUsXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gIH1cbiAgNTAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNzkyKTtcbiAgfVxufVxuLnRoaXJkIHtcbiAgYW5pbWF0aW9uOiBwdWxzZV90aGlyZCA1cyBpbmZpbml0ZTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xufVxuXG5Aa2V5ZnJhbWVzIHB1bHNlX2ZvdXJ0aCB7XG4gIDAlLFxuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICB9XG4gIDUwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjcyOCk7XG4gIH1cbn1cbi5mb3VydGgge1xuICBhbmltYXRpb246IHB1bHNlX2ZvdXJ0aCA1cyBpbmZpbml0ZTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xufVxuXG5Aa2V5ZnJhbWVzIHB1bHNlX2ZpZnRoIHtcbiAgMCUsXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gIH1cbiAgNTAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNjY0KTtcbiAgfVxufVxuLmZpZnRoIHtcbiAgYW5pbWF0aW9uOiBwdWxzZV9maWZ0aCA1cyBpbmZpbml0ZTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xufVxuXG5Aa2V5ZnJhbWVzIHB1bHNlX2lubmVybW9zdCB7XG4gIDAlLFxuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICB9XG4gIDUwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjYpO1xuICB9XG59XG4uaW5uZXJtb3N0IHtcbiAgYW5pbWF0aW9uOiBwdWxzZV9pbm5lcm1vc3QgNXMgaW5maW5pdGU7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjtcbn1cblxuLyogYm91bmNlIGFuaW1hdGlvbiB0byBpbmRpY2F0ZSBQaSBpcyBwYXVzZWQgYXdhaXRpbmcgcGVybWlzc2lvbiB0byBzcGVhayAqL1xuQGtleWZyYW1lcyBib3VuY2Vfb3V0ZXJtb3N0IHtcbiAgMCUsXG4gIDIwJSxcbiAgNTAlLFxuICA4MCUsXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgfVxuICA0MCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNSUpO1xuICB9XG4gIDYwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zJSk7XG4gIH1cbn1cbi5vdXRlcm1vc3QucGF1c2VkIHtcbiAgYW5pbWF0aW9uLW5hbWU6IGJvdW5jZV9vdXRlcm1vc3Q7XG4gIGFuaW1hdGlvbi1kdXJhdGlvbjogMnM7XG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xufVxuXG5Aa2V5ZnJhbWVzIGJvdW5jZV9zZWNvbmQge1xuICAwJSxcbiAgMjAlLFxuICA1MCUsXG4gIDgwJSxcbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICB9XG4gIDQwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01LjglKTtcbiAgfVxuICA2MCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMy40OCUpO1xuICB9XG59XG4uc2Vjb25kLnBhdXNlZCB7XG4gIGFuaW1hdGlvbi1uYW1lOiBib3VuY2Vfc2Vjb25kO1xuICBhbmltYXRpb24tZHVyYXRpb246IDJzO1xuICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTtcbn1cblxuQGtleWZyYW1lcyBib3VuY2VfdGhpcmQge1xuICAwJSxcbiAgMjAlLFxuICA1MCUsXG4gIDgwJSxcbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICB9XG4gIDQwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC02LjYlKTtcbiAgfVxuICA2MCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMy45NiUpO1xuICB9XG59XG4udGhpcmQucGF1c2VkIHtcbiAgYW5pbWF0aW9uLW5hbWU6IGJvdW5jZV90aGlyZDtcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAycztcbiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG59XG5cbkBrZXlmcmFtZXMgYm91bmNlX2ZvdXJ0aCB7XG4gIDAlLFxuICAyMCUsXG4gIDUwJSxcbiAgODAlLFxuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XG4gIH1cbiAgNDAlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcuNCUpO1xuICB9XG4gIDYwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00LjQ0JSk7XG4gIH1cbn1cbi5mb3VydGgucGF1c2VkIHtcbiAgYW5pbWF0aW9uLW5hbWU6IGJvdW5jZV9mb3VydGg7XG4gIGFuaW1hdGlvbi1kdXJhdGlvbjogMnM7XG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xufVxuXG5Aa2V5ZnJhbWVzIGJvdW5jZV9maWZ0aCB7XG4gIDAlLFxuICAyMCUsXG4gIDUwJSxcbiAgODAlLFxuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XG4gIH1cbiAgNDAlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTguMiUpO1xuICB9XG4gIDYwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00LjkyJSk7XG4gIH1cbn1cbi5maWZ0aC5wYXVzZWQge1xuICBhbmltYXRpb24tbmFtZTogYm91bmNlX2ZpZnRoO1xuICBhbmltYXRpb24tZHVyYXRpb246IDJzO1xuICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTtcbn1cblxuQGtleWZyYW1lcyBib3VuY2VfaW5uZXJtb3N0IHtcbiAgMCUsXG4gIDIwJSxcbiAgNTAlLFxuICA4MCUsXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgfVxuICA0MCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtOSUpO1xuICB9XG4gIDYwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01LjQlKTtcbiAgfVxufVxuLmlubmVybW9zdC5wYXVzZWQge1xuICBhbmltYXRpb24tbmFtZTogYm91bmNlX2lubmVybW9zdDtcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAycztcbiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG59XG5cbi8qIHBsYXlmdWwgYW5pbWF0aW9uIHRvIGluZGljYXRlIFBpIGlzIHNwZWFraW5nICovXG5Aa2V5ZnJhbWVzIHNwZWFraW5nX291dGVybW9zdCB7XG4gIDAlLFxuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpIHJvdGF0ZSgwZGVnKTtcbiAgfVxuICAyNSUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OTUpO1xuICB9XG4gIDUwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkpO1xuICB9XG4gIDc1JSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjg5NSk7XG4gIH1cbn1cbi5vdXRlcm1vc3QucGlTcGVha2luZyB7XG4gIGFuaW1hdGlvbjogc3BlYWtpbmdfb3V0ZXJtb3N0IDJzIGluZmluaXRlO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XG59XG5cbkBrZXlmcmFtZXMgc3BlYWtpbmdfc2Vjb25kIHtcbiAgMCUsXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgcm90YXRlKDBkZWcpO1xuICB9XG4gIDI1JSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk4KSByb3RhdGUoLTFkZWcpO1xuICB9XG4gIDUwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjg3KSByb3RhdGUoMGRlZyk7XG4gIH1cbiAgNzUlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuODY1KSByb3RhdGUoMWRlZyk7XG4gIH1cbn1cbi5zZWNvbmQucGlTcGVha2luZyB7XG4gIGFuaW1hdGlvbjogc3BlYWtpbmdfc2Vjb25kIDJzIGluZmluaXRlO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XG59XG5cbkBrZXlmcmFtZXMgc3BlYWtpbmdfdGhpcmQge1xuICAwJSxcbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKSByb3RhdGUoMGRlZyk7XG4gIH1cbiAgMjUlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTY1KSByb3RhdGUoLTJkZWcpO1xuICB9XG4gIDUwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjg0KSByb3RhdGUoMGRlZyk7XG4gIH1cbiAgNzUlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuODM1KSByb3RhdGUoMmRlZyk7XG4gIH1cbn1cbi50aGlyZC5waVNwZWFraW5nIHtcbiAgYW5pbWF0aW9uOiBzcGVha2luZ190aGlyZCAycyBpbmZpbml0ZTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xufVxuXG5Aa2V5ZnJhbWVzIHNwZWFraW5nX2ZvdXJ0aCB7XG4gIDAlLFxuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpIHJvdGF0ZSgwZGVnKTtcbiAgfVxuICAyNSUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSkgcm90YXRlKC0zZGVnKTtcbiAgfVxuICA1MCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC44MSkgcm90YXRlKDBkZWcpO1xuICB9XG4gIDc1JSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjgwNSkgcm90YXRlKDNkZWcpO1xuICB9XG59XG4uZm91cnRoLnBpU3BlYWtpbmcge1xuICBhbmltYXRpb246IHNwZWFraW5nX2ZvdXJ0aCAycyBpbmZpbml0ZTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xufVxuXG5Aa2V5ZnJhbWVzIHNwZWFraW5nX2ZpZnRoIHtcbiAgMCUsXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgcm90YXRlKDBkZWcpO1xuICB9XG4gIDI1JSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkzNSkgcm90YXRlKC00ZGVnKTtcbiAgfVxuICA1MCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC43OCkgcm90YXRlKDBkZWcpO1xuICB9XG4gIDc1JSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjc3NSkgcm90YXRlKDRkZWcpO1xuICB9XG59XG4uZmlmdGgucGlTcGVha2luZyB7XG4gIGFuaW1hdGlvbjogc3BlYWtpbmdfZmlmdGggMnMgaW5maW5pdGU7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjtcbn1cblxuQGtleWZyYW1lcyBzcGVha2luZ19pbm5lcm1vc3Qge1xuICAwJSxcbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKSByb3RhdGUoMGRlZyk7XG4gIH1cbiAgMjUlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTIpIHJvdGF0ZSgtNWRlZyk7XG4gIH1cbiAgNTAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNzUpIHJvdGF0ZSgwZGVnKTtcbiAgfVxuICA3NSUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC43NDUpIHJvdGF0ZSg1ZGVnKTtcbiAgfVxufVxuLmlubmVybW9zdC5waVNwZWFraW5nIHtcbiAgYW5pbWF0aW9uOiBzcGVha2luZ19pbm5lcm1vc3QgMnMgaW5maW5pdGU7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjtcbn1cblxuLyogd2F2ZSBhbmltYXRpb24gdG8gaW5kaWNhdGUgdXNlciBpcyBzcGVha2luZyAqL1xuQGtleWZyYW1lcyB1c2VyU3BlYWtpbmdBbmltYXRpb24ge1xuICA1MCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGVZKDAuMDUpIHNjYWxlWCh2YXIoLS13aWR0aC1mYWN0b3IpKVxuICAgICAgdHJhbnNsYXRlWChjYWxjKC01MCUgKyB2YXIoLS1zcHJlYWQtYW1vdW50KSkpO1xuICB9XG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGVZKDEpIHNjYWxlWCh2YXIoLS13aWR0aC1mYWN0b3IpKVxuICAgICAgdHJhbnNsYXRlWChjYWxjKC01MCUgKyB2YXIoLS1zcHJlYWQtYW1vdW50KSkpO1xuICB9XG59XG4vKiB1c2VyIHNwZWFraW5nIG9zY2lsbGF0aW9uIGFuaW1hdGlvbiAqL1xuQGtleWZyYW1lcyB3YXZlZm9ybV9vdXRlcm1vc3Qge1xuICAwJSxcbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZVkoMSkgc2NhbGVYKDEpO1xuICB9XG4gIDI1JSxcbiAgNzUlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlWSgwLjkpIHNjYWxlWCgwLjkpO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgd2F2ZWZvcm1fc2Vjb25kIHtcbiAgMCUsXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGVZKDAuOSkgc2NhbGVYKDAuOSk7XG4gIH1cbiAgMjUlLFxuICA3NSUge1xuICAgIHRyYW5zZm9ybTogc2NhbGVZKDAuOCkgc2NhbGVYKDAuOCk7XG4gIH1cbn1cblxuQGtleWZyYW1lcyB3YXZlZm9ybV90aGlyZCB7XG4gIDAlLFxuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlWSgwLjgpIHNjYWxlWCgwLjgpO1xuICB9XG4gIDI1JSxcbiAgNzUlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlWSgwLjcpIHNjYWxlWCgwLjcpO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgd2F2ZWZvcm1fZm91cnRoIHtcbiAgMCUsXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGVZKDAuNykgc2NhbGVYKDAuNyk7XG4gIH1cbiAgMjUlLFxuICA3NSUge1xuICAgIHRyYW5zZm9ybTogc2NhbGVZKDAuNikgc2NhbGVYKDAuNik7XG4gIH1cbn1cblxuQGtleWZyYW1lcyB3YXZlZm9ybV9maWZ0aCB7XG4gIDAlLFxuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlWSgwLjYpIHNjYWxlWCgwLjYpO1xuICB9XG4gIDI1JSxcbiAgNzUlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlWSgwLjUpIHNjYWxlWCgwLjUpO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgd2F2ZWZvcm1faW5uZXJtb3N0IHtcbiAgMCUsXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGVZKDAuNSkgc2NhbGVYKDAuNSk7XG4gIH1cbiAgMjUlLFxuICA3NSUge1xuICAgIHRyYW5zZm9ybTogc2NhbGVZKDAuNCkgc2NhbGVYKDAuNCk7XG4gIH1cbn1cblxuLm91dGVybW9zdC51c2VyU3BlYWtpbmcge1xuICBhbmltYXRpb246IHdhdmVmb3JtX291dGVybW9zdCAwLjdzIGluZmluaXRlIGFsdGVybmF0ZTtcbn1cblxuLnNlY29uZC51c2VyU3BlYWtpbmcge1xuICBhbmltYXRpb246IHdhdmVmb3JtX3NlY29uZCAwLjY1cyBpbmZpbml0ZSBhbHRlcm5hdGU7XG59XG5cbi50aGlyZC51c2VyU3BlYWtpbmcge1xuICBhbmltYXRpb246IHdhdmVmb3JtX3RoaXJkIDAuNnMgaW5maW5pdGUgYWx0ZXJuYXRlO1xufVxuXG4uZm91cnRoLnVzZXJTcGVha2luZyB7XG4gIGFuaW1hdGlvbjogd2F2ZWZvcm1fZm91cnRoIDAuNTVzIGluZmluaXRlIGFsdGVybmF0ZTtcbn1cblxuLmZpZnRoLnVzZXJTcGVha2luZyB7XG4gIGFuaW1hdGlvbjogd2F2ZWZvcm1fZmlmdGggMC41cyBpbmZpbml0ZSBhbHRlcm5hdGU7XG59XG5cbi5pbm5lcm1vc3QudXNlclNwZWFraW5nIHtcbiAgYW5pbWF0aW9uOiB3YXZlZm9ybV9pbm5lcm1vc3QgMC40NXMgaW5maW5pdGUgYWx0ZXJuYXRlO1xufVxuXG4vKiBmbGlwY2FyZCBhbmltYXRpb24gdG8gaW5kaWNhdGUgU2F5LCBQaSBpcyB0cmFuc2NyaWJpbmcgYXVkaW8gdG8gdGV4dCAqL1xuQGtleWZyYW1lcyB0cmFuc2NyaWJpbmdGbGlwIHtcbiAgMCUsXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlWSgwZGVnKTtcbiAgICBmaWxsOiB2YXIoLS1vcmlnaW5hbC1jb2xvcik7XG4gIH1cbiAgNTAlIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZVkoMTgwZGVnKTtcbiAgICBmaWxsOiB2YXIoLS10cmFuc2NyaWJpbmctY29sb3IpO1xuICB9XG59XG5cbi5vdXRlcm1vc3QudHJhbnNjcmliaW5nIHtcbiAgLS1vcmlnaW5hbC1jb2xvcjogI2U0ZjJkMTtcbiAgLS10cmFuc2NyaWJpbmctY29sb3I6ICNiM2UwZmU7XG4gIGFuaW1hdGlvbjogdHJhbnNjcmliaW5nRmxpcCAxLjVzIGluZmluaXRlO1xufVxuXG4uc2Vjb25kLnRyYW5zY3JpYmluZyB7XG4gIC0tb3JpZ2luYWwtY29sb3I6ICNjY2U4YjU7XG4gIC0tdHJhbnNjcmliaW5nLWNvbG9yOiAjODljMmZmO1xuICBhbmltYXRpb246IHRyYW5zY3JpYmluZ0ZsaXAgMS42cyBpbmZpbml0ZTtcbn1cblxuLnRoaXJkLnRyYW5zY3JpYmluZyB7XG4gIC0tb3JpZ2luYWwtY29sb3I6ICNiM2RiOTU7XG4gIC0tdHJhbnNjcmliaW5nLWNvbG9yOiAjNWZhNGZmO1xuICBhbmltYXRpb246IHRyYW5zY3JpYmluZ0ZsaXAgMS43cyBpbmZpbml0ZTtcbn1cblxuLmZvdXJ0aC50cmFuc2NyaWJpbmcge1xuICAtLW9yaWdpbmFsLWNvbG9yOiAjOWJkMDc4O1xuICAtLXRyYW5zY3JpYmluZy1jb2xvcjogIzM1ODZmZjtcbiAgYW5pbWF0aW9uOiB0cmFuc2NyaWJpbmdGbGlwIDEuOHMgaW5maW5pdGU7XG59XG5cbi5maWZ0aC50cmFuc2NyaWJpbmcge1xuICAtLW9yaWdpbmFsLWNvbG9yOiAjODNjNTVjO1xuICAtLXRyYW5zY3JpYmluZy1jb2xvcjogIzBiNjllMztcbiAgYW5pbWF0aW9uOiB0cmFuc2NyaWJpbmdGbGlwIDEuOXMgaW5maW5pdGU7XG59XG5cbi5pbm5lcm1vc3QudHJhbnNjcmliaW5nIHtcbiAgLS1vcmlnaW5hbC1jb2xvcjogIzQyOGEyZjtcbiAgLS10cmFuc2NyaWJpbmctY29sb3I6ICMwMDUzYmY7XG4gIGFuaW1hdGlvbjogdHJhbnNjcmliaW5nRmxpcCAycyBpbmZpbml0ZTtcbn1cblxuLyogaGVhcnRiZWF0IGFuaW1hdGlvbiB0byBpbmRpY2F0ZSBQaSBpcyBwcmVwYXJpbmcgdG8gc3BlYWsgKi9cbkBrZXlmcmFtZXMgaGVhcnRiZWF0IHtcbiAgMCUsXG4gIDEwMCUge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgZmlsbDogdmFyKC0tb3JpZ2luYWwtY29sb3IpO1xuICB9XG4gIDUwJSB7XG4gICAgb3BhY2l0eTogMC41O1xuICAgIGZpbGw6IHJnYigyNDUgMjM4IDIyMyk7IC8qIGJnLWNyZWFtLTU1MCAqL1xuICB9XG59XG5cbi5vdXRlcm1vc3QubG9hZGluZyB7XG4gIC0tb3JpZ2luYWwtY29sb3I6ICNlNGYyZDE7XG4gIGFuaW1hdGlvbjogaGVhcnRiZWF0IDJzIGluZmluaXRlO1xuICBhbmltYXRpb24tZGVsYXk6IDBzO1xufVxuXG4uc2Vjb25kLmxvYWRpbmcge1xuICAtLW9yaWdpbmFsLWNvbG9yOiAjY2NlOGI1O1xuICBhbmltYXRpb246IGhlYXJ0YmVhdCAycyBpbmZpbml0ZTtcbiAgYW5pbWF0aW9uLWRlbGF5OiAwLjRzO1xufVxuXG4udGhpcmQubG9hZGluZyB7XG4gIC0tb3JpZ2luYWwtY29sb3I6ICNiM2RiOTU7XG4gIGFuaW1hdGlvbjogaGVhcnRiZWF0IDJzIGluZmluaXRlO1xuICBhbmltYXRpb24tZGVsYXk6IDAuOHM7XG59XG5cbi5mb3VydGgubG9hZGluZyB7XG4gIC0tb3JpZ2luYWwtY29sb3I6ICM5YmQwNzg7XG4gIGFuaW1hdGlvbjogaGVhcnRiZWF0IDJzIGluZmluaXRlO1xuICBhbmltYXRpb24tZGVsYXk6IDEuMnM7XG59XG5cbi5maWZ0aC5sb2FkaW5nIHtcbiAgLS1vcmlnaW5hbC1jb2xvcjogIzgzYzU1YztcbiAgYW5pbWF0aW9uOiBoZWFydGJlYXQgMnMgaW5maW5pdGU7XG4gIGFuaW1hdGlvbi1kZWxheTogMS42cztcbn1cblxuLmlubmVybW9zdC5sb2FkaW5nIHtcbiAgLS1vcmlnaW5hbC1jb2xvcjogIzQyOGEyZjtcbiAgYW5pbWF0aW9uOiBoZWFydGJlYXQgMnMgaW5maW5pdGU7XG4gIGFuaW1hdGlvbi1kZWxheTogMnM7XG59XG5cbi8qIHRvbmVkLWRvd24gZGlzc2FyeSBhbmltYXRpb24gdG8gaW5kaWNhdGUgYW4gZXJyb3IgKi9cbi8qIHRvbmVkLWRvd24gZXJyb3IgYW5pbWF0aW9uIHdpdGggcmVkdWNlZCBvcGFjaXR5ICovXG5Aa2V5ZnJhbWVzIGVycm9yQW5pbWF0aW9uIHtcbiAgMCUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpIHRyYW5zbGF0ZSgwJSwgMCUpO1xuICB9XG4gIDI1JSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpIHRyYW5zbGF0ZSgtNSUsIDUlKTtcbiAgfVxuICA1MCUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDVkZWcpIHRyYW5zbGF0ZSg1JSwgLTUlKTtcbiAgfVxuICA3NSUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKSB0cmFuc2xhdGUoLTUlLCA1JSk7XG4gIH1cbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZykgdHJhbnNsYXRlKDAlLCAwJSk7XG4gIH1cbn1cblxuLm91dGVybW9zdC5lcnJvciB7XG4gIGFuaW1hdGlvbjogZXJyb3JBbmltYXRpb24gMjVzIDE7XG4gIGZpbGw6ICNmZjAwMDA7XG4gIGZpbGwtb3BhY2l0eTogMC43O1xufVxuXG4uc2Vjb25kLmVycm9yIHtcbiAgYW5pbWF0aW9uOiBlcnJvckFuaW1hdGlvbiAyNXMgMTtcbiAgZmlsbDogI2ZmMzMwMDtcbiAgZmlsbC1vcGFjaXR5OiAwLjc7XG59XG5cbi50aGlyZC5lcnJvciB7XG4gIGFuaW1hdGlvbjogZXJyb3JBbmltYXRpb24gMjVzIDE7XG4gIGZpbGw6ICNmZjY2MDA7XG4gIGZpbGwtb3BhY2l0eTogMC43O1xufVxuXG4uZm91cnRoLmVycm9yIHtcbiAgYW5pbWF0aW9uOiBlcnJvckFuaW1hdGlvbiAyNXMgMTtcbiAgZmlsbDogI2ZmOTkwMDtcbiAgZmlsbC1vcGFjaXR5OiAwLjc7XG59XG5cbi5maWZ0aC5lcnJvciB7XG4gIGFuaW1hdGlvbjogZXJyb3JBbmltYXRpb24gMjVzIDE7XG4gIGZpbGw6ICNmZmNjMDA7XG4gIGZpbGwtb3BhY2l0eTogMC43O1xufVxuXG4uaW5uZXJtb3N0LmVycm9yIHtcbiAgYW5pbWF0aW9uOiBlcnJvckFuaW1hdGlvbiAyNXMgMTtcbiAgZmlsbDogI2ZmZmYwMDtcbiAgZmlsbC1vcGFjaXR5OiAwLjc7XG59XG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9zdHlsZXMvcmVjdGFuZ2xlcy5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7RUFDRTs7SUFFRSxtQkFBbUI7RUFDckI7RUFDQTtJQUNFLHNCQUFzQjtFQUN4QjtBQUNGO0FBQ0E7RUFDRSxzQ0FBc0M7RUFDdEMsd0JBQXdCO0FBQzFCOztBQUVBO0VBQ0U7O0lBRUUsbUJBQW1CO0VBQ3JCO0VBQ0E7SUFDRSx1QkFBdUI7RUFDekI7QUFDRjtBQUNBO0VBQ0UsbUNBQW1DO0VBQ25DLHdCQUF3QjtBQUMxQjs7QUFFQTtFQUNFOztJQUVFLG1CQUFtQjtFQUNyQjtFQUNBO0lBQ0UsdUJBQXVCO0VBQ3pCO0FBQ0Y7QUFDQTtFQUNFLGtDQUFrQztFQUNsQyx3QkFB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QUMvQixhQUFhO0VBQ2IsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsK0JBQStCO0VBQy9CLGFBQWE7RUFDYixpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSwrQkFBK0I7RUFDL0IsYUFBYTtFQUNiLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLCtCQUErQjtFQUMvQixhQUFhO0VBQ2IsaUJBQWlCO0FBQ25CXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIkBrZXlmcmFtZXMgcHVsc2Vfb3V0ZXJtb3N0IHtcXG4gIDAlLFxcbiAgMTAwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICB9XFxuICA1MCUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTIpO1xcbiAgfVxcbn1cXG4ub3V0ZXJtb3N0IHtcXG4gIGFuaW1hdGlvbjogcHVsc2Vfb3V0ZXJtb3N0IDVzIGluZmluaXRlO1xcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xcbn1cXG5cXG5Aa2V5ZnJhbWVzIHB1bHNlX3NlY29uZCB7XFxuICAwJSxcXG4gIDEwMCUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgfVxcbiAgNTAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjg1Nik7XFxuICB9XFxufVxcbi5zZWNvbmQge1xcbiAgYW5pbWF0aW9uOiBwdWxzZV9zZWNvbmQgNXMgaW5maW5pdGU7XFxuICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XFxufVxcblxcbkBrZXlmcmFtZXMgcHVsc2VfdGhpcmQge1xcbiAgMCUsXFxuICAxMDAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gIH1cXG4gIDUwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMC43OTIpO1xcbiAgfVxcbn1cXG4udGhpcmQge1xcbiAgYW5pbWF0aW9uOiBwdWxzZV90aGlyZCA1cyBpbmZpbml0ZTtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjtcXG59XFxuXFxuQGtleWZyYW1lcyBwdWxzZV9mb3VydGgge1xcbiAgMCUsXFxuICAxMDAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gIH1cXG4gIDUwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMC43MjgpO1xcbiAgfVxcbn1cXG4uZm91cnRoIHtcXG4gIGFuaW1hdGlvbjogcHVsc2VfZm91cnRoIDVzIGluZmluaXRlO1xcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xcbn1cXG5cXG5Aa2V5ZnJhbWVzIHB1bHNlX2ZpZnRoIHtcXG4gIDAlLFxcbiAgMTAwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICB9XFxuICA1MCUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNjY0KTtcXG4gIH1cXG59XFxuLmZpZnRoIHtcXG4gIGFuaW1hdGlvbjogcHVsc2VfZmlmdGggNXMgaW5maW5pdGU7XFxuICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XFxufVxcblxcbkBrZXlmcmFtZXMgcHVsc2VfaW5uZXJtb3N0IHtcXG4gIDAlLFxcbiAgMTAwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICB9XFxuICA1MCUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNik7XFxuICB9XFxufVxcbi5pbm5lcm1vc3Qge1xcbiAgYW5pbWF0aW9uOiBwdWxzZV9pbm5lcm1vc3QgNXMgaW5maW5pdGU7XFxuICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XFxufVxcblxcbi8qIGJvdW5jZSBhbmltYXRpb24gdG8gaW5kaWNhdGUgUGkgaXMgcGF1c2VkIGF3YWl0aW5nIHBlcm1pc3Npb24gdG8gc3BlYWsgKi9cXG5Aa2V5ZnJhbWVzIGJvdW5jZV9vdXRlcm1vc3Qge1xcbiAgMCUsXFxuICAyMCUsXFxuICA1MCUsXFxuICA4MCUsXFxuICAxMDAlIHtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xcbiAgfVxcbiAgNDAlIHtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01JSk7XFxuICB9XFxuICA2MCUge1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTMlKTtcXG4gIH1cXG59XFxuLm91dGVybW9zdC5wYXVzZWQge1xcbiAgYW5pbWF0aW9uLW5hbWU6IGJvdW5jZV9vdXRlcm1vc3Q7XFxuICBhbmltYXRpb24tZHVyYXRpb246IDJzO1xcbiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XFxufVxcblxcbkBrZXlmcmFtZXMgYm91bmNlX3NlY29uZCB7XFxuICAwJSxcXG4gIDIwJSxcXG4gIDUwJSxcXG4gIDgwJSxcXG4gIDEwMCUge1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XFxuICB9XFxuICA0MCUge1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUuOCUpO1xcbiAgfVxcbiAgNjAlIHtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zLjQ4JSk7XFxuICB9XFxufVxcbi5zZWNvbmQucGF1c2VkIHtcXG4gIGFuaW1hdGlvbi1uYW1lOiBib3VuY2Vfc2Vjb25kO1xcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAycztcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcbn1cXG5cXG5Aa2V5ZnJhbWVzIGJvdW5jZV90aGlyZCB7XFxuICAwJSxcXG4gIDIwJSxcXG4gIDUwJSxcXG4gIDgwJSxcXG4gIDEwMCUge1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XFxuICB9XFxuICA0MCUge1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTYuNiUpO1xcbiAgfVxcbiAgNjAlIHtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zLjk2JSk7XFxuICB9XFxufVxcbi50aGlyZC5wYXVzZWQge1xcbiAgYW5pbWF0aW9uLW5hbWU6IGJvdW5jZV90aGlyZDtcXG4gIGFuaW1hdGlvbi1kdXJhdGlvbjogMnM7XFxuICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTtcXG59XFxuXFxuQGtleWZyYW1lcyBib3VuY2VfZm91cnRoIHtcXG4gIDAlLFxcbiAgMjAlLFxcbiAgNTAlLFxcbiAgODAlLFxcbiAgMTAwJSB7XFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXG4gIH1cXG4gIDQwJSB7XFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNy40JSk7XFxuICB9XFxuICA2MCUge1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTQuNDQlKTtcXG4gIH1cXG59XFxuLmZvdXJ0aC5wYXVzZWQge1xcbiAgYW5pbWF0aW9uLW5hbWU6IGJvdW5jZV9mb3VydGg7XFxuICBhbmltYXRpb24tZHVyYXRpb246IDJzO1xcbiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XFxufVxcblxcbkBrZXlmcmFtZXMgYm91bmNlX2ZpZnRoIHtcXG4gIDAlLFxcbiAgMjAlLFxcbiAgNTAlLFxcbiAgODAlLFxcbiAgMTAwJSB7XFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXG4gIH1cXG4gIDQwJSB7XFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtOC4yJSk7XFxuICB9XFxuICA2MCUge1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTQuOTIlKTtcXG4gIH1cXG59XFxuLmZpZnRoLnBhdXNlZCB7XFxuICBhbmltYXRpb24tbmFtZTogYm91bmNlX2ZpZnRoO1xcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAycztcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcbn1cXG5cXG5Aa2V5ZnJhbWVzIGJvdW5jZV9pbm5lcm1vc3Qge1xcbiAgMCUsXFxuICAyMCUsXFxuICA1MCUsXFxuICA4MCUsXFxuICAxMDAlIHtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xcbiAgfVxcbiAgNDAlIHtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC05JSk7XFxuICB9XFxuICA2MCUge1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUuNCUpO1xcbiAgfVxcbn1cXG4uaW5uZXJtb3N0LnBhdXNlZCB7XFxuICBhbmltYXRpb24tbmFtZTogYm91bmNlX2lubmVybW9zdDtcXG4gIGFuaW1hdGlvbi1kdXJhdGlvbjogMnM7XFxuICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTtcXG59XFxuXFxuLyogcGxheWZ1bCBhbmltYXRpb24gdG8gaW5kaWNhdGUgUGkgaXMgc3BlYWtpbmcgKi9cXG5Aa2V5ZnJhbWVzIHNwZWFraW5nX291dGVybW9zdCB7XFxuICAwJSxcXG4gIDEwMCUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpIHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG4gIDI1JSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OTUpO1xcbiAgfVxcbiAgNTAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkpO1xcbiAgfVxcbiAgNzUlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjg5NSk7XFxuICB9XFxufVxcbi5vdXRlcm1vc3QucGlTcGVha2luZyB7XFxuICBhbmltYXRpb246IHNwZWFraW5nX291dGVybW9zdCAycyBpbmZpbml0ZTtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjtcXG59XFxuXFxuQGtleWZyYW1lcyBzcGVha2luZ19zZWNvbmQge1xcbiAgMCUsXFxuICAxMDAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKSByb3RhdGUoMGRlZyk7XFxuICB9XFxuICAyNSUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTgpIHJvdGF0ZSgtMWRlZyk7XFxuICB9XFxuICA1MCUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuODcpIHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG4gIDc1JSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMC44NjUpIHJvdGF0ZSgxZGVnKTtcXG4gIH1cXG59XFxuLnNlY29uZC5waVNwZWFraW5nIHtcXG4gIGFuaW1hdGlvbjogc3BlYWtpbmdfc2Vjb25kIDJzIGluZmluaXRlO1xcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xcbn1cXG5cXG5Aa2V5ZnJhbWVzIHNwZWFraW5nX3RoaXJkIHtcXG4gIDAlLFxcbiAgMTAwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgcm90YXRlKDBkZWcpO1xcbiAgfVxcbiAgMjUlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk2NSkgcm90YXRlKC0yZGVnKTtcXG4gIH1cXG4gIDUwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMC44NCkgcm90YXRlKDBkZWcpO1xcbiAgfVxcbiAgNzUlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjgzNSkgcm90YXRlKDJkZWcpO1xcbiAgfVxcbn1cXG4udGhpcmQucGlTcGVha2luZyB7XFxuICBhbmltYXRpb246IHNwZWFraW5nX3RoaXJkIDJzIGluZmluaXRlO1xcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xcbn1cXG5cXG5Aa2V5ZnJhbWVzIHNwZWFraW5nX2ZvdXJ0aCB7XFxuICAwJSxcXG4gIDEwMCUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpIHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG4gIDI1JSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSkgcm90YXRlKC0zZGVnKTtcXG4gIH1cXG4gIDUwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMC44MSkgcm90YXRlKDBkZWcpO1xcbiAgfVxcbiAgNzUlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjgwNSkgcm90YXRlKDNkZWcpO1xcbiAgfVxcbn1cXG4uZm91cnRoLnBpU3BlYWtpbmcge1xcbiAgYW5pbWF0aW9uOiBzcGVha2luZ19mb3VydGggMnMgaW5maW5pdGU7XFxuICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XFxufVxcblxcbkBrZXlmcmFtZXMgc3BlYWtpbmdfZmlmdGgge1xcbiAgMCUsXFxuICAxMDAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKSByb3RhdGUoMGRlZyk7XFxuICB9XFxuICAyNSUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTM1KSByb3RhdGUoLTRkZWcpO1xcbiAgfVxcbiAgNTAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjc4KSByb3RhdGUoMGRlZyk7XFxuICB9XFxuICA3NSUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNzc1KSByb3RhdGUoNGRlZyk7XFxuICB9XFxufVxcbi5maWZ0aC5waVNwZWFraW5nIHtcXG4gIGFuaW1hdGlvbjogc3BlYWtpbmdfZmlmdGggMnMgaW5maW5pdGU7XFxuICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XFxufVxcblxcbkBrZXlmcmFtZXMgc3BlYWtpbmdfaW5uZXJtb3N0IHtcXG4gIDAlLFxcbiAgMTAwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgcm90YXRlKDBkZWcpO1xcbiAgfVxcbiAgMjUlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkyKSByb3RhdGUoLTVkZWcpO1xcbiAgfVxcbiAgNTAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjc1KSByb3RhdGUoMGRlZyk7XFxuICB9XFxuICA3NSUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNzQ1KSByb3RhdGUoNWRlZyk7XFxuICB9XFxufVxcbi5pbm5lcm1vc3QucGlTcGVha2luZyB7XFxuICBhbmltYXRpb246IHNwZWFraW5nX2lubmVybW9zdCAycyBpbmZpbml0ZTtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjtcXG59XFxuXFxuLyogd2F2ZSBhbmltYXRpb24gdG8gaW5kaWNhdGUgdXNlciBpcyBzcGVha2luZyAqL1xcbkBrZXlmcmFtZXMgdXNlclNwZWFraW5nQW5pbWF0aW9uIHtcXG4gIDUwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGVZKDAuMDUpIHNjYWxlWCh2YXIoLS13aWR0aC1mYWN0b3IpKVxcbiAgICAgIHRyYW5zbGF0ZVgoY2FsYygtNTAlICsgdmFyKC0tc3ByZWFkLWFtb3VudCkpKTtcXG4gIH1cXG4gIDEwMCUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlWSgxKSBzY2FsZVgodmFyKC0td2lkdGgtZmFjdG9yKSlcXG4gICAgICB0cmFuc2xhdGVYKGNhbGMoLTUwJSArIHZhcigtLXNwcmVhZC1hbW91bnQpKSk7XFxuICB9XFxufVxcbi8qIHVzZXIgc3BlYWtpbmcgb3NjaWxsYXRpb24gYW5pbWF0aW9uICovXFxuQGtleWZyYW1lcyB3YXZlZm9ybV9vdXRlcm1vc3Qge1xcbiAgMCUsXFxuICAxMDAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZVkoMSkgc2NhbGVYKDEpO1xcbiAgfVxcbiAgMjUlLFxcbiAgNzUlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZVkoMC45KSBzY2FsZVgoMC45KTtcXG4gIH1cXG59XFxuXFxuQGtleWZyYW1lcyB3YXZlZm9ybV9zZWNvbmQge1xcbiAgMCUsXFxuICAxMDAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZVkoMC45KSBzY2FsZVgoMC45KTtcXG4gIH1cXG4gIDI1JSxcXG4gIDc1JSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGVZKDAuOCkgc2NhbGVYKDAuOCk7XFxuICB9XFxufVxcblxcbkBrZXlmcmFtZXMgd2F2ZWZvcm1fdGhpcmQge1xcbiAgMCUsXFxuICAxMDAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZVkoMC44KSBzY2FsZVgoMC44KTtcXG4gIH1cXG4gIDI1JSxcXG4gIDc1JSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGVZKDAuNykgc2NhbGVYKDAuNyk7XFxuICB9XFxufVxcblxcbkBrZXlmcmFtZXMgd2F2ZWZvcm1fZm91cnRoIHtcXG4gIDAlLFxcbiAgMTAwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGVZKDAuNykgc2NhbGVYKDAuNyk7XFxuICB9XFxuICAyNSUsXFxuICA3NSUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlWSgwLjYpIHNjYWxlWCgwLjYpO1xcbiAgfVxcbn1cXG5cXG5Aa2V5ZnJhbWVzIHdhdmVmb3JtX2ZpZnRoIHtcXG4gIDAlLFxcbiAgMTAwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGVZKDAuNikgc2NhbGVYKDAuNik7XFxuICB9XFxuICAyNSUsXFxuICA3NSUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlWSgwLjUpIHNjYWxlWCgwLjUpO1xcbiAgfVxcbn1cXG5cXG5Aa2V5ZnJhbWVzIHdhdmVmb3JtX2lubmVybW9zdCB7XFxuICAwJSxcXG4gIDEwMCUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlWSgwLjUpIHNjYWxlWCgwLjUpO1xcbiAgfVxcbiAgMjUlLFxcbiAgNzUlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZVkoMC40KSBzY2FsZVgoMC40KTtcXG4gIH1cXG59XFxuXFxuLm91dGVybW9zdC51c2VyU3BlYWtpbmcge1xcbiAgYW5pbWF0aW9uOiB3YXZlZm9ybV9vdXRlcm1vc3QgMC43cyBpbmZpbml0ZSBhbHRlcm5hdGU7XFxufVxcblxcbi5zZWNvbmQudXNlclNwZWFraW5nIHtcXG4gIGFuaW1hdGlvbjogd2F2ZWZvcm1fc2Vjb25kIDAuNjVzIGluZmluaXRlIGFsdGVybmF0ZTtcXG59XFxuXFxuLnRoaXJkLnVzZXJTcGVha2luZyB7XFxuICBhbmltYXRpb246IHdhdmVmb3JtX3RoaXJkIDAuNnMgaW5maW5pdGUgYWx0ZXJuYXRlO1xcbn1cXG5cXG4uZm91cnRoLnVzZXJTcGVha2luZyB7XFxuICBhbmltYXRpb246IHdhdmVmb3JtX2ZvdXJ0aCAwLjU1cyBpbmZpbml0ZSBhbHRlcm5hdGU7XFxufVxcblxcbi5maWZ0aC51c2VyU3BlYWtpbmcge1xcbiAgYW5pbWF0aW9uOiB3YXZlZm9ybV9maWZ0aCAwLjVzIGluZmluaXRlIGFsdGVybmF0ZTtcXG59XFxuXFxuLmlubmVybW9zdC51c2VyU3BlYWtpbmcge1xcbiAgYW5pbWF0aW9uOiB3YXZlZm9ybV9pbm5lcm1vc3QgMC40NXMgaW5maW5pdGUgYWx0ZXJuYXRlO1xcbn1cXG5cXG4vKiBmbGlwY2FyZCBhbmltYXRpb24gdG8gaW5kaWNhdGUgU2F5LCBQaSBpcyB0cmFuc2NyaWJpbmcgYXVkaW8gdG8gdGV4dCAqL1xcbkBrZXlmcmFtZXMgdHJhbnNjcmliaW5nRmxpcCB7XFxuICAwJSxcXG4gIDEwMCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZVkoMGRlZyk7XFxuICAgIGZpbGw6IHZhcigtLW9yaWdpbmFsLWNvbG9yKTtcXG4gIH1cXG4gIDUwJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlWSgxODBkZWcpO1xcbiAgICBmaWxsOiB2YXIoLS10cmFuc2NyaWJpbmctY29sb3IpO1xcbiAgfVxcbn1cXG5cXG4ub3V0ZXJtb3N0LnRyYW5zY3JpYmluZyB7XFxuICAtLW9yaWdpbmFsLWNvbG9yOiAjZTRmMmQxO1xcbiAgLS10cmFuc2NyaWJpbmctY29sb3I6ICNiM2UwZmU7XFxuICBhbmltYXRpb246IHRyYW5zY3JpYmluZ0ZsaXAgMS41cyBpbmZpbml0ZTtcXG59XFxuXFxuLnNlY29uZC50cmFuc2NyaWJpbmcge1xcbiAgLS1vcmlnaW5hbC1jb2xvcjogI2NjZThiNTtcXG4gIC0tdHJhbnNjcmliaW5nLWNvbG9yOiAjODljMmZmO1xcbiAgYW5pbWF0aW9uOiB0cmFuc2NyaWJpbmdGbGlwIDEuNnMgaW5maW5pdGU7XFxufVxcblxcbi50aGlyZC50cmFuc2NyaWJpbmcge1xcbiAgLS1vcmlnaW5hbC1jb2xvcjogI2IzZGI5NTtcXG4gIC0tdHJhbnNjcmliaW5nLWNvbG9yOiAjNWZhNGZmO1xcbiAgYW5pbWF0aW9uOiB0cmFuc2NyaWJpbmdGbGlwIDEuN3MgaW5maW5pdGU7XFxufVxcblxcbi5mb3VydGgudHJhbnNjcmliaW5nIHtcXG4gIC0tb3JpZ2luYWwtY29sb3I6ICM5YmQwNzg7XFxuICAtLXRyYW5zY3JpYmluZy1jb2xvcjogIzM1ODZmZjtcXG4gIGFuaW1hdGlvbjogdHJhbnNjcmliaW5nRmxpcCAxLjhzIGluZmluaXRlO1xcbn1cXG5cXG4uZmlmdGgudHJhbnNjcmliaW5nIHtcXG4gIC0tb3JpZ2luYWwtY29sb3I6ICM4M2M1NWM7XFxuICAtLXRyYW5zY3JpYmluZy1jb2xvcjogIzBiNjllMztcXG4gIGFuaW1hdGlvbjogdHJhbnNjcmliaW5nRmxpcCAxLjlzIGluZmluaXRlO1xcbn1cXG5cXG4uaW5uZXJtb3N0LnRyYW5zY3JpYmluZyB7XFxuICAtLW9yaWdpbmFsLWNvbG9yOiAjNDI4YTJmO1xcbiAgLS10cmFuc2NyaWJpbmctY29sb3I6ICMwMDUzYmY7XFxuICBhbmltYXRpb246IHRyYW5zY3JpYmluZ0ZsaXAgMnMgaW5maW5pdGU7XFxufVxcblxcbi8qIGhlYXJ0YmVhdCBhbmltYXRpb24gdG8gaW5kaWNhdGUgUGkgaXMgcHJlcGFyaW5nIHRvIHNwZWFrICovXFxuQGtleWZyYW1lcyBoZWFydGJlYXQge1xcbiAgMCUsXFxuICAxMDAlIHtcXG4gICAgb3BhY2l0eTogMTtcXG4gICAgZmlsbDogdmFyKC0tb3JpZ2luYWwtY29sb3IpO1xcbiAgfVxcbiAgNTAlIHtcXG4gICAgb3BhY2l0eTogMC41O1xcbiAgICBmaWxsOiByZ2IoMjQ1IDIzOCAyMjMpOyAvKiBiZy1jcmVhbS01NTAgKi9cXG4gIH1cXG59XFxuXFxuLm91dGVybW9zdC5sb2FkaW5nIHtcXG4gIC0tb3JpZ2luYWwtY29sb3I6ICNlNGYyZDE7XFxuICBhbmltYXRpb246IGhlYXJ0YmVhdCAycyBpbmZpbml0ZTtcXG4gIGFuaW1hdGlvbi1kZWxheTogMHM7XFxufVxcblxcbi5zZWNvbmQubG9hZGluZyB7XFxuICAtLW9yaWdpbmFsLWNvbG9yOiAjY2NlOGI1O1xcbiAgYW5pbWF0aW9uOiBoZWFydGJlYXQgMnMgaW5maW5pdGU7XFxuICBhbmltYXRpb24tZGVsYXk6IDAuNHM7XFxufVxcblxcbi50aGlyZC5sb2FkaW5nIHtcXG4gIC0tb3JpZ2luYWwtY29sb3I6ICNiM2RiOTU7XFxuICBhbmltYXRpb246IGhlYXJ0YmVhdCAycyBpbmZpbml0ZTtcXG4gIGFuaW1hdGlvbi1kZWxheTogMC44cztcXG59XFxuXFxuLmZvdXJ0aC5sb2FkaW5nIHtcXG4gIC0tb3JpZ2luYWwtY29sb3I6ICM5YmQwNzg7XFxuICBhbmltYXRpb246IGhlYXJ0YmVhdCAycyBpbmZpbml0ZTtcXG4gIGFuaW1hdGlvbi1kZWxheTogMS4ycztcXG59XFxuXFxuLmZpZnRoLmxvYWRpbmcge1xcbiAgLS1vcmlnaW5hbC1jb2xvcjogIzgzYzU1YztcXG4gIGFuaW1hdGlvbjogaGVhcnRiZWF0IDJzIGluZmluaXRlO1xcbiAgYW5pbWF0aW9uLWRlbGF5OiAxLjZzO1xcbn1cXG5cXG4uaW5uZXJtb3N0LmxvYWRpbmcge1xcbiAgLS1vcmlnaW5hbC1jb2xvcjogIzQyOGEyZjtcXG4gIGFuaW1hdGlvbjogaGVhcnRiZWF0IDJzIGluZmluaXRlO1xcbiAgYW5pbWF0aW9uLWRlbGF5OiAycztcXG59XFxuXFxuLyogdG9uZWQtZG93biBkaXNzYXJ5IGFuaW1hdGlvbiB0byBpbmRpY2F0ZSBhbiBlcnJvciAqL1xcbi8qIHRvbmVkLWRvd24gZXJyb3IgYW5pbWF0aW9uIHdpdGggcmVkdWNlZCBvcGFjaXR5ICovXFxuQGtleWZyYW1lcyBlcnJvckFuaW1hdGlvbiB7XFxuICAwJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpIHRyYW5zbGF0ZSgwJSwgMCUpO1xcbiAgfVxcbiAgMjUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpIHRyYW5zbGF0ZSgtNSUsIDUlKTtcXG4gIH1cXG4gIDUwJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDVkZWcpIHRyYW5zbGF0ZSg1JSwgLTUlKTtcXG4gIH1cXG4gIDc1JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKSB0cmFuc2xhdGUoLTUlLCA1JSk7XFxuICB9XFxuICAxMDAlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZykgdHJhbnNsYXRlKDAlLCAwJSk7XFxuICB9XFxufVxcblxcbi5vdXRlcm1vc3QuZXJyb3Ige1xcbiAgYW5pbWF0aW9uOiBlcnJvckFuaW1hdGlvbiAyNXMgMTtcXG4gIGZpbGw6ICNmZjAwMDA7XFxuICBmaWxsLW9wYWNpdHk6IDAuNztcXG59XFxuXFxuLnNlY29uZC5lcnJvciB7XFxuICBhbmltYXRpb246IGVycm9yQW5pbWF0aW9uIDI1cyAxO1xcbiAgZmlsbDogI2ZmMzMwMDtcXG4gIGZpbGwtb3BhY2l0eTogMC43O1xcbn1cXG5cXG4udGhpcmQuZXJyb3Ige1xcbiAgYW5pbWF0aW9uOiBlcnJvckFuaW1hdGlvbiAyNXMgMTtcXG4gIGZpbGw6ICNmZjY2MDA7XFxuICBmaWxsLW9wYWNpdHk6IDAuNztcXG59XFxuXFxuLmZvdXJ0aC5lcnJvciB7XFxuICBhbmltYXRpb246IGVycm9yQW5pbWF0aW9uIDI1cyAxO1xcbiAgZmlsbDogI2ZmOTkwMDtcXG4gIGZpbGwtb3BhY2l0eTogMC43O1xcbn1cXG5cXG4uZmlmdGguZXJyb3Ige1xcbiAgYW5pbWF0aW9uOiBlcnJvckFuaW1hdGlvbiAyNXMgMTtcXG4gIGZpbGw6ICNmZmNjMDA7XFxuICBmaWxsLW9wYWNpdHk6IDAuNztcXG59XFxuXFxuLmlubmVybW9zdC5lcnJvciB7XFxuICBhbmltYXRpb246IGVycm9yQW5pbWF0aW9uIDI1cyAxO1xcbiAgZmlsbDogI2ZmZmYwMDtcXG4gIGZpbGwtb3BhY2l0eTogMC43O1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC5oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbiNzYXlwaS1wbGF5QnV0dG9uLnBsYXktYnV0dG9uIHtcbiAgLyogcG9zaXRpb24gb3ZlciB0aGUgdGFsayBidXR0b24sIGJ1dCB1bmRlciBhbnkgY29udHJvbHMgKi9cbiAgei1pbmRleDogNzA7IC8qIHRhbGsgYnV0dG9uIHotaW5kZXggaXMgNTkgb3IgNjAgKi9cbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsgLyogdHJhbnNwYXJlbnQgd2l0aG91dCBob2xlcyAqL1xuICBib3JkZXI6IG5vbmU7XG59XG5cbi5tb2JpbGUtZGV2aWNlIHtcbiAgLyogbWF4aW1pemUgKG1vYmlsZSB2aWV3KSBidXR0b24gaXMgb25seSBkaXNwbGF5ZWQgb24gY29tcGF0aWJsZSBkZXZpY2VzICovXG59XG4ubW9iaWxlLWRldmljZSAjc2F5cGktZW50ZXJCdXR0b24sXG4ubW9iaWxlLWRldmljZSAjc2F5cGktZXhpdEJ1dHRvbiB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiA0cmVtO1xuICBsZWZ0OiAxLjI1cmVtO1xuICB3aWR0aDogM3JlbTtcbiAgaGVpZ2h0OiAzcmVtO1xuICBwYWRkaW5nOiA2cHg7XG4gIGJvcmRlcjogMDtcbiAgei1pbmRleDogNjA7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvc3R5bGVzL2NvbW1vbi5zY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0VBQ0Usd0JBQUE7QUFDRjs7QUFDQTtFQUNFLDBEQUFBO0VBQ0EsV0FBQSxFQUFBLG9DQUFBO0VBQ0Esa0NBQUEsRUFBQSw4QkFBQTtFQUNBLFlBQUE7QUFFRjs7QUFDQTtFQUNFLDBFQUFBO0FBRUY7QUFERTs7RUFFRSxlQUFBO0VBQ0EsU0FBQTtFQUNBLGFBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFlBQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtBQUdKXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5oaWRkZW4ge1xcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xcbn1cXG4jc2F5cGktcGxheUJ1dHRvbi5wbGF5LWJ1dHRvbiB7XFxuICAvKiBwb3NpdGlvbiBvdmVyIHRoZSB0YWxrIGJ1dHRvbiwgYnV0IHVuZGVyIGFueSBjb250cm9scyAqL1xcbiAgei1pbmRleDogNzA7IC8qIHRhbGsgYnV0dG9uIHotaW5kZXggaXMgNTkgb3IgNjAgKi9cXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7IC8qIHRyYW5zcGFyZW50IHdpdGhvdXQgaG9sZXMgKi9cXG4gIGJvcmRlcjogbm9uZTtcXG59XFxuXFxuLm1vYmlsZS1kZXZpY2Uge1xcbiAgLyogbWF4aW1pemUgKG1vYmlsZSB2aWV3KSBidXR0b24gaXMgb25seSBkaXNwbGF5ZWQgb24gY29tcGF0aWJsZSBkZXZpY2VzICovXFxuICAjc2F5cGktZW50ZXJCdXR0b24sXFxuICAjc2F5cGktZXhpdEJ1dHRvbiB7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgdG9wOiA0cmVtO1xcbiAgICBsZWZ0OiAxLjI1cmVtO1xcbiAgICB3aWR0aDogM3JlbTtcXG4gICAgaGVpZ2h0OiAzcmVtO1xcbiAgICBwYWRkaW5nOiA2cHg7XFxuICAgIGJvcmRlcjogMDtcXG4gICAgei1pbmRleDogNjA7XFxuICB9XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgQGtleWZyYW1lcyBwdWxzZSB7XG4gIDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICB9XG4gIDUwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkpO1xuICB9XG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gIH1cbn1cbmh0bWwuZGVza3RvcC12aWV3ICNzYXlwaS10YWxrQnV0dG9uLFxuaHRtbC5kZXNrdG9wLXZpZXcgLnBsYXktYnV0dG9uIHtcbiAgbWFyZ2luOiAwLjVyZW07XG4gIGJvcmRlci1yYWRpdXM6IDE4cHg7XG4gIGhlaWdodDogMi4yNXJlbTtcbiAgd2lkdGg6IDVyZW07XG4gIGRpc3BsYXk6IGJsb2NrOyAvKiBGb3IgU2FmYXJpICovXG59XG5odG1sLmRlc2t0b3AtdmlldyAjc2F5cGktcGxheUJ1dHRvbiB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiA1MCU7IC8qIENlbnRlciB2ZXJ0aWNhbGx5ICovXG4gIGxlZnQ6IDUwJTsgLyogQ2VudGVyIGhvcml6b250YWxseSAqL1xuICBtYXgtd2lkdGg6IDUwMHB4OyAvKiBNYXhpbXVtIHdpZHRoICovXG4gIHdpZHRoOiAxMDAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgLyogTmVjZXNzYXJ5IGZvciBwZXJmZWN0IGNlbnRlcmluZyAqL1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7IC8qIFRvIGNlbnRlciB0aGUgaW5uZXIgY29udGVudHMsIGlmIGFueSAqL1xufVxuaHRtbC5kZXNrdG9wLXZpZXcgI3NheXBpLXBsYXlCdXR0b24gc3ZnIHtcbiAgcGFkZGluZzogMi41cmVtO1xufVxuaHRtbC5kZXNrdG9wLXZpZXcgaHRtbDpub3QoLmZpcmVmb3gtYW5kcm9pZCkgI3NheXBpLXRhbGtCdXR0b246YWN0aXZlIC53YXZlZm9ybSxcbmh0bWwuZGVza3RvcC12aWV3ICNzYXlwaS10YWxrQnV0dG9uLmFjdGl2ZSAud2F2ZWZvcm0ge1xuICBhbmltYXRpb246IHB1bHNlIDFzIGluZmluaXRlO1xufVxuaHRtbC5kZXNrdG9wLXZpZXcgI3NheXBpLXRhbGtCdXR0b24gLndhdmVmb3JtIHtcbiAgZmlsbDogIzc3NmQ2ZDtcbn1cbmh0bWwuZGVza3RvcC12aWV3ICNzYXlwaS10YWxrQnV0dG9uLmF1dG9TdWJtaXQgLndhdmVmb3JtIHtcbiAgZmlsbDogcmdiKDY1LCAxMzgsIDQ3KTsgLyogUGkncyB0ZXh0LWJyYW5kLWdyZWVuLTYwMCAqL1xufVxuaHRtbC5kZXNrdG9wLXZpZXcgI3NheXBpLW5vdGlmaWNhdGlvbiA+IHN2ZyB7XG4gIHdpZHRoOiAzcmVtO1xuICBoZWlnaHQ6IDNyZW07XG4gIGJvdHRvbTogNHJlbTtcbiAgcmlnaHQ6IDEycmVtO1xuICBwb3NpdGlvbjogZml4ZWQ7XG59XG5odG1sLmRlc2t0b3AtdmlldyAjc2F5cGktZXhpdEJ1dHRvbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvc3R5bGVzL2Rlc2t0b3Auc2Nzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFDRTtFQUNFO0lBQ0UsbUJBQUE7RUFBSjtFQUVFO0lBQ0UscUJBQUE7RUFBSjtFQUVFO0lBQ0UsbUJBQUE7RUFBSjtBQUNGO0FBRUU7O0VBRUUsY0FBQTtFQUNBLG1CQUFBO0VBQ0EsZUFBQTtFQUNBLFdBQUE7RUFDQSxjQUFBLEVBQUEsZUFBQTtBQUFKO0FBR0U7RUFDRSxlQUFBO0VBQ0EsUUFBQSxFQUFBLHNCQUFBO0VBQ0EsU0FBQSxFQUFBLHdCQUFBO0VBQ0EsZ0JBQUEsRUFBQSxrQkFBQTtFQUNBLFdBQUE7RUFDQSxnQ0FBQSxFQUFBLG9DQUFBO0VBQ0Esa0JBQUEsRUFBQSx5Q0FBQTtBQURKO0FBR0k7RUFDRSxlQUFBO0FBRE47QUFLRTs7RUFFRSw0QkFBQTtBQUhKO0FBS0U7RUFDRSxhQUFBO0FBSEo7QUFLRTtFQUNFLHNCQUFBLEVBQUEsOEJBQUE7QUFISjtBQU1FO0VBQ0UsV0FBQTtFQUNBLFlBQUE7RUFDQSxZQUFBO0VBQ0EsWUFBQTtFQUNBLGVBQUE7QUFKSjtBQU9FO0VBQ0UsYUFBQTtBQUxKXCIsXCJzb3VyY2VzQ29udGVudFwiOltcImh0bWwuZGVza3RvcC12aWV3IHtcXG4gIEBrZXlmcmFtZXMgcHVsc2Uge1xcbiAgICAwJSB7XFxuICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gICAgfVxcbiAgICA1MCUge1xcbiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45KTtcXG4gICAgfVxcbiAgICAxMDAlIHtcXG4gICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICB9XFxuICB9XFxuICAjc2F5cGktdGFsa0J1dHRvbixcXG4gIC5wbGF5LWJ1dHRvbiB7XFxuICAgIG1hcmdpbjogMC41cmVtO1xcbiAgICBib3JkZXItcmFkaXVzOiAxOHB4O1xcbiAgICBoZWlnaHQ6IDIuMjVyZW07XFxuICAgIHdpZHRoOiA1cmVtO1xcbiAgICBkaXNwbGF5OiBibG9jazsgLyogRm9yIFNhZmFyaSAqL1xcbiAgfVxcblxcbiAgI3NheXBpLXBsYXlCdXR0b24ge1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIHRvcDogNTAlOyAvKiBDZW50ZXIgdmVydGljYWxseSAqL1xcbiAgICBsZWZ0OiA1MCU7IC8qIENlbnRlciBob3Jpem9udGFsbHkgKi9cXG4gICAgbWF4LXdpZHRoOiA1MDBweDsgLyogTWF4aW11bSB3aWR0aCAqL1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IC8qIE5lY2Vzc2FyeSBmb3IgcGVyZmVjdCBjZW50ZXJpbmcgKi9cXG4gICAgdGV4dC1hbGlnbjogY2VudGVyOyAvKiBUbyBjZW50ZXIgdGhlIGlubmVyIGNvbnRlbnRzLCBpZiBhbnkgKi9cXG5cXG4gICAgc3ZnIHtcXG4gICAgICBwYWRkaW5nOiAyLjVyZW07XFxuICAgIH1cXG4gIH1cXG5cXG4gIGh0bWw6bm90KC5maXJlZm94LWFuZHJvaWQpICNzYXlwaS10YWxrQnV0dG9uOmFjdGl2ZSAud2F2ZWZvcm0sXFxuICAjc2F5cGktdGFsa0J1dHRvbi5hY3RpdmUgLndhdmVmb3JtIHtcXG4gICAgYW5pbWF0aW9uOiBwdWxzZSAxcyBpbmZpbml0ZTtcXG4gIH1cXG4gICNzYXlwaS10YWxrQnV0dG9uIC53YXZlZm9ybSB7XFxuICAgIGZpbGw6ICM3NzZkNmQ7XFxuICB9XFxuICAjc2F5cGktdGFsa0J1dHRvbi5hdXRvU3VibWl0IC53YXZlZm9ybSB7XFxuICAgIGZpbGw6IHJnYig2NSAxMzggNDcpOyAvKiBQaSdzIHRleHQtYnJhbmQtZ3JlZW4tNjAwICovXFxuICB9XFxuXFxuICAjc2F5cGktbm90aWZpY2F0aW9uID4gc3ZnIHtcXG4gICAgd2lkdGg6IDNyZW07XFxuICAgIGhlaWdodDogM3JlbTtcXG4gICAgYm90dG9tOiA0cmVtO1xcbiAgICByaWdodDogMTJyZW07XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gIH1cXG5cXG4gICNzYXlwaS1leGl0QnV0dG9uIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gIH1cXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGBodG1sLm1vYmlsZS12aWV3IHtcbiAgLyogUGkgY29udHJvbHM6IGVsbGlwc2lzLCBleHBlcmllbmNlcyAqL1xuICAvKiBQaSBjb250cm9sczogbXV0ZS91bm11dGUgKi9cbiAgLyogZml4IGFuIGFsaWdubWVudCBpc3N1ZSB3aXRoIHRoZSBcIm5ldyB1aSBsYXlvdXRcIiAqL1xufVxuaHRtbC5tb2JpbGUtdmlldyAjc2F5cGktcGFuZWwsXG5odG1sLm1vYmlsZS12aWV3IC5wbGF5LWJ1dHRvbixcbmh0bWwubW9iaWxlLXZpZXcgLm5vdGlmaWNhdGlvbiB7XG4gIHdpZHRoOiAxMDAlO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGxlZnQ6IDA7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjQ1LCAyMzgsIDIyMywgMC45OCk7XG4gIGhlaWdodDogMTAwdmg7XG4gIHRvcDogMDtcbn1cbmh0bWwubW9iaWxlLXZpZXcgI3NheXBpLXBsYXlCdXR0b24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI0NSwgMjM4LCAyMjMsIDAuNTUpO1xufVxuaHRtbC5tb2JpbGUtdmlldyAjc2F5cGktcGxheUJ1dHRvbiBzdmcge1xuICBwYWRkaW5nOiAyLjVyZW07XG59XG5odG1sLm1vYmlsZS12aWV3ICNzYXlwaS10YWxrQnV0dG9uIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG4gIG1hcmdpbjogMDtcbn1cbmh0bWwubW9iaWxlLXZpZXcgI3NheXBpLW5vdGlmaWNhdGlvbiB7XG4gIHotaW5kZXg6IDEwMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5odG1sLm1vYmlsZS12aWV3ICNzYXlwaS1ub3RpZmljYXRpb24gc3ZnIHtcbiAgd2lkdGg6IDc1JTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW46IGF1dG87XG59XG5odG1sLm1vYmlsZS12aWV3ICNfX25leHQgPiBtYWluID4gZGl2ID4gZGl2ID4gZGl2LmZpeGVkLnRvcC00LnJpZ2h0LTYgPiBidXR0b24sXG5odG1sLm1vYmlsZS12aWV3ICNzYXlwaS1leHBlcmllbmNlcy1idXR0b24ge1xuICB0cmFuc2Zvcm06IHNjYWxlKDEuNSk7XG59XG5odG1sLm1vYmlsZS12aWV3ICNzYXlwaS1hdWRpby1jb250cm9scyB7XG4gIC8qIGhpZGUgdGhlIHZvaWNlIG9wdGlvbnMgKi9cbiAgLyogc2NhbGUgdGhlIG11dGUgYnV0dG9uICovXG59XG5odG1sLm1vYmlsZS12aWV3ICNzYXlwaS1hdWRpby1jb250cm9scyBkaXYucC0xIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbmh0bWwubW9iaWxlLXZpZXcgI3NheXBpLWF1ZGlvLWNvbnRyb2xzIGJ1dHRvbi5ncm91cCB7XG4gIHRyYW5zZm9ybTogc2NhbGUoMikgIWltcG9ydGFudDtcbiAgei1pbmRleDogNTA7XG4gIC8qIGhpZGUgdGhlIHZvaWNlIHNlbGVjdG9yIHR3aXN0eSAqL1xufVxuaHRtbC5tb2JpbGUtdmlldyAjc2F5cGktYXVkaW8tY29udHJvbHMgYnV0dG9uLmdyb3VwICsgYnV0dG9uIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbmh0bWwubW9iaWxlLXZpZXcgLnRleHQtYm9keS1jaGF0LW0ge1xuICBwYWRkaW5nLXRvcDogMDtcbn1cbmh0bWwubW9iaWxlLXZpZXcgI3NheXBpLWVudGVyQnV0dG9uIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbmh0bWwubW9iaWxlLXZpZXcgI3NheXBpLWZvb3RlciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5odG1sLm1vYmlsZS12aWV3ICNzYXlwaS1wcm9tcHQge1xuICAvKiBoaWRlcyB2aXJ0dWFsIGtleWJvYXJkIG9uIGFuZHJvaWQgKi9cbiAgZGlzcGxheTogbm9uZTtcbn1cbmh0bWwubW9iaWxlLXZpZXcgI3NheXBpLXN1Ym1pdEJ1dHRvbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvc3R5bGVzL21vYmlsZS5zY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0VBc0NFLHVDQUFBO0VBTUEsNkJBQUE7RUFpQkEsb0RBQUE7QUF6REY7QUFIRTs7O0VBR0UsV0FBQTtFQUNBLGVBQUE7RUFDQSxPQUFBO0VBQ0EsMkNBQUE7RUFFQSxhQUFBO0VBQ0EsTUFBQTtBQUlKO0FBREU7RUFDRSwyQ0FBQTtBQUdKO0FBRkk7RUFDRSxlQUFBO0FBSU47QUFBRTtFQUNFLFdBQUE7RUFDQSxZQUFBO0VBQ0EsNkJBQUE7RUFDQSxnQkFBQTtFQUNBLFNBQUE7QUFFSjtBQUNFO0VBQ0UsWUFBQTtFQUNBLDZCQUFBO0FBQ0o7QUFBSTtFQUNFLFVBQUE7RUFDQSxZQUFBO0VBQ0EsWUFBQTtBQUVOO0FBR0U7O0VBRUUscUJBQUE7QUFESjtBQUtFO0VBQ0UsMkJBQUE7RUFJQSwwQkFBQTtBQU5KO0FBR0k7RUFDRSxhQUFBO0FBRE47QUFJSTtFQUNFLDhCQUFBO0VBQ0EsV0FBQTtFQUNBLG1DQUFBO0FBRk47QUFHTTtFQUNFLGFBQUE7QUFEUjtBQU9FO0VBQ0UsY0FBQTtBQUxKO0FBUUU7RUFDRSxhQUFBO0FBTko7QUFTRTtFQUNFLGFBQUE7QUFQSjtBQVVFO0VBQ0Usc0NBQUE7RUFDQSxhQUFBO0FBUko7QUFXRTtFQUNFLGFBQUE7QUFUSlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJodG1sLm1vYmlsZS12aWV3IHtcXG4gICNzYXlwaS1wYW5lbCxcXG4gIC5wbGF5LWJ1dHRvbixcXG4gIC5ub3RpZmljYXRpb24ge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBsZWZ0OiAwO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI0NSwgMjM4LCAyMjMsIDAuOTgpO1xcblxcbiAgICBoZWlnaHQ6IDEwMHZoO1xcbiAgICB0b3A6IDA7XFxuICB9XFxuXFxuICAjc2F5cGktcGxheUJ1dHRvbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjQ1LCAyMzgsIDIyMywgMC41NSk7XFxuICAgIHN2ZyB7XFxuICAgICAgcGFkZGluZzogMi41cmVtO1xcbiAgICB9XFxuICB9XFxuXFxuICAjc2F5cGktdGFsa0J1dHRvbiB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBib3JkZXItcmFkaXVzOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICB9XFxuXFxuICAjc2F5cGktbm90aWZpY2F0aW9uIHtcXG4gICAgei1pbmRleDogMTAwO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgc3ZnIHtcXG4gICAgICB3aWR0aDogNzUlO1xcbiAgICAgIGhlaWdodDogMTAwJTtcXG4gICAgICBtYXJnaW46IGF1dG87XFxuICAgIH1cXG4gIH1cXG5cXG4gIC8qIFBpIGNvbnRyb2xzOiBlbGxpcHNpcywgZXhwZXJpZW5jZXMgKi9cXG4gICNfX25leHQgPiBtYWluID4gZGl2ID4gZGl2ID4gZGl2LmZpeGVkLnRvcC00LnJpZ2h0LTYgPiBidXR0b24sXFxuICAjc2F5cGktZXhwZXJpZW5jZXMtYnV0dG9uIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjUpO1xcbiAgfVxcblxcbiAgLyogUGkgY29udHJvbHM6IG11dGUvdW5tdXRlICovXFxuICAjc2F5cGktYXVkaW8tY29udHJvbHMge1xcbiAgICAvKiBoaWRlIHRoZSB2b2ljZSBvcHRpb25zICovXFxuICAgIGRpdi5wLTEge1xcbiAgICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIH1cXG4gICAgLyogc2NhbGUgdGhlIG11dGUgYnV0dG9uICovXFxuICAgIGJ1dHRvbi5ncm91cCB7XFxuICAgICAgdHJhbnNmb3JtOiBzY2FsZSgyKSAhaW1wb3J0YW50O1xcbiAgICAgIHotaW5kZXg6IDUwO1xcbiAgICAgIC8qIGhpZGUgdGhlIHZvaWNlIHNlbGVjdG9yIHR3aXN0eSAqL1xcbiAgICAgICsgYnV0dG9uIHtcXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxuXFxuICAvKiBmaXggYW4gYWxpZ25tZW50IGlzc3VlIHdpdGggdGhlIFxcXCJuZXcgdWkgbGF5b3V0XFxcIiAqL1xcbiAgLnRleHQtYm9keS1jaGF0LW0ge1xcbiAgICBwYWRkaW5nLXRvcDogMDtcXG4gIH1cXG5cXG4gICNzYXlwaS1lbnRlckJ1dHRvbiB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICB9XFxuXFxuICAjc2F5cGktZm9vdGVyIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gIH1cXG5cXG4gICNzYXlwaS1wcm9tcHQge1xcbiAgICAvKiBoaWRlcyB2aXJ0dWFsIGtleWJvYXJkIG9uIGFuZHJvaWQgKi9cXG4gICAgZGlzcGxheTogbm9uZTtcXG4gIH1cXG5cXG4gICNzYXlwaS1zdWJtaXRCdXR0b24ge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgfVxcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qXG4gIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKSB7XG4gIHZhciBsaXN0ID0gW107XG5cbiAgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgY29udGVudCA9IFwiXCI7XG4gICAgICB2YXIgbmVlZExheWVyID0gdHlwZW9mIGl0ZW1bNV0gIT09IFwidW5kZWZpbmVkXCI7XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBjb250ZW50ICs9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSk7XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07XG5cbiAgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcbiAgbGlzdC5pID0gZnVuY3Rpb24gaShtb2R1bGVzLCBtZWRpYSwgZGVkdXBlLCBzdXBwb3J0cywgbGF5ZXIpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIHVuZGVmaW5lZF1dO1xuICAgIH1cbiAgICB2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgaWQgPSB0aGlzW2tdWzBdO1xuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBfayA9IDA7IF9rIDwgbW9kdWxlcy5sZW5ndGg7IF9rKyspIHtcbiAgICAgIHZhciBpdGVtID0gW10uY29uY2F0KG1vZHVsZXNbX2tdKTtcbiAgICAgIGlmIChkZWR1cGUgJiYgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtWzVdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWVkaWEpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN1cHBvcnRzKSB7XG4gICAgICAgIGlmICghaXRlbVs0XSkge1xuICAgICAgICAgIGl0ZW1bNF0gPSBcIlwiLmNvbmNhdChzdXBwb3J0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzRdID0gc3VwcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBsaXN0O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICB2YXIgY29udGVudCA9IGl0ZW1bMV07XG4gIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcbiAgaWYgKCFjc3NNYXBwaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuICByZXR1cm4gW2NvbnRlbnRdLmpvaW4oXCJcXG5cIik7XG59OyIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnID8gUmVmbGVjdCA6IG51bGxcbnZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nXG4gID8gUi5hcHBseVxuICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpO1xuICB9XG5cbnZhciBSZWZsZWN0T3duS2V5c1xuaWYgKFIgJiYgdHlwZW9mIFIub3duS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWZsZWN0T3duS2V5cyA9IFIub3duS2V5c1xufSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldClcbiAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKHdhcm5pbmcpO1xufVxuXG52YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5tb2R1bGUuZXhwb3J0cy5vbmNlID0gb25jZTtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHNDb3VudCA9IDA7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbnZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbmZ1bmN0aW9uIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEVtaXR0ZXIsICdkZWZhdWx0TWF4TGlzdGVuZXJzJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkZWZhdWx0TWF4TGlzdGVuZXJzO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwIHx8IE51bWJlcklzTmFOKGFyZykpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7XG4gICAgfVxuICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7XG4gIH1cbn0pO1xuXG5FdmVudEVtaXR0ZXIuaW5pdCA9IGZ1bmN0aW9uKCkge1xuXG4gIGlmICh0aGlzLl9ldmVudHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn07XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgTnVtYmVySXNOYU4obikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTtcbiAgfVxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIF9nZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuIF9nZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTtcblxuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpXG4gICAgZG9FcnJvciA9IChkb0Vycm9yICYmIGV2ZW50cy5lcnJvciA9PT0gdW5kZWZpbmVkKTtcbiAgZWxzZSBpZiAoIWRvRXJyb3IpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKGRvRXJyb3IpIHtcbiAgICB2YXIgZXI7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMClcbiAgICAgIGVyID0gYXJnc1swXTtcbiAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgLy8gTm90ZTogVGhlIGNvbW1lbnRzIG9uIHRoZSBgdGhyb3dgIGxpbmVzIGFyZSBpbnRlbnRpb25hbCwgdGhleSBzaG93XG4gICAgICAvLyB1cCBpbiBOb2RlJ3Mgb3V0cHV0IGlmIHRoaXMgcmVzdWx0cyBpbiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uLlxuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgfVxuICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmhhbmRsZWQgZXJyb3IuJyArIChlciA/ICcgKCcgKyBlci5tZXNzYWdlICsgJyknIDogJycpKTtcbiAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgIHRocm93IGVycjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgfVxuXG4gIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFJlZmxlY3RBcHBseShoYW5kbGVyLCB0aGlzLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgUmVmbGVjdEFwcGx5KGxpc3RlbmVyc1tpXSwgdGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIF9hZGRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBwcmVwZW5kKSB7XG4gIHZhciBtO1xuICB2YXIgZXZlbnRzO1xuICB2YXIgZXhpc3Rpbmc7XG5cbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICBpZiAoZXZlbnRzLm5ld0xpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhcmdldC5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA/IGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gICAgICAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG4gICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICB9XG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV07XG4gIH1cblxuICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPVxuICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHtcbiAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICAgIG0gPSBfZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCk7XG4gICAgaWYgKG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0gJiYgIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgIC8vIE5vIGVycm9yIGNvZGUgZm9yIHRoaXMgc2luY2UgaXQgaXMgYSBXYXJuaW5nXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgIHZhciB3ID0gbmV3IEVycm9yKCdQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5sZW5ndGggKyAnICcgKyBTdHJpbmcodHlwZSkgKyAnIGxpc3RlbmVycyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY3JlYXNlIGxpbWl0Jyk7XG4gICAgICB3Lm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJztcbiAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgIHcudHlwZSA9IHR5cGU7XG4gICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoO1xuICAgICAgUHJvY2Vzc0VtaXRXYXJuaW5nKHcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfTtcblxuZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7XG4gIGlmICghdGhpcy5maXJlZCkge1xuICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pO1xuICAgIHRoaXMuZmlyZWQgPSB0cnVlO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX29uY2VXcmFwKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIHN0YXRlID0geyBmaXJlZDogZmFsc2UsIHdyYXBGbjogdW5kZWZpbmVkLCB0YXJnZXQ6IHRhcmdldCwgdHlwZTogdHlwZSwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gIHZhciB3cmFwcGVkID0gb25jZVdyYXBwZXIuYmluZChzdGF0ZSk7XG4gIHdyYXBwZWQubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgc3RhdGUud3JhcEZuID0gd3JhcHBlZDtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuLy8gRW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcblxuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGxpc3QgPSBldmVudHNbdHlwZV07XG4gICAgICBpZiAobGlzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8IGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0Lmxpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwb3NpdGlvbiA9IC0xO1xuXG4gICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzcGxpY2VPbmUobGlzdCwgcG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKVxuICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07XG5cbiAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBvcmlnaW5hbExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHR5cGUpIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMsIGV2ZW50cywgaTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cyk7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBsaXN0ZW5lcnMgPSBldmVudHNbdHlwZV07XG5cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTElGTyBvcmRlclxuICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuZnVuY3Rpb24gX2xpc3RlbmVycyh0YXJnZXQsIHR5cGUsIHVud3JhcCkge1xuICB2YXIgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcbiAgaWYgKGV2bGlzdGVuZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB1bndyYXAgPyBbZXZsaXN0ZW5lci5saXN0ZW5lciB8fCBldmxpc3RlbmVyXSA6IFtldmxpc3RlbmVyXTtcblxuICByZXR1cm4gdW53cmFwID9cbiAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCB0cnVlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmF3TGlzdGVuZXJzID0gZnVuY3Rpb24gcmF3TGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpO1xuICB9XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50O1xuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCh0eXBlKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG5cbiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBSZWZsZWN0T3duS2V5cyh0aGlzLl9ldmVudHMpIDogW107XG59O1xuXG5mdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikge1xuICB2YXIgY29weSA9IG5ldyBBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpXG4gICAgY29weVtpXSA9IGFycltpXTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKDsgaW5kZXggKyAxIDwgbGlzdC5sZW5ndGg7IGluZGV4KyspXG4gICAgbGlzdFtpbmRleF0gPSBsaXN0W2luZGV4ICsgMV07XG4gIGxpc3QucG9wKCk7XG59XG5cbmZ1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpIHtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyArK2kpIHtcbiAgICByZXRbaV0gPSBhcnJbaV0ubGlzdGVuZXIgfHwgYXJyW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmVyKCkge1xuICAgICAgaWYgKHR5cGVvZiBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXNvbHZlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgfTtcblxuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCByZXNvbHZlciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIGlmIChuYW1lICE9PSAnZXJyb3InKSB7XG4gICAgICBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBlcnJvckxpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgaGFuZGxlciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsICdlcnJvcicsIGhhbmRsZXIsIGZsYWdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlXG4gICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS5cbiAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZVxuICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS5cbiAgICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgbGlzdGVuZXIoYXJnKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJlbWl0dGVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEV2ZW50RW1pdHRlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGVtaXR0ZXIpO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBcImZ1bmN0aW9uIF90eXBlb2YyKG9iail7XFxcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXFxcIjtyZXR1cm4gX3R5cGVvZjI9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIFN5bWJvbCYmXFxcInN5bWJvbFxcXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24ob2JqKXtyZXR1cm4gdHlwZW9mIG9iajt9OmZ1bmN0aW9uKG9iail7cmV0dXJuIG9iaiYmXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIFN5bWJvbCYmb2JqLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZvYmohPT1TeW1ib2wucHJvdG90eXBlP1xcXCJzeW1ib2xcXFwiOnR5cGVvZiBvYmo7fSxfdHlwZW9mMihvYmopO30vLyA9PVVzZXJTY3JpcHQ9PVxcbi8vIEBuYW1lICAgICAgICAgU2F5LCBQaVxcbi8vIEBuYW1lc3BhY2UgICAgaHR0cDovL3d3dy5zYXlwaS5haS9cXG4vLyBAdmVyc2lvbiAgICAgIDEuMy44XFxuLy8gQGRlc2NyaXB0aW9uICBTcGVhayB0byBQaSB3aXRoIE9wZW5BSSdzIFdoaXNwZXJcXG4vLyBAYXV0aG9yICAgICAgIFJvc3MgQ2Fkb2dhblxcbi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly9waS5haS90YWxrXFxuLy8gQGluamVjdC1pbnRvICBwYWdlXFxuLy8gQHVwZGF0ZVVSTCAgICBodHRwczovL2FwcC5zYXlwaS5haS9zYXlwaS51c2VyLmpzXFxuLy8gQGRvd25sb2FkVVJMICBodHRwczovL2FwcC5zYXlwaS5haS9zYXlwaS51c2VyLmpzXFxuLy8gQGxpY2Vuc2UgICAgICBNSVRcXG4vLyA9PS9Vc2VyU2NyaXB0PT1cXG4vKioqKioqLyhmdW5jdGlvbigpey8vIHdlYnBhY2tCb290c3RyYXBcXG4vKioqKioqL3ZhciBfX3dlYnBhY2tfbW9kdWxlc19fPXsvKioqL1xcXCIuL3NyYy9Mb2dnaW5nTW9kdWxlLmpzXFxcIjovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXFxcXG4gICEqKiogLi9zcmMvTG9nZ2luZ01vZHVsZS5qcyAqKiohXFxuICBcXFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAvKioqL2Z1bmN0aW9uIHNyY0xvZ2dpbmdNb2R1bGVKcyhfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18pe1xcXCJ1c2Ugc3RyaWN0XFxcIjtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7LyogaGFybW9ueSBleHBvcnQgKi9fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXyx7LyogaGFybW9ueSBleHBvcnQgKi9zZXJpYWxpemVTdGF0ZVZhbHVlOmZ1bmN0aW9uIHNlcmlhbGl6ZVN0YXRlVmFsdWUoKXtyZXR1cm4oLyogYmluZGluZyAqL19zZXJpYWxpemVTdGF0ZVZhbHVlKTt9LyogaGFybW9ueSBleHBvcnQgKi99KTtmdW5jdGlvbiBfc2VyaWFsaXplU3RhdGVWYWx1ZShzdGF0ZVZhbHVlKXtpZih0eXBlb2Ygc3RhdGVWYWx1ZT09PVxcXCJzdHJpbmdcXFwiKXtyZXR1cm4gc3RhdGVWYWx1ZTt9cmV0dXJuIE9iamVjdC5rZXlzKHN0YXRlVmFsdWUpLm1hcChmdW5jdGlvbihrZXkpe3JldHVyblxcXCJcXFwiLmNvbmNhdChrZXksXFxcIjpcXFwiKS5jb25jYXQoX3NlcmlhbGl6ZVN0YXRlVmFsdWUoc3RhdGVWYWx1ZVtrZXldKSk7fSkuam9pbihcXFwiLFxcXCIpO30vKioqL30sLyoqKi9cXFwiLi9zcmMvVXNlckFnZW50TW9kdWxlLmpzXFxcIjovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcXFxcbiAgISoqKiAuL3NyYy9Vc2VyQWdlbnRNb2R1bGUuanMgKioqIVxcbiAgXFxcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAvKioqL2Z1bmN0aW9uIHNyY1VzZXJBZ2VudE1vZHVsZUpzKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyl7XFxcInVzZSBzdHJpY3RcXFwiO19fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsvKiBoYXJtb255IGV4cG9ydCAqL19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHsvKiBoYXJtb255IGV4cG9ydCAqL2FkZERldmljZUZsYWdzOmZ1bmN0aW9uIGFkZERldmljZUZsYWdzKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fYWRkRGV2aWNlRmxhZ3MpO30sLyogaGFybW9ueSBleHBvcnQgKi9hZGRVc2VyQWdlbnRGbGFnczpmdW5jdGlvbiBhZGRVc2VyQWdlbnRGbGFncygpe3JldHVybigvKiBiaW5kaW5nICovX2FkZFVzZXJBZ2VudEZsYWdzKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovYWRkVmlld0ZsYWdzOmZ1bmN0aW9uIGFkZFZpZXdGbGFncygpe3JldHVybigvKiBiaW5kaW5nICovX2FkZFZpZXdGbGFncyk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2VudGVyTW9iaWxlTW9kZTpmdW5jdGlvbiBlbnRlck1vYmlsZU1vZGUoKXtyZXR1cm4oLyogYmluZGluZyAqL19lbnRlck1vYmlsZU1vZGUpO30sLyogaGFybW9ueSBleHBvcnQgKi9leGl0TW9iaWxlTW9kZTpmdW5jdGlvbiBleGl0TW9iaWxlTW9kZSgpe3JldHVybigvKiBiaW5kaW5nICovX2V4aXRNb2JpbGVNb2RlKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovaXNNb2JpbGVEZXZpY2U6ZnVuY3Rpb24gaXNNb2JpbGVEZXZpY2UoKXtyZXR1cm4oLyogYmluZGluZyAqL19pc01vYmlsZURldmljZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2lzTW9iaWxlVmlldzpmdW5jdGlvbiBpc01vYmlsZVZpZXcoKXtyZXR1cm4oLyogYmluZGluZyAqL19pc01vYmlsZVZpZXcpO30sLyogaGFybW9ueSBleHBvcnQgKi9pc1NhZmFyaTpmdW5jdGlvbiBpc1NhZmFyaSgpe3JldHVybigvKiBiaW5kaW5nICovX2lzU2FmYXJpKTt9LyogaGFybW9ueSBleHBvcnQgKi99KTtmdW5jdGlvbiBfaXNTYWZhcmkoKXtyZXR1cm4gL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTt9ZnVuY3Rpb24gX2lzTW9iaWxlRGV2aWNlKCl7cmV0dXJuIC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8d2luZG93Lm1hdGNoTWVkaWEoXFxcIihtYXgtd2lkdGg6IDc2OHB4KVxcXCIpLm1hdGNoZXM7fS8vIHRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHNob3cgdGhlIG1vYmlsZSB2aWV3IG9yIG5vdFxcbmZ1bmN0aW9uIF9pc01vYmlsZVZpZXcoKXt2YXIgdXNlclZpZXdQcmVmZXJlbmNlPW51bGw7dHJ5e3VzZXJWaWV3UHJlZmVyZW5jZT1sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcXFwidXNlclZpZXdQcmVmZXJlbmNlXFxcIik7fWNhdGNoKGUpe2NvbnNvbGUud2FybihcXFwiQ291bGQgbm90IGFjY2VzcyBsb2NhbFN0b3JhZ2U6IFxcXCIsZSk7fXZhciBwcmVmZXJzTW9iaWxlPWZhbHNlO2lmKHVzZXJWaWV3UHJlZmVyZW5jZSl7cHJlZmVyc01vYmlsZT11c2VyVmlld1ByZWZlcmVuY2U9PT1cXFwibW9iaWxlXFxcIjt9Ly8gTWFrZSBzdXJlIGlzTW9iaWxlRGV2aWNlIGlzIGRlZmluZWQgb3IgaW1wb3J0ZWRcXG5yZXR1cm4gX2lzTW9iaWxlRGV2aWNlKCkmJnByZWZlcnNNb2JpbGU7fWZ1bmN0aW9uIF9leGl0TW9iaWxlTW9kZSgpe2xvY2FsU3RvcmFnZS5zZXRJdGVtKFxcXCJ1c2VyVmlld1ByZWZlcmVuY2VcXFwiLFxcXCJkZXNrdG9wXFxcIik7Ly8gU2F2ZSBwcmVmZXJlbmNlXFxudmFyIGVsZW1lbnQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcXFwibW9iaWxlLXZpZXdcXFwiKTtlbGVtZW50LmNsYXNzTGlzdC5hZGQoXFxcImRlc2t0b3Atdmlld1xcXCIpO31mdW5jdGlvbiBfZW50ZXJNb2JpbGVNb2RlKCl7bG9jYWxTdG9yYWdlLnNldEl0ZW0oXFxcInVzZXJWaWV3UHJlZmVyZW5jZVxcXCIsXFxcIm1vYmlsZVxcXCIpOy8vIFNhdmUgcHJlZmVyZW5jZVxcbnZhciBlbGVtZW50PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXFxcImRlc2t0b3Atdmlld1xcXCIpO2VsZW1lbnQuY2xhc3NMaXN0LmFkZChcXFwibW9iaWxlLXZpZXdcXFwiKTt9ZnVuY3Rpb24gX2FkZFVzZXJBZ2VudEZsYWdzKCl7dmFyIGlzRmlyZWZveEFuZHJvaWQ9L0ZpcmVmb3gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJi9BbmRyb2lkLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO3ZhciBlbGVtZW50PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtpZihpc0ZpcmVmb3hBbmRyb2lkKXtlbGVtZW50LmNsYXNzTGlzdC5hZGQoXFxcImZpcmVmb3gtYW5kcm9pZFxcXCIpO31fYWRkRGV2aWNlRmxhZ3MoZWxlbWVudCk7X2FkZFZpZXdGbGFncyhlbGVtZW50KTt9ZnVuY3Rpb24gX2FkZERldmljZUZsYWdzKGVsZW1lbnQpe2lmKF9pc01vYmlsZURldmljZSgpKXtlbGVtZW50LmNsYXNzTGlzdC5hZGQoXFxcIm1vYmlsZS1kZXZpY2VcXFwiKTt9fWZ1bmN0aW9uIF9hZGRWaWV3RmxhZ3MoZWxlbWVudCl7aWYoX2lzTW9iaWxlVmlldygpKXtlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXFxcImRlc2t0b3Atdmlld1xcXCIpO2VsZW1lbnQuY2xhc3NMaXN0LmFkZChcXFwibW9iaWxlLXZpZXdcXFwiKTt9ZWxzZXtlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXFxcIm1vYmlsZS12aWV3XFxcIik7ZWxlbWVudC5jbGFzc0xpc3QuYWRkKFxcXCJkZXNrdG9wLXZpZXdcXFwiKTt9fS8qKiovfSwvKioqL1xcXCIuL3NyYy9zdGF0ZS1tYWNoaW5lcy9BdWRpb0lucHV0TWFjaGluZS5qc1xcXCI6LyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcXFxcbiAgISoqKiAuL3NyYy9zdGF0ZS1tYWNoaW5lcy9BdWRpb0lucHV0TWFjaGluZS5qcyAqKiohXFxuICBcXFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqKi9mdW5jdGlvbiBzcmNTdGF0ZU1hY2hpbmVzQXVkaW9JbnB1dE1hY2hpbmVKcyhfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18pe1xcXCJ1c2Ugc3RyaWN0XFxcIjtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7LyogaGFybW9ueSBleHBvcnQgKi9fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXyx7LyogaGFybW9ueSBleHBvcnQgKi9hdWRpb0lucHV0TWFjaGluZTpmdW5jdGlvbiBhdWRpb0lucHV0TWFjaGluZSgpe3JldHVybigvKiBiaW5kaW5nICovX2F1ZGlvSW5wdXRNYWNoaW5lKTt9LyogaGFybW9ueSBleHBvcnQgKi99KTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciB4c3RhdGVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISB4c3RhdGUgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL01hY2hpbmUuanNcXFwiKTt2YXIgRXZlbnRCdXM9d2luZG93LkV2ZW50QnVzO3ZhciBhdWRpb01pbWVUeXBlPVxcXCJhdWRpby93ZWJtO2NvZGVjcz1vcHVzXFxcIjt2YXIgdGhyZXNob2xkPTEwMDA7Ly8gMTAwMCBtcyA9IDEgc2Vjb25kLCBhYm91dCB0aGUgbGVuZ3RoIG9mIFxcXCJIZXksIFBpXFxcIlxcbi8vIERlY2xhcmUgYSBnbG9iYWwgdmFyaWFibGUgZm9yIHRoZSBtZWRpYVJlY29yZGVyXFxudmFyIG1lZGlhUmVjb3JkZXI7ZnVuY3Rpb24gc2V0dXBSZWNvcmRpbmcoY2FsbGJhY2spe2lmKG1lZGlhUmVjb3JkZXIpe3JldHVybjt9Ly8gR2V0IGEgc3RyZWFtIGZyb20gdGhlIHVzZXIncyBtaWNyb3Bob25lXFxubmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe2F1ZGlvOnRydWV9KS50aGVuKGZ1bmN0aW9uKHN0cmVhbSl7aWYoIU1lZGlhUmVjb3JkZXIuaXNUeXBlU3VwcG9ydGVkKGF1ZGlvTWltZVR5cGUpKXsvLyB1c2UgTVA0IGZvciBTYWZhcmlcXG5hdWRpb01pbWVUeXBlPVxcXCJhdWRpby9tcDRcXFwiO30vLyBDcmVhdGUgYSBuZXcgTWVkaWFSZWNvcmRlciBvYmplY3QgdXNpbmcgdGhlIHN0cmVhbSBhbmQgc3BlY2lmeWluZyB0aGUgTUlNRSB0eXBlXFxudmFyIG9wdGlvbnM9e21pbWVUeXBlOmF1ZGlvTWltZVR5cGV9O21lZGlhUmVjb3JkZXI9bmV3IE1lZGlhUmVjb3JkZXIoc3RyZWFtLG9wdGlvbnMpO21lZGlhUmVjb3JkZXIuYWRkRXZlbnRMaXN0ZW5lcihcXFwiZGF0YWF2YWlsYWJsZVxcXCIsZnVuY3Rpb24oZXZlbnQpe0V2ZW50QnVzLmVtaXQoXFxcImF1ZGlvOmRhdGFhdmFpbGFibGVcXFwiLHtkYXRhOmV2ZW50LmRhdGF9KTt9KTttZWRpYVJlY29yZGVyLmFkZEV2ZW50TGlzdGVuZXIoXFxcInN0b3BcXFwiLGZ1bmN0aW9uKCl7RXZlbnRCdXMuZW1pdChcXFwiYXVkaW86aW5wdXQ6c3RvcFxcXCIpO30pO30pLnRoZW4oZnVuY3Rpb24oKXsvLyBJbnZva2UgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uXFxuaWYodHlwZW9mIGNhbGxiYWNrPT09XFxcImZ1bmN0aW9uXFxcIil7Y2FsbGJhY2soKTt9fSlbXFxcImNhdGNoXFxcIl0oZnVuY3Rpb24oZXJyKXtjb25zb2xlLmVycm9yKFxcXCJFcnJvciBnZXR0aW5nIGF1ZGlvIHN0cmVhbTogXFxcIitlcnIpO30pO31mdW5jdGlvbiB0ZWFyRG93blJlY29yZGluZygpey8vIENoZWNrIGlmIHRoZSBNZWRpYVJlY29yZGVyIGlzIHNldCB1cFxcbmlmKCFtZWRpYVJlY29yZGVyKXtyZXR1cm47fS8vIFN0b3AgYW55IG9uZ29pbmcgcmVjb3JkaW5nXFxuaWYobWVkaWFSZWNvcmRlci5zdGF0ZT09PVxcXCJyZWNvcmRpbmdcXFwiKXttZWRpYVJlY29yZGVyLnN0b3AoKTt9Ly8gQ2xlYXIgdGhlIE1lZGlhUmVjb3JkZXIgdmFyaWFibGVcXG5tZWRpYVJlY29yZGVyPW51bGw7fXZhciBfYXVkaW9JbnB1dE1hY2hpbmU9KDAseHN0YXRlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uY3JlYXRlTWFjaGluZSkoey8qKiBAeHN0YXRlLWxheW91dCBONElncGdKZzVtRE9JQzVRRU1DdUVDV0I3QWtnT3dBZFVBWEFPZ0Njd0FiTVpXU0FZbVFHTUJIVkRTZ2JRQVlCZFJLQUpaWUdZdGp5Q1FBRDBRQkdBR3dCbVVnRllBTkNBQ2VpSlhJQWNwQlFIWUFuQXRQNmwrZ0N3MmxBSmdVMkF2aTgxcE11UWlWSXQybkJoNFVBd1FXSGhncEVFQWJsZ0ExcEdlMlBoRVpQNGM1RUZRQ0RGWXpNamk0Yng4eFZMQ29vV1NTREtJcWc2YU9najZ4bkpxQ3FvOHF0YktwandPRG00ZTZNaythV3daV1F4ZzVPUlk1S1FFVkFVQVpuTUF0bjdEM3FsKzQ0SEJPWGl4K1pYRnBkWGxZaEpTc2doeXhpb2Eyb2o5cXFUOTdRLVdkbzRLZ3lCSmJhK2RLY1JpVUdoME1EbklRaUs3aEc3eUI1cUJxSWZTdERvOEhoeUhqNld6Mkp4eWY2QWxMQXZhVUNCUkNBMEJpd1lqSWNqRWFFZ1M2VkJFSUd4eUZTV2V6R0o2TmZUbVVoeVZRS1JTbWJGS1pRdElsYkVsakFMa2loZ1poelREQkduRUxBRUFCS1lIWWNHSWtDWkxPdTFWdUpnVWFpVXZRVURqNWlIRnJSc0FvNkRuc0ZtTW5SbFhqbHV3VmtDVkt2SWFwQ0VBS3lBQWd0RmtCZ2xnQWpHakcyR3NzMjFCdzhOVDZWU21KUzhsRk5PMmtHd09jdzhCUUtIaVMzT0U5d0EyV2pQMFpBTUVNQjRFTUFaVTFCQTFXcVRGVk5vRnVjamtPYU1kdnpwaHNwaUZqZ2Vpa3JVcHJReDlEWkJpcGJiYXluYTFvWERVWmo4Y1QtREt5WUhOUVFrNVVWblRlbkh6d0xiMU1KWXI1WVgxZTlJeDJhNER0SzFMWWdEQjluQ1ZTRHZJSTRxTGE5b0lKNmJ6M09ZU2pPallYVEdLS2JpMW5nV0FRSEFVakVxTUo3OXZDcVlJQUF0QW8rYkVZK3BoVWJ5UERGczRUNm9iV3VFN09DdEQwQkErSEFXeXhiNXNPTmhHRmlxaGZIaXZ4TG5XSzVmbVNXU2NTbW9Ic3VtUmlJYm1VSDlOT3c2V0gwcWlxTmlWRktCK1FMeWsySEVYS2VoRnlRNCtnT0VXdGpLZm1Ra3FIQnI2Q2RwU2lxUHB2cmZoU0dCVW1BTWxucmNTaEtCbVNsNXZlNHJUc29EaHpoV1ZiU2t4OWFTZjZGS1VFR0laK1daNTVkSmFKZ0dLRmpRTWFRdUpSWG9NV0x1NXE1a3MycllkbDI2VWdlZXRqVGxSRGk1VkJUN0dLUTFqRmZPc1ZpY3hwSkphUXY0RVArZFZzbklKYXRCWkUyZXBPV1pPRzFFMmtDMEZiNkFvVmk1bVdhRXVFQUEgKi9jb250ZXh0OnthdWRpb0RhdGFDaHVua3M6W119LGlkOlxcXCJhdWRpb0lucHV0XFxcIixpbml0aWFsOlxcXCJyZWxlYXNlZFxcXCIsc3RhdGVzOntyZWxlYXNlZDp7b246e2FjcXVpcmU6e3RhcmdldDpcXFwiYWNxdWlyaW5nXFxcIn19fSxhY3F1aXJpbmc6e2Rlc2NyaXB0aW9uOlxcXCJBY3F1aXJpbmcgdGhlIG1pY3JvcGhvbmUuIFdhaXRzIHVudGlsIGFzeW5jaHJvbm91cyBjYWxsIGhhcyBjb21wbGV0ZWQuXFxcIixpbnZva2U6e3NyYzpcXFwiYWNxdWlyZU1lZGlhUmVjb3JkZXJcXFwiLG9uRG9uZTp7dGFyZ2V0OlxcXCJhY3F1aXJlZFxcXCJ9LG9uRXJyb3I6e3RhcmdldDpcXFwicmVsZWFzZWRcXFwiLGFjdGlvbnM6XFxcImxvZ0Vycm9yXFxcIn19fSxhY3F1aXJlZDp7ZGVzY3JpcHRpb246XFxcIk1pY3JvcGhvbmUgYWNxdWlyZWQgYW5kIHJlYWR5IHRvIHN0YXJ0IHJlY29yZGluZy5cXFwiLGluaXRpYWw6XFxcImlkbGVcXFwiLHN0YXRlczp7aWRsZTp7b246e3N0YXJ0Ont0YXJnZXQ6XFxcInJlY29yZGluZ1xcXCIsYWN0aW9uczp7dHlwZTpcXFwic3RhcnRSZWNvcmRpbmdcXFwiLGNvbmQ6XFxcIm1lZGlhUmVjb3JkZXJBY3F1aXJlZFxcXCJ9fX19LHJlY29yZGluZzp7b246e3N0b3BSZXF1ZXN0ZWQ6e3RhcmdldDpcXFwicGVuZGluZ1N0b3BcXFwiLGFjdGlvbnM6e3R5cGU6XFxcInN0b3BSZWNvcmRpbmdcXFwifX0sZGF0YUF2YWlsYWJsZTp7YWN0aW9uczp7dHlwZTpcXFwiYWRkRGF0YVxcXCIscGFyYW1zOnt9fSxpbnRlcm5hbDp0cnVlfX19LHBlbmRpbmdTdG9wOntkZXNjcmlwdGlvbjpcXFwiV2FpdGluZyBmb3IgdGhlIE1lZGlhUmVjb3JkZXIgdG8gc3RvcCByZWNvcmRpbmcuXFxcIixvbjp7c3RvcDp7dGFyZ2V0OlxcXCJzdG9wcGVkXFxcIn0sZGF0YUF2YWlsYWJsZTp7YWN0aW9uczp7dHlwZTpcXFwiYWRkRGF0YVxcXCIscGFyYW1zOnt9fSxpbnRlcm5hbDp0cnVlfX19LHN0b3BwZWQ6e2VudHJ5Ont0eXBlOlxcXCJzZW5kRGF0YVxcXCIscGFyYW1zOnt9LGNvbmQ6XFxcImhhc0RhdGFcXFwifSxhbHdheXM6XFxcImlkbGVcXFwifX0sb246e3JlbGVhc2U6e3RhcmdldDpcXFwicmVsZWFzZWRcXFwiLGFjdGlvbnM6e3R5cGU6XFxcInJlbGVhc2VNZWRpYVJlY29yZGVyXFxcIn19fX19LHByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzOnRydWUscHJlc2VydmVBY3Rpb25PcmRlcjp0cnVlfSx7YWN0aW9uczp7c3RhcnRSZWNvcmRpbmc6ZnVuY3Rpb24gc3RhcnRSZWNvcmRpbmcoY29udGV4dCxldmVudCl7Ly8gQ2xlYXIgdGhlIGFycmF5IGZvciB0aGUgbmV4dCByZWNvcmRpbmdcXG5jb250ZXh0LmF1ZGlvRGF0YUNodW5rcz1bXTtjb250ZXh0LnN0YXJ0VGltZT1EYXRlLm5vdygpOy8vIFN0YXJ0IHJlY29yZGluZ1xcbm1lZGlhUmVjb3JkZXIuc3RhcnQoKTtFdmVudEJ1cy5lbWl0KFxcXCJzYXlwaTp1c2VyU3BlYWtpbmdcXFwiKTt9LHN0b3BSZWNvcmRpbmc6ZnVuY3Rpb24gc3RvcFJlY29yZGluZyhjb250ZXh0LGV2ZW50KXsvLyBUT0RPOiBkbyBJIG5lZWQgdGhpcyBzdGF0ZSBjaGVjaz9cXG5pZihtZWRpYVJlY29yZGVyJiZtZWRpYVJlY29yZGVyLnN0YXRlPT09XFxcInJlY29yZGluZ1xcXCIpey8vIFN0b3AgcmVjb3JkaW5nXFxubWVkaWFSZWNvcmRlci5zdG9wKCk7Ly8gUmVjb3JkIHRoZSBzdG9wIHRpbWUgYW5kIGNhbGN1bGF0ZSB0aGUgZHVyYXRpb25cXG52YXIgc3RvcFRpbWU9RGF0ZS5ub3coKTt2YXIgZHVyYXRpb249c3RvcFRpbWUtY29udGV4dC5zdGFydFRpbWU7RXZlbnRCdXMuZW1pdChcXFwic2F5cGk6dXNlclN0b3BwZWRTcGVha2luZ1xcXCIse2R1cmF0aW9uOmR1cmF0aW9ufSk7fX0sYWRkRGF0YTpmdW5jdGlvbiBhZGREYXRhKGNvbnRleHQsZXZlbnQpey8vIEFkZCB0aGUgbmV3IGRhdGEgdG8gdGhlIGFycmF5XFxuY29udGV4dC5hdWRpb0RhdGFDaHVua3MucHVzaChldmVudC5kYXRhKTt9LHNlbmREYXRhOmZ1bmN0aW9uIHNlbmREYXRhKGNvbnRleHQsZXZlbnQpey8vIENyZWF0ZSBhIEJsb2IgZnJvbSB0aGUgYXVkaW8gZGF0YSBjaHVua3NcXG52YXIgYXVkaW9CbG9iPW5ldyBCbG9iKGNvbnRleHQuYXVkaW9EYXRhQ2h1bmtzLHt0eXBlOm1lZGlhUmVjb3JkZXIubWltZVR5cGV9KTsvLyBHZXQgdGhlIHN0b3AgdGltZSBhbmQgY2FsY3VsYXRlIHRoZSBkdXJhdGlvblxcbnZhciBzdG9wVGltZT1EYXRlLm5vdygpO3ZhciBkdXJhdGlvbj1zdG9wVGltZS1jb250ZXh0LnN0YXJ0VGltZTsvLyBJZiB0aGUgZHVyYXRpb24gaXMgZ3JlYXRlciB0aGFuIHRoZSB0aHJlc2hvbGQsIHVwbG9hZCB0aGUgYXVkaW8gZm9yIHRyYW5zY3JpcHRpb25cXG5pZihkdXJhdGlvbj49dGhyZXNob2xkKXsvLyBVcGxvYWQgdGhlIGF1ZGlvIHRvIHRoZSBzZXJ2ZXIgZm9yIHRyYW5zY3JpcHRpb25cXG5FdmVudEJ1cy5lbWl0KFxcXCJzYXlwaTp1c2VyRmluaXNoZWRTcGVha2luZ1xcXCIse2R1cmF0aW9uOmR1cmF0aW9uLGJsb2I6YXVkaW9CbG9ifSk7fWVsc2V7Y29uc29sZS5sb2coXFxcIlJlY29yZGluZyB3YXMgdG9vIHNob3J0LCBub3QgdXBsb2FkaW5nIGZvciB0cmFuc2NyaXB0aW9uXFxcIik7fX0scmVsZWFzZU1lZGlhUmVjb3JkZXI6ZnVuY3Rpb24gcmVsZWFzZU1lZGlhUmVjb3JkZXIoY29udGV4dCxldmVudCl7dGVhckRvd25SZWNvcmRpbmcoKTt9LGxvZ0Vycm9yOmZ1bmN0aW9uIGxvZ0Vycm9yKGNvbnRleHQsZXZlbnQpe2NvbnNvbGUuZXJyb3IoXFxcIkVycm9yIGFjcXVpcmluZyBNZWRpYVJlY29yZGVyOiBcXFwiLGV2ZW50LmRhdGEpO319LHNlcnZpY2VzOnthY3F1aXJlTWVkaWFSZWNvcmRlcjpmdW5jdGlvbiBhY3F1aXJlTWVkaWFSZWNvcmRlcihjb250ZXh0LGV2ZW50LF9yZWYpe3ZhciBzZW5kPV9yZWYuc2VuZDtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpe3NldHVwUmVjb3JkaW5nKGZ1bmN0aW9uKCl7aWYobWVkaWFSZWNvcmRlcil7cmVzb2x2ZSgpO31lbHNle3JlamVjdChuZXcgRXJyb3IoXFxcIkZhaWxlZCB0byBhY3F1aXJlIE1lZGlhUmVjb3JkZXJcXFwiKSk7fX0pO30pO319LGd1YXJkczp7bWVkaWFSZWNvcmRlckFjcXVpcmVkOmZ1bmN0aW9uIG1lZGlhUmVjb3JkZXJBY3F1aXJlZChjb250ZXh0LGV2ZW50KXtyZXR1cm4gbWVkaWFSZWNvcmRlciE9PW51bGw7fSxoYXNEYXRhOmZ1bmN0aW9uIGhhc0RhdGEoY29udGV4dCxldmVudCl7cmV0dXJuIGNvbnRleHQuYXVkaW9EYXRhQ2h1bmtzLmxlbmd0aD4wO319LGRlbGF5czp7fX0pOy8qKiovfSwvKioqL1xcXCIuL3NyYy9zdGF0ZS1tYWNoaW5lcy9BdWRpb091dHB1dE1hY2hpbmUuanNcXFwiOi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxcXFxuICAhKioqIC4vc3JjL3N0YXRlLW1hY2hpbmVzL0F1ZGlvT3V0cHV0TWFjaGluZS5qcyAqKiohXFxuICBcXFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKiovZnVuY3Rpb24gc3JjU3RhdGVNYWNoaW5lc0F1ZGlvT3V0cHV0TWFjaGluZUpzKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyl7XFxcInVzZSBzdHJpY3RcXFwiO19fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsvKiBoYXJtb255IGV4cG9ydCAqL19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHsvKiBoYXJtb255IGV4cG9ydCAqL2F1ZGlvT3V0cHV0TWFjaGluZTpmdW5jdGlvbiBhdWRpb091dHB1dE1hY2hpbmUoKXtyZXR1cm4oLyogYmluZGluZyAqL19hdWRpb091dHB1dE1hY2hpbmUpO30vKiBoYXJtb255IGV4cG9ydCAqL30pOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIHhzdGF0ZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIHhzdGF0ZSAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvTWFjaGluZS5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIHhzdGF0ZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIHhzdGF0ZSAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvaW5kZXguanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfVXNlckFnZW50TW9kdWxlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vVXNlckFnZW50TW9kdWxlICovXFxcIi4vc3JjL1VzZXJBZ2VudE1vZHVsZS5qc1xcXCIpO3ZhciBFdmVudEJ1cz13aW5kb3cuRXZlbnRCdXM7dmFyIGF1ZGlvRWxlbWVudD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxcXCJhdWRpb1xcXCIpO2lmKCFhdWRpb0VsZW1lbnQpe2NvbnNvbGUuZXJyb3IoXFxcIkF1ZGlvIGVsZW1lbnQgbm90IGZvdW5kIGluIG91dHB1dCBtYWNoaW5lIVxcXCIpO312YXIgX2F1ZGlvT3V0cHV0TWFjaGluZT0oMCx4c3RhdGVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5jcmVhdGVNYWNoaW5lKSh7LyoqIEB4c3RhdGUtbGF5b3V0IE40SWdwZ0pnNW1ET0lDNVFFTUN1RUNXQjdBOHFnTGdBNEVERVlBdG9maHBBTm9BTUF1b3FJVnJCdFZnSFlzZ0NlaUFMUUJHQU93QldBRFFnQUhvaEVCT0FDektBZE1yRUEyTFFBNEFUUHEwaUpXLVFGOXpNdEpsd0ZpK05SZ2dBYk1DUmRaa0VXUG1RQW5mQVptSkJBMkRpNWVVUGtFUXdrMWFRRkVSWDFGTlhvTStoTUFabm9KWFJGc3JVdHJkR3c4SWdJMVQyOE1iaWdQTHdoSWNqQS1DR1EtWUw1d3ptd28wQmlKZlJsQkJBS0V6UHBGRFBGZGJQMWxFcEFiY3ZzcW11YUlOWDh3YjM0U1FoZGtmbTdRM3NpK0dKRXNyUVRzbWJORXNkVHN5YkVERDd5Q291WFZ1MHFqazJrRFVSeE9kUWFoRFFzREFaMVk3RDZQQ3V5U005MFVJbjBHS015bStvMFFxbjBhaTBDMCt1bStoV0tWaFdaUUJEbXFUUkJZUDRFTEkzQzJjTENDTXUwUlJkd2tEd3hXSzBPUHllSVE0bm9hbjBFZysraSsrVUsrVCtOSXFkT0IyeVpMSUF4c2h1RXo4QUFMZnhZVkJRQTBjaTc5WkVJUlF5dFJpYlRUZWhhUExaYkx6TVhETVQyM1F6QjFraFctS24tVlViQmthNDdNK29rQzFjcTA4bTJvLW5vekdHWVc0cElJQjUzWW42VW5rb09sV3lob0hoMEhReUNIU094aUx4d1lLTExxSXBpUlptYkVac2JaWlM2TlNGUE55Z00tU2xGdGFBK25lUmtWaUFrWGFiR3VJZ1p5QlI1bnRpRzZLUlJ0OU9pelBLVzMyaVN6ZmtGaVRLNHZyVXNUN1pnTm1WbUZnQURXZENZUFRqU0lUcGo1WW5vMlF4ejBRUlNFbjItcjBHSXlqaU9JbGhVdHdXRE5QQW9RaGhlcjYxdSs5WUlFSVdoaWtJUmlFcWV3WXFoZVRpdUdBeUVMdGF5Z2pKbTJodktrSWg2RW9MYmRqK1o2am1xVFFRcVIzSm9YUnZyMmlJTnd5a1lKaG1HS3ZHSGtlSHlIcm91aktIaEk2MG1HVjZjWFdTNnhCSWFUSnM2MHFpWVNraGZIdStoRk82aWdzUXBsNWJEc2V3UUdNOElvWXVNUVVlb21sUEdLK2haRVNDd2dXQkVGaUtaSmJqaFptcjFNcHFHcVZvaWlycW9Nbk9xNjdyWkdLQ3pxSDIrYUJzTzFMbm1PNnJscWdNSVFDRjlrS0FKUkxpSzJhWWlyb0NYZ2U4S1ZEbjVoRlpUZVd6NWRhdVRlczUybVpoSWRxNWpWRkpRZVlRQSAqL2lkOlxcXCJhdWRpb091dHB1dFxcXCIsY29udGV4dDp7YXV0b3BsYXk6ZmFsc2UsYXVkaW9FbGVtZW50OmF1ZGlvRWxlbWVudH0saW5pdGlhbDpcXFwiaWRsZVxcXCIsc3RhdGVzOntpZGxlOntvbjp7bG9hZHN0YXJ0OlxcXCJsb2FkaW5nXFxcIn19LGxvYWRpbmc6e29uOntsb2FkZWRtZXRhZGF0YTpcXFwibG9hZGVkXFxcIn19LGxvYWRlZDp7aW5pdGlhbDpcXFwicmVhZHlcXFwiLG9uOntlbXB0aWVkOlxcXCJpZGxlXFxcIn0sc3RhdGVzOntyZWFkeTp7ZGVzY3JpcHRpb246XFxcIkF1ZGlvIGhhcyBsb2FkZWQgYW5kIGlzIHJlYWR5IHRvIHN0YXJ0IHBsYXlpbmcgKGZ1cnRoZXIgYnVmZmVyaW5nIG1heSBiZSByZXF1aXJlZCB0byByZWFjaCB0aGUgZW5kKS5cXFwiLG9uOntwbGF5OlxcXCJwbGF5aW5nXFxcIn0sZW50cnk6e3R5cGU6XFxcImVtaXRFdmVudFxcXCIscGFyYW1zOntldmVudE5hbWU6XFxcInNheXBpOnJlYWR5XFxcIn19fSxwbGF5aW5nOntvbjp7cGF1c2U6XFxcInBhdXNlZFxcXCIsZW5kZWQ6XFxcImVuZGVkXFxcIixjYW5wbGF5dGhyb3VnaDp7dGFyZ2V0OlxcXCJwbGF5aW5nXFxcIixpbnRlcm5hbDp0cnVlfX0sYWx3YXlzOnt0YXJnZXQ6XFxcInBhdXNlZFxcXCIsY29uZDpcXFwiaXNTYWZhcmlBdXRvUGxheVxcXCIsYWN0aW9uczpbXFxcInJlcXVlc3RQYXVzZVxcXCIse3R5cGU6XFxcImVtaXRFdmVudFxcXCIscGFyYW1zOntldmVudE5hbWU6XFxcInNheXBpOnNhZmFyaUJsb2NrZWRcXFwifX1dfSxlbnRyeTpbe3R5cGU6XFxcImVtaXRFdmVudFxcXCIscGFyYW1zOntldmVudE5hbWU6XFxcInNheXBpOnBpU3BlYWtpbmdcXFwifX1dLGV4aXQ6W3t0eXBlOlxcXCJlbWl0RXZlbnRcXFwiLHBhcmFtczp7ZXZlbnROYW1lOlxcXCJzYXlwaTpwaVN0b3BwZWRTcGVha2luZ1xcXCJ9fSwoMCx4c3RhdGVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5hc3NpZ24pKHthdXRvcGxheTp0cnVlLGF1ZGlvRWxlbWVudDpmdW5jdGlvbiBhdWRpb0VsZW1lbnQoY29udGV4dCl7cmV0dXJuIGNvbnRleHQuYXVkaW9FbGVtZW50O319KV19LHBhdXNlZDp7b246e3BsYXk6XFxcInBsYXlpbmdcXFwiLHJlbG9hZDp7dGFyZ2V0OlxcXCIjYXVkaW9PdXRwdXQubG9hZGluZ1xcXCIsZGVzY3JpcHRpb246XFxcIlJlbG9hZCB0aGUgYXVkaW8gc3RyZWFtIGZvciBTYWZhcmkuIFRoaXMgaXMgdGhlIG9ubHkgY29tbWFuZCB0aGF0IGV4dGVybmFsIG1vZHVsZXMgY2FuIHNlbmQgdGhlIG1hY2hpbmUuXFxcIixhY3Rpb25zOlsoMCx4c3RhdGVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5hc3NpZ24pKGZ1bmN0aW9uKGNvbnRleHQpe3JldHVybnthdXRvcGxheTpmYWxzZSxhdWRpb0VsZW1lbnQ6Y29udGV4dC5hdWRpb0VsZW1lbnR9O30pLFxcXCJyZXF1ZXN0UmVsb2FkXFxcIl0sY29uZDpcXFwiaXNTYWZhcmlcXFwifX19LGVuZGVkOntvbjp7c2Vla2VkOnt0YXJnZXQ6XFxcIiNhdWRpb091dHB1dC5sb2FkZWQucmVhZHlcXFwiLGRlc2NyaXB0aW9uOlxcXCJBbiBlbmRlZCB0cmFjayBpcyBzZWVrZWQgYmFjayB0byBlYXJsaWVyIGluIHRoZSB0cmFjay5cXFwifX0sZW50cnk6W3t0eXBlOlxcXCJlbWl0RXZlbnRcXFwiLHBhcmFtczp7ZXZlbnROYW1lOlxcXCJzYXlwaTpwaUZpbmlzaGVkU3BlYWtpbmdcXFwifX1dfX19fSxwcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50czp0cnVlLHByZXNlcnZlQWN0aW9uT3JkZXI6dHJ1ZX0se2FjdGlvbnM6e2VtaXRFdmVudDpmdW5jdGlvbiBlbWl0RXZlbnQoY29udGV4dCxldmVudCxfcmVmKXt2YXIgYWN0aW9uPV9yZWYuYWN0aW9uO0V2ZW50QnVzLmVtaXQoYWN0aW9uLnBhcmFtcy5ldmVudE5hbWUpO30scmVxdWVzdFBhdXNlOmZ1bmN0aW9uIHJlcXVlc3RQYXVzZShjb250ZXh0LGV2ZW50KXtjb250ZXh0LmF1ZGlvRWxlbWVudC5wYXVzZSgpO30sc2Vla1RvRW5kOmZ1bmN0aW9uIHNlZWtUb0VuZChjb250ZXh0LGV2ZW50KXt2YXIgYXVkaW89Y29udGV4dC5hdWRpb0VsZW1lbnQ7aWYoYXVkaW8uZHVyYXRpb24mJiFhdWRpby5lbmRlZCYmYXVkaW8uY3VycmVudFRpbWU8YXVkaW8uZHVyYXRpb24pe2F1ZGlvLmN1cnJlbnRUaW1lPWF1ZGlvLmR1cmF0aW9uOy8vIHNlZWsgdGhlIGF1ZGlvIHRvIHRoZSBlbmRcXG5hdWRpby5wbGF5KCk7Ly8gdHJpZ2dlciB0aGUgZW5kZWQgZXZlbnRcXG59RXZlbnRCdXMuZW1pdChcXFwic2F5cGk6cGlGaW5pc2hlZFNwZWFraW5nXFxcIik7fSxyZXF1ZXN0UmVsb2FkOmZ1bmN0aW9uIHJlcXVlc3RSZWxvYWQoY29udGV4dCl7dmFyIGF1ZGlvPWNvbnRleHQuYXVkaW9FbGVtZW50O2F1ZGlvLmxvYWQoKTthdWRpby5wbGF5KCk7fX0sZ3VhcmRzOntpc1NhZmFyaTpmdW5jdGlvbiBpc1NhZmFyaShjb250ZXh0LGV2ZW50KXtyZXR1cm4oMCxfVXNlckFnZW50TW9kdWxlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNTYWZhcmkpKCk7fSxpc1NhZmFyaUF1dG9QbGF5OmZ1bmN0aW9uIGlzU2FmYXJpQXV0b1BsYXkoY29udGV4dCxldmVudCl7cmV0dXJuKDAsX1VzZXJBZ2VudE1vZHVsZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmlzU2FmYXJpKSgpJiZjb250ZXh0LmF1dG9wbGF5O319fSk7LyoqKi99LC8qKiovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9BY3Rvci5qc1xcXCI6LyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXFxcXG4gICEqKiogLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL0FjdG9yLmpzICoqKiFcXG4gIFxcXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqKi9mdW5jdGlvbiBub2RlX21vZHVsZXNYc3RhdGVFc0FjdG9ySnMoX191bnVzZWRfd2VicGFja19tb2R1bGUsX193ZWJwYWNrX2V4cG9ydHNfXyxfX3dlYnBhY2tfcmVxdWlyZV9fKXtcXFwidXNlIHN0cmljdFxcXCI7X193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOy8qIGhhcm1vbnkgZXhwb3J0ICovX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sey8qIGhhcm1vbnkgZXhwb3J0ICovY3JlYXRlRGVmZXJyZWRBY3RvcjpmdW5jdGlvbiBjcmVhdGVEZWZlcnJlZEFjdG9yKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fY3JlYXRlRGVmZXJyZWRBY3Rvcik7fSwvKiBoYXJtb255IGV4cG9ydCAqL2NyZWF0ZUludm9jYWJsZUFjdG9yOmZ1bmN0aW9uIGNyZWF0ZUludm9jYWJsZUFjdG9yKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fY3JlYXRlSW52b2NhYmxlQWN0b3IpO30sLyogaGFybW9ueSBleHBvcnQgKi9jcmVhdGVOdWxsQWN0b3I6ZnVuY3Rpb24gY3JlYXRlTnVsbEFjdG9yKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fY3JlYXRlTnVsbEFjdG9yKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovaXNBY3RvcjpmdW5jdGlvbiBpc0FjdG9yKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9faXNBY3Rvcik7fSwvKiBoYXJtb255IGV4cG9ydCAqL2lzU3Bhd25lZEFjdG9yOmZ1bmN0aW9uIGlzU3Bhd25lZEFjdG9yKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9faXNTcGF3bmVkQWN0b3IpO30sLyogaGFybW9ueSBleHBvcnQgKi90b0FjdG9yUmVmOmZ1bmN0aW9uIHRvQWN0b3JSZWYoKXtyZXR1cm4oLyogYmluZGluZyAqL190b0FjdG9yUmVmKTt9LyogaGFybW9ueSBleHBvcnQgKi99KTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vX3ZpcnR1YWwvX3RzbGliLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9fdmlydHVhbC9fdHNsaWIuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3V0aWxzLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy91dGlscy5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9zZXJ2aWNlU2NvcGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3NlcnZpY2VTY29wZS5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvc2VydmljZVNjb3BlLmpzXFxcIik7ZnVuY3Rpb24gX2NyZWF0ZU51bGxBY3RvcihpZCl7dmFyIF9hO3JldHVybiBfYT17aWQ6aWQsc2VuZDpmdW5jdGlvbiBzZW5kKCl7cmV0dXJuIHZvaWQgMDt9LHN1YnNjcmliZTpmdW5jdGlvbiBzdWJzY3JpYmUoKXtyZXR1cm57dW5zdWJzY3JpYmU6ZnVuY3Rpb24gdW5zdWJzY3JpYmUoKXtyZXR1cm4gdm9pZCAwO319O30sZ2V0U25hcHNob3Q6ZnVuY3Rpb24gZ2V0U25hcHNob3QoKXtyZXR1cm4gdW5kZWZpbmVkO30sdG9KU09OOmZ1bmN0aW9uIHRvSlNPTigpe3JldHVybntpZDppZH07fX0sX2FbX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uc3ltYm9sT2JzZXJ2YWJsZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpczt9LF9hO30vKipcXHJcXG4gKiBDcmVhdGVzIGEgZGVmZXJyZWQgYWN0b3IgdGhhdCBpcyBhYmxlIHRvIGJlIGludm9rZWQgZ2l2ZW4gdGhlIHByb3ZpZGVkXFxyXFxuICogaW52b2NhdGlvbiBpbmZvcm1hdGlvbiBpbiBpdHMgYC5tZXRhYCB2YWx1ZS5cXHJcXG4gKlxcclxcbiAqIEBwYXJhbSBpbnZva2VEZWZpbml0aW9uIFRoZSBtZXRhIGluZm9ybWF0aW9uIG5lZWRlZCB0byBpbnZva2UgdGhlIGFjdG9yLlxcclxcbiAqL2Z1bmN0aW9uIF9jcmVhdGVJbnZvY2FibGVBY3RvcihpbnZva2VEZWZpbml0aW9uLG1hY2hpbmUsY29udGV4dCxfZXZlbnQpe3ZhciBfYTt2YXIgaW52b2tlU3JjPSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvSW52b2tlU291cmNlKShpbnZva2VEZWZpbml0aW9uLnNyYyk7dmFyIHNlcnZpY2VDcmVhdG9yPShfYT1tYWNoaW5lPT09bnVsbHx8bWFjaGluZT09PXZvaWQgMD92b2lkIDA6bWFjaGluZS5vcHRpb25zLnNlcnZpY2VzKT09PW51bGx8fF9hPT09dm9pZCAwP3ZvaWQgMDpfYVtpbnZva2VTcmMudHlwZV07dmFyIHJlc29sdmVkRGF0YT1pbnZva2VEZWZpbml0aW9uLmRhdGE/KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ubWFwQ29udGV4dCkoaW52b2tlRGVmaW5pdGlvbi5kYXRhLGNvbnRleHQsX2V2ZW50KTp1bmRlZmluZWQ7dmFyIHRlbXBBY3Rvcj1zZXJ2aWNlQ3JlYXRvcj9fY3JlYXRlRGVmZXJyZWRBY3RvcihzZXJ2aWNlQ3JlYXRvcixpbnZva2VEZWZpbml0aW9uLmlkLHJlc29sdmVkRGF0YSk6X2NyZWF0ZU51bGxBY3RvcihpbnZva2VEZWZpbml0aW9uLmlkKTsvLyBAdHMtaWdub3JlXFxudGVtcEFjdG9yLm1ldGE9aW52b2tlRGVmaW5pdGlvbjtyZXR1cm4gdGVtcEFjdG9yO31mdW5jdGlvbiBfY3JlYXRlRGVmZXJyZWRBY3RvcihlbnRpdHksaWQsZGF0YSl7dmFyIHRlbXBBY3Rvcj1fY3JlYXRlTnVsbEFjdG9yKGlkKTsvLyBAdHMtaWdub3JlXFxudGVtcEFjdG9yLmRlZmVycmVkPXRydWU7aWYoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNNYWNoaW5lKShlbnRpdHkpKXsvLyBcXFwibXV0ZVxcXCIgdGhlIGV4aXN0aW5nIHNlcnZpY2Ugc2NvcGUgc28gcG90ZW50aWFsIHNwYXduZWQgYWN0b3JzIHdpdGhpbiB0aGUgYC5pbml0aWFsU3RhdGVgIHN0YXkgZGVmZXJyZWQgaGVyZVxcbnZhciBpbml0aWFsU3RhdGVfMT10ZW1wQWN0b3Iuc3RhdGU9KDAsX3NlcnZpY2VTY29wZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLnByb3ZpZGUpKHVuZGVmaW5lZCxmdW5jdGlvbigpe3JldHVybihkYXRhP2VudGl0eS53aXRoQ29udGV4dChkYXRhKTplbnRpdHkpLmluaXRpYWxTdGF0ZTt9KTt0ZW1wQWN0b3IuZ2V0U25hcHNob3Q9ZnVuY3Rpb24oKXtyZXR1cm4gaW5pdGlhbFN0YXRlXzE7fTt9cmV0dXJuIHRlbXBBY3Rvcjt9ZnVuY3Rpb24gX2lzQWN0b3IoaXRlbSl7dHJ5e3JldHVybiB0eXBlb2YgaXRlbS5zZW5kPT09J2Z1bmN0aW9uJzt9Y2F0Y2goZSl7cmV0dXJuIGZhbHNlO319ZnVuY3Rpb24gX2lzU3Bhd25lZEFjdG9yKGl0ZW0pe3JldHVybiBfaXNBY3RvcihpdGVtKSYmJ2lkJ2luIGl0ZW07fS8vIFRPRE86IHJlZmFjdG9yIHRoZSByZXR1cm4gdHlwZSwgdGhpcyBjb3VsZCBiZSB3cml0dGVuIGluIGEgYmV0dGVyIHdheSBidXQgaXQncyBiZXN0IHRvIGF2b2lkIHVubmVjY2Vzc2FyeSBicmVha2luZyBjaGFuZ2VzIG5vd1xcbmZ1bmN0aW9uIF90b0FjdG9yUmVmKGFjdG9yUmVmTGlrZSl7dmFyIF9hO3JldHVybigwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKChfYT17c3Vic2NyaWJlOmZ1bmN0aW9uIHN1YnNjcmliZSgpe3JldHVybnt1bnN1YnNjcmliZTpmdW5jdGlvbiB1bnN1YnNjcmliZSgpe3JldHVybiB2b2lkIDA7fX07fSxpZDonYW5vbnltb3VzJyxnZXRTbmFwc2hvdDpmdW5jdGlvbiBnZXRTbmFwc2hvdCgpe3JldHVybiB1bmRlZmluZWQ7fX0sX2FbX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uc3ltYm9sT2JzZXJ2YWJsZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpczt9LF9hKSxhY3RvclJlZkxpa2UpO30vKioqL30sLyoqKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL01hY2hpbmUuanNcXFwiOi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXFxcXG4gICEqKiogLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL01hY2hpbmUuanMgKioqIVxcbiAgXFxcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKiovZnVuY3Rpb24gbm9kZV9tb2R1bGVzWHN0YXRlRXNNYWNoaW5lSnMoX191bnVzZWRfd2VicGFja19tb2R1bGUsX193ZWJwYWNrX2V4cG9ydHNfXyxfX3dlYnBhY2tfcmVxdWlyZV9fKXtcXFwidXNlIHN0cmljdFxcXCI7X193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOy8qIGhhcm1vbnkgZXhwb3J0ICovX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sey8qIGhhcm1vbnkgZXhwb3J0ICovTWFjaGluZTpmdW5jdGlvbiBNYWNoaW5lKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fTWFjaGluZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2NyZWF0ZU1hY2hpbmU6ZnVuY3Rpb24gY3JlYXRlTWFjaGluZSgpe3JldHVybigvKiBiaW5kaW5nICovX2NyZWF0ZU1hY2hpbmUpO30vKiBoYXJtb255IGV4cG9ydCAqL30pOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9TdGF0ZU5vZGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL1N0YXRlTm9kZS5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvU3RhdGVOb2RlLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX2Vudmlyb25tZW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9lbnZpcm9ubWVudC5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvZW52aXJvbm1lbnQuanNcXFwiKTt2YXIgd2FybmVkPWZhbHNlO2Z1bmN0aW9uIF9NYWNoaW5lKGNvbmZpZyxvcHRpb25zLGluaXRpYWxDb250ZXh0KXtpZihpbml0aWFsQ29udGV4dD09PXZvaWQgMCl7aW5pdGlhbENvbnRleHQ9Y29uZmlnLmNvbnRleHQ7fXJldHVybiBuZXcgX1N0YXRlTm9kZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLlN0YXRlTm9kZShjb25maWcsb3B0aW9ucyxpbml0aWFsQ29udGV4dCk7fWZ1bmN0aW9uIF9jcmVhdGVNYWNoaW5lKGNvbmZpZyxvcHRpb25zKXtpZighX2Vudmlyb25tZW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uSVNfUFJPRFVDVElPTiYmISgncHJlZGljdGFibGVBY3Rpb25Bcmd1bWVudHMnaW4gY29uZmlnKSYmIXdhcm5lZCl7d2FybmVkPXRydWU7Y29uc29sZS53YXJuKCdJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gc2V0IGBwcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50c2AgdG8gYHRydWVgIHdoZW4gdXNpbmcgYGNyZWF0ZU1hY2hpbmVgLiBodHRwczovL3hzdGF0ZS5qcy5vcmcvZG9jcy9ndWlkZXMvYWN0aW9ucy5odG1sJyk7fXJldHVybiBuZXcgX1N0YXRlTm9kZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLlN0YXRlTm9kZShjb25maWcsb3B0aW9ucyk7fS8qKiovfSwvKioqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvU3RhdGUuanNcXFwiOi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxcXFxuICAhKioqIC4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9TdGF0ZS5qcyAqKiohXFxuICBcXFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKiovZnVuY3Rpb24gbm9kZV9tb2R1bGVzWHN0YXRlRXNTdGF0ZUpzKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyl7XFxcInVzZSBzdHJpY3RcXFwiO19fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsvKiBoYXJtb255IGV4cG9ydCAqL19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHsvKiBoYXJtb255IGV4cG9ydCAqL1N0YXRlOmZ1bmN0aW9uIFN0YXRlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fU3RhdGUpO30sLyogaGFybW9ueSBleHBvcnQgKi9iaW5kQWN0aW9uVG9TdGF0ZTpmdW5jdGlvbiBiaW5kQWN0aW9uVG9TdGF0ZSgpe3JldHVybigvKiBiaW5kaW5nICovX2JpbmRBY3Rpb25Ub1N0YXRlKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovaXNTdGF0ZTpmdW5jdGlvbiBpc1N0YXRlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9faXNTdGF0ZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2lzU3RhdGVDb25maWc6ZnVuY3Rpb24gaXNTdGF0ZUNvbmZpZygpe3JldHVybigvKiBiaW5kaW5nICovX2lzU3RhdGVDb25maWcpO30sLyogaGFybW9ueSBleHBvcnQgKi9zdGF0ZVZhbHVlc0VxdWFsOmZ1bmN0aW9uIHN0YXRlVmFsdWVzRXF1YWwoKXtyZXR1cm4oLyogYmluZGluZyAqL19zdGF0ZVZhbHVlc0VxdWFsKTt9LyogaGFybW9ueSBleHBvcnQgKi99KTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vX3ZpcnR1YWwvX3RzbGliLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9fdmlydHVhbC9fdHNsaWIuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfY29uc3RhbnRzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9jb25zdGFudHMuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2NvbnN0YW50cy5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vdXRpbHMuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3V0aWxzLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX3N0YXRlVXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3N0YXRlVXRpbHMuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3N0YXRlVXRpbHMuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vYWN0aW9ucy5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvYWN0aW9ucy5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9lbnZpcm9ubWVudF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZW52aXJvbm1lbnQuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2Vudmlyb25tZW50LmpzXFxcIik7ZnVuY3Rpb24gX3N0YXRlVmFsdWVzRXF1YWwoYSxiKXtpZihhPT09Yil7cmV0dXJuIHRydWU7fWlmKGE9PT11bmRlZmluZWR8fGI9PT11bmRlZmluZWQpe3JldHVybiBmYWxzZTt9aWYoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNTdHJpbmcpKGEpfHwoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc1N0cmluZykoYikpe3JldHVybiBhPT09Yjt9dmFyIGFLZXlzPU9iamVjdC5rZXlzKGEpO3ZhciBiS2V5cz1PYmplY3Qua2V5cyhiKTtyZXR1cm4gYUtleXMubGVuZ3RoPT09YktleXMubGVuZ3RoJiZhS2V5cy5ldmVyeShmdW5jdGlvbihrZXkpe3JldHVybiBfc3RhdGVWYWx1ZXNFcXVhbChhW2tleV0sYltrZXldKTt9KTt9ZnVuY3Rpb24gX2lzU3RhdGVDb25maWcoc3RhdGUpe2lmKF90eXBlb2YyKHN0YXRlKSE9PSdvYmplY3QnfHxzdGF0ZT09PW51bGwpe3JldHVybiBmYWxzZTt9cmV0dXJuJ3ZhbHVlJ2luIHN0YXRlJiYnX2V2ZW50J2luIHN0YXRlO30vKipcXHJcXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGlzU3RhdGVDb25maWcob2JqZWN0KWAgb3IgYHN0YXRlIGluc3RhbmNlb2YgU3RhdGVgIGluc3RlYWQuXFxyXFxuICovdmFyIF9pc1N0YXRlPV9pc1N0YXRlQ29uZmlnO2Z1bmN0aW9uIF9iaW5kQWN0aW9uVG9TdGF0ZShhY3Rpb24sc3RhdGUpe3ZhciBleGVjPWFjdGlvbi5leGVjO3ZhciBib3VuZEFjdGlvbj0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLl9fYXNzaWduKSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLl9fYXNzaWduKSh7fSxhY3Rpb24pLHtleGVjOmV4ZWMhPT11bmRlZmluZWQ/ZnVuY3Rpb24oKXtyZXR1cm4gZXhlYyhzdGF0ZS5jb250ZXh0LHN0YXRlLmV2ZW50LHthY3Rpb246YWN0aW9uLHN0YXRlOnN0YXRlLF9ldmVudDpzdGF0ZS5fZXZlbnR9KTt9OnVuZGVmaW5lZH0pO3JldHVybiBib3VuZEFjdGlvbjt9dmFyIF9TdGF0ZT0vKiNfX1BVUkVfXyovIC8qKiBAY2xhc3MgKi9mdW5jdGlvbigpey8qKlxcclxcbiAgICogQ3JlYXRlcyBhIG5ldyBTdGF0ZSBpbnN0YW5jZS5cXHJcXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RhdGUgdmFsdWVcXHJcXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBleHRlbmRlZCBzdGF0ZVxcclxcbiAgICogQHBhcmFtIGhpc3RvcnlWYWx1ZSBUaGUgdHJlZSByZXByZXNlbnRpbmcgaGlzdG9yaWNhbCB2YWx1ZXMgb2YgdGhlIHN0YXRlIG5vZGVzXFxyXFxuICAgKiBAcGFyYW0gaGlzdG9yeSBUaGUgcHJldmlvdXMgc3RhdGVcXHJcXG4gICAqIEBwYXJhbSBhY3Rpb25zIEFuIGFycmF5IG9mIGFjdGlvbiBvYmplY3RzIHRvIGV4ZWN1dGUgYXMgc2lkZS1lZmZlY3RzXFxyXFxuICAgKiBAcGFyYW0gYWN0aXZpdGllcyBBIG1hcHBpbmcgb2YgYWN0aXZpdGllcyBhbmQgd2hldGhlciB0aGV5IGFyZSBzdGFydGVkIChgdHJ1ZWApIG9yIHN0b3BwZWQgKGBmYWxzZWApLlxcclxcbiAgICogQHBhcmFtIG1ldGFcXHJcXG4gICAqIEBwYXJhbSBldmVudHMgSW50ZXJuYWwgZXZlbnQgcXVldWUuIFNob3VsZCBiZSBlbXB0eSB3aXRoIHJ1bi10by1jb21wbGV0aW9uIHNlbWFudGljcy5cXHJcXG4gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uXFxyXFxuICAgKi9mdW5jdGlvbiBTdGF0ZShjb25maWcpe3ZhciBfdGhpcz10aGlzO3ZhciBfYTt0aGlzLmFjdGlvbnM9W107dGhpcy5hY3Rpdml0aWVzPV9jb25zdGFudHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5FTVBUWV9BQ1RJVklUWV9NQVA7dGhpcy5tZXRhPXt9O3RoaXMuZXZlbnRzPVtdO3RoaXMudmFsdWU9Y29uZmlnLnZhbHVlO3RoaXMuY29udGV4dD1jb25maWcuY29udGV4dDt0aGlzLl9ldmVudD1jb25maWcuX2V2ZW50O3RoaXMuX3Nlc3Npb25pZD1jb25maWcuX3Nlc3Npb25pZDt0aGlzLmV2ZW50PXRoaXMuX2V2ZW50LmRhdGE7dGhpcy5oaXN0b3J5VmFsdWU9Y29uZmlnLmhpc3RvcnlWYWx1ZTt0aGlzLmhpc3Rvcnk9Y29uZmlnLmhpc3Rvcnk7dGhpcy5hY3Rpb25zPWNvbmZpZy5hY3Rpb25zfHxbXTt0aGlzLmFjdGl2aXRpZXM9Y29uZmlnLmFjdGl2aXRpZXN8fF9jb25zdGFudHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5FTVBUWV9BQ1RJVklUWV9NQVA7dGhpcy5tZXRhPSgwLF9zdGF0ZVV0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uZ2V0TWV0YSkoY29uZmlnLmNvbmZpZ3VyYXRpb24pO3RoaXMuZXZlbnRzPWNvbmZpZy5ldmVudHN8fFtdO3RoaXMubWF0Y2hlcz10aGlzLm1hdGNoZXMuYmluZCh0aGlzKTt0aGlzLnRvU3RyaW5ncz10aGlzLnRvU3RyaW5ncy5iaW5kKHRoaXMpO3RoaXMuY29uZmlndXJhdGlvbj1jb25maWcuY29uZmlndXJhdGlvbjt0aGlzLnRyYW5zaXRpb25zPWNvbmZpZy50cmFuc2l0aW9uczt0aGlzLmNoaWxkcmVuPWNvbmZpZy5jaGlsZHJlbjt0aGlzLmRvbmU9ISFjb25maWcuZG9uZTt0aGlzLnRhZ3M9KF9hPUFycmF5LmlzQXJyYXkoY29uZmlnLnRhZ3MpP25ldyBTZXQoY29uZmlnLnRhZ3MpOmNvbmZpZy50YWdzKSE9PW51bGwmJl9hIT09dm9pZCAwP19hOm5ldyBTZXQoKTt0aGlzLm1hY2hpbmU9Y29uZmlnLm1hY2hpbmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsJ25leHRFdmVudHMnLHtnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuKDAsX3N0YXRlVXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5uZXh0RXZlbnRzKShfdGhpcy5jb25maWd1cmF0aW9uKTt9fSk7fS8qKlxcclxcbiAgICogQ3JlYXRlcyBhIG5ldyBTdGF0ZSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIGBzdGF0ZVZhbHVlYCBhbmQgYGNvbnRleHRgLlxcclxcbiAgICogQHBhcmFtIHN0YXRlVmFsdWVcXHJcXG4gICAqIEBwYXJhbSBjb250ZXh0XFxyXFxuICAgKi9TdGF0ZS5mcm9tPWZ1bmN0aW9uKHN0YXRlVmFsdWUsY29udGV4dCl7aWYoc3RhdGVWYWx1ZSBpbnN0YW5jZW9mIFN0YXRlKXtpZihzdGF0ZVZhbHVlLmNvbnRleHQhPT1jb250ZXh0KXtyZXR1cm4gbmV3IFN0YXRlKHt2YWx1ZTpzdGF0ZVZhbHVlLnZhbHVlLGNvbnRleHQ6Y29udGV4dCxfZXZlbnQ6c3RhdGVWYWx1ZS5fZXZlbnQsX3Nlc3Npb25pZDpudWxsLGhpc3RvcnlWYWx1ZTpzdGF0ZVZhbHVlLmhpc3RvcnlWYWx1ZSxoaXN0b3J5OnN0YXRlVmFsdWUuaGlzdG9yeSxhY3Rpb25zOltdLGFjdGl2aXRpZXM6c3RhdGVWYWx1ZS5hY3Rpdml0aWVzLG1ldGE6e30sZXZlbnRzOltdLGNvbmZpZ3VyYXRpb246W10sdHJhbnNpdGlvbnM6W10sY2hpbGRyZW46e319KTt9cmV0dXJuIHN0YXRlVmFsdWU7fXZhciBfZXZlbnQ9X2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5pbml0RXZlbnQ7cmV0dXJuIG5ldyBTdGF0ZSh7dmFsdWU6c3RhdGVWYWx1ZSxjb250ZXh0OmNvbnRleHQsX2V2ZW50Ol9ldmVudCxfc2Vzc2lvbmlkOm51bGwsaGlzdG9yeVZhbHVlOnVuZGVmaW5lZCxoaXN0b3J5OnVuZGVmaW5lZCxhY3Rpb25zOltdLGFjdGl2aXRpZXM6dW5kZWZpbmVkLG1ldGE6dW5kZWZpbmVkLGV2ZW50czpbXSxjb25maWd1cmF0aW9uOltdLHRyYW5zaXRpb25zOltdLGNoaWxkcmVuOnt9fSk7fTsvKipcXHJcXG4gICAqIENyZWF0ZXMgYSBuZXcgU3RhdGUgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBgY29uZmlnYC5cXHJcXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIHN0YXRlIGNvbmZpZ1xcclxcbiAgICovU3RhdGUuY3JlYXRlPWZ1bmN0aW9uKGNvbmZpZyl7cmV0dXJuIG5ldyBTdGF0ZShjb25maWcpO307LyoqXFxyXFxuICAgKiBDcmVhdGVzIGEgbmV3IGBTdGF0ZWAgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBgc3RhdGVWYWx1ZWAgYW5kIGBjb250ZXh0YCB3aXRoIG5vIGFjdGlvbnMgKHNpZGUtZWZmZWN0cykuXFxyXFxuICAgKiBAcGFyYW0gc3RhdGVWYWx1ZVxcclxcbiAgICogQHBhcmFtIGNvbnRleHRcXHJcXG4gICAqL1N0YXRlLmluZXJ0PWZ1bmN0aW9uKHN0YXRlVmFsdWUsY29udGV4dCl7aWYoc3RhdGVWYWx1ZSBpbnN0YW5jZW9mIFN0YXRlKXtpZighc3RhdGVWYWx1ZS5hY3Rpb25zLmxlbmd0aCl7cmV0dXJuIHN0YXRlVmFsdWU7fXZhciBfZXZlbnQ9X2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5pbml0RXZlbnQ7cmV0dXJuIG5ldyBTdGF0ZSh7dmFsdWU6c3RhdGVWYWx1ZS52YWx1ZSxjb250ZXh0OmNvbnRleHQsX2V2ZW50Ol9ldmVudCxfc2Vzc2lvbmlkOm51bGwsaGlzdG9yeVZhbHVlOnN0YXRlVmFsdWUuaGlzdG9yeVZhbHVlLGhpc3Rvcnk6c3RhdGVWYWx1ZS5oaXN0b3J5LGFjdGl2aXRpZXM6c3RhdGVWYWx1ZS5hY3Rpdml0aWVzLGNvbmZpZ3VyYXRpb246c3RhdGVWYWx1ZS5jb25maWd1cmF0aW9uLHRyYW5zaXRpb25zOltdLGNoaWxkcmVuOnt9fSk7fXJldHVybiBTdGF0ZS5mcm9tKHN0YXRlVmFsdWUsY29udGV4dCk7fTsvKipcXHJcXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBzdHJpbmcgbGVhZiBzdGF0ZSBub2RlIHBhdGhzLlxcclxcbiAgICogQHBhcmFtIHN0YXRlVmFsdWVcXHJcXG4gICAqIEBwYXJhbSBkZWxpbWl0ZXIgVGhlIGNoYXJhY3RlcihzKSB0aGF0IHNlcGFyYXRlIGVhY2ggc3VicGF0aCBpbiB0aGUgc3RyaW5nIHN0YXRlIG5vZGUgcGF0aC5cXHJcXG4gICAqL1N0YXRlLnByb3RvdHlwZS50b1N0cmluZ3M9ZnVuY3Rpb24oc3RhdGVWYWx1ZSxkZWxpbWl0ZXIpe3ZhciBfdGhpcz10aGlzO2lmKHN0YXRlVmFsdWU9PT12b2lkIDApe3N0YXRlVmFsdWU9dGhpcy52YWx1ZTt9aWYoZGVsaW1pdGVyPT09dm9pZCAwKXtkZWxpbWl0ZXI9Jy4nO31pZigoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc1N0cmluZykoc3RhdGVWYWx1ZSkpe3JldHVybltzdGF0ZVZhbHVlXTt9dmFyIHZhbHVlS2V5cz1PYmplY3Qua2V5cyhzdGF0ZVZhbHVlKTtyZXR1cm4gdmFsdWVLZXlzLmNvbmNhdC5hcHBseSh2YWx1ZUtleXMsKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5fX3NwcmVhZEFycmF5KShbXSwoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLl9fcmVhZCkodmFsdWVLZXlzLm1hcChmdW5jdGlvbihrZXkpe3JldHVybiBfdGhpcy50b1N0cmluZ3Moc3RhdGVWYWx1ZVtrZXldLGRlbGltaXRlcikubWFwKGZ1bmN0aW9uKHMpe3JldHVybiBrZXkrZGVsaW1pdGVyK3M7fSk7fSkpLGZhbHNlKSk7fTtTdGF0ZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIF9hPXRoaXM7X2EuY29uZmlndXJhdGlvbjtfYS50cmFuc2l0aW9uczt2YXIgdGFncz1fYS50YWdzO19hLm1hY2hpbmU7dmFyIGpzb25WYWx1ZXM9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5fX3Jlc3QpKF9hLFtcXFwiY29uZmlndXJhdGlvblxcXCIsXFxcInRyYW5zaXRpb25zXFxcIixcXFwidGFnc1xcXCIsXFxcIm1hY2hpbmVcXFwiXSk7cmV0dXJuKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5fX2Fzc2lnbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5fX2Fzc2lnbikoe30sanNvblZhbHVlcykse3RhZ3M6QXJyYXkuZnJvbSh0YWdzKX0pO307U3RhdGUucHJvdG90eXBlLm1hdGNoZXM9ZnVuY3Rpb24ocGFyZW50U3RhdGVWYWx1ZSl7cmV0dXJuKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ubWF0Y2hlc1N0YXRlKShwYXJlbnRTdGF0ZVZhbHVlLHRoaXMudmFsdWUpO307LyoqXFxyXFxuICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IHN0YXRlIGNvbmZpZ3VyYXRpb24gaGFzIGEgc3RhdGUgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgYHRhZ2AuXFxyXFxuICAgKiBAcGFyYW0gdGFnXFxyXFxuICAgKi9TdGF0ZS5wcm90b3R5cGUuaGFzVGFnPWZ1bmN0aW9uKHRhZyl7cmV0dXJuIHRoaXMudGFncy5oYXModGFnKTt9Oy8qKlxcclxcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHNlbmRpbmcgdGhlIGBldmVudGAgd2lsbCBjYXVzZSBhIG5vbi1mb3JiaWRkZW4gdHJhbnNpdGlvblxcclxcbiAgICogdG8gYmUgc2VsZWN0ZWQsIGV2ZW4gaWYgdGhlIHRyYW5zaXRpb25zIGhhdmUgbm8gYWN0aW9ucyBub3JcXHJcXG4gICAqIGNoYW5nZSB0aGUgc3RhdGUgdmFsdWUuXFxyXFxuICAgKlxcclxcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byB0ZXN0XFxyXFxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBldmVudCB3aWxsIGNhdXNlIGEgdHJhbnNpdGlvblxcclxcbiAgICovU3RhdGUucHJvdG90eXBlLmNhbj1mdW5jdGlvbihldmVudCl7dmFyIF9hO2lmKF9lbnZpcm9ubWVudF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLklTX1BST0RVQ1RJT04peygwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLndhcm4pKCEhdGhpcy5tYWNoaW5lLFxcXCJzdGF0ZS5jYW4oLi4uKSB1c2VkIG91dHNpZGUgb2YgYSBtYWNoaW5lLWNyZWF0ZWQgU3RhdGUgb2JqZWN0OyB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZS5cXFwiKTt9dmFyIHRyYW5zaXRpb25EYXRhPShfYT10aGlzLm1hY2hpbmUpPT09bnVsbHx8X2E9PT12b2lkIDA/dm9pZCAwOl9hLmdldFRyYW5zaXRpb25EYXRhKHRoaXMsZXZlbnQpO3JldHVybiEhKHRyYW5zaXRpb25EYXRhPT09bnVsbHx8dHJhbnNpdGlvbkRhdGE9PT12b2lkIDA/dm9pZCAwOnRyYW5zaXRpb25EYXRhLnRyYW5zaXRpb25zLmxlbmd0aCkmJi8vIENoZWNrIHRoYXQgYXQgbGVhc3Qgb25lIHRyYW5zaXRpb24gaXMgbm90IGZvcmJpZGRlblxcbnRyYW5zaXRpb25EYXRhLnRyYW5zaXRpb25zLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIHQudGFyZ2V0IT09dW5kZWZpbmVkfHx0LmFjdGlvbnMubGVuZ3RoO30pO307cmV0dXJuIFN0YXRlO30oKTsvKioqL30sLyoqKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL1N0YXRlTm9kZS5qc1xcXCI6LyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxcXFxuICAhKioqIC4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9TdGF0ZU5vZGUuanMgKioqIVxcbiAgXFxcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqKi9mdW5jdGlvbiBub2RlX21vZHVsZXNYc3RhdGVFc1N0YXRlTm9kZUpzKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyl7XFxcInVzZSBzdHJpY3RcXFwiO19fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsvKiBoYXJtb255IGV4cG9ydCAqL19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHsvKiBoYXJtb255IGV4cG9ydCAqL1N0YXRlTm9kZTpmdW5jdGlvbiBTdGF0ZU5vZGUoKXtyZXR1cm4oLyogYmluZGluZyAqL19TdGF0ZU5vZGUpO30vKiBoYXJtb255IGV4cG9ydCAqL30pOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9fdmlydHVhbC9fdHNsaWIuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL192aXJ0dWFsL190c2xpYi5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vdXRpbHMuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3V0aWxzLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX1N0YXRlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9TdGF0ZS5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvU3RhdGUuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfYWN0aW9uVHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2FjdGlvblR5cGVzLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9hY3Rpb25UeXBlcy5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9hY3Rpb25zLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9hY3Rpb25zLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX2Vudmlyb25tZW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9lbnZpcm9ubWVudC5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvZW52aXJvbm1lbnQuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfY29uc3RhbnRzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9jb25zdGFudHMuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2NvbnN0YW50cy5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9zdGF0ZVV0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9zdGF0ZVV0aWxzLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9zdGF0ZVV0aWxzLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX0FjdG9yX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9BY3Rvci5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvQWN0b3IuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfaW52b2tlVXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2ludm9rZVV0aWxzLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9pbnZva2VVdGlscy5qc1xcXCIpO3ZhciBOVUxMX0VWRU5UPScnO3ZhciBTVEFURV9JREVOVElGSUVSPScjJzt2YXIgV0lMRENBUkQ9JyonO3ZhciBFTVBUWV9PQkpFQ1Q9e307dmFyIGlzU3RhdGVJZD1mdW5jdGlvbiBpc1N0YXRlSWQoc3RyKXtyZXR1cm4gc3RyWzBdPT09U1RBVEVfSURFTlRJRklFUjt9O3ZhciBjcmVhdGVEZWZhdWx0T3B0aW9ucz1mdW5jdGlvbiBjcmVhdGVEZWZhdWx0T3B0aW9ucygpe3JldHVybnthY3Rpb25zOnt9LGd1YXJkczp7fSxzZXJ2aWNlczp7fSxhY3Rpdml0aWVzOnt9LGRlbGF5czp7fX07fTt2YXIgdmFsaWRhdGVBcnJheWlmaWVkVHJhbnNpdGlvbnM9ZnVuY3Rpb24gdmFsaWRhdGVBcnJheWlmaWVkVHJhbnNpdGlvbnMoc3RhdGVOb2RlLGV2ZW50LHRyYW5zaXRpb25zKXt2YXIgaGFzTm9uTGFzdFVuZ3VhcmRlZFRhcmdldD10cmFuc2l0aW9ucy5zbGljZSgwLC0xKS5zb21lKGZ1bmN0aW9uKHRyYW5zaXRpb24pe3JldHVybiEoJ2NvbmQnaW4gdHJhbnNpdGlvbikmJiEoJ2luJ2luIHRyYW5zaXRpb24pJiYoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNTdHJpbmcpKHRyYW5zaXRpb24udGFyZ2V0KXx8KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNNYWNoaW5lKSh0cmFuc2l0aW9uLnRhcmdldCkpO30pO3ZhciBldmVudFRleHQ9ZXZlbnQ9PT1OVUxMX0VWRU5UPyd0aGUgdHJhbnNpZW50IGV2ZW50JzpcXFwiZXZlbnQgJ1xcXCIuY29uY2F0KGV2ZW50LFxcXCInXFxcIik7KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ud2FybikoIWhhc05vbkxhc3RVbmd1YXJkZWRUYXJnZXQsXFxcIk9uZSBvciBtb3JlIHRyYW5zaXRpb25zIGZvciBcXFwiLmNvbmNhdChldmVudFRleHQsXFxcIiBvbiBzdGF0ZSAnXFxcIikuY29uY2F0KHN0YXRlTm9kZS5pZCxcXFwiJyBhcmUgdW5yZWFjaGFibGUuIFxcXCIpK1xcXCJNYWtlIHN1cmUgdGhhdCB0aGUgZGVmYXVsdCB0cmFuc2l0aW9uIGlzIHRoZSBsYXN0IG9uZSBkZWZpbmVkLlxcXCIpO307dmFyIF9TdGF0ZU5vZGU9LyojX19QVVJFX18qLyAvKiogQGNsYXNzICovZnVuY3Rpb24oKXtmdW5jdGlvbiBTdGF0ZU5vZGUoLyoqXFxyXFxuICAgKiBUaGUgcmF3IGNvbmZpZyB1c2VkIHRvIGNyZWF0ZSB0aGUgbWFjaGluZS5cXHJcXG4gICAqL2NvbmZpZyxvcHRpb25zLC8qKlxcclxcbiAgICogVGhlIGluaXRpYWwgZXh0ZW5kZWQgc3RhdGVcXHJcXG4gICAqL19jb250ZXh0LC8vIFRPRE86IHRoaXMgaXMgdW5zYWZlLCBidXQgd2UncmUgcmVtb3ZpbmcgaXQgaW4gdjUgYW55d2F5XFxuX3N0YXRlSW5mbyl7aWYoX2NvbnRleHQ9PT12b2lkIDApe19jb250ZXh0PSdjb250ZXh0J2luIGNvbmZpZz9jb25maWcuY29udGV4dDp1bmRlZmluZWQ7fXZhciBfdGhpcz10aGlzO3ZhciBfYTt0aGlzLmNvbmZpZz1jb25maWc7dGhpcy5fY29udGV4dD1fY29udGV4dDsvKipcXHJcXG4gICAgICogVGhlIG9yZGVyIHRoaXMgc3RhdGUgbm9kZSBhcHBlYXJzLiBDb3JyZXNwb25kcyB0byB0aGUgaW1wbGljaXQgU0NYTUwgZG9jdW1lbnQgb3JkZXIuXFxyXFxuICAgICAqL3RoaXMub3JkZXI9LTE7dGhpcy5fX3hzdGF0ZW5vZGU9dHJ1ZTt0aGlzLl9fY2FjaGU9e2V2ZW50czp1bmRlZmluZWQscmVsYXRpdmVWYWx1ZTpuZXcgTWFwKCksaW5pdGlhbFN0YXRlVmFsdWU6dW5kZWZpbmVkLGluaXRpYWxTdGF0ZTp1bmRlZmluZWQsb246dW5kZWZpbmVkLHRyYW5zaXRpb25zOnVuZGVmaW5lZCxjYW5kaWRhdGVzOnt9LGRlbGF5ZWRUcmFuc2l0aW9uczp1bmRlZmluZWR9O3RoaXMuaWRNYXA9e307dGhpcy50YWdzPVtdO3RoaXMub3B0aW9ucz1PYmplY3QuYXNzaWduKGNyZWF0ZURlZmF1bHRPcHRpb25zKCksb3B0aW9ucyk7dGhpcy5wYXJlbnQ9X3N0YXRlSW5mbz09PW51bGx8fF9zdGF0ZUluZm89PT12b2lkIDA/dm9pZCAwOl9zdGF0ZUluZm8ucGFyZW50O3RoaXMua2V5PXRoaXMuY29uZmlnLmtleXx8KF9zdGF0ZUluZm89PT1udWxsfHxfc3RhdGVJbmZvPT09dm9pZCAwP3ZvaWQgMDpfc3RhdGVJbmZvLmtleSl8fHRoaXMuY29uZmlnLmlkfHwnKG1hY2hpbmUpJzt0aGlzLm1hY2hpbmU9dGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQubWFjaGluZTp0aGlzO3RoaXMucGF0aD10aGlzLnBhcmVudD90aGlzLnBhcmVudC5wYXRoLmNvbmNhdCh0aGlzLmtleSk6W107dGhpcy5kZWxpbWl0ZXI9dGhpcy5jb25maWcuZGVsaW1pdGVyfHwodGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQuZGVsaW1pdGVyOl9jb25zdGFudHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5TVEFURV9ERUxJTUlURVIpO3RoaXMuaWQ9dGhpcy5jb25maWcuaWR8fCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19zcHJlYWRBcnJheSkoW3RoaXMubWFjaGluZS5rZXldLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19yZWFkKSh0aGlzLnBhdGgpLGZhbHNlKS5qb2luKHRoaXMuZGVsaW1pdGVyKTt0aGlzLnZlcnNpb249dGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQudmVyc2lvbjp0aGlzLmNvbmZpZy52ZXJzaW9uO3RoaXMudHlwZT10aGlzLmNvbmZpZy50eXBlfHwodGhpcy5jb25maWcucGFyYWxsZWw/J3BhcmFsbGVsJzp0aGlzLmNvbmZpZy5zdGF0ZXMmJk9iamVjdC5rZXlzKHRoaXMuY29uZmlnLnN0YXRlcykubGVuZ3RoPydjb21wb3VuZCc6dGhpcy5jb25maWcuaGlzdG9yeT8naGlzdG9yeSc6J2F0b21pYycpO3RoaXMuc2NoZW1hPXRoaXMucGFyZW50P3RoaXMubWFjaGluZS5zY2hlbWE6KF9hPXRoaXMuY29uZmlnLnNjaGVtYSkhPT1udWxsJiZfYSE9PXZvaWQgMD9fYTp7fTt0aGlzLmRlc2NyaXB0aW9uPXRoaXMuY29uZmlnLmRlc2NyaXB0aW9uO2lmKCFfZW52aXJvbm1lbnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5JU19QUk9EVUNUSU9OKXsoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy53YXJuKSghKCdwYXJhbGxlbCdpbiB0aGlzLmNvbmZpZyksXFxcIlRoZSBcXFxcXFxcInBhcmFsbGVsXFxcXFxcXCIgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHZlcnNpb24gNC4xLiBcXFwiLmNvbmNhdCh0aGlzLmNvbmZpZy5wYXJhbGxlbD9cXFwiUmVwbGFjZSB3aXRoIGB0eXBlOiAncGFyYWxsZWwnYFxcXCI6XFxcIlVzZSBgdHlwZTogJ1xcXCIuY29uY2F0KHRoaXMudHlwZSxcXFwiJ2BcXFwiKSxcXFwiIGluIHRoZSBjb25maWcgZm9yIHN0YXRlIG5vZGUgJ1xcXCIpLmNvbmNhdCh0aGlzLmlkLFxcXCInIGluc3RlYWQuXFxcIikpO310aGlzLmluaXRpYWw9dGhpcy5jb25maWcuaW5pdGlhbDt0aGlzLnN0YXRlcz10aGlzLmNvbmZpZy5zdGF0ZXM/KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ubWFwVmFsdWVzKSh0aGlzLmNvbmZpZy5zdGF0ZXMsZnVuY3Rpb24oc3RhdGVDb25maWcsa2V5KXt2YXIgX2E7dmFyIHN0YXRlTm9kZT1uZXcgU3RhdGVOb2RlKHN0YXRlQ29uZmlnLHt9LHVuZGVmaW5lZCx7cGFyZW50Ol90aGlzLGtleTprZXl9KTtPYmplY3QuYXNzaWduKF90aGlzLmlkTWFwLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKChfYT17fSxfYVtzdGF0ZU5vZGUuaWRdPXN0YXRlTm9kZSxfYSksc3RhdGVOb2RlLmlkTWFwKSk7cmV0dXJuIHN0YXRlTm9kZTt9KTpFTVBUWV9PQkpFQ1Q7Ly8gRG9jdW1lbnQgb3JkZXJcXG52YXIgb3JkZXI9MDtmdW5jdGlvbiBkZnMoc3RhdGVOb2RlKXt2YXIgZV8xLF9hO3N0YXRlTm9kZS5vcmRlcj1vcmRlcisrO3RyeXtmb3IodmFyIF9iPSgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX192YWx1ZXMpKCgwLF9zdGF0ZVV0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uZ2V0QWxsQ2hpbGRyZW4pKHN0YXRlTm9kZSkpLF9jPV9iLm5leHQoKTshX2MuZG9uZTtfYz1fYi5uZXh0KCkpe3ZhciBjaGlsZD1fYy52YWx1ZTtkZnMoY2hpbGQpO319Y2F0Y2goZV8xXzEpe2VfMT17ZXJyb3I6ZV8xXzF9O31maW5hbGx5e3RyeXtpZihfYyYmIV9jLmRvbmUmJihfYT1fYltcXFwicmV0dXJuXFxcIl0pKV9hLmNhbGwoX2IpO31maW5hbGx5e2lmKGVfMSl0aHJvdyBlXzEuZXJyb3I7fX19ZGZzKHRoaXMpOy8vIEhpc3RvcnkgY29uZmlnXFxudGhpcy5oaXN0b3J5PXRoaXMuY29uZmlnLmhpc3Rvcnk9PT10cnVlPydzaGFsbG93Jzp0aGlzLmNvbmZpZy5oaXN0b3J5fHxmYWxzZTt0aGlzLl90cmFuc2llbnQ9ISF0aGlzLmNvbmZpZy5hbHdheXN8fCghdGhpcy5jb25maWcub24/ZmFsc2U6QXJyYXkuaXNBcnJheSh0aGlzLmNvbmZpZy5vbik/dGhpcy5jb25maWcub24uc29tZShmdW5jdGlvbihfYSl7dmFyIGV2ZW50PV9hLmV2ZW50O3JldHVybiBldmVudD09PU5VTExfRVZFTlQ7fSk6TlVMTF9FVkVOVCBpbiB0aGlzLmNvbmZpZy5vbik7dGhpcy5zdHJpY3Q9ISF0aGlzLmNvbmZpZy5zdHJpY3Q7Ly8gVE9ETzogZGVwcmVjYXRlIChlbnRyeSlcXG50aGlzLm9uRW50cnk9KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9BcnJheSkodGhpcy5jb25maWcuZW50cnl8fHRoaXMuY29uZmlnLm9uRW50cnkpLm1hcChmdW5jdGlvbihhY3Rpb24pe3JldHVybigwLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18udG9BY3Rpb25PYmplY3QpKGFjdGlvbik7fSk7Ly8gVE9ETzogZGVwcmVjYXRlIChleGl0KVxcbnRoaXMub25FeGl0PSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvQXJyYXkpKHRoaXMuY29uZmlnLmV4aXR8fHRoaXMuY29uZmlnLm9uRXhpdCkubWFwKGZ1bmN0aW9uKGFjdGlvbil7cmV0dXJuKDAsX2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy50b0FjdGlvbk9iamVjdCkoYWN0aW9uKTt9KTt0aGlzLm1ldGE9dGhpcy5jb25maWcubWV0YTt0aGlzLmRvbmVEYXRhPXRoaXMudHlwZT09PSdmaW5hbCc/dGhpcy5jb25maWcuZGF0YTp1bmRlZmluZWQ7dGhpcy5pbnZva2U9KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9BcnJheSkodGhpcy5jb25maWcuaW52b2tlKS5tYXAoZnVuY3Rpb24oaW52b2tlQ29uZmlnLGkpe3ZhciBfYSxfYjtpZigoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc01hY2hpbmUpKGludm9rZUNvbmZpZykpe3ZhciBpbnZva2VJZD0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5jcmVhdGVJbnZva2VJZCkoX3RoaXMuaWQsaSk7X3RoaXMubWFjaGluZS5vcHRpb25zLnNlcnZpY2VzPSgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKChfYT17fSxfYVtpbnZva2VJZF09aW52b2tlQ29uZmlnLF9hKSxfdGhpcy5tYWNoaW5lLm9wdGlvbnMuc2VydmljZXMpO3JldHVybigwLF9pbnZva2VVdGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLnRvSW52b2tlRGVmaW5pdGlvbikoe3NyYzppbnZva2VJZCxpZDppbnZva2VJZH0pO31lbHNlIGlmKCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmlzU3RyaW5nKShpbnZva2VDb25maWcuc3JjKSl7dmFyIGludm9rZUlkPWludm9rZUNvbmZpZy5pZHx8KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uY3JlYXRlSW52b2tlSWQpKF90aGlzLmlkLGkpO3JldHVybigwLF9pbnZva2VVdGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLnRvSW52b2tlRGVmaW5pdGlvbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoe30saW52b2tlQ29uZmlnKSx7aWQ6aW52b2tlSWQsc3JjOmludm9rZUNvbmZpZy5zcmN9KSk7fWVsc2UgaWYoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNNYWNoaW5lKShpbnZva2VDb25maWcuc3JjKXx8KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNGdW5jdGlvbikoaW52b2tlQ29uZmlnLnNyYykpe3ZhciBpbnZva2VJZD1pbnZva2VDb25maWcuaWR8fCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmNyZWF0ZUludm9rZUlkKShfdGhpcy5pZCxpKTtfdGhpcy5tYWNoaW5lLm9wdGlvbnMuc2VydmljZXM9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoKF9iPXt9LF9iW2ludm9rZUlkXT1pbnZva2VDb25maWcuc3JjLF9iKSxfdGhpcy5tYWNoaW5lLm9wdGlvbnMuc2VydmljZXMpO3JldHVybigwLF9pbnZva2VVdGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLnRvSW52b2tlRGVmaW5pdGlvbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoe2lkOmludm9rZUlkfSxpbnZva2VDb25maWcpLHtzcmM6aW52b2tlSWR9KSk7fWVsc2V7dmFyIGludm9rZVNvdXJjZT1pbnZva2VDb25maWcuc3JjO3JldHVybigwLF9pbnZva2VVdGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLnRvSW52b2tlRGVmaW5pdGlvbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoe2lkOigwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmNyZWF0ZUludm9rZUlkKShfdGhpcy5pZCxpKX0saW52b2tlQ29uZmlnKSx7c3JjOmludm9rZVNvdXJjZX0pKTt9fSk7dGhpcy5hY3Rpdml0aWVzPSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvQXJyYXkpKHRoaXMuY29uZmlnLmFjdGl2aXRpZXMpLmNvbmNhdCh0aGlzLmludm9rZSkubWFwKGZ1bmN0aW9uKGFjdGl2aXR5KXtyZXR1cm4oMCxfYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLnRvQWN0aXZpdHlEZWZpbml0aW9uKShhY3Rpdml0eSk7fSk7dGhpcy50cmFuc2l0aW9uPXRoaXMudHJhbnNpdGlvbi5iaW5kKHRoaXMpO3RoaXMudGFncz0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy50b0FycmF5KSh0aGlzLmNvbmZpZy50YWdzKTsvLyBUT0RPOiB0aGlzIGlzIHRoZSByZWFsIGZpeCBmb3IgaW5pdGlhbGl6YXRpb24gb25jZVxcbi8vIHN0YXRlIG5vZGUgZ2V0dGVycyBhcmUgZGVwcmVjYXRlZFxcbi8vIGlmICghdGhpcy5wYXJlbnQpIHtcXG4vLyAgIHRoaXMuX2luaXQoKTtcXG4vLyB9XFxufVN0YXRlTm9kZS5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9fY2FjaGUudHJhbnNpdGlvbnMpe3JldHVybjt9KDAsX3N0YXRlVXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5nZXRBbGxTdGF0ZU5vZGVzKSh0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uKHN0YXRlTm9kZSl7cmV0dXJuIHN0YXRlTm9kZS5vbjt9KTt9Oy8qKlxcclxcbiAgICogQ2xvbmVzIHRoaXMgc3RhdGUgbWFjaGluZSB3aXRoIGN1c3RvbSBvcHRpb25zIGFuZCBjb250ZXh0LlxcclxcbiAgICpcXHJcXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgKGFjdGlvbnMsIGd1YXJkcywgYWN0aXZpdGllcywgc2VydmljZXMpIHRvIHJlY3Vyc2l2ZWx5IG1lcmdlIHdpdGggdGhlIGV4aXN0aW5nIG9wdGlvbnMuXFxyXFxuICAgKiBAcGFyYW0gY29udGV4dCBDdXN0b20gY29udGV4dCAod2lsbCBvdmVycmlkZSBwcmVkZWZpbmVkIGNvbnRleHQpXFxyXFxuICAgKi9TdGF0ZU5vZGUucHJvdG90eXBlLndpdGhDb25maWc9ZnVuY3Rpb24ob3B0aW9ucyxjb250ZXh0KXt2YXIgX2E9dGhpcy5vcHRpb25zLGFjdGlvbnM9X2EuYWN0aW9ucyxhY3Rpdml0aWVzPV9hLmFjdGl2aXRpZXMsZ3VhcmRzPV9hLmd1YXJkcyxzZXJ2aWNlcz1fYS5zZXJ2aWNlcyxkZWxheXM9X2EuZGVsYXlzO3JldHVybiBuZXcgU3RhdGVOb2RlKHRoaXMuY29uZmlnLHthY3Rpb25zOigwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKHt9LGFjdGlvbnMpLG9wdGlvbnMuYWN0aW9ucyksYWN0aXZpdGllczooMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSh7fSxhY3Rpdml0aWVzKSxvcHRpb25zLmFjdGl2aXRpZXMpLGd1YXJkczooMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSh7fSxndWFyZHMpLG9wdGlvbnMuZ3VhcmRzKSxzZXJ2aWNlczooMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSh7fSxzZXJ2aWNlcyksb3B0aW9ucy5zZXJ2aWNlcyksZGVsYXlzOigwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKHt9LGRlbGF5cyksb3B0aW9ucy5kZWxheXMpfSxjb250ZXh0IT09bnVsbCYmY29udGV4dCE9PXZvaWQgMD9jb250ZXh0OnRoaXMuY29udGV4dCk7fTsvKipcXHJcXG4gICAqIENsb25lcyB0aGlzIHN0YXRlIG1hY2hpbmUgd2l0aCBjdXN0b20gY29udGV4dC5cXHJcXG4gICAqXFxyXFxuICAgKiBAcGFyYW0gY29udGV4dCBDdXN0b20gY29udGV4dCAod2lsbCBvdmVycmlkZSBwcmVkZWZpbmVkIGNvbnRleHQsIG5vdCByZWN1cnNpdmUpXFxyXFxuICAgKi9TdGF0ZU5vZGUucHJvdG90eXBlLndpdGhDb250ZXh0PWZ1bmN0aW9uKGNvbnRleHQpe3JldHVybiBuZXcgU3RhdGVOb2RlKHRoaXMuY29uZmlnLHRoaXMub3B0aW9ucyxjb250ZXh0KTt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGF0ZU5vZGUucHJvdG90eXBlLFxcXCJjb250ZXh0XFxcIix7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybigwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmlzRnVuY3Rpb24pKHRoaXMuX2NvbnRleHQpP3RoaXMuX2NvbnRleHQoKTp0aGlzLl9jb250ZXh0O30sZW51bWVyYWJsZTpmYWxzZSxjb25maWd1cmFibGU6dHJ1ZX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGF0ZU5vZGUucHJvdG90eXBlLFxcXCJkZWZpbml0aW9uXFxcIix7LyoqXFxyXFxuICAgICAqIFRoZSB3ZWxsLXN0cnVjdHVyZWQgc3RhdGUgbm9kZSBkZWZpbml0aW9uLlxcclxcbiAgICAgKi9nZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJue2lkOnRoaXMuaWQsa2V5OnRoaXMua2V5LHZlcnNpb246dGhpcy52ZXJzaW9uLGNvbnRleHQ6dGhpcy5jb250ZXh0LHR5cGU6dGhpcy50eXBlLGluaXRpYWw6dGhpcy5pbml0aWFsLGhpc3Rvcnk6dGhpcy5oaXN0b3J5LHN0YXRlczooMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5tYXBWYWx1ZXMpKHRoaXMuc3RhdGVzLGZ1bmN0aW9uKHN0YXRlKXtyZXR1cm4gc3RhdGUuZGVmaW5pdGlvbjt9KSxvbjp0aGlzLm9uLHRyYW5zaXRpb25zOnRoaXMudHJhbnNpdGlvbnMsZW50cnk6dGhpcy5vbkVudHJ5LGV4aXQ6dGhpcy5vbkV4aXQsYWN0aXZpdGllczp0aGlzLmFjdGl2aXRpZXN8fFtdLG1ldGE6dGhpcy5tZXRhLG9yZGVyOnRoaXMub3JkZXJ8fC0xLGRhdGE6dGhpcy5kb25lRGF0YSxpbnZva2U6dGhpcy5pbnZva2UsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbix0YWdzOnRoaXMudGFnc307fSxlbnVtZXJhYmxlOmZhbHNlLGNvbmZpZ3VyYWJsZTp0cnVlfSk7U3RhdGVOb2RlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWZpbml0aW9uO307T2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YXRlTm9kZS5wcm90b3R5cGUsXFxcIm9uXFxcIix7LyoqXFxyXFxuICAgICAqIFRoZSBtYXBwaW5nIG9mIGV2ZW50cyB0byB0cmFuc2l0aW9ucy5cXHJcXG4gICAgICovZ2V0OmZ1bmN0aW9uIGdldCgpe2lmKHRoaXMuX19jYWNoZS5vbil7cmV0dXJuIHRoaXMuX19jYWNoZS5vbjt9dmFyIHRyYW5zaXRpb25zPXRoaXMudHJhbnNpdGlvbnM7cmV0dXJuIHRoaXMuX19jYWNoZS5vbj10cmFuc2l0aW9ucy5yZWR1Y2UoZnVuY3Rpb24obWFwLHRyYW5zaXRpb24pe21hcFt0cmFuc2l0aW9uLmV2ZW50VHlwZV09bWFwW3RyYW5zaXRpb24uZXZlbnRUeXBlXXx8W107bWFwW3RyYW5zaXRpb24uZXZlbnRUeXBlXS5wdXNoKHRyYW5zaXRpb24pO3JldHVybiBtYXA7fSx7fSk7fSxlbnVtZXJhYmxlOmZhbHNlLGNvbmZpZ3VyYWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YXRlTm9kZS5wcm90b3R5cGUsXFxcImFmdGVyXFxcIix7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9fY2FjaGUuZGVsYXllZFRyYW5zaXRpb25zfHwodGhpcy5fX2NhY2hlLmRlbGF5ZWRUcmFuc2l0aW9ucz10aGlzLmdldERlbGF5ZWRUcmFuc2l0aW9ucygpLHRoaXMuX19jYWNoZS5kZWxheWVkVHJhbnNpdGlvbnMpO30sZW51bWVyYWJsZTpmYWxzZSxjb25maWd1cmFibGU6dHJ1ZX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGF0ZU5vZGUucHJvdG90eXBlLFxcXCJ0cmFuc2l0aW9uc1xcXCIsey8qKlxcclxcbiAgICAgKiBBbGwgdGhlIHRyYW5zaXRpb25zIHRoYXQgY2FuIGJlIHRha2VuIGZyb20gdGhpcyBzdGF0ZSBub2RlLlxcclxcbiAgICAgKi9nZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX19jYWNoZS50cmFuc2l0aW9uc3x8KHRoaXMuX19jYWNoZS50cmFuc2l0aW9ucz10aGlzLmZvcm1hdFRyYW5zaXRpb25zKCksdGhpcy5fX2NhY2hlLnRyYW5zaXRpb25zKTt9LGVudW1lcmFibGU6ZmFsc2UsY29uZmlndXJhYmxlOnRydWV9KTtTdGF0ZU5vZGUucHJvdG90eXBlLmdldENhbmRpZGF0ZXM9ZnVuY3Rpb24oZXZlbnROYW1lKXtpZih0aGlzLl9fY2FjaGUuY2FuZGlkYXRlc1tldmVudE5hbWVdKXtyZXR1cm4gdGhpcy5fX2NhY2hlLmNhbmRpZGF0ZXNbZXZlbnROYW1lXTt9dmFyIF90cmFuc2llbnQ9ZXZlbnROYW1lPT09TlVMTF9FVkVOVDt2YXIgY2FuZGlkYXRlcz10aGlzLnRyYW5zaXRpb25zLmZpbHRlcihmdW5jdGlvbih0cmFuc2l0aW9uKXt2YXIgc2FtZUV2ZW50VHlwZT10cmFuc2l0aW9uLmV2ZW50VHlwZT09PWV2ZW50TmFtZTsvLyBudWxsIGV2ZW50cyBzaG91bGQgb25seSBtYXRjaCBhZ2FpbnN0IGV2ZW50bGVzcyB0cmFuc2l0aW9uc1xcbnJldHVybiBfdHJhbnNpZW50P3NhbWVFdmVudFR5cGU6c2FtZUV2ZW50VHlwZXx8dHJhbnNpdGlvbi5ldmVudFR5cGU9PT1XSUxEQ0FSRDt9KTt0aGlzLl9fY2FjaGUuY2FuZGlkYXRlc1tldmVudE5hbWVdPWNhbmRpZGF0ZXM7cmV0dXJuIGNhbmRpZGF0ZXM7fTsvKipcXHJcXG4gICAqIEFsbCBkZWxheWVkIHRyYW5zaXRpb25zIGZyb20gdGhlIGNvbmZpZy5cXHJcXG4gICAqL1N0YXRlTm9kZS5wcm90b3R5cGUuZ2V0RGVsYXllZFRyYW5zaXRpb25zPWZ1bmN0aW9uKCl7dmFyIF90aGlzPXRoaXM7dmFyIGFmdGVyQ29uZmlnPXRoaXMuY29uZmlnLmFmdGVyO2lmKCFhZnRlckNvbmZpZyl7cmV0dXJuW107fXZhciBtdXRhdGVFbnRyeUV4aXQ9ZnVuY3Rpb24gbXV0YXRlRW50cnlFeGl0KGRlbGF5LGkpe3ZhciBkZWxheVJlZj0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc0Z1bmN0aW9uKShkZWxheSk/XFxcIlxcXCIuY29uY2F0KF90aGlzLmlkLFxcXCI6ZGVsYXlbXFxcIikuY29uY2F0KGksXFxcIl1cXFwiKTpkZWxheTt2YXIgZXZlbnRUeXBlPSgwLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uYWZ0ZXIpKGRlbGF5UmVmLF90aGlzLmlkKTtfdGhpcy5vbkVudHJ5LnB1c2goKDAsX2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5zZW5kKShldmVudFR5cGUse2RlbGF5OmRlbGF5fSkpO190aGlzLm9uRXhpdC5wdXNoKCgwLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uY2FuY2VsKShldmVudFR5cGUpKTtyZXR1cm4gZXZlbnRUeXBlO307dmFyIGRlbGF5ZWRUcmFuc2l0aW9ucz0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc0FycmF5KShhZnRlckNvbmZpZyk/YWZ0ZXJDb25maWcubWFwKGZ1bmN0aW9uKHRyYW5zaXRpb24saSl7dmFyIGV2ZW50VHlwZT1tdXRhdGVFbnRyeUV4aXQodHJhbnNpdGlvbi5kZWxheSxpKTtyZXR1cm4oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSh7fSx0cmFuc2l0aW9uKSx7ZXZlbnQ6ZXZlbnRUeXBlfSk7fSk6KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZmxhdHRlbikoT2JqZWN0LmtleXMoYWZ0ZXJDb25maWcpLm1hcChmdW5jdGlvbihkZWxheSxpKXt2YXIgY29uZmlnVHJhbnNpdGlvbj1hZnRlckNvbmZpZ1tkZWxheV07dmFyIHJlc29sdmVkVHJhbnNpdGlvbj0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc1N0cmluZykoY29uZmlnVHJhbnNpdGlvbik/e3RhcmdldDpjb25maWdUcmFuc2l0aW9ufTpjb25maWdUcmFuc2l0aW9uO3ZhciByZXNvbHZlZERlbGF5PSFpc05hTigrZGVsYXkpPytkZWxheTpkZWxheTt2YXIgZXZlbnRUeXBlPW11dGF0ZUVudHJ5RXhpdChyZXNvbHZlZERlbGF5LGkpO3JldHVybigwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvQXJyYXkpKHJlc29sdmVkVHJhbnNpdGlvbikubWFwKGZ1bmN0aW9uKHRyYW5zaXRpb24pe3JldHVybigwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKHt9LHRyYW5zaXRpb24pLHtldmVudDpldmVudFR5cGUsZGVsYXk6cmVzb2x2ZWREZWxheX0pO30pO30pKTtyZXR1cm4gZGVsYXllZFRyYW5zaXRpb25zLm1hcChmdW5jdGlvbihkZWxheWVkVHJhbnNpdGlvbil7dmFyIGRlbGF5PWRlbGF5ZWRUcmFuc2l0aW9uLmRlbGF5O3JldHVybigwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKHt9LF90aGlzLmZvcm1hdFRyYW5zaXRpb24oZGVsYXllZFRyYW5zaXRpb24pKSx7ZGVsYXk6ZGVsYXl9KTt9KTt9Oy8qKlxcclxcbiAgICogUmV0dXJucyB0aGUgc3RhdGUgbm9kZXMgcmVwcmVzZW50ZWQgYnkgdGhlIGN1cnJlbnQgc3RhdGUgdmFsdWUuXFxyXFxuICAgKlxcclxcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB2YWx1ZSBvciBTdGF0ZSBpbnN0YW5jZVxcclxcbiAgICovU3RhdGVOb2RlLnByb3RvdHlwZS5nZXRTdGF0ZU5vZGVzPWZ1bmN0aW9uKHN0YXRlKXt2YXIgX2E7dmFyIF90aGlzPXRoaXM7aWYoIXN0YXRlKXtyZXR1cm5bXTt9dmFyIHN0YXRlVmFsdWU9c3RhdGUgaW5zdGFuY2VvZiBfU3RhdGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXy5TdGF0ZT9zdGF0ZS52YWx1ZTooMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy50b1N0YXRlVmFsdWUpKHN0YXRlLHRoaXMuZGVsaW1pdGVyKTtpZigoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc1N0cmluZykoc3RhdGVWYWx1ZSkpe3ZhciBpbml0aWFsU3RhdGVWYWx1ZT10aGlzLmdldFN0YXRlTm9kZShzdGF0ZVZhbHVlKS5pbml0aWFsO3JldHVybiBpbml0aWFsU3RhdGVWYWx1ZSE9PXVuZGVmaW5lZD90aGlzLmdldFN0YXRlTm9kZXMoKF9hPXt9LF9hW3N0YXRlVmFsdWVdPWluaXRpYWxTdGF0ZVZhbHVlLF9hKSk6W3RoaXMsdGhpcy5zdGF0ZXNbc3RhdGVWYWx1ZV1dO312YXIgc3ViU3RhdGVLZXlzPU9iamVjdC5rZXlzKHN0YXRlVmFsdWUpO3ZhciBzdWJTdGF0ZU5vZGVzPVt0aGlzXTtzdWJTdGF0ZU5vZGVzLnB1c2guYXBwbHkoc3ViU3RhdGVOb2RlcywoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fc3ByZWFkQXJyYXkpKFtdLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19yZWFkKSgoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5mbGF0dGVuKShzdWJTdGF0ZUtleXMubWFwKGZ1bmN0aW9uKHN1YlN0YXRlS2V5KXtyZXR1cm4gX3RoaXMuZ2V0U3RhdGVOb2RlKHN1YlN0YXRlS2V5KS5nZXRTdGF0ZU5vZGVzKHN0YXRlVmFsdWVbc3ViU3RhdGVLZXldKTt9KSkpLGZhbHNlKSk7cmV0dXJuIHN1YlN0YXRlTm9kZXM7fTsvKipcXHJcXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc3RhdGUgbm9kZSBleHBsaWNpdGx5IGhhbmRsZXMgdGhlIGdpdmVuIGV2ZW50LlxcclxcbiAgICpcXHJcXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgaW4gcXVlc3Rpb25cXHJcXG4gICAqL1N0YXRlTm9kZS5wcm90b3R5cGUuaGFuZGxlcz1mdW5jdGlvbihldmVudCl7dmFyIGV2ZW50VHlwZT0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5nZXRFdmVudFR5cGUpKGV2ZW50KTtyZXR1cm4gdGhpcy5ldmVudHMuaW5jbHVkZXMoZXZlbnRUeXBlKTt9Oy8qKlxcclxcbiAgICogUmVzb2x2ZXMgdGhlIGdpdmVuIGBzdGF0ZWAgdG8gYSBuZXcgYFN0YXRlYCBpbnN0YW5jZSByZWxhdGl2ZSB0byB0aGlzIG1hY2hpbmUuXFxyXFxuICAgKlxcclxcbiAgICogVGhpcyBlbnN1cmVzIHRoYXQgYC5ldmVudHNgIGFuZCBgLm5leHRFdmVudHNgIHJlcHJlc2VudCB0aGUgY29ycmVjdCB2YWx1ZXMuXFxyXFxuICAgKlxcclxcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byByZXNvbHZlXFxyXFxuICAgKi9TdGF0ZU5vZGUucHJvdG90eXBlLnJlc29sdmVTdGF0ZT1mdW5jdGlvbihzdGF0ZSl7dmFyIHN0YXRlRnJvbUNvbmZpZz1zdGF0ZSBpbnN0YW5jZW9mIF9TdGF0ZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLlN0YXRlP3N0YXRlOl9TdGF0ZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLlN0YXRlLmNyZWF0ZShzdGF0ZSk7dmFyIGNvbmZpZ3VyYXRpb249QXJyYXkuZnJvbSgoMCxfc3RhdGVVdGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmdldENvbmZpZ3VyYXRpb24pKFtdLHRoaXMuZ2V0U3RhdGVOb2RlcyhzdGF0ZUZyb21Db25maWcudmFsdWUpKSk7cmV0dXJuIG5ldyBfU3RhdGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXy5TdGF0ZSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSh7fSxzdGF0ZUZyb21Db25maWcpLHt2YWx1ZTp0aGlzLnJlc29sdmUoc3RhdGVGcm9tQ29uZmlnLnZhbHVlKSxjb25maWd1cmF0aW9uOmNvbmZpZ3VyYXRpb24sZG9uZTooMCxfc3RhdGVVdGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmlzSW5GaW5hbFN0YXRlKShjb25maWd1cmF0aW9uLHRoaXMpLHRhZ3M6KDAsX3N0YXRlVXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5nZXRUYWdzRnJvbUNvbmZpZ3VyYXRpb24pKGNvbmZpZ3VyYXRpb24pLG1hY2hpbmU6dGhpcy5tYWNoaW5lfSkpO307U3RhdGVOb2RlLnByb3RvdHlwZS50cmFuc2l0aW9uTGVhZk5vZGU9ZnVuY3Rpb24oc3RhdGVWYWx1ZSxzdGF0ZSxfZXZlbnQpe3ZhciBzdGF0ZU5vZGU9dGhpcy5nZXRTdGF0ZU5vZGUoc3RhdGVWYWx1ZSk7dmFyIG5leHQ9c3RhdGVOb2RlLm5leHQoc3RhdGUsX2V2ZW50KTtpZighbmV4dHx8IW5leHQudHJhbnNpdGlvbnMubGVuZ3RoKXtyZXR1cm4gdGhpcy5uZXh0KHN0YXRlLF9ldmVudCk7fXJldHVybiBuZXh0O307U3RhdGVOb2RlLnByb3RvdHlwZS50cmFuc2l0aW9uQ29tcG91bmROb2RlPWZ1bmN0aW9uKHN0YXRlVmFsdWUsc3RhdGUsX2V2ZW50KXt2YXIgc3ViU3RhdGVLZXlzPU9iamVjdC5rZXlzKHN0YXRlVmFsdWUpO3ZhciBzdGF0ZU5vZGU9dGhpcy5nZXRTdGF0ZU5vZGUoc3ViU3RhdGVLZXlzWzBdKTt2YXIgbmV4dD1zdGF0ZU5vZGUuX3RyYW5zaXRpb24oc3RhdGVWYWx1ZVtzdWJTdGF0ZUtleXNbMF1dLHN0YXRlLF9ldmVudCk7aWYoIW5leHR8fCFuZXh0LnRyYW5zaXRpb25zLmxlbmd0aCl7cmV0dXJuIHRoaXMubmV4dChzdGF0ZSxfZXZlbnQpO31yZXR1cm4gbmV4dDt9O1N0YXRlTm9kZS5wcm90b3R5cGUudHJhbnNpdGlvblBhcmFsbGVsTm9kZT1mdW5jdGlvbihzdGF0ZVZhbHVlLHN0YXRlLF9ldmVudCl7dmFyIGVfMixfYTt2YXIgdHJhbnNpdGlvbk1hcD17fTt0cnl7Zm9yKHZhciBfYj0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fdmFsdWVzKShPYmplY3Qua2V5cyhzdGF0ZVZhbHVlKSksX2M9X2IubmV4dCgpOyFfYy5kb25lO19jPV9iLm5leHQoKSl7dmFyIHN1YlN0YXRlS2V5PV9jLnZhbHVlO3ZhciBzdWJTdGF0ZVZhbHVlPXN0YXRlVmFsdWVbc3ViU3RhdGVLZXldO2lmKCFzdWJTdGF0ZVZhbHVlKXtjb250aW51ZTt9dmFyIHN1YlN0YXRlTm9kZT10aGlzLmdldFN0YXRlTm9kZShzdWJTdGF0ZUtleSk7dmFyIG5leHQ9c3ViU3RhdGVOb2RlLl90cmFuc2l0aW9uKHN1YlN0YXRlVmFsdWUsc3RhdGUsX2V2ZW50KTtpZihuZXh0KXt0cmFuc2l0aW9uTWFwW3N1YlN0YXRlS2V5XT1uZXh0O319fWNhdGNoKGVfMl8xKXtlXzI9e2Vycm9yOmVfMl8xfTt9ZmluYWxseXt0cnl7aWYoX2MmJiFfYy5kb25lJiYoX2E9X2JbXFxcInJldHVyblxcXCJdKSlfYS5jYWxsKF9iKTt9ZmluYWxseXtpZihlXzIpdGhyb3cgZV8yLmVycm9yO319dmFyIHN0YXRlVHJhbnNpdGlvbnM9T2JqZWN0LmtleXModHJhbnNpdGlvbk1hcCkubWFwKGZ1bmN0aW9uKGtleSl7cmV0dXJuIHRyYW5zaXRpb25NYXBba2V5XTt9KTt2YXIgZW5hYmxlZFRyYW5zaXRpb25zPSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmZsYXR0ZW4pKHN0YXRlVHJhbnNpdGlvbnMubWFwKGZ1bmN0aW9uKHN0KXtyZXR1cm4gc3QudHJhbnNpdGlvbnM7fSkpO3ZhciB3aWxsVHJhbnNpdGlvbj1zdGF0ZVRyYW5zaXRpb25zLnNvbWUoZnVuY3Rpb24oc3Qpe3JldHVybiBzdC50cmFuc2l0aW9ucy5sZW5ndGg+MDt9KTtpZighd2lsbFRyYW5zaXRpb24pe3JldHVybiB0aGlzLm5leHQoc3RhdGUsX2V2ZW50KTt9dmFyIGNvbmZpZ3VyYXRpb249KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZmxhdHRlbikoT2JqZWN0LmtleXModHJhbnNpdGlvbk1hcCkubWFwKGZ1bmN0aW9uKGtleSl7cmV0dXJuIHRyYW5zaXRpb25NYXBba2V5XS5jb25maWd1cmF0aW9uO30pKTtyZXR1cm57dHJhbnNpdGlvbnM6ZW5hYmxlZFRyYW5zaXRpb25zLGV4aXRTZXQ6KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZmxhdHRlbikoc3RhdGVUcmFuc2l0aW9ucy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuZXhpdFNldDt9KSksY29uZmlndXJhdGlvbjpjb25maWd1cmF0aW9uLHNvdXJjZTpzdGF0ZSxhY3Rpb25zOigwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmZsYXR0ZW4pKE9iamVjdC5rZXlzKHRyYW5zaXRpb25NYXApLm1hcChmdW5jdGlvbihrZXkpe3JldHVybiB0cmFuc2l0aW9uTWFwW2tleV0uYWN0aW9uczt9KSl9O307U3RhdGVOb2RlLnByb3RvdHlwZS5fdHJhbnNpdGlvbj1mdW5jdGlvbihzdGF0ZVZhbHVlLHN0YXRlLF9ldmVudCl7Ly8gbGVhZiBub2RlXFxuaWYoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNTdHJpbmcpKHN0YXRlVmFsdWUpKXtyZXR1cm4gdGhpcy50cmFuc2l0aW9uTGVhZk5vZGUoc3RhdGVWYWx1ZSxzdGF0ZSxfZXZlbnQpO30vLyBoaWVyYXJjaGljYWwgbm9kZVxcbmlmKE9iamVjdC5rZXlzKHN0YXRlVmFsdWUpLmxlbmd0aD09PTEpe3JldHVybiB0aGlzLnRyYW5zaXRpb25Db21wb3VuZE5vZGUoc3RhdGVWYWx1ZSxzdGF0ZSxfZXZlbnQpO30vLyBvcnRob2dvbmFsIG5vZGVcXG5yZXR1cm4gdGhpcy50cmFuc2l0aW9uUGFyYWxsZWxOb2RlKHN0YXRlVmFsdWUsc3RhdGUsX2V2ZW50KTt9O1N0YXRlTm9kZS5wcm90b3R5cGUuZ2V0VHJhbnNpdGlvbkRhdGE9ZnVuY3Rpb24oc3RhdGUsZXZlbnQpe3JldHVybiB0aGlzLl90cmFuc2l0aW9uKHN0YXRlLnZhbHVlLHN0YXRlLCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvU0NYTUxFdmVudCkoZXZlbnQpKTt9O1N0YXRlTm9kZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbihzdGF0ZSxfZXZlbnQpe3ZhciBlXzMsX2E7dmFyIF90aGlzPXRoaXM7dmFyIGV2ZW50TmFtZT1fZXZlbnQubmFtZTt2YXIgYWN0aW9ucz1bXTt2YXIgbmV4dFN0YXRlTm9kZXM9W107dmFyIHNlbGVjdGVkVHJhbnNpdGlvbjt0cnl7Zm9yKHZhciBfYj0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fdmFsdWVzKSh0aGlzLmdldENhbmRpZGF0ZXMoZXZlbnROYW1lKSksX2M9X2IubmV4dCgpOyFfYy5kb25lO19jPV9iLm5leHQoKSl7dmFyIGNhbmRpZGF0ZT1fYy52YWx1ZTt2YXIgY29uZD1jYW5kaWRhdGUuY29uZCxzdGF0ZUluPWNhbmRpZGF0ZVtcXFwiaW5cXFwiXTt2YXIgcmVzb2x2ZWRDb250ZXh0PXN0YXRlLmNvbnRleHQ7dmFyIGlzSW5TdGF0ZT1zdGF0ZUluPygwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmlzU3RyaW5nKShzdGF0ZUluKSYmaXNTdGF0ZUlkKHN0YXRlSW4pPy8vIENoZWNrIGlmIGluIHN0YXRlIGJ5IElEXFxuc3RhdGUubWF0Y2hlcygoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy50b1N0YXRlVmFsdWUpKHRoaXMuZ2V0U3RhdGVOb2RlQnlJZChzdGF0ZUluKS5wYXRoLHRoaXMuZGVsaW1pdGVyKSk6Ly8gQ2hlY2sgaWYgaW4gc3RhdGUgYnkgcmVsYXRpdmUgZ3JhbmRwYXJlbnRcXG4oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5tYXRjaGVzU3RhdGUpKCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvU3RhdGVWYWx1ZSkoc3RhdGVJbix0aGlzLmRlbGltaXRlciksKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ucGF0aCkodGhpcy5wYXRoLnNsaWNlKDAsLTIpKShzdGF0ZS52YWx1ZSkpOnRydWU7dmFyIGd1YXJkUGFzc2VkPWZhbHNlO3RyeXtndWFyZFBhc3NlZD0hY29uZHx8KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZXZhbHVhdGVHdWFyZCkodGhpcy5tYWNoaW5lLGNvbmQscmVzb2x2ZWRDb250ZXh0LF9ldmVudCxzdGF0ZSk7fWNhdGNoKGVycil7dGhyb3cgbmV3IEVycm9yKFxcXCJVbmFibGUgdG8gZXZhbHVhdGUgZ3VhcmQgJ1xcXCIuY29uY2F0KGNvbmQubmFtZXx8Y29uZC50eXBlLFxcXCInIGluIHRyYW5zaXRpb24gZm9yIGV2ZW50ICdcXFwiKS5jb25jYXQoZXZlbnROYW1lLFxcXCInIGluIHN0YXRlIG5vZGUgJ1xcXCIpLmNvbmNhdCh0aGlzLmlkLFxcXCInOlxcXFxuXFxcIikuY29uY2F0KGVyci5tZXNzYWdlKSk7fWlmKGd1YXJkUGFzc2VkJiZpc0luU3RhdGUpe2lmKGNhbmRpZGF0ZS50YXJnZXQhPT11bmRlZmluZWQpe25leHRTdGF0ZU5vZGVzPWNhbmRpZGF0ZS50YXJnZXQ7fWFjdGlvbnMucHVzaC5hcHBseShhY3Rpb25zLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19zcHJlYWRBcnJheSkoW10sKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3JlYWQpKGNhbmRpZGF0ZS5hY3Rpb25zKSxmYWxzZSkpO3NlbGVjdGVkVHJhbnNpdGlvbj1jYW5kaWRhdGU7YnJlYWs7fX19Y2F0Y2goZV8zXzEpe2VfMz17ZXJyb3I6ZV8zXzF9O31maW5hbGx5e3RyeXtpZihfYyYmIV9jLmRvbmUmJihfYT1fYltcXFwicmV0dXJuXFxcIl0pKV9hLmNhbGwoX2IpO31maW5hbGx5e2lmKGVfMyl0aHJvdyBlXzMuZXJyb3I7fX1pZighc2VsZWN0ZWRUcmFuc2l0aW9uKXtyZXR1cm4gdW5kZWZpbmVkO31pZighbmV4dFN0YXRlTm9kZXMubGVuZ3RoKXtyZXR1cm57dHJhbnNpdGlvbnM6W3NlbGVjdGVkVHJhbnNpdGlvbl0sZXhpdFNldDpbXSxjb25maWd1cmF0aW9uOnN0YXRlLnZhbHVlP1t0aGlzXTpbXSxzb3VyY2U6c3RhdGUsYWN0aW9uczphY3Rpb25zfTt9dmFyIGFsbE5leHRTdGF0ZU5vZGVzPSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmZsYXR0ZW4pKG5leHRTdGF0ZU5vZGVzLm1hcChmdW5jdGlvbihzdGF0ZU5vZGUpe3JldHVybiBfdGhpcy5nZXRSZWxhdGl2ZVN0YXRlTm9kZXMoc3RhdGVOb2RlLHN0YXRlLmhpc3RvcnlWYWx1ZSk7fSkpO3ZhciBpc0ludGVybmFsPSEhc2VsZWN0ZWRUcmFuc2l0aW9uLmludGVybmFsO3JldHVybnt0cmFuc2l0aW9uczpbc2VsZWN0ZWRUcmFuc2l0aW9uXSxleGl0U2V0OmlzSW50ZXJuYWw/W106KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZmxhdHRlbikobmV4dFN0YXRlTm9kZXMubWFwKGZ1bmN0aW9uKHRhcmdldE5vZGUpe3JldHVybiBfdGhpcy5nZXRQb3RlbnRpYWxseVJlZW50ZXJpbmdOb2Rlcyh0YXJnZXROb2RlKTt9KSksY29uZmlndXJhdGlvbjphbGxOZXh0U3RhdGVOb2Rlcyxzb3VyY2U6c3RhdGUsYWN0aW9uczphY3Rpb25zfTt9Oy8vIGV2ZW4gdGhvdWdoIHRoZSBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gbWVudGlvbnMgcmVlbnRyeSBub2Rlc1xcbi8vIHdlIGFyZSBwdXNoaW5nIGl0cyByZXN1bHQgaW50byBgZXhpdFNldGBcXG4vLyB0aGF0J3MgYmVjYXVzZSB3aGF0IHdlIGV4aXQgbWlnaHQgYmUgcmVlbnRlcmVkIChpdCdzIGFuIGludmFyaWFudCBvZiByZWVudHJhbmN5KVxcblN0YXRlTm9kZS5wcm90b3R5cGUuZ2V0UG90ZW50aWFsbHlSZWVudGVyaW5nTm9kZXM9ZnVuY3Rpb24odGFyZ2V0Tm9kZSl7aWYodGhpcy5vcmRlcjx0YXJnZXROb2RlLm9yZGVyKXtyZXR1cm5bdGhpc107fXZhciBub2Rlcz1bXTt2YXIgbWFya2VyPXRoaXM7dmFyIHBvc3NpYmxlQW5jZXN0b3I9dGFyZ2V0Tm9kZTt3aGlsZShtYXJrZXImJm1hcmtlciE9PXBvc3NpYmxlQW5jZXN0b3Ipe25vZGVzLnB1c2gobWFya2VyKTttYXJrZXI9bWFya2VyLnBhcmVudDt9aWYobWFya2VyIT09cG9zc2libGVBbmNlc3Rvcil7Ly8gd2UgbmV2ZXIgZ290IHRvIGBwb3NzaWJsZUFuY2VzdG9yYCwgdGhlcmVmb3JlIHRoZSBpbml0aWFsIGBtYXJrZXJgIFxcXCJlc2NhcGVzXFxcIiBpdFxcbi8vIGl0J3MgaW4gYSBkaWZmZXJlbnQgcGFydCBvZiB0aGUgdHJlZSBzbyBubyBzdGF0ZXMgd2lsbCBiZSByZWVudGVyZWQgZm9yIHN1Y2ggYW4gZXh0ZXJuYWwgdHJhbnNpdGlvblxcbnJldHVybltdO31ub2Rlcy5wdXNoKHBvc3NpYmxlQW5jZXN0b3IpO3JldHVybiBub2Rlczt9O1N0YXRlTm9kZS5wcm90b3R5cGUuZ2V0QWN0aW9ucz1mdW5jdGlvbihyZXNvbHZlZENvbmZpZyxpc0RvbmUsdHJhbnNpdGlvbixjdXJyZW50Q29udGV4dCxfZXZlbnQscHJldlN0YXRlLHByZWRpY3RhYmxlRXhlYyl7dmFyIGVfNCxfYSxlXzUsX2I7dmFyIF90aGlzPXRoaXM7dmFyIHByZXZDb25maWc9cHJldlN0YXRlPygwLF9zdGF0ZVV0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uZ2V0Q29uZmlndXJhdGlvbikoW10sdGhpcy5nZXRTdGF0ZU5vZGVzKHByZXZTdGF0ZS52YWx1ZSkpOltdO3ZhciBlbnRyeVNldD1uZXcgU2V0KCk7dHJ5e2Zvcih2YXIgX2M9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3ZhbHVlcykoQXJyYXkuZnJvbShyZXNvbHZlZENvbmZpZykuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLm9yZGVyLWIub3JkZXI7fSkpLF9kPV9jLm5leHQoKTshX2QuZG9uZTtfZD1fYy5uZXh0KCkpe3ZhciBzbj1fZC52YWx1ZTtpZighKDAsX3N0YXRlVXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5oYXMpKHByZXZDb25maWcsc24pfHwoMCxfc3RhdGVVdGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmhhcykodHJhbnNpdGlvbi5leGl0U2V0LHNuKXx8c24ucGFyZW50JiZlbnRyeVNldC5oYXMoc24ucGFyZW50KSl7ZW50cnlTZXQuYWRkKHNuKTt9fX1jYXRjaChlXzRfMSl7ZV80PXtlcnJvcjplXzRfMX07fWZpbmFsbHl7dHJ5e2lmKF9kJiYhX2QuZG9uZSYmKF9hPV9jW1xcXCJyZXR1cm5cXFwiXSkpX2EuY2FsbChfYyk7fWZpbmFsbHl7aWYoZV80KXRocm93IGVfNC5lcnJvcjt9fXRyeXtmb3IodmFyIHByZXZDb25maWdfMT0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fdmFsdWVzKShwcmV2Q29uZmlnKSxwcmV2Q29uZmlnXzFfMT1wcmV2Q29uZmlnXzEubmV4dCgpOyFwcmV2Q29uZmlnXzFfMS5kb25lO3ByZXZDb25maWdfMV8xPXByZXZDb25maWdfMS5uZXh0KCkpe3ZhciBzbj1wcmV2Q29uZmlnXzFfMS52YWx1ZTtpZighKDAsX3N0YXRlVXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5oYXMpKHJlc29sdmVkQ29uZmlnLHNuKXx8KDAsX3N0YXRlVXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5oYXMpKHRyYW5zaXRpb24uZXhpdFNldCxzbi5wYXJlbnQpKXt0cmFuc2l0aW9uLmV4aXRTZXQucHVzaChzbik7fX19Y2F0Y2goZV81XzEpe2VfNT17ZXJyb3I6ZV81XzF9O31maW5hbGx5e3RyeXtpZihwcmV2Q29uZmlnXzFfMSYmIXByZXZDb25maWdfMV8xLmRvbmUmJihfYj1wcmV2Q29uZmlnXzFbXFxcInJldHVyblxcXCJdKSlfYi5jYWxsKHByZXZDb25maWdfMSk7fWZpbmFsbHl7aWYoZV81KXRocm93IGVfNS5lcnJvcjt9fXRyYW5zaXRpb24uZXhpdFNldC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGIub3JkZXItYS5vcmRlcjt9KTt2YXIgZW50cnlTdGF0ZXM9QXJyYXkuZnJvbShlbnRyeVNldCkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLm9yZGVyLWIub3JkZXI7fSk7dmFyIGV4aXRTdGF0ZXM9bmV3IFNldCh0cmFuc2l0aW9uLmV4aXRTZXQpO3ZhciBkb25lRXZlbnRzPSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmZsYXR0ZW4pKGVudHJ5U3RhdGVzLm1hcChmdW5jdGlvbihzbil7dmFyIGV2ZW50cz1bXTtpZihzbi50eXBlIT09J2ZpbmFsJyl7cmV0dXJuIGV2ZW50czt9dmFyIHBhcmVudD1zbi5wYXJlbnQ7aWYoIXBhcmVudC5wYXJlbnQpe3JldHVybiBldmVudHM7fWV2ZW50cy5wdXNoKCgwLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uZG9uZSkoc24uaWQsc24uZG9uZURhdGEpLC8vIFRPRE86IGRlcHJlY2F0ZSAtIGZpbmFsIHN0YXRlcyBzaG91bGQgbm90IGVtaXQgZG9uZSBldmVudHMgZm9yIHRoZWlyIG93biBzdGF0ZS5cXG4oMCxfYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLmRvbmUpKHBhcmVudC5pZCxzbi5kb25lRGF0YT8oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5tYXBDb250ZXh0KShzbi5kb25lRGF0YSxjdXJyZW50Q29udGV4dCxfZXZlbnQpOnVuZGVmaW5lZCkpO3ZhciBncmFuZHBhcmVudD1wYXJlbnQucGFyZW50O2lmKGdyYW5kcGFyZW50LnR5cGU9PT0ncGFyYWxsZWwnKXtpZigoMCxfc3RhdGVVdGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmdldENoaWxkcmVuKShncmFuZHBhcmVudCkuZXZlcnkoZnVuY3Rpb24ocGFyZW50Tm9kZSl7cmV0dXJuKDAsX3N0YXRlVXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5pc0luRmluYWxTdGF0ZSkodHJhbnNpdGlvbi5jb25maWd1cmF0aW9uLHBhcmVudE5vZGUpO30pKXtldmVudHMucHVzaCgoMCxfYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLmRvbmUpKGdyYW5kcGFyZW50LmlkKSk7fX1yZXR1cm4gZXZlbnRzO30pKTt2YXIgZW50cnlBY3Rpb25zPWVudHJ5U3RhdGVzLm1hcChmdW5jdGlvbihzdGF0ZU5vZGUpe3ZhciBlbnRyeUFjdGlvbnM9c3RhdGVOb2RlLm9uRW50cnk7dmFyIGludm9rZUFjdGlvbnM9c3RhdGVOb2RlLmFjdGl2aXRpZXMubWFwKGZ1bmN0aW9uKGFjdGl2aXR5KXtyZXR1cm4oMCxfYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLnN0YXJ0KShhY3Rpdml0eSk7fSk7cmV0dXJue3R5cGU6J2VudHJ5JyxhY3Rpb25zOigwLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18udG9BY3Rpb25PYmplY3RzKShwcmVkaWN0YWJsZUV4ZWM/KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3NwcmVhZEFycmF5KSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fc3ByZWFkQXJyYXkpKFtdLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19yZWFkKShlbnRyeUFjdGlvbnMpLGZhbHNlKSwoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fcmVhZCkoaW52b2tlQWN0aW9ucyksZmFsc2UpOigwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19zcHJlYWRBcnJheSkoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3NwcmVhZEFycmF5KShbXSwoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fcmVhZCkoaW52b2tlQWN0aW9ucyksZmFsc2UpLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19yZWFkKShlbnRyeUFjdGlvbnMpLGZhbHNlKSxfdGhpcy5tYWNoaW5lLm9wdGlvbnMuYWN0aW9ucyl9O30pLmNvbmNhdCh7dHlwZTonc3RhdGVfZG9uZScsYWN0aW9uczpkb25lRXZlbnRzLm1hcChmdW5jdGlvbihldmVudCl7cmV0dXJuKDAsX2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5yYWlzZSkoZXZlbnQpO30pfSk7dmFyIGV4aXRBY3Rpb25zPUFycmF5LmZyb20oZXhpdFN0YXRlcykubWFwKGZ1bmN0aW9uKHN0YXRlTm9kZSl7cmV0dXJue3R5cGU6J2V4aXQnLGFjdGlvbnM6KDAsX2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy50b0FjdGlvbk9iamVjdHMpKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19zcHJlYWRBcnJheSkoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3NwcmVhZEFycmF5KShbXSwoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fcmVhZCkoc3RhdGVOb2RlLm9uRXhpdCksZmFsc2UpLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19yZWFkKShzdGF0ZU5vZGUuYWN0aXZpdGllcy5tYXAoZnVuY3Rpb24oYWN0aXZpdHkpe3JldHVybigwLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uc3RvcCkoYWN0aXZpdHkpO30pKSxmYWxzZSksX3RoaXMubWFjaGluZS5vcHRpb25zLmFjdGlvbnMpfTt9KTt2YXIgYWN0aW9ucz1leGl0QWN0aW9ucy5jb25jYXQoe3R5cGU6J3RyYW5zaXRpb24nLGFjdGlvbnM6KDAsX2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy50b0FjdGlvbk9iamVjdHMpKHRyYW5zaXRpb24uYWN0aW9ucyx0aGlzLm1hY2hpbmUub3B0aW9ucy5hY3Rpb25zKX0pLmNvbmNhdChlbnRyeUFjdGlvbnMpO2lmKGlzRG9uZSl7dmFyIHN0b3BBY3Rpb25zPSgwLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18udG9BY3Rpb25PYmplY3RzKSgoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5mbGF0dGVuKSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fc3ByZWFkQXJyYXkpKFtdLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19yZWFkKShyZXNvbHZlZENvbmZpZyksZmFsc2UpLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5vcmRlci1hLm9yZGVyO30pLm1hcChmdW5jdGlvbihzdGF0ZU5vZGUpe3JldHVybiBzdGF0ZU5vZGUub25FeGl0O30pKSx0aGlzLm1hY2hpbmUub3B0aW9ucy5hY3Rpb25zKS5maWx0ZXIoZnVuY3Rpb24oYWN0aW9uKXtyZXR1cm4hKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNSYWlzYWJsZUFjdGlvbikoYWN0aW9uKTt9KTtyZXR1cm4gYWN0aW9ucy5jb25jYXQoe3R5cGU6J3N0b3AnLGFjdGlvbnM6c3RvcEFjdGlvbnN9KTt9cmV0dXJuIGFjdGlvbnM7fTsvKipcXHJcXG4gICAqIERldGVybWluZXMgdGhlIG5leHQgc3RhdGUgZ2l2ZW4gdGhlIGN1cnJlbnQgYHN0YXRlYCBhbmQgc2VudCBgZXZlbnRgLlxcclxcbiAgICpcXHJcXG4gICAqIEBwYXJhbSBzdGF0ZSBUaGUgY3VycmVudCBTdGF0ZSBpbnN0YW5jZSBvciBzdGF0ZSB2YWx1ZVxcclxcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0aGF0IHdhcyBzZW50IGF0IHRoZSBjdXJyZW50IHN0YXRlXFxyXFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY3VycmVudCBjb250ZXh0IChleHRlbmRlZCBzdGF0ZSkgb2YgdGhlIGN1cnJlbnQgc3RhdGVcXHJcXG4gICAqL1N0YXRlTm9kZS5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbihzdGF0ZSxldmVudCxjb250ZXh0LGV4ZWMpe2lmKHN0YXRlPT09dm9pZCAwKXtzdGF0ZT10aGlzLmluaXRpYWxTdGF0ZTt9dmFyIF9ldmVudD0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy50b1NDWE1MRXZlbnQpKGV2ZW50KTt2YXIgY3VycmVudFN0YXRlO2lmKHN0YXRlIGluc3RhbmNlb2YgX1N0YXRlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18uU3RhdGUpe2N1cnJlbnRTdGF0ZT1jb250ZXh0PT09dW5kZWZpbmVkP3N0YXRlOnRoaXMucmVzb2x2ZVN0YXRlKF9TdGF0ZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLlN0YXRlLmZyb20oc3RhdGUsY29udGV4dCkpO31lbHNle3ZhciByZXNvbHZlZFN0YXRlVmFsdWU9KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNTdHJpbmcpKHN0YXRlKT90aGlzLnJlc29sdmUoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ucGF0aFRvU3RhdGVWYWx1ZSkodGhpcy5nZXRSZXNvbHZlZFBhdGgoc3RhdGUpKSk6dGhpcy5yZXNvbHZlKHN0YXRlKTt2YXIgcmVzb2x2ZWRDb250ZXh0PWNvbnRleHQhPT1udWxsJiZjb250ZXh0IT09dm9pZCAwP2NvbnRleHQ6dGhpcy5tYWNoaW5lLmNvbnRleHQ7Y3VycmVudFN0YXRlPXRoaXMucmVzb2x2ZVN0YXRlKF9TdGF0ZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLlN0YXRlLmZyb20ocmVzb2x2ZWRTdGF0ZVZhbHVlLHJlc29sdmVkQ29udGV4dCkpO31pZighX2Vudmlyb25tZW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uSVNfUFJPRFVDVElPTiYmX2V2ZW50Lm5hbWU9PT1XSUxEQ0FSRCl7dGhyb3cgbmV3IEVycm9yKFxcXCJBbiBldmVudCBjYW5ub3QgaGF2ZSB0aGUgd2lsZGNhcmQgdHlwZSAoJ1xcXCIuY29uY2F0KFdJTERDQVJELFxcXCInKVxcXCIpKTt9aWYodGhpcy5zdHJpY3Qpe2lmKCF0aGlzLmV2ZW50cy5pbmNsdWRlcyhfZXZlbnQubmFtZSkmJiEoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc0J1aWx0SW5FdmVudCkoX2V2ZW50Lm5hbWUpKXt0aHJvdyBuZXcgRXJyb3IoXFxcIk1hY2hpbmUgJ1xcXCIuY29uY2F0KHRoaXMuaWQsXFxcIicgZG9lcyBub3QgYWNjZXB0IGV2ZW50ICdcXFwiKS5jb25jYXQoX2V2ZW50Lm5hbWUsXFxcIidcXFwiKSk7fX12YXIgc3RhdGVUcmFuc2l0aW9uPXRoaXMuX3RyYW5zaXRpb24oY3VycmVudFN0YXRlLnZhbHVlLGN1cnJlbnRTdGF0ZSxfZXZlbnQpfHx7dHJhbnNpdGlvbnM6W10sY29uZmlndXJhdGlvbjpbXSxleGl0U2V0OltdLHNvdXJjZTpjdXJyZW50U3RhdGUsYWN0aW9uczpbXX07dmFyIHByZXZDb25maWc9KDAsX3N0YXRlVXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5nZXRDb25maWd1cmF0aW9uKShbXSx0aGlzLmdldFN0YXRlTm9kZXMoY3VycmVudFN0YXRlLnZhbHVlKSk7dmFyIHJlc29sdmVkQ29uZmlnPXN0YXRlVHJhbnNpdGlvbi5jb25maWd1cmF0aW9uLmxlbmd0aD8oMCxfc3RhdGVVdGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmdldENvbmZpZ3VyYXRpb24pKHByZXZDb25maWcsc3RhdGVUcmFuc2l0aW9uLmNvbmZpZ3VyYXRpb24pOnByZXZDb25maWc7c3RhdGVUcmFuc2l0aW9uLmNvbmZpZ3VyYXRpb249KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3NwcmVhZEFycmF5KShbXSwoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fcmVhZCkocmVzb2x2ZWRDb25maWcpLGZhbHNlKTtyZXR1cm4gdGhpcy5yZXNvbHZlVHJhbnNpdGlvbihzdGF0ZVRyYW5zaXRpb24sY3VycmVudFN0YXRlLGN1cnJlbnRTdGF0ZS5jb250ZXh0LGV4ZWMsX2V2ZW50KTt9O1N0YXRlTm9kZS5wcm90b3R5cGUucmVzb2x2ZVJhaXNlZFRyYW5zaXRpb249ZnVuY3Rpb24oc3RhdGUsX2V2ZW50LG9yaWdpbmFsRXZlbnQscHJlZGljdGFibGVFeGVjKXt2YXIgX2E7dmFyIGN1cnJlbnRBY3Rpb25zPXN0YXRlLmFjdGlvbnM7c3RhdGU9dGhpcy50cmFuc2l0aW9uKHN0YXRlLF9ldmVudCx1bmRlZmluZWQscHJlZGljdGFibGVFeGVjKTsvLyBTYXZlIG9yaWdpbmFsIGV2ZW50IHRvIHN0YXRlXFxuLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgdGhlIHJhaXNlZCBldmVudCEgRGVsZXRlIGluIFY1IChicmVha2luZylcXG5zdGF0ZS5fZXZlbnQ9b3JpZ2luYWxFdmVudDtzdGF0ZS5ldmVudD1vcmlnaW5hbEV2ZW50LmRhdGE7KF9hPXN0YXRlLmFjdGlvbnMpLnVuc2hpZnQuYXBwbHkoX2EsKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3NwcmVhZEFycmF5KShbXSwoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fcmVhZCkoY3VycmVudEFjdGlvbnMpLGZhbHNlKSk7cmV0dXJuIHN0YXRlO307U3RhdGVOb2RlLnByb3RvdHlwZS5yZXNvbHZlVHJhbnNpdGlvbj1mdW5jdGlvbihzdGF0ZVRyYW5zaXRpb24sY3VycmVudFN0YXRlLGNvbnRleHQscHJlZGljdGFibGVFeGVjLF9ldmVudCl7dmFyIGVfNixfYSxlXzcsX2I7dmFyIF90aGlzPXRoaXM7aWYoX2V2ZW50PT09dm9pZCAwKXtfZXZlbnQ9X2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5pbml0RXZlbnQ7fXZhciBjb25maWd1cmF0aW9uPXN0YXRlVHJhbnNpdGlvbi5jb25maWd1cmF0aW9uOy8vIFRyYW5zaXRpb24gd2lsbCBcXFwiYXBwbHlcXFwiIGlmOlxcbi8vIC0gdGhpcyBpcyB0aGUgaW5pdGlhbCBzdGF0ZSAodGhlcmUgaXMgbm8gY3VycmVudCBzdGF0ZSlcXG4vLyAtIE9SIHRoZXJlIGFyZSB0cmFuc2l0aW9uc1xcbnZhciB3aWxsVHJhbnNpdGlvbj0hY3VycmVudFN0YXRlfHxzdGF0ZVRyYW5zaXRpb24udHJhbnNpdGlvbnMubGVuZ3RoPjA7dmFyIHJlc29sdmVkQ29uZmlndXJhdGlvbj13aWxsVHJhbnNpdGlvbj9zdGF0ZVRyYW5zaXRpb24uY29uZmlndXJhdGlvbjpjdXJyZW50U3RhdGU/Y3VycmVudFN0YXRlLmNvbmZpZ3VyYXRpb246W107dmFyIGlzRG9uZT0oMCxfc3RhdGVVdGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmlzSW5GaW5hbFN0YXRlKShyZXNvbHZlZENvbmZpZ3VyYXRpb24sdGhpcyk7dmFyIHJlc29sdmVkU3RhdGVWYWx1ZT13aWxsVHJhbnNpdGlvbj8oMCxfc3RhdGVVdGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmdldFZhbHVlKSh0aGlzLm1hY2hpbmUsY29uZmlndXJhdGlvbik6dW5kZWZpbmVkO3ZhciBoaXN0b3J5VmFsdWU9Y3VycmVudFN0YXRlP2N1cnJlbnRTdGF0ZS5oaXN0b3J5VmFsdWU/Y3VycmVudFN0YXRlLmhpc3RvcnlWYWx1ZTpzdGF0ZVRyYW5zaXRpb24uc291cmNlP3RoaXMubWFjaGluZS5oaXN0b3J5VmFsdWUoY3VycmVudFN0YXRlLnZhbHVlKTp1bmRlZmluZWQ6dW5kZWZpbmVkO3ZhciBhY3Rpb25CbG9ja3M9dGhpcy5nZXRBY3Rpb25zKG5ldyBTZXQocmVzb2x2ZWRDb25maWd1cmF0aW9uKSxpc0RvbmUsc3RhdGVUcmFuc2l0aW9uLGNvbnRleHQsX2V2ZW50LGN1cnJlbnRTdGF0ZSxwcmVkaWN0YWJsZUV4ZWMpO3ZhciBhY3Rpdml0aWVzPWN1cnJlbnRTdGF0ZT8oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSh7fSxjdXJyZW50U3RhdGUuYWN0aXZpdGllcyk6e307dHJ5e2Zvcih2YXIgYWN0aW9uQmxvY2tzXzE9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3ZhbHVlcykoYWN0aW9uQmxvY2tzKSxhY3Rpb25CbG9ja3NfMV8xPWFjdGlvbkJsb2Nrc18xLm5leHQoKTshYWN0aW9uQmxvY2tzXzFfMS5kb25lO2FjdGlvbkJsb2Nrc18xXzE9YWN0aW9uQmxvY2tzXzEubmV4dCgpKXt2YXIgYmxvY2s9YWN0aW9uQmxvY2tzXzFfMS52YWx1ZTt0cnl7Zm9yKHZhciBfYz0oZV83PXZvaWQgMCwoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fdmFsdWVzKShibG9jay5hY3Rpb25zKSksX2Q9X2MubmV4dCgpOyFfZC5kb25lO19kPV9jLm5leHQoKSl7dmFyIGFjdGlvbj1fZC52YWx1ZTtpZihhY3Rpb24udHlwZT09PV9hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fLnN0YXJ0KXthY3Rpdml0aWVzW2FjdGlvbi5hY3Rpdml0eS5pZHx8YWN0aW9uLmFjdGl2aXR5LnR5cGVdPWFjdGlvbjt9ZWxzZSBpZihhY3Rpb24udHlwZT09PV9hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fLnN0b3Ape2FjdGl2aXRpZXNbYWN0aW9uLmFjdGl2aXR5LmlkfHxhY3Rpb24uYWN0aXZpdHkudHlwZV09ZmFsc2U7fX19Y2F0Y2goZV83XzEpe2VfNz17ZXJyb3I6ZV83XzF9O31maW5hbGx5e3RyeXtpZihfZCYmIV9kLmRvbmUmJihfYj1fY1tcXFwicmV0dXJuXFxcIl0pKV9iLmNhbGwoX2MpO31maW5hbGx5e2lmKGVfNyl0aHJvdyBlXzcuZXJyb3I7fX19fWNhdGNoKGVfNl8xKXtlXzY9e2Vycm9yOmVfNl8xfTt9ZmluYWxseXt0cnl7aWYoYWN0aW9uQmxvY2tzXzFfMSYmIWFjdGlvbkJsb2Nrc18xXzEuZG9uZSYmKF9hPWFjdGlvbkJsb2Nrc18xW1xcXCJyZXR1cm5cXFwiXSkpX2EuY2FsbChhY3Rpb25CbG9ja3NfMSk7fWZpbmFsbHl7aWYoZV82KXRocm93IGVfNi5lcnJvcjt9fXZhciBfZT0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fcmVhZCkoKDAsX2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5yZXNvbHZlQWN0aW9ucykodGhpcyxjdXJyZW50U3RhdGUsY29udGV4dCxfZXZlbnQsYWN0aW9uQmxvY2tzLHByZWRpY3RhYmxlRXhlYyx0aGlzLm1hY2hpbmUuY29uZmlnLnByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzfHx0aGlzLm1hY2hpbmUuY29uZmlnLnByZXNlcnZlQWN0aW9uT3JkZXIpLDIpLHJlc29sdmVkQWN0aW9ucz1fZVswXSx1cGRhdGVkQ29udGV4dD1fZVsxXTt2YXIgX2Y9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3JlYWQpKCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnBhcnRpdGlvbikocmVzb2x2ZWRBY3Rpb25zLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmlzUmFpc2FibGVBY3Rpb24pLDIpLHJhaXNlZEV2ZW50cz1fZlswXSxub25SYWlzZWRBY3Rpb25zPV9mWzFdO3ZhciBpbnZva2VBY3Rpb25zPXJlc29sdmVkQWN0aW9ucy5maWx0ZXIoZnVuY3Rpb24oYWN0aW9uKXt2YXIgX2E7cmV0dXJuIGFjdGlvbi50eXBlPT09X2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X18uc3RhcnQmJigoX2E9YWN0aW9uLmFjdGl2aXR5KT09PW51bGx8fF9hPT09dm9pZCAwP3ZvaWQgMDpfYS50eXBlKT09PV9hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fLmludm9rZTt9KTt2YXIgY2hpbGRyZW49aW52b2tlQWN0aW9ucy5yZWR1Y2UoZnVuY3Rpb24oYWNjLGFjdGlvbil7YWNjW2FjdGlvbi5hY3Rpdml0eS5pZF09KDAsX0FjdG9yX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18uY3JlYXRlSW52b2NhYmxlQWN0b3IpKGFjdGlvbi5hY3Rpdml0eSxfdGhpcy5tYWNoaW5lLHVwZGF0ZWRDb250ZXh0LF9ldmVudCk7cmV0dXJuIGFjYzt9LGN1cnJlbnRTdGF0ZT8oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSh7fSxjdXJyZW50U3RhdGUuY2hpbGRyZW4pOnt9KTt2YXIgbmV4dFN0YXRlPW5ldyBfU3RhdGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXy5TdGF0ZSh7dmFsdWU6cmVzb2x2ZWRTdGF0ZVZhbHVlfHxjdXJyZW50U3RhdGUudmFsdWUsY29udGV4dDp1cGRhdGVkQ29udGV4dCxfZXZlbnQ6X2V2ZW50LC8vIFBlcnNpc3QgX3Nlc3Npb25pZCBiZXR3ZWVuIHN0YXRlc1xcbl9zZXNzaW9uaWQ6Y3VycmVudFN0YXRlP2N1cnJlbnRTdGF0ZS5fc2Vzc2lvbmlkOm51bGwsaGlzdG9yeVZhbHVlOnJlc29sdmVkU3RhdGVWYWx1ZT9oaXN0b3J5VmFsdWU/KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udXBkYXRlSGlzdG9yeVZhbHVlKShoaXN0b3J5VmFsdWUscmVzb2x2ZWRTdGF0ZVZhbHVlKTp1bmRlZmluZWQ6Y3VycmVudFN0YXRlP2N1cnJlbnRTdGF0ZS5oaXN0b3J5VmFsdWU6dW5kZWZpbmVkLGhpc3Rvcnk6IXJlc29sdmVkU3RhdGVWYWx1ZXx8c3RhdGVUcmFuc2l0aW9uLnNvdXJjZT9jdXJyZW50U3RhdGU6dW5kZWZpbmVkLGFjdGlvbnM6cmVzb2x2ZWRTdGF0ZVZhbHVlP25vblJhaXNlZEFjdGlvbnM6W10sYWN0aXZpdGllczpyZXNvbHZlZFN0YXRlVmFsdWU/YWN0aXZpdGllczpjdXJyZW50U3RhdGU/Y3VycmVudFN0YXRlLmFjdGl2aXRpZXM6e30sZXZlbnRzOltdLGNvbmZpZ3VyYXRpb246cmVzb2x2ZWRDb25maWd1cmF0aW9uLHRyYW5zaXRpb25zOnN0YXRlVHJhbnNpdGlvbi50cmFuc2l0aW9ucyxjaGlsZHJlbjpjaGlsZHJlbixkb25lOmlzRG9uZSx0YWdzOigwLF9zdGF0ZVV0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uZ2V0VGFnc0Zyb21Db25maWd1cmF0aW9uKShyZXNvbHZlZENvbmZpZ3VyYXRpb24pLG1hY2hpbmU6dGhpc30pO3ZhciBkaWRVcGRhdGVDb250ZXh0PWNvbnRleHQhPT11cGRhdGVkQ29udGV4dDtuZXh0U3RhdGUuY2hhbmdlZD1fZXZlbnQubmFtZT09PV9hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fLnVwZGF0ZXx8ZGlkVXBkYXRlQ29udGV4dDsvLyBEaXNwb3NlIG9mIHBlbnVsdGltYXRlIGhpc3RvcmllcyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrc1xcbnZhciBoaXN0b3J5PW5leHRTdGF0ZS5oaXN0b3J5O2lmKGhpc3Rvcnkpe2RlbGV0ZSBoaXN0b3J5Lmhpc3Rvcnk7fS8vIFRoZXJlIGFyZSB0cmFuc2llbnQgdHJhbnNpdGlvbnMgaWYgdGhlIG1hY2hpbmUgaXMgbm90IGluIGEgZmluYWwgc3RhdGVcXG4vLyBhbmQgaWYgc29tZSBvZiB0aGUgc3RhdGUgbm9kZXMgaGF2ZSB0cmFuc2llbnQgKFxcXCJhbHdheXNcXFwiKSB0cmFuc2l0aW9ucy5cXG52YXIgaGFzQWx3YXlzVHJhbnNpdGlvbnM9IWlzRG9uZSYmKHRoaXMuX3RyYW5zaWVudHx8Y29uZmlndXJhdGlvbi5zb21lKGZ1bmN0aW9uKHN0YXRlTm9kZSl7cmV0dXJuIHN0YXRlTm9kZS5fdHJhbnNpZW50O30pKTsvLyBJZiB0aGVyZSBhcmUgbm8gZW5hYmxlZCB0cmFuc2l0aW9ucywgY2hlY2sgaWYgdGhlcmUgYXJlIHRyYW5zaWVudCB0cmFuc2l0aW9ucy5cXG4vLyBJZiB0aGVyZSBhcmUgdHJhbnNpZW50IHRyYW5zaXRpb25zLCBjb250aW51ZSBjaGVja2luZyBmb3IgbW9yZSB0cmFuc2l0aW9uc1xcbi8vIGJlY2F1c2UgYW4gdHJhbnNpZW50IHRyYW5zaXRpb24gc2hvdWxkIGJlIHRyaWdnZXJlZCBldmVuIGlmIHRoZXJlIGFyZSBub1xcbi8vIGVuYWJsZWQgdHJhbnNpdGlvbnMuXFxuLy9cXG4vLyBJZiB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgb24gYW4gdHJhbnNpZW50IHRyYW5zaXRpb24gdGhlbiBzdG9wIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcC5cXG4vL1xcbi8vIE90aGVyd2lzZSwgaWYgdGhlcmUgYXJlIG5vIGVuYWJsZWQgbm9yIHRyYW5zaWVudCB0cmFuc2l0aW9ucywgd2UgYXJlIGRvbmUuXFxuaWYoIXdpbGxUcmFuc2l0aW9uJiYoIWhhc0Fsd2F5c1RyYW5zaXRpb25zfHxfZXZlbnQubmFtZT09PU5VTExfRVZFTlQpKXtyZXR1cm4gbmV4dFN0YXRlO312YXIgbWF5YmVOZXh0U3RhdGU9bmV4dFN0YXRlO2lmKCFpc0RvbmUpe2lmKGhhc0Fsd2F5c1RyYW5zaXRpb25zKXttYXliZU5leHRTdGF0ZT10aGlzLnJlc29sdmVSYWlzZWRUcmFuc2l0aW9uKG1heWJlTmV4dFN0YXRlLHt0eXBlOl9hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fLm51bGxFdmVudH0sX2V2ZW50LHByZWRpY3RhYmxlRXhlYyk7fXdoaWxlKHJhaXNlZEV2ZW50cy5sZW5ndGgpe3ZhciByYWlzZWRFdmVudD1yYWlzZWRFdmVudHMuc2hpZnQoKTttYXliZU5leHRTdGF0ZT10aGlzLnJlc29sdmVSYWlzZWRUcmFuc2l0aW9uKG1heWJlTmV4dFN0YXRlLHJhaXNlZEV2ZW50Ll9ldmVudCxfZXZlbnQscHJlZGljdGFibGVFeGVjKTt9fS8vIERldGVjdCBpZiBzdGF0ZSBjaGFuZ2VkXFxudmFyIGNoYW5nZWQ9bWF5YmVOZXh0U3RhdGUuY2hhbmdlZHx8KGhpc3Rvcnk/ISFtYXliZU5leHRTdGF0ZS5hY3Rpb25zLmxlbmd0aHx8ZGlkVXBkYXRlQ29udGV4dHx8X3R5cGVvZjIoaGlzdG9yeS52YWx1ZSkhPT1fdHlwZW9mMihtYXliZU5leHRTdGF0ZS52YWx1ZSl8fCEoMCxfU3RhdGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXy5zdGF0ZVZhbHVlc0VxdWFsKShtYXliZU5leHRTdGF0ZS52YWx1ZSxoaXN0b3J5LnZhbHVlKTp1bmRlZmluZWQpO21heWJlTmV4dFN0YXRlLmNoYW5nZWQ9Y2hhbmdlZDsvLyBQcmVzZXJ2ZSBvcmlnaW5hbCBoaXN0b3J5IGFmdGVyIHJhaXNlZCBldmVudHNcXG5tYXliZU5leHRTdGF0ZS5oaXN0b3J5PWhpc3Rvcnk7cmV0dXJuIG1heWJlTmV4dFN0YXRlO307LyoqXFxyXFxuICAgKiBSZXR1cm5zIHRoZSBjaGlsZCBzdGF0ZSBub2RlIGZyb20gaXRzIHJlbGF0aXZlIGBzdGF0ZUtleWAsIG9yIHRocm93cy5cXHJcXG4gICAqL1N0YXRlTm9kZS5wcm90b3R5cGUuZ2V0U3RhdGVOb2RlPWZ1bmN0aW9uKHN0YXRlS2V5KXtpZihpc1N0YXRlSWQoc3RhdGVLZXkpKXtyZXR1cm4gdGhpcy5tYWNoaW5lLmdldFN0YXRlTm9kZUJ5SWQoc3RhdGVLZXkpO31pZighdGhpcy5zdGF0ZXMpe3Rocm93IG5ldyBFcnJvcihcXFwiVW5hYmxlIHRvIHJldHJpZXZlIGNoaWxkIHN0YXRlICdcXFwiLmNvbmNhdChzdGF0ZUtleSxcXFwiJyBmcm9tICdcXFwiKS5jb25jYXQodGhpcy5pZCxcXFwiJzsgbm8gY2hpbGQgc3RhdGVzIGV4aXN0LlxcXCIpKTt9dmFyIHJlc3VsdD10aGlzLnN0YXRlc1tzdGF0ZUtleV07aWYoIXJlc3VsdCl7dGhyb3cgbmV3IEVycm9yKFxcXCJDaGlsZCBzdGF0ZSAnXFxcIi5jb25jYXQoc3RhdGVLZXksXFxcIicgZG9lcyBub3QgZXhpc3Qgb24gJ1xcXCIpLmNvbmNhdCh0aGlzLmlkLFxcXCInXFxcIikpO31yZXR1cm4gcmVzdWx0O307LyoqXFxyXFxuICAgKiBSZXR1cm5zIHRoZSBzdGF0ZSBub2RlIHdpdGggdGhlIGdpdmVuIGBzdGF0ZUlkYCwgb3IgdGhyb3dzLlxcclxcbiAgICpcXHJcXG4gICAqIEBwYXJhbSBzdGF0ZUlkIFRoZSBzdGF0ZSBJRC4gVGhlIHByZWZpeCBcXFwiI1xcXCIgaXMgcmVtb3ZlZC5cXHJcXG4gICAqL1N0YXRlTm9kZS5wcm90b3R5cGUuZ2V0U3RhdGVOb2RlQnlJZD1mdW5jdGlvbihzdGF0ZUlkKXt2YXIgcmVzb2x2ZWRTdGF0ZUlkPWlzU3RhdGVJZChzdGF0ZUlkKT9zdGF0ZUlkLnNsaWNlKFNUQVRFX0lERU5USUZJRVIubGVuZ3RoKTpzdGF0ZUlkO2lmKHJlc29sdmVkU3RhdGVJZD09PXRoaXMuaWQpe3JldHVybiB0aGlzO312YXIgc3RhdGVOb2RlPXRoaXMubWFjaGluZS5pZE1hcFtyZXNvbHZlZFN0YXRlSWRdO2lmKCFzdGF0ZU5vZGUpe3Rocm93IG5ldyBFcnJvcihcXFwiQ2hpbGQgc3RhdGUgbm9kZSAnI1xcXCIuY29uY2F0KHJlc29sdmVkU3RhdGVJZCxcXFwiJyBkb2VzIG5vdCBleGlzdCBvbiBtYWNoaW5lICdcXFwiKS5jb25jYXQodGhpcy5pZCxcXFwiJ1xcXCIpKTt9cmV0dXJuIHN0YXRlTm9kZTt9Oy8qKlxcclxcbiAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgc3RhdGUgbm9kZSBmcm9tIHRoZSBnaXZlbiBgc3RhdGVQYXRoYCwgb3IgdGhyb3dzLlxcclxcbiAgICpcXHJcXG4gICAqIEBwYXJhbSBzdGF0ZVBhdGggVGhlIHN0cmluZyBvciBzdHJpbmcgYXJyYXkgcmVsYXRpdmUgcGF0aCB0byB0aGUgc3RhdGUgbm9kZS5cXHJcXG4gICAqL1N0YXRlTm9kZS5wcm90b3R5cGUuZ2V0U3RhdGVOb2RlQnlQYXRoPWZ1bmN0aW9uKHN0YXRlUGF0aCl7aWYodHlwZW9mIHN0YXRlUGF0aD09PSdzdHJpbmcnJiZpc1N0YXRlSWQoc3RhdGVQYXRoKSl7dHJ5e3JldHVybiB0aGlzLmdldFN0YXRlTm9kZUJ5SWQoc3RhdGVQYXRoLnNsaWNlKDEpKTt9Y2F0Y2goZSl7Ly8gdHJ5IGluZGl2aWR1YWwgcGF0aHNcXG4vLyB0aHJvdyBlO1xcbn19dmFyIGFycmF5U3RhdGVQYXRoPSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvU3RhdGVQYXRoKShzdGF0ZVBhdGgsdGhpcy5kZWxpbWl0ZXIpLnNsaWNlKCk7dmFyIGN1cnJlbnRTdGF0ZU5vZGU9dGhpczt3aGlsZShhcnJheVN0YXRlUGF0aC5sZW5ndGgpe3ZhciBrZXk9YXJyYXlTdGF0ZVBhdGguc2hpZnQoKTtpZigha2V5Lmxlbmd0aCl7YnJlYWs7fWN1cnJlbnRTdGF0ZU5vZGU9Y3VycmVudFN0YXRlTm9kZS5nZXRTdGF0ZU5vZGUoa2V5KTt9cmV0dXJuIGN1cnJlbnRTdGF0ZU5vZGU7fTsvKipcXHJcXG4gICAqIFJlc29sdmVzIGEgcGFydGlhbCBzdGF0ZSB2YWx1ZSB3aXRoIGl0cyBmdWxsIHJlcHJlc2VudGF0aW9uIGluIHRoaXMgbWFjaGluZS5cXHJcXG4gICAqXFxyXFxuICAgKiBAcGFyYW0gc3RhdGVWYWx1ZSBUaGUgcGFydGlhbCBzdGF0ZSB2YWx1ZSB0byByZXNvbHZlLlxcclxcbiAgICovU3RhdGVOb2RlLnByb3RvdHlwZS5yZXNvbHZlPWZ1bmN0aW9uKHN0YXRlVmFsdWUpe3ZhciBfYTt2YXIgX3RoaXM9dGhpcztpZighc3RhdGVWYWx1ZSl7cmV0dXJuIHRoaXMuaW5pdGlhbFN0YXRlVmFsdWV8fEVNUFRZX09CSkVDVDsvLyBUT0RPOiB0eXBlLXNwZWNpZmljIHByb3BlcnRpZXNcXG59c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSdwYXJhbGxlbCc6cmV0dXJuKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ubWFwVmFsdWVzKSh0aGlzLmluaXRpYWxTdGF0ZVZhbHVlLGZ1bmN0aW9uKHN1YlN0YXRlVmFsdWUsc3ViU3RhdGVLZXkpe3JldHVybiBzdWJTdGF0ZVZhbHVlP190aGlzLmdldFN0YXRlTm9kZShzdWJTdGF0ZUtleSkucmVzb2x2ZShzdGF0ZVZhbHVlW3N1YlN0YXRlS2V5XXx8c3ViU3RhdGVWYWx1ZSk6RU1QVFlfT0JKRUNUO30pO2Nhc2UnY29tcG91bmQnOmlmKCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmlzU3RyaW5nKShzdGF0ZVZhbHVlKSl7dmFyIHN1YlN0YXRlTm9kZT10aGlzLmdldFN0YXRlTm9kZShzdGF0ZVZhbHVlKTtpZihzdWJTdGF0ZU5vZGUudHlwZT09PSdwYXJhbGxlbCd8fHN1YlN0YXRlTm9kZS50eXBlPT09J2NvbXBvdW5kJyl7cmV0dXJuIF9hPXt9LF9hW3N0YXRlVmFsdWVdPXN1YlN0YXRlTm9kZS5pbml0aWFsU3RhdGVWYWx1ZSxfYTt9cmV0dXJuIHN0YXRlVmFsdWU7fWlmKCFPYmplY3Qua2V5cyhzdGF0ZVZhbHVlKS5sZW5ndGgpe3JldHVybiB0aGlzLmluaXRpYWxTdGF0ZVZhbHVlfHx7fTt9cmV0dXJuKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ubWFwVmFsdWVzKShzdGF0ZVZhbHVlLGZ1bmN0aW9uKHN1YlN0YXRlVmFsdWUsc3ViU3RhdGVLZXkpe3JldHVybiBzdWJTdGF0ZVZhbHVlP190aGlzLmdldFN0YXRlTm9kZShzdWJTdGF0ZUtleSkucmVzb2x2ZShzdWJTdGF0ZVZhbHVlKTpFTVBUWV9PQkpFQ1Q7fSk7ZGVmYXVsdDpyZXR1cm4gc3RhdGVWYWx1ZXx8RU1QVFlfT0JKRUNUO319O1N0YXRlTm9kZS5wcm90b3R5cGUuZ2V0UmVzb2x2ZWRQYXRoPWZ1bmN0aW9uKHN0YXRlSWRlbnRpZmllcil7aWYoaXNTdGF0ZUlkKHN0YXRlSWRlbnRpZmllcikpe3ZhciBzdGF0ZU5vZGU9dGhpcy5tYWNoaW5lLmlkTWFwW3N0YXRlSWRlbnRpZmllci5zbGljZShTVEFURV9JREVOVElGSUVSLmxlbmd0aCldO2lmKCFzdGF0ZU5vZGUpe3Rocm93IG5ldyBFcnJvcihcXFwiVW5hYmxlIHRvIGZpbmQgc3RhdGUgbm9kZSAnXFxcIi5jb25jYXQoc3RhdGVJZGVudGlmaWVyLFxcXCInXFxcIikpO31yZXR1cm4gc3RhdGVOb2RlLnBhdGg7fXJldHVybigwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvU3RhdGVQYXRoKShzdGF0ZUlkZW50aWZpZXIsdGhpcy5kZWxpbWl0ZXIpO307T2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YXRlTm9kZS5wcm90b3R5cGUsXFxcImluaXRpYWxTdGF0ZVZhbHVlXFxcIix7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBfYTtpZih0aGlzLl9fY2FjaGUuaW5pdGlhbFN0YXRlVmFsdWUpe3JldHVybiB0aGlzLl9fY2FjaGUuaW5pdGlhbFN0YXRlVmFsdWU7fXZhciBpbml0aWFsU3RhdGVWYWx1ZTtpZih0aGlzLnR5cGU9PT0ncGFyYWxsZWwnKXtpbml0aWFsU3RhdGVWYWx1ZT0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5tYXBGaWx0ZXJWYWx1ZXMpKHRoaXMuc3RhdGVzLGZ1bmN0aW9uKHN0YXRlKXtyZXR1cm4gc3RhdGUuaW5pdGlhbFN0YXRlVmFsdWV8fEVNUFRZX09CSkVDVDt9LGZ1bmN0aW9uKHN0YXRlTm9kZSl7cmV0dXJuIShzdGF0ZU5vZGUudHlwZT09PSdoaXN0b3J5Jyk7fSk7fWVsc2UgaWYodGhpcy5pbml0aWFsIT09dW5kZWZpbmVkKXtpZighdGhpcy5zdGF0ZXNbdGhpcy5pbml0aWFsXSl7dGhyb3cgbmV3IEVycm9yKFxcXCJJbml0aWFsIHN0YXRlICdcXFwiLmNvbmNhdCh0aGlzLmluaXRpYWwsXFxcIicgbm90IGZvdW5kIG9uICdcXFwiKS5jb25jYXQodGhpcy5rZXksXFxcIidcXFwiKSk7fWluaXRpYWxTdGF0ZVZhbHVlPSgwLF9zdGF0ZVV0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uaXNMZWFmTm9kZSkodGhpcy5zdGF0ZXNbdGhpcy5pbml0aWFsXSk/dGhpcy5pbml0aWFsOihfYT17fSxfYVt0aGlzLmluaXRpYWxdPXRoaXMuc3RhdGVzW3RoaXMuaW5pdGlhbF0uaW5pdGlhbFN0YXRlVmFsdWUsX2EpO31lbHNley8vIFRoZSBmaW5pdGUgc3RhdGUgdmFsdWUgb2YgYSBtYWNoaW5lIHdpdGhvdXQgY2hpbGQgc3RhdGVzIGlzIGp1c3QgYW4gZW1wdHkgb2JqZWN0XFxuaW5pdGlhbFN0YXRlVmFsdWU9e307fXRoaXMuX19jYWNoZS5pbml0aWFsU3RhdGVWYWx1ZT1pbml0aWFsU3RhdGVWYWx1ZTtyZXR1cm4gdGhpcy5fX2NhY2hlLmluaXRpYWxTdGF0ZVZhbHVlO30sZW51bWVyYWJsZTpmYWxzZSxjb25maWd1cmFibGU6dHJ1ZX0pO1N0YXRlTm9kZS5wcm90b3R5cGUuZ2V0SW5pdGlhbFN0YXRlPWZ1bmN0aW9uKHN0YXRlVmFsdWUsY29udGV4dCl7dGhpcy5faW5pdCgpOy8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIGluIHRoZSBjb25zdHJ1Y3RvciAoc2VlIG5vdGUgaW4gY29uc3RydWN0b3IpXFxudmFyIGNvbmZpZ3VyYXRpb249dGhpcy5nZXRTdGF0ZU5vZGVzKHN0YXRlVmFsdWUpO3JldHVybiB0aGlzLnJlc29sdmVUcmFuc2l0aW9uKHtjb25maWd1cmF0aW9uOmNvbmZpZ3VyYXRpb24sZXhpdFNldDpbXSx0cmFuc2l0aW9uczpbXSxzb3VyY2U6dW5kZWZpbmVkLGFjdGlvbnM6W119LHVuZGVmaW5lZCxjb250ZXh0IT09bnVsbCYmY29udGV4dCE9PXZvaWQgMD9jb250ZXh0OnRoaXMubWFjaGluZS5jb250ZXh0LHVuZGVmaW5lZCk7fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RhdGVOb2RlLnByb3RvdHlwZSxcXFwiaW5pdGlhbFN0YXRlXFxcIix7LyoqXFxyXFxuICAgICAqIFRoZSBpbml0aWFsIFN0YXRlIGluc3RhbmNlLCB3aGljaCBpbmNsdWRlcyBhbGwgYWN0aW9ucyB0byBiZSBleGVjdXRlZCBmcm9tXFxyXFxuICAgICAqIGVudGVyaW5nIHRoZSBpbml0aWFsIHN0YXRlLlxcclxcbiAgICAgKi9nZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIGluaXRpYWxTdGF0ZVZhbHVlPXRoaXMuaW5pdGlhbFN0YXRlVmFsdWU7aWYoIWluaXRpYWxTdGF0ZVZhbHVlKXt0aHJvdyBuZXcgRXJyb3IoXFxcIkNhbm5vdCByZXRyaWV2ZSBpbml0aWFsIHN0YXRlIGZyb20gc2ltcGxlIHN0YXRlICdcXFwiLmNvbmNhdCh0aGlzLmlkLFxcXCInLlxcXCIpKTt9cmV0dXJuIHRoaXMuZ2V0SW5pdGlhbFN0YXRlKGluaXRpYWxTdGF0ZVZhbHVlKTt9LGVudW1lcmFibGU6ZmFsc2UsY29uZmlndXJhYmxlOnRydWV9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RhdGVOb2RlLnByb3RvdHlwZSxcXFwidGFyZ2V0XFxcIix7LyoqXFxyXFxuICAgICAqIFRoZSB0YXJnZXQgc3RhdGUgdmFsdWUgb2YgdGhlIGhpc3Rvcnkgc3RhdGUgbm9kZSwgaWYgaXQgZXhpc3RzLiBUaGlzIHJlcHJlc2VudHMgdGhlXFxyXFxuICAgICAqIGRlZmF1bHQgc3RhdGUgdmFsdWUgdG8gdHJhbnNpdGlvbiB0byBpZiBubyBoaXN0b3J5IHZhbHVlIGV4aXN0cyB5ZXQuXFxyXFxuICAgICAqL2dldDpmdW5jdGlvbiBnZXQoKXt2YXIgdGFyZ2V0O2lmKHRoaXMudHlwZT09PSdoaXN0b3J5Jyl7dmFyIGhpc3RvcnlDb25maWc9dGhpcy5jb25maWc7aWYoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNTdHJpbmcpKGhpc3RvcnlDb25maWcudGFyZ2V0KSl7dGFyZ2V0PWlzU3RhdGVJZChoaXN0b3J5Q29uZmlnLnRhcmdldCk/KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ucGF0aFRvU3RhdGVWYWx1ZSkodGhpcy5tYWNoaW5lLmdldFN0YXRlTm9kZUJ5SWQoaGlzdG9yeUNvbmZpZy50YXJnZXQpLnBhdGguc2xpY2UodGhpcy5wYXRoLmxlbmd0aC0xKSk6aGlzdG9yeUNvbmZpZy50YXJnZXQ7fWVsc2V7dGFyZ2V0PWhpc3RvcnlDb25maWcudGFyZ2V0O319cmV0dXJuIHRhcmdldDt9LGVudW1lcmFibGU6ZmFsc2UsY29uZmlndXJhYmxlOnRydWV9KTsvKipcXHJcXG4gICAqIFJldHVybnMgdGhlIGxlYWYgbm9kZXMgZnJvbSBhIHN0YXRlIHBhdGggcmVsYXRpdmUgdG8gdGhpcyBzdGF0ZSBub2RlLlxcclxcbiAgICpcXHJcXG4gICAqIEBwYXJhbSByZWxhdGl2ZVN0YXRlSWQgVGhlIHJlbGF0aXZlIHN0YXRlIHBhdGggdG8gcmV0cmlldmUgdGhlIHN0YXRlIG5vZGVzXFxyXFxuICAgKiBAcGFyYW0gaGlzdG9yeSBUaGUgcHJldmlvdXMgc3RhdGUgdG8gcmV0cmlldmUgaGlzdG9yeVxcclxcbiAgICogQHBhcmFtIHJlc29sdmUgV2hldGhlciBzdGF0ZSBub2RlcyBzaG91bGQgcmVzb2x2ZSB0byBpbml0aWFsIGNoaWxkIHN0YXRlIG5vZGVzXFxyXFxuICAgKi9TdGF0ZU5vZGUucHJvdG90eXBlLmdldFJlbGF0aXZlU3RhdGVOb2Rlcz1mdW5jdGlvbihyZWxhdGl2ZVN0YXRlSWQsaGlzdG9yeVZhbHVlLHJlc29sdmUpe2lmKHJlc29sdmU9PT12b2lkIDApe3Jlc29sdmU9dHJ1ZTt9cmV0dXJuIHJlc29sdmU/cmVsYXRpdmVTdGF0ZUlkLnR5cGU9PT0naGlzdG9yeSc/cmVsYXRpdmVTdGF0ZUlkLnJlc29sdmVIaXN0b3J5KGhpc3RvcnlWYWx1ZSk6cmVsYXRpdmVTdGF0ZUlkLmluaXRpYWxTdGF0ZU5vZGVzOltyZWxhdGl2ZVN0YXRlSWRdO307T2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YXRlTm9kZS5wcm90b3R5cGUsXFxcImluaXRpYWxTdGF0ZU5vZGVzXFxcIix7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBfdGhpcz10aGlzO2lmKCgwLF9zdGF0ZVV0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uaXNMZWFmTm9kZSkodGhpcykpe3JldHVyblt0aGlzXTt9Ly8gQ2FzZSB3aGVuIHN0YXRlIG5vZGUgaXMgY29tcG91bmQgYnV0IG5vIGluaXRpYWwgc3RhdGUgaXMgZGVmaW5lZFxcbmlmKHRoaXMudHlwZT09PSdjb21wb3VuZCcmJiF0aGlzLmluaXRpYWwpe2lmKCFfZW52aXJvbm1lbnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5JU19QUk9EVUNUSU9OKXsoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy53YXJuKShmYWxzZSxcXFwiQ29tcG91bmQgc3RhdGUgbm9kZSAnXFxcIi5jb25jYXQodGhpcy5pZCxcXFwiJyBoYXMgbm8gaW5pdGlhbCBzdGF0ZS5cXFwiKSk7fXJldHVyblt0aGlzXTt9dmFyIGluaXRpYWxTdGF0ZU5vZGVQYXRocz0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy50b1N0YXRlUGF0aHMpKHRoaXMuaW5pdGlhbFN0YXRlVmFsdWUpO3JldHVybigwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmZsYXR0ZW4pKGluaXRpYWxTdGF0ZU5vZGVQYXRocy5tYXAoZnVuY3Rpb24oaW5pdGlhbFBhdGgpe3JldHVybiBfdGhpcy5nZXRGcm9tUmVsYXRpdmVQYXRoKGluaXRpYWxQYXRoKTt9KSk7fSxlbnVtZXJhYmxlOmZhbHNlLGNvbmZpZ3VyYWJsZTp0cnVlfSk7LyoqXFxyXFxuICAgKiBSZXRyaWV2ZXMgc3RhdGUgbm9kZXMgZnJvbSBhIHJlbGF0aXZlIHBhdGggdG8gdGhpcyBzdGF0ZSBub2RlLlxcclxcbiAgICpcXHJcXG4gICAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggZnJvbSB0aGlzIHN0YXRlIG5vZGVcXHJcXG4gICAqIEBwYXJhbSBoaXN0b3J5VmFsdWVcXHJcXG4gICAqL1N0YXRlTm9kZS5wcm90b3R5cGUuZ2V0RnJvbVJlbGF0aXZlUGF0aD1mdW5jdGlvbihyZWxhdGl2ZVBhdGgpe2lmKCFyZWxhdGl2ZVBhdGgubGVuZ3RoKXtyZXR1cm5bdGhpc107fXZhciBfYT0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fcmVhZCkocmVsYXRpdmVQYXRoKSxzdGF0ZUtleT1fYVswXSxjaGlsZFN0YXRlUGF0aD1fYS5zbGljZSgxKTtpZighdGhpcy5zdGF0ZXMpe3Rocm93IG5ldyBFcnJvcihcXFwiQ2Fubm90IHJldHJpZXZlIHN1YlBhdGggJ1xcXCIuY29uY2F0KHN0YXRlS2V5LFxcXCInIGZyb20gbm9kZSB3aXRoIG5vIHN0YXRlc1xcXCIpKTt9dmFyIGNoaWxkU3RhdGVOb2RlPXRoaXMuZ2V0U3RhdGVOb2RlKHN0YXRlS2V5KTtpZihjaGlsZFN0YXRlTm9kZS50eXBlPT09J2hpc3RvcnknKXtyZXR1cm4gY2hpbGRTdGF0ZU5vZGUucmVzb2x2ZUhpc3RvcnkoKTt9aWYoIXRoaXMuc3RhdGVzW3N0YXRlS2V5XSl7dGhyb3cgbmV3IEVycm9yKFxcXCJDaGlsZCBzdGF0ZSAnXFxcIi5jb25jYXQoc3RhdGVLZXksXFxcIicgZG9lcyBub3QgZXhpc3Qgb24gJ1xcXCIpLmNvbmNhdCh0aGlzLmlkLFxcXCInXFxcIikpO31yZXR1cm4gdGhpcy5zdGF0ZXNbc3RhdGVLZXldLmdldEZyb21SZWxhdGl2ZVBhdGgoY2hpbGRTdGF0ZVBhdGgpO307U3RhdGVOb2RlLnByb3RvdHlwZS5oaXN0b3J5VmFsdWU9ZnVuY3Rpb24ocmVsYXRpdmVTdGF0ZVZhbHVlKXtpZighT2JqZWN0LmtleXModGhpcy5zdGF0ZXMpLmxlbmd0aCl7cmV0dXJuIHVuZGVmaW5lZDt9cmV0dXJue2N1cnJlbnQ6cmVsYXRpdmVTdGF0ZVZhbHVlfHx0aGlzLmluaXRpYWxTdGF0ZVZhbHVlLHN0YXRlczooMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5tYXBGaWx0ZXJWYWx1ZXMpKHRoaXMuc3RhdGVzLGZ1bmN0aW9uKHN0YXRlTm9kZSxrZXkpe2lmKCFyZWxhdGl2ZVN0YXRlVmFsdWUpe3JldHVybiBzdGF0ZU5vZGUuaGlzdG9yeVZhbHVlKCk7fXZhciBzdWJTdGF0ZVZhbHVlPSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmlzU3RyaW5nKShyZWxhdGl2ZVN0YXRlVmFsdWUpP3VuZGVmaW5lZDpyZWxhdGl2ZVN0YXRlVmFsdWVba2V5XTtyZXR1cm4gc3RhdGVOb2RlLmhpc3RvcnlWYWx1ZShzdWJTdGF0ZVZhbHVlfHxzdGF0ZU5vZGUuaW5pdGlhbFN0YXRlVmFsdWUpO30sZnVuY3Rpb24oc3RhdGVOb2RlKXtyZXR1cm4hc3RhdGVOb2RlLmhpc3Rvcnk7fSl9O307LyoqXFxyXFxuICAgKiBSZXNvbHZlcyB0byB0aGUgaGlzdG9yaWNhbCB2YWx1ZShzKSBvZiB0aGUgcGFyZW50IHN0YXRlIG5vZGUsXFxyXFxuICAgKiByZXByZXNlbnRlZCBieSBzdGF0ZSBub2Rlcy5cXHJcXG4gICAqXFxyXFxuICAgKiBAcGFyYW0gaGlzdG9yeVZhbHVlXFxyXFxuICAgKi9TdGF0ZU5vZGUucHJvdG90eXBlLnJlc29sdmVIaXN0b3J5PWZ1bmN0aW9uKGhpc3RvcnlWYWx1ZSl7dmFyIF90aGlzPXRoaXM7aWYodGhpcy50eXBlIT09J2hpc3RvcnknKXtyZXR1cm5bdGhpc107fXZhciBwYXJlbnQ9dGhpcy5wYXJlbnQ7aWYoIWhpc3RvcnlWYWx1ZSl7dmFyIGhpc3RvcnlUYXJnZXQ9dGhpcy50YXJnZXQ7cmV0dXJuIGhpc3RvcnlUYXJnZXQ/KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZmxhdHRlbikoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9TdGF0ZVBhdGhzKShoaXN0b3J5VGFyZ2V0KS5tYXAoZnVuY3Rpb24ocmVsYXRpdmVDaGlsZFBhdGgpe3JldHVybiBwYXJlbnQuZ2V0RnJvbVJlbGF0aXZlUGF0aChyZWxhdGl2ZUNoaWxkUGF0aCk7fSkpOnBhcmVudC5pbml0aWFsU3RhdGVOb2Rlczt9dmFyIHN1Ykhpc3RvcnlWYWx1ZT0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5uZXN0ZWRQYXRoKShwYXJlbnQucGF0aCwnc3RhdGVzJykoaGlzdG9yeVZhbHVlKS5jdXJyZW50O2lmKCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmlzU3RyaW5nKShzdWJIaXN0b3J5VmFsdWUpKXtyZXR1cm5bcGFyZW50LmdldFN0YXRlTm9kZShzdWJIaXN0b3J5VmFsdWUpXTt9cmV0dXJuKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZmxhdHRlbikoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9TdGF0ZVBhdGhzKShzdWJIaXN0b3J5VmFsdWUpLm1hcChmdW5jdGlvbihzdWJTdGF0ZVBhdGgpe3JldHVybiBfdGhpcy5oaXN0b3J5PT09J2RlZXAnP3BhcmVudC5nZXRGcm9tUmVsYXRpdmVQYXRoKHN1YlN0YXRlUGF0aCk6W3BhcmVudC5zdGF0ZXNbc3ViU3RhdGVQYXRoWzBdXV07fSkpO307T2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YXRlTm9kZS5wcm90b3R5cGUsXFxcInN0YXRlSWRzXFxcIix7LyoqXFxyXFxuICAgICAqIEFsbCB0aGUgc3RhdGUgbm9kZSBJRHMgb2YgdGhpcyBzdGF0ZSBub2RlIGFuZCBpdHMgZGVzY2VuZGFudCBzdGF0ZSBub2Rlcy5cXHJcXG4gICAgICovZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBfdGhpcz10aGlzO3ZhciBjaGlsZFN0YXRlSWRzPSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmZsYXR0ZW4pKE9iamVjdC5rZXlzKHRoaXMuc3RhdGVzKS5tYXAoZnVuY3Rpb24oc3RhdGVLZXkpe3JldHVybiBfdGhpcy5zdGF0ZXNbc3RhdGVLZXldLnN0YXRlSWRzO30pKTtyZXR1cm5bdGhpcy5pZF0uY29uY2F0KGNoaWxkU3RhdGVJZHMpO30sZW51bWVyYWJsZTpmYWxzZSxjb25maWd1cmFibGU6dHJ1ZX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGF0ZU5vZGUucHJvdG90eXBlLFxcXCJldmVudHNcXFwiLHsvKipcXHJcXG4gICAgICogQWxsIHRoZSBldmVudCB0eXBlcyBhY2NlcHRlZCBieSB0aGlzIHN0YXRlIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cy5cXHJcXG4gICAgICovZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBlXzgsX2EsZV85LF9iO2lmKHRoaXMuX19jYWNoZS5ldmVudHMpe3JldHVybiB0aGlzLl9fY2FjaGUuZXZlbnRzO312YXIgc3RhdGVzPXRoaXMuc3RhdGVzO3ZhciBldmVudHM9bmV3IFNldCh0aGlzLm93bkV2ZW50cyk7aWYoc3RhdGVzKXt0cnl7Zm9yKHZhciBfYz0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fdmFsdWVzKShPYmplY3Qua2V5cyhzdGF0ZXMpKSxfZD1fYy5uZXh0KCk7IV9kLmRvbmU7X2Q9X2MubmV4dCgpKXt2YXIgc3RhdGVJZD1fZC52YWx1ZTt2YXIgc3RhdGU9c3RhdGVzW3N0YXRlSWRdO2lmKHN0YXRlLnN0YXRlcyl7dHJ5e2Zvcih2YXIgX2U9KGVfOT12b2lkIDAsKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3ZhbHVlcykoc3RhdGUuZXZlbnRzKSksX2Y9X2UubmV4dCgpOyFfZi5kb25lO19mPV9lLm5leHQoKSl7dmFyIGV2ZW50XzE9X2YudmFsdWU7ZXZlbnRzLmFkZChcXFwiXFxcIi5jb25jYXQoZXZlbnRfMSkpO319Y2F0Y2goZV85XzEpe2VfOT17ZXJyb3I6ZV85XzF9O31maW5hbGx5e3RyeXtpZihfZiYmIV9mLmRvbmUmJihfYj1fZVtcXFwicmV0dXJuXFxcIl0pKV9iLmNhbGwoX2UpO31maW5hbGx5e2lmKGVfOSl0aHJvdyBlXzkuZXJyb3I7fX19fX1jYXRjaChlXzhfMSl7ZV84PXtlcnJvcjplXzhfMX07fWZpbmFsbHl7dHJ5e2lmKF9kJiYhX2QuZG9uZSYmKF9hPV9jW1xcXCJyZXR1cm5cXFwiXSkpX2EuY2FsbChfYyk7fWZpbmFsbHl7aWYoZV84KXRocm93IGVfOC5lcnJvcjt9fX1yZXR1cm4gdGhpcy5fX2NhY2hlLmV2ZW50cz1BcnJheS5mcm9tKGV2ZW50cyk7fSxlbnVtZXJhYmxlOmZhbHNlLGNvbmZpZ3VyYWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YXRlTm9kZS5wcm90b3R5cGUsXFxcIm93bkV2ZW50c1xcXCIsey8qKlxcclxcbiAgICAgKiBBbGwgdGhlIGV2ZW50cyB0aGF0IGhhdmUgdHJhbnNpdGlvbnMgZGlyZWN0bHkgZnJvbSB0aGlzIHN0YXRlIG5vZGUuXFxyXFxuICAgICAqXFxyXFxuICAgICAqIEV4Y2x1ZGVzIGFueSBpbmVydCBldmVudHMuXFxyXFxuICAgICAqL2dldDpmdW5jdGlvbiBnZXQoKXt2YXIgZXZlbnRzPW5ldyBTZXQodGhpcy50cmFuc2l0aW9ucy5maWx0ZXIoZnVuY3Rpb24odHJhbnNpdGlvbil7cmV0dXJuISghdHJhbnNpdGlvbi50YXJnZXQmJiF0cmFuc2l0aW9uLmFjdGlvbnMubGVuZ3RoJiZ0cmFuc2l0aW9uLmludGVybmFsKTt9KS5tYXAoZnVuY3Rpb24odHJhbnNpdGlvbil7cmV0dXJuIHRyYW5zaXRpb24uZXZlbnRUeXBlO30pKTtyZXR1cm4gQXJyYXkuZnJvbShldmVudHMpO30sZW51bWVyYWJsZTpmYWxzZSxjb25maWd1cmFibGU6dHJ1ZX0pO1N0YXRlTm9kZS5wcm90b3R5cGUucmVzb2x2ZVRhcmdldD1mdW5jdGlvbihfdGFyZ2V0KXt2YXIgX3RoaXM9dGhpcztpZihfdGFyZ2V0PT09dW5kZWZpbmVkKXsvLyBhbiB1bmRlZmluZWQgdGFyZ2V0IHNpZ25hbHMgdGhhdCB0aGUgc3RhdGUgbm9kZSBzaG91bGQgbm90IHRyYW5zaXRpb24gZnJvbSB0aGF0IHN0YXRlIHdoZW4gcmVjZWl2aW5nIHRoYXQgZXZlbnRcXG5yZXR1cm4gdW5kZWZpbmVkO31yZXR1cm4gX3RhcmdldC5tYXAoZnVuY3Rpb24odGFyZ2V0KXtpZighKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNTdHJpbmcpKHRhcmdldCkpe3JldHVybiB0YXJnZXQ7fXZhciBpc0ludGVybmFsVGFyZ2V0PXRhcmdldFswXT09PV90aGlzLmRlbGltaXRlcjsvLyBJZiBpbnRlcm5hbCB0YXJnZXQgaXMgZGVmaW5lZCBvbiBtYWNoaW5lLFxcbi8vIGRvIG5vdCBpbmNsdWRlIG1hY2hpbmUga2V5IG9uIHRhcmdldFxcbmlmKGlzSW50ZXJuYWxUYXJnZXQmJiFfdGhpcy5wYXJlbnQpe3JldHVybiBfdGhpcy5nZXRTdGF0ZU5vZGVCeVBhdGgodGFyZ2V0LnNsaWNlKDEpKTt9dmFyIHJlc29sdmVkVGFyZ2V0PWlzSW50ZXJuYWxUYXJnZXQ/X3RoaXMua2V5K3RhcmdldDp0YXJnZXQ7aWYoX3RoaXMucGFyZW50KXt0cnl7dmFyIHRhcmdldFN0YXRlTm9kZT1fdGhpcy5wYXJlbnQuZ2V0U3RhdGVOb2RlQnlQYXRoKHJlc29sdmVkVGFyZ2V0KTtyZXR1cm4gdGFyZ2V0U3RhdGVOb2RlO31jYXRjaChlcnIpe3Rocm93IG5ldyBFcnJvcihcXFwiSW52YWxpZCB0cmFuc2l0aW9uIGRlZmluaXRpb24gZm9yIHN0YXRlIG5vZGUgJ1xcXCIuY29uY2F0KF90aGlzLmlkLFxcXCInOlxcXFxuXFxcIikuY29uY2F0KGVyci5tZXNzYWdlKSk7fX1lbHNle3JldHVybiBfdGhpcy5nZXRTdGF0ZU5vZGVCeVBhdGgocmVzb2x2ZWRUYXJnZXQpO319KTt9O1N0YXRlTm9kZS5wcm90b3R5cGUuZm9ybWF0VHJhbnNpdGlvbj1mdW5jdGlvbih0cmFuc2l0aW9uQ29uZmlnKXt2YXIgX3RoaXM9dGhpczt2YXIgbm9ybWFsaXplZFRhcmdldD0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5ub3JtYWxpemVUYXJnZXQpKHRyYW5zaXRpb25Db25maWcudGFyZ2V0KTt2YXIgaW50ZXJuYWw9J2ludGVybmFsJ2luIHRyYW5zaXRpb25Db25maWc/dHJhbnNpdGlvbkNvbmZpZy5pbnRlcm5hbDpub3JtYWxpemVkVGFyZ2V0P25vcm1hbGl6ZWRUYXJnZXQuc29tZShmdW5jdGlvbihfdGFyZ2V0KXtyZXR1cm4oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc1N0cmluZykoX3RhcmdldCkmJl90YXJnZXRbMF09PT1fdGhpcy5kZWxpbWl0ZXI7fSk6dHJ1ZTt2YXIgZ3VhcmRzPXRoaXMubWFjaGluZS5vcHRpb25zLmd1YXJkczt2YXIgdGFyZ2V0PXRoaXMucmVzb2x2ZVRhcmdldChub3JtYWxpemVkVGFyZ2V0KTt2YXIgdHJhbnNpdGlvbj0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSh7fSx0cmFuc2l0aW9uQ29uZmlnKSx7YWN0aW9uczooMCxfYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLnRvQWN0aW9uT2JqZWN0cykoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9BcnJheSkodHJhbnNpdGlvbkNvbmZpZy5hY3Rpb25zKSksY29uZDooMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy50b0d1YXJkKSh0cmFuc2l0aW9uQ29uZmlnLmNvbmQsZ3VhcmRzKSx0YXJnZXQ6dGFyZ2V0LHNvdXJjZTp0aGlzLGludGVybmFsOmludGVybmFsLGV2ZW50VHlwZTp0cmFuc2l0aW9uQ29uZmlnLmV2ZW50LHRvSlNPTjpmdW5jdGlvbiB0b0pTT04oKXtyZXR1cm4oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSh7fSx0cmFuc2l0aW9uKSx7dGFyZ2V0OnRyYW5zaXRpb24udGFyZ2V0P3RyYW5zaXRpb24udGFyZ2V0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm5cXFwiI1xcXCIuY29uY2F0KHQuaWQpO30pOnVuZGVmaW5lZCxzb3VyY2U6XFxcIiNcXFwiLmNvbmNhdChfdGhpcy5pZCl9KTt9fSk7cmV0dXJuIHRyYW5zaXRpb247fTtTdGF0ZU5vZGUucHJvdG90eXBlLmZvcm1hdFRyYW5zaXRpb25zPWZ1bmN0aW9uKCl7dmFyIGVfMTAsX2E7dmFyIF90aGlzPXRoaXM7dmFyIG9uQ29uZmlnO2lmKCF0aGlzLmNvbmZpZy5vbil7b25Db25maWc9W107fWVsc2UgaWYoQXJyYXkuaXNBcnJheSh0aGlzLmNvbmZpZy5vbikpe29uQ29uZmlnPXRoaXMuY29uZmlnLm9uO31lbHNle3ZhciBfYj10aGlzLmNvbmZpZy5vbixfYz1XSUxEQ0FSRCxfZD1fYltfY10sd2lsZGNhcmRDb25maWdzPV9kPT09dm9pZCAwP1tdOl9kLHN0cmljdFRyYW5zaXRpb25Db25maWdzXzE9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3Jlc3QpKF9iLFtfdHlwZW9mMihfYyk9PT1cXFwic3ltYm9sXFxcIj9fYzpfYytcXFwiXFxcIl0pO29uQ29uZmlnPSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmZsYXR0ZW4pKE9iamVjdC5rZXlzKHN0cmljdFRyYW5zaXRpb25Db25maWdzXzEpLm1hcChmdW5jdGlvbihrZXkpe2lmKCFfZW52aXJvbm1lbnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5JU19QUk9EVUNUSU9OJiZrZXk9PT1OVUxMX0VWRU5UKXsoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy53YXJuKShmYWxzZSxcXFwiRW1wdHkgc3RyaW5nIHRyYW5zaXRpb24gY29uZmlncyAoZS5nLiwgYHsgb246IHsgJyc6IC4uLiB9fWApIGZvciB0cmFuc2llbnQgdHJhbnNpdGlvbnMgYXJlIGRlcHJlY2F0ZWQuIFNwZWNpZnkgdGhlIHRyYW5zaXRpb24gaW4gdGhlIGB7IGFsd2F5czogLi4uIH1gIHByb3BlcnR5IGluc3RlYWQuIFxcXCIrXFxcIlBsZWFzZSBjaGVjayB0aGUgYG9uYCBjb25maWd1cmF0aW9uIGZvciBcXFxcXFxcIiNcXFwiLmNvbmNhdChfdGhpcy5pZCxcXFwiXFxcXFxcXCIuXFxcIikpO312YXIgdHJhbnNpdGlvbkNvbmZpZ0FycmF5PSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvVHJhbnNpdGlvbkNvbmZpZ0FycmF5KShrZXksc3RyaWN0VHJhbnNpdGlvbkNvbmZpZ3NfMVtrZXldKTtpZighX2Vudmlyb25tZW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uSVNfUFJPRFVDVElPTil7dmFsaWRhdGVBcnJheWlmaWVkVHJhbnNpdGlvbnMoX3RoaXMsa2V5LHRyYW5zaXRpb25Db25maWdBcnJheSk7fXJldHVybiB0cmFuc2l0aW9uQ29uZmlnQXJyYXk7fSkuY29uY2F0KCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvVHJhbnNpdGlvbkNvbmZpZ0FycmF5KShXSUxEQ0FSRCx3aWxkY2FyZENvbmZpZ3MpKSk7fXZhciBldmVudGxlc3NDb25maWc9dGhpcy5jb25maWcuYWx3YXlzPygwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvVHJhbnNpdGlvbkNvbmZpZ0FycmF5KSgnJyx0aGlzLmNvbmZpZy5hbHdheXMpOltdO3ZhciBkb25lQ29uZmlnPXRoaXMuY29uZmlnLm9uRG9uZT8oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy50b1RyYW5zaXRpb25Db25maWdBcnJheSkoU3RyaW5nKCgwLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uZG9uZSkodGhpcy5pZCkpLHRoaXMuY29uZmlnLm9uRG9uZSk6W107aWYoIV9lbnZpcm9ubWVudF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLklTX1BST0RVQ1RJT04peygwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLndhcm4pKCEodGhpcy5jb25maWcub25Eb25lJiYhdGhpcy5wYXJlbnQpLFxcXCJSb290IG5vZGVzIGNhbm5vdCBoYXZlIGFuIFxcXFxcXFwiLm9uRG9uZVxcXFxcXFwiIHRyYW5zaXRpb24uIFBsZWFzZSBjaGVjayB0aGUgY29uZmlnIG9mIFxcXFxcXFwiXFxcIi5jb25jYXQodGhpcy5pZCxcXFwiXFxcXFxcXCIuXFxcIikpO312YXIgaW52b2tlQ29uZmlnPSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmZsYXR0ZW4pKHRoaXMuaW52b2tlLm1hcChmdW5jdGlvbihpbnZva2VEZWYpe3ZhciBzZXR0bGVUcmFuc2l0aW9ucz1bXTtpZihpbnZva2VEZWYub25Eb25lKXtzZXR0bGVUcmFuc2l0aW9ucy5wdXNoLmFwcGx5KHNldHRsZVRyYW5zaXRpb25zLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19zcHJlYWRBcnJheSkoW10sKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3JlYWQpKCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvVHJhbnNpdGlvbkNvbmZpZ0FycmF5KShTdHJpbmcoKDAsX2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5kb25lSW52b2tlKShpbnZva2VEZWYuaWQpKSxpbnZva2VEZWYub25Eb25lKSksZmFsc2UpKTt9aWYoaW52b2tlRGVmLm9uRXJyb3Ipe3NldHRsZVRyYW5zaXRpb25zLnB1c2guYXBwbHkoc2V0dGxlVHJhbnNpdGlvbnMsKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3NwcmVhZEFycmF5KShbXSwoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fcmVhZCkoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9UcmFuc2l0aW9uQ29uZmlnQXJyYXkpKFN0cmluZygoMCxfYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLmVycm9yKShpbnZva2VEZWYuaWQpKSxpbnZva2VEZWYub25FcnJvcikpLGZhbHNlKSk7fXJldHVybiBzZXR0bGVUcmFuc2l0aW9uczt9KSk7dmFyIGRlbGF5ZWRUcmFuc2l0aW9ucz10aGlzLmFmdGVyO3ZhciBmb3JtYXR0ZWRUcmFuc2l0aW9ucz0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5mbGF0dGVuKSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fc3ByZWFkQXJyYXkpKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19zcHJlYWRBcnJheSkoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3NwcmVhZEFycmF5KSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fc3ByZWFkQXJyYXkpKFtdLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19yZWFkKShkb25lQ29uZmlnKSxmYWxzZSksKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3JlYWQpKGludm9rZUNvbmZpZyksZmFsc2UpLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19yZWFkKShvbkNvbmZpZyksZmFsc2UpLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19yZWFkKShldmVudGxlc3NDb25maWcpLGZhbHNlKS5tYXAoZnVuY3Rpb24odHJhbnNpdGlvbkNvbmZpZyl7cmV0dXJuKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9BcnJheSkodHJhbnNpdGlvbkNvbmZpZykubWFwKGZ1bmN0aW9uKHRyYW5zaXRpb24pe3JldHVybiBfdGhpcy5mb3JtYXRUcmFuc2l0aW9uKHRyYW5zaXRpb24pO30pO30pKTt0cnl7Zm9yKHZhciBkZWxheWVkVHJhbnNpdGlvbnNfMT0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fdmFsdWVzKShkZWxheWVkVHJhbnNpdGlvbnMpLGRlbGF5ZWRUcmFuc2l0aW9uc18xXzE9ZGVsYXllZFRyYW5zaXRpb25zXzEubmV4dCgpOyFkZWxheWVkVHJhbnNpdGlvbnNfMV8xLmRvbmU7ZGVsYXllZFRyYW5zaXRpb25zXzFfMT1kZWxheWVkVHJhbnNpdGlvbnNfMS5uZXh0KCkpe3ZhciBkZWxheWVkVHJhbnNpdGlvbj1kZWxheWVkVHJhbnNpdGlvbnNfMV8xLnZhbHVlO2Zvcm1hdHRlZFRyYW5zaXRpb25zLnB1c2goZGVsYXllZFRyYW5zaXRpb24pO319Y2F0Y2goZV8xMF8xKXtlXzEwPXtlcnJvcjplXzEwXzF9O31maW5hbGx5e3RyeXtpZihkZWxheWVkVHJhbnNpdGlvbnNfMV8xJiYhZGVsYXllZFRyYW5zaXRpb25zXzFfMS5kb25lJiYoX2E9ZGVsYXllZFRyYW5zaXRpb25zXzFbXFxcInJldHVyblxcXCJdKSlfYS5jYWxsKGRlbGF5ZWRUcmFuc2l0aW9uc18xKTt9ZmluYWxseXtpZihlXzEwKXRocm93IGVfMTAuZXJyb3I7fX1yZXR1cm4gZm9ybWF0dGVkVHJhbnNpdGlvbnM7fTtyZXR1cm4gU3RhdGVOb2RlO30oKTsvKioqL30sLyoqKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL192aXJ0dWFsL190c2xpYi5qc1xcXCI6LyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxcXFxuICAhKioqIC4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9fdmlydHVhbC9fdHNsaWIuanMgKioqIVxcbiAgXFxcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqKi9mdW5jdGlvbiBub2RlX21vZHVsZXNYc3RhdGVFc192aXJ0dWFsX3RzbGliSnMoX191bnVzZWRfd2VicGFja19tb2R1bGUsX193ZWJwYWNrX2V4cG9ydHNfXyxfX3dlYnBhY2tfcmVxdWlyZV9fKXtcXFwidXNlIHN0cmljdFxcXCI7X193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOy8qIGhhcm1vbnkgZXhwb3J0ICovX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sey8qIGhhcm1vbnkgZXhwb3J0ICovX19hc3NpZ246ZnVuY3Rpb24gX19hc3NpZ24oKXtyZXR1cm4oLyogYmluZGluZyAqL19hc3NpZ24yKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovX19yZWFkOmZ1bmN0aW9uIF9fcmVhZCgpe3JldHVybigvKiBiaW5kaW5nICovX3JlYWQpO30sLyogaGFybW9ueSBleHBvcnQgKi9fX3Jlc3Q6ZnVuY3Rpb24gX19yZXN0KCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fcmVzdCk7fSwvKiBoYXJtb255IGV4cG9ydCAqL19fc3ByZWFkQXJyYXk6ZnVuY3Rpb24gX19zcHJlYWRBcnJheSgpe3JldHVybigvKiBiaW5kaW5nICovX3NwcmVhZEFycmF5KTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovX192YWx1ZXM6ZnVuY3Rpb24gX192YWx1ZXMoKXtyZXR1cm4oLyogYmluZGluZyAqL192YWx1ZXMpO30vKiBoYXJtb255IGV4cG9ydCAqL30pOy8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxcclxcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxcclxcblxcclxcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxcclxcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cXHJcXG5cXHJcXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXFxcIkFTIElTXFxcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxcclxcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxcclxcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcXHJcXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cXHJcXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxcclxcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcXHJcXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxcclxcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIF9hc3NpZ24yPWZ1bmN0aW9uIF9hc3NpZ24oKXtfYXNzaWduMj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbiBfX2Fzc2lnbih0KXtmb3IodmFyIHMsaT0xLG49YXJndW1lbnRzLmxlbmd0aDtpPG47aSsrKXtzPWFyZ3VtZW50c1tpXTtmb3IodmFyIHAgaW4gcylpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyxwKSl0W3BdPXNbcF07fXJldHVybiB0O307cmV0dXJuIF9hc3NpZ24yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9O2Z1bmN0aW9uIF9yZXN0KHMsZSl7dmFyIHQ9e307Zm9yKHZhciBwIGluIHMpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMscCkmJmUuaW5kZXhPZihwKTwwKXRbcF09c1twXTtpZihzIT1udWxsJiZ0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz09PVxcXCJmdW5jdGlvblxcXCIpZm9yKHZhciBpPTAscD1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpO2k8cC5sZW5ndGg7aSsrKXtpZihlLmluZGV4T2YocFtpXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMscFtpXSkpdFtwW2ldXT1zW3BbaV1dO31yZXR1cm4gdDt9ZnVuY3Rpb24gX3ZhbHVlcyhvKXt2YXIgcz10eXBlb2YgU3ltYm9sPT09XFxcImZ1bmN0aW9uXFxcIiYmU3ltYm9sLml0ZXJhdG9yLG09cyYmb1tzXSxpPTA7aWYobSlyZXR1cm4gbS5jYWxsKG8pO2lmKG8mJnR5cGVvZiBvLmxlbmd0aD09PVxcXCJudW1iZXJcXFwiKXJldHVybntuZXh0OmZ1bmN0aW9uIG5leHQoKXtpZihvJiZpPj1vLmxlbmd0aClvPXZvaWQgMDtyZXR1cm57dmFsdWU6byYmb1tpKytdLGRvbmU6IW99O319O3Rocm93IG5ldyBUeXBlRXJyb3Iocz9cXFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cXFwiOlxcXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXFxcIik7fWZ1bmN0aW9uIF9yZWFkKG8sbil7dmFyIG09dHlwZW9mIFN5bWJvbD09PVxcXCJmdW5jdGlvblxcXCImJm9bU3ltYm9sLml0ZXJhdG9yXTtpZighbSlyZXR1cm4gbzt2YXIgaT1tLmNhbGwobykscixhcj1bXSxlO3RyeXt3aGlsZSgobj09PXZvaWQgMHx8bi0tPjApJiYhKHI9aS5uZXh0KCkpLmRvbmUpYXIucHVzaChyLnZhbHVlKTt9Y2F0Y2goZXJyb3Ipe2U9e2Vycm9yOmVycm9yfTt9ZmluYWxseXt0cnl7aWYociYmIXIuZG9uZSYmKG09aVtcXFwicmV0dXJuXFxcIl0pKW0uY2FsbChpKTt9ZmluYWxseXtpZihlKXRocm93IGUuZXJyb3I7fX1yZXR1cm4gYXI7fWZ1bmN0aW9uIF9zcHJlYWRBcnJheSh0byxmcm9tLHBhY2spe2lmKHBhY2t8fGFyZ3VtZW50cy5sZW5ndGg9PT0yKWZvcih2YXIgaT0wLGw9ZnJvbS5sZW5ndGgsYXI7aTxsO2krKyl7aWYoYXJ8fCEoaSBpbiBmcm9tKSl7aWYoIWFyKWFyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sMCxpKTthcltpXT1mcm9tW2ldO319cmV0dXJuIHRvLmNvbmNhdChhcnx8QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO30vKioqL30sLyoqKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2FjdGlvblR5cGVzLmpzXFxcIjovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcXFxcbiAgISoqKiAuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvYWN0aW9uVHlwZXMuanMgKioqIVxcbiAgXFxcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAvKioqL2Z1bmN0aW9uIG5vZGVfbW9kdWxlc1hzdGF0ZUVzQWN0aW9uVHlwZXNKcyhfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18pe1xcXCJ1c2Ugc3RyaWN0XFxcIjtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7LyogaGFybW9ueSBleHBvcnQgKi9fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXyx7LyogaGFybW9ueSBleHBvcnQgKi9hZnRlcjpmdW5jdGlvbiBhZnRlcigpe3JldHVybigvKiBiaW5kaW5nICovX2FmdGVyKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovYXNzaWduOmZ1bmN0aW9uIGFzc2lnbigpe3JldHVybigvKiBiaW5kaW5nICovX2Fzc2lnbjMpO30sLyogaGFybW9ueSBleHBvcnQgKi9jYW5jZWw6ZnVuY3Rpb24gY2FuY2VsKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fY2FuY2VsKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovY2hvb3NlOmZ1bmN0aW9uIGNob29zZSgpe3JldHVybigvKiBiaW5kaW5nICovX2Nob29zZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2RvbmVTdGF0ZTpmdW5jdGlvbiBkb25lU3RhdGUoKXtyZXR1cm4oLyogYmluZGluZyAqL19kb25lU3RhdGUpO30sLyogaGFybW9ueSBleHBvcnQgKi9lcnJvcjpmdW5jdGlvbiBlcnJvcigpe3JldHVybigvKiBiaW5kaW5nICovX2Vycm9yKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovZXJyb3JFeGVjdXRpb246ZnVuY3Rpb24gZXJyb3JFeGVjdXRpb24oKXtyZXR1cm4oLyogYmluZGluZyAqL19lcnJvckV4ZWN1dGlvbik7fSwvKiBoYXJtb255IGV4cG9ydCAqL2Vycm9yUGxhdGZvcm06ZnVuY3Rpb24gZXJyb3JQbGF0Zm9ybSgpe3JldHVybigvKiBiaW5kaW5nICovX2Vycm9yUGxhdGZvcm0pO30sLyogaGFybW9ueSBleHBvcnQgKi9pbml0OmZ1bmN0aW9uIGluaXQoKXtyZXR1cm4oLyogYmluZGluZyAqL19pbml0KTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovaW52b2tlOmZ1bmN0aW9uIGludm9rZSgpe3JldHVybigvKiBiaW5kaW5nICovX2ludm9rZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2xvZzpmdW5jdGlvbiBsb2coKXtyZXR1cm4oLyogYmluZGluZyAqL19sb2cpO30sLyogaGFybW9ueSBleHBvcnQgKi9udWxsRXZlbnQ6ZnVuY3Rpb24gbnVsbEV2ZW50KCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fbnVsbEV2ZW50KTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovcHVyZTpmdW5jdGlvbiBwdXJlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fcHVyZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3JhaXNlOmZ1bmN0aW9uIHJhaXNlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fcmFpc2UpO30sLyogaGFybW9ueSBleHBvcnQgKi9zZW5kOmZ1bmN0aW9uIHNlbmQoKXtyZXR1cm4oLyogYmluZGluZyAqL19zZW5kKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovc3RhcnQ6ZnVuY3Rpb24gc3RhcnQoKXtyZXR1cm4oLyogYmluZGluZyAqL19zdGFydCk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3N0b3A6ZnVuY3Rpb24gc3RvcCgpe3JldHVybigvKiBiaW5kaW5nICovX3N0b3ApO30sLyogaGFybW9ueSBleHBvcnQgKi91cGRhdGU6ZnVuY3Rpb24gdXBkYXRlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fdXBkYXRlKTt9LyogaGFybW9ueSBleHBvcnQgKi99KTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3R5cGVzLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy90eXBlcy5qc1xcXCIpO3ZhciBfc3RhcnQ9X3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uQWN0aW9uVHlwZXMuU3RhcnQ7dmFyIF9zdG9wPV90eXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLkFjdGlvblR5cGVzLlN0b3A7dmFyIF9yYWlzZT1fdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5BY3Rpb25UeXBlcy5SYWlzZTt2YXIgX3NlbmQ9X3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uQWN0aW9uVHlwZXMuU2VuZDt2YXIgX2NhbmNlbD1fdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5BY3Rpb25UeXBlcy5DYW5jZWw7dmFyIF9udWxsRXZlbnQ9X3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uQWN0aW9uVHlwZXMuTnVsbEV2ZW50O3ZhciBfYXNzaWduMz1fdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5BY3Rpb25UeXBlcy5Bc3NpZ247dmFyIF9hZnRlcj1fdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5BY3Rpb25UeXBlcy5BZnRlcjt2YXIgX2RvbmVTdGF0ZT1fdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5BY3Rpb25UeXBlcy5Eb25lU3RhdGU7dmFyIF9sb2c9X3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uQWN0aW9uVHlwZXMuTG9nO3ZhciBfaW5pdD1fdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5BY3Rpb25UeXBlcy5Jbml0O3ZhciBfaW52b2tlPV90eXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLkFjdGlvblR5cGVzLkludm9rZTt2YXIgX2Vycm9yRXhlY3V0aW9uPV90eXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLkFjdGlvblR5cGVzLkVycm9yRXhlY3V0aW9uO3ZhciBfZXJyb3JQbGF0Zm9ybT1fdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5BY3Rpb25UeXBlcy5FcnJvclBsYXRmb3JtO3ZhciBfZXJyb3I9X3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uQWN0aW9uVHlwZXMuRXJyb3JDdXN0b207dmFyIF91cGRhdGU9X3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uQWN0aW9uVHlwZXMuVXBkYXRlO3ZhciBfY2hvb3NlPV90eXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLkFjdGlvblR5cGVzLkNob29zZTt2YXIgX3B1cmU9X3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uQWN0aW9uVHlwZXMuUHVyZTsvKioqL30sLyoqKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2FjdGlvbnMuanNcXFwiOi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXFxcXG4gICEqKiogLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2FjdGlvbnMuanMgKioqIVxcbiAgXFxcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKiovZnVuY3Rpb24gbm9kZV9tb2R1bGVzWHN0YXRlRXNBY3Rpb25zSnMoX191bnVzZWRfd2VicGFja19tb2R1bGUsX193ZWJwYWNrX2V4cG9ydHNfXyxfX3dlYnBhY2tfcmVxdWlyZV9fKXtcXFwidXNlIHN0cmljdFxcXCI7X193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOy8qIGhhcm1vbnkgZXhwb3J0ICovX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sey8qIGhhcm1vbnkgZXhwb3J0ICovYWN0aW9uVHlwZXM6ZnVuY3Rpb24gYWN0aW9uVHlwZXMoKXtyZXR1cm4oLyogcmVleHBvcnQgbW9kdWxlIG9iamVjdCAqL19hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovYWZ0ZXI6ZnVuY3Rpb24gYWZ0ZXIoKXtyZXR1cm4oLyogYmluZGluZyAqL19hZnRlcjIpO30sLyogaGFybW9ueSBleHBvcnQgKi9hc3NpZ246ZnVuY3Rpb24gYXNzaWduKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fYXNzaWduNCk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2NhbmNlbDpmdW5jdGlvbiBjYW5jZWwoKXtyZXR1cm4oLyogYmluZGluZyAqL19jYW5jZWwyKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovY2hvb3NlOmZ1bmN0aW9uIGNob29zZSgpe3JldHVybigvKiBiaW5kaW5nICovX2Nob29zZTIpO30sLyogaGFybW9ueSBleHBvcnQgKi9kb25lOmZ1bmN0aW9uIGRvbmUoKXtyZXR1cm4oLyogYmluZGluZyAqL19kb25lKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovZG9uZUludm9rZTpmdW5jdGlvbiBkb25lSW52b2tlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fZG9uZUludm9rZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2Vycm9yOmZ1bmN0aW9uIGVycm9yKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fZXJyb3IyKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovZXNjYWxhdGU6ZnVuY3Rpb24gZXNjYWxhdGUoKXtyZXR1cm4oLyogYmluZGluZyAqL19lc2NhbGF0ZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2ZvcndhcmRUbzpmdW5jdGlvbiBmb3J3YXJkVG8oKXtyZXR1cm4oLyogYmluZGluZyAqL19mb3J3YXJkVG8pO30sLyogaGFybW9ueSBleHBvcnQgKi9nZXRBY3Rpb25GdW5jdGlvbjpmdW5jdGlvbiBnZXRBY3Rpb25GdW5jdGlvbigpe3JldHVybigvKiBiaW5kaW5nICovX2dldEFjdGlvbkZ1bmN0aW9uKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovaW5pdEV2ZW50OmZ1bmN0aW9uIGluaXRFdmVudCgpe3JldHVybigvKiBiaW5kaW5nICovX2luaXRFdmVudCk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2lzQWN0aW9uT2JqZWN0OmZ1bmN0aW9uIGlzQWN0aW9uT2JqZWN0KCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9faXNBY3Rpb25PYmplY3QpO30sLyogaGFybW9ueSBleHBvcnQgKi9sb2c6ZnVuY3Rpb24gbG9nKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fbG9nMik7fSwvKiBoYXJtb255IGV4cG9ydCAqL3B1cmU6ZnVuY3Rpb24gcHVyZSgpe3JldHVybigvKiBiaW5kaW5nICovX3B1cmUyKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovcmFpc2U6ZnVuY3Rpb24gcmFpc2UoKXtyZXR1cm4oLyogYmluZGluZyAqL19yYWlzZTIpO30sLyogaGFybW9ueSBleHBvcnQgKi9yZXNvbHZlQWN0aW9uczpmdW5jdGlvbiByZXNvbHZlQWN0aW9ucygpe3JldHVybigvKiBiaW5kaW5nICovX3Jlc29sdmVBY3Rpb25zKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovcmVzb2x2ZUxvZzpmdW5jdGlvbiByZXNvbHZlTG9nKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fcmVzb2x2ZUxvZyk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3Jlc29sdmVSYWlzZTpmdW5jdGlvbiByZXNvbHZlUmFpc2UoKXtyZXR1cm4oLyogYmluZGluZyAqL19yZXNvbHZlUmFpc2UpO30sLyogaGFybW9ueSBleHBvcnQgKi9yZXNvbHZlU2VuZDpmdW5jdGlvbiByZXNvbHZlU2VuZCgpe3JldHVybigvKiBiaW5kaW5nICovX3Jlc29sdmVTZW5kKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovcmVzb2x2ZVN0b3A6ZnVuY3Rpb24gcmVzb2x2ZVN0b3AoKXtyZXR1cm4oLyogYmluZGluZyAqL19yZXNvbHZlU3RvcCk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3Jlc3BvbmQ6ZnVuY3Rpb24gcmVzcG9uZCgpe3JldHVybigvKiBiaW5kaW5nICovX3Jlc3BvbmQpO30sLyogaGFybW9ueSBleHBvcnQgKi9zZW5kOmZ1bmN0aW9uIHNlbmQoKXtyZXR1cm4oLyogYmluZGluZyAqL19zZW5kMik7fSwvKiBoYXJtb255IGV4cG9ydCAqL3NlbmRQYXJlbnQ6ZnVuY3Rpb24gc2VuZFBhcmVudCgpe3JldHVybigvKiBiaW5kaW5nICovX3NlbmRQYXJlbnQpO30sLyogaGFybW9ueSBleHBvcnQgKi9zZW5kVG86ZnVuY3Rpb24gc2VuZFRvKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fc2VuZFRvKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovc2VuZFVwZGF0ZTpmdW5jdGlvbiBzZW5kVXBkYXRlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fc2VuZFVwZGF0ZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3N0YXJ0OmZ1bmN0aW9uIHN0YXJ0KCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fc3RhcnQyKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovc3RvcDpmdW5jdGlvbiBzdG9wKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fc3RvcDIpO30sLyogaGFybW9ueSBleHBvcnQgKi90b0FjdGlvbk9iamVjdDpmdW5jdGlvbiB0b0FjdGlvbk9iamVjdCgpe3JldHVybigvKiBiaW5kaW5nICovX3RvQWN0aW9uT2JqZWN0KTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovdG9BY3Rpb25PYmplY3RzOmZ1bmN0aW9uIHRvQWN0aW9uT2JqZWN0cygpe3JldHVybigvKiBiaW5kaW5nICovX3RvQWN0aW9uT2JqZWN0cyk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3RvQWN0aXZpdHlEZWZpbml0aW9uOmZ1bmN0aW9uIHRvQWN0aXZpdHlEZWZpbml0aW9uKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fdG9BY3Rpdml0eURlZmluaXRpb24pO30vKiBoYXJtb255IGV4cG9ydCAqL30pOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9fdmlydHVhbC9fdHNsaWIuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL192aXJ0dWFsL190c2xpYi5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF90eXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vdHlwZXMuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3R5cGVzLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9hY3Rpb25UeXBlcy5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvYWN0aW9uVHlwZXMuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3V0aWxzLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy91dGlscy5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9lbnZpcm9ubWVudF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZW52aXJvbm1lbnQuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2Vudmlyb25tZW50LmpzXFxcIik7dmFyIF9pbml0RXZlbnQ9LyojX19QVVJFX18qLygwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLnRvU0NYTUxFdmVudCkoe3R5cGU6X2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaW5pdH0pO2Z1bmN0aW9uIF9nZXRBY3Rpb25GdW5jdGlvbihhY3Rpb25UeXBlLGFjdGlvbkZ1bmN0aW9uTWFwKXtyZXR1cm4gYWN0aW9uRnVuY3Rpb25NYXA/YWN0aW9uRnVuY3Rpb25NYXBbYWN0aW9uVHlwZV18fHVuZGVmaW5lZDp1bmRlZmluZWQ7fWZ1bmN0aW9uIF90b0FjdGlvbk9iamVjdChhY3Rpb24sYWN0aW9uRnVuY3Rpb25NYXApe3ZhciBhY3Rpb25PYmplY3Q7aWYoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaXNTdHJpbmcpKGFjdGlvbil8fHR5cGVvZiBhY3Rpb249PT0nbnVtYmVyJyl7dmFyIGV4ZWM9X2dldEFjdGlvbkZ1bmN0aW9uKGFjdGlvbixhY3Rpb25GdW5jdGlvbk1hcCk7aWYoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaXNGdW5jdGlvbikoZXhlYykpe2FjdGlvbk9iamVjdD17dHlwZTphY3Rpb24sZXhlYzpleGVjfTt9ZWxzZSBpZihleGVjKXthY3Rpb25PYmplY3Q9ZXhlYzt9ZWxzZXthY3Rpb25PYmplY3Q9e3R5cGU6YWN0aW9uLGV4ZWM6dW5kZWZpbmVkfTt9fWVsc2UgaWYoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaXNGdW5jdGlvbikoYWN0aW9uKSl7YWN0aW9uT2JqZWN0PXsvLyBDb252ZXJ0IGFjdGlvbiB0byBzdHJpbmcgaWYgdW5uYW1lZFxcbnR5cGU6YWN0aW9uLm5hbWV8fGFjdGlvbi50b1N0cmluZygpLGV4ZWM6YWN0aW9ufTt9ZWxzZXt2YXIgZXhlYz1fZ2V0QWN0aW9uRnVuY3Rpb24oYWN0aW9uLnR5cGUsYWN0aW9uRnVuY3Rpb25NYXApO2lmKCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmlzRnVuY3Rpb24pKGV4ZWMpKXthY3Rpb25PYmplY3Q9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoe30sYWN0aW9uKSx7ZXhlYzpleGVjfSk7fWVsc2UgaWYoZXhlYyl7dmFyIGFjdGlvblR5cGU9ZXhlYy50eXBlfHxhY3Rpb24udHlwZTthY3Rpb25PYmplY3Q9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoe30sZXhlYyksYWN0aW9uKSx7dHlwZTphY3Rpb25UeXBlfSk7fWVsc2V7YWN0aW9uT2JqZWN0PWFjdGlvbjt9fXJldHVybiBhY3Rpb25PYmplY3Q7fXZhciBfdG9BY3Rpb25PYmplY3RzPWZ1bmN0aW9uIF90b0FjdGlvbk9iamVjdHMoYWN0aW9uLGFjdGlvbkZ1bmN0aW9uTWFwKXtpZighYWN0aW9uKXtyZXR1cm5bXTt9dmFyIGFjdGlvbnM9KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaXNBcnJheSkoYWN0aW9uKT9hY3Rpb246W2FjdGlvbl07cmV0dXJuIGFjdGlvbnMubWFwKGZ1bmN0aW9uKHN1YkFjdGlvbil7cmV0dXJuIF90b0FjdGlvbk9iamVjdChzdWJBY3Rpb24sYWN0aW9uRnVuY3Rpb25NYXApO30pO307ZnVuY3Rpb24gX3RvQWN0aXZpdHlEZWZpbml0aW9uKGFjdGlvbil7dmFyIGFjdGlvbk9iamVjdD1fdG9BY3Rpb25PYmplY3QoYWN0aW9uKTtyZXR1cm4oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSh7aWQ6KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaXNTdHJpbmcpKGFjdGlvbik/YWN0aW9uOmFjdGlvbk9iamVjdC5pZH0sYWN0aW9uT2JqZWN0KSx7dHlwZTphY3Rpb25PYmplY3QudHlwZX0pO30vKipcXHJcXG4gKiBSYWlzZXMgYW4gZXZlbnQuIFRoaXMgcGxhY2VzIHRoZSBldmVudCBpbiB0aGUgaW50ZXJuYWwgZXZlbnQgcXVldWUsIHNvIHRoYXRcXHJcXG4gKiB0aGUgZXZlbnQgaXMgaW1tZWRpYXRlbHkgY29uc3VtZWQgYnkgdGhlIG1hY2hpbmUgaW4gdGhlIGN1cnJlbnQgc3RlcC5cXHJcXG4gKlxcclxcbiAqIEBwYXJhbSBldmVudFR5cGUgVGhlIGV2ZW50IHRvIHJhaXNlLlxcclxcbiAqL2Z1bmN0aW9uIF9yYWlzZTIoZXZlbnQsb3B0aW9ucyl7cmV0dXJue3R5cGU6X2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ucmFpc2UsZXZlbnQ6dHlwZW9mIGV2ZW50PT09J2Z1bmN0aW9uJz9ldmVudDooMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy50b0V2ZW50T2JqZWN0KShldmVudCksZGVsYXk6b3B0aW9ucz9vcHRpb25zLmRlbGF5OnVuZGVmaW5lZCxpZDpvcHRpb25zPT09bnVsbHx8b3B0aW9ucz09PXZvaWQgMD92b2lkIDA6b3B0aW9ucy5pZH07fWZ1bmN0aW9uIF9yZXNvbHZlUmFpc2UoYWN0aW9uLGN0eCxfZXZlbnQsZGVsYXlzTWFwKXt2YXIgbWV0YT17X2V2ZW50Ol9ldmVudH07dmFyIHJlc29sdmVkRXZlbnQ9KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18udG9TQ1hNTEV2ZW50KSgoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5pc0Z1bmN0aW9uKShhY3Rpb24uZXZlbnQpP2FjdGlvbi5ldmVudChjdHgsX2V2ZW50LmRhdGEsbWV0YSk6YWN0aW9uLmV2ZW50KTt2YXIgcmVzb2x2ZWREZWxheTtpZigoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5pc1N0cmluZykoYWN0aW9uLmRlbGF5KSl7dmFyIGNvbmZpZ0RlbGF5PWRlbGF5c01hcCYmZGVsYXlzTWFwW2FjdGlvbi5kZWxheV07cmVzb2x2ZWREZWxheT0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5pc0Z1bmN0aW9uKShjb25maWdEZWxheSk/Y29uZmlnRGVsYXkoY3R4LF9ldmVudC5kYXRhLG1ldGEpOmNvbmZpZ0RlbGF5O31lbHNle3Jlc29sdmVkRGVsYXk9KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaXNGdW5jdGlvbikoYWN0aW9uLmRlbGF5KT9hY3Rpb24uZGVsYXkoY3R4LF9ldmVudC5kYXRhLG1ldGEpOmFjdGlvbi5kZWxheTt9cmV0dXJuKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoe30sYWN0aW9uKSx7dHlwZTpfYWN0aW9uVHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5yYWlzZSxfZXZlbnQ6cmVzb2x2ZWRFdmVudCxkZWxheTpyZXNvbHZlZERlbGF5fSk7fS8qKlxcclxcbiAqIFNlbmRzIGFuIGV2ZW50LiBUaGlzIHJldHVybnMgYW4gYWN0aW9uIHRoYXQgd2lsbCBiZSByZWFkIGJ5IGFuIGludGVycHJldGVyIHRvXFxyXFxuICogc2VuZCB0aGUgZXZlbnQgaW4gdGhlIG5leHQgc3RlcCwgYWZ0ZXIgdGhlIGN1cnJlbnQgc3RlcCBpcyBmaW5pc2hlZCBleGVjdXRpbmcuXFxyXFxuICpcXHJcXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGBzZW5kVG8oLi4uKWAgYWN0aW9uIGNyZWF0b3IgaW5zdGVhZC5cXHJcXG4gKlxcclxcbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2VuZC5cXHJcXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgaW50byB0aGUgc2VuZCBldmVudDpcXHJcXG4gKiAgLSBgaWRgIC0gVGhlIHVuaXF1ZSBzZW5kIGV2ZW50IGlkZW50aWZpZXIgKHVzZWQgd2l0aCBgY2FuY2VsKClgKS5cXHJcXG4gKiAgLSBgZGVsYXlgIC0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgdGhlIHNlbmRpbmcgb2YgdGhlIGV2ZW50LlxcclxcbiAqICAtIGB0b2AgLSBUaGUgdGFyZ2V0IG9mIHRoaXMgZXZlbnQgKGJ5IGRlZmF1bHQsIHRoZSBtYWNoaW5lIHRoZSBldmVudCB3YXMgc2VudCBmcm9tKS5cXHJcXG4gKi9mdW5jdGlvbiBfc2VuZDIoZXZlbnQsb3B0aW9ucyl7cmV0dXJue3RvOm9wdGlvbnM/b3B0aW9ucy50bzp1bmRlZmluZWQsdHlwZTpfYWN0aW9uVHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5zZW5kLGV2ZW50OigwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmlzRnVuY3Rpb24pKGV2ZW50KT9ldmVudDooMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy50b0V2ZW50T2JqZWN0KShldmVudCksZGVsYXk6b3B0aW9ucz9vcHRpb25zLmRlbGF5OnVuZGVmaW5lZCwvLyBUT0RPOiBkb24ndCBhdXRvLWdlbmVyYXRlIElEcyBoZXJlIGxpa2UgdGhhdFxcbi8vIHRoZXJlIGlzIHRvbyBiaWcgY2hhbmNlIG9mIHRoZSBJRCBjb2xsaXNpb25cXG5pZDpvcHRpb25zJiZvcHRpb25zLmlkIT09dW5kZWZpbmVkP29wdGlvbnMuaWQ6KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaXNGdW5jdGlvbikoZXZlbnQpP2V2ZW50Lm5hbWU6KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uZ2V0RXZlbnRUeXBlKShldmVudCl9O31mdW5jdGlvbiBfcmVzb2x2ZVNlbmQoYWN0aW9uLGN0eCxfZXZlbnQsZGVsYXlzTWFwKXt2YXIgbWV0YT17X2V2ZW50Ol9ldmVudH07Ly8gVE9ETzogaGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZpbmcgRXhwclxcbnZhciByZXNvbHZlZEV2ZW50PSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLnRvU0NYTUxFdmVudCkoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaXNGdW5jdGlvbikoYWN0aW9uLmV2ZW50KT9hY3Rpb24uZXZlbnQoY3R4LF9ldmVudC5kYXRhLG1ldGEpOmFjdGlvbi5ldmVudCk7dmFyIHJlc29sdmVkRGVsYXk7aWYoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaXNTdHJpbmcpKGFjdGlvbi5kZWxheSkpe3ZhciBjb25maWdEZWxheT1kZWxheXNNYXAmJmRlbGF5c01hcFthY3Rpb24uZGVsYXldO3Jlc29sdmVkRGVsYXk9KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaXNGdW5jdGlvbikoY29uZmlnRGVsYXkpP2NvbmZpZ0RlbGF5KGN0eCxfZXZlbnQuZGF0YSxtZXRhKTpjb25maWdEZWxheTt9ZWxzZXtyZXNvbHZlZERlbGF5PSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmlzRnVuY3Rpb24pKGFjdGlvbi5kZWxheSk/YWN0aW9uLmRlbGF5KGN0eCxfZXZlbnQuZGF0YSxtZXRhKTphY3Rpb24uZGVsYXk7fXZhciByZXNvbHZlZFRhcmdldD0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5pc0Z1bmN0aW9uKShhY3Rpb24udG8pP2FjdGlvbi50byhjdHgsX2V2ZW50LmRhdGEsbWV0YSk6YWN0aW9uLnRvO3JldHVybigwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKHt9LGFjdGlvbikse3RvOnJlc29sdmVkVGFyZ2V0LF9ldmVudDpyZXNvbHZlZEV2ZW50LGV2ZW50OnJlc29sdmVkRXZlbnQuZGF0YSxkZWxheTpyZXNvbHZlZERlbGF5fSk7fS8qKlxcclxcbiAqIFNlbmRzIGFuIGV2ZW50IHRvIHRoaXMgbWFjaGluZSdzIHBhcmVudC5cXHJcXG4gKlxcclxcbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2VuZCB0byB0aGUgcGFyZW50IG1hY2hpbmUuXFxyXFxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIGludG8gdGhlIHNlbmQgZXZlbnQuXFxyXFxuICovZnVuY3Rpb24gX3NlbmRQYXJlbnQoZXZlbnQsb3B0aW9ucyl7cmV0dXJuIF9zZW5kMihldmVudCwoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSh7fSxvcHRpb25zKSx7dG86X3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uU3BlY2lhbFRhcmdldHMuUGFyZW50fSkpO30vKipcXHJcXG4gKiBTZW5kcyBhbiBldmVudCB0byBhbiBhY3Rvci5cXHJcXG4gKlxcclxcbiAqIEBwYXJhbSBhY3RvciBUaGUgYEFjdG9yUmVmYCB0byBzZW5kIHRoZSBldmVudCB0by5cXHJcXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHNlbmQsIG9yIGFuIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gdGhlIGV2ZW50IHRvIHNlbmRcXHJcXG4gKiBAcGFyYW0gb3B0aW9ucyBTZW5kIGFjdGlvbiBvcHRpb25zXFxyXFxuICogQHJldHVybnMgQW4gWFN0YXRlIHNlbmQgYWN0aW9uIG9iamVjdFxcclxcbiAqL2Z1bmN0aW9uIF9zZW5kVG8oYWN0b3IsZXZlbnQsb3B0aW9ucyl7cmV0dXJuIF9zZW5kMihldmVudCwoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fYXNzaWduKSh7fSxvcHRpb25zKSx7dG86YWN0b3J9KSk7fS8qKlxcclxcbiAqIFNlbmRzIGFuIHVwZGF0ZSBldmVudCB0byB0aGlzIG1hY2hpbmUncyBwYXJlbnQuXFxyXFxuICovZnVuY3Rpb24gX3NlbmRVcGRhdGUoKXtyZXR1cm4gX3NlbmRQYXJlbnQoX2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udXBkYXRlKTt9LyoqXFxyXFxuICogU2VuZHMgYW4gZXZlbnQgYmFjayB0byB0aGUgc2VuZGVyIG9mIHRoZSBvcmlnaW5hbCBldmVudC5cXHJcXG4gKlxcclxcbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2VuZCBiYWNrIHRvIHRoZSBzZW5kZXJcXHJcXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgaW50byB0aGUgc2VuZCBldmVudFxcclxcbiAqL2Z1bmN0aW9uIF9yZXNwb25kKGV2ZW50LG9wdGlvbnMpe3JldHVybiBfc2VuZDIoZXZlbnQsKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX2Fzc2lnbikoe30sb3B0aW9ucykse3RvOmZ1bmN0aW9uIHRvKF8sX18sX2Epe3ZhciBfZXZlbnQ9X2EuX2V2ZW50O3JldHVybiBfZXZlbnQub3JpZ2luOy8vIFRPRE86IGhhbmRsZSB3aGVuIF9ldmVudC5vcmlnaW4gaXMgdW5kZWZpbmVkXFxufX0pKTt9dmFyIGRlZmF1bHRMb2dFeHByPWZ1bmN0aW9uIGRlZmF1bHRMb2dFeHByKGNvbnRleHQsZXZlbnQpe3JldHVybntjb250ZXh0OmNvbnRleHQsZXZlbnQ6ZXZlbnR9O307LyoqXFxyXFxuICpcXHJcXG4gKiBAcGFyYW0gZXhwciBUaGUgZXhwcmVzc2lvbiBmdW5jdGlvbiB0byBldmFsdWF0ZSB3aGljaCB3aWxsIGJlIGxvZ2dlZC5cXHJcXG4gKiAgVGFrZXMgaW4gMiBhcmd1bWVudHM6XFxyXFxuICogIC0gYGN0eGAgLSB0aGUgY3VycmVudCBzdGF0ZSBjb250ZXh0XFxyXFxuICogIC0gYGV2ZW50YCAtIHRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGFjdGlvbiB0byBiZSBleGVjdXRlZC5cXHJcXG4gKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIGdpdmUgdG8gdGhlIGxvZ2dlZCBleHByZXNzaW9uLlxcclxcbiAqL2Z1bmN0aW9uIF9sb2cyKGV4cHIsbGFiZWwpe2lmKGV4cHI9PT12b2lkIDApe2V4cHI9ZGVmYXVsdExvZ0V4cHI7fXJldHVybnt0eXBlOl9hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmxvZyxsYWJlbDpsYWJlbCxleHByOmV4cHJ9O312YXIgX3Jlc29sdmVMb2c9ZnVuY3Rpb24gX3Jlc29sdmVMb2coYWN0aW9uLGN0eCxfZXZlbnQpe3JldHVybigwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKHt9LGFjdGlvbikse3ZhbHVlOigwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmlzU3RyaW5nKShhY3Rpb24uZXhwcik/YWN0aW9uLmV4cHI6YWN0aW9uLmV4cHIoY3R4LF9ldmVudC5kYXRhLHtfZXZlbnQ6X2V2ZW50fSl9KTt9Oy8qKlxcclxcbiAqIENhbmNlbHMgYW4gaW4tZmxpZ2h0IGBzZW5kKC4uLilgIGFjdGlvbi4gQSBjYW5jZWxlZCBzZW50IGFjdGlvbiB3aWxsIG5vdFxcclxcbiAqIGJlIGV4ZWN1dGVkLCBub3Igd2lsbCBpdHMgZXZlbnQgYmUgc2VudCwgdW5sZXNzIGl0IGhhcyBhbHJlYWR5IGJlZW4gc2VudFxcclxcbiAqIChlLmcuLCBpZiBgY2FuY2VsKC4uLilgIGlzIGNhbGxlZCBhZnRlciB0aGUgYHNlbmQoLi4uKWAgYWN0aW9uJ3MgYGRlbGF5YCkuXFxyXFxuICpcXHJcXG4gKiBAcGFyYW0gc2VuZElkIFRoZSBgaWRgIG9mIHRoZSBgc2VuZCguLi4pYCBhY3Rpb24gdG8gY2FuY2VsLlxcclxcbiAqL3ZhciBfY2FuY2VsMj1mdW5jdGlvbiBfY2FuY2VsMihzZW5kSWQpe3JldHVybnt0eXBlOl9hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmNhbmNlbCxzZW5kSWQ6c2VuZElkfTt9Oy8qKlxcclxcbiAqIFN0YXJ0cyBhbiBhY3Rpdml0eS5cXHJcXG4gKlxcclxcbiAqIEBwYXJhbSBhY3Rpdml0eSBUaGUgYWN0aXZpdHkgdG8gc3RhcnQuXFxyXFxuICovZnVuY3Rpb24gX3N0YXJ0MihhY3Rpdml0eSl7dmFyIGFjdGl2aXR5RGVmPV90b0FjdGl2aXR5RGVmaW5pdGlvbihhY3Rpdml0eSk7cmV0dXJue3R5cGU6X3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uQWN0aW9uVHlwZXMuU3RhcnQsYWN0aXZpdHk6YWN0aXZpdHlEZWYsZXhlYzp1bmRlZmluZWR9O30vKipcXHJcXG4gKiBTdG9wcyBhbiBhY3Rpdml0eS5cXHJcXG4gKlxcclxcbiAqIEBwYXJhbSBhY3RvclJlZiBUaGUgYWN0aXZpdHkgdG8gc3RvcC5cXHJcXG4gKi9mdW5jdGlvbiBfc3RvcDIoYWN0b3JSZWYpe3ZhciBhY3Rpdml0eT0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5pc0Z1bmN0aW9uKShhY3RvclJlZik/YWN0b3JSZWY6X3RvQWN0aXZpdHlEZWZpbml0aW9uKGFjdG9yUmVmKTtyZXR1cm57dHlwZTpfdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5BY3Rpb25UeXBlcy5TdG9wLGFjdGl2aXR5OmFjdGl2aXR5LGV4ZWM6dW5kZWZpbmVkfTt9ZnVuY3Rpb24gX3Jlc29sdmVTdG9wKGFjdGlvbixjb250ZXh0LF9ldmVudCl7dmFyIGFjdG9yUmVmT3JTdHJpbmc9KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaXNGdW5jdGlvbikoYWN0aW9uLmFjdGl2aXR5KT9hY3Rpb24uYWN0aXZpdHkoY29udGV4dCxfZXZlbnQuZGF0YSk6YWN0aW9uLmFjdGl2aXR5O3ZhciByZXNvbHZlZEFjdG9yUmVmPXR5cGVvZiBhY3RvclJlZk9yU3RyaW5nPT09J3N0cmluZyc/e2lkOmFjdG9yUmVmT3JTdHJpbmd9OmFjdG9yUmVmT3JTdHJpbmc7dmFyIGFjdGlvbk9iamVjdD17dHlwZTpfdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5BY3Rpb25UeXBlcy5TdG9wLGFjdGl2aXR5OnJlc29sdmVkQWN0b3JSZWZ9O3JldHVybiBhY3Rpb25PYmplY3Q7fS8qKlxcclxcbiAqIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY29udGV4dCBvZiB0aGUgbWFjaGluZS5cXHJcXG4gKlxcclxcbiAqIEBwYXJhbSBhc3NpZ25tZW50IEFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHBhcnRpYWwgY29udGV4dCB0byB1cGRhdGUuXFxyXFxuICovdmFyIF9hc3NpZ240PWZ1bmN0aW9uIF9hc3NpZ240KGFzc2lnbm1lbnQpe3JldHVybnt0eXBlOl9hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmFzc2lnbixhc3NpZ25tZW50OmFzc2lnbm1lbnR9O307ZnVuY3Rpb24gX2lzQWN0aW9uT2JqZWN0KGFjdGlvbil7cmV0dXJuIF90eXBlb2YyKGFjdGlvbik9PT0nb2JqZWN0JyYmJ3R5cGUnaW4gYWN0aW9uO30vKipcXHJcXG4gKiBSZXR1cm5zIGFuIGV2ZW50IHR5cGUgdGhhdCByZXByZXNlbnRzIGFuIGltcGxpY2l0IGV2ZW50IHRoYXRcXHJcXG4gKiBpcyBzZW50IGFmdGVyIHRoZSBzcGVjaWZpZWQgYGRlbGF5YC5cXHJcXG4gKlxcclxcbiAqIEBwYXJhbSBkZWxheVJlZiBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzXFxyXFxuICogQHBhcmFtIGlkIFRoZSBzdGF0ZSBub2RlIElEIHdoZXJlIHRoaXMgZXZlbnQgaXMgaGFuZGxlZFxcclxcbiAqL2Z1bmN0aW9uIF9hZnRlcjIoZGVsYXlSZWYsaWQpe3ZhciBpZFN1ZmZpeD1pZD9cXFwiI1xcXCIuY29uY2F0KGlkKTonJztyZXR1cm5cXFwiXFxcIi5jb25jYXQoX3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uQWN0aW9uVHlwZXMuQWZ0ZXIsXFxcIihcXFwiKS5jb25jYXQoZGVsYXlSZWYsXFxcIilcXFwiKS5jb25jYXQoaWRTdWZmaXgpO30vKipcXHJcXG4gKiBSZXR1cm5zIGFuIGV2ZW50IHRoYXQgcmVwcmVzZW50cyB0aGF0IGEgZmluYWwgc3RhdGUgbm9kZVxcclxcbiAqIGhhcyBiZWVuIHJlYWNoZWQgaW4gdGhlIHBhcmVudCBzdGF0ZSBub2RlLlxcclxcbiAqXFxyXFxuICogQHBhcmFtIGlkIFRoZSBmaW5hbCBzdGF0ZSBub2RlJ3MgcGFyZW50IHN0YXRlIG5vZGUgYGlkYFxcclxcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIHBhc3MgaW50byB0aGUgZXZlbnRcXHJcXG4gKi9mdW5jdGlvbiBfZG9uZShpZCxkYXRhKXt2YXIgdHlwZT1cXFwiXFxcIi5jb25jYXQoX3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uQWN0aW9uVHlwZXMuRG9uZVN0YXRlLFxcXCIuXFxcIikuY29uY2F0KGlkKTt2YXIgZXZlbnRPYmplY3Q9e3R5cGU6dHlwZSxkYXRhOmRhdGF9O2V2ZW50T2JqZWN0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR5cGU7fTtyZXR1cm4gZXZlbnRPYmplY3Q7fS8qKlxcclxcbiAqIFJldHVybnMgYW4gZXZlbnQgdGhhdCByZXByZXNlbnRzIHRoYXQgYW4gaW52b2tlZCBzZXJ2aWNlIGhhcyB0ZXJtaW5hdGVkLlxcclxcbiAqXFxyXFxuICogQW4gaW52b2tlZCBzZXJ2aWNlIGlzIHRlcm1pbmF0ZWQgd2hlbiBpdCBoYXMgcmVhY2hlZCBhIHRvcC1sZXZlbCBmaW5hbCBzdGF0ZSBub2RlLFxcclxcbiAqIGJ1dCBub3Qgd2hlbiBpdCBpcyBjYW5jZWxlZC5cXHJcXG4gKlxcclxcbiAqIEBwYXJhbSBpZCBUaGUgZmluYWwgc3RhdGUgbm9kZSBJRFxcclxcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIHBhc3MgaW50byB0aGUgZXZlbnRcXHJcXG4gKi9mdW5jdGlvbiBfZG9uZUludm9rZShpZCxkYXRhKXt2YXIgdHlwZT1cXFwiXFxcIi5jb25jYXQoX3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uQWN0aW9uVHlwZXMuRG9uZUludm9rZSxcXFwiLlxcXCIpLmNvbmNhdChpZCk7dmFyIGV2ZW50T2JqZWN0PXt0eXBlOnR5cGUsZGF0YTpkYXRhfTtldmVudE9iamVjdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0eXBlO307cmV0dXJuIGV2ZW50T2JqZWN0O31mdW5jdGlvbiBfZXJyb3IyKGlkLGRhdGEpe3ZhciB0eXBlPVxcXCJcXFwiLmNvbmNhdChfdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5BY3Rpb25UeXBlcy5FcnJvclBsYXRmb3JtLFxcXCIuXFxcIikuY29uY2F0KGlkKTt2YXIgZXZlbnRPYmplY3Q9e3R5cGU6dHlwZSxkYXRhOmRhdGF9O2V2ZW50T2JqZWN0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR5cGU7fTtyZXR1cm4gZXZlbnRPYmplY3Q7fWZ1bmN0aW9uIF9wdXJlMihnZXRBY3Rpb25zKXtyZXR1cm57dHlwZTpfdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5BY3Rpb25UeXBlcy5QdXJlLGdldDpnZXRBY3Rpb25zfTt9LyoqXFxyXFxuICogRm9yd2FyZHMgKHNlbmRzKSBhbiBldmVudCB0byBhIHNwZWNpZmllZCBzZXJ2aWNlLlxcclxcbiAqXFxyXFxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHNlcnZpY2UgdG8gZm9yd2FyZCB0aGUgZXZlbnQgdG8uXFxyXFxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIGludG8gdGhlIHNlbmQgYWN0aW9uIGNyZWF0b3IuXFxyXFxuICovZnVuY3Rpb24gX2ZvcndhcmRUbyh0YXJnZXQsb3B0aW9ucyl7aWYoIV9lbnZpcm9ubWVudF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLklTX1BST0RVQ1RJT04mJighdGFyZ2V0fHx0eXBlb2YgdGFyZ2V0PT09J2Z1bmN0aW9uJykpe3ZhciBvcmlnaW5hbFRhcmdldF8xPXRhcmdldDt0YXJnZXQ9ZnVuY3Rpb24gdGFyZ2V0KCl7dmFyIGFyZ3M9W107Zm9yKHZhciBfaT0wO19pPGFyZ3VtZW50cy5sZW5ndGg7X2krKyl7YXJnc1tfaV09YXJndW1lbnRzW19pXTt9dmFyIHJlc29sdmVkVGFyZ2V0PXR5cGVvZiBvcmlnaW5hbFRhcmdldF8xPT09J2Z1bmN0aW9uJz9vcmlnaW5hbFRhcmdldF8xLmFwcGx5KHZvaWQgMCwoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fc3ByZWFkQXJyYXkpKFtdLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19yZWFkKShhcmdzKSxmYWxzZSkpOm9yaWdpbmFsVGFyZ2V0XzE7aWYoIXJlc29sdmVkVGFyZ2V0KXt0aHJvdyBuZXcgRXJyb3IoXFxcIkF0dGVtcHRlZCB0byBmb3J3YXJkIGV2ZW50IHRvIHVuZGVmaW5lZCBhY3Rvci4gVGhpcyByaXNrcyBhbiBpbmZpbml0ZSBsb29wIGluIHRoZSBzZW5kZXIuXFxcIik7fXJldHVybiByZXNvbHZlZFRhcmdldDt9O31yZXR1cm4gX3NlbmQyKGZ1bmN0aW9uKF8sZXZlbnQpe3JldHVybiBldmVudDt9LCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKHt9LG9wdGlvbnMpLHt0bzp0YXJnZXR9KSk7fS8qKlxcclxcbiAqIEVzY2FsYXRlcyBhbiBlcnJvciBieSBzZW5kaW5nIGl0IGFzIGFuIGV2ZW50IHRvIHRoaXMgbWFjaGluZSdzIHBhcmVudC5cXHJcXG4gKlxcclxcbiAqIEBwYXJhbSBlcnJvckRhdGEgVGhlIGVycm9yIGRhdGEgdG8gc2VuZCwgb3IgdGhlIGV4cHJlc3Npb24gZnVuY3Rpb24gdGhhdFxcclxcbiAqIHRha2VzIGluIHRoZSBgY29udGV4dGAsIGBldmVudGAsIGFuZCBgbWV0YWAsIGFuZCByZXR1cm5zIHRoZSBlcnJvciBkYXRhIHRvIHNlbmQuXFxyXFxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIGludG8gdGhlIHNlbmQgYWN0aW9uIGNyZWF0b3IuXFxyXFxuICovZnVuY3Rpb24gX2VzY2FsYXRlKGVycm9yRGF0YSxvcHRpb25zKXtyZXR1cm4gX3NlbmRQYXJlbnQoZnVuY3Rpb24oY29udGV4dCxldmVudCxtZXRhKXtyZXR1cm57dHlwZTpfYWN0aW9uVHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5lcnJvcixkYXRhOigwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmlzRnVuY3Rpb24pKGVycm9yRGF0YSk/ZXJyb3JEYXRhKGNvbnRleHQsZXZlbnQsbWV0YSk6ZXJyb3JEYXRhfTt9LCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKHt9LG9wdGlvbnMpLHt0bzpfdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5TcGVjaWFsVGFyZ2V0cy5QYXJlbnR9KSk7fWZ1bmN0aW9uIF9jaG9vc2UyKGNvbmRzKXtyZXR1cm57dHlwZTpfdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5BY3Rpb25UeXBlcy5DaG9vc2UsY29uZHM6Y29uZHN9O312YXIgcGx1Y2tBc3NpZ25zPWZ1bmN0aW9uIHBsdWNrQXNzaWducyhhY3Rpb25CbG9ja3Mpe3ZhciBlXzEsX2E7dmFyIGFzc2lnbkFjdGlvbnM9W107dHJ5e2Zvcih2YXIgYWN0aW9uQmxvY2tzXzE9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5fX3ZhbHVlcykoYWN0aW9uQmxvY2tzKSxhY3Rpb25CbG9ja3NfMV8xPWFjdGlvbkJsb2Nrc18xLm5leHQoKTshYWN0aW9uQmxvY2tzXzFfMS5kb25lO2FjdGlvbkJsb2Nrc18xXzE9YWN0aW9uQmxvY2tzXzEubmV4dCgpKXt2YXIgYmxvY2s9YWN0aW9uQmxvY2tzXzFfMS52YWx1ZTt2YXIgaT0wO3doaWxlKGk8YmxvY2suYWN0aW9ucy5sZW5ndGgpe2lmKGJsb2NrLmFjdGlvbnNbaV0udHlwZT09PV9hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmFzc2lnbil7YXNzaWduQWN0aW9ucy5wdXNoKGJsb2NrLmFjdGlvbnNbaV0pO2Jsb2NrLmFjdGlvbnMuc3BsaWNlKGksMSk7Y29udGludWU7fWkrKzt9fX1jYXRjaChlXzFfMSl7ZV8xPXtlcnJvcjplXzFfMX07fWZpbmFsbHl7dHJ5e2lmKGFjdGlvbkJsb2Nrc18xXzEmJiFhY3Rpb25CbG9ja3NfMV8xLmRvbmUmJihfYT1hY3Rpb25CbG9ja3NfMVtcXFwicmV0dXJuXFxcIl0pKV9hLmNhbGwoYWN0aW9uQmxvY2tzXzEpO31maW5hbGx5e2lmKGVfMSl0aHJvdyBlXzEuZXJyb3I7fX1yZXR1cm4gYXNzaWduQWN0aW9uczt9O2Z1bmN0aW9uIF9yZXNvbHZlQWN0aW9ucyhtYWNoaW5lLGN1cnJlbnRTdGF0ZSxjdXJyZW50Q29udGV4dCxfZXZlbnQsYWN0aW9uQmxvY2tzLHByZWRpY3RhYmxlRXhlYyxwcmVzZXJ2ZUFjdGlvbk9yZGVyKXtpZihwcmVzZXJ2ZUFjdGlvbk9yZGVyPT09dm9pZCAwKXtwcmVzZXJ2ZUFjdGlvbk9yZGVyPWZhbHNlO312YXIgYXNzaWduQWN0aW9ucz1wcmVzZXJ2ZUFjdGlvbk9yZGVyP1tdOnBsdWNrQXNzaWducyhhY3Rpb25CbG9ja3MpO3ZhciB1cGRhdGVkQ29udGV4dD1hc3NpZ25BY3Rpb25zLmxlbmd0aD8oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy51cGRhdGVDb250ZXh0KShjdXJyZW50Q29udGV4dCxfZXZlbnQsYXNzaWduQWN0aW9ucyxjdXJyZW50U3RhdGUpOmN1cnJlbnRDb250ZXh0O3ZhciBwcmVzZXJ2ZWRDb250ZXh0cz1wcmVzZXJ2ZUFjdGlvbk9yZGVyP1tjdXJyZW50Q29udGV4dF06dW5kZWZpbmVkO3ZhciBkZWZlcnJlZFRvQmxvY2tFbmQ9W107ZnVuY3Rpb24gaGFuZGxlQWN0aW9uKGJsb2NrVHlwZSxhY3Rpb25PYmplY3Qpe3ZhciBfYTtzd2l0Y2goYWN0aW9uT2JqZWN0LnR5cGUpe2Nhc2UgX2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ucmFpc2U6e3ZhciByYWlzZWRBY3Rpb249X3Jlc29sdmVSYWlzZShhY3Rpb25PYmplY3QsdXBkYXRlZENvbnRleHQsX2V2ZW50LG1hY2hpbmUub3B0aW9ucy5kZWxheXMpO2lmKHByZWRpY3RhYmxlRXhlYyYmdHlwZW9mIHJhaXNlZEFjdGlvbi5kZWxheT09PSdudW1iZXInKXtwcmVkaWN0YWJsZUV4ZWMocmFpc2VkQWN0aW9uLHVwZGF0ZWRDb250ZXh0LF9ldmVudCk7fXJldHVybiByYWlzZWRBY3Rpb247fWNhc2UgX2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uc2VuZDp2YXIgc2VuZEFjdGlvbj1fcmVzb2x2ZVNlbmQoYWN0aW9uT2JqZWN0LHVwZGF0ZWRDb250ZXh0LF9ldmVudCxtYWNoaW5lLm9wdGlvbnMuZGVsYXlzKTsvLyBUT0RPOiBmaXggQWN0aW9uVHlwZXMuSW5pdFxcbmlmKCFfZW52aXJvbm1lbnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5JU19QUk9EVUNUSU9OKXt2YXIgY29uZmlndXJlZERlbGF5PWFjdGlvbk9iamVjdC5kZWxheTsvLyB3YXJuIGFmdGVyIHJlc29sdmluZyBhcyB3ZSBjYW4gY3JlYXRlIGJldHRlciBjb250ZXh0dWFsIG1lc3NhZ2UgaGVyZVxcbigwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLndhcm4pKCEoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5pc1N0cmluZykoY29uZmlndXJlZERlbGF5KXx8dHlwZW9mIHNlbmRBY3Rpb24uZGVsYXk9PT0nbnVtYmVyJywvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXFxuXFxcIk5vIGRlbGF5IHJlZmVyZW5jZSBmb3IgZGVsYXkgZXhwcmVzc2lvbiAnXFxcIi5jb25jYXQoY29uZmlndXJlZERlbGF5LFxcXCInIHdhcyBmb3VuZCBvbiBtYWNoaW5lICdcXFwiKS5jb25jYXQobWFjaGluZS5pZCxcXFwiJ1xcXCIpKTt9aWYocHJlZGljdGFibGVFeGVjJiZzZW5kQWN0aW9uLnRvIT09X3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uU3BlY2lhbFRhcmdldHMuSW50ZXJuYWwpe2lmKGJsb2NrVHlwZT09PSdlbnRyeScpe2RlZmVycmVkVG9CbG9ja0VuZC5wdXNoKHNlbmRBY3Rpb24pO31lbHNle3ByZWRpY3RhYmxlRXhlYyhzZW5kQWN0aW9uLHVwZGF0ZWRDb250ZXh0LF9ldmVudCk7fX1yZXR1cm4gc2VuZEFjdGlvbjtjYXNlIF9hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmxvZzp7dmFyIHJlc29sdmVkPV9yZXNvbHZlTG9nKGFjdGlvbk9iamVjdCx1cGRhdGVkQ29udGV4dCxfZXZlbnQpO3ByZWRpY3RhYmxlRXhlYz09PW51bGx8fHByZWRpY3RhYmxlRXhlYz09PXZvaWQgMD92b2lkIDA6cHJlZGljdGFibGVFeGVjKHJlc29sdmVkLHVwZGF0ZWRDb250ZXh0LF9ldmVudCk7cmV0dXJuIHJlc29sdmVkO31jYXNlIF9hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmNob29zZTp7dmFyIGNob29zZUFjdGlvbj1hY3Rpb25PYmplY3Q7dmFyIG1hdGNoZWRBY3Rpb25zPShfYT1jaG9vc2VBY3Rpb24uY29uZHMuZmluZChmdW5jdGlvbihjb25kaXRpb24pe3ZhciBndWFyZD0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy50b0d1YXJkKShjb25kaXRpb24uY29uZCxtYWNoaW5lLm9wdGlvbnMuZ3VhcmRzKTtyZXR1cm4hZ3VhcmR8fCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmV2YWx1YXRlR3VhcmQpKG1hY2hpbmUsZ3VhcmQsdXBkYXRlZENvbnRleHQsX2V2ZW50LCFwcmVkaWN0YWJsZUV4ZWM/Y3VycmVudFN0YXRlOnVuZGVmaW5lZCk7fSkpPT09bnVsbHx8X2E9PT12b2lkIDA/dm9pZCAwOl9hLmFjdGlvbnM7aWYoIW1hdGNoZWRBY3Rpb25zKXtyZXR1cm5bXTt9dmFyIF9iPSgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19yZWFkKShfcmVzb2x2ZUFjdGlvbnMobWFjaGluZSxjdXJyZW50U3RhdGUsdXBkYXRlZENvbnRleHQsX2V2ZW50LFt7dHlwZTpibG9ja1R5cGUsYWN0aW9uczpfdG9BY3Rpb25PYmplY3RzKCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLnRvQXJyYXkpKG1hdGNoZWRBY3Rpb25zKSxtYWNoaW5lLm9wdGlvbnMuYWN0aW9ucyl9XSxwcmVkaWN0YWJsZUV4ZWMscHJlc2VydmVBY3Rpb25PcmRlciksMikscmVzb2x2ZWRBY3Rpb25zRnJvbUNob29zZT1fYlswXSxyZXNvbHZlZENvbnRleHRGcm9tQ2hvb3NlPV9iWzFdO3VwZGF0ZWRDb250ZXh0PXJlc29sdmVkQ29udGV4dEZyb21DaG9vc2U7cHJlc2VydmVkQ29udGV4dHM9PT1udWxsfHxwcmVzZXJ2ZWRDb250ZXh0cz09PXZvaWQgMD92b2lkIDA6cHJlc2VydmVkQ29udGV4dHMucHVzaCh1cGRhdGVkQ29udGV4dCk7cmV0dXJuIHJlc29sdmVkQWN0aW9uc0Zyb21DaG9vc2U7fWNhc2UgX2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ucHVyZTp7dmFyIG1hdGNoZWRBY3Rpb25zPWFjdGlvbk9iamVjdC5nZXQodXBkYXRlZENvbnRleHQsX2V2ZW50LmRhdGEpO2lmKCFtYXRjaGVkQWN0aW9ucyl7cmV0dXJuW107fXZhciBfYz0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fcmVhZCkoX3Jlc29sdmVBY3Rpb25zKG1hY2hpbmUsY3VycmVudFN0YXRlLHVwZGF0ZWRDb250ZXh0LF9ldmVudCxbe3R5cGU6YmxvY2tUeXBlLGFjdGlvbnM6X3RvQWN0aW9uT2JqZWN0cygoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy50b0FycmF5KShtYXRjaGVkQWN0aW9ucyksbWFjaGluZS5vcHRpb25zLmFjdGlvbnMpfV0scHJlZGljdGFibGVFeGVjLHByZXNlcnZlQWN0aW9uT3JkZXIpLDIpLHJlc29sdmVkQWN0aW9uc0Zyb21QdXJlPV9jWzBdLHJlc29sdmVkQ29udGV4dD1fY1sxXTt1cGRhdGVkQ29udGV4dD1yZXNvbHZlZENvbnRleHQ7cHJlc2VydmVkQ29udGV4dHM9PT1udWxsfHxwcmVzZXJ2ZWRDb250ZXh0cz09PXZvaWQgMD92b2lkIDA6cHJlc2VydmVkQ29udGV4dHMucHVzaCh1cGRhdGVkQ29udGV4dCk7cmV0dXJuIHJlc29sdmVkQWN0aW9uc0Zyb21QdXJlO31jYXNlIF9hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnN0b3A6e3ZhciByZXNvbHZlZD1fcmVzb2x2ZVN0b3AoYWN0aW9uT2JqZWN0LHVwZGF0ZWRDb250ZXh0LF9ldmVudCk7cHJlZGljdGFibGVFeGVjPT09bnVsbHx8cHJlZGljdGFibGVFeGVjPT09dm9pZCAwP3ZvaWQgMDpwcmVkaWN0YWJsZUV4ZWMocmVzb2x2ZWQsY3VycmVudENvbnRleHQsX2V2ZW50KTtyZXR1cm4gcmVzb2x2ZWQ7fWNhc2UgX2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uYXNzaWduOnt1cGRhdGVkQ29udGV4dD0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy51cGRhdGVDb250ZXh0KSh1cGRhdGVkQ29udGV4dCxfZXZlbnQsW2FjdGlvbk9iamVjdF0sIXByZWRpY3RhYmxlRXhlYz9jdXJyZW50U3RhdGU6dW5kZWZpbmVkKTtwcmVzZXJ2ZWRDb250ZXh0cz09PW51bGx8fHByZXNlcnZlZENvbnRleHRzPT09dm9pZCAwP3ZvaWQgMDpwcmVzZXJ2ZWRDb250ZXh0cy5wdXNoKHVwZGF0ZWRDb250ZXh0KTticmVhazt9ZGVmYXVsdDp2YXIgcmVzb2x2ZWRBY3Rpb25PYmplY3Q9X3RvQWN0aW9uT2JqZWN0KGFjdGlvbk9iamVjdCxtYWNoaW5lLm9wdGlvbnMuYWN0aW9ucyk7dmFyIGV4ZWNfMT1yZXNvbHZlZEFjdGlvbk9iamVjdC5leGVjO2lmKHByZWRpY3RhYmxlRXhlYyl7cHJlZGljdGFibGVFeGVjKHJlc29sdmVkQWN0aW9uT2JqZWN0LHVwZGF0ZWRDb250ZXh0LF9ldmVudCk7fWVsc2UgaWYoZXhlY18xJiZwcmVzZXJ2ZWRDb250ZXh0cyl7dmFyIGNvbnRleHRJbmRleF8xPXByZXNlcnZlZENvbnRleHRzLmxlbmd0aC0xO3ZhciB3cmFwcGVkPSgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19hc3NpZ24pKHt9LHJlc29sdmVkQWN0aW9uT2JqZWN0KSx7ZXhlYzpmdW5jdGlvbiBleGVjKF9jdHgpe3ZhciBhcmdzPVtdO2Zvcih2YXIgX2k9MTtfaTxhcmd1bWVudHMubGVuZ3RoO19pKyspe2FyZ3NbX2ktMV09YXJndW1lbnRzW19pXTt9ZXhlY18xLmFwcGx5KHZvaWQgMCwoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fc3ByZWFkQXJyYXkpKFtwcmVzZXJ2ZWRDb250ZXh0c1tjb250ZXh0SW5kZXhfMV1dLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uX19yZWFkKShhcmdzKSxmYWxzZSkpO319KTtyZXNvbHZlZEFjdGlvbk9iamVjdD13cmFwcGVkO31yZXR1cm4gcmVzb2x2ZWRBY3Rpb25PYmplY3Q7fX1mdW5jdGlvbiBwcm9jZXNzQmxvY2soYmxvY2spe3ZhciBlXzIsX2E7dmFyIHJlc29sdmVkQWN0aW9ucz1bXTt0cnl7Zm9yKHZhciBfYj0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLl9fdmFsdWVzKShibG9jay5hY3Rpb25zKSxfYz1fYi5uZXh0KCk7IV9jLmRvbmU7X2M9X2IubmV4dCgpKXt2YXIgYWN0aW9uPV9jLnZhbHVlO3ZhciByZXNvbHZlZD1oYW5kbGVBY3Rpb24oYmxvY2sudHlwZSxhY3Rpb24pO2lmKHJlc29sdmVkKXtyZXNvbHZlZEFjdGlvbnM9cmVzb2x2ZWRBY3Rpb25zLmNvbmNhdChyZXNvbHZlZCk7fX19Y2F0Y2goZV8yXzEpe2VfMj17ZXJyb3I6ZV8yXzF9O31maW5hbGx5e3RyeXtpZihfYyYmIV9jLmRvbmUmJihfYT1fYltcXFwicmV0dXJuXFxcIl0pKV9hLmNhbGwoX2IpO31maW5hbGx5e2lmKGVfMil0aHJvdyBlXzIuZXJyb3I7fX1kZWZlcnJlZFRvQmxvY2tFbmQuZm9yRWFjaChmdW5jdGlvbihhY3Rpb24pe3ByZWRpY3RhYmxlRXhlYyhhY3Rpb24sdXBkYXRlZENvbnRleHQsX2V2ZW50KTt9KTtkZWZlcnJlZFRvQmxvY2tFbmQubGVuZ3RoPTA7cmV0dXJuIHJlc29sdmVkQWN0aW9uczt9dmFyIHJlc29sdmVkQWN0aW9ucz0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5mbGF0dGVuKShhY3Rpb25CbG9ja3MubWFwKHByb2Nlc3NCbG9jaykpO3JldHVybltyZXNvbHZlZEFjdGlvbnMsdXBkYXRlZENvbnRleHRdO30vKioqL30sLyoqKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2JlaGF2aW9ycy5qc1xcXCI6LyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxcXFxuICAhKioqIC4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9iZWhhdmlvcnMuanMgKioqIVxcbiAgXFxcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqKi9mdW5jdGlvbiBub2RlX21vZHVsZXNYc3RhdGVFc0JlaGF2aW9yc0pzKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyl7XFxcInVzZSBzdHJpY3RcXFwiO19fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsvKiBoYXJtb255IGV4cG9ydCAqL19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHsvKiBoYXJtb255IGV4cG9ydCAqL2Zyb21Qcm9taXNlOmZ1bmN0aW9uIGZyb21Qcm9taXNlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fZnJvbVByb21pc2UpO30sLyogaGFybW9ueSBleHBvcnQgKi9mcm9tUmVkdWNlcjpmdW5jdGlvbiBmcm9tUmVkdWNlcigpe3JldHVybigvKiBiaW5kaW5nICovX2Zyb21SZWR1Y2VyKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovc3Bhd25CZWhhdmlvcjpmdW5jdGlvbiBzcGF3bkJlaGF2aW9yKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fc3Bhd25CZWhhdmlvcik7fS8qIGhhcm1vbnkgZXhwb3J0ICovfSk7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2FjdGlvbnMuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2FjdGlvbnMuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfQWN0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL0FjdG9yLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9BY3Rvci5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vdXRpbHMuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3V0aWxzLmpzXFxcIik7LyoqXFxyXFxuICogUmV0dXJucyBhbiBhY3RvciBiZWhhdmlvciBmcm9tIGEgcmVkdWNlciBhbmQgaXRzIGluaXRpYWwgc3RhdGUuXFxyXFxuICpcXHJcXG4gKiBAcGFyYW0gdHJhbnNpdGlvbiBUaGUgcHVyZSByZWR1Y2VyIHRoYXQgcmV0dXJucyB0aGUgbmV4dCBzdGF0ZSBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZSBhbmQgZXZlbnQuXFxyXFxuICogQHBhcmFtIGluaXRpYWxTdGF0ZSBUaGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgcmVkdWNlci5cXHJcXG4gKiBAcmV0dXJucyBBbiBhY3RvciBiZWhhdmlvclxcclxcbiAqL2Z1bmN0aW9uIF9mcm9tUmVkdWNlcih0cmFuc2l0aW9uLGluaXRpYWxTdGF0ZSl7cmV0dXJue3RyYW5zaXRpb246dHJhbnNpdGlvbixpbml0aWFsU3RhdGU6aW5pdGlhbFN0YXRlfTt9ZnVuY3Rpb24gX2Zyb21Qcm9taXNlKHByb21pc2VGbil7dmFyIGluaXRpYWxTdGF0ZT17ZXJyb3I6dW5kZWZpbmVkLGRhdGE6dW5kZWZpbmVkLHN0YXR1czoncGVuZGluZyd9O3JldHVybnt0cmFuc2l0aW9uOmZ1bmN0aW9uIHRyYW5zaXRpb24oc3RhdGUsZXZlbnQsX2Epe3ZhciBwYXJlbnQ9X2EucGFyZW50LGlkPV9hLmlkLG9ic2VydmVycz1fYS5vYnNlcnZlcnM7c3dpdGNoKGV2ZW50LnR5cGUpe2Nhc2UnZnVsZmlsbCc6cGFyZW50PT09bnVsbHx8cGFyZW50PT09dm9pZCAwP3ZvaWQgMDpwYXJlbnQuc2VuZCgoMCxfYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmRvbmVJbnZva2UpKGlkLGV2ZW50LmRhdGEpKTtyZXR1cm57ZXJyb3I6dW5kZWZpbmVkLGRhdGE6ZXZlbnQuZGF0YSxzdGF0dXM6J2Z1bGZpbGxlZCd9O2Nhc2UncmVqZWN0JzpwYXJlbnQ9PT1udWxsfHxwYXJlbnQ9PT12b2lkIDA/dm9pZCAwOnBhcmVudC5zZW5kKCgwLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZXJyb3IpKGlkLGV2ZW50LmVycm9yKSk7b2JzZXJ2ZXJzLmZvckVhY2goZnVuY3Rpb24ob2JzZXJ2ZXIpe29ic2VydmVyLmVycm9yKGV2ZW50LmVycm9yKTt9KTtyZXR1cm57ZXJyb3I6ZXZlbnQuZXJyb3IsZGF0YTp1bmRlZmluZWQsc3RhdHVzOidyZWplY3RlZCd9O2RlZmF1bHQ6cmV0dXJuIHN0YXRlO319LGluaXRpYWxTdGF0ZTppbml0aWFsU3RhdGUsc3RhcnQ6ZnVuY3Rpb24gc3RhcnQoX2Epe3ZhciBzZWxmPV9hLnNlbGY7cHJvbWlzZUZuKCkudGhlbihmdW5jdGlvbihkYXRhKXtzZWxmLnNlbmQoe3R5cGU6J2Z1bGZpbGwnLGRhdGE6ZGF0YX0pO30sZnVuY3Rpb24ocmVhc29uKXtzZWxmLnNlbmQoe3R5cGU6J3JlamVjdCcsZXJyb3I6cmVhc29ufSk7fSk7cmV0dXJuIGluaXRpYWxTdGF0ZTt9fTt9ZnVuY3Rpb24gX3NwYXduQmVoYXZpb3IoYmVoYXZpb3Isb3B0aW9ucyl7aWYob3B0aW9ucz09PXZvaWQgMCl7b3B0aW9ucz17fTt9dmFyIHN0YXRlPWJlaGF2aW9yLmluaXRpYWxTdGF0ZTt2YXIgb2JzZXJ2ZXJzPW5ldyBTZXQoKTt2YXIgbWFpbGJveD1bXTt2YXIgZmx1c2hpbmc9ZmFsc2U7dmFyIGZsdXNoPWZ1bmN0aW9uIGZsdXNoKCl7aWYoZmx1c2hpbmcpe3JldHVybjt9Zmx1c2hpbmc9dHJ1ZTt3aGlsZShtYWlsYm94Lmxlbmd0aD4wKXt2YXIgZXZlbnRfMT1tYWlsYm94LnNoaWZ0KCk7c3RhdGU9YmVoYXZpb3IudHJhbnNpdGlvbihzdGF0ZSxldmVudF8xLGFjdG9yQ3R4KTtvYnNlcnZlcnMuZm9yRWFjaChmdW5jdGlvbihvYnNlcnZlcil7cmV0dXJuIG9ic2VydmVyLm5leHQoc3RhdGUpO30pO31mbHVzaGluZz1mYWxzZTt9O3ZhciBhY3Rvcj0oMCxfQWN0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy50b0FjdG9yUmVmKSh7aWQ6b3B0aW9ucy5pZCxzZW5kOmZ1bmN0aW9uIHNlbmQoZXZlbnQpe21haWxib3gucHVzaChldmVudCk7Zmx1c2goKTt9LGdldFNuYXBzaG90OmZ1bmN0aW9uIGdldFNuYXBzaG90KCl7cmV0dXJuIHN0YXRlO30sc3Vic2NyaWJlOmZ1bmN0aW9uIHN1YnNjcmliZShuZXh0LGhhbmRsZUVycm9yLGNvbXBsZXRlKXt2YXIgb2JzZXJ2ZXI9KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18udG9PYnNlcnZlcikobmV4dCxoYW5kbGVFcnJvcixjb21wbGV0ZSk7b2JzZXJ2ZXJzLmFkZChvYnNlcnZlcik7b2JzZXJ2ZXIubmV4dChzdGF0ZSk7cmV0dXJue3Vuc3Vic2NyaWJlOmZ1bmN0aW9uIHVuc3Vic2NyaWJlKCl7b2JzZXJ2ZXJzW1xcXCJkZWxldGVcXFwiXShvYnNlcnZlcik7fX07fX0pO3ZhciBhY3RvckN0eD17cGFyZW50Om9wdGlvbnMucGFyZW50LHNlbGY6YWN0b3IsaWQ6b3B0aW9ucy5pZHx8J2Fub255bW91cycsb2JzZXJ2ZXJzOm9ic2VydmVyc307c3RhdGU9YmVoYXZpb3Iuc3RhcnQ/YmVoYXZpb3Iuc3RhcnQoYWN0b3JDdHgpOnN0YXRlO3JldHVybiBhY3Rvcjt9LyoqKi99LC8qKiovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9jb25zdGFudHMuanNcXFwiOi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcXFxcbiAgISoqKiAuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvY29uc3RhbnRzLmpzICoqKiFcXG4gIFxcXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKiovZnVuY3Rpb24gbm9kZV9tb2R1bGVzWHN0YXRlRXNDb25zdGFudHNKcyhfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18pe1xcXCJ1c2Ugc3RyaWN0XFxcIjtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7LyogaGFybW9ueSBleHBvcnQgKi9fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXyx7LyogaGFybW9ueSBleHBvcnQgKi9ERUZBVUxUX0dVQVJEX1RZUEU6ZnVuY3Rpb24gREVGQVVMVF9HVUFSRF9UWVBFKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fREVGQVVMVF9HVUFSRF9UWVBFKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovRU1QVFlfQUNUSVZJVFlfTUFQOmZ1bmN0aW9uIEVNUFRZX0FDVElWSVRZX01BUCgpe3JldHVybigvKiBiaW5kaW5nICovX0VNUFRZX0FDVElWSVRZX01BUCk7fSwvKiBoYXJtb255IGV4cG9ydCAqL1NUQVRFX0RFTElNSVRFUjpmdW5jdGlvbiBTVEFURV9ERUxJTUlURVIoKXtyZXR1cm4oLyogYmluZGluZyAqL19TVEFURV9ERUxJTUlURVIpO30sLyogaGFybW9ueSBleHBvcnQgKi9UQVJHRVRMRVNTX0tFWTpmdW5jdGlvbiBUQVJHRVRMRVNTX0tFWSgpe3JldHVybigvKiBiaW5kaW5nICovX1RBUkdFVExFU1NfS0VZKTt9LyogaGFybW9ueSBleHBvcnQgKi99KTt2YXIgX1NUQVRFX0RFTElNSVRFUj0nLic7dmFyIF9FTVBUWV9BQ1RJVklUWV9NQVA9e307dmFyIF9ERUZBVUxUX0dVQVJEX1RZUEU9J3hzdGF0ZS5ndWFyZCc7dmFyIF9UQVJHRVRMRVNTX0tFWT0nJzsvKioqL30sLyoqKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2RldlRvb2xzLmpzXFxcIjovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcXFxcbiAgISoqKiAuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvZGV2VG9vbHMuanMgKioqIVxcbiAgXFxcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAvKioqL2Z1bmN0aW9uIG5vZGVfbW9kdWxlc1hzdGF0ZUVzRGV2VG9vbHNKcyhfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18pe1xcXCJ1c2Ugc3RyaWN0XFxcIjtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7LyogaGFybW9ueSBleHBvcnQgKi9fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXyx7LyogaGFybW9ueSBleHBvcnQgKi9nZXRHbG9iYWw6ZnVuY3Rpb24gZ2V0R2xvYmFsKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fZ2V0R2xvYmFsKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovcmVnaXN0ZXJTZXJ2aWNlOmZ1bmN0aW9uIHJlZ2lzdGVyU2VydmljZSgpe3JldHVybigvKiBiaW5kaW5nICovX3JlZ2lzdGVyU2VydmljZSk7fS8qIGhhcm1vbnkgZXhwb3J0ICovfSk7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX2Vudmlyb25tZW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9lbnZpcm9ubWVudC5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvZW52aXJvbm1lbnQuanNcXFwiKTtmdW5jdGlvbiBfZ2V0R2xvYmFsKCl7aWYodHlwZW9mIGdsb2JhbFRoaXMhPT0ndW5kZWZpbmVkJyl7cmV0dXJuIGdsb2JhbFRoaXM7fWlmKHR5cGVvZiBzZWxmIT09J3VuZGVmaW5lZCcpe3JldHVybiBzZWxmO31pZih0eXBlb2Ygd2luZG93IT09J3VuZGVmaW5lZCcpe3JldHVybiB3aW5kb3c7fWlmKHR5cGVvZiBfX3dlYnBhY2tfcmVxdWlyZV9fLmchPT0ndW5kZWZpbmVkJyl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uZzt9aWYoIV9lbnZpcm9ubWVudF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLklTX1BST0RVQ1RJT04pe2NvbnNvbGUud2FybignWFN0YXRlIGNvdWxkIG5vdCBmaW5kIGEgZ2xvYmFsIG9iamVjdCBpbiB0aGlzIGVudmlyb25tZW50LiBQbGVhc2UgbGV0IHRoZSBtYWludGFpbmVycyBrbm93IGFuZCByYWlzZSBhbiBpc3N1ZSBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vc3RhdGVseWFpL3hzdGF0ZS9pc3N1ZXMnKTt9fWZ1bmN0aW9uIGdldERldlRvb2xzKCl7dmFyIGdsb2JhbD1fZ2V0R2xvYmFsKCk7aWYoZ2xvYmFsJiYnX194c3RhdGVfXydpbiBnbG9iYWwpe3JldHVybiBnbG9iYWwuX194c3RhdGVfXzt9cmV0dXJuIHVuZGVmaW5lZDt9ZnVuY3Rpb24gX3JlZ2lzdGVyU2VydmljZShzZXJ2aWNlKXtpZighX2dldEdsb2JhbCgpKXtyZXR1cm47fXZhciBkZXZUb29scz1nZXREZXZUb29scygpO2lmKGRldlRvb2xzKXtkZXZUb29scy5yZWdpc3RlcihzZXJ2aWNlKTt9fS8qKiovfSwvKioqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvZW52aXJvbm1lbnQuanNcXFwiOi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxcXFxuICAhKioqIC4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9lbnZpcm9ubWVudC5qcyAqKiohXFxuICBcXFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKiovZnVuY3Rpb24gbm9kZV9tb2R1bGVzWHN0YXRlRXNFbnZpcm9ubWVudEpzKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyl7XFxcInVzZSBzdHJpY3RcXFwiO19fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsvKiBoYXJtb255IGV4cG9ydCAqL19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHsvKiBoYXJtb255IGV4cG9ydCAqL0lTX1BST0RVQ1RJT046ZnVuY3Rpb24gSVNfUFJPRFVDVElPTigpe3JldHVybigvKiBiaW5kaW5nICovX0lTX1BST0RVQ1RJT04pO30vKiBoYXJtb255IGV4cG9ydCAqL30pO3ZhciBfSVNfUFJPRFVDVElPTj1cXFwiZGV2ZWxvcG1lbnRcXFwiPT09J3Byb2R1Y3Rpb24nOy8qKiovfSwvKioqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvaW5kZXguanNcXFwiOi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxcXFxuICAhKioqIC4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9pbmRleC5qcyAqKiohXFxuICBcXFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKiovZnVuY3Rpb24gbm9kZV9tb2R1bGVzWHN0YXRlRXNJbmRleEpzKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyl7XFxcInVzZSBzdHJpY3RcXFwiO19fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsvKiBoYXJtb255IGV4cG9ydCAqL19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHsvKiBoYXJtb255IGV4cG9ydCAqL0FjdGlvblR5cGVzOmZ1bmN0aW9uIEFjdGlvblR5cGVzKCl7cmV0dXJuKC8qIHJlZXhwb3J0IHNhZmUgKi9fdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18uQWN0aW9uVHlwZXMpO30sLyogaGFybW9ueSBleHBvcnQgKi9JbnRlcnByZXRlcjpmdW5jdGlvbiBJbnRlcnByZXRlcigpe3JldHVybigvKiByZWV4cG9ydCBzYWZlICovX2ludGVycHJldGVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uSW50ZXJwcmV0ZXIpO30sLyogaGFybW9ueSBleHBvcnQgKi9JbnRlcnByZXRlclN0YXR1czpmdW5jdGlvbiBJbnRlcnByZXRlclN0YXR1cygpe3JldHVybigvKiByZWV4cG9ydCBzYWZlICovX2ludGVycHJldGVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uSW50ZXJwcmV0ZXJTdGF0dXMpO30sLyogaGFybW9ueSBleHBvcnQgKi9NYWNoaW5lOmZ1bmN0aW9uIE1hY2hpbmUoKXtyZXR1cm4oLyogcmVleHBvcnQgc2FmZSAqL19NYWNoaW5lX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uTWFjaGluZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL1NwZWNpYWxUYXJnZXRzOmZ1bmN0aW9uIFNwZWNpYWxUYXJnZXRzKCl7cmV0dXJuKC8qIHJlZXhwb3J0IHNhZmUgKi9fdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18uU3BlY2lhbFRhcmdldHMpO30sLyogaGFybW9ueSBleHBvcnQgKi9TdGF0ZTpmdW5jdGlvbiBTdGF0ZSgpe3JldHVybigvKiByZWV4cG9ydCBzYWZlICovX1N0YXRlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18uU3RhdGUpO30sLyogaGFybW9ueSBleHBvcnQgKi9TdGF0ZU5vZGU6ZnVuY3Rpb24gU3RhdGVOb2RlKCl7cmV0dXJuKC8qIHJlZXhwb3J0IHNhZmUgKi9fU3RhdGVOb2RlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X18uU3RhdGVOb2RlKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovYWN0aW9uczpmdW5jdGlvbiBhY3Rpb25zKCl7cmV0dXJuKC8qIHJlZXhwb3J0IG1vZHVsZSBvYmplY3QgKi9fYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovYXNzaWduOmZ1bmN0aW9uIGFzc2lnbigpe3JldHVybigvKiBiaW5kaW5nICovX2Fzc2lnbjUpO30sLyogaGFybW9ueSBleHBvcnQgKi9jYW5jZWw6ZnVuY3Rpb24gY2FuY2VsKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fY2FuY2VsMyk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2Nob29zZTpmdW5jdGlvbiBjaG9vc2UoKXtyZXR1cm4oLyogYmluZGluZyAqL19jaG9vc2UzKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovY3JlYXRlTWFjaGluZTpmdW5jdGlvbiBjcmVhdGVNYWNoaW5lKCl7cmV0dXJuKC8qIHJlZXhwb3J0IHNhZmUgKi9fTWFjaGluZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLmNyZWF0ZU1hY2hpbmUpO30sLyogaGFybW9ueSBleHBvcnQgKi9jcmVhdGVTY2hlbWE6ZnVuY3Rpb24gY3JlYXRlU2NoZW1hKCl7cmV0dXJuKC8qIHJlZXhwb3J0IHNhZmUgKi9fc2NoZW1hX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uY3JlYXRlU2NoZW1hKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovZG9uZUludm9rZTpmdW5jdGlvbiBkb25lSW52b2tlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fZG9uZUludm9rZTIpO30sLyogaGFybW9ueSBleHBvcnQgKi9mb3J3YXJkVG86ZnVuY3Rpb24gZm9yd2FyZFRvKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fZm9yd2FyZFRvMik7fSwvKiBoYXJtb255IGV4cG9ydCAqL2ludGVycHJldDpmdW5jdGlvbiBpbnRlcnByZXQoKXtyZXR1cm4oLyogcmVleHBvcnQgc2FmZSAqL19pbnRlcnByZXRlcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmludGVycHJldCk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2xvZzpmdW5jdGlvbiBsb2coKXtyZXR1cm4oLyogYmluZGluZyAqL19sb2czKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovbWFwU3RhdGU6ZnVuY3Rpb24gbWFwU3RhdGUoKXtyZXR1cm4oLyogcmVleHBvcnQgc2FmZSAqL19tYXBTdGF0ZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLm1hcFN0YXRlKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovbWF0Y2hTdGF0ZTpmdW5jdGlvbiBtYXRjaFN0YXRlKCl7cmV0dXJuKC8qIHJlZXhwb3J0IHNhZmUgKi9fbWF0Y2hfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5tYXRjaFN0YXRlKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovbWF0Y2hlc1N0YXRlOmZ1bmN0aW9uIG1hdGNoZXNTdGF0ZSgpe3JldHVybigvKiByZWV4cG9ydCBzYWZlICovX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fLm1hdGNoZXNTdGF0ZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3B1cmU6ZnVuY3Rpb24gcHVyZSgpe3JldHVybigvKiBiaW5kaW5nICovX3B1cmUzKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovcmFpc2U6ZnVuY3Rpb24gcmFpc2UoKXtyZXR1cm4oLyogYmluZGluZyAqL19yYWlzZTMpO30sLyogaGFybW9ueSBleHBvcnQgKi9zZW5kOmZ1bmN0aW9uIHNlbmQoKXtyZXR1cm4oLyogYmluZGluZyAqL19zZW5kMyk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3NlbmRQYXJlbnQ6ZnVuY3Rpb24gc2VuZFBhcmVudCgpe3JldHVybigvKiBiaW5kaW5nICovX3NlbmRQYXJlbnQyKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovc2VuZFRvOmZ1bmN0aW9uIHNlbmRUbygpe3JldHVybigvKiBiaW5kaW5nICovX3NlbmRUbzIpO30sLyogaGFybW9ueSBleHBvcnQgKi9zZW5kVXBkYXRlOmZ1bmN0aW9uIHNlbmRVcGRhdGUoKXtyZXR1cm4oLyogYmluZGluZyAqL19zZW5kVXBkYXRlMik7fSwvKiBoYXJtb255IGV4cG9ydCAqL3NwYXduOmZ1bmN0aW9uIHNwYXduKCl7cmV0dXJuKC8qIHJlZXhwb3J0IHNhZmUgKi9faW50ZXJwcmV0ZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5zcGF3bik7fSwvKiBoYXJtb255IGV4cG9ydCAqL3NwYXduQmVoYXZpb3I6ZnVuY3Rpb24gc3Bhd25CZWhhdmlvcigpe3JldHVybigvKiByZWV4cG9ydCBzYWZlICovX2JlaGF2aW9yc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fLnNwYXduQmVoYXZpb3IpO30sLyogaGFybW9ueSBleHBvcnQgKi9zdG9wOmZ1bmN0aW9uIHN0b3AoKXtyZXR1cm4oLyogYmluZGluZyAqL19zdG9wMyk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3Q6ZnVuY3Rpb24gdCgpe3JldHVybigvKiByZWV4cG9ydCBzYWZlICovX3NjaGVtYV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLnQpO30sLyogaGFybW9ueSBleHBvcnQgKi90b0FjdG9yUmVmOmZ1bmN0aW9uIHRvQWN0b3JSZWYoKXtyZXR1cm4oLyogcmVleHBvcnQgc2FmZSAqL19BY3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLnRvQWN0b3JSZWYpO30sLyogaGFybW9ueSBleHBvcnQgKi90b0V2ZW50T2JqZWN0OmZ1bmN0aW9uIHRvRXZlbnRPYmplY3QoKXtyZXR1cm4oLyogcmVleHBvcnQgc2FmZSAqL191dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfXy50b0V2ZW50T2JqZWN0KTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovdG9PYnNlcnZlcjpmdW5jdGlvbiB0b09ic2VydmVyKCl7cmV0dXJuKC8qIHJlZXhwb3J0IHNhZmUgKi9fdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX18udG9PYnNlcnZlcik7fSwvKiBoYXJtb255IGV4cG9ydCAqL3RvU0NYTUxFdmVudDpmdW5jdGlvbiB0b1NDWE1MRXZlbnQoKXtyZXR1cm4oLyogcmVleHBvcnQgc2FmZSAqL191dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfXy50b1NDWE1MRXZlbnQpO30vKiBoYXJtb255IGV4cG9ydCAqL30pOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9hY3Rpb25zLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9hY3Rpb25zLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX0FjdG9yX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9BY3Rvci5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvQWN0b3IuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfaW50ZXJwcmV0ZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2ludGVycHJldGVyLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9pbnRlcnByZXRlci5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9NYWNoaW5lX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9NYWNoaW5lLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9NYWNoaW5lLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX21hcFN0YXRlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9tYXBTdGF0ZS5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvbWFwU3RhdGUuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfbWF0Y2hfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL21hdGNoLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9tYXRjaC5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9zY2hlbWFfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3NjaGVtYS5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvc2NoZW1hLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX1N0YXRlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9TdGF0ZS5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvU3RhdGUuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfU3RhdGVOb2RlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9TdGF0ZU5vZGUuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL1N0YXRlTm9kZS5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9iZWhhdmlvcnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2JlaGF2aW9ycy5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvYmVoYXZpb3JzLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vdHlwZXMuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3R5cGVzLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vdXRpbHMuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3V0aWxzLmpzXFxcIik7dmFyIF9hc3NpZ241PV9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uYXNzaWduLF9jYW5jZWwzPV9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uY2FuY2VsLF9zZW5kMz1fYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnNlbmQsX3NlbmRUbzI9X2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5zZW5kVG8sX3NlbmRQYXJlbnQyPV9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uc2VuZFBhcmVudCxfc2VuZFVwZGF0ZTI9X2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5zZW5kVXBkYXRlLF9mb3J3YXJkVG8yPV9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZm9yd2FyZFRvLF9kb25lSW52b2tlMj1fYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmRvbmVJbnZva2UsX3JhaXNlMz1fYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnJhaXNlLF9sb2czPV9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ubG9nLF9wdXJlMz1fYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnB1cmUsX2Nob29zZTM9X2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5jaG9vc2UsX3N0b3AzPV9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uc3RvcDsvKioqL30sLyoqKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2ludGVycHJldGVyLmpzXFxcIjovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcXFxcbiAgISoqKiAuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvaW50ZXJwcmV0ZXIuanMgKioqIVxcbiAgXFxcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAvKioqL2Z1bmN0aW9uIG5vZGVfbW9kdWxlc1hzdGF0ZUVzSW50ZXJwcmV0ZXJKcyhfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18pe1xcXCJ1c2Ugc3RyaWN0XFxcIjtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7LyogaGFybW9ueSBleHBvcnQgKi9fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXyx7LyogaGFybW9ueSBleHBvcnQgKi9JbnRlcnByZXRlcjpmdW5jdGlvbiBJbnRlcnByZXRlcigpe3JldHVybigvKiBiaW5kaW5nICovX0ludGVycHJldGVyKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovSW50ZXJwcmV0ZXJTdGF0dXM6ZnVuY3Rpb24gSW50ZXJwcmV0ZXJTdGF0dXMoKXtyZXR1cm4oLyogYmluZGluZyAqL19JbnRlcnByZXRlclN0YXR1cyk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2ludGVycHJldDpmdW5jdGlvbiBpbnRlcnByZXQoKXtyZXR1cm4oLyogYmluZGluZyAqL19pbnRlcnByZXQpO30sLyogaGFybW9ueSBleHBvcnQgKi9zcGF3bjpmdW5jdGlvbiBzcGF3bigpe3JldHVybigvKiBiaW5kaW5nICovX3NwYXduKTt9LyogaGFybW9ueSBleHBvcnQgKi99KTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vX3ZpcnR1YWwvX3RzbGliLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9fdmlydHVhbC9fdHNsaWIuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3R5cGVzLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy90eXBlcy5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9TdGF0ZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vU3RhdGUuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL1N0YXRlLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9hY3Rpb25UeXBlcy5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvYWN0aW9uVHlwZXMuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vYWN0aW9ucy5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvYWN0aW9ucy5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9lbnZpcm9ubWVudF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZW52aXJvbm1lbnQuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2Vudmlyb25tZW50LmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi91dGlscy5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvdXRpbHMuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfc2NoZWR1bGVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9zY2hlZHVsZXIuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3NjaGVkdWxlci5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9BY3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL0FjdG9yLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9BY3Rvci5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9yZWdpc3RyeV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcmVnaXN0cnkuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3JlZ2lzdHJ5LmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX2RldlRvb2xzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMl9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZGV2VG9vbHMuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2RldlRvb2xzLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX3NlcnZpY2VTY29wZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vc2VydmljZVNjb3BlLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9zZXJ2aWNlU2NvcGUuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfYmVoYXZpb3JzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vYmVoYXZpb3JzLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9iZWhhdmlvcnMuanNcXFwiKTt2YXIgREVGQVVMVF9TUEFXTl9PUFRJT05TPXtzeW5jOmZhbHNlLGF1dG9Gb3J3YXJkOmZhbHNlfTt2YXIgX0ludGVycHJldGVyU3RhdHVzOyhmdW5jdGlvbihJbnRlcnByZXRlclN0YXR1cyl7SW50ZXJwcmV0ZXJTdGF0dXNbSW50ZXJwcmV0ZXJTdGF0dXNbXFxcIk5vdFN0YXJ0ZWRcXFwiXT0wXT1cXFwiTm90U3RhcnRlZFxcXCI7SW50ZXJwcmV0ZXJTdGF0dXNbSW50ZXJwcmV0ZXJTdGF0dXNbXFxcIlJ1bm5pbmdcXFwiXT0xXT1cXFwiUnVubmluZ1xcXCI7SW50ZXJwcmV0ZXJTdGF0dXNbSW50ZXJwcmV0ZXJTdGF0dXNbXFxcIlN0b3BwZWRcXFwiXT0yXT1cXFwiU3RvcHBlZFxcXCI7fSkoX0ludGVycHJldGVyU3RhdHVzfHwoX0ludGVycHJldGVyU3RhdHVzPXt9KSk7dmFyIF9JbnRlcnByZXRlcj0vKiNfX1BVUkVfXyovIC8qKiBAY2xhc3MgKi9mdW5jdGlvbigpey8qKlxcclxcbiAgICogQ3JlYXRlcyBhIG5ldyBJbnRlcnByZXRlciBpbnN0YW5jZSAoaS5lLiwgc2VydmljZSkgZm9yIHRoZSBnaXZlbiBtYWNoaW5lIHdpdGggdGhlIHByb3ZpZGVkIG9wdGlvbnMsIGlmIGFueS5cXHJcXG4gICAqXFxyXFxuICAgKiBAcGFyYW0gbWFjaGluZSBUaGUgbWFjaGluZSB0byBiZSBpbnRlcnByZXRlZFxcclxcbiAgICogQHBhcmFtIG9wdGlvbnMgSW50ZXJwcmV0ZXIgb3B0aW9uc1xcclxcbiAgICovZnVuY3Rpb24gSW50ZXJwcmV0ZXIobWFjaGluZSxvcHRpb25zKXtpZihvcHRpb25zPT09dm9pZCAwKXtvcHRpb25zPUludGVycHJldGVyLmRlZmF1bHRPcHRpb25zO312YXIgX3RoaXM9dGhpczt0aGlzLm1hY2hpbmU9bWFjaGluZTt0aGlzLmRlbGF5ZWRFdmVudHNNYXA9e307dGhpcy5saXN0ZW5lcnM9bmV3IFNldCgpO3RoaXMuY29udGV4dExpc3RlbmVycz1uZXcgU2V0KCk7dGhpcy5zdG9wTGlzdGVuZXJzPW5ldyBTZXQoKTt0aGlzLmRvbmVMaXN0ZW5lcnM9bmV3IFNldCgpO3RoaXMuZXZlbnRMaXN0ZW5lcnM9bmV3IFNldCgpO3RoaXMuc2VuZExpc3RlbmVycz1uZXcgU2V0KCk7LyoqXFxyXFxuICAgICAqIFdoZXRoZXIgdGhlIHNlcnZpY2UgaXMgc3RhcnRlZC5cXHJcXG4gICAgICovdGhpcy5pbml0aWFsaXplZD1mYWxzZTt0aGlzLnN0YXR1cz1fSW50ZXJwcmV0ZXJTdGF0dXMuTm90U3RhcnRlZDt0aGlzLmNoaWxkcmVuPW5ldyBNYXAoKTt0aGlzLmZvcndhcmRUbz1uZXcgU2V0KCk7dGhpcy5fb3V0Z29pbmdRdWV1ZT1bXTsvKipcXHJcXG4gICAgICogQWxpYXMgZm9yIEludGVycHJldGVyLnByb3RvdHlwZS5zdGFydFxcclxcbiAgICAgKi90aGlzLmluaXQ9dGhpcy5zdGFydDsvKipcXHJcXG4gICAgICogU2VuZHMgYW4gZXZlbnQgdG8gdGhlIHJ1bm5pbmcgaW50ZXJwcmV0ZXIgdG8gdHJpZ2dlciBhIHRyYW5zaXRpb24uXFxyXFxuICAgICAqXFxyXFxuICAgICAqIEFuIGFycmF5IG9mIGV2ZW50cyAoYmF0Y2hlZCkgY2FuIGJlIHNlbnQgYXMgd2VsbCwgd2hpY2ggd2lsbCBzZW5kIGFsbFxcclxcbiAgICAgKiBiYXRjaGVkIGV2ZW50cyB0byB0aGUgcnVubmluZyBpbnRlcnByZXRlci4gVGhlIGxpc3RlbmVycyB3aWxsIGJlXFxyXFxuICAgICAqIG5vdGlmaWVkIG9ubHkgKipvbmNlKiogd2hlbiBhbGwgZXZlbnRzIGFyZSBwcm9jZXNzZWQuXFxyXFxuICAgICAqXFxyXFxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQocykgdG8gc2VuZFxcclxcbiAgICAgKi90aGlzLnNlbmQ9ZnVuY3Rpb24oZXZlbnQscGF5bG9hZCl7aWYoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNBcnJheSkoZXZlbnQpKXtfdGhpcy5iYXRjaChldmVudCk7cmV0dXJuIF90aGlzLnN0YXRlO312YXIgX2V2ZW50PSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvU0NYTUxFdmVudCkoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9FdmVudE9iamVjdCkoZXZlbnQscGF5bG9hZCkpO2lmKF90aGlzLnN0YXR1cz09PV9JbnRlcnByZXRlclN0YXR1cy5TdG9wcGVkKXsvLyBkbyBub3RoaW5nXFxuaWYoIV9lbnZpcm9ubWVudF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLklTX1BST0RVQ1RJT04peygwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLndhcm4pKGZhbHNlLFxcXCJFdmVudCBcXFxcXFxcIlxcXCIuY29uY2F0KF9ldmVudC5uYW1lLFxcXCJcXFxcXFxcIiB3YXMgc2VudCB0byBzdG9wcGVkIHNlcnZpY2UgXFxcXFxcXCJcXFwiKS5jb25jYXQoX3RoaXMubWFjaGluZS5pZCxcXFwiXFxcXFxcXCIuIFRoaXMgc2VydmljZSBoYXMgYWxyZWFkeSByZWFjaGVkIGl0cyBmaW5hbCBzdGF0ZSwgYW5kIHdpbGwgbm90IHRyYW5zaXRpb24uXFxcXG5FdmVudDogXFxcIikuY29uY2F0KEpTT04uc3RyaW5naWZ5KF9ldmVudC5kYXRhKSkpO31yZXR1cm4gX3RoaXMuc3RhdGU7fWlmKF90aGlzLnN0YXR1cyE9PV9JbnRlcnByZXRlclN0YXR1cy5SdW5uaW5nJiYhX3RoaXMub3B0aW9ucy5kZWZlckV2ZW50cyl7dGhyb3cgbmV3IEVycm9yKFxcXCJFdmVudCBcXFxcXFxcIlxcXCIuY29uY2F0KF9ldmVudC5uYW1lLFxcXCJcXFxcXFxcIiB3YXMgc2VudCB0byB1bmluaXRpYWxpemVkIHNlcnZpY2UgXFxcXFxcXCJcXFwiKS5jb25jYXQoX3RoaXMubWFjaGluZS5pZC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcXG4sXFxcIlxcXFxcXFwiLiBNYWtlIHN1cmUgLnN0YXJ0KCkgaXMgY2FsbGVkIGZvciB0aGlzIHNlcnZpY2UsIG9yIHNldCB7IGRlZmVyRXZlbnRzOiB0cnVlIH0gaW4gdGhlIHNlcnZpY2Ugb3B0aW9ucy5cXFxcbkV2ZW50OiBcXFwiKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkoX2V2ZW50LmRhdGEpKSk7fV90aGlzLnNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbigpey8vIEZvcndhcmQgY29weSBvZiBldmVudCB0byBjaGlsZCBhY3RvcnNcXG5fdGhpcy5mb3J3YXJkKF9ldmVudCk7dmFyIG5leHRTdGF0ZT1fdGhpcy5fbmV4dFN0YXRlKF9ldmVudCk7X3RoaXMudXBkYXRlKG5leHRTdGF0ZSxfZXZlbnQpO30pO3JldHVybiBfdGhpcy5fc3RhdGU7Ly8gVE9ETzogZGVwcmVjYXRlIChzaG91bGQgcmV0dXJuIHZvaWQpXFxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnNlbWljb2xvblxcbn07dGhpcy5zZW5kVG89ZnVuY3Rpb24oZXZlbnQsdG8saW1tZWRpYXRlKXt2YXIgaXNQYXJlbnQ9X3RoaXMucGFyZW50JiYodG89PT1fdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5TcGVjaWFsVGFyZ2V0cy5QYXJlbnR8fF90aGlzLnBhcmVudC5pZD09PXRvKTt2YXIgdGFyZ2V0PWlzUGFyZW50P190aGlzLnBhcmVudDooMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc1N0cmluZykodG8pP3RvPT09X3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uU3BlY2lhbFRhcmdldHMuSW50ZXJuYWw/X3RoaXM6X3RoaXMuY2hpbGRyZW4uZ2V0KHRvKXx8X3JlZ2lzdHJ5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18ucmVnaXN0cnkuZ2V0KHRvKTooMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc0FjdG9yKSh0byk/dG86dW5kZWZpbmVkO2lmKCF0YXJnZXQpe2lmKCFpc1BhcmVudCl7dGhyb3cgbmV3IEVycm9yKFxcXCJVbmFibGUgdG8gc2VuZCBldmVudCB0byBjaGlsZCAnXFxcIi5jb25jYXQodG8sXFxcIicgZnJvbSBzZXJ2aWNlICdcXFwiKS5jb25jYXQoX3RoaXMuaWQsXFxcIicuXFxcIikpO30vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxcbmlmKCFfZW52aXJvbm1lbnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5JU19QUk9EVUNUSU9OKXsoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy53YXJuKShmYWxzZSxcXFwiU2VydmljZSAnXFxcIi5jb25jYXQoX3RoaXMuaWQsXFxcIicgaGFzIG5vIHBhcmVudDogdW5hYmxlIHRvIHNlbmQgZXZlbnQgXFxcIikuY29uY2F0KGV2ZW50LnR5cGUpKTt9cmV0dXJuO31pZignbWFjaGluZSdpbiB0YXJnZXQpey8vIHBlcmhhcHMgdGhvc2UgZXZlbnRzIHNob3VsZCBiZSByZWplY3RlZCBpbiB0aGUgcGFyZW50XFxuLy8gYnV0IGF0bSBpdCBkb2Vzbid0IGhhdmUgZWFzeSBhY2Nlc3MgdG8gYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGlzIHJlcXVpcmVkIHRvIGRvIGl0IHJlbGlhYmx5XFxuaWYoX3RoaXMuc3RhdHVzIT09X0ludGVycHJldGVyU3RhdHVzLlN0b3BwZWR8fF90aGlzLnBhcmVudCE9PXRhcmdldHx8Ly8gd2UgbmVlZCB0byBzZW5kIGV2ZW50cyB0byB0aGUgcGFyZW50IGZyb20gZXhpdCBoYW5kbGVycyBvZiBhIG1hY2hpbmUgdGhhdCByZWFjaGVkIGl0cyBmaW5hbCBzdGF0ZVxcbl90aGlzLnN0YXRlLmRvbmUpey8vIFNlbmQgU0NYTUwgZXZlbnRzIHRvIG1hY2hpbmVzXFxudmFyIHNjeG1sRXZlbnQ9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5fX2Fzc2lnbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5fX2Fzc2lnbikoe30sZXZlbnQpLHtuYW1lOmV2ZW50Lm5hbWU9PT1fYWN0aW9uVHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5lcnJvcj9cXFwiXFxcIi5jb25jYXQoKDAsX2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5lcnJvcikoX3RoaXMuaWQpKTpldmVudC5uYW1lLG9yaWdpbjpfdGhpcy5zZXNzaW9uSWR9KTtpZighaW1tZWRpYXRlJiZfdGhpcy5tYWNoaW5lLmNvbmZpZy5wcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50cyl7X3RoaXMuX291dGdvaW5nUXVldWUucHVzaChbdGFyZ2V0LHNjeG1sRXZlbnRdKTt9ZWxzZXt0YXJnZXQuc2VuZChzY3htbEV2ZW50KTt9fX1lbHNley8vIFNlbmQgbm9ybWFsIGV2ZW50cyB0byBvdGhlciB0YXJnZXRzXFxuaWYoIWltbWVkaWF0ZSYmX3RoaXMubWFjaGluZS5jb25maWcucHJlZGljdGFibGVBY3Rpb25Bcmd1bWVudHMpe190aGlzLl9vdXRnb2luZ1F1ZXVlLnB1c2goW3RhcmdldCxldmVudC5kYXRhXSk7fWVsc2V7dGFyZ2V0LnNlbmQoZXZlbnQuZGF0YSk7fX19O3RoaXMuX2V4ZWM9ZnVuY3Rpb24oYWN0aW9uLGNvbnRleHQsX2V2ZW50LGFjdGlvbkZ1bmN0aW9uTWFwKXtpZihhY3Rpb25GdW5jdGlvbk1hcD09PXZvaWQgMCl7YWN0aW9uRnVuY3Rpb25NYXA9X3RoaXMubWFjaGluZS5vcHRpb25zLmFjdGlvbnM7fXZhciBhY3Rpb25PckV4ZWM9YWN0aW9uLmV4ZWN8fCgwLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uZ2V0QWN0aW9uRnVuY3Rpb24pKGFjdGlvbi50eXBlLGFjdGlvbkZ1bmN0aW9uTWFwKTt2YXIgZXhlYz0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc0Z1bmN0aW9uKShhY3Rpb25PckV4ZWMpP2FjdGlvbk9yRXhlYzphY3Rpb25PckV4ZWM/YWN0aW9uT3JFeGVjLmV4ZWM6YWN0aW9uLmV4ZWM7aWYoZXhlYyl7dHJ5e3JldHVybiBleGVjKGNvbnRleHQsX2V2ZW50LmRhdGEsIV90aGlzLm1hY2hpbmUuY29uZmlnLnByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzP3thY3Rpb246YWN0aW9uLHN0YXRlOl90aGlzLnN0YXRlLF9ldmVudDpfZXZlbnR9OnthY3Rpb246YWN0aW9uLF9ldmVudDpfZXZlbnR9KTt9Y2F0Y2goZXJyKXtpZihfdGhpcy5wYXJlbnQpe190aGlzLnBhcmVudC5zZW5kKHt0eXBlOid4c3RhdGUuZXJyb3InLGRhdGE6ZXJyfSk7fXRocm93IGVycjt9fXN3aXRjaChhY3Rpb24udHlwZSl7Y2FzZSBfYWN0aW9uVHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5yYWlzZTp7Ly8gaWYgcmFpc2UgYWN0aW9uIHJlYWNoZWQgdGhlIGludGVycHJldGVyIHRoZW4gaXQncyBhIGRlbGF5ZWQgb25lXFxudmFyIHNlbmRBY3Rpb25fMT1hY3Rpb247X3RoaXMuZGVmZXIoc2VuZEFjdGlvbl8xKTticmVhazt9Y2FzZSBfYWN0aW9uVHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5zZW5kOnZhciBzZW5kQWN0aW9uPWFjdGlvbjtpZih0eXBlb2Ygc2VuZEFjdGlvbi5kZWxheT09PSdudW1iZXInKXtfdGhpcy5kZWZlcihzZW5kQWN0aW9uKTtyZXR1cm47fWVsc2V7aWYoc2VuZEFjdGlvbi50byl7X3RoaXMuc2VuZFRvKHNlbmRBY3Rpb24uX2V2ZW50LHNlbmRBY3Rpb24udG8sX2V2ZW50PT09X2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5pbml0RXZlbnQpO31lbHNle190aGlzLnNlbmQoc2VuZEFjdGlvbi5fZXZlbnQpO319YnJlYWs7Y2FzZSBfYWN0aW9uVHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5jYW5jZWw6X3RoaXMuY2FuY2VsKGFjdGlvbi5zZW5kSWQpO2JyZWFrO2Nhc2UgX2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uc3RhcnQ6e2lmKF90aGlzLnN0YXR1cyE9PV9JbnRlcnByZXRlclN0YXR1cy5SdW5uaW5nKXtyZXR1cm47fXZhciBhY3Rpdml0eT1hY3Rpb24uYWN0aXZpdHk7Ly8gSWYgdGhlIGFjdGl2aXR5IHdpbGwgYmUgc3RvcHBlZCByaWdodCBhZnRlciBpdCdzIHN0YXJ0ZWRcXG4vLyAoc3VjaCBhcyBpbiB0cmFuc2llbnQgc3RhdGVzKVxcbi8vIGRvbid0IGJvdGhlciBzdGFydGluZyB0aGUgYWN0aXZpdHkuXFxuaWYoLy8gaW4gdjQgd2l0aCBgcHJlZGljdGFibGVBY3Rpb25Bcmd1bWVudHNgIGludm9rZXMgYXJlIGNhbGxlZCBlYWdlcmx5IHdoZW4gdGhlIGB0aGlzLnN0YXRlYCBzdGlsbCBwb2ludHMgdG8gdGhlIHByZXZpb3VzIHN0YXRlXFxuIV90aGlzLm1hY2hpbmUuY29uZmlnLnByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzJiYhX3RoaXMuc3RhdGUuYWN0aXZpdGllc1thY3Rpdml0eS5pZHx8YWN0aXZpdHkudHlwZV0pe2JyZWFrO30vLyBJbnZva2VkIHNlcnZpY2VzXFxuaWYoYWN0aXZpdHkudHlwZT09PV90eXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLkFjdGlvblR5cGVzLkludm9rZSl7dmFyIGludm9rZVNvdXJjZT0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy50b0ludm9rZVNvdXJjZSkoYWN0aXZpdHkuc3JjKTt2YXIgc2VydmljZUNyZWF0b3I9X3RoaXMubWFjaGluZS5vcHRpb25zLnNlcnZpY2VzP190aGlzLm1hY2hpbmUub3B0aW9ucy5zZXJ2aWNlc1tpbnZva2VTb3VyY2UudHlwZV06dW5kZWZpbmVkO3ZhciBpZD1hY3Rpdml0eS5pZCxkYXRhPWFjdGl2aXR5LmRhdGE7aWYoIV9lbnZpcm9ubWVudF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLklTX1BST0RVQ1RJT04peygwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLndhcm4pKCEoJ2ZvcndhcmQnaW4gYWN0aXZpdHkpLC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcXG5cXFwiYGZvcndhcmRgIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQgKGZvdW5kIGluIGludm9jYXRpb24gb2YgJ1xcXCIuY29uY2F0KGFjdGl2aXR5LnNyYyxcXFwiJyBpbiBpbiBtYWNoaW5lICdcXFwiKS5jb25jYXQoX3RoaXMubWFjaGluZS5pZCxcXFwiJykuIFxcXCIpK1xcXCJQbGVhc2UgdXNlIGBhdXRvRm9yd2FyZGAgaW5zdGVhZC5cXFwiKTt9dmFyIGF1dG9Gb3J3YXJkPSdhdXRvRm9yd2FyZCdpbiBhY3Rpdml0eT9hY3Rpdml0eS5hdXRvRm9yd2FyZDohIWFjdGl2aXR5LmZvcndhcmQ7aWYoIXNlcnZpY2VDcmVhdG9yKXsvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxcbmlmKCFfZW52aXJvbm1lbnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5JU19QUk9EVUNUSU9OKXsoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy53YXJuKShmYWxzZSxcXFwiTm8gc2VydmljZSBmb3VuZCBmb3IgaW52b2NhdGlvbiAnXFxcIi5jb25jYXQoYWN0aXZpdHkuc3JjLFxcXCInIGluIG1hY2hpbmUgJ1xcXCIpLmNvbmNhdChfdGhpcy5tYWNoaW5lLmlkLFxcXCInLlxcXCIpKTt9cmV0dXJuO312YXIgcmVzb2x2ZWREYXRhPWRhdGE/KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ubWFwQ29udGV4dCkoZGF0YSxjb250ZXh0LF9ldmVudCk6dW5kZWZpbmVkO2lmKHR5cGVvZiBzZXJ2aWNlQ3JlYXRvcj09PSdzdHJpbmcnKXsvLyBUT0RPOiB3YXJuXFxucmV0dXJuO312YXIgc291cmNlPSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmlzRnVuY3Rpb24pKHNlcnZpY2VDcmVhdG9yKT9zZXJ2aWNlQ3JlYXRvcihjb250ZXh0LF9ldmVudC5kYXRhLHtkYXRhOnJlc29sdmVkRGF0YSxzcmM6aW52b2tlU291cmNlLG1ldGE6YWN0aXZpdHkubWV0YX0pOnNlcnZpY2VDcmVhdG9yO2lmKCFzb3VyY2Upey8vIFRPRE86IHdhcm4/XFxucmV0dXJuO312YXIgb3B0aW9ucz12b2lkIDA7aWYoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNNYWNoaW5lKShzb3VyY2UpKXtzb3VyY2U9cmVzb2x2ZWREYXRhP3NvdXJjZS53aXRoQ29udGV4dChyZXNvbHZlZERhdGEpOnNvdXJjZTtvcHRpb25zPXthdXRvRm9yd2FyZDphdXRvRm9yd2FyZH07fV90aGlzLnNwYXduKHNvdXJjZSxpZCxvcHRpb25zKTt9ZWxzZXtfdGhpcy5zcGF3bkFjdGl2aXR5KGFjdGl2aXR5KTt9YnJlYWs7fWNhc2UgX2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uc3RvcDp7X3RoaXMuc3RvcENoaWxkKGFjdGlvbi5hY3Rpdml0eS5pZCk7YnJlYWs7fWNhc2UgX2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18ubG9nOnZhciBfYT1hY3Rpb24sbGFiZWw9X2EubGFiZWwsdmFsdWU9X2EudmFsdWU7aWYobGFiZWwpe190aGlzLmxvZ2dlcihsYWJlbCx2YWx1ZSk7fWVsc2V7X3RoaXMubG9nZ2VyKHZhbHVlKTt9YnJlYWs7ZGVmYXVsdDppZighX2Vudmlyb25tZW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uSVNfUFJPRFVDVElPTil7KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ud2FybikoZmFsc2UsXFxcIk5vIGltcGxlbWVudGF0aW9uIGZvdW5kIGZvciBhY3Rpb24gdHlwZSAnXFxcIi5jb25jYXQoYWN0aW9uLnR5cGUsXFxcIidcXFwiKSk7fWJyZWFrO319O3ZhciByZXNvbHZlZE9wdGlvbnM9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5fX2Fzc2lnbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5fX2Fzc2lnbikoe30sSW50ZXJwcmV0ZXIuZGVmYXVsdE9wdGlvbnMpLG9wdGlvbnMpO3ZhciBjbG9jaz1yZXNvbHZlZE9wdGlvbnMuY2xvY2ssbG9nZ2VyPXJlc29sdmVkT3B0aW9ucy5sb2dnZXIscGFyZW50PXJlc29sdmVkT3B0aW9ucy5wYXJlbnQsaWQ9cmVzb2x2ZWRPcHRpb25zLmlkO3ZhciByZXNvbHZlZElkPWlkIT09dW5kZWZpbmVkP2lkOm1hY2hpbmUuaWQ7dGhpcy5pZD1yZXNvbHZlZElkO3RoaXMubG9nZ2VyPWxvZ2dlcjt0aGlzLmNsb2NrPWNsb2NrO3RoaXMucGFyZW50PXBhcmVudDt0aGlzLm9wdGlvbnM9cmVzb2x2ZWRPcHRpb25zO3RoaXMuc2NoZWR1bGVyPW5ldyBfc2NoZWR1bGVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18uU2NoZWR1bGVyKHtkZWZlckV2ZW50czp0aGlzLm9wdGlvbnMuZGVmZXJFdmVudHN9KTt0aGlzLnNlc3Npb25JZD1fcmVnaXN0cnlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5yZWdpc3RyeS5ib29rSWQoKTt9T2JqZWN0LmRlZmluZVByb3BlcnR5KEludGVycHJldGVyLnByb3RvdHlwZSxcXFwiaW5pdGlhbFN0YXRlXFxcIix7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBfdGhpcz10aGlzO2lmKHRoaXMuX2luaXRpYWxTdGF0ZSl7cmV0dXJuIHRoaXMuX2luaXRpYWxTdGF0ZTt9cmV0dXJuKDAsX3NlcnZpY2VTY29wZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fLnByb3ZpZGUpKHRoaXMsZnVuY3Rpb24oKXtfdGhpcy5faW5pdGlhbFN0YXRlPV90aGlzLm1hY2hpbmUuaW5pdGlhbFN0YXRlO3JldHVybiBfdGhpcy5faW5pdGlhbFN0YXRlO30pO30sZW51bWVyYWJsZTpmYWxzZSxjb25maWd1cmFibGU6dHJ1ZX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnRlcnByZXRlci5wcm90b3R5cGUsXFxcInN0YXRlXFxcIix7LyoqXFxyXFxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBgLmdldFNuYXBzaG90KClgIGluc3RlYWQuXFxyXFxuICAgICAqL2dldDpmdW5jdGlvbiBnZXQoKXtpZighX2Vudmlyb25tZW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uSVNfUFJPRFVDVElPTil7KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ud2FybikodGhpcy5zdGF0dXMhPT1fSW50ZXJwcmV0ZXJTdGF0dXMuTm90U3RhcnRlZCxcXFwiQXR0ZW1wdGVkIHRvIHJlYWQgc3RhdGUgZnJvbSB1bmluaXRpYWxpemVkIHNlcnZpY2UgJ1xcXCIuY29uY2F0KHRoaXMuaWQsXFxcIicuIE1ha2Ugc3VyZSB0aGUgc2VydmljZSBpcyBzdGFydGVkIGZpcnN0LlxcXCIpKTt9cmV0dXJuIHRoaXMuX3N0YXRlO30sZW51bWVyYWJsZTpmYWxzZSxjb25maWd1cmFibGU6dHJ1ZX0pOy8qKlxcclxcbiAgICogRXhlY3V0ZXMgdGhlIGFjdGlvbnMgb2YgdGhlIGdpdmVuIHN0YXRlLCB3aXRoIHRoYXQgc3RhdGUncyBgY29udGV4dGAgYW5kIGBldmVudGAuXFxyXFxuICAgKlxcclxcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB3aG9zZSBhY3Rpb25zIHdpbGwgYmUgZXhlY3V0ZWRcXHJcXG4gICAqIEBwYXJhbSBhY3Rpb25zQ29uZmlnIFRoZSBhY3Rpb24gaW1wbGVtZW50YXRpb25zIHRvIHVzZVxcclxcbiAgICovSW50ZXJwcmV0ZXIucHJvdG90eXBlLmV4ZWN1dGU9ZnVuY3Rpb24oc3RhdGUsYWN0aW9uc0NvbmZpZyl7dmFyIGVfMSxfYTt0cnl7Zm9yKHZhciBfYj0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLl9fdmFsdWVzKShzdGF0ZS5hY3Rpb25zKSxfYz1fYi5uZXh0KCk7IV9jLmRvbmU7X2M9X2IubmV4dCgpKXt2YXIgYWN0aW9uPV9jLnZhbHVlO3RoaXMuZXhlYyhhY3Rpb24sc3RhdGUsYWN0aW9uc0NvbmZpZyk7fX1jYXRjaChlXzFfMSl7ZV8xPXtlcnJvcjplXzFfMX07fWZpbmFsbHl7dHJ5e2lmKF9jJiYhX2MuZG9uZSYmKF9hPV9iW1xcXCJyZXR1cm5cXFwiXSkpX2EuY2FsbChfYik7fWZpbmFsbHl7aWYoZV8xKXRocm93IGVfMS5lcnJvcjt9fX07SW50ZXJwcmV0ZXIucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihzdGF0ZSxfZXZlbnQpe3ZhciBlXzIsX2EsZV8zLF9iLGVfNCxfYyxlXzUsX2Q7dmFyIF90aGlzPXRoaXM7Ly8gQXR0YWNoIHNlc3Npb24gSUQgdG8gc3RhdGVcXG5zdGF0ZS5fc2Vzc2lvbmlkPXRoaXMuc2Vzc2lvbklkOy8vIFVwZGF0ZSBzdGF0ZVxcbnRoaXMuX3N0YXRlPXN0YXRlOy8vIEV4ZWN1dGUgYWN0aW9uc1xcbmlmKCghdGhpcy5tYWNoaW5lLmNvbmZpZy5wcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50c3x8Ly8gdGhpcyBpcyBjdXJyZW50bHkgcmVxdWlyZWQgdG8gZXhlY3V0ZSBpbml0aWFsIGFjdGlvbnMgYXMgdGhlIGBpbml0aWFsU3RhdGVgIGdldHMgY2FjaGVkXFxuLy8gd2UgY2FuJ3QganVzdCByZWNvbXB1dGUgaXQgKGFuZCBleGVjdXRlIGFjdGlvbnMgd2hpbGUgZG9pbmcgc28pIGJlY2F1c2Ugd2UgdHJ5IHRvIHByZXNlcnZlIGlkZW50aXR5IG9mIGFjdG9ycyBjcmVhdGVkIHdpdGhpbiBpbml0aWFsIGFzc2lnbnNcXG5fZXZlbnQ9PT1fYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLmluaXRFdmVudCkmJnRoaXMub3B0aW9ucy5leGVjdXRlKXt0aGlzLmV4ZWN1dGUodGhpcy5zdGF0ZSk7fWVsc2V7dmFyIGl0ZW09dm9pZCAwO3doaWxlKGl0ZW09dGhpcy5fb3V0Z29pbmdRdWV1ZS5zaGlmdCgpKXtpdGVtWzBdLnNlbmQoaXRlbVsxXSk7fX0vLyBVcGRhdGUgY2hpbGRyZW5cXG50aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpe190aGlzLnN0YXRlLmNoaWxkcmVuW2NoaWxkLmlkXT1jaGlsZDt9KTsvLyBEZXYgdG9vbHNcXG5pZih0aGlzLmRldlRvb2xzKXt0aGlzLmRldlRvb2xzLnNlbmQoX2V2ZW50LmRhdGEsc3RhdGUpO30vLyBFeGVjdXRlIGxpc3RlbmVyc1xcbmlmKHN0YXRlLmV2ZW50KXt0cnl7Zm9yKHZhciBfZT0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLl9fdmFsdWVzKSh0aGlzLmV2ZW50TGlzdGVuZXJzKSxfZj1fZS5uZXh0KCk7IV9mLmRvbmU7X2Y9X2UubmV4dCgpKXt2YXIgbGlzdGVuZXI9X2YudmFsdWU7bGlzdGVuZXIoc3RhdGUuZXZlbnQpO319Y2F0Y2goZV8yXzEpe2VfMj17ZXJyb3I6ZV8yXzF9O31maW5hbGx5e3RyeXtpZihfZiYmIV9mLmRvbmUmJihfYT1fZVtcXFwicmV0dXJuXFxcIl0pKV9hLmNhbGwoX2UpO31maW5hbGx5e2lmKGVfMil0aHJvdyBlXzIuZXJyb3I7fX19dHJ5e2Zvcih2YXIgX2c9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5fX3ZhbHVlcykodGhpcy5saXN0ZW5lcnMpLF9oPV9nLm5leHQoKTshX2guZG9uZTtfaD1fZy5uZXh0KCkpe3ZhciBsaXN0ZW5lcj1faC52YWx1ZTtsaXN0ZW5lcihzdGF0ZSxzdGF0ZS5ldmVudCk7fX1jYXRjaChlXzNfMSl7ZV8zPXtlcnJvcjplXzNfMX07fWZpbmFsbHl7dHJ5e2lmKF9oJiYhX2guZG9uZSYmKF9iPV9nW1xcXCJyZXR1cm5cXFwiXSkpX2IuY2FsbChfZyk7fWZpbmFsbHl7aWYoZV8zKXRocm93IGVfMy5lcnJvcjt9fXRyeXtmb3IodmFyIF9qPSgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uX192YWx1ZXMpKHRoaXMuY29udGV4dExpc3RlbmVycyksX2s9X2oubmV4dCgpOyFfay5kb25lO19rPV9qLm5leHQoKSl7dmFyIGNvbnRleHRMaXN0ZW5lcj1fay52YWx1ZTtjb250ZXh0TGlzdGVuZXIodGhpcy5zdGF0ZS5jb250ZXh0LHRoaXMuc3RhdGUuaGlzdG9yeT90aGlzLnN0YXRlLmhpc3RvcnkuY29udGV4dDp1bmRlZmluZWQpO319Y2F0Y2goZV80XzEpe2VfND17ZXJyb3I6ZV80XzF9O31maW5hbGx5e3RyeXtpZihfayYmIV9rLmRvbmUmJihfYz1faltcXFwicmV0dXJuXFxcIl0pKV9jLmNhbGwoX2opO31maW5hbGx5e2lmKGVfNCl0aHJvdyBlXzQuZXJyb3I7fX1pZih0aGlzLnN0YXRlLmRvbmUpey8vIGdldCBmaW5hbCBjaGlsZCBzdGF0ZSBub2RlXFxudmFyIGZpbmFsQ2hpbGRTdGF0ZU5vZGU9c3RhdGUuY29uZmlndXJhdGlvbi5maW5kKGZ1bmN0aW9uKHNuKXtyZXR1cm4gc24udHlwZT09PSdmaW5hbCcmJnNuLnBhcmVudD09PV90aGlzLm1hY2hpbmU7fSk7dmFyIGRvbmVEYXRhPWZpbmFsQ2hpbGRTdGF0ZU5vZGUmJmZpbmFsQ2hpbGRTdGF0ZU5vZGUuZG9uZURhdGE/KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ubWFwQ29udGV4dCkoZmluYWxDaGlsZFN0YXRlTm9kZS5kb25lRGF0YSxzdGF0ZS5jb250ZXh0LF9ldmVudCk6dW5kZWZpbmVkO3RoaXMuX2RvbmVFdmVudD0oMCxfYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLmRvbmVJbnZva2UpKHRoaXMuaWQsZG9uZURhdGEpO3RyeXtmb3IodmFyIF9sPSgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uX192YWx1ZXMpKHRoaXMuZG9uZUxpc3RlbmVycyksX209X2wubmV4dCgpOyFfbS5kb25lO19tPV9sLm5leHQoKSl7dmFyIGxpc3RlbmVyPV9tLnZhbHVlO2xpc3RlbmVyKHRoaXMuX2RvbmVFdmVudCk7fX1jYXRjaChlXzVfMSl7ZV81PXtlcnJvcjplXzVfMX07fWZpbmFsbHl7dHJ5e2lmKF9tJiYhX20uZG9uZSYmKF9kPV9sW1xcXCJyZXR1cm5cXFwiXSkpX2QuY2FsbChfbCk7fWZpbmFsbHl7aWYoZV81KXRocm93IGVfNS5lcnJvcjt9fXRoaXMuX3N0b3AoKTt0aGlzLl9zdG9wQ2hpbGRyZW4oKTtfcmVnaXN0cnlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5yZWdpc3RyeS5mcmVlKHRoaXMuc2Vzc2lvbklkKTt9fTsvKlxcclxcbiAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgaXMgbm90aWZpZWQgd2hlbmV2ZXIgYSBzdGF0ZSB0cmFuc2l0aW9uIGhhcHBlbnMuIFRoZSBsaXN0ZW5lciBpcyBjYWxsZWQgd2l0aFxcclxcbiAgICogdGhlIG5leHQgc3RhdGUgYW5kIHRoZSBldmVudCBvYmplY3QgdGhhdCBjYXVzZWQgdGhlIHN0YXRlIHRyYW5zaXRpb24uXFxyXFxuICAgKlxcclxcbiAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBzdGF0ZSBsaXN0ZW5lclxcclxcbiAgICovSW50ZXJwcmV0ZXIucHJvdG90eXBlLm9uVHJhbnNpdGlvbj1mdW5jdGlvbihsaXN0ZW5lcil7dGhpcy5saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsvLyBTZW5kIGN1cnJlbnQgc3RhdGUgdG8gbGlzdGVuZXJcXG5pZih0aGlzLnN0YXR1cz09PV9JbnRlcnByZXRlclN0YXR1cy5SdW5uaW5nKXtsaXN0ZW5lcih0aGlzLnN0YXRlLHRoaXMuc3RhdGUuZXZlbnQpO31yZXR1cm4gdGhpczt9O0ludGVycHJldGVyLnByb3RvdHlwZS5zdWJzY3JpYmU9ZnVuY3Rpb24obmV4dExpc3RlbmVyT3JPYnNlcnZlcixfLC8vIFRPRE86IGVycm9yIGxpc3RlbmVyXFxuY29tcGxldGVMaXN0ZW5lcil7dmFyIF90aGlzPXRoaXM7dmFyIG9ic2VydmVyPSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvT2JzZXJ2ZXIpKG5leHRMaXN0ZW5lck9yT2JzZXJ2ZXIsXyxjb21wbGV0ZUxpc3RlbmVyKTt0aGlzLmxpc3RlbmVycy5hZGQob2JzZXJ2ZXIubmV4dCk7Ly8gU2VuZCBjdXJyZW50IHN0YXRlIHRvIGxpc3RlbmVyXFxuaWYodGhpcy5zdGF0dXMhPT1fSW50ZXJwcmV0ZXJTdGF0dXMuTm90U3RhcnRlZCl7b2JzZXJ2ZXIubmV4dCh0aGlzLnN0YXRlKTt9dmFyIGNvbXBsZXRlT25jZT1mdW5jdGlvbiBjb21wbGV0ZU9uY2UoKXtfdGhpcy5kb25lTGlzdGVuZXJzW1xcXCJkZWxldGVcXFwiXShjb21wbGV0ZU9uY2UpO190aGlzLnN0b3BMaXN0ZW5lcnNbXFxcImRlbGV0ZVxcXCJdKGNvbXBsZXRlT25jZSk7b2JzZXJ2ZXIuY29tcGxldGUoKTt9O2lmKHRoaXMuc3RhdHVzPT09X0ludGVycHJldGVyU3RhdHVzLlN0b3BwZWQpe29ic2VydmVyLmNvbXBsZXRlKCk7fWVsc2V7dGhpcy5vbkRvbmUoY29tcGxldGVPbmNlKTt0aGlzLm9uU3RvcChjb21wbGV0ZU9uY2UpO31yZXR1cm57dW5zdWJzY3JpYmU6ZnVuY3Rpb24gdW5zdWJzY3JpYmUoKXtfdGhpcy5saXN0ZW5lcnNbXFxcImRlbGV0ZVxcXCJdKG9ic2VydmVyLm5leHQpO190aGlzLmRvbmVMaXN0ZW5lcnNbXFxcImRlbGV0ZVxcXCJdKGNvbXBsZXRlT25jZSk7X3RoaXMuc3RvcExpc3RlbmVyc1tcXFwiZGVsZXRlXFxcIl0oY29tcGxldGVPbmNlKTt9fTt9Oy8qKlxcclxcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGlzIG5vdGlmaWVkIHdoZW5ldmVyIGFuIGV2ZW50IGlzIHNlbnQgdG8gdGhlIHJ1bm5pbmcgaW50ZXJwcmV0ZXIuXFxyXFxuICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGV2ZW50IGxpc3RlbmVyXFxyXFxuICAgKi9JbnRlcnByZXRlci5wcm90b3R5cGUub25FdmVudD1mdW5jdGlvbihsaXN0ZW5lcil7dGhpcy5ldmVudExpc3RlbmVycy5hZGQobGlzdGVuZXIpO3JldHVybiB0aGlzO307LyoqXFxyXFxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgaXMgbm90aWZpZWQgd2hlbmV2ZXIgYSBgc2VuZGAgZXZlbnQgb2NjdXJzLlxcclxcbiAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBldmVudCBsaXN0ZW5lclxcclxcbiAgICovSW50ZXJwcmV0ZXIucHJvdG90eXBlLm9uU2VuZD1mdW5jdGlvbihsaXN0ZW5lcil7dGhpcy5zZW5kTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7cmV0dXJuIHRoaXM7fTsvKipcXHJcXG4gICAqIEFkZHMgYSBjb250ZXh0IGxpc3RlbmVyIHRoYXQgaXMgbm90aWZpZWQgd2hlbmV2ZXIgdGhlIHN0YXRlIGNvbnRleHQgY2hhbmdlcy5cXHJcXG4gICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgY29udGV4dCBsaXN0ZW5lclxcclxcbiAgICovSW50ZXJwcmV0ZXIucHJvdG90eXBlLm9uQ2hhbmdlPWZ1bmN0aW9uKGxpc3RlbmVyKXt0aGlzLmNvbnRleHRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtyZXR1cm4gdGhpczt9Oy8qKlxcclxcbiAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgaXMgbm90aWZpZWQgd2hlbiB0aGUgbWFjaGluZSBpcyBzdG9wcGVkLlxcclxcbiAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lclxcclxcbiAgICovSW50ZXJwcmV0ZXIucHJvdG90eXBlLm9uU3RvcD1mdW5jdGlvbihsaXN0ZW5lcil7dGhpcy5zdG9wTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7cmV0dXJuIHRoaXM7fTsvKipcXHJcXG4gICAqIEFkZHMgYSBzdGF0ZSBsaXN0ZW5lciB0aGF0IGlzIG5vdGlmaWVkIHdoZW4gdGhlIHN0YXRlY2hhcnQgaGFzIHJlYWNoZWQgaXRzIGZpbmFsIHN0YXRlLlxcclxcbiAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBzdGF0ZSBsaXN0ZW5lclxcclxcbiAgICovSW50ZXJwcmV0ZXIucHJvdG90eXBlLm9uRG9uZT1mdW5jdGlvbihsaXN0ZW5lcil7aWYodGhpcy5zdGF0dXM9PT1fSW50ZXJwcmV0ZXJTdGF0dXMuU3RvcHBlZCYmdGhpcy5fZG9uZUV2ZW50KXtsaXN0ZW5lcih0aGlzLl9kb25lRXZlbnQpO31lbHNle3RoaXMuZG9uZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpO31yZXR1cm4gdGhpczt9Oy8qKlxcclxcbiAgICogUmVtb3ZlcyBhIGxpc3RlbmVyLlxcclxcbiAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmVcXHJcXG4gICAqL0ludGVycHJldGVyLnByb3RvdHlwZS5vZmY9ZnVuY3Rpb24obGlzdGVuZXIpe3RoaXMubGlzdGVuZXJzW1xcXCJkZWxldGVcXFwiXShsaXN0ZW5lcik7dGhpcy5ldmVudExpc3RlbmVyc1tcXFwiZGVsZXRlXFxcIl0obGlzdGVuZXIpO3RoaXMuc2VuZExpc3RlbmVyc1tcXFwiZGVsZXRlXFxcIl0obGlzdGVuZXIpO3RoaXMuc3RvcExpc3RlbmVyc1tcXFwiZGVsZXRlXFxcIl0obGlzdGVuZXIpO3RoaXMuZG9uZUxpc3RlbmVyc1tcXFwiZGVsZXRlXFxcIl0obGlzdGVuZXIpO3RoaXMuY29udGV4dExpc3RlbmVyc1tcXFwiZGVsZXRlXFxcIl0obGlzdGVuZXIpO3JldHVybiB0aGlzO307LyoqXFxyXFxuICAgKiBTdGFydHMgdGhlIGludGVycHJldGVyIGZyb20gdGhlIGdpdmVuIHN0YXRlLCBvciB0aGUgaW5pdGlhbCBzdGF0ZS5cXHJcXG4gICAqIEBwYXJhbSBpbml0aWFsU3RhdGUgVGhlIHN0YXRlIHRvIHN0YXJ0IHRoZSBzdGF0ZWNoYXJ0IGZyb21cXHJcXG4gICAqL0ludGVycHJldGVyLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihpbml0aWFsU3RhdGUpe3ZhciBfdGhpcz10aGlzO2lmKHRoaXMuc3RhdHVzPT09X0ludGVycHJldGVyU3RhdHVzLlJ1bm5pbmcpey8vIERvIG5vdCByZXN0YXJ0IHRoZSBzZXJ2aWNlIGlmIGl0IGlzIGFscmVhZHkgc3RhcnRlZFxcbnJldHVybiB0aGlzO30vLyB5ZXMsIGl0J3MgYSBoYWNrIGJ1dCB3ZSBuZWVkIHRoZSByZWxhdGVkIGNhY2hlIHRvIGJlIHBvcHVsYXRlZCBmb3Igc29tZSB0aGluZ3MgdG8gd29yayAobGlrZSBkZWxheWVkIHRyYW5zaXRpb25zKVxcbi8vIHRoaXMgaXMgdXN1YWxseSBjYWxsZWQgYnkgYG1hY2hpbmUuZ2V0SW5pdGlhbFN0YXRlYCBidXQgaWYgd2UgcmVoeWRyYXRlIGZyb20gYSBzdGF0ZSB3ZSBtaWdodCBieXBhc3MgdGhpcyBjYWxsXFxuLy8gd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgaGVyZSBhcyBpdCByZXNvbHZlcyB0aGUgZnVsbCBpbml0aWFsIHN0YXRlIHdoaWNoIG1pZ2h0IGludm9sdmUgY2FsbGluZyBhc3NpZ24gYWN0aW9uc1xcbi8vIGFuZCB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGxlYWQgdG8gc29tZSB1bndhbnRlZCBzaWRlLWVmZmVjdHMgKGV2ZW4gc3VjaCBhcyBjcmVhdGluZyBzb21lIHJvZ3VlIGFjdG9ycylcXG50aGlzLm1hY2hpbmUuX2luaXQoKTtfcmVnaXN0cnlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5yZWdpc3RyeS5yZWdpc3Rlcih0aGlzLnNlc3Npb25JZCx0aGlzKTt0aGlzLmluaXRpYWxpemVkPXRydWU7dGhpcy5zdGF0dXM9X0ludGVycHJldGVyU3RhdHVzLlJ1bm5pbmc7dmFyIHJlc29sdmVkU3RhdGU9aW5pdGlhbFN0YXRlPT09dW5kZWZpbmVkP3RoaXMuaW5pdGlhbFN0YXRlOigwLF9zZXJ2aWNlU2NvcGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXy5wcm92aWRlKSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuKDAsX1N0YXRlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18uaXNTdGF0ZUNvbmZpZykoaW5pdGlhbFN0YXRlKT9fdGhpcy5tYWNoaW5lLnJlc29sdmVTdGF0ZShpbml0aWFsU3RhdGUpOl90aGlzLm1hY2hpbmUucmVzb2x2ZVN0YXRlKF9TdGF0ZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fLlN0YXRlLmZyb20oaW5pdGlhbFN0YXRlLF90aGlzLm1hY2hpbmUuY29udGV4dCkpO30pO2lmKHRoaXMub3B0aW9ucy5kZXZUb29scyl7dGhpcy5hdHRhY2hEZXYoKTt9dGhpcy5zY2hlZHVsZXIuaW5pdGlhbGl6ZShmdW5jdGlvbigpe190aGlzLnVwZGF0ZShyZXNvbHZlZFN0YXRlLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uaW5pdEV2ZW50KTt9KTtyZXR1cm4gdGhpczt9O0ludGVycHJldGVyLnByb3RvdHlwZS5fc3RvcENoaWxkcmVuPWZ1bmN0aW9uKCl7Ly8gVE9ETzogdGhpbmsgYWJvdXQgY29udmVydGluZyB0aG9zZSB0byBhY3Rpb25zXFxudGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKXtpZigoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc0Z1bmN0aW9uKShjaGlsZC5zdG9wKSl7Y2hpbGQuc3RvcCgpO319KTt0aGlzLmNoaWxkcmVuLmNsZWFyKCk7fTtJbnRlcnByZXRlci5wcm90b3R5cGUuX3N0b3A9ZnVuY3Rpb24oKXt2YXIgZV82LF9hLGVfNyxfYixlXzgsX2MsZV85LF9kLGVfMTAsX2U7dHJ5e2Zvcih2YXIgX2Y9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5fX3ZhbHVlcykodGhpcy5saXN0ZW5lcnMpLF9nPV9mLm5leHQoKTshX2cuZG9uZTtfZz1fZi5uZXh0KCkpe3ZhciBsaXN0ZW5lcj1fZy52YWx1ZTt0aGlzLmxpc3RlbmVyc1tcXFwiZGVsZXRlXFxcIl0obGlzdGVuZXIpO319Y2F0Y2goZV82XzEpe2VfNj17ZXJyb3I6ZV82XzF9O31maW5hbGx5e3RyeXtpZihfZyYmIV9nLmRvbmUmJihfYT1fZltcXFwicmV0dXJuXFxcIl0pKV9hLmNhbGwoX2YpO31maW5hbGx5e2lmKGVfNil0aHJvdyBlXzYuZXJyb3I7fX10cnl7Zm9yKHZhciBfaD0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLl9fdmFsdWVzKSh0aGlzLnN0b3BMaXN0ZW5lcnMpLF9qPV9oLm5leHQoKTshX2ouZG9uZTtfaj1faC5uZXh0KCkpe3ZhciBsaXN0ZW5lcj1fai52YWx1ZTsvLyBjYWxsIGxpc3RlbmVyLCB0aGVuIHJlbW92ZVxcbmxpc3RlbmVyKCk7dGhpcy5zdG9wTGlzdGVuZXJzW1xcXCJkZWxldGVcXFwiXShsaXN0ZW5lcik7fX1jYXRjaChlXzdfMSl7ZV83PXtlcnJvcjplXzdfMX07fWZpbmFsbHl7dHJ5e2lmKF9qJiYhX2ouZG9uZSYmKF9iPV9oW1xcXCJyZXR1cm5cXFwiXSkpX2IuY2FsbChfaCk7fWZpbmFsbHl7aWYoZV83KXRocm93IGVfNy5lcnJvcjt9fXRyeXtmb3IodmFyIF9rPSgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uX192YWx1ZXMpKHRoaXMuY29udGV4dExpc3RlbmVycyksX2w9X2submV4dCgpOyFfbC5kb25lO19sPV9rLm5leHQoKSl7dmFyIGxpc3RlbmVyPV9sLnZhbHVlO3RoaXMuY29udGV4dExpc3RlbmVyc1tcXFwiZGVsZXRlXFxcIl0obGlzdGVuZXIpO319Y2F0Y2goZV84XzEpe2VfOD17ZXJyb3I6ZV84XzF9O31maW5hbGx5e3RyeXtpZihfbCYmIV9sLmRvbmUmJihfYz1fa1tcXFwicmV0dXJuXFxcIl0pKV9jLmNhbGwoX2spO31maW5hbGx5e2lmKGVfOCl0aHJvdyBlXzguZXJyb3I7fX10cnl7Zm9yKHZhciBfbT0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLl9fdmFsdWVzKSh0aGlzLmRvbmVMaXN0ZW5lcnMpLF9vPV9tLm5leHQoKTshX28uZG9uZTtfbz1fbS5uZXh0KCkpe3ZhciBsaXN0ZW5lcj1fby52YWx1ZTt0aGlzLmRvbmVMaXN0ZW5lcnNbXFxcImRlbGV0ZVxcXCJdKGxpc3RlbmVyKTt9fWNhdGNoKGVfOV8xKXtlXzk9e2Vycm9yOmVfOV8xfTt9ZmluYWxseXt0cnl7aWYoX28mJiFfby5kb25lJiYoX2Q9X21bXFxcInJldHVyblxcXCJdKSlfZC5jYWxsKF9tKTt9ZmluYWxseXtpZihlXzkpdGhyb3cgZV85LmVycm9yO319aWYoIXRoaXMuaW5pdGlhbGl6ZWQpey8vIEludGVycHJldGVyIGFscmVhZHkgc3RvcHBlZDsgZG8gbm90aGluZ1xcbnJldHVybiB0aGlzO310aGlzLmluaXRpYWxpemVkPWZhbHNlO3RoaXMuc3RhdHVzPV9JbnRlcnByZXRlclN0YXR1cy5TdG9wcGVkO3RoaXMuX2luaXRpYWxTdGF0ZT11bmRlZmluZWQ7dHJ5ey8vIHdlIGFyZSBnb2luZyB0byBzdG9wIHdpdGhpbiB0aGUgY3VycmVudCBzeW5jIGZyYW1lXFxuLy8gc28gd2UgY2FuIHNhZmVseSBqdXN0IGNhbmNlbCB0aGlzIGhlcmUgYXMgbm90aGluZyBhc3luYyBzaG91bGQgYmUgZmlyZWQgYW55d2F5XFxuZm9yKHZhciBfcD0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLl9fdmFsdWVzKShPYmplY3Qua2V5cyh0aGlzLmRlbGF5ZWRFdmVudHNNYXApKSxfcT1fcC5uZXh0KCk7IV9xLmRvbmU7X3E9X3AubmV4dCgpKXt2YXIga2V5PV9xLnZhbHVlO3RoaXMuY2xvY2suY2xlYXJUaW1lb3V0KHRoaXMuZGVsYXllZEV2ZW50c01hcFtrZXldKTt9fWNhdGNoKGVfMTBfMSl7ZV8xMD17ZXJyb3I6ZV8xMF8xfTt9ZmluYWxseXt0cnl7aWYoX3EmJiFfcS5kb25lJiYoX2U9X3BbXFxcInJldHVyblxcXCJdKSlfZS5jYWxsKF9wKTt9ZmluYWxseXtpZihlXzEwKXRocm93IGVfMTAuZXJyb3I7fX0vLyBjbGVhciBldmVyeXRoaW5nIHRoYXQgbWlnaHQgYmUgZW5xdWV1ZWRcXG50aGlzLnNjaGVkdWxlci5jbGVhcigpO3RoaXMuc2NoZWR1bGVyPW5ldyBfc2NoZWR1bGVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18uU2NoZWR1bGVyKHtkZWZlckV2ZW50czp0aGlzLm9wdGlvbnMuZGVmZXJFdmVudHN9KTt9Oy8qKlxcclxcbiAgICogU3RvcHMgdGhlIGludGVycHJldGVyIGFuZCB1bnN1YnNjcmliZSBhbGwgbGlzdGVuZXJzLlxcclxcbiAgICpcXHJcXG4gICAqIFRoaXMgd2lsbCBhbHNvIG5vdGlmeSB0aGUgYG9uU3RvcGAgbGlzdGVuZXJzLlxcclxcbiAgICovSW50ZXJwcmV0ZXIucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXsvLyBUT0RPOiBhZGQgd2FybmluZyBmb3Igc3RvcHBpbmcgbm9uLXJvb3QgaW50ZXJwcmV0ZXJzXFxudmFyIF90aGlzPXRoaXM7Ly8gZ3JhYiB0aGUgY3VycmVudCBzY2hlZHVsZXIgYXMgaXQgd2lsbCBiZSByZXBsYWNlZCBpbiBfc3RvcFxcbnZhciBzY2hlZHVsZXI9dGhpcy5zY2hlZHVsZXI7dGhpcy5fc3RvcCgpOy8vIGxldCB3aGF0IGlzIGN1cnJlbnRseSBwcm9jZXNzZWQgdG8gYmUgZmluaXNoZWRcXG5zY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKXsvLyBpdCBmZWVscyB3ZWlyZCB0byBoYW5kbGUgdGhpcyBoZXJlIGJ1dCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGlzIGV2ZW4gc2xpZ2h0bHkgXFxcIm91dCBvZiBiYW5kXFxcIlxcbnZhciBfZXZlbnQ9KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9TQ1hNTEV2ZW50KSh7dHlwZToneHN0YXRlLnN0b3AnfSk7dmFyIG5leHRTdGF0ZT0oMCxfc2VydmljZVNjb3BlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X18ucHJvdmlkZSkoX3RoaXMsZnVuY3Rpb24oKXt2YXIgZXhpdEFjdGlvbnM9KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZmxhdHRlbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5fX3NwcmVhZEFycmF5KShbXSwoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLl9fcmVhZCkoX3RoaXMuc3RhdGUuY29uZmlndXJhdGlvbiksZmFsc2UpLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5vcmRlci1hLm9yZGVyO30pLm1hcChmdW5jdGlvbihzdGF0ZU5vZGUpe3JldHVybigwLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18udG9BY3Rpb25PYmplY3RzKShzdGF0ZU5vZGUub25FeGl0LF90aGlzLm1hY2hpbmUub3B0aW9ucy5hY3Rpb25zKTt9KSk7dmFyIF9hPSgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uX19yZWFkKSgoMCxfYWN0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLnJlc29sdmVBY3Rpb25zKShfdGhpcy5tYWNoaW5lLF90aGlzLnN0YXRlLF90aGlzLnN0YXRlLmNvbnRleHQsX2V2ZW50LFt7dHlwZTonZXhpdCcsYWN0aW9uczpleGl0QWN0aW9uc31dLF90aGlzLm1hY2hpbmUuY29uZmlnLnByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzP190aGlzLl9leGVjOnVuZGVmaW5lZCxfdGhpcy5tYWNoaW5lLmNvbmZpZy5wcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50c3x8X3RoaXMubWFjaGluZS5jb25maWcucHJlc2VydmVBY3Rpb25PcmRlciksMikscmVzb2x2ZWRBY3Rpb25zPV9hWzBdLHVwZGF0ZWRDb250ZXh0PV9hWzFdO3ZhciBuZXdTdGF0ZT1uZXcgX1N0YXRlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18uU3RhdGUoe3ZhbHVlOl90aGlzLnN0YXRlLnZhbHVlLGNvbnRleHQ6dXBkYXRlZENvbnRleHQsX2V2ZW50Ol9ldmVudCxfc2Vzc2lvbmlkOl90aGlzLnNlc3Npb25JZCxoaXN0b3J5VmFsdWU6dW5kZWZpbmVkLGhpc3Rvcnk6X3RoaXMuc3RhdGUsYWN0aW9uczpyZXNvbHZlZEFjdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKGFjdGlvbil7cmV0dXJuISgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmlzUmFpc2FibGVBY3Rpb24pKGFjdGlvbik7fSksYWN0aXZpdGllczp7fSxldmVudHM6W10sY29uZmlndXJhdGlvbjpbXSx0cmFuc2l0aW9uczpbXSxjaGlsZHJlbjp7fSxkb25lOl90aGlzLnN0YXRlLmRvbmUsdGFnczpfdGhpcy5zdGF0ZS50YWdzLG1hY2hpbmU6X3RoaXMubWFjaGluZX0pO25ld1N0YXRlLmNoYW5nZWQ9dHJ1ZTtyZXR1cm4gbmV3U3RhdGU7fSk7X3RoaXMudXBkYXRlKG5leHRTdGF0ZSxfZXZlbnQpO190aGlzLl9zdG9wQ2hpbGRyZW4oKTtfcmVnaXN0cnlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5yZWdpc3RyeS5mcmVlKF90aGlzLnNlc3Npb25JZCk7fSk7cmV0dXJuIHRoaXM7fTtJbnRlcnByZXRlci5wcm90b3R5cGUuYmF0Y2g9ZnVuY3Rpb24oZXZlbnRzKXt2YXIgX3RoaXM9dGhpcztpZih0aGlzLnN0YXR1cz09PV9JbnRlcnByZXRlclN0YXR1cy5Ob3RTdGFydGVkJiZ0aGlzLm9wdGlvbnMuZGVmZXJFdmVudHMpey8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXFxuaWYoIV9lbnZpcm9ubWVudF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLklTX1BST0RVQ1RJT04peygwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLndhcm4pKGZhbHNlLFxcXCJcXFwiLmNvbmNhdChldmVudHMubGVuZ3RoLFxcXCIgZXZlbnQocykgd2VyZSBzZW50IHRvIHVuaW5pdGlhbGl6ZWQgc2VydmljZSBcXFxcXFxcIlxcXCIpLmNvbmNhdCh0aGlzLm1hY2hpbmUuaWQsXFxcIlxcXFxcXFwiIGFuZCBhcmUgZGVmZXJyZWQuIE1ha2Ugc3VyZSAuc3RhcnQoKSBpcyBjYWxsZWQgZm9yIHRoaXMgc2VydmljZS5cXFxcbkV2ZW50OiBcXFwiKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkoZXZlbnQpKSk7fX1lbHNlIGlmKHRoaXMuc3RhdHVzIT09X0ludGVycHJldGVyU3RhdHVzLlJ1bm5pbmcpe3Rocm93IG5ldyBFcnJvcigvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXFxuXFxcIlxcXCIuY29uY2F0KGV2ZW50cy5sZW5ndGgsXFxcIiBldmVudChzKSB3ZXJlIHNlbnQgdG8gdW5pbml0aWFsaXplZCBzZXJ2aWNlIFxcXFxcXFwiXFxcIikuY29uY2F0KHRoaXMubWFjaGluZS5pZCxcXFwiXFxcXFxcXCIuIE1ha2Ugc3VyZSAuc3RhcnQoKSBpcyBjYWxsZWQgZm9yIHRoaXMgc2VydmljZSwgb3Igc2V0IHsgZGVmZXJFdmVudHM6IHRydWUgfSBpbiB0aGUgc2VydmljZSBvcHRpb25zLlxcXCIpKTt9aWYoIWV2ZW50cy5sZW5ndGgpe3JldHVybjt9dmFyIGV4ZWM9ISF0aGlzLm1hY2hpbmUuY29uZmlnLnByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzJiZ0aGlzLl9leGVjO3RoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uKCl7dmFyIGVfMTEsX2E7dmFyIG5leHRTdGF0ZT1fdGhpcy5zdGF0ZTt2YXIgYmF0Y2hDaGFuZ2VkPWZhbHNlO3ZhciBiYXRjaGVkQWN0aW9ucz1bXTt2YXIgX2xvb3BfMT1mdW5jdGlvbiBfbG9vcF8xKGV2ZW50XzEpe3ZhciBfZXZlbnQ9KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9TQ1hNTEV2ZW50KShldmVudF8xKTtfdGhpcy5mb3J3YXJkKF9ldmVudCk7bmV4dFN0YXRlPSgwLF9zZXJ2aWNlU2NvcGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXy5wcm92aWRlKShfdGhpcyxmdW5jdGlvbigpe3JldHVybiBfdGhpcy5tYWNoaW5lLnRyYW5zaXRpb24obmV4dFN0YXRlLF9ldmVudCx1bmRlZmluZWQsZXhlY3x8dW5kZWZpbmVkKTt9KTtiYXRjaGVkQWN0aW9ucy5wdXNoLmFwcGx5KGJhdGNoZWRBY3Rpb25zLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uX19zcHJlYWRBcnJheSkoW10sKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5fX3JlYWQpKF90aGlzLm1hY2hpbmUuY29uZmlnLnByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzP25leHRTdGF0ZS5hY3Rpb25zOm5leHRTdGF0ZS5hY3Rpb25zLm1hcChmdW5jdGlvbihhKXtyZXR1cm4oMCxfU3RhdGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXy5iaW5kQWN0aW9uVG9TdGF0ZSkoYSxuZXh0U3RhdGUpO30pKSxmYWxzZSkpO2JhdGNoQ2hhbmdlZD1iYXRjaENoYW5nZWR8fCEhbmV4dFN0YXRlLmNoYW5nZWQ7fTt0cnl7Zm9yKHZhciBldmVudHNfMT0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLl9fdmFsdWVzKShldmVudHMpLGV2ZW50c18xXzE9ZXZlbnRzXzEubmV4dCgpOyFldmVudHNfMV8xLmRvbmU7ZXZlbnRzXzFfMT1ldmVudHNfMS5uZXh0KCkpe3ZhciBldmVudF8xPWV2ZW50c18xXzEudmFsdWU7X2xvb3BfMShldmVudF8xKTt9fWNhdGNoKGVfMTFfMSl7ZV8xMT17ZXJyb3I6ZV8xMV8xfTt9ZmluYWxseXt0cnl7aWYoZXZlbnRzXzFfMSYmIWV2ZW50c18xXzEuZG9uZSYmKF9hPWV2ZW50c18xW1xcXCJyZXR1cm5cXFwiXSkpX2EuY2FsbChldmVudHNfMSk7fWZpbmFsbHl7aWYoZV8xMSl0aHJvdyBlXzExLmVycm9yO319bmV4dFN0YXRlLmNoYW5nZWQ9YmF0Y2hDaGFuZ2VkO25leHRTdGF0ZS5hY3Rpb25zPWJhdGNoZWRBY3Rpb25zO190aGlzLnVwZGF0ZShuZXh0U3RhdGUsKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9TQ1hNTEV2ZW50KShldmVudHNbZXZlbnRzLmxlbmd0aC0xXSkpO30pO307LyoqXFxyXFxuICAgKiBSZXR1cm5zIGEgc2VuZCBmdW5jdGlvbiBib3VuZCB0byB0aGlzIGludGVycHJldGVyIGluc3RhbmNlLlxcclxcbiAgICpcXHJcXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gYmUgc2VudCBieSB0aGUgc2VuZGVyLlxcclxcbiAgICovSW50ZXJwcmV0ZXIucHJvdG90eXBlLnNlbmRlcj1mdW5jdGlvbihldmVudCl7cmV0dXJuIHRoaXMuc2VuZC5iaW5kKHRoaXMsZXZlbnQpO307SW50ZXJwcmV0ZXIucHJvdG90eXBlLl9uZXh0U3RhdGU9ZnVuY3Rpb24oZXZlbnQsZXhlYyl7dmFyIF90aGlzPXRoaXM7aWYoZXhlYz09PXZvaWQgMCl7ZXhlYz0hIXRoaXMubWFjaGluZS5jb25maWcucHJlZGljdGFibGVBY3Rpb25Bcmd1bWVudHMmJnRoaXMuX2V4ZWM7fXZhciBfZXZlbnQ9KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9TQ1hNTEV2ZW50KShldmVudCk7aWYoX2V2ZW50Lm5hbWUuaW5kZXhPZihfYWN0aW9uVHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5lcnJvclBsYXRmb3JtKT09PTAmJiF0aGlzLnN0YXRlLm5leHRFdmVudHMuc29tZShmdW5jdGlvbihuZXh0RXZlbnQpe3JldHVybiBuZXh0RXZlbnQuaW5kZXhPZihfYWN0aW9uVHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5lcnJvclBsYXRmb3JtKT09PTA7fSkpe3Rocm93IF9ldmVudC5kYXRhLmRhdGE7fXZhciBuZXh0U3RhdGU9KDAsX3NlcnZpY2VTY29wZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fLnByb3ZpZGUpKHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMubWFjaGluZS50cmFuc2l0aW9uKF90aGlzLnN0YXRlLF9ldmVudCx1bmRlZmluZWQsZXhlY3x8dW5kZWZpbmVkKTt9KTtyZXR1cm4gbmV4dFN0YXRlO307LyoqXFxyXFxuICAgKiBSZXR1cm5zIHRoZSBuZXh0IHN0YXRlIGdpdmVuIHRoZSBpbnRlcnByZXRlcidzIGN1cnJlbnQgc3RhdGUgYW5kIHRoZSBldmVudC5cXHJcXG4gICAqXFxyXFxuICAgKiBUaGlzIGlzIGEgcHVyZSBtZXRob2QgdGhhdCBkb2VzIF9ub3RfIHVwZGF0ZSB0aGUgaW50ZXJwcmV0ZXIncyBzdGF0ZS5cXHJcXG4gICAqXFxyXFxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGRldGVybWluZSB0aGUgbmV4dCBzdGF0ZVxcclxcbiAgICovSW50ZXJwcmV0ZXIucHJvdG90eXBlLm5leHRTdGF0ZT1mdW5jdGlvbihldmVudCl7cmV0dXJuIHRoaXMuX25leHRTdGF0ZShldmVudCxmYWxzZSk7fTtJbnRlcnByZXRlci5wcm90b3R5cGUuZm9yd2FyZD1mdW5jdGlvbihldmVudCl7dmFyIGVfMTIsX2E7dHJ5e2Zvcih2YXIgX2I9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5fX3ZhbHVlcykodGhpcy5mb3J3YXJkVG8pLF9jPV9iLm5leHQoKTshX2MuZG9uZTtfYz1fYi5uZXh0KCkpe3ZhciBpZD1fYy52YWx1ZTt2YXIgY2hpbGQ9dGhpcy5jaGlsZHJlbi5nZXQoaWQpO2lmKCFjaGlsZCl7dGhyb3cgbmV3IEVycm9yKFxcXCJVbmFibGUgdG8gZm9yd2FyZCBldmVudCAnXFxcIi5jb25jYXQoZXZlbnQsXFxcIicgZnJvbSBpbnRlcnByZXRlciAnXFxcIikuY29uY2F0KHRoaXMuaWQsXFxcIicgdG8gbm9uZXhpc3RhbnQgY2hpbGQgJ1xcXCIpLmNvbmNhdChpZCxcXFwiJy5cXFwiKSk7fWNoaWxkLnNlbmQoZXZlbnQpO319Y2F0Y2goZV8xMl8xKXtlXzEyPXtlcnJvcjplXzEyXzF9O31maW5hbGx5e3RyeXtpZihfYyYmIV9jLmRvbmUmJihfYT1fYltcXFwicmV0dXJuXFxcIl0pKV9hLmNhbGwoX2IpO31maW5hbGx5e2lmKGVfMTIpdGhyb3cgZV8xMi5lcnJvcjt9fX07SW50ZXJwcmV0ZXIucHJvdG90eXBlLmRlZmVyPWZ1bmN0aW9uKHNlbmRBY3Rpb24pe3ZhciBfdGhpcz10aGlzO3ZhciB0aW1lcklkPXRoaXMuY2xvY2suc2V0VGltZW91dChmdW5jdGlvbigpe2lmKCd0bydpbiBzZW5kQWN0aW9uJiZzZW5kQWN0aW9uLnRvKXtfdGhpcy5zZW5kVG8oc2VuZEFjdGlvbi5fZXZlbnQsc2VuZEFjdGlvbi50byx0cnVlKTt9ZWxzZXtfdGhpcy5zZW5kKHNlbmRBY3Rpb24uX2V2ZW50KTt9fSxzZW5kQWN0aW9uLmRlbGF5KTtpZihzZW5kQWN0aW9uLmlkKXt0aGlzLmRlbGF5ZWRFdmVudHNNYXBbc2VuZEFjdGlvbi5pZF09dGltZXJJZDt9fTtJbnRlcnByZXRlci5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHNlbmRJZCl7dGhpcy5jbG9jay5jbGVhclRpbWVvdXQodGhpcy5kZWxheWVkRXZlbnRzTWFwW3NlbmRJZF0pO2RlbGV0ZSB0aGlzLmRlbGF5ZWRFdmVudHNNYXBbc2VuZElkXTt9O0ludGVycHJldGVyLnByb3RvdHlwZS5leGVjPWZ1bmN0aW9uKGFjdGlvbixzdGF0ZSxhY3Rpb25GdW5jdGlvbk1hcCl7aWYoYWN0aW9uRnVuY3Rpb25NYXA9PT12b2lkIDApe2FjdGlvbkZ1bmN0aW9uTWFwPXRoaXMubWFjaGluZS5vcHRpb25zLmFjdGlvbnM7fXRoaXMuX2V4ZWMoYWN0aW9uLHN0YXRlLmNvbnRleHQsc3RhdGUuX2V2ZW50LGFjdGlvbkZ1bmN0aW9uTWFwKTt9O0ludGVycHJldGVyLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbihjaGlsZElkKXt2YXIgX2E7dGhpcy5jaGlsZHJlbltcXFwiZGVsZXRlXFxcIl0oY2hpbGRJZCk7dGhpcy5mb3J3YXJkVG9bXFxcImRlbGV0ZVxcXCJdKGNoaWxkSWQpOy8vIHRoaXMuc3RhdGUgbWlnaHQgbm90IGV4aXN0IGF0IHRoZSB0aW1lIHRoaXMgaXMgY2FsbGVkLFxcbi8vIHN1Y2ggYXMgd2hlbiBhIGNoaWxkIGlzIGFkZGVkIHRoZW4gcmVtb3ZlZCB3aGlsZSBpbml0aWFsaXppbmcgdGhlIHN0YXRlXFxuKF9hPXRoaXMuc3RhdGUpPT09bnVsbHx8X2E9PT12b2lkIDA/dHJ1ZTpkZWxldGUgX2EuY2hpbGRyZW5bY2hpbGRJZF07fTtJbnRlcnByZXRlci5wcm90b3R5cGUuc3RvcENoaWxkPWZ1bmN0aW9uKGNoaWxkSWQpe3ZhciBjaGlsZD10aGlzLmNoaWxkcmVuLmdldChjaGlsZElkKTtpZighY2hpbGQpe3JldHVybjt9dGhpcy5yZW1vdmVDaGlsZChjaGlsZElkKTtpZigoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc0Z1bmN0aW9uKShjaGlsZC5zdG9wKSl7Y2hpbGQuc3RvcCgpO319O0ludGVycHJldGVyLnByb3RvdHlwZS5zcGF3bj1mdW5jdGlvbihlbnRpdHksbmFtZSxvcHRpb25zKXtpZih0aGlzLnN0YXR1cyE9PV9JbnRlcnByZXRlclN0YXR1cy5SdW5uaW5nKXtyZXR1cm4oMCxfQWN0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18uY3JlYXRlRGVmZXJyZWRBY3RvcikoZW50aXR5LG5hbWUpO31pZigoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc1Byb21pc2VMaWtlKShlbnRpdHkpKXtyZXR1cm4gdGhpcy5zcGF3blByb21pc2UoUHJvbWlzZS5yZXNvbHZlKGVudGl0eSksbmFtZSk7fWVsc2UgaWYoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNGdW5jdGlvbikoZW50aXR5KSl7cmV0dXJuIHRoaXMuc3Bhd25DYWxsYmFjayhlbnRpdHksbmFtZSk7fWVsc2UgaWYoKDAsX0FjdG9yX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fLmlzU3Bhd25lZEFjdG9yKShlbnRpdHkpKXtyZXR1cm4gdGhpcy5zcGF3bkFjdG9yKGVudGl0eSxuYW1lKTt9ZWxzZSBpZigoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc09ic2VydmFibGUpKGVudGl0eSkpe3JldHVybiB0aGlzLnNwYXduT2JzZXJ2YWJsZShlbnRpdHksbmFtZSk7fWVsc2UgaWYoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNNYWNoaW5lKShlbnRpdHkpKXtyZXR1cm4gdGhpcy5zcGF3bk1hY2hpbmUoZW50aXR5LCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uX19hc3NpZ24pKHt9LG9wdGlvbnMpLHtpZDpuYW1lfSkpO31lbHNlIGlmKCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmlzQmVoYXZpb3IpKGVudGl0eSkpe3JldHVybiB0aGlzLnNwYXduQmVoYXZpb3IoZW50aXR5LG5hbWUpO31lbHNle3Rocm93IG5ldyBFcnJvcihcXFwiVW5hYmxlIHRvIHNwYXduIGVudGl0eSBcXFxcXFxcIlxcXCIuY29uY2F0KG5hbWUsXFxcIlxcXFxcXFwiIG9mIHR5cGUgXFxcXFxcXCJcXFwiKS5jb25jYXQoX3R5cGVvZjIoZW50aXR5KSxcXFwiXFxcXFxcXCIuXFxcIikpO319O0ludGVycHJldGVyLnByb3RvdHlwZS5zcGF3bk1hY2hpbmU9ZnVuY3Rpb24obWFjaGluZSxvcHRpb25zKXt2YXIgX3RoaXM9dGhpcztpZihvcHRpb25zPT09dm9pZCAwKXtvcHRpb25zPXt9O312YXIgY2hpbGRTZXJ2aWNlPW5ldyBJbnRlcnByZXRlcihtYWNoaW5lLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uX19hc3NpZ24pKHt9LHRoaXMub3B0aW9ucykse3BhcmVudDp0aGlzLGlkOm9wdGlvbnMuaWR8fG1hY2hpbmUuaWR9KSk7dmFyIHJlc29sdmVkT3B0aW9ucz0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLl9fYXNzaWduKSgoMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLl9fYXNzaWduKSh7fSxERUZBVUxUX1NQQVdOX09QVElPTlMpLG9wdGlvbnMpO2lmKHJlc29sdmVkT3B0aW9ucy5zeW5jKXtjaGlsZFNlcnZpY2Uub25UcmFuc2l0aW9uKGZ1bmN0aW9uKHN0YXRlKXtfdGhpcy5zZW5kKF9hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLnVwZGF0ZSx7c3RhdGU6c3RhdGUsaWQ6Y2hpbGRTZXJ2aWNlLmlkfSk7fSk7fXZhciBhY3Rvcj1jaGlsZFNlcnZpY2U7dGhpcy5jaGlsZHJlbi5zZXQoY2hpbGRTZXJ2aWNlLmlkLGFjdG9yKTtpZihyZXNvbHZlZE9wdGlvbnMuYXV0b0ZvcndhcmQpe3RoaXMuZm9yd2FyZFRvLmFkZChjaGlsZFNlcnZpY2UuaWQpO31jaGlsZFNlcnZpY2Uub25Eb25lKGZ1bmN0aW9uKGRvbmVFdmVudCl7X3RoaXMucmVtb3ZlQ2hpbGQoY2hpbGRTZXJ2aWNlLmlkKTtfdGhpcy5zZW5kKCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvU0NYTUxFdmVudCkoZG9uZUV2ZW50LHtvcmlnaW46Y2hpbGRTZXJ2aWNlLmlkfSkpO30pLnN0YXJ0KCk7cmV0dXJuIGFjdG9yO307SW50ZXJwcmV0ZXIucHJvdG90eXBlLnNwYXduQmVoYXZpb3I9ZnVuY3Rpb24oYmVoYXZpb3IsaWQpe3ZhciBhY3RvclJlZj0oMCxfYmVoYXZpb3JzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fLnNwYXduQmVoYXZpb3IpKGJlaGF2aW9yLHtpZDppZCxwYXJlbnQ6dGhpc30pO3RoaXMuY2hpbGRyZW4uc2V0KGlkLGFjdG9yUmVmKTtyZXR1cm4gYWN0b3JSZWY7fTtJbnRlcnByZXRlci5wcm90b3R5cGUuc3Bhd25Qcm9taXNlPWZ1bmN0aW9uKHByb21pc2UsaWQpe3ZhciBfYTt2YXIgX3RoaXM9dGhpczt2YXIgY2FuY2VsZWQ9ZmFsc2U7dmFyIHJlc29sdmVkRGF0YTtwcm9taXNlLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe2lmKCFjYW5jZWxlZCl7cmVzb2x2ZWREYXRhPXJlc3BvbnNlO190aGlzLnJlbW92ZUNoaWxkKGlkKTtfdGhpcy5zZW5kKCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvU0NYTUxFdmVudCkoKDAsX2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5kb25lSW52b2tlKShpZCxyZXNwb25zZSkse29yaWdpbjppZH0pKTt9fSxmdW5jdGlvbihlcnJvckRhdGEpe2lmKCFjYW5jZWxlZCl7X3RoaXMucmVtb3ZlQ2hpbGQoaWQpO3ZhciBlcnJvckV2ZW50PSgwLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uZXJyb3IpKGlkLGVycm9yRGF0YSk7dHJ5ey8vIFNlbmQgXFxcImVycm9yLnBsYXRmb3JtLmlkXFxcIiB0byB0aGlzIChwYXJlbnQpLlxcbl90aGlzLnNlbmQoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9TQ1hNTEV2ZW50KShlcnJvckV2ZW50LHtvcmlnaW46aWR9KSk7fWNhdGNoKGVycm9yKXsoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5yZXBvcnRVbmhhbmRsZWRFeGNlcHRpb25Pbkludm9jYXRpb24pKGVycm9yRGF0YSxlcnJvcixpZCk7aWYoX3RoaXMuZGV2VG9vbHMpe190aGlzLmRldlRvb2xzLnNlbmQoZXJyb3JFdmVudCxfdGhpcy5zdGF0ZSk7fWlmKF90aGlzLm1hY2hpbmUuc3RyaWN0KXsvLyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gYWx3YXlzIHN0b3AgdGhlIHN0YXRlIG1hY2hpbmUgaWYgdW5oYW5kbGVkXFxuLy8gZXhjZXB0aW9uL3Byb21pc2UgcmVqZWN0aW9uIGhhcHBlbnMgYnV0IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0b1xcbi8vIGJyZWFrIGV4aXN0aW5nIGNvZGUgc28gZW5mb3JjZSBpdCBvbiBzdHJpY3QgbW9kZSBvbmx5IGVzcGVjaWFsbHkgc29cXG4vLyBiZWNhdXNlIGRvY3VtZW50YXRpb24gc2F5cyB0aGF0IG9uRXJyb3IgaXMgb3B0aW9uYWxcXG5fdGhpcy5zdG9wKCk7fX19fSk7dmFyIGFjdG9yPShfYT17aWQ6aWQsc2VuZDpmdW5jdGlvbiBzZW5kKCl7cmV0dXJuIHZvaWQgMDt9LHN1YnNjcmliZTpmdW5jdGlvbiBzdWJzY3JpYmUobmV4dCxoYW5kbGVFcnJvcixjb21wbGV0ZSl7dmFyIG9ic2VydmVyPSgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvT2JzZXJ2ZXIpKG5leHQsaGFuZGxlRXJyb3IsY29tcGxldGUpO3ZhciB1bnN1YnNjcmliZWQ9ZmFsc2U7cHJvbWlzZS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKXtpZih1bnN1YnNjcmliZWQpe3JldHVybjt9b2JzZXJ2ZXIubmV4dChyZXNwb25zZSk7aWYodW5zdWJzY3JpYmVkKXtyZXR1cm47fW9ic2VydmVyLmNvbXBsZXRlKCk7fSxmdW5jdGlvbihlcnIpe2lmKHVuc3Vic2NyaWJlZCl7cmV0dXJuO31vYnNlcnZlci5lcnJvcihlcnIpO30pO3JldHVybnt1bnN1YnNjcmliZTpmdW5jdGlvbiB1bnN1YnNjcmliZSgpe3JldHVybiB1bnN1YnNjcmliZWQ9dHJ1ZTt9fTt9LHN0b3A6ZnVuY3Rpb24gc3RvcCgpe2NhbmNlbGVkPXRydWU7fSx0b0pTT046ZnVuY3Rpb24gdG9KU09OKCl7cmV0dXJue2lkOmlkfTt9LGdldFNuYXBzaG90OmZ1bmN0aW9uIGdldFNuYXBzaG90KCl7cmV0dXJuIHJlc29sdmVkRGF0YTt9fSxfYVtfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5zeW1ib2xPYnNlcnZhYmxlXT1mdW5jdGlvbigpe3JldHVybiB0aGlzO30sX2EpO3RoaXMuY2hpbGRyZW4uc2V0KGlkLGFjdG9yKTtyZXR1cm4gYWN0b3I7fTtJbnRlcnByZXRlci5wcm90b3R5cGUuc3Bhd25DYWxsYmFjaz1mdW5jdGlvbihjYWxsYmFjayxpZCl7dmFyIF9hO3ZhciBfdGhpcz10aGlzO3ZhciBjYW5jZWxlZD1mYWxzZTt2YXIgcmVjZWl2ZXJzPW5ldyBTZXQoKTt2YXIgbGlzdGVuZXJzPW5ldyBTZXQoKTt2YXIgZW1pdHRlZDt2YXIgcmVjZWl2ZT1mdW5jdGlvbiByZWNlaXZlKGUpe2VtaXR0ZWQ9ZTtsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbihsaXN0ZW5lcil7cmV0dXJuIGxpc3RlbmVyKGUpO30pO2lmKGNhbmNlbGVkKXtyZXR1cm47fV90aGlzLnNlbmQoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9TQ1hNTEV2ZW50KShlLHtvcmlnaW46aWR9KSk7fTt2YXIgY2FsbGJhY2tTdG9wO3RyeXtjYWxsYmFja1N0b3A9Y2FsbGJhY2socmVjZWl2ZSxmdW5jdGlvbihuZXdMaXN0ZW5lcil7cmVjZWl2ZXJzLmFkZChuZXdMaXN0ZW5lcik7fSk7fWNhdGNoKGVycil7dGhpcy5zZW5kKCgwLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uZXJyb3IpKGlkLGVycikpO31pZigoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc1Byb21pc2VMaWtlKShjYWxsYmFja1N0b3ApKXsvLyBpdCB0dXJuZWQgb3V0IHRvIGJlIGFuIGFzeW5jIGZ1bmN0aW9uLCBjYW4ndCByZWxpYWJseSBjaGVjayB0aGlzIGJlZm9yZSBjYWxsaW5nIGBjYWxsYmFja2BcXG4vLyBiZWNhdXNlIHRyYW5zcGlsZWQgYXN5bmMgZnVuY3Rpb25zIGFyZSBub3QgcmVjb2duaXphYmxlXFxucmV0dXJuIHRoaXMuc3Bhd25Qcm9taXNlKGNhbGxiYWNrU3RvcCxpZCk7fXZhciBhY3Rvcj0oX2E9e2lkOmlkLHNlbmQ6ZnVuY3Rpb24gc2VuZChldmVudCl7cmV0dXJuIHJlY2VpdmVycy5mb3JFYWNoKGZ1bmN0aW9uKHJlY2VpdmVyKXtyZXR1cm4gcmVjZWl2ZXIoZXZlbnQpO30pO30sc3Vic2NyaWJlOmZ1bmN0aW9uIHN1YnNjcmliZShuZXh0KXt2YXIgb2JzZXJ2ZXI9KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udG9PYnNlcnZlcikobmV4dCk7bGlzdGVuZXJzLmFkZChvYnNlcnZlci5uZXh0KTtyZXR1cm57dW5zdWJzY3JpYmU6ZnVuY3Rpb24gdW5zdWJzY3JpYmUoKXtsaXN0ZW5lcnNbXFxcImRlbGV0ZVxcXCJdKG9ic2VydmVyLm5leHQpO319O30sc3RvcDpmdW5jdGlvbiBzdG9wKCl7Y2FuY2VsZWQ9dHJ1ZTtpZigoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc0Z1bmN0aW9uKShjYWxsYmFja1N0b3ApKXtjYWxsYmFja1N0b3AoKTt9fSx0b0pTT046ZnVuY3Rpb24gdG9KU09OKCl7cmV0dXJue2lkOmlkfTt9LGdldFNuYXBzaG90OmZ1bmN0aW9uIGdldFNuYXBzaG90KCl7cmV0dXJuIGVtaXR0ZWQ7fX0sX2FbX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uc3ltYm9sT2JzZXJ2YWJsZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpczt9LF9hKTt0aGlzLmNoaWxkcmVuLnNldChpZCxhY3Rvcik7cmV0dXJuIGFjdG9yO307SW50ZXJwcmV0ZXIucHJvdG90eXBlLnNwYXduT2JzZXJ2YWJsZT1mdW5jdGlvbihzb3VyY2UsaWQpe3ZhciBfYTt2YXIgX3RoaXM9dGhpczt2YXIgZW1pdHRlZDt2YXIgc3Vic2NyaXB0aW9uPXNvdXJjZS5zdWJzY3JpYmUoZnVuY3Rpb24odmFsdWUpe2VtaXR0ZWQ9dmFsdWU7X3RoaXMuc2VuZCgoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy50b1NDWE1MRXZlbnQpKHZhbHVlLHtvcmlnaW46aWR9KSk7fSxmdW5jdGlvbihlcnIpe190aGlzLnJlbW92ZUNoaWxkKGlkKTtfdGhpcy5zZW5kKCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnRvU0NYTUxFdmVudCkoKDAsX2FjdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5lcnJvcikoaWQsZXJyKSx7b3JpZ2luOmlkfSkpO30sZnVuY3Rpb24oKXtfdGhpcy5yZW1vdmVDaGlsZChpZCk7X3RoaXMuc2VuZCgoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy50b1NDWE1MRXZlbnQpKCgwLF9hY3Rpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uZG9uZUludm9rZSkoaWQpLHtvcmlnaW46aWR9KSk7fSk7dmFyIGFjdG9yPShfYT17aWQ6aWQsc2VuZDpmdW5jdGlvbiBzZW5kKCl7cmV0dXJuIHZvaWQgMDt9LHN1YnNjcmliZTpmdW5jdGlvbiBzdWJzY3JpYmUobmV4dCxoYW5kbGVFcnJvcixjb21wbGV0ZSl7cmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV4dCxoYW5kbGVFcnJvcixjb21wbGV0ZSk7fSxzdG9wOmZ1bmN0aW9uIHN0b3AoKXtyZXR1cm4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7fSxnZXRTbmFwc2hvdDpmdW5jdGlvbiBnZXRTbmFwc2hvdCgpe3JldHVybiBlbWl0dGVkO30sdG9KU09OOmZ1bmN0aW9uIHRvSlNPTigpe3JldHVybntpZDppZH07fX0sX2FbX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uc3ltYm9sT2JzZXJ2YWJsZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpczt9LF9hKTt0aGlzLmNoaWxkcmVuLnNldChpZCxhY3Rvcik7cmV0dXJuIGFjdG9yO307SW50ZXJwcmV0ZXIucHJvdG90eXBlLnNwYXduQWN0b3I9ZnVuY3Rpb24oYWN0b3IsbmFtZSl7dGhpcy5jaGlsZHJlbi5zZXQobmFtZSxhY3Rvcik7cmV0dXJuIGFjdG9yO307SW50ZXJwcmV0ZXIucHJvdG90eXBlLnNwYXduQWN0aXZpdHk9ZnVuY3Rpb24oYWN0aXZpdHkpe3ZhciBpbXBsZW1lbnRhdGlvbj10aGlzLm1hY2hpbmUub3B0aW9ucyYmdGhpcy5tYWNoaW5lLm9wdGlvbnMuYWN0aXZpdGllcz90aGlzLm1hY2hpbmUub3B0aW9ucy5hY3Rpdml0aWVzW2FjdGl2aXR5LnR5cGVdOnVuZGVmaW5lZDtpZighaW1wbGVtZW50YXRpb24pe2lmKCFfZW52aXJvbm1lbnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5JU19QUk9EVUNUSU9OKXsoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy53YXJuKShmYWxzZSxcXFwiTm8gaW1wbGVtZW50YXRpb24gZm91bmQgZm9yIGFjdGl2aXR5ICdcXFwiLmNvbmNhdChhY3Rpdml0eS50eXBlLFxcXCInXFxcIikpO30vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxcbnJldHVybjt9Ly8gU3RhcnQgaW1wbGVtZW50YXRpb25cXG52YXIgZGlzcG9zZT1pbXBsZW1lbnRhdGlvbih0aGlzLnN0YXRlLmNvbnRleHQsYWN0aXZpdHkpO3RoaXMuc3Bhd25FZmZlY3QoYWN0aXZpdHkuaWQsZGlzcG9zZSk7fTtJbnRlcnByZXRlci5wcm90b3R5cGUuc3Bhd25FZmZlY3Q9ZnVuY3Rpb24oaWQsZGlzcG9zZSl7dmFyIF9hO3RoaXMuY2hpbGRyZW4uc2V0KGlkLChfYT17aWQ6aWQsc2VuZDpmdW5jdGlvbiBzZW5kKCl7cmV0dXJuIHZvaWQgMDt9LHN1YnNjcmliZTpmdW5jdGlvbiBzdWJzY3JpYmUoKXtyZXR1cm57dW5zdWJzY3JpYmU6ZnVuY3Rpb24gdW5zdWJzY3JpYmUoKXtyZXR1cm4gdm9pZCAwO319O30sc3RvcDpkaXNwb3NlfHx1bmRlZmluZWQsZ2V0U25hcHNob3Q6ZnVuY3Rpb24gZ2V0U25hcHNob3QoKXtyZXR1cm4gdW5kZWZpbmVkO30sdG9KU09OOmZ1bmN0aW9uIHRvSlNPTigpe3JldHVybntpZDppZH07fX0sX2FbX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uc3ltYm9sT2JzZXJ2YWJsZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpczt9LF9hKSk7fTtJbnRlcnByZXRlci5wcm90b3R5cGUuYXR0YWNoRGV2PWZ1bmN0aW9uKCl7dmFyIGdsb2JhbD0oMCxfZGV2VG9vbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEyX18uZ2V0R2xvYmFsKSgpO2lmKHRoaXMub3B0aW9ucy5kZXZUb29scyYmZ2xvYmFsKXtpZihnbG9iYWwuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXyl7dmFyIGRldlRvb2xzT3B0aW9ucz1fdHlwZW9mMih0aGlzLm9wdGlvbnMuZGV2VG9vbHMpPT09J29iamVjdCc/dGhpcy5vcHRpb25zLmRldlRvb2xzOnVuZGVmaW5lZDt0aGlzLmRldlRvb2xzPWdsb2JhbC5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fLmNvbm5lY3QoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5fX2Fzc2lnbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5fX2Fzc2lnbikoe25hbWU6dGhpcy5pZCxhdXRvUGF1c2U6dHJ1ZSxzdGF0ZVNhbml0aXplcjpmdW5jdGlvbiBzdGF0ZVNhbml0aXplcihzdGF0ZSl7cmV0dXJue3ZhbHVlOnN0YXRlLnZhbHVlLGNvbnRleHQ6c3RhdGUuY29udGV4dCxhY3Rpb25zOnN0YXRlLmFjdGlvbnN9O319LGRldlRvb2xzT3B0aW9ucykse2ZlYXR1cmVzOigwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uX19hc3NpZ24pKHtqdW1wOmZhbHNlLHNraXA6ZmFsc2V9LGRldlRvb2xzT3B0aW9ucz9kZXZUb29sc09wdGlvbnMuZmVhdHVyZXM6dW5kZWZpbmVkKX0pLHRoaXMubWFjaGluZSk7dGhpcy5kZXZUb29scy5pbml0KHRoaXMuc3RhdGUpO30vLyBhZGQgWFN0YXRlLXNwZWNpZmljIGRldiB0b29saW5nIGhvb2tcXG4oMCxfZGV2VG9vbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEyX18ucmVnaXN0ZXJTZXJ2aWNlKSh0aGlzKTt9fTtJbnRlcnByZXRlci5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue2lkOnRoaXMuaWR9O307SW50ZXJwcmV0ZXIucHJvdG90eXBlW191dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnN5bWJvbE9ic2VydmFibGVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM7fTtJbnRlcnByZXRlci5wcm90b3R5cGUuZ2V0U25hcHNob3Q9ZnVuY3Rpb24oKXtpZih0aGlzLnN0YXR1cz09PV9JbnRlcnByZXRlclN0YXR1cy5Ob3RTdGFydGVkKXtyZXR1cm4gdGhpcy5pbml0aWFsU3RhdGU7fXJldHVybiB0aGlzLl9zdGF0ZTt9Oy8qKlxcclxcbiAgICogVGhlIGRlZmF1bHQgaW50ZXJwcmV0ZXIgb3B0aW9uczpcXHJcXG4gICAqXFxyXFxuICAgKiAtIGBjbG9ja2AgdXNlcyB0aGUgZ2xvYmFsIGBzZXRUaW1lb3V0YCBhbmQgYGNsZWFyVGltZW91dGAgZnVuY3Rpb25zXFxyXFxuICAgKiAtIGBsb2dnZXJgIHVzZXMgdGhlIGdsb2JhbCBgY29uc29sZS5sb2coKWAgbWV0aG9kXFxyXFxuICAgKi9JbnRlcnByZXRlci5kZWZhdWx0T3B0aW9ucz17ZXhlY3V0ZTp0cnVlLGRlZmVyRXZlbnRzOnRydWUsY2xvY2s6e3NldFRpbWVvdXQ6ZnVuY3Rpb24oX3NldFRpbWVvdXQpe2Z1bmN0aW9uIHNldFRpbWVvdXQoX3gsX3gyKXtyZXR1cm4gX3NldFRpbWVvdXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO31zZXRUaW1lb3V0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIF9zZXRUaW1lb3V0LnRvU3RyaW5nKCk7fTtyZXR1cm4gc2V0VGltZW91dDt9KGZ1bmN0aW9uKGZuLG1zKXtyZXR1cm4gc2V0VGltZW91dChmbixtcyk7fSksY2xlYXJUaW1lb3V0OmZ1bmN0aW9uKF9jbGVhclRpbWVvdXQpe2Z1bmN0aW9uIGNsZWFyVGltZW91dChfeDMpe3JldHVybiBfY2xlYXJUaW1lb3V0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9Y2xlYXJUaW1lb3V0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIF9jbGVhclRpbWVvdXQudG9TdHJpbmcoKTt9O3JldHVybiBjbGVhclRpbWVvdXQ7fShmdW5jdGlvbihpZCl7cmV0dXJuIGNsZWFyVGltZW91dChpZCk7fSl9LGxvZ2dlcjovKiNfX1BVUkVfXyovY29uc29sZS5sb2cuYmluZChjb25zb2xlKSxkZXZUb29sczpmYWxzZX07SW50ZXJwcmV0ZXIuaW50ZXJwcmV0PV9pbnRlcnByZXQ7cmV0dXJuIEludGVycHJldGVyO30oKTt2YXIgcmVzb2x2ZVNwYXduT3B0aW9ucz1mdW5jdGlvbiByZXNvbHZlU3Bhd25PcHRpb25zKG5hbWVPck9wdGlvbnMpe2lmKCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmlzU3RyaW5nKShuYW1lT3JPcHRpb25zKSl7cmV0dXJuKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5fX2Fzc2lnbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5fX2Fzc2lnbikoe30sREVGQVVMVF9TUEFXTl9PUFRJT05TKSx7bmFtZTpuYW1lT3JPcHRpb25zfSk7fXJldHVybigwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uX19hc3NpZ24pKHt9LERFRkFVTFRfU1BBV05fT1BUSU9OUykse25hbWU6KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18udW5pcXVlSWQpKCl9KSxuYW1lT3JPcHRpb25zKTt9O2Z1bmN0aW9uIF9zcGF3bihlbnRpdHksbmFtZU9yT3B0aW9ucyl7dmFyIHJlc29sdmVkT3B0aW9ucz1yZXNvbHZlU3Bhd25PcHRpb25zKG5hbWVPck9wdGlvbnMpO3JldHVybigwLF9zZXJ2aWNlU2NvcGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXy5jb25zdW1lKShmdW5jdGlvbihzZXJ2aWNlKXtpZighX2Vudmlyb25tZW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uSVNfUFJPRFVDVElPTil7dmFyIGlzTGF6eUVudGl0eT0oMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5pc01hY2hpbmUpKGVudGl0eSl8fCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmlzRnVuY3Rpb24pKGVudGl0eSk7KDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ud2FybikoISFzZXJ2aWNlfHxpc0xhenlFbnRpdHksXFxcIkF0dGVtcHRlZCB0byBzcGF3biBhbiBBY3RvciAoSUQ6IFxcXFxcXFwiXFxcIi5jb25jYXQoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaXNNYWNoaW5lKShlbnRpdHkpP2VudGl0eS5pZDondW5kZWZpbmVkJyxcXFwiXFxcXFxcXCIpIG91dHNpZGUgb2YgYSBzZXJ2aWNlLiBUaGlzIHdpbGwgaGF2ZSBubyBlZmZlY3QuXFxcIikpO31pZihzZXJ2aWNlKXtyZXR1cm4gc2VydmljZS5zcGF3bihlbnRpdHkscmVzb2x2ZWRPcHRpb25zLm5hbWUscmVzb2x2ZWRPcHRpb25zKTt9ZWxzZXtyZXR1cm4oMCxfQWN0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18uY3JlYXRlRGVmZXJyZWRBY3RvcikoZW50aXR5LHJlc29sdmVkT3B0aW9ucy5uYW1lKTt9fSk7fS8qKlxcclxcbiAqIENyZWF0ZXMgYSBuZXcgSW50ZXJwcmV0ZXIgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBtYWNoaW5lIHdpdGggdGhlIHByb3ZpZGVkIG9wdGlvbnMsIGlmIGFueS5cXHJcXG4gKlxcclxcbiAqIEBwYXJhbSBtYWNoaW5lIFRoZSBtYWNoaW5lIHRvIGludGVycHJldFxcclxcbiAqIEBwYXJhbSBvcHRpb25zIEludGVycHJldGVyIG9wdGlvbnNcXHJcXG4gKi9mdW5jdGlvbiBfaW50ZXJwcmV0KG1hY2hpbmUsb3B0aW9ucyl7dmFyIGludGVycHJldGVyPW5ldyBfSW50ZXJwcmV0ZXIobWFjaGluZSxvcHRpb25zKTtyZXR1cm4gaW50ZXJwcmV0ZXI7fS8qKiovfSwvKioqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvaW52b2tlVXRpbHMuanNcXFwiOi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxcXFxuICAhKioqIC4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9pbnZva2VVdGlscy5qcyAqKiohXFxuICBcXFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKiovZnVuY3Rpb24gbm9kZV9tb2R1bGVzWHN0YXRlRXNJbnZva2VVdGlsc0pzKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyl7XFxcInVzZSBzdHJpY3RcXFwiO19fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsvKiBoYXJtb255IGV4cG9ydCAqL19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHsvKiBoYXJtb255IGV4cG9ydCAqL3RvSW52b2tlRGVmaW5pdGlvbjpmdW5jdGlvbiB0b0ludm9rZURlZmluaXRpb24oKXtyZXR1cm4oLyogYmluZGluZyAqL190b0ludm9rZURlZmluaXRpb24pO30sLyogaGFybW9ueSBleHBvcnQgKi90b0ludm9rZVNvdXJjZTpmdW5jdGlvbiB0b0ludm9rZVNvdXJjZSgpe3JldHVybigvKiBiaW5kaW5nICovX3RvSW52b2tlU291cmNlKTt9LyogaGFybW9ueSBleHBvcnQgKi99KTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vX3ZpcnR1YWwvX3RzbGliLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9fdmlydHVhbC9fdHNsaWIuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfYWN0aW9uVHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2FjdGlvblR5cGVzLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9hY3Rpb25UeXBlcy5qc1xcXCIpO2Z1bmN0aW9uIF90b0ludm9rZVNvdXJjZShzcmMpe2lmKHR5cGVvZiBzcmM9PT0nc3RyaW5nJyl7dmFyIHNpbXBsZVNyYz17dHlwZTpzcmN9O3NpbXBsZVNyYy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBzcmM7fTsvLyB2NCBjb21wYXQgLSBUT0RPOiByZW1vdmUgaW4gdjVcXG5yZXR1cm4gc2ltcGxlU3JjO31yZXR1cm4gc3JjO31mdW5jdGlvbiBfdG9JbnZva2VEZWZpbml0aW9uKGludm9rZUNvbmZpZyl7cmV0dXJuKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5fX2Fzc2lnbikoKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5fX2Fzc2lnbikoe3R5cGU6X2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaW52b2tlfSxpbnZva2VDb25maWcpLHt0b0pTT046ZnVuY3Rpb24gdG9KU09OKCl7aW52b2tlQ29uZmlnLm9uRG9uZTtpbnZva2VDb25maWcub25FcnJvcjt2YXIgaW52b2tlRGVmPSgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uX19yZXN0KShpbnZva2VDb25maWcsW1xcXCJvbkRvbmVcXFwiLFxcXCJvbkVycm9yXFxcIl0pO3JldHVybigwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uX19hc3NpZ24pKHt9LGludm9rZURlZikse3R5cGU6X2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaW52b2tlLHNyYzpfdG9JbnZva2VTb3VyY2UoaW52b2tlQ29uZmlnLnNyYyl9KTt9fSk7fS8qKiovfSwvKioqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvbWFwU3RhdGUuanNcXFwiOi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxcXFxuICAhKioqIC4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9tYXBTdGF0ZS5qcyAqKiohXFxuICBcXFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKiovZnVuY3Rpb24gbm9kZV9tb2R1bGVzWHN0YXRlRXNNYXBTdGF0ZUpzKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyl7XFxcInVzZSBzdHJpY3RcXFwiO19fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsvKiBoYXJtb255IGV4cG9ydCAqL19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHsvKiBoYXJtb255IGV4cG9ydCAqL21hcFN0YXRlOmZ1bmN0aW9uIG1hcFN0YXRlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fbWFwU3RhdGUpO30vKiBoYXJtb255IGV4cG9ydCAqL30pOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9fdmlydHVhbC9fdHNsaWIuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL192aXJ0dWFsL190c2xpYi5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vdXRpbHMuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3V0aWxzLmpzXFxcIik7ZnVuY3Rpb24gX21hcFN0YXRlKHN0YXRlTWFwLHN0YXRlSWQpe3ZhciBlXzEsX2E7dmFyIGZvdW5kU3RhdGVJZDt0cnl7Zm9yKHZhciBfYj0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLl9fdmFsdWVzKShPYmplY3Qua2V5cyhzdGF0ZU1hcCkpLF9jPV9iLm5leHQoKTshX2MuZG9uZTtfYz1fYi5uZXh0KCkpe3ZhciBtYXBwZWRTdGF0ZUlkPV9jLnZhbHVlO2lmKCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLm1hdGNoZXNTdGF0ZSkobWFwcGVkU3RhdGVJZCxzdGF0ZUlkKSYmKCFmb3VuZFN0YXRlSWR8fHN0YXRlSWQubGVuZ3RoPmZvdW5kU3RhdGVJZC5sZW5ndGgpKXtmb3VuZFN0YXRlSWQ9bWFwcGVkU3RhdGVJZDt9fX1jYXRjaChlXzFfMSl7ZV8xPXtlcnJvcjplXzFfMX07fWZpbmFsbHl7dHJ5e2lmKF9jJiYhX2MuZG9uZSYmKF9hPV9iW1xcXCJyZXR1cm5cXFwiXSkpX2EuY2FsbChfYik7fWZpbmFsbHl7aWYoZV8xKXRocm93IGVfMS5lcnJvcjt9fXJldHVybiBzdGF0ZU1hcFtmb3VuZFN0YXRlSWRdO30vKioqL30sLyoqKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL21hdGNoLmpzXFxcIjovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcXFxcbiAgISoqKiAuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvbWF0Y2guanMgKioqIVxcbiAgXFxcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAvKioqL2Z1bmN0aW9uIG5vZGVfbW9kdWxlc1hzdGF0ZUVzTWF0Y2hKcyhfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18pe1xcXCJ1c2Ugc3RyaWN0XFxcIjtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7LyogaGFybW9ueSBleHBvcnQgKi9fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXyx7LyogaGFybW9ueSBleHBvcnQgKi9tYXRjaFN0YXRlOmZ1bmN0aW9uIG1hdGNoU3RhdGUoKXtyZXR1cm4oLyogYmluZGluZyAqL19tYXRjaFN0YXRlKTt9LyogaGFybW9ueSBleHBvcnQgKi99KTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vX3ZpcnR1YWwvX3RzbGliLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9fdmlydHVhbC9fdHNsaWIuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfU3RhdGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL1N0YXRlLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9TdGF0ZS5qc1xcXCIpO2Z1bmN0aW9uIF9tYXRjaFN0YXRlKHN0YXRlLHBhdHRlcm5zLGRlZmF1bHRWYWx1ZSl7dmFyIGVfMSxfYTt2YXIgcmVzb2x2ZWRTdGF0ZT1fU3RhdGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5TdGF0ZS5mcm9tKHN0YXRlLHN0YXRlIGluc3RhbmNlb2YgX1N0YXRlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uU3RhdGU/c3RhdGUuY29udGV4dDp1bmRlZmluZWQpO3RyeXtmb3IodmFyIHBhdHRlcm5zXzE9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5fX3ZhbHVlcykocGF0dGVybnMpLHBhdHRlcm5zXzFfMT1wYXR0ZXJuc18xLm5leHQoKTshcGF0dGVybnNfMV8xLmRvbmU7cGF0dGVybnNfMV8xPXBhdHRlcm5zXzEubmV4dCgpKXt2YXIgX2I9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5fX3JlYWQpKHBhdHRlcm5zXzFfMS52YWx1ZSwyKSxzdGF0ZVZhbHVlPV9iWzBdLGdldFZhbHVlPV9iWzFdO2lmKHJlc29sdmVkU3RhdGUubWF0Y2hlcyhzdGF0ZVZhbHVlKSl7cmV0dXJuIGdldFZhbHVlKHJlc29sdmVkU3RhdGUpO319fWNhdGNoKGVfMV8xKXtlXzE9e2Vycm9yOmVfMV8xfTt9ZmluYWxseXt0cnl7aWYocGF0dGVybnNfMV8xJiYhcGF0dGVybnNfMV8xLmRvbmUmJihfYT1wYXR0ZXJuc18xW1xcXCJyZXR1cm5cXFwiXSkpX2EuY2FsbChwYXR0ZXJuc18xKTt9ZmluYWxseXtpZihlXzEpdGhyb3cgZV8xLmVycm9yO319cmV0dXJuIGRlZmF1bHRWYWx1ZShyZXNvbHZlZFN0YXRlKTt9LyoqKi99LC8qKiovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9yZWdpc3RyeS5qc1xcXCI6LyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXFxcXG4gICEqKiogLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3JlZ2lzdHJ5LmpzICoqKiFcXG4gIFxcXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqKi9mdW5jdGlvbiBub2RlX21vZHVsZXNYc3RhdGVFc1JlZ2lzdHJ5SnMoX191bnVzZWRfd2VicGFja19tb2R1bGUsX193ZWJwYWNrX2V4cG9ydHNfXyxfX3dlYnBhY2tfcmVxdWlyZV9fKXtcXFwidXNlIHN0cmljdFxcXCI7X193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOy8qIGhhcm1vbnkgZXhwb3J0ICovX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sey8qIGhhcm1vbnkgZXhwb3J0ICovcmVnaXN0cnk6ZnVuY3Rpb24gcmVnaXN0cnkoKXtyZXR1cm4oLyogYmluZGluZyAqL19yZWdpc3RyeSk7fS8qIGhhcm1vbnkgZXhwb3J0ICovfSk7dmFyIGNoaWxkcmVuPS8qI19fUFVSRV9fKi9uZXcgTWFwKCk7dmFyIHNlc3Npb25JZEluZGV4PTA7dmFyIF9yZWdpc3RyeT17Ym9va0lkOmZ1bmN0aW9uIGJvb2tJZCgpe3JldHVyblxcXCJ4OlxcXCIuY29uY2F0KHNlc3Npb25JZEluZGV4KyspO30scmVnaXN0ZXI6ZnVuY3Rpb24gcmVnaXN0ZXIoaWQsYWN0b3Ipe2NoaWxkcmVuLnNldChpZCxhY3Rvcik7cmV0dXJuIGlkO30sZ2V0OmZ1bmN0aW9uIGdldChpZCl7cmV0dXJuIGNoaWxkcmVuLmdldChpZCk7fSxmcmVlOmZ1bmN0aW9uIGZyZWUoaWQpe2NoaWxkcmVuW1xcXCJkZWxldGVcXFwiXShpZCk7fX07LyoqKi99LC8qKiovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9zY2hlZHVsZXIuanNcXFwiOi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcXFxcbiAgISoqKiAuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvc2NoZWR1bGVyLmpzICoqKiFcXG4gIFxcXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKiovZnVuY3Rpb24gbm9kZV9tb2R1bGVzWHN0YXRlRXNTY2hlZHVsZXJKcyhfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18pe1xcXCJ1c2Ugc3RyaWN0XFxcIjtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7LyogaGFybW9ueSBleHBvcnQgKi9fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXyx7LyogaGFybW9ueSBleHBvcnQgKi9TY2hlZHVsZXI6ZnVuY3Rpb24gU2NoZWR1bGVyKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fU2NoZWR1bGVyKTt9LyogaGFybW9ueSBleHBvcnQgKi99KTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vX3ZpcnR1YWwvX3RzbGliLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9fdmlydHVhbC9fdHNsaWIuanNcXFwiKTt2YXIgZGVmYXVsdE9wdGlvbnM9e2RlZmVyRXZlbnRzOmZhbHNlfTt2YXIgX1NjaGVkdWxlcj0vKiNfX1BVUkVfXyovIC8qKiBAY2xhc3MgKi9mdW5jdGlvbigpe2Z1bmN0aW9uIFNjaGVkdWxlcihvcHRpb25zKXt0aGlzLnByb2Nlc3NpbmdFdmVudD1mYWxzZTt0aGlzLnF1ZXVlPVtdO3RoaXMuaW5pdGlhbGl6ZWQ9ZmFsc2U7dGhpcy5vcHRpb25zPSgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uX19hc3NpZ24pKHt9LGRlZmF1bHRPcHRpb25zKSxvcHRpb25zKTt9U2NoZWR1bGVyLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKGNhbGxiYWNrKXt0aGlzLmluaXRpYWxpemVkPXRydWU7aWYoY2FsbGJhY2spe2lmKCF0aGlzLm9wdGlvbnMuZGVmZXJFdmVudHMpe3RoaXMuc2NoZWR1bGUoY2FsbGJhY2spO3JldHVybjt9dGhpcy5wcm9jZXNzKGNhbGxiYWNrKTt9dGhpcy5mbHVzaEV2ZW50cygpO307U2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZT1mdW5jdGlvbih0YXNrKXtpZighdGhpcy5pbml0aWFsaXplZHx8dGhpcy5wcm9jZXNzaW5nRXZlbnQpe3RoaXMucXVldWUucHVzaCh0YXNrKTtyZXR1cm47fWlmKHRoaXMucXVldWUubGVuZ3RoIT09MCl7dGhyb3cgbmV3IEVycm9yKCdFdmVudCBxdWV1ZSBzaG91bGQgYmUgZW1wdHkgd2hlbiBpdCBpcyBub3QgcHJvY2Vzc2luZyBldmVudHMnKTt9dGhpcy5wcm9jZXNzKHRhc2spO3RoaXMuZmx1c2hFdmVudHMoKTt9O1NjaGVkdWxlci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnF1ZXVlPVtdO307U2NoZWR1bGVyLnByb3RvdHlwZS5mbHVzaEV2ZW50cz1mdW5jdGlvbigpe3ZhciBuZXh0Q2FsbGJhY2s9dGhpcy5xdWV1ZS5zaGlmdCgpO3doaWxlKG5leHRDYWxsYmFjayl7dGhpcy5wcm9jZXNzKG5leHRDYWxsYmFjayk7bmV4dENhbGxiYWNrPXRoaXMucXVldWUuc2hpZnQoKTt9fTtTY2hlZHVsZXIucHJvdG90eXBlLnByb2Nlc3M9ZnVuY3Rpb24oY2FsbGJhY2spe3RoaXMucHJvY2Vzc2luZ0V2ZW50PXRydWU7dHJ5e2NhbGxiYWNrKCk7fWNhdGNoKGUpey8vIHRoZXJlIGlzIG5vIHVzZSB0byBrZWVwIHRoZSBmdXR1cmUgZXZlbnRzXFxuLy8gYXMgdGhlIHNpdHVhdGlvbiBpcyBub3QgYW55bW9yZSB0aGUgc2FtZVxcbnRoaXMuY2xlYXIoKTt0aHJvdyBlO31maW5hbGx5e3RoaXMucHJvY2Vzc2luZ0V2ZW50PWZhbHNlO319O3JldHVybiBTY2hlZHVsZXI7fSgpOy8qKiovfSwvKioqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvc2NoZW1hLmpzXFxcIjovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXFxcXG4gICEqKiogLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3NjaGVtYS5qcyAqKiohXFxuICBcXFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAvKioqL2Z1bmN0aW9uIG5vZGVfbW9kdWxlc1hzdGF0ZUVzU2NoZW1hSnMoX191bnVzZWRfd2VicGFja19tb2R1bGUsX193ZWJwYWNrX2V4cG9ydHNfXyxfX3dlYnBhY2tfcmVxdWlyZV9fKXtcXFwidXNlIHN0cmljdFxcXCI7X193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOy8qIGhhcm1vbnkgZXhwb3J0ICovX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sey8qIGhhcm1vbnkgZXhwb3J0ICovY3JlYXRlU2NoZW1hOmZ1bmN0aW9uIGNyZWF0ZVNjaGVtYSgpe3JldHVybigvKiBiaW5kaW5nICovX2NyZWF0ZVNjaGVtYSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3Q6ZnVuY3Rpb24gdCgpe3JldHVybigvKiBiaW5kaW5nICovX3QpO30vKiBoYXJtb255IGV4cG9ydCAqL30pO2Z1bmN0aW9uIF9jcmVhdGVTY2hlbWEoc2NoZW1hKXtyZXR1cm4gc2NoZW1hO312YXIgX3Q9X2NyZWF0ZVNjaGVtYTsvKioqL30sLyoqKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3NlcnZpY2VTY29wZS5qc1xcXCI6LyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxcXFxuICAhKioqIC4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9zZXJ2aWNlU2NvcGUuanMgKioqIVxcbiAgXFxcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqKi9mdW5jdGlvbiBub2RlX21vZHVsZXNYc3RhdGVFc1NlcnZpY2VTY29wZUpzKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyl7XFxcInVzZSBzdHJpY3RcXFwiO19fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsvKiBoYXJtb255IGV4cG9ydCAqL19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHsvKiBoYXJtb255IGV4cG9ydCAqL2NvbnN1bWU6ZnVuY3Rpb24gY29uc3VtZSgpe3JldHVybigvKiBiaW5kaW5nICovX2NvbnN1bWUpO30sLyogaGFybW9ueSBleHBvcnQgKi9wcm92aWRlOmZ1bmN0aW9uIHByb3ZpZGUoKXtyZXR1cm4oLyogYmluZGluZyAqL19wcm92aWRlKTt9LyogaGFybW9ueSBleHBvcnQgKi99KTsvKipcXHJcXG4gKiBNYWludGFpbnMgYSBzdGFjayBvZiB0aGUgY3VycmVudCBzZXJ2aWNlIGluIHNjb3BlLlxcclxcbiAqIFRoaXMgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBjb3JyZWN0IHNlcnZpY2UgdG8gc3Bhd24oKS5cXHJcXG4gKi92YXIgc2VydmljZVN0YWNrPVtdO3ZhciBfcHJvdmlkZT1mdW5jdGlvbiBfcHJvdmlkZShzZXJ2aWNlLGZuKXtzZXJ2aWNlU3RhY2sucHVzaChzZXJ2aWNlKTt2YXIgcmVzdWx0PWZuKHNlcnZpY2UpO3NlcnZpY2VTdGFjay5wb3AoKTtyZXR1cm4gcmVzdWx0O307dmFyIF9jb25zdW1lPWZ1bmN0aW9uIF9jb25zdW1lKGZuKXtyZXR1cm4gZm4oc2VydmljZVN0YWNrW3NlcnZpY2VTdGFjay5sZW5ndGgtMV0pO307LyoqKi99LC8qKiovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9zdGF0ZVV0aWxzLmpzXFxcIjovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxcXFxuICAhKioqIC4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9zdGF0ZVV0aWxzLmpzICoqKiFcXG4gIFxcXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAvKioqL2Z1bmN0aW9uIG5vZGVfbW9kdWxlc1hzdGF0ZUVzU3RhdGVVdGlsc0pzKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyl7XFxcInVzZSBzdHJpY3RcXFwiO19fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsvKiBoYXJtb255IGV4cG9ydCAqL19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHsvKiBoYXJtb255IGV4cG9ydCAqL2dldEFkakxpc3Q6ZnVuY3Rpb24gZ2V0QWRqTGlzdCgpe3JldHVybigvKiBiaW5kaW5nICovX2dldEFkakxpc3QpO30sLyogaGFybW9ueSBleHBvcnQgKi9nZXRBbGxDaGlsZHJlbjpmdW5jdGlvbiBnZXRBbGxDaGlsZHJlbigpe3JldHVybigvKiBiaW5kaW5nICovX2dldEFsbENoaWxkcmVuKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovZ2V0QWxsU3RhdGVOb2RlczpmdW5jdGlvbiBnZXRBbGxTdGF0ZU5vZGVzKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fZ2V0QWxsU3RhdGVOb2Rlcyk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2dldENoaWxkcmVuOmZ1bmN0aW9uIGdldENoaWxkcmVuKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fZ2V0Q2hpbGRyZW4pO30sLyogaGFybW9ueSBleHBvcnQgKi9nZXRDb25maWd1cmF0aW9uOmZ1bmN0aW9uIGdldENvbmZpZ3VyYXRpb24oKXtyZXR1cm4oLyogYmluZGluZyAqL19nZXRDb25maWd1cmF0aW9uKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovZ2V0TWV0YTpmdW5jdGlvbiBnZXRNZXRhKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fZ2V0TWV0YSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2dldFRhZ3NGcm9tQ29uZmlndXJhdGlvbjpmdW5jdGlvbiBnZXRUYWdzRnJvbUNvbmZpZ3VyYXRpb24oKXtyZXR1cm4oLyogYmluZGluZyAqL19nZXRUYWdzRnJvbUNvbmZpZ3VyYXRpb24pO30sLyogaGFybW9ueSBleHBvcnQgKi9nZXRWYWx1ZTpmdW5jdGlvbiBnZXRWYWx1ZSgpe3JldHVybigvKiBiaW5kaW5nICovX2dldFZhbHVlKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovaGFzOmZ1bmN0aW9uIGhhcygpe3JldHVybigvKiBiaW5kaW5nICovX2hhcyk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2lzSW5GaW5hbFN0YXRlOmZ1bmN0aW9uIGlzSW5GaW5hbFN0YXRlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9faXNJbkZpbmFsU3RhdGUpO30sLyogaGFybW9ueSBleHBvcnQgKi9pc0xlYWZOb2RlOmZ1bmN0aW9uIGlzTGVhZk5vZGUoKXtyZXR1cm4oLyogYmluZGluZyAqL19pc0xlYWZOb2RlKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovbmV4dEV2ZW50czpmdW5jdGlvbiBuZXh0RXZlbnRzKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fbmV4dEV2ZW50cyk7fS8qIGhhcm1vbnkgZXhwb3J0ICovfSk7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL192aXJ0dWFsL190c2xpYi5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvX3ZpcnR1YWwvX3RzbGliLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX189X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi91dGlscy5qcyAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvdXRpbHMuanNcXFwiKTt2YXIgX2lzTGVhZk5vZGU9ZnVuY3Rpb24gX2lzTGVhZk5vZGUoc3RhdGVOb2RlKXtyZXR1cm4gc3RhdGVOb2RlLnR5cGU9PT0nYXRvbWljJ3x8c3RhdGVOb2RlLnR5cGU9PT0nZmluYWwnO307ZnVuY3Rpb24gX2dldEFsbENoaWxkcmVuKHN0YXRlTm9kZSl7cmV0dXJuIE9iamVjdC5rZXlzKHN0YXRlTm9kZS5zdGF0ZXMpLm1hcChmdW5jdGlvbihrZXkpe3JldHVybiBzdGF0ZU5vZGUuc3RhdGVzW2tleV07fSk7fWZ1bmN0aW9uIF9nZXRDaGlsZHJlbihzdGF0ZU5vZGUpe3JldHVybiBfZ2V0QWxsQ2hpbGRyZW4oc3RhdGVOb2RlKS5maWx0ZXIoZnVuY3Rpb24oc24pe3JldHVybiBzbi50eXBlIT09J2hpc3RvcnknO30pO31mdW5jdGlvbiBfZ2V0QWxsU3RhdGVOb2RlcyhzdGF0ZU5vZGUpe3ZhciBzdGF0ZU5vZGVzPVtzdGF0ZU5vZGVdO2lmKF9pc0xlYWZOb2RlKHN0YXRlTm9kZSkpe3JldHVybiBzdGF0ZU5vZGVzO31yZXR1cm4gc3RhdGVOb2Rlcy5jb25jYXQoKDAsX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZmxhdHRlbikoX2dldENoaWxkcmVuKHN0YXRlTm9kZSkubWFwKF9nZXRBbGxTdGF0ZU5vZGVzKSkpO31mdW5jdGlvbiBfZ2V0Q29uZmlndXJhdGlvbihwcmV2U3RhdGVOb2RlcyxzdGF0ZU5vZGVzKXt2YXIgZV8xLF9hLGVfMixfYixlXzMsX2MsZV80LF9kO3ZhciBwcmV2Q29uZmlndXJhdGlvbj1uZXcgU2V0KHByZXZTdGF0ZU5vZGVzKTt2YXIgcHJldkFkakxpc3Q9X2dldEFkakxpc3QocHJldkNvbmZpZ3VyYXRpb24pO3ZhciBjb25maWd1cmF0aW9uPW5ldyBTZXQoc3RhdGVOb2Rlcyk7dHJ5ey8vIGFkZCBhbGwgYW5jZXN0b3JzXFxuZm9yKHZhciBjb25maWd1cmF0aW9uXzE9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5fX3ZhbHVlcykoY29uZmlndXJhdGlvbiksY29uZmlndXJhdGlvbl8xXzE9Y29uZmlndXJhdGlvbl8xLm5leHQoKTshY29uZmlndXJhdGlvbl8xXzEuZG9uZTtjb25maWd1cmF0aW9uXzFfMT1jb25maWd1cmF0aW9uXzEubmV4dCgpKXt2YXIgcz1jb25maWd1cmF0aW9uXzFfMS52YWx1ZTt2YXIgbT1zLnBhcmVudDt3aGlsZShtJiYhY29uZmlndXJhdGlvbi5oYXMobSkpe2NvbmZpZ3VyYXRpb24uYWRkKG0pO209bS5wYXJlbnQ7fX19Y2F0Y2goZV8xXzEpe2VfMT17ZXJyb3I6ZV8xXzF9O31maW5hbGx5e3RyeXtpZihjb25maWd1cmF0aW9uXzFfMSYmIWNvbmZpZ3VyYXRpb25fMV8xLmRvbmUmJihfYT1jb25maWd1cmF0aW9uXzFbXFxcInJldHVyblxcXCJdKSlfYS5jYWxsKGNvbmZpZ3VyYXRpb25fMSk7fWZpbmFsbHl7aWYoZV8xKXRocm93IGVfMS5lcnJvcjt9fXZhciBhZGpMaXN0PV9nZXRBZGpMaXN0KGNvbmZpZ3VyYXRpb24pO3RyeXsvLyBhZGQgZGVzY2VuZGFudHNcXG5mb3IodmFyIGNvbmZpZ3VyYXRpb25fMj0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLl9fdmFsdWVzKShjb25maWd1cmF0aW9uKSxjb25maWd1cmF0aW9uXzJfMT1jb25maWd1cmF0aW9uXzIubmV4dCgpOyFjb25maWd1cmF0aW9uXzJfMS5kb25lO2NvbmZpZ3VyYXRpb25fMl8xPWNvbmZpZ3VyYXRpb25fMi5uZXh0KCkpe3ZhciBzPWNvbmZpZ3VyYXRpb25fMl8xLnZhbHVlOy8vIGlmIHByZXZpb3VzbHkgYWN0aXZlLCBhZGQgZXhpc3RpbmcgY2hpbGQgbm9kZXNcXG5pZihzLnR5cGU9PT0nY29tcG91bmQnJiYoIWFkakxpc3QuZ2V0KHMpfHwhYWRqTGlzdC5nZXQocykubGVuZ3RoKSl7aWYocHJldkFkakxpc3QuZ2V0KHMpKXtwcmV2QWRqTGlzdC5nZXQocykuZm9yRWFjaChmdW5jdGlvbihzbil7cmV0dXJuIGNvbmZpZ3VyYXRpb24uYWRkKHNuKTt9KTt9ZWxzZXtzLmluaXRpYWxTdGF0ZU5vZGVzLmZvckVhY2goZnVuY3Rpb24oc24pe3JldHVybiBjb25maWd1cmF0aW9uLmFkZChzbik7fSk7fX1lbHNle2lmKHMudHlwZT09PSdwYXJhbGxlbCcpe3RyeXtmb3IodmFyIF9lPShlXzM9dm9pZCAwLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uX192YWx1ZXMpKF9nZXRDaGlsZHJlbihzKSkpLF9mPV9lLm5leHQoKTshX2YuZG9uZTtfZj1fZS5uZXh0KCkpe3ZhciBjaGlsZD1fZi52YWx1ZTtpZighY29uZmlndXJhdGlvbi5oYXMoY2hpbGQpKXtjb25maWd1cmF0aW9uLmFkZChjaGlsZCk7aWYocHJldkFkakxpc3QuZ2V0KGNoaWxkKSl7cHJldkFkakxpc3QuZ2V0KGNoaWxkKS5mb3JFYWNoKGZ1bmN0aW9uKHNuKXtyZXR1cm4gY29uZmlndXJhdGlvbi5hZGQoc24pO30pO31lbHNle2NoaWxkLmluaXRpYWxTdGF0ZU5vZGVzLmZvckVhY2goZnVuY3Rpb24oc24pe3JldHVybiBjb25maWd1cmF0aW9uLmFkZChzbik7fSk7fX19fWNhdGNoKGVfM18xKXtlXzM9e2Vycm9yOmVfM18xfTt9ZmluYWxseXt0cnl7aWYoX2YmJiFfZi5kb25lJiYoX2M9X2VbXFxcInJldHVyblxcXCJdKSlfYy5jYWxsKF9lKTt9ZmluYWxseXtpZihlXzMpdGhyb3cgZV8zLmVycm9yO319fX19fWNhdGNoKGVfMl8xKXtlXzI9e2Vycm9yOmVfMl8xfTt9ZmluYWxseXt0cnl7aWYoY29uZmlndXJhdGlvbl8yXzEmJiFjb25maWd1cmF0aW9uXzJfMS5kb25lJiYoX2I9Y29uZmlndXJhdGlvbl8yW1xcXCJyZXR1cm5cXFwiXSkpX2IuY2FsbChjb25maWd1cmF0aW9uXzIpO31maW5hbGx5e2lmKGVfMil0aHJvdyBlXzIuZXJyb3I7fX10cnl7Ly8gYWRkIGFsbCBhbmNlc3RvcnNcXG5mb3IodmFyIGNvbmZpZ3VyYXRpb25fMz0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLl9fdmFsdWVzKShjb25maWd1cmF0aW9uKSxjb25maWd1cmF0aW9uXzNfMT1jb25maWd1cmF0aW9uXzMubmV4dCgpOyFjb25maWd1cmF0aW9uXzNfMS5kb25lO2NvbmZpZ3VyYXRpb25fM18xPWNvbmZpZ3VyYXRpb25fMy5uZXh0KCkpe3ZhciBzPWNvbmZpZ3VyYXRpb25fM18xLnZhbHVlO3ZhciBtPXMucGFyZW50O3doaWxlKG0mJiFjb25maWd1cmF0aW9uLmhhcyhtKSl7Y29uZmlndXJhdGlvbi5hZGQobSk7bT1tLnBhcmVudDt9fX1jYXRjaChlXzRfMSl7ZV80PXtlcnJvcjplXzRfMX07fWZpbmFsbHl7dHJ5e2lmKGNvbmZpZ3VyYXRpb25fM18xJiYhY29uZmlndXJhdGlvbl8zXzEuZG9uZSYmKF9kPWNvbmZpZ3VyYXRpb25fM1tcXFwicmV0dXJuXFxcIl0pKV9kLmNhbGwoY29uZmlndXJhdGlvbl8zKTt9ZmluYWxseXtpZihlXzQpdGhyb3cgZV80LmVycm9yO319cmV0dXJuIGNvbmZpZ3VyYXRpb247fWZ1bmN0aW9uIGdldFZhbHVlRnJvbUFkaihiYXNlTm9kZSxhZGpMaXN0KXt2YXIgY2hpbGRTdGF0ZU5vZGVzPWFkakxpc3QuZ2V0KGJhc2VOb2RlKTtpZighY2hpbGRTdGF0ZU5vZGVzKXtyZXR1cm57fTsvLyB0b2RvOiBmaXg/XFxufWlmKGJhc2VOb2RlLnR5cGU9PT0nY29tcG91bmQnKXt2YXIgY2hpbGRTdGF0ZU5vZGU9Y2hpbGRTdGF0ZU5vZGVzWzBdO2lmKGNoaWxkU3RhdGVOb2RlKXtpZihfaXNMZWFmTm9kZShjaGlsZFN0YXRlTm9kZSkpe3JldHVybiBjaGlsZFN0YXRlTm9kZS5rZXk7fX1lbHNle3JldHVybnt9O319dmFyIHN0YXRlVmFsdWU9e307Y2hpbGRTdGF0ZU5vZGVzLmZvckVhY2goZnVuY3Rpb24oY3NuKXtzdGF0ZVZhbHVlW2Nzbi5rZXldPWdldFZhbHVlRnJvbUFkaihjc24sYWRqTGlzdCk7fSk7cmV0dXJuIHN0YXRlVmFsdWU7fWZ1bmN0aW9uIF9nZXRBZGpMaXN0KGNvbmZpZ3VyYXRpb24pe3ZhciBlXzUsX2E7dmFyIGFkakxpc3Q9bmV3IE1hcCgpO3RyeXtmb3IodmFyIGNvbmZpZ3VyYXRpb25fND0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLl9fdmFsdWVzKShjb25maWd1cmF0aW9uKSxjb25maWd1cmF0aW9uXzRfMT1jb25maWd1cmF0aW9uXzQubmV4dCgpOyFjb25maWd1cmF0aW9uXzRfMS5kb25lO2NvbmZpZ3VyYXRpb25fNF8xPWNvbmZpZ3VyYXRpb25fNC5uZXh0KCkpe3ZhciBzPWNvbmZpZ3VyYXRpb25fNF8xLnZhbHVlO2lmKCFhZGpMaXN0LmhhcyhzKSl7YWRqTGlzdC5zZXQocyxbXSk7fWlmKHMucGFyZW50KXtpZighYWRqTGlzdC5oYXMocy5wYXJlbnQpKXthZGpMaXN0LnNldChzLnBhcmVudCxbXSk7fWFkakxpc3QuZ2V0KHMucGFyZW50KS5wdXNoKHMpO319fWNhdGNoKGVfNV8xKXtlXzU9e2Vycm9yOmVfNV8xfTt9ZmluYWxseXt0cnl7aWYoY29uZmlndXJhdGlvbl80XzEmJiFjb25maWd1cmF0aW9uXzRfMS5kb25lJiYoX2E9Y29uZmlndXJhdGlvbl80W1xcXCJyZXR1cm5cXFwiXSkpX2EuY2FsbChjb25maWd1cmF0aW9uXzQpO31maW5hbGx5e2lmKGVfNSl0aHJvdyBlXzUuZXJyb3I7fX1yZXR1cm4gYWRqTGlzdDt9ZnVuY3Rpb24gX2dldFZhbHVlKHJvb3ROb2RlLGNvbmZpZ3VyYXRpb24pe3ZhciBjb25maWc9X2dldENvbmZpZ3VyYXRpb24oW3Jvb3ROb2RlXSxjb25maWd1cmF0aW9uKTtyZXR1cm4gZ2V0VmFsdWVGcm9tQWRqKHJvb3ROb2RlLF9nZXRBZGpMaXN0KGNvbmZpZykpO31mdW5jdGlvbiBfaGFzKGl0ZXJhYmxlLGl0ZW0pe2lmKEFycmF5LmlzQXJyYXkoaXRlcmFibGUpKXtyZXR1cm4gaXRlcmFibGUuc29tZShmdW5jdGlvbihtZW1iZXIpe3JldHVybiBtZW1iZXI9PT1pdGVtO30pO31pZihpdGVyYWJsZSBpbnN0YW5jZW9mIFNldCl7cmV0dXJuIGl0ZXJhYmxlLmhhcyhpdGVtKTt9cmV0dXJuIGZhbHNlOy8vIFRPRE86IGZpeFxcbn1mdW5jdGlvbiBfbmV4dEV2ZW50cyhjb25maWd1cmF0aW9uKXtyZXR1cm4oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLl9fc3ByZWFkQXJyYXkpKFtdLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uX19yZWFkKShuZXcgU2V0KCgwLF91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmZsYXR0ZW4pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uX19zcHJlYWRBcnJheSkoW10sKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5fX3JlYWQpKGNvbmZpZ3VyYXRpb24ubWFwKGZ1bmN0aW9uKHNuKXtyZXR1cm4gc24ub3duRXZlbnRzO30pKSxmYWxzZSkpKSksZmFsc2UpO31mdW5jdGlvbiBfaXNJbkZpbmFsU3RhdGUoY29uZmlndXJhdGlvbixzdGF0ZU5vZGUpe2lmKHN0YXRlTm9kZS50eXBlPT09J2NvbXBvdW5kJyl7cmV0dXJuIF9nZXRDaGlsZHJlbihzdGF0ZU5vZGUpLnNvbWUoZnVuY3Rpb24ocyl7cmV0dXJuIHMudHlwZT09PSdmaW5hbCcmJl9oYXMoY29uZmlndXJhdGlvbixzKTt9KTt9aWYoc3RhdGVOb2RlLnR5cGU9PT0ncGFyYWxsZWwnKXtyZXR1cm4gX2dldENoaWxkcmVuKHN0YXRlTm9kZSkuZXZlcnkoZnVuY3Rpb24oc24pe3JldHVybiBfaXNJbkZpbmFsU3RhdGUoY29uZmlndXJhdGlvbixzbik7fSk7fXJldHVybiBmYWxzZTt9ZnVuY3Rpb24gX2dldE1ldGEoY29uZmlndXJhdGlvbil7aWYoY29uZmlndXJhdGlvbj09PXZvaWQgMCl7Y29uZmlndXJhdGlvbj1bXTt9cmV0dXJuIGNvbmZpZ3VyYXRpb24ucmVkdWNlKGZ1bmN0aW9uKGFjYyxzdGF0ZU5vZGUpe2lmKHN0YXRlTm9kZS5tZXRhIT09dW5kZWZpbmVkKXthY2Nbc3RhdGVOb2RlLmlkXT1zdGF0ZU5vZGUubWV0YTt9cmV0dXJuIGFjYzt9LHt9KTt9ZnVuY3Rpb24gX2dldFRhZ3NGcm9tQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKXtyZXR1cm4gbmV3IFNldCgoMCxfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5mbGF0dGVuKShjb25maWd1cmF0aW9uLm1hcChmdW5jdGlvbihzbil7cmV0dXJuIHNuLnRhZ3M7fSkpKTt9LyoqKi99LC8qKiovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy90eXBlcy5qc1xcXCI6LyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXFxcXG4gICEqKiogLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3R5cGVzLmpzICoqKiFcXG4gIFxcXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqKi9mdW5jdGlvbiBub2RlX21vZHVsZXNYc3RhdGVFc1R5cGVzSnMoX191bnVzZWRfd2VicGFja19tb2R1bGUsX193ZWJwYWNrX2V4cG9ydHNfXyxfX3dlYnBhY2tfcmVxdWlyZV9fKXtcXFwidXNlIHN0cmljdFxcXCI7X193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOy8qIGhhcm1vbnkgZXhwb3J0ICovX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sey8qIGhhcm1vbnkgZXhwb3J0ICovQWN0aW9uVHlwZXM6ZnVuY3Rpb24gQWN0aW9uVHlwZXMoKXtyZXR1cm4oLyogYmluZGluZyAqL19BY3Rpb25UeXBlcyk7fSwvKiBoYXJtb255IGV4cG9ydCAqL1NwZWNpYWxUYXJnZXRzOmZ1bmN0aW9uIFNwZWNpYWxUYXJnZXRzKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fU3BlY2lhbFRhcmdldHMpO30vKiBoYXJtb255IGV4cG9ydCAqL30pO3ZhciBfQWN0aW9uVHlwZXM7KGZ1bmN0aW9uKEFjdGlvblR5cGVzKXtBY3Rpb25UeXBlc1tcXFwiU3RhcnRcXFwiXT1cXFwieHN0YXRlLnN0YXJ0XFxcIjtBY3Rpb25UeXBlc1tcXFwiU3RvcFxcXCJdPVxcXCJ4c3RhdGUuc3RvcFxcXCI7QWN0aW9uVHlwZXNbXFxcIlJhaXNlXFxcIl09XFxcInhzdGF0ZS5yYWlzZVxcXCI7QWN0aW9uVHlwZXNbXFxcIlNlbmRcXFwiXT1cXFwieHN0YXRlLnNlbmRcXFwiO0FjdGlvblR5cGVzW1xcXCJDYW5jZWxcXFwiXT1cXFwieHN0YXRlLmNhbmNlbFxcXCI7QWN0aW9uVHlwZXNbXFxcIk51bGxFdmVudFxcXCJdPVxcXCJcXFwiO0FjdGlvblR5cGVzW1xcXCJBc3NpZ25cXFwiXT1cXFwieHN0YXRlLmFzc2lnblxcXCI7QWN0aW9uVHlwZXNbXFxcIkFmdGVyXFxcIl09XFxcInhzdGF0ZS5hZnRlclxcXCI7QWN0aW9uVHlwZXNbXFxcIkRvbmVTdGF0ZVxcXCJdPVxcXCJkb25lLnN0YXRlXFxcIjtBY3Rpb25UeXBlc1tcXFwiRG9uZUludm9rZVxcXCJdPVxcXCJkb25lLmludm9rZVxcXCI7QWN0aW9uVHlwZXNbXFxcIkxvZ1xcXCJdPVxcXCJ4c3RhdGUubG9nXFxcIjtBY3Rpb25UeXBlc1tcXFwiSW5pdFxcXCJdPVxcXCJ4c3RhdGUuaW5pdFxcXCI7QWN0aW9uVHlwZXNbXFxcIkludm9rZVxcXCJdPVxcXCJ4c3RhdGUuaW52b2tlXFxcIjtBY3Rpb25UeXBlc1tcXFwiRXJyb3JFeGVjdXRpb25cXFwiXT1cXFwiZXJyb3IuZXhlY3V0aW9uXFxcIjtBY3Rpb25UeXBlc1tcXFwiRXJyb3JDb21tdW5pY2F0aW9uXFxcIl09XFxcImVycm9yLmNvbW11bmljYXRpb25cXFwiO0FjdGlvblR5cGVzW1xcXCJFcnJvclBsYXRmb3JtXFxcIl09XFxcImVycm9yLnBsYXRmb3JtXFxcIjtBY3Rpb25UeXBlc1tcXFwiRXJyb3JDdXN0b21cXFwiXT1cXFwieHN0YXRlLmVycm9yXFxcIjtBY3Rpb25UeXBlc1tcXFwiVXBkYXRlXFxcIl09XFxcInhzdGF0ZS51cGRhdGVcXFwiO0FjdGlvblR5cGVzW1xcXCJQdXJlXFxcIl09XFxcInhzdGF0ZS5wdXJlXFxcIjtBY3Rpb25UeXBlc1tcXFwiQ2hvb3NlXFxcIl09XFxcInhzdGF0ZS5jaG9vc2VcXFwiO30pKF9BY3Rpb25UeXBlc3x8KF9BY3Rpb25UeXBlcz17fSkpO3ZhciBfU3BlY2lhbFRhcmdldHM7KGZ1bmN0aW9uKFNwZWNpYWxUYXJnZXRzKXtTcGVjaWFsVGFyZ2V0c1tcXFwiUGFyZW50XFxcIl09XFxcIiNfcGFyZW50XFxcIjtTcGVjaWFsVGFyZ2V0c1tcXFwiSW50ZXJuYWxcXFwiXT1cXFwiI19pbnRlcm5hbFxcXCI7fSkoX1NwZWNpYWxUYXJnZXRzfHwoX1NwZWNpYWxUYXJnZXRzPXt9KSk7LyoqKi99LC8qKiovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy91dGlscy5qc1xcXCI6LyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXFxcXG4gICEqKiogLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL3V0aWxzLmpzICoqKiFcXG4gIFxcXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqKi9mdW5jdGlvbiBub2RlX21vZHVsZXNYc3RhdGVFc1V0aWxzSnMoX191bnVzZWRfd2VicGFja19tb2R1bGUsX193ZWJwYWNrX2V4cG9ydHNfXyxfX3dlYnBhY2tfcmVxdWlyZV9fKXtcXFwidXNlIHN0cmljdFxcXCI7X193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOy8qIGhhcm1vbnkgZXhwb3J0ICovX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sey8qIGhhcm1vbnkgZXhwb3J0ICovY3JlYXRlSW52b2tlSWQ6ZnVuY3Rpb24gY3JlYXRlSW52b2tlSWQoKXtyZXR1cm4oLyogYmluZGluZyAqL19jcmVhdGVJbnZva2VJZCk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2V2YWx1YXRlR3VhcmQ6ZnVuY3Rpb24gZXZhbHVhdGVHdWFyZCgpe3JldHVybigvKiBiaW5kaW5nICovX2V2YWx1YXRlR3VhcmQpO30sLyogaGFybW9ueSBleHBvcnQgKi9mbGF0dGVuOmZ1bmN0aW9uIGZsYXR0ZW4oKXtyZXR1cm4oLyogYmluZGluZyAqL19mbGF0dGVuKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovZ2V0QWN0aW9uVHlwZTpmdW5jdGlvbiBnZXRBY3Rpb25UeXBlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fZ2V0QWN0aW9uVHlwZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2dldEV2ZW50VHlwZTpmdW5jdGlvbiBnZXRFdmVudFR5cGUoKXtyZXR1cm4oLyogYmluZGluZyAqL19nZXRFdmVudFR5cGUpO30sLyogaGFybW9ueSBleHBvcnQgKi9pbnRlcm9wU3ltYm9sczpmdW5jdGlvbiBpbnRlcm9wU3ltYm9scygpe3JldHVybigvKiBiaW5kaW5nICovX2ludGVyb3BTeW1ib2xzKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovaXNBY3RvcjpmdW5jdGlvbiBpc0FjdG9yKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9faXNBY3RvcjIpO30sLyogaGFybW9ueSBleHBvcnQgKi9pc0FycmF5OmZ1bmN0aW9uIGlzQXJyYXkoKXtyZXR1cm4oLyogYmluZGluZyAqL19pc0FycmF5KTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovaXNCZWhhdmlvcjpmdW5jdGlvbiBpc0JlaGF2aW9yKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9faXNCZWhhdmlvcik7fSwvKiBoYXJtb255IGV4cG9ydCAqL2lzQnVpbHRJbkV2ZW50OmZ1bmN0aW9uIGlzQnVpbHRJbkV2ZW50KCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9faXNCdWlsdEluRXZlbnQpO30sLyogaGFybW9ueSBleHBvcnQgKi9pc0Z1bmN0aW9uOmZ1bmN0aW9uIGlzRnVuY3Rpb24oKXtyZXR1cm4oLyogYmluZGluZyAqL19pc0Z1bmN0aW9uKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovaXNNYWNoaW5lOmZ1bmN0aW9uIGlzTWFjaGluZSgpe3JldHVybigvKiBiaW5kaW5nICovX2lzTWFjaGluZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL2lzT2JzZXJ2YWJsZTpmdW5jdGlvbiBpc09ic2VydmFibGUoKXtyZXR1cm4oLyogYmluZGluZyAqL19pc09ic2VydmFibGUpO30sLyogaGFybW9ueSBleHBvcnQgKi9pc1Byb21pc2VMaWtlOmZ1bmN0aW9uIGlzUHJvbWlzZUxpa2UoKXtyZXR1cm4oLyogYmluZGluZyAqL19pc1Byb21pc2VMaWtlKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovaXNSYWlzYWJsZUFjdGlvbjpmdW5jdGlvbiBpc1JhaXNhYmxlQWN0aW9uKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9faXNSYWlzYWJsZUFjdGlvbik7fSwvKiBoYXJtb255IGV4cG9ydCAqL2lzU3RhdGVMaWtlOmZ1bmN0aW9uIGlzU3RhdGVMaWtlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9faXNTdGF0ZUxpa2UpO30sLyogaGFybW9ueSBleHBvcnQgKi9pc1N0cmluZzpmdW5jdGlvbiBpc1N0cmluZygpe3JldHVybigvKiBiaW5kaW5nICovX2lzU3RyaW5nKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICova2V5czpmdW5jdGlvbiBrZXlzKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fa2V5cyk7fSwvKiBoYXJtb255IGV4cG9ydCAqL21hcENvbnRleHQ6ZnVuY3Rpb24gbWFwQ29udGV4dCgpe3JldHVybigvKiBiaW5kaW5nICovX21hcENvbnRleHQpO30sLyogaGFybW9ueSBleHBvcnQgKi9tYXBGaWx0ZXJWYWx1ZXM6ZnVuY3Rpb24gbWFwRmlsdGVyVmFsdWVzKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fbWFwRmlsdGVyVmFsdWVzKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovbWFwVmFsdWVzOmZ1bmN0aW9uIG1hcFZhbHVlcygpe3JldHVybigvKiBiaW5kaW5nICovX21hcFZhbHVlcyk7fSwvKiBoYXJtb255IGV4cG9ydCAqL21hdGNoZXNTdGF0ZTpmdW5jdGlvbiBtYXRjaGVzU3RhdGUoKXtyZXR1cm4oLyogYmluZGluZyAqL19tYXRjaGVzU3RhdGUpO30sLyogaGFybW9ueSBleHBvcnQgKi9uZXN0ZWRQYXRoOmZ1bmN0aW9uIG5lc3RlZFBhdGgoKXtyZXR1cm4oLyogYmluZGluZyAqL19uZXN0ZWRQYXRoKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovbm9ybWFsaXplVGFyZ2V0OmZ1bmN0aW9uIG5vcm1hbGl6ZVRhcmdldCgpe3JldHVybigvKiBiaW5kaW5nICovX25vcm1hbGl6ZVRhcmdldCk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3BhcnRpdGlvbjpmdW5jdGlvbiBwYXJ0aXRpb24oKXtyZXR1cm4oLyogYmluZGluZyAqL19wYXJ0aXRpb24pO30sLyogaGFybW9ueSBleHBvcnQgKi9wYXRoOmZ1bmN0aW9uIHBhdGgoKXtyZXR1cm4oLyogYmluZGluZyAqL19wYXRoKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovcGF0aFRvU3RhdGVWYWx1ZTpmdW5jdGlvbiBwYXRoVG9TdGF0ZVZhbHVlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fcGF0aFRvU3RhdGVWYWx1ZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3BhdGhzVG9TdGF0ZVZhbHVlOmZ1bmN0aW9uIHBhdGhzVG9TdGF0ZVZhbHVlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fcGF0aHNUb1N0YXRlVmFsdWUpO30sLyogaGFybW9ueSBleHBvcnQgKi9yZXBvcnRVbmhhbmRsZWRFeGNlcHRpb25Pbkludm9jYXRpb246ZnVuY3Rpb24gcmVwb3J0VW5oYW5kbGVkRXhjZXB0aW9uT25JbnZvY2F0aW9uKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fcmVwb3J0VW5oYW5kbGVkRXhjZXB0aW9uT25JbnZvY2F0aW9uKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovc3ltYm9sT2JzZXJ2YWJsZTpmdW5jdGlvbiBzeW1ib2xPYnNlcnZhYmxlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fc3ltYm9sT2JzZXJ2YWJsZSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3RvQXJyYXk6ZnVuY3Rpb24gdG9BcnJheSgpe3JldHVybigvKiBiaW5kaW5nICovX3RvQXJyYXkpO30sLyogaGFybW9ueSBleHBvcnQgKi90b0FycmF5U3RyaWN0OmZ1bmN0aW9uIHRvQXJyYXlTdHJpY3QoKXtyZXR1cm4oLyogYmluZGluZyAqL190b0FycmF5U3RyaWN0KTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovdG9FdmVudE9iamVjdDpmdW5jdGlvbiB0b0V2ZW50T2JqZWN0KCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fdG9FdmVudE9iamVjdCk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3RvR3VhcmQ6ZnVuY3Rpb24gdG9HdWFyZCgpe3JldHVybigvKiBiaW5kaW5nICovX3RvR3VhcmQpO30sLyogaGFybW9ueSBleHBvcnQgKi90b0ludm9rZVNvdXJjZTpmdW5jdGlvbiB0b0ludm9rZVNvdXJjZSgpe3JldHVybigvKiBiaW5kaW5nICovX3RvSW52b2tlU291cmNlMik7fSwvKiBoYXJtb255IGV4cG9ydCAqL3RvT2JzZXJ2ZXI6ZnVuY3Rpb24gdG9PYnNlcnZlcigpe3JldHVybigvKiBiaW5kaW5nICovX3RvT2JzZXJ2ZXIpO30sLyogaGFybW9ueSBleHBvcnQgKi90b1NDWE1MRXZlbnQ6ZnVuY3Rpb24gdG9TQ1hNTEV2ZW50KCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fdG9TQ1hNTEV2ZW50KTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovdG9TdGF0ZVBhdGg6ZnVuY3Rpb24gdG9TdGF0ZVBhdGgoKXtyZXR1cm4oLyogYmluZGluZyAqL190b1N0YXRlUGF0aCk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3RvU3RhdGVQYXRoczpmdW5jdGlvbiB0b1N0YXRlUGF0aHMoKXtyZXR1cm4oLyogYmluZGluZyAqL190b1N0YXRlUGF0aHMpO30sLyogaGFybW9ueSBleHBvcnQgKi90b1N0YXRlVmFsdWU6ZnVuY3Rpb24gdG9TdGF0ZVZhbHVlKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fdG9TdGF0ZVZhbHVlKTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovdG9UcmFuc2l0aW9uQ29uZmlnQXJyYXk6ZnVuY3Rpb24gdG9UcmFuc2l0aW9uQ29uZmlnQXJyYXkoKXtyZXR1cm4oLyogYmluZGluZyAqL190b1RyYW5zaXRpb25Db25maWdBcnJheSk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3VuaXF1ZUlkOmZ1bmN0aW9uIHVuaXF1ZUlkKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fdW5pcXVlSWQpO30sLyogaGFybW9ueSBleHBvcnQgKi91cGRhdGVDb250ZXh0OmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHQoKXtyZXR1cm4oLyogYmluZGluZyAqL191cGRhdGVDb250ZXh0KTt9LC8qIGhhcm1vbnkgZXhwb3J0ICovdXBkYXRlSGlzdG9yeVN0YXRlczpmdW5jdGlvbiB1cGRhdGVIaXN0b3J5U3RhdGVzKCl7cmV0dXJuKC8qIGJpbmRpbmcgKi9fdXBkYXRlSGlzdG9yeVN0YXRlcyk7fSwvKiBoYXJtb255IGV4cG9ydCAqL3VwZGF0ZUhpc3RvcnlWYWx1ZTpmdW5jdGlvbiB1cGRhdGVIaXN0b3J5VmFsdWUoKXtyZXR1cm4oLyogYmluZGluZyAqL191cGRhdGVIaXN0b3J5VmFsdWUpO30sLyogaGFybW9ueSBleHBvcnQgKi93YXJuOmZ1bmN0aW9uIHdhcm4oKXtyZXR1cm4oLyogYmluZGluZyAqL193YXJuKTt9LyogaGFybW9ueSBleHBvcnQgKi99KTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vX3ZpcnR1YWwvX3RzbGliLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9fdmlydHVhbC9fdHNsaWIuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfdHlwZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3R5cGVzLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy90eXBlcy5qc1xcXCIpOy8qIGhhcm1vbnkgaW1wb3J0ICovdmFyIF9hY3Rpb25UeXBlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vYWN0aW9uVHlwZXMuanMgKi9cXFwiLi9ub2RlX21vZHVsZXMveHN0YXRlL2VzL2FjdGlvblR5cGVzLmpzXFxcIik7LyogaGFybW9ueSBpbXBvcnQgKi92YXIgX2NvbnN0YW50c19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vY29uc3RhbnRzLmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9jb25zdGFudHMuanNcXFwiKTsvKiBoYXJtb255IGltcG9ydCAqL3ZhciBfZW52aXJvbm1lbnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Vudmlyb25tZW50LmpzICovXFxcIi4vbm9kZV9tb2R1bGVzL3hzdGF0ZS9lcy9lbnZpcm9ubWVudC5qc1xcXCIpO3ZhciBfYTtmdW5jdGlvbiBfa2V5cyh2YWx1ZSl7cmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlKTt9ZnVuY3Rpb24gX21hdGNoZXNTdGF0ZShwYXJlbnRTdGF0ZUlkLGNoaWxkU3RhdGVJZCxkZWxpbWl0ZXIpe2lmKGRlbGltaXRlcj09PXZvaWQgMCl7ZGVsaW1pdGVyPV9jb25zdGFudHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5TVEFURV9ERUxJTUlURVI7fXZhciBwYXJlbnRTdGF0ZVZhbHVlPV90b1N0YXRlVmFsdWUocGFyZW50U3RhdGVJZCxkZWxpbWl0ZXIpO3ZhciBjaGlsZFN0YXRlVmFsdWU9X3RvU3RhdGVWYWx1ZShjaGlsZFN0YXRlSWQsZGVsaW1pdGVyKTtpZihfaXNTdHJpbmcoY2hpbGRTdGF0ZVZhbHVlKSl7aWYoX2lzU3RyaW5nKHBhcmVudFN0YXRlVmFsdWUpKXtyZXR1cm4gY2hpbGRTdGF0ZVZhbHVlPT09cGFyZW50U3RhdGVWYWx1ZTt9Ly8gUGFyZW50IG1vcmUgc3BlY2lmaWMgdGhhbiBjaGlsZFxcbnJldHVybiBmYWxzZTt9aWYoX2lzU3RyaW5nKHBhcmVudFN0YXRlVmFsdWUpKXtyZXR1cm4gcGFyZW50U3RhdGVWYWx1ZSBpbiBjaGlsZFN0YXRlVmFsdWU7fXJldHVybiBPYmplY3Qua2V5cyhwYXJlbnRTdGF0ZVZhbHVlKS5ldmVyeShmdW5jdGlvbihrZXkpe2lmKCEoa2V5IGluIGNoaWxkU3RhdGVWYWx1ZSkpe3JldHVybiBmYWxzZTt9cmV0dXJuIF9tYXRjaGVzU3RhdGUocGFyZW50U3RhdGVWYWx1ZVtrZXldLGNoaWxkU3RhdGVWYWx1ZVtrZXldKTt9KTt9ZnVuY3Rpb24gX2dldEV2ZW50VHlwZShldmVudCl7dHJ5e3JldHVybiBfaXNTdHJpbmcoZXZlbnQpfHx0eXBlb2YgZXZlbnQ9PT0nbnVtYmVyJz9cXFwiXFxcIi5jb25jYXQoZXZlbnQpOmV2ZW50LnR5cGU7fWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcignRXZlbnRzIG11c3QgYmUgc3RyaW5ncyBvciBvYmplY3RzIHdpdGggYSBzdHJpbmcgZXZlbnQudHlwZSBwcm9wZXJ0eS4nKTt9fWZ1bmN0aW9uIF9nZXRBY3Rpb25UeXBlKGFjdGlvbil7dHJ5e3JldHVybiBfaXNTdHJpbmcoYWN0aW9uKXx8dHlwZW9mIGFjdGlvbj09PSdudW1iZXInP1xcXCJcXFwiLmNvbmNhdChhY3Rpb24pOl9pc0Z1bmN0aW9uKGFjdGlvbik/YWN0aW9uLm5hbWU6YWN0aW9uLnR5cGU7fWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcignQWN0aW9ucyBtdXN0IGJlIHN0cmluZ3Mgb3Igb2JqZWN0cyB3aXRoIGEgc3RyaW5nIGFjdGlvbi50eXBlIHByb3BlcnR5LicpO319ZnVuY3Rpb24gX3RvU3RhdGVQYXRoKHN0YXRlSWQsZGVsaW1pdGVyKXt0cnl7aWYoX2lzQXJyYXkoc3RhdGVJZCkpe3JldHVybiBzdGF0ZUlkO31yZXR1cm4gc3RhdGVJZC50b1N0cmluZygpLnNwbGl0KGRlbGltaXRlcik7fWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcihcXFwiJ1xcXCIuY29uY2F0KHN0YXRlSWQsXFxcIicgaXMgbm90IGEgdmFsaWQgc3RhdGUgcGF0aC5cXFwiKSk7fX1mdW5jdGlvbiBfaXNTdGF0ZUxpa2Uoc3RhdGUpe3JldHVybiBfdHlwZW9mMihzdGF0ZSk9PT0nb2JqZWN0JyYmJ3ZhbHVlJ2luIHN0YXRlJiYnY29udGV4dCdpbiBzdGF0ZSYmJ2V2ZW50J2luIHN0YXRlJiYnX2V2ZW50J2luIHN0YXRlO31mdW5jdGlvbiBfdG9TdGF0ZVZhbHVlKHN0YXRlVmFsdWUsZGVsaW1pdGVyKXtpZihfaXNTdGF0ZUxpa2Uoc3RhdGVWYWx1ZSkpe3JldHVybiBzdGF0ZVZhbHVlLnZhbHVlO31pZihfaXNBcnJheShzdGF0ZVZhbHVlKSl7cmV0dXJuIF9wYXRoVG9TdGF0ZVZhbHVlKHN0YXRlVmFsdWUpO31pZih0eXBlb2Ygc3RhdGVWYWx1ZSE9PSdzdHJpbmcnKXtyZXR1cm4gc3RhdGVWYWx1ZTt9dmFyIHN0YXRlUGF0aD1fdG9TdGF0ZVBhdGgoc3RhdGVWYWx1ZSxkZWxpbWl0ZXIpO3JldHVybiBfcGF0aFRvU3RhdGVWYWx1ZShzdGF0ZVBhdGgpO31mdW5jdGlvbiBfcGF0aFRvU3RhdGVWYWx1ZShzdGF0ZVBhdGgpe2lmKHN0YXRlUGF0aC5sZW5ndGg9PT0xKXtyZXR1cm4gc3RhdGVQYXRoWzBdO312YXIgdmFsdWU9e307dmFyIG1hcmtlcj12YWx1ZTtmb3IodmFyIGk9MDtpPHN0YXRlUGF0aC5sZW5ndGgtMTtpKyspe2lmKGk9PT1zdGF0ZVBhdGgubGVuZ3RoLTIpe21hcmtlcltzdGF0ZVBhdGhbaV1dPXN0YXRlUGF0aFtpKzFdO31lbHNle21hcmtlcltzdGF0ZVBhdGhbaV1dPXt9O21hcmtlcj1tYXJrZXJbc3RhdGVQYXRoW2ldXTt9fXJldHVybiB2YWx1ZTt9ZnVuY3Rpb24gX21hcFZhbHVlcyhjb2xsZWN0aW9uLGl0ZXJhdGVlKXt2YXIgcmVzdWx0PXt9O3ZhciBjb2xsZWN0aW9uS2V5cz1PYmplY3Qua2V5cyhjb2xsZWN0aW9uKTtmb3IodmFyIGk9MDtpPGNvbGxlY3Rpb25LZXlzLmxlbmd0aDtpKyspe3ZhciBrZXk9Y29sbGVjdGlvbktleXNbaV07cmVzdWx0W2tleV09aXRlcmF0ZWUoY29sbGVjdGlvbltrZXldLGtleSxjb2xsZWN0aW9uLGkpO31yZXR1cm4gcmVzdWx0O31mdW5jdGlvbiBfbWFwRmlsdGVyVmFsdWVzKGNvbGxlY3Rpb24saXRlcmF0ZWUscHJlZGljYXRlKXt2YXIgZV8xLF9hO3ZhciByZXN1bHQ9e307dHJ5e2Zvcih2YXIgX2I9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5fX3ZhbHVlcykoT2JqZWN0LmtleXMoY29sbGVjdGlvbikpLF9jPV9iLm5leHQoKTshX2MuZG9uZTtfYz1fYi5uZXh0KCkpe3ZhciBrZXk9X2MudmFsdWU7dmFyIGl0ZW09Y29sbGVjdGlvbltrZXldO2lmKCFwcmVkaWNhdGUoaXRlbSkpe2NvbnRpbnVlO31yZXN1bHRba2V5XT1pdGVyYXRlZShpdGVtLGtleSxjb2xsZWN0aW9uKTt9fWNhdGNoKGVfMV8xKXtlXzE9e2Vycm9yOmVfMV8xfTt9ZmluYWxseXt0cnl7aWYoX2MmJiFfYy5kb25lJiYoX2E9X2JbXFxcInJldHVyblxcXCJdKSlfYS5jYWxsKF9iKTt9ZmluYWxseXtpZihlXzEpdGhyb3cgZV8xLmVycm9yO319cmV0dXJuIHJlc3VsdDt9LyoqXFxyXFxuICogUmV0cmlldmVzIGEgdmFsdWUgYXQgdGhlIGdpdmVuIHBhdGguXFxyXFxuICogQHBhcmFtIHByb3BzIFRoZSBkZWVwIHBhdGggdG8gdGhlIHByb3Agb2YgdGhlIGRlc2lyZWQgdmFsdWVcXHJcXG4gKi92YXIgX3BhdGg9ZnVuY3Rpb24gX3BhdGgocHJvcHMpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3ZhciBlXzIsX2E7dmFyIHJlc3VsdD1vYmplY3Q7dHJ5e2Zvcih2YXIgcHJvcHNfMT0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLl9fdmFsdWVzKShwcm9wcykscHJvcHNfMV8xPXByb3BzXzEubmV4dCgpOyFwcm9wc18xXzEuZG9uZTtwcm9wc18xXzE9cHJvcHNfMS5uZXh0KCkpe3ZhciBwcm9wPXByb3BzXzFfMS52YWx1ZTtyZXN1bHQ9cmVzdWx0W3Byb3BdO319Y2F0Y2goZV8yXzEpe2VfMj17ZXJyb3I6ZV8yXzF9O31maW5hbGx5e3RyeXtpZihwcm9wc18xXzEmJiFwcm9wc18xXzEuZG9uZSYmKF9hPXByb3BzXzFbXFxcInJldHVyblxcXCJdKSlfYS5jYWxsKHByb3BzXzEpO31maW5hbGx5e2lmKGVfMil0aHJvdyBlXzIuZXJyb3I7fX1yZXR1cm4gcmVzdWx0O307fTsvKipcXHJcXG4gKiBSZXRyaWV2ZXMgYSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEgdGhlIG5lc3RlZCBhY2Nlc3NvciBwcm9wLlxcclxcbiAqIEBwYXJhbSBwcm9wcyBUaGUgZGVlcCBwYXRoIHRvIHRoZSBwcm9wIG9mIHRoZSBkZXNpcmVkIHZhbHVlXFxyXFxuICovZnVuY3Rpb24gX25lc3RlZFBhdGgocHJvcHMsYWNjZXNzb3JQcm9wKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXt2YXIgZV8zLF9hO3ZhciByZXN1bHQ9b2JqZWN0O3RyeXtmb3IodmFyIHByb3BzXzI9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5fX3ZhbHVlcykocHJvcHMpLHByb3BzXzJfMT1wcm9wc18yLm5leHQoKTshcHJvcHNfMl8xLmRvbmU7cHJvcHNfMl8xPXByb3BzXzIubmV4dCgpKXt2YXIgcHJvcD1wcm9wc18yXzEudmFsdWU7cmVzdWx0PXJlc3VsdFthY2Nlc3NvclByb3BdW3Byb3BdO319Y2F0Y2goZV8zXzEpe2VfMz17ZXJyb3I6ZV8zXzF9O31maW5hbGx5e3RyeXtpZihwcm9wc18yXzEmJiFwcm9wc18yXzEuZG9uZSYmKF9hPXByb3BzXzJbXFxcInJldHVyblxcXCJdKSlfYS5jYWxsKHByb3BzXzIpO31maW5hbGx5e2lmKGVfMyl0aHJvdyBlXzMuZXJyb3I7fX1yZXR1cm4gcmVzdWx0O307fWZ1bmN0aW9uIF90b1N0YXRlUGF0aHMoc3RhdGVWYWx1ZSl7aWYoIXN0YXRlVmFsdWUpe3JldHVybltbXV07fWlmKF9pc1N0cmluZyhzdGF0ZVZhbHVlKSl7cmV0dXJuW1tzdGF0ZVZhbHVlXV07fXZhciByZXN1bHQ9X2ZsYXR0ZW4oT2JqZWN0LmtleXMoc3RhdGVWYWx1ZSkubWFwKGZ1bmN0aW9uKGtleSl7dmFyIHN1YlN0YXRlVmFsdWU9c3RhdGVWYWx1ZVtrZXldO2lmKHR5cGVvZiBzdWJTdGF0ZVZhbHVlIT09J3N0cmluZycmJighc3ViU3RhdGVWYWx1ZXx8IU9iamVjdC5rZXlzKHN1YlN0YXRlVmFsdWUpLmxlbmd0aCkpe3JldHVybltba2V5XV07fXJldHVybiBfdG9TdGF0ZVBhdGhzKHN0YXRlVmFsdWVba2V5XSkubWFwKGZ1bmN0aW9uKHN1YlBhdGgpe3JldHVybltrZXldLmNvbmNhdChzdWJQYXRoKTt9KTt9KSk7cmV0dXJuIHJlc3VsdDt9ZnVuY3Rpb24gX3BhdGhzVG9TdGF0ZVZhbHVlKHBhdGhzKXt2YXIgZV80LF9hO3ZhciByZXN1bHQ9e307aWYocGF0aHMmJnBhdGhzLmxlbmd0aD09PTEmJnBhdGhzWzBdLmxlbmd0aD09PTEpe3JldHVybiBwYXRoc1swXVswXTt9dHJ5e2Zvcih2YXIgcGF0aHNfMT0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLl9fdmFsdWVzKShwYXRocykscGF0aHNfMV8xPXBhdGhzXzEubmV4dCgpOyFwYXRoc18xXzEuZG9uZTtwYXRoc18xXzE9cGF0aHNfMS5uZXh0KCkpe3ZhciBjdXJyZW50UGF0aD1wYXRoc18xXzEudmFsdWU7dmFyIG1hcmtlcj1yZXN1bHQ7Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnByZWZlci1mb3Itb2ZcXG5mb3IodmFyIGk9MDtpPGN1cnJlbnRQYXRoLmxlbmd0aDtpKyspe3ZhciBzdWJQYXRoPWN1cnJlbnRQYXRoW2ldO2lmKGk9PT1jdXJyZW50UGF0aC5sZW5ndGgtMil7bWFya2VyW3N1YlBhdGhdPWN1cnJlbnRQYXRoW2krMV07YnJlYWs7fW1hcmtlcltzdWJQYXRoXT1tYXJrZXJbc3ViUGF0aF18fHt9O21hcmtlcj1tYXJrZXJbc3ViUGF0aF07fX19Y2F0Y2goZV80XzEpe2VfND17ZXJyb3I6ZV80XzF9O31maW5hbGx5e3RyeXtpZihwYXRoc18xXzEmJiFwYXRoc18xXzEuZG9uZSYmKF9hPXBhdGhzXzFbXFxcInJldHVyblxcXCJdKSlfYS5jYWxsKHBhdGhzXzEpO31maW5hbGx5e2lmKGVfNCl0aHJvdyBlXzQuZXJyb3I7fX1yZXR1cm4gcmVzdWx0O31mdW5jdGlvbiBfZmxhdHRlbihhcnJheSl7dmFyIF9hO3JldHVybihfYT1bXSkuY29uY2F0LmFwcGx5KF9hLCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uX19zcHJlYWRBcnJheSkoW10sKDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5fX3JlYWQpKGFycmF5KSxmYWxzZSkpO31mdW5jdGlvbiBfdG9BcnJheVN0cmljdCh2YWx1ZSl7aWYoX2lzQXJyYXkodmFsdWUpKXtyZXR1cm4gdmFsdWU7fXJldHVyblt2YWx1ZV07fWZ1bmN0aW9uIF90b0FycmF5KHZhbHVlKXtpZih2YWx1ZT09PXVuZGVmaW5lZCl7cmV0dXJuW107fXJldHVybiBfdG9BcnJheVN0cmljdCh2YWx1ZSk7fWZ1bmN0aW9uIF9tYXBDb250ZXh0KG1hcHBlcixjb250ZXh0LF9ldmVudCl7dmFyIGVfNSxfYTtpZihfaXNGdW5jdGlvbihtYXBwZXIpKXtyZXR1cm4gbWFwcGVyKGNvbnRleHQsX2V2ZW50LmRhdGEpO312YXIgcmVzdWx0PXt9O3RyeXtmb3IodmFyIF9iPSgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uX192YWx1ZXMpKE9iamVjdC5rZXlzKG1hcHBlcikpLF9jPV9iLm5leHQoKTshX2MuZG9uZTtfYz1fYi5uZXh0KCkpe3ZhciBrZXk9X2MudmFsdWU7dmFyIHN1Yk1hcHBlcj1tYXBwZXJba2V5XTtpZihfaXNGdW5jdGlvbihzdWJNYXBwZXIpKXtyZXN1bHRba2V5XT1zdWJNYXBwZXIoY29udGV4dCxfZXZlbnQuZGF0YSk7fWVsc2V7cmVzdWx0W2tleV09c3ViTWFwcGVyO319fWNhdGNoKGVfNV8xKXtlXzU9e2Vycm9yOmVfNV8xfTt9ZmluYWxseXt0cnl7aWYoX2MmJiFfYy5kb25lJiYoX2E9X2JbXFxcInJldHVyblxcXCJdKSlfYS5jYWxsKF9iKTt9ZmluYWxseXtpZihlXzUpdGhyb3cgZV81LmVycm9yO319cmV0dXJuIHJlc3VsdDt9ZnVuY3Rpb24gX2lzQnVpbHRJbkV2ZW50KGV2ZW50VHlwZSl7cmV0dXJuIC9eKGRvbmV8ZXJyb3IpXFxcXC4vLnRlc3QoZXZlbnRUeXBlKTt9ZnVuY3Rpb24gX2lzUHJvbWlzZUxpa2UodmFsdWUpe2lmKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSl7cmV0dXJuIHRydWU7fS8vIENoZWNrIGlmIHNoYXBlIG1hdGNoZXMgdGhlIFByb21pc2UvQSsgc3BlY2lmaWNhdGlvbiBmb3IgYSBcXFwidGhlbmFibGVcXFwiLlxcbmlmKHZhbHVlIT09bnVsbCYmKF9pc0Z1bmN0aW9uKHZhbHVlKXx8X3R5cGVvZjIodmFsdWUpPT09J29iamVjdCcpJiZfaXNGdW5jdGlvbih2YWx1ZS50aGVuKSl7cmV0dXJuIHRydWU7fXJldHVybiBmYWxzZTt9ZnVuY3Rpb24gX2lzQmVoYXZpb3IodmFsdWUpe3JldHVybiB2YWx1ZSE9PW51bGwmJl90eXBlb2YyKHZhbHVlKT09PSdvYmplY3QnJiYndHJhbnNpdGlvbidpbiB2YWx1ZSYmdHlwZW9mIHZhbHVlLnRyYW5zaXRpb249PT0nZnVuY3Rpb24nO31mdW5jdGlvbiBfcGFydGl0aW9uKGl0ZW1zLHByZWRpY2F0ZSl7dmFyIGVfNixfYTt2YXIgX2I9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5fX3JlYWQpKFtbXSxbXV0sMiksdHJ1dGh5PV9iWzBdLGZhbHN5PV9iWzFdO3RyeXtmb3IodmFyIGl0ZW1zXzE9KDAsX3ZpcnR1YWxfdHNsaWJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5fX3ZhbHVlcykoaXRlbXMpLGl0ZW1zXzFfMT1pdGVtc18xLm5leHQoKTshaXRlbXNfMV8xLmRvbmU7aXRlbXNfMV8xPWl0ZW1zXzEubmV4dCgpKXt2YXIgaXRlbT1pdGVtc18xXzEudmFsdWU7aWYocHJlZGljYXRlKGl0ZW0pKXt0cnV0aHkucHVzaChpdGVtKTt9ZWxzZXtmYWxzeS5wdXNoKGl0ZW0pO319fWNhdGNoKGVfNl8xKXtlXzY9e2Vycm9yOmVfNl8xfTt9ZmluYWxseXt0cnl7aWYoaXRlbXNfMV8xJiYhaXRlbXNfMV8xLmRvbmUmJihfYT1pdGVtc18xW1xcXCJyZXR1cm5cXFwiXSkpX2EuY2FsbChpdGVtc18xKTt9ZmluYWxseXtpZihlXzYpdGhyb3cgZV82LmVycm9yO319cmV0dXJuW3RydXRoeSxmYWxzeV07fWZ1bmN0aW9uIF91cGRhdGVIaXN0b3J5U3RhdGVzKGhpc3Qsc3RhdGVWYWx1ZSl7cmV0dXJuIF9tYXBWYWx1ZXMoaGlzdC5zdGF0ZXMsZnVuY3Rpb24oc3ViSGlzdCxrZXkpe2lmKCFzdWJIaXN0KXtyZXR1cm4gdW5kZWZpbmVkO312YXIgc3ViU3RhdGVWYWx1ZT0oX2lzU3RyaW5nKHN0YXRlVmFsdWUpP3VuZGVmaW5lZDpzdGF0ZVZhbHVlW2tleV0pfHwoc3ViSGlzdD9zdWJIaXN0LmN1cnJlbnQ6dW5kZWZpbmVkKTtpZighc3ViU3RhdGVWYWx1ZSl7cmV0dXJuIHVuZGVmaW5lZDt9cmV0dXJue2N1cnJlbnQ6c3ViU3RhdGVWYWx1ZSxzdGF0ZXM6X3VwZGF0ZUhpc3RvcnlTdGF0ZXMoc3ViSGlzdCxzdWJTdGF0ZVZhbHVlKX07fSk7fWZ1bmN0aW9uIF91cGRhdGVIaXN0b3J5VmFsdWUoaGlzdCxzdGF0ZVZhbHVlKXtyZXR1cm57Y3VycmVudDpzdGF0ZVZhbHVlLHN0YXRlczpfdXBkYXRlSGlzdG9yeVN0YXRlcyhoaXN0LHN0YXRlVmFsdWUpfTt9ZnVuY3Rpb24gX3VwZGF0ZUNvbnRleHQoY29udGV4dCxfZXZlbnQsYXNzaWduQWN0aW9ucyxzdGF0ZSl7aWYoIV9lbnZpcm9ubWVudF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLklTX1BST0RVQ1RJT04pe193YXJuKCEhY29udGV4dCwnQXR0ZW1wdGluZyB0byB1cGRhdGUgdW5kZWZpbmVkIGNvbnRleHQnKTt9dmFyIHVwZGF0ZWRDb250ZXh0PWNvbnRleHQ/YXNzaWduQWN0aW9ucy5yZWR1Y2UoZnVuY3Rpb24oYWNjLGFzc2lnbkFjdGlvbil7dmFyIGVfNyxfYTt2YXIgYXNzaWdubWVudD1hc3NpZ25BY3Rpb24uYXNzaWdubWVudDt2YXIgbWV0YT17c3RhdGU6c3RhdGUsYWN0aW9uOmFzc2lnbkFjdGlvbixfZXZlbnQ6X2V2ZW50fTt2YXIgcGFydGlhbFVwZGF0ZT17fTtpZihfaXNGdW5jdGlvbihhc3NpZ25tZW50KSl7cGFydGlhbFVwZGF0ZT1hc3NpZ25tZW50KGFjYyxfZXZlbnQuZGF0YSxtZXRhKTt9ZWxzZXt0cnl7Zm9yKHZhciBfYj0oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLl9fdmFsdWVzKShPYmplY3Qua2V5cyhhc3NpZ25tZW50KSksX2M9X2IubmV4dCgpOyFfYy5kb25lO19jPV9iLm5leHQoKSl7dmFyIGtleT1fYy52YWx1ZTt2YXIgcHJvcEFzc2lnbm1lbnQ9YXNzaWdubWVudFtrZXldO3BhcnRpYWxVcGRhdGVba2V5XT1faXNGdW5jdGlvbihwcm9wQXNzaWdubWVudCk/cHJvcEFzc2lnbm1lbnQoYWNjLF9ldmVudC5kYXRhLG1ldGEpOnByb3BBc3NpZ25tZW50O319Y2F0Y2goZV83XzEpe2VfNz17ZXJyb3I6ZV83XzF9O31maW5hbGx5e3RyeXtpZihfYyYmIV9jLmRvbmUmJihfYT1fYltcXFwicmV0dXJuXFxcIl0pKV9hLmNhbGwoX2IpO31maW5hbGx5e2lmKGVfNyl0aHJvdyBlXzcuZXJyb3I7fX19cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sYWNjLHBhcnRpYWxVcGRhdGUpO30sY29udGV4dCk6Y29udGV4dDtyZXR1cm4gdXBkYXRlZENvbnRleHQ7fS8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1lbXB0eVxcbnZhciBfd2Fybj1mdW5jdGlvbiBfd2Fybigpe307aWYoIV9lbnZpcm9ubWVudF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLklTX1BST0RVQ1RJT04pe193YXJuPWZ1bmN0aW9uIF93YXJuKGNvbmRpdGlvbixtZXNzYWdlKXt2YXIgZXJyb3I9Y29uZGl0aW9uIGluc3RhbmNlb2YgRXJyb3I/Y29uZGl0aW9uOnVuZGVmaW5lZDtpZighZXJyb3ImJmNvbmRpdGlvbil7cmV0dXJuO31pZihjb25zb2xlIT09dW5kZWZpbmVkKXt2YXIgYXJncz1bXFxcIldhcm5pbmc6IFxcXCIuY29uY2F0KG1lc3NhZ2UpXTtpZihlcnJvcil7YXJncy5wdXNoKGVycm9yKTt9Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcXG5jb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSxhcmdzKTt9fTt9ZnVuY3Rpb24gX2lzQXJyYXkodmFsdWUpe3JldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTt9Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmJhbi10eXBlc1xcbmZ1bmN0aW9uIF9pc0Z1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT09J2Z1bmN0aW9uJzt9ZnVuY3Rpb24gX2lzU3RyaW5nKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT09J3N0cmluZyc7fWZ1bmN0aW9uIF90b0d1YXJkKGNvbmRpdGlvbixndWFyZE1hcCl7aWYoIWNvbmRpdGlvbil7cmV0dXJuIHVuZGVmaW5lZDt9aWYoX2lzU3RyaW5nKGNvbmRpdGlvbikpe3JldHVybnt0eXBlOl9jb25zdGFudHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5ERUZBVUxUX0dVQVJEX1RZUEUsbmFtZTpjb25kaXRpb24scHJlZGljYXRlOmd1YXJkTWFwP2d1YXJkTWFwW2NvbmRpdGlvbl06dW5kZWZpbmVkfTt9aWYoX2lzRnVuY3Rpb24oY29uZGl0aW9uKSl7cmV0dXJue3R5cGU6X2NvbnN0YW50c19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLkRFRkFVTFRfR1VBUkRfVFlQRSxuYW1lOmNvbmRpdGlvbi5uYW1lLHByZWRpY2F0ZTpjb25kaXRpb259O31yZXR1cm4gY29uZGl0aW9uO31mdW5jdGlvbiBfaXNPYnNlcnZhYmxlKHZhbHVlKXt0cnl7cmV0dXJuJ3N1YnNjcmliZSdpbiB2YWx1ZSYmX2lzRnVuY3Rpb24odmFsdWUuc3Vic2NyaWJlKTt9Y2F0Y2goZSl7cmV0dXJuIGZhbHNlO319dmFyIF9zeW1ib2xPYnNlcnZhYmxlPS8qI19fUFVSRV9fKi9mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgU3ltYm9sPT09J2Z1bmN0aW9uJyYmU3ltYm9sLm9ic2VydmFibGV8fCdAQG9ic2VydmFibGUnO30oKTsvLyBUT0RPOiB0byBiZSByZW1vdmVkIGluIHY1LCBsZWZ0IGl0IG91dCBqdXN0IHRvIG1pbmltaXplIHRoZSBzY29wZSBvZiB0aGUgY2hhbmdlIGFuZCBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgaW50ZWdyYXRpb24gcGFhY2thZ2VzXFxudmFyIF9pbnRlcm9wU3ltYm9scz0oX2E9e30sX2FbX3N5bWJvbE9ic2VydmFibGVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM7fSxfYVtTeW1ib2wub2JzZXJ2YWJsZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpczt9LF9hKTtmdW5jdGlvbiBfaXNNYWNoaW5lKHZhbHVlKXtyZXR1cm4hIXZhbHVlJiYnX194c3RhdGVub2RlJ2luIHZhbHVlO31mdW5jdGlvbiBfaXNBY3RvcjIodmFsdWUpe3JldHVybiEhdmFsdWUmJnR5cGVvZiB2YWx1ZS5zZW5kPT09J2Z1bmN0aW9uJzt9dmFyIF91bmlxdWVJZD0vKiNfX1BVUkVfXyovZnVuY3Rpb24oKXt2YXIgY3VycmVudElkPTA7cmV0dXJuIGZ1bmN0aW9uKCl7Y3VycmVudElkKys7cmV0dXJuIGN1cnJlbnRJZC50b1N0cmluZygxNik7fTt9KCk7ZnVuY3Rpb24gX3RvRXZlbnRPYmplY3QoZXZlbnQscGF5bG9hZC8vIGlkPzogVEV2ZW50Wyd0eXBlJ11cXG4pe2lmKF9pc1N0cmluZyhldmVudCl8fHR5cGVvZiBldmVudD09PSdudW1iZXInKXtyZXR1cm4oMCxfdmlydHVhbF90c2xpYl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLl9fYXNzaWduKSh7dHlwZTpldmVudH0scGF5bG9hZCk7fXJldHVybiBldmVudDt9ZnVuY3Rpb24gX3RvU0NYTUxFdmVudChldmVudCxzY3htbEV2ZW50KXtpZighX2lzU3RyaW5nKGV2ZW50KSYmJyQkdHlwZSdpbiBldmVudCYmZXZlbnQuJCR0eXBlPT09J3NjeG1sJyl7cmV0dXJuIGV2ZW50O312YXIgZXZlbnRPYmplY3Q9X3RvRXZlbnRPYmplY3QoZXZlbnQpO3JldHVybigwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uX19hc3NpZ24pKHtuYW1lOmV2ZW50T2JqZWN0LnR5cGUsZGF0YTpldmVudE9iamVjdCwkJHR5cGU6J3NjeG1sJyx0eXBlOidleHRlcm5hbCd9LHNjeG1sRXZlbnQpO31mdW5jdGlvbiBfdG9UcmFuc2l0aW9uQ29uZmlnQXJyYXkoZXZlbnQsY29uZmlnTGlrZSl7dmFyIHRyYW5zaXRpb25zPV90b0FycmF5U3RyaWN0KGNvbmZpZ0xpa2UpLm1hcChmdW5jdGlvbih0cmFuc2l0aW9uTGlrZSl7aWYodHlwZW9mIHRyYW5zaXRpb25MaWtlPT09J3VuZGVmaW5lZCd8fHR5cGVvZiB0cmFuc2l0aW9uTGlrZT09PSdzdHJpbmcnfHxfaXNNYWNoaW5lKHRyYW5zaXRpb25MaWtlKSl7cmV0dXJue3RhcmdldDp0cmFuc2l0aW9uTGlrZSxldmVudDpldmVudH07fXJldHVybigwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uX19hc3NpZ24pKCgwLF92aXJ0dWFsX3RzbGliX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uX19hc3NpZ24pKHt9LHRyYW5zaXRpb25MaWtlKSx7ZXZlbnQ6ZXZlbnR9KTt9KTtyZXR1cm4gdHJhbnNpdGlvbnM7fWZ1bmN0aW9uIF9ub3JtYWxpemVUYXJnZXQodGFyZ2V0KXtpZih0YXJnZXQ9PT11bmRlZmluZWR8fHRhcmdldD09PV9jb25zdGFudHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5UQVJHRVRMRVNTX0tFWSl7cmV0dXJuIHVuZGVmaW5lZDt9cmV0dXJuIF90b0FycmF5KHRhcmdldCk7fWZ1bmN0aW9uIF9yZXBvcnRVbmhhbmRsZWRFeGNlcHRpb25Pbkludm9jYXRpb24ob3JpZ2luYWxFcnJvcixjdXJyZW50RXJyb3IsaWQpe2lmKCFfZW52aXJvbm1lbnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5JU19QUk9EVUNUSU9OKXt2YXIgb3JpZ2luYWxTdGFja1RyYWNlPW9yaWdpbmFsRXJyb3Iuc3RhY2s/XFxcIiBTdGFja3RyYWNlIHdhcyAnXFxcIi5jb25jYXQob3JpZ2luYWxFcnJvci5zdGFjayxcXFwiJ1xcXCIpOicnO2lmKG9yaWdpbmFsRXJyb3I9PT1jdXJyZW50RXJyb3Ipey8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXFxuY29uc29sZS5lcnJvcihcXFwiTWlzc2luZyBvbkVycm9yIGhhbmRsZXIgZm9yIGludm9jYXRpb24gJ1xcXCIuY29uY2F0KGlkLFxcXCInLCBlcnJvciB3YXMgJ1xcXCIpLmNvbmNhdChvcmlnaW5hbEVycm9yLFxcXCInLlxcXCIpLmNvbmNhdChvcmlnaW5hbFN0YWNrVHJhY2UpKTt9ZWxzZXt2YXIgc3RhY2tUcmFjZT1jdXJyZW50RXJyb3Iuc3RhY2s/XFxcIiBTdGFja3RyYWNlIHdhcyAnXFxcIi5jb25jYXQoY3VycmVudEVycm9yLnN0YWNrLFxcXCInXFxcIik6Jyc7Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcXG5jb25zb2xlLmVycm9yKFxcXCJNaXNzaW5nIG9uRXJyb3IgaGFuZGxlciBhbmQvb3IgdW5oYW5kbGVkIGV4Y2VwdGlvbi9wcm9taXNlIHJlamVjdGlvbiBmb3IgaW52b2NhdGlvbiAnXFxcIi5jb25jYXQoaWQsXFxcIicuIFxcXCIpK1xcXCJPcmlnaW5hbCBlcnJvcjogJ1xcXCIuY29uY2F0KG9yaWdpbmFsRXJyb3IsXFxcIicuIFxcXCIpLmNvbmNhdChvcmlnaW5hbFN0YWNrVHJhY2UsXFxcIiBDdXJyZW50IGVycm9yIGlzICdcXFwiKS5jb25jYXQoY3VycmVudEVycm9yLFxcXCInLlxcXCIpLmNvbmNhdChzdGFja1RyYWNlKSk7fX19ZnVuY3Rpb24gX2V2YWx1YXRlR3VhcmQobWFjaGluZSxndWFyZCxjb250ZXh0LF9ldmVudCxzdGF0ZSl7dmFyIGd1YXJkcz1tYWNoaW5lLm9wdGlvbnMuZ3VhcmRzO3ZhciBndWFyZE1ldGE9e3N0YXRlOnN0YXRlLGNvbmQ6Z3VhcmQsX2V2ZW50Ol9ldmVudH07Ly8gVE9ETzogZG8gbm90IGhhcmRjb2RlIVxcbmlmKGd1YXJkLnR5cGU9PT1fY29uc3RhbnRzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uREVGQVVMVF9HVUFSRF9UWVBFKXtyZXR1cm4oKGd1YXJkcz09PW51bGx8fGd1YXJkcz09PXZvaWQgMD92b2lkIDA6Z3VhcmRzW2d1YXJkLm5hbWVdKXx8Z3VhcmQucHJlZGljYXRlKShjb250ZXh0LF9ldmVudC5kYXRhLGd1YXJkTWV0YSk7fXZhciBjb25kRm49Z3VhcmRzPT09bnVsbHx8Z3VhcmRzPT09dm9pZCAwP3ZvaWQgMDpndWFyZHNbZ3VhcmQudHlwZV07aWYoIWNvbmRGbil7dGhyb3cgbmV3IEVycm9yKFxcXCJHdWFyZCAnXFxcIi5jb25jYXQoZ3VhcmQudHlwZSxcXFwiJyBpcyBub3QgaW1wbGVtZW50ZWQgb24gbWFjaGluZSAnXFxcIikuY29uY2F0KG1hY2hpbmUuaWQsXFxcIicuXFxcIikpO31yZXR1cm4gY29uZEZuKGNvbnRleHQsX2V2ZW50LmRhdGEsZ3VhcmRNZXRhKTt9ZnVuY3Rpb24gX3RvSW52b2tlU291cmNlMihzcmMpe2lmKHR5cGVvZiBzcmM9PT0nc3RyaW5nJyl7cmV0dXJue3R5cGU6c3JjfTt9cmV0dXJuIHNyYzt9ZnVuY3Rpb24gX3RvT2JzZXJ2ZXIobmV4dEhhbmRsZXIsZXJyb3JIYW5kbGVyLGNvbXBsZXRpb25IYW5kbGVyKXt2YXIgbm9vcD1mdW5jdGlvbiBub29wKCl7fTt2YXIgaXNPYnNlcnZlcj1fdHlwZW9mMihuZXh0SGFuZGxlcik9PT0nb2JqZWN0Jzt2YXIgc2VsZj1pc09ic2VydmVyP25leHRIYW5kbGVyOm51bGw7cmV0dXJue25leHQ6KChpc09ic2VydmVyP25leHRIYW5kbGVyLm5leHQ6bmV4dEhhbmRsZXIpfHxub29wKS5iaW5kKHNlbGYpLGVycm9yOigoaXNPYnNlcnZlcj9uZXh0SGFuZGxlci5lcnJvcjplcnJvckhhbmRsZXIpfHxub29wKS5iaW5kKHNlbGYpLGNvbXBsZXRlOigoaXNPYnNlcnZlcj9uZXh0SGFuZGxlci5jb21wbGV0ZTpjb21wbGV0aW9uSGFuZGxlcil8fG5vb3ApLmJpbmQoc2VsZil9O31mdW5jdGlvbiBfY3JlYXRlSW52b2tlSWQoc3RhdGVOb2RlSWQsaW5kZXgpe3JldHVyblxcXCJcXFwiLmNvbmNhdChzdGF0ZU5vZGVJZCxcXFwiOmludm9jYXRpb25bXFxcIikuY29uY2F0KGluZGV4LFxcXCJdXFxcIik7fWZ1bmN0aW9uIF9pc1JhaXNhYmxlQWN0aW9uKGFjdGlvbil7cmV0dXJuKGFjdGlvbi50eXBlPT09X2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18ucmFpc2V8fGFjdGlvbi50eXBlPT09X2FjdGlvblR5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uc2VuZCYmYWN0aW9uLnRvPT09X3R5cGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uU3BlY2lhbFRhcmdldHMuSW50ZXJuYWwpJiZ0eXBlb2YgYWN0aW9uLmRlbGF5IT09J251bWJlcic7fS8qKiovfS8qKioqKiovfTsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAvKioqKioqLyAvLyBUaGUgbW9kdWxlIGNhY2hlXFxuLyoqKioqKi92YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fPXt9Oy8qKioqKiovIC8qKioqKiovIC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXFxuLyoqKioqKi9mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKXsvKioqKioqLyAvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcXG4vKioqKioqL3ZhciBjYWNoZWRNb2R1bGU9X193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTsvKioqKioqL2lmKGNhY2hlZE1vZHVsZSE9PXVuZGVmaW5lZCl7LyoqKioqKi9yZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7LyoqKioqKi99LyoqKioqKi8gLy8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcXG4vKioqKioqL3ZhciBtb2R1bGU9X193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXT17LyoqKioqKi8gLy8gbm8gbW9kdWxlLmlkIG5lZWRlZFxcbi8qKioqKiovIC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXFxuLyoqKioqKi9leHBvcnRzOnt9LyoqKioqKi99Oy8qKioqKiovIC8qKioqKiovIC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxcbi8qKioqKiovX193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLG1vZHVsZS5leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pOy8qKioqKiovIC8qKioqKiovIC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXFxuLyoqKioqKi9yZXR1cm4gbW9kdWxlLmV4cG9ydHM7LyoqKioqKi99LyoqKioqKi8gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqKioqKi8gLyogd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzICovIC8qKioqKiovKGZ1bmN0aW9uKCl7LyoqKioqKi8gLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xcbi8qKioqKiovX193ZWJwYWNrX3JlcXVpcmVfXy5kPWZ1bmN0aW9uKGV4cG9ydHMsZGVmaW5pdGlvbil7LyoqKioqKi9mb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKXsvKioqKioqL2lmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLGtleSkmJiFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cyxrZXkpKXsvKioqKioqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLGtleSx7ZW51bWVyYWJsZTp0cnVlLGdldDpkZWZpbml0aW9uW2tleV19KTsvKioqKioqL30vKioqKioqL30vKioqKioqL307LyoqKioqKi99KSgpOy8qKioqKiovIC8qKioqKiovIC8qIHdlYnBhY2svcnVudGltZS9nbG9iYWwgKi8gLyoqKioqKi8oZnVuY3Rpb24oKXsvKioqKioqL19fd2VicGFja19yZXF1aXJlX18uZz1mdW5jdGlvbigpey8qKioqKiovaWYoKHR5cGVvZiBnbG9iYWxUaGlzPT09XFxcInVuZGVmaW5lZFxcXCI/XFxcInVuZGVmaW5lZFxcXCI6X3R5cGVvZjIoZ2xvYmFsVGhpcykpPT09J29iamVjdCcpcmV0dXJuIGdsb2JhbFRoaXM7LyoqKioqKi90cnl7LyoqKioqKi9yZXR1cm4gdGhpc3x8bmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7LyoqKioqKi99Y2F0Y2goZSl7LyoqKioqKi9pZigodHlwZW9mIHdpbmRvdz09PVxcXCJ1bmRlZmluZWRcXFwiP1xcXCJ1bmRlZmluZWRcXFwiOl90eXBlb2YyKHdpbmRvdykpPT09J29iamVjdCcpcmV0dXJuIHdpbmRvdzsvKioqKioqL30vKioqKioqL30oKTsvKioqKioqL30pKCk7LyoqKioqKi8gLyoqKioqKi8gLyogd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCAqLyAvKioqKioqLyhmdW5jdGlvbigpey8qKioqKiovX193ZWJwYWNrX3JlcXVpcmVfXy5vPWZ1bmN0aW9uKG9iaixwcm9wKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixwcm9wKTt9Oy8qKioqKiovfSkoKTsvKioqKioqLyAvKioqKioqLyAvKiB3ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0ICovIC8qKioqKiovKGZ1bmN0aW9uKCl7LyoqKioqKi8gLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xcbi8qKioqKiovX193ZWJwYWNrX3JlcXVpcmVfXy5yPWZ1bmN0aW9uKGV4cG9ydHMpey8qKioqKiovaWYodHlwZW9mIFN5bWJvbCE9PSd1bmRlZmluZWQnJiZTeW1ib2wudG9TdHJpbmdUYWcpey8qKioqKiovT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTonTW9kdWxlJ30pOy8qKioqKiovfS8qKioqKiovT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsJ19fZXNNb2R1bGUnLHt2YWx1ZTp0cnVlfSk7LyoqKioqKi99Oy8qKioqKiovfSkoKTsvKioqKioqLyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL3ZhciBfX3dlYnBhY2tfZXhwb3J0c19fPXt9Oy8vIFRoaXMgZW50cnkgbmVlZCB0byBiZSB3cmFwcGVkIGluIGFuIElJRkUgYmVjYXVzZSBpdCBuZWVkIHRvIGJlIGlzb2xhdGVkIGFnYWluc3Qgb3RoZXIgbW9kdWxlcyBpbiB0aGUgY2h1bmsuXFxuKGZ1bmN0aW9uKCl7LyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcXFxcbiAgISoqKiAuL3NyYy9BdWRpb01vZHVsZS5qcyAqKiohXFxuICBcXFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9mdW5jdGlvbiBfdHlwZW9mKG9iail7XFxcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXFxcIjtyZXR1cm4gX3R5cGVvZj1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgU3ltYm9sJiZcXFwic3ltYm9sXFxcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihvYmope3JldHVybiB0eXBlb2Ygb2JqO306ZnVuY3Rpb24ob2JqKXtyZXR1cm4gb2JqJiZcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgU3ltYm9sJiZvYmouY29uc3RydWN0b3I9PT1TeW1ib2wmJm9iaiE9PVN5bWJvbC5wcm90b3R5cGU/XFxcInN5bWJvbFxcXCI6dHlwZW9mIG9iajt9LF90eXBlb2Yob2JqKTt9ZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsZW51bWVyYWJsZU9ubHkpe3ZhciBrZXlzPU9iamVjdC5rZXlzKG9iamVjdCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHN5bWJvbHM9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO2VudW1lcmFibGVPbmx5JiYoc3ltYm9scz1zeW1ib2xzLmZpbHRlcihmdW5jdGlvbihzeW0pe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCxzeW0pLmVudW1lcmFibGU7fSkpLGtleXMucHVzaC5hcHBseShrZXlzLHN5bWJvbHMpO31yZXR1cm4ga2V5czt9ZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9bnVsbCE9YXJndW1lbnRzW2ldP2FyZ3VtZW50c1tpXTp7fTtpJTI/b3duS2V5cyhPYmplY3Qoc291cmNlKSwhMCkuZm9yRWFjaChmdW5jdGlvbihrZXkpe19kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsa2V5LHNvdXJjZVtrZXldKTt9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk6b3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbihrZXkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsa2V5LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLGtleSkpO30pO31yZXR1cm4gdGFyZ2V0O31mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLGtleSx2YWx1ZSl7a2V5PV90b1Byb3BlcnR5S2V5KGtleSk7aWYoa2V5IGluIG9iail7T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaixrZXkse3ZhbHVlOnZhbHVlLGVudW1lcmFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZSx3cml0YWJsZTp0cnVlfSk7fWVsc2V7b2JqW2tleV09dmFsdWU7fXJldHVybiBvYmo7fWZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZyl7dmFyIGtleT1fdG9QcmltaXRpdmUoYXJnLFxcXCJzdHJpbmdcXFwiKTtyZXR1cm4gX3R5cGVvZihrZXkpPT09XFxcInN5bWJvbFxcXCI/a2V5OlN0cmluZyhrZXkpO31mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsaGludCl7aWYoX3R5cGVvZihpbnB1dCkhPT1cXFwib2JqZWN0XFxcInx8aW5wdXQ9PT1udWxsKXJldHVybiBpbnB1dDt2YXIgcHJpbT1pbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHByaW0hPT11bmRlZmluZWQpe3ZhciByZXM9cHJpbS5jYWxsKGlucHV0LGhpbnR8fFxcXCJkZWZhdWx0XFxcIik7aWYoX3R5cGVvZihyZXMpIT09XFxcIm9iamVjdFxcXCIpcmV0dXJuIHJlczt0aHJvdyBuZXcgVHlwZUVycm9yKFxcXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlxcXCIpO31yZXR1cm4oaGludD09PVxcXCJzdHJpbmdcXFwiP1N0cmluZzpOdW1iZXIpKGlucHV0KTt9Ly8gaW1wb3J0IHN0YXRlIG1hY2hpbmVzIGZvciBhdWRpbyBpbnB1dCBhbmQgb3V0cHV0XFxudmFyIF9yZXF1aXJlPV9fd2VicGFja19yZXF1aXJlX18oLyohIHhzdGF0ZSAqL1xcXCIuL25vZGVfbW9kdWxlcy94c3RhdGUvZXMvaW5kZXguanNcXFwiKSxpbnRlcnByZXQ9X3JlcXVpcmUuaW50ZXJwcmV0O3ZhciBfcmVxdWlyZTI9X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9zdGF0ZS1tYWNoaW5lcy9BdWRpb0lucHV0TWFjaGluZSAqL1xcXCIuL3NyYy9zdGF0ZS1tYWNoaW5lcy9BdWRpb0lucHV0TWFjaGluZS5qc1xcXCIpLGF1ZGlvSW5wdXRNYWNoaW5lPV9yZXF1aXJlMi5hdWRpb0lucHV0TWFjaGluZTt2YXIgX3JlcXVpcmUzPV9fd2VicGFja19yZXF1aXJlX18oLyohIC4vc3RhdGUtbWFjaGluZXMvQXVkaW9PdXRwdXRNYWNoaW5lICovXFxcIi4vc3JjL3N0YXRlLW1hY2hpbmVzL0F1ZGlvT3V0cHV0TWFjaGluZS5qc1xcXCIpLGF1ZGlvT3V0cHV0TWFjaGluZT1fcmVxdWlyZTMuYXVkaW9PdXRwdXRNYWNoaW5lO3ZhciBfcmVxdWlyZTQ9X193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9Mb2dnaW5nTW9kdWxlICovXFxcIi4vc3JjL0xvZ2dpbmdNb2R1bGUuanNcXFwiKSxzZXJpYWxpemVTdGF0ZVZhbHVlPV9yZXF1aXJlNC5zZXJpYWxpemVTdGF0ZVZhbHVlOy8vIGRlcGVuZHMgb24gdGhlIGluamVjdGluZyBzY3JpcHQgKHNheXBpLmluZGV4LmpzKSBkZWNsYXJpbmcgdGhlIEV2ZW50QnVzIGFzIGEgZ2xvYmFsIHZhcmlhYmxlXFxudmFyIEV2ZW50QnVzPXdpbmRvdy5FdmVudEJ1czsvLyBhdWRpbyBvdXRwdXQgKFBpKVxcbnZhciBhdWRpb0VsZW1lbnQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFwiYXVkaW9cXFwiKTtpZighYXVkaW9FbGVtZW50KXtjb25zb2xlLmVycm9yKFxcXCJBdWRpbyBlbGVtZW50IG5vdCBmb3VuZCFcXFwiKTt9ZWxzZXthdWRpb0VsZW1lbnQucHJlbG9hZD1cXFwiYXV0b1xcXCI7Ly8gZW5hYmxlIGFnZ3Jlc3NpdmUgcHJlbG9hZGluZyBvZiBhdWRpb1xcbn12YXIgYXVkaW9PdXRwdXRBY3Rvcj1pbnRlcnByZXQoYXVkaW9PdXRwdXRNYWNoaW5lKS5vblRyYW5zaXRpb24oZnVuY3Rpb24oc3RhdGUpe2lmKHN0YXRlLmNoYW5nZWQpe3ZhciBmcm9tU3RhdGU9c3RhdGUuaGlzdG9yeT9zZXJpYWxpemVTdGF0ZVZhbHVlKHN0YXRlLmhpc3RvcnkudmFsdWUpOlxcXCJOL0FcXFwiO3ZhciB0b1N0YXRlPXNlcmlhbGl6ZVN0YXRlVmFsdWUoc3RhdGUudmFsdWUpO2NvbnNvbGUubG9nKFxcXCJBdWRpbyBPdXRwdXQgTWFjaGluZSB0cmFuc2l0aW9uZWQgZnJvbSBcXFwiLmNvbmNhdChmcm9tU3RhdGUsXFxcIiB0byBcXFwiKS5jb25jYXQodG9TdGF0ZSxcXFwiIHdpdGggXFxcIikuY29uY2F0KHN0YXRlLmV2ZW50LnR5cGUpKTtjb25zb2xlLmxvZyhzdGF0ZS5jb250ZXh0KTt9fSkuc3RhcnQoKTtmdW5jdGlvbiByZWdpc3RlckF1ZGlvUGxheWJhY2tFdmVudHMoYXVkaW8sYWN0b3Ipe3ZhciBldmVudHM9W1xcXCJsb2Fkc3RhcnRcXFwiLFxcXCJsb2FkZWRtZXRhZGF0YVxcXCIsXFxcImNhbnBsYXl0aHJvdWdoXFxcIixcXFwicGxheVxcXCIsXFxcInBhdXNlXFxcIixcXFwiZW5kZWRcXFwiLFxcXCJzZWVrZWRcXFwiLFxcXCJlbXB0aWVkXFxcIl07ZXZlbnRzLmZvckVhY2goZnVuY3Rpb24oZXZlbnQpe2F1ZGlvLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsZnVuY3Rpb24oKXtyZXR1cm4gYWN0b3Iuc2VuZChldmVudCk7fSk7fSk7YXVkaW8uYWRkRXZlbnRMaXN0ZW5lcihcXFwicGxheWluZ1xcXCIsZnVuY3Rpb24oKXthY3Rvci5zZW5kKFxcXCJwbGF5XFxcIik7fSk7fXJlZ2lzdGVyQXVkaW9QbGF5YmFja0V2ZW50cyhhdWRpb0VsZW1lbnQsYXVkaW9PdXRwdXRBY3Rvcik7Ly8gYXVkaW8gaW5wdXQgKHVzZXIpXFxudmFyIGF1ZGlvSW5wdXRBY3Rvcj1pbnRlcnByZXQoYXVkaW9JbnB1dE1hY2hpbmUpLnN0YXJ0KCk7LyogVGhlc2UgZXZlbnRzIGFyZSB1c2VkIHRvIGNvbnRyb2wvcGFzcyByZXF1ZXN0cyB0byB0aGUgYXVkaW8gbW9kdWxlIGZyb20gb3RoZXIgbW9kdWxlcyAqL2Z1bmN0aW9uIHJlZ2lzdGVyQXVkaW9Db21tYW5kcygpey8vIGF1ZGlvIGlucHV0IChyZWNvcmRpbmcpIGNvbW1hbmRzXFxuRXZlbnRCdXMub24oXFxcImF1ZGlvOnNldHVwUmVjb3JkaW5nXFxcIixmdW5jdGlvbihlKXthdWRpb0lucHV0QWN0b3Iuc2VuZChcXFwiYWNxdWlyZVxcXCIpO30pO0V2ZW50QnVzLm9uKFxcXCJhdWRpbzp0ZWFyRG93blJlY29yZGluZ1xcXCIsZnVuY3Rpb24oZSl7YXVkaW9JbnB1dEFjdG9yLnNlbmQoXFxcInJlbGVhc2VcXFwiKTt9KTtFdmVudEJ1cy5vbihcXFwiYXVkaW86c3RhcnRSZWNvcmRpbmdcXFwiLGZ1bmN0aW9uKGUpey8vIENoZWNrIGlmIFBpIGlzIGN1cnJlbnRseSBzcGVha2luZyBhbmQgc3RvcCBoZXIgYXVkaW9cXG5hdWRpb091dHB1dEFjdG9yLnNlbmQoXFxcInBhdXNlXFxcIik7Ly8gQ2hlY2sgaWYgdGhlIE1lZGlhUmVjb3JkZXIgaXMgYWNxdWlyZWQgYmVmb3JlIHN0YXJ0aW5nP1xcbmF1ZGlvSW5wdXRBY3Rvci5zZW5kKFtcXFwiYWNxdWlyZVxcXCIsXFxcInN0YXJ0XFxcIl0pO30pO0V2ZW50QnVzLm9uKFxcXCJhdWRpbzpzdG9wUmVjb3JkaW5nXFxcIixmdW5jdGlvbihlKXthdWRpb0lucHV0QWN0b3Iuc2VuZChcXFwic3RvcFJlcXVlc3RlZFxcXCIpOy8qIHJlc3VtZSBvciBjYW5jZWwgUGkncyBhdWRpbyAqLyAvKiBUT0RPOiByZWFzc2VzcyBob3cgdG8gaGFuZGxlIGludGVycnVwdGlvbnNcXG4gICAgYXVkaW9PdXRwdXRBY3Rvci5zZW5kKFxcXCJwbGF5XFxcIik7IC8vIHJlc3VtZSBQaSdzIGF1ZGlvXFxuICAgIGF1ZGlvT3V0cHV0QWN0b3Iuc2VuZChcXFwic3RvcFxcXCIpOyAvLyBjYW5jZWwgUGkncyBhdWRpb1xcbiAgICAqL30pOy8vIGF1ZGlvIGlucHV0IChyZWNvcmRpbmcpIGV2ZW50cyAocGFzcyBNZWRpYVJlY29yZGVyIGV2ZW50cyAtPiBhdWRpbyBpbnB1dCBtYWNoaW5lIGFjdG9yKVxcbkV2ZW50QnVzLm9uKFxcXCJhdWRpbzpkYXRhYXZhaWxhYmxlXFxcIixmdW5jdGlvbihkZXRhaWwpe2F1ZGlvSW5wdXRBY3Rvci5zZW5kKF9vYmplY3RTcHJlYWQoe3R5cGU6XFxcImRhdGFBdmFpbGFibGVcXFwifSxkZXRhaWwpKTt9KTtFdmVudEJ1cy5vbihcXFwiYXVkaW86aW5wdXQ6c3RvcFxcXCIsZnVuY3Rpb24oZSl7YXVkaW9JbnB1dEFjdG9yLnNlbmQoXFxcInN0b3BcXFwiKTt9KTsvLyBhdWRpbyBvdXRwdXQgKHBsYXliYWNrKSBjb21tYW5kc1xcbkV2ZW50QnVzLm9uKFxcXCJhdWRpbzpyZWxvYWRcXFwiLGZ1bmN0aW9uKGUpe2F1ZGlvT3V0cHV0QWN0b3Iuc2VuZChcXFwicmVsb2FkXFxcIik7fSk7fXJlZ2lzdGVyQXVkaW9Db21tYW5kcygpO30pKCk7LyoqKioqKi99KSgpO1wiOyIsImV4cG9ydCBkZWZhdWx0IFwiPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBlbmNvZGluZz1cXFwiVVRGLThcXFwiPz5cXG48c3ZnIGlkPVxcXCJMYXllcl8xXFxcIiBkYXRhLW5hbWU9XFxcIkxheWVyIDFcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgdmlld0JveD1cXFwiMCAwIDY0LjA2IDY0LjMzXFxcIj5cXG4gIDxkZWZzPlxcbiAgICA8c3R5bGU+XFxuICAgICAgLmNscy0xIHtcXG4gICAgICAgIGZpbGw6ICMyNDM4MWI7XFxuICAgICAgfVxcblxcbiAgICAgIC5jbHMtMSwgLmNscy0yIHtcXG4gICAgICAgIHN0cm9rZS13aWR0aDogMHB4O1xcbiAgICAgIH1cXG5cXG4gICAgICAuY2xzLTIge1xcbiAgICAgICAgZmlsbDogI2RmZDdjMjtcXG4gICAgICB9XFxuICAgIDwvc3R5bGU+XFxuICA8L2RlZnM+XFxuICA8cGF0aCBjbGFzcz1cXFwiY2xzLTJcXFwiIGQ9XFxcIm0zMS43MSw2NC4zMkMxNC43Nyw2NC40Ni0uNDQsNDkuOTMsMCwzMS4zMy40MSwxNC40NywxNC4yOS0uMzIsMzIuNywwYzE2LjkxLjMsMzEuOCwxNC4zMiwzMS4zNiwzMy4xNC0uMzksMTYuNzYtMTQuNDksMzEuNTUtMzIuMzQsMzEuMThabTEwLjY3LTIzLjE5Yy4wNi0uNy0uNDEtMS4xMi0uODQtMS41NS0yLTItMy45NC00LjA3LTYuMDItNS45Ny0xLjE0LTEuMDQtMS4zMi0xLjY4LS4wNi0yLjgyLDIuMTMtMS45Myw0LjA3LTQuMDgsNi4xLTYuMTIuNzgtLjc5LDEuMzEtMS42NC4zNC0yLjU2LS45Mi0uODctMS43Mi0uMjgtMi40My40NS0yLjE3LDIuMjEtNC4zOSw0LjM5LTYuNTIsNi42NS0uNzIuNzctMS4xNi43LTEuODQtLjAyLTIuMDYtMi4xNy00LjE5LTQuMjgtNi4yOS02LjQxLS43Ni0uNzctMS41OS0xLjY4LTIuNjYtLjYzLTEuMTQsMS4xMi0uMTksMS45OC42MiwyLjc5LDIuMDcsMi4wOSw0LjA5LDQuMjIsNi4yLDYuMjYuNzcuNzUuODIsMS4yLjAyLDEuOTctMi4yMSwyLjEtNC4zMyw0LjMtNi40OSw2LjQ1LS43OS43OC0xLjMsMS42NS0uMzIsMi41Ni45Mi44NSwxLjcxLjI2LDIuNDMtLjQ3LDIuMTEtMi4xMiw0LjI4LTQuMTksNi4zMy02LjM4Ljg4LS45NCwxLjM3LS44NiwyLjIxLjAzLDIuMTMsMi4yNiw0LjM3LDQuNDEsNi41Nyw2LjYuNTEuNTEsMS4wOS43OCwxLjguNDguNTYtLjI0Ljg1LS42OC44Ny0xLjNaXFxcIi8+XFxuICA8cGF0aCBjbGFzcz1cXFwiY2xzLTFcXFwiIGQ9XFxcIm00Mi40Nyw0MS4yN2MtLjAyLjYyLS4zMiwxLjA2LS44NywxLjMtLjcxLjMxLTEuMjkuMDMtMS44LS40OC0yLjItMi4yLTQuNDQtNC4zNS02LjU3LTYuNi0uODQtLjg5LTEuMzMtLjk2LTIuMjEtLjAzLTIuMDQsMi4xOS00LjIyLDQuMjUtNi4zMyw2LjM4LS43Mi43Mi0xLjUxLDEuMzItMi40My40Ny0uOTgtLjkxLS40Ny0xLjc4LjMyLTIuNTYsMi4xNi0yLjE1LDQuMjgtNC4zNSw2LjQ5LTYuNDUuODEtLjc3Ljc2LTEuMjItLjAyLTEuOTctMi4xMS0yLjA0LTQuMTMtNC4xNy02LjItNi4yNi0uOC0uODEtMS43NS0xLjY3LS42Mi0yLjc5LDEuMDctMS4wNSwxLjktLjE0LDIuNjYuNjMsMi4xLDIuMTMsNC4yMyw0LjI0LDYuMjksNi40MS42OS43MywxLjEyLjc5LDEuODQuMDIsMi4xMy0yLjI2LDQuMzUtNC40Myw2LjUyLTYuNjUuNzItLjczLDEuNTEtMS4zMSwyLjQzLS40NS45Ny45Mi40NCwxLjc4LS4zNCwyLjU2LTIuMDMsMi4wNC0zLjk3LDQuMTktNi4xLDYuMTItMS4yNSwxLjE0LTEuMDgsMS43OC4wNiwyLjgyLDIuMDksMS45MSw0LjAyLDMuOTcsNi4wMiw1Ljk3LjQzLjQzLjkuODUuODQsMS41NVpcXFwiLz5cXG48L3N2Zz5cIjsiLCJleHBvcnQgZGVmYXVsdCBcIjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB4bWxuczp4bGluaz1cXFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1xcXCIgem9vbUFuZFBhbj1cXFwibWFnbmlmeVxcXCIgdmlld0JveD1cXFwiMCAwIDc2OCA3NjcuOTk5OTk0XFxcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVxcXCJ4TWlkWU1pZCBtZWV0XFxcIiB2ZXJzaW9uPVxcXCIxLjBcXFwiPjxwYXRoIGZpbGw9XFxcIiNlNGQ4YzFcXFwiIGQ9XFxcIk0gNzY4LjEzMjgxMiAzNzkuNTM1MTU2IEMgNzY4LjEzMjgxMiAxNjkuMDg5ODQ0IDU5Ny41MjM0MzggLTEuNDk2MDk0IDM4Ny4wNTA3ODEgLTEuNDk2MDk0IEMgMTc2LjYwOTM3NSAtMS40OTYwOTQgNS45OTYwOTQgMTY5LjA4OTg0NCA1Ljk5NjA5NCAzNzkuNTM1MTU2IEMgNS45OTYwOTQgNTg5Ljk0OTIxOSAxNzYuNjA5Mzc1IDc2MC41MzkwNjIgMzg3LjA1MDc4MSA3NjAuNTM5MDYyIEMgNTk3LjUyMzQzOCA3NjAuNTM5MDYyIDc2OC4xMzI4MTIgNTg5Ljk0OTIxOSA3NjguMTMyODEyIDM3OS41MzUxNTYgXFxcIiBmaWxsLW9wYWNpdHk9XFxcIjFcXFwiIGZpbGwtcnVsZT1cXFwibm9uemVyb1xcXCIvPjxwYXRoIGZpbGw9XFxcIiM3NzZkNmRcXFwiIGQ9XFxcIk0gNTM4Ljk5NjA5NCAyMjMuMTUyMzQ0IEwgMzA2LjUzNTE1NiAyMjkuODU1NDY5IEwgNTM4Ljk5NjA5NCA0NTUuNjk1MzEyIFogTSA1MzguOTk2MDk0IDIyMy4xNTIzNDQgXFxcIiBmaWxsLW9wYWNpdHk9XFxcIjFcXFwiIGZpbGwtcnVsZT1cXFwibm9uemVyb1xcXCIvPjxwYXRoIGZpbGw9XFxcIiM3NzZkNmRcXFwiIGQ9XFxcIk0gMjM1LjEwNTQ2OSA1MzUuODkwNjI1IEwgNDY3LjU5NzY1NiA1MjkuMTg3NSBMIDIzNS4xMDU0NjkgMzAzLjM0Mzc1IFogTSAyMzUuMTA1NDY5IDUzNS44OTA2MjUgXFxcIiBmaWxsLW9wYWNpdHk9XFxcIjFcXFwiIGZpbGwtcnVsZT1cXFwibm9uemVyb1xcXCIvPjwvc3ZnPlwiOyIsImV4cG9ydCBkZWZhdWx0IFwiPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHhtbG5zOnhsaW5rPVxcXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXFxcIiB3aWR0aD1cXFwiNTAwXFxcIiB6b29tQW5kUGFuPVxcXCJtYWduaWZ5XFxcIiB2aWV3Qm94PVxcXCIwIDAgMzc1IDM3NC45OTk5OTFcXFwiIGhlaWdodD1cXFwiNTAwXFxcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVxcXCJ4TWlkWU1pZCBtZWV0XFxcIiB2ZXJzaW9uPVxcXCIxLjBcXFwiPjxwYXRoIGZpbGw9XFxcIiM3NzZkNmRcXFwiIGQ9XFxcIk0gMjM5LjcyMjY1NiAxMjYuNDQxNDA2IEwgMjM5LjcyMjY1NiAxMjIuMzAwNzgxIEMgMjM5LjcyMjY1NiA5My41MDc4MTIgMjE2LjI5Njg3NSA3MC4wNzgxMjUgMTg3LjUgNzAuMDc4MTI1IEMgMTU4LjcwMzEyNSA3MC4wNzgxMjUgMTM1LjI3NzM0NCA5My41MDc4MTIgMTM1LjI3NzM0NCAxMjIuMzAwNzgxIEwgMTM1LjI3NzM0NCAxODcuOTUzMTI1IEMgMTM1LjI3NzM0NCAxOTkuOTg4MjgxIDEzOS40MTAxNTYgMjExLjA1MDc4MSAxNDYuMjczNDM4IDIxOS44OTA2MjUgWiBNIDIzOS43MjI2NTYgMTI2LjQ0MTQwNiBcXFwiIGZpbGwtb3BhY2l0eT1cXFwiMVxcXCIgZmlsbC1ydWxlPVxcXCJub256ZXJvXFxcIi8+PHBhdGggZmlsbD1cXFwiIzc3NmQ2ZFxcXCIgZD1cXFwiTSAxNTUuMDQ2ODc1IDIyOC43OTI5NjkgQyAxNjMuOTY0ODQ0IDIzNS44OTg0MzggMTc1LjIzNDM3NSAyNDAuMTc1NzgxIDE4Ny41IDI0MC4xNzU3ODEgQyAyMTYuMjk2ODc1IDI0MC4xNzU3ODEgMjM5LjcyMjY1NiAyMTYuNzUgMjM5LjcyMjY1NiAxODcuOTUzMTI1IEwgMjM5LjcyMjY1NiAxNDQuMTEzMjgxIFogTSAxNTUuMDQ2ODc1IDIyOC43OTI5NjkgXFxcIiBmaWxsLW9wYWNpdHk9XFxcIjFcXFwiIGZpbGwtcnVsZT1cXFwibm9uemVyb1xcXCIvPjxwYXRoIGZpbGw9XFxcIiM3NzZkNmRcXFwiIGQ9XFxcIk0gMTg3LjUgMCBDIDgzLjk0NTMxMiAwIDAgODMuOTQ1MzEyIDAgMTg3LjUgQyAwIDI5MS4wNTQ2ODggODMuOTQ1MzEyIDM3NSAxODcuNSAzNzUgQyAyOTEuMDU0Njg4IDM3NSAzNzUgMjkxLjA1NDY4OCAzNzUgMTg3LjUgQyAzNzUgODMuOTQ1MzEyIDI5MS4wNTQ2ODggMCAxODcuNSAwIFogTSAyODcuNDg0Mzc1IDk2LjM1NTQ2OSBMIDI1NC42NDA2MjUgMTI5LjE5NTMxMiBMIDI1NC42NDA2MjUgMTg3Ljk1MzEyNSBDIDI1NC42NDA2MjUgMjI0Ljk3NjU2MiAyMjQuNTIzNDM4IDI1NS4wOTc2NTYgMTg3LjUgMjU1LjA5NzY1NiBDIDE3MS4xMTcxODggMjU1LjA5NzY1NiAxNTYuMTA1NDY5IDI0OS4xODM1OTQgMTQ0LjQzNzUgMjM5LjQwMjM0NCBMIDEzOC4xMDkzNzUgMjQ1LjczMDQ2OSBDIDE1MS40MTc5NjkgMjU3LjEyMTA5NCAxNjguNjUyMzQ0IDI2NC4wNDY4NzUgMTg3LjUgMjY0LjA0Njg3NSBDIDIyOS40NTcwMzEgMjY0LjA0Njg3NSAyNjMuNTkzNzUgMjI5LjkxNDA2MiAyNjMuNTkzNzUgMTg3Ljk1MzEyNSBDIDI2My41OTM3NSAxODMuODMyMDMxIDI2Ni45MzM1OTQgMTgwLjQ5NjA5NCAyNzEuMDU0Njg4IDE4MC40OTYwOTQgQyAyNzUuMTc1NzgxIDE4MC40OTYwOTQgMjc4LjUxNTYyNSAxODMuODM1OTM4IDI3OC41MTU2MjUgMTg3Ljk1MzEyNSBDIDI3OC41MTU2MjUgMjM1LjYyNSAyNDEuNjY3OTY5IDI3NC44MjgxMjUgMTk0Ljk2MDkzOCAyNzguNjQwNjI1IEwgMTk0Ljk2MDkzOCAzMDQuOTIxODc1IEwgMjIwLjEyMTA5NCAzMDQuOTIxODc1IEMgMjI0LjI0MjE4OCAzMDQuOTIxODc1IDIyNy41ODIwMzEgMzA4LjI2MTcxOSAyMjcuNTgyMDMxIDMxMi4zODI4MTIgQyAyMjcuNTgyMDMxIDMxNi41IDIyNC4yNDIxODggMzE5LjgzOTg0NCAyMjAuMTIxMDk0IDMxOS44Mzk4NDQgTCAxNTQuODc1IDMxOS44Mzk4NDQgQyAxNTAuNzU3ODEyIDMxOS44Mzk4NDQgMTQ3LjQxNzk2OSAzMTYuNSAxNDcuNDE3OTY5IDMxMi4zODI4MTIgQyAxNDcuNDE3OTY5IDMwOC4yNjE3MTkgMTUwLjc1NzgxMiAzMDQuOTIxODc1IDE1NC44NzUgMzA0LjkyMTg3NSBMIDE4MC4wMzkwNjIgMzA0LjkyMTg3NSBMIDE4MC4wMzkwNjIgMjc4LjYzNjcxOSBDIDE2MC4wMDc4MTIgMjc3LjAwMzkwNiAxNDEuODE2NDA2IDI2OC44MjQyMTkgMTI3LjU0Mjk2OSAyNTYuMjk2ODc1IEwgOTYuMzUxNTYyIDI4Ny40ODQzNzUgQyA5NS4xMzI4MTIgMjg4LjcwMzEyNSA5My41MzEyNSAyODkuMzE2NDA2IDkxLjkzMzU5NCAyODkuMzE2NDA2IEMgOTAuMzM1OTM4IDI4OS4zMTY0MDYgODguNzM0Mzc1IDI4OC43MDMxMjUgODcuNTE1NjI1IDI4Ny40ODQzNzUgQyA4NS4wNzQyMTkgMjg1LjA0Mjk2OSA4NS4wNzQyMTkgMjgxLjA4NTkzOCA4Ny41MTU2MjUgMjc4LjY0NDUzMSBMIDExOC43NjE3MTkgMjQ3LjM5ODQzOCBDIDEwNC45Mjk2ODggMjMxLjQzNzUgOTYuNDg0Mzc1IDIxMC42ODc1IDk2LjQ4NDM3NSAxODcuOTUzMTI1IEMgOTYuNDg0Mzc1IDE4My44MzIwMzEgOTkuODI0MjE5IDE4MC40OTYwOTQgMTAzLjk0MTQwNiAxODAuNDk2MDk0IEMgMTA4LjA2MjUgMTgwLjQ5NjA5NCAxMTEuNDAyMzQ0IDE4My44MzU5MzggMTExLjQwMjM0NCAxODcuOTUzMTI1IEMgMTExLjQwMjM0NCAyMDYuNTc0MjE5IDExOC4xNDg0MzggMjIzLjYyODkwNiAxMjkuMjkyOTY5IDIzNi44NjcxODggTCAxMzUuNjI4OTA2IDIzMC41MzEyNSBDIDEyNi4wODk4NDQgMjE4LjkzNzUgMTIwLjM1NTQ2OSAyMDQuMTA1NDY5IDEyMC4zNTU0NjkgMTg3Ljk1MzEyNSBMIDEyMC4zNTU0NjkgMTIyLjMwMDc4MSBDIDEyMC4zNTU0NjkgODUuMjgxMjUgMTUwLjQ3NjU2MiA1NS4xNjAxNTYgMTg3LjQ5NjA5NCA1NS4xNjAxNTYgQyAyMjEuMTI4OTA2IDU1LjE2MDE1NiAyNDguOTgwNDY5IDgwLjAzOTA2MiAyNTMuODE2NDA2IDExMi4zNDM3NSBMIDI3OC42NDA2MjUgODcuNTE1NjI1IEMgMjgxLjA4MjAzMSA4NS4wNzgxMjUgMjg1LjAzOTA2MiA4NS4wNzgxMjUgMjg3LjQ4MDQ2OSA4Ny41MTU2MjUgQyAyODkuOTI1NzgxIDg5Ljk1NzAzMSAyODkuOTI1NzgxIDkzLjkxNDA2MiAyODcuNDg0Mzc1IDk2LjM1NTQ2OSBaIE0gMjg3LjQ4NDM3NSA5Ni4zNTU0NjkgXFxcIiBmaWxsLW9wYWNpdHk9XFxcIjFcXFwiIGZpbGwtcnVsZT1cXFwibm9uemVyb1xcXCIvPjwvc3ZnPlwiOyIsImV4cG9ydCBkZWZhdWx0IFwiPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHhtbG5zOnhsaW5rPVxcXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXFxcIlxcbiAgICB6b29tQW5kUGFuPVxcXCJtYWduaWZ5XFxcIiB2aWV3Qm94PVxcXCIwIDAgMzc1IDM3NC45OTk5OTFcXFwiXFxuICAgIHByZXNlcnZlQXNwZWN0UmF0aW89XFxcInhNaWRZTWlkIG1lZXRcXFwiIHZlcnNpb249XFxcIjEuMFxcXCI+XFxuICAgIDxkZWZzPlxcbiAgICAgICAgPGZpbHRlciB4PVxcXCIwJVxcXCIgeT1cXFwiMCVcXFwiIHdpZHRoPVxcXCIxMDAlXFxcIiBoZWlnaHQ9XFxcIjEwMCVcXFwiIGlkPVxcXCJlZTEwYjhlMWIzXFxcIj5cXG4gICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB2YWx1ZXM9XFxcIjAgMCAwIDAgMSAwIDAgMCAwIDEgMCAwIDAgMCAxIDAgMCAwIDEgMFxcXCJcXG4gICAgICAgICAgICAgICAgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPVxcXCJzUkdCXFxcIiAvPlxcbiAgICAgICAgPC9maWx0ZXI+XFxuICAgICAgICA8bWFzayBpZD1cXFwiZTdkMTQ4YmVkY1xcXCI+XFxuICAgICAgICAgICAgPGcgZmlsdGVyPVxcXCJ1cmwoI2VlMTBiOGUxYjMpXFxcIj5cXG4gICAgICAgICAgICAgICAgPHJlY3QgeD1cXFwiLTM3LjVcXFwiIHdpZHRoPVxcXCI0NTBcXFwiIGZpbGw9XFxcIiMwMDAwMDBcXFwiIHk9XFxcIi0zNy40OTk5OTlcXFwiIGhlaWdodD1cXFwiNDQ5Ljk5OTk4OVxcXCJcXG4gICAgICAgICAgICAgICAgICAgIGZpbGwtb3BhY2l0eT1cXFwiMC41NVxcXCIgLz5cXG4gICAgICAgICAgICA8L2c+XFxuICAgICAgICA8L21hc2s+XFxuICAgICAgICA8Y2xpcFBhdGggaWQ9XFxcIjljYTUxMzVmNzdcXFwiPlxcbiAgICAgICAgICAgIDxyZWN0IHg9XFxcIjBcXFwiIHdpZHRoPVxcXCIzNzVcXFwiIHk9XFxcIjBcXFwiIGhlaWdodD1cXFwiMzc1XFxcIiAvPlxcbiAgICAgICAgPC9jbGlwUGF0aD5cXG4gICAgPC9kZWZzPlxcbiAgICA8ZyBtYXNrPVxcXCJ1cmwoI2U3ZDE0OGJlZGMpXFxcIj5cXG4gICAgICAgIDxnIHRyYW5zZm9ybT1cXFwibWF0cml4KDEsIDAsIDAsIDEsIDAsIDApXFxcIj5cXG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XFxcInVybCgjOWNhNTEzNWY3NylcXFwiPlxcbiAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVxcXCIjNDE4YTJmXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgZD1cXFwiTSAzNzUgMTg3LjUgQyAzNzUgMTkwLjU3MDMxMiAzNzQuOTI1NzgxIDE5My42MzY3MTkgMzc0Ljc3MzQzOCAxOTYuNjk5MjE5IEMgMzc0LjYyNSAxOTkuNzY1NjI1IDM3NC4zOTg0MzggMjAyLjgyNDIxOSAzNzQuMDk3NjU2IDIwNS44Nzg5MDYgQyAzNzMuNzk2ODc1IDIwOC45MzM1OTQgMzczLjQyMTg3NSAyMTEuOTc2NTYyIDM3Mi45Njg3NSAyMTUuMDExNzE5IEMgMzcyLjUxOTUzMSAyMTguMDQ2ODc1IDM3MS45OTYwOTQgMjIxLjA3MDMxMiAzNzEuMzk4NDM4IDIyNC4wNzgxMjUgQyAzNzAuNzk2ODc1IDIyNy4wODk4NDQgMzcwLjEyNSAyMzAuMDgyMDMxIDM2OS4zODI4MTIgMjMzLjA1ODU5NCBDIDM2OC42MzY3MTkgMjM2LjAzNTE1NiAzNjcuODE2NDA2IDIzOC45OTIxODggMzY2LjkyNTc4MSAyNDEuOTI5Njg4IEMgMzY2LjAzNTE1NiAyNDQuODYzMjgxIDM2NS4wNzQyMTkgMjQ3Ljc3NzM0NCAzNjQuMDM5MDYyIDI1MC42Njc5NjkgQyAzNjMuMDAzOTA2IDI1My41NTQ2ODggMzYxLjkwMjM0NCAyNTYuNDE3OTY5IDM2MC43MjY1NjIgMjU5LjI1MzkwNiBDIDM1OS41NTQ2ODggMjYyLjA4OTg0NCAzNTguMzA4NTk0IDI2NC44OTQ1MzEgMzU2Ljk5NjA5NCAyNjcuNjY3OTY5IEMgMzU1LjY4NzUgMjcwLjQ0MTQwNiAzNTQuMzA4NTk0IDI3My4xNzk2ODggMzUyLjg1OTM3NSAyNzUuODg2NzE5IEMgMzUxLjQxNDA2MiAyNzguNTkzNzUgMzQ5LjkwMjM0NCAyODEuMjYxNzE5IDM0OC4zMjQyMTkgMjgzLjg5NDUzMSBDIDM0Ni43NDYwOTQgMjg2LjUyNzM0NCAzNDUuMTA1NDY5IDI4OS4xMTcxODggMzQzLjQwMjM0NCAyOTEuNjY3OTY5IEMgMzQxLjY5NTMxMiAyOTQuMjIyNjU2IDMzOS45Mjk2ODggMjk2LjczMDQ2OSAzMzguMTAxNTYyIDI5OS4xOTUzMTIgQyAzMzYuMjczNDM4IDMwMS42NjAxNTYgMzM0LjM4NjcxOSAzMDQuMDc4MTI1IDMzMi40NDE0MDYgMzA2LjQ0OTIxOSBDIDMzMC40OTIxODggMzA4LjgyMDMxMiAzMjguNDg4MjgxIDMxMS4xNDQ1MzEgMzI2LjQyOTY4OCAzMTMuNDE3OTY5IEMgMzI0LjM2NzE4OCAzMTUuNjkxNDA2IDMyMi4yNTM5MDYgMzE3LjkxNDA2MiAzMjAuMDgyMDMxIDMyMC4wODIwMzEgQyAzMTcuOTE0MDYyIDMyMi4yNTM5MDYgMzE1LjY5MTQwNiAzMjQuMzY3MTg4IDMxMy40MTc5NjkgMzI2LjQyOTY4OCBDIDMxMS4xNDQ1MzEgMzI4LjQ4ODI4MSAzMDguODIwMzEyIDMzMC40OTIxODggMzA2LjQ0OTIxOSAzMzIuNDQxNDA2IEMgMzA0LjA3ODEyNSAzMzQuMzg2NzE5IDMwMS42NjAxNTYgMzM2LjI3MzQzOCAyOTkuMTk1MzEyIDMzOC4xMDE1NjIgQyAyOTYuNzMwNDY5IDMzOS45Mjk2ODggMjk0LjIyMjY1NiAzNDEuNjk1MzEyIDI5MS42Njc5NjkgMzQzLjQwMjM0NCBDIDI4OS4xMTcxODggMzQ1LjEwNTQ2OSAyODYuNTI3MzQ0IDM0Ni43NDYwOTQgMjgzLjg5NDUzMSAzNDguMzI0MjE5IEMgMjgxLjI2MTcxOSAzNDkuOTAyMzQ0IDI3OC41OTM3NSAzNTEuNDE0MDYyIDI3NS44ODY3MTkgMzUyLjg1OTM3NSBDIDI3My4xNzk2ODggMzU0LjMwODU5NCAyNzAuNDQxNDA2IDM1NS42ODc1IDI2Ny42Njc5NjkgMzU2Ljk5NjA5NCBDIDI2NC44OTA2MjUgMzU4LjMwODU5NCAyNjIuMDg5ODQ0IDM1OS41NTQ2ODggMjU5LjI1MzkwNiAzNjAuNzI2NTYyIEMgMjU2LjQxNzk2OSAzNjEuOTAyMzQ0IDI1My41NTQ2ODggMzYzLjAwMzkwNiAyNTAuNjY3OTY5IDM2NC4wMzkwNjIgQyAyNDcuNzc3MzQ0IDM2NS4wNzQyMTkgMjQ0Ljg2MzI4MSAzNjYuMDM1MTU2IDI0MS45Mjk2ODggMzY2LjkyNTc4MSBDIDIzOC45OTIxODggMzY3LjgxNjQwNiAyMzYuMDM1MTU2IDM2OC42MzY3MTkgMjMzLjA1ODU5NCAzNjkuMzc4OTA2IEMgMjMwLjA4MjAzMSAzNzAuMTI1IDIyNy4wODk4NDQgMzcwLjc5Njg3NSAyMjQuMDc4MTI1IDM3MS4zOTg0MzggQyAyMjEuMDcwMzEyIDM3MS45OTYwOTQgMjE4LjA0Njg3NSAzNzIuNTE5NTMxIDIxNS4wMTE3MTkgMzcyLjk2ODc1IEMgMjExLjk3NjU2MiAzNzMuNDIxODc1IDIwOC45MzM1OTQgMzczLjc5Njg3NSAyMDUuODc4OTA2IDM3NC4wOTc2NTYgQyAyMDIuODI0MjE5IDM3NC4zOTg0MzggMTk5Ljc2NTYyNSAzNzQuNjI1IDE5Ni42OTkyMTkgMzc0Ljc3MzQzOCBDIDE5My42MzY3MTkgMzc0LjkyNTc4MSAxOTAuNTcwMzEyIDM3NSAxODcuNSAzNzUgQyAxODQuNDI5Njg4IDM3NSAxODEuMzYzMjgxIDM3NC45MjU3ODEgMTc4LjMwMDc4MSAzNzQuNzczNDM4IEMgMTc1LjIzNDM3NSAzNzQuNjI1IDE3Mi4xNzU3ODEgMzc0LjM5ODQzOCAxNjkuMTIxMDk0IDM3NC4wOTc2NTYgQyAxNjYuMDY2NDA2IDM3My43OTY4NzUgMTYzLjAyMzQzOCAzNzMuNDIxODc1IDE1OS45ODgyODEgMzcyLjk2ODc1IEMgMTU2Ljk1MzEyNSAzNzIuNTE5NTMxIDE1My45Mjk2ODggMzcxLjk5NjA5NCAxNTAuOTIxODc1IDM3MS4zOTg0MzggQyAxNDcuOTEwMTU2IDM3MC43OTY4NzUgMTQ0LjkxNzk2OSAzNzAuMTI1IDE0MS45NDE0MDYgMzY5LjM3ODkwNiBDIDEzOC45NjQ4NDQgMzY4LjYzNjcxOSAxMzYuMDA3ODEyIDM2Ny44MTY0MDYgMTMzLjA3MDMxMiAzNjYuOTI1NzgxIEMgMTMwLjEzNjcxOSAzNjYuMDM1MTU2IDEyNy4yMjI2NTYgMzY1LjA3NDIxOSAxMjQuMzMyMDMxIDM2NC4wMzkwNjIgQyAxMjEuNDQ1MzEyIDM2My4wMDM5MDYgMTE4LjU4MjAzMSAzNjEuOTAyMzQ0IDExNS43NDYwOTQgMzYwLjcyNjU2MiBDIDExMi45MTAxNTYgMzU5LjU1NDY4OCAxMTAuMTA1NDY5IDM1OC4zMDg1OTQgMTA3LjMzMjAzMSAzNTYuOTk2MDk0IEMgMTA0LjU1ODU5NCAzNTUuNjg3NSAxMDEuODIwMzEyIDM1NC4zMDg1OTQgOTkuMTEzMjgxIDM1Mi44NTkzNzUgQyA5Ni40MDYyNSAzNTEuNDE0MDYyIDkzLjczODI4MSAzNDkuOTAyMzQ0IDkxLjEwNTQ2OSAzNDguMzI0MjE5IEMgODguNDcyNjU2IDM0Ni43NDYwOTQgODUuODgyODEyIDM0NS4xMDU0NjkgODMuMzMyMDMxIDM0My40MDIzNDQgQyA4MC43NzczNDQgMzQxLjY5NTMxMiA3OC4yNjk1MzEgMzM5LjkyOTY4OCA3NS44MDQ2ODggMzM4LjEwMTU2MiBDIDczLjMzOTg0NCAzMzYuMjczNDM4IDcwLjkyMTg3NSAzMzQuMzg2NzE5IDY4LjU1MDc4MSAzMzIuNDM3NSBDIDY2LjE3OTY4OCAzMzAuNDkyMTg4IDYzLjg1NTQ2OSAzMjguNDg4MjgxIDYxLjU4MjAzMSAzMjYuNDI5Njg4IEMgNTkuMzA4NTk0IDMyNC4zNjcxODggNTcuMDg1OTM4IDMyMi4yNTM5MDYgNTQuOTE3OTY5IDMyMC4wODIwMzEgQyA1Mi43NDYwOTQgMzE3LjkxNDA2MiA1MC42MzI4MTIgMzE1LjY5MTQwNiA0OC41NzAzMTIgMzEzLjQxNzk2OSBDIDQ2LjUxMTcxOSAzMTEuMTQ0NTMxIDQ0LjUwNzgxMiAzMDguODIwMzEyIDQyLjU2MjUgMzA2LjQ0OTIxOSBDIDQwLjYxMzI4MSAzMDQuMDc4MTI1IDM4LjcyNjU2MiAzMDEuNjYwMTU2IDM2Ljg5ODQzOCAyOTkuMTk1MzEyIEMgMzUuMDcwMzEyIDI5Ni43MzA0NjkgMzMuMzA0Njg4IDI5NC4yMjI2NTYgMzEuNTk3NjU2IDI5MS42Njc5NjkgQyAyOS44OTQ1MzEgMjg5LjExNzE4OCAyOC4yNTM5MDYgMjg2LjUyNzM0NCAyNi42NzU3ODEgMjgzLjg5NDUzMSBDIDI1LjA5NzY1NiAyODEuMjYxNzE5IDIzLjU4NTkzOCAyNzguNTkzNzUgMjIuMTQwNjI1IDI3NS44ODY3MTkgQyAyMC42OTE0MDYgMjczLjE3OTY4OCAxOS4zMTI1IDI3MC40NDE0MDYgMTguMDAzOTA2IDI2Ny42Njc5NjkgQyAxNi42OTE0MDYgMjY0Ljg5NDUzMSAxNS40NDUzMTIgMjYyLjA4OTg0NCAxNC4yNzM0MzggMjU5LjI1MzkwNiBDIDEzLjA5NzY1NiAyNTYuNDE3OTY5IDExLjk5NjA5NCAyNTMuNTU0Njg4IDEwLjk2MDkzOCAyNTAuNjY3OTY5IEMgOS45MjU3ODEgMjQ3Ljc3NzM0NCA4Ljk2NDg0NCAyNDQuODYzMjgxIDguMDc0MjE5IDI0MS45Mjk2ODggQyA3LjE4MzU5NCAyMzguOTkyMTg4IDYuMzYzMjgxIDIzNi4wMzUxNTYgNS42MTcxODggMjMzLjA1ODU5NCBDIDQuODc1IDIzMC4wODIwMzEgNC4yMDMxMjUgMjI3LjA4OTg0NCAzLjYwMTU2MiAyMjQuMDc4MTI1IEMgMy4wMDM5MDYgMjIxLjA3MDMxMiAyLjQ4MDQ2OSAyMTguMDQ2ODc1IDIuMDMxMjUgMjE1LjAxMTcxOSBDIDEuNTc4MTI1IDIxMS45NzY1NjIgMS4yMDMxMjUgMjA4LjkzMzU5NCAwLjkwMjM0NCAyMDUuODc4OTA2IEMgMC42MDE1NjIgMjAyLjgyNDIxOSAwLjM3NSAxOTkuNzY1NjI1IDAuMjI2NTYyIDE5Ni42OTkyMTkgQyAwLjA3NDIxODggMTkzLjYzNjcxOSAwIDE5MC41NzAzMTIgMCAxODcuNSBDIDAgMTg0LjQyOTY4OCAwLjA3NDIxODggMTgxLjM2MzI4MSAwLjIyNjU2MiAxNzguMzAwNzgxIEMgMC4zNzUgMTc1LjIzNDM3NSAwLjYwMTU2MiAxNzIuMTc1NzgxIDAuOTAyMzQ0IDE2OS4xMjEwOTQgQyAxLjIwMzEyNSAxNjYuMDY2NDA2IDEuNTc4MTI1IDE2My4wMjM0MzggMi4wMzEyNSAxNTkuOTg4MjgxIEMgMi40ODA0NjkgMTU2Ljk1MzEyNSAzLjAwMzkwNiAxNTMuOTI5Njg4IDMuNjAxNTYyIDE1MC45MjE4NzUgQyA0LjIwMzEyNSAxNDcuOTEwMTU2IDQuODc1IDE0NC45MTc5NjkgNS42MTcxODggMTQxLjk0MTQwNiBDIDYuMzYzMjgxIDEzOC45NjQ4NDQgNy4xODM1OTQgMTM2LjAwNzgxMiA4LjA3NDIxOSAxMzMuMDcwMzEyIEMgOC45NjQ4NDQgMTMwLjEzNjcxOSA5LjkyNTc4MSAxMjcuMjIyNjU2IDEwLjk2MDkzOCAxMjQuMzMyMDMxIEMgMTEuOTk2MDk0IDEyMS40NDUzMTIgMTMuMDk3NjU2IDExOC41ODIwMzEgMTQuMjczNDM4IDExNS43NDYwOTQgQyAxNS40NDUzMTIgMTEyLjkxMDE1NiAxNi42OTE0MDYgMTEwLjEwNTQ2OSAxOC4wMDM5MDYgMTA3LjMzMjAzMSBDIDE5LjMxMjUgMTA0LjU1ODU5NCAyMC42OTE0MDYgMTAxLjgyMDMxMiAyMi4xNDA2MjUgOTkuMTEzMjgxIEMgMjMuNTg1OTM4IDk2LjQwNjI1IDI1LjA5NzY1NiA5My43MzgyODEgMjYuNjc1NzgxIDkxLjEwNTQ2OSBDIDI4LjI1MzkwNiA4OC40NzI2NTYgMjkuODk0NTMxIDg1Ljg4MjgxMiAzMS41OTc2NTYgODMuMzMyMDMxIEMgMzMuMzA0Njg4IDgwLjc3NzM0NCAzNS4wNzAzMTIgNzguMjY5NTMxIDM2Ljg5ODQzOCA3NS44MDQ2ODggQyAzOC43MjY1NjIgNzMuMzM5ODQ0IDQwLjYxMzI4MSA3MC45MjE4NzUgNDIuNTYyNSA2OC41NTA3ODEgQyA0NC41MDc4MTIgNjYuMTc5Njg4IDQ2LjUxMTcxOSA2My44NTU0NjkgNDguNTcwMzEyIDYxLjU4MjAzMSBDIDUwLjYzMjgxMiA1OS4zMDg1OTQgNTIuNzQ2MDk0IDU3LjA4NTkzOCA1NC45MTc5NjkgNTQuOTE3OTY5IEMgNTcuMDg1OTM4IDUyLjc0NjA5NCA1OS4zMDg1OTQgNTAuNjMyODEyIDYxLjU4MjAzMSA0OC41NzAzMTIgQyA2My44NTU0NjkgNDYuNTExNzE5IDY2LjE3OTY4OCA0NC41MDc4MTIgNjguNTUwNzgxIDQyLjU1ODU5NCBDIDcwLjkyMTg3NSA0MC42MTMyODEgNzMuMzM5ODQ0IDM4LjcyNjU2MiA3NS44MDQ2ODggMzYuODk4NDM4IEMgNzguMjY5NTMxIDM1LjA3MDMxMiA4MC43NzczNDQgMzMuMzA0Njg4IDgzLjMzMjAzMSAzMS41OTc2NTYgQyA4NS44ODI4MTIgMjkuODk0NTMxIDg4LjQ3MjY1NiAyOC4yNTM5MDYgOTEuMTA1NDY5IDI2LjY3NTc4MSBDIDkzLjczODI4MSAyNS4wOTc2NTYgOTYuNDA2MjUgMjMuNTg1OTM4IDk5LjExMzI4MSAyMi4xNDA2MjUgQyAxMDEuODIwMzEyIDIwLjY5MTQwNiAxMDQuNTU4NTk0IDE5LjMxMjUgMTA3LjMzMjAzMSAxOC4wMDM5MDYgQyAxMTAuMTA1NDY5IDE2LjY5MTQwNiAxMTIuOTEwMTU2IDE1LjQ0NTMxMiAxMTUuNzQ2MDk0IDE0LjI3MzQzOCBDIDExOC41ODIwMzEgMTMuMDk3NjU2IDEyMS40NDUzMTIgMTEuOTk2MDk0IDEyNC4zMzIwMzEgMTAuOTYwOTM4IEMgMTI3LjIyMjY1NiA5LjkyNTc4MSAxMzAuMTM2NzE5IDguOTY0ODQ0IDEzMy4wNzAzMTIgOC4wNzQyMTkgQyAxMzYuMDA3ODEyIDcuMTgzNTk0IDEzOC45NjQ4NDQgNi4zNjMyODEgMTQxLjk0MTQwNiA1LjYyMTA5NCBDIDE0NC45MTc5NjkgNC44NzUgMTQ3LjkxMDE1NiA0LjIwMzEyNSAxNTAuOTIxODc1IDMuNjAxNTYyIEMgMTUzLjkyOTY4OCAzLjAwMzkwNiAxNTYuOTUzMTI1IDIuNDgwNDY5IDE1OS45ODgyODEgMi4wMzEyNSBDIDE2My4wMjM0MzggMS41NzgxMjUgMTY2LjA2NjQwNiAxLjIwMzEyNSAxNjkuMTIxMDk0IDAuOTAyMzQ0IEMgMTcyLjE3NTc4MSAwLjYwMTU2MiAxNzUuMjM0Mzc1IDAuMzc1IDE3OC4zMDA3ODEgMC4yMjY1NjIgQyAxODEuMzYzMjgxIDAuMDc0MjE4OCAxODQuNDI5Njg4IDAgMTg3LjUgMCBDIDE5MC41NzAzMTIgMCAxOTMuNjM2NzE5IDAuMDc0MjE4OCAxOTYuNjk5MjE5IDAuMjI2NTYyIEMgMTk5Ljc2NTYyNSAwLjM3NSAyMDIuODI0MjE5IDAuNjAxNTYyIDIwNS44Nzg5MDYgMC45MDIzNDQgQyAyMDguOTMzNTk0IDEuMjAzMTI1IDIxMS45NzY1NjIgMS41NzgxMjUgMjE1LjAxMTcxOSAyLjAzMTI1IEMgMjE4LjA0Njg3NSAyLjQ4MDQ2OSAyMjEuMDcwMzEyIDMuMDAzOTA2IDIyNC4wNzgxMjUgMy42MDE1NjIgQyAyMjcuMDg5ODQ0IDQuMjAzMTI1IDIzMC4wODIwMzEgNC44NzUgMjMzLjA1ODU5NCA1LjYxNzE4OCBDIDIzNi4wMzUxNTYgNi4zNjMyODEgMjM4Ljk5MjE4OCA3LjE4MzU5NCAyNDEuOTI5Njg4IDguMDc0MjE5IEMgMjQ0Ljg2MzI4MSA4Ljk2NDg0NCAyNDcuNzc3MzQ0IDkuOTI1NzgxIDI1MC42Njc5NjkgMTAuOTYwOTM4IEMgMjUzLjU1NDY4OCAxMS45OTYwOTQgMjU2LjQxNzk2OSAxMy4wOTc2NTYgMjU5LjI1MzkwNiAxNC4yNzM0MzggQyAyNjIuMDg5ODQ0IDE1LjQ0NTMxMiAyNjQuODk0NTMxIDE2LjY5MTQwNiAyNjcuNjY3OTY5IDE4LjAwMzkwNiBDIDI3MC40NDE0MDYgMTkuMzEyNSAyNzMuMTc5Njg4IDIwLjY5MTQwNiAyNzUuODg2NzE5IDIyLjE0MDYyNSBDIDI3OC41OTM3NSAyMy41ODU5MzggMjgxLjI2MTcxOSAyNS4wOTc2NTYgMjgzLjg5NDUzMSAyNi42NzU3ODEgQyAyODYuNTI3MzQ0IDI4LjI1MzkwNiAyODkuMTE3MTg4IDI5Ljg5NDUzMSAyOTEuNjY3OTY5IDMxLjU5NzY1NiBDIDI5NC4yMjI2NTYgMzMuMzA0Njg4IDI5Ni43MzA0NjkgMzUuMDcwMzEyIDI5OS4xOTUzMTIgMzYuODk4NDM4IEMgMzAxLjY2MDE1NiAzOC43MjY1NjIgMzA0LjA3ODEyNSA0MC42MTMyODEgMzA2LjQ0OTIxOSA0Mi41NTg1OTQgQyAzMDguODIwMzEyIDQ0LjUwNzgxMiAzMTEuMTQ0NTMxIDQ2LjUxMTcxOSAzMTMuNDE3OTY5IDQ4LjU3MDMxMiBDIDMxNS42OTE0MDYgNTAuNjMyODEyIDMxNy45MTQwNjIgNTIuNzQ2MDk0IDMyMC4wODIwMzEgNTQuOTE3OTY5IEMgMzIyLjI1MzkwNiA1Ny4wODU5MzggMzI0LjM2NzE4OCA1OS4zMDg1OTQgMzI2LjQyOTY4OCA2MS41ODIwMzEgQyAzMjguNDg4MjgxIDYzLjg1NTQ2OSAzMzAuNDkyMTg4IDY2LjE3OTY4OCAzMzIuNDQxNDA2IDY4LjU1MDc4MSBDIDMzNC4zODY3MTkgNzAuOTIxODc1IDMzNi4yNzM0MzggNzMuMzM5ODQ0IDMzOC4xMDE1NjIgNzUuODA0Njg4IEMgMzM5LjkyOTY4OCA3OC4yNjk1MzEgMzQxLjY5NTMxMiA4MC43NzczNDQgMzQzLjQwMjM0NCA4My4zMzIwMzEgQyAzNDUuMTA1NDY5IDg1Ljg4MjgxMiAzNDYuNzQ2MDk0IDg4LjQ3MjY1NiAzNDguMzI0MjE5IDkxLjEwNTQ2OSBDIDM0OS45MDIzNDQgOTMuNzM4MjgxIDM1MS40MTQwNjIgOTYuNDA2MjUgMzUyLjg1OTM3NSA5OS4xMTMyODEgQyAzNTQuMzA4NTk0IDEwMS44MjAzMTIgMzU1LjY4NzUgMTA0LjU1ODU5NCAzNTYuOTk2MDk0IDEwNy4zMzIwMzEgQyAzNTguMzA4NTk0IDExMC4xMDU0NjkgMzU5LjU1NDY4OCAxMTIuOTEwMTU2IDM2MC43MjY1NjIgMTE1Ljc0NjA5NCBDIDM2MS45MDIzNDQgMTE4LjU4MjAzMSAzNjMuMDAzOTA2IDEyMS40NDUzMTIgMzY0LjAzOTA2MiAxMjQuMzMyMDMxIEMgMzY1LjA3NDIxOSAxMjcuMjIyNjU2IDM2Ni4wMzUxNTYgMTMwLjEzNjcxOSAzNjYuOTI1NzgxIDEzMy4wNzAzMTIgQyAzNjcuODE2NDA2IDEzNi4wMDc4MTIgMzY4LjYzNjcxOSAxMzguOTY0ODQ0IDM2OS4zODI4MTIgMTQxLjk0MTQwNiBDIDM3MC4xMjUgMTQ0LjkxNzk2OSAzNzAuNzk2ODc1IDE0Ny45MTAxNTYgMzcxLjM5ODQzOCAxNTAuOTIxODc1IEMgMzcxLjk5NjA5NCAxNTMuOTI5Njg4IDM3Mi41MTk1MzEgMTU2Ljk1MzEyNSAzNzIuOTY4NzUgMTU5Ljk4ODI4MSBDIDM3My40MjE4NzUgMTYzLjAyMzQzOCAzNzMuNzk2ODc1IDE2Ni4wNjY0MDYgMzc0LjA5NzY1NiAxNjkuMTIxMDk0IEMgMzc0LjM5ODQzOCAxNzIuMTc1NzgxIDM3NC42MjUgMTc1LjIzNDM3NSAzNzQuNzczNDM4IDE3OC4zMDA3ODEgQyAzNzQuOTI1NzgxIDE4MS4zNjMyODEgMzc1IDE4NC40Mjk2ODggMzc1IDE4Ny41IFogTSAzNzUgMTg3LjUgXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgZmlsbC1vcGFjaXR5PVxcXCIxXFxcIiBmaWxsLXJ1bGU9XFxcIm5vbnplcm9cXFwiIC8+XFxuICAgICAgICAgICAgPC9nPlxcbiAgICAgICAgPC9nPlxcbiAgICA8L2c+XFxuICAgIDxwYXRoIGZpbGw9XFxcIiNmZmZmZmZcXFwiXFxuICAgICAgICBkPVxcXCJNIDI5MC4wNjY0MDYgMTg4LjMwNDY4OCBMIDE0MS40NTcwMzEgMjgwLjc5Njg3NSBDIDEzNC4yMDMxMjUgMjg4LjA1MDc4MSAxMjEuNzA3MDMxIDI4Mi45MTQwNjIgMTIxLjcwNzAzMSAyNzIuNjM2NzE5IEwgMTIxLjQwNjI1IDEwMi41NjY0MDYgQyAxMjEuNDA2MjUgOTIuMjg5MDYyIDEzMy44MDA3ODEgODcuMTUyMzQ0IDE0MS4xNTIzNDQgOTQuNDA2MjUgTCAyOTAuMDY2NDA2IDE3MS44ODI4MTIgQyAyOTQuNjAxNTYyIDE3Ni41MTk1MzEgMjk0LjYwMTU2MiAxODMuNzczNDM4IDI5MC4wNjY0MDYgMTg4LjMwNDY4OCBaIE0gMjkwLjA2NjQwNiAxODguMzA0Njg4IFxcXCJcXG4gICAgICAgIGZpbGwtb3BhY2l0eT1cXFwiMVxcXCIgZmlsbC1ydWxlPVxcXCJub256ZXJvXFxcIiAvPlxcbjwvc3ZnPlwiOyIsImV4cG9ydCBkZWZhdWx0IFwiPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBlbmNvZGluZz1cXFwiVVRGLThcXFwiPz5cXG48c3ZnIGlkPVxcXCJMYXllcl8xXFxcIiBkYXRhLW5hbWU9XFxcIkxheWVyIDFcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgdmlld0JveD1cXFwiMCAwIDMwNyA2NDBcXFwiPlxcbiAgPGRlZnM+XFxuICAgIDxzdHlsZT5cXG4gICAgICAuaW5uZXJtb3N0LCAuc2Vjb25kLCAudGhpcmQsIC5mb3VydGgsIC5maWZ0aCwgLm91dGVybW9zdCB7XFxuICAgICAgICBzdHJva2Utd2lkdGg6IDBweDtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLm91dGVybW9zdCB7XFxuICAgICAgICBmaWxsOiAjZTRmMmQxO1xcbiAgICAgIH1cXG5cXG4gICAgICAuc2Vjb25kIHtcXG4gICAgICAgIGZpbGw6ICNjY2U4YjU7XFxuICAgICAgfVxcblxcbiAgICAgIC50aGlyZCB7XFxuICAgICAgICBmaWxsOiAjYjNkYjk1O1xcbiAgICAgIH1cXG5cXG4gICAgICAuZm91cnRoIHtcXG4gICAgICAgIGZpbGw6ICM5YmQwNzg7XFxuICAgICAgfVxcblxcbiAgICAgIC5maWZ0aCB7XFxuICAgICAgICBmaWxsOiAjODNjNTVjO1xcbiAgICAgIH1cXG5cXG4gICAgICAuaW5uZXJtb3N0IHtcXG4gICAgICAgIGZpbGw6ICM0MjhhMmY7XFxuICAgICAgfVxcbiAgICA8L3N0eWxlPlxcbiAgPC9kZWZzPlxcbiAgPHBhdGggY2xhc3M9XFxcIm91dGVybW9zdFxcXCIgZD1cXFwibTMwNi45LDMyMGMwLDEwNS4zLS4wMiwyMTAuNi4xLDMxNS45MSwwLDMuNDItLjY3LDQuMS00LjA5LDQuMDktOTkuNi0uMTItMTk5LjIxLS4xMi0yOTguODEsMEMuNjcsNjQwLDAsNjM5LjMzLDAsNjM1LjkxLjExLDQyNS4zLjExLDIxNC43LDAsNC4wOSwwLC42Ny42NywwLDQuMDksMCwxMDMuNy4xMiwyMDMuMy4xMiwzMDIuOTEsMGMzLjQyLDAsNC4xLjY3LDQuMDksNC4wOS0uMTIsMTA1LjMtLjEsMjEwLjYtLjEsMzE1LjkxWlxcXCIvPlxcbiAgPHBhdGggY2xhc3M9XFxcInNlY29uZFxcXCIgZD1cXFwibTI3NS45MiwzMjNjMCw4Ny42MywwLDE3NS4yNywwLDI2Mi45LDAsNy4yNC0uNTUsNy45My03Ljg2LDcuOTgtMTQuNjYuMDktMjkuMzEuMDMtNDMuOTcuMDMtNjAuOTYsMC0xMjEuOTIsMC0xODIuODgsMHEtNy4xMywwLTcuMTQtNy4yNGMwLTE3Ni4xLDAtMzUyLjIxLDAtNTI4LjMxcTAtNy4yNiw3LjEyLTcuMjZjNzUuNzgsMCwxNTEuNTYsMCwyMjcuMzUsMHE3LjM4LDAsNy4zOCw3LjVjMCw4OC4xMywwLDE3Ni4yNywwLDI2NC40WlxcXCIvPlxcbiAgPHBhdGggY2xhc3M9XFxcInRoaXJkXFxcIiBkPVxcXCJtNjguMDYsMzIyLjI0YzAtNjkuNDcsMC0xMzguOTQsMC0yMDguNDEsMC04Ljk5LDEuMzMtMTAuMTMsMTAuNDktOS4xMiwxLjk4LjIyLDMuOTguMzIsNS45Ny4zMiw0Ni4xMy4wMiw5Mi4yNi4wMiwxMzguMzksMCwzLjQ4LDAsNi45Mi0uMjMsMTAuNDEtLjY3LDUuNS0uNyw4Ljc0LjQ2LDguNzMsNy4yNS0uMTgsMTM4Ljk0LS4xMywyNzcuODgtLjEzLDQxNi44MSwwLC4zMywwLC42NywwLDFxLS4xNCwxMC41MS0xMC4zOSwxMC41MWMtNTIuMTMsMC0xMDQuMjUsMC0xNTYuMzgsMHEtNy4wOSwwLTcuMDktNy4yOGMwLTcwLjE0LDAtMTQwLjI3LDAtMjEwLjQxWlxcXCIvPlxcbiAgPHBhdGggY2xhc3M9XFxcImZvdXJ0aFxcXCIgZD1cXFwibTEwMy4wMiwzMjIuNWMwLTUyLjQ2LDAtMTA0LjkxLDAtMTU3LjM3LDAtNi42OC4zNi03LjA2LDcuMDctNy4wNiwzMC4zLS4wMSw2MC42LjA3LDkwLjktLjA5LDQuNTQtLjAyLDYuMDgsMS4zMyw2LjA3LDUuOTgtLjEsMTA1LjU4LS4xLDIxMS4xNiwwLDMxNi43NCwwLDQuMTgtMS4yNyw1LjM3LTUuMzgsNS4zNS0yOS4zLS4xNS01OC42LS4wOC04Ny45LS4wOHEtMTAuNzYsMC0xMC43Ni0xMS4wOWMwLTUwLjc5LDAtMTAxLjU4LDAtMTUyLjM3WlxcXCIvPlxcbiAgPHBhdGggY2xhc3M9XFxcImZpZnRoXFxcIiBkPVxcXCJtMTczLDMyMi4yYzAsMzUuMjksMCw3MC41OCwwLDEwNS44OHEwLDYuODktNi45OSw2LjljLTguMTUsMC0xNi4zMS0uMTMtMjQuNDYuMDYtMy40Ny4wOC00LjY4LTEuMDktNC42MS00LjU5LjE4LTkuNjUuMDYtMTkuMzEuMDYtMjguOTYsMC01OC4yNi0uMDEtMTE2LjUzLjAyLTE3NC43OSwwLTQuNzYtMS4xMi05LjQ2LS4xNC0xNC4zLjUxLTIuNTQsMS4zOS0zLjM4LDMuOC0zLjM2LDguODIuMDYsMTcuNjQuMTQsMjYuNDYtLjAyLDQuNTktLjA5LDUuOTUsMS44NSw1Ljk0LDYuMzMtLjE0LDM1LjYyLS4wOCw3MS4yNS0uMDgsMTA2Ljg3WlxcXCIvPlxcbiAgPHBhdGggY2xhc3M9XFxcImlubmVybW9zdFxcXCIgZD1cXFwibTE1MS4wNCwzMjIuMDFjMC05Ljk5LjA3LTE5Ljk3LS4wNS0yOS45Ni0uMDQtMi45My44My00LjE4LDMuOTUtNC4xOCwzLjA2LDAsNC4wMywxLjEyLDQuMDIsNC4xMS0uMDksMTkuOTctLjA4LDM5Ljk0LjAxLDU5LjkxLjAxLDIuOTYtLjg0LDQuMTYtMy45Niw0LjE0LTMuMDMtLjAxLTQuMDgtMS4wNC00LjAzLTQuMDguMTQtOS45OC4wNS0xOS45Ny4wNS0yOS45NlpcXFwiLz5cXG48L3N2Zz5cIjsiLCJleHBvcnQgZGVmYXVsdCBcIjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB2ZXJzaW9uPVxcXCIxLjBcXFwiIHZpZXdCb3g9XFxcIjAgMCA1Ni4yNSAzMFxcXCIgY2xhc3M9XFxcIndhdmVmb3JtXFxcIj5cXG4gICAgPGRlZnM+XFxuICAgICAgICA8Y2xpcFBhdGggaWQ9XFxcImFcXFwiPlxcbiAgICAgICAgICAgIDxwYXRoIGQ9XFxcIk0uNTQgMTJIM3Y1SC41NFptMCAwXFxcIi8+XFxuICAgICAgICA8L2NsaXBQYXRoPlxcbiAgICAgICAgPGNsaXBQYXRoIGlkPVxcXCJiXFxcIj5cXG4gICAgICAgICAgICA8cGF0aCBkPVxcXCJNMjUgMi4yaDJ2MjQuNjhoLTJabTAgMFxcXCIvPlxcbiAgICAgICAgPC9jbGlwUGF0aD5cXG4gICAgICAgIDxjbGlwUGF0aCBpZD1cXFwiY1xcXCI+XFxuICAgICAgICAgICAgPHBhdGggZD1cXFwiTTUzIDEyaDEuOTh2NUg1M1ptMCAwXFxcIi8+XFxuICAgICAgICA8L2NsaXBQYXRoPlxcbiAgICA8L2RlZnM+XFxuICAgIDxnIGNsaXAtcGF0aD1cXFwidXJsKCNhKVxcXCI+XFxuICAgICAgICA8cGF0aCBkPVxcXCJNMS40OCAxMi43MWMtLjUgMC0uOS40LS45Ljl2MS44NWEuOS45IDAgMCAwIDEuOCAwdi0xLjg0YzAtLjUtLjQtLjktLjktLjlabTAgMFxcXCIvPlxcbiAgICA8L2c+XFxuICAgIDxwYXRoIGQ9XFxcIk00Ljk4IDYuNjNjLS41IDAtLjkuNC0uOS45djE0LjAxYS45LjkgMCAwIDAgMS44MSAwdi0xNGMwLS41LS40LS45Mi0uOS0uOTJabTMuNTEgMy4xYS45LjkgMCAwIDAtLjkuOTF2Ny43OWEuOS45IDAgMCAwIDEuOCAwdi03Ljc5YzAtLjUtLjQtLjktLjktLjlaTTEyIDMuODNhLjkuOSAwIDAgMC0uOTEuOXYxOS42YS45LjkgMCAwIDAgMS44IDBWNC43NGMwLS41LS40LS45LS45LS45Wm0zLjUgOC4yOWEuOS45IDAgMCAwLS45MS45djMuMDNhLjkuOSAwIDAgMCAxLjgxIDB2LTMuMDNjMC0uNS0uNC0uOS0uOS0uOVpNMTkgNi44Yy0uNSAwLS45LjQtLjkuOXYxMy42OGEuOS45IDAgMCAwIDEuOCAwVjcuN2MwLS41LS40LS45LS45LS45Wm0zLjU4LTIuOTdoLS4wMWMtLjUgMC0uOS40LS45LjlsLS4xMyAxOS42YzAgLjUuNC45LjkuOTEuNSAwIC45LS40LjktLjlsLjE0LTE5LjZhLjkuOSAwIDAgMC0uOS0uOVptMCAwXFxcIi8+XFxuICAgIDxnIGNsaXAtcGF0aD1cXFwidXJsKCNiKVxcXCI+XFxuICAgICAgICA8cGF0aCBkPVxcXCJNMjYgMi4yYy0uNSAwLS45LjQtLjkuOXYyMi44NmEuOS45IDAgMSAwIDEuODEgMFYzLjExYS45LjkgMCAwIDAtLjktLjkxWm0wIDBcXFwiLz5cXG4gICAgPC9nPlxcbiAgICA8cGF0aCBkPVxcXCJNMjkuNTIgNy43MWEuOS45IDAgMCAwLS45MS45djExLjg1YS45LjkgMCAwIDAgMS44MSAwVjguNjJjMC0uNS0uNC0uOS0uOS0uOVptMy41IDIuOTNhLjkuOSAwIDAgMC0uOS45MXY1Ljk3YS45LjkgMCAwIDAgMS44IDB2LTUuOTdjMC0uNS0uNC0uOS0uOS0uOVptMy41LTUuNzhjLS41IDAtLjkuNC0uOS45djE3LjU1YS45LjkgMCAwIDAgMS44MSAwVjUuNzZjMC0uNS0uNC0uOS0uOS0uOVptMy41MSAzLjM0Yy0uNSAwLS45LjQtLjkuOXYxMC44N2EuOS45IDAgMCAwIDEuOCAwVjkuMWEuOS45IDAgMCAwLS45LS45MVptMy41IDMuMDhjLS41IDAtLjkuNC0uOS45MXY0LjdhLjkuOSAwIDEgMCAxLjggMHYtNC43YS45LjkgMCAwIDAtLjktLjlabTMuNTEtNy40NWEuOS45IDAgMCAwLS45MS45djE5LjZhLjkuOSAwIDAgMCAxLjgxIDBWNC43NGMwLS41LS40LS45LS45LS45Wm0zLjUgNS41N2EuOS45IDAgMCAwLS45LjkxdjguNDVhLjkuOSAwIDAgMCAxLjggMHYtOC40NWMwLS41LS40LS45LS45LS45Wm0wIDBcXFwiLz5cXG4gICAgPGcgY2xpcC1wYXRoPVxcXCJ1cmwoI2MpXFxcIj5cXG4gICAgICAgIDxwYXRoIGQ9XFxcIk01NC4wNCAxMi45NmEuOS45IDAgMCAwLS45LjkxdjEuMzNhLjkuOSAwIDEgMCAxLjggMHYtMS4zMmEuOS45IDAgMCAwLS45LS45MlptMCAwXFxcIi8+XFxuICAgIDwvZz5cXG48L3N2Zz5cIjsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcmVjdGFuZ2xlcy5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3JlY3RhbmdsZXMuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cnVsZVNldFsxXS5ydWxlc1szXS51c2VbMV0hLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9ydWxlU2V0WzFdLnJ1bGVzWzNdLnVzZVsyXSEuL2NvbW1vbi5zY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanM/P3J1bGVTZXRbMV0ucnVsZXNbM10udXNlWzFdIS4uLy4uL25vZGVfbW9kdWxlcy9zYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cnVsZVNldFsxXS5ydWxlc1szXS51c2VbMl0hLi9jb21tb24uc2Nzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanM/P3J1bGVTZXRbMV0ucnVsZXNbM10udXNlWzFdIS4uLy4uL25vZGVfbW9kdWxlcy9zYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cnVsZVNldFsxXS5ydWxlc1szXS51c2VbMl0hLi9kZXNrdG9wLnNjc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cnVsZVNldFsxXS5ydWxlc1szXS51c2VbMV0hLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9ydWxlU2V0WzFdLnJ1bGVzWzNdLnVzZVsyXSEuL2Rlc2t0b3Auc2Nzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanM/P3J1bGVTZXRbMV0ucnVsZXNbM10udXNlWzFdIS4uLy4uL25vZGVfbW9kdWxlcy9zYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cnVsZVNldFsxXS5ydWxlc1szXS51c2VbMl0hLi9tb2JpbGUuc2Nzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9ydWxlU2V0WzFdLnJ1bGVzWzNdLnVzZVsxXSEuLi8uLi9ub2RlX21vZHVsZXMvc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3J1bGVTZXRbMV0ucnVsZXNbM10udXNlWzJdIS4vbW9iaWxlLnNjc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSAnLi9fdmlydHVhbC9fdHNsaWIuanMnO1xuaW1wb3J0IHsgc3ltYm9sT2JzZXJ2YWJsZSwgdG9JbnZva2VTb3VyY2UsIG1hcENvbnRleHQsIGlzTWFjaGluZSB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgcHJvdmlkZSB9IGZyb20gJy4vc2VydmljZVNjb3BlLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlTnVsbEFjdG9yKGlkKSB7XG4gIHZhciBfYTtcblxuICByZXR1cm4gX2EgPSB7XG4gICAgaWQ6IGlkLFxuICAgIHNlbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfSxcbiAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVuc3Vic2NyaWJlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgIGdldFNuYXBzaG90OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgdG9KU09OOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogaWRcbiAgICAgIH07XG4gICAgfVxuICB9LCBfYVtzeW1ib2xPYnNlcnZhYmxlXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgX2E7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIGRlZmVycmVkIGFjdG9yIHRoYXQgaXMgYWJsZSB0byBiZSBpbnZva2VkIGdpdmVuIHRoZSBwcm92aWRlZFxyXG4gKiBpbnZvY2F0aW9uIGluZm9ybWF0aW9uIGluIGl0cyBgLm1ldGFgIHZhbHVlLlxyXG4gKlxyXG4gKiBAcGFyYW0gaW52b2tlRGVmaW5pdGlvbiBUaGUgbWV0YSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gaW52b2tlIHRoZSBhY3Rvci5cclxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUludm9jYWJsZUFjdG9yKGludm9rZURlZmluaXRpb24sIG1hY2hpbmUsIGNvbnRleHQsIF9ldmVudCkge1xuICB2YXIgX2E7XG5cbiAgdmFyIGludm9rZVNyYyA9IHRvSW52b2tlU291cmNlKGludm9rZURlZmluaXRpb24uc3JjKTtcbiAgdmFyIHNlcnZpY2VDcmVhdG9yID0gKF9hID0gbWFjaGluZSA9PT0gbnVsbCB8fCBtYWNoaW5lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtYWNoaW5lLm9wdGlvbnMuc2VydmljZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVtpbnZva2VTcmMudHlwZV07XG4gIHZhciByZXNvbHZlZERhdGEgPSBpbnZva2VEZWZpbml0aW9uLmRhdGEgPyBtYXBDb250ZXh0KGludm9rZURlZmluaXRpb24uZGF0YSwgY29udGV4dCwgX2V2ZW50KSA6IHVuZGVmaW5lZDtcbiAgdmFyIHRlbXBBY3RvciA9IHNlcnZpY2VDcmVhdG9yID8gY3JlYXRlRGVmZXJyZWRBY3RvcihzZXJ2aWNlQ3JlYXRvciwgaW52b2tlRGVmaW5pdGlvbi5pZCwgcmVzb2x2ZWREYXRhKSA6IGNyZWF0ZU51bGxBY3RvcihpbnZva2VEZWZpbml0aW9uLmlkKTsgLy8gQHRzLWlnbm9yZVxuXG4gIHRlbXBBY3Rvci5tZXRhID0gaW52b2tlRGVmaW5pdGlvbjtcbiAgcmV0dXJuIHRlbXBBY3Rvcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZURlZmVycmVkQWN0b3IoZW50aXR5LCBpZCwgZGF0YSkge1xuICB2YXIgdGVtcEFjdG9yID0gY3JlYXRlTnVsbEFjdG9yKGlkKTsgLy8gQHRzLWlnbm9yZVxuXG4gIHRlbXBBY3Rvci5kZWZlcnJlZCA9IHRydWU7XG5cbiAgaWYgKGlzTWFjaGluZShlbnRpdHkpKSB7XG4gICAgLy8gXCJtdXRlXCIgdGhlIGV4aXN0aW5nIHNlcnZpY2Ugc2NvcGUgc28gcG90ZW50aWFsIHNwYXduZWQgYWN0b3JzIHdpdGhpbiB0aGUgYC5pbml0aWFsU3RhdGVgIHN0YXkgZGVmZXJyZWQgaGVyZVxuICAgIHZhciBpbml0aWFsU3RhdGVfMSA9IHRlbXBBY3Rvci5zdGF0ZSA9IHByb3ZpZGUodW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gKGRhdGEgPyBlbnRpdHkud2l0aENvbnRleHQoZGF0YSkgOiBlbnRpdHkpLmluaXRpYWxTdGF0ZTtcbiAgICB9KTtcblxuICAgIHRlbXBBY3Rvci5nZXRTbmFwc2hvdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBpbml0aWFsU3RhdGVfMTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHRlbXBBY3Rvcjtcbn1cbmZ1bmN0aW9uIGlzQWN0b3IoaXRlbSkge1xuICB0cnkge1xuICAgIHJldHVybiB0eXBlb2YgaXRlbS5zZW5kID09PSAnZnVuY3Rpb24nO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBpc1NwYXduZWRBY3RvcihpdGVtKSB7XG4gIHJldHVybiBpc0FjdG9yKGl0ZW0pICYmICdpZCcgaW4gaXRlbTtcbn0gLy8gVE9ETzogcmVmYWN0b3IgdGhlIHJldHVybiB0eXBlLCB0aGlzIGNvdWxkIGJlIHdyaXR0ZW4gaW4gYSBiZXR0ZXIgd2F5IGJ1dCBpdCdzIGJlc3QgdG8gYXZvaWQgdW5uZWNjZXNzYXJ5IGJyZWFraW5nIGNoYW5nZXMgbm93XG5cbmZ1bmN0aW9uIHRvQWN0b3JSZWYoYWN0b3JSZWZMaWtlKSB7XG4gIHZhciBfYTtcblxuICByZXR1cm4gX19hc3NpZ24oKF9hID0ge1xuICAgIHN1YnNjcmliZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdW5zdWJzY3JpYmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgaWQ6ICdhbm9ueW1vdXMnLFxuICAgIGdldFNuYXBzaG90OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSwgX2Fbc3ltYm9sT2JzZXJ2YWJsZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sIF9hKSwgYWN0b3JSZWZMaWtlKTtcbn1cblxuZXhwb3J0IHsgY3JlYXRlRGVmZXJyZWRBY3RvciwgY3JlYXRlSW52b2NhYmxlQWN0b3IsIGNyZWF0ZU51bGxBY3RvciwgaXNBY3RvciwgaXNTcGF3bmVkQWN0b3IsIHRvQWN0b3JSZWYgfTtcbiIsImltcG9ydCB7IFN0YXRlTm9kZSB9IGZyb20gJy4vU3RhdGVOb2RlLmpzJztcbmltcG9ydCB7IElTX1BST0RVQ1RJT04gfSBmcm9tICcuL2Vudmlyb25tZW50LmpzJztcblxudmFyIHdhcm5lZCA9IGZhbHNlO1xuZnVuY3Rpb24gTWFjaGluZShjb25maWcsIG9wdGlvbnMsIGluaXRpYWxDb250ZXh0KSB7XG4gIGlmIChpbml0aWFsQ29udGV4dCA9PT0gdm9pZCAwKSB7XG4gICAgaW5pdGlhbENvbnRleHQgPSBjb25maWcuY29udGV4dDtcbiAgfVxuXG4gIHJldHVybiBuZXcgU3RhdGVOb2RlKGNvbmZpZywgb3B0aW9ucywgaW5pdGlhbENvbnRleHQpO1xufVxuZnVuY3Rpb24gY3JlYXRlTWFjaGluZShjb25maWcsIG9wdGlvbnMpIHtcbiAgaWYgKCFJU19QUk9EVUNUSU9OICYmICEoJ3ByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzJyBpbiBjb25maWcpICYmICF3YXJuZWQpIHtcbiAgICB3YXJuZWQgPSB0cnVlO1xuICAgIGNvbnNvbGUud2FybignSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHNldCBgcHJlZGljdGFibGVBY3Rpb25Bcmd1bWVudHNgIHRvIGB0cnVlYCB3aGVuIHVzaW5nIGBjcmVhdGVNYWNoaW5lYC4gaHR0cHM6Ly94c3RhdGUuanMub3JnL2RvY3MvZ3VpZGVzL2FjdGlvbnMuaHRtbCcpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTdGF0ZU5vZGUoY29uZmlnLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IHsgTWFjaGluZSwgY3JlYXRlTWFjaGluZSB9O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fc3ByZWFkQXJyYXksIF9fcmVhZCwgX19yZXN0IH0gZnJvbSAnLi9fdmlydHVhbC9fdHNsaWIuanMnO1xuaW1wb3J0IHsgRU1QVFlfQUNUSVZJVFlfTUFQIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgaXNTdHJpbmcsIG1hdGNoZXNTdGF0ZSwgd2FybiB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgZ2V0TWV0YSwgbmV4dEV2ZW50cyB9IGZyb20gJy4vc3RhdGVVdGlscy5qcyc7XG5pbXBvcnQgeyBpbml0RXZlbnQgfSBmcm9tICcuL2FjdGlvbnMuanMnO1xuaW1wb3J0IHsgSVNfUFJPRFVDVElPTiB9IGZyb20gJy4vZW52aXJvbm1lbnQuanMnO1xuXG5mdW5jdGlvbiBzdGF0ZVZhbHVlc0VxdWFsKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhID09PSB1bmRlZmluZWQgfHwgYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzU3RyaW5nKGEpIHx8IGlzU3RyaW5nKGIpKSB7XG4gICAgcmV0dXJuIGEgPT09IGI7XG4gIH1cblxuICB2YXIgYUtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgdmFyIGJLZXlzID0gT2JqZWN0LmtleXMoYik7XG4gIHJldHVybiBhS2V5cy5sZW5ndGggPT09IGJLZXlzLmxlbmd0aCAmJiBhS2V5cy5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHN0YXRlVmFsdWVzRXF1YWwoYVtrZXldLCBiW2tleV0pO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGlzU3RhdGVDb25maWcoc3RhdGUpIHtcbiAgaWYgKHR5cGVvZiBzdGF0ZSAhPT0gJ29iamVjdCcgfHwgc3RhdGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gJ3ZhbHVlJyBpbiBzdGF0ZSAmJiAnX2V2ZW50JyBpbiBzdGF0ZTtcbn1cbi8qKlxyXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGlzU3RhdGVDb25maWcob2JqZWN0KWAgb3IgYHN0YXRlIGluc3RhbmNlb2YgU3RhdGVgIGluc3RlYWQuXHJcbiAqL1xuXG52YXIgaXNTdGF0ZSA9IGlzU3RhdGVDb25maWc7XG5mdW5jdGlvbiBiaW5kQWN0aW9uVG9TdGF0ZShhY3Rpb24sIHN0YXRlKSB7XG4gIHZhciBleGVjID0gYWN0aW9uLmV4ZWM7XG5cbiAgdmFyIGJvdW5kQWN0aW9uID0gX19hc3NpZ24oX19hc3NpZ24oe30sIGFjdGlvbiksIHtcbiAgICBleGVjOiBleGVjICE9PSB1bmRlZmluZWQgPyBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZXhlYyhzdGF0ZS5jb250ZXh0LCBzdGF0ZS5ldmVudCwge1xuICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICBfZXZlbnQ6IHN0YXRlLl9ldmVudFxuICAgICAgfSk7XG4gICAgfSA6IHVuZGVmaW5lZFxuICB9KTtcblxuICByZXR1cm4gYm91bmRBY3Rpb247XG59XG5cbnZhciBTdGF0ZSA9XG4vKiNfX1BVUkVfXyovXG5cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG5ldyBTdGF0ZSBpbnN0YW5jZS5cclxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHN0YXRlIHZhbHVlXHJcbiAgICogQHBhcmFtIGNvbnRleHQgVGhlIGV4dGVuZGVkIHN0YXRlXHJcbiAgICogQHBhcmFtIGhpc3RvcnlWYWx1ZSBUaGUgdHJlZSByZXByZXNlbnRpbmcgaGlzdG9yaWNhbCB2YWx1ZXMgb2YgdGhlIHN0YXRlIG5vZGVzXHJcbiAgICogQHBhcmFtIGhpc3RvcnkgVGhlIHByZXZpb3VzIHN0YXRlXHJcbiAgICogQHBhcmFtIGFjdGlvbnMgQW4gYXJyYXkgb2YgYWN0aW9uIG9iamVjdHMgdG8gZXhlY3V0ZSBhcyBzaWRlLWVmZmVjdHNcclxuICAgKiBAcGFyYW0gYWN0aXZpdGllcyBBIG1hcHBpbmcgb2YgYWN0aXZpdGllcyBhbmQgd2hldGhlciB0aGV5IGFyZSBzdGFydGVkIChgdHJ1ZWApIG9yIHN0b3BwZWQgKGBmYWxzZWApLlxyXG4gICAqIEBwYXJhbSBtZXRhXHJcbiAgICogQHBhcmFtIGV2ZW50cyBJbnRlcm5hbCBldmVudCBxdWV1ZS4gU2hvdWxkIGJlIGVtcHR5IHdpdGggcnVuLXRvLWNvbXBsZXRpb24gc2VtYW50aWNzLlxyXG4gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uXHJcbiAgICovXG4gIGZ1bmN0aW9uIFN0YXRlKGNvbmZpZykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgX2E7XG5cbiAgICB0aGlzLmFjdGlvbnMgPSBbXTtcbiAgICB0aGlzLmFjdGl2aXRpZXMgPSBFTVBUWV9BQ1RJVklUWV9NQVA7XG4gICAgdGhpcy5tZXRhID0ge307XG4gICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICB0aGlzLnZhbHVlID0gY29uZmlnLnZhbHVlO1xuICAgIHRoaXMuY29udGV4dCA9IGNvbmZpZy5jb250ZXh0O1xuICAgIHRoaXMuX2V2ZW50ID0gY29uZmlnLl9ldmVudDtcbiAgICB0aGlzLl9zZXNzaW9uaWQgPSBjb25maWcuX3Nlc3Npb25pZDtcbiAgICB0aGlzLmV2ZW50ID0gdGhpcy5fZXZlbnQuZGF0YTtcbiAgICB0aGlzLmhpc3RvcnlWYWx1ZSA9IGNvbmZpZy5oaXN0b3J5VmFsdWU7XG4gICAgdGhpcy5oaXN0b3J5ID0gY29uZmlnLmhpc3Rvcnk7XG4gICAgdGhpcy5hY3Rpb25zID0gY29uZmlnLmFjdGlvbnMgfHwgW107XG4gICAgdGhpcy5hY3Rpdml0aWVzID0gY29uZmlnLmFjdGl2aXRpZXMgfHwgRU1QVFlfQUNUSVZJVFlfTUFQO1xuICAgIHRoaXMubWV0YSA9IGdldE1ldGEoY29uZmlnLmNvbmZpZ3VyYXRpb24pO1xuICAgIHRoaXMuZXZlbnRzID0gY29uZmlnLmV2ZW50cyB8fCBbXTtcbiAgICB0aGlzLm1hdGNoZXMgPSB0aGlzLm1hdGNoZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnRvU3RyaW5ncyA9IHRoaXMudG9TdHJpbmdzLmJpbmQodGhpcyk7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlnLmNvbmZpZ3VyYXRpb247XG4gICAgdGhpcy50cmFuc2l0aW9ucyA9IGNvbmZpZy50cmFuc2l0aW9ucztcbiAgICB0aGlzLmNoaWxkcmVuID0gY29uZmlnLmNoaWxkcmVuO1xuICAgIHRoaXMuZG9uZSA9ICEhY29uZmlnLmRvbmU7XG4gICAgdGhpcy50YWdzID0gKF9hID0gQXJyYXkuaXNBcnJheShjb25maWcudGFncykgPyBuZXcgU2V0KGNvbmZpZy50YWdzKSA6IGNvbmZpZy50YWdzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgU2V0KCk7XG4gICAgdGhpcy5tYWNoaW5lID0gY29uZmlnLm1hY2hpbmU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICduZXh0RXZlbnRzJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXh0RXZlbnRzKF90aGlzLmNvbmZpZ3VyYXRpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBuZXcgU3RhdGUgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBgc3RhdGVWYWx1ZWAgYW5kIGBjb250ZXh0YC5cclxuICAgKiBAcGFyYW0gc3RhdGVWYWx1ZVxyXG4gICAqIEBwYXJhbSBjb250ZXh0XHJcbiAgICovXG5cblxuICBTdGF0ZS5mcm9tID0gZnVuY3Rpb24gKHN0YXRlVmFsdWUsIGNvbnRleHQpIHtcbiAgICBpZiAoc3RhdGVWYWx1ZSBpbnN0YW5jZW9mIFN0YXRlKSB7XG4gICAgICBpZiAoc3RhdGVWYWx1ZS5jb250ZXh0ICE9PSBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RhdGUoe1xuICAgICAgICAgIHZhbHVlOiBzdGF0ZVZhbHVlLnZhbHVlLFxuICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQsXG4gICAgICAgICAgX2V2ZW50OiBzdGF0ZVZhbHVlLl9ldmVudCxcbiAgICAgICAgICBfc2Vzc2lvbmlkOiBudWxsLFxuICAgICAgICAgIGhpc3RvcnlWYWx1ZTogc3RhdGVWYWx1ZS5oaXN0b3J5VmFsdWUsXG4gICAgICAgICAgaGlzdG9yeTogc3RhdGVWYWx1ZS5oaXN0b3J5LFxuICAgICAgICAgIGFjdGlvbnM6IFtdLFxuICAgICAgICAgIGFjdGl2aXRpZXM6IHN0YXRlVmFsdWUuYWN0aXZpdGllcyxcbiAgICAgICAgICBtZXRhOiB7fSxcbiAgICAgICAgICBldmVudHM6IFtdLFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IFtdLFxuICAgICAgICAgIHRyYW5zaXRpb25zOiBbXSxcbiAgICAgICAgICBjaGlsZHJlbjoge31cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdGF0ZVZhbHVlO1xuICAgIH1cblxuICAgIHZhciBfZXZlbnQgPSBpbml0RXZlbnQ7XG4gICAgcmV0dXJuIG5ldyBTdGF0ZSh7XG4gICAgICB2YWx1ZTogc3RhdGVWYWx1ZSxcbiAgICAgIGNvbnRleHQ6IGNvbnRleHQsXG4gICAgICBfZXZlbnQ6IF9ldmVudCxcbiAgICAgIF9zZXNzaW9uaWQ6IG51bGwsXG4gICAgICBoaXN0b3J5VmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIGhpc3Rvcnk6IHVuZGVmaW5lZCxcbiAgICAgIGFjdGlvbnM6IFtdLFxuICAgICAgYWN0aXZpdGllczogdW5kZWZpbmVkLFxuICAgICAgbWV0YTogdW5kZWZpbmVkLFxuICAgICAgZXZlbnRzOiBbXSxcbiAgICAgIGNvbmZpZ3VyYXRpb246IFtdLFxuICAgICAgdHJhbnNpdGlvbnM6IFtdLFxuICAgICAgY2hpbGRyZW46IHt9XG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBuZXcgU3RhdGUgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBgY29uZmlnYC5cclxuICAgKiBAcGFyYW0gY29uZmlnIFRoZSBzdGF0ZSBjb25maWdcclxuICAgKi9cblxuXG4gIFN0YXRlLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICByZXR1cm4gbmV3IFN0YXRlKGNvbmZpZyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBuZXcgYFN0YXRlYCBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIGBzdGF0ZVZhbHVlYCBhbmQgYGNvbnRleHRgIHdpdGggbm8gYWN0aW9ucyAoc2lkZS1lZmZlY3RzKS5cclxuICAgKiBAcGFyYW0gc3RhdGVWYWx1ZVxyXG4gICAqIEBwYXJhbSBjb250ZXh0XHJcbiAgICovXG5cblxuICBTdGF0ZS5pbmVydCA9IGZ1bmN0aW9uIChzdGF0ZVZhbHVlLCBjb250ZXh0KSB7XG4gICAgaWYgKHN0YXRlVmFsdWUgaW5zdGFuY2VvZiBTdGF0ZSkge1xuICAgICAgaWYgKCFzdGF0ZVZhbHVlLmFjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZVZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgX2V2ZW50ID0gaW5pdEV2ZW50O1xuICAgICAgcmV0dXJuIG5ldyBTdGF0ZSh7XG4gICAgICAgIHZhbHVlOiBzdGF0ZVZhbHVlLnZhbHVlLFxuICAgICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgICAgICBfZXZlbnQ6IF9ldmVudCxcbiAgICAgICAgX3Nlc3Npb25pZDogbnVsbCxcbiAgICAgICAgaGlzdG9yeVZhbHVlOiBzdGF0ZVZhbHVlLmhpc3RvcnlWYWx1ZSxcbiAgICAgICAgaGlzdG9yeTogc3RhdGVWYWx1ZS5oaXN0b3J5LFxuICAgICAgICBhY3Rpdml0aWVzOiBzdGF0ZVZhbHVlLmFjdGl2aXRpZXMsXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHN0YXRlVmFsdWUuY29uZmlndXJhdGlvbixcbiAgICAgICAgdHJhbnNpdGlvbnM6IFtdLFxuICAgICAgICBjaGlsZHJlbjoge31cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBTdGF0ZS5mcm9tKHN0YXRlVmFsdWUsIGNvbnRleHQpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgc3RyaW5nIGxlYWYgc3RhdGUgbm9kZSBwYXRocy5cclxuICAgKiBAcGFyYW0gc3RhdGVWYWx1ZVxyXG4gICAqIEBwYXJhbSBkZWxpbWl0ZXIgVGhlIGNoYXJhY3RlcihzKSB0aGF0IHNlcGFyYXRlIGVhY2ggc3VicGF0aCBpbiB0aGUgc3RyaW5nIHN0YXRlIG5vZGUgcGF0aC5cclxuICAgKi9cblxuXG4gIFN0YXRlLnByb3RvdHlwZS50b1N0cmluZ3MgPSBmdW5jdGlvbiAoc3RhdGVWYWx1ZSwgZGVsaW1pdGVyKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmIChzdGF0ZVZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgIHN0YXRlVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChkZWxpbWl0ZXIgPT09IHZvaWQgMCkge1xuICAgICAgZGVsaW1pdGVyID0gJy4nO1xuICAgIH1cblxuICAgIGlmIChpc1N0cmluZyhzdGF0ZVZhbHVlKSkge1xuICAgICAgcmV0dXJuIFtzdGF0ZVZhbHVlXTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVLZXlzID0gT2JqZWN0LmtleXMoc3RhdGVWYWx1ZSk7XG4gICAgcmV0dXJuIHZhbHVlS2V5cy5jb25jYXQuYXBwbHkodmFsdWVLZXlzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodmFsdWVLZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXR1cm4gX3RoaXMudG9TdHJpbmdzKHN0YXRlVmFsdWVba2V5XSwgZGVsaW1pdGVyKS5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgcmV0dXJuIGtleSArIGRlbGltaXRlciArIHM7XG4gICAgICB9KTtcbiAgICB9KSksIGZhbHNlKSk7XG4gIH07XG5cbiAgU3RhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2EgPSB0aGlzO1xuICAgICAgICBfYS5jb25maWd1cmF0aW9uO1xuICAgICAgICBfYS50cmFuc2l0aW9ucztcbiAgICAgICAgdmFyIHRhZ3MgPSBfYS50YWdzO1xuICAgICAgICBfYS5tYWNoaW5lO1xuICAgICAgICB2YXIganNvblZhbHVlcyA9IF9fcmVzdChfYSwgW1wiY29uZmlndXJhdGlvblwiLCBcInRyYW5zaXRpb25zXCIsIFwidGFnc1wiLCBcIm1hY2hpbmVcIl0pO1xuXG4gICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBqc29uVmFsdWVzKSwge1xuICAgICAgdGFnczogQXJyYXkuZnJvbSh0YWdzKVxuICAgIH0pO1xuICB9O1xuXG4gIFN0YXRlLnByb3RvdHlwZS5tYXRjaGVzID0gZnVuY3Rpb24gKHBhcmVudFN0YXRlVmFsdWUpIHtcbiAgICByZXR1cm4gbWF0Y2hlc1N0YXRlKHBhcmVudFN0YXRlVmFsdWUsIHRoaXMudmFsdWUpO1xuICB9O1xuICAvKipcclxuICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IHN0YXRlIGNvbmZpZ3VyYXRpb24gaGFzIGEgc3RhdGUgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgYHRhZ2AuXHJcbiAgICogQHBhcmFtIHRhZ1xyXG4gICAqL1xuXG5cbiAgU3RhdGUucHJvdG90eXBlLmhhc1RhZyA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICByZXR1cm4gdGhpcy50YWdzLmhhcyh0YWcpO1xuICB9O1xuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgc2VuZGluZyB0aGUgYGV2ZW50YCB3aWxsIGNhdXNlIGEgbm9uLWZvcmJpZGRlbiB0cmFuc2l0aW9uXHJcbiAgICogdG8gYmUgc2VsZWN0ZWQsIGV2ZW4gaWYgdGhlIHRyYW5zaXRpb25zIGhhdmUgbm8gYWN0aW9ucyBub3JcclxuICAgKiBjaGFuZ2UgdGhlIHN0YXRlIHZhbHVlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byB0ZXN0XHJcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgZXZlbnQgd2lsbCBjYXVzZSBhIHRyYW5zaXRpb25cclxuICAgKi9cblxuXG4gIFN0YXRlLnByb3RvdHlwZS5jYW4gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgX2E7XG5cbiAgICBpZiAoSVNfUFJPRFVDVElPTikge1xuICAgICAgd2FybighIXRoaXMubWFjaGluZSwgXCJzdGF0ZS5jYW4oLi4uKSB1c2VkIG91dHNpZGUgb2YgYSBtYWNoaW5lLWNyZWF0ZWQgU3RhdGUgb2JqZWN0OyB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZS5cIik7XG4gICAgfVxuXG4gICAgdmFyIHRyYW5zaXRpb25EYXRhID0gKF9hID0gdGhpcy5tYWNoaW5lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0VHJhbnNpdGlvbkRhdGEodGhpcywgZXZlbnQpO1xuICAgIHJldHVybiAhISh0cmFuc2l0aW9uRGF0YSA9PT0gbnVsbCB8fCB0cmFuc2l0aW9uRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdHJhbnNpdGlvbkRhdGEudHJhbnNpdGlvbnMubGVuZ3RoKSAmJiAvLyBDaGVjayB0aGF0IGF0IGxlYXN0IG9uZSB0cmFuc2l0aW9uIGlzIG5vdCBmb3JiaWRkZW5cbiAgICB0cmFuc2l0aW9uRGF0YS50cmFuc2l0aW9ucy5zb21lKGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC50YXJnZXQgIT09IHVuZGVmaW5lZCB8fCB0LmFjdGlvbnMubGVuZ3RoO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBTdGF0ZTtcbn0oKTtcblxuZXhwb3J0IHsgU3RhdGUsIGJpbmRBY3Rpb25Ub1N0YXRlLCBpc1N0YXRlLCBpc1N0YXRlQ29uZmlnLCBzdGF0ZVZhbHVlc0VxdWFsIH07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19zcHJlYWRBcnJheSwgX19yZWFkLCBfX3ZhbHVlcywgX19yZXN0IH0gZnJvbSAnLi9fdmlydHVhbC9fdHNsaWIuanMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiwgbWFwVmFsdWVzLCBpc0FycmF5LCBmbGF0dGVuLCB0b0FycmF5LCB0b1N0YXRlVmFsdWUsIGlzU3RyaW5nLCBnZXRFdmVudFR5cGUsIHRvU0NYTUxFdmVudCwgbWF0Y2hlc1N0YXRlLCBwYXRoLCBldmFsdWF0ZUd1YXJkLCBtYXBDb250ZXh0LCBpc1JhaXNhYmxlQWN0aW9uLCBwYXRoVG9TdGF0ZVZhbHVlLCBpc0J1aWx0SW5FdmVudCwgcGFydGl0aW9uLCB1cGRhdGVIaXN0b3J5VmFsdWUsIHRvU3RhdGVQYXRoLCBtYXBGaWx0ZXJWYWx1ZXMsIHdhcm4sIHRvU3RhdGVQYXRocywgbmVzdGVkUGF0aCwgbm9ybWFsaXplVGFyZ2V0LCB0b0d1YXJkLCB0b1RyYW5zaXRpb25Db25maWdBcnJheSwgaXNNYWNoaW5lLCBjcmVhdGVJbnZva2VJZCB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgU3RhdGUsIHN0YXRlVmFsdWVzRXF1YWwgfSBmcm9tICcuL1N0YXRlLmpzJztcbmltcG9ydCB7IHN0YXJ0IGFzIHN0YXJ0JDEsIHN0b3AgYXMgc3RvcCQxLCBpbnZva2UsIHVwZGF0ZSwgbnVsbEV2ZW50IH0gZnJvbSAnLi9hY3Rpb25UeXBlcy5qcyc7XG5pbXBvcnQgeyBkb25lLCBzdGFydCwgdG9BY3Rpb25PYmplY3RzLCByYWlzZSwgc3RvcCwgcmVzb2x2ZUFjdGlvbnMsIGRvbmVJbnZva2UsIGVycm9yLCB0b0FjdGlvbk9iamVjdCwgdG9BY3Rpdml0eURlZmluaXRpb24sIGFmdGVyLCBzZW5kLCBjYW5jZWwsIGluaXRFdmVudCB9IGZyb20gJy4vYWN0aW9ucy5qcyc7XG5pbXBvcnQgeyBJU19QUk9EVUNUSU9OIH0gZnJvbSAnLi9lbnZpcm9ubWVudC5qcyc7XG5pbXBvcnQgeyBTVEFURV9ERUxJTUlURVIgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBnZXRBbGxTdGF0ZU5vZGVzLCBnZXRDb25maWd1cmF0aW9uLCBpc0luRmluYWxTdGF0ZSwgZ2V0VGFnc0Zyb21Db25maWd1cmF0aW9uLCBoYXMsIGdldENoaWxkcmVuLCBnZXRWYWx1ZSwgaXNMZWFmTm9kZSwgZ2V0QWxsQ2hpbGRyZW4gfSBmcm9tICcuL3N0YXRlVXRpbHMuanMnO1xuaW1wb3J0IHsgY3JlYXRlSW52b2NhYmxlQWN0b3IgfSBmcm9tICcuL0FjdG9yLmpzJztcbmltcG9ydCB7IHRvSW52b2tlRGVmaW5pdGlvbiB9IGZyb20gJy4vaW52b2tlVXRpbHMuanMnO1xuXG52YXIgTlVMTF9FVkVOVCA9ICcnO1xudmFyIFNUQVRFX0lERU5USUZJRVIgPSAnIyc7XG52YXIgV0lMRENBUkQgPSAnKic7XG52YXIgRU1QVFlfT0JKRUNUID0ge307XG5cbnZhciBpc1N0YXRlSWQgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHJbMF0gPT09IFNUQVRFX0lERU5USUZJRVI7XG59O1xuXG52YXIgY3JlYXRlRGVmYXVsdE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB7XG4gICAgYWN0aW9uczoge30sXG4gICAgZ3VhcmRzOiB7fSxcbiAgICBzZXJ2aWNlczoge30sXG4gICAgYWN0aXZpdGllczoge30sXG4gICAgZGVsYXlzOiB7fVxuICB9O1xufTtcblxudmFyIHZhbGlkYXRlQXJyYXlpZmllZFRyYW5zaXRpb25zID0gZnVuY3Rpb24gKHN0YXRlTm9kZSwgZXZlbnQsIHRyYW5zaXRpb25zKSB7XG4gIHZhciBoYXNOb25MYXN0VW5ndWFyZGVkVGFyZ2V0ID0gdHJhbnNpdGlvbnMuc2xpY2UoMCwgLTEpLnNvbWUoZnVuY3Rpb24gKHRyYW5zaXRpb24pIHtcbiAgICByZXR1cm4gISgnY29uZCcgaW4gdHJhbnNpdGlvbikgJiYgISgnaW4nIGluIHRyYW5zaXRpb24pICYmIChpc1N0cmluZyh0cmFuc2l0aW9uLnRhcmdldCkgfHwgaXNNYWNoaW5lKHRyYW5zaXRpb24udGFyZ2V0KSk7XG4gIH0pO1xuICB2YXIgZXZlbnRUZXh0ID0gZXZlbnQgPT09IE5VTExfRVZFTlQgPyAndGhlIHRyYW5zaWVudCBldmVudCcgOiBcImV2ZW50ICdcIi5jb25jYXQoZXZlbnQsIFwiJ1wiKTtcbiAgd2FybighaGFzTm9uTGFzdFVuZ3VhcmRlZFRhcmdldCwgXCJPbmUgb3IgbW9yZSB0cmFuc2l0aW9ucyBmb3IgXCIuY29uY2F0KGV2ZW50VGV4dCwgXCIgb24gc3RhdGUgJ1wiKS5jb25jYXQoc3RhdGVOb2RlLmlkLCBcIicgYXJlIHVucmVhY2hhYmxlLiBcIikgKyBcIk1ha2Ugc3VyZSB0aGF0IHRoZSBkZWZhdWx0IHRyYW5zaXRpb24gaXMgdGhlIGxhc3Qgb25lIGRlZmluZWQuXCIpO1xufTtcblxudmFyIFN0YXRlTm9kZSA9XG4vKiNfX1BVUkVfXyovXG5cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3RhdGVOb2RlKFxuICAvKipcclxuICAgKiBUaGUgcmF3IGNvbmZpZyB1c2VkIHRvIGNyZWF0ZSB0aGUgbWFjaGluZS5cclxuICAgKi9cbiAgY29uZmlnLCBvcHRpb25zLFxuICAvKipcclxuICAgKiBUaGUgaW5pdGlhbCBleHRlbmRlZCBzdGF0ZVxyXG4gICAqL1xuICBfY29udGV4dCwgLy8gVE9ETzogdGhpcyBpcyB1bnNhZmUsIGJ1dCB3ZSdyZSByZW1vdmluZyBpdCBpbiB2NSBhbnl3YXlcbiAgX3N0YXRlSW5mbykge1xuICAgIGlmIChfY29udGV4dCA9PT0gdm9pZCAwKSB7XG4gICAgICBfY29udGV4dCA9ICdjb250ZXh0JyBpbiBjb25maWcgPyBjb25maWcuY29udGV4dCA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9hO1xuXG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5fY29udGV4dCA9IF9jb250ZXh0O1xuICAgIC8qKlxyXG4gICAgICogVGhlIG9yZGVyIHRoaXMgc3RhdGUgbm9kZSBhcHBlYXJzLiBDb3JyZXNwb25kcyB0byB0aGUgaW1wbGljaXQgU0NYTUwgZG9jdW1lbnQgb3JkZXIuXHJcbiAgICAgKi9cblxuICAgIHRoaXMub3JkZXIgPSAtMTtcbiAgICB0aGlzLl9feHN0YXRlbm9kZSA9IHRydWU7XG4gICAgdGhpcy5fX2NhY2hlID0ge1xuICAgICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgICByZWxhdGl2ZVZhbHVlOiBuZXcgTWFwKCksXG4gICAgICBpbml0aWFsU3RhdGVWYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgaW5pdGlhbFN0YXRlOiB1bmRlZmluZWQsXG4gICAgICBvbjogdW5kZWZpbmVkLFxuICAgICAgdHJhbnNpdGlvbnM6IHVuZGVmaW5lZCxcbiAgICAgIGNhbmRpZGF0ZXM6IHt9LFxuICAgICAgZGVsYXllZFRyYW5zaXRpb25zOiB1bmRlZmluZWRcbiAgICB9O1xuICAgIHRoaXMuaWRNYXAgPSB7fTtcbiAgICB0aGlzLnRhZ3MgPSBbXTtcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKGNyZWF0ZURlZmF1bHRPcHRpb25zKCksIG9wdGlvbnMpO1xuICAgIHRoaXMucGFyZW50ID0gX3N0YXRlSW5mbyA9PT0gbnVsbCB8fCBfc3RhdGVJbmZvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc3RhdGVJbmZvLnBhcmVudDtcbiAgICB0aGlzLmtleSA9IHRoaXMuY29uZmlnLmtleSB8fCAoX3N0YXRlSW5mbyA9PT0gbnVsbCB8fCBfc3RhdGVJbmZvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc3RhdGVJbmZvLmtleSkgfHwgdGhpcy5jb25maWcuaWQgfHwgJyhtYWNoaW5lKSc7XG4gICAgdGhpcy5tYWNoaW5lID0gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5tYWNoaW5lIDogdGhpcztcbiAgICB0aGlzLnBhdGggPSB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnBhdGguY29uY2F0KHRoaXMua2V5KSA6IFtdO1xuICAgIHRoaXMuZGVsaW1pdGVyID0gdGhpcy5jb25maWcuZGVsaW1pdGVyIHx8ICh0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmRlbGltaXRlciA6IFNUQVRFX0RFTElNSVRFUik7XG4gICAgdGhpcy5pZCA9IHRoaXMuY29uZmlnLmlkIHx8IF9fc3ByZWFkQXJyYXkoW3RoaXMubWFjaGluZS5rZXldLCBfX3JlYWQodGhpcy5wYXRoKSwgZmFsc2UpLmpvaW4odGhpcy5kZWxpbWl0ZXIpO1xuICAgIHRoaXMudmVyc2lvbiA9IHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQudmVyc2lvbiA6IHRoaXMuY29uZmlnLnZlcnNpb247XG4gICAgdGhpcy50eXBlID0gdGhpcy5jb25maWcudHlwZSB8fCAodGhpcy5jb25maWcucGFyYWxsZWwgPyAncGFyYWxsZWwnIDogdGhpcy5jb25maWcuc3RhdGVzICYmIE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLnN0YXRlcykubGVuZ3RoID8gJ2NvbXBvdW5kJyA6IHRoaXMuY29uZmlnLmhpc3RvcnkgPyAnaGlzdG9yeScgOiAnYXRvbWljJyk7XG4gICAgdGhpcy5zY2hlbWEgPSB0aGlzLnBhcmVudCA/IHRoaXMubWFjaGluZS5zY2hlbWEgOiAoX2EgPSB0aGlzLmNvbmZpZy5zY2hlbWEpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9O1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbjtcblxuICAgIGlmICghSVNfUFJPRFVDVElPTikge1xuICAgICAgd2FybighKCdwYXJhbGxlbCcgaW4gdGhpcy5jb25maWcpLCBcIlRoZSBcXFwicGFyYWxsZWxcXFwiIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDQuMS4gXCIuY29uY2F0KHRoaXMuY29uZmlnLnBhcmFsbGVsID8gXCJSZXBsYWNlIHdpdGggYHR5cGU6ICdwYXJhbGxlbCdgXCIgOiBcIlVzZSBgdHlwZTogJ1wiLmNvbmNhdCh0aGlzLnR5cGUsIFwiJ2BcIiksIFwiIGluIHRoZSBjb25maWcgZm9yIHN0YXRlIG5vZGUgJ1wiKS5jb25jYXQodGhpcy5pZCwgXCInIGluc3RlYWQuXCIpKTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRpYWwgPSB0aGlzLmNvbmZpZy5pbml0aWFsO1xuICAgIHRoaXMuc3RhdGVzID0gdGhpcy5jb25maWcuc3RhdGVzID8gbWFwVmFsdWVzKHRoaXMuY29uZmlnLnN0YXRlcywgZnVuY3Rpb24gKHN0YXRlQ29uZmlnLCBrZXkpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgdmFyIHN0YXRlTm9kZSA9IG5ldyBTdGF0ZU5vZGUoc3RhdGVDb25maWcsIHt9LCB1bmRlZmluZWQsIHtcbiAgICAgICAgcGFyZW50OiBfdGhpcyxcbiAgICAgICAga2V5OiBrZXlcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmFzc2lnbihfdGhpcy5pZE1hcCwgX19hc3NpZ24oKF9hID0ge30sIF9hW3N0YXRlTm9kZS5pZF0gPSBzdGF0ZU5vZGUsIF9hKSwgc3RhdGVOb2RlLmlkTWFwKSk7XG4gICAgICByZXR1cm4gc3RhdGVOb2RlO1xuICAgIH0pIDogRU1QVFlfT0JKRUNUOyAvLyBEb2N1bWVudCBvcmRlclxuXG4gICAgdmFyIG9yZGVyID0gMDtcblxuICAgIGZ1bmN0aW9uIGRmcyhzdGF0ZU5vZGUpIHtcbiAgICAgIHZhciBlXzEsIF9hO1xuXG4gICAgICBzdGF0ZU5vZGUub3JkZXIgPSBvcmRlcisrO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKGdldEFsbENoaWxkcmVuKHN0YXRlTm9kZSkpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gX2MudmFsdWU7XG4gICAgICAgICAgZGZzKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZV8xXzEpIHtcbiAgICAgICAgZV8xID0ge1xuICAgICAgICAgIGVycm9yOiBlXzFfMVxuICAgICAgICB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGZzKHRoaXMpOyAvLyBIaXN0b3J5IGNvbmZpZ1xuXG4gICAgdGhpcy5oaXN0b3J5ID0gdGhpcy5jb25maWcuaGlzdG9yeSA9PT0gdHJ1ZSA/ICdzaGFsbG93JyA6IHRoaXMuY29uZmlnLmhpc3RvcnkgfHwgZmFsc2U7XG4gICAgdGhpcy5fdHJhbnNpZW50ID0gISF0aGlzLmNvbmZpZy5hbHdheXMgfHwgKCF0aGlzLmNvbmZpZy5vbiA/IGZhbHNlIDogQXJyYXkuaXNBcnJheSh0aGlzLmNvbmZpZy5vbikgPyB0aGlzLmNvbmZpZy5vbi5zb21lKGZ1bmN0aW9uIChfYSkge1xuICAgICAgdmFyIGV2ZW50ID0gX2EuZXZlbnQ7XG4gICAgICByZXR1cm4gZXZlbnQgPT09IE5VTExfRVZFTlQ7XG4gICAgfSkgOiBOVUxMX0VWRU5UIGluIHRoaXMuY29uZmlnLm9uKTtcbiAgICB0aGlzLnN0cmljdCA9ICEhdGhpcy5jb25maWcuc3RyaWN0OyAvLyBUT0RPOiBkZXByZWNhdGUgKGVudHJ5KVxuXG4gICAgdGhpcy5vbkVudHJ5ID0gdG9BcnJheSh0aGlzLmNvbmZpZy5lbnRyeSB8fCB0aGlzLmNvbmZpZy5vbkVudHJ5KS5tYXAoZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgcmV0dXJuIHRvQWN0aW9uT2JqZWN0KGFjdGlvbik7XG4gICAgfSk7IC8vIFRPRE86IGRlcHJlY2F0ZSAoZXhpdClcblxuICAgIHRoaXMub25FeGl0ID0gdG9BcnJheSh0aGlzLmNvbmZpZy5leGl0IHx8IHRoaXMuY29uZmlnLm9uRXhpdCkubWFwKGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgIHJldHVybiB0b0FjdGlvbk9iamVjdChhY3Rpb24pO1xuICAgIH0pO1xuICAgIHRoaXMubWV0YSA9IHRoaXMuY29uZmlnLm1ldGE7XG4gICAgdGhpcy5kb25lRGF0YSA9IHRoaXMudHlwZSA9PT0gJ2ZpbmFsJyA/IHRoaXMuY29uZmlnLmRhdGEgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5pbnZva2UgPSB0b0FycmF5KHRoaXMuY29uZmlnLmludm9rZSkubWFwKGZ1bmN0aW9uIChpbnZva2VDb25maWcsIGkpIHtcbiAgICAgIHZhciBfYSwgX2I7XG5cbiAgICAgIGlmIChpc01hY2hpbmUoaW52b2tlQ29uZmlnKSkge1xuICAgICAgICB2YXIgaW52b2tlSWQgPSBjcmVhdGVJbnZva2VJZChfdGhpcy5pZCwgaSk7XG4gICAgICAgIF90aGlzLm1hY2hpbmUub3B0aW9ucy5zZXJ2aWNlcyA9IF9fYXNzaWduKChfYSA9IHt9LCBfYVtpbnZva2VJZF0gPSBpbnZva2VDb25maWcsIF9hKSwgX3RoaXMubWFjaGluZS5vcHRpb25zLnNlcnZpY2VzKTtcbiAgICAgICAgcmV0dXJuIHRvSW52b2tlRGVmaW5pdGlvbih7XG4gICAgICAgICAgc3JjOiBpbnZva2VJZCxcbiAgICAgICAgICBpZDogaW52b2tlSWRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKGludm9rZUNvbmZpZy5zcmMpKSB7XG4gICAgICAgIHZhciBpbnZva2VJZCA9IGludm9rZUNvbmZpZy5pZCB8fCBjcmVhdGVJbnZva2VJZChfdGhpcy5pZCwgaSk7XG4gICAgICAgIHJldHVybiB0b0ludm9rZURlZmluaXRpb24oX19hc3NpZ24oX19hc3NpZ24oe30sIGludm9rZUNvbmZpZyksIHtcbiAgICAgICAgICBpZDogaW52b2tlSWQsXG4gICAgICAgICAgc3JjOiBpbnZva2VDb25maWcuc3JjXG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNNYWNoaW5lKGludm9rZUNvbmZpZy5zcmMpIHx8IGlzRnVuY3Rpb24oaW52b2tlQ29uZmlnLnNyYykpIHtcbiAgICAgICAgdmFyIGludm9rZUlkID0gaW52b2tlQ29uZmlnLmlkIHx8IGNyZWF0ZUludm9rZUlkKF90aGlzLmlkLCBpKTtcbiAgICAgICAgX3RoaXMubWFjaGluZS5vcHRpb25zLnNlcnZpY2VzID0gX19hc3NpZ24oKF9iID0ge30sIF9iW2ludm9rZUlkXSA9IGludm9rZUNvbmZpZy5zcmMsIF9iKSwgX3RoaXMubWFjaGluZS5vcHRpb25zLnNlcnZpY2VzKTtcbiAgICAgICAgcmV0dXJuIHRvSW52b2tlRGVmaW5pdGlvbihfX2Fzc2lnbihfX2Fzc2lnbih7XG4gICAgICAgICAgaWQ6IGludm9rZUlkXG4gICAgICAgIH0sIGludm9rZUNvbmZpZyksIHtcbiAgICAgICAgICBzcmM6IGludm9rZUlkXG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpbnZva2VTb3VyY2UgPSBpbnZva2VDb25maWcuc3JjO1xuICAgICAgICByZXR1cm4gdG9JbnZva2VEZWZpbml0aW9uKF9fYXNzaWduKF9fYXNzaWduKHtcbiAgICAgICAgICBpZDogY3JlYXRlSW52b2tlSWQoX3RoaXMuaWQsIGkpXG4gICAgICAgIH0sIGludm9rZUNvbmZpZyksIHtcbiAgICAgICAgICBzcmM6IGludm9rZVNvdXJjZVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5hY3Rpdml0aWVzID0gdG9BcnJheSh0aGlzLmNvbmZpZy5hY3Rpdml0aWVzKS5jb25jYXQodGhpcy5pbnZva2UpLm1hcChmdW5jdGlvbiAoYWN0aXZpdHkpIHtcbiAgICAgIHJldHVybiB0b0FjdGl2aXR5RGVmaW5pdGlvbihhY3Rpdml0eSk7XG4gICAgfSk7XG4gICAgdGhpcy50cmFuc2l0aW9uID0gdGhpcy50cmFuc2l0aW9uLmJpbmQodGhpcyk7XG4gICAgdGhpcy50YWdzID0gdG9BcnJheSh0aGlzLmNvbmZpZy50YWdzKTsgLy8gVE9ETzogdGhpcyBpcyB0aGUgcmVhbCBmaXggZm9yIGluaXRpYWxpemF0aW9uIG9uY2VcbiAgICAvLyBzdGF0ZSBub2RlIGdldHRlcnMgYXJlIGRlcHJlY2F0ZWRcbiAgICAvLyBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgLy8gICB0aGlzLl9pbml0KCk7XG4gICAgLy8gfVxuICB9XG5cbiAgU3RhdGVOb2RlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fX2NhY2hlLnRyYW5zaXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZ2V0QWxsU3RhdGVOb2Rlcyh0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChzdGF0ZU5vZGUpIHtcbiAgICAgIHJldHVybiBzdGF0ZU5vZGUub247XG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENsb25lcyB0aGlzIHN0YXRlIG1hY2hpbmUgd2l0aCBjdXN0b20gb3B0aW9ucyBhbmQgY29udGV4dC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgKGFjdGlvbnMsIGd1YXJkcywgYWN0aXZpdGllcywgc2VydmljZXMpIHRvIHJlY3Vyc2l2ZWx5IG1lcmdlIHdpdGggdGhlIGV4aXN0aW5nIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIGNvbnRleHQgQ3VzdG9tIGNvbnRleHQgKHdpbGwgb3ZlcnJpZGUgcHJlZGVmaW5lZCBjb250ZXh0KVxyXG4gICAqL1xuXG5cbiAgU3RhdGVOb2RlLnByb3RvdHlwZS53aXRoQ29uZmlnID0gZnVuY3Rpb24gKG9wdGlvbnMsIGNvbnRleHQpIHtcbiAgICB2YXIgX2EgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGFjdGlvbnMgPSBfYS5hY3Rpb25zLFxuICAgICAgICBhY3Rpdml0aWVzID0gX2EuYWN0aXZpdGllcyxcbiAgICAgICAgZ3VhcmRzID0gX2EuZ3VhcmRzLFxuICAgICAgICBzZXJ2aWNlcyA9IF9hLnNlcnZpY2VzLFxuICAgICAgICBkZWxheXMgPSBfYS5kZWxheXM7XG4gICAgcmV0dXJuIG5ldyBTdGF0ZU5vZGUodGhpcy5jb25maWcsIHtcbiAgICAgIGFjdGlvbnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBhY3Rpb25zKSwgb3B0aW9ucy5hY3Rpb25zKSxcbiAgICAgIGFjdGl2aXRpZXM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBhY3Rpdml0aWVzKSwgb3B0aW9ucy5hY3Rpdml0aWVzKSxcbiAgICAgIGd1YXJkczogX19hc3NpZ24oX19hc3NpZ24oe30sIGd1YXJkcyksIG9wdGlvbnMuZ3VhcmRzKSxcbiAgICAgIHNlcnZpY2VzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc2VydmljZXMpLCBvcHRpb25zLnNlcnZpY2VzKSxcbiAgICAgIGRlbGF5czogX19hc3NpZ24oX19hc3NpZ24oe30sIGRlbGF5cyksIG9wdGlvbnMuZGVsYXlzKVxuICAgIH0sIGNvbnRleHQgIT09IG51bGwgJiYgY29udGV4dCAhPT0gdm9pZCAwID8gY29udGV4dCA6IHRoaXMuY29udGV4dCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENsb25lcyB0aGlzIHN0YXRlIG1hY2hpbmUgd2l0aCBjdXN0b20gY29udGV4dC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBjb250ZXh0IEN1c3RvbSBjb250ZXh0ICh3aWxsIG92ZXJyaWRlIHByZWRlZmluZWQgY29udGV4dCwgbm90IHJlY3Vyc2l2ZSlcclxuICAgKi9cblxuXG4gIFN0YXRlTm9kZS5wcm90b3R5cGUud2l0aENvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHJldHVybiBuZXcgU3RhdGVOb2RlKHRoaXMuY29uZmlnLCB0aGlzLm9wdGlvbnMsIGNvbnRleHQpO1xuICB9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGF0ZU5vZGUucHJvdG90eXBlLCBcImNvbnRleHRcIiwge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGlzRnVuY3Rpb24odGhpcy5fY29udGV4dCkgPyB0aGlzLl9jb250ZXh0KCkgOiB0aGlzLl9jb250ZXh0O1xuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RhdGVOb2RlLnByb3RvdHlwZSwgXCJkZWZpbml0aW9uXCIsIHtcbiAgICAvKipcclxuICAgICAqIFRoZSB3ZWxsLXN0cnVjdHVyZWQgc3RhdGUgbm9kZSBkZWZpbml0aW9uLlxyXG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAga2V5OiB0aGlzLmtleSxcbiAgICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgaW5pdGlhbDogdGhpcy5pbml0aWFsLFxuICAgICAgICBoaXN0b3J5OiB0aGlzLmhpc3RvcnksXG4gICAgICAgIHN0YXRlczogbWFwVmFsdWVzKHRoaXMuc3RhdGVzLCBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUuZGVmaW5pdGlvbjtcbiAgICAgICAgfSksXG4gICAgICAgIG9uOiB0aGlzLm9uLFxuICAgICAgICB0cmFuc2l0aW9uczogdGhpcy50cmFuc2l0aW9ucyxcbiAgICAgICAgZW50cnk6IHRoaXMub25FbnRyeSxcbiAgICAgICAgZXhpdDogdGhpcy5vbkV4aXQsXG4gICAgICAgIGFjdGl2aXRpZXM6IHRoaXMuYWN0aXZpdGllcyB8fCBbXSxcbiAgICAgICAgbWV0YTogdGhpcy5tZXRhLFxuICAgICAgICBvcmRlcjogdGhpcy5vcmRlciB8fCAtMSxcbiAgICAgICAgZGF0YTogdGhpcy5kb25lRGF0YSxcbiAgICAgICAgaW52b2tlOiB0aGlzLmludm9rZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAgIHRhZ3M6IHRoaXMudGFnc1xuICAgICAgfTtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcblxuICBTdGF0ZU5vZGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uO1xuICB9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGF0ZU5vZGUucHJvdG90eXBlLCBcIm9uXCIsIHtcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXBwaW5nIG9mIGV2ZW50cyB0byB0cmFuc2l0aW9ucy5cclxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMuX19jYWNoZS5vbikge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2NhY2hlLm9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHJhbnNpdGlvbnMgPSB0aGlzLnRyYW5zaXRpb25zO1xuICAgICAgcmV0dXJuIHRoaXMuX19jYWNoZS5vbiA9IHRyYW5zaXRpb25zLnJlZHVjZShmdW5jdGlvbiAobWFwLCB0cmFuc2l0aW9uKSB7XG4gICAgICAgIG1hcFt0cmFuc2l0aW9uLmV2ZW50VHlwZV0gPSBtYXBbdHJhbnNpdGlvbi5ldmVudFR5cGVdIHx8IFtdO1xuICAgICAgICBtYXBbdHJhbnNpdGlvbi5ldmVudFR5cGVdLnB1c2godHJhbnNpdGlvbik7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgICB9LCB7fSk7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGF0ZU5vZGUucHJvdG90eXBlLCBcImFmdGVyXCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fY2FjaGUuZGVsYXllZFRyYW5zaXRpb25zIHx8ICh0aGlzLl9fY2FjaGUuZGVsYXllZFRyYW5zaXRpb25zID0gdGhpcy5nZXREZWxheWVkVHJhbnNpdGlvbnMoKSwgdGhpcy5fX2NhY2hlLmRlbGF5ZWRUcmFuc2l0aW9ucyk7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGF0ZU5vZGUucHJvdG90eXBlLCBcInRyYW5zaXRpb25zXCIsIHtcbiAgICAvKipcclxuICAgICAqIEFsbCB0aGUgdHJhbnNpdGlvbnMgdGhhdCBjYW4gYmUgdGFrZW4gZnJvbSB0aGlzIHN0YXRlIG5vZGUuXHJcbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fY2FjaGUudHJhbnNpdGlvbnMgfHwgKHRoaXMuX19jYWNoZS50cmFuc2l0aW9ucyA9IHRoaXMuZm9ybWF0VHJhbnNpdGlvbnMoKSwgdGhpcy5fX2NhY2hlLnRyYW5zaXRpb25zKTtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcblxuICBTdGF0ZU5vZGUucHJvdG90eXBlLmdldENhbmRpZGF0ZXMgPSBmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgaWYgKHRoaXMuX19jYWNoZS5jYW5kaWRhdGVzW2V2ZW50TmFtZV0pIHtcbiAgICAgIHJldHVybiB0aGlzLl9fY2FjaGUuY2FuZGlkYXRlc1tldmVudE5hbWVdO1xuICAgIH1cblxuICAgIHZhciB0cmFuc2llbnQgPSBldmVudE5hbWUgPT09IE5VTExfRVZFTlQ7XG4gICAgdmFyIGNhbmRpZGF0ZXMgPSB0aGlzLnRyYW5zaXRpb25zLmZpbHRlcihmdW5jdGlvbiAodHJhbnNpdGlvbikge1xuICAgICAgdmFyIHNhbWVFdmVudFR5cGUgPSB0cmFuc2l0aW9uLmV2ZW50VHlwZSA9PT0gZXZlbnROYW1lOyAvLyBudWxsIGV2ZW50cyBzaG91bGQgb25seSBtYXRjaCBhZ2FpbnN0IGV2ZW50bGVzcyB0cmFuc2l0aW9uc1xuXG4gICAgICByZXR1cm4gdHJhbnNpZW50ID8gc2FtZUV2ZW50VHlwZSA6IHNhbWVFdmVudFR5cGUgfHwgdHJhbnNpdGlvbi5ldmVudFR5cGUgPT09IFdJTERDQVJEO1xuICAgIH0pO1xuICAgIHRoaXMuX19jYWNoZS5jYW5kaWRhdGVzW2V2ZW50TmFtZV0gPSBjYW5kaWRhdGVzO1xuICAgIHJldHVybiBjYW5kaWRhdGVzO1xuICB9O1xuICAvKipcclxuICAgKiBBbGwgZGVsYXllZCB0cmFuc2l0aW9ucyBmcm9tIHRoZSBjb25maWcuXHJcbiAgICovXG5cblxuICBTdGF0ZU5vZGUucHJvdG90eXBlLmdldERlbGF5ZWRUcmFuc2l0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGFmdGVyQ29uZmlnID0gdGhpcy5jb25maWcuYWZ0ZXI7XG5cbiAgICBpZiAoIWFmdGVyQ29uZmlnKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIG11dGF0ZUVudHJ5RXhpdCA9IGZ1bmN0aW9uIChkZWxheSwgaSkge1xuICAgICAgdmFyIGRlbGF5UmVmID0gaXNGdW5jdGlvbihkZWxheSkgPyBcIlwiLmNvbmNhdChfdGhpcy5pZCwgXCI6ZGVsYXlbXCIpLmNvbmNhdChpLCBcIl1cIikgOiBkZWxheTtcbiAgICAgIHZhciBldmVudFR5cGUgPSBhZnRlcihkZWxheVJlZiwgX3RoaXMuaWQpO1xuXG4gICAgICBfdGhpcy5vbkVudHJ5LnB1c2goc2VuZChldmVudFR5cGUsIHtcbiAgICAgICAgZGVsYXk6IGRlbGF5XG4gICAgICB9KSk7XG5cbiAgICAgIF90aGlzLm9uRXhpdC5wdXNoKGNhbmNlbChldmVudFR5cGUpKTtcblxuICAgICAgcmV0dXJuIGV2ZW50VHlwZTtcbiAgICB9O1xuXG4gICAgdmFyIGRlbGF5ZWRUcmFuc2l0aW9ucyA9IGlzQXJyYXkoYWZ0ZXJDb25maWcpID8gYWZ0ZXJDb25maWcubWFwKGZ1bmN0aW9uICh0cmFuc2l0aW9uLCBpKSB7XG4gICAgICB2YXIgZXZlbnRUeXBlID0gbXV0YXRlRW50cnlFeGl0KHRyYW5zaXRpb24uZGVsYXksIGkpO1xuICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCB0cmFuc2l0aW9uKSwge1xuICAgICAgICBldmVudDogZXZlbnRUeXBlXG4gICAgICB9KTtcbiAgICB9KSA6IGZsYXR0ZW4oT2JqZWN0LmtleXMoYWZ0ZXJDb25maWcpLm1hcChmdW5jdGlvbiAoZGVsYXksIGkpIHtcbiAgICAgIHZhciBjb25maWdUcmFuc2l0aW9uID0gYWZ0ZXJDb25maWdbZGVsYXldO1xuICAgICAgdmFyIHJlc29sdmVkVHJhbnNpdGlvbiA9IGlzU3RyaW5nKGNvbmZpZ1RyYW5zaXRpb24pID8ge1xuICAgICAgICB0YXJnZXQ6IGNvbmZpZ1RyYW5zaXRpb25cbiAgICAgIH0gOiBjb25maWdUcmFuc2l0aW9uO1xuICAgICAgdmFyIHJlc29sdmVkRGVsYXkgPSAhaXNOYU4oK2RlbGF5KSA/ICtkZWxheSA6IGRlbGF5O1xuICAgICAgdmFyIGV2ZW50VHlwZSA9IG11dGF0ZUVudHJ5RXhpdChyZXNvbHZlZERlbGF5LCBpKTtcbiAgICAgIHJldHVybiB0b0FycmF5KHJlc29sdmVkVHJhbnNpdGlvbikubWFwKGZ1bmN0aW9uICh0cmFuc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdHJhbnNpdGlvbiksIHtcbiAgICAgICAgICBldmVudDogZXZlbnRUeXBlLFxuICAgICAgICAgIGRlbGF5OiByZXNvbHZlZERlbGF5XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSkpO1xuICAgIHJldHVybiBkZWxheWVkVHJhbnNpdGlvbnMubWFwKGZ1bmN0aW9uIChkZWxheWVkVHJhbnNpdGlvbikge1xuICAgICAgdmFyIGRlbGF5ID0gZGVsYXllZFRyYW5zaXRpb24uZGVsYXk7XG4gICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIF90aGlzLmZvcm1hdFRyYW5zaXRpb24oZGVsYXllZFRyYW5zaXRpb24pKSwge1xuICAgICAgICBkZWxheTogZGVsYXlcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBzdGF0ZSBub2RlcyByZXByZXNlbnRlZCBieSB0aGUgY3VycmVudCBzdGF0ZSB2YWx1ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGUgdmFsdWUgb3IgU3RhdGUgaW5zdGFuY2VcclxuICAgKi9cblxuXG4gIFN0YXRlTm9kZS5wcm90b3R5cGUuZ2V0U3RhdGVOb2RlcyA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgIHZhciBfYTtcblxuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoIXN0YXRlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIHN0YXRlVmFsdWUgPSBzdGF0ZSBpbnN0YW5jZW9mIFN0YXRlID8gc3RhdGUudmFsdWUgOiB0b1N0YXRlVmFsdWUoc3RhdGUsIHRoaXMuZGVsaW1pdGVyKTtcblxuICAgIGlmIChpc1N0cmluZyhzdGF0ZVZhbHVlKSkge1xuICAgICAgdmFyIGluaXRpYWxTdGF0ZVZhbHVlID0gdGhpcy5nZXRTdGF0ZU5vZGUoc3RhdGVWYWx1ZSkuaW5pdGlhbDtcbiAgICAgIHJldHVybiBpbml0aWFsU3RhdGVWYWx1ZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5nZXRTdGF0ZU5vZGVzKChfYSA9IHt9LCBfYVtzdGF0ZVZhbHVlXSA9IGluaXRpYWxTdGF0ZVZhbHVlLCBfYSkpIDogW3RoaXMsIHRoaXMuc3RhdGVzW3N0YXRlVmFsdWVdXTtcbiAgICB9XG5cbiAgICB2YXIgc3ViU3RhdGVLZXlzID0gT2JqZWN0LmtleXMoc3RhdGVWYWx1ZSk7XG4gICAgdmFyIHN1YlN0YXRlTm9kZXMgPSBbdGhpc107XG4gICAgc3ViU3RhdGVOb2Rlcy5wdXNoLmFwcGx5KHN1YlN0YXRlTm9kZXMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChmbGF0dGVuKHN1YlN0YXRlS2V5cy5tYXAoZnVuY3Rpb24gKHN1YlN0YXRlS2V5KSB7XG4gICAgICByZXR1cm4gX3RoaXMuZ2V0U3RhdGVOb2RlKHN1YlN0YXRlS2V5KS5nZXRTdGF0ZU5vZGVzKHN0YXRlVmFsdWVbc3ViU3RhdGVLZXldKTtcbiAgICB9KSkpLCBmYWxzZSkpO1xuICAgIHJldHVybiBzdWJTdGF0ZU5vZGVzO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHN0YXRlIG5vZGUgZXhwbGljaXRseSBoYW5kbGVzIHRoZSBnaXZlbiBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgaW4gcXVlc3Rpb25cclxuICAgKi9cblxuXG4gIFN0YXRlTm9kZS5wcm90b3R5cGUuaGFuZGxlcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBldmVudFR5cGUgPSBnZXRFdmVudFR5cGUoZXZlbnQpO1xuICAgIHJldHVybiB0aGlzLmV2ZW50cy5pbmNsdWRlcyhldmVudFR5cGUpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gYHN0YXRlYCB0byBhIG5ldyBgU3RhdGVgIGluc3RhbmNlIHJlbGF0aXZlIHRvIHRoaXMgbWFjaGluZS5cclxuICAgKlxyXG4gICAqIFRoaXMgZW5zdXJlcyB0aGF0IGAuZXZlbnRzYCBhbmQgYC5uZXh0RXZlbnRzYCByZXByZXNlbnQgdGhlIGNvcnJlY3QgdmFsdWVzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byByZXNvbHZlXHJcbiAgICovXG5cblxuICBTdGF0ZU5vZGUucHJvdG90eXBlLnJlc29sdmVTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgIHZhciBzdGF0ZUZyb21Db25maWcgPSBzdGF0ZSBpbnN0YW5jZW9mIFN0YXRlID8gc3RhdGUgOiBTdGF0ZS5jcmVhdGUoc3RhdGUpO1xuICAgIHZhciBjb25maWd1cmF0aW9uID0gQXJyYXkuZnJvbShnZXRDb25maWd1cmF0aW9uKFtdLCB0aGlzLmdldFN0YXRlTm9kZXMoc3RhdGVGcm9tQ29uZmlnLnZhbHVlKSkpO1xuICAgIHJldHVybiBuZXcgU3RhdGUoX19hc3NpZ24oX19hc3NpZ24oe30sIHN0YXRlRnJvbUNvbmZpZyksIHtcbiAgICAgIHZhbHVlOiB0aGlzLnJlc29sdmUoc3RhdGVGcm9tQ29uZmlnLnZhbHVlKSxcbiAgICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZ3VyYXRpb24sXG4gICAgICBkb25lOiBpc0luRmluYWxTdGF0ZShjb25maWd1cmF0aW9uLCB0aGlzKSxcbiAgICAgIHRhZ3M6IGdldFRhZ3NGcm9tQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSxcbiAgICAgIG1hY2hpbmU6IHRoaXMubWFjaGluZVxuICAgIH0pKTtcbiAgfTtcblxuICBTdGF0ZU5vZGUucHJvdG90eXBlLnRyYW5zaXRpb25MZWFmTm9kZSA9IGZ1bmN0aW9uIChzdGF0ZVZhbHVlLCBzdGF0ZSwgX2V2ZW50KSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IHRoaXMuZ2V0U3RhdGVOb2RlKHN0YXRlVmFsdWUpO1xuICAgIHZhciBuZXh0ID0gc3RhdGVOb2RlLm5leHQoc3RhdGUsIF9ldmVudCk7XG5cbiAgICBpZiAoIW5leHQgfHwgIW5leHQudHJhbnNpdGlvbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZXh0KHN0YXRlLCBfZXZlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0O1xuICB9O1xuXG4gIFN0YXRlTm9kZS5wcm90b3R5cGUudHJhbnNpdGlvbkNvbXBvdW5kTm9kZSA9IGZ1bmN0aW9uIChzdGF0ZVZhbHVlLCBzdGF0ZSwgX2V2ZW50KSB7XG4gICAgdmFyIHN1YlN0YXRlS2V5cyA9IE9iamVjdC5rZXlzKHN0YXRlVmFsdWUpO1xuICAgIHZhciBzdGF0ZU5vZGUgPSB0aGlzLmdldFN0YXRlTm9kZShzdWJTdGF0ZUtleXNbMF0pO1xuXG4gICAgdmFyIG5leHQgPSBzdGF0ZU5vZGUuX3RyYW5zaXRpb24oc3RhdGVWYWx1ZVtzdWJTdGF0ZUtleXNbMF1dLCBzdGF0ZSwgX2V2ZW50KTtcblxuICAgIGlmICghbmV4dCB8fCAhbmV4dC50cmFuc2l0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5leHQoc3RhdGUsIF9ldmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQ7XG4gIH07XG5cbiAgU3RhdGVOb2RlLnByb3RvdHlwZS50cmFuc2l0aW9uUGFyYWxsZWxOb2RlID0gZnVuY3Rpb24gKHN0YXRlVmFsdWUsIHN0YXRlLCBfZXZlbnQpIHtcbiAgICB2YXIgZV8yLCBfYTtcblxuICAgIHZhciB0cmFuc2l0aW9uTWFwID0ge307XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhPYmplY3Qua2V5cyhzdGF0ZVZhbHVlKSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgdmFyIHN1YlN0YXRlS2V5ID0gX2MudmFsdWU7XG4gICAgICAgIHZhciBzdWJTdGF0ZVZhbHVlID0gc3RhdGVWYWx1ZVtzdWJTdGF0ZUtleV07XG5cbiAgICAgICAgaWYgKCFzdWJTdGF0ZVZhbHVlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3ViU3RhdGVOb2RlID0gdGhpcy5nZXRTdGF0ZU5vZGUoc3ViU3RhdGVLZXkpO1xuXG4gICAgICAgIHZhciBuZXh0ID0gc3ViU3RhdGVOb2RlLl90cmFuc2l0aW9uKHN1YlN0YXRlVmFsdWUsIHN0YXRlLCBfZXZlbnQpO1xuXG4gICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgdHJhbnNpdGlvbk1hcFtzdWJTdGF0ZUtleV0gPSBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZV8yXzEpIHtcbiAgICAgIGVfMiA9IHtcbiAgICAgICAgZXJyb3I6IGVfMl8xXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHN0YXRlVHJhbnNpdGlvbnMgPSBPYmplY3Qua2V5cyh0cmFuc2l0aW9uTWFwKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb25NYXBba2V5XTtcbiAgICB9KTtcbiAgICB2YXIgZW5hYmxlZFRyYW5zaXRpb25zID0gZmxhdHRlbihzdGF0ZVRyYW5zaXRpb25zLm1hcChmdW5jdGlvbiAoc3QpIHtcbiAgICAgIHJldHVybiBzdC50cmFuc2l0aW9ucztcbiAgICB9KSk7XG4gICAgdmFyIHdpbGxUcmFuc2l0aW9uID0gc3RhdGVUcmFuc2l0aW9ucy5zb21lKGZ1bmN0aW9uIChzdCkge1xuICAgICAgcmV0dXJuIHN0LnRyYW5zaXRpb25zLmxlbmd0aCA+IDA7XG4gICAgfSk7XG5cbiAgICBpZiAoIXdpbGxUcmFuc2l0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZXh0KHN0YXRlLCBfZXZlbnQpO1xuICAgIH1cblxuICAgIHZhciBjb25maWd1cmF0aW9uID0gZmxhdHRlbihPYmplY3Qua2V5cyh0cmFuc2l0aW9uTWFwKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb25NYXBba2V5XS5jb25maWd1cmF0aW9uO1xuICAgIH0pKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNpdGlvbnM6IGVuYWJsZWRUcmFuc2l0aW9ucyxcbiAgICAgIGV4aXRTZXQ6IGZsYXR0ZW4oc3RhdGVUcmFuc2l0aW9ucy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuZXhpdFNldDtcbiAgICAgIH0pKSxcbiAgICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZ3VyYXRpb24sXG4gICAgICBzb3VyY2U6IHN0YXRlLFxuICAgICAgYWN0aW9uczogZmxhdHRlbihPYmplY3Qua2V5cyh0cmFuc2l0aW9uTWFwKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gdHJhbnNpdGlvbk1hcFtrZXldLmFjdGlvbnM7XG4gICAgICB9KSlcbiAgICB9O1xuICB9O1xuXG4gIFN0YXRlTm9kZS5wcm90b3R5cGUuX3RyYW5zaXRpb24gPSBmdW5jdGlvbiAoc3RhdGVWYWx1ZSwgc3RhdGUsIF9ldmVudCkge1xuICAgIC8vIGxlYWYgbm9kZVxuICAgIGlmIChpc1N0cmluZyhzdGF0ZVZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvbkxlYWZOb2RlKHN0YXRlVmFsdWUsIHN0YXRlLCBfZXZlbnQpO1xuICAgIH0gLy8gaGllcmFyY2hpY2FsIG5vZGVcblxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHN0YXRlVmFsdWUpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvbkNvbXBvdW5kTm9kZShzdGF0ZVZhbHVlLCBzdGF0ZSwgX2V2ZW50KTtcbiAgICB9IC8vIG9ydGhvZ29uYWwgbm9kZVxuXG5cbiAgICByZXR1cm4gdGhpcy50cmFuc2l0aW9uUGFyYWxsZWxOb2RlKHN0YXRlVmFsdWUsIHN0YXRlLCBfZXZlbnQpO1xuICB9O1xuXG4gIFN0YXRlTm9kZS5wcm90b3R5cGUuZ2V0VHJhbnNpdGlvbkRhdGEgPSBmdW5jdGlvbiAoc3RhdGUsIGV2ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb24oc3RhdGUudmFsdWUsIHN0YXRlLCB0b1NDWE1MRXZlbnQoZXZlbnQpKTtcbiAgfTtcblxuICBTdGF0ZU5vZGUucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoc3RhdGUsIF9ldmVudCkge1xuICAgIHZhciBlXzMsIF9hO1xuXG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBldmVudE5hbWUgPSBfZXZlbnQubmFtZTtcbiAgICB2YXIgYWN0aW9ucyA9IFtdO1xuICAgIHZhciBuZXh0U3RhdGVOb2RlcyA9IFtdO1xuICAgIHZhciBzZWxlY3RlZFRyYW5zaXRpb247XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyh0aGlzLmdldENhbmRpZGF0ZXMoZXZlbnROYW1lKSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IF9jLnZhbHVlO1xuICAgICAgICB2YXIgY29uZCA9IGNhbmRpZGF0ZS5jb25kLFxuICAgICAgICAgICAgc3RhdGVJbiA9IGNhbmRpZGF0ZS5pbjtcbiAgICAgICAgdmFyIHJlc29sdmVkQ29udGV4dCA9IHN0YXRlLmNvbnRleHQ7XG4gICAgICAgIHZhciBpc0luU3RhdGUgPSBzdGF0ZUluID8gaXNTdHJpbmcoc3RhdGVJbikgJiYgaXNTdGF0ZUlkKHN0YXRlSW4pID8gLy8gQ2hlY2sgaWYgaW4gc3RhdGUgYnkgSURcbiAgICAgICAgc3RhdGUubWF0Y2hlcyh0b1N0YXRlVmFsdWUodGhpcy5nZXRTdGF0ZU5vZGVCeUlkKHN0YXRlSW4pLnBhdGgsIHRoaXMuZGVsaW1pdGVyKSkgOiAvLyBDaGVjayBpZiBpbiBzdGF0ZSBieSByZWxhdGl2ZSBncmFuZHBhcmVudFxuICAgICAgICBtYXRjaGVzU3RhdGUodG9TdGF0ZVZhbHVlKHN0YXRlSW4sIHRoaXMuZGVsaW1pdGVyKSwgcGF0aCh0aGlzLnBhdGguc2xpY2UoMCwgLTIpKShzdGF0ZS52YWx1ZSkpIDogdHJ1ZTtcbiAgICAgICAgdmFyIGd1YXJkUGFzc2VkID0gZmFsc2U7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBndWFyZFBhc3NlZCA9ICFjb25kIHx8IGV2YWx1YXRlR3VhcmQodGhpcy5tYWNoaW5lLCBjb25kLCByZXNvbHZlZENvbnRleHQsIF9ldmVudCwgc3RhdGUpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZXZhbHVhdGUgZ3VhcmQgJ1wiLmNvbmNhdChjb25kLm5hbWUgfHwgY29uZC50eXBlLCBcIicgaW4gdHJhbnNpdGlvbiBmb3IgZXZlbnQgJ1wiKS5jb25jYXQoZXZlbnROYW1lLCBcIicgaW4gc3RhdGUgbm9kZSAnXCIpLmNvbmNhdCh0aGlzLmlkLCBcIic6XFxuXCIpLmNvbmNhdChlcnIubWVzc2FnZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGd1YXJkUGFzc2VkICYmIGlzSW5TdGF0ZSkge1xuICAgICAgICAgIGlmIChjYW5kaWRhdGUudGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5leHRTdGF0ZU5vZGVzID0gY2FuZGlkYXRlLnRhcmdldDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY3Rpb25zLnB1c2guYXBwbHkoYWN0aW9ucywgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGNhbmRpZGF0ZS5hY3Rpb25zKSwgZmFsc2UpKTtcbiAgICAgICAgICBzZWxlY3RlZFRyYW5zaXRpb24gPSBjYW5kaWRhdGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlXzNfMSkge1xuICAgICAgZV8zID0ge1xuICAgICAgICBlcnJvcjogZV8zXzFcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXNlbGVjdGVkVHJhbnNpdGlvbikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoIW5leHRTdGF0ZU5vZGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJhbnNpdGlvbnM6IFtzZWxlY3RlZFRyYW5zaXRpb25dLFxuICAgICAgICBleGl0U2V0OiBbXSxcbiAgICAgICAgY29uZmlndXJhdGlvbjogc3RhdGUudmFsdWUgPyBbdGhpc10gOiBbXSxcbiAgICAgICAgc291cmNlOiBzdGF0ZSxcbiAgICAgICAgYWN0aW9uczogYWN0aW9uc1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgYWxsTmV4dFN0YXRlTm9kZXMgPSBmbGF0dGVuKG5leHRTdGF0ZU5vZGVzLm1hcChmdW5jdGlvbiAoc3RhdGVOb2RlKSB7XG4gICAgICByZXR1cm4gX3RoaXMuZ2V0UmVsYXRpdmVTdGF0ZU5vZGVzKHN0YXRlTm9kZSwgc3RhdGUuaGlzdG9yeVZhbHVlKTtcbiAgICB9KSk7XG4gICAgdmFyIGlzSW50ZXJuYWwgPSAhIXNlbGVjdGVkVHJhbnNpdGlvbi5pbnRlcm5hbDtcbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNpdGlvbnM6IFtzZWxlY3RlZFRyYW5zaXRpb25dLFxuICAgICAgZXhpdFNldDogaXNJbnRlcm5hbCA/IFtdIDogZmxhdHRlbihuZXh0U3RhdGVOb2Rlcy5tYXAoZnVuY3Rpb24gKHRhcmdldE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmdldFBvdGVudGlhbGx5UmVlbnRlcmluZ05vZGVzKHRhcmdldE5vZGUpO1xuICAgICAgfSkpLFxuICAgICAgY29uZmlndXJhdGlvbjogYWxsTmV4dFN0YXRlTm9kZXMsXG4gICAgICBzb3VyY2U6IHN0YXRlLFxuICAgICAgYWN0aW9uczogYWN0aW9uc1xuICAgIH07XG4gIH07IC8vIGV2ZW4gdGhvdWdoIHRoZSBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gbWVudGlvbnMgcmVlbnRyeSBub2Rlc1xuICAvLyB3ZSBhcmUgcHVzaGluZyBpdHMgcmVzdWx0IGludG8gYGV4aXRTZXRgXG4gIC8vIHRoYXQncyBiZWNhdXNlIHdoYXQgd2UgZXhpdCBtaWdodCBiZSByZWVudGVyZWQgKGl0J3MgYW4gaW52YXJpYW50IG9mIHJlZW50cmFuY3kpXG5cblxuICBTdGF0ZU5vZGUucHJvdG90eXBlLmdldFBvdGVudGlhbGx5UmVlbnRlcmluZ05vZGVzID0gZnVuY3Rpb24gKHRhcmdldE5vZGUpIHtcbiAgICBpZiAodGhpcy5vcmRlciA8IHRhcmdldE5vZGUub3JkZXIpIHtcbiAgICAgIHJldHVybiBbdGhpc107XG4gICAgfVxuXG4gICAgdmFyIG5vZGVzID0gW107XG4gICAgdmFyIG1hcmtlciA9IHRoaXM7XG4gICAgdmFyIHBvc3NpYmxlQW5jZXN0b3IgPSB0YXJnZXROb2RlO1xuXG4gICAgd2hpbGUgKG1hcmtlciAmJiBtYXJrZXIgIT09IHBvc3NpYmxlQW5jZXN0b3IpIHtcbiAgICAgIG5vZGVzLnB1c2gobWFya2VyKTtcbiAgICAgIG1hcmtlciA9IG1hcmtlci5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKG1hcmtlciAhPT0gcG9zc2libGVBbmNlc3Rvcikge1xuICAgICAgLy8gd2UgbmV2ZXIgZ290IHRvIGBwb3NzaWJsZUFuY2VzdG9yYCwgdGhlcmVmb3JlIHRoZSBpbml0aWFsIGBtYXJrZXJgIFwiZXNjYXBlc1wiIGl0XG4gICAgICAvLyBpdCdzIGluIGEgZGlmZmVyZW50IHBhcnQgb2YgdGhlIHRyZWUgc28gbm8gc3RhdGVzIHdpbGwgYmUgcmVlbnRlcmVkIGZvciBzdWNoIGFuIGV4dGVybmFsIHRyYW5zaXRpb25cbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBub2Rlcy5wdXNoKHBvc3NpYmxlQW5jZXN0b3IpO1xuICAgIHJldHVybiBub2RlcztcbiAgfTtcblxuICBTdGF0ZU5vZGUucHJvdG90eXBlLmdldEFjdGlvbnMgPSBmdW5jdGlvbiAocmVzb2x2ZWRDb25maWcsIGlzRG9uZSwgdHJhbnNpdGlvbiwgY3VycmVudENvbnRleHQsIF9ldmVudCwgcHJldlN0YXRlLCBwcmVkaWN0YWJsZUV4ZWMpIHtcbiAgICB2YXIgZV80LCBfYSwgZV81LCBfYjtcblxuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgcHJldkNvbmZpZyA9IHByZXZTdGF0ZSA/IGdldENvbmZpZ3VyYXRpb24oW10sIHRoaXMuZ2V0U3RhdGVOb2RlcyhwcmV2U3RhdGUudmFsdWUpKSA6IFtdO1xuICAgIHZhciBlbnRyeVNldCA9IG5ldyBTZXQoKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKHZhciBfYyA9IF9fdmFsdWVzKEFycmF5LmZyb20ocmVzb2x2ZWRDb25maWcpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xuICAgICAgfSkpLCBfZCA9IF9jLm5leHQoKTsgIV9kLmRvbmU7IF9kID0gX2MubmV4dCgpKSB7XG4gICAgICAgIHZhciBzbiA9IF9kLnZhbHVlO1xuXG4gICAgICAgIGlmICghaGFzKHByZXZDb25maWcsIHNuKSB8fCBoYXModHJhbnNpdGlvbi5leGl0U2V0LCBzbikgfHwgc24ucGFyZW50ICYmIGVudHJ5U2V0Lmhhcyhzbi5wYXJlbnQpKSB7XG4gICAgICAgICAgZW50cnlTZXQuYWRkKHNuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVfNF8xKSB7XG4gICAgICBlXzQgPSB7XG4gICAgICAgIGVycm9yOiBlXzRfMVxuICAgICAgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKF9kICYmICFfZC5kb25lICYmIChfYSA9IF9jLnJldHVybikpIF9hLmNhbGwoX2MpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGVfNCkgdGhyb3cgZV80LmVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBmb3IgKHZhciBwcmV2Q29uZmlnXzEgPSBfX3ZhbHVlcyhwcmV2Q29uZmlnKSwgcHJldkNvbmZpZ18xXzEgPSBwcmV2Q29uZmlnXzEubmV4dCgpOyAhcHJldkNvbmZpZ18xXzEuZG9uZTsgcHJldkNvbmZpZ18xXzEgPSBwcmV2Q29uZmlnXzEubmV4dCgpKSB7XG4gICAgICAgIHZhciBzbiA9IHByZXZDb25maWdfMV8xLnZhbHVlO1xuXG4gICAgICAgIGlmICghaGFzKHJlc29sdmVkQ29uZmlnLCBzbikgfHwgaGFzKHRyYW5zaXRpb24uZXhpdFNldCwgc24ucGFyZW50KSkge1xuICAgICAgICAgIHRyYW5zaXRpb24uZXhpdFNldC5wdXNoKHNuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVfNV8xKSB7XG4gICAgICBlXzUgPSB7XG4gICAgICAgIGVycm9yOiBlXzVfMVxuICAgICAgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHByZXZDb25maWdfMV8xICYmICFwcmV2Q29uZmlnXzFfMS5kb25lICYmIChfYiA9IHByZXZDb25maWdfMS5yZXR1cm4pKSBfYi5jYWxsKHByZXZDb25maWdfMSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoZV81KSB0aHJvdyBlXzUuZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJhbnNpdGlvbi5leGl0U2V0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBiLm9yZGVyIC0gYS5vcmRlcjtcbiAgICB9KTtcbiAgICB2YXIgZW50cnlTdGF0ZXMgPSBBcnJheS5mcm9tKGVudHJ5U2V0KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS5vcmRlciAtIGIub3JkZXI7XG4gICAgfSk7XG4gICAgdmFyIGV4aXRTdGF0ZXMgPSBuZXcgU2V0KHRyYW5zaXRpb24uZXhpdFNldCk7XG4gICAgdmFyIGRvbmVFdmVudHMgPSBmbGF0dGVuKGVudHJ5U3RhdGVzLm1hcChmdW5jdGlvbiAoc24pIHtcbiAgICAgIHZhciBldmVudHMgPSBbXTtcblxuICAgICAgaWYgKHNuLnR5cGUgIT09ICdmaW5hbCcpIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50cztcbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmVudCA9IHNuLnBhcmVudDtcblxuICAgICAgaWYgKCFwYXJlbnQucGFyZW50KSB7XG4gICAgICAgIHJldHVybiBldmVudHM7XG4gICAgICB9XG5cbiAgICAgIGV2ZW50cy5wdXNoKGRvbmUoc24uaWQsIHNuLmRvbmVEYXRhKSwgLy8gVE9ETzogZGVwcmVjYXRlIC0gZmluYWwgc3RhdGVzIHNob3VsZCBub3QgZW1pdCBkb25lIGV2ZW50cyBmb3IgdGhlaXIgb3duIHN0YXRlLlxuICAgICAgZG9uZShwYXJlbnQuaWQsIHNuLmRvbmVEYXRhID8gbWFwQ29udGV4dChzbi5kb25lRGF0YSwgY3VycmVudENvbnRleHQsIF9ldmVudCkgOiB1bmRlZmluZWQpKTtcbiAgICAgIHZhciBncmFuZHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG5cbiAgICAgIGlmIChncmFuZHBhcmVudC50eXBlID09PSAncGFyYWxsZWwnKSB7XG4gICAgICAgIGlmIChnZXRDaGlsZHJlbihncmFuZHBhcmVudCkuZXZlcnkoZnVuY3Rpb24gKHBhcmVudE5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gaXNJbkZpbmFsU3RhdGUodHJhbnNpdGlvbi5jb25maWd1cmF0aW9uLCBwYXJlbnROb2RlKTtcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICBldmVudHMucHVzaChkb25lKGdyYW5kcGFyZW50LmlkKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV2ZW50cztcbiAgICB9KSk7XG4gICAgdmFyIGVudHJ5QWN0aW9ucyA9IGVudHJ5U3RhdGVzLm1hcChmdW5jdGlvbiAoc3RhdGVOb2RlKSB7XG4gICAgICB2YXIgZW50cnlBY3Rpb25zID0gc3RhdGVOb2RlLm9uRW50cnk7XG4gICAgICB2YXIgaW52b2tlQWN0aW9ucyA9IHN0YXRlTm9kZS5hY3Rpdml0aWVzLm1hcChmdW5jdGlvbiAoYWN0aXZpdHkpIHtcbiAgICAgICAgcmV0dXJuIHN0YXJ0KGFjdGl2aXR5KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2VudHJ5JyxcbiAgICAgICAgYWN0aW9uczogdG9BY3Rpb25PYmplY3RzKHByZWRpY3RhYmxlRXhlYyA/IF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGVudHJ5QWN0aW9ucyksIGZhbHNlKSwgX19yZWFkKGludm9rZUFjdGlvbnMpLCBmYWxzZSkgOiBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChpbnZva2VBY3Rpb25zKSwgZmFsc2UpLCBfX3JlYWQoZW50cnlBY3Rpb25zKSwgZmFsc2UpLCBfdGhpcy5tYWNoaW5lLm9wdGlvbnMuYWN0aW9ucylcbiAgICAgIH07XG4gICAgfSkuY29uY2F0KHtcbiAgICAgIHR5cGU6ICdzdGF0ZV9kb25lJyxcbiAgICAgIGFjdGlvbnM6IGRvbmVFdmVudHMubWFwKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICByZXR1cm4gcmFpc2UoZXZlbnQpO1xuICAgICAgfSlcbiAgICB9KTtcbiAgICB2YXIgZXhpdEFjdGlvbnMgPSBBcnJheS5mcm9tKGV4aXRTdGF0ZXMpLm1hcChmdW5jdGlvbiAoc3RhdGVOb2RlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZXhpdCcsXG4gICAgICAgIGFjdGlvbnM6IHRvQWN0aW9uT2JqZWN0cyhfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChzdGF0ZU5vZGUub25FeGl0KSwgZmFsc2UpLCBfX3JlYWQoc3RhdGVOb2RlLmFjdGl2aXRpZXMubWFwKGZ1bmN0aW9uIChhY3Rpdml0eSkge1xuICAgICAgICAgIHJldHVybiBzdG9wKGFjdGl2aXR5KTtcbiAgICAgICAgfSkpLCBmYWxzZSksIF90aGlzLm1hY2hpbmUub3B0aW9ucy5hY3Rpb25zKVxuICAgICAgfTtcbiAgICB9KTtcbiAgICB2YXIgYWN0aW9ucyA9IGV4aXRBY3Rpb25zLmNvbmNhdCh7XG4gICAgICB0eXBlOiAndHJhbnNpdGlvbicsXG4gICAgICBhY3Rpb25zOiB0b0FjdGlvbk9iamVjdHModHJhbnNpdGlvbi5hY3Rpb25zLCB0aGlzLm1hY2hpbmUub3B0aW9ucy5hY3Rpb25zKVxuICAgIH0pLmNvbmNhdChlbnRyeUFjdGlvbnMpO1xuXG4gICAgaWYgKGlzRG9uZSkge1xuICAgICAgdmFyIHN0b3BBY3Rpb25zID0gdG9BY3Rpb25PYmplY3RzKGZsYXR0ZW4oX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHJlc29sdmVkQ29uZmlnKSwgZmFsc2UpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGIub3JkZXIgLSBhLm9yZGVyO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uIChzdGF0ZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlTm9kZS5vbkV4aXQ7XG4gICAgICB9KSksIHRoaXMubWFjaGluZS5vcHRpb25zLmFjdGlvbnMpLmZpbHRlcihmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiAhaXNSYWlzYWJsZUFjdGlvbihhY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWN0aW9ucy5jb25jYXQoe1xuICAgICAgICB0eXBlOiAnc3RvcCcsXG4gICAgICAgIGFjdGlvbnM6IHN0b3BBY3Rpb25zXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9ucztcbiAgfTtcbiAgLyoqXHJcbiAgICogRGV0ZXJtaW5lcyB0aGUgbmV4dCBzdGF0ZSBnaXZlbiB0aGUgY3VycmVudCBgc3RhdGVgIGFuZCBzZW50IGBldmVudGAuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gc3RhdGUgVGhlIGN1cnJlbnQgU3RhdGUgaW5zdGFuY2Ugb3Igc3RhdGUgdmFsdWVcclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRoYXQgd2FzIHNlbnQgYXQgdGhlIGN1cnJlbnQgc3RhdGVcclxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY3VycmVudCBjb250ZXh0IChleHRlbmRlZCBzdGF0ZSkgb2YgdGhlIGN1cnJlbnQgc3RhdGVcclxuICAgKi9cblxuXG4gIFN0YXRlTm9kZS5wcm90b3R5cGUudHJhbnNpdGlvbiA9IGZ1bmN0aW9uIChzdGF0ZSwgZXZlbnQsIGNvbnRleHQsIGV4ZWMpIHtcbiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgc3RhdGUgPSB0aGlzLmluaXRpYWxTdGF0ZTtcbiAgICB9XG5cbiAgICB2YXIgX2V2ZW50ID0gdG9TQ1hNTEV2ZW50KGV2ZW50KTtcblxuICAgIHZhciBjdXJyZW50U3RhdGU7XG5cbiAgICBpZiAoc3RhdGUgaW5zdGFuY2VvZiBTdGF0ZSkge1xuICAgICAgY3VycmVudFN0YXRlID0gY29udGV4dCA9PT0gdW5kZWZpbmVkID8gc3RhdGUgOiB0aGlzLnJlc29sdmVTdGF0ZShTdGF0ZS5mcm9tKHN0YXRlLCBjb250ZXh0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXNvbHZlZFN0YXRlVmFsdWUgPSBpc1N0cmluZyhzdGF0ZSkgPyB0aGlzLnJlc29sdmUocGF0aFRvU3RhdGVWYWx1ZSh0aGlzLmdldFJlc29sdmVkUGF0aChzdGF0ZSkpKSA6IHRoaXMucmVzb2x2ZShzdGF0ZSk7XG4gICAgICB2YXIgcmVzb2x2ZWRDb250ZXh0ID0gY29udGV4dCAhPT0gbnVsbCAmJiBjb250ZXh0ICE9PSB2b2lkIDAgPyBjb250ZXh0IDogdGhpcy5tYWNoaW5lLmNvbnRleHQ7XG4gICAgICBjdXJyZW50U3RhdGUgPSB0aGlzLnJlc29sdmVTdGF0ZShTdGF0ZS5mcm9tKHJlc29sdmVkU3RhdGVWYWx1ZSwgcmVzb2x2ZWRDb250ZXh0KSk7XG4gICAgfVxuXG4gICAgaWYgKCFJU19QUk9EVUNUSU9OICYmIF9ldmVudC5uYW1lID09PSBXSUxEQ0FSRCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW4gZXZlbnQgY2Fubm90IGhhdmUgdGhlIHdpbGRjYXJkIHR5cGUgKCdcIi5jb25jYXQoV0lMRENBUkQsIFwiJylcIikpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0cmljdCkge1xuICAgICAgaWYgKCF0aGlzLmV2ZW50cy5pbmNsdWRlcyhfZXZlbnQubmFtZSkgJiYgIWlzQnVpbHRJbkV2ZW50KF9ldmVudC5uYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNYWNoaW5lICdcIi5jb25jYXQodGhpcy5pZCwgXCInIGRvZXMgbm90IGFjY2VwdCBldmVudCAnXCIpLmNvbmNhdChfZXZlbnQubmFtZSwgXCInXCIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3RhdGVUcmFuc2l0aW9uID0gdGhpcy5fdHJhbnNpdGlvbihjdXJyZW50U3RhdGUudmFsdWUsIGN1cnJlbnRTdGF0ZSwgX2V2ZW50KSB8fCB7XG4gICAgICB0cmFuc2l0aW9uczogW10sXG4gICAgICBjb25maWd1cmF0aW9uOiBbXSxcbiAgICAgIGV4aXRTZXQ6IFtdLFxuICAgICAgc291cmNlOiBjdXJyZW50U3RhdGUsXG4gICAgICBhY3Rpb25zOiBbXVxuICAgIH07XG4gICAgdmFyIHByZXZDb25maWcgPSBnZXRDb25maWd1cmF0aW9uKFtdLCB0aGlzLmdldFN0YXRlTm9kZXMoY3VycmVudFN0YXRlLnZhbHVlKSk7XG4gICAgdmFyIHJlc29sdmVkQ29uZmlnID0gc3RhdGVUcmFuc2l0aW9uLmNvbmZpZ3VyYXRpb24ubGVuZ3RoID8gZ2V0Q29uZmlndXJhdGlvbihwcmV2Q29uZmlnLCBzdGF0ZVRyYW5zaXRpb24uY29uZmlndXJhdGlvbikgOiBwcmV2Q29uZmlnO1xuICAgIHN0YXRlVHJhbnNpdGlvbi5jb25maWd1cmF0aW9uID0gX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHJlc29sdmVkQ29uZmlnKSwgZmFsc2UpO1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVUcmFuc2l0aW9uKHN0YXRlVHJhbnNpdGlvbiwgY3VycmVudFN0YXRlLCBjdXJyZW50U3RhdGUuY29udGV4dCwgZXhlYywgX2V2ZW50KTtcbiAgfTtcblxuICBTdGF0ZU5vZGUucHJvdG90eXBlLnJlc29sdmVSYWlzZWRUcmFuc2l0aW9uID0gZnVuY3Rpb24gKHN0YXRlLCBfZXZlbnQsIG9yaWdpbmFsRXZlbnQsIHByZWRpY3RhYmxlRXhlYykge1xuICAgIHZhciBfYTtcblxuICAgIHZhciBjdXJyZW50QWN0aW9ucyA9IHN0YXRlLmFjdGlvbnM7XG4gICAgc3RhdGUgPSB0aGlzLnRyYW5zaXRpb24oc3RhdGUsIF9ldmVudCwgdW5kZWZpbmVkLCBwcmVkaWN0YWJsZUV4ZWMpOyAvLyBTYXZlIG9yaWdpbmFsIGV2ZW50IHRvIHN0YXRlXG4gICAgLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgdGhlIHJhaXNlZCBldmVudCEgRGVsZXRlIGluIFY1IChicmVha2luZylcblxuICAgIHN0YXRlLl9ldmVudCA9IG9yaWdpbmFsRXZlbnQ7XG4gICAgc3RhdGUuZXZlbnQgPSBvcmlnaW5hbEV2ZW50LmRhdGE7XG5cbiAgICAoX2EgPSBzdGF0ZS5hY3Rpb25zKS51bnNoaWZ0LmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoY3VycmVudEFjdGlvbnMpLCBmYWxzZSkpO1xuXG4gICAgcmV0dXJuIHN0YXRlO1xuICB9O1xuXG4gIFN0YXRlTm9kZS5wcm90b3R5cGUucmVzb2x2ZVRyYW5zaXRpb24gPSBmdW5jdGlvbiAoc3RhdGVUcmFuc2l0aW9uLCBjdXJyZW50U3RhdGUsIGNvbnRleHQsIHByZWRpY3RhYmxlRXhlYywgX2V2ZW50KSB7XG4gICAgdmFyIGVfNiwgX2EsIGVfNywgX2I7XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKF9ldmVudCA9PT0gdm9pZCAwKSB7XG4gICAgICBfZXZlbnQgPSBpbml0RXZlbnQ7XG4gICAgfVxuXG4gICAgdmFyIGNvbmZpZ3VyYXRpb24gPSBzdGF0ZVRyYW5zaXRpb24uY29uZmlndXJhdGlvbjsgLy8gVHJhbnNpdGlvbiB3aWxsIFwiYXBwbHlcIiBpZjpcbiAgICAvLyAtIHRoaXMgaXMgdGhlIGluaXRpYWwgc3RhdGUgKHRoZXJlIGlzIG5vIGN1cnJlbnQgc3RhdGUpXG4gICAgLy8gLSBPUiB0aGVyZSBhcmUgdHJhbnNpdGlvbnNcblxuICAgIHZhciB3aWxsVHJhbnNpdGlvbiA9ICFjdXJyZW50U3RhdGUgfHwgc3RhdGVUcmFuc2l0aW9uLnRyYW5zaXRpb25zLmxlbmd0aCA+IDA7XG4gICAgdmFyIHJlc29sdmVkQ29uZmlndXJhdGlvbiA9IHdpbGxUcmFuc2l0aW9uID8gc3RhdGVUcmFuc2l0aW9uLmNvbmZpZ3VyYXRpb24gOiBjdXJyZW50U3RhdGUgPyBjdXJyZW50U3RhdGUuY29uZmlndXJhdGlvbiA6IFtdO1xuICAgIHZhciBpc0RvbmUgPSBpc0luRmluYWxTdGF0ZShyZXNvbHZlZENvbmZpZ3VyYXRpb24sIHRoaXMpO1xuICAgIHZhciByZXNvbHZlZFN0YXRlVmFsdWUgPSB3aWxsVHJhbnNpdGlvbiA/IGdldFZhbHVlKHRoaXMubWFjaGluZSwgY29uZmlndXJhdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgdmFyIGhpc3RvcnlWYWx1ZSA9IGN1cnJlbnRTdGF0ZSA/IGN1cnJlbnRTdGF0ZS5oaXN0b3J5VmFsdWUgPyBjdXJyZW50U3RhdGUuaGlzdG9yeVZhbHVlIDogc3RhdGVUcmFuc2l0aW9uLnNvdXJjZSA/IHRoaXMubWFjaGluZS5oaXN0b3J5VmFsdWUoY3VycmVudFN0YXRlLnZhbHVlKSA6IHVuZGVmaW5lZCA6IHVuZGVmaW5lZDtcbiAgICB2YXIgYWN0aW9uQmxvY2tzID0gdGhpcy5nZXRBY3Rpb25zKG5ldyBTZXQocmVzb2x2ZWRDb25maWd1cmF0aW9uKSwgaXNEb25lLCBzdGF0ZVRyYW5zaXRpb24sIGNvbnRleHQsIF9ldmVudCwgY3VycmVudFN0YXRlLCBwcmVkaWN0YWJsZUV4ZWMpO1xuICAgIHZhciBhY3Rpdml0aWVzID0gY3VycmVudFN0YXRlID8gX19hc3NpZ24oe30sIGN1cnJlbnRTdGF0ZS5hY3Rpdml0aWVzKSA6IHt9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIGFjdGlvbkJsb2Nrc18xID0gX192YWx1ZXMoYWN0aW9uQmxvY2tzKSwgYWN0aW9uQmxvY2tzXzFfMSA9IGFjdGlvbkJsb2Nrc18xLm5leHQoKTsgIWFjdGlvbkJsb2Nrc18xXzEuZG9uZTsgYWN0aW9uQmxvY2tzXzFfMSA9IGFjdGlvbkJsb2Nrc18xLm5leHQoKSkge1xuICAgICAgICB2YXIgYmxvY2sgPSBhY3Rpb25CbG9ja3NfMV8xLnZhbHVlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2MgPSAoZV83ID0gdm9pZCAwLCBfX3ZhbHVlcyhibG9jay5hY3Rpb25zKSksIF9kID0gX2MubmV4dCgpOyAhX2QuZG9uZTsgX2QgPSBfYy5uZXh0KCkpIHtcbiAgICAgICAgICAgIHZhciBhY3Rpb24gPSBfZC52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSBzdGFydCQxKSB7XG4gICAgICAgICAgICAgIGFjdGl2aXRpZXNbYWN0aW9uLmFjdGl2aXR5LmlkIHx8IGFjdGlvbi5hY3Rpdml0eS50eXBlXSA9IGFjdGlvbjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09IHN0b3AkMSkge1xuICAgICAgICAgICAgICBhY3Rpdml0aWVzW2FjdGlvbi5hY3Rpdml0eS5pZCB8fCBhY3Rpb24uYWN0aXZpdHkudHlwZV0gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVfN18xKSB7XG4gICAgICAgICAgZV83ID0ge1xuICAgICAgICAgICAgZXJyb3I6IGVfN18xXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9kICYmICFfZC5kb25lICYmIChfYiA9IF9jLnJldHVybikpIF9iLmNhbGwoX2MpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoZV83KSB0aHJvdyBlXzcuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZV82XzEpIHtcbiAgICAgIGVfNiA9IHtcbiAgICAgICAgZXJyb3I6IGVfNl8xXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoYWN0aW9uQmxvY2tzXzFfMSAmJiAhYWN0aW9uQmxvY2tzXzFfMS5kb25lICYmIChfYSA9IGFjdGlvbkJsb2Nrc18xLnJldHVybikpIF9hLmNhbGwoYWN0aW9uQmxvY2tzXzEpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGVfNikgdGhyb3cgZV82LmVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBfZSA9IF9fcmVhZChyZXNvbHZlQWN0aW9ucyh0aGlzLCBjdXJyZW50U3RhdGUsIGNvbnRleHQsIF9ldmVudCwgYWN0aW9uQmxvY2tzLCBwcmVkaWN0YWJsZUV4ZWMsIHRoaXMubWFjaGluZS5jb25maWcucHJlZGljdGFibGVBY3Rpb25Bcmd1bWVudHMgfHwgdGhpcy5tYWNoaW5lLmNvbmZpZy5wcmVzZXJ2ZUFjdGlvbk9yZGVyKSwgMiksXG4gICAgICAgIHJlc29sdmVkQWN0aW9ucyA9IF9lWzBdLFxuICAgICAgICB1cGRhdGVkQ29udGV4dCA9IF9lWzFdO1xuXG4gICAgdmFyIF9mID0gX19yZWFkKHBhcnRpdGlvbihyZXNvbHZlZEFjdGlvbnMsIGlzUmFpc2FibGVBY3Rpb24pLCAyKSxcbiAgICAgICAgcmFpc2VkRXZlbnRzID0gX2ZbMF0sXG4gICAgICAgIG5vblJhaXNlZEFjdGlvbnMgPSBfZlsxXTtcblxuICAgIHZhciBpbnZva2VBY3Rpb25zID0gcmVzb2x2ZWRBY3Rpb25zLmZpbHRlcihmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICB2YXIgX2E7XG5cbiAgICAgIHJldHVybiBhY3Rpb24udHlwZSA9PT0gc3RhcnQkMSAmJiAoKF9hID0gYWN0aW9uLmFjdGl2aXR5KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudHlwZSkgPT09IGludm9rZTtcbiAgICB9KTtcbiAgICB2YXIgY2hpbGRyZW4gPSBpbnZva2VBY3Rpb25zLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBhY3Rpb24pIHtcbiAgICAgIGFjY1thY3Rpb24uYWN0aXZpdHkuaWRdID0gY3JlYXRlSW52b2NhYmxlQWN0b3IoYWN0aW9uLmFjdGl2aXR5LCBfdGhpcy5tYWNoaW5lLCB1cGRhdGVkQ29udGV4dCwgX2V2ZW50KTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgY3VycmVudFN0YXRlID8gX19hc3NpZ24oe30sIGN1cnJlbnRTdGF0ZS5jaGlsZHJlbikgOiB7fSk7XG4gICAgdmFyIG5leHRTdGF0ZSA9IG5ldyBTdGF0ZSh7XG4gICAgICB2YWx1ZTogcmVzb2x2ZWRTdGF0ZVZhbHVlIHx8IGN1cnJlbnRTdGF0ZS52YWx1ZSxcbiAgICAgIGNvbnRleHQ6IHVwZGF0ZWRDb250ZXh0LFxuICAgICAgX2V2ZW50OiBfZXZlbnQsXG4gICAgICAvLyBQZXJzaXN0IF9zZXNzaW9uaWQgYmV0d2VlbiBzdGF0ZXNcbiAgICAgIF9zZXNzaW9uaWQ6IGN1cnJlbnRTdGF0ZSA/IGN1cnJlbnRTdGF0ZS5fc2Vzc2lvbmlkIDogbnVsbCxcbiAgICAgIGhpc3RvcnlWYWx1ZTogcmVzb2x2ZWRTdGF0ZVZhbHVlID8gaGlzdG9yeVZhbHVlID8gdXBkYXRlSGlzdG9yeVZhbHVlKGhpc3RvcnlWYWx1ZSwgcmVzb2x2ZWRTdGF0ZVZhbHVlKSA6IHVuZGVmaW5lZCA6IGN1cnJlbnRTdGF0ZSA/IGN1cnJlbnRTdGF0ZS5oaXN0b3J5VmFsdWUgOiB1bmRlZmluZWQsXG4gICAgICBoaXN0b3J5OiAhcmVzb2x2ZWRTdGF0ZVZhbHVlIHx8IHN0YXRlVHJhbnNpdGlvbi5zb3VyY2UgPyBjdXJyZW50U3RhdGUgOiB1bmRlZmluZWQsXG4gICAgICBhY3Rpb25zOiByZXNvbHZlZFN0YXRlVmFsdWUgPyBub25SYWlzZWRBY3Rpb25zIDogW10sXG4gICAgICBhY3Rpdml0aWVzOiByZXNvbHZlZFN0YXRlVmFsdWUgPyBhY3Rpdml0aWVzIDogY3VycmVudFN0YXRlID8gY3VycmVudFN0YXRlLmFjdGl2aXRpZXMgOiB7fSxcbiAgICAgIGV2ZW50czogW10sXG4gICAgICBjb25maWd1cmF0aW9uOiByZXNvbHZlZENvbmZpZ3VyYXRpb24sXG4gICAgICB0cmFuc2l0aW9uczogc3RhdGVUcmFuc2l0aW9uLnRyYW5zaXRpb25zLFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgICAgZG9uZTogaXNEb25lLFxuICAgICAgdGFnczogZ2V0VGFnc0Zyb21Db25maWd1cmF0aW9uKHJlc29sdmVkQ29uZmlndXJhdGlvbiksXG4gICAgICBtYWNoaW5lOiB0aGlzXG4gICAgfSk7XG4gICAgdmFyIGRpZFVwZGF0ZUNvbnRleHQgPSBjb250ZXh0ICE9PSB1cGRhdGVkQ29udGV4dDtcbiAgICBuZXh0U3RhdGUuY2hhbmdlZCA9IF9ldmVudC5uYW1lID09PSB1cGRhdGUgfHwgZGlkVXBkYXRlQ29udGV4dDsgLy8gRGlzcG9zZSBvZiBwZW51bHRpbWF0ZSBoaXN0b3JpZXMgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcblxuICAgIHZhciBoaXN0b3J5ID0gbmV4dFN0YXRlLmhpc3Rvcnk7XG5cbiAgICBpZiAoaGlzdG9yeSkge1xuICAgICAgZGVsZXRlIGhpc3RvcnkuaGlzdG9yeTtcbiAgICB9IC8vIFRoZXJlIGFyZSB0cmFuc2llbnQgdHJhbnNpdGlvbnMgaWYgdGhlIG1hY2hpbmUgaXMgbm90IGluIGEgZmluYWwgc3RhdGVcbiAgICAvLyBhbmQgaWYgc29tZSBvZiB0aGUgc3RhdGUgbm9kZXMgaGF2ZSB0cmFuc2llbnQgKFwiYWx3YXlzXCIpIHRyYW5zaXRpb25zLlxuXG5cbiAgICB2YXIgaGFzQWx3YXlzVHJhbnNpdGlvbnMgPSAhaXNEb25lICYmICh0aGlzLl90cmFuc2llbnQgfHwgY29uZmlndXJhdGlvbi5zb21lKGZ1bmN0aW9uIChzdGF0ZU5vZGUpIHtcbiAgICAgIHJldHVybiBzdGF0ZU5vZGUuX3RyYW5zaWVudDtcbiAgICB9KSk7IC8vIElmIHRoZXJlIGFyZSBubyBlbmFibGVkIHRyYW5zaXRpb25zLCBjaGVjayBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IHRyYW5zaXRpb25zLlxuICAgIC8vIElmIHRoZXJlIGFyZSB0cmFuc2llbnQgdHJhbnNpdGlvbnMsIGNvbnRpbnVlIGNoZWNraW5nIGZvciBtb3JlIHRyYW5zaXRpb25zXG4gICAgLy8gYmVjYXVzZSBhbiB0cmFuc2llbnQgdHJhbnNpdGlvbiBzaG91bGQgYmUgdHJpZ2dlcmVkIGV2ZW4gaWYgdGhlcmUgYXJlIG5vXG4gICAgLy8gZW5hYmxlZCB0cmFuc2l0aW9ucy5cbiAgICAvL1xuICAgIC8vIElmIHdlJ3JlIGFscmVhZHkgd29ya2luZyBvbiBhbiB0cmFuc2llbnQgdHJhbnNpdGlvbiB0aGVuIHN0b3AgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wLlxuICAgIC8vXG4gICAgLy8gT3RoZXJ3aXNlLCBpZiB0aGVyZSBhcmUgbm8gZW5hYmxlZCBub3IgdHJhbnNpZW50IHRyYW5zaXRpb25zLCB3ZSBhcmUgZG9uZS5cblxuICAgIGlmICghd2lsbFRyYW5zaXRpb24gJiYgKCFoYXNBbHdheXNUcmFuc2l0aW9ucyB8fCBfZXZlbnQubmFtZSA9PT0gTlVMTF9FVkVOVCkpIHtcbiAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgfVxuXG4gICAgdmFyIG1heWJlTmV4dFN0YXRlID0gbmV4dFN0YXRlO1xuXG4gICAgaWYgKCFpc0RvbmUpIHtcbiAgICAgIGlmIChoYXNBbHdheXNUcmFuc2l0aW9ucykge1xuICAgICAgICBtYXliZU5leHRTdGF0ZSA9IHRoaXMucmVzb2x2ZVJhaXNlZFRyYW5zaXRpb24obWF5YmVOZXh0U3RhdGUsIHtcbiAgICAgICAgICB0eXBlOiBudWxsRXZlbnRcbiAgICAgICAgfSwgX2V2ZW50LCBwcmVkaWN0YWJsZUV4ZWMpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocmFpc2VkRXZlbnRzLmxlbmd0aCkge1xuICAgICAgICB2YXIgcmFpc2VkRXZlbnQgPSByYWlzZWRFdmVudHMuc2hpZnQoKTtcbiAgICAgICAgbWF5YmVOZXh0U3RhdGUgPSB0aGlzLnJlc29sdmVSYWlzZWRUcmFuc2l0aW9uKG1heWJlTmV4dFN0YXRlLCByYWlzZWRFdmVudC5fZXZlbnQsIF9ldmVudCwgcHJlZGljdGFibGVFeGVjKTtcbiAgICAgIH1cbiAgICB9IC8vIERldGVjdCBpZiBzdGF0ZSBjaGFuZ2VkXG5cblxuICAgIHZhciBjaGFuZ2VkID0gbWF5YmVOZXh0U3RhdGUuY2hhbmdlZCB8fCAoaGlzdG9yeSA/ICEhbWF5YmVOZXh0U3RhdGUuYWN0aW9ucy5sZW5ndGggfHwgZGlkVXBkYXRlQ29udGV4dCB8fCB0eXBlb2YgaGlzdG9yeS52YWx1ZSAhPT0gdHlwZW9mIG1heWJlTmV4dFN0YXRlLnZhbHVlIHx8ICFzdGF0ZVZhbHVlc0VxdWFsKG1heWJlTmV4dFN0YXRlLnZhbHVlLCBoaXN0b3J5LnZhbHVlKSA6IHVuZGVmaW5lZCk7XG4gICAgbWF5YmVOZXh0U3RhdGUuY2hhbmdlZCA9IGNoYW5nZWQ7IC8vIFByZXNlcnZlIG9yaWdpbmFsIGhpc3RvcnkgYWZ0ZXIgcmFpc2VkIGV2ZW50c1xuXG4gICAgbWF5YmVOZXh0U3RhdGUuaGlzdG9yeSA9IGhpc3Rvcnk7XG4gICAgcmV0dXJuIG1heWJlTmV4dFN0YXRlO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBjaGlsZCBzdGF0ZSBub2RlIGZyb20gaXRzIHJlbGF0aXZlIGBzdGF0ZUtleWAsIG9yIHRocm93cy5cclxuICAgKi9cblxuXG4gIFN0YXRlTm9kZS5wcm90b3R5cGUuZ2V0U3RhdGVOb2RlID0gZnVuY3Rpb24gKHN0YXRlS2V5KSB7XG4gICAgaWYgKGlzU3RhdGVJZChzdGF0ZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hY2hpbmUuZ2V0U3RhdGVOb2RlQnlJZChzdGF0ZUtleSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0YXRlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHJldHJpZXZlIGNoaWxkIHN0YXRlICdcIi5jb25jYXQoc3RhdGVLZXksIFwiJyBmcm9tICdcIikuY29uY2F0KHRoaXMuaWQsIFwiJzsgbm8gY2hpbGQgc3RhdGVzIGV4aXN0LlwiKSk7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuc3RhdGVzW3N0YXRlS2V5XTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaGlsZCBzdGF0ZSAnXCIuY29uY2F0KHN0YXRlS2V5LCBcIicgZG9lcyBub3QgZXhpc3Qgb24gJ1wiKS5jb25jYXQodGhpcy5pZCwgXCInXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBzdGF0ZSBub2RlIHdpdGggdGhlIGdpdmVuIGBzdGF0ZUlkYCwgb3IgdGhyb3dzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHN0YXRlSWQgVGhlIHN0YXRlIElELiBUaGUgcHJlZml4IFwiI1wiIGlzIHJlbW92ZWQuXHJcbiAgICovXG5cblxuICBTdGF0ZU5vZGUucHJvdG90eXBlLmdldFN0YXRlTm9kZUJ5SWQgPSBmdW5jdGlvbiAoc3RhdGVJZCkge1xuICAgIHZhciByZXNvbHZlZFN0YXRlSWQgPSBpc1N0YXRlSWQoc3RhdGVJZCkgPyBzdGF0ZUlkLnNsaWNlKFNUQVRFX0lERU5USUZJRVIubGVuZ3RoKSA6IHN0YXRlSWQ7XG5cbiAgICBpZiAocmVzb2x2ZWRTdGF0ZUlkID09PSB0aGlzLmlkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgc3RhdGVOb2RlID0gdGhpcy5tYWNoaW5lLmlkTWFwW3Jlc29sdmVkU3RhdGVJZF07XG5cbiAgICBpZiAoIXN0YXRlTm9kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2hpbGQgc3RhdGUgbm9kZSAnI1wiLmNvbmNhdChyZXNvbHZlZFN0YXRlSWQsIFwiJyBkb2VzIG5vdCBleGlzdCBvbiBtYWNoaW5lICdcIikuY29uY2F0KHRoaXMuaWQsIFwiJ1wiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlTm9kZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgc3RhdGUgbm9kZSBmcm9tIHRoZSBnaXZlbiBgc3RhdGVQYXRoYCwgb3IgdGhyb3dzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHN0YXRlUGF0aCBUaGUgc3RyaW5nIG9yIHN0cmluZyBhcnJheSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBzdGF0ZSBub2RlLlxyXG4gICAqL1xuXG5cbiAgU3RhdGVOb2RlLnByb3RvdHlwZS5nZXRTdGF0ZU5vZGVCeVBhdGggPSBmdW5jdGlvbiAoc3RhdGVQYXRoKSB7XG4gICAgaWYgKHR5cGVvZiBzdGF0ZVBhdGggPT09ICdzdHJpbmcnICYmIGlzU3RhdGVJZChzdGF0ZVBhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGF0ZU5vZGVCeUlkKHN0YXRlUGF0aC5zbGljZSgxKSk7XG4gICAgICB9IGNhdGNoIChlKSB7Ly8gdHJ5IGluZGl2aWR1YWwgcGF0aHNcbiAgICAgICAgLy8gdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYXJyYXlTdGF0ZVBhdGggPSB0b1N0YXRlUGF0aChzdGF0ZVBhdGgsIHRoaXMuZGVsaW1pdGVyKS5zbGljZSgpO1xuICAgIHZhciBjdXJyZW50U3RhdGVOb2RlID0gdGhpcztcblxuICAgIHdoaWxlIChhcnJheVN0YXRlUGF0aC5sZW5ndGgpIHtcbiAgICAgIHZhciBrZXkgPSBhcnJheVN0YXRlUGF0aC5zaGlmdCgpO1xuXG4gICAgICBpZiAoIWtleS5sZW5ndGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRTdGF0ZU5vZGUgPSBjdXJyZW50U3RhdGVOb2RlLmdldFN0YXRlTm9kZShrZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50U3RhdGVOb2RlO1xuICB9O1xuICAvKipcclxuICAgKiBSZXNvbHZlcyBhIHBhcnRpYWwgc3RhdGUgdmFsdWUgd2l0aCBpdHMgZnVsbCByZXByZXNlbnRhdGlvbiBpbiB0aGlzIG1hY2hpbmUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gc3RhdGVWYWx1ZSBUaGUgcGFydGlhbCBzdGF0ZSB2YWx1ZSB0byByZXNvbHZlLlxyXG4gICAqL1xuXG5cbiAgU3RhdGVOb2RlLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gKHN0YXRlVmFsdWUpIHtcbiAgICB2YXIgX2E7XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKCFzdGF0ZVZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbml0aWFsU3RhdGVWYWx1ZSB8fCBFTVBUWV9PQkpFQ1Q7IC8vIFRPRE86IHR5cGUtc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlICdwYXJhbGxlbCc6XG4gICAgICAgIHJldHVybiBtYXBWYWx1ZXModGhpcy5pbml0aWFsU3RhdGVWYWx1ZSwgZnVuY3Rpb24gKHN1YlN0YXRlVmFsdWUsIHN1YlN0YXRlS2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHN1YlN0YXRlVmFsdWUgPyBfdGhpcy5nZXRTdGF0ZU5vZGUoc3ViU3RhdGVLZXkpLnJlc29sdmUoc3RhdGVWYWx1ZVtzdWJTdGF0ZUtleV0gfHwgc3ViU3RhdGVWYWx1ZSkgOiBFTVBUWV9PQkpFQ1Q7XG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdjb21wb3VuZCc6XG4gICAgICAgIGlmIChpc1N0cmluZyhzdGF0ZVZhbHVlKSkge1xuICAgICAgICAgIHZhciBzdWJTdGF0ZU5vZGUgPSB0aGlzLmdldFN0YXRlTm9kZShzdGF0ZVZhbHVlKTtcblxuICAgICAgICAgIGlmIChzdWJTdGF0ZU5vZGUudHlwZSA9PT0gJ3BhcmFsbGVsJyB8fCBzdWJTdGF0ZU5vZGUudHlwZSA9PT0gJ2NvbXBvdW5kJykge1xuICAgICAgICAgICAgcmV0dXJuIF9hID0ge30sIF9hW3N0YXRlVmFsdWVdID0gc3ViU3RhdGVOb2RlLmluaXRpYWxTdGF0ZVZhbHVlLCBfYTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3RhdGVWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0LmtleXMoc3RhdGVWYWx1ZSkubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbFN0YXRlVmFsdWUgfHwge307XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFwVmFsdWVzKHN0YXRlVmFsdWUsIGZ1bmN0aW9uIChzdWJTdGF0ZVZhbHVlLCBzdWJTdGF0ZUtleSkge1xuICAgICAgICAgIHJldHVybiBzdWJTdGF0ZVZhbHVlID8gX3RoaXMuZ2V0U3RhdGVOb2RlKHN1YlN0YXRlS2V5KS5yZXNvbHZlKHN1YlN0YXRlVmFsdWUpIDogRU1QVFlfT0JKRUNUO1xuICAgICAgICB9KTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHN0YXRlVmFsdWUgfHwgRU1QVFlfT0JKRUNUO1xuICAgIH1cbiAgfTtcblxuICBTdGF0ZU5vZGUucHJvdG90eXBlLmdldFJlc29sdmVkUGF0aCA9IGZ1bmN0aW9uIChzdGF0ZUlkZW50aWZpZXIpIHtcbiAgICBpZiAoaXNTdGF0ZUlkKHN0YXRlSWRlbnRpZmllcikpIHtcbiAgICAgIHZhciBzdGF0ZU5vZGUgPSB0aGlzLm1hY2hpbmUuaWRNYXBbc3RhdGVJZGVudGlmaWVyLnNsaWNlKFNUQVRFX0lERU5USUZJRVIubGVuZ3RoKV07XG5cbiAgICAgIGlmICghc3RhdGVOb2RlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBmaW5kIHN0YXRlIG5vZGUgJ1wiLmNvbmNhdChzdGF0ZUlkZW50aWZpZXIsIFwiJ1wiKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdGF0ZU5vZGUucGF0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9TdGF0ZVBhdGgoc3RhdGVJZGVudGlmaWVyLCB0aGlzLmRlbGltaXRlcik7XG4gIH07XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YXRlTm9kZS5wcm90b3R5cGUsIFwiaW5pdGlhbFN0YXRlVmFsdWVcIiwge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9hO1xuXG4gICAgICBpZiAodGhpcy5fX2NhY2hlLmluaXRpYWxTdGF0ZVZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fY2FjaGUuaW5pdGlhbFN0YXRlVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbml0aWFsU3RhdGVWYWx1ZTtcblxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3BhcmFsbGVsJykge1xuICAgICAgICBpbml0aWFsU3RhdGVWYWx1ZSA9IG1hcEZpbHRlclZhbHVlcyh0aGlzLnN0YXRlcywgZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlLmluaXRpYWxTdGF0ZVZhbHVlIHx8IEVNUFRZX09CSkVDVDtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHN0YXRlTm9kZSkge1xuICAgICAgICAgIHJldHVybiAhKHN0YXRlTm9kZS50eXBlID09PSAnaGlzdG9yeScpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pbml0aWFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlc1t0aGlzLmluaXRpYWxdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5pdGlhbCBzdGF0ZSAnXCIuY29uY2F0KHRoaXMuaW5pdGlhbCwgXCInIG5vdCBmb3VuZCBvbiAnXCIpLmNvbmNhdCh0aGlzLmtleSwgXCInXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluaXRpYWxTdGF0ZVZhbHVlID0gaXNMZWFmTm9kZSh0aGlzLnN0YXRlc1t0aGlzLmluaXRpYWxdKSA/IHRoaXMuaW5pdGlhbCA6IChfYSA9IHt9LCBfYVt0aGlzLmluaXRpYWxdID0gdGhpcy5zdGF0ZXNbdGhpcy5pbml0aWFsXS5pbml0aWFsU3RhdGVWYWx1ZSwgX2EpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIGZpbml0ZSBzdGF0ZSB2YWx1ZSBvZiBhIG1hY2hpbmUgd2l0aG91dCBjaGlsZCBzdGF0ZXMgaXMganVzdCBhbiBlbXB0eSBvYmplY3RcbiAgICAgICAgaW5pdGlhbFN0YXRlVmFsdWUgPSB7fTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fX2NhY2hlLmluaXRpYWxTdGF0ZVZhbHVlID0gaW5pdGlhbFN0YXRlVmFsdWU7XG4gICAgICByZXR1cm4gdGhpcy5fX2NhY2hlLmluaXRpYWxTdGF0ZVZhbHVlO1xuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuXG4gIFN0YXRlTm9kZS5wcm90b3R5cGUuZ2V0SW5pdGlhbFN0YXRlID0gZnVuY3Rpb24gKHN0YXRlVmFsdWUsIGNvbnRleHQpIHtcbiAgICB0aGlzLl9pbml0KCk7IC8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIGluIHRoZSBjb25zdHJ1Y3RvciAoc2VlIG5vdGUgaW4gY29uc3RydWN0b3IpXG5cblxuICAgIHZhciBjb25maWd1cmF0aW9uID0gdGhpcy5nZXRTdGF0ZU5vZGVzKHN0YXRlVmFsdWUpO1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVUcmFuc2l0aW9uKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZ3VyYXRpb24sXG4gICAgICBleGl0U2V0OiBbXSxcbiAgICAgIHRyYW5zaXRpb25zOiBbXSxcbiAgICAgIHNvdXJjZTogdW5kZWZpbmVkLFxuICAgICAgYWN0aW9uczogW11cbiAgICB9LCB1bmRlZmluZWQsIGNvbnRleHQgIT09IG51bGwgJiYgY29udGV4dCAhPT0gdm9pZCAwID8gY29udGV4dCA6IHRoaXMubWFjaGluZS5jb250ZXh0LCB1bmRlZmluZWQpO1xuICB9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGF0ZU5vZGUucHJvdG90eXBlLCBcImluaXRpYWxTdGF0ZVwiLCB7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5pdGlhbCBTdGF0ZSBpbnN0YW5jZSwgd2hpY2ggaW5jbHVkZXMgYWxsIGFjdGlvbnMgdG8gYmUgZXhlY3V0ZWQgZnJvbVxyXG4gICAgICogZW50ZXJpbmcgdGhlIGluaXRpYWwgc3RhdGUuXHJcbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpbml0aWFsU3RhdGVWYWx1ZSA9IHRoaXMuaW5pdGlhbFN0YXRlVmFsdWU7XG5cbiAgICAgIGlmICghaW5pdGlhbFN0YXRlVmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHJldHJpZXZlIGluaXRpYWwgc3RhdGUgZnJvbSBzaW1wbGUgc3RhdGUgJ1wiLmNvbmNhdCh0aGlzLmlkLCBcIicuXCIpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZ2V0SW5pdGlhbFN0YXRlKGluaXRpYWxTdGF0ZVZhbHVlKTtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YXRlTm9kZS5wcm90b3R5cGUsIFwidGFyZ2V0XCIsIHtcbiAgICAvKipcclxuICAgICAqIFRoZSB0YXJnZXQgc3RhdGUgdmFsdWUgb2YgdGhlIGhpc3Rvcnkgc3RhdGUgbm9kZSwgaWYgaXQgZXhpc3RzLiBUaGlzIHJlcHJlc2VudHMgdGhlXHJcbiAgICAgKiBkZWZhdWx0IHN0YXRlIHZhbHVlIHRvIHRyYW5zaXRpb24gdG8gaWYgbm8gaGlzdG9yeSB2YWx1ZSBleGlzdHMgeWV0LlxyXG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGFyZ2V0O1xuXG4gICAgICBpZiAodGhpcy50eXBlID09PSAnaGlzdG9yeScpIHtcbiAgICAgICAgdmFyIGhpc3RvcnlDb25maWcgPSB0aGlzLmNvbmZpZztcblxuICAgICAgICBpZiAoaXNTdHJpbmcoaGlzdG9yeUNvbmZpZy50YXJnZXQpKSB7XG4gICAgICAgICAgdGFyZ2V0ID0gaXNTdGF0ZUlkKGhpc3RvcnlDb25maWcudGFyZ2V0KSA/IHBhdGhUb1N0YXRlVmFsdWUodGhpcy5tYWNoaW5lLmdldFN0YXRlTm9kZUJ5SWQoaGlzdG9yeUNvbmZpZy50YXJnZXQpLnBhdGguc2xpY2UodGhpcy5wYXRoLmxlbmd0aCAtIDEpKSA6IGhpc3RvcnlDb25maWcudGFyZ2V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldCA9IGhpc3RvcnlDb25maWcudGFyZ2V0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGxlYWYgbm9kZXMgZnJvbSBhIHN0YXRlIHBhdGggcmVsYXRpdmUgdG8gdGhpcyBzdGF0ZSBub2RlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHJlbGF0aXZlU3RhdGVJZCBUaGUgcmVsYXRpdmUgc3RhdGUgcGF0aCB0byByZXRyaWV2ZSB0aGUgc3RhdGUgbm9kZXNcclxuICAgKiBAcGFyYW0gaGlzdG9yeSBUaGUgcHJldmlvdXMgc3RhdGUgdG8gcmV0cmlldmUgaGlzdG9yeVxyXG4gICAqIEBwYXJhbSByZXNvbHZlIFdoZXRoZXIgc3RhdGUgbm9kZXMgc2hvdWxkIHJlc29sdmUgdG8gaW5pdGlhbCBjaGlsZCBzdGF0ZSBub2Rlc1xyXG4gICAqL1xuXG4gIFN0YXRlTm9kZS5wcm90b3R5cGUuZ2V0UmVsYXRpdmVTdGF0ZU5vZGVzID0gZnVuY3Rpb24gKHJlbGF0aXZlU3RhdGVJZCwgaGlzdG9yeVZhbHVlLCByZXNvbHZlKSB7XG4gICAgaWYgKHJlc29sdmUgPT09IHZvaWQgMCkge1xuICAgICAgcmVzb2x2ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmUgPyByZWxhdGl2ZVN0YXRlSWQudHlwZSA9PT0gJ2hpc3RvcnknID8gcmVsYXRpdmVTdGF0ZUlkLnJlc29sdmVIaXN0b3J5KGhpc3RvcnlWYWx1ZSkgOiByZWxhdGl2ZVN0YXRlSWQuaW5pdGlhbFN0YXRlTm9kZXMgOiBbcmVsYXRpdmVTdGF0ZUlkXTtcbiAgfTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RhdGVOb2RlLnByb3RvdHlwZSwgXCJpbml0aWFsU3RhdGVOb2Rlc1wiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAoaXNMZWFmTm9kZSh0aGlzKSkge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgICAgfSAvLyBDYXNlIHdoZW4gc3RhdGUgbm9kZSBpcyBjb21wb3VuZCBidXQgbm8gaW5pdGlhbCBzdGF0ZSBpcyBkZWZpbmVkXG5cblxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2NvbXBvdW5kJyAmJiAhdGhpcy5pbml0aWFsKSB7XG4gICAgICAgIGlmICghSVNfUFJPRFVDVElPTikge1xuICAgICAgICAgIHdhcm4oZmFsc2UsIFwiQ29tcG91bmQgc3RhdGUgbm9kZSAnXCIuY29uY2F0KHRoaXMuaWQsIFwiJyBoYXMgbm8gaW5pdGlhbCBzdGF0ZS5cIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFt0aGlzXTtcbiAgICAgIH1cblxuICAgICAgdmFyIGluaXRpYWxTdGF0ZU5vZGVQYXRocyA9IHRvU3RhdGVQYXRocyh0aGlzLmluaXRpYWxTdGF0ZVZhbHVlKTtcbiAgICAgIHJldHVybiBmbGF0dGVuKGluaXRpYWxTdGF0ZU5vZGVQYXRocy5tYXAoZnVuY3Rpb24gKGluaXRpYWxQYXRoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5nZXRGcm9tUmVsYXRpdmVQYXRoKGluaXRpYWxQYXRoKTtcbiAgICAgIH0pKTtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHN0YXRlIG5vZGVzIGZyb20gYSByZWxhdGl2ZSBwYXRoIHRvIHRoaXMgc3RhdGUgbm9kZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggZnJvbSB0aGlzIHN0YXRlIG5vZGVcclxuICAgKiBAcGFyYW0gaGlzdG9yeVZhbHVlXHJcbiAgICovXG5cbiAgU3RhdGVOb2RlLnByb3RvdHlwZS5nZXRGcm9tUmVsYXRpdmVQYXRoID0gZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCkge1xuICAgIGlmICghcmVsYXRpdmVQYXRoLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFt0aGlzXTtcbiAgICB9XG5cbiAgICB2YXIgX2EgPSBfX3JlYWQocmVsYXRpdmVQYXRoKSxcbiAgICAgICAgc3RhdGVLZXkgPSBfYVswXSxcbiAgICAgICAgY2hpbGRTdGF0ZVBhdGggPSBfYS5zbGljZSgxKTtcblxuICAgIGlmICghdGhpcy5zdGF0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZXRyaWV2ZSBzdWJQYXRoICdcIi5jb25jYXQoc3RhdGVLZXksIFwiJyBmcm9tIG5vZGUgd2l0aCBubyBzdGF0ZXNcIikpO1xuICAgIH1cblxuICAgIHZhciBjaGlsZFN0YXRlTm9kZSA9IHRoaXMuZ2V0U3RhdGVOb2RlKHN0YXRlS2V5KTtcblxuICAgIGlmIChjaGlsZFN0YXRlTm9kZS50eXBlID09PSAnaGlzdG9yeScpIHtcbiAgICAgIHJldHVybiBjaGlsZFN0YXRlTm9kZS5yZXNvbHZlSGlzdG9yeSgpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGF0ZXNbc3RhdGVLZXldKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaGlsZCBzdGF0ZSAnXCIuY29uY2F0KHN0YXRlS2V5LCBcIicgZG9lcyBub3QgZXhpc3Qgb24gJ1wiKS5jb25jYXQodGhpcy5pZCwgXCInXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGF0ZXNbc3RhdGVLZXldLmdldEZyb21SZWxhdGl2ZVBhdGgoY2hpbGRTdGF0ZVBhdGgpO1xuICB9O1xuXG4gIFN0YXRlTm9kZS5wcm90b3R5cGUuaGlzdG9yeVZhbHVlID0gZnVuY3Rpb24gKHJlbGF0aXZlU3RhdGVWYWx1ZSkge1xuICAgIGlmICghT2JqZWN0LmtleXModGhpcy5zdGF0ZXMpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudDogcmVsYXRpdmVTdGF0ZVZhbHVlIHx8IHRoaXMuaW5pdGlhbFN0YXRlVmFsdWUsXG4gICAgICBzdGF0ZXM6IG1hcEZpbHRlclZhbHVlcyh0aGlzLnN0YXRlcywgZnVuY3Rpb24gKHN0YXRlTm9kZSwga2V5KSB7XG4gICAgICAgIGlmICghcmVsYXRpdmVTdGF0ZVZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlTm9kZS5oaXN0b3J5VmFsdWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdWJTdGF0ZVZhbHVlID0gaXNTdHJpbmcocmVsYXRpdmVTdGF0ZVZhbHVlKSA/IHVuZGVmaW5lZCA6IHJlbGF0aXZlU3RhdGVWYWx1ZVtrZXldO1xuICAgICAgICByZXR1cm4gc3RhdGVOb2RlLmhpc3RvcnlWYWx1ZShzdWJTdGF0ZVZhbHVlIHx8IHN0YXRlTm9kZS5pbml0aWFsU3RhdGVWYWx1ZSk7XG4gICAgICB9LCBmdW5jdGlvbiAoc3RhdGVOb2RlKSB7XG4gICAgICAgIHJldHVybiAhc3RhdGVOb2RlLmhpc3Rvcnk7XG4gICAgICB9KVxuICAgIH07XG4gIH07XG4gIC8qKlxyXG4gICAqIFJlc29sdmVzIHRvIHRoZSBoaXN0b3JpY2FsIHZhbHVlKHMpIG9mIHRoZSBwYXJlbnQgc3RhdGUgbm9kZSxcclxuICAgKiByZXByZXNlbnRlZCBieSBzdGF0ZSBub2Rlcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBoaXN0b3J5VmFsdWVcclxuICAgKi9cblxuXG4gIFN0YXRlTm9kZS5wcm90b3R5cGUucmVzb2x2ZUhpc3RvcnkgPSBmdW5jdGlvbiAoaGlzdG9yeVZhbHVlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdoaXN0b3J5Jykge1xuICAgICAgcmV0dXJuIFt0aGlzXTtcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cbiAgICBpZiAoIWhpc3RvcnlWYWx1ZSkge1xuICAgICAgdmFyIGhpc3RvcnlUYXJnZXQgPSB0aGlzLnRhcmdldDtcbiAgICAgIHJldHVybiBoaXN0b3J5VGFyZ2V0ID8gZmxhdHRlbih0b1N0YXRlUGF0aHMoaGlzdG9yeVRhcmdldCkubWFwKGZ1bmN0aW9uIChyZWxhdGl2ZUNoaWxkUGF0aCkge1xuICAgICAgICByZXR1cm4gcGFyZW50LmdldEZyb21SZWxhdGl2ZVBhdGgocmVsYXRpdmVDaGlsZFBhdGgpO1xuICAgICAgfSkpIDogcGFyZW50LmluaXRpYWxTdGF0ZU5vZGVzO1xuICAgIH1cblxuICAgIHZhciBzdWJIaXN0b3J5VmFsdWUgPSBuZXN0ZWRQYXRoKHBhcmVudC5wYXRoLCAnc3RhdGVzJykoaGlzdG9yeVZhbHVlKS5jdXJyZW50O1xuXG4gICAgaWYgKGlzU3RyaW5nKHN1Ykhpc3RvcnlWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBbcGFyZW50LmdldFN0YXRlTm9kZShzdWJIaXN0b3J5VmFsdWUpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdHRlbih0b1N0YXRlUGF0aHMoc3ViSGlzdG9yeVZhbHVlKS5tYXAoZnVuY3Rpb24gKHN1YlN0YXRlUGF0aCkge1xuICAgICAgcmV0dXJuIF90aGlzLmhpc3RvcnkgPT09ICdkZWVwJyA/IHBhcmVudC5nZXRGcm9tUmVsYXRpdmVQYXRoKHN1YlN0YXRlUGF0aCkgOiBbcGFyZW50LnN0YXRlc1tzdWJTdGF0ZVBhdGhbMF1dXTtcbiAgICB9KSk7XG4gIH07XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YXRlTm9kZS5wcm90b3R5cGUsIFwic3RhdGVJZHNcIiwge1xuICAgIC8qKlxyXG4gICAgICogQWxsIHRoZSBzdGF0ZSBub2RlIElEcyBvZiB0aGlzIHN0YXRlIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50IHN0YXRlIG5vZGVzLlxyXG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgY2hpbGRTdGF0ZUlkcyA9IGZsYXR0ZW4oT2JqZWN0LmtleXModGhpcy5zdGF0ZXMpLm1hcChmdW5jdGlvbiAoc3RhdGVLZXkpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnN0YXRlc1tzdGF0ZUtleV0uc3RhdGVJZHM7XG4gICAgICB9KSk7XG4gICAgICByZXR1cm4gW3RoaXMuaWRdLmNvbmNhdChjaGlsZFN0YXRlSWRzKTtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YXRlTm9kZS5wcm90b3R5cGUsIFwiZXZlbnRzXCIsIHtcbiAgICAvKipcclxuICAgICAqIEFsbCB0aGUgZXZlbnQgdHlwZXMgYWNjZXB0ZWQgYnkgdGhpcyBzdGF0ZSBub2RlIGFuZCBpdHMgZGVzY2VuZGFudHMuXHJcbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlXzgsIF9hLCBlXzksIF9iO1xuXG4gICAgICBpZiAodGhpcy5fX2NhY2hlLmV2ZW50cykge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2NhY2hlLmV2ZW50cztcbiAgICAgIH1cblxuICAgICAgdmFyIHN0YXRlcyA9IHRoaXMuc3RhdGVzO1xuICAgICAgdmFyIGV2ZW50cyA9IG5ldyBTZXQodGhpcy5vd25FdmVudHMpO1xuXG4gICAgICBpZiAoc3RhdGVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2MgPSBfX3ZhbHVlcyhPYmplY3Qua2V5cyhzdGF0ZXMpKSwgX2QgPSBfYy5uZXh0KCk7ICFfZC5kb25lOyBfZCA9IF9jLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIHN0YXRlSWQgPSBfZC52YWx1ZTtcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHN0YXRlc1tzdGF0ZUlkXTtcblxuICAgICAgICAgICAgaWYgKHN0YXRlLnN0YXRlcykge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9lID0gKGVfOSA9IHZvaWQgMCwgX192YWx1ZXMoc3RhdGUuZXZlbnRzKSksIF9mID0gX2UubmV4dCgpOyAhX2YuZG9uZTsgX2YgPSBfZS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBldmVudF8xID0gX2YudmFsdWU7XG4gICAgICAgICAgICAgICAgICBldmVudHMuYWRkKFwiXCIuY29uY2F0KGV2ZW50XzEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVfOV8xKSB7XG4gICAgICAgICAgICAgICAgZV85ID0ge1xuICAgICAgICAgICAgICAgICAgZXJyb3I6IGVfOV8xXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgaWYgKF9mICYmICFfZi5kb25lICYmIChfYiA9IF9lLnJldHVybikpIF9iLmNhbGwoX2UpO1xuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZV85KSB0aHJvdyBlXzkuZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlXzhfMSkge1xuICAgICAgICAgIGVfOCA9IHtcbiAgICAgICAgICAgIGVycm9yOiBlXzhfMVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChfZCAmJiAhX2QuZG9uZSAmJiAoX2EgPSBfYy5yZXR1cm4pKSBfYS5jYWxsKF9jKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKGVfOCkgdGhyb3cgZV84LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fX2NhY2hlLmV2ZW50cyA9IEFycmF5LmZyb20oZXZlbnRzKTtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YXRlTm9kZS5wcm90b3R5cGUsIFwib3duRXZlbnRzXCIsIHtcbiAgICAvKipcclxuICAgICAqIEFsbCB0aGUgZXZlbnRzIHRoYXQgaGF2ZSB0cmFuc2l0aW9ucyBkaXJlY3RseSBmcm9tIHRoaXMgc3RhdGUgbm9kZS5cclxuICAgICAqXHJcbiAgICAgKiBFeGNsdWRlcyBhbnkgaW5lcnQgZXZlbnRzLlxyXG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXZlbnRzID0gbmV3IFNldCh0aGlzLnRyYW5zaXRpb25zLmZpbHRlcihmdW5jdGlvbiAodHJhbnNpdGlvbikge1xuICAgICAgICByZXR1cm4gISghdHJhbnNpdGlvbi50YXJnZXQgJiYgIXRyYW5zaXRpb24uYWN0aW9ucy5sZW5ndGggJiYgdHJhbnNpdGlvbi5pbnRlcm5hbCk7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKHRyYW5zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zaXRpb24uZXZlbnRUeXBlO1xuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oZXZlbnRzKTtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcblxuICBTdGF0ZU5vZGUucHJvdG90eXBlLnJlc29sdmVUYXJnZXQgPSBmdW5jdGlvbiAoX3RhcmdldCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoX3RhcmdldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBhbiB1bmRlZmluZWQgdGFyZ2V0IHNpZ25hbHMgdGhhdCB0aGUgc3RhdGUgbm9kZSBzaG91bGQgbm90IHRyYW5zaXRpb24gZnJvbSB0aGF0IHN0YXRlIHdoZW4gcmVjZWl2aW5nIHRoYXQgZXZlbnRcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90YXJnZXQubWFwKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIGlmICghaXNTdHJpbmcodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNJbnRlcm5hbFRhcmdldCA9IHRhcmdldFswXSA9PT0gX3RoaXMuZGVsaW1pdGVyOyAvLyBJZiBpbnRlcm5hbCB0YXJnZXQgaXMgZGVmaW5lZCBvbiBtYWNoaW5lLFxuICAgICAgLy8gZG8gbm90IGluY2x1ZGUgbWFjaGluZSBrZXkgb24gdGFyZ2V0XG5cbiAgICAgIGlmIChpc0ludGVybmFsVGFyZ2V0ICYmICFfdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmdldFN0YXRlTm9kZUJ5UGF0aCh0YXJnZXQuc2xpY2UoMSkpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVzb2x2ZWRUYXJnZXQgPSBpc0ludGVybmFsVGFyZ2V0ID8gX3RoaXMua2V5ICsgdGFyZ2V0IDogdGFyZ2V0O1xuXG4gICAgICBpZiAoX3RoaXMucGFyZW50KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIHRhcmdldFN0YXRlTm9kZSA9IF90aGlzLnBhcmVudC5nZXRTdGF0ZU5vZGVCeVBhdGgocmVzb2x2ZWRUYXJnZXQpO1xuXG4gICAgICAgICAgcmV0dXJuIHRhcmdldFN0YXRlTm9kZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0cmFuc2l0aW9uIGRlZmluaXRpb24gZm9yIHN0YXRlIG5vZGUgJ1wiLmNvbmNhdChfdGhpcy5pZCwgXCInOlxcblwiKS5jb25jYXQoZXJyLm1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmdldFN0YXRlTm9kZUJ5UGF0aChyZXNvbHZlZFRhcmdldCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgU3RhdGVOb2RlLnByb3RvdHlwZS5mb3JtYXRUcmFuc2l0aW9uID0gZnVuY3Rpb24gKHRyYW5zaXRpb25Db25maWcpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIG5vcm1hbGl6ZWRUYXJnZXQgPSBub3JtYWxpemVUYXJnZXQodHJhbnNpdGlvbkNvbmZpZy50YXJnZXQpO1xuICAgIHZhciBpbnRlcm5hbCA9ICdpbnRlcm5hbCcgaW4gdHJhbnNpdGlvbkNvbmZpZyA/IHRyYW5zaXRpb25Db25maWcuaW50ZXJuYWwgOiBub3JtYWxpemVkVGFyZ2V0ID8gbm9ybWFsaXplZFRhcmdldC5zb21lKGZ1bmN0aW9uIChfdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gaXNTdHJpbmcoX3RhcmdldCkgJiYgX3RhcmdldFswXSA9PT0gX3RoaXMuZGVsaW1pdGVyO1xuICAgIH0pIDogdHJ1ZTtcbiAgICB2YXIgZ3VhcmRzID0gdGhpcy5tYWNoaW5lLm9wdGlvbnMuZ3VhcmRzO1xuICAgIHZhciB0YXJnZXQgPSB0aGlzLnJlc29sdmVUYXJnZXQobm9ybWFsaXplZFRhcmdldCk7XG5cbiAgICB2YXIgdHJhbnNpdGlvbiA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0cmFuc2l0aW9uQ29uZmlnKSwge1xuICAgICAgYWN0aW9uczogdG9BY3Rpb25PYmplY3RzKHRvQXJyYXkodHJhbnNpdGlvbkNvbmZpZy5hY3Rpb25zKSksXG4gICAgICBjb25kOiB0b0d1YXJkKHRyYW5zaXRpb25Db25maWcuY29uZCwgZ3VhcmRzKSxcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgaW50ZXJuYWw6IGludGVybmFsLFxuICAgICAgZXZlbnRUeXBlOiB0cmFuc2l0aW9uQ29uZmlnLmV2ZW50LFxuICAgICAgdG9KU09OOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdHJhbnNpdGlvbiksIHtcbiAgICAgICAgICB0YXJnZXQ6IHRyYW5zaXRpb24udGFyZ2V0ID8gdHJhbnNpdGlvbi50YXJnZXQubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gXCIjXCIuY29uY2F0KHQuaWQpO1xuICAgICAgICAgIH0pIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHNvdXJjZTogXCIjXCIuY29uY2F0KF90aGlzLmlkKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFuc2l0aW9uO1xuICB9O1xuXG4gIFN0YXRlTm9kZS5wcm90b3R5cGUuZm9ybWF0VHJhbnNpdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVfMTAsIF9hO1xuXG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvbkNvbmZpZztcblxuICAgIGlmICghdGhpcy5jb25maWcub24pIHtcbiAgICAgIG9uQ29uZmlnID0gW107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY29uZmlnLm9uKSkge1xuICAgICAgb25Db25maWcgPSB0aGlzLmNvbmZpZy5vbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9iID0gdGhpcy5jb25maWcub24sXG4gICAgICAgICAgX2MgPSBXSUxEQ0FSRCxcbiAgICAgICAgICBfZCA9IF9iW19jXSxcbiAgICAgICAgICB3aWxkY2FyZENvbmZpZ3MgPSBfZCA9PT0gdm9pZCAwID8gW10gOiBfZCxcbiAgICAgICAgICBzdHJpY3RUcmFuc2l0aW9uQ29uZmlnc18xID0gX19yZXN0KF9iLCBbdHlwZW9mIF9jID09PSBcInN5bWJvbFwiID8gX2MgOiBfYyArIFwiXCJdKTtcblxuICAgICAgb25Db25maWcgPSBmbGF0dGVuKE9iamVjdC5rZXlzKHN0cmljdFRyYW5zaXRpb25Db25maWdzXzEpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghSVNfUFJPRFVDVElPTiAmJiBrZXkgPT09IE5VTExfRVZFTlQpIHtcbiAgICAgICAgICB3YXJuKGZhbHNlLCBcIkVtcHR5IHN0cmluZyB0cmFuc2l0aW9uIGNvbmZpZ3MgKGUuZy4sIGB7IG9uOiB7ICcnOiAuLi4gfX1gKSBmb3IgdHJhbnNpZW50IHRyYW5zaXRpb25zIGFyZSBkZXByZWNhdGVkLiBTcGVjaWZ5IHRoZSB0cmFuc2l0aW9uIGluIHRoZSBgeyBhbHdheXM6IC4uLiB9YCBwcm9wZXJ0eSBpbnN0ZWFkLiBcIiArIFwiUGxlYXNlIGNoZWNrIHRoZSBgb25gIGNvbmZpZ3VyYXRpb24gZm9yIFxcXCIjXCIuY29uY2F0KF90aGlzLmlkLCBcIlxcXCIuXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0cmFuc2l0aW9uQ29uZmlnQXJyYXkgPSB0b1RyYW5zaXRpb25Db25maWdBcnJheShrZXksIHN0cmljdFRyYW5zaXRpb25Db25maWdzXzFba2V5XSk7XG5cbiAgICAgICAgaWYgKCFJU19QUk9EVUNUSU9OKSB7XG4gICAgICAgICAgdmFsaWRhdGVBcnJheWlmaWVkVHJhbnNpdGlvbnMoX3RoaXMsIGtleSwgdHJhbnNpdGlvbkNvbmZpZ0FycmF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cmFuc2l0aW9uQ29uZmlnQXJyYXk7XG4gICAgICB9KS5jb25jYXQodG9UcmFuc2l0aW9uQ29uZmlnQXJyYXkoV0lMRENBUkQsIHdpbGRjYXJkQ29uZmlncykpKTtcbiAgICB9XG5cbiAgICB2YXIgZXZlbnRsZXNzQ29uZmlnID0gdGhpcy5jb25maWcuYWx3YXlzID8gdG9UcmFuc2l0aW9uQ29uZmlnQXJyYXkoJycsIHRoaXMuY29uZmlnLmFsd2F5cykgOiBbXTtcbiAgICB2YXIgZG9uZUNvbmZpZyA9IHRoaXMuY29uZmlnLm9uRG9uZSA/IHRvVHJhbnNpdGlvbkNvbmZpZ0FycmF5KFN0cmluZyhkb25lKHRoaXMuaWQpKSwgdGhpcy5jb25maWcub25Eb25lKSA6IFtdO1xuXG4gICAgaWYgKCFJU19QUk9EVUNUSU9OKSB7XG4gICAgICB3YXJuKCEodGhpcy5jb25maWcub25Eb25lICYmICF0aGlzLnBhcmVudCksIFwiUm9vdCBub2RlcyBjYW5ub3QgaGF2ZSBhbiBcXFwiLm9uRG9uZVxcXCIgdHJhbnNpdGlvbi4gUGxlYXNlIGNoZWNrIHRoZSBjb25maWcgb2YgXFxcIlwiLmNvbmNhdCh0aGlzLmlkLCBcIlxcXCIuXCIpKTtcbiAgICB9XG5cbiAgICB2YXIgaW52b2tlQ29uZmlnID0gZmxhdHRlbih0aGlzLmludm9rZS5tYXAoZnVuY3Rpb24gKGludm9rZURlZikge1xuICAgICAgdmFyIHNldHRsZVRyYW5zaXRpb25zID0gW107XG5cbiAgICAgIGlmIChpbnZva2VEZWYub25Eb25lKSB7XG4gICAgICAgIHNldHRsZVRyYW5zaXRpb25zLnB1c2guYXBwbHkoc2V0dGxlVHJhbnNpdGlvbnMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0b1RyYW5zaXRpb25Db25maWdBcnJheShTdHJpbmcoZG9uZUludm9rZShpbnZva2VEZWYuaWQpKSwgaW52b2tlRGVmLm9uRG9uZSkpLCBmYWxzZSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW52b2tlRGVmLm9uRXJyb3IpIHtcbiAgICAgICAgc2V0dGxlVHJhbnNpdGlvbnMucHVzaC5hcHBseShzZXR0bGVUcmFuc2l0aW9ucywgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHRvVHJhbnNpdGlvbkNvbmZpZ0FycmF5KFN0cmluZyhlcnJvcihpbnZva2VEZWYuaWQpKSwgaW52b2tlRGVmLm9uRXJyb3IpKSwgZmFsc2UpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNldHRsZVRyYW5zaXRpb25zO1xuICAgIH0pKTtcbiAgICB2YXIgZGVsYXllZFRyYW5zaXRpb25zID0gdGhpcy5hZnRlcjtcbiAgICB2YXIgZm9ybWF0dGVkVHJhbnNpdGlvbnMgPSBmbGF0dGVuKF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChkb25lQ29uZmlnKSwgZmFsc2UpLCBfX3JlYWQoaW52b2tlQ29uZmlnKSwgZmFsc2UpLCBfX3JlYWQob25Db25maWcpLCBmYWxzZSksIF9fcmVhZChldmVudGxlc3NDb25maWcpLCBmYWxzZSkubWFwKGZ1bmN0aW9uICh0cmFuc2l0aW9uQ29uZmlnKSB7XG4gICAgICByZXR1cm4gdG9BcnJheSh0cmFuc2l0aW9uQ29uZmlnKS5tYXAoZnVuY3Rpb24gKHRyYW5zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmZvcm1hdFRyYW5zaXRpb24odHJhbnNpdGlvbik7XG4gICAgICB9KTtcbiAgICB9KSk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgZGVsYXllZFRyYW5zaXRpb25zXzEgPSBfX3ZhbHVlcyhkZWxheWVkVHJhbnNpdGlvbnMpLCBkZWxheWVkVHJhbnNpdGlvbnNfMV8xID0gZGVsYXllZFRyYW5zaXRpb25zXzEubmV4dCgpOyAhZGVsYXllZFRyYW5zaXRpb25zXzFfMS5kb25lOyBkZWxheWVkVHJhbnNpdGlvbnNfMV8xID0gZGVsYXllZFRyYW5zaXRpb25zXzEubmV4dCgpKSB7XG4gICAgICAgIHZhciBkZWxheWVkVHJhbnNpdGlvbiA9IGRlbGF5ZWRUcmFuc2l0aW9uc18xXzEudmFsdWU7XG4gICAgICAgIGZvcm1hdHRlZFRyYW5zaXRpb25zLnB1c2goZGVsYXllZFRyYW5zaXRpb24pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVfMTBfMSkge1xuICAgICAgZV8xMCA9IHtcbiAgICAgICAgZXJyb3I6IGVfMTBfMVxuICAgICAgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGRlbGF5ZWRUcmFuc2l0aW9uc18xXzEgJiYgIWRlbGF5ZWRUcmFuc2l0aW9uc18xXzEuZG9uZSAmJiAoX2EgPSBkZWxheWVkVHJhbnNpdGlvbnNfMS5yZXR1cm4pKSBfYS5jYWxsKGRlbGF5ZWRUcmFuc2l0aW9uc18xKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlXzEwKSB0aHJvdyBlXzEwLmVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXR0ZWRUcmFuc2l0aW9ucztcbiAgfTtcblxuICByZXR1cm4gU3RhdGVOb2RlO1xufSgpO1xuXG5leHBvcnQgeyBTdGF0ZU5vZGUgfTtcbiIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG52YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfTtcclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxuXG5leHBvcnQgeyBfX2Fzc2lnbiwgX19yZWFkLCBfX3Jlc3QsIF9fc3ByZWFkQXJyYXksIF9fdmFsdWVzIH07XG4iLCJpbXBvcnQgeyBBY3Rpb25UeXBlcyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG52YXIgc3RhcnQgPSBBY3Rpb25UeXBlcy5TdGFydDtcbnZhciBzdG9wID0gQWN0aW9uVHlwZXMuU3RvcDtcbnZhciByYWlzZSA9IEFjdGlvblR5cGVzLlJhaXNlO1xudmFyIHNlbmQgPSBBY3Rpb25UeXBlcy5TZW5kO1xudmFyIGNhbmNlbCA9IEFjdGlvblR5cGVzLkNhbmNlbDtcbnZhciBudWxsRXZlbnQgPSBBY3Rpb25UeXBlcy5OdWxsRXZlbnQ7XG52YXIgYXNzaWduID0gQWN0aW9uVHlwZXMuQXNzaWduO1xudmFyIGFmdGVyID0gQWN0aW9uVHlwZXMuQWZ0ZXI7XG52YXIgZG9uZVN0YXRlID0gQWN0aW9uVHlwZXMuRG9uZVN0YXRlO1xudmFyIGxvZyA9IEFjdGlvblR5cGVzLkxvZztcbnZhciBpbml0ID0gQWN0aW9uVHlwZXMuSW5pdDtcbnZhciBpbnZva2UgPSBBY3Rpb25UeXBlcy5JbnZva2U7XG52YXIgZXJyb3JFeGVjdXRpb24gPSBBY3Rpb25UeXBlcy5FcnJvckV4ZWN1dGlvbjtcbnZhciBlcnJvclBsYXRmb3JtID0gQWN0aW9uVHlwZXMuRXJyb3JQbGF0Zm9ybTtcbnZhciBlcnJvciA9IEFjdGlvblR5cGVzLkVycm9yQ3VzdG9tO1xudmFyIHVwZGF0ZSA9IEFjdGlvblR5cGVzLlVwZGF0ZTtcbnZhciBjaG9vc2UgPSBBY3Rpb25UeXBlcy5DaG9vc2U7XG52YXIgcHVyZSA9IEFjdGlvblR5cGVzLlB1cmU7XG5cbmV4cG9ydCB7IGFmdGVyLCBhc3NpZ24sIGNhbmNlbCwgY2hvb3NlLCBkb25lU3RhdGUsIGVycm9yLCBlcnJvckV4ZWN1dGlvbiwgZXJyb3JQbGF0Zm9ybSwgaW5pdCwgaW52b2tlLCBsb2csIG51bGxFdmVudCwgcHVyZSwgcmFpc2UsIHNlbmQsIHN0YXJ0LCBzdG9wLCB1cGRhdGUgfTtcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX3NwcmVhZEFycmF5LCBfX3JlYWQsIF9fdmFsdWVzIH0gZnJvbSAnLi9fdmlydHVhbC9fdHNsaWIuanMnO1xuaW1wb3J0IHsgU3BlY2lhbFRhcmdldHMsIEFjdGlvblR5cGVzIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBpbml0LCByYWlzZSBhcyByYWlzZSQxLCBzZW5kIGFzIHNlbmQkMSwgdXBkYXRlLCBsb2cgYXMgbG9nJDEsIGNhbmNlbCBhcyBjYW5jZWwkMSwgYXNzaWduIGFzIGFzc2lnbiQxLCBlcnJvciBhcyBlcnJvciQxLCBzdG9wIGFzIHN0b3AkMSwgcHVyZSBhcyBwdXJlJDEsIGNob29zZSBhcyBjaG9vc2UkMSB9IGZyb20gJy4vYWN0aW9uVHlwZXMuanMnO1xuaW1wb3J0ICogYXMgYWN0aW9uVHlwZXMgZnJvbSAnLi9hY3Rpb25UeXBlcy5qcyc7XG5leHBvcnQgeyBhY3Rpb25UeXBlcyB9O1xuaW1wb3J0IHsgdG9TQ1hNTEV2ZW50LCBpc1N0cmluZywgaXNGdW5jdGlvbiwgdG9FdmVudE9iamVjdCwgZ2V0RXZlbnRUeXBlLCB1cGRhdGVDb250ZXh0LCBmbGF0dGVuLCBpc0FycmF5LCB0b0FycmF5LCB0b0d1YXJkLCBldmFsdWF0ZUd1YXJkLCB3YXJuIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBJU19QUk9EVUNUSU9OIH0gZnJvbSAnLi9lbnZpcm9ubWVudC5qcyc7XG5cbnZhciBpbml0RXZlbnQgPSAvKiNfX1BVUkVfXyovdG9TQ1hNTEV2ZW50KHtcbiAgdHlwZTogaW5pdFxufSk7XG5mdW5jdGlvbiBnZXRBY3Rpb25GdW5jdGlvbihhY3Rpb25UeXBlLCBhY3Rpb25GdW5jdGlvbk1hcCkge1xuICByZXR1cm4gYWN0aW9uRnVuY3Rpb25NYXAgPyBhY3Rpb25GdW5jdGlvbk1hcFthY3Rpb25UeXBlXSB8fCB1bmRlZmluZWQgOiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiB0b0FjdGlvbk9iamVjdChhY3Rpb24sIGFjdGlvbkZ1bmN0aW9uTWFwKSB7XG4gIHZhciBhY3Rpb25PYmplY3Q7XG5cbiAgaWYgKGlzU3RyaW5nKGFjdGlvbikgfHwgdHlwZW9mIGFjdGlvbiA9PT0gJ251bWJlcicpIHtcbiAgICB2YXIgZXhlYyA9IGdldEFjdGlvbkZ1bmN0aW9uKGFjdGlvbiwgYWN0aW9uRnVuY3Rpb25NYXApO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24oZXhlYykpIHtcbiAgICAgIGFjdGlvbk9iamVjdCA9IHtcbiAgICAgICAgdHlwZTogYWN0aW9uLFxuICAgICAgICBleGVjOiBleGVjXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoZXhlYykge1xuICAgICAgYWN0aW9uT2JqZWN0ID0gZXhlYztcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aW9uT2JqZWN0ID0ge1xuICAgICAgICB0eXBlOiBhY3Rpb24sXG4gICAgICAgIGV4ZWM6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihhY3Rpb24pKSB7XG4gICAgYWN0aW9uT2JqZWN0ID0ge1xuICAgICAgLy8gQ29udmVydCBhY3Rpb24gdG8gc3RyaW5nIGlmIHVubmFtZWRcbiAgICAgIHR5cGU6IGFjdGlvbi5uYW1lIHx8IGFjdGlvbi50b1N0cmluZygpLFxuICAgICAgZXhlYzogYWN0aW9uXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZXhlYyA9IGdldEFjdGlvbkZ1bmN0aW9uKGFjdGlvbi50eXBlLCBhY3Rpb25GdW5jdGlvbk1hcCk7XG5cbiAgICBpZiAoaXNGdW5jdGlvbihleGVjKSkge1xuICAgICAgYWN0aW9uT2JqZWN0ID0gX19hc3NpZ24oX19hc3NpZ24oe30sIGFjdGlvbiksIHtcbiAgICAgICAgZXhlYzogZXhlY1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChleGVjKSB7XG4gICAgICB2YXIgYWN0aW9uVHlwZSA9IGV4ZWMudHlwZSB8fCBhY3Rpb24udHlwZTtcbiAgICAgIGFjdGlvbk9iamVjdCA9IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCBleGVjKSwgYWN0aW9uKSwge1xuICAgICAgICB0eXBlOiBhY3Rpb25UeXBlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aW9uT2JqZWN0ID0gYWN0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhY3Rpb25PYmplY3Q7XG59XG52YXIgdG9BY3Rpb25PYmplY3RzID0gZnVuY3Rpb24gKGFjdGlvbiwgYWN0aW9uRnVuY3Rpb25NYXApIHtcbiAgaWYgKCFhY3Rpb24pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgYWN0aW9ucyA9IGlzQXJyYXkoYWN0aW9uKSA/IGFjdGlvbiA6IFthY3Rpb25dO1xuICByZXR1cm4gYWN0aW9ucy5tYXAoZnVuY3Rpb24gKHN1YkFjdGlvbikge1xuICAgIHJldHVybiB0b0FjdGlvbk9iamVjdChzdWJBY3Rpb24sIGFjdGlvbkZ1bmN0aW9uTWFwKTtcbiAgfSk7XG59O1xuZnVuY3Rpb24gdG9BY3Rpdml0eURlZmluaXRpb24oYWN0aW9uKSB7XG4gIHZhciBhY3Rpb25PYmplY3QgPSB0b0FjdGlvbk9iamVjdChhY3Rpb24pO1xuICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe1xuICAgIGlkOiBpc1N0cmluZyhhY3Rpb24pID8gYWN0aW9uIDogYWN0aW9uT2JqZWN0LmlkXG4gIH0sIGFjdGlvbk9iamVjdCksIHtcbiAgICB0eXBlOiBhY3Rpb25PYmplY3QudHlwZVxuICB9KTtcbn1cbi8qKlxyXG4gKiBSYWlzZXMgYW4gZXZlbnQuIFRoaXMgcGxhY2VzIHRoZSBldmVudCBpbiB0aGUgaW50ZXJuYWwgZXZlbnQgcXVldWUsIHNvIHRoYXRcclxuICogdGhlIGV2ZW50IGlzIGltbWVkaWF0ZWx5IGNvbnN1bWVkIGJ5IHRoZSBtYWNoaW5lIGluIHRoZSBjdXJyZW50IHN0ZXAuXHJcbiAqXHJcbiAqIEBwYXJhbSBldmVudFR5cGUgVGhlIGV2ZW50IHRvIHJhaXNlLlxyXG4gKi9cblxuZnVuY3Rpb24gcmFpc2UoZXZlbnQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiByYWlzZSQxLFxuICAgIGV2ZW50OiB0eXBlb2YgZXZlbnQgPT09ICdmdW5jdGlvbicgPyBldmVudCA6IHRvRXZlbnRPYmplY3QoZXZlbnQpLFxuICAgIGRlbGF5OiBvcHRpb25zID8gb3B0aW9ucy5kZWxheSA6IHVuZGVmaW5lZCxcbiAgICBpZDogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmlkXG4gIH07XG59XG5mdW5jdGlvbiByZXNvbHZlUmFpc2UoYWN0aW9uLCBjdHgsIF9ldmVudCwgZGVsYXlzTWFwKSB7XG4gIHZhciBtZXRhID0ge1xuICAgIF9ldmVudDogX2V2ZW50XG4gIH07XG4gIHZhciByZXNvbHZlZEV2ZW50ID0gdG9TQ1hNTEV2ZW50KGlzRnVuY3Rpb24oYWN0aW9uLmV2ZW50KSA/IGFjdGlvbi5ldmVudChjdHgsIF9ldmVudC5kYXRhLCBtZXRhKSA6IGFjdGlvbi5ldmVudCk7XG4gIHZhciByZXNvbHZlZERlbGF5O1xuXG4gIGlmIChpc1N0cmluZyhhY3Rpb24uZGVsYXkpKSB7XG4gICAgdmFyIGNvbmZpZ0RlbGF5ID0gZGVsYXlzTWFwICYmIGRlbGF5c01hcFthY3Rpb24uZGVsYXldO1xuICAgIHJlc29sdmVkRGVsYXkgPSBpc0Z1bmN0aW9uKGNvbmZpZ0RlbGF5KSA/IGNvbmZpZ0RlbGF5KGN0eCwgX2V2ZW50LmRhdGEsIG1ldGEpIDogY29uZmlnRGVsYXk7XG4gIH0gZWxzZSB7XG4gICAgcmVzb2x2ZWREZWxheSA9IGlzRnVuY3Rpb24oYWN0aW9uLmRlbGF5KSA/IGFjdGlvbi5kZWxheShjdHgsIF9ldmVudC5kYXRhLCBtZXRhKSA6IGFjdGlvbi5kZWxheTtcbiAgfVxuXG4gIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYWN0aW9uKSwge1xuICAgIHR5cGU6IHJhaXNlJDEsXG4gICAgX2V2ZW50OiByZXNvbHZlZEV2ZW50LFxuICAgIGRlbGF5OiByZXNvbHZlZERlbGF5XG4gIH0pO1xufVxuLyoqXHJcbiAqIFNlbmRzIGFuIGV2ZW50LiBUaGlzIHJldHVybnMgYW4gYWN0aW9uIHRoYXQgd2lsbCBiZSByZWFkIGJ5IGFuIGludGVycHJldGVyIHRvXHJcbiAqIHNlbmQgdGhlIGV2ZW50IGluIHRoZSBuZXh0IHN0ZXAsIGFmdGVyIHRoZSBjdXJyZW50IHN0ZXAgaXMgZmluaXNoZWQgZXhlY3V0aW5nLlxyXG4gKlxyXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGBzZW5kVG8oLi4uKWAgYWN0aW9uIGNyZWF0b3IgaW5zdGVhZC5cclxuICpcclxuICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBzZW5kLlxyXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgaW50byB0aGUgc2VuZCBldmVudDpcclxuICogIC0gYGlkYCAtIFRoZSB1bmlxdWUgc2VuZCBldmVudCBpZGVudGlmaWVyICh1c2VkIHdpdGggYGNhbmNlbCgpYCkuXHJcbiAqICAtIGBkZWxheWAgLSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSB0aGUgc2VuZGluZyBvZiB0aGUgZXZlbnQuXHJcbiAqICAtIGB0b2AgLSBUaGUgdGFyZ2V0IG9mIHRoaXMgZXZlbnQgKGJ5IGRlZmF1bHQsIHRoZSBtYWNoaW5lIHRoZSBldmVudCB3YXMgc2VudCBmcm9tKS5cclxuICovXG5cbmZ1bmN0aW9uIHNlbmQoZXZlbnQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICB0bzogb3B0aW9ucyA/IG9wdGlvbnMudG8gOiB1bmRlZmluZWQsXG4gICAgdHlwZTogc2VuZCQxLFxuICAgIGV2ZW50OiBpc0Z1bmN0aW9uKGV2ZW50KSA/IGV2ZW50IDogdG9FdmVudE9iamVjdChldmVudCksXG4gICAgZGVsYXk6IG9wdGlvbnMgPyBvcHRpb25zLmRlbGF5IDogdW5kZWZpbmVkLFxuICAgIC8vIFRPRE86IGRvbid0IGF1dG8tZ2VuZXJhdGUgSURzIGhlcmUgbGlrZSB0aGF0XG4gICAgLy8gdGhlcmUgaXMgdG9vIGJpZyBjaGFuY2Ugb2YgdGhlIElEIGNvbGxpc2lvblxuICAgIGlkOiBvcHRpb25zICYmIG9wdGlvbnMuaWQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuaWQgOiBpc0Z1bmN0aW9uKGV2ZW50KSA/IGV2ZW50Lm5hbWUgOiBnZXRFdmVudFR5cGUoZXZlbnQpXG4gIH07XG59XG5mdW5jdGlvbiByZXNvbHZlU2VuZChhY3Rpb24sIGN0eCwgX2V2ZW50LCBkZWxheXNNYXApIHtcbiAgdmFyIG1ldGEgPSB7XG4gICAgX2V2ZW50OiBfZXZlbnRcbiAgfTsgLy8gVE9ETzogaGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZpbmcgRXhwclxuXG4gIHZhciByZXNvbHZlZEV2ZW50ID0gdG9TQ1hNTEV2ZW50KGlzRnVuY3Rpb24oYWN0aW9uLmV2ZW50KSA/IGFjdGlvbi5ldmVudChjdHgsIF9ldmVudC5kYXRhLCBtZXRhKSA6IGFjdGlvbi5ldmVudCk7XG4gIHZhciByZXNvbHZlZERlbGF5O1xuXG4gIGlmIChpc1N0cmluZyhhY3Rpb24uZGVsYXkpKSB7XG4gICAgdmFyIGNvbmZpZ0RlbGF5ID0gZGVsYXlzTWFwICYmIGRlbGF5c01hcFthY3Rpb24uZGVsYXldO1xuICAgIHJlc29sdmVkRGVsYXkgPSBpc0Z1bmN0aW9uKGNvbmZpZ0RlbGF5KSA/IGNvbmZpZ0RlbGF5KGN0eCwgX2V2ZW50LmRhdGEsIG1ldGEpIDogY29uZmlnRGVsYXk7XG4gIH0gZWxzZSB7XG4gICAgcmVzb2x2ZWREZWxheSA9IGlzRnVuY3Rpb24oYWN0aW9uLmRlbGF5KSA/IGFjdGlvbi5kZWxheShjdHgsIF9ldmVudC5kYXRhLCBtZXRhKSA6IGFjdGlvbi5kZWxheTtcbiAgfVxuXG4gIHZhciByZXNvbHZlZFRhcmdldCA9IGlzRnVuY3Rpb24oYWN0aW9uLnRvKSA/IGFjdGlvbi50byhjdHgsIF9ldmVudC5kYXRhLCBtZXRhKSA6IGFjdGlvbi50bztcbiAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBhY3Rpb24pLCB7XG4gICAgdG86IHJlc29sdmVkVGFyZ2V0LFxuICAgIF9ldmVudDogcmVzb2x2ZWRFdmVudCxcbiAgICBldmVudDogcmVzb2x2ZWRFdmVudC5kYXRhLFxuICAgIGRlbGF5OiByZXNvbHZlZERlbGF5XG4gIH0pO1xufVxuLyoqXHJcbiAqIFNlbmRzIGFuIGV2ZW50IHRvIHRoaXMgbWFjaGluZSdzIHBhcmVudC5cclxuICpcclxuICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBzZW5kIHRvIHRoZSBwYXJlbnQgbWFjaGluZS5cclxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIGludG8gdGhlIHNlbmQgZXZlbnQuXHJcbiAqL1xuXG5mdW5jdGlvbiBzZW5kUGFyZW50KGV2ZW50LCBvcHRpb25zKSB7XG4gIHJldHVybiBzZW5kKGV2ZW50LCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHtcbiAgICB0bzogU3BlY2lhbFRhcmdldHMuUGFyZW50XG4gIH0pKTtcbn1cbi8qKlxyXG4gKiBTZW5kcyBhbiBldmVudCB0byBhbiBhY3Rvci5cclxuICpcclxuICogQHBhcmFtIGFjdG9yIFRoZSBgQWN0b3JSZWZgIHRvIHNlbmQgdGhlIGV2ZW50IHRvLlxyXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHNlbmQsIG9yIGFuIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gdGhlIGV2ZW50IHRvIHNlbmRcclxuICogQHBhcmFtIG9wdGlvbnMgU2VuZCBhY3Rpb24gb3B0aW9uc1xyXG4gKiBAcmV0dXJucyBBbiBYU3RhdGUgc2VuZCBhY3Rpb24gb2JqZWN0XHJcbiAqL1xuXG5mdW5jdGlvbiBzZW5kVG8oYWN0b3IsIGV2ZW50LCBvcHRpb25zKSB7XG4gIHJldHVybiBzZW5kKGV2ZW50LCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHtcbiAgICB0bzogYWN0b3JcbiAgfSkpO1xufVxuLyoqXHJcbiAqIFNlbmRzIGFuIHVwZGF0ZSBldmVudCB0byB0aGlzIG1hY2hpbmUncyBwYXJlbnQuXHJcbiAqL1xuXG5mdW5jdGlvbiBzZW5kVXBkYXRlKCkge1xuICByZXR1cm4gc2VuZFBhcmVudCh1cGRhdGUpO1xufVxuLyoqXHJcbiAqIFNlbmRzIGFuIGV2ZW50IGJhY2sgdG8gdGhlIHNlbmRlciBvZiB0aGUgb3JpZ2luYWwgZXZlbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2VuZCBiYWNrIHRvIHRoZSBzZW5kZXJcclxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIGludG8gdGhlIHNlbmQgZXZlbnRcclxuICovXG5cbmZ1bmN0aW9uIHJlc3BvbmQoZXZlbnQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHNlbmQoZXZlbnQsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwge1xuICAgIHRvOiBmdW5jdGlvbiAoXywgX18sIF9hKSB7XG4gICAgICB2YXIgX2V2ZW50ID0gX2EuX2V2ZW50O1xuICAgICAgcmV0dXJuIF9ldmVudC5vcmlnaW47IC8vIFRPRE86IGhhbmRsZSB3aGVuIF9ldmVudC5vcmlnaW4gaXMgdW5kZWZpbmVkXG4gICAgfVxuICB9KSk7XG59XG5cbnZhciBkZWZhdWx0TG9nRXhwciA9IGZ1bmN0aW9uIChjb250ZXh0LCBldmVudCkge1xuICByZXR1cm4ge1xuICAgIGNvbnRleHQ6IGNvbnRleHQsXG4gICAgZXZlbnQ6IGV2ZW50XG4gIH07XG59O1xuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSBleHByIFRoZSBleHByZXNzaW9uIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIHdoaWNoIHdpbGwgYmUgbG9nZ2VkLlxyXG4gKiAgVGFrZXMgaW4gMiBhcmd1bWVudHM6XHJcbiAqICAtIGBjdHhgIC0gdGhlIGN1cnJlbnQgc3RhdGUgY29udGV4dFxyXG4gKiAgLSBgZXZlbnRgIC0gdGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxyXG4gKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIGdpdmUgdG8gdGhlIGxvZ2dlZCBleHByZXNzaW9uLlxyXG4gKi9cblxuXG5mdW5jdGlvbiBsb2coZXhwciwgbGFiZWwpIHtcbiAgaWYgKGV4cHIgPT09IHZvaWQgMCkge1xuICAgIGV4cHIgPSBkZWZhdWx0TG9nRXhwcjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogbG9nJDEsXG4gICAgbGFiZWw6IGxhYmVsLFxuICAgIGV4cHI6IGV4cHJcbiAgfTtcbn1cbnZhciByZXNvbHZlTG9nID0gZnVuY3Rpb24gKGFjdGlvbiwgY3R4LCBfZXZlbnQpIHtcbiAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBhY3Rpb24pLCB7XG4gICAgdmFsdWU6IGlzU3RyaW5nKGFjdGlvbi5leHByKSA/IGFjdGlvbi5leHByIDogYWN0aW9uLmV4cHIoY3R4LCBfZXZlbnQuZGF0YSwge1xuICAgICAgX2V2ZW50OiBfZXZlbnRcbiAgICB9KVxuICB9KTtcbn07XG4vKipcclxuICogQ2FuY2VscyBhbiBpbi1mbGlnaHQgYHNlbmQoLi4uKWAgYWN0aW9uLiBBIGNhbmNlbGVkIHNlbnQgYWN0aW9uIHdpbGwgbm90XHJcbiAqIGJlIGV4ZWN1dGVkLCBub3Igd2lsbCBpdHMgZXZlbnQgYmUgc2VudCwgdW5sZXNzIGl0IGhhcyBhbHJlYWR5IGJlZW4gc2VudFxyXG4gKiAoZS5nLiwgaWYgYGNhbmNlbCguLi4pYCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGBzZW5kKC4uLilgIGFjdGlvbidzIGBkZWxheWApLlxyXG4gKlxyXG4gKiBAcGFyYW0gc2VuZElkIFRoZSBgaWRgIG9mIHRoZSBgc2VuZCguLi4pYCBhY3Rpb24gdG8gY2FuY2VsLlxyXG4gKi9cblxudmFyIGNhbmNlbCA9IGZ1bmN0aW9uIChzZW5kSWQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBjYW5jZWwkMSxcbiAgICBzZW5kSWQ6IHNlbmRJZFxuICB9O1xufTtcbi8qKlxyXG4gKiBTdGFydHMgYW4gYWN0aXZpdHkuXHJcbiAqXHJcbiAqIEBwYXJhbSBhY3Rpdml0eSBUaGUgYWN0aXZpdHkgdG8gc3RhcnQuXHJcbiAqL1xuXG5mdW5jdGlvbiBzdGFydChhY3Rpdml0eSkge1xuICB2YXIgYWN0aXZpdHlEZWYgPSB0b0FjdGl2aXR5RGVmaW5pdGlvbihhY3Rpdml0eSk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU3RhcnQsXG4gICAgYWN0aXZpdHk6IGFjdGl2aXR5RGVmLFxuICAgIGV4ZWM6IHVuZGVmaW5lZFxuICB9O1xufVxuLyoqXHJcbiAqIFN0b3BzIGFuIGFjdGl2aXR5LlxyXG4gKlxyXG4gKiBAcGFyYW0gYWN0b3JSZWYgVGhlIGFjdGl2aXR5IHRvIHN0b3AuXHJcbiAqL1xuXG5mdW5jdGlvbiBzdG9wKGFjdG9yUmVmKSB7XG4gIHZhciBhY3Rpdml0eSA9IGlzRnVuY3Rpb24oYWN0b3JSZWYpID8gYWN0b3JSZWYgOiB0b0FjdGl2aXR5RGVmaW5pdGlvbihhY3RvclJlZik7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU3RvcCxcbiAgICBhY3Rpdml0eTogYWN0aXZpdHksXG4gICAgZXhlYzogdW5kZWZpbmVkXG4gIH07XG59XG5mdW5jdGlvbiByZXNvbHZlU3RvcChhY3Rpb24sIGNvbnRleHQsIF9ldmVudCkge1xuICB2YXIgYWN0b3JSZWZPclN0cmluZyA9IGlzRnVuY3Rpb24oYWN0aW9uLmFjdGl2aXR5KSA/IGFjdGlvbi5hY3Rpdml0eShjb250ZXh0LCBfZXZlbnQuZGF0YSkgOiBhY3Rpb24uYWN0aXZpdHk7XG4gIHZhciByZXNvbHZlZEFjdG9yUmVmID0gdHlwZW9mIGFjdG9yUmVmT3JTdHJpbmcgPT09ICdzdHJpbmcnID8ge1xuICAgIGlkOiBhY3RvclJlZk9yU3RyaW5nXG4gIH0gOiBhY3RvclJlZk9yU3RyaW5nO1xuICB2YXIgYWN0aW9uT2JqZWN0ID0ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlN0b3AsXG4gICAgYWN0aXZpdHk6IHJlc29sdmVkQWN0b3JSZWZcbiAgfTtcbiAgcmV0dXJuIGFjdGlvbk9iamVjdDtcbn1cbi8qKlxyXG4gKiBVcGRhdGVzIHRoZSBjdXJyZW50IGNvbnRleHQgb2YgdGhlIG1hY2hpbmUuXHJcbiAqXHJcbiAqIEBwYXJhbSBhc3NpZ25tZW50IEFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHBhcnRpYWwgY29udGV4dCB0byB1cGRhdGUuXHJcbiAqL1xuXG52YXIgYXNzaWduID0gZnVuY3Rpb24gKGFzc2lnbm1lbnQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhc3NpZ24kMSxcbiAgICBhc3NpZ25tZW50OiBhc3NpZ25tZW50XG4gIH07XG59O1xuZnVuY3Rpb24gaXNBY3Rpb25PYmplY3QoYWN0aW9uKSB7XG4gIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSAnb2JqZWN0JyAmJiAndHlwZScgaW4gYWN0aW9uO1xufVxuLyoqXHJcbiAqIFJldHVybnMgYW4gZXZlbnQgdHlwZSB0aGF0IHJlcHJlc2VudHMgYW4gaW1wbGljaXQgZXZlbnQgdGhhdFxyXG4gKiBpcyBzZW50IGFmdGVyIHRoZSBzcGVjaWZpZWQgYGRlbGF5YC5cclxuICpcclxuICogQHBhcmFtIGRlbGF5UmVmIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHNcclxuICogQHBhcmFtIGlkIFRoZSBzdGF0ZSBub2RlIElEIHdoZXJlIHRoaXMgZXZlbnQgaXMgaGFuZGxlZFxyXG4gKi9cblxuZnVuY3Rpb24gYWZ0ZXIoZGVsYXlSZWYsIGlkKSB7XG4gIHZhciBpZFN1ZmZpeCA9IGlkID8gXCIjXCIuY29uY2F0KGlkKSA6ICcnO1xuICByZXR1cm4gXCJcIi5jb25jYXQoQWN0aW9uVHlwZXMuQWZ0ZXIsIFwiKFwiKS5jb25jYXQoZGVsYXlSZWYsIFwiKVwiKS5jb25jYXQoaWRTdWZmaXgpO1xufVxuLyoqXHJcbiAqIFJldHVybnMgYW4gZXZlbnQgdGhhdCByZXByZXNlbnRzIHRoYXQgYSBmaW5hbCBzdGF0ZSBub2RlXHJcbiAqIGhhcyBiZWVuIHJlYWNoZWQgaW4gdGhlIHBhcmVudCBzdGF0ZSBub2RlLlxyXG4gKlxyXG4gKiBAcGFyYW0gaWQgVGhlIGZpbmFsIHN0YXRlIG5vZGUncyBwYXJlbnQgc3RhdGUgbm9kZSBgaWRgXHJcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIHBhc3MgaW50byB0aGUgZXZlbnRcclxuICovXG5cbmZ1bmN0aW9uIGRvbmUoaWQsIGRhdGEpIHtcbiAgdmFyIHR5cGUgPSBcIlwiLmNvbmNhdChBY3Rpb25UeXBlcy5Eb25lU3RhdGUsIFwiLlwiKS5jb25jYXQoaWQpO1xuICB2YXIgZXZlbnRPYmplY3QgPSB7XG4gICAgdHlwZTogdHlwZSxcbiAgICBkYXRhOiBkYXRhXG4gIH07XG5cbiAgZXZlbnRPYmplY3QudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH07XG5cbiAgcmV0dXJuIGV2ZW50T2JqZWN0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYW4gZXZlbnQgdGhhdCByZXByZXNlbnRzIHRoYXQgYW4gaW52b2tlZCBzZXJ2aWNlIGhhcyB0ZXJtaW5hdGVkLlxyXG4gKlxyXG4gKiBBbiBpbnZva2VkIHNlcnZpY2UgaXMgdGVybWluYXRlZCB3aGVuIGl0IGhhcyByZWFjaGVkIGEgdG9wLWxldmVsIGZpbmFsIHN0YXRlIG5vZGUsXHJcbiAqIGJ1dCBub3Qgd2hlbiBpdCBpcyBjYW5jZWxlZC5cclxuICpcclxuICogQHBhcmFtIGlkIFRoZSBmaW5hbCBzdGF0ZSBub2RlIElEXHJcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIHBhc3MgaW50byB0aGUgZXZlbnRcclxuICovXG5cbmZ1bmN0aW9uIGRvbmVJbnZva2UoaWQsIGRhdGEpIHtcbiAgdmFyIHR5cGUgPSBcIlwiLmNvbmNhdChBY3Rpb25UeXBlcy5Eb25lSW52b2tlLCBcIi5cIikuY29uY2F0KGlkKTtcbiAgdmFyIGV2ZW50T2JqZWN0ID0ge1xuICAgIHR5cGU6IHR5cGUsXG4gICAgZGF0YTogZGF0YVxuICB9O1xuXG4gIGV2ZW50T2JqZWN0LnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0eXBlO1xuICB9O1xuXG4gIHJldHVybiBldmVudE9iamVjdDtcbn1cbmZ1bmN0aW9uIGVycm9yKGlkLCBkYXRhKSB7XG4gIHZhciB0eXBlID0gXCJcIi5jb25jYXQoQWN0aW9uVHlwZXMuRXJyb3JQbGF0Zm9ybSwgXCIuXCIpLmNvbmNhdChpZCk7XG4gIHZhciBldmVudE9iamVjdCA9IHtcbiAgICB0eXBlOiB0eXBlLFxuICAgIGRhdGE6IGRhdGFcbiAgfTtcblxuICBldmVudE9iamVjdC50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfTtcblxuICByZXR1cm4gZXZlbnRPYmplY3Q7XG59XG5mdW5jdGlvbiBwdXJlKGdldEFjdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5QdXJlLFxuICAgIGdldDogZ2V0QWN0aW9uc1xuICB9O1xufVxuLyoqXHJcbiAqIEZvcndhcmRzIChzZW5kcykgYW4gZXZlbnQgdG8gYSBzcGVjaWZpZWQgc2VydmljZS5cclxuICpcclxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHNlcnZpY2UgdG8gZm9yd2FyZCB0aGUgZXZlbnQgdG8uXHJcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyBpbnRvIHRoZSBzZW5kIGFjdGlvbiBjcmVhdG9yLlxyXG4gKi9cblxuZnVuY3Rpb24gZm9yd2FyZFRvKHRhcmdldCwgb3B0aW9ucykge1xuICBpZiAoIUlTX1BST0RVQ1RJT04gJiYgKCF0YXJnZXQgfHwgdHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB2YXIgb3JpZ2luYWxUYXJnZXRfMSA9IHRhcmdldDtcblxuICAgIHRhcmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBhcmdzID0gW107XG5cbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc29sdmVkVGFyZ2V0ID0gdHlwZW9mIG9yaWdpbmFsVGFyZ2V0XzEgPT09ICdmdW5jdGlvbicgPyBvcmlnaW5hbFRhcmdldF8xLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFyZ3MpLCBmYWxzZSkpIDogb3JpZ2luYWxUYXJnZXRfMTtcblxuICAgICAgaWYgKCFyZXNvbHZlZFRhcmdldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdHRlbXB0ZWQgdG8gZm9yd2FyZCBldmVudCB0byB1bmRlZmluZWQgYWN0b3IuIFRoaXMgcmlza3MgYW4gaW5maW5pdGUgbG9vcCBpbiB0aGUgc2VuZGVyLlwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc29sdmVkVGFyZ2V0O1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gc2VuZChmdW5jdGlvbiAoXywgZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQ7XG4gIH0sIF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwge1xuICAgIHRvOiB0YXJnZXRcbiAgfSkpO1xufVxuLyoqXHJcbiAqIEVzY2FsYXRlcyBhbiBlcnJvciBieSBzZW5kaW5nIGl0IGFzIGFuIGV2ZW50IHRvIHRoaXMgbWFjaGluZSdzIHBhcmVudC5cclxuICpcclxuICogQHBhcmFtIGVycm9yRGF0YSBUaGUgZXJyb3IgZGF0YSB0byBzZW5kLCBvciB0aGUgZXhwcmVzc2lvbiBmdW5jdGlvbiB0aGF0XHJcbiAqIHRha2VzIGluIHRoZSBgY29udGV4dGAsIGBldmVudGAsIGFuZCBgbWV0YWAsIGFuZCByZXR1cm5zIHRoZSBlcnJvciBkYXRhIHRvIHNlbmQuXHJcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyBpbnRvIHRoZSBzZW5kIGFjdGlvbiBjcmVhdG9yLlxyXG4gKi9cblxuZnVuY3Rpb24gZXNjYWxhdGUoZXJyb3JEYXRhLCBvcHRpb25zKSB7XG4gIHJldHVybiBzZW5kUGFyZW50KGZ1bmN0aW9uIChjb250ZXh0LCBldmVudCwgbWV0YSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBlcnJvciQxLFxuICAgICAgZGF0YTogaXNGdW5jdGlvbihlcnJvckRhdGEpID8gZXJyb3JEYXRhKGNvbnRleHQsIGV2ZW50LCBtZXRhKSA6IGVycm9yRGF0YVxuICAgIH07XG4gIH0sIF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwge1xuICAgIHRvOiBTcGVjaWFsVGFyZ2V0cy5QYXJlbnRcbiAgfSkpO1xufVxuZnVuY3Rpb24gY2hvb3NlKGNvbmRzKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuQ2hvb3NlLFxuICAgIGNvbmRzOiBjb25kc1xuICB9O1xufVxuXG52YXIgcGx1Y2tBc3NpZ25zID0gZnVuY3Rpb24gKGFjdGlvbkJsb2Nrcykge1xuICB2YXIgZV8xLCBfYTtcblxuICB2YXIgYXNzaWduQWN0aW9ucyA9IFtdO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgYWN0aW9uQmxvY2tzXzEgPSBfX3ZhbHVlcyhhY3Rpb25CbG9ja3MpLCBhY3Rpb25CbG9ja3NfMV8xID0gYWN0aW9uQmxvY2tzXzEubmV4dCgpOyAhYWN0aW9uQmxvY2tzXzFfMS5kb25lOyBhY3Rpb25CbG9ja3NfMV8xID0gYWN0aW9uQmxvY2tzXzEubmV4dCgpKSB7XG4gICAgICB2YXIgYmxvY2sgPSBhY3Rpb25CbG9ja3NfMV8xLnZhbHVlO1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB3aGlsZSAoaSA8IGJsb2NrLmFjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChibG9jay5hY3Rpb25zW2ldLnR5cGUgPT09IGFzc2lnbiQxKSB7XG4gICAgICAgICAgYXNzaWduQWN0aW9ucy5wdXNoKGJsb2NrLmFjdGlvbnNbaV0pO1xuICAgICAgICAgIGJsb2NrLmFjdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZV8xXzEpIHtcbiAgICBlXzEgPSB7XG4gICAgICBlcnJvcjogZV8xXzFcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWN0aW9uQmxvY2tzXzFfMSAmJiAhYWN0aW9uQmxvY2tzXzFfMS5kb25lICYmIChfYSA9IGFjdGlvbkJsb2Nrc18xLnJldHVybikpIF9hLmNhbGwoYWN0aW9uQmxvY2tzXzEpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFzc2lnbkFjdGlvbnM7XG59O1xuXG5mdW5jdGlvbiByZXNvbHZlQWN0aW9ucyhtYWNoaW5lLCBjdXJyZW50U3RhdGUsIGN1cnJlbnRDb250ZXh0LCBfZXZlbnQsIGFjdGlvbkJsb2NrcywgcHJlZGljdGFibGVFeGVjLCBwcmVzZXJ2ZUFjdGlvbk9yZGVyKSB7XG4gIGlmIChwcmVzZXJ2ZUFjdGlvbk9yZGVyID09PSB2b2lkIDApIHtcbiAgICBwcmVzZXJ2ZUFjdGlvbk9yZGVyID0gZmFsc2U7XG4gIH1cblxuICB2YXIgYXNzaWduQWN0aW9ucyA9IHByZXNlcnZlQWN0aW9uT3JkZXIgPyBbXSA6IHBsdWNrQXNzaWducyhhY3Rpb25CbG9ja3MpO1xuICB2YXIgdXBkYXRlZENvbnRleHQgPSBhc3NpZ25BY3Rpb25zLmxlbmd0aCA/IHVwZGF0ZUNvbnRleHQoY3VycmVudENvbnRleHQsIF9ldmVudCwgYXNzaWduQWN0aW9ucywgY3VycmVudFN0YXRlKSA6IGN1cnJlbnRDb250ZXh0O1xuICB2YXIgcHJlc2VydmVkQ29udGV4dHMgPSBwcmVzZXJ2ZUFjdGlvbk9yZGVyID8gW2N1cnJlbnRDb250ZXh0XSA6IHVuZGVmaW5lZDtcbiAgdmFyIGRlZmVycmVkVG9CbG9ja0VuZCA9IFtdO1xuXG4gIGZ1bmN0aW9uIGhhbmRsZUFjdGlvbihibG9ja1R5cGUsIGFjdGlvbk9iamVjdCkge1xuICAgIHZhciBfYTtcblxuICAgIHN3aXRjaCAoYWN0aW9uT2JqZWN0LnR5cGUpIHtcbiAgICAgIGNhc2UgcmFpc2UkMTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciByYWlzZWRBY3Rpb24gPSByZXNvbHZlUmFpc2UoYWN0aW9uT2JqZWN0LCB1cGRhdGVkQ29udGV4dCwgX2V2ZW50LCBtYWNoaW5lLm9wdGlvbnMuZGVsYXlzKTtcblxuICAgICAgICAgIGlmIChwcmVkaWN0YWJsZUV4ZWMgJiYgdHlwZW9mIHJhaXNlZEFjdGlvbi5kZWxheSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHByZWRpY3RhYmxlRXhlYyhyYWlzZWRBY3Rpb24sIHVwZGF0ZWRDb250ZXh0LCBfZXZlbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByYWlzZWRBY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBzZW5kJDE6XG4gICAgICAgIHZhciBzZW5kQWN0aW9uID0gcmVzb2x2ZVNlbmQoYWN0aW9uT2JqZWN0LCB1cGRhdGVkQ29udGV4dCwgX2V2ZW50LCBtYWNoaW5lLm9wdGlvbnMuZGVsYXlzKTsgLy8gVE9ETzogZml4IEFjdGlvblR5cGVzLkluaXRcblxuICAgICAgICBpZiAoIUlTX1BST0RVQ1RJT04pIHtcbiAgICAgICAgICB2YXIgY29uZmlndXJlZERlbGF5ID0gYWN0aW9uT2JqZWN0LmRlbGF5OyAvLyB3YXJuIGFmdGVyIHJlc29sdmluZyBhcyB3ZSBjYW4gY3JlYXRlIGJldHRlciBjb250ZXh0dWFsIG1lc3NhZ2UgaGVyZVxuXG4gICAgICAgICAgd2FybighaXNTdHJpbmcoY29uZmlndXJlZERlbGF5KSB8fCB0eXBlb2Ygc2VuZEFjdGlvbi5kZWxheSA9PT0gJ251bWJlcicsIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICBcIk5vIGRlbGF5IHJlZmVyZW5jZSBmb3IgZGVsYXkgZXhwcmVzc2lvbiAnXCIuY29uY2F0KGNvbmZpZ3VyZWREZWxheSwgXCInIHdhcyBmb3VuZCBvbiBtYWNoaW5lICdcIikuY29uY2F0KG1hY2hpbmUuaWQsIFwiJ1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJlZGljdGFibGVFeGVjICYmIHNlbmRBY3Rpb24udG8gIT09IFNwZWNpYWxUYXJnZXRzLkludGVybmFsKSB7XG4gICAgICAgICAgaWYgKGJsb2NrVHlwZSA9PT0gJ2VudHJ5Jykge1xuICAgICAgICAgICAgZGVmZXJyZWRUb0Jsb2NrRW5kLnB1c2goc2VuZEFjdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZWRpY3RhYmxlRXhlYyhzZW5kQWN0aW9uLCB1cGRhdGVkQ29udGV4dCwgX2V2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VuZEFjdGlvbjtcblxuICAgICAgY2FzZSBsb2ckMTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciByZXNvbHZlZCA9IHJlc29sdmVMb2coYWN0aW9uT2JqZWN0LCB1cGRhdGVkQ29udGV4dCwgX2V2ZW50KTtcbiAgICAgICAgICBwcmVkaWN0YWJsZUV4ZWMgPT09IG51bGwgfHwgcHJlZGljdGFibGVFeGVjID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcmVkaWN0YWJsZUV4ZWMocmVzb2x2ZWQsIHVwZGF0ZWRDb250ZXh0LCBfZXZlbnQpO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIGNob29zZSQxOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGNob29zZUFjdGlvbiA9IGFjdGlvbk9iamVjdDtcbiAgICAgICAgICB2YXIgbWF0Y2hlZEFjdGlvbnMgPSAoX2EgPSBjaG9vc2VBY3Rpb24uY29uZHMuZmluZChmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgICB2YXIgZ3VhcmQgPSB0b0d1YXJkKGNvbmRpdGlvbi5jb25kLCBtYWNoaW5lLm9wdGlvbnMuZ3VhcmRzKTtcbiAgICAgICAgICAgIHJldHVybiAhZ3VhcmQgfHwgZXZhbHVhdGVHdWFyZChtYWNoaW5lLCBndWFyZCwgdXBkYXRlZENvbnRleHQsIF9ldmVudCwgIXByZWRpY3RhYmxlRXhlYyA/IGN1cnJlbnRTdGF0ZSA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgfSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hY3Rpb25zO1xuXG4gICAgICAgICAgaWYgKCFtYXRjaGVkQWN0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfYiA9IF9fcmVhZChyZXNvbHZlQWN0aW9ucyhtYWNoaW5lLCBjdXJyZW50U3RhdGUsIHVwZGF0ZWRDb250ZXh0LCBfZXZlbnQsIFt7XG4gICAgICAgICAgICB0eXBlOiBibG9ja1R5cGUsXG4gICAgICAgICAgICBhY3Rpb25zOiB0b0FjdGlvbk9iamVjdHModG9BcnJheShtYXRjaGVkQWN0aW9ucyksIG1hY2hpbmUub3B0aW9ucy5hY3Rpb25zKVxuICAgICAgICAgIH1dLCBwcmVkaWN0YWJsZUV4ZWMsIHByZXNlcnZlQWN0aW9uT3JkZXIpLCAyKSxcbiAgICAgICAgICAgICAgcmVzb2x2ZWRBY3Rpb25zRnJvbUNob29zZSA9IF9iWzBdLFxuICAgICAgICAgICAgICByZXNvbHZlZENvbnRleHRGcm9tQ2hvb3NlID0gX2JbMV07XG5cbiAgICAgICAgICB1cGRhdGVkQ29udGV4dCA9IHJlc29sdmVkQ29udGV4dEZyb21DaG9vc2U7XG4gICAgICAgICAgcHJlc2VydmVkQ29udGV4dHMgPT09IG51bGwgfHwgcHJlc2VydmVkQ29udGV4dHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByZXNlcnZlZENvbnRleHRzLnB1c2godXBkYXRlZENvbnRleHQpO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlZEFjdGlvbnNGcm9tQ2hvb3NlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgcHVyZSQxOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIG1hdGNoZWRBY3Rpb25zID0gYWN0aW9uT2JqZWN0LmdldCh1cGRhdGVkQ29udGV4dCwgX2V2ZW50LmRhdGEpO1xuXG4gICAgICAgICAgaWYgKCFtYXRjaGVkQWN0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfYyA9IF9fcmVhZChyZXNvbHZlQWN0aW9ucyhtYWNoaW5lLCBjdXJyZW50U3RhdGUsIHVwZGF0ZWRDb250ZXh0LCBfZXZlbnQsIFt7XG4gICAgICAgICAgICB0eXBlOiBibG9ja1R5cGUsXG4gICAgICAgICAgICBhY3Rpb25zOiB0b0FjdGlvbk9iamVjdHModG9BcnJheShtYXRjaGVkQWN0aW9ucyksIG1hY2hpbmUub3B0aW9ucy5hY3Rpb25zKVxuICAgICAgICAgIH1dLCBwcmVkaWN0YWJsZUV4ZWMsIHByZXNlcnZlQWN0aW9uT3JkZXIpLCAyKSxcbiAgICAgICAgICAgICAgcmVzb2x2ZWRBY3Rpb25zRnJvbVB1cmUgPSBfY1swXSxcbiAgICAgICAgICAgICAgcmVzb2x2ZWRDb250ZXh0ID0gX2NbMV07XG5cbiAgICAgICAgICB1cGRhdGVkQ29udGV4dCA9IHJlc29sdmVkQ29udGV4dDtcbiAgICAgICAgICBwcmVzZXJ2ZWRDb250ZXh0cyA9PT0gbnVsbCB8fCBwcmVzZXJ2ZWRDb250ZXh0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJlc2VydmVkQ29udGV4dHMucHVzaCh1cGRhdGVkQ29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVkQWN0aW9uc0Zyb21QdXJlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2Ugc3RvcCQxOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHJlc29sdmVkID0gcmVzb2x2ZVN0b3AoYWN0aW9uT2JqZWN0LCB1cGRhdGVkQ29udGV4dCwgX2V2ZW50KTtcbiAgICAgICAgICBwcmVkaWN0YWJsZUV4ZWMgPT09IG51bGwgfHwgcHJlZGljdGFibGVFeGVjID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcmVkaWN0YWJsZUV4ZWMocmVzb2x2ZWQsIGN1cnJlbnRDb250ZXh0LCBfZXZlbnQpO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIGFzc2lnbiQxOlxuICAgICAgICB7XG4gICAgICAgICAgdXBkYXRlZENvbnRleHQgPSB1cGRhdGVDb250ZXh0KHVwZGF0ZWRDb250ZXh0LCBfZXZlbnQsIFthY3Rpb25PYmplY3RdLCAhcHJlZGljdGFibGVFeGVjID8gY3VycmVudFN0YXRlIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICBwcmVzZXJ2ZWRDb250ZXh0cyA9PT0gbnVsbCB8fCBwcmVzZXJ2ZWRDb250ZXh0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJlc2VydmVkQ29udGV4dHMucHVzaCh1cGRhdGVkQ29udGV4dCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIHJlc29sdmVkQWN0aW9uT2JqZWN0ID0gdG9BY3Rpb25PYmplY3QoYWN0aW9uT2JqZWN0LCBtYWNoaW5lLm9wdGlvbnMuYWN0aW9ucyk7XG4gICAgICAgIHZhciBleGVjXzEgPSByZXNvbHZlZEFjdGlvbk9iamVjdC5leGVjO1xuXG4gICAgICAgIGlmIChwcmVkaWN0YWJsZUV4ZWMpIHtcbiAgICAgICAgICBwcmVkaWN0YWJsZUV4ZWMocmVzb2x2ZWRBY3Rpb25PYmplY3QsIHVwZGF0ZWRDb250ZXh0LCBfZXZlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGV4ZWNfMSAmJiBwcmVzZXJ2ZWRDb250ZXh0cykge1xuICAgICAgICAgIHZhciBjb250ZXh0SW5kZXhfMSA9IHByZXNlcnZlZENvbnRleHRzLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICB2YXIgd3JhcHBlZCA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXNvbHZlZEFjdGlvbk9iamVjdCksIHtcbiAgICAgICAgICAgIGV4ZWM6IGZ1bmN0aW9uIChfY3R4KSB7XG4gICAgICAgICAgICAgIHZhciBhcmdzID0gW107XG5cbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZXhlY18xLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbcHJlc2VydmVkQ29udGV4dHNbY29udGV4dEluZGV4XzFdXSwgX19yZWFkKGFyZ3MpLCBmYWxzZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmVzb2x2ZWRBY3Rpb25PYmplY3QgPSB3cmFwcGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkQWN0aW9uT2JqZWN0O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NCbG9jayhibG9jaykge1xuICAgIHZhciBlXzIsIF9hO1xuXG4gICAgdmFyIHJlc29sdmVkQWN0aW9ucyA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoYmxvY2suYWN0aW9ucyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgdmFyIGFjdGlvbiA9IF9jLnZhbHVlO1xuICAgICAgICB2YXIgcmVzb2x2ZWQgPSBoYW5kbGVBY3Rpb24oYmxvY2sudHlwZSwgYWN0aW9uKTtcblxuICAgICAgICBpZiAocmVzb2x2ZWQpIHtcbiAgICAgICAgICByZXNvbHZlZEFjdGlvbnMgPSByZXNvbHZlZEFjdGlvbnMuY29uY2F0KHJlc29sdmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVfMl8xKSB7XG4gICAgICBlXzIgPSB7XG4gICAgICAgIGVycm9yOiBlXzJfMVxuICAgICAgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRlZmVycmVkVG9CbG9ja0VuZC5mb3JFYWNoKGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgIHByZWRpY3RhYmxlRXhlYyhhY3Rpb24sIHVwZGF0ZWRDb250ZXh0LCBfZXZlbnQpO1xuICAgIH0pO1xuICAgIGRlZmVycmVkVG9CbG9ja0VuZC5sZW5ndGggPSAwO1xuICAgIHJldHVybiByZXNvbHZlZEFjdGlvbnM7XG4gIH1cblxuICB2YXIgcmVzb2x2ZWRBY3Rpb25zID0gZmxhdHRlbihhY3Rpb25CbG9ja3MubWFwKHByb2Nlc3NCbG9jaykpO1xuICByZXR1cm4gW3Jlc29sdmVkQWN0aW9ucywgdXBkYXRlZENvbnRleHRdO1xufVxuXG5leHBvcnQgeyBhZnRlciwgYXNzaWduLCBjYW5jZWwsIGNob29zZSwgZG9uZSwgZG9uZUludm9rZSwgZXJyb3IsIGVzY2FsYXRlLCBmb3J3YXJkVG8sIGdldEFjdGlvbkZ1bmN0aW9uLCBpbml0RXZlbnQsIGlzQWN0aW9uT2JqZWN0LCBsb2csIHB1cmUsIHJhaXNlLCByZXNvbHZlQWN0aW9ucywgcmVzb2x2ZUxvZywgcmVzb2x2ZVJhaXNlLCByZXNvbHZlU2VuZCwgcmVzb2x2ZVN0b3AsIHJlc3BvbmQsIHNlbmQsIHNlbmRQYXJlbnQsIHNlbmRUbywgc2VuZFVwZGF0ZSwgc3RhcnQsIHN0b3AsIHRvQWN0aW9uT2JqZWN0LCB0b0FjdGlvbk9iamVjdHMsIHRvQWN0aXZpdHlEZWZpbml0aW9uIH07XG4iLCJpbXBvcnQgeyBlcnJvciwgZG9uZUludm9rZSB9IGZyb20gJy4vYWN0aW9ucy5qcyc7XG5pbXBvcnQgeyB0b0FjdG9yUmVmIH0gZnJvbSAnLi9BY3Rvci5qcyc7XG5pbXBvcnQgeyB0b09ic2VydmVyIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8qKlxyXG4gKiBSZXR1cm5zIGFuIGFjdG9yIGJlaGF2aW9yIGZyb20gYSByZWR1Y2VyIGFuZCBpdHMgaW5pdGlhbCBzdGF0ZS5cclxuICpcclxuICogQHBhcmFtIHRyYW5zaXRpb24gVGhlIHB1cmUgcmVkdWNlciB0aGF0IHJldHVybnMgdGhlIG5leHQgc3RhdGUgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUgYW5kIGV2ZW50LlxyXG4gKiBAcGFyYW0gaW5pdGlhbFN0YXRlIFRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSByZWR1Y2VyLlxyXG4gKiBAcmV0dXJucyBBbiBhY3RvciBiZWhhdmlvclxyXG4gKi9cblxuZnVuY3Rpb24gZnJvbVJlZHVjZXIodHJhbnNpdGlvbiwgaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiB7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbixcbiAgICBpbml0aWFsU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xufVxuZnVuY3Rpb24gZnJvbVByb21pc2UocHJvbWlzZUZuKSB7XG4gIHZhciBpbml0aWFsU3RhdGUgPSB7XG4gICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgc3RhdHVzOiAncGVuZGluZydcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2l0aW9uOiBmdW5jdGlvbiAoc3RhdGUsIGV2ZW50LCBfYSkge1xuICAgICAgdmFyIHBhcmVudCA9IF9hLnBhcmVudCxcbiAgICAgICAgICBpZCA9IF9hLmlkLFxuICAgICAgICAgIG9ic2VydmVycyA9IF9hLm9ic2VydmVycztcblxuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2Z1bGZpbGwnOlxuICAgICAgICAgIHBhcmVudCA9PT0gbnVsbCB8fCBwYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmVudC5zZW5kKGRvbmVJbnZva2UoaWQsIGV2ZW50LmRhdGEpKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRhdGE6IGV2ZW50LmRhdGEsXG4gICAgICAgICAgICBzdGF0dXM6ICdmdWxmaWxsZWQnXG4gICAgICAgICAgfTtcblxuICAgICAgICBjYXNlICdyZWplY3QnOlxuICAgICAgICAgIHBhcmVudCA9PT0gbnVsbCB8fCBwYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmVudC5zZW5kKGVycm9yKGlkLCBldmVudC5lcnJvcikpO1xuICAgICAgICAgIG9ic2VydmVycy5mb3JFYWNoKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXZlbnQuZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjogZXZlbnQuZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdGF0dXM6ICdyZWplY3RlZCdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuICAgIH0sXG4gICAgaW5pdGlhbFN0YXRlOiBpbml0aWFsU3RhdGUsXG4gICAgc3RhcnQ6IGZ1bmN0aW9uIChfYSkge1xuICAgICAgdmFyIHNlbGYgPSBfYS5zZWxmO1xuICAgICAgcHJvbWlzZUZuKCkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBzZWxmLnNlbmQoe1xuICAgICAgICAgIHR5cGU6ICdmdWxmaWxsJyxcbiAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgIH0pO1xuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICBzZWxmLnNlbmQoe1xuICAgICAgICAgIHR5cGU6ICdyZWplY3QnLFxuICAgICAgICAgIGVycm9yOiByZWFzb25cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBpbml0aWFsU3RhdGU7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gc3Bhd25CZWhhdmlvcihiZWhhdmlvciwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIHN0YXRlID0gYmVoYXZpb3IuaW5pdGlhbFN0YXRlO1xuICB2YXIgb2JzZXJ2ZXJzID0gbmV3IFNldCgpO1xuICB2YXIgbWFpbGJveCA9IFtdO1xuICB2YXIgZmx1c2hpbmcgPSBmYWxzZTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGZsdXNoaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmx1c2hpbmcgPSB0cnVlO1xuXG4gICAgd2hpbGUgKG1haWxib3gubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGV2ZW50XzEgPSBtYWlsYm94LnNoaWZ0KCk7XG4gICAgICBzdGF0ZSA9IGJlaGF2aW9yLnRyYW5zaXRpb24oc3RhdGUsIGV2ZW50XzEsIGFjdG9yQ3R4KTtcbiAgICAgIG9ic2VydmVycy5mb3JFYWNoKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZXIubmV4dChzdGF0ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmbHVzaGluZyA9IGZhbHNlO1xuICB9O1xuXG4gIHZhciBhY3RvciA9IHRvQWN0b3JSZWYoe1xuICAgIGlkOiBvcHRpb25zLmlkLFxuICAgIHNlbmQ6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgbWFpbGJveC5wdXNoKGV2ZW50KTtcbiAgICAgIGZsdXNoKCk7XG4gICAgfSxcbiAgICBnZXRTbmFwc2hvdDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0sXG4gICAgc3Vic2NyaWJlOiBmdW5jdGlvbiAobmV4dCwgaGFuZGxlRXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgICB2YXIgb2JzZXJ2ZXIgPSB0b09ic2VydmVyKG5leHQsIGhhbmRsZUVycm9yLCBjb21wbGV0ZSk7XG4gICAgICBvYnNlcnZlcnMuYWRkKG9ic2VydmVyKTtcbiAgICAgIG9ic2VydmVyLm5leHQoc3RhdGUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdW5zdWJzY3JpYmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBvYnNlcnZlcnMuZGVsZXRlKG9ic2VydmVyKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xuICB2YXIgYWN0b3JDdHggPSB7XG4gICAgcGFyZW50OiBvcHRpb25zLnBhcmVudCxcbiAgICBzZWxmOiBhY3RvcixcbiAgICBpZDogb3B0aW9ucy5pZCB8fCAnYW5vbnltb3VzJyxcbiAgICBvYnNlcnZlcnM6IG9ic2VydmVyc1xuICB9O1xuICBzdGF0ZSA9IGJlaGF2aW9yLnN0YXJ0ID8gYmVoYXZpb3Iuc3RhcnQoYWN0b3JDdHgpIDogc3RhdGU7XG4gIHJldHVybiBhY3Rvcjtcbn1cblxuZXhwb3J0IHsgZnJvbVByb21pc2UsIGZyb21SZWR1Y2VyLCBzcGF3bkJlaGF2aW9yIH07XG4iLCJ2YXIgU1RBVEVfREVMSU1JVEVSID0gJy4nO1xudmFyIEVNUFRZX0FDVElWSVRZX01BUCA9IHt9O1xudmFyIERFRkFVTFRfR1VBUkRfVFlQRSA9ICd4c3RhdGUuZ3VhcmQnO1xudmFyIFRBUkdFVExFU1NfS0VZID0gJyc7XG5cbmV4cG9ydCB7IERFRkFVTFRfR1VBUkRfVFlQRSwgRU1QVFlfQUNUSVZJVFlfTUFQLCBTVEFURV9ERUxJTUlURVIsIFRBUkdFVExFU1NfS0VZIH07XG4iLCJpbXBvcnQgeyBJU19QUk9EVUNUSU9OIH0gZnJvbSAnLi9lbnZpcm9ubWVudC5qcyc7XG5cbmZ1bmN0aW9uIGdldEdsb2JhbCgpIHtcbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBnbG9iYWxUaGlzO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBzZWxmO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBnbG9iYWw7XG4gIH1cblxuICBpZiAoIUlTX1BST0RVQ1RJT04pIHtcbiAgICBjb25zb2xlLndhcm4oJ1hTdGF0ZSBjb3VsZCBub3QgZmluZCBhIGdsb2JhbCBvYmplY3QgaW4gdGhpcyBlbnZpcm9ubWVudC4gUGxlYXNlIGxldCB0aGUgbWFpbnRhaW5lcnMga25vdyBhbmQgcmFpc2UgYW4gaXNzdWUgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL3N0YXRlbHlhaS94c3RhdGUvaXNzdWVzJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGV2VG9vbHMoKSB7XG4gIHZhciBnbG9iYWwgPSBnZXRHbG9iYWwoKTtcblxuICBpZiAoZ2xvYmFsICYmICdfX3hzdGF0ZV9fJyBpbiBnbG9iYWwpIHtcbiAgICByZXR1cm4gZ2xvYmFsLl9feHN0YXRlX187XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclNlcnZpY2Uoc2VydmljZSkge1xuICBpZiAoIWdldEdsb2JhbCgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGRldlRvb2xzID0gZ2V0RGV2VG9vbHMoKTtcblxuICBpZiAoZGV2VG9vbHMpIHtcbiAgICBkZXZUb29scy5yZWdpc3RlcihzZXJ2aWNlKTtcbiAgfVxufVxuXG5leHBvcnQgeyBnZXRHbG9iYWwsIHJlZ2lzdGVyU2VydmljZSB9O1xuIiwidmFyIElTX1BST0RVQ1RJT04gPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nO1xuXG5leHBvcnQgeyBJU19QUk9EVUNUSU9OIH07XG4iLCJpbXBvcnQgeyBfX3ZhbHVlcywgX19zcHJlYWRBcnJheSwgX19yZWFkLCBfX2Fzc2lnbiB9IGZyb20gJy4vX3ZpcnR1YWwvX3RzbGliLmpzJztcbmltcG9ydCB7IFNwZWNpYWxUYXJnZXRzLCBBY3Rpb25UeXBlcyB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNTdGF0ZUNvbmZpZywgU3RhdGUsIGJpbmRBY3Rpb25Ub1N0YXRlIH0gZnJvbSAnLi9TdGF0ZS5qcyc7XG5pbXBvcnQgeyBlcnJvclBsYXRmb3JtLCB1cGRhdGUsIGVycm9yIGFzIGVycm9yJDEsIGxvZywgc3RvcCwgc3RhcnQsIGNhbmNlbCwgc2VuZCwgcmFpc2UgfSBmcm9tICcuL2FjdGlvblR5cGVzLmpzJztcbmltcG9ydCB7IGluaXRFdmVudCwgZG9uZUludm9rZSwgdG9BY3Rpb25PYmplY3RzLCByZXNvbHZlQWN0aW9ucywgZXJyb3IsIGdldEFjdGlvbkZ1bmN0aW9uIH0gZnJvbSAnLi9hY3Rpb25zLmpzJztcbmltcG9ydCB7IElTX1BST0RVQ1RJT04gfSBmcm9tICcuL2Vudmlyb25tZW50LmpzJztcbmltcG9ydCB7IHdhcm4sIG1hcENvbnRleHQsIHRvT2JzZXJ2ZXIsIGlzRnVuY3Rpb24sIHRvU0NYTUxFdmVudCwgZmxhdHRlbiwgaXNSYWlzYWJsZUFjdGlvbiwgaXNQcm9taXNlTGlrZSwgaXNPYnNlcnZhYmxlLCBpc01hY2hpbmUsIGlzQmVoYXZpb3IsIHJlcG9ydFVuaGFuZGxlZEV4Y2VwdGlvbk9uSW52b2NhdGlvbiwgc3ltYm9sT2JzZXJ2YWJsZSwgaXNBcnJheSwgdG9FdmVudE9iamVjdCwgaXNTdHJpbmcsIGlzQWN0b3IsIHRvSW52b2tlU291cmNlLCB1bmlxdWVJZCB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgU2NoZWR1bGVyIH0gZnJvbSAnLi9zY2hlZHVsZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlRGVmZXJyZWRBY3RvciwgaXNTcGF3bmVkQWN0b3IgfSBmcm9tICcuL0FjdG9yLmpzJztcbmltcG9ydCB7IHJlZ2lzdHJ5IH0gZnJvbSAnLi9yZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWwsIHJlZ2lzdGVyU2VydmljZSB9IGZyb20gJy4vZGV2VG9vbHMuanMnO1xuaW1wb3J0IHsgcHJvdmlkZSwgY29uc3VtZSB9IGZyb20gJy4vc2VydmljZVNjb3BlLmpzJztcbmltcG9ydCB7IHNwYXduQmVoYXZpb3IgfSBmcm9tICcuL2JlaGF2aW9ycy5qcyc7XG5cbnZhciBERUZBVUxUX1NQQVdOX09QVElPTlMgPSB7XG4gIHN5bmM6IGZhbHNlLFxuICBhdXRvRm9yd2FyZDogZmFsc2Vcbn07XG52YXIgSW50ZXJwcmV0ZXJTdGF0dXM7XG5cbihmdW5jdGlvbiAoSW50ZXJwcmV0ZXJTdGF0dXMpIHtcbiAgSW50ZXJwcmV0ZXJTdGF0dXNbSW50ZXJwcmV0ZXJTdGF0dXNbXCJOb3RTdGFydGVkXCJdID0gMF0gPSBcIk5vdFN0YXJ0ZWRcIjtcbiAgSW50ZXJwcmV0ZXJTdGF0dXNbSW50ZXJwcmV0ZXJTdGF0dXNbXCJSdW5uaW5nXCJdID0gMV0gPSBcIlJ1bm5pbmdcIjtcbiAgSW50ZXJwcmV0ZXJTdGF0dXNbSW50ZXJwcmV0ZXJTdGF0dXNbXCJTdG9wcGVkXCJdID0gMl0gPSBcIlN0b3BwZWRcIjtcbn0pKEludGVycHJldGVyU3RhdHVzIHx8IChJbnRlcnByZXRlclN0YXR1cyA9IHt9KSk7XG5cbnZhciBJbnRlcnByZXRlciA9XG4vKiNfX1BVUkVfXyovXG5cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG5ldyBJbnRlcnByZXRlciBpbnN0YW5jZSAoaS5lLiwgc2VydmljZSkgZm9yIHRoZSBnaXZlbiBtYWNoaW5lIHdpdGggdGhlIHByb3ZpZGVkIG9wdGlvbnMsIGlmIGFueS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBtYWNoaW5lIFRoZSBtYWNoaW5lIHRvIGJlIGludGVycHJldGVkXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgSW50ZXJwcmV0ZXIgb3B0aW9uc1xyXG4gICAqL1xuICBmdW5jdGlvbiBJbnRlcnByZXRlcihtYWNoaW5lLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IEludGVycHJldGVyLmRlZmF1bHRPcHRpb25zO1xuICAgIH1cblxuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLm1hY2hpbmUgPSBtYWNoaW5lO1xuICAgIHRoaXMuZGVsYXllZEV2ZW50c01hcCA9IHt9O1xuICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuY29udGV4dExpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnN0b3BMaXN0ZW5lcnMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5kb25lTGlzdGVuZXJzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5zZW5kTGlzdGVuZXJzID0gbmV3IFNldCgpO1xuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGUgc2VydmljZSBpcyBzdGFydGVkLlxyXG4gICAgICovXG5cbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgdGhpcy5zdGF0dXMgPSBJbnRlcnByZXRlclN0YXR1cy5Ob3RTdGFydGVkO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5mb3J3YXJkVG8gPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5fb3V0Z29pbmdRdWV1ZSA9IFtdO1xuICAgIC8qKlxyXG4gICAgICogQWxpYXMgZm9yIEludGVycHJldGVyLnByb3RvdHlwZS5zdGFydFxyXG4gICAgICovXG5cbiAgICB0aGlzLmluaXQgPSB0aGlzLnN0YXJ0O1xuICAgIC8qKlxyXG4gICAgICogU2VuZHMgYW4gZXZlbnQgdG8gdGhlIHJ1bm5pbmcgaW50ZXJwcmV0ZXIgdG8gdHJpZ2dlciBhIHRyYW5zaXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQW4gYXJyYXkgb2YgZXZlbnRzIChiYXRjaGVkKSBjYW4gYmUgc2VudCBhcyB3ZWxsLCB3aGljaCB3aWxsIHNlbmQgYWxsXHJcbiAgICAgKiBiYXRjaGVkIGV2ZW50cyB0byB0aGUgcnVubmluZyBpbnRlcnByZXRlci4gVGhlIGxpc3RlbmVycyB3aWxsIGJlXHJcbiAgICAgKiBub3RpZmllZCBvbmx5ICoqb25jZSoqIHdoZW4gYWxsIGV2ZW50cyBhcmUgcHJvY2Vzc2VkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQocykgdG8gc2VuZFxyXG4gICAgICovXG5cbiAgICB0aGlzLnNlbmQgPSBmdW5jdGlvbiAoZXZlbnQsIHBheWxvYWQpIHtcbiAgICAgIGlmIChpc0FycmF5KGV2ZW50KSkge1xuICAgICAgICBfdGhpcy5iYXRjaChldmVudCk7XG5cbiAgICAgICAgcmV0dXJuIF90aGlzLnN0YXRlO1xuICAgICAgfVxuXG4gICAgICB2YXIgX2V2ZW50ID0gdG9TQ1hNTEV2ZW50KHRvRXZlbnRPYmplY3QoZXZlbnQsIHBheWxvYWQpKTtcblxuICAgICAgaWYgKF90aGlzLnN0YXR1cyA9PT0gSW50ZXJwcmV0ZXJTdGF0dXMuU3RvcHBlZCkge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIGlmICghSVNfUFJPRFVDVElPTikge1xuICAgICAgICAgIHdhcm4oZmFsc2UsIFwiRXZlbnQgXFxcIlwiLmNvbmNhdChfZXZlbnQubmFtZSwgXCJcXFwiIHdhcyBzZW50IHRvIHN0b3BwZWQgc2VydmljZSBcXFwiXCIpLmNvbmNhdChfdGhpcy5tYWNoaW5lLmlkLCBcIlxcXCIuIFRoaXMgc2VydmljZSBoYXMgYWxyZWFkeSByZWFjaGVkIGl0cyBmaW5hbCBzdGF0ZSwgYW5kIHdpbGwgbm90IHRyYW5zaXRpb24uXFxuRXZlbnQ6IFwiKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkoX2V2ZW50LmRhdGEpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX3RoaXMuc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5zdGF0dXMgIT09IEludGVycHJldGVyU3RhdHVzLlJ1bm5pbmcgJiYgIV90aGlzLm9wdGlvbnMuZGVmZXJFdmVudHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXZlbnQgXFxcIlwiLmNvbmNhdChfZXZlbnQubmFtZSwgXCJcXFwiIHdhcyBzZW50IHRvIHVuaW5pdGlhbGl6ZWQgc2VydmljZSBcXFwiXCIpLmNvbmNhdChfdGhpcy5tYWNoaW5lLmlkIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgLCBcIlxcXCIuIE1ha2Ugc3VyZSAuc3RhcnQoKSBpcyBjYWxsZWQgZm9yIHRoaXMgc2VydmljZSwgb3Igc2V0IHsgZGVmZXJFdmVudHM6IHRydWUgfSBpbiB0aGUgc2VydmljZSBvcHRpb25zLlxcbkV2ZW50OiBcIikuY29uY2F0KEpTT04uc3RyaW5naWZ5KF9ldmVudC5kYXRhKSkpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5zY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBGb3J3YXJkIGNvcHkgb2YgZXZlbnQgdG8gY2hpbGQgYWN0b3JzXG4gICAgICAgIF90aGlzLmZvcndhcmQoX2V2ZW50KTtcblxuICAgICAgICB2YXIgbmV4dFN0YXRlID0gX3RoaXMuX25leHRTdGF0ZShfZXZlbnQpO1xuXG4gICAgICAgIF90aGlzLnVwZGF0ZShuZXh0U3RhdGUsIF9ldmVudCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIF90aGlzLl9zdGF0ZTsgLy8gVE9ETzogZGVwcmVjYXRlIChzaG91bGQgcmV0dXJuIHZvaWQpXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c2VtaWNvbG9uXG4gICAgfTtcblxuICAgIHRoaXMuc2VuZFRvID0gZnVuY3Rpb24gKGV2ZW50LCB0bywgaW1tZWRpYXRlKSB7XG4gICAgICB2YXIgaXNQYXJlbnQgPSBfdGhpcy5wYXJlbnQgJiYgKHRvID09PSBTcGVjaWFsVGFyZ2V0cy5QYXJlbnQgfHwgX3RoaXMucGFyZW50LmlkID09PSB0byk7XG4gICAgICB2YXIgdGFyZ2V0ID0gaXNQYXJlbnQgPyBfdGhpcy5wYXJlbnQgOiBpc1N0cmluZyh0bykgPyB0byA9PT0gU3BlY2lhbFRhcmdldHMuSW50ZXJuYWwgPyBfdGhpcyA6IF90aGlzLmNoaWxkcmVuLmdldCh0bykgfHwgcmVnaXN0cnkuZ2V0KHRvKSA6IGlzQWN0b3IodG8pID8gdG8gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgIGlmICghaXNQYXJlbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gc2VuZCBldmVudCB0byBjaGlsZCAnXCIuY29uY2F0KHRvLCBcIicgZnJvbSBzZXJ2aWNlICdcIikuY29uY2F0KF90aGlzLmlkLCBcIicuXCIpKTtcbiAgICAgICAgfSAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxuXG5cbiAgICAgICAgaWYgKCFJU19QUk9EVUNUSU9OKSB7XG4gICAgICAgICAgd2FybihmYWxzZSwgXCJTZXJ2aWNlICdcIi5jb25jYXQoX3RoaXMuaWQsIFwiJyBoYXMgbm8gcGFyZW50OiB1bmFibGUgdG8gc2VuZCBldmVudCBcIikuY29uY2F0KGV2ZW50LnR5cGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCdtYWNoaW5lJyBpbiB0YXJnZXQpIHtcbiAgICAgICAgLy8gcGVyaGFwcyB0aG9zZSBldmVudHMgc2hvdWxkIGJlIHJlamVjdGVkIGluIHRoZSBwYXJlbnRcbiAgICAgICAgLy8gYnV0IGF0bSBpdCBkb2Vzbid0IGhhdmUgZWFzeSBhY2Nlc3MgdG8gYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGlzIHJlcXVpcmVkIHRvIGRvIGl0IHJlbGlhYmx5XG4gICAgICAgIGlmIChfdGhpcy5zdGF0dXMgIT09IEludGVycHJldGVyU3RhdHVzLlN0b3BwZWQgfHwgX3RoaXMucGFyZW50ICE9PSB0YXJnZXQgfHwgLy8gd2UgbmVlZCB0byBzZW5kIGV2ZW50cyB0byB0aGUgcGFyZW50IGZyb20gZXhpdCBoYW5kbGVycyBvZiBhIG1hY2hpbmUgdGhhdCByZWFjaGVkIGl0cyBmaW5hbCBzdGF0ZVxuICAgICAgICBfdGhpcy5zdGF0ZS5kb25lKSB7XG4gICAgICAgICAgLy8gU2VuZCBTQ1hNTCBldmVudHMgdG8gbWFjaGluZXNcbiAgICAgICAgICB2YXIgc2N4bWxFdmVudCA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBldmVudCksIHtcbiAgICAgICAgICAgIG5hbWU6IGV2ZW50Lm5hbWUgPT09IGVycm9yJDEgPyBcIlwiLmNvbmNhdChlcnJvcihfdGhpcy5pZCkpIDogZXZlbnQubmFtZSxcbiAgICAgICAgICAgIG9yaWdpbjogX3RoaXMuc2Vzc2lvbklkXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIWltbWVkaWF0ZSAmJiBfdGhpcy5tYWNoaW5lLmNvbmZpZy5wcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50cykge1xuICAgICAgICAgICAgX3RoaXMuX291dGdvaW5nUXVldWUucHVzaChbdGFyZ2V0LCBzY3htbEV2ZW50XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldC5zZW5kKHNjeG1sRXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2VuZCBub3JtYWwgZXZlbnRzIHRvIG90aGVyIHRhcmdldHNcbiAgICAgICAgaWYgKCFpbW1lZGlhdGUgJiYgX3RoaXMubWFjaGluZS5jb25maWcucHJlZGljdGFibGVBY3Rpb25Bcmd1bWVudHMpIHtcbiAgICAgICAgICBfdGhpcy5fb3V0Z29pbmdRdWV1ZS5wdXNoKFt0YXJnZXQsIGV2ZW50LmRhdGFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuc2VuZChldmVudC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLl9leGVjID0gZnVuY3Rpb24gKGFjdGlvbiwgY29udGV4dCwgX2V2ZW50LCBhY3Rpb25GdW5jdGlvbk1hcCkge1xuICAgICAgaWYgKGFjdGlvbkZ1bmN0aW9uTWFwID09PSB2b2lkIDApIHtcbiAgICAgICAgYWN0aW9uRnVuY3Rpb25NYXAgPSBfdGhpcy5tYWNoaW5lLm9wdGlvbnMuYWN0aW9ucztcbiAgICAgIH1cblxuICAgICAgdmFyIGFjdGlvbk9yRXhlYyA9IGFjdGlvbi5leGVjIHx8IGdldEFjdGlvbkZ1bmN0aW9uKGFjdGlvbi50eXBlLCBhY3Rpb25GdW5jdGlvbk1hcCk7XG4gICAgICB2YXIgZXhlYyA9IGlzRnVuY3Rpb24oYWN0aW9uT3JFeGVjKSA/IGFjdGlvbk9yRXhlYyA6IGFjdGlvbk9yRXhlYyA/IGFjdGlvbk9yRXhlYy5leGVjIDogYWN0aW9uLmV4ZWM7XG5cbiAgICAgIGlmIChleGVjKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGV4ZWMoY29udGV4dCwgX2V2ZW50LmRhdGEsICFfdGhpcy5tYWNoaW5lLmNvbmZpZy5wcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50cyA/IHtcbiAgICAgICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICAgICAgc3RhdGU6IF90aGlzLnN0YXRlLFxuICAgICAgICAgICAgX2V2ZW50OiBfZXZlbnRcbiAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgICAgICBfZXZlbnQ6IF9ldmVudFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoX3RoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBfdGhpcy5wYXJlbnQuc2VuZCh7XG4gICAgICAgICAgICAgIHR5cGU6ICd4c3RhdGUuZXJyb3InLFxuICAgICAgICAgICAgICBkYXRhOiBlcnJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgcmFpc2U6XG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gaWYgcmFpc2UgYWN0aW9uIHJlYWNoZWQgdGhlIGludGVycHJldGVyIHRoZW4gaXQncyBhIGRlbGF5ZWQgb25lXG4gICAgICAgICAgICB2YXIgc2VuZEFjdGlvbl8xID0gYWN0aW9uO1xuXG4gICAgICAgICAgICBfdGhpcy5kZWZlcihzZW5kQWN0aW9uXzEpO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBzZW5kOlxuICAgICAgICAgIHZhciBzZW5kQWN0aW9uID0gYWN0aW9uO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBzZW5kQWN0aW9uLmRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgX3RoaXMuZGVmZXIoc2VuZEFjdGlvbik7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNlbmRBY3Rpb24udG8pIHtcbiAgICAgICAgICAgICAgX3RoaXMuc2VuZFRvKHNlbmRBY3Rpb24uX2V2ZW50LCBzZW5kQWN0aW9uLnRvLCBfZXZlbnQgPT09IGluaXRFdmVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBfdGhpcy5zZW5kKHNlbmRBY3Rpb24uX2V2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIGNhbmNlbDpcbiAgICAgICAgICBfdGhpcy5jYW5jZWwoYWN0aW9uLnNlbmRJZCk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIHN0YXJ0OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5zdGF0dXMgIT09IEludGVycHJldGVyU3RhdHVzLlJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYWN0aXZpdHkgPSBhY3Rpb24uYWN0aXZpdHk7IC8vIElmIHRoZSBhY3Rpdml0eSB3aWxsIGJlIHN0b3BwZWQgcmlnaHQgYWZ0ZXIgaXQncyBzdGFydGVkXG4gICAgICAgICAgICAvLyAoc3VjaCBhcyBpbiB0cmFuc2llbnQgc3RhdGVzKVxuICAgICAgICAgICAgLy8gZG9uJ3QgYm90aGVyIHN0YXJ0aW5nIHRoZSBhY3Rpdml0eS5cblxuICAgICAgICAgICAgaWYgKCAvLyBpbiB2NCB3aXRoIGBwcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50c2AgaW52b2tlcyBhcmUgY2FsbGVkIGVhZ2VybHkgd2hlbiB0aGUgYHRoaXMuc3RhdGVgIHN0aWxsIHBvaW50cyB0byB0aGUgcHJldmlvdXMgc3RhdGVcbiAgICAgICAgICAgICFfdGhpcy5tYWNoaW5lLmNvbmZpZy5wcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50cyAmJiAhX3RoaXMuc3RhdGUuYWN0aXZpdGllc1thY3Rpdml0eS5pZCB8fCBhY3Rpdml0eS50eXBlXSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gLy8gSW52b2tlZCBzZXJ2aWNlc1xuXG5cbiAgICAgICAgICAgIGlmIChhY3Rpdml0eS50eXBlID09PSBBY3Rpb25UeXBlcy5JbnZva2UpIHtcbiAgICAgICAgICAgICAgdmFyIGludm9rZVNvdXJjZSA9IHRvSW52b2tlU291cmNlKGFjdGl2aXR5LnNyYyk7XG4gICAgICAgICAgICAgIHZhciBzZXJ2aWNlQ3JlYXRvciA9IF90aGlzLm1hY2hpbmUub3B0aW9ucy5zZXJ2aWNlcyA/IF90aGlzLm1hY2hpbmUub3B0aW9ucy5zZXJ2aWNlc1tpbnZva2VTb3VyY2UudHlwZV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIHZhciBpZCA9IGFjdGl2aXR5LmlkLFxuICAgICAgICAgICAgICAgICAgZGF0YSA9IGFjdGl2aXR5LmRhdGE7XG5cbiAgICAgICAgICAgICAgaWYgKCFJU19QUk9EVUNUSU9OKSB7XG4gICAgICAgICAgICAgICAgd2FybighKCdmb3J3YXJkJyBpbiBhY3Rpdml0eSksIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICBcImBmb3J3YXJkYCBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkIChmb3VuZCBpbiBpbnZvY2F0aW9uIG9mICdcIi5jb25jYXQoYWN0aXZpdHkuc3JjLCBcIicgaW4gaW4gbWFjaGluZSAnXCIpLmNvbmNhdChfdGhpcy5tYWNoaW5lLmlkLCBcIicpLiBcIikgKyBcIlBsZWFzZSB1c2UgYGF1dG9Gb3J3YXJkYCBpbnN0ZWFkLlwiKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBhdXRvRm9yd2FyZCA9ICdhdXRvRm9yd2FyZCcgaW4gYWN0aXZpdHkgPyBhY3Rpdml0eS5hdXRvRm9yd2FyZCA6ICEhYWN0aXZpdHkuZm9yd2FyZDtcblxuICAgICAgICAgICAgICBpZiAoIXNlcnZpY2VDcmVhdG9yKSB7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICBpZiAoIUlTX1BST0RVQ1RJT04pIHtcbiAgICAgICAgICAgICAgICAgIHdhcm4oZmFsc2UsIFwiTm8gc2VydmljZSBmb3VuZCBmb3IgaW52b2NhdGlvbiAnXCIuY29uY2F0KGFjdGl2aXR5LnNyYywgXCInIGluIG1hY2hpbmUgJ1wiKS5jb25jYXQoX3RoaXMubWFjaGluZS5pZCwgXCInLlwiKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIHJlc29sdmVkRGF0YSA9IGRhdGEgPyBtYXBDb250ZXh0KGRhdGEsIGNvbnRleHQsIF9ldmVudCkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXJ2aWNlQ3JlYXRvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiB3YXJuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGlzRnVuY3Rpb24oc2VydmljZUNyZWF0b3IpID8gc2VydmljZUNyZWF0b3IoY29udGV4dCwgX2V2ZW50LmRhdGEsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiByZXNvbHZlZERhdGEsXG4gICAgICAgICAgICAgICAgc3JjOiBpbnZva2VTb3VyY2UsXG4gICAgICAgICAgICAgICAgbWV0YTogYWN0aXZpdHkubWV0YVxuICAgICAgICAgICAgICB9KSA6IHNlcnZpY2VDcmVhdG9yO1xuXG4gICAgICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogd2Fybj9cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHZvaWQgMDtcblxuICAgICAgICAgICAgICBpZiAoaXNNYWNoaW5lKHNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2UgPSByZXNvbHZlZERhdGEgPyBzb3VyY2Uud2l0aENvbnRleHQocmVzb2x2ZWREYXRhKSA6IHNvdXJjZTtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgYXV0b0ZvcndhcmQ6IGF1dG9Gb3J3YXJkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIF90aGlzLnNwYXduKHNvdXJjZSwgaWQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX3RoaXMuc3Bhd25BY3Rpdml0eShhY3Rpdml0eSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIHN0b3A6XG4gICAgICAgICAge1xuICAgICAgICAgICAgX3RoaXMuc3RvcENoaWxkKGFjdGlvbi5hY3Rpdml0eS5pZCk7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIGxvZzpcbiAgICAgICAgICB2YXIgX2EgPSBhY3Rpb24sXG4gICAgICAgICAgICAgIGxhYmVsID0gX2EubGFiZWwsXG4gICAgICAgICAgICAgIHZhbHVlID0gX2EudmFsdWU7XG5cbiAgICAgICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgICAgIF90aGlzLmxvZ2dlcihsYWJlbCwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy5sb2dnZXIodmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFJU19QUk9EVUNUSU9OKSB7XG4gICAgICAgICAgICB3YXJuKGZhbHNlLCBcIk5vIGltcGxlbWVudGF0aW9uIGZvdW5kIGZvciBhY3Rpb24gdHlwZSAnXCIuY29uY2F0KGFjdGlvbi50eXBlLCBcIidcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgcmVzb2x2ZWRPcHRpb25zID0gX19hc3NpZ24oX19hc3NpZ24oe30sIEludGVycHJldGVyLmRlZmF1bHRPcHRpb25zKSwgb3B0aW9ucyk7XG5cbiAgICB2YXIgY2xvY2sgPSByZXNvbHZlZE9wdGlvbnMuY2xvY2ssXG4gICAgICAgIGxvZ2dlciA9IHJlc29sdmVkT3B0aW9ucy5sb2dnZXIsXG4gICAgICAgIHBhcmVudCA9IHJlc29sdmVkT3B0aW9ucy5wYXJlbnQsXG4gICAgICAgIGlkID0gcmVzb2x2ZWRPcHRpb25zLmlkO1xuICAgIHZhciByZXNvbHZlZElkID0gaWQgIT09IHVuZGVmaW5lZCA/IGlkIDogbWFjaGluZS5pZDtcbiAgICB0aGlzLmlkID0gcmVzb2x2ZWRJZDtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgICB0aGlzLmNsb2NrID0gY2xvY2s7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gcmVzb2x2ZWRPcHRpb25zO1xuICAgIHRoaXMuc2NoZWR1bGVyID0gbmV3IFNjaGVkdWxlcih7XG4gICAgICBkZWZlckV2ZW50czogdGhpcy5vcHRpb25zLmRlZmVyRXZlbnRzXG4gICAgfSk7XG4gICAgdGhpcy5zZXNzaW9uSWQgPSByZWdpc3RyeS5ib29rSWQoKTtcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnRlcnByZXRlci5wcm90b3R5cGUsIFwiaW5pdGlhbFN0YXRlXCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLl9pbml0aWFsU3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRpYWxTdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb3ZpZGUodGhpcywgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5faW5pdGlhbFN0YXRlID0gX3RoaXMubWFjaGluZS5pbml0aWFsU3RhdGU7XG4gICAgICAgIHJldHVybiBfdGhpcy5faW5pdGlhbFN0YXRlO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnRlcnByZXRlci5wcm90b3R5cGUsIFwic3RhdGVcIiwge1xuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGAuZ2V0U25hcHNob3QoKWAgaW5zdGVhZC5cclxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFJU19QUk9EVUNUSU9OKSB7XG4gICAgICAgIHdhcm4odGhpcy5zdGF0dXMgIT09IEludGVycHJldGVyU3RhdHVzLk5vdFN0YXJ0ZWQsIFwiQXR0ZW1wdGVkIHRvIHJlYWQgc3RhdGUgZnJvbSB1bmluaXRpYWxpemVkIHNlcnZpY2UgJ1wiLmNvbmNhdCh0aGlzLmlkLCBcIicuIE1ha2Ugc3VyZSB0aGUgc2VydmljZSBpcyBzdGFydGVkIGZpcnN0LlwiKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgLyoqXHJcbiAgICogRXhlY3V0ZXMgdGhlIGFjdGlvbnMgb2YgdGhlIGdpdmVuIHN0YXRlLCB3aXRoIHRoYXQgc3RhdGUncyBgY29udGV4dGAgYW5kIGBldmVudGAuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIHdob3NlIGFjdGlvbnMgd2lsbCBiZSBleGVjdXRlZFxyXG4gICAqIEBwYXJhbSBhY3Rpb25zQ29uZmlnIFRoZSBhY3Rpb24gaW1wbGVtZW50YXRpb25zIHRvIHVzZVxyXG4gICAqL1xuXG4gIEludGVycHJldGVyLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb25zQ29uZmlnKSB7XG4gICAgdmFyIGVfMSwgX2E7XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhzdGF0ZS5hY3Rpb25zKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICB2YXIgYWN0aW9uID0gX2MudmFsdWU7XG4gICAgICAgIHRoaXMuZXhlYyhhY3Rpb24sIHN0YXRlLCBhY3Rpb25zQ29uZmlnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlXzFfMSkge1xuICAgICAgZV8xID0ge1xuICAgICAgICBlcnJvcjogZV8xXzFcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgSW50ZXJwcmV0ZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgX2V2ZW50KSB7XG4gICAgdmFyIGVfMiwgX2EsIGVfMywgX2IsIGVfNCwgX2MsIGVfNSwgX2Q7XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzOyAvLyBBdHRhY2ggc2Vzc2lvbiBJRCB0byBzdGF0ZVxuXG5cbiAgICBzdGF0ZS5fc2Vzc2lvbmlkID0gdGhpcy5zZXNzaW9uSWQ7IC8vIFVwZGF0ZSBzdGF0ZVxuXG4gICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTsgLy8gRXhlY3V0ZSBhY3Rpb25zXG5cbiAgICBpZiAoKCF0aGlzLm1hY2hpbmUuY29uZmlnLnByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzIHx8IC8vIHRoaXMgaXMgY3VycmVudGx5IHJlcXVpcmVkIHRvIGV4ZWN1dGUgaW5pdGlhbCBhY3Rpb25zIGFzIHRoZSBgaW5pdGlhbFN0YXRlYCBnZXRzIGNhY2hlZFxuICAgIC8vIHdlIGNhbid0IGp1c3QgcmVjb21wdXRlIGl0IChhbmQgZXhlY3V0ZSBhY3Rpb25zIHdoaWxlIGRvaW5nIHNvKSBiZWNhdXNlIHdlIHRyeSB0byBwcmVzZXJ2ZSBpZGVudGl0eSBvZiBhY3RvcnMgY3JlYXRlZCB3aXRoaW4gaW5pdGlhbCBhc3NpZ25zXG4gICAgX2V2ZW50ID09PSBpbml0RXZlbnQpICYmIHRoaXMub3B0aW9ucy5leGVjdXRlKSB7XG4gICAgICB0aGlzLmV4ZWN1dGUodGhpcy5zdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpdGVtID0gdm9pZCAwO1xuXG4gICAgICB3aGlsZSAoaXRlbSA9IHRoaXMuX291dGdvaW5nUXVldWUuc2hpZnQoKSkge1xuICAgICAgICBpdGVtWzBdLnNlbmQoaXRlbVsxXSk7XG4gICAgICB9XG4gICAgfSAvLyBVcGRhdGUgY2hpbGRyZW5cblxuXG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgX3RoaXMuc3RhdGUuY2hpbGRyZW5bY2hpbGQuaWRdID0gY2hpbGQ7XG4gICAgfSk7IC8vIERldiB0b29sc1xuXG4gICAgaWYgKHRoaXMuZGV2VG9vbHMpIHtcbiAgICAgIHRoaXMuZGV2VG9vbHMuc2VuZChfZXZlbnQuZGF0YSwgc3RhdGUpO1xuICAgIH0gLy8gRXhlY3V0ZSBsaXN0ZW5lcnNcblxuXG4gICAgaWYgKHN0YXRlLmV2ZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfZSA9IF9fdmFsdWVzKHRoaXMuZXZlbnRMaXN0ZW5lcnMpLCBfZiA9IF9lLm5leHQoKTsgIV9mLmRvbmU7IF9mID0gX2UubmV4dCgpKSB7XG4gICAgICAgICAgdmFyIGxpc3RlbmVyID0gX2YudmFsdWU7XG4gICAgICAgICAgbGlzdGVuZXIoc3RhdGUuZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlXzJfMSkge1xuICAgICAgICBlXzIgPSB7XG4gICAgICAgICAgZXJyb3I6IGVfMl8xXG4gICAgICAgIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChfZiAmJiAhX2YuZG9uZSAmJiAoX2EgPSBfZS5yZXR1cm4pKSBfYS5jYWxsKF9lKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgX2cgPSBfX3ZhbHVlcyh0aGlzLmxpc3RlbmVycyksIF9oID0gX2cubmV4dCgpOyAhX2guZG9uZTsgX2ggPSBfZy5uZXh0KCkpIHtcbiAgICAgICAgdmFyIGxpc3RlbmVyID0gX2gudmFsdWU7XG4gICAgICAgIGxpc3RlbmVyKHN0YXRlLCBzdGF0ZS5ldmVudCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZV8zXzEpIHtcbiAgICAgIGVfMyA9IHtcbiAgICAgICAgZXJyb3I6IGVfM18xXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoX2ggJiYgIV9oLmRvbmUgJiYgKF9iID0gX2cucmV0dXJuKSkgX2IuY2FsbChfZyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoZV8zKSB0aHJvdyBlXzMuZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9qID0gX192YWx1ZXModGhpcy5jb250ZXh0TGlzdGVuZXJzKSwgX2sgPSBfai5uZXh0KCk7ICFfay5kb25lOyBfayA9IF9qLm5leHQoKSkge1xuICAgICAgICB2YXIgY29udGV4dExpc3RlbmVyID0gX2sudmFsdWU7XG4gICAgICAgIGNvbnRleHRMaXN0ZW5lcih0aGlzLnN0YXRlLmNvbnRleHQsIHRoaXMuc3RhdGUuaGlzdG9yeSA/IHRoaXMuc3RhdGUuaGlzdG9yeS5jb250ZXh0IDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlXzRfMSkge1xuICAgICAgZV80ID0ge1xuICAgICAgICBlcnJvcjogZV80XzFcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChfayAmJiAhX2suZG9uZSAmJiAoX2MgPSBfai5yZXR1cm4pKSBfYy5jYWxsKF9qKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlXzQpIHRocm93IGVfNC5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5kb25lKSB7XG4gICAgICAvLyBnZXQgZmluYWwgY2hpbGQgc3RhdGUgbm9kZVxuICAgICAgdmFyIGZpbmFsQ2hpbGRTdGF0ZU5vZGUgPSBzdGF0ZS5jb25maWd1cmF0aW9uLmZpbmQoZnVuY3Rpb24gKHNuKSB7XG4gICAgICAgIHJldHVybiBzbi50eXBlID09PSAnZmluYWwnICYmIHNuLnBhcmVudCA9PT0gX3RoaXMubWFjaGluZTtcbiAgICAgIH0pO1xuICAgICAgdmFyIGRvbmVEYXRhID0gZmluYWxDaGlsZFN0YXRlTm9kZSAmJiBmaW5hbENoaWxkU3RhdGVOb2RlLmRvbmVEYXRhID8gbWFwQ29udGV4dChmaW5hbENoaWxkU3RhdGVOb2RlLmRvbmVEYXRhLCBzdGF0ZS5jb250ZXh0LCBfZXZlbnQpIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZG9uZUV2ZW50ID0gZG9uZUludm9rZSh0aGlzLmlkLCBkb25lRGF0YSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIF9sID0gX192YWx1ZXModGhpcy5kb25lTGlzdGVuZXJzKSwgX20gPSBfbC5uZXh0KCk7ICFfbS5kb25lOyBfbSA9IF9sLm5leHQoKSkge1xuICAgICAgICAgIHZhciBsaXN0ZW5lciA9IF9tLnZhbHVlO1xuICAgICAgICAgIGxpc3RlbmVyKHRoaXMuX2RvbmVFdmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVfNV8xKSB7XG4gICAgICAgIGVfNSA9IHtcbiAgICAgICAgICBlcnJvcjogZV81XzFcbiAgICAgICAgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKF9tICYmICFfbS5kb25lICYmIChfZCA9IF9sLnJldHVybikpIF9kLmNhbGwoX2wpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChlXzUpIHRocm93IGVfNS5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9zdG9wKCk7XG5cbiAgICAgIHRoaXMuX3N0b3BDaGlsZHJlbigpO1xuXG4gICAgICByZWdpc3RyeS5mcmVlKHRoaXMuc2Vzc2lvbklkKTtcbiAgICB9XG4gIH07XG4gIC8qXHJcbiAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgaXMgbm90aWZpZWQgd2hlbmV2ZXIgYSBzdGF0ZSB0cmFuc2l0aW9uIGhhcHBlbnMuIFRoZSBsaXN0ZW5lciBpcyBjYWxsZWQgd2l0aFxyXG4gICAqIHRoZSBuZXh0IHN0YXRlIGFuZCB0aGUgZXZlbnQgb2JqZWN0IHRoYXQgY2F1c2VkIHRoZSBzdGF0ZSB0cmFuc2l0aW9uLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBzdGF0ZSBsaXN0ZW5lclxyXG4gICAqL1xuXG5cbiAgSW50ZXJwcmV0ZXIucHJvdG90eXBlLm9uVHJhbnNpdGlvbiA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgIHRoaXMubGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7IC8vIFNlbmQgY3VycmVudCBzdGF0ZSB0byBsaXN0ZW5lclxuXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSBJbnRlcnByZXRlclN0YXR1cy5SdW5uaW5nKSB7XG4gICAgICBsaXN0ZW5lcih0aGlzLnN0YXRlLCB0aGlzLnN0YXRlLmV2ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBJbnRlcnByZXRlci5wcm90b3R5cGUuc3Vic2NyaWJlID0gZnVuY3Rpb24gKG5leHRMaXN0ZW5lck9yT2JzZXJ2ZXIsIF8sIC8vIFRPRE86IGVycm9yIGxpc3RlbmVyXG4gIGNvbXBsZXRlTGlzdGVuZXIpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIG9ic2VydmVyID0gdG9PYnNlcnZlcihuZXh0TGlzdGVuZXJPck9ic2VydmVyLCBfLCBjb21wbGV0ZUxpc3RlbmVyKTtcbiAgICB0aGlzLmxpc3RlbmVycy5hZGQob2JzZXJ2ZXIubmV4dCk7IC8vIFNlbmQgY3VycmVudCBzdGF0ZSB0byBsaXN0ZW5lclxuXG4gICAgaWYgKHRoaXMuc3RhdHVzICE9PSBJbnRlcnByZXRlclN0YXR1cy5Ob3RTdGFydGVkKSB7XG4gICAgICBvYnNlcnZlci5uZXh0KHRoaXMuc3RhdGUpO1xuICAgIH1cblxuICAgIHZhciBjb21wbGV0ZU9uY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5kb25lTGlzdGVuZXJzLmRlbGV0ZShjb21wbGV0ZU9uY2UpO1xuXG4gICAgICBfdGhpcy5zdG9wTGlzdGVuZXJzLmRlbGV0ZShjb21wbGV0ZU9uY2UpO1xuXG4gICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5zdGF0dXMgPT09IEludGVycHJldGVyU3RhdHVzLlN0b3BwZWQpIHtcbiAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25Eb25lKGNvbXBsZXRlT25jZSk7XG4gICAgICB0aGlzLm9uU3RvcChjb21wbGV0ZU9uY2UpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5saXN0ZW5lcnMuZGVsZXRlKG9ic2VydmVyLm5leHQpO1xuXG4gICAgICAgIF90aGlzLmRvbmVMaXN0ZW5lcnMuZGVsZXRlKGNvbXBsZXRlT25jZSk7XG5cbiAgICAgICAgX3RoaXMuc3RvcExpc3RlbmVycy5kZWxldGUoY29tcGxldGVPbmNlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuICAvKipcclxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgaXMgbm90aWZpZWQgd2hlbmV2ZXIgYW4gZXZlbnQgaXMgc2VudCB0byB0aGUgcnVubmluZyBpbnRlcnByZXRlci5cclxuICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGV2ZW50IGxpc3RlbmVyXHJcbiAgICovXG5cblxuICBJbnRlcnByZXRlci5wcm90b3R5cGUub25FdmVudCA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLyoqXHJcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGlzIG5vdGlmaWVkIHdoZW5ldmVyIGEgYHNlbmRgIGV2ZW50IG9jY3Vycy5cclxuICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGV2ZW50IGxpc3RlbmVyXHJcbiAgICovXG5cblxuICBJbnRlcnByZXRlci5wcm90b3R5cGUub25TZW5kID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5zZW5kTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxyXG4gICAqIEFkZHMgYSBjb250ZXh0IGxpc3RlbmVyIHRoYXQgaXMgbm90aWZpZWQgd2hlbmV2ZXIgdGhlIHN0YXRlIGNvbnRleHQgY2hhbmdlcy5cclxuICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGNvbnRleHQgbGlzdGVuZXJcclxuICAgKi9cblxuXG4gIEludGVycHJldGVyLnByb3RvdHlwZS5vbkNoYW5nZSA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgIHRoaXMuY29udGV4dExpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcclxuICAgKiBBZGRzIGEgbGlzdGVuZXIgdGhhdCBpcyBub3RpZmllZCB3aGVuIHRoZSBtYWNoaW5lIGlzIHN0b3BwZWQuXHJcbiAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lclxyXG4gICAqL1xuXG5cbiAgSW50ZXJwcmV0ZXIucHJvdG90eXBlLm9uU3RvcCA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgIHRoaXMuc3RvcExpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcclxuICAgKiBBZGRzIGEgc3RhdGUgbGlzdGVuZXIgdGhhdCBpcyBub3RpZmllZCB3aGVuIHRoZSBzdGF0ZWNoYXJ0IGhhcyByZWFjaGVkIGl0cyBmaW5hbCBzdGF0ZS5cclxuICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIHN0YXRlIGxpc3RlbmVyXHJcbiAgICovXG5cblxuICBJbnRlcnByZXRlci5wcm90b3R5cGUub25Eb25lID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSBJbnRlcnByZXRlclN0YXR1cy5TdG9wcGVkICYmIHRoaXMuX2RvbmVFdmVudCkge1xuICAgICAgbGlzdGVuZXIodGhpcy5fZG9uZUV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb25lTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgYSBsaXN0ZW5lci5cclxuICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxyXG4gICAqL1xuXG5cbiAgSW50ZXJwcmV0ZXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIHRoaXMuc2VuZExpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIHRoaXMuc3RvcExpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIHRoaXMuZG9uZUxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIHRoaXMuY29udGV4dExpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcclxuICAgKiBTdGFydHMgdGhlIGludGVycHJldGVyIGZyb20gdGhlIGdpdmVuIHN0YXRlLCBvciB0aGUgaW5pdGlhbCBzdGF0ZS5cclxuICAgKiBAcGFyYW0gaW5pdGlhbFN0YXRlIFRoZSBzdGF0ZSB0byBzdGFydCB0aGUgc3RhdGVjaGFydCBmcm9tXHJcbiAgICovXG5cblxuICBJbnRlcnByZXRlci5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gSW50ZXJwcmV0ZXJTdGF0dXMuUnVubmluZykge1xuICAgICAgLy8gRG8gbm90IHJlc3RhcnQgdGhlIHNlcnZpY2UgaWYgaXQgaXMgYWxyZWFkeSBzdGFydGVkXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IC8vIHllcywgaXQncyBhIGhhY2sgYnV0IHdlIG5lZWQgdGhlIHJlbGF0ZWQgY2FjaGUgdG8gYmUgcG9wdWxhdGVkIGZvciBzb21lIHRoaW5ncyB0byB3b3JrIChsaWtlIGRlbGF5ZWQgdHJhbnNpdGlvbnMpXG4gICAgLy8gdGhpcyBpcyB1c3VhbGx5IGNhbGxlZCBieSBgbWFjaGluZS5nZXRJbml0aWFsU3RhdGVgIGJ1dCBpZiB3ZSByZWh5ZHJhdGUgZnJvbSBhIHN0YXRlIHdlIG1pZ2h0IGJ5cGFzcyB0aGlzIGNhbGxcbiAgICAvLyB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBoZXJlIGFzIGl0IHJlc29sdmVzIHRoZSBmdWxsIGluaXRpYWwgc3RhdGUgd2hpY2ggbWlnaHQgaW52b2x2ZSBjYWxsaW5nIGFzc2lnbiBhY3Rpb25zXG4gICAgLy8gYW5kIHRoYXQgY291bGQgcG90ZW50aWFsbHkgbGVhZCB0byBzb21lIHVud2FudGVkIHNpZGUtZWZmZWN0cyAoZXZlbiBzdWNoIGFzIGNyZWF0aW5nIHNvbWUgcm9ndWUgYWN0b3JzKVxuXG5cbiAgICB0aGlzLm1hY2hpbmUuX2luaXQoKTtcblxuICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKHRoaXMuc2Vzc2lvbklkLCB0aGlzKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXR1cyA9IEludGVycHJldGVyU3RhdHVzLlJ1bm5pbmc7XG4gICAgdmFyIHJlc29sdmVkU3RhdGUgPSBpbml0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCA/IHRoaXMuaW5pdGlhbFN0YXRlIDogcHJvdmlkZSh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaXNTdGF0ZUNvbmZpZyhpbml0aWFsU3RhdGUpID8gX3RoaXMubWFjaGluZS5yZXNvbHZlU3RhdGUoaW5pdGlhbFN0YXRlKSA6IF90aGlzLm1hY2hpbmUucmVzb2x2ZVN0YXRlKFN0YXRlLmZyb20oaW5pdGlhbFN0YXRlLCBfdGhpcy5tYWNoaW5lLmNvbnRleHQpKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGV2VG9vbHMpIHtcbiAgICAgIHRoaXMuYXR0YWNoRGV2KCk7XG4gICAgfVxuXG4gICAgdGhpcy5zY2hlZHVsZXIuaW5pdGlhbGl6ZShmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy51cGRhdGUocmVzb2x2ZWRTdGF0ZSwgaW5pdEV2ZW50KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBJbnRlcnByZXRlci5wcm90b3R5cGUuX3N0b3BDaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUT0RPOiB0aGluayBhYm91dCBjb252ZXJ0aW5nIHRob3NlIHRvIGFjdGlvbnNcbiAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBpZiAoaXNGdW5jdGlvbihjaGlsZC5zdG9wKSkge1xuICAgICAgICBjaGlsZC5zdG9wKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5jaGlsZHJlbi5jbGVhcigpO1xuICB9O1xuXG4gIEludGVycHJldGVyLnByb3RvdHlwZS5fc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZV82LCBfYSwgZV83LCBfYiwgZV84LCBfYywgZV85LCBfZCwgZV8xMCwgX2U7XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgX2YgPSBfX3ZhbHVlcyh0aGlzLmxpc3RlbmVycyksIF9nID0gX2YubmV4dCgpOyAhX2cuZG9uZTsgX2cgPSBfZi5uZXh0KCkpIHtcbiAgICAgICAgdmFyIGxpc3RlbmVyID0gX2cudmFsdWU7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZV82XzEpIHtcbiAgICAgIGVfNiA9IHtcbiAgICAgICAgZXJyb3I6IGVfNl8xXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoX2cgJiYgIV9nLmRvbmUgJiYgKF9hID0gX2YucmV0dXJuKSkgX2EuY2FsbChfZik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoZV82KSB0aHJvdyBlXzYuZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9oID0gX192YWx1ZXModGhpcy5zdG9wTGlzdGVuZXJzKSwgX2ogPSBfaC5uZXh0KCk7ICFfai5kb25lOyBfaiA9IF9oLm5leHQoKSkge1xuICAgICAgICB2YXIgbGlzdGVuZXIgPSBfai52YWx1ZTsgLy8gY2FsbCBsaXN0ZW5lciwgdGhlbiByZW1vdmVcblxuICAgICAgICBsaXN0ZW5lcigpO1xuICAgICAgICB0aGlzLnN0b3BMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlXzdfMSkge1xuICAgICAgZV83ID0ge1xuICAgICAgICBlcnJvcjogZV83XzFcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChfaiAmJiAhX2ouZG9uZSAmJiAoX2IgPSBfaC5yZXR1cm4pKSBfYi5jYWxsKF9oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlXzcpIHRocm93IGVfNy5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgX2sgPSBfX3ZhbHVlcyh0aGlzLmNvbnRleHRMaXN0ZW5lcnMpLCBfbCA9IF9rLm5leHQoKTsgIV9sLmRvbmU7IF9sID0gX2submV4dCgpKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IF9sLnZhbHVlO1xuICAgICAgICB0aGlzLmNvbnRleHRMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlXzhfMSkge1xuICAgICAgZV84ID0ge1xuICAgICAgICBlcnJvcjogZV84XzFcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChfbCAmJiAhX2wuZG9uZSAmJiAoX2MgPSBfay5yZXR1cm4pKSBfYy5jYWxsKF9rKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlXzgpIHRocm93IGVfOC5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgX20gPSBfX3ZhbHVlcyh0aGlzLmRvbmVMaXN0ZW5lcnMpLCBfbyA9IF9tLm5leHQoKTsgIV9vLmRvbmU7IF9vID0gX20ubmV4dCgpKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IF9vLnZhbHVlO1xuICAgICAgICB0aGlzLmRvbmVMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlXzlfMSkge1xuICAgICAgZV85ID0ge1xuICAgICAgICBlcnJvcjogZV85XzFcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChfbyAmJiAhX28uZG9uZSAmJiAoX2QgPSBfbS5yZXR1cm4pKSBfZC5jYWxsKF9tKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlXzkpIHRocm93IGVfOS5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIC8vIEludGVycHJldGVyIGFscmVhZHkgc3RvcHBlZDsgZG8gbm90aGluZ1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdHVzID0gSW50ZXJwcmV0ZXJTdGF0dXMuU3RvcHBlZDtcbiAgICB0aGlzLl9pbml0aWFsU3RhdGUgPSB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgLy8gd2UgYXJlIGdvaW5nIHRvIHN0b3Agd2l0aGluIHRoZSBjdXJyZW50IHN5bmMgZnJhbWVcbiAgICAgIC8vIHNvIHdlIGNhbiBzYWZlbHkganVzdCBjYW5jZWwgdGhpcyBoZXJlIGFzIG5vdGhpbmcgYXN5bmMgc2hvdWxkIGJlIGZpcmVkIGFueXdheVxuICAgICAgZm9yICh2YXIgX3AgPSBfX3ZhbHVlcyhPYmplY3Qua2V5cyh0aGlzLmRlbGF5ZWRFdmVudHNNYXApKSwgX3EgPSBfcC5uZXh0KCk7ICFfcS5kb25lOyBfcSA9IF9wLm5leHQoKSkge1xuICAgICAgICB2YXIga2V5ID0gX3EudmFsdWU7XG4gICAgICAgIHRoaXMuY2xvY2suY2xlYXJUaW1lb3V0KHRoaXMuZGVsYXllZEV2ZW50c01hcFtrZXldKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlXzEwXzEpIHtcbiAgICAgIGVfMTAgPSB7XG4gICAgICAgIGVycm9yOiBlXzEwXzFcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChfcSAmJiAhX3EuZG9uZSAmJiAoX2UgPSBfcC5yZXR1cm4pKSBfZS5jYWxsKF9wKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlXzEwKSB0aHJvdyBlXzEwLmVycm9yO1xuICAgICAgfVxuICAgIH0gLy8gY2xlYXIgZXZlcnl0aGluZyB0aGF0IG1pZ2h0IGJlIGVucXVldWVkXG5cblxuICAgIHRoaXMuc2NoZWR1bGVyLmNsZWFyKCk7XG4gICAgdGhpcy5zY2hlZHVsZXIgPSBuZXcgU2NoZWR1bGVyKHtcbiAgICAgIGRlZmVyRXZlbnRzOiB0aGlzLm9wdGlvbnMuZGVmZXJFdmVudHNcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogU3RvcHMgdGhlIGludGVycHJldGVyIGFuZCB1bnN1YnNjcmliZSBhbGwgbGlzdGVuZXJzLlxyXG4gICAqXHJcbiAgICogVGhpcyB3aWxsIGFsc28gbm90aWZ5IHRoZSBgb25TdG9wYCBsaXN0ZW5lcnMuXHJcbiAgICovXG5cblxuICBJbnRlcnByZXRlci5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUT0RPOiBhZGQgd2FybmluZyBmb3Igc3RvcHBpbmcgbm9uLXJvb3QgaW50ZXJwcmV0ZXJzXG4gICAgdmFyIF90aGlzID0gdGhpczsgLy8gZ3JhYiB0aGUgY3VycmVudCBzY2hlZHVsZXIgYXMgaXQgd2lsbCBiZSByZXBsYWNlZCBpbiBfc3RvcFxuXG5cbiAgICB2YXIgc2NoZWR1bGVyID0gdGhpcy5zY2hlZHVsZXI7XG5cbiAgICB0aGlzLl9zdG9wKCk7IC8vIGxldCB3aGF0IGlzIGN1cnJlbnRseSBwcm9jZXNzZWQgdG8gYmUgZmluaXNoZWRcblxuXG4gICAgc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGl0IGZlZWxzIHdlaXJkIHRvIGhhbmRsZSB0aGlzIGhlcmUgYnV0IHdlIG5lZWQgdG8gaGFuZGxlIHRoaXMgZXZlbiBzbGlnaHRseSBcIm91dCBvZiBiYW5kXCJcbiAgICAgIHZhciBfZXZlbnQgPSB0b1NDWE1MRXZlbnQoe1xuICAgICAgICB0eXBlOiAneHN0YXRlLnN0b3AnXG4gICAgICB9KTtcblxuICAgICAgdmFyIG5leHRTdGF0ZSA9IHByb3ZpZGUoX3RoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGV4aXRBY3Rpb25zID0gZmxhdHRlbihfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoX3RoaXMuc3RhdGUuY29uZmlndXJhdGlvbiksIGZhbHNlKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgcmV0dXJuIGIub3JkZXIgLSBhLm9yZGVyO1xuICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKHN0YXRlTm9kZSkge1xuICAgICAgICAgIHJldHVybiB0b0FjdGlvbk9iamVjdHMoc3RhdGVOb2RlLm9uRXhpdCwgX3RoaXMubWFjaGluZS5vcHRpb25zLmFjdGlvbnMpO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgdmFyIF9hID0gX19yZWFkKHJlc29sdmVBY3Rpb25zKF90aGlzLm1hY2hpbmUsIF90aGlzLnN0YXRlLCBfdGhpcy5zdGF0ZS5jb250ZXh0LCBfZXZlbnQsIFt7XG4gICAgICAgICAgdHlwZTogJ2V4aXQnLFxuICAgICAgICAgIGFjdGlvbnM6IGV4aXRBY3Rpb25zXG4gICAgICAgIH1dLCBfdGhpcy5tYWNoaW5lLmNvbmZpZy5wcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50cyA/IF90aGlzLl9leGVjIDogdW5kZWZpbmVkLCBfdGhpcy5tYWNoaW5lLmNvbmZpZy5wcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50cyB8fCBfdGhpcy5tYWNoaW5lLmNvbmZpZy5wcmVzZXJ2ZUFjdGlvbk9yZGVyKSwgMiksXG4gICAgICAgICAgICByZXNvbHZlZEFjdGlvbnMgPSBfYVswXSxcbiAgICAgICAgICAgIHVwZGF0ZWRDb250ZXh0ID0gX2FbMV07XG5cbiAgICAgICAgdmFyIG5ld1N0YXRlID0gbmV3IFN0YXRlKHtcbiAgICAgICAgICB2YWx1ZTogX3RoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgICAgY29udGV4dDogdXBkYXRlZENvbnRleHQsXG4gICAgICAgICAgX2V2ZW50OiBfZXZlbnQsXG4gICAgICAgICAgX3Nlc3Npb25pZDogX3RoaXMuc2Vzc2lvbklkLFxuICAgICAgICAgIGhpc3RvcnlWYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIGhpc3Rvcnk6IF90aGlzLnN0YXRlLFxuICAgICAgICAgIGFjdGlvbnM6IHJlc29sdmVkQWN0aW9ucy5maWx0ZXIoZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuICFpc1JhaXNhYmxlQWN0aW9uKGFjdGlvbik7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgYWN0aXZpdGllczoge30sXG4gICAgICAgICAgZXZlbnRzOiBbXSxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiBbXSxcbiAgICAgICAgICB0cmFuc2l0aW9uczogW10sXG4gICAgICAgICAgY2hpbGRyZW46IHt9LFxuICAgICAgICAgIGRvbmU6IF90aGlzLnN0YXRlLmRvbmUsXG4gICAgICAgICAgdGFnczogX3RoaXMuc3RhdGUudGFncyxcbiAgICAgICAgICBtYWNoaW5lOiBfdGhpcy5tYWNoaW5lXG4gICAgICAgIH0pO1xuICAgICAgICBuZXdTdGF0ZS5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgICAgfSk7XG5cbiAgICAgIF90aGlzLnVwZGF0ZShuZXh0U3RhdGUsIF9ldmVudCk7XG5cbiAgICAgIF90aGlzLl9zdG9wQ2hpbGRyZW4oKTtcblxuICAgICAgcmVnaXN0cnkuZnJlZShfdGhpcy5zZXNzaW9uSWQpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEludGVycHJldGVyLnByb3RvdHlwZS5iYXRjaCA9IGZ1bmN0aW9uIChldmVudHMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSBJbnRlcnByZXRlclN0YXR1cy5Ob3RTdGFydGVkICYmIHRoaXMub3B0aW9ucy5kZWZlckV2ZW50cykge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcbiAgICAgIGlmICghSVNfUFJPRFVDVElPTikge1xuICAgICAgICB3YXJuKGZhbHNlLCBcIlwiLmNvbmNhdChldmVudHMubGVuZ3RoLCBcIiBldmVudChzKSB3ZXJlIHNlbnQgdG8gdW5pbml0aWFsaXplZCBzZXJ2aWNlIFxcXCJcIikuY29uY2F0KHRoaXMubWFjaGluZS5pZCwgXCJcXFwiIGFuZCBhcmUgZGVmZXJyZWQuIE1ha2Ugc3VyZSAuc3RhcnQoKSBpcyBjYWxsZWQgZm9yIHRoaXMgc2VydmljZS5cXG5FdmVudDogXCIpLmNvbmNhdChKU09OLnN0cmluZ2lmeShldmVudCkpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdHVzICE9PSBJbnRlcnByZXRlclN0YXR1cy5SdW5uaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgIFwiXCIuY29uY2F0KGV2ZW50cy5sZW5ndGgsIFwiIGV2ZW50KHMpIHdlcmUgc2VudCB0byB1bmluaXRpYWxpemVkIHNlcnZpY2UgXFxcIlwiKS5jb25jYXQodGhpcy5tYWNoaW5lLmlkLCBcIlxcXCIuIE1ha2Ugc3VyZSAuc3RhcnQoKSBpcyBjYWxsZWQgZm9yIHRoaXMgc2VydmljZSwgb3Igc2V0IHsgZGVmZXJFdmVudHM6IHRydWUgfSBpbiB0aGUgc2VydmljZSBvcHRpb25zLlwiKSk7XG4gICAgfVxuXG4gICAgaWYgKCFldmVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGV4ZWMgPSAhIXRoaXMubWFjaGluZS5jb25maWcucHJlZGljdGFibGVBY3Rpb25Bcmd1bWVudHMgJiYgdGhpcy5fZXhlYztcbiAgICB0aGlzLnNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZV8xMSwgX2E7XG5cbiAgICAgIHZhciBuZXh0U3RhdGUgPSBfdGhpcy5zdGF0ZTtcbiAgICAgIHZhciBiYXRjaENoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHZhciBiYXRjaGVkQWN0aW9ucyA9IFtdO1xuXG4gICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChldmVudF8xKSB7XG4gICAgICAgIHZhciBfZXZlbnQgPSB0b1NDWE1MRXZlbnQoZXZlbnRfMSk7XG5cbiAgICAgICAgX3RoaXMuZm9yd2FyZChfZXZlbnQpO1xuXG4gICAgICAgIG5leHRTdGF0ZSA9IHByb3ZpZGUoX3RoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMubWFjaGluZS50cmFuc2l0aW9uKG5leHRTdGF0ZSwgX2V2ZW50LCB1bmRlZmluZWQsIGV4ZWMgfHwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJhdGNoZWRBY3Rpb25zLnB1c2guYXBwbHkoYmF0Y2hlZEFjdGlvbnMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChfdGhpcy5tYWNoaW5lLmNvbmZpZy5wcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50cyA/IG5leHRTdGF0ZS5hY3Rpb25zIDogbmV4dFN0YXRlLmFjdGlvbnMubWFwKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgcmV0dXJuIGJpbmRBY3Rpb25Ub1N0YXRlKGEsIG5leHRTdGF0ZSk7XG4gICAgICAgIH0pKSwgZmFsc2UpKTtcbiAgICAgICAgYmF0Y2hDaGFuZ2VkID0gYmF0Y2hDaGFuZ2VkIHx8ICEhbmV4dFN0YXRlLmNoYW5nZWQ7XG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBldmVudHNfMSA9IF9fdmFsdWVzKGV2ZW50cyksIGV2ZW50c18xXzEgPSBldmVudHNfMS5uZXh0KCk7ICFldmVudHNfMV8xLmRvbmU7IGV2ZW50c18xXzEgPSBldmVudHNfMS5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgZXZlbnRfMSA9IGV2ZW50c18xXzEudmFsdWU7XG5cbiAgICAgICAgICBfbG9vcF8xKGV2ZW50XzEpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlXzExXzEpIHtcbiAgICAgICAgZV8xMSA9IHtcbiAgICAgICAgICBlcnJvcjogZV8xMV8xXG4gICAgICAgIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChldmVudHNfMV8xICYmICFldmVudHNfMV8xLmRvbmUgJiYgKF9hID0gZXZlbnRzXzEucmV0dXJuKSkgX2EuY2FsbChldmVudHNfMSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKGVfMTEpIHRocm93IGVfMTEuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbmV4dFN0YXRlLmNoYW5nZWQgPSBiYXRjaENoYW5nZWQ7XG4gICAgICBuZXh0U3RhdGUuYWN0aW9ucyA9IGJhdGNoZWRBY3Rpb25zO1xuXG4gICAgICBfdGhpcy51cGRhdGUobmV4dFN0YXRlLCB0b1NDWE1MRXZlbnQoZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAxXSkpO1xuICAgIH0pO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc2VuZCBmdW5jdGlvbiBib3VuZCB0byB0aGlzIGludGVycHJldGVyIGluc3RhbmNlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBiZSBzZW50IGJ5IHRoZSBzZW5kZXIuXHJcbiAgICovXG5cblxuICBJbnRlcnByZXRlci5wcm90b3R5cGUuc2VuZGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZC5iaW5kKHRoaXMsIGV2ZW50KTtcbiAgfTtcblxuICBJbnRlcnByZXRlci5wcm90b3R5cGUuX25leHRTdGF0ZSA9IGZ1bmN0aW9uIChldmVudCwgZXhlYykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoZXhlYyA9PT0gdm9pZCAwKSB7XG4gICAgICBleGVjID0gISF0aGlzLm1hY2hpbmUuY29uZmlnLnByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzICYmIHRoaXMuX2V4ZWM7XG4gICAgfVxuXG4gICAgdmFyIF9ldmVudCA9IHRvU0NYTUxFdmVudChldmVudCk7XG5cbiAgICBpZiAoX2V2ZW50Lm5hbWUuaW5kZXhPZihlcnJvclBsYXRmb3JtKSA9PT0gMCAmJiAhdGhpcy5zdGF0ZS5uZXh0RXZlbnRzLnNvbWUoZnVuY3Rpb24gKG5leHRFdmVudCkge1xuICAgICAgcmV0dXJuIG5leHRFdmVudC5pbmRleE9mKGVycm9yUGxhdGZvcm0pID09PSAwO1xuICAgIH0pKSB7XG4gICAgICB0aHJvdyBfZXZlbnQuZGF0YS5kYXRhO1xuICAgIH1cblxuICAgIHZhciBuZXh0U3RhdGUgPSBwcm92aWRlKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5tYWNoaW5lLnRyYW5zaXRpb24oX3RoaXMuc3RhdGUsIF9ldmVudCwgdW5kZWZpbmVkLCBleGVjIHx8IHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbmV4dCBzdGF0ZSBnaXZlbiB0aGUgaW50ZXJwcmV0ZXIncyBjdXJyZW50IHN0YXRlIGFuZCB0aGUgZXZlbnQuXHJcbiAgICpcclxuICAgKiBUaGlzIGlzIGEgcHVyZSBtZXRob2QgdGhhdCBkb2VzIF9ub3RfIHVwZGF0ZSB0aGUgaW50ZXJwcmV0ZXIncyBzdGF0ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gZGV0ZXJtaW5lIHRoZSBuZXh0IHN0YXRlXHJcbiAgICovXG5cblxuICBJbnRlcnByZXRlci5wcm90b3R5cGUubmV4dFN0YXRlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuX25leHRTdGF0ZShldmVudCwgZmFsc2UpO1xuICB9O1xuXG4gIEludGVycHJldGVyLnByb3RvdHlwZS5mb3J3YXJkID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIGVfMTIsIF9hO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXModGhpcy5mb3J3YXJkVG8pLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgIHZhciBpZCA9IF9jLnZhbHVlO1xuICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuLmdldChpZCk7XG5cbiAgICAgICAgaWYgKCFjaGlsZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBmb3J3YXJkIGV2ZW50ICdcIi5jb25jYXQoZXZlbnQsIFwiJyBmcm9tIGludGVycHJldGVyICdcIikuY29uY2F0KHRoaXMuaWQsIFwiJyB0byBub25leGlzdGFudCBjaGlsZCAnXCIpLmNvbmNhdChpZCwgXCInLlwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZC5zZW5kKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlXzEyXzEpIHtcbiAgICAgIGVfMTIgPSB7XG4gICAgICAgIGVycm9yOiBlXzEyXzFcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlXzEyKSB0aHJvdyBlXzEyLmVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBJbnRlcnByZXRlci5wcm90b3R5cGUuZGVmZXIgPSBmdW5jdGlvbiAoc2VuZEFjdGlvbikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgdGltZXJJZCA9IHRoaXMuY2xvY2suc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoJ3RvJyBpbiBzZW5kQWN0aW9uICYmIHNlbmRBY3Rpb24udG8pIHtcbiAgICAgICAgX3RoaXMuc2VuZFRvKHNlbmRBY3Rpb24uX2V2ZW50LCBzZW5kQWN0aW9uLnRvLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLnNlbmQoc2VuZEFjdGlvbi5fZXZlbnQpO1xuICAgICAgfVxuICAgIH0sIHNlbmRBY3Rpb24uZGVsYXkpO1xuXG4gICAgaWYgKHNlbmRBY3Rpb24uaWQpIHtcbiAgICAgIHRoaXMuZGVsYXllZEV2ZW50c01hcFtzZW5kQWN0aW9uLmlkXSA9IHRpbWVySWQ7XG4gICAgfVxuICB9O1xuXG4gIEludGVycHJldGVyLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAoc2VuZElkKSB7XG4gICAgdGhpcy5jbG9jay5jbGVhclRpbWVvdXQodGhpcy5kZWxheWVkRXZlbnRzTWFwW3NlbmRJZF0pO1xuICAgIGRlbGV0ZSB0aGlzLmRlbGF5ZWRFdmVudHNNYXBbc2VuZElkXTtcbiAgfTtcblxuICBJbnRlcnByZXRlci5wcm90b3R5cGUuZXhlYyA9IGZ1bmN0aW9uIChhY3Rpb24sIHN0YXRlLCBhY3Rpb25GdW5jdGlvbk1hcCkge1xuICAgIGlmIChhY3Rpb25GdW5jdGlvbk1hcCA9PT0gdm9pZCAwKSB7XG4gICAgICBhY3Rpb25GdW5jdGlvbk1hcCA9IHRoaXMubWFjaGluZS5vcHRpb25zLmFjdGlvbnM7XG4gICAgfVxuXG4gICAgdGhpcy5fZXhlYyhhY3Rpb24sIHN0YXRlLmNvbnRleHQsIHN0YXRlLl9ldmVudCwgYWN0aW9uRnVuY3Rpb25NYXApO1xuICB9O1xuXG4gIEludGVycHJldGVyLnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uIChjaGlsZElkKSB7XG4gICAgdmFyIF9hO1xuXG4gICAgdGhpcy5jaGlsZHJlbi5kZWxldGUoY2hpbGRJZCk7XG4gICAgdGhpcy5mb3J3YXJkVG8uZGVsZXRlKGNoaWxkSWQpOyAvLyB0aGlzLnN0YXRlIG1pZ2h0IG5vdCBleGlzdCBhdCB0aGUgdGltZSB0aGlzIGlzIGNhbGxlZCxcbiAgICAvLyBzdWNoIGFzIHdoZW4gYSBjaGlsZCBpcyBhZGRlZCB0aGVuIHJlbW92ZWQgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBzdGF0ZVxuXG4gICAgKF9hID0gdGhpcy5zdGF0ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHRydWUgOiBkZWxldGUgX2EuY2hpbGRyZW5bY2hpbGRJZF07XG4gIH07XG5cbiAgSW50ZXJwcmV0ZXIucHJvdG90eXBlLnN0b3BDaGlsZCA9IGZ1bmN0aW9uIChjaGlsZElkKSB7XG4gICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbi5nZXQoY2hpbGRJZCk7XG5cbiAgICBpZiAoIWNoaWxkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVDaGlsZChjaGlsZElkKTtcblxuICAgIGlmIChpc0Z1bmN0aW9uKGNoaWxkLnN0b3ApKSB7XG4gICAgICBjaGlsZC5zdG9wKCk7XG4gICAgfVxuICB9O1xuXG4gIEludGVycHJldGVyLnByb3RvdHlwZS5zcGF3biA9IGZ1bmN0aW9uIChlbnRpdHksIG5hbWUsIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5zdGF0dXMgIT09IEludGVycHJldGVyU3RhdHVzLlJ1bm5pbmcpIHtcbiAgICAgIHJldHVybiBjcmVhdGVEZWZlcnJlZEFjdG9yKGVudGl0eSwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGlzUHJvbWlzZUxpa2UoZW50aXR5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3Bhd25Qcm9taXNlKFByb21pc2UucmVzb2x2ZShlbnRpdHkpLCBuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oZW50aXR5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3Bhd25DYWxsYmFjayhlbnRpdHksIG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoaXNTcGF3bmVkQWN0b3IoZW50aXR5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3Bhd25BY3RvcihlbnRpdHksIG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoaXNPYnNlcnZhYmxlKGVudGl0eSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwYXduT2JzZXJ2YWJsZShlbnRpdHksIG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoaXNNYWNoaW5lKGVudGl0eSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwYXduTWFjaGluZShlbnRpdHksIF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwge1xuICAgICAgICBpZDogbmFtZVxuICAgICAgfSkpO1xuICAgIH0gZWxzZSBpZiAoaXNCZWhhdmlvcihlbnRpdHkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGF3bkJlaGF2aW9yKGVudGl0eSwgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBzcGF3biBlbnRpdHkgXFxcIlwiLmNvbmNhdChuYW1lLCBcIlxcXCIgb2YgdHlwZSBcXFwiXCIpLmNvbmNhdCh0eXBlb2YgZW50aXR5LCBcIlxcXCIuXCIpKTtcbiAgICB9XG4gIH07XG5cbiAgSW50ZXJwcmV0ZXIucHJvdG90eXBlLnNwYXduTWFjaGluZSA9IGZ1bmN0aW9uIChtYWNoaW5lLCBvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRTZXJ2aWNlID0gbmV3IEludGVycHJldGVyKG1hY2hpbmUsIF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMpLCB7XG4gICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICBpZDogb3B0aW9ucy5pZCB8fCBtYWNoaW5lLmlkXG4gICAgfSkpO1xuXG4gICAgdmFyIHJlc29sdmVkT3B0aW9ucyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBERUZBVUxUX1NQQVdOX09QVElPTlMpLCBvcHRpb25zKTtcblxuICAgIGlmIChyZXNvbHZlZE9wdGlvbnMuc3luYykge1xuICAgICAgY2hpbGRTZXJ2aWNlLm9uVHJhbnNpdGlvbihmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgX3RoaXMuc2VuZCh1cGRhdGUsIHtcbiAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgaWQ6IGNoaWxkU2VydmljZS5pZFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBhY3RvciA9IGNoaWxkU2VydmljZTtcbiAgICB0aGlzLmNoaWxkcmVuLnNldChjaGlsZFNlcnZpY2UuaWQsIGFjdG9yKTtcblxuICAgIGlmIChyZXNvbHZlZE9wdGlvbnMuYXV0b0ZvcndhcmQpIHtcbiAgICAgIHRoaXMuZm9yd2FyZFRvLmFkZChjaGlsZFNlcnZpY2UuaWQpO1xuICAgIH1cblxuICAgIGNoaWxkU2VydmljZS5vbkRvbmUoZnVuY3Rpb24gKGRvbmVFdmVudCkge1xuICAgICAgX3RoaXMucmVtb3ZlQ2hpbGQoY2hpbGRTZXJ2aWNlLmlkKTtcblxuICAgICAgX3RoaXMuc2VuZCh0b1NDWE1MRXZlbnQoZG9uZUV2ZW50LCB7XG4gICAgICAgIG9yaWdpbjogY2hpbGRTZXJ2aWNlLmlkXG4gICAgICB9KSk7XG4gICAgfSkuc3RhcnQoKTtcbiAgICByZXR1cm4gYWN0b3I7XG4gIH07XG5cbiAgSW50ZXJwcmV0ZXIucHJvdG90eXBlLnNwYXduQmVoYXZpb3IgPSBmdW5jdGlvbiAoYmVoYXZpb3IsIGlkKSB7XG4gICAgdmFyIGFjdG9yUmVmID0gc3Bhd25CZWhhdmlvcihiZWhhdmlvciwge1xuICAgICAgaWQ6IGlkLFxuICAgICAgcGFyZW50OiB0aGlzXG4gICAgfSk7XG4gICAgdGhpcy5jaGlsZHJlbi5zZXQoaWQsIGFjdG9yUmVmKTtcbiAgICByZXR1cm4gYWN0b3JSZWY7XG4gIH07XG5cbiAgSW50ZXJwcmV0ZXIucHJvdG90eXBlLnNwYXduUHJvbWlzZSA9IGZ1bmN0aW9uIChwcm9taXNlLCBpZCkge1xuICAgIHZhciBfYTtcblxuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgY2FuY2VsZWQgPSBmYWxzZTtcbiAgICB2YXIgcmVzb2x2ZWREYXRhO1xuICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIGlmICghY2FuY2VsZWQpIHtcbiAgICAgICAgcmVzb2x2ZWREYXRhID0gcmVzcG9uc2U7XG5cbiAgICAgICAgX3RoaXMucmVtb3ZlQ2hpbGQoaWQpO1xuXG4gICAgICAgIF90aGlzLnNlbmQodG9TQ1hNTEV2ZW50KGRvbmVJbnZva2UoaWQsIHJlc3BvbnNlKSwge1xuICAgICAgICAgIG9yaWdpbjogaWRcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uIChlcnJvckRhdGEpIHtcbiAgICAgIGlmICghY2FuY2VsZWQpIHtcbiAgICAgICAgX3RoaXMucmVtb3ZlQ2hpbGQoaWQpO1xuXG4gICAgICAgIHZhciBlcnJvckV2ZW50ID0gZXJyb3IoaWQsIGVycm9yRGF0YSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTZW5kIFwiZXJyb3IucGxhdGZvcm0uaWRcIiB0byB0aGlzIChwYXJlbnQpLlxuICAgICAgICAgIF90aGlzLnNlbmQodG9TQ1hNTEV2ZW50KGVycm9yRXZlbnQsIHtcbiAgICAgICAgICAgIG9yaWdpbjogaWRcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVwb3J0VW5oYW5kbGVkRXhjZXB0aW9uT25JbnZvY2F0aW9uKGVycm9yRGF0YSwgZXJyb3IsIGlkKTtcblxuICAgICAgICAgIGlmIChfdGhpcy5kZXZUb29scykge1xuICAgICAgICAgICAgX3RoaXMuZGV2VG9vbHMuc2VuZChlcnJvckV2ZW50LCBfdGhpcy5zdGF0ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF90aGlzLm1hY2hpbmUuc3RyaWN0KSB7XG4gICAgICAgICAgICAvLyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gYWx3YXlzIHN0b3AgdGhlIHN0YXRlIG1hY2hpbmUgaWYgdW5oYW5kbGVkXG4gICAgICAgICAgICAvLyBleGNlcHRpb24vcHJvbWlzZSByZWplY3Rpb24gaGFwcGVucyBidXQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgICAgICAvLyBicmVhayBleGlzdGluZyBjb2RlIHNvIGVuZm9yY2UgaXQgb24gc3RyaWN0IG1vZGUgb25seSBlc3BlY2lhbGx5IHNvXG4gICAgICAgICAgICAvLyBiZWNhdXNlIGRvY3VtZW50YXRpb24gc2F5cyB0aGF0IG9uRXJyb3IgaXMgb3B0aW9uYWxcbiAgICAgICAgICAgIF90aGlzLnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgYWN0b3IgPSAoX2EgPSB7XG4gICAgICBpZDogaWQsXG4gICAgICBzZW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICB9LFxuICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbiAobmV4dCwgaGFuZGxlRXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgICAgIHZhciBvYnNlcnZlciA9IHRvT2JzZXJ2ZXIobmV4dCwgaGFuZGxlRXJyb3IsIGNvbXBsZXRlKTtcbiAgICAgICAgdmFyIHVuc3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgaWYgKHVuc3Vic2NyaWJlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzcG9uc2UpO1xuXG4gICAgICAgICAgaWYgKHVuc3Vic2NyaWJlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBpZiAodW5zdWJzY3JpYmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB1bnN1YnNjcmliZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICB0b0pTT046IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogaWRcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBnZXRTbmFwc2hvdDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZWREYXRhO1xuICAgICAgfVxuICAgIH0sIF9hW3N5bWJvbE9ic2VydmFibGVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgX2EpO1xuICAgIHRoaXMuY2hpbGRyZW4uc2V0KGlkLCBhY3Rvcik7XG4gICAgcmV0dXJuIGFjdG9yO1xuICB9O1xuXG4gIEludGVycHJldGVyLnByb3RvdHlwZS5zcGF3bkNhbGxiYWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBpZCkge1xuICAgIHZhciBfYTtcblxuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgY2FuY2VsZWQgPSBmYWxzZTtcbiAgICB2YXIgcmVjZWl2ZXJzID0gbmV3IFNldCgpO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGVtaXR0ZWQ7XG5cbiAgICB2YXIgcmVjZWl2ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBlbWl0dGVkID0gZTtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gbGlzdGVuZXIoZSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGNhbmNlbGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2VuZCh0b1NDWE1MRXZlbnQoZSwge1xuICAgICAgICBvcmlnaW46IGlkXG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIHZhciBjYWxsYmFja1N0b3A7XG5cbiAgICB0cnkge1xuICAgICAgY2FsbGJhY2tTdG9wID0gY2FsbGJhY2socmVjZWl2ZSwgZnVuY3Rpb24gKG5ld0xpc3RlbmVyKSB7XG4gICAgICAgIHJlY2VpdmVycy5hZGQobmV3TGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnNlbmQoZXJyb3IoaWQsIGVycikpO1xuICAgIH1cblxuICAgIGlmIChpc1Byb21pc2VMaWtlKGNhbGxiYWNrU3RvcCkpIHtcbiAgICAgIC8vIGl0IHR1cm5lZCBvdXQgdG8gYmUgYW4gYXN5bmMgZnVuY3Rpb24sIGNhbid0IHJlbGlhYmx5IGNoZWNrIHRoaXMgYmVmb3JlIGNhbGxpbmcgYGNhbGxiYWNrYFxuICAgICAgLy8gYmVjYXVzZSB0cmFuc3BpbGVkIGFzeW5jIGZ1bmN0aW9ucyBhcmUgbm90IHJlY29nbml6YWJsZVxuICAgICAgcmV0dXJuIHRoaXMuc3Bhd25Qcm9taXNlKGNhbGxiYWNrU3RvcCwgaWQpO1xuICAgIH1cblxuICAgIHZhciBhY3RvciA9IChfYSA9IHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIHNlbmQ6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICByZXR1cm4gcmVjZWl2ZXJzLmZvckVhY2goZnVuY3Rpb24gKHJlY2VpdmVyKSB7XG4gICAgICAgICAgcmV0dXJuIHJlY2VpdmVyKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbiAobmV4dCkge1xuICAgICAgICB2YXIgb2JzZXJ2ZXIgPSB0b09ic2VydmVyKG5leHQpO1xuICAgICAgICBsaXN0ZW5lcnMuYWRkKG9ic2VydmVyLm5leHQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVuc3Vic2NyaWJlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKG9ic2VydmVyLm5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbmNlbGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFja1N0b3ApKSB7XG4gICAgICAgICAgY2FsbGJhY2tTdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0b0pTT046IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogaWRcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBnZXRTbmFwc2hvdDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZW1pdHRlZDtcbiAgICAgIH1cbiAgICB9LCBfYVtzeW1ib2xPYnNlcnZhYmxlXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIF9hKTtcbiAgICB0aGlzLmNoaWxkcmVuLnNldChpZCwgYWN0b3IpO1xuICAgIHJldHVybiBhY3RvcjtcbiAgfTtcblxuICBJbnRlcnByZXRlci5wcm90b3R5cGUuc3Bhd25PYnNlcnZhYmxlID0gZnVuY3Rpb24gKHNvdXJjZSwgaWQpIHtcbiAgICB2YXIgX2E7XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGVtaXR0ZWQ7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IHNvdXJjZS5zdWJzY3JpYmUoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBlbWl0dGVkID0gdmFsdWU7XG5cbiAgICAgIF90aGlzLnNlbmQodG9TQ1hNTEV2ZW50KHZhbHVlLCB7XG4gICAgICAgIG9yaWdpbjogaWRcbiAgICAgIH0pKTtcbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBfdGhpcy5yZW1vdmVDaGlsZChpZCk7XG5cbiAgICAgIF90aGlzLnNlbmQodG9TQ1hNTEV2ZW50KGVycm9yKGlkLCBlcnIpLCB7XG4gICAgICAgIG9yaWdpbjogaWRcbiAgICAgIH0pKTtcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5yZW1vdmVDaGlsZChpZCk7XG5cbiAgICAgIF90aGlzLnNlbmQodG9TQ1hNTEV2ZW50KGRvbmVJbnZva2UoaWQpLCB7XG4gICAgICAgIG9yaWdpbjogaWRcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgICB2YXIgYWN0b3IgPSAoX2EgPSB7XG4gICAgICBpZDogaWQsXG4gICAgICBzZW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICB9LFxuICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbiAobmV4dCwgaGFuZGxlRXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5leHQsIGhhbmRsZUVycm9yLCBjb21wbGV0ZSk7XG4gICAgICB9LFxuICAgICAgc3RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9LFxuICAgICAgZ2V0U25hcHNob3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGVtaXR0ZWQ7XG4gICAgICB9LFxuICAgICAgdG9KU09OOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6IGlkXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgX2Fbc3ltYm9sT2JzZXJ2YWJsZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBfYSk7XG4gICAgdGhpcy5jaGlsZHJlbi5zZXQoaWQsIGFjdG9yKTtcbiAgICByZXR1cm4gYWN0b3I7XG4gIH07XG5cbiAgSW50ZXJwcmV0ZXIucHJvdG90eXBlLnNwYXduQWN0b3IgPSBmdW5jdGlvbiAoYWN0b3IsIG5hbWUpIHtcbiAgICB0aGlzLmNoaWxkcmVuLnNldChuYW1lLCBhY3Rvcik7XG4gICAgcmV0dXJuIGFjdG9yO1xuICB9O1xuXG4gIEludGVycHJldGVyLnByb3RvdHlwZS5zcGF3bkFjdGl2aXR5ID0gZnVuY3Rpb24gKGFjdGl2aXR5KSB7XG4gICAgdmFyIGltcGxlbWVudGF0aW9uID0gdGhpcy5tYWNoaW5lLm9wdGlvbnMgJiYgdGhpcy5tYWNoaW5lLm9wdGlvbnMuYWN0aXZpdGllcyA/IHRoaXMubWFjaGluZS5vcHRpb25zLmFjdGl2aXRpZXNbYWN0aXZpdHkudHlwZV0gOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWltcGxlbWVudGF0aW9uKSB7XG4gICAgICBpZiAoIUlTX1BST0RVQ1RJT04pIHtcbiAgICAgICAgd2FybihmYWxzZSwgXCJObyBpbXBsZW1lbnRhdGlvbiBmb3VuZCBmb3IgYWN0aXZpdHkgJ1wiLmNvbmNhdChhY3Rpdml0eS50eXBlLCBcIidcIikpO1xuICAgICAgfSAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxuXG5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFN0YXJ0IGltcGxlbWVudGF0aW9uXG5cblxuICAgIHZhciBkaXNwb3NlID0gaW1wbGVtZW50YXRpb24odGhpcy5zdGF0ZS5jb250ZXh0LCBhY3Rpdml0eSk7XG4gICAgdGhpcy5zcGF3bkVmZmVjdChhY3Rpdml0eS5pZCwgZGlzcG9zZSk7XG4gIH07XG5cbiAgSW50ZXJwcmV0ZXIucHJvdG90eXBlLnNwYXduRWZmZWN0ID0gZnVuY3Rpb24gKGlkLCBkaXNwb3NlKSB7XG4gICAgdmFyIF9hO1xuXG4gICAgdGhpcy5jaGlsZHJlbi5zZXQoaWQsIChfYSA9IHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIHNlbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgIH0sXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgc3RvcDogZGlzcG9zZSB8fCB1bmRlZmluZWQsXG4gICAgICBnZXRTbmFwc2hvdDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICAgIHRvSlNPTjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiBpZFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sIF9hW3N5bWJvbE9ic2VydmFibGVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgX2EpKTtcbiAgfTtcblxuICBJbnRlcnByZXRlci5wcm90b3R5cGUuYXR0YWNoRGV2ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBnbG9iYWwgPSBnZXRHbG9iYWwoKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGV2VG9vbHMgJiYgZ2xvYmFsKSB7XG4gICAgICBpZiAoZ2xvYmFsLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18pIHtcbiAgICAgICAgdmFyIGRldlRvb2xzT3B0aW9ucyA9IHR5cGVvZiB0aGlzLm9wdGlvbnMuZGV2VG9vbHMgPT09ICdvYmplY3QnID8gdGhpcy5vcHRpb25zLmRldlRvb2xzIDogdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmRldlRvb2xzID0gZ2xvYmFsLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18uY29ubmVjdChfX2Fzc2lnbihfX2Fzc2lnbih7XG4gICAgICAgICAgbmFtZTogdGhpcy5pZCxcbiAgICAgICAgICBhdXRvUGF1c2U6IHRydWUsXG4gICAgICAgICAgc3RhdGVTYW5pdGl6ZXI6IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHN0YXRlLnZhbHVlLFxuICAgICAgICAgICAgICBjb250ZXh0OiBzdGF0ZS5jb250ZXh0LFxuICAgICAgICAgICAgICBhY3Rpb25zOiBzdGF0ZS5hY3Rpb25zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZGV2VG9vbHNPcHRpb25zKSwge1xuICAgICAgICAgIGZlYXR1cmVzOiBfX2Fzc2lnbih7XG4gICAgICAgICAgICBqdW1wOiBmYWxzZSxcbiAgICAgICAgICAgIHNraXA6IGZhbHNlXG4gICAgICAgICAgfSwgZGV2VG9vbHNPcHRpb25zID8gZGV2VG9vbHNPcHRpb25zLmZlYXR1cmVzIDogdW5kZWZpbmVkKVxuICAgICAgICB9KSwgdGhpcy5tYWNoaW5lKTtcbiAgICAgICAgdGhpcy5kZXZUb29scy5pbml0KHRoaXMuc3RhdGUpO1xuICAgICAgfSAvLyBhZGQgWFN0YXRlLXNwZWNpZmljIGRldiB0b29saW5nIGhvb2tcblxuXG4gICAgICByZWdpc3RlclNlcnZpY2UodGhpcyk7XG4gICAgfVxuICB9O1xuXG4gIEludGVycHJldGVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkXG4gICAgfTtcbiAgfTtcblxuICBJbnRlcnByZXRlci5wcm90b3R5cGVbc3ltYm9sT2JzZXJ2YWJsZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgSW50ZXJwcmV0ZXIucHJvdG90eXBlLmdldFNuYXBzaG90ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gSW50ZXJwcmV0ZXJTdGF0dXMuTm90U3RhcnRlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbFN0YXRlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogVGhlIGRlZmF1bHQgaW50ZXJwcmV0ZXIgb3B0aW9uczpcclxuICAgKlxyXG4gICAqIC0gYGNsb2NrYCB1c2VzIHRoZSBnbG9iYWwgYHNldFRpbWVvdXRgIGFuZCBgY2xlYXJUaW1lb3V0YCBmdW5jdGlvbnNcclxuICAgKiAtIGBsb2dnZXJgIHVzZXMgdGhlIGdsb2JhbCBgY29uc29sZS5sb2coKWAgbWV0aG9kXHJcbiAgICovXG5cblxuICBJbnRlcnByZXRlci5kZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBleGVjdXRlOiB0cnVlLFxuICAgIGRlZmVyRXZlbnRzOiB0cnVlLFxuICAgIGNsb2NrOiB7XG4gICAgICBzZXRUaW1lb3V0OiBmdW5jdGlvbiAoZm4sIG1zKSB7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZuLCBtcyk7XG4gICAgICB9LFxuICAgICAgY2xlYXJUaW1lb3V0OiBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChpZCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBsb2dnZXI6IC8qI19fUFVSRV9fKi9jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLFxuICAgIGRldlRvb2xzOiBmYWxzZVxuICB9O1xuICBJbnRlcnByZXRlci5pbnRlcnByZXQgPSBpbnRlcnByZXQ7XG4gIHJldHVybiBJbnRlcnByZXRlcjtcbn0oKTtcblxudmFyIHJlc29sdmVTcGF3bk9wdGlvbnMgPSBmdW5jdGlvbiAobmFtZU9yT3B0aW9ucykge1xuICBpZiAoaXNTdHJpbmcobmFtZU9yT3B0aW9ucykpIHtcbiAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIERFRkFVTFRfU1BBV05fT1BUSU9OUyksIHtcbiAgICAgIG5hbWU6IG5hbWVPck9wdGlvbnNcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgREVGQVVMVF9TUEFXTl9PUFRJT05TKSwge1xuICAgIG5hbWU6IHVuaXF1ZUlkKClcbiAgfSksIG5hbWVPck9wdGlvbnMpO1xufTtcblxuZnVuY3Rpb24gc3Bhd24oZW50aXR5LCBuYW1lT3JPcHRpb25zKSB7XG4gIHZhciByZXNvbHZlZE9wdGlvbnMgPSByZXNvbHZlU3Bhd25PcHRpb25zKG5hbWVPck9wdGlvbnMpO1xuICByZXR1cm4gY29uc3VtZShmdW5jdGlvbiAoc2VydmljZSkge1xuICAgIGlmICghSVNfUFJPRFVDVElPTikge1xuICAgICAgdmFyIGlzTGF6eUVudGl0eSA9IGlzTWFjaGluZShlbnRpdHkpIHx8IGlzRnVuY3Rpb24oZW50aXR5KTtcbiAgICAgIHdhcm4oISFzZXJ2aWNlIHx8IGlzTGF6eUVudGl0eSwgXCJBdHRlbXB0ZWQgdG8gc3Bhd24gYW4gQWN0b3IgKElEOiBcXFwiXCIuY29uY2F0KGlzTWFjaGluZShlbnRpdHkpID8gZW50aXR5LmlkIDogJ3VuZGVmaW5lZCcsIFwiXFxcIikgb3V0c2lkZSBvZiBhIHNlcnZpY2UuIFRoaXMgd2lsbCBoYXZlIG5vIGVmZmVjdC5cIikpO1xuICAgIH1cblxuICAgIGlmIChzZXJ2aWNlKSB7XG4gICAgICByZXR1cm4gc2VydmljZS5zcGF3bihlbnRpdHksIHJlc29sdmVkT3B0aW9ucy5uYW1lLCByZXNvbHZlZE9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3JlYXRlRGVmZXJyZWRBY3RvcihlbnRpdHksIHJlc29sdmVkT3B0aW9ucy5uYW1lKTtcbiAgICB9XG4gIH0pO1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgSW50ZXJwcmV0ZXIgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBtYWNoaW5lIHdpdGggdGhlIHByb3ZpZGVkIG9wdGlvbnMsIGlmIGFueS5cclxuICpcclxuICogQHBhcmFtIG1hY2hpbmUgVGhlIG1hY2hpbmUgdG8gaW50ZXJwcmV0XHJcbiAqIEBwYXJhbSBvcHRpb25zIEludGVycHJldGVyIG9wdGlvbnNcclxuICovXG5cbmZ1bmN0aW9uIGludGVycHJldChtYWNoaW5lLCBvcHRpb25zKSB7XG4gIHZhciBpbnRlcnByZXRlciA9IG5ldyBJbnRlcnByZXRlcihtYWNoaW5lLCBvcHRpb25zKTtcbiAgcmV0dXJuIGludGVycHJldGVyO1xufVxuXG5leHBvcnQgeyBJbnRlcnByZXRlciwgSW50ZXJwcmV0ZXJTdGF0dXMsIGludGVycHJldCwgc3Bhd24gfTtcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX3Jlc3QgfSBmcm9tICcuL192aXJ0dWFsL190c2xpYi5qcyc7XG5pbXBvcnQgJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgaW52b2tlIH0gZnJvbSAnLi9hY3Rpb25UeXBlcy5qcyc7XG5pbXBvcnQgJy4vdXRpbHMuanMnO1xuaW1wb3J0ICcuL2Vudmlyb25tZW50LmpzJztcblxuZnVuY3Rpb24gdG9JbnZva2VTb3VyY2Uoc3JjKSB7XG4gIGlmICh0eXBlb2Ygc3JjID09PSAnc3RyaW5nJykge1xuICAgIHZhciBzaW1wbGVTcmMgPSB7XG4gICAgICB0eXBlOiBzcmNcbiAgICB9O1xuXG4gICAgc2ltcGxlU3JjLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNyYztcbiAgICB9OyAvLyB2NCBjb21wYXQgLSBUT0RPOiByZW1vdmUgaW4gdjVcblxuXG4gICAgcmV0dXJuIHNpbXBsZVNyYztcbiAgfVxuXG4gIHJldHVybiBzcmM7XG59XG5mdW5jdGlvbiB0b0ludm9rZURlZmluaXRpb24oaW52b2tlQ29uZmlnKSB7XG4gIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7XG4gICAgdHlwZTogaW52b2tlXG4gIH0sIGludm9rZUNvbmZpZyksIHtcbiAgICB0b0pTT046IGZ1bmN0aW9uICgpIHtcbiAgICAgIGludm9rZUNvbmZpZy5vbkRvbmU7XG4gICAgICAgICAgaW52b2tlQ29uZmlnLm9uRXJyb3I7XG4gICAgICAgICAgdmFyIGludm9rZURlZiA9IF9fcmVzdChpbnZva2VDb25maWcsIFtcIm9uRG9uZVwiLCBcIm9uRXJyb3JcIl0pO1xuXG4gICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGludm9rZURlZiksIHtcbiAgICAgICAgdHlwZTogaW52b2tlLFxuICAgICAgICBzcmM6IHRvSW52b2tlU291cmNlKGludm9rZUNvbmZpZy5zcmMpXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgeyB0b0ludm9rZURlZmluaXRpb24sIHRvSW52b2tlU291cmNlIH07XG4iLCJ2YXIgY2hpbGRyZW4gPSAvKiNfX1BVUkVfXyovbmV3IE1hcCgpO1xudmFyIHNlc3Npb25JZEluZGV4ID0gMDtcbnZhciByZWdpc3RyeSA9IHtcbiAgYm9va0lkOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFwieDpcIi5jb25jYXQoc2Vzc2lvbklkSW5kZXgrKyk7XG4gIH0sXG4gIHJlZ2lzdGVyOiBmdW5jdGlvbiAoaWQsIGFjdG9yKSB7XG4gICAgY2hpbGRyZW4uc2V0KGlkLCBhY3Rvcik7XG4gICAgcmV0dXJuIGlkO1xuICB9LFxuICBnZXQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiBjaGlsZHJlbi5nZXQoaWQpO1xuICB9LFxuICBmcmVlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICBjaGlsZHJlbi5kZWxldGUoaWQpO1xuICB9XG59O1xuXG5leHBvcnQgeyByZWdpc3RyeSB9O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tICcuL192aXJ0dWFsL190c2xpYi5qcyc7XG5cbnZhciBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgZGVmZXJFdmVudHM6IGZhbHNlXG59O1xuXG52YXIgU2NoZWR1bGVyID1cbi8qI19fUFVSRV9fKi9cblxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTY2hlZHVsZXIob3B0aW9ucykge1xuICAgIHRoaXMucHJvY2Vzc2luZ0V2ZW50ID0gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMpLCBvcHRpb25zKTtcbiAgfVxuXG4gIFNjaGVkdWxlci5wcm90b3R5cGUuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5kZWZlckV2ZW50cykge1xuICAgICAgICB0aGlzLnNjaGVkdWxlKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnByb2Nlc3MoY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHRoaXMuZmx1c2hFdmVudHMoKTtcbiAgfTtcblxuICBTY2hlZHVsZXIucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24gKHRhc2spIHtcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQgfHwgdGhpcy5wcm9jZXNzaW5nRXZlbnQpIHtcbiAgICAgIHRoaXMucXVldWUucHVzaCh0YXNrKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXZlbnQgcXVldWUgc2hvdWxkIGJlIGVtcHR5IHdoZW4gaXQgaXMgbm90IHByb2Nlc3NpbmcgZXZlbnRzJyk7XG4gICAgfVxuXG4gICAgdGhpcy5wcm9jZXNzKHRhc2spO1xuICAgIHRoaXMuZmx1c2hFdmVudHMoKTtcbiAgfTtcblxuICBTY2hlZHVsZXIucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgfTtcblxuICBTY2hlZHVsZXIucHJvdG90eXBlLmZsdXNoRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBuZXh0Q2FsbGJhY2sgPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG5cbiAgICB3aGlsZSAobmV4dENhbGxiYWNrKSB7XG4gICAgICB0aGlzLnByb2Nlc3MobmV4dENhbGxiYWNrKTtcbiAgICAgIG5leHRDYWxsYmFjayA9IHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICB9XG4gIH07XG5cbiAgU2NoZWR1bGVyLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5wcm9jZXNzaW5nRXZlbnQgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gdGhlcmUgaXMgbm8gdXNlIHRvIGtlZXAgdGhlIGZ1dHVyZSBldmVudHNcbiAgICAgIC8vIGFzIHRoZSBzaXR1YXRpb24gaXMgbm90IGFueW1vcmUgdGhlIHNhbWVcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHRocm93IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucHJvY2Vzc2luZ0V2ZW50ID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBTY2hlZHVsZXI7XG59KCk7XG5cbmV4cG9ydCB7IFNjaGVkdWxlciB9O1xuIiwiLyoqXHJcbiAqIE1haW50YWlucyBhIHN0YWNrIG9mIHRoZSBjdXJyZW50IHNlcnZpY2UgaW4gc2NvcGUuXHJcbiAqIFRoaXMgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBjb3JyZWN0IHNlcnZpY2UgdG8gc3Bhd24oKS5cclxuICovXG52YXIgc2VydmljZVN0YWNrID0gW107XG52YXIgcHJvdmlkZSA9IGZ1bmN0aW9uIChzZXJ2aWNlLCBmbikge1xuICBzZXJ2aWNlU3RhY2sucHVzaChzZXJ2aWNlKTtcbiAgdmFyIHJlc3VsdCA9IGZuKHNlcnZpY2UpO1xuICBzZXJ2aWNlU3RhY2sucG9wKCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIGNvbnN1bWUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZuKHNlcnZpY2VTdGFja1tzZXJ2aWNlU3RhY2subGVuZ3RoIC0gMV0pO1xufTtcblxuZXhwb3J0IHsgY29uc3VtZSwgcHJvdmlkZSB9O1xuIiwiaW1wb3J0IHsgX192YWx1ZXMsIF9fc3ByZWFkQXJyYXksIF9fcmVhZCB9IGZyb20gJy4vX3ZpcnR1YWwvX3RzbGliLmpzJztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuL3V0aWxzLmpzJztcblxudmFyIGlzTGVhZk5vZGUgPSBmdW5jdGlvbiAoc3RhdGVOb2RlKSB7XG4gIHJldHVybiBzdGF0ZU5vZGUudHlwZSA9PT0gJ2F0b21pYycgfHwgc3RhdGVOb2RlLnR5cGUgPT09ICdmaW5hbCc7XG59O1xuZnVuY3Rpb24gZ2V0QWxsQ2hpbGRyZW4oc3RhdGVOb2RlKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhzdGF0ZU5vZGUuc3RhdGVzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBzdGF0ZU5vZGUuc3RhdGVzW2tleV07XG4gIH0pO1xufVxuZnVuY3Rpb24gZ2V0Q2hpbGRyZW4oc3RhdGVOb2RlKSB7XG4gIHJldHVybiBnZXRBbGxDaGlsZHJlbihzdGF0ZU5vZGUpLmZpbHRlcihmdW5jdGlvbiAoc24pIHtcbiAgICByZXR1cm4gc24udHlwZSAhPT0gJ2hpc3RvcnknO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGdldEFsbFN0YXRlTm9kZXMoc3RhdGVOb2RlKSB7XG4gIHZhciBzdGF0ZU5vZGVzID0gW3N0YXRlTm9kZV07XG5cbiAgaWYgKGlzTGVhZk5vZGUoc3RhdGVOb2RlKSkge1xuICAgIHJldHVybiBzdGF0ZU5vZGVzO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlTm9kZXMuY29uY2F0KGZsYXR0ZW4oZ2V0Q2hpbGRyZW4oc3RhdGVOb2RlKS5tYXAoZ2V0QWxsU3RhdGVOb2RlcykpKTtcbn1cbmZ1bmN0aW9uIGdldENvbmZpZ3VyYXRpb24ocHJldlN0YXRlTm9kZXMsIHN0YXRlTm9kZXMpIHtcbiAgdmFyIGVfMSwgX2EsIGVfMiwgX2IsIGVfMywgX2MsIGVfNCwgX2Q7XG5cbiAgdmFyIHByZXZDb25maWd1cmF0aW9uID0gbmV3IFNldChwcmV2U3RhdGVOb2Rlcyk7XG4gIHZhciBwcmV2QWRqTGlzdCA9IGdldEFkakxpc3QocHJldkNvbmZpZ3VyYXRpb24pO1xuICB2YXIgY29uZmlndXJhdGlvbiA9IG5ldyBTZXQoc3RhdGVOb2Rlcyk7XG5cbiAgdHJ5IHtcbiAgICAvLyBhZGQgYWxsIGFuY2VzdG9yc1xuICAgIGZvciAodmFyIGNvbmZpZ3VyYXRpb25fMSA9IF9fdmFsdWVzKGNvbmZpZ3VyYXRpb24pLCBjb25maWd1cmF0aW9uXzFfMSA9IGNvbmZpZ3VyYXRpb25fMS5uZXh0KCk7ICFjb25maWd1cmF0aW9uXzFfMS5kb25lOyBjb25maWd1cmF0aW9uXzFfMSA9IGNvbmZpZ3VyYXRpb25fMS5uZXh0KCkpIHtcbiAgICAgIHZhciBzID0gY29uZmlndXJhdGlvbl8xXzEudmFsdWU7XG4gICAgICB2YXIgbSA9IHMucGFyZW50O1xuXG4gICAgICB3aGlsZSAobSAmJiAhY29uZmlndXJhdGlvbi5oYXMobSkpIHtcbiAgICAgICAgY29uZmlndXJhdGlvbi5hZGQobSk7XG4gICAgICAgIG0gPSBtLnBhcmVudDtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVfMV8xKSB7XG4gICAgZV8xID0ge1xuICAgICAgZXJyb3I6IGVfMV8xXG4gICAgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKGNvbmZpZ3VyYXRpb25fMV8xICYmICFjb25maWd1cmF0aW9uXzFfMS5kb25lICYmIChfYSA9IGNvbmZpZ3VyYXRpb25fMS5yZXR1cm4pKSBfYS5jYWxsKGNvbmZpZ3VyYXRpb25fMSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjtcbiAgICB9XG4gIH1cblxuICB2YXIgYWRqTGlzdCA9IGdldEFkakxpc3QoY29uZmlndXJhdGlvbik7XG5cbiAgdHJ5IHtcbiAgICAvLyBhZGQgZGVzY2VuZGFudHNcbiAgICBmb3IgKHZhciBjb25maWd1cmF0aW9uXzIgPSBfX3ZhbHVlcyhjb25maWd1cmF0aW9uKSwgY29uZmlndXJhdGlvbl8yXzEgPSBjb25maWd1cmF0aW9uXzIubmV4dCgpOyAhY29uZmlndXJhdGlvbl8yXzEuZG9uZTsgY29uZmlndXJhdGlvbl8yXzEgPSBjb25maWd1cmF0aW9uXzIubmV4dCgpKSB7XG4gICAgICB2YXIgcyA9IGNvbmZpZ3VyYXRpb25fMl8xLnZhbHVlOyAvLyBpZiBwcmV2aW91c2x5IGFjdGl2ZSwgYWRkIGV4aXN0aW5nIGNoaWxkIG5vZGVzXG5cbiAgICAgIGlmIChzLnR5cGUgPT09ICdjb21wb3VuZCcgJiYgKCFhZGpMaXN0LmdldChzKSB8fCAhYWRqTGlzdC5nZXQocykubGVuZ3RoKSkge1xuICAgICAgICBpZiAocHJldkFkakxpc3QuZ2V0KHMpKSB7XG4gICAgICAgICAgcHJldkFkakxpc3QuZ2V0KHMpLmZvckVhY2goZnVuY3Rpb24gKHNuKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbi5hZGQoc24pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMuaW5pdGlhbFN0YXRlTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoc24pIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uLmFkZChzbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzLnR5cGUgPT09ICdwYXJhbGxlbCcpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2UgPSAoZV8zID0gdm9pZCAwLCBfX3ZhbHVlcyhnZXRDaGlsZHJlbihzKSkpLCBfZiA9IF9lLm5leHQoKTsgIV9mLmRvbmU7IF9mID0gX2UubmV4dCgpKSB7XG4gICAgICAgICAgICAgIHZhciBjaGlsZCA9IF9mLnZhbHVlO1xuXG4gICAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvbi5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5hZGQoY2hpbGQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHByZXZBZGpMaXN0LmdldChjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgIHByZXZBZGpMaXN0LmdldChjaGlsZCkuZm9yRWFjaChmdW5jdGlvbiAoc24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uYWRkKHNuKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjaGlsZC5pbml0aWFsU3RhdGVOb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChzbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbi5hZGQoc24pO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZV8zXzEpIHtcbiAgICAgICAgICAgIGVfMyA9IHtcbiAgICAgICAgICAgICAgZXJyb3I6IGVfM18xXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoX2YgJiYgIV9mLmRvbmUgJiYgKF9jID0gX2UucmV0dXJuKSkgX2MuY2FsbChfZSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBpZiAoZV8zKSB0aHJvdyBlXzMuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlXzJfMSkge1xuICAgIGVfMiA9IHtcbiAgICAgIGVycm9yOiBlXzJfMVxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChjb25maWd1cmF0aW9uXzJfMSAmJiAhY29uZmlndXJhdGlvbl8yXzEuZG9uZSAmJiAoX2IgPSBjb25maWd1cmF0aW9uXzIucmV0dXJuKSkgX2IuY2FsbChjb25maWd1cmF0aW9uXzIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBhZGQgYWxsIGFuY2VzdG9yc1xuICAgIGZvciAodmFyIGNvbmZpZ3VyYXRpb25fMyA9IF9fdmFsdWVzKGNvbmZpZ3VyYXRpb24pLCBjb25maWd1cmF0aW9uXzNfMSA9IGNvbmZpZ3VyYXRpb25fMy5uZXh0KCk7ICFjb25maWd1cmF0aW9uXzNfMS5kb25lOyBjb25maWd1cmF0aW9uXzNfMSA9IGNvbmZpZ3VyYXRpb25fMy5uZXh0KCkpIHtcbiAgICAgIHZhciBzID0gY29uZmlndXJhdGlvbl8zXzEudmFsdWU7XG4gICAgICB2YXIgbSA9IHMucGFyZW50O1xuXG4gICAgICB3aGlsZSAobSAmJiAhY29uZmlndXJhdGlvbi5oYXMobSkpIHtcbiAgICAgICAgY29uZmlndXJhdGlvbi5hZGQobSk7XG4gICAgICAgIG0gPSBtLnBhcmVudDtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVfNF8xKSB7XG4gICAgZV80ID0ge1xuICAgICAgZXJyb3I6IGVfNF8xXG4gICAgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKGNvbmZpZ3VyYXRpb25fM18xICYmICFjb25maWd1cmF0aW9uXzNfMS5kb25lICYmIChfZCA9IGNvbmZpZ3VyYXRpb25fMy5yZXR1cm4pKSBfZC5jYWxsKGNvbmZpZ3VyYXRpb25fMyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChlXzQpIHRocm93IGVfNC5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlndXJhdGlvbjtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVGcm9tQWRqKGJhc2VOb2RlLCBhZGpMaXN0KSB7XG4gIHZhciBjaGlsZFN0YXRlTm9kZXMgPSBhZGpMaXN0LmdldChiYXNlTm9kZSk7XG5cbiAgaWYgKCFjaGlsZFN0YXRlTm9kZXMpIHtcbiAgICByZXR1cm4ge307IC8vIHRvZG86IGZpeD9cbiAgfVxuXG4gIGlmIChiYXNlTm9kZS50eXBlID09PSAnY29tcG91bmQnKSB7XG4gICAgdmFyIGNoaWxkU3RhdGVOb2RlID0gY2hpbGRTdGF0ZU5vZGVzWzBdO1xuXG4gICAgaWYgKGNoaWxkU3RhdGVOb2RlKSB7XG4gICAgICBpZiAoaXNMZWFmTm9kZShjaGlsZFN0YXRlTm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkU3RhdGVOb2RlLmtleTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdGF0ZVZhbHVlID0ge307XG4gIGNoaWxkU3RhdGVOb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChjc24pIHtcbiAgICBzdGF0ZVZhbHVlW2Nzbi5rZXldID0gZ2V0VmFsdWVGcm9tQWRqKGNzbiwgYWRqTGlzdCk7XG4gIH0pO1xuICByZXR1cm4gc3RhdGVWYWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0QWRqTGlzdChjb25maWd1cmF0aW9uKSB7XG4gIHZhciBlXzUsIF9hO1xuXG4gIHZhciBhZGpMaXN0ID0gbmV3IE1hcCgpO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgY29uZmlndXJhdGlvbl80ID0gX192YWx1ZXMoY29uZmlndXJhdGlvbiksIGNvbmZpZ3VyYXRpb25fNF8xID0gY29uZmlndXJhdGlvbl80Lm5leHQoKTsgIWNvbmZpZ3VyYXRpb25fNF8xLmRvbmU7IGNvbmZpZ3VyYXRpb25fNF8xID0gY29uZmlndXJhdGlvbl80Lm5leHQoKSkge1xuICAgICAgdmFyIHMgPSBjb25maWd1cmF0aW9uXzRfMS52YWx1ZTtcblxuICAgICAgaWYgKCFhZGpMaXN0LmhhcyhzKSkge1xuICAgICAgICBhZGpMaXN0LnNldChzLCBbXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzLnBhcmVudCkge1xuICAgICAgICBpZiAoIWFkakxpc3QuaGFzKHMucGFyZW50KSkge1xuICAgICAgICAgIGFkakxpc3Quc2V0KHMucGFyZW50LCBbXSk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGpMaXN0LmdldChzLnBhcmVudCkucHVzaChzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVfNV8xKSB7XG4gICAgZV81ID0ge1xuICAgICAgZXJyb3I6IGVfNV8xXG4gICAgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKGNvbmZpZ3VyYXRpb25fNF8xICYmICFjb25maWd1cmF0aW9uXzRfMS5kb25lICYmIChfYSA9IGNvbmZpZ3VyYXRpb25fNC5yZXR1cm4pKSBfYS5jYWxsKGNvbmZpZ3VyYXRpb25fNCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChlXzUpIHRocm93IGVfNS5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWRqTGlzdDtcbn1cbmZ1bmN0aW9uIGdldFZhbHVlKHJvb3ROb2RlLCBjb25maWd1cmF0aW9uKSB7XG4gIHZhciBjb25maWcgPSBnZXRDb25maWd1cmF0aW9uKFtyb290Tm9kZV0sIGNvbmZpZ3VyYXRpb24pO1xuICByZXR1cm4gZ2V0VmFsdWVGcm9tQWRqKHJvb3ROb2RlLCBnZXRBZGpMaXN0KGNvbmZpZykpO1xufVxuZnVuY3Rpb24gaGFzKGl0ZXJhYmxlLCBpdGVtKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGl0ZXJhYmxlKSkge1xuICAgIHJldHVybiBpdGVyYWJsZS5zb21lKGZ1bmN0aW9uIChtZW1iZXIpIHtcbiAgICAgIHJldHVybiBtZW1iZXIgPT09IGl0ZW07XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXRlcmFibGUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICByZXR1cm4gaXRlcmFibGUuaGFzKGl0ZW0pO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlOyAvLyBUT0RPOiBmaXhcbn1cbmZ1bmN0aW9uIG5leHRFdmVudHMoY29uZmlndXJhdGlvbikge1xuICByZXR1cm4gX19zcHJlYWRBcnJheShbXSwgX19yZWFkKG5ldyBTZXQoZmxhdHRlbihfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoY29uZmlndXJhdGlvbi5tYXAoZnVuY3Rpb24gKHNuKSB7XG4gICAgcmV0dXJuIHNuLm93bkV2ZW50cztcbiAgfSkpLCBmYWxzZSkpKSksIGZhbHNlKTtcbn1cbmZ1bmN0aW9uIGlzSW5GaW5hbFN0YXRlKGNvbmZpZ3VyYXRpb24sIHN0YXRlTm9kZSkge1xuICBpZiAoc3RhdGVOb2RlLnR5cGUgPT09ICdjb21wb3VuZCcpIHtcbiAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oc3RhdGVOb2RlKS5zb21lKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gcy50eXBlID09PSAnZmluYWwnICYmIGhhcyhjb25maWd1cmF0aW9uLCBzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChzdGF0ZU5vZGUudHlwZSA9PT0gJ3BhcmFsbGVsJykge1xuICAgIHJldHVybiBnZXRDaGlsZHJlbihzdGF0ZU5vZGUpLmV2ZXJ5KGZ1bmN0aW9uIChzbikge1xuICAgICAgcmV0dXJuIGlzSW5GaW5hbFN0YXRlKGNvbmZpZ3VyYXRpb24sIHNuKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldE1ldGEoY29uZmlndXJhdGlvbikge1xuICBpZiAoY29uZmlndXJhdGlvbiA9PT0gdm9pZCAwKSB7XG4gICAgY29uZmlndXJhdGlvbiA9IFtdO1xuICB9XG5cbiAgcmV0dXJuIGNvbmZpZ3VyYXRpb24ucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHN0YXRlTm9kZSkge1xuICAgIGlmIChzdGF0ZU5vZGUubWV0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY2Nbc3RhdGVOb2RlLmlkXSA9IHN0YXRlTm9kZS5tZXRhO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn1cbmZ1bmN0aW9uIGdldFRhZ3NGcm9tQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XG4gIHJldHVybiBuZXcgU2V0KGZsYXR0ZW4oY29uZmlndXJhdGlvbi5tYXAoZnVuY3Rpb24gKHNuKSB7XG4gICAgcmV0dXJuIHNuLnRhZ3M7XG4gIH0pKSk7XG59XG5cbmV4cG9ydCB7IGdldEFkakxpc3QsIGdldEFsbENoaWxkcmVuLCBnZXRBbGxTdGF0ZU5vZGVzLCBnZXRDaGlsZHJlbiwgZ2V0Q29uZmlndXJhdGlvbiwgZ2V0TWV0YSwgZ2V0VGFnc0Zyb21Db25maWd1cmF0aW9uLCBnZXRWYWx1ZSwgaGFzLCBpc0luRmluYWxTdGF0ZSwgaXNMZWFmTm9kZSwgbmV4dEV2ZW50cyB9O1xuIiwidmFyIEFjdGlvblR5cGVzO1xuXG4oZnVuY3Rpb24gKEFjdGlvblR5cGVzKSB7XG4gIEFjdGlvblR5cGVzW1wiU3RhcnRcIl0gPSBcInhzdGF0ZS5zdGFydFwiO1xuICBBY3Rpb25UeXBlc1tcIlN0b3BcIl0gPSBcInhzdGF0ZS5zdG9wXCI7XG4gIEFjdGlvblR5cGVzW1wiUmFpc2VcIl0gPSBcInhzdGF0ZS5yYWlzZVwiO1xuICBBY3Rpb25UeXBlc1tcIlNlbmRcIl0gPSBcInhzdGF0ZS5zZW5kXCI7XG4gIEFjdGlvblR5cGVzW1wiQ2FuY2VsXCJdID0gXCJ4c3RhdGUuY2FuY2VsXCI7XG4gIEFjdGlvblR5cGVzW1wiTnVsbEV2ZW50XCJdID0gXCJcIjtcbiAgQWN0aW9uVHlwZXNbXCJBc3NpZ25cIl0gPSBcInhzdGF0ZS5hc3NpZ25cIjtcbiAgQWN0aW9uVHlwZXNbXCJBZnRlclwiXSA9IFwieHN0YXRlLmFmdGVyXCI7XG4gIEFjdGlvblR5cGVzW1wiRG9uZVN0YXRlXCJdID0gXCJkb25lLnN0YXRlXCI7XG4gIEFjdGlvblR5cGVzW1wiRG9uZUludm9rZVwiXSA9IFwiZG9uZS5pbnZva2VcIjtcbiAgQWN0aW9uVHlwZXNbXCJMb2dcIl0gPSBcInhzdGF0ZS5sb2dcIjtcbiAgQWN0aW9uVHlwZXNbXCJJbml0XCJdID0gXCJ4c3RhdGUuaW5pdFwiO1xuICBBY3Rpb25UeXBlc1tcIkludm9rZVwiXSA9IFwieHN0YXRlLmludm9rZVwiO1xuICBBY3Rpb25UeXBlc1tcIkVycm9yRXhlY3V0aW9uXCJdID0gXCJlcnJvci5leGVjdXRpb25cIjtcbiAgQWN0aW9uVHlwZXNbXCJFcnJvckNvbW11bmljYXRpb25cIl0gPSBcImVycm9yLmNvbW11bmljYXRpb25cIjtcbiAgQWN0aW9uVHlwZXNbXCJFcnJvclBsYXRmb3JtXCJdID0gXCJlcnJvci5wbGF0Zm9ybVwiO1xuICBBY3Rpb25UeXBlc1tcIkVycm9yQ3VzdG9tXCJdID0gXCJ4c3RhdGUuZXJyb3JcIjtcbiAgQWN0aW9uVHlwZXNbXCJVcGRhdGVcIl0gPSBcInhzdGF0ZS51cGRhdGVcIjtcbiAgQWN0aW9uVHlwZXNbXCJQdXJlXCJdID0gXCJ4c3RhdGUucHVyZVwiO1xuICBBY3Rpb25UeXBlc1tcIkNob29zZVwiXSA9IFwieHN0YXRlLmNob29zZVwiO1xufSkoQWN0aW9uVHlwZXMgfHwgKEFjdGlvblR5cGVzID0ge30pKTtcblxudmFyIFNwZWNpYWxUYXJnZXRzO1xuXG4oZnVuY3Rpb24gKFNwZWNpYWxUYXJnZXRzKSB7XG4gIFNwZWNpYWxUYXJnZXRzW1wiUGFyZW50XCJdID0gXCIjX3BhcmVudFwiO1xuICBTcGVjaWFsVGFyZ2V0c1tcIkludGVybmFsXCJdID0gXCIjX2ludGVybmFsXCI7XG59KShTcGVjaWFsVGFyZ2V0cyB8fCAoU3BlY2lhbFRhcmdldHMgPSB7fSkpO1xuXG5leHBvcnQgeyBBY3Rpb25UeXBlcywgU3BlY2lhbFRhcmdldHMgfTtcbiIsImltcG9ydCB7IF9fdmFsdWVzLCBfX3NwcmVhZEFycmF5LCBfX3JlYWQsIF9fYXNzaWduIH0gZnJvbSAnLi9fdmlydHVhbC9fdHNsaWIuanMnO1xuaW1wb3J0IHsgU3BlY2lhbFRhcmdldHMgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IHJhaXNlLCBzZW5kIH0gZnJvbSAnLi9hY3Rpb25UeXBlcy5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX0dVQVJEX1RZUEUsIFRBUkdFVExFU1NfS0VZLCBTVEFURV9ERUxJTUlURVIgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBJU19QUk9EVUNUSU9OIH0gZnJvbSAnLi9lbnZpcm9ubWVudC5qcyc7XG5cbnZhciBfYTtcbmZ1bmN0aW9uIGtleXModmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIG1hdGNoZXNTdGF0ZShwYXJlbnRTdGF0ZUlkLCBjaGlsZFN0YXRlSWQsIGRlbGltaXRlcikge1xuICBpZiAoZGVsaW1pdGVyID09PSB2b2lkIDApIHtcbiAgICBkZWxpbWl0ZXIgPSBTVEFURV9ERUxJTUlURVI7XG4gIH1cblxuICB2YXIgcGFyZW50U3RhdGVWYWx1ZSA9IHRvU3RhdGVWYWx1ZShwYXJlbnRTdGF0ZUlkLCBkZWxpbWl0ZXIpO1xuICB2YXIgY2hpbGRTdGF0ZVZhbHVlID0gdG9TdGF0ZVZhbHVlKGNoaWxkU3RhdGVJZCwgZGVsaW1pdGVyKTtcblxuICBpZiAoaXNTdHJpbmcoY2hpbGRTdGF0ZVZhbHVlKSkge1xuICAgIGlmIChpc1N0cmluZyhwYXJlbnRTdGF0ZVZhbHVlKSkge1xuICAgICAgcmV0dXJuIGNoaWxkU3RhdGVWYWx1ZSA9PT0gcGFyZW50U3RhdGVWYWx1ZTtcbiAgICB9IC8vIFBhcmVudCBtb3JlIHNwZWNpZmljIHRoYW4gY2hpbGRcblxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzU3RyaW5nKHBhcmVudFN0YXRlVmFsdWUpKSB7XG4gICAgcmV0dXJuIHBhcmVudFN0YXRlVmFsdWUgaW4gY2hpbGRTdGF0ZVZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcmVudFN0YXRlVmFsdWUpLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoIShrZXkgaW4gY2hpbGRTdGF0ZVZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVzU3RhdGUocGFyZW50U3RhdGVWYWx1ZVtrZXldLCBjaGlsZFN0YXRlVmFsdWVba2V5XSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZ2V0RXZlbnRUeXBlKGV2ZW50KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKGV2ZW50KSB8fCB0eXBlb2YgZXZlbnQgPT09ICdudW1iZXInID8gXCJcIi5jb25jYXQoZXZlbnQpIDogZXZlbnQudHlwZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXZlbnRzIG11c3QgYmUgc3RyaW5ncyBvciBvYmplY3RzIHdpdGggYSBzdHJpbmcgZXZlbnQudHlwZSBwcm9wZXJ0eS4nKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0QWN0aW9uVHlwZShhY3Rpb24pIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXNTdHJpbmcoYWN0aW9uKSB8fCB0eXBlb2YgYWN0aW9uID09PSAnbnVtYmVyJyA/IFwiXCIuY29uY2F0KGFjdGlvbikgOiBpc0Z1bmN0aW9uKGFjdGlvbikgPyBhY3Rpb24ubmFtZSA6IGFjdGlvbi50eXBlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBY3Rpb25zIG11c3QgYmUgc3RyaW5ncyBvciBvYmplY3RzIHdpdGggYSBzdHJpbmcgYWN0aW9uLnR5cGUgcHJvcGVydHkuJyk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRvU3RhdGVQYXRoKHN0YXRlSWQsIGRlbGltaXRlcikge1xuICB0cnkge1xuICAgIGlmIChpc0FycmF5KHN0YXRlSWQpKSB7XG4gICAgICByZXR1cm4gc3RhdGVJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVJZC50b1N0cmluZygpLnNwbGl0KGRlbGltaXRlcik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInXCIuY29uY2F0KHN0YXRlSWQsIFwiJyBpcyBub3QgYSB2YWxpZCBzdGF0ZSBwYXRoLlwiKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzU3RhdGVMaWtlKHN0YXRlKSB7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09ICdvYmplY3QnICYmICd2YWx1ZScgaW4gc3RhdGUgJiYgJ2NvbnRleHQnIGluIHN0YXRlICYmICdldmVudCcgaW4gc3RhdGUgJiYgJ19ldmVudCcgaW4gc3RhdGU7XG59XG5mdW5jdGlvbiB0b1N0YXRlVmFsdWUoc3RhdGVWYWx1ZSwgZGVsaW1pdGVyKSB7XG4gIGlmIChpc1N0YXRlTGlrZShzdGF0ZVZhbHVlKSkge1xuICAgIHJldHVybiBzdGF0ZVZhbHVlLnZhbHVlO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkoc3RhdGVWYWx1ZSkpIHtcbiAgICByZXR1cm4gcGF0aFRvU3RhdGVWYWx1ZShzdGF0ZVZhbHVlKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RhdGVWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RhdGVWYWx1ZTtcbiAgfVxuXG4gIHZhciBzdGF0ZVBhdGggPSB0b1N0YXRlUGF0aChzdGF0ZVZhbHVlLCBkZWxpbWl0ZXIpO1xuICByZXR1cm4gcGF0aFRvU3RhdGVWYWx1ZShzdGF0ZVBhdGgpO1xufVxuZnVuY3Rpb24gcGF0aFRvU3RhdGVWYWx1ZShzdGF0ZVBhdGgpIHtcbiAgaWYgKHN0YXRlUGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gc3RhdGVQYXRoWzBdO1xuICB9XG5cbiAgdmFyIHZhbHVlID0ge307XG4gIHZhciBtYXJrZXIgPSB2YWx1ZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlUGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBpZiAoaSA9PT0gc3RhdGVQYXRoLmxlbmd0aCAtIDIpIHtcbiAgICAgIG1hcmtlcltzdGF0ZVBhdGhbaV1dID0gc3RhdGVQYXRoW2kgKyAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFya2VyW3N0YXRlUGF0aFtpXV0gPSB7fTtcbiAgICAgIG1hcmtlciA9IG1hcmtlcltzdGF0ZVBhdGhbaV1dO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIG1hcFZhbHVlcyhjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIHZhciBjb2xsZWN0aW9uS2V5cyA9IE9iamVjdC5rZXlzKGNvbGxlY3Rpb24pO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29sbGVjdGlvbktleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gY29sbGVjdGlvbktleXNbaV07XG4gICAgcmVzdWx0W2tleV0gPSBpdGVyYXRlZShjb2xsZWN0aW9uW2tleV0sIGtleSwgY29sbGVjdGlvbiwgaSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbWFwRmlsdGVyVmFsdWVzKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGVfMSwgX2E7XG5cbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhPYmplY3Qua2V5cyhjb2xsZWN0aW9uKSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgIHZhciBrZXkgPSBfYy52YWx1ZTtcbiAgICAgIHZhciBpdGVtID0gY29sbGVjdGlvbltrZXldO1xuXG4gICAgICBpZiAoIXByZWRpY2F0ZShpdGVtKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W2tleV0gPSBpdGVyYXRlZShpdGVtLCBrZXksIGNvbGxlY3Rpb24pO1xuICAgIH1cbiAgfSBjYXRjaCAoZV8xXzEpIHtcbiAgICBlXzEgPSB7XG4gICAgICBlcnJvcjogZV8xXzFcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXHJcbiAqIFJldHJpZXZlcyBhIHZhbHVlIGF0IHRoZSBnaXZlbiBwYXRoLlxyXG4gKiBAcGFyYW0gcHJvcHMgVGhlIGRlZXAgcGF0aCB0byB0aGUgcHJvcCBvZiB0aGUgZGVzaXJlZCB2YWx1ZVxyXG4gKi9cblxudmFyIHBhdGggPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICB2YXIgZV8yLCBfYTtcblxuICAgIHZhciByZXN1bHQgPSBvYmplY3Q7XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgcHJvcHNfMSA9IF9fdmFsdWVzKHByb3BzKSwgcHJvcHNfMV8xID0gcHJvcHNfMS5uZXh0KCk7ICFwcm9wc18xXzEuZG9uZTsgcHJvcHNfMV8xID0gcHJvcHNfMS5uZXh0KCkpIHtcbiAgICAgICAgdmFyIHByb3AgPSBwcm9wc18xXzEudmFsdWU7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdFtwcm9wXTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlXzJfMSkge1xuICAgICAgZV8yID0ge1xuICAgICAgICBlcnJvcjogZV8yXzFcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChwcm9wc18xXzEgJiYgIXByb3BzXzFfMS5kb25lICYmIChfYSA9IHByb3BzXzEucmV0dXJuKSkgX2EuY2FsbChwcm9wc18xKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcbi8qKlxyXG4gKiBSZXRyaWV2ZXMgYSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEgdGhlIG5lc3RlZCBhY2Nlc3NvciBwcm9wLlxyXG4gKiBAcGFyYW0gcHJvcHMgVGhlIGRlZXAgcGF0aCB0byB0aGUgcHJvcCBvZiB0aGUgZGVzaXJlZCB2YWx1ZVxyXG4gKi9cblxuZnVuY3Rpb24gbmVzdGVkUGF0aChwcm9wcywgYWNjZXNzb3JQcm9wKSB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgdmFyIGVfMywgX2E7XG5cbiAgICB2YXIgcmVzdWx0ID0gb2JqZWN0O1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIHByb3BzXzIgPSBfX3ZhbHVlcyhwcm9wcyksIHByb3BzXzJfMSA9IHByb3BzXzIubmV4dCgpOyAhcHJvcHNfMl8xLmRvbmU7IHByb3BzXzJfMSA9IHByb3BzXzIubmV4dCgpKSB7XG4gICAgICAgIHZhciBwcm9wID0gcHJvcHNfMl8xLnZhbHVlO1xuICAgICAgICByZXN1bHQgPSByZXN1bHRbYWNjZXNzb3JQcm9wXVtwcm9wXTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlXzNfMSkge1xuICAgICAgZV8zID0ge1xuICAgICAgICBlcnJvcjogZV8zXzFcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChwcm9wc18yXzEgJiYgIXByb3BzXzJfMS5kb25lICYmIChfYSA9IHByb3BzXzIucmV0dXJuKSkgX2EuY2FsbChwcm9wc18yKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuZnVuY3Rpb24gdG9TdGF0ZVBhdGhzKHN0YXRlVmFsdWUpIHtcbiAgaWYgKCFzdGF0ZVZhbHVlKSB7XG4gICAgcmV0dXJuIFtbXV07XG4gIH1cblxuICBpZiAoaXNTdHJpbmcoc3RhdGVWYWx1ZSkpIHtcbiAgICByZXR1cm4gW1tzdGF0ZVZhbHVlXV07XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gZmxhdHRlbihPYmplY3Qua2V5cyhzdGF0ZVZhbHVlKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBzdWJTdGF0ZVZhbHVlID0gc3RhdGVWYWx1ZVtrZXldO1xuXG4gICAgaWYgKHR5cGVvZiBzdWJTdGF0ZVZhbHVlICE9PSAnc3RyaW5nJyAmJiAoIXN1YlN0YXRlVmFsdWUgfHwgIU9iamVjdC5rZXlzKHN1YlN0YXRlVmFsdWUpLmxlbmd0aCkpIHtcbiAgICAgIHJldHVybiBbW2tleV1dO1xuICAgIH1cblxuICAgIHJldHVybiB0b1N0YXRlUGF0aHMoc3RhdGVWYWx1ZVtrZXldKS5tYXAoZnVuY3Rpb24gKHN1YlBhdGgpIHtcbiAgICAgIHJldHVybiBba2V5XS5jb25jYXQoc3ViUGF0aCk7XG4gICAgfSk7XG4gIH0pKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHBhdGhzVG9TdGF0ZVZhbHVlKHBhdGhzKSB7XG4gIHZhciBlXzQsIF9hO1xuXG4gIHZhciByZXN1bHQgPSB7fTtcblxuICBpZiAocGF0aHMgJiYgcGF0aHMubGVuZ3RoID09PSAxICYmIHBhdGhzWzBdLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBwYXRoc1swXVswXTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgcGF0aHNfMSA9IF9fdmFsdWVzKHBhdGhzKSwgcGF0aHNfMV8xID0gcGF0aHNfMS5uZXh0KCk7ICFwYXRoc18xXzEuZG9uZTsgcGF0aHNfMV8xID0gcGF0aHNfMS5uZXh0KCkpIHtcbiAgICAgIHZhciBjdXJyZW50UGF0aCA9IHBhdGhzXzFfMS52YWx1ZTtcbiAgICAgIHZhciBtYXJrZXIgPSByZXN1bHQ7IC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VycmVudFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHN1YlBhdGggPSBjdXJyZW50UGF0aFtpXTtcblxuICAgICAgICBpZiAoaSA9PT0gY3VycmVudFBhdGgubGVuZ3RoIC0gMikge1xuICAgICAgICAgIG1hcmtlcltzdWJQYXRoXSA9IGN1cnJlbnRQYXRoW2kgKyAxXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcmtlcltzdWJQYXRoXSA9IG1hcmtlcltzdWJQYXRoXSB8fCB7fTtcbiAgICAgICAgbWFya2VyID0gbWFya2VyW3N1YlBhdGhdO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZV80XzEpIHtcbiAgICBlXzQgPSB7XG4gICAgICBlcnJvcjogZV80XzFcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAocGF0aHNfMV8xICYmICFwYXRoc18xXzEuZG9uZSAmJiAoX2EgPSBwYXRoc18xLnJldHVybikpIF9hLmNhbGwocGF0aHNfMSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChlXzQpIHRocm93IGVfNC5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICB2YXIgX2E7XG5cbiAgcmV0dXJuIChfYSA9IFtdKS5jb25jYXQuYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChhcnJheSksIGZhbHNlKSk7XG59XG5mdW5jdGlvbiB0b0FycmF5U3RyaWN0KHZhbHVlKSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBbdmFsdWVdO1xufVxuZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiB0b0FycmF5U3RyaWN0KHZhbHVlKTtcbn1cbmZ1bmN0aW9uIG1hcENvbnRleHQobWFwcGVyLCBjb250ZXh0LCBfZXZlbnQpIHtcbiAgdmFyIGVfNSwgX2E7XG5cbiAgaWYgKGlzRnVuY3Rpb24obWFwcGVyKSkge1xuICAgIHJldHVybiBtYXBwZXIoY29udGV4dCwgX2V2ZW50LmRhdGEpO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhPYmplY3Qua2V5cyhtYXBwZXIpKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgdmFyIGtleSA9IF9jLnZhbHVlO1xuICAgICAgdmFyIHN1Yk1hcHBlciA9IG1hcHBlcltrZXldO1xuXG4gICAgICBpZiAoaXNGdW5jdGlvbihzdWJNYXBwZXIpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gc3ViTWFwcGVyKGNvbnRleHQsIF9ldmVudC5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gc3ViTWFwcGVyO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZV81XzEpIHtcbiAgICBlXzUgPSB7XG4gICAgICBlcnJvcjogZV81XzFcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChlXzUpIHRocm93IGVfNS5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gaXNCdWlsdEluRXZlbnQoZXZlbnRUeXBlKSB7XG4gIHJldHVybiAvXihkb25lfGVycm9yKVxcLi8udGVzdChldmVudFR5cGUpO1xufVxuZnVuY3Rpb24gaXNQcm9taXNlTGlrZSh2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gQ2hlY2sgaWYgc2hhcGUgbWF0Y2hlcyB0aGUgUHJvbWlzZS9BKyBzcGVjaWZpY2F0aW9uIGZvciBhIFwidGhlbmFibGVcIi5cblxuXG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiAoaXNGdW5jdGlvbih2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgJiYgaXNGdW5jdGlvbih2YWx1ZS50aGVuKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNCZWhhdmlvcih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAndHJhbnNpdGlvbicgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRyYW5zaXRpb24gPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBwYXJ0aXRpb24oaXRlbXMsIHByZWRpY2F0ZSkge1xuICB2YXIgZV82LCBfYTtcblxuICB2YXIgX2IgPSBfX3JlYWQoW1tdLCBbXV0sIDIpLFxuICAgICAgdHJ1dGh5ID0gX2JbMF0sXG4gICAgICBmYWxzeSA9IF9iWzFdO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgaXRlbXNfMSA9IF9fdmFsdWVzKGl0ZW1zKSwgaXRlbXNfMV8xID0gaXRlbXNfMS5uZXh0KCk7ICFpdGVtc18xXzEuZG9uZTsgaXRlbXNfMV8xID0gaXRlbXNfMS5uZXh0KCkpIHtcbiAgICAgIHZhciBpdGVtID0gaXRlbXNfMV8xLnZhbHVlO1xuXG4gICAgICBpZiAocHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgIHRydXRoeS5wdXNoKGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmFsc3kucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVfNl8xKSB7XG4gICAgZV82ID0ge1xuICAgICAgZXJyb3I6IGVfNl8xXG4gICAgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKGl0ZW1zXzFfMSAmJiAhaXRlbXNfMV8xLmRvbmUgJiYgKF9hID0gaXRlbXNfMS5yZXR1cm4pKSBfYS5jYWxsKGl0ZW1zXzEpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoZV82KSB0aHJvdyBlXzYuZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFt0cnV0aHksIGZhbHN5XTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUhpc3RvcnlTdGF0ZXMoaGlzdCwgc3RhdGVWYWx1ZSkge1xuICByZXR1cm4gbWFwVmFsdWVzKGhpc3Quc3RhdGVzLCBmdW5jdGlvbiAoc3ViSGlzdCwga2V5KSB7XG4gICAgaWYgKCFzdWJIaXN0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHZhciBzdWJTdGF0ZVZhbHVlID0gKGlzU3RyaW5nKHN0YXRlVmFsdWUpID8gdW5kZWZpbmVkIDogc3RhdGVWYWx1ZVtrZXldKSB8fCAoc3ViSGlzdCA/IHN1Ykhpc3QuY3VycmVudCA6IHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoIXN1YlN0YXRlVmFsdWUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQ6IHN1YlN0YXRlVmFsdWUsXG4gICAgICBzdGF0ZXM6IHVwZGF0ZUhpc3RvcnlTdGF0ZXMoc3ViSGlzdCwgc3ViU3RhdGVWYWx1ZSlcbiAgICB9O1xuICB9KTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUhpc3RvcnlWYWx1ZShoaXN0LCBzdGF0ZVZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgY3VycmVudDogc3RhdGVWYWx1ZSxcbiAgICBzdGF0ZXM6IHVwZGF0ZUhpc3RvcnlTdGF0ZXMoaGlzdCwgc3RhdGVWYWx1ZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHQoY29udGV4dCwgX2V2ZW50LCBhc3NpZ25BY3Rpb25zLCBzdGF0ZSkge1xuICBpZiAoIUlTX1BST0RVQ1RJT04pIHtcbiAgICB3YXJuKCEhY29udGV4dCwgJ0F0dGVtcHRpbmcgdG8gdXBkYXRlIHVuZGVmaW5lZCBjb250ZXh0Jyk7XG4gIH1cblxuICB2YXIgdXBkYXRlZENvbnRleHQgPSBjb250ZXh0ID8gYXNzaWduQWN0aW9ucy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgYXNzaWduQWN0aW9uKSB7XG4gICAgdmFyIGVfNywgX2E7XG5cbiAgICB2YXIgYXNzaWdubWVudCA9IGFzc2lnbkFjdGlvbi5hc3NpZ25tZW50O1xuICAgIHZhciBtZXRhID0ge1xuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgYWN0aW9uOiBhc3NpZ25BY3Rpb24sXG4gICAgICBfZXZlbnQ6IF9ldmVudFxuICAgIH07XG4gICAgdmFyIHBhcnRpYWxVcGRhdGUgPSB7fTtcblxuICAgIGlmIChpc0Z1bmN0aW9uKGFzc2lnbm1lbnQpKSB7XG4gICAgICBwYXJ0aWFsVXBkYXRlID0gYXNzaWdubWVudChhY2MsIF9ldmVudC5kYXRhLCBtZXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhPYmplY3Qua2V5cyhhc3NpZ25tZW50KSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIga2V5ID0gX2MudmFsdWU7XG4gICAgICAgICAgdmFyIHByb3BBc3NpZ25tZW50ID0gYXNzaWdubWVudFtrZXldO1xuICAgICAgICAgIHBhcnRpYWxVcGRhdGVba2V5XSA9IGlzRnVuY3Rpb24ocHJvcEFzc2lnbm1lbnQpID8gcHJvcEFzc2lnbm1lbnQoYWNjLCBfZXZlbnQuZGF0YSwgbWV0YSkgOiBwcm9wQXNzaWdubWVudDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZV83XzEpIHtcbiAgICAgICAgZV83ID0ge1xuICAgICAgICAgIGVycm9yOiBlXzdfMVxuICAgICAgICB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKGVfNykgdGhyb3cgZV83LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGFjYywgcGFydGlhbFVwZGF0ZSk7XG4gIH0sIGNvbnRleHQpIDogY29udGV4dDtcbiAgcmV0dXJuIHVwZGF0ZWRDb250ZXh0O1xufSAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZW1wdHlcblxudmFyIHdhcm4gPSBmdW5jdGlvbiAoKSB7fTtcblxuaWYgKCFJU19QUk9EVUNUSU9OKSB7XG4gIHdhcm4gPSBmdW5jdGlvbiAoY29uZGl0aW9uLCBtZXNzYWdlKSB7XG4gICAgdmFyIGVycm9yID0gY29uZGl0aW9uIGluc3RhbmNlb2YgRXJyb3IgPyBjb25kaXRpb24gOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWVycm9yICYmIGNvbmRpdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb25zb2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBhcmdzID0gW1wiV2FybmluZzogXCIuY29uY2F0KG1lc3NhZ2UpXTtcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGFyZ3MucHVzaChlcnJvcik7XG4gICAgICB9IC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG5cblxuICAgICAgY29uc29sZS53YXJuLmFwcGx5KGNvbnNvbGUsIGFyZ3MpO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGlzQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpO1xufSAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6YmFuLXR5cGVzXG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xufVxuZnVuY3Rpb24gdG9HdWFyZChjb25kaXRpb24sIGd1YXJkTWFwKSB7XG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChpc1N0cmluZyhjb25kaXRpb24pKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IERFRkFVTFRfR1VBUkRfVFlQRSxcbiAgICAgIG5hbWU6IGNvbmRpdGlvbixcbiAgICAgIHByZWRpY2F0ZTogZ3VhcmRNYXAgPyBndWFyZE1hcFtjb25kaXRpb25dIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpc0Z1bmN0aW9uKGNvbmRpdGlvbikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogREVGQVVMVF9HVUFSRF9UWVBFLFxuICAgICAgbmFtZTogY29uZGl0aW9uLm5hbWUsXG4gICAgICBwcmVkaWNhdGU6IGNvbmRpdGlvblxuICAgIH07XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9uO1xufVxuZnVuY3Rpb24gaXNPYnNlcnZhYmxlKHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICdzdWJzY3JpYmUnIGluIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUuc3Vic2NyaWJlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxudmFyIHN5bWJvbE9ic2VydmFibGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJztcbn0oKTsgLy8gVE9ETzogdG8gYmUgcmVtb3ZlZCBpbiB2NSwgbGVmdCBpdCBvdXQganVzdCB0byBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZSBhbmQgbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIGludGVncmF0aW9uIHBhYWNrYWdlc1xuXG52YXIgaW50ZXJvcFN5bWJvbHMgPSAoX2EgPSB7fSwgX2Fbc3ltYm9sT2JzZXJ2YWJsZV0gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzO1xufSwgX2FbU3ltYm9sLm9ic2VydmFibGVdID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcztcbn0sIF9hKTtcbmZ1bmN0aW9uIGlzTWFjaGluZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiAnX194c3RhdGVub2RlJyBpbiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGlzQWN0b3IodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnNlbmQgPT09ICdmdW5jdGlvbic7XG59XG52YXIgdW5pcXVlSWQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICB2YXIgY3VycmVudElkID0gMDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBjdXJyZW50SWQrKztcbiAgICByZXR1cm4gY3VycmVudElkLnRvU3RyaW5nKDE2KTtcbiAgfTtcbn0oKTtcbmZ1bmN0aW9uIHRvRXZlbnRPYmplY3QoZXZlbnQsIHBheWxvYWQgLy8gaWQ/OiBURXZlbnRbJ3R5cGUnXVxuKSB7XG4gIGlmIChpc1N0cmluZyhldmVudCkgfHwgdHlwZW9mIGV2ZW50ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBfX2Fzc2lnbih7XG4gICAgICB0eXBlOiBldmVudFxuICAgIH0sIHBheWxvYWQpO1xuICB9XG5cbiAgcmV0dXJuIGV2ZW50O1xufVxuZnVuY3Rpb24gdG9TQ1hNTEV2ZW50KGV2ZW50LCBzY3htbEV2ZW50KSB7XG4gIGlmICghaXNTdHJpbmcoZXZlbnQpICYmICckJHR5cGUnIGluIGV2ZW50ICYmIGV2ZW50LiQkdHlwZSA9PT0gJ3NjeG1sJykge1xuICAgIHJldHVybiBldmVudDtcbiAgfVxuXG4gIHZhciBldmVudE9iamVjdCA9IHRvRXZlbnRPYmplY3QoZXZlbnQpO1xuICByZXR1cm4gX19hc3NpZ24oe1xuICAgIG5hbWU6IGV2ZW50T2JqZWN0LnR5cGUsXG4gICAgZGF0YTogZXZlbnRPYmplY3QsXG4gICAgJCR0eXBlOiAnc2N4bWwnLFxuICAgIHR5cGU6ICdleHRlcm5hbCdcbiAgfSwgc2N4bWxFdmVudCk7XG59XG5mdW5jdGlvbiB0b1RyYW5zaXRpb25Db25maWdBcnJheShldmVudCwgY29uZmlnTGlrZSkge1xuICB2YXIgdHJhbnNpdGlvbnMgPSB0b0FycmF5U3RyaWN0KGNvbmZpZ0xpa2UpLm1hcChmdW5jdGlvbiAodHJhbnNpdGlvbkxpa2UpIHtcbiAgICBpZiAodHlwZW9mIHRyYW5zaXRpb25MaWtlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgdHJhbnNpdGlvbkxpa2UgPT09ICdzdHJpbmcnIHx8IGlzTWFjaGluZSh0cmFuc2l0aW9uTGlrZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogdHJhbnNpdGlvbkxpa2UsXG4gICAgICAgIGV2ZW50OiBldmVudFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIHRyYW5zaXRpb25MaWtlKSwge1xuICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gdHJhbnNpdGlvbnM7XG59XG5mdW5jdGlvbiBub3JtYWxpemVUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IFRBUkdFVExFU1NfS0VZKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB0b0FycmF5KHRhcmdldCk7XG59XG5mdW5jdGlvbiByZXBvcnRVbmhhbmRsZWRFeGNlcHRpb25Pbkludm9jYXRpb24ob3JpZ2luYWxFcnJvciwgY3VycmVudEVycm9yLCBpZCkge1xuICBpZiAoIUlTX1BST0RVQ1RJT04pIHtcbiAgICB2YXIgb3JpZ2luYWxTdGFja1RyYWNlID0gb3JpZ2luYWxFcnJvci5zdGFjayA/IFwiIFN0YWNrdHJhY2Ugd2FzICdcIi5jb25jYXQob3JpZ2luYWxFcnJvci5zdGFjaywgXCInXCIpIDogJyc7XG5cbiAgICBpZiAob3JpZ2luYWxFcnJvciA9PT0gY3VycmVudEVycm9yKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihcIk1pc3Npbmcgb25FcnJvciBoYW5kbGVyIGZvciBpbnZvY2F0aW9uICdcIi5jb25jYXQoaWQsIFwiJywgZXJyb3Igd2FzICdcIikuY29uY2F0KG9yaWdpbmFsRXJyb3IsIFwiJy5cIikuY29uY2F0KG9yaWdpbmFsU3RhY2tUcmFjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc3RhY2tUcmFjZSA9IGN1cnJlbnRFcnJvci5zdGFjayA/IFwiIFN0YWNrdHJhY2Ugd2FzICdcIi5jb25jYXQoY3VycmVudEVycm9yLnN0YWNrLCBcIidcIikgOiAnJzsgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcblxuICAgICAgY29uc29sZS5lcnJvcihcIk1pc3Npbmcgb25FcnJvciBoYW5kbGVyIGFuZC9vciB1bmhhbmRsZWQgZXhjZXB0aW9uL3Byb21pc2UgcmVqZWN0aW9uIGZvciBpbnZvY2F0aW9uICdcIi5jb25jYXQoaWQsIFwiJy4gXCIpICsgXCJPcmlnaW5hbCBlcnJvcjogJ1wiLmNvbmNhdChvcmlnaW5hbEVycm9yLCBcIicuIFwiKS5jb25jYXQob3JpZ2luYWxTdGFja1RyYWNlLCBcIiBDdXJyZW50IGVycm9yIGlzICdcIikuY29uY2F0KGN1cnJlbnRFcnJvciwgXCInLlwiKS5jb25jYXQoc3RhY2tUcmFjZSkpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXZhbHVhdGVHdWFyZChtYWNoaW5lLCBndWFyZCwgY29udGV4dCwgX2V2ZW50LCBzdGF0ZSkge1xuICB2YXIgZ3VhcmRzID0gbWFjaGluZS5vcHRpb25zLmd1YXJkcztcbiAgdmFyIGd1YXJkTWV0YSA9IHtcbiAgICBzdGF0ZTogc3RhdGUsXG4gICAgY29uZDogZ3VhcmQsXG4gICAgX2V2ZW50OiBfZXZlbnRcbiAgfTsgLy8gVE9ETzogZG8gbm90IGhhcmRjb2RlIVxuXG4gIGlmIChndWFyZC50eXBlID09PSBERUZBVUxUX0dVQVJEX1RZUEUpIHtcbiAgICByZXR1cm4gKChndWFyZHMgPT09IG51bGwgfHwgZ3VhcmRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBndWFyZHNbZ3VhcmQubmFtZV0pIHx8IGd1YXJkLnByZWRpY2F0ZSkoY29udGV4dCwgX2V2ZW50LmRhdGEsIGd1YXJkTWV0YSk7XG4gIH1cblxuICB2YXIgY29uZEZuID0gZ3VhcmRzID09PSBudWxsIHx8IGd1YXJkcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZ3VhcmRzW2d1YXJkLnR5cGVdO1xuXG4gIGlmICghY29uZEZuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiR3VhcmQgJ1wiLmNvbmNhdChndWFyZC50eXBlLCBcIicgaXMgbm90IGltcGxlbWVudGVkIG9uIG1hY2hpbmUgJ1wiKS5jb25jYXQobWFjaGluZS5pZCwgXCInLlwiKSk7XG4gIH1cblxuICByZXR1cm4gY29uZEZuKGNvbnRleHQsIF9ldmVudC5kYXRhLCBndWFyZE1ldGEpO1xufVxuZnVuY3Rpb24gdG9JbnZva2VTb3VyY2Uoc3JjKSB7XG4gIGlmICh0eXBlb2Ygc3JjID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBzcmNcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHNyYztcbn1cbmZ1bmN0aW9uIHRvT2JzZXJ2ZXIobmV4dEhhbmRsZXIsIGVycm9ySGFuZGxlciwgY29tcGxldGlvbkhhbmRsZXIpIHtcbiAgdmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7fTtcblxuICB2YXIgaXNPYnNlcnZlciA9IHR5cGVvZiBuZXh0SGFuZGxlciA9PT0gJ29iamVjdCc7XG4gIHZhciBzZWxmID0gaXNPYnNlcnZlciA/IG5leHRIYW5kbGVyIDogbnVsbDtcbiAgcmV0dXJuIHtcbiAgICBuZXh0OiAoKGlzT2JzZXJ2ZXIgPyBuZXh0SGFuZGxlci5uZXh0IDogbmV4dEhhbmRsZXIpIHx8IG5vb3ApLmJpbmQoc2VsZiksXG4gICAgZXJyb3I6ICgoaXNPYnNlcnZlciA/IG5leHRIYW5kbGVyLmVycm9yIDogZXJyb3JIYW5kbGVyKSB8fCBub29wKS5iaW5kKHNlbGYpLFxuICAgIGNvbXBsZXRlOiAoKGlzT2JzZXJ2ZXIgPyBuZXh0SGFuZGxlci5jb21wbGV0ZSA6IGNvbXBsZXRpb25IYW5kbGVyKSB8fCBub29wKS5iaW5kKHNlbGYpXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVJbnZva2VJZChzdGF0ZU5vZGVJZCwgaW5kZXgpIHtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KHN0YXRlTm9kZUlkLCBcIjppbnZvY2F0aW9uW1wiKS5jb25jYXQoaW5kZXgsIFwiXVwiKTtcbn1cbmZ1bmN0aW9uIGlzUmFpc2FibGVBY3Rpb24oYWN0aW9uKSB7XG4gIHJldHVybiAoYWN0aW9uLnR5cGUgPT09IHJhaXNlIHx8IGFjdGlvbi50eXBlID09PSBzZW5kICYmIGFjdGlvbi50byA9PT0gU3BlY2lhbFRhcmdldHMuSW50ZXJuYWwpICYmIHR5cGVvZiBhY3Rpb24uZGVsYXkgIT09ICdudW1iZXInO1xufVxuXG5leHBvcnQgeyBjcmVhdGVJbnZva2VJZCwgZXZhbHVhdGVHdWFyZCwgZmxhdHRlbiwgZ2V0QWN0aW9uVHlwZSwgZ2V0RXZlbnRUeXBlLCBpbnRlcm9wU3ltYm9scywgaXNBY3RvciwgaXNBcnJheSwgaXNCZWhhdmlvciwgaXNCdWlsdEluRXZlbnQsIGlzRnVuY3Rpb24sIGlzTWFjaGluZSwgaXNPYnNlcnZhYmxlLCBpc1Byb21pc2VMaWtlLCBpc1JhaXNhYmxlQWN0aW9uLCBpc1N0YXRlTGlrZSwgaXNTdHJpbmcsIGtleXMsIG1hcENvbnRleHQsIG1hcEZpbHRlclZhbHVlcywgbWFwVmFsdWVzLCBtYXRjaGVzU3RhdGUsIG5lc3RlZFBhdGgsIG5vcm1hbGl6ZVRhcmdldCwgcGFydGl0aW9uLCBwYXRoLCBwYXRoVG9TdGF0ZVZhbHVlLCBwYXRoc1RvU3RhdGVWYWx1ZSwgcmVwb3J0VW5oYW5kbGVkRXhjZXB0aW9uT25JbnZvY2F0aW9uLCBzeW1ib2xPYnNlcnZhYmxlLCB0b0FycmF5LCB0b0FycmF5U3RyaWN0LCB0b0V2ZW50T2JqZWN0LCB0b0d1YXJkLCB0b0ludm9rZVNvdXJjZSwgdG9PYnNlcnZlciwgdG9TQ1hNTEV2ZW50LCB0b1N0YXRlUGF0aCwgdG9TdGF0ZVBhdGhzLCB0b1N0YXRlVmFsdWUsIHRvVHJhbnNpdGlvbkNvbmZpZ0FycmF5LCB1bmlxdWVJZCwgdXBkYXRlQ29udGV4dCwgdXBkYXRlSGlzdG9yeVN0YXRlcywgdXBkYXRlSGlzdG9yeVZhbHVlLCB3YXJuIH07XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsImltcG9ydCB7IGJ1dHRvbk1vZHVsZSB9IGZyb20gXCIuL0J1dHRvbk1vZHVsZS5qc1wiO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gXCIuL0V2ZW50QnVzLmpzXCI7XG5pbXBvcnQgRXZlbnRNb2R1bGUgZnJvbSBcIi4vRXZlbnRNb2R1bGUuanNcIjtcbmltcG9ydCB7IGFkZFVzZXJBZ2VudEZsYWdzIH0gZnJvbSBcIi4vVXNlckFnZW50TW9kdWxlLmpzXCI7XG5pbXBvcnQgXCIuL3N0eWxlcy9jb21tb24uc2Nzc1wiO1xuaW1wb3J0IFwiLi9zdHlsZXMvZGVza3RvcC5zY3NzXCI7XG5pbXBvcnQgXCIuL3N0eWxlcy9tb2JpbGUuc2Nzc1wiO1xuaW1wb3J0IFwiLi9zdHlsZXMvcmVjdGFuZ2xlcy5jc3NcIjtcblxuKGZ1bmN0aW9uICgpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgY29uc3QgcGFnZVNjcmlwdCA9XG4gICAgcmVxdWlyZShcInJhdy1sb2FkZXIhLi4vcHVibGljL2F1ZGlvTW9kdWxlLmJ1bmRsZS5qc1wiKS5kZWZhdWx0O1xuICBhZGRVc2VyQWdlbnRGbGFncygpO1xuICBFdmVudE1vZHVsZS5pbml0KCk7XG4gIHNldHVwRXZlbnRCdXMoKTtcblxuICAvLyBDcmVhdGUgYSBNdXRhdGlvbk9ic2VydmVyIHRvIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgRE9NXG4gIC8vIHRleHRhcmVhcyBhcmUgYWRkZWQgdG8gdGhlIERPTSBhZnRlciB0aGUgcGFnZSBsb2Fkc1xuICBjb25zdCBjYWxsYmFjayA9IGZ1bmN0aW9uIChtdXRhdGlvbnNMaXN0LCBvYnNlcnZlcikge1xuICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zTGlzdCkge1xuICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09IFwiY2hpbGRMaXN0XCIpIHtcbiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFkZGVkIG5vZGVzXG4gICAgICAgIG11dGF0aW9uLmFkZGVkTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIGFkZGVkIG5vZGUgaXMgYSB0ZXh0YXJlYSB3aXRoICdlbnRlcmtleWhpbnQnIGF0dHJpYnV0ZVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG5vZGUubm9kZU5hbWUgPT09IFwiVEVYVEFSRUFcIiAmJlxuICAgICAgICAgICAgbm9kZS5oYXNBdHRyaWJ1dGUoXCJlbnRlcmtleWhpbnRcIilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFN0b3Agb2JzZXJ2aW5nIHRvIGF2b2lkIGFueSBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcHNcbiAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblxuICAgICAgICAgICAgLy8gRG8gc29tZXRoaW5nIHdpdGggdGhlIHRleHRhcmVhLCBsaWtlIGFkZCBhbiBldmVudCBsaXN0ZW5lclxuICAgICAgICAgICAgYW5ub3RhdGVET00obm9kZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgYWRkZWQgbm9kZSBjb250YWlucyBhIHRleHRhcmVhIHdpdGggJ2VudGVya2V5aGludCcgYXR0cmlidXRlXG4gICAgICAgICAgaWYgKG5vZGUucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgICAgICAgY29uc3QgdGV4dGFyZWFzID0gbm9kZS5xdWVyeVNlbGVjdG9yQWxsKFwidGV4dGFyZWFbZW50ZXJrZXloaW50XVwiKTtcbiAgICAgICAgICAgIGlmICh0ZXh0YXJlYXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAvLyBTdG9wIG9ic2VydmluZ1xuICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cbiAgICAgICAgICAgICAgLy8gRG8gc29tZXRoaW5nIHdpdGggdGhlIGZpcnN0IHRleHRhcmVhIHRoYXQgaGFzICdlbnRlcmtleWhpbnQnXG4gICAgICAgICAgICAgIGFubm90YXRlRE9NKHRleHRhcmVhc1swXSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBPcHRpb25zIGZvciB0aGUgb2JzZXJ2ZXIgKHdoaWNoIG11dGF0aW9ucyB0byBvYnNlcnZlKVxuICBjb25zdCBjb25maWcgPSB7IGF0dHJpYnV0ZXM6IGZhbHNlLCBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfTtcblxuICAvLyBDcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgbGlua2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvblxuICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcblxuICAvLyBTdGFydCBvYnNlcnZpbmcgdGhlIHRhcmdldCBub2RlIGZvciBjb25maWd1cmVkIG11dGF0aW9uc1xuICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIGNvbmZpZyk7XG5cbiAgZnVuY3Rpb24gc2V0dXBFdmVudEJ1cygpIHtcbiAgICAvLyBTZXR0aW5nIHRoZSBjb3JyZWN0IGNvbnRleHRcbiAgICBsZXQgY29udGV4dCA9IHdpbmRvdztcbiAgICBpZiAoR01faW5mby5zY3JpcHRIYW5kbGVyICE9PSBcIlVzZXJzY3JpcHRzXCIpIHtcbiAgICAgIGNvbnRleHQgPSB1bnNhZmVXaW5kb3c7XG4gICAgfVxuICAgIGNvbnRleHQuRXZlbnRCdXMgPSBFdmVudEJ1czsgLy8gTWFrZSB0aGUgRXZlbnRCdXMgYXZhaWxhYmxlIHRvIHRoZSBwYWdlIHNjcmlwdFxuICB9XG5cbiAgZnVuY3Rpb24gYW5ub3RhdGVET00ocHJvbXB0KSB7XG4gICAgLy8gQWRkIGlkIGF0dHJpYnV0ZXMgdG8gaW1wb3J0YW50IGVsZW1lbnRzXG4gICAgcHJvbXB0LmlkID0gXCJzYXlwaS1wcm9tcHRcIjtcbiAgICBjb25zdCBmb3VuZEZvb3RlciA9IGFkZElkRm9vdGVyKCk7XG4gICAgY29uc3QgZm91bmRBdWRpb0NvbnRyb2xzID0gYWRkSWRBdWRpb0NvbnRyb2xzKCk7XG4gICAgY29uc3QgcHJvbXB0Q29udHJvbHNDb250YWluZXIgPSBwcm9tcHQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIGFkZElkU3VibWl0QnV0dG9uKHByb21wdENvbnRyb2xzQ29udGFpbmVyKTtcbiAgICBhZGRUYWxrQnV0dG9uKHByb21wdENvbnRyb2xzQ29udGFpbmVyKTtcbiAgICBidXR0b25Nb2R1bGUuY3JlYXRlRW50ZXJCdXR0b24oKTtcbiAgICBidXR0b25Nb2R1bGUuY3JlYXRlRXhpdEJ1dHRvbigpO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkSWRTdWJtaXRCdXR0b24oY29udGFpbmVyKSB7XG4gICAgY29uc3Qgc3VibWl0QnV0dG9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCJidXR0b25bdHlwZT1idXR0b25dXCIpO1xuICAgIGlmIChzdWJtaXRCdXR0b24pIHtcbiAgICAgIHN1Ym1pdEJ1dHRvbi5pZCA9IFwic2F5cGktc3VibWl0QnV0dG9uXCI7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYWRkSWRGb290ZXIoKSB7XG4gICAgLy8gRmluZCBhbGwgYXVkaW8gZWxlbWVudHMgb24gdGhlIHBhZ2VcbiAgICB2YXIgYXVkaW9FbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJhdWRpb1wiKTtcbiAgICB2YXIgZm91bmQgPSBmYWxzZTsgLy8gZGVmYXVsdCB0byBub3QgZm91bmRcblxuICAgIGF1ZGlvRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoYXVkaW8pIHtcbiAgICAgIHZhciBwcmVjZWRpbmdEaXYgPSBhdWRpby5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGZvdW5kIGEgZGl2LCB3ZSBjYW4gc2tpcCBmdXJ0aGVyIGl0ZXJhdGlvbnNcbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcHJlY2VkaW5nIGVsZW1lbnQgaXMgYSBkaXZcbiAgICAgIGlmIChwcmVjZWRpbmdEaXYgJiYgcHJlY2VkaW5nRGl2LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJkaXZcIikge1xuICAgICAgICAvLyBBc3NpZ24gYW4gSUQgdG8gdGhlIGRpdlxuICAgICAgICBwcmVjZWRpbmdEaXYubGFzdEVsZW1lbnRDaGlsZC5pZCA9IFwic2F5cGktZm9vdGVyXCI7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTsgLy8gc2V0IHRvIGZvdW5kXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRJZEF1ZGlvQ29udHJvbHMoKSB7XG4gICAgLy8gRmluZCBhbGwgYXVkaW8gZWxlbWVudHMgb24gdGhlIHBhZ2VcbiAgICB2YXIgYXVkaW9FbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJhdWRpb1wiKTtcbiAgICB2YXIgZm91bmQgPSBmYWxzZTsgLy8gZGVmYXVsdCB0byBub3QgZm91bmRcblxuICAgIGF1ZGlvRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoYXVkaW8pIHtcbiAgICAgIHZhciBuZXh0RGl2ID0gYXVkaW8ubmV4dEVsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGZvdW5kIGEgZGl2LCB3ZSBjYW4gc2tpcCBmdXJ0aGVyIGl0ZXJhdGlvbnNcbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcHJlY2VkaW5nIGVsZW1lbnQgaXMgYSBkaXZcbiAgICAgIGlmIChuZXh0RGl2ICYmIG5leHREaXYudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImRpdlwiKSB7XG4gICAgICAgIC8vIEFzc2lnbiBhbiBJRCB0byB0aGUgZGl2XG4gICAgICAgIG5leHREaXYuaWQgPSBcInNheXBpLWF1ZGlvLWNvbnRyb2xzXCI7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTsgLy8gc2V0IHRvIGZvdW5kXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBmdW5jdGlvbiBpbmplY3RTY3JpcHQoY2FsbGJhY2spIHtcbiAgICB2YXIgc2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgc2NyaXB0RWxlbWVudC50eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIjtcbiAgICBzY3JpcHRFbGVtZW50LmlkID0gXCJzYXlwaS1zY3JpcHRcIjtcbiAgICBzY3JpcHRFbGVtZW50LnRleHRDb250ZW50ID0gcGFnZVNjcmlwdDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpO1xuXG4gICAgLy8gQ2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gYWZ0ZXIgdGhlIHNjcmlwdCBpcyBhZGRlZFxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhZGRUYWxrQnV0dG9uKGNvbnRhaW5lcikge1xuICAgIC8vIENyZWF0ZSBhIGNvbnRhaW5pbmcgZGl2XG4gICAgdmFyIHBhbmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBwYW5lbC5pZCA9IFwic2F5cGktcGFuZWxcIjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaGFzIGFueSBjaGlsZCBlbGVtZW50c1xuICAgIGlmIChjb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBJbnNlcnQgdGhlIHBhbmVsIGFzIHRoZSBzZWNvbmQtdG8tbGFzdCBjaGlsZFxuICAgICAgY29udGFpbmVyLmluc2VydEJlZm9yZShwYW5lbCwgY29udGFpbmVyLmxhc3RDaGlsZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBjb250YWluZXIgaGFzIG5vIGNoaWxkcmVuLCBqdXN0IGFwcGVuZCB0aGUgcGFuZWxcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChwYW5lbCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSB0YWxrIGJ1dHRvbiB1c2luZyBCdXR0b25Nb2R1bGVcbiAgICBjb25zdCBsYWJlbCA9XG4gICAgICBcIlRhbGsgKEhvbGQgQ29udHJvbCArIFNwYWNlIHRvIHVzZSBob3RrZXkuIERvdWJsZSBjbGljayB0byB0b2dnbGUgYXV0by1zdWJtaXQgb24vb2ZmKVwiO1xuICAgIHZhciBidXR0b24gPSBidXR0b25Nb2R1bGUuY3JlYXRlQnV0dG9uKFwiXCIsICgpID0+IHt9KTsgLy8gVGhlIGNhbGxiYWNrIGlzIGVtcHR5IGZvciBub3csIGJ1dCB5b3UgY2FuIGFkZCBmdW5jdGlvbmFsaXRpZXMgaWYgbmVlZGVkLlxuXG4gICAgYnV0dG9uLmlkID0gXCJzYXlwaS10YWxrQnV0dG9uXCI7XG4gICAgYnV0dG9uLnR5cGUgPSBcImJ1dHRvblwiO1xuXG4gICAgLy8gU2V0IEFSSUEgbGFiZWwgYW5kIHRvb2x0aXBcbiAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBsYWJlbCk7XG4gICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcInRpdGxlXCIsIGxhYmVsKTtcblxuICAgIGNvbnN0IGNsYXNzTmFtZXMgPVxuICAgICAgXCJyZWxhdGl2ZSBmbGV4IG10LTEgbWItMSByb3VuZGVkLWZ1bGwgcHgtMiBweS0zIHRleHQtY2VudGVyIGJnLWNyZWFtLTU1MCBob3ZlcjpiZy1jcmVhbS02NTAgaG92ZXI6dGV4dC1icmFuZC1ncmVlbi03MDAgdGV4dC1tdXRlZFwiO1xuICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZXMuc3BsaXQoXCIgXCIpKTtcblxuICAgIC8vIEVuYWJsZSBhdXRvc3VibWl0IGJ5IGRlZmF1bHRcbiAgICBidXR0b24uZGF0YXNldC5hdXRvc3VibWl0ID0gXCJ0cnVlXCI7XG4gICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJhdXRvU3VibWl0XCIpO1xuXG4gICAgcGFuZWwuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbiAgICBidXR0b25Nb2R1bGUuYWRkVGFsa0ljb24oYnV0dG9uKTtcblxuICAgIC8vIENhbGwgdGhlIGZ1bmN0aW9uIHRvIGluamVjdCB0aGUgc2NyaXB0IGFmdGVyIHRoZSBidXR0b24gaGFzIGJlZW4gYWRkZWRcbiAgICBpbmplY3RTY3JpcHQocmVnaXN0ZXJBdWRpb0J1dHRvbkV2ZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiByZWdpc3RlckF1ZGlvQnV0dG9uRXZlbnRzKCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2F5cGktdGFsa0J1dHRvblwiKTtcblxuICAgIC8vIEF0dGFjaCB0aGUgZXZlbnQgbGlzdGVuZXJzXG4gICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcIm1vdXNlZG93blwiLFxuICAgICAgRXZlbnRNb2R1bGUuaGFuZGxlVGFsa01vdXNlRG93bi5iaW5kKEV2ZW50TW9kdWxlKVxuICAgICk7XG4gICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcIm1vdXNldXBcIixcbiAgICAgIEV2ZW50TW9kdWxlLmhhbmRsZVRhbGtNb3VzZVVwLmJpbmQoRXZlbnRNb2R1bGUpXG4gICAgKTtcbiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImRibGNsaWNrXCIsICgpID0+XG4gICAgICBFdmVudE1vZHVsZS5oYW5kbGVUYWxrRG91YmxlQ2xpY2soYnV0dG9uKVxuICAgICk7XG4gICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIChlKSA9PlxuICAgICAgRXZlbnRNb2R1bGUuaGFuZGxlVGFsa1RvdWNoU3RhcnQoYnV0dG9uLCBlKVxuICAgICk7XG4gICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCAoKSA9PlxuICAgICAgRXZlbnRNb2R1bGUuaGFuZGxlVGFsa1RvdWNoRW5kKGJ1dHRvbilcbiAgICApO1xuXG4gICAgRXZlbnRNb2R1bGUucmVnaXN0ZXJPdGhlckF1ZGlvQnV0dG9uRXZlbnRzKGJ1dHRvbik7XG4gICAgRXZlbnRNb2R1bGUucmVnaXN0ZXJIb3RrZXkoKTtcbiAgfVxuXG4gIC8vIFN0YXJ0IG9ic2VydmluZyB0aGUgZW50aXJlIGRvY3VtZW50IGZvciBjaGFuZ2VzIHRvIGNoaWxkIG5vZGVzIGFuZCBzdWJ0cmVlXG4gIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xufSkoKTtcbiJdLCJuYW1lcyI6WyJBbmltYXRpb25Nb2R1bGUiLCJfY2xhc3NDYWxsQ2hlY2siLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJ2YWx1ZSIsInN0YXJ0QW5pbWF0aW9uIiwiYW5pbWF0aW9uIiwic3RvcE90aGVyQW5pbWF0aW9ucyIsInJlY3RhbmdsZXMiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJyZWN0YW5nbGVzU2VsZWN0b3IiLCJmb3JFYWNoIiwicmVjdCIsImNsYXNzTGlzdCIsImFkZCIsInN0b3BBbmltYXRpb24iLCJyZW1vdmUiLCJzdG9wQWxsQW5pbWF0aW9ucyIsIl90aGlzIiwidGFsa0J1dHRvbkFuaW1hdGlvbnMiLCJrZWVwQW5pbWF0aW9uIiwiX3RoaXMyIiwiX2RlZmluZVByb3BlcnR5IiwiZGVmYXVsdCIsImVudGVyTW9iaWxlTW9kZSIsImV4aXRNb2JpbGVNb2RlIiwiaXNNb2JpbGVWaWV3IiwiRXZlbnRCdXMiLCJTdGF0ZU1hY2hpbmVTZXJ2aWNlIiwiZXhpdEljb25TVkciLCJtYXhpbWl6ZUljb25TVkciLCJyZWN0YW5nbGVzU1ZHIiwidGFsa0ljb25TVkciLCJtdXRlZE1pY0ljb25TVkciLCJwbGF5SWNvblNWRyIsIkJ1dHRvbk1vZHVsZSIsInBsYXlCdXR0b24iLCJhY3RvciIsImhhbmRsZVBsYXlCdXR0b25DbGljayIsImJpbmQiLCJyZWdpc3Rlck90aGVyRXZlbnRzIiwib24iLCJoYW5kbGVBdXRvU3VibWl0IiwiY3JlYXRlQnV0dG9uIiwibGFiZWwiLCJjYWxsYmFjayIsImJ1dHRvbiIsImNyZWF0ZUVsZW1lbnQiLCJ0ZXh0Q29udGVudCIsIm9uY2xpY2siLCJzdHlsZUJ1dHRvbiIsInN0eWxlcyIsImhhc093blByb3BlcnR5Iiwic3R5bGUiLCJhZGRUYWxrSWNvbiIsInVwZGF0ZUljb25Db250ZW50Iiwid2luZG93IiwibWF0Y2hNZWRpYSIsImFkZExpc3RlbmVyIiwic2V0dXBDbGFzc09ic2VydmVyIiwiaWNvbkNvbnRhaW5lciIsImlubmVySFRNTCIsInRhcmdldE5vZGUiLCJkb2N1bWVudEVsZW1lbnQiLCJjb25maWciLCJhdHRyaWJ1dGVzIiwiYXR0cmlidXRlRmlsdGVyIiwibXV0YXRpb25zTGlzdCIsIm9ic2VydmVyIiwiX2l0ZXJhdG9yIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJfc3RlcCIsInMiLCJuIiwiZG9uZSIsIm11dGF0aW9uIiwidHlwZSIsImF0dHJpYnV0ZU5hbWUiLCJjb250YWlucyIsImVyciIsImUiLCJmIiwiTXV0YXRpb25PYnNlcnZlciIsIm9ic2VydmUiLCJjcmVhdGVFeGl0QnV0dG9uIiwiaWQiLCJjbGFzc05hbWUiLCJzZXRBdHRyaWJ1dGUiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjcmVhdGVFbnRlckJ1dHRvbiIsImNyZWF0ZVBsYXlCdXR0b24iLCJhZGRFdmVudExpc3RlbmVyIiwiY29uc29sZSIsImxvZyIsInNob3dQbGF5QnV0dG9uIiwiaGlkZVBsYXlCdXR0b24iLCJzZW5kIiwiZW1pdCIsInNob3dOb3RpZmljYXRpb24iLCJkZXRhaWxzIiwiaWNvbiIsImljb25TVkciLCJub3RpZmljYXRpb24iLCJnZXRFbGVtZW50QnlJZCIsImRpc21pc3NOb3RpZmljYXRpb24iLCJzaW11bGF0ZUZvcm1TdWJtaXQiLCJzdWJtaXRCdXR0b24iLCJjbGljayIsInRleHRhcmVhIiwiZW50ZXJFdmVudCIsIktleWJvYXJkRXZlbnQiLCJidWJibGVzIiwia2V5Q29kZSIsIndoaWNoIiwiZGlzcGF0Y2hFdmVudCIsInRhbGtCdXR0b24iLCJkYXRhc2V0IiwiYXV0b3N1Ym1pdCIsImJ1dHRvbk1vZHVsZSIsIkV2ZW50RW1pdHRlciIsIlVTRVJfU1BFQUtJTkciLCJVU0VSX1NUT1BQRURfU1BFQUtJTkciLCJVU0VSX0ZJTklTSEVEX1NQRUFLSU5HIiwiVFJBTlNDUklCSU5HIiwiUElfU1BFQUtJTkciLCJQSV9TVE9QUEVEX1NQRUFLSU5HIiwiUElfRklOSVNIRURfU1BFQUtJTkciLCJQQVVTRSIsIlJFQURZIiwiUExBWSIsIkV2ZW50TW9kdWxlIiwiaW5pdCIsInJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnRzIiwiY2xlYW51cCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJoYW5kbGVUcmFuc2NyaXB0aW9uUmVzcG9uc2UiLCJzaW11bGF0ZVR5cGluZyIsImVsZW1lbnQiLCJ0ZXh0Iiwid29yZHMiLCJzcGxpdCIsImkiLCJ0eXBlV29yZCIsImxlbmd0aCIsInNldE5hdGl2ZVZhbHVlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwibGFzdFZhbHVlIiwiZXZlbnQiLCJFdmVudCIsInRhcmdldCIsInNpbXVsYXRlZCIsInRyYWNrZXIiLCJfdmFsdWVUcmFja2VyIiwic2V0VmFsdWUiLCJoYW5kbGVUYWxrTW91c2VEb3duIiwiaGFuZGxlVGFsa01vdXNlVXAiLCJoYW5kbGVUYWxrRG91YmxlQ2xpY2siLCJ0b2dnbGUiLCJnZXRBdHRyaWJ1dGUiLCJoYW5kbGVUYWxrVG91Y2hTdGFydCIsInByZXZlbnREZWZhdWx0IiwiaGFuZGxlVGFsa1RvdWNoRW5kIiwicmVnaXN0ZXJPdGhlckF1ZGlvQnV0dG9uRXZlbnRzIiwiZXZlbnROYW1lIiwiZGV0YWlsIiwiX29iamVjdFNwcmVhZCIsIndhcm4iLCJjb25jYXQiLCJyZWdpc3RlckhvdGtleSIsImN0cmxEb3duIiwiY3RybEtleSIsImNvZGUiLCJzZXJpYWxpemVTdGF0ZVZhbHVlIiwic3RhdGVWYWx1ZSIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJqb2luIiwiaW50ZXJwcmV0IiwibWFjaGluZSIsIm9uVHJhbnNpdGlvbiIsInN0YXRlIiwiY2hhbmdlZCIsImZyb21TdGF0ZSIsImhpc3RvcnkiLCJ0b1N0YXRlIiwic3RhcnQiLCJhcHBTZXJ2ZXJVcmwiLCJwcm9jZXNzIiwiZW52IiwiQVBQX1NFUlZFUl9VUkwiLCJhcGlTZXJ2ZXJVcmwiLCJBUElfU0VSVkVSX1VSTCIsInVwbG9hZEF1ZGlvIiwiYXVkaW9CbG9iIiwiYXVkaW9EdXJhdGlvbk1pbGxpcyIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJhdWRpb0ZpbGVuYW1lIiwiYXBwZW5kIiwibGFuZ3VhZ2UiLCJuYXZpZ2F0b3IiLCJzdGFydFRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsImZldGNoIiwibWV0aG9kIiwidGhlbiIsInJlc3BvbnNlIiwib2siLCJFcnJvciIsInN0YXR1c1RleHQiLCJqc29uIiwicmVzcG9uc2VKc29uIiwiZW5kVGltZSIsInRyYW5zY3JpcHRpb25EdXJhdGlvbk1pbGxpcyIsIk1hdGgiLCJyb3VuZCIsImVycm9yIiwidHJhbnNjcmlwdCIsInN1YnN0cmluZyIsImlzU2FmYXJpIiwidGVzdCIsInVzZXJBZ2VudCIsImlzTW9iaWxlRGV2aWNlIiwibWF0Y2hlcyIsInVzZXJWaWV3UHJlZmVyZW5jZSIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJwcmVmZXJzTW9iaWxlIiwic2V0SXRlbSIsImFkZFVzZXJBZ2VudEZsYWdzIiwiaXNGaXJlZm94QW5kcm9pZCIsImFkZERldmljZUZsYWdzIiwiYWRkVmlld0ZsYWdzIiwiY3JlYXRlTWFjaGluZSIsImluaXRpYWwiLCJzdGF0ZXMiLCJpZGxlIiwiZGVzY3JpcHRpb24iLCJlbnRyeSIsImNvbmQiLCJ1c2VyU3BlYWtpbmciLCJwYXJhbXMiLCJleGl0IiwiYmxvY2tlZCIsImludGVybmFsIiwiYWN0aW9ucyIsInBpU3BlYWtpbmciLCJ0cmFuc2NyaWJpbmciLCJsb2FkaW5nIiwiZXJyb3JzIiwiYWZ0ZXIiLCJ0cmFuc2NyaWJlRmFpbGVkIiwibWljRXJyb3IiLCJwcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50cyIsInByZXNlcnZlQWN0aW9uT3JkZXIiLCJjb250ZXh0IiwiX3JlZiIsImFjdGlvbiIsIl9yZWYyIiwidHJhbnNjcmliZUF1ZGlvIiwiYmxvYiIsImR1cmF0aW9uIiwidHJhbnNjcmlwdGlvbiIsImFjdGl2YXRlVGFsa0J1dHRvbiIsImRlYWN0aXZhdGVUYWxrQnV0dG9uIiwiYWNxdWlyZU1pY3JvcGhvbmUiLCJfcmVmMyIsIm1lc3NhZ2UiLCJzZXJ2aWNlcyIsImd1YXJkcyIsInRvb1Nob3J0Rm9yVXBsb2FkIiwibG9uZ0Vub3VnaEZvclVwbG9hZCIsImRlbGF5cyIsInBhZ2VTY3JpcHQiLCJyZXF1aXJlIiwic2V0dXBFdmVudEJ1cyIsImFkZGVkTm9kZXMiLCJub2RlIiwibm9kZU5hbWUiLCJoYXNBdHRyaWJ1dGUiLCJkaXNjb25uZWN0IiwiYW5ub3RhdGVET00iLCJ0ZXh0YXJlYXMiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwiR01faW5mbyIsInNjcmlwdEhhbmRsZXIiLCJ1bnNhZmVXaW5kb3ciLCJwcm9tcHQiLCJmb3VuZEZvb3RlciIsImFkZElkRm9vdGVyIiwiZm91bmRBdWRpb0NvbnRyb2xzIiwiYWRkSWRBdWRpb0NvbnRyb2xzIiwicHJvbXB0Q29udHJvbHNDb250YWluZXIiLCJwYXJlbnRFbGVtZW50IiwiYWRkSWRTdWJtaXRCdXR0b24iLCJhZGRUYWxrQnV0dG9uIiwiY29udGFpbmVyIiwicXVlcnlTZWxlY3RvciIsImF1ZGlvRWxlbWVudHMiLCJmb3VuZCIsImF1ZGlvIiwicHJlY2VkaW5nRGl2IiwicHJldmlvdXNFbGVtZW50U2libGluZyIsInRhZ05hbWUiLCJ0b0xvd2VyQ2FzZSIsImxhc3RFbGVtZW50Q2hpbGQiLCJuZXh0RGl2IiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiaW5qZWN0U2NyaXB0Iiwic2NyaXB0RWxlbWVudCIsInBhbmVsIiwiY2hpbGROb2RlcyIsImluc2VydEJlZm9yZSIsImxhc3RDaGlsZCIsImNsYXNzTmFtZXMiLCJyZWdpc3RlckF1ZGlvQnV0dG9uRXZlbnRzIl0sInNvdXJjZVJvb3QiOiIifQ==