Eldarya Enhancements

Enhances the user experience of Eldarya.

Install this script?
Author's suggested script

You may also like YouTube Comment Blacklist.

Install this script
// ==UserScript==
// @name            Eldarya Enhancements
// @namespace       https://gitlab.com/NatoBoram/eldarya-enhancements
// @license         GPL-3.0-or-later
// @version         1.2.19
// @author          Nato Boram
// @description     Enhances the user experience of Eldarya.
// @description:pt  Aprimora a experiência do usuário de Eldarya.
// @description:de  Verbessert die Benutzererfahrung von Eldarya.
// @description:es  Mejora la experiencia del usuario de Eldarya.
// @description:hu  Javítja az Eldarya felhasználói élményét.
// @description:it  Migliora l'esperienza utente di Eldarya.
// @description:pl  Zwiększa wrażenia użytkownika Eldaryi.
// @description:ru  Повышает удобство использования Эльдарьи.
// @description:en  Enhances the user experience of Eldarya.
// @description:fr  Améliore l'expérience utilisateur d'Eldarya.
// @icon            https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/avatar.png
// @supportURL      https://gitlab.com/NatoBoram/eldarya-enhancements/-/issues
// @contributionURL https://paypal.me/NatoBoram/5
//
// @match https://www.eldarya.com.br/*
// @match https://www.eldarya.de/*
// @match https://www.eldarya.es/*
// @match https://www.eldarya.hu/*
// @match https://www.eldarya.it/*
// @match https://www.eldarya.pl/*
// @match https://www.eldarya.ru/*
// @match https://www.eldarya.com/*
// @match https://www.eldarya.fr/*
//
// @grant none
// ==/UserScript==

/******/ (() => { // webpackBootstrap
/******/ 	var __webpack_modules__ = ({

/***/ "./node_modules/.pnpm/blob-util@2.0.2/node_modules/blob-util/dist/blob-util.es.js":
/*!****************************************************************************************!*\
  !*** ./node_modules/.pnpm/blob-util@2.0.2/node_modules/blob-util/dist/blob-util.es.js ***!
  \****************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "arrayBufferToBinaryString": () => (/* binding */ arrayBufferToBinaryString),
/* harmony export */   "arrayBufferToBlob": () => (/* binding */ arrayBufferToBlob),
/* harmony export */   "base64StringToBlob": () => (/* binding */ base64StringToBlob),
/* harmony export */   "binaryStringToArrayBuffer": () => (/* binding */ binaryStringToArrayBuffer),
/* harmony export */   "binaryStringToBlob": () => (/* binding */ binaryStringToBlob),
/* harmony export */   "blobToArrayBuffer": () => (/* binding */ blobToArrayBuffer),
/* harmony export */   "blobToBase64String": () => (/* binding */ blobToBase64String),
/* harmony export */   "blobToBinaryString": () => (/* binding */ blobToBinaryString),
/* harmony export */   "blobToDataURL": () => (/* binding */ blobToDataURL),
/* harmony export */   "canvasToBlob": () => (/* binding */ canvasToBlob),
/* harmony export */   "createBlob": () => (/* binding */ createBlob),
/* harmony export */   "createObjectURL": () => (/* binding */ createObjectURL),
/* harmony export */   "dataURLToBlob": () => (/* binding */ dataURLToBlob),
/* harmony export */   "imgSrcToBlob": () => (/* binding */ imgSrcToBlob),
/* harmony export */   "imgSrcToDataURL": () => (/* binding */ imgSrcToDataURL),
/* harmony export */   "revokeObjectURL": () => (/* binding */ revokeObjectURL)
/* harmony export */ });
// TODO: including these in blob-util.ts causes typedoc to generate docs for them,
// even with --excludePrivate ¯\_(ツ)_/¯
/** @private */
function loadImage(src, crossOrigin) {
    return new Promise(function (resolve, reject) {
        var img = new Image();
        if (crossOrigin) {
            img.crossOrigin = crossOrigin;
        }
        img.onload = function () {
            resolve(img);
        };
        img.onerror = reject;
        img.src = src;
    });
}
/** @private */
function imgToCanvas(img) {
    var canvas = document.createElement('canvas');
    canvas.width = img.width;
    canvas.height = img.height;
    // copy the image contents to the canvas
    var context = canvas.getContext('2d');
    context.drawImage(img, 0, 0, img.width, img.height, 0, 0, img.width, img.height);
    return canvas;
}

/* global Promise, Image, Blob, FileReader, atob, btoa,
   BlobBuilder, MSBlobBuilder, MozBlobBuilder, WebKitBlobBuilder, webkitURL */
/**
 * Shim for
 * [`new Blob()`](https://developer.mozilla.org/en-US/docs/Web/API/Blob.Blob)
 * to support
 * [older browsers that use the deprecated `BlobBuilder` API](http://caniuse.com/blob).
 *
 * Example:
 *
 * ```js
 * var myBlob = blobUtil.createBlob(['hello world'], {type: 'text/plain'});
 * ```
 *
 * @param parts - content of the Blob
 * @param properties - usually `{type: myContentType}`,
 *                           you can also pass a string for the content type
 * @returns Blob
 */
function createBlob(parts, properties) {
    parts = parts || [];
    properties = properties || {};
    if (typeof properties === 'string') {
        properties = { type: properties }; // infer content type
    }
    try {
        return new Blob(parts, properties);
    }
    catch (e) {
        if (e.name !== 'TypeError') {
            throw e;
        }
        var Builder = typeof BlobBuilder !== 'undefined'
            ? BlobBuilder : typeof MSBlobBuilder !== 'undefined'
            ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined'
            ? MozBlobBuilder : WebKitBlobBuilder;
        var builder = new Builder();
        for (var i = 0; i < parts.length; i += 1) {
            builder.append(parts[i]);
        }
        return builder.getBlob(properties.type);
    }
}
/**
 * Shim for
 * [`URL.createObjectURL()`](https://developer.mozilla.org/en-US/docs/Web/API/URL.createObjectURL)
 * to support browsers that only have the prefixed
 * `webkitURL` (e.g. Android <4.4).
 *
 * Example:
 *
 * ```js
 * var myUrl = blobUtil.createObjectURL(blob);
 * ```
 *
 * @param blob
 * @returns url
 */
function createObjectURL(blob) {
    return (typeof URL !== 'undefined' ? URL : webkitURL).createObjectURL(blob);
}
/**
 * Shim for
 * [`URL.revokeObjectURL()`](https://developer.mozilla.org/en-US/docs/Web/API/URL.revokeObjectURL)
 * to support browsers that only have the prefixed
 * `webkitURL` (e.g. Android <4.4).
 *
 * Example:
 *
 * ```js
 * blobUtil.revokeObjectURL(myUrl);
 * ```
 *
 * @param url
 */
function revokeObjectURL(url) {
    return (typeof URL !== 'undefined' ? URL : webkitURL).revokeObjectURL(url);
}
/**
 * Convert a `Blob` to a binary string.
 *
 * Example:
 *
 * ```js
 * blobUtil.blobToBinaryString(blob).then(function (binaryString) {
 *   // success
 * }).catch(function (err) {
 *   // error
 * });
 * ```
 *
 * @param blob
 * @returns Promise that resolves with the binary string
 */
function blobToBinaryString(blob) {
    return new Promise(function (resolve, reject) {
        var reader = new FileReader();
        var hasBinaryString = typeof reader.readAsBinaryString === 'function';
        reader.onloadend = function () {
            var result = reader.result || '';
            if (hasBinaryString) {
                return resolve(result);
            }
            resolve(arrayBufferToBinaryString(result));
        };
        reader.onerror = reject;
        if (hasBinaryString) {
            reader.readAsBinaryString(blob);
        }
        else {
            reader.readAsArrayBuffer(blob);
        }
    });
}
/**
 * Convert a base64-encoded string to a `Blob`.
 *
 * Example:
 *
 * ```js
 * var blob = blobUtil.base64StringToBlob(base64String);
 * ```
 * @param base64 - base64-encoded string
 * @param type - the content type (optional)
 * @returns Blob
 */
function base64StringToBlob(base64, type) {
    var parts = [binaryStringToArrayBuffer(atob(base64))];
    return type ? createBlob(parts, { type: type }) : createBlob(parts);
}
/**
 * Convert a binary string to a `Blob`.
 *
 * Example:
 *
 * ```js
 * var blob = blobUtil.binaryStringToBlob(binaryString);
 * ```
 *
 * @param binary - binary string
 * @param type - the content type (optional)
 * @returns Blob
 */
function binaryStringToBlob(binary, type) {
    return base64StringToBlob(btoa(binary), type);
}
/**
 * Convert a `Blob` to a binary string.
 *
 * Example:
 *
 * ```js
 * blobUtil.blobToBase64String(blob).then(function (base64String) {
 *   // success
 * }).catch(function (err) {
 *   // error
 * });
 * ```
 *
 * @param blob
 * @returns Promise that resolves with the binary string
 */
function blobToBase64String(blob) {
    return blobToBinaryString(blob).then(btoa);
}
/**
 * Convert a data URL string
 * (e.g. `'data:image/png;base64,iVBORw0KG...'`)
 * to a `Blob`.
 *
 * Example:
 *
 * ```js
 * var blob = blobUtil.dataURLToBlob(dataURL);
 * ```
 *
 * @param dataURL - dataURL-encoded string
 * @returns Blob
 */
function dataURLToBlob(dataURL) {
    var type = dataURL.match(/data:([^;]+)/)[1];
    var base64 = dataURL.replace(/^[^,]+,/, '');
    var buff = binaryStringToArrayBuffer(atob(base64));
    return createBlob([buff], { type: type });
}
/**
 * Convert a `Blob` to a data URL string
 * (e.g. `'data:image/png;base64,iVBORw0KG...'`).
 *
 * Example:
 *
 * ```js
 * var dataURL = blobUtil.blobToDataURL(blob);
 * ```
 *
 * @param blob
 * @returns Promise that resolves with the data URL string
 */
function blobToDataURL(blob) {
    return blobToBase64String(blob).then(function (base64String) {
        return 'data:' + blob.type + ';base64,' + base64String;
    });
}
/**
 * Convert an image's `src` URL to a data URL by loading the image and painting
 * it to a `canvas`.
 *
 * Note: this will coerce the image to the desired content type, and it
 * will only paint the first frame of an animated GIF.
 *
 * Examples:
 *
 * ```js
 * blobUtil.imgSrcToDataURL('http://mysite.com/img.png').then(function (dataURL) {
 *   // success
 * }).catch(function (err) {
 *   // error
 * });
 * ```
 *
 * ```js
 * blobUtil.imgSrcToDataURL('http://some-other-site.com/img.jpg', 'image/jpeg',
 *                          'Anonymous', 1.0).then(function (dataURL) {
 *   // success
 * }).catch(function (err) {
 *   // error
 * });
 * ```
 *
 * @param src - image src
 * @param type - the content type (optional, defaults to 'image/png')
 * @param crossOrigin - for CORS-enabled images, set this to
 *                                         'Anonymous' to avoid "tainted canvas" errors
 * @param quality - a number between 0 and 1 indicating image quality
 *                                     if the requested type is 'image/jpeg' or 'image/webp'
 * @returns Promise that resolves with the data URL string
 */
function imgSrcToDataURL(src, type, crossOrigin, quality) {
    type = type || 'image/png';
    return loadImage(src, crossOrigin).then(imgToCanvas).then(function (canvas) {
        return canvas.toDataURL(type, quality);
    });
}
/**
 * Convert a `canvas` to a `Blob`.
 *
 * Examples:
 *
 * ```js
 * blobUtil.canvasToBlob(canvas).then(function (blob) {
 *   // success
 * }).catch(function (err) {
 *   // error
 * });
 * ```
 *
 * Most browsers support converting a canvas to both `'image/png'` and `'image/jpeg'`. You may
 * also want to try `'image/webp'`, which will work in some browsers like Chrome (and in other browsers, will just fall back to `'image/png'`):
 *
 * ```js
 * blobUtil.canvasToBlob(canvas, 'image/webp').then(function (blob) {
 *   // success
 * }).catch(function (err) {
 *   // error
 * });
 * ```
 *
 * @param canvas - HTMLCanvasElement
 * @param type - the content type (optional, defaults to 'image/png')
 * @param quality - a number between 0 and 1 indicating image quality
 *                                     if the requested type is 'image/jpeg' or 'image/webp'
 * @returns Promise that resolves with the `Blob`
 */
function canvasToBlob(canvas, type, quality) {
    if (typeof canvas.toBlob === 'function') {
        return new Promise(function (resolve) {
            canvas.toBlob(resolve, type, quality);
        });
    }
    return Promise.resolve(dataURLToBlob(canvas.toDataURL(type, quality)));
}
/**
 * Convert an image's `src` URL to a `Blob` by loading the image and painting
 * it to a `canvas`.
 *
 * Note: this will coerce the image to the desired content type, and it
 * will only paint the first frame of an animated GIF.
 *
 * Examples:
 *
 * ```js
 * blobUtil.imgSrcToBlob('http://mysite.com/img.png').then(function (blob) {
 *   // success
 * }).catch(function (err) {
 *   // error
 * });
 * ```
 *
 * ```js
 * blobUtil.imgSrcToBlob('http://some-other-site.com/img.jpg', 'image/jpeg',
 *                          'Anonymous', 1.0).then(function (blob) {
 *   // success
 * }).catch(function (err) {
 *   // error
 * });
 * ```
 *
 * @param src - image src
 * @param type - the content type (optional, defaults to 'image/png')
 * @param crossOrigin - for CORS-enabled images, set this to
 *                                         'Anonymous' to avoid "tainted canvas" errors
 * @param quality - a number between 0 and 1 indicating image quality
 *                                     if the requested type is 'image/jpeg' or 'image/webp'
 * @returns Promise that resolves with the `Blob`
 */
function imgSrcToBlob(src, type, crossOrigin, quality) {
    type = type || 'image/png';
    return loadImage(src, crossOrigin).then(imgToCanvas).then(function (canvas) {
        return canvasToBlob(canvas, type, quality);
    });
}
/**
 * Convert an `ArrayBuffer` to a `Blob`.
 *
 * Example:
 *
 * ```js
 * var blob = blobUtil.arrayBufferToBlob(arrayBuff, 'audio/mpeg');
 * ```
 *
 * @param buffer
 * @param type - the content type (optional)
 * @returns Blob
 */
function arrayBufferToBlob(buffer, type) {
    return createBlob([buffer], type);
}
/**
 * Convert a `Blob` to an `ArrayBuffer`.
 *
 * Example:
 *
 * ```js
 * blobUtil.blobToArrayBuffer(blob).then(function (arrayBuff) {
 *   // success
 * }).catch(function (err) {
 *   // error
 * });
 * ```
 *
 * @param blob
 * @returns Promise that resolves with the `ArrayBuffer`
 */
function blobToArrayBuffer(blob) {
    return new Promise(function (resolve, reject) {
        var reader = new FileReader();
        reader.onloadend = function () {
            var result = reader.result || new ArrayBuffer(0);
            resolve(result);
        };
        reader.onerror = reject;
        reader.readAsArrayBuffer(blob);
    });
}
/**
 * Convert an `ArrayBuffer` to a binary string.
 *
 * Example:
 *
 * ```js
 * var myString = blobUtil.arrayBufferToBinaryString(arrayBuff)
 * ```
 *
 * @param buffer - array buffer
 * @returns binary string
 */
function arrayBufferToBinaryString(buffer) {
    var binary = '';
    var bytes = new Uint8Array(buffer);
    var length = bytes.byteLength;
    var i = -1;
    while (++i < length) {
        binary += String.fromCharCode(bytes[i]);
    }
    return binary;
}
/**
 * Convert a binary string to an `ArrayBuffer`.
 *
 * ```js
 * var myBuffer = blobUtil.binaryStringToArrayBuffer(binaryString)
 * ```
 *
 * @param binary - binary string
 * @returns array buffer
 */
function binaryStringToArrayBuffer(binary) {
    var length = binary.length;
    var buf = new ArrayBuffer(length);
    var arr = new Uint8Array(buf);
    var i = -1;
    while (++i < length) {
        arr[i] = binary.charCodeAt(i);
    }
    return buf;
}




/***/ }),

/***/ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/compiler.js":
/*!*********************************************************************************!*\
  !*** ./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/compiler.js ***!
  \*********************************************************************************/
/***/ ((__unused_webpack_module, exports) => {

/*
 *  Copyright 2011 Twitter, Inc.
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

(function (Hogan) {
  // Setup regex  assignments
  // remove whitespace according to Mustache spec
  var rIsWhitespace = /\S/,
      rQuot = /\"/g,
      rNewline =  /\n/g,
      rCr = /\r/g,
      rSlash = /\\/g,
      rLineSep = /\u2028/,
      rParagraphSep = /\u2029/;

  Hogan.tags = {
    '#': 1, '^': 2, '<': 3, '$': 4,
    '/': 5, '!': 6, '>': 7, '=': 8, '_v': 9,
    '{': 10, '&': 11, '_t': 12
  };

  Hogan.scan = function scan(text, delimiters) {
    var len = text.length,
        IN_TEXT = 0,
        IN_TAG_TYPE = 1,
        IN_TAG = 2,
        state = IN_TEXT,
        tagType = null,
        tag = null,
        buf = '',
        tokens = [],
        seenTag = false,
        i = 0,
        lineStart = 0,
        otag = '{{',
        ctag = '}}';

    function addBuf() {
      if (buf.length > 0) {
        tokens.push({tag: '_t', text: new String(buf)});
        buf = '';
      }
    }

    function lineIsWhitespace() {
      var isAllWhitespace = true;
      for (var j = lineStart; j < tokens.length; j++) {
        isAllWhitespace =
          (Hogan.tags[tokens[j].tag] < Hogan.tags['_v']) ||
          (tokens[j].tag == '_t' && tokens[j].text.match(rIsWhitespace) === null);
        if (!isAllWhitespace) {
          return false;
        }
      }

      return isAllWhitespace;
    }

    function filterLine(haveSeenTag, noNewLine) {
      addBuf();

      if (haveSeenTag && lineIsWhitespace()) {
        for (var j = lineStart, next; j < tokens.length; j++) {
          if (tokens[j].text) {
            if ((next = tokens[j+1]) && next.tag == '>') {
              // set indent to token value
              next.indent = tokens[j].text.toString()
            }
            tokens.splice(j, 1);
          }
        }
      } else if (!noNewLine) {
        tokens.push({tag:'\n'});
      }

      seenTag = false;
      lineStart = tokens.length;
    }

    function changeDelimiters(text, index) {
      var close = '=' + ctag,
          closeIndex = text.indexOf(close, index),
          delimiters = trim(
            text.substring(text.indexOf('=', index) + 1, closeIndex)
          ).split(' ');

      otag = delimiters[0];
      ctag = delimiters[delimiters.length - 1];

      return closeIndex + close.length - 1;
    }

    if (delimiters) {
      delimiters = delimiters.split(' ');
      otag = delimiters[0];
      ctag = delimiters[1];
    }

    for (i = 0; i < len; i++) {
      if (state == IN_TEXT) {
        if (tagChange(otag, text, i)) {
          --i;
          addBuf();
          state = IN_TAG_TYPE;
        } else {
          if (text.charAt(i) == '\n') {
            filterLine(seenTag);
          } else {
            buf += text.charAt(i);
          }
        }
      } else if (state == IN_TAG_TYPE) {
        i += otag.length - 1;
        tag = Hogan.tags[text.charAt(i + 1)];
        tagType = tag ? text.charAt(i + 1) : '_v';
        if (tagType == '=') {
          i = changeDelimiters(text, i);
          state = IN_TEXT;
        } else {
          if (tag) {
            i++;
          }
          state = IN_TAG;
        }
        seenTag = i;
      } else {
        if (tagChange(ctag, text, i)) {
          tokens.push({tag: tagType, n: trim(buf), otag: otag, ctag: ctag,
                       i: (tagType == '/') ? seenTag - otag.length : i + ctag.length});
          buf = '';
          i += ctag.length - 1;
          state = IN_TEXT;
          if (tagType == '{') {
            if (ctag == '}}') {
              i++;
            } else {
              cleanTripleStache(tokens[tokens.length - 1]);
            }
          }
        } else {
          buf += text.charAt(i);
        }
      }
    }

    filterLine(seenTag, true);

    return tokens;
  }

  function cleanTripleStache(token) {
    if (token.n.substr(token.n.length - 1) === '}') {
      token.n = token.n.substring(0, token.n.length - 1);
    }
  }

  function trim(s) {
    if (s.trim) {
      return s.trim();
    }

    return s.replace(/^\s*|\s*$/g, '');
  }

  function tagChange(tag, text, index) {
    if (text.charAt(index) != tag.charAt(0)) {
      return false;
    }

    for (var i = 1, l = tag.length; i < l; i++) {
      if (text.charAt(index + i) != tag.charAt(i)) {
        return false;
      }
    }

    return true;
  }

  // the tags allowed inside super templates
  var allowedInSuper = {'_t': true, '\n': true, '$': true, '/': true};

  function buildTree(tokens, kind, stack, customTags) {
    var instructions = [],
        opener = null,
        tail = null,
        token = null;

    tail = stack[stack.length - 1];

    while (tokens.length > 0) {
      token = tokens.shift();

      if (tail && tail.tag == '<' && !(token.tag in allowedInSuper)) {
        throw new Error('Illegal content in < super tag.');
      }

      if (Hogan.tags[token.tag] <= Hogan.tags['$'] || isOpener(token, customTags)) {
        stack.push(token);
        token.nodes = buildTree(tokens, token.tag, stack, customTags);
      } else if (token.tag == '/') {
        if (stack.length === 0) {
          throw new Error('Closing tag without opener: /' + token.n);
        }
        opener = stack.pop();
        if (token.n != opener.n && !isCloser(token.n, opener.n, customTags)) {
          throw new Error('Nesting error: ' + opener.n + ' vs. ' + token.n);
        }
        opener.end = token.i;
        return instructions;
      } else if (token.tag == '\n') {
        token.last = (tokens.length == 0) || (tokens[0].tag == '\n');
      }

      instructions.push(token);
    }

    if (stack.length > 0) {
      throw new Error('missing closing tag: ' + stack.pop().n);
    }

    return instructions;
  }

  function isOpener(token, tags) {
    for (var i = 0, l = tags.length; i < l; i++) {
      if (tags[i].o == token.n) {
        token.tag = '#';
        return true;
      }
    }
  }

  function isCloser(close, open, tags) {
    for (var i = 0, l = tags.length; i < l; i++) {
      if (tags[i].c == close && tags[i].o == open) {
        return true;
      }
    }
  }

  function stringifySubstitutions(obj) {
    var items = [];
    for (var key in obj) {
      items.push('"' + esc(key) + '": function(c,p,t,i) {' + obj[key] + '}');
    }
    return "{ " + items.join(",") + " }";
  }

  function stringifyPartials(codeObj) {
    var partials = [];
    for (var key in codeObj.partials) {
      partials.push('"' + esc(key) + '":{name:"' + esc(codeObj.partials[key].name) + '", ' + stringifyPartials(codeObj.partials[key]) + "}");
    }
    return "partials: {" + partials.join(",") + "}, subs: " + stringifySubstitutions(codeObj.subs);
  }

  Hogan.stringify = function(codeObj, text, options) {
    return "{code: function (c,p,i) { " + Hogan.wrapMain(codeObj.code) + " }," + stringifyPartials(codeObj) +  "}";
  }

  var serialNo = 0;
  Hogan.generate = function(tree, text, options) {
    serialNo = 0;
    var context = { code: '', subs: {}, partials: {} };
    Hogan.walk(tree, context);

    if (options.asString) {
      return this.stringify(context, text, options);
    }

    return this.makeTemplate(context, text, options);
  }

  Hogan.wrapMain = function(code) {
    return 'var t=this;t.b(i=i||"");' + code + 'return t.fl();';
  }

  Hogan.template = Hogan.Template;

  Hogan.makeTemplate = function(codeObj, text, options) {
    var template = this.makePartials(codeObj);
    template.code = new Function('c', 'p', 'i', this.wrapMain(codeObj.code));
    return new this.template(template, text, this, options);
  }

  Hogan.makePartials = function(codeObj) {
    var key, template = {subs: {}, partials: codeObj.partials, name: codeObj.name};
    for (key in template.partials) {
      template.partials[key] = this.makePartials(template.partials[key]);
    }
    for (key in codeObj.subs) {
      template.subs[key] = new Function('c', 'p', 't', 'i', codeObj.subs[key]);
    }
    return template;
  }

  function esc(s) {
    return s.replace(rSlash, '\\\\')
            .replace(rQuot, '\\\"')
            .replace(rNewline, '\\n')
            .replace(rCr, '\\r')
            .replace(rLineSep, '\\u2028')
            .replace(rParagraphSep, '\\u2029');
  }

  function chooseMethod(s) {
    return (~s.indexOf('.')) ? 'd' : 'f';
  }

  function createPartial(node, context) {
    var prefix = "<" + (context.prefix || "");
    var sym = prefix + node.n + serialNo++;
    context.partials[sym] = {name: node.n, partials: {}};
    context.code += 't.b(t.rp("' +  esc(sym) + '",c,p,"' + (node.indent || '') + '"));';
    return sym;
  }

  Hogan.codegen = {
    '#': function(node, context) {
      context.code += 'if(t.s(t.' + chooseMethod(node.n) + '("' + esc(node.n) + '",c,p,1),' +
                      'c,p,0,' + node.i + ',' + node.end + ',"' + node.otag + " " + node.ctag + '")){' +
                      't.rs(c,p,' + 'function(c,p,t){';
      Hogan.walk(node.nodes, context);
      context.code += '});c.pop();}';
    },

    '^': function(node, context) {
      context.code += 'if(!t.s(t.' + chooseMethod(node.n) + '("' + esc(node.n) + '",c,p,1),c,p,1,0,0,"")){';
      Hogan.walk(node.nodes, context);
      context.code += '};';
    },

    '>': createPartial,
    '<': function(node, context) {
      var ctx = {partials: {}, code: '', subs: {}, inPartial: true};
      Hogan.walk(node.nodes, ctx);
      var template = context.partials[createPartial(node, context)];
      template.subs = ctx.subs;
      template.partials = ctx.partials;
    },

    '$': function(node, context) {
      var ctx = {subs: {}, code: '', partials: context.partials, prefix: node.n};
      Hogan.walk(node.nodes, ctx);
      context.subs[node.n] = ctx.code;
      if (!context.inPartial) {
        context.code += 't.sub("' + esc(node.n) + '",c,p,i);';
      }
    },

    '\n': function(node, context) {
      context.code += write('"\\n"' + (node.last ? '' : ' + i'));
    },

    '_v': function(node, context) {
      context.code += 't.b(t.v(t.' + chooseMethod(node.n) + '("' + esc(node.n) + '",c,p,0)));';
    },

    '_t': function(node, context) {
      context.code += write('"' + esc(node.text) + '"');
    },

    '{': tripleStache,

    '&': tripleStache
  }

  function tripleStache(node, context) {
    context.code += 't.b(t.t(t.' + chooseMethod(node.n) + '("' + esc(node.n) + '",c,p,0)));';
  }

  function write(s) {
    return 't.b(' + s + ');';
  }

  Hogan.walk = function(nodelist, context) {
    var func;
    for (var i = 0, l = nodelist.length; i < l; i++) {
      func = Hogan.codegen[nodelist[i].tag];
      func && func(nodelist[i], context);
    }
    return context;
  }

  Hogan.parse = function(tokens, text, options) {
    options = options || {};
    return buildTree(tokens, '', [], options.sectionTags || []);
  }

  Hogan.cache = {};

  Hogan.cacheKey = function(text, options) {
    return [text, !!options.asString, !!options.disableLambda, options.delimiters, !!options.modelGet].join('||');
  }

  Hogan.compile = function(text, options) {
    options = options || {};
    var key = Hogan.cacheKey(text, options);
    var template = this.cache[key];

    if (template) {
      var partials = template.partials;
      for (var name in partials) {
        delete partials[name].instance;
      }
      return template;
    }

    template = this.generate(this.parse(this.scan(text, options.delimiters), text, options), text, options);
    return this.cache[key] = template;
  }
})( true ? exports : 0);


/***/ }),

/***/ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js":
/*!******************************************************************************!*\
  !*** ./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js ***!
  \******************************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

/*
 *  Copyright 2011 Twitter, Inc.
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

// This file is for use with Node.js. See dist/ for browser files.

var Hogan = __webpack_require__(/*! ./compiler */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/compiler.js");
Hogan.Template = (__webpack_require__(/*! ./template */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/template.js").Template);
Hogan.template = Hogan.Template;
module.exports = Hogan;


/***/ }),

/***/ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/template.js":
/*!*********************************************************************************!*\
  !*** ./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/template.js ***!
  \*********************************************************************************/
/***/ ((__unused_webpack_module, exports) => {

/*
 *  Copyright 2011 Twitter, Inc.
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

var Hogan = {};

(function (Hogan) {
  Hogan.Template = function (codeObj, text, compiler, options) {
    codeObj = codeObj || {};
    this.r = codeObj.code || this.r;
    this.c = compiler;
    this.options = options || {};
    this.text = text || '';
    this.partials = codeObj.partials || {};
    this.subs = codeObj.subs || {};
    this.buf = '';
  }

  Hogan.Template.prototype = {
    // render: replaced by generated code.
    r: function (context, partials, indent) { return ''; },

    // variable escaping
    v: hoganEscape,

    // triple stache
    t: coerceToString,

    render: function render(context, partials, indent) {
      return this.ri([context], partials || {}, indent);
    },

    // render internal -- a hook for overrides that catches partials too
    ri: function (context, partials, indent) {
      return this.r(context, partials, indent);
    },

    // ensurePartial
    ep: function(symbol, partials) {
      var partial = this.partials[symbol];

      // check to see that if we've instantiated this partial before
      var template = partials[partial.name];
      if (partial.instance && partial.base == template) {
        return partial.instance;
      }

      if (typeof template == 'string') {
        if (!this.c) {
          throw new Error("No compiler available.");
        }
        template = this.c.compile(template, this.options);
      }

      if (!template) {
        return null;
      }

      // We use this to check whether the partials dictionary has changed
      this.partials[symbol].base = template;

      if (partial.subs) {
        // Make sure we consider parent template now
        if (!partials.stackText) partials.stackText = {};
        for (key in partial.subs) {
          if (!partials.stackText[key]) {
            partials.stackText[key] = (this.activeSub !== undefined && partials.stackText[this.activeSub]) ? partials.stackText[this.activeSub] : this.text;
          }
        }
        template = createSpecializedPartial(template, partial.subs, partial.partials,
          this.stackSubs, this.stackPartials, partials.stackText);
      }
      this.partials[symbol].instance = template;

      return template;
    },

    // tries to find a partial in the current scope and render it
    rp: function(symbol, context, partials, indent) {
      var partial = this.ep(symbol, partials);
      if (!partial) {
        return '';
      }

      return partial.ri(context, partials, indent);
    },

    // render a section
    rs: function(context, partials, section) {
      var tail = context[context.length - 1];

      if (!isArray(tail)) {
        section(context, partials, this);
        return;
      }

      for (var i = 0; i < tail.length; i++) {
        context.push(tail[i]);
        section(context, partials, this);
        context.pop();
      }
    },

    // maybe start a section
    s: function(val, ctx, partials, inverted, start, end, tags) {
      var pass;

      if (isArray(val) && val.length === 0) {
        return false;
      }

      if (typeof val == 'function') {
        val = this.ms(val, ctx, partials, inverted, start, end, tags);
      }

      pass = !!val;

      if (!inverted && pass && ctx) {
        ctx.push((typeof val == 'object') ? val : ctx[ctx.length - 1]);
      }

      return pass;
    },

    // find values with dotted names
    d: function(key, ctx, partials, returnFound) {
      var found,
          names = key.split('.'),
          val = this.f(names[0], ctx, partials, returnFound),
          doModelGet = this.options.modelGet,
          cx = null;

      if (key === '.' && isArray(ctx[ctx.length - 2])) {
        val = ctx[ctx.length - 1];
      } else {
        for (var i = 1; i < names.length; i++) {
          found = findInScope(names[i], val, doModelGet);
          if (found !== undefined) {
            cx = val;
            val = found;
          } else {
            val = '';
          }
        }
      }

      if (returnFound && !val) {
        return false;
      }

      if (!returnFound && typeof val == 'function') {
        ctx.push(cx);
        val = this.mv(val, ctx, partials);
        ctx.pop();
      }

      return val;
    },

    // find values with normal names
    f: function(key, ctx, partials, returnFound) {
      var val = false,
          v = null,
          found = false,
          doModelGet = this.options.modelGet;

      for (var i = ctx.length - 1; i >= 0; i--) {
        v = ctx[i];
        val = findInScope(key, v, doModelGet);
        if (val !== undefined) {
          found = true;
          break;
        }
      }

      if (!found) {
        return (returnFound) ? false : "";
      }

      if (!returnFound && typeof val == 'function') {
        val = this.mv(val, ctx, partials);
      }

      return val;
    },

    // higher order templates
    ls: function(func, cx, partials, text, tags) {
      var oldTags = this.options.delimiters;

      this.options.delimiters = tags;
      this.b(this.ct(coerceToString(func.call(cx, text)), cx, partials));
      this.options.delimiters = oldTags;

      return false;
    },

    // compile text
    ct: function(text, cx, partials) {
      if (this.options.disableLambda) {
        throw new Error('Lambda features disabled.');
      }
      return this.c.compile(text, this.options).render(cx, partials);
    },

    // template result buffering
    b: function(s) { this.buf += s; },

    fl: function() { var r = this.buf; this.buf = ''; return r; },

    // method replace section
    ms: function(func, ctx, partials, inverted, start, end, tags) {
      var textSource,
          cx = ctx[ctx.length - 1],
          result = func.call(cx);

      if (typeof result == 'function') {
        if (inverted) {
          return true;
        } else {
          textSource = (this.activeSub && this.subsText && this.subsText[this.activeSub]) ? this.subsText[this.activeSub] : this.text;
          return this.ls(result, cx, partials, textSource.substring(start, end), tags);
        }
      }

      return result;
    },

    // method replace variable
    mv: function(func, ctx, partials) {
      var cx = ctx[ctx.length - 1];
      var result = func.call(cx);

      if (typeof result == 'function') {
        return this.ct(coerceToString(result.call(cx)), cx, partials);
      }

      return result;
    },

    sub: function(name, context, partials, indent) {
      var f = this.subs[name];
      if (f) {
        this.activeSub = name;
        f(context, partials, this, indent);
        this.activeSub = false;
      }
    }

  };

  //Find a key in an object
  function findInScope(key, scope, doModelGet) {
    var val;

    if (scope && typeof scope == 'object') {

      if (scope[key] !== undefined) {
        val = scope[key];

      // try lookup with get for backbone or similar model data
      } else if (doModelGet && scope.get && typeof scope.get == 'function') {
        val = scope.get(key);
      }
    }

    return val;
  }

  function createSpecializedPartial(instance, subs, partials, stackSubs, stackPartials, stackText) {
    function PartialTemplate() {};
    PartialTemplate.prototype = instance;
    function Substitutions() {};
    Substitutions.prototype = instance.subs;
    var key;
    var partial = new PartialTemplate();
    partial.subs = new Substitutions();
    partial.subsText = {};  //hehe. substext.
    partial.buf = '';

    stackSubs = stackSubs || {};
    partial.stackSubs = stackSubs;
    partial.subsText = stackText;
    for (key in subs) {
      if (!stackSubs[key]) stackSubs[key] = subs[key];
    }
    for (key in stackSubs) {
      partial.subs[key] = stackSubs[key];
    }

    stackPartials = stackPartials || {};
    partial.stackPartials = stackPartials;
    for (key in partials) {
      if (!stackPartials[key]) stackPartials[key] = partials[key];
    }
    for (key in stackPartials) {
      partial.partials[key] = stackPartials[key];
    }

    return partial;
  }

  var rAmp = /&/g,
      rLt = /</g,
      rGt = />/g,
      rApos = /\'/g,
      rQuot = /\"/g,
      hChars = /[&<>\"\']/;

  function coerceToString(val) {
    return String((val === null || val === undefined) ? '' : val);
  }

  function hoganEscape(str) {
    str = coerceToString(str);
    return hChars.test(str) ?
      str
        .replace(rAmp, '&amp;')
        .replace(rLt, '&lt;')
        .replace(rGt, '&gt;')
        .replace(rApos, '&#39;')
        .replace(rQuot, '&quot;') :
      str;
  }

  var isArray = Array.isArray || function(a) {
    return Object.prototype.toString.call(a) === '[object Array]';
  };

})( true ? exports : 0);


/***/ }),

/***/ "./src/templates/html/appearance_item.html":
/*!*************************************************!*\
  !*** ./src/templates/html/appearance_item.html ***!
  \*************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<li");t.b("\n" + i);t.b("  id=\"appearance-item-");t.b(t.v(t.f("itemid",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  class=\"appearance-item group-");t.b(t.v(t.f("group",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  data-itemid=\"");t.b(t.v(t.f("itemid",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  data-name=\"");t.b(t.v(t.f("name",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  data-rarity=\"");t.b(t.v(t.f("rarity",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  data-rarityname=\"");t.b(t.v(t.f("rarityname",c,p,0)));t.b("\"");t.b("\n" + i);t.b(">");t.b("\n" + i);t.b("  <div class=\"rarity-marker-");t.b(t.v(t.f("rarity",c,p,0)));t.b("\"></div>");t.b("\n" + i);t.b("  <img class=\"appearance-item-icon\" src=\"");t.b(t.v(t.f("icon",c,p,0)));t.b("\" />");t.b("\n" + i);t.b("</li>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<li\n  id=\"appearance-item-{{itemid}}\"\n  class=\"appearance-item group-{{group}}\"\n  data-itemid=\"{{itemid}}\"\n  data-name=\"{{name}}\"\n  data-rarity=\"{{rarity}}\"\n  data-rarityname=\"{{rarityname}}\"\n>\n  <div class=\"rarity-marker-{{rarity}}\"></div>\n  <img class=\"appearance-item-icon\" src=\"{{icon}}\" />\n</li>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/appearance_items_category.html":
/*!***********************************************************!*\
  !*** ./src/templates/html/appearance_items_category.html ***!
  \***********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<div");t.b("\n" + i);t.b("  id=\"ee-category\"");t.b("\n" + i);t.b("  class=\"appearance-items-category active\"");t.b("\n" + i);t.b("  data-category=\"");t.b(t.v(t.f("category",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  data-categoryid=\"");t.b(t.v(t.f("categoryid",c,p,0)));t.b("\"");t.b("\n" + i);t.b(">");t.b("\n" + i);t.b("  <style>");t.b("\n" + i);t.b("    #ee-items {");t.b("\n" + i);t.b("      scrollbar-color: dark;");t.b("\n" + i);t.b("      scrollbar-width: thin;");t.b("\n" + i);t.b("    }");t.b("\n" + i);t.b("  </style>");t.b("\n" + i);t.b("  <ul");t.b("\n" + i);t.b("    class=\"appearance-items-list\"");t.b("\n" + i);t.b("    id=\"ee-items\"");t.b("\n" + i);t.b("    style=\"max-height: calc(100vh - 565px)\"");t.b("\n" + i);t.b("  >");t.b("\n" + i);t.b("    ");t.b(t.t(t.f("items",c,p,0)));t.b("\n" + i);t.b("  </ul>");t.b("\n");t.b("\n" + i);t.b("  <!-- Info -->");t.b("\n" + i);t.b("  <div id=\"ee-info\" class=\"appearance-items-info\">");t.b("\n" + i);t.b("    <div class=\"appearance-info-tips\"></div>");t.b("\n");t.b("\n" + i);t.b("    <h3 class=\"appearance-item-info-name\"></h3>");t.b("\n");t.b("\n" + i);t.b("    <div class=\"appearance-item-info-guard\"></div>");t.b("\n" + i);t.b("    <div class=\"appearance-item-info-rarity\"></div>");t.b("\n" + i);t.b("    <div class=\"appearance-item-info-buttons\">");t.b("\n" + i);t.b("      <div class=\"appearance-forward nl-button\">");t.b("\n" + i);t.b("        ");t.b(t.v(t.d("translate.appearance.buttons.forward",c,p,0)));t.b("\n" + i);t.b("      </div>");t.b("\n" + i);t.b("      <div class=\"appearance-backward nl-button\">");t.b("\n" + i);t.b("        ");t.b(t.v(t.d("translate.appearance.buttons.backward",c,p,0)));t.b("\n" + i);t.b("      </div>");t.b("\n" + i);t.b("    </div>");t.b("\n" + i);t.b("  </div>");t.b("\n" + i);t.b("</div>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<div\n  id=\"ee-category\"\n  class=\"appearance-items-category active\"\n  data-category=\"{{category}}\"\n  data-categoryid=\"{{categoryid}}\"\n>\n  <style>\n    #ee-items {\n      scrollbar-color: dark;\n      scrollbar-width: thin;\n    }\n  </style>\n  <ul\n    class=\"appearance-items-list\"\n    id=\"ee-items\"\n    style=\"max-height: calc(100vh - 565px)\"\n  >\n    {{{items}}}\n  </ul>\n\n  <!-- Info -->\n  <div id=\"ee-info\" class=\"appearance-items-info\">\n    <div class=\"appearance-info-tips\"></div>\n\n    <h3 class=\"appearance-item-info-name\"></h3>\n\n    <div class=\"appearance-item-info-guard\"></div>\n    <div class=\"appearance-item-info-rarity\"></div>\n    <div class=\"appearance-item-info-buttons\">\n      <div class=\"appearance-forward nl-button\">\n        {{translate.appearance.buttons.forward}}\n      </div>\n      <div class=\"appearance-backward nl-button\">\n        {{translate.appearance.buttons.backward}}\n      </div>\n    </div>\n  </div>\n</div>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/appearance_items_group.html":
/*!********************************************************!*\
  !*** ./src/templates/html/appearance_items_group.html ***!
  \********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<div");t.b("\n" + i);t.b("  id=\"appearance-items-group-");t.b(t.v(t.f("group",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  class=\"appearance-items-category\"");t.b("\n" + i);t.b("  data-categoryid=\"");t.b(t.v(t.f("categoryid",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  data-category=\"");t.b(t.v(t.f("category",c,p,0)));t.b("\"");t.b("\n" + i);t.b(">");t.b("\n" + i);t.b("  <ul class=\"appearance-items-list\">");t.b("\n" + i);t.b("    ");t.b(t.t(t.f("items",c,p,0)));t.b("\n" + i);t.b("  </ul>");t.b("\n" + i);t.b("</div>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<div\n  id=\"appearance-items-group-{{group}}\"\n  class=\"appearance-items-category\"\n  data-categoryid=\"{{categoryid}}\"\n  data-category=\"{{category}}\"\n>\n  <ul class=\"appearance-items-list\">\n    {{{items}}}\n  </ul>\n</div>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/auto_buy_button.html":
/*!*************************************************!*\
  !*** ./src/templates/html/auto_buy_button.html ***!
  \*************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<div");t.b("\n" + i);t.b("  id=\"marketplace-itemDetail-info-autobuy\"");t.b("\n" + i);t.b("  style=\"text-align: center; margin: 20px auto\"");t.b("\n" + i);t.b(">");t.b("\n" + i);t.b("  <div class=\"nl-button\">");t.b(t.v(t.d("translate.market.add_to_wishlist.title",c,p,0)));t.b("</div>");t.b("\n" + i);t.b("</div>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<div\n  id=\"marketplace-itemDetail-info-autobuy\"\n  style=\"text-align: center; margin: 20px auto\"\n>\n  <div class=\"nl-button\">{{translate.market.add_to_wishlist.title}}</div>\n</div>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/auto_buy_flavr.html":
/*!************************************************!*\
  !*** ./src/templates/html/auto_buy_flavr.html ***!
  \************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<h1>");t.b(t.v(t.d("translate.market.add_to_wishlist.title",c,p,0)));t.b("</h1>");t.b("\n" + i);t.b("<p>");t.b(t.v(t.d("translate.market.add_to_wishlist.text",c,p,0)));t.b("</p>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<h1>{{translate.market.add_to_wishlist.title}}</h1>\n<p>{{translate.market.add_to_wishlist.text}}</p>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/auto_buy_flavr_mall.html":
/*!*****************************************************!*\
  !*** ./src/templates/html/auto_buy_flavr_mall.html ***!
  \*****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<h1>");t.b(t.v(t.d("translate.mall.add_to_wishlist.title",c,p,0)));t.b("</h1>");t.b("\n" + i);t.b("<p>");t.b(t.v(t.d("translate.mall.add_to_wishlist.text",c,p,0)));t.b("</p>");t.b("\n" + i);t.b("<p style=\"font-size: 14px\"><em>");t.b(t.v(t.d("translate.mall.add_to_wishlist.note",c,p,0)));t.b("</em></p>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<h1>{{translate.mall.add_to_wishlist.title}}</h1>\n<p>{{translate.mall.add_to_wishlist.text}}</p>\n<p style=\"font-size: 14px\"><em>{{translate.mall.add_to_wishlist.note}}</em></p>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/auto_explore_button.html":
/*!*****************************************************!*\
  !*** ./src/templates/html/auto_explore_button.html ***!
  \*****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<button");t.b("\n" + i);t.b("  id=\"auto-explore-button\"");t.b("\n" + i);t.b("  class=\"nl-button ");if(t.s(t.f("active",c,p,1),c,p,0,65,71,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("active");});c.pop();}t.b("\"");t.b("\n" + i);t.b("  data-id=\"");t.b(t.v(t.f("locationId",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  data-mapid=\"");t.b(t.v(t.f("regionId",c,p,0)));t.b("\"");t.b("\n" + i);t.b(">");t.b("\n" + i);t.b("  ");t.b(t.v(t.d("translate.pet.auto_explore",c,p,0)));t.b("\n" + i);t.b("</button>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<button\n  id=\"auto-explore-button\"\n  class=\"nl-button {{#active}}active{{/active}}\"\n  data-id=\"{{locationId}}\"\n  data-mapid=\"{{regionId}}\"\n>\n  {{translate.pet.auto_explore}}\n</button>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/carousel_news.html":
/*!***********************************************!*\
  !*** ./src/templates/html/carousel_news.html ***!
  \***********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<a");t.b("\n" + i);t.b("  id=\"");t.b(t.v(t.f("id",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  class=\"carousel-news carousel-ee\"");t.b("\n" + i);t.b("  href=\"\"");t.b("\n" + i);t.b("  style=\"background-image: url(");t.b(t.v(t.f("backgroundImage",c,p,0)));t.b(")\"");t.b("\n" + i);t.b(">");t.b("\n" + i);t.b("  <div>");t.b("\n" + i);t.b("    <h4>");t.b(t.v(t.f("h4",c,p,0)));t.b("</h4>");t.b("\n" + i);t.b("    <h5>");t.b(t.v(t.f("h5",c,p,0)));t.b("</h5>");t.b("\n" + i);t.b("    <p>");t.b(t.v(t.f("p",c,p,0)));t.b("</p>");t.b("\n" + i);t.b("  </div>");t.b("\n" + i);t.b("</a>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<a\n  id=\"{{id}}\"\n  class=\"carousel-news carousel-ee\"\n  href=\"\"\n  style=\"background-image: url({{backgroundImage}})\"\n>\n  <div>\n    <h4>{{h4}}</h4>\n    <h5>{{h5}}</h5>\n    <p>{{p}}</p>\n  </div>\n</a>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/change_price_flavr.html":
/*!****************************************************!*\
  !*** ./src/templates/html/change_price_flavr.html ***!
  \****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<h1>");t.b(t.v(t.d("translate.market.change_price.title",c,p,0)));t.b("</h1>");t.b("\n" + i);t.b("<p>");t.b(t.v(t.d("translate.market.change_price.text",c,p,0)));t.b("</p>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<h1>{{translate.market.change_price.title}}</h1>\n<p>{{translate.market.change_price.text}}</p>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/confirm_reset_settings.html":
/*!********************************************************!*\
  !*** ./src/templates/html/confirm_reset_settings.html ***!
  \********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<h1>");t.b(t.v(t.d("translate.account.confirm_reset_title",c,p,0)));t.b("</h1>");t.b("\n" + i);t.b("<p>");t.b(t.t(t.d("translate.account.confirm_reset_content",c,p,0)));t.b("</p>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<h1>{{translate.account.confirm_reset_title}}</h1>\n<p>{{{translate.account.confirm_reset_content}}}</p>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/created_outfit_flavr.html":
/*!******************************************************!*\
  !*** ./src/templates/html/created_outfit_flavr.html ***!
  \******************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<h1>");t.b(t.v(t.d("translate.appearance.favourites.save_outfit.title",c,p,0)));t.b("</h1>");t.b("\n");t.b("\n" + i);t.b("<p>");t.b(t.t(t.d("translate.appearance.favourites.save_outfit.saved_locally",c,p,0)));t.b("</p>");t.b("\n");t.b("\n" + i);t.b("<br />");t.b("\n");t.b("\n" + i);t.b("<p>");t.b(t.t(t.d("translate.appearance.favourites.save_outfit.goto_account",c,p,0)));t.b("</p>");t.b("\n");t.b("\n" + i);t.b("<input");t.b("\n" + i);t.b("  id=\"choose-name\"");t.b("\n" + i);t.b("  maxlength=\"30\"");t.b("\n" + i);t.b("  minlength=\"1\"");t.b("\n" + i);t.b("  placeholder=\"");t.b(t.v(t.d("translate.appearance.favourites.save_outfit.placeholder",c,p,0)));t.b("\"");t.b("\n" + i);t.b("/>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<h1>{{translate.appearance.favourites.save_outfit.title}}</h1>\n\n<p>{{{translate.appearance.favourites.save_outfit.saved_locally}}}</p>\n\n<br />\n\n<p>{{{translate.appearance.favourites.save_outfit.goto_account}}}</p>\n\n<input\n  id=\"choose-name\"\n  maxlength=\"30\"\n  minlength=\"1\"\n  placeholder=\"{{translate.appearance.favourites.save_outfit.placeholder}}\"\n/>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/exploration_history.html":
/*!*****************************************************!*\
  !*** ./src/templates/html/exploration_history.html ***!
  \*****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<div id=\"history-container\" style=\"width: 100%\">");t.b("\n" + i);t.b("  <style>");t.b("\n" + i);t.b("    .history-actions {");t.b("\n" + i);t.b("      margin-bottom: 1em;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    #delete-history {");t.b("\n" + i);t.b("      margin-right: 1em;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    .help-icon {");t.b("\n" + i);t.b("      background-color: #0291f6;");t.b("\n" + i);t.b("      border-radius: 50%;");t.b("\n" + i);t.b("      box-shadow: none;");t.b("\n" + i);t.b("      color: #fff;");t.b("\n" + i);t.b("      font-size: 26px;");t.b("\n" + i);t.b("      font-weight: bold;");t.b("\n" + i);t.b("      height: 23px;");t.b("\n" + i);t.b("      line-height: 20px;");t.b("\n" + i);t.b("      padding: 0;");t.b("\n" + i);t.b("      text-align: center;");t.b("\n" + i);t.b("      width: 23px;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    .history-message {");t.b("\n" + i);t.b("      background-color: rgba(255, 255, 255, 0.7);");t.b("\n" + i);t.b("      border-radius: 1em;");t.b("\n" + i);t.b("      margin: 1em;");t.b("\n" + i);t.b("      padding: 1em;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    .history-row {");t.b("\n" + i);t.b("      display: flex;");t.b("\n" + i);t.b("      flex-wrap: wrap;");t.b("\n" + i);t.b("      height: 465px;");t.b("\n" + i);t.b("      margin-right: 1em;");t.b("\n" + i);t.b("      overflow-y: auto;");t.b("\n" + i);t.b("      scrollbar-color: dark;");t.b("\n" + i);t.b("      scrollbar-width: thin;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    .result-card {");t.b("\n" + i);t.b("      background-color: white;");t.b("\n" + i);t.b("      border-radius: 1em;");t.b("\n" + i);t.b("      box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.3);");t.b("\n" + i);t.b("      height: 205px;");t.b("\n" + i);t.b("      margin: 0.5em;");t.b("\n" + i);t.b("      padding: 0.5em;");t.b("\n" + i);t.b("      text-align: center;");t.b("\n" + i);t.b("      width: 128px;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    .result-image {");t.b("\n" + i);t.b("      background-color: white;");t.b("\n" + i);t.b("      border-radius: 1em;");t.b("\n" + i);t.b("      box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.12),");t.b("\n" + i);t.b("        0 2px 4px 2px rgba(0, 0, 0, 0.08);");t.b("\n" + i);t.b("      height: 100px;");t.b("\n" + i);t.b("      position: relative;");t.b("\n" + i);t.b("      top: -0.8em;");t.b("\n" + i);t.b("      width: 100px;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    .result-content-column {");t.b("\n" + i);t.b("      display: flex;");t.b("\n" + i);t.b("      flex-direction: column;");t.b("\n" + i);t.b("      height: 103px;");t.b("\n" + i);t.b("      justify-content: space-between;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    .result-name {");t.b("\n" + i);t.b("      -webkit-box-orient: vertical;");t.b("\n" + i);t.b("      -webkit-line-clamp: 3;");t.b("\n" + i);t.b("      color: rgb(52, 56, 111);");t.b("\n" + i);t.b("      display: -webkit-box;");t.b("\n" + i);t.b("      flex-grow: 1;");t.b("\n" + i);t.b("      font-size: 16px;");t.b("\n" + i);t.b("      font-weight: bold;");t.b("\n" + i);t.b("      margin-top: -0.2em;");t.b("\n" + i);t.b("      overflow: hidden;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    .result-location {");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    .result-date {");t.b("\n" + i);t.b("      color: #fb8900;");t.b("\n" + i);t.b("      font-size: 13px;");t.b("\n" + i);t.b("      font-weight: bold;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    .result-icons {");t.b("\n" + i);t.b("      margin-top: 0.5em;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    .result-count {");t.b("\n" + i);t.b("      background: #ffffff;");t.b("\n" + i);t.b("      border-radius: 100%;");t.b("\n" + i);t.b("      border: 1px solid #00cdfb;");t.b("\n" + i);t.b("      box-sizing: border-box;");t.b("\n" + i);t.b("      color: #3ec0d7;");t.b("\n" + i);t.b("      display: inline-block;");t.b("\n" + i);t.b("      font-family: \"Alegreya Sans SC\", sans-serif;");t.b("\n" + i);t.b("      font-size: 18px;");t.b("\n" + i);t.b("      font-weight: 800;");t.b("\n" + i);t.b("      height: 29px;");t.b("\n" + i);t.b("      line-height: 27px;");t.b("\n" + i);t.b("      text-align: center;");t.b("\n" + i);t.b("      user-select: none;");t.b("\n" + i);t.b("      width: 29px;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    .history-tradable {");t.b("\n" + i);t.b("      background-color: #666;");t.b("\n" + i);t.b("      border-radius: 25px;");t.b("\n" + i);t.b("      border: 1px solid #b9b9b9;");t.b("\n" + i);t.b("      color: #ffffff;");t.b("\n" + i);t.b("      display: inline-block;");t.b("\n" + i);t.b("      font-family: \"Temp Menu\", serif;");t.b("\n" + i);t.b("      font-size: 13px;");t.b("\n" + i);t.b("      height: 15px;");t.b("\n" + i);t.b("      line-height: 15px;");t.b("\n" + i);t.b("      text-align: center;");t.b("\n" + i);t.b("      width: 15px;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    .icon-spacer {");t.b("\n" + i);t.b("      display: inline-block;");t.b("\n" + i);t.b("      width: 0.1em;");t.b("\n" + i);t.b("    }");t.b("\n" + i);t.b("  </style>");t.b("\n");t.b("\n" + i);t.b("  <div class=\"history-actions\">");t.b("\n" + i);t.b("    <button id=\"delete-history\" class=\"nl-button\">");t.b("\n" + i);t.b("      ");t.b(t.v(t.d("translate.pet.delete_history",c,p,0)));t.b("\n" + i);t.b("    </button>");t.b("\n");t.b("\n" + i);t.b("    <span class=\"tooltip\">");t.b("\n" + i);t.b("      <span class=\"nl-button help-icon\">?</span>");t.b("\n" + i);t.b("      <div class=\"tooltip-content\">");t.b("\n" + i);t.b("        <p>");t.b(t.t(t.d("translate.pet.saved_locally",c,p,0)));t.b("</p>");t.b("\n" + i);t.b("        <p>");t.b(t.t(t.d("translate.pet.goto_account",c,p,0)));t.b("</p>");t.b("\n" + i);t.b("      </div>");t.b("\n" + i);t.b("    </span>");t.b("\n" + i);t.b("  </div>");t.b("\n");t.b("\n" + i);if(!t.s(t.f("history",c,p,1),c,p,1,0,0,"")){t.b("  <p class=\"history-message\">");t.b(t.v(t.d("translate.pet.empty_history",c,p,0)));t.b("</p>");t.b("\n" + i);};t.b("\n" + i);t.b("  <div class=\"history-row\">");t.b("\n" + i);if(t.s(t.f("history",c,p,1),c,p,0,3230,3920,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("    <div class=\"result-card\">");t.b("\n" + i);t.b("      <a href=\"");t.b(t.v(t.f("web_hd",c,p,0)));t.b("\" target=\"_blank\">");t.b("\n" + i);t.b("        <img class=\"result-image\" src=\"");t.b(t.v(t.f("icon",c,p,0)));t.b("\" />");t.b("\n" + i);t.b("      </a>");t.b("\n");t.b("\n" + i);t.b("      <div class=\"result-content-column\">");t.b("\n" + i);t.b("        <div class=\"result-name\">");t.b(t.v(t.f("name",c,p,0)));t.b("</div>");t.b("\n" + i);t.b("        <div class=\"result-location\">");t.b(t.v(t.f("locationName",c,p,0)));t.b("</div>");t.b("\n" + i);t.b("        <div class=\"result-date\">");t.b(t.v(t.f("date",c,p,0)));t.b("</div>");t.b("\n");t.b("\n" + i);t.b("        <div class=\"result-icons\">");t.b("\n" + i);t.b("          ");if(t.s(t.f("count",c,p,1),c,p,0,3623,3666,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("<span class=\"result-count\">");t.b(t.v(t.f("count",c,p,0)));t.b("</span>");});c.pop();}t.b("\n" + i);if(t.s(t.f("count",c,p,1),c,p,0,3697,3776,"{{ }}")){t.rs(c,p,function(c,p,t){if(t.s(t.f("tradable",c,p,1),c,p,0,3710,3763,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("          <div class=\"icon-spacer\"></div>");t.b("\n" + i);t.b("          ");});c.pop();}});c.pop();}t.b(" ");if(t.s(t.f("tradable",c,p,1),c,p,0,3800,3863,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("<span class=\"history-tradable\"");t.b("\n" + i);t.b("            ></span");t.b("\n" + i);t.b("          >");});c.pop();}t.b("\n" + i);t.b("        </div>");t.b("\n" + i);t.b("      </div>");t.b("\n" + i);t.b("    </div>");t.b("\n" + i);});c.pop();}t.b("  </div>");t.b("\n" + i);t.b("</div>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<div id=\"history-container\" style=\"width: 100%\">\n  <style>\n    .history-actions {\n      margin-bottom: 1em;\n    }\n\n    #delete-history {\n      margin-right: 1em;\n    }\n\n    .help-icon {\n      background-color: #0291f6;\n      border-radius: 50%;\n      box-shadow: none;\n      color: #fff;\n      font-size: 26px;\n      font-weight: bold;\n      height: 23px;\n      line-height: 20px;\n      padding: 0;\n      text-align: center;\n      width: 23px;\n    }\n\n    .history-message {\n      background-color: rgba(255, 255, 255, 0.7);\n      border-radius: 1em;\n      margin: 1em;\n      padding: 1em;\n    }\n\n    .history-row {\n      display: flex;\n      flex-wrap: wrap;\n      height: 465px;\n      margin-right: 1em;\n      overflow-y: auto;\n      scrollbar-color: dark;\n      scrollbar-width: thin;\n    }\n\n    .result-card {\n      background-color: white;\n      border-radius: 1em;\n      box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.3);\n      height: 205px;\n      margin: 0.5em;\n      padding: 0.5em;\n      text-align: center;\n      width: 128px;\n    }\n\n    .result-image {\n      background-color: white;\n      border-radius: 1em;\n      box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.12),\n        0 2px 4px 2px rgba(0, 0, 0, 0.08);\n      height: 100px;\n      position: relative;\n      top: -0.8em;\n      width: 100px;\n    }\n\n    .result-content-column {\n      display: flex;\n      flex-direction: column;\n      height: 103px;\n      justify-content: space-between;\n    }\n\n    .result-name {\n      -webkit-box-orient: vertical;\n      -webkit-line-clamp: 3;\n      color: rgb(52, 56, 111);\n      display: -webkit-box;\n      flex-grow: 1;\n      font-size: 16px;\n      font-weight: bold;\n      margin-top: -0.2em;\n      overflow: hidden;\n    }\n\n    .result-location {\n    }\n\n    .result-date {\n      color: #fb8900;\n      font-size: 13px;\n      font-weight: bold;\n    }\n\n    .result-icons {\n      margin-top: 0.5em;\n    }\n\n    .result-count {\n      background: #ffffff;\n      border-radius: 100%;\n      border: 1px solid #00cdfb;\n      box-sizing: border-box;\n      color: #3ec0d7;\n      display: inline-block;\n      font-family: \"Alegreya Sans SC\", sans-serif;\n      font-size: 18px;\n      font-weight: 800;\n      height: 29px;\n      line-height: 27px;\n      text-align: center;\n      user-select: none;\n      width: 29px;\n    }\n\n    .history-tradable {\n      background-color: #666;\n      border-radius: 25px;\n      border: 1px solid #b9b9b9;\n      color: #ffffff;\n      display: inline-block;\n      font-family: \"Temp Menu\", serif;\n      font-size: 13px;\n      height: 15px;\n      line-height: 15px;\n      text-align: center;\n      width: 15px;\n    }\n\n    .icon-spacer {\n      display: inline-block;\n      width: 0.1em;\n    }\n  </style>\n\n  <div class=\"history-actions\">\n    <button id=\"delete-history\" class=\"nl-button\">\n      {{translate.pet.delete_history}}\n    </button>\n\n    <span class=\"tooltip\">\n      <span class=\"nl-button help-icon\">?</span>\n      <div class=\"tooltip-content\">\n        <p>{{{translate.pet.saved_locally}}}</p>\n        <p>{{{translate.pet.goto_account}}}</p>\n      </div>\n    </span>\n  </div>\n\n  {{^history}}\n  <p class=\"history-message\">{{translate.pet.empty_history}}</p>\n  {{/history}}\n\n  <div class=\"history-row\">\n    {{#history}}\n    <div class=\"result-card\">\n      <a href=\"{{web_hd}}\" target=\"_blank\">\n        <img class=\"result-image\" src=\"{{icon}}\" />\n      </a>\n\n      <div class=\"result-content-column\">\n        <div class=\"result-name\">{{name}}</div>\n        <div class=\"result-location\">{{locationName}}</div>\n        <div class=\"result-date\">{{date}}</div>\n\n        <div class=\"result-icons\">\n          {{#count}}<span class=\"result-count\">{{count}}</span>{{/count}}\n          {{#count}}{{#tradable}}\n          <div class=\"icon-spacer\"></div>\n          {{/tradable}}{{/count}} {{#tradable}}<span class=\"history-tradable\"\n            ></span\n          >{{/tradable}}\n        </div>\n      </div>\n    </div>\n    {{/history}}\n  </div>\n</div>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/favourite_outfit_flavr.html":
/*!********************************************************!*\
  !*** ./src/templates/html/favourite_outfit_flavr.html ***!
  \********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<style>");t.b("\n" + i);t.b("  .created-outfit-popup .flavr-outer .flavr-message::after {");t.b("\n" + i);t.b("    background-image: url(");t.b(t.v(t.f("url",c,p,0)));t.b(");");t.b("\n" + i);t.b("    background-size: contain;");t.b("\n" + i);t.b("  }");t.b("\n" + i);t.b("</style>");t.b("\n");t.b("\n" + i);t.b("<h1>");t.b(t.v(t.f("name",c,p,0)));t.b("</h1>");t.b("\n");t.b("\n" + i);t.b("<p>");t.b(t.t(t.d("translate.appearance.favourites.click_outfit.saved_locally",c,p,0)));t.b("</p>");t.b("\n");t.b("\n" + i);t.b("<br />");t.b("\n");t.b("\n" + i);t.b("<p>");t.b(t.t(t.d("translate.appearance.favourites.click_outfit.goto_account",c,p,0)));t.b("</p>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<style>\n  .created-outfit-popup .flavr-outer .flavr-message::after {\n    background-image: url({{url}});\n    background-size: contain;\n  }\n</style>\n\n<h1>{{name}}</h1>\n\n<p>{{{translate.appearance.favourites.click_outfit.saved_locally}}}</p>\n\n<br />\n\n<p>{{{translate.appearance.favourites.click_outfit.goto_account}}}</p>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/favourites_action.html":
/*!***************************************************!*\
  !*** ./src/templates/html/favourites_action.html ***!
  \***************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<button id=\"");t.b(t.v(t.f("id",c,p,0)));t.b("\" class=\"nl-button favorites-action-ee\">");t.b(t.v(t.f("text",c,p,0)));t.b("</button>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<button id=\"{{id}}\" class=\"nl-button favorites-action-ee\">{{text}}</button>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/flavr_notif/icon_message.html":
/*!**********************************************************!*\
  !*** ./src/templates/html/flavr_notif/icon_message.html ***!
  \**********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<img");t.b("\n" + i);t.b("  src=\"");t.b(t.v(t.f("icon",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  alt=\"");t.b(t.v(t.f("name",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  height=\"21\"");t.b("\n" + i);t.b("  style=\"display: inline-block; margin: -2px auto\"");t.b("\n" + i);t.b("/>");t.b("\n" + i);t.b(t.t(t.f("message",c,p,0)));t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<img\n  src=\"{{icon}}\"\n  alt=\"{{name}}\"\n  height=\"21\"\n  style=\"display: inline-block; margin: -2px auto\"\n/>\n{{{message}}}\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/header_takeover.html":
/*!*************************************************!*\
  !*** ./src/templates/html/header_takeover.html ***!
  \*************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<li");t.b("\n" + i);t.b("  id=\"header-takeover\"");t.b("\n" + i);t.b("  title=\"");t.b(t.v(t.d("translate.home.takeover",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  style=\"transition: transform ease-in-out 200ms; cursor: pointer\"");t.b("\n" + i);t.b("  onMouseOver=\"this.style.transform='scale(1.3)'\"");t.b("\n" + i);t.b("  onMouseOut=\"this.style.transform='scale(1)'\"");t.b("\n" + i);t.b(">");t.b("\n" + i);t.b("  <a>");t.b("\n" + i);t.b("    <img");t.b("\n" + i);t.b("      src=\"/static/img/new-layout/home/connected/lock.png\"");t.b("\n" + i);t.b("      alt=\"");t.b(t.v(t.d("translate.home.takeover",c,p,0)));t.b("\"");t.b("\n" + i);t.b("      style=\"filter: contrast(0%) brightness(200%) ");if(!t.s(t.f("takeover",c,p,1),c,p,1,0,0,"")){t.b("opacity(0)");};t.b("\"");t.b("\n" + i);t.b("      height=\"21\"");t.b("\n" + i);t.b("    />");t.b("\n" + i);t.b("  </a>");t.b("\n" + i);t.b("</li>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<li\n  id=\"header-takeover\"\n  title=\"{{translate.home.takeover}}\"\n  style=\"transition: transform ease-in-out 200ms; cursor: pointer\"\n  onMouseOver=\"this.style.transform='scale(1.3)'\"\n  onMouseOut=\"this.style.transform='scale(1)'\"\n>\n  <a>\n    <img\n      src=\"/static/img/new-layout/home/connected/lock.png\"\n      alt=\"{{translate.home.takeover}}\"\n      style=\"filter: contrast(0%) brightness(200%) {{^takeover}}opacity(0){{/takeover}}\"\n      height=\"21\"\n    />\n  </a>\n</li>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/home_content_small.html":
/*!****************************************************!*\
  !*** ./src/templates/html/home_content_small.html ***!
  \****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<a");t.b("\n" + i);t.b("  id=\"home-");t.b(t.v(t.f("id",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  class=\"home-content-tile home-content-small home-content-small-ee\"");t.b("\n" + i);t.b("  href=\"");t.b(t.v(t.f("href",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  style=\"background-image: url(");t.b(t.v(t.f("backgroundImage",c,p,0)));t.b(");\"");t.b("\n" + i);t.b(">");t.b("\n" + i);t.b("  <h4>");t.b(t.v(t.f("h4",c,p,0)));t.b("</h4>");t.b("\n" + i);t.b("</a>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<a\n  id=\"home-{{id}}\"\n  class=\"home-content-tile home-content-small home-content-small-ee\"\n  href=\"{{href}}\"\n  style=\"background-image: url({{backgroundImage}});\"\n>\n  <h4>{{h4}}</h4>\n</a>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/main_menu.html":
/*!*******************************************!*\
  !*** ./src/templates/html/main_menu.html ***!
  \*******************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<li class=\"main-menu-");t.b(t.v(t.f("class",c,p,0)));t.b(" main-menu-ee\">");t.b("\n" + i);t.b("  <a href=\"");t.b(t.v(t.f("href",c,p,0)));t.b("\">");t.b(t.v(t.f("text",c,p,0)));t.b("</a>");t.b("\n" + i);t.b("</li>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<li class=\"main-menu-{{class}} main-menu-ee\">\n  <a href=\"{{href}}\">{{text}}</a>\n</li>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/main_menu_purroshop.html":
/*!*****************************************************!*\
  !*** ./src/templates/html/main_menu_purroshop.html ***!
  \*****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<li class=\"main-menu-purroshop\">");t.b("\n" + i);t.b("  <a href=\"/mall/purroshop\">");t.b("\n" + i);t.b("    <img");t.b("\n" + i);t.b("      height=\"20\"");t.b("\n" + i);t.b("      src=\"/assets/img/item/consumable/b647d54afd6b04353e129219810512f5.png\"");t.b("\n" + i);t.b("      style=\"vertical-align: middle\"");t.b("\n" + i);t.b("    />");t.b("\n" + i);t.b("    Purro'Shop");t.b("\n" + i);t.b("  </a>");t.b("\n" + i);t.b("</li>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<li class=\"main-menu-purroshop\">\n  <a href=\"/mall/purroshop\">\n    <img\n      height=\"20\"\n      src=\"/assets/img/item/consumable/b647d54afd6b04353e129219810512f5.png\"\n      style=\"vertical-align: middle\"\n    />\n    Purro'Shop\n  </a>\n</li>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/market_history.html":
/*!************************************************!*\
  !*** ./src/templates/html/market_history.html ***!
  \************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<style>");t.b("\n" + i);t.b("  /* #marketplace-abstract-purchases and #marketplace-abstract-sales were");t.b("\n" + i);t.b("  re-written to target #purchase-history and #sale-history. */");t.b("\n");t.b("\n" + i);t.b("  #purchase-history,");t.b("\n" + i);t.b("  #sale-history {");t.b("\n" + i);t.b("    height: 600px;");t.b("\n" + i);t.b("    position: relative;");t.b("\n" + i);t.b("    width: 360px;");t.b("\n" + i);t.b("    display: inline-block;");t.b("\n" + i);t.b("    vertical-align: top;");t.b("\n" + i);t.b("  }");t.b("\n");t.b("\n" + i);t.b("  #sale-history .abstract-actions,");t.b("\n" + i);t.b("  #purchase-history .abstract-actions {");t.b("\n" + i);t.b("    position: relative;");t.b("\n" + i);t.b("    top: -40px;");t.b("\n" + i);t.b("    display: flex;");t.b("\n" + i);t.b("    flex-direction: column;");t.b("\n" + i);t.b("    justify-content: space-evenly;");t.b("\n" + i);t.b("    height: 80px;");t.b("\n" + i);t.b("  }");t.b("\n");t.b("\n" + i);t.b("  #sale-history .abstract-time,");t.b("\n" + i);t.b("  #purchase-history .abstract-time {");t.b("\n" + i);t.b("    position: static;");t.b("\n" + i);t.b("    display: inline;");t.b("\n" + i);t.b("    height: auto;");t.b("\n" + i);t.b("    color: #fb8900;");t.b("\n" + i);t.b("    font-weight: bold;");t.b("\n" + i);t.b("    font-size: 13px;");t.b("\n" + i);t.b("  }");t.b("\n");t.b("\n" + i);t.b("  #purchase-history {");t.b("\n" + i);t.b("    margin-right: 80px;");t.b("\n" + i);t.b("  }");t.b("\n");t.b("\n" + i);t.b("  #purchase-history:before {");t.b("\n" + i);t.b("    content: \"\";");t.b("\n" + i);t.b("    position: absolute;");t.b("\n" + i);t.b("    top: 120px;");t.b("\n" + i);t.b("    right: -42px;");t.b("\n" + i);t.b("    border-right: solid 2px #aaa;");t.b("\n" + i);t.b("    height: 320px;");t.b("\n" + i);t.b("  }");t.b("\n");t.b("\n" + i);t.b("  /* Custom fixes to the layout */");t.b("\n");t.b("\n" + i);t.b("  #purchase-history li {");t.b("\n" + i);t.b("    margin-left: 4px;");t.b("\n" + i);t.b("    margin-right: 4px;");t.b("\n" + i);t.b("  }");t.b("\n" + i);t.b("</style>");t.b("\n");t.b("\n" + i);t.b("<!-- Purchases -->");t.b("\n" + i);t.b("<div class=\"marketplace-abstract\" id=\"purchase-history\">");t.b("\n" + i);t.b("  <h2 class=\"section-subtitle\">");t.b("\n" + i);t.b("    ");t.b(t.v(t.d("translate.market.auctions.purchase_history",c,p,0)));t.b("\n" + i);t.b("  </h2>");t.b("\n");t.b("\n" + i);t.b("  <ul>");t.b("\n" + i);if(t.s(t.f("purchases",c,p,1),c,p,0,1248,2509,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("    <li");t.b("\n" + i);t.b("      data-itemid=\"");t.b(t.v(t.f("itemid",c,p,0)));t.b("\"");t.b("\n" + i);t.b("      class=\"marketplace-abstract marketplace-auctions-item marketplace-sales-item\"");t.b("\n" + i);t.b("    >");t.b("\n" + i);t.b("      <!-- Icon -->");t.b("\n" + i);t.b("      <div class=\"abstract-icon\">");t.b("\n" + i);t.b("        <img src=\"");t.b(t.v(t.f("icon",c,p,0)));t.b("\" />");t.b("\n" + i);t.b("      </div>");t.b("\n");t.b("\n" + i);t.b("      <!-- Prices -->");t.b("\n" + i);t.b("      <div class=\"abstract-container\">");t.b("\n" + i);t.b("        <div class=\"abstract-name\">");t.b(t.v(t.f("name",c,p,0)));t.b("</div>");t.b("\n" + i);t.b("        <div class=\"abstract-content\">");t.b("\n" + i);t.b("          <div class=\"abstract-currentPrice\">");t.b("\n" + i);t.b("            ");if(t.s(t.f("currentPrice",c,p,1),c,p,0,1702,1871,"{{ }}")){t.rs(c,p,function(c,p,t){t.b(" ");t.b(t.v(t.d("translate.market.auctions.current_price",c,p,0)));t.b("\n" + i);t.b("            <span class=\"price-item\">");t.b(t.v(t.d("currentPrice.price",c,p,0)));t.b("</span>");t.b("\n" + i);t.b("            <span class=\"maana-icon\"></span>");t.b("\n" + i);});c.pop();}t.b("            <br />");t.b("\n" + i);t.b("            ");if(t.s(t.f("buyNowPrice",c,p,1),c,p,0,1936,2104,"{{ }}")){t.rs(c,p,function(c,p,t){t.b(" ");t.b(t.v(t.d("translate.market.auctions.buy_now_price",c,p,0)));t.b("\n" + i);t.b("            <span class=\"price-item\">");t.b(t.v(t.d("buyNowPrice.price",c,p,0)));t.b("</span>");t.b("\n" + i);t.b("            <span class=\"maana-icon\"></span>");t.b("\n" + i);});c.pop();}t.b("          </div>");t.b("\n" + i);t.b("        </div>");t.b("\n" + i);t.b("      </div>");t.b("\n");t.b("\n" + i);t.b("      <!-- Actions -->");t.b("\n" + i);t.b("      <div class=\"abstract-actions\">");t.b("\n" + i);t.b("        <div class=\"abstract-time\">");t.b(t.v(t.f("date",c,p,0)));t.b("</div>");t.b("\n" + i);t.b("        <div");t.b("\n" + i);t.b("          class=\"nl-button nl-button-sm marketplace-itemDetail-cancel delete-button\"");t.b("\n" + i);t.b("          data-itemid=\"");t.b(t.v(t.f("itemid",c,p,0)));t.b("\"");t.b("\n" + i);t.b("        >");t.b("\n" + i);t.b("          ");t.b(t.v(t.d("translate.market.auctions.delete",c,p,0)));t.b("\n" + i);t.b("        </div>");t.b("\n" + i);t.b("      </div>");t.b("\n" + i);t.b("    </li>");t.b("\n" + i);});c.pop();}t.b("  </ul>");t.b("\n" + i);t.b("</div>");t.b("\n");t.b("\n" + i);t.b("<!-- Sales -->");t.b("\n" + i);t.b("<div class=\"marketplace-abstract\" id=\"sale-history\">");t.b("\n" + i);t.b("  <h2 class=\"section-subtitle\">");t.b(t.v(t.d("translate.market.auctions.sales_history",c,p,0)));t.b("</h2>");t.b("\n");t.b("\n" + i);t.b("  <ul>");t.b("\n" + i);if(t.s(t.f("sales",c,p,1),c,p,0,2710,3856,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("    <li class=\"marketplace-abstract marketplace-sales-item\">");t.b("\n" + i);t.b("      <!-- Icon -->");t.b("\n" + i);t.b("      <div class=\"abstract-icon\">");t.b("\n" + i);t.b("        <img src=\"");t.b(t.v(t.f("icon",c,p,0)));t.b("\" />");t.b("\n" + i);t.b("      </div>");t.b("\n");t.b("\n" + i);t.b("      <!-- Prices -->");t.b("\n" + i);t.b("      <div class=\"abstract-container\">");t.b("\n" + i);t.b("        <div class=\"abstract-name\">");t.b(t.v(t.f("name",c,p,0)));t.b("</div>");t.b("\n" + i);t.b("        <div class=\"abstract-content\">");t.b("\n" + i);t.b("          <div class=\"abstract-currentPrice\">");t.b("\n" + i);t.b("            ");if(t.s(t.f("currentPrice",c,p,1),c,p,0,3096,3259,"{{ }}")){t.rs(c,p,function(c,p,t){t.b(" ");t.b(t.v(t.d("translate.market.auctions.current_price",c,p,0)));t.b("\n" + i);t.b("            <span class=\"price-item\">");t.b(t.v(t.f("currentPrice",c,p,0)));t.b("</span>");t.b("\n" + i);t.b("            <span class=\"maana-icon\"></span>");t.b("\n" + i);});c.pop();}t.b("            <br />");t.b("\n" + i);t.b("            ");if(t.s(t.f("buyNowPrice",c,p,1),c,p,0,3324,3486,"{{ }}")){t.rs(c,p,function(c,p,t){t.b(" ");t.b(t.v(t.d("translate.market.auctions.buy_now_price",c,p,0)));t.b("\n" + i);t.b("            <span class=\"price-item\">");t.b(t.v(t.f("buyNowPrice",c,p,0)));t.b("</span>");t.b("\n" + i);t.b("            <span class=\"maana-icon\"></span>");t.b("\n" + i);});c.pop();}t.b("          </div>");t.b("\n" + i);t.b("        </div>");t.b("\n" + i);t.b("      </div>");t.b("\n");t.b("\n" + i);t.b("      <!-- Actions -->");t.b("\n" + i);t.b("      <div class=\"abstract-actions\">");t.b("\n" + i);t.b("        <div class=\"abstract-time\">");t.b(t.v(t.f("date",c,p,0)));t.b("</div>");t.b("\n" + i);t.b("        <div");t.b("\n" + i);t.b("          class=\"nl-button nl-button-sm marketplace-itemDetail-cancel delete-button\"");t.b("\n" + i);t.b("        >");t.b("\n" + i);t.b("          ");t.b(t.v(t.d("translate.market.auctions.delete",c,p,0)));t.b("\n" + i);t.b("        </div>");t.b("\n" + i);t.b("      </div>");t.b("\n" + i);t.b("    </li>");t.b("\n" + i);});c.pop();}t.b("  </ul>");t.b("\n" + i);t.b("</div>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<style>\n  /* #marketplace-abstract-purchases and #marketplace-abstract-sales were\n  re-written to target #purchase-history and #sale-history. */\n\n  #purchase-history,\n  #sale-history {\n    height: 600px;\n    position: relative;\n    width: 360px;\n    display: inline-block;\n    vertical-align: top;\n  }\n\n  #sale-history .abstract-actions,\n  #purchase-history .abstract-actions {\n    position: relative;\n    top: -40px;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-evenly;\n    height: 80px;\n  }\n\n  #sale-history .abstract-time,\n  #purchase-history .abstract-time {\n    position: static;\n    display: inline;\n    height: auto;\n    color: #fb8900;\n    font-weight: bold;\n    font-size: 13px;\n  }\n\n  #purchase-history {\n    margin-right: 80px;\n  }\n\n  #purchase-history:before {\n    content: \"\";\n    position: absolute;\n    top: 120px;\n    right: -42px;\n    border-right: solid 2px #aaa;\n    height: 320px;\n  }\n\n  /* Custom fixes to the layout */\n\n  #purchase-history li {\n    margin-left: 4px;\n    margin-right: 4px;\n  }\n</style>\n\n<!-- Purchases -->\n<div class=\"marketplace-abstract\" id=\"purchase-history\">\n  <h2 class=\"section-subtitle\">\n    {{translate.market.auctions.purchase_history}}\n  </h2>\n\n  <ul>\n    {{#purchases}}\n    <li\n      data-itemid=\"{{itemid}}\"\n      class=\"marketplace-abstract marketplace-auctions-item marketplace-sales-item\"\n    >\n      <!-- Icon -->\n      <div class=\"abstract-icon\">\n        <img src=\"{{icon}}\" />\n      </div>\n\n      <!-- Prices -->\n      <div class=\"abstract-container\">\n        <div class=\"abstract-name\">{{name}}</div>\n        <div class=\"abstract-content\">\n          <div class=\"abstract-currentPrice\">\n            {{#currentPrice}} {{translate.market.auctions.current_price}}\n            <span class=\"price-item\">{{currentPrice.price}}</span>\n            <span class=\"maana-icon\"></span>\n            {{/currentPrice}}\n            <br />\n            {{#buyNowPrice}} {{translate.market.auctions.buy_now_price}}\n            <span class=\"price-item\">{{buyNowPrice.price}}</span>\n            <span class=\"maana-icon\"></span>\n            {{/buyNowPrice}}\n          </div>\n        </div>\n      </div>\n\n      <!-- Actions -->\n      <div class=\"abstract-actions\">\n        <div class=\"abstract-time\">{{date}}</div>\n        <div\n          class=\"nl-button nl-button-sm marketplace-itemDetail-cancel delete-button\"\n          data-itemid=\"{{itemid}}\"\n        >\n          {{translate.market.auctions.delete}}\n        </div>\n      </div>\n    </li>\n    {{/purchases}}\n  </ul>\n</div>\n\n<!-- Sales -->\n<div class=\"marketplace-abstract\" id=\"sale-history\">\n  <h2 class=\"section-subtitle\">{{translate.market.auctions.sales_history}}</h2>\n\n  <ul>\n    {{#sales}}\n    <li class=\"marketplace-abstract marketplace-sales-item\">\n      <!-- Icon -->\n      <div class=\"abstract-icon\">\n        <img src=\"{{icon}}\" />\n      </div>\n\n      <!-- Prices -->\n      <div class=\"abstract-container\">\n        <div class=\"abstract-name\">{{name}}</div>\n        <div class=\"abstract-content\">\n          <div class=\"abstract-currentPrice\">\n            {{#currentPrice}} {{translate.market.auctions.current_price}}\n            <span class=\"price-item\">{{currentPrice}}</span>\n            <span class=\"maana-icon\"></span>\n            {{/currentPrice}}\n            <br />\n            {{#buyNowPrice}} {{translate.market.auctions.buy_now_price}}\n            <span class=\"price-item\">{{buyNowPrice}}</span>\n            <span class=\"maana-icon\"></span>\n            {{/buyNowPrice}}\n          </div>\n        </div>\n      </div>\n\n      <!-- Actions -->\n      <div class=\"abstract-actions\">\n        <div class=\"abstract-time\">{{date}}</div>\n        <div\n          class=\"nl-button nl-button-sm marketplace-itemDetail-cancel delete-button\"\n        >\n          {{translate.market.auctions.delete}}\n        </div>\n      </div>\n    </li>\n    {{/sales}}\n  </ul>\n</div>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/mass_mark_button.html":
/*!**************************************************!*\
  !*** ./src/templates/html/mass_mark_button.html ***!
  \**************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<a");t.b("\n" + i);t.b("  id=\"mass-mark\"");t.b("\n" + i);t.b("  class=\"nl-button\"");t.b("\n" + i);t.b("  style=\"margin-right: 0.6em; margin-top: 0.6em\"");t.b("\n" + i);t.b(">");t.b("\n" + i);t.b("  <img src=\"");t.b(t.v(t.f("src",c,p,0)));t.b("\" height=\"20px\" style=\"margin: -5px 0px\" />");t.b("\n" + i);t.b("  ");t.b(t.v(t.f("textContent",c,p,0)));t.b("\n" + i);t.b("</a>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<a\n  id=\"mass-mark\"\n  class=\"nl-button\"\n  style=\"margin-right: 0.6em; margin-top: 0.6em\"\n>\n  <img src=\"{{src}}\" height=\"20px\" style=\"margin: -5px 0px\" />\n  {{textContent}}\n</a>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/outfit_thumbs.html":
/*!***********************************************!*\
  !*** ./src/templates/html/outfit_thumbs.html ***!
  \***********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<div id=\"ee-outfit-thumbs\">");t.b("\n" + i);t.b("  <style>");t.b("\n" + i);t.b("    #appearance-items-category-favorites .slot.ee-available-slot {");t.b("\n" + i);t.b("      background-image: url(https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/available-favorite.png);");t.b("\n" + i);t.b("      background-position: -14px -11px;");t.b("\n" + i);t.b("      background-size: 171px 244px;");t.b("\n" + i);t.b("      border-radius: 44px;");t.b("\n" + i);t.b("      box-shadow: 0 0 4px 4px rgba(255, 255, 255, 0.8);");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    #appearance-items-category-favorites .slot.ee-available-slot::after {");t.b("\n" + i);t.b("      background: url(/static/img/new-layout/wardrobe/icon-plus.png);");t.b("\n" + i);t.b("      content: \" \";");t.b("\n" + i);t.b("      filter: drop-shadow(0 0 6px rgba(237, 12, 245, 0.9));");t.b("\n" + i);t.b("      height: 71px;");t.b("\n" + i);t.b("      left: 50%;");t.b("\n" + i);t.b("      opacity: 0;");t.b("\n" + i);t.b("      position: absolute;");t.b("\n" + i);t.b("      top: 50%;");t.b("\n" + i);t.b("      transform: translate(-50%, -50%);");t.b("\n" + i);t.b("      transition: opacity ease-in-out 100ms;");t.b("\n" + i);t.b("      width: 66px;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    #appearance-items-category-favorites .slot.ee-available-slot:hover::after,");t.b("\n" + i);t.b("    #appearance-items-category-favorites .slot.ee-outfit-thumb:hover p {");t.b("\n" + i);t.b("      opacity: 1;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    #appearance-items-category-favorites .slot.ee-outfit-thumb img {");t.b("\n" + i);t.b("      border-radius: 44px;");t.b("\n" + i);t.b("      height: 100%;");t.b("\n" + i);t.b("      width: 100%;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    #appearance-items-category-favorites .slot.ee-outfit-thumb p {");t.b("\n" + i);t.b("      background: rgba(0, 0, 0, 0.5);");t.b("\n" + i);t.b("      color: #fff;");t.b("\n" + i);t.b("      font-family: \"Alegreya Sans SC\", sans-serif;");t.b("\n" + i);t.b("      font-size: 22px;");t.b("\n" + i);t.b("      font-weight: 700;");t.b("\n" + i);t.b("      left: 50%;");t.b("\n" + i);t.b("      line-height: 22px;");t.b("\n" + i);t.b("      opacity: 0;");t.b("\n" + i);t.b("      padding: 12px 0;");t.b("\n" + i);t.b("      position: absolute;");t.b("\n" + i);t.b("      text-align: center;");t.b("\n" + i);t.b("      top: 50%;");t.b("\n" + i);t.b("      transform: translate(-50%, -50%);");t.b("\n" + i);t.b("      transition: opacity ease-in-out 400ms;");t.b("\n" + i);t.b("      width: 100%;");t.b("\n" + i);t.b("    }");t.b("\n" + i);t.b("  </style>");t.b("\n");t.b("\n" + i);if(t.s(t.f("outfits",c,p,1),c,p,0,1654,1790,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("  <div class=\"slot ee-outfit-thumb\" data-array-index=\"");t.b(t.v(t.f("id",c,p,0)));t.b("\">");t.b("\n" + i);t.b("    <img alt=\"");t.b(t.v(t.f("name",c,p,0)));t.b("\" src=\"");t.b(t.v(t.f("url",c,p,0)));t.b("\" />");t.b("\n" + i);t.b("    <p>");t.b(t.v(t.f("name",c,p,0)));t.b("</p>");t.b("\n" + i);t.b("  </div>");t.b("\n" + i);});c.pop();}t.b("\n" + i);t.b("  <div class=\"slot ee-available-slot\"></div>");t.b("\n" + i);t.b("</div>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<div id=\"ee-outfit-thumbs\">\n  <style>\n    #appearance-items-category-favorites .slot.ee-available-slot {\n      background-image: url(https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/available-favorite.png);\n      background-position: -14px -11px;\n      background-size: 171px 244px;\n      border-radius: 44px;\n      box-shadow: 0 0 4px 4px rgba(255, 255, 255, 0.8);\n    }\n\n    #appearance-items-category-favorites .slot.ee-available-slot::after {\n      background: url(/static/img/new-layout/wardrobe/icon-plus.png);\n      content: \" \";\n      filter: drop-shadow(0 0 6px rgba(237, 12, 245, 0.9));\n      height: 71px;\n      left: 50%;\n      opacity: 0;\n      position: absolute;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      transition: opacity ease-in-out 100ms;\n      width: 66px;\n    }\n\n    #appearance-items-category-favorites .slot.ee-available-slot:hover::after,\n    #appearance-items-category-favorites .slot.ee-outfit-thumb:hover p {\n      opacity: 1;\n    }\n\n    #appearance-items-category-favorites .slot.ee-outfit-thumb img {\n      border-radius: 44px;\n      height: 100%;\n      width: 100%;\n    }\n\n    #appearance-items-category-favorites .slot.ee-outfit-thumb p {\n      background: rgba(0, 0, 0, 0.5);\n      color: #fff;\n      font-family: \"Alegreya Sans SC\", sans-serif;\n      font-size: 22px;\n      font-weight: 700;\n      left: 50%;\n      line-height: 22px;\n      opacity: 0;\n      padding: 12px 0;\n      position: absolute;\n      text-align: center;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      transition: opacity ease-in-out 400ms;\n      width: 100%;\n    }\n  </style>\n\n  {{#outfits}}\n  <div class=\"slot ee-outfit-thumb\" data-array-index=\"{{id}}\">\n    <img alt=\"{{name}}\" src=\"{{url}}\" />\n    <p>{{name}}</p>\n  </div>\n  {{/outfits}}\n\n  <div class=\"slot ee-available-slot\"></div>\n</div>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/profile_contact_action.html":
/*!********************************************************!*\
  !*** ./src/templates/html/profile_contact_action.html ***!
  \********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<li id=\"");t.b(t.v(t.f("id",c,p,0)));t.b("\" class=\"profile-contact-action-ee\">");t.b("\n" + i);t.b("  <span class=\"nl-button nl-button-sm\">");t.b("\n" + i);t.b("    <div class=\"action-description\">");t.b(t.v(t.f("actionDescription",c,p,0)));t.b("</div>");t.b("\n" + i);t.b("  </span>");t.b("\n" + i);t.b("</li>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<li id=\"{{id}}\" class=\"profile-contact-action-ee\">\n  <span class=\"nl-button nl-button-sm\">\n    <div class=\"action-description\">{{actionDescription}}</div>\n  </span>\n</li>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/rename_favourite_outfit_flavr.html":
/*!***************************************************************!*\
  !*** ./src/templates/html/rename_favourite_outfit_flavr.html ***!
  \***************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<style>");t.b("\n" + i);t.b("  .created-outfit-popup .flavr-outer .flavr-message::after {");t.b("\n" + i);t.b("    background-image: url(");t.b(t.v(t.f("url",c,p,0)));t.b(");");t.b("\n" + i);t.b("    background-size: contain;");t.b("\n" + i);t.b("  }");t.b("\n" + i);t.b("</style>");t.b("\n");t.b("\n" + i);t.b("<h1>");t.b(t.t(t.f("title",c,p,0)));t.b("</h1>");t.b("\n");t.b("\n" + i);t.b("<p>");t.b(t.t(t.d("translate.appearance.favourites.click_outfit.saved_locally",c,p,0)));t.b("</p>");t.b("\n");t.b("\n" + i);t.b("<br />");t.b("\n");t.b("\n" + i);t.b("<p>");t.b(t.t(t.d("translate.appearance.favourites.click_outfit.goto_account",c,p,0)));t.b("</p>");t.b("\n");t.b("\n" + i);t.b("<input");t.b("\n" + i);t.b("  id=\"choose-name\"");t.b("\n" + i);t.b("  maxlength=\"30\"");t.b("\n" + i);t.b("  minlength=\"1\"");t.b("\n" + i);t.b("  placeholder=\"");t.b(t.v(t.f("name",c,p,0)));t.b("\"");t.b("\n" + i);t.b("  value=\"");t.b(t.v(t.f("name",c,p,0)));t.b("\"");t.b("\n" + i);t.b("/>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<style>\n  .created-outfit-popup .flavr-outer .flavr-message::after {\n    background-image: url({{url}});\n    background-size: contain;\n  }\n</style>\n\n<h1>{{{title}}}</h1>\n\n<p>{{{translate.appearance.favourites.click_outfit.saved_locally}}}</p>\n\n<br />\n\n<p>{{{translate.appearance.favourites.click_outfit.goto_account}}}</p>\n\n<input\n  id=\"choose-name\"\n  maxlength=\"30\"\n  minlength=\"1\"\n  placeholder=\"{{name}}\"\n  value=\"{{name}}\"\n/>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/settings.html":
/*!******************************************!*\
  !*** ./src/templates/html/settings.html ***!
  \******************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<div class=\"account-misc-bloc account-ee-bloc bloc\">");t.b("\n" + i);t.b("  <!--");t.b("\n" + i);t.b("  <style>");t.b("\n" + i);t.b("    table {");t.b("\n" + i);t.b("      width: 100%;");t.b("\n" + i);t.b("    }");t.b("\n");t.b("\n" + i);t.b("    th {");t.b("\n" + i);t.b("      text-align: start;");t.b("\n" + i);t.b("      padding: 1em;");t.b("\n" + i);t.b("    }");t.b("\n" + i);t.b("  </style>");t.b("\n" + i);t.b("  -->");t.b("\n");t.b("\n" + i);t.b("  <!-- Settings -->");t.b("\n" + i);t.b("  <h2 class=\"section-title\">");t.b(t.v(t.d("translate.account.enhancements",c,p,0)));t.b("</h2>");t.b("\n" + i);t.b("  <ul class=\"account-misc-actions\">");t.b("\n" + i);t.b("    <li");t.b("\n" + i);t.b("      id=\"ee-debug-enabled\"");t.b("\n" + i);t.b("      class=\"nl-button nl-button-sm ");if(t.s(t.f("debug",c,p,1),c,p,0,392,398,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("active");});c.pop();}t.b("\"");t.b("\n" + i);t.b("      title=\"");t.b(t.v(t.d("translate.account.debug_tooltip",c,p,0)));t.b("\"");t.b("\n" + i);t.b("    >");t.b("\n" + i);t.b("      ");t.b(t.v(t.d("translate.account.debug",c,p,0)));t.b("\n" + i);t.b("    </li>");t.b("\n" + i);if(t.s(t.f("unlocked",c,p,1),c,p,0,527,1030,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("    <li");t.b("\n" + i);t.b("      id=\"ee-minigames-enabled\"");t.b("\n" + i);t.b("      class=\"nl-button nl-button-sm ");if(t.s(t.f("minigames",c,p,1),c,p,0,618,624,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("active");});c.pop();}t.b("\"");t.b("\n" + i);t.b("    >");t.b("\n" + i);t.b("      ");t.b(t.v(t.d("translate.account.minigames",c,p,0)));t.b("\n" + i);t.b("    </li>");t.b("\n" + i);t.b("    <li");t.b("\n" + i);t.b("      id=\"ee-explorations-enabled\"");t.b("\n" + i);t.b("      class=\"nl-button nl-button-sm ");if(t.s(t.f("explorations",c,p,1),c,p,0,790,796,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("active");});c.pop();}t.b("\"");t.b("\n" + i);t.b("    >");t.b("\n" + i);t.b("      ");t.b(t.v(t.d("translate.account.explorations",c,p,0)));t.b("\n" + i);t.b("    </li>");t.b("\n" + i);t.b("    <li");t.b("\n" + i);t.b("      id=\"ee-market-enabled\"");t.b("\n" + i);t.b("      class=\"nl-button nl-button-sm ");if(t.s(t.f("market",c,p,1),c,p,0,956,962,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("active");});c.pop();}t.b("\"");t.b("\n" + i);t.b("    >");t.b("\n" + i);t.b("      ");t.b(t.v(t.d("translate.account.market",c,p,0)));t.b("\n" + i);t.b("    </li>");t.b("\n" + i);});c.pop();}t.b("    <li id=\"ee-import\" class=\"nl-button nl-button-sm\">");t.b("\n" + i);t.b("      ");t.b(t.v(t.d("translate.account.import",c,p,0)));t.b("\n" + i);t.b("    </li>");t.b("\n" + i);t.b("    <li id=\"ee-export\" class=\"nl-button nl-button-sm\">");t.b("\n" + i);t.b("      ");t.b(t.v(t.d("translate.account.export",c,p,0)));t.b("\n" + i);t.b("    </li>");t.b("\n" + i);t.b("    <li id=\"ee-delete-explorations\" class=\"nl-button nl-button-sm\">");t.b("\n" + i);t.b("      ");t.b(t.v(t.d("translate.account.delete_explorations",c,p,0)));t.b("\n" + i);t.b("    </li>");t.b("\n" + i);t.b("    <li id=\"ee-reset\" class=\"nl-button nl-button-sm\">");t.b("\n" + i);t.b("      ");t.b(t.v(t.d("translate.account.reset",c,p,0)));t.b("\n" + i);t.b("    </li>");t.b("\n" + i);t.b("  </ul>");t.b("\n");t.b("\n" + i);t.b("  <!-- Explorations");t.b("\n" + i);t.b("  <h3 class=\"section-title\">Explorations</h3>");t.b("\n" + i);t.b("  <table>");t.b("\n" + i);t.b("    <thead>");t.b("\n" + i);t.b("      <th>Location</th>");t.b("\n" + i);t.b("      <th>Delete</th>");t.b("\n" + i);t.b("    </thead>");t.b("\n" + i);t.b("    <tbody>");t.b("\n" + i);t.b("      <td>Rock</td>");t.b("\n" + i);t.b("      <td>");t.b("\n" + i);t.b("        <div class=\"nl-button nl-button-sm\">Delete</div>");t.b("\n" + i);t.b("      </td>");t.b("\n" + i);t.b("    </tbody>");t.b("\n" + i);t.b("  </table>");t.b("\n" + i);t.b("  -->");t.b("\n" + i);t.b("</div>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<div class=\"account-misc-bloc account-ee-bloc bloc\">\n  <!--\n  <style>\n    table {\n      width: 100%;\n    }\n\n    th {\n      text-align: start;\n      padding: 1em;\n    }\n  </style>\n  -->\n\n  <!-- Settings -->\n  <h2 class=\"section-title\">{{translate.account.enhancements}}</h2>\n  <ul class=\"account-misc-actions\">\n    <li\n      id=\"ee-debug-enabled\"\n      class=\"nl-button nl-button-sm {{#debug}}active{{/debug}}\"\n      title=\"{{translate.account.debug_tooltip}}\"\n    >\n      {{translate.account.debug}}\n    </li>\n    {{#unlocked}}\n    <li\n      id=\"ee-minigames-enabled\"\n      class=\"nl-button nl-button-sm {{#minigames}}active{{/minigames}}\"\n    >\n      {{translate.account.minigames}}\n    </li>\n    <li\n      id=\"ee-explorations-enabled\"\n      class=\"nl-button nl-button-sm {{#explorations}}active{{/explorations}}\"\n    >\n      {{translate.account.explorations}}\n    </li>\n    <li\n      id=\"ee-market-enabled\"\n      class=\"nl-button nl-button-sm {{#market}}active{{/market}}\"\n    >\n      {{translate.account.market}}\n    </li>\n    {{/unlocked}}\n    <li id=\"ee-import\" class=\"nl-button nl-button-sm\">\n      {{translate.account.import}}\n    </li>\n    <li id=\"ee-export\" class=\"nl-button nl-button-sm\">\n      {{translate.account.export}}\n    </li>\n    <li id=\"ee-delete-explorations\" class=\"nl-button nl-button-sm\">\n      {{translate.account.delete_explorations}}\n    </li>\n    <li id=\"ee-reset\" class=\"nl-button nl-button-sm\">\n      {{translate.account.reset}}\n    </li>\n  </ul>\n\n  <!-- Explorations\n  <h3 class=\"section-title\">Explorations</h3>\n  <table>\n    <thead>\n      <th>Location</th>\n      <th>Delete</th>\n    </thead>\n    <tbody>\n      <td>Rock</td>\n      <td>\n        <div class=\"nl-button nl-button-sm\">Delete</div>\n      </td>\n    </tbody>\n  </table>\n  -->\n</div>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/wishlist_button.html":
/*!*************************************************!*\
  !*** ./src/templates/html/wishlist_button.html ***!
  \*************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<a id=\"wishlist-button\" class=\"nl-button\">");t.b("\n" + i);t.b("  ");t.b(t.v(t.d("translate.market.wishlist.title",c,p,0)));t.b("\n" + i);t.b("</a>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<a id=\"wishlist-button\" class=\"nl-button\">\n  {{translate.market.wishlist.title}}\n</a>\n", H);return T; }();

/***/ }),

/***/ "./src/templates/html/wishlist_settings.html":
/*!***************************************************!*\
  !*** ./src/templates/html/wishlist_settings.html ***!
  \***************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<style>");t.b("\n" + i);t.b("  .reset-all {");t.b("\n" + i);t.b("    margin-bottom: 1em;");t.b("\n" + i);t.b("  }");t.b("\n");t.b("\n" + i);t.b("  table {");t.b("\n" + i);t.b("    text-align: center;");t.b("\n" + i);t.b("    width: 100%;");t.b("\n" + i);t.b("  }");t.b("\n");t.b("\n" + i);t.b("  .text-padding {");t.b("\n" + i);t.b("    padding: 0.25em;");t.b("\n" + i);t.b("  }");t.b("\n");t.b("\n" + i);t.b("  .action-picto {");t.b("\n" + i);t.b("    height: 50px;");t.b("\n" + i);t.b("    width: 50px;");t.b("\n" + i);t.b("    cursor: pointer;");t.b("\n" + i);t.b("  }");t.b("\n");t.b("\n" + i);t.b("  .action-picto:hover:not(.disabled),");t.b("\n" + i);t.b("  .edit-price:hover {");t.b("\n" + i);t.b("    animation: button-bounce 300ms linear forwards;");t.b("\n" + i);t.b("    filter: brightness(1.05) contrast(1.1);");t.b("\n" + i);t.b("  }");t.b("\n");t.b("\n" + i);t.b("  .row {");t.b("\n" + i);t.b("    display: flex;");t.b("\n" + i);t.b("    justify-content: center;");t.b("\n" + i);t.b("    align-items: center;");t.b("\n" + i);t.b("  }");t.b("\n");t.b("\n" + i);t.b("  .edit-price {");t.b("\n" + i);t.b("    cursor: pointer;");t.b("\n" + i);t.b("  }");t.b("\n");t.b("\n" + i);t.b("  img.disabled {");t.b("\n" + i);t.b("    filter: grayscale(1);");t.b("\n" + i);t.b("  }");t.b("\n");t.b("\n" + i);t.b("  .item-icon-container {");t.b("\n" + i);t.b("    display: inline-block;");t.b("\n" + i);t.b("    position: relative;");t.b("\n" + i);t.b("  }");t.b("\n");t.b("\n" + i);t.b("  .item-icon {");t.b("\n" + i);t.b("    width: 100px;");t.b("\n" + i);t.b("    height: 100px;");t.b("\n" + i);t.b("  }");t.b("\n" + i);t.b("</style>");t.b("\n");t.b("\n" + i);t.b("<button class=\"nl-button reset-all\">");t.b("\n" + i);t.b("  ");t.b(t.v(t.d("translate.market.wishlist.reset_all",c,p,0)));t.b("\n" + i);t.b("</button>");t.b("\n");t.b("\n" + i);t.b("<table>");t.b("\n" + i);t.b("  <thead>");t.b("\n" + i);t.b("    <tr>");t.b("\n" + i);t.b("      <th>");t.b(t.v(t.d("translate.market.wishlist.icon",c,p,0)));t.b("</th>");t.b("\n" + i);t.b("      <th>");t.b(t.v(t.d("translate.market.wishlist.name",c,p,0)));t.b("</th>");t.b("\n" + i);t.b("      <th>");t.b(t.v(t.d("translate.market.wishlist.price",c,p,0)));t.b("</th>");t.b("\n" + i);t.b("      <th>");t.b(t.v(t.d("translate.market.wishlist.status",c,p,0)));t.b("</th>");t.b("\n" + i);t.b("      <th>");t.b(t.v(t.d("translate.market.wishlist.actions",c,p,0)));t.b("</th>");t.b("\n" + i);t.b("    </tr>");t.b("\n" + i);t.b("  </thead>");t.b("\n" + i);t.b("  <tbody>");t.b("\n" + i);if(t.s(t.f("wishlist",c,p,1),c,p,0,1137,2657,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("    <tr class=\"marketplace-abstract\" data-icon=\"");t.b(t.v(t.f("icon",c,p,0)));t.b("\">");t.b("\n" + i);t.b("      <!-- Icon -->");t.b("\n" + i);t.b("      <td>");t.b("\n" + i);t.b("        <div class=\"item-icon-container\">");t.b("\n" + i);t.b("          <img class=\"item-icon\" src=\"");t.b(t.v(t.f("icon",c,p,0)));t.b("\" alt=\"");t.b(t.v(t.f("name",c,p,0)));t.b("\" />");t.b("\n" + i);t.b("          <div class=\"rarity-marker-");t.b(t.v(t.f("rarity",c,p,0)));t.b("\"></div>");t.b("\n" + i);t.b("        </div>");t.b("\n" + i);t.b("      </td>");t.b("\n");t.b("\n" + i);t.b("      <!-- Name -->");t.b("\n" + i);t.b("      <td class=\"text-padding\">");t.b("\n" + i);t.b("        <div class=\"abstract-name\">");t.b(t.v(t.f("name",c,p,0)));t.b("</div>");t.b("\n" + i);t.b("        <div class=\"abstract-type\">");t.b(t.v(t.f("abstractType",c,p,0)));t.b("</div>");t.b("\n" + i);t.b("      </td>");t.b("\n");t.b("\n" + i);t.b("      <!-- Price -->");t.b("\n" + i);t.b("      <td class=\"text-padding\">");t.b("\n" + i);t.b("        <div");t.b("\n" + i);t.b("          class=\"edit-price row\"");t.b("\n" + i);t.b("          title=\"");t.b(t.v(t.d("translate.market.wishlist.change_price",c,p,0)));t.b("\"");t.b("\n" + i);t.b("        >");t.b("\n" + i);t.b("          <span class=\"price-item\">");t.b(t.v(t.f("price",c,p,0)));t.b("</span>");t.b("\n" + i);t.b("          <span class=\"maana-icon\" alt=\"maanas\"></span>");t.b("\n" + i);t.b("        </div>");t.b("\n" + i);t.b("      </td>");t.b("\n");t.b("\n" + i);t.b("      <!-- Error -->");t.b("\n" + i);t.b("      <td class=\"text-padding\">");t.b("\n" + i);t.b("        <p class=\"error\">");t.b(t.v(t.f("error",c,p,0)));t.b("</p>");t.b("\n" + i);t.b("      </td>");t.b("\n");t.b("\n" + i);t.b("      <!-- Actions -->");t.b("\n" + i);t.b("      <td>");t.b("\n" + i);t.b("        <div class=\"row\">");t.b("\n" + i);t.b("          <img");t.b("\n" + i);t.b("            class=\"action-picto reset-item-status ");if(!t.s(t.f("error",c,p,1),c,p,1,0,0,"")){t.b("disabled");};t.b("\"");t.b("\n" + i);t.b("            src=\"/static/img/new-layout/wardrobe/reset-btn.png\"");t.b("\n" + i);t.b("            title=\"");t.b(t.v(t.d("translate.market.wishlist.reset_tooltip",c,p,0)));t.b("\"");t.b("\n" + i);t.b("            alt=\"");t.b(t.v(t.d("translate.market.wishlist.reset",c,p,0)));t.b("\"");t.b("\n" + i);t.b("          />");t.b("\n" + i);t.b("          <img");t.b("\n" + i);t.b("            class=\"action-picto delete-wishlist-item\"");t.b("\n" + i);t.b("            src=\"/static/img/new-layout/wardrobe/delete.png\"");t.b("\n" + i);t.b("            title=\"");t.b(t.v(t.d("translate.market.wishlist.delete_tooltip",c,p,0)));t.b("\"");t.b("\n" + i);t.b("            alt=\"");t.b(t.v(t.d("translate.market.wishlist.delete",c,p,0)));t.b("\"");t.b("\n" + i);t.b("          />");t.b("\n" + i);t.b("        </div>");t.b("\n" + i);t.b("      </td>");t.b("\n" + i);t.b("    </tr>");t.b("\n" + i);});c.pop();}t.b("  </tbody>");t.b("\n" + i);t.b("</table>");t.b("\n");return t.fl(); },partials: {}, subs: {  }}, "<style>\n  .reset-all {\n    margin-bottom: 1em;\n  }\n\n  table {\n    text-align: center;\n    width: 100%;\n  }\n\n  .text-padding {\n    padding: 0.25em;\n  }\n\n  .action-picto {\n    height: 50px;\n    width: 50px;\n    cursor: pointer;\n  }\n\n  .action-picto:hover:not(.disabled),\n  .edit-price:hover {\n    animation: button-bounce 300ms linear forwards;\n    filter: brightness(1.05) contrast(1.1);\n  }\n\n  .row {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n  }\n\n  .edit-price {\n    cursor: pointer;\n  }\n\n  img.disabled {\n    filter: grayscale(1);\n  }\n\n  .item-icon-container {\n    display: inline-block;\n    position: relative;\n  }\n\n  .item-icon {\n    width: 100px;\n    height: 100px;\n  }\n</style>\n\n<button class=\"nl-button reset-all\">\n  {{translate.market.wishlist.reset_all}}\n</button>\n\n<table>\n  <thead>\n    <tr>\n      <th>{{translate.market.wishlist.icon}}</th>\n      <th>{{translate.market.wishlist.name}}</th>\n      <th>{{translate.market.wishlist.price}}</th>\n      <th>{{translate.market.wishlist.status}}</th>\n      <th>{{translate.market.wishlist.actions}}</th>\n    </tr>\n  </thead>\n  <tbody>\n    {{#wishlist}}\n    <tr class=\"marketplace-abstract\" data-icon=\"{{icon}}\">\n      <!-- Icon -->\n      <td>\n        <div class=\"item-icon-container\">\n          <img class=\"item-icon\" src=\"{{icon}}\" alt=\"{{name}}\" />\n          <div class=\"rarity-marker-{{rarity}}\"></div>\n        </div>\n      </td>\n\n      <!-- Name -->\n      <td class=\"text-padding\">\n        <div class=\"abstract-name\">{{name}}</div>\n        <div class=\"abstract-type\">{{abstractType}}</div>\n      </td>\n\n      <!-- Price -->\n      <td class=\"text-padding\">\n        <div\n          class=\"edit-price row\"\n          title=\"{{translate.market.wishlist.change_price}}\"\n        >\n          <span class=\"price-item\">{{price}}</span>\n          <span class=\"maana-icon\" alt=\"maanas\"></span>\n        </div>\n      </td>\n\n      <!-- Error -->\n      <td class=\"text-padding\">\n        <p class=\"error\">{{error}}</p>\n      </td>\n\n      <!-- Actions -->\n      <td>\n        <div class=\"row\">\n          <img\n            class=\"action-picto reset-item-status {{^error}}disabled{{/error}}\"\n            src=\"/static/img/new-layout/wardrobe/reset-btn.png\"\n            title=\"{{translate.market.wishlist.reset_tooltip}}\"\n            alt=\"{{translate.market.wishlist.reset}}\"\n          />\n          <img\n            class=\"action-picto delete-wishlist-item\"\n            src=\"/static/img/new-layout/wardrobe/delete.png\"\n            title=\"{{translate.market.wishlist.delete_tooltip}}\"\n            alt=\"{{translate.market.wishlist.delete}}\"\n          />\n        </div>\n      </td>\n    </tr>\n    {{/wishlist}}\n  </tbody>\n</table>\n", H);return T; }();

/***/ }),

/***/ "./src/ajax/ajax_search.ts":
/*!*********************************!*\
  !*** ./src/ajax/ajax_search.ts ***!
  \*********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "ajaxSearch": () => (/* binding */ ajaxSearch)
/* harmony export */ });
/* harmony import */ var _marketplace_enums_body_location_enum__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../marketplace/enums/body_location.enum */ "./src/marketplace/enums/body_location.enum.ts");
/* harmony import */ var _marketplace_enums_category_enum__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../marketplace/enums/category.enum */ "./src/marketplace/enums/category.enum.ts");
/* harmony import */ var _marketplace_enums_guard_enum__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../marketplace/enums/guard.enum */ "./src/marketplace/enums/guard.enum.ts");
/* harmony import */ var _marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../marketplace/enums/rarity.enum */ "./src/marketplace/enums/rarity.enum.ts");
/* harmony import */ var _marketplace_enums_type_enum__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../marketplace/enums/type.enum */ "./src/marketplace/enums/type.enum.ts");





async function ajaxSearch(data) {
    data = {
        ...{
            type: _marketplace_enums_type_enum__WEBPACK_IMPORTED_MODULE_4__.Type.All,
            bodyLocation: _marketplace_enums_body_location_enum__WEBPACK_IMPORTED_MODULE_0__.BodyLocation.All,
            category: _marketplace_enums_category_enum__WEBPACK_IMPORTED_MODULE_1__.CategoryNumber.all,
            rarity: _marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_3__.Rarity.all,
            price: "",
            guard: _marketplace_enums_guard_enum__WEBPACK_IMPORTED_MODULE_2__.Guard.any,
            page: 1,
            name: "",
        },
        ...data,
    };
    const ITEMS_PER_PAGE = 8;
    return (await $.get("/marketplace/ajax_search", {
        ...data,
        from: (data.page - 1) * ITEMS_PER_PAGE,
        to: ITEMS_PER_PAGE,
    }));
}


/***/ }),

/***/ "./src/ajax/buy.ts":
/*!*************************!*\
  !*** ./src/ajax/buy.ts ***!
  \*************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "buy": () => (/* binding */ buy)
/* harmony export */ });
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");

async function buy(itemId) {
    return new Promise(resolve => {
        void $.post("/marketplace/buy", { id: itemId }, (json) => {
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.meta = json.meta;
            resolve(json);
            if (json.result !== "success") {
                $.flavrNotif(json.data);
                return;
            }
        }, "json");
    });
}


/***/ }),

/***/ "./src/ajax/capture_end.ts":
/*!*********************************!*\
  !*** ./src/ajax/capture_end.ts ***!
  \*********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "captureEnd": () => (/* binding */ captureEnd)
/* harmony export */ });
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");

async function captureEnd() {
    return new Promise(resolve => {
        void $.post("/pet/capture/end", (json) => {
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.meta = json.meta;
            resolve(json);
            if (json.result !== "success") {
                $.flavrNotif(json.data);
                return;
            }
        });
    });
}


/***/ }),

/***/ "./src/ajax/change_region.ts":
/*!***********************************!*\
  !*** ./src/ajax/change_region.ts ***!
  \***********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "changeRegion": () => (/* binding */ changeRegion)
/* harmony export */ });
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");

async function changeRegion(newRegionId) {
    return new Promise((resolve) => {
        void $.post("/pet/changeRegion", { newRegionId }, (json) => {
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.meta = json.meta;
            resolve(json);
            if (json.result !== "success") {
                $.flavrNotif(json.data);
                return;
            }
            currentRegion = json.data.currentRegion;
            pendingTreasureHuntLocation =
                typeof json.data.pendingTreasureHuntLocation === "undefined"
                    ? null
                    : json.data.pendingTreasureHuntLocation;
            timeLeftExploration =
                typeof json.data.timeLeftExploration === "undefined"
                    ? null
                    : json.data.timeLeftExploration;
        });
    });
}


/***/ }),

/***/ "./src/ajax/exploration_results.ts":
/*!*****************************************!*\
  !*** ./src/ajax/exploration_results.ts ***!
  \*****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "explorationResults": () => (/* binding */ explorationResults)
/* harmony export */ });
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");

async function explorationResults() {
    return new Promise((resolve) => {
        void $.post("/pet/explorationResults", (json) => {
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.meta = json.meta;
            resolve(json);
            if (json.result !== "success") {
                $.flavrNotif(json.data);
                return;
            }
        });
    });
}


/***/ }),

/***/ "./src/api/meta.ts":
/*!*************************!*\
  !*** ./src/api/meta.ts ***!
  \*************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "PurroshopStatus": () => (/* binding */ PurroshopStatus)
/* harmony export */ });
var PurroshopStatus;
(function (PurroshopStatus) {
    PurroshopStatus["disabled"] = "disabled";
    PurroshopStatus["enabled"] = "enabled";
})(PurroshopStatus || (PurroshopStatus = {}));


/***/ }),

/***/ "./src/api/result.enum.ts":
/*!********************************!*\
  !*** ./src/api/result.enum.ts ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "Result": () => (/* binding */ Result)
/* harmony export */ });
var Result;
(function (Result) {
    Result["error"] = "error";
    Result["success"] = "success";
})(Result || (Result = {}));


/***/ }),

/***/ "./src/appearance/appearance_ui.ts":
/*!*****************************************!*\
  !*** ./src/appearance/appearance_ui.ts ***!
  \*****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadAppearanceUI": () => (/* binding */ loadAppearanceUI)
/* harmony export */ });
/* harmony import */ var _wardrobe__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wardrobe */ "./src/appearance/wardrobe.ts");

function loadAppearanceUI() {
    setupBackground();
    setupLeftPanel();
    setupRightPanel();
    if (_wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"].availableItems)
        availableItems = _wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"].availableItems;
    else
        _wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"].availableItems = availableItems;
}
function setupBackground() {
    const background = document.querySelector("#avatar-background img");
    if (background) {
        background.style.filter = "unset";
        background.style.height = "unset";
        background.style.mask =
            "linear-gradient(to right, black 50%, transparent 100%)";
        background.style.minHeight = "100vh";
        background.style.minWidth = "50vw";
        background.style.position = "fixed";
        background.style.transform = "unset";
        background.style.width = "unset";
    }
}
function setupRightPanel() {
    const rightPanel = document.getElementById("appearance-right");
    if (rightPanel)
        rightPanel.style.paddingTop = "80px";
}
function setupLeftPanel() {
    const previewOuter = document.getElementById("appearance-preview-outer");
    if (previewOuter) {
        previewOuter.style.padding = "0px";
    }
    const preview = document.getElementById("appearance-preview");
    if (preview) {
        preview.style.left = "0";
        preview.style.position = "fixed";
        preview.style.top = "calc(50% - var(--topbar-height))";
        preview.style.transform = "translateY(-50%)";
    }
    const canvas = document.querySelector("#appearance-preview canvas");
    if (canvas) {
        canvas.style.maxHeight = "100vh";
        canvas.style.maxWidth = "50vw";
    }
}


/***/ }),

/***/ "./src/appearance/data_set.ts":
/*!************************************!*\
  !*** ./src/appearance/data_set.ts ***!
  \************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "categoryContainerDataSet": () => (/* binding */ categoryContainerDataSet),
/* harmony export */   "categoryGroupDataSet": () => (/* binding */ categoryGroupDataSet),
/* harmony export */   "itemDataSet": () => (/* binding */ itemDataSet)
/* harmony export */ });
/* harmony import */ var _eldarya_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../eldarya_util */ "./src/eldarya_util.ts");

function categoryContainerDataSet(categoryContainer) {
    const { categoryid, category, categoryname } = categoryContainer.dataset;
    if (!categoryid || !category || !categoryname)
        return;
    return {
        categoryid: Number(categoryid),
        category: category,
        categoryname,
    };
}
function categoryGroupDataSet(groupItem, appearanceCategory) {
    const { itemid, group, name, rarity, rarityname } = groupItem.dataset;
    if (!itemid || !group || !name || !rarity || !rarityname)
        return;
    return {
        ...appearanceCategory,
        itemid: Number(itemid),
        group: Number(group),
        name,
        rarity,
        rarityname,
    };
}
function itemDataSet(li, appearanceGroup) {
    const { itemid, name, rarity, rarityname } = li.dataset;
    const icon = li.querySelector("img")?.src;
    if (!itemid || !name || !rarity || !rarityname || !icon)
        return;
    return {
        ...appearanceGroup,
        itemid: Number(itemid),
        name,
        rarity,
        rarityname,
        icon: (0,_eldarya_util__WEBPACK_IMPORTED_MODULE_0__.trimIcon)(icon),
    };
}


/***/ }),

/***/ "./src/appearance/dressing_experience.ts":
/*!***********************************************!*\
  !*** ./src/appearance/dressing_experience.ts ***!
  \***********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadBackground": () => (/* binding */ loadBackground),
/* harmony export */   "loadDressingExperience": () => (/* binding */ loadDressingExperience)
/* harmony export */ });
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _ts_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ts_util */ "./src/ts_util.ts");
/* harmony import */ var _ui_favourites__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ui/favourites */ "./src/ui/favourites.ts");
/* harmony import */ var _appearance_ui__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./appearance_ui */ "./src/appearance/appearance_ui.ts");
/* harmony import */ var _data_set__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./data_set */ "./src/appearance/data_set.ts");
/* harmony import */ var _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./enums/appearance_category_code.enum */ "./src/appearance/enums/appearance_category_code.enum.ts");
/* harmony import */ var _favourites_actions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./favourites_actions */ "./src/appearance/favourites_actions.ts");
/* harmony import */ var _hidden__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hidden */ "./src/appearance/hidden.ts");
/* harmony import */ var _wardrobe__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./wardrobe */ "./src/appearance/wardrobe.ts");









async function loadDressingExperience() {
    if (!location.pathname.startsWith("/player/appearance"))
        return;
    handledCategories.clear();
    loading = false;
    (0,_appearance_ui__WEBPACK_IMPORTED_MODULE_3__.loadAppearanceUI)();
    // Setup categories
    for (const li of document.querySelectorAll("#wardrobe-menu>li, #appearance-items-categories li")) {
        const { category } = li.dataset;
        if (!(0,_ts_util__WEBPACK_IMPORTED_MODULE_1__.isEnum)(category, _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode))
            continue;
        switch (category) {
            case _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.background:
                li.addEventListener("click", () => document.getElementById("ee-category")?.remove());
                continue;
            case _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.favorites:
                li.addEventListener("click", () => {
                    document.getElementById("ee-category")?.remove();
                    void handleCategory(category);
                });
                continue;
            case _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.attic:
                continue;
            default:
                li.addEventListener("click", () => {
                    document
                        .getElementById("appearance-items-category-favorites")
                        ?.remove();
                    // void handleCategory(category)
                });
        }
    }
    await new Promise(resolve => setTimeout(resolve, 1000));
    // await loadBackground()
}
/**
 * Get the category container for the clicked category and load its groups
 * @returns Category container
 */
async function handleCategory(category) {
    const appearanceItems = document.querySelector("#appearance-items");
    if (!appearanceItems)
        return null;
    const oldCatContainer = document.querySelector(`#appearance-items-category-${category}`);
    if (oldCatContainer) {
        await onAppearanceItemsCategory(category, appearanceItems, oldCatContainer);
        return oldCatContainer;
    }
    return new Promise(resolve => {
        new MutationObserver((_, observer) => {
            const newCatContainer = document.querySelector(`#appearance-items-category-${category}`);
            if (!newCatContainer)
                return;
            observer.disconnect();
            void (async () => {
                await onAppearanceItemsCategory(category, appearanceItems, newCatContainer);
                resolve(newCatContainer);
            })();
        }).observe(appearanceItems, { childList: true });
    });
}
async function onAppearanceItemsCategory(category, appearanceItems, categoryContainer) {
    if (category === _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.favorites)
        (0,_ui_favourites__WEBPACK_IMPORTED_MODULE_2__.loadFavourites)();
    else {
        await new Promise(resolve => setTimeout(resolve, 220));
        loadEeItems(appearanceItems, categoryContainer);
        await handleGroups(categoryContainer);
    }
}
function loadEeItems(appearanceItems, categoryContainer) {
    // Get information about the current category
    const appearanceCategory = (0,_data_set__WEBPACK_IMPORTED_MODULE_4__.categoryContainerDataSet)(categoryContainer);
    if (!appearanceCategory)
        return null;
    _wardrobe__WEBPACK_IMPORTED_MODULE_8__["default"].setCategory(appearanceCategory);
    categoryContainer.classList.remove("active");
    categoryContainer.style.display = "none";
    // Setup appearance_items_category
    const template = __webpack_require__(/*! ../templates/html/appearance_items_category.html */ "./src/templates/html/appearance_items_category.html");
    document.getElementById("ee-category")?.remove();
    appearanceItems.insertAdjacentHTML("beforeend", template.render({ ...appearanceCategory, translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate }));
    const eeItems = document.querySelector("#ee-items");
    if (!eeItems)
        return null;
    eeItems.dataset.categoryid = appearanceCategory.categoryid.toString();
    eeItems.dataset.category = appearanceCategory.category;
    eeItems.dataset.categoryname = appearanceCategory.categoryname;
    return eeItems;
}
const handledCategories = new Set();
/** Load each groups synchronously and add them to a custom container. */
async function handleGroups(categoryContainer) {
    const appearanceCategory = (0,_data_set__WEBPACK_IMPORTED_MODULE_4__.categoryContainerDataSet)(categoryContainer);
    if (!appearanceCategory)
        return;
    _wardrobe__WEBPACK_IMPORTED_MODULE_8__["default"].setCategory(appearanceCategory);
    categoryContainer.classList.remove("active");
    categoryContainer.style.display = "none";
    const handled = handledCategories.has(appearanceCategory.category);
    handledCategories.add(appearanceCategory.category);
    (0,_hidden__WEBPACK_IMPORTED_MODULE_7__.loadHiddenCategory)(appearanceCategory.category);
    for (const li of categoryContainer.querySelectorAll("li.appearance-item-group")) {
        const appearanceGroup = (0,_data_set__WEBPACK_IMPORTED_MODULE_4__.categoryGroupDataSet)(li, appearanceCategory);
        if (!appearanceGroup?.group)
            break;
        _wardrobe__WEBPACK_IMPORTED_MODULE_8__["default"].setGroup(appearanceGroup);
        if (!document.querySelector(`#appearance-items-group-${appearanceGroup.group}`) &&
            !handled
        // && !loadHiddenGroup(appearanceGroup.group)
        )
            await (0,_favourites_actions__WEBPACK_IMPORTED_MODULE_6__.openGroup)(appearanceGroup.group);
        const div = document.querySelector(`#appearance-items-group-${appearanceGroup.group}`);
        if (!div)
            break;
        div.classList.remove("active");
        const script = div.querySelector("script"); // eslint-disable-next-line @typescript-eslint/no-implied-eval
        if (script)
            setTimeout(script.innerHTML, 0);
        const outerHTML = Array.from(div.querySelectorAll("li.appearance-item"))
            .map(li => {
            const appearanceItem = (0,_data_set__WEBPACK_IMPORTED_MODULE_4__.itemDataSet)(li, appearanceGroup);
            if (!appearanceItem?.icon)
                return li.outerHTML;
            li.dataset.categoryid = appearanceItem.categoryid.toString();
            li.dataset.category = appearanceItem.category;
            li.dataset.categoryname = appearanceItem.categoryname;
            li.dataset.group = appearanceItem.group.toString();
            _wardrobe__WEBPACK_IMPORTED_MODULE_8__["default"].setItem(appearanceItem);
            return li.outerHTML;
        })
            .join("\n");
        _wardrobe__WEBPACK_IMPORTED_MODULE_8__["default"].availableItems = availableItems;
        div.remove();
        const active = document.querySelector(`#wardrobe-menu li[data-category="${appearanceGroup.category}"].active`);
        if (active) {
            document
                .querySelector("#ee-items")
                ?.insertAdjacentHTML("beforeend", outerHTML);
            initializeSelectedItems();
            initializeHiddenCategories();
        }
        else if (handled)
            break;
    }
    if (!handled)
        handledCategories.delete(appearanceCategory.category);
    (0,_hidden__WEBPACK_IMPORTED_MODULE_7__.unloadHiddenCategories)();
}
let loading = false;
async function loadBackground() {
    if (loading)
        return;
    loading = true;
    let success = true;
    const categories = [
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.underwear,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.skin,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.tatoo,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.mouth,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.eye,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.hair,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.sock,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.shoe,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.pants,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.handAccessory,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.top,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.coat,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.glove,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.necklace,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.dress,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.hat,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.faceAccessory,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.belt,
        _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode.ambient,
    ];
    const template = __webpack_require__(/*! ../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html");
    for (const category of categories) {
        if (!location.pathname.startsWith("/player/appearance")) {
            success = false;
            break;
        }
        const active = document.querySelector(`#wardrobe-menu li[data-category="${category}"].active`);
        if (active)
            continue;
        const categoryContainer = await (0,_favourites_actions__WEBPACK_IMPORTED_MODULE_6__.openCategory)(category);
        if (!categoryContainer) {
            success = false;
            break;
        }
        let finished = false;
        setTimeout(() => {
            if (!finished)
                $.flavrNotif(template.render({
                    icon: `/static/img/mall/categories/${category}.png`,
                    message: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.appearance.loading(document.querySelector(`#wardrobe-menu li[data-category="${category}"]`)?.dataset.categoryname ?? category),
                }));
        }, 1000);
        await handleGroups(categoryContainer);
        finished = true;
    }
    if (success)
        $.flavrNotif(_i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.appearance.loaded);
    loading = false;
}


/***/ }),

/***/ "./src/appearance/enums/appearance_category_code.enum.ts":
/*!***************************************************************!*\
  !*** ./src/appearance/enums/appearance_category_code.enum.ts ***!
  \***************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "AppearanceCategoryCode": () => (/* binding */ AppearanceCategoryCode)
/* harmony export */ });
var AppearanceCategoryCode;
(function (AppearanceCategoryCode) {
    AppearanceCategoryCode["attic"] = "attic";
    AppearanceCategoryCode["favorites"] = "favorites";
    AppearanceCategoryCode["underwear"] = "underwear";
    AppearanceCategoryCode["skin"] = "skin";
    AppearanceCategoryCode["tatoo"] = "tatoo";
    AppearanceCategoryCode["mouth"] = "mouth";
    AppearanceCategoryCode["eye"] = "eye";
    AppearanceCategoryCode["hair"] = "hair";
    AppearanceCategoryCode["sock"] = "sock";
    AppearanceCategoryCode["shoe"] = "shoe";
    AppearanceCategoryCode["pants"] = "pants";
    AppearanceCategoryCode["handAccessory"] = "handAccessory";
    AppearanceCategoryCode["top"] = "top";
    AppearanceCategoryCode["coat"] = "coat";
    AppearanceCategoryCode["glove"] = "glove";
    AppearanceCategoryCode["necklace"] = "necklace";
    AppearanceCategoryCode["dress"] = "dress";
    AppearanceCategoryCode["hat"] = "hat";
    AppearanceCategoryCode["faceAccessory"] = "faceAccessory";
    AppearanceCategoryCode["background"] = "background";
    AppearanceCategoryCode["belt"] = "belt";
    AppearanceCategoryCode["ambient"] = "ambient";
})(AppearanceCategoryCode || (AppearanceCategoryCode = {}));


/***/ }),

/***/ "./src/appearance/fake_favourites.ts":
/*!*******************************************!*\
  !*** ./src/appearance/fake_favourites.ts ***!
  \*******************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "saveFavourite": () => (/* binding */ saveFavourite),
/* harmony export */   "showFavourite": () => (/* binding */ showFavourite),
/* harmony export */   "showRenameFavourite": () => (/* binding */ showRenameFavourite)
/* harmony export */ });
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../indexed_db/indexed_db */ "./src/indexed_db/indexed_db.ts");
/* harmony import */ var _outfit__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../outfit */ "./src/outfit.ts");
/* harmony import */ var _ui_favourites__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ui/favourites */ "./src/ui/favourites.ts");
/* harmony import */ var _favourites_actions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./favourites_actions */ "./src/appearance/favourites_actions.ts");





async function saveFavourite() {
    const favourite = await showOutfit();
    if (favourite)
        await (0,_ui_favourites__WEBPACK_IMPORTED_MODULE_3__.loadFakeFavourites)();
    return favourite;
}
async function deleteFavourite(favourite) {
    await _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__["default"].deleteFavouriteOutfit(favourite);
    await (0,_ui_favourites__WEBPACK_IMPORTED_MODULE_3__.loadFakeFavourites)();
}
async function showOutfit() {
    const template = __webpack_require__(/*! ../templates/html/created_outfit_flavr.html */ "./src/templates/html/created_outfit_flavr.html");
    return new Promise(resolve => $.flavr({
        content: template.render({ translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate }),
        onBuild: $container => {
            $container.addClass("new-layout-popup");
            $container.addClass("created-outfit-popup");
            const saveButton = document.querySelector('[rel="btn-save"]');
            if (!saveButton)
                return;
            document
                .querySelector("#choose-name")
                ?.addEventListener("keyup", event => {
                if (event.key === "Enter")
                    saveButton.click();
                if (document.querySelector("#choose-name")?.value)
                    saveButton.classList.remove("disabled");
                else
                    saveButton.classList.add("disabled");
            });
            saveButton.classList.add("nl-button", "nl-button-lg", "disabled");
        },
        buttons: {
            close: {
                text: "",
                style: "close",
                action: () => {
                    resolve(null);
                    return true;
                },
            },
            save: {
                text: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.appearance.favourites.save_outfit.save,
                style: "default",
                action: () => {
                    const name = document.querySelector("#choose-name")?.value;
                    if (!name)
                        return false;
                    const avatar = Sacha.Avatar.avatars["#appearance-preview"];
                    if (!avatar)
                        return false;
                    const items = (0,_outfit__WEBPACK_IMPORTED_MODULE_2__.parseAvatar)(avatar);
                    void saveAction(name, items).then(resolve);
                    return true;
                },
            },
        },
    }));
}
function showFavourite(favourite) {
    const template = __webpack_require__(/*! ../templates/html/favourite_outfit_flavr.html */ "./src/templates/html/favourite_outfit_flavr.html");
    $.flavr({
        content: template.render({ ...favourite, translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate }),
        onBuild: $container => {
            $container.addClass("new-layout-popup");
            $container.addClass("created-outfit-popup");
        },
        buttons: {
            close: {
                text: "",
                style: "close",
                action: () => true,
            },
            delete: {
                text: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.appearance.favourites.click_outfit["delete"],
                style: "default",
                action: () => {
                    void deleteFavourite(favourite);
                    return true;
                },
            },
            wear: {
                text: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.appearance.favourites.click_outfit.wear,
                style: "default",
                action: () => {
                    const avatar = Sacha.Avatar.avatars["#appearance-preview"];
                    if (!avatar)
                        return false;
                    void (async () => (0,_favourites_actions__WEBPACK_IMPORTED_MODULE_4__.wearOutfit)(avatar, favourite.items))();
                    return true;
                },
            },
            rename: {
                text: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.appearance.favourites.rename_outfit.button,
                style: "default",
                action: () => {
                    setTimeout(() => void showRenameFavourite(favourite).then(favourite => {
                        if (favourite)
                            void (0,_ui_favourites__WEBPACK_IMPORTED_MODULE_3__.loadFakeFavourites)();
                    }), 800);
                    return true;
                },
            },
        },
    });
}
async function saveAction(name, items) {
    const blob = await new Promise((resolve, reject) => {
        document
            .querySelector("#appearance-preview canvas")
            ?.toBlob(blob => {
            if (blob)
                resolve(blob);
            else
                reject("Blob doesn't exist.");
        }, "image/png", 1);
    });
    const favourite = await _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__["default"].addFavouriteOutfit({ items, name, blob });
    return { ...favourite, url: URL.createObjectURL(blob) };
}
async function showRenameFavourite(favourite) {
    const template = __webpack_require__(/*! ../templates/html/rename_favourite_outfit_flavr.html */ "./src/templates/html/rename_favourite_outfit_flavr.html");
    const rendered = template.render({
        ...favourite,
        title: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.appearance.favourites.rename_outfit.title(favourite.name),
        translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate,
    });
    return new Promise(resolve => {
        $.flavr({
            content: rendered,
            onBuild: $container => {
                $container.addClass("new-layout-popup");
                $container.addClass("created-outfit-popup");
                const renameButton = document.querySelector('[rel="btn-rename"]');
                if (!renameButton)
                    return;
                document
                    .querySelector("#choose-name")
                    ?.addEventListener("keyup", event => {
                    if (event.key === "Enter")
                        renameButton.click();
                    if (document.querySelector("#choose-name")?.value)
                        renameButton.classList.remove("disabled");
                    else
                        renameButton.classList.add("disabled");
                });
                renameButton.classList.add("nl-button", "nl-button-lg", "disabled");
            },
            buttons: {
                close: {
                    text: "",
                    style: "close",
                    action: () => {
                        resolve(null);
                        return true;
                    },
                },
                rename: {
                    text: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.appearance.favourites.rename_outfit.button,
                    style: "default",
                    action: () => {
                        const name = document.querySelector("#choose-name")?.value;
                        if (!name)
                            return false;
                        void _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__["default"].updateFavouriteOutfit({ ...favourite, name })
                            .then(resolve);
                        return true;
                    },
                },
            },
        });
    });
}


/***/ }),

/***/ "./src/appearance/favourites_actions.ts":
/*!**********************************************!*\
  !*** ./src/appearance/favourites_actions.ts ***!
  \**********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "exportPreview": () => (/* binding */ exportPreview),
/* harmony export */   "importOutfit": () => (/* binding */ importOutfit),
/* harmony export */   "openCategory": () => (/* binding */ openCategory),
/* harmony export */   "openGroup": () => (/* binding */ openGroup),
/* harmony export */   "wearOutfit": () => (/* binding */ wearOutfit)
/* harmony export */ });
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _outfit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../outfit */ "./src/outfit.ts");


function exportPreview() {
    (0,_outfit__WEBPACK_IMPORTED_MODULE_1__.exportOutfit)("#appearance-preview");
}
function importOutfit() {
    const input = document.createElement("input");
    input.setAttribute("type", "file");
    input.setAttribute("accept", "application/json");
    input.click();
    input.addEventListener("input", event => {
        if (!event.target)
            return;
        const files = event.target.files;
        if (!files)
            return;
        const file = files[0];
        if (!file)
            return;
        void file.text().then(async (value) => {
            if (!value)
                return;
            const outfit = JSON.parse(value);
            const avatar = Sacha.Avatar.avatars["#appearance-preview"];
            if (!avatar)
                return;
            await wearOutfit(avatar, outfit);
        });
    });
}
function removeClothes() {
    const avatar = Sacha.Avatar.avatars["#appearance-preview"];
    if (!avatar)
        return;
    for (let i = avatar.children.length - 1; i >= 0; i--) {
        const itemRender = avatar.children[i];
        if (!itemRender)
            continue;
        const item = itemRender.getItem();
        if (Sacha.Avatar.removeItemFromAllAvatars(item)) {
            $(`#appearance-item-${item._id}`).removeClass("selected");
        }
    }
}
async function openGroup(group) {
    return new Promise((resolve) => {
        const groupContainer = document.querySelector(`#appearance-items-group-${group}`);
        if (groupContainer)
            return resolve(groupContainer);
        const avatar = Sacha.Avatar.avatars["#appearance-preview"];
        if (!avatar)
            return resolve(null);
        void $.get(`/player/openGroup/${group}`, { wornItems: avatar.getItemsToSave() }, (view) => {
            $(view).hide().appendTo("#appearance-items");
            resolve(document.querySelector(`#appearance-items-group-${group}`));
        });
    });
}
async function openCategory(category) {
    return new Promise((resolve) => {
        const categoryContainer = document.querySelector(`#appearance-items-category-${category}`);
        if (categoryContainer)
            return resolve(categoryContainer);
        void $.post(`/player/openCategory/${category}`, (view) => {
            $(view).hide().appendTo("#appearance-items");
            resolve(document.querySelector(`#appearance-items-category-${category}`));
        });
    });
}
async function wearOutfit(avatar, outfit) {
    $.flavrNotif(_i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.appearance.favourites.importing);
    // Get all categories
    const categories = new Set();
    for (const clothing of outfit)
        if (!availableItems[clothing.id])
            categories.add(clothing.type);
    // Open all categories
    await Promise.all(Array.from(categories.values()).map(async (category) => openCategory(category)));
    // Get all groups
    const groups = new Set();
    for (const clothing of outfit)
        if (document.querySelector(`[data-group="${clothing.group}"]`) &&
            !availableItems[clothing.id])
            groups.add(clothing.group);
    // Open all groups
    await Promise.all(Array.from(groups.values()).map(async (group) => openGroup(group)));
    // Get the items from `availableItems`
    const wornItems = [];
    for (const clothing of outfit) {
        const item = availableItems[clothing.id];
        if (item)
            wornItems.push(item);
    }
    removeClothes();
    avatar.addItems(wornItems);
    initializeSelectedItems();
    initializeHiddenCategories();
    const avatarActions = document.getElementById("avatar-actions");
    if (avatarActions)
        avatarActions.style.display = "initial";
    $.flavrNotif(_i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.appearance.favourites.imported);
}


/***/ }),

/***/ "./src/appearance/hidden.ts":
/*!**********************************!*\
  !*** ./src/appearance/hidden.ts ***!
  \**********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadHiddenCategory": () => (/* binding */ loadHiddenCategory),
/* harmony export */   "loadHiddenGroup": () => (/* binding */ loadHiddenGroup),
/* harmony export */   "unloadHiddenCategories": () => (/* binding */ unloadHiddenCategories)
/* harmony export */ });
/* harmony import */ var _wardrobe__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wardrobe */ "./src/appearance/wardrobe.ts");

function unloadHiddenCategories() {
    const hidden = document.querySelectorAll("#appearance-items .appearance-items-category:not(.active):not([data-categoryname]), #appearance-items script, body>script");
    for (const div of hidden) {
        div.remove();
    }
}
/**
 * Place the saved groups on the DOM as if it was Eldarya doing it.
 * @returns the associated `AppearanceCategory` if it's found in the wardrobe.
 */
function loadHiddenCategory(code) {
    const category = _wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"].getCategories().find(c => c.category === code);
    if (!category)
        return null;
    const groups = _wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"].getCategoryGroups(category.categoryid);
    const itemTemplate = __webpack_require__(/*! ../templates/html/appearance_item.html */ "./src/templates/html/appearance_item.html");
    const groupTemplate = __webpack_require__(/*! ../templates/html/appearance_items_group.html */ "./src/templates/html/appearance_items_group.html");
    document
        .querySelector("#appearance-items")
        ?.insertAdjacentHTML("beforeend", groups
        .map(group => groupTemplate.render({
        ...group,
        items: _wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"].getItems(group.group)
            .map(item => itemTemplate.render(item))
            .join("\n"),
    }))
        .join("\n"));
    return category;
}
/**
 * Load the saved group on the DOM as if it was Eldarya doing it.
 * @returns the associated `AppearanceGroup` if it's found in the wardrobe.
 */
function loadHiddenGroup(id) {
    const group = _wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"].getGroup(id);
    if (!group)
        return null;
    const itemTemplate = __webpack_require__(/*! ../templates/html/appearance_item.html */ "./src/templates/html/appearance_item.html");
    const groupTemplate = __webpack_require__(/*! ../templates/html/appearance_items_group.html */ "./src/templates/html/appearance_items_group.html");
    document
        .querySelector("#appearance-items")
        ?.insertAdjacentHTML("beforeend", groupTemplate.render({
        ...group,
        items: _wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"].getItems(group.group)
            .map(item => itemTemplate.render(item))
            .join("\n"),
    }));
    return group;
}


/***/ }),

/***/ "./src/appearance/wardrobe.ts":
/*!************************************!*\
  !*** ./src/appearance/wardrobe.ts ***!
  \************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
class Wardrobe {
    categories = {};
    groups = {};
    items = {};
    availableItems;
    getCategories() {
        return Object.values(this.categories);
    }
    getCategory(id) {
        return this.categories[id];
    }
    getCategoryGroups(categoryid) {
        return Object.values(this.groups).filter(group => group.categoryid === categoryid);
    }
    getGroup(id) {
        return this.groups[id];
    }
    getGroups() {
        return Object.values(this.groups);
    }
    getItem(id) {
        return this.items[id];
    }
    getItems(group) {
        return Object.values(this.items).filter(item => item.group === group);
    }
    setCategory(category) {
        this.categories[category.categoryid] = category;
    }
    setGroup(group) {
        this.groups[group.group] = group;
    }
    setItem(item) {
        this.items[item.itemid] = item;
    }
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new Wardrobe());


/***/ }),

/***/ "./src/carousel/carousel_beemoov_annoyances.ts":
/*!*****************************************************!*\
  !*** ./src/carousel/carousel_beemoov_annoyances.ts ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "carouselBeemoovAnnoyances": () => (/* binding */ carouselBeemoovAnnoyances)
/* harmony export */ });
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");

const carouselBeemoovAnnoyances = {
    backgroundImage: "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/carousel_beemoov_annoyances.png",
    h4: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel.beemoov_annoyances.title,
    href: "https://gitlab.com/NatoBoram/Beemoov-Annoyances",
    id: "carousel-beemoov-annoyances",
    p: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel.beemoov_annoyances.subtitle,
};


/***/ }),

/***/ "./src/carousel/carousel_download_face.ts":
/*!************************************************!*\
  !*** ./src/carousel/carousel_download_face.ts ***!
  \************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "carouselDownloadFace": () => (/* binding */ carouselDownloadFace)
/* harmony export */ });
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");

const carouselDownloadFace = {
    backgroundImage: "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/carousel_download_face.png",
    id: "carousel-download-face",
    h4: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel.download_face.title,
    p: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel.download_face.subtitle,
};


/***/ }),

/***/ "./src/carousel/carousel_download_guardian.ts":
/*!****************************************************!*\
  !*** ./src/carousel/carousel_download_guardian.ts ***!
  \****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "carouselDownloadGuardian": () => (/* binding */ carouselDownloadGuardian)
/* harmony export */ });
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");

const carouselDownloadGuardian = {
    backgroundImage: "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/carousel_download_guardian.png",
    id: "carousel-download-guardian",
    h4: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel.download_guardian.title,
    p: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel.download_guardian.subtitle,
};


/***/ }),

/***/ "./src/carousel/carousel_eldarya_enhancements.ts":
/*!*******************************************************!*\
  !*** ./src/carousel/carousel_eldarya_enhancements.ts ***!
  \*******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "carouselEE": () => (/* binding */ carouselEE)
/* harmony export */ });
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");

const carouselEE = {
    backgroundImage: "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/carousel_eldarya_enhancements.png",
    h4: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel.eldarya_enhancements.title,
    href: GM.info.script.namespace,
    id: "carousel-eldarya-enhancements",
    p: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel.eldarya_enhancements.subtitle,
};


/***/ }),

/***/ "./src/carousel/carousel_takeover.ts":
/*!*******************************************!*\
  !*** ./src/carousel/carousel_takeover.ts ***!
  \*******************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "carouselTakeover": () => (/* binding */ carouselTakeover)
/* harmony export */ });
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");

const carouselTakeover = {
    backgroundImage: "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/carousel_takeover.png",
    id: "carousel-takeover",
    h4: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel.takeover.title,
    p: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel.takeover.subtitle,
};


/***/ }),

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

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadCheatCodes": () => (/* binding */ loadCheatCodes)
/* harmony export */ });
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./console */ "./src/console.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./local_storage/local_storage */ "./src/local_storage/local_storage.ts");
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */


function loadCheatCodes() {
    // const cheated = window as unknown as CheatedWindow
    ;
    window.unlockEnhancements = unlockEnhancements;
    window.lockEnhancements = lockEnhancements;
}
async function unlockEnhancements() {
    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.unlocked = true;
    _console__WEBPACK_IMPORTED_MODULE_0__.Console.info("Unlocked enhancements.");
    await reload();
}
async function lockEnhancements() {
    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.unlocked = false;
    _console__WEBPACK_IMPORTED_MODULE_0__.Console.info("Locked enhancements.");
    await reload();
}
async function reload() {
    await new Promise(resolve => setTimeout(resolve, 1000));
    _console__WEBPACK_IMPORTED_MODULE_0__.Console.log("Reloading...");
    await new Promise(resolve => setTimeout(resolve, 1000));
    location.reload();
}


/***/ }),

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

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "Console": () => (/* binding */ Console)
/* harmony export */ });
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./local_storage/local_storage */ "./src/local_storage/local_storage.ts");

class Console {
    static console = console;
    constructor() { }
    static get debugging() {
        return _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.debug;
    }
    static get time() {
        return new Date().toLocaleTimeString();
    }
    static assert(value, message, ...optionalParams) {
        if (!this.debugging)
            return;
        this.console.assert(value, ...this.format(message), ...optionalParams);
    }
    static debug(message, ...optionalParams) {
        if (!this.debugging)
            return;
        this.console.debug(...this.format(message), ...optionalParams);
    }
    static error(message, ...optionalParams) {
        this.console.error(...this.format(message), ...optionalParams);
    }
    static info(message, ...optionalParams) {
        if (!this.debugging)
            return;
        this.console.info(...this.format(message), ...optionalParams);
    }
    static log(message, ...optionalParams) {
        if (!this.debugging)
            return;
        this.console.log(...this.format(message), ...optionalParams);
    }
    static warn(message, ...optionalParams) {
        this.console.warn(...this.format(message), ...optionalParams);
    }
    static format(message) {
        return [
            `%c[%c${this.time}%c]`,
            "color:#9742c2",
            "color:none",
            "color:#9742c2",
            message,
        ];
    }
}


/***/ }),

/***/ "./src/download-canvas.ts":
/*!********************************!*\
  !*** ./src/download-canvas.ts ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "downloadAppearance": () => (/* binding */ downloadAppearance),
/* harmony export */   "downloadFace": () => (/* binding */ downloadFace),
/* harmony export */   "downloadGuardian": () => (/* binding */ downloadGuardian),
/* harmony export */   "downloadProfile": () => (/* binding */ downloadProfile),
/* harmony export */   "getName": () => (/* binding */ getName)
/* harmony export */ });
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./console */ "./src/console.ts");
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./i18n/translate */ "./src/i18n/translate.ts");


function downloadCanvas(canvas, name) {
    canvas.toBlob(blob => {
        if (!blob) {
            _console__WEBPACK_IMPORTED_MODULE_0__.Console.error("Canvas is empty");
            $.flavrNotif(_i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.error.downloadCanvas);
            return;
        }
        const url = URL.createObjectURL(blob);
        const a = document.createElement("a");
        a.setAttribute("href", url);
        a.setAttribute("download", `${name}.png`);
        a.style.display = "none";
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
        URL.revokeObjectURL(url);
    }, "image/png", 1);
}
function downloadFace() {
    const canvas = document.querySelector("#avatar-menu-container canvas");
    if (!canvas) {
        _console__WEBPACK_IMPORTED_MODULE_0__.Console.warn("Couldn't find the guardian's face.");
        return;
    }
    downloadCanvas(canvas, "face");
}
function downloadGuardian() {
    const canvas = document.querySelector("#home-avatar-player canvas");
    if (!canvas) {
        _console__WEBPACK_IMPORTED_MODULE_0__.Console.warn("Couldn't find the guardian.");
        return;
    }
    downloadCanvas(canvas, getName() ?? "guardian");
}
function downloadAppearance() {
    const canvas = document.querySelector("#appearance-preview canvas");
    if (!canvas) {
        _console__WEBPACK_IMPORTED_MODULE_0__.Console.warn("Couldn't find the guardian.");
        return;
    }
    downloadCanvas(canvas, getName() ?? "guardian");
}
function downloadProfile() {
    const canvas = document.querySelector(".playerProfileAvatar canvas");
    const title = document.querySelector("#main-section .section-title");
    if (!canvas || !title)
        return;
    downloadCanvas(canvas, title.textContent?.trim() ?? "guardian");
}
function getName() {
    return (document.querySelector("#avatar-menu-container-outer>p")?.textContent ??
        null);
}


/***/ }),

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

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "Duration": () => (/* binding */ Duration),
/* harmony export */   "DurationUnit": () => (/* binding */ DurationUnit)
/* harmony export */ });
var DurationUnit;
(function (DurationUnit) {
    DurationUnit[DurationUnit["millisecond"] = 1] = "millisecond";
    DurationUnit[DurationUnit["second"] = 1000] = "second";
    DurationUnit[DurationUnit["minute"] = 60000] = "minute";
    DurationUnit[DurationUnit["hour"] = 3600000] = "hour";
    DurationUnit[DurationUnit["day"] = 86400000] = "day";
    DurationUnit[DurationUnit["week"] = 604800000] = "week";
    DurationUnit[DurationUnit["year"] = 31556952000] = "year";
    DurationUnit[DurationUnit["decade"] = 315569520000] = "decade";
    DurationUnit[DurationUnit["century"] = 3155695200000] = "century";
    DurationUnit[DurationUnit["millennium"] = 31556952000000] = "millennium";
    // Geologic time scale
    DurationUnit[DurationUnit["age"] = 315569520000000] = "age";
    DurationUnit[DurationUnit["subepoch"] = 3155695200000000] = "subepoch";
    DurationUnit[DurationUnit["epoch"] = 31556952000000000] = "epoch";
    DurationUnit[DurationUnit["period"] = 315569520000000000] = "period";
    DurationUnit[DurationUnit["era"] = 3155695200000000000] = "era";
    DurationUnit[DurationUnit["eon"] = 31556952000000000000] = "eon";
    // Non sequitur
    DurationUnit[DurationUnit["month"] = 2629746000] = "month";
})(DurationUnit || (DurationUnit = {}));
class Duration {
    value;
    unit;
    constructor(value, unit) {
        this.value = value;
        this.unit = unit;
    }
    divide(duration) {
        return new Duration(this.value / duration.to(this.unit).value, this.unit);
    }
    minus(duration) {
        return new Duration(this.value - duration.to(this.unit).value, this.unit);
    }
    multiply(duration) {
        return new Duration(this.value * duration.to(this.unit).value, this.unit);
    }
    plus(duration) {
        return new Duration(this.value + duration.to(this.unit).value, this.unit);
    }
    to(unit) {
        return new Duration((this.value * this.unit) / unit, unit);
    }
}


/***/ }),

/***/ "./src/eldarya/jquery.ts":
/*!*******************************!*\
  !*** ./src/eldarya/jquery.ts ***!
  \*******************************/
/***/ (() => {

"use strict";



/***/ }),

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

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "trimIcon": () => (/* binding */ trimIcon)
/* harmony export */ });
function trimIcon(icon) {
    const tilde = icon.lastIndexOf("~");
    const dot = icon.lastIndexOf(".");
    if (tilde === -1 || dot === -1)
        return icon;
    return icon.substring(0, tilde) + icon.substring(dot);
}


/***/ }),

/***/ "./src/i18n/en.ts":
/*!************************!*\
  !*** ./src/i18n/en.ts ***!
  \************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "en": () => (/* binding */ en)
/* harmony export */ });
const en = {
    home: {
        forum: "Forum",
        takeover: "Takeover",
    },
    takeover: {
        bought: (name, price) => `Bought <strong>${name}</strong> for <strong class="price-item">${price}</strong> <span class="maana-icon" alt="maanas"></span>.`,
        disabled: "Takeover mode disabled.",
        enabled: "Takeover mode enabled. Please do not interact with this tab.",
    },
    carousel: {
        beemoov_annoyances: {
            title: "Beemoov Annoyances",
            subtitle: "Block some of Eldarya's annoyances.",
        },
        download_face: {
            title: "Download your guardian's face!",
            subtitle: "Click here to download your guardian's face.",
        },
        download_guardian: {
            title: "Download your guardian!",
            subtitle: "Click here to download your guardian.",
        },
        eldarya_enhancements: {
            title: `${GM.info.script.name} v${GM.info.script.version}`,
            subtitle: GM.info.script.description,
        },
        takeover: {
            disable_takeover: "Disable Takeover",
            enable_takeover: "Enable Takeover",
            subtitle: "Give up this tab to perform automated actions.",
            title: "Takeover",
        },
    },
    minigames: {
        played_for: (name, maanas) => `Played <strong>${name}</strong> for <strong class="price-item">${maanas}</strong> <span class="maana-icon" alt="maanas"></span> earned.`,
        played: name => `Played <strong>${name}</strong>.`,
        playing: name => `Playing <strong>${name}</strong>...`,
    },
    appearance: {
        buttons: {
            backward: "Move back",
            forward: "Bring forward",
        },
        favourites: {
            buttons: {
                download: "Download PNG",
                export: "Export",
                import: "Import",
            },
            click_outfit: {
                delete: "Delete",
                goto_account: `To transfer your <strong>${GM.info.script.name}</strong> favourite outfits to another browser, export your settings in the <a href="/user/account" style="text-decoration: underline;">my&nbsp;account</a> page.`,
                saved_locally: `Take note that this outfit is saved in <strong>${GM.info.script.name}</strong>' settings and was not sent to Eldarya's servers.`,
                wear: "Wear",
            },
            imported: "Imported outfit!",
            importing: "Importing outfit. Please wait...",
            rename_outfit: {
                title: (name) => `Rename <strong>${name}</strong>`,
                button: "Rename",
            },
            save_outfit: {
                goto_account: `To transfer your <strong>${GM.info.script.name}</strong> favourite outfits to another browser, export your settings in the <a href="/user/account" style="text-decoration: underline;">my&nbsp;account</a> page.`,
                placeholder: "Name...",
                save: "Save",
                saved_locally: `Take note that this outfit will only be saved within <strong>${GM.info.script.name}</strong>' settings and will not be sent to Eldarya's servers.`,
                title: "Save outfit",
            },
        },
        loaded: "The wardrobe is loaded.",
        loading: (categoryname) => `Loading <strong>${categoryname}</strong>...`,
    },
    market: {
        add_to_wishlist: {
            added_to_wishlist: (name, price) => `Added <strong>${name}</strong> for <strong class="price-item">${price}</strong> <span class="maana-icon" alt="maanas"></span> to the wishlist.`,
            invalid_price: "This is not a valid price.",
            save: "Save",
            text: "How many maanas do you wish to offer to acquire this item?",
            title: "Add to wishlist",
        },
        auctions: {
            buy_now_price: "Buy now price :",
            current_price: "Current price :",
            delete: "Delete",
            purchase_history: "Purchase history",
            sales_history: "Sales history",
            date_time_format: new Intl.DateTimeFormat("en-GB", {
                minute: "2-digit",
                hour: "2-digit",
                day: "numeric",
                month: "long",
                year: "numeric",
            }),
        },
        change_price: {
            changed_price: (name, price) => `Changed <strong>${name}</strong>'s price for <strong class="price-item">${price}</strong> <span class="maana-icon" alt="maanas"></span>.`,
            invalid_price: "This is not a valid price.",
            save: "Save",
            text: "How many maanas do you wish to offer to acquire this item?",
            title: "Change price",
        },
        wishlist: {
            actions: "Actions",
            assistance: `On this page, you can organize your wishlist and check the status of your wished items. Please note that your wishlist is saved locally in <strong>${GM.info.script.name}</strong>' settings and is not sent to Eldarya's servers. To transfer your wishlist to another browser, export your settings in the <a href="/user/account" style="text-decoration: underline;">my&nbsp;account</a> page.`,
            change_price: "Change price",
            delete_tooltip: "Remove from wishlist",
            delete: "Delete",
            icon: "Icon",
            name: "Name",
            price: "Price",
            reset_all: "Reset all statuses",
            reset_tooltip: "Reset the error status",
            reset: "Reset",
            status: "Status",
            title: "Wishlist",
        },
    },
    account: {
        cancel: "Cancel",
        confirm_reset_content: `Are you sure you want to reset your <strong>${GM.info.script.name}</strong> settings? Your free saved favorite outfits, wishlist, exploration and market history, and marked exploration points will be erased. You will also need to re-enable all the desired settings.`,
        confirm_reset_title: "Erase settings",
        confirm: "Reset",
        debug_tooltip: "Enables or disables logging.",
        debug: "Debug",
        delete_explorations: "Delete all exploration points",
        enhancements: "Enhancements",
        explorations_deleted: "Your marked exploration points were deleted.",
        explorations: "Explorations",
        export: "Export settings",
        import: "Import settings",
        imported: "Imported settings!",
        market: "Market",
        minigames: "Minigames",
        reset: "Reset",
    },
    pet: {
        auto_explore: "Highlight",
        date_time_format: new Intl.DateTimeFormat("en-GB", {
            minute: "2-digit",
            hour: "2-digit",
            day: "numeric",
            month: "long",
            year: "numeric",
        }),
        delete_history: "Delete history",
        deleting_markers: "Deleting markers...",
        empty_history: "Your exploration history is empty. It will automatically fill up as your familiar finds items while exploring.",
        goto_account: `To transfer your exploration history to another browser, export your settings from the <em>my&nbsp;account</em> page.`,
        history: "History",
        mark_all: "Mark this region",
        saved_locally: `Please note that your exploration history is saved locally in <strong>${GM.info.script.name}</strong>' settings and was not sent to Eldarya's servers.`,
        unmark_all: "Unmark this region",
    },
    profile: {
        export_outfit: "Export outfit",
        download_outfit: "Download PNG",
    },
    error: {
        downloadCanvas: "There was an error while creating the image.",
        longLoading: "Eldarya is taking too long to load. Retrying in 10 seconds...",
    },
    mall: {
        add_to_wishlist: {
            title: "Add to market wishlist",
            text: "How many maanas do you wish to offer to acquire this item?",
            note: "Please note that the items added from the mall will not necessarily be available at the market.",
        },
    },
};
Object.freeze(en);


/***/ }),

/***/ "./src/i18n/fr.ts":
/*!************************!*\
  !*** ./src/i18n/fr.ts ***!
  \************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "fr": () => (/* binding */ fr)
/* harmony export */ });
const fr = {
    home: {
        forum: "Forum",
        takeover: "Takeover",
    },
    takeover: {
        bought: (name, price) => `Acheté <strong>${name}</strong> pour <strong class="price-item">${price}</strong> <span class="maana-icon" alt="maanas"></span>.`,
        disabled: "Takeover désactivé.",
        enabled: "Takeover activé. Évite d'intéragir avec cet onglet.",
    },
    carousel: {
        beemoov_annoyances: {
            title: "Beemoov Annoyances",
            subtitle: "Bloque certains irritants d'Eldarya.",
        },
        download_face: {
            title: "Télécharge le visage de ta gardienne!",
            subtitle: "Clique ici pour télécharger le visage de ta gardienne.",
        },
        download_guardian: {
            title: "Télécharge ta gardienne!",
            subtitle: "Clique ici pour télécharger ta gardienne.",
        },
        eldarya_enhancements: {
            title: `${GM.info.script.name} v${GM.info.script.version}`,
            subtitle: "Améliore l'expérience utilisateur d'Eldarya.",
        },
        takeover: {
            disable_takeover: "Désactive le takeover",
            enable_takeover: "Active le takeover",
            subtitle: "Laisse cet onglet performer des actions automatiques.",
            title: "Takeover",
        },
    },
    minigames: {
        played_for: (name, maanas) => `A joué à <strong>${name}</strong> pour <strong class="price-item">${maanas}</strong> <span class="maana-icon" alt="maanas"></span> gagnés.`,
        played: (name) => `A joué à <strong>${name}</strong>.`,
        playing: (name) => `Joue à <strong>${name}</strong>...`,
    },
    appearance: {
        buttons: {
            backward: "Vers l'arrière",
            forward: "Vers l'avant",
        },
        favourites: {
            buttons: {
                download: "Télécharger le PNG",
                export: "Exporter",
                import: "Importer",
            },
            click_outfit: {
                delete: "Supprimer",
                goto_account: `Pour transférer tes tenues favorites d'<strong>${GM.info.script.name}</strong> vers un autre navigateur, exporte tes paramètres à partir de la page <a href="/user/account" style="text-decoration: underline;">mon&nbsp;compte</a>.`,
                saved_locally: `Prends note que cette tenue est sauvegardée localement dans les paramètres d'<strong>${GM.info.script.name}</strong> et n'a pas été envoyée aux serveurs d'Eldarya.`,
                wear: "Porter",
            },
            imported: "Importation réussie!",
            importing: "Importation en cours...",
            rename_outfit: {
                button: "Renommer",
                title: (name) => `Renommer <strong>${name}</strong>`,
            },
            save_outfit: {
                goto_account: `Pour transférer tes tenues favorites d'<strong>${GM.info.script.name}</strong> vers un autre navigateur, exporte tes paramètres à partir de la page <a href="/user/account" style="text-decoration: underline;">mon&nbsp;compte</a>.`,
                placeholder: "Nom...",
                save: "Sauvegarder",
                saved_locally: `Prends note que cette tenue sera sauvegardée localement dans les paramètres d'<strong>${GM.info.script.name}</strong> et ne sera pas envoyée aux serveurs d'Eldarya.`,
                title: "Sauvegarder cette tenue",
            },
        },
        loaded: "Le chargement de la garde-robe est terminé.",
        loading: (categoryname) => `Chargement de <strong>${categoryname}</strong>...`,
    },
    market: {
        add_to_wishlist: {
            added_to_wishlist: (name, price) => `Ajouté <strong>${name}</strong> pour <strong class="price-item">${price}</strong> <span class="maana-icon" alt="maanas"></span> à la liste de souhaits.`,
            invalid_price: "Ce prix n'est pas valide.",
            save: "Sauvegarder",
            text: "Combien de maanas souhaites-tu offrir pour acquérir cet item?",
            title: "Ajouter à la liste de souhait",
        },
        auctions: {
            buy_now_price: "Achat immédiat :",
            current_price: "Mise actuelle :",
            delete: "Supprimer",
            purchase_history: "Historique d'achat",
            sales_history: "Historique de vente",
            date_time_format: new Intl.DateTimeFormat("fr-CA", {
                minute: "2-digit",
                hour: "2-digit",
                day: "numeric",
                month: "long",
                year: "numeric",
            }),
        },
        change_price: {
            changed_price: (name, price) => `Changé le prix de <strong>${name}</strong> pour <strong class="price-item">${price}</strong> <span class="maana-icon" alt="maanas"></span>.`,
            invalid_price: "Ce prix n'est pas valide.",
            save: "Sauvegarder",
            text: "Combien de maanas souhaites-tu offrir pour acquérir cet item?",
            title: "Changer le prix",
        },
        wishlist: {
            actions: "Actions",
            assistance: `Sur cette page, tu peux organiser ta liste de souhaits et vérifier le statut de tes articles souhaités. Prends note que ta liste de souhaits est sauvegardée localement dans les paramètres d'<strong>${GM.info.script.name}</strong> et n'est pas envoyée aux serveurs d'Eldarya. Pour transférer ta liste de souhaits vers un autre navigateur, exporte-la à partir de la page <a href="/user/account" style="text-decoration: underline;">mon&nbsp;compte</a>.`,
            change_price: "Changer le prix",
            delete_tooltip: "Retirer de la liste de souhaits",
            delete: "Supprimer",
            icon: "Icône",
            name: "Nom",
            price: "Prix",
            reset_all: "Réinitialiser tout les statuts",
            reset_tooltip: "Réinitialiser l'état d'erreur",
            reset: "Réinitialiser",
            status: "Statut",
            title: "Liste de souhaits",
        },
    },
    account: {
        cancel: "Annuler",
        confirm_reset_content: `Veux-tu vraiment réinitialiser tes paramètres d'<strong>${GM.info.script.name}</strong>? Tes tenues favorites enregistrées gratuitement, ta liste de souhait, ton historique d'exploration et du marché ainsi que tes points d'explorations marqués seront effacés. Tu devras également réactiver tous les paramètres désirés.`,
        confirm_reset_title: "Supprimer les paramètres",
        confirm: "Réinitialiser",
        debug_tooltip: "Active ou désactive la journalisation.",
        debug: "Débogage",
        delete_explorations: "Supprimer tous les points d'exploration",
        enhancements: "Améliorations",
        explorations_deleted: "Tes points d'exploration marqués ont été supprimés.",
        explorations: "Explorations",
        export: "Exporter les paramètres",
        import: "Importer les paramètres",
        imported: "Paramètres importés",
        market: "Marché",
        minigames: "Mini-jeux",
        reset: "Réinitialiser",
    },
    pet: {
        auto_explore: "Marquer",
        date_time_format: new Intl.DateTimeFormat("fr-CA", {
            minute: "2-digit",
            hour: "2-digit",
            day: "numeric",
            month: "long",
            year: "numeric",
        }),
        delete_history: "Nettoyer l'historique",
        deleting_markers: "Suppression des marqueurs...",
        empty_history: "Ton historique d'exploration est vide. Il se remplira automatiquement à mesure que ton familier trouvera des items en exploration.",
        goto_account: "Pour transférer ton historique d'explorations vers un autre navigateur, exporte tes paramètres à partir de la page <em>mon compte</em>.",
        history: "Historique",
        mark_all: "Marquer cette carte",
        saved_locally: `Prends note que ton historique d'explorations est sauvegardé localement dans les paramètres d'<strong>${GM.info.script.name}</strong> et n'a pas été envoyé aux serveurs d'Eldarya.`,
        unmark_all: "Dé-marquer cette carte",
    },
    profile: {
        export_outfit: "Exporter la tenue",
        download_outfit: "Télécharger le PNG",
    },
    error: {
        downloadCanvas: "Une erreur est survenue lors du téléchargement de l'image.",
        longLoading: "Eldarya prend trop de temps à charger. Nouvelle tentative dans 10 secondes...",
    },
    mall: {
        add_to_wishlist: {
            title: "Ajouter à la liste de souhait du marché",
            text: "Combien de maanas souhaites-tu offrir pour acquérir cet item?",
            note: "Prends note que les items ajoutés à partir de la boutique ne seront pas nécessairement disponibles au marché.",
        },
    },
};
Object.freeze(fr);


/***/ }),

/***/ "./src/i18n/translate.ts":
/*!*******************************!*\
  !*** ./src/i18n/translate.ts ***!
  \*******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "translate": () => (/* binding */ translate)
/* harmony export */ });
/* harmony import */ var _en__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./en */ "./src/i18n/en.ts");
/* harmony import */ var _fr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fr */ "./src/i18n/fr.ts");


function translation() {
    if (location.hostname.endsWith(".com.br"))
        return _en__WEBPACK_IMPORTED_MODULE_0__.en;
    if (location.hostname.endsWith(".de"))
        return _en__WEBPACK_IMPORTED_MODULE_0__.en;
    if (location.hostname.endsWith(".es"))
        return _en__WEBPACK_IMPORTED_MODULE_0__.en;
    if (location.hostname.endsWith(".hu"))
        return _en__WEBPACK_IMPORTED_MODULE_0__.en;
    if (location.hostname.endsWith(".it"))
        return _en__WEBPACK_IMPORTED_MODULE_0__.en;
    if (location.hostname.endsWith(".pl"))
        return _en__WEBPACK_IMPORTED_MODULE_0__.en;
    if (location.hostname.endsWith(".ru"))
        return _en__WEBPACK_IMPORTED_MODULE_0__.en;
    if (location.hostname.endsWith(".com"))
        return _en__WEBPACK_IMPORTED_MODULE_0__.en;
    if (location.hostname.endsWith(".fr"))
        return _fr__WEBPACK_IMPORTED_MODULE_1__.fr;
    else
        return _en__WEBPACK_IMPORTED_MODULE_0__.en;
}
const translate = translation();


/***/ }),

/***/ "./src/indexed_db/databases.enum.ts":
/*!******************************************!*\
  !*** ./src/indexed_db/databases.enum.ts ***!
  \******************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "Databases": () => (/* binding */ Databases)
/* harmony export */ });
var Databases;
(function (Databases) {
    Databases["eldarya_enhancements"] = "eldarya_enhancements";
})(Databases || (Databases = {}));


/***/ }),

/***/ "./src/indexed_db/fields.enum.ts":
/*!***************************************!*\
  !*** ./src/indexed_db/fields.enum.ts ***!
  \***************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "Fields": () => (/* binding */ Fields)
/* harmony export */ });
var Fields;
(function (Fields) {
    Fields["blob"] = "blob";
    Fields["id"] = "id";
    Fields["items"] = "items";
    Fields["name"] = "name";
})(Fields || (Fields = {}));


/***/ }),

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

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../console */ "./src/console.ts");
/* harmony import */ var _databases_enum__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./databases.enum */ "./src/indexed_db/databases.enum.ts");
/* harmony import */ var _fields_enum__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fields.enum */ "./src/indexed_db/fields.enum.ts");
/* harmony import */ var _tables_enum__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables.enum */ "./src/indexed_db/tables.enum.ts");




class IndexedDB {
    db;
    version = 1;
    constructor() {
        const request = indexedDB.open(_databases_enum__WEBPACK_IMPORTED_MODULE_1__.Databases.eldarya_enhancements, this.version);
        request.onsuccess = () => (this.db = request.result);
        request.onupgradeneeded = function () {
            const db = this.result;
            const objectStore = db.createObjectStore(_tables_enum__WEBPACK_IMPORTED_MODULE_3__.Tables.favourite_outfits, {
                keyPath: "id",
                autoIncrement: true,
            });
            objectStore.createIndex(_fields_enum__WEBPACK_IMPORTED_MODULE_2__.Fields.blob, "blob", { unique: false });
            objectStore.createIndex(_fields_enum__WEBPACK_IMPORTED_MODULE_2__.Fields.items, "items", { unique: false });
            objectStore.createIndex(_fields_enum__WEBPACK_IMPORTED_MODULE_2__.Fields.name, "name", { unique: false });
        };
        request.onerror = () => _console__WEBPACK_IMPORTED_MODULE_0__.Console.error("Error when opening the indexedDB", request.error);
        request.onblocked = () => _console__WEBPACK_IMPORTED_MODULE_0__.Console.error("Blocked from opening the indexedDB", request.error);
    }
    /** @returns a new `FavouriteOutfit` with the `key` property set. */
    async addFavouriteOutfit(favourite) {
        return new Promise((resolve, reject) => {
            if (!this.db)
                return reject();
            const request = this.db
                .transaction([_tables_enum__WEBPACK_IMPORTED_MODULE_3__.Tables.favourite_outfits], "readwrite")
                .objectStore(_tables_enum__WEBPACK_IMPORTED_MODULE_3__.Tables.favourite_outfits)
                .add(favourite);
            request.onsuccess = () => {
                resolve({
                    ...favourite,
                    url: URL.createObjectURL(favourite.blob),
                    id: Number(request.result),
                });
            };
        });
    }
    async updateFavouriteOutfit(favourite) {
        return new Promise((resolve, reject) => {
            if (!this.db)
                return reject();
            const request = this.db
                .transaction([_tables_enum__WEBPACK_IMPORTED_MODULE_3__.Tables.favourite_outfits], "readwrite")
                .objectStore(_tables_enum__WEBPACK_IMPORTED_MODULE_3__.Tables.favourite_outfits)
                .put(favourite);
            request.onsuccess = () => {
                resolve({
                    ...favourite,
                    id: Number(request.result),
                });
            };
        });
    }
    async clearFavouriteOutfits() {
        return new Promise((resolve, reject) => {
            if (!this.db)
                return reject();
            const request = this.db
                .transaction([_tables_enum__WEBPACK_IMPORTED_MODULE_3__.Tables.favourite_outfits], "readwrite")
                .objectStore(_tables_enum__WEBPACK_IMPORTED_MODULE_3__.Tables.favourite_outfits)
                .clear();
            request.onsuccess = () => resolve();
        });
    }
    async deleteFavouriteOutfit(favourite) {
        return new Promise((resolve, reject) => {
            if (!this.db)
                return reject();
            const request = this.db
                .transaction([_tables_enum__WEBPACK_IMPORTED_MODULE_3__.Tables.favourite_outfits], "readwrite")
                .objectStore(_tables_enum__WEBPACK_IMPORTED_MODULE_3__.Tables.favourite_outfits)
                .delete(favourite.id);
            request.onsuccess = () => {
                resolve();
                if (favourite.url)
                    URL.revokeObjectURL(favourite.url);
            };
        });
    }
    async getFavouriteOutfit(id) {
        return new Promise((resolve, reject) => {
            if (!this.db)
                return reject();
            const request = this.db
                .transaction([_tables_enum__WEBPACK_IMPORTED_MODULE_3__.Tables.favourite_outfits], "readonly")
                .objectStore(_tables_enum__WEBPACK_IMPORTED_MODULE_3__.Tables.favourite_outfits)
                .get(id);
            const favourite = request.result;
            request.onsuccess = () => resolve({ ...favourite, url: URL.createObjectURL(favourite.blob) });
        });
    }
    async getFavouriteOutfits() {
        return new Promise((resolve, reject) => {
            if (!this.db)
                return reject("No database");
            const request = this.db
                .transaction([_tables_enum__WEBPACK_IMPORTED_MODULE_3__.Tables.favourite_outfits], "readonly")
                .objectStore(_tables_enum__WEBPACK_IMPORTED_MODULE_3__.Tables.favourite_outfits)
                .getAll();
            request.onsuccess = () => resolve(request.result.map((favourite) => ({
                ...favourite,
                url: URL.createObjectURL(favourite.blob),
            })));
        });
    }
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new IndexedDB());


/***/ }),

/***/ "./src/indexed_db/tables.enum.ts":
/*!***************************************!*\
  !*** ./src/indexed_db/tables.enum.ts ***!
  \***************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "Tables": () => (/* binding */ Tables)
/* harmony export */ });
var Tables;
(function (Tables) {
    Tables["favourite_outfits"] = "favourite_outfits";
})(Tables || (Tables = {}));


/***/ }),

/***/ "./src/local_storage/local_storage.enum.ts":
/*!*************************************************!*\
  !*** ./src/local_storage/local_storage.enum.ts ***!
  \*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "LocalStorageKey": () => (/* binding */ LocalStorageKey)
/* harmony export */ });
var LocalStorageKey;
(function (LocalStorageKey) {
    LocalStorageKey["autoExploreLocations"] = "autoExploreLocations";
    LocalStorageKey["debug"] = "debug";
    LocalStorageKey["explorationHistory"] = "explorationHistory";
    LocalStorageKey["explorations"] = "explorations";
    LocalStorageKey["market"] = "market";
    LocalStorageKey["meta"] = "meta";
    LocalStorageKey["minigames"] = "minigames";
    LocalStorageKey["purchases"] = "purchases";
    LocalStorageKey["sales"] = "sales";
    LocalStorageKey["unlocked"] = "unlocked";
    LocalStorageKey["version"] = "version";
    LocalStorageKey["wishlist"] = "wishlist";
})(LocalStorageKey || (LocalStorageKey = {}));


/***/ }),

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

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "LocalStorage": () => (/* binding */ LocalStorage)
/* harmony export */ });
/* harmony import */ var blob_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blob-util */ "./node_modules/.pnpm/blob-util@2.0.2/node_modules/blob-util/dist/blob-util.es.js");
/* harmony import */ var _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../indexed_db/indexed_db */ "./src/indexed_db/indexed_db.ts");
/* harmony import */ var _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./local_storage.enum */ "./src/local_storage/local_storage.enum.ts");



class LocalStorage {
    static localStorage = localStorage;
    constructor() { }
    static get autoExploreLocations() {
        return this.getItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.autoExploreLocations, []);
    }
    static set autoExploreLocations(locations) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.autoExploreLocations, locations);
    }
    static get debug() {
        return this.getItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.debug, false);
    }
    static set debug(enabled) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.debug, enabled);
    }
    static get explorationHistory() {
        return this.getItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.explorationHistory, []);
    }
    static set explorationHistory(explorationHistory) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.explorationHistory, explorationHistory);
    }
    static get explorations() {
        return this.getItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.explorations, false);
    }
    static set explorations(enabled) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.explorations, enabled);
    }
    static get market() {
        return this.getItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.market, false);
    }
    static set market(enabled) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.market, enabled);
    }
    static get meta() {
        return this.getItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.meta, null);
    }
    static set meta(meta) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.meta, meta);
    }
    static get minigames() {
        return this.getItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.minigames, false);
    }
    static set minigames(enabled) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.minigames, enabled);
    }
    static get purchases() {
        return this.getItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.purchases, []);
    }
    static set purchases(entry) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.purchases, entry);
    }
    static get sales() {
        return this.getItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.sales, []);
    }
    static set sales(sale) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.sales, sale);
    }
    static get unlocked() {
        return this.getItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.unlocked, false);
    }
    static set unlocked(unlocked) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.unlocked, unlocked);
    }
    static get version() {
        return this.getItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.version, "");
    }
    static set version(version) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.version, version);
    }
    static get wishlist() {
        return this.getItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.wishlist, []);
    }
    static set wishlist(locations) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey.wishlist, locations);
    }
    static async getSettings() {
        return {
            autoExploreLocations: this.autoExploreLocations,
            debug: this.debug,
            explorationHistory: this.explorationHistory,
            explorations: this.explorations,
            favourites: await Promise.all((await _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__["default"].getFavouriteOutfits()).map(async (favourite) => ({
                id: favourite.id,
                name: favourite.name,
                items: favourite.items,
                base64: await (0,blob_util__WEBPACK_IMPORTED_MODULE_0__.blobToBase64String)(favourite.blob),
            }))),
            market: this.market,
            minigames: this.minigames,
            unlocked: this.unlocked,
            version: this.version,
            wishlist: this.wishlist,
        };
    }
    static async setSettings(settings) {
        this.autoExploreLocations = settings.autoExploreLocations;
        this.debug = settings.debug;
        this.explorationHistory = settings.explorationHistory;
        this.explorations = settings.explorations;
        this.market = settings.market;
        this.minigames = settings.minigames;
        this.unlocked = settings.unlocked;
        this.version = settings.version;
        this.wishlist = settings.wishlist;
        await _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__["default"].clearFavouriteOutfits();
        for (const favourite of settings.favourites.map(favourite => ({
            name: favourite.name,
            items: favourite.items,
            blob: (0,blob_util__WEBPACK_IMPORTED_MODULE_0__.base64StringToBlob)(favourite.base64),
        }))) {
            void _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__["default"].addFavouriteOutfit(favourite);
        }
    }
    static async resetSettings() {
        this.autoExploreLocations = [];
        this.debug = false;
        this.explorationHistory = [];
        this.explorations = false;
        this.market = false;
        this.minigames = false;
        this.unlocked = false;
        this.version = "";
        this.wishlist = [];
        await _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__["default"].clearFavouriteOutfits();
    }
    static getItem(key, fallback) {
        return (JSON.parse(this.localStorage.getItem(key) ?? JSON.stringify(fallback)) ?? fallback);
    }
    static setItem(key, value) {
        this.localStorage.setItem(key, JSON.stringify(value));
    }
}


/***/ }),

/***/ "./src/marketplace/enums/body_location.enum.ts":
/*!*****************************************************!*\
  !*** ./src/marketplace/enums/body_location.enum.ts ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "BodyLocation": () => (/* binding */ BodyLocation)
/* harmony export */ });
var BodyLocation;
(function (BodyLocation) {
    BodyLocation["All"] = "";
    BodyLocation[BodyLocation["Underwear"] = 1] = "Underwear";
    BodyLocation[BodyLocation["Skins"] = 2] = "Skins";
    BodyLocation[BodyLocation["Tattoos"] = 20] = "Tattoos";
    BodyLocation[BodyLocation["Mouths"] = 21] = "Mouths";
    BodyLocation[BodyLocation["Eyes"] = 3] = "Eyes";
    BodyLocation[BodyLocation["Hair"] = 4] = "Hair";
    BodyLocation[BodyLocation["Socks"] = 5] = "Socks";
    BodyLocation[BodyLocation["Shoes"] = 6] = "Shoes";
    BodyLocation[BodyLocation["Pants"] = 7] = "Pants";
    BodyLocation[BodyLocation["HandAccessories"] = 8] = "HandAccessories";
    BodyLocation[BodyLocation["Tops"] = 9] = "Tops";
    BodyLocation[BodyLocation["Coats"] = 10] = "Coats";
    BodyLocation[BodyLocation["Gloves"] = 11] = "Gloves";
    BodyLocation[BodyLocation["Necklaces"] = 12] = "Necklaces";
    BodyLocation[BodyLocation["Dresses"] = 13] = "Dresses";
    BodyLocation[BodyLocation["Hats"] = 14] = "Hats";
    BodyLocation[BodyLocation["FaceAccessories"] = 15] = "FaceAccessories";
    BodyLocation[BodyLocation["Funds"] = 16] = "Funds";
    BodyLocation[BodyLocation["Belts"] = 18] = "Belts";
    BodyLocation[BodyLocation["Atmospheres"] = 19] = "Atmospheres";
})(BodyLocation || (BodyLocation = {}));


/***/ }),

/***/ "./src/marketplace/enums/category.enum.ts":
/*!************************************************!*\
  !*** ./src/marketplace/enums/category.enum.ts ***!
  \************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "CategoryNumber": () => (/* binding */ CategoryNumber),
/* harmony export */   "CategoryString": () => (/* binding */ CategoryString)
/* harmony export */ });
var CategoryString;
(function (CategoryString) {
    CategoryString["all"] = "";
    CategoryString["food"] = "food";
    CategoryString["alchemy"] = "alchemy";
    CategoryString["utility"] = "utility";
    CategoryString["tame"] = "tame";
})(CategoryString || (CategoryString = {}));
var CategoryNumber;
(function (CategoryNumber) {
    CategoryNumber["all"] = "";
    CategoryNumber[CategoryNumber["food"] = 1] = "food";
    CategoryNumber["alchemy"] = "Consumable";
    CategoryNumber[CategoryNumber["utility"] = 3] = "utility";
    CategoryNumber[CategoryNumber["tame"] = 4] = "tame";
})(CategoryNumber || (CategoryNumber = {}));


/***/ }),

/***/ "./src/marketplace/enums/guard.enum.ts":
/*!*********************************************!*\
  !*** ./src/marketplace/enums/guard.enum.ts ***!
  \*********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "Guard": () => (/* binding */ Guard)
/* harmony export */ });
var Guard;
(function (Guard) {
    Guard["any"] = "";
    Guard[Guard["light"] = 1] = "light";
    Guard[Guard["obsidian"] = 2] = "obsidian";
    Guard[Guard["absynthe"] = 3] = "absynthe";
    Guard[Guard["shadow"] = 4] = "shadow";
})(Guard || (Guard = {}));


/***/ }),

/***/ "./src/marketplace/enums/rarity.enum.ts":
/*!**********************************************!*\
  !*** ./src/marketplace/enums/rarity.enum.ts ***!
  \**********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "Rarity": () => (/* binding */ Rarity)
/* harmony export */ });
var Rarity;
(function (Rarity) {
    Rarity["all"] = "";
    Rarity["common"] = "common";
    Rarity["rare"] = "rare";
    Rarity["epic"] = "epic";
    Rarity["legendary"] = "legendary";
    Rarity["event"] = "event";
})(Rarity || (Rarity = {}));


/***/ }),

/***/ "./src/marketplace/enums/type.enum.ts":
/*!********************************************!*\
  !*** ./src/marketplace/enums/type.enum.ts ***!
  \********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "Type": () => (/* binding */ Type)
/* harmony export */ });
var Type;
(function (Type) {
    Type["All"] = "";
    Type["Bag"] = "Bag";
    Type["Consumable"] = "Consumable";
    Type["EggItem"] = "EggItem";
    Type["PlayerWearableItem"] = "PlayerWearableItem";
    Type["QuestItem"] = "QuestItem";
})(Type || (Type = {}));


/***/ }),

/***/ "./src/marketplace/marketplace_handlers.ts":
/*!*************************************************!*\
  !*** ./src/marketplace/marketplace_handlers.ts ***!
  \*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "getItemDetails": () => (/* binding */ getItemDetails)
/* harmony export */ });
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../console */ "./src/console.ts");
/* harmony import */ var _eldarya_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../eldarya_util */ "./src/eldarya_util.ts");
/* harmony import */ var _enums_rarity_enum__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./enums/rarity.enum */ "./src/marketplace/enums/rarity.enum.ts");



function getItemDetails(li) {
    const dataset = li.dataset;
    const name = li.querySelector(".abstract-name")?.innerText;
    const abstractType = li.querySelector(".abstract-type")?.innerText;
    const src = li.querySelector(".abstract-icon img")?.src;
    const rarity = _enums_rarity_enum__WEBPACK_IMPORTED_MODULE_2__.Rarity[(li
        .querySelector(".rarity-marker-common, .rarity-marker-rare, .rarity-marker-epic, .rarity-marker-legendary, .rarity-marker-event")
        ?.className.split("rarity-marker-")[1] ?? "")];
    const currentPrice = li.querySelector(".price-item[data-bids]")?.dataset;
    const buyNowPrice = li.querySelector(".price-item:not([data-bids])")?.dataset;
    if (!src || !name) {
        _console__WEBPACK_IMPORTED_MODULE_0__.Console.warn("Incomplete market entry", li);
        return null;
    }
    return {
        ...dataset,
        icon: (0,_eldarya_util__WEBPACK_IMPORTED_MODULE_1__.trimIcon)(src),
        rarity,
        name,
        abstractType,
        buyNowPrice,
        currentPrice,
        date: new Date(),
    };
}


/***/ }),

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

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "migrate": () => (/* binding */ migrate)
/* harmony export */ });
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./local_storage/local_storage */ "./src/local_storage/local_storage.ts");

function migrate() {
    switch (_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.version) {
        case GM.info.script.version:
            return;
        case "":
            installed();
            break;
        default:
            switch (GM.info.script.version) {
                case "1.2.0":
                    v1_2_0();
                    break;
                case "1.2.9":
                    v1_2_9();
                    break;
                case "1.2.10":
                    v1_2_10();
                    break;
                case "1.2.13":
                    v1_2_13();
                    break;
                default:
                    installed();
                    break;
            }
    }
    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.version = GM.info.script.version;
}
function installed() {
    $.flavrNotif(`${name()} ${version()} installed!`);
}
function name() {
    return `<strong>${GM.info.script.name}</strong>`;
}
function version() {
    return `v<strong>${GM.info.script.version}</strong>`;
}
function v1_2_0() {
    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.sales = [];
    $.flavrNotif(`Updated to ${version()}. Your sales history was erased.`);
}
function v1_2_9() {
    $.flavrNotif(`Updated to ${version()}. The wishlist has been improved to sort by category/type/name, but your wished items do not have a type. You can add types by re-adding the items via the market.`);
}
function v1_2_10() {
    $.flavrNotif(`Updated to ${version()}. The wishlist has been improved to sort by category/type/rarity/name, but your wished items do not have a rarity. You can add rarities by re-adding the items via the market.`);
}
function v1_2_13() {
    $.flavrNotif(`Updated to ${version()}. The enhanced dressing experience was disabled.`);
}


/***/ }),

/***/ "./src/minigames/emile.ts":
/*!********************************!*\
  !*** ./src/minigames/emile.ts ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "playFlappy": () => (/* binding */ playFlappy),
/* harmony export */   "playHatchlings": () => (/* binding */ playHatchlings),
/* harmony export */   "playPeggle": () => (/* binding */ playPeggle)
/* harmony export */ });
/* harmony import */ var _eldarya_jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../eldarya/jquery */ "./src/eldarya/jquery.ts");
/* harmony import */ var _eldarya_jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_eldarya_jquery__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _flappy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./flappy */ "./src/minigames/flappy.ts");
/* harmony import */ var _hatchlings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hatchlings */ "./src/minigames/hatchlings.ts");
/* harmony import */ var _peggle__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./peggle */ "./src/minigames/peggle.ts");





async function playPeggle() {
    return play(_peggle__WEBPACK_IMPORTED_MODULE_4__.peggle);
}
async function playFlappy() {
    return play(_flappy__WEBPACK_IMPORTED_MODULE_2__.flappy);
}
async function playHatchlings() {
    return play(_hatchlings__WEBPACK_IMPORTED_MODULE_3__.hatchlings);
}
async function play(minigame) {
    // Disable buttons
    await new Promise(resolve => {
        const interval = setInterval(() => {
            const buttons = document.querySelectorAll(".minigames-rules .flavr-button");
            if (buttons.length) {
                clearInterval(interval);
                for (const button of buttons) {
                    button.classList.add("disabled");
                }
                resolve(true);
            }
        }, 250);
    });
    const json = await execute(minigame);
    const template = __webpack_require__(/*! ../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html");
    $.flavrNotif(template.render({
        ...minigame,
        message: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.minigames.playing(minigame.name),
    }));
    const gameToken = json.data;
    const score = randomInt(minigame.scoreMin, minigame.scoreMax);
    const enc_token = xorEncode(gameToken, score.toString());
    await new Promise(resolve => setTimeout(resolve, randomInt(minigame.delayMin, minigame.delayMax)));
    await getPrizes(minigame, gameToken, score);
    await new Promise(resolve => setTimeout(resolve, randomInt(1000, 3000)));
    await send(enc_token, score, minigame.name.toLowerCase());
    await new Promise(resolve => setTimeout(resolve, randomInt(1000, 3000)));
}
function randomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
}
async function execute(minigame) {
    return new Promise((resolve, reject) => {
        if (typeof Recaptcha !== "undefined") {
            Recaptcha.execute(`minigameStart${minigame.name}`, (token) => void startGame(minigame, token).then(resolve).catch(reject));
        }
        else {
            void startGame(minigame).then(resolve).catch(reject);
        }
    });
}
async function startGame(minigame, recaptchaToken) {
    return new Promise((resolve, reject) => void $.ajax({
        url: "/minigames/ajax_startGame",
        type: "post",
        dataType: "json",
        data: recaptchaToken
            ? {
                game: minigame.name.toLowerCase(),
                recaptchaToken: recaptchaToken,
            }
            : {
                game: minigame.name.toLowerCase(),
            },
        success: (json) => {
            resolve(json);
        },
        error: () => {
            reject();
        },
    }));
}
async function getPrizes(minigame, gameToken, score) {
    return new Promise((resolve) => void $.post("/minigames/ajax_getPrizes", { game: minigame.name.toLowerCase(), score: score }, (json) => {
        resolve(json);
        if (json.result === "success") {
            const template = __webpack_require__(/*! ../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html");
            $.flavrNotif(template.render({
                ...minigame,
                message: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.minigames.played_for(minigame.name, json.data.maana),
            }));
        }
        else
            $.flavrNotif(json.data);
    }, "json").fail(() => setTimeout(() => {
        resolve(getPrizes(minigame, gameToken, score));
    }, randomInt(1000, 3000))));
}
/**
 * Sécurisation de l'envoi du score
 * Basé sur l'encodage XOR : http://en.wikipedia.org/wiki/XOR_cipher
 * Effectue un XOR bit à bit entre une chaine et une clé
 */
function xorEncode(str, key) {
    // Assure que les deux paramètres soient des chaines de caractère
    str = str.toString();
    key = key.toString();
    /** Encodage XOR */
    let xor = "";
    // eslint-disable-next-line @typescript-eslint/prefer-for-of
    for (let i = 0; i < str.length; ++i) {
        let tmp = str[i];
        for (let j = 0; j < key.length; ++j) {
            tmp = String.fromCharCode(tmp.charCodeAt(0) ^ key.charCodeAt(j));
        }
        xor += tmp;
    }
    // Renvoie le résultat en encodant les caractères spéciaux pouvant poser problème (\n par exemple)
    return encodeURIComponent(xor);
}
async function send(enc_token, score, game) {
    return new Promise(resolve => {
        if (typeof Recaptcha !== "undefined") {
            Recaptcha.execute("minigameSave" + game, (recaptchaToken) => void saveScore(enc_token, score, game, recaptchaToken).then(resolve));
        }
        else {
            void saveScore(enc_token, score, game).then(resolve);
        }
    });
}
async function saveScore(enc_token, score, game, recaptchaToken) {
    return new Promise(resolve => {
        const token = decodeURIComponent(enc_token);
        void $.ajax({
            type: "post",
            url: "/minigames/ajax_saveScore",
            data: recaptchaToken
                ? {
                    token: token,
                    score: score,
                    game: game,
                    recaptchaToken: recaptchaToken,
                }
                : {
                    token: token,
                    score: score,
                    game: game,
                },
            success: () => {
                resolve();
            },
            error: () => setTimeout(() => {
                resolve(saveScore(enc_token, score, game));
            }, randomInt(1000, 3000)),
        });
    });
}


/***/ }),

/***/ "./src/minigames/flappy.ts":
/*!*********************************!*\
  !*** ./src/minigames/flappy.ts ***!
  \*********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "flappy": () => (/* binding */ flappy)
/* harmony export */ });
const flappy = {
    name: "Flappy",
    scoreMin: 180,
    scoreMax: 200,
    delayMin: 60_000,
    delayMax: 70_000,
    buttonSelector: '.minigame-start [href="/minigames/bubbltemple"] .nl-button',
    icon: "/static/img/new-layout/minigames/icon_bubbletemple.png",
};


/***/ }),

/***/ "./src/minigames/hatchlings.ts":
/*!*************************************!*\
  !*** ./src/minigames/hatchlings.ts ***!
  \*************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "hatchlings": () => (/* binding */ hatchlings)
/* harmony export */ });
const hatchlings = {
    name: "Hatchlings",
    scoreMin: 18,
    scoreMax: 20,
    delayMin: 30_000,
    delayMax: 30_000,
    buttonSelector: '.minigame-start [href="/minigames/cocooninpick"] .nl-button',
    icon: "/static/img/new-layout/minigames/icon_coconinpick.png",
};


/***/ }),

/***/ "./src/minigames/peggle.ts":
/*!*********************************!*\
  !*** ./src/minigames/peggle.ts ***!
  \*********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "peggle": () => (/* binding */ peggle)
/* harmony export */ });
const peggle = {
    name: "Peggle",
    scoreMin: 9,
    scoreMax: 10,
    delayMin: 10_000,
    delayMax: 20_000,
    buttonSelector: '.minigame-start [href="/minigames/gembomb"] .nl-button',
    icon: "/static/img/new-layout/minigames/icon_gembomb.png",
};


/***/ }),

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

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "exportOutfit": () => (/* binding */ exportOutfit),
/* harmony export */   "parseAvatar": () => (/* binding */ parseAvatar)
/* harmony export */ });
function exportOutfit(selector, name = "outfit") {
    const avatar = Sacha.Avatar.avatars[selector];
    if (!avatar)
        return;
    const outfit = parseAvatar(avatar);
    const href = "data:text/json;charset=utf-8," +
        encodeURIComponent(JSON.stringify(outfit, undefined, 2));
    const a = document.createElement("a");
    a.setAttribute("href", href);
    a.setAttribute("download", `${name}.json`);
    a.click();
}
function parseAvatar(avatar) {
    return avatar.children.map(child => {
        const item = child.getItem();
        return {
            id: item._id,
            group: item._group,
            name: item._name,
            image: item._image,
            type: item._type,
            categoryId: item._categoryId,
            hiddenCategories: Object.values(item._hiddenCategories),
            animationData: item._animationData,
            locked: item._locked,
        };
    });
}


/***/ }),

/***/ "./src/pet/exploration-history.ts":
/*!****************************************!*\
  !*** ./src/pet/exploration-history.ts ***!
  \****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadExplorationHistory": () => (/* binding */ loadExplorationHistory),
/* harmony export */   "onClickPet": () => (/* binding */ onClickPet)
/* harmony export */ });
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../console */ "./src/console.ts");
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");
/* harmony import */ var _exploration_watcher__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./exploration-watcher */ "./src/pet/exploration-watcher.ts");




function loadExplorationHistory() {
    loadHistoryButton();
    (0,_exploration_watcher__WEBPACK_IMPORTED_MODULE_3__.listenTreasureHunt)();
}
function loadHistoryButton() {
    const historyButton = document.createElement("a");
    historyButton.classList.add("nl-button", "nl-button-back");
    historyButton.style.marginRight = "0.6em";
    historyButton.textContent = _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.pet.history;
    historyButton.addEventListener("click", onClickHistory);
    document
        .getElementById("ee-buttons-row")
        ?.insertAdjacentElement("beforeend", historyButton);
}
function onClickHistory() {
    hidePet();
    hideExploration();
    makeHistory();
    showHistory();
}
function onClickPet() {
    hideHistory();
    showPet();
}
function hidePet() {
    const nameContainer = document.getElementById("name-container");
    const infoContainer = document.getElementById("infos-container");
    const petImageContainer = document.getElementById("pet-image-container");
    if (!nameContainer || !infoContainer || !petImageContainer)
        return _console__WEBPACK_IMPORTED_MODULE_0__.Console.error("The pet display was damaged.", {
            nameContainer,
            infoContainer,
            petImageContainer,
        });
    nameContainer.style.display = "none";
    infoContainer.style.display = "none";
    petImageContainer.style.display = "none";
}
function showPet() {
    const nameContainer = document.getElementById("name-container");
    const infoContainer = document.getElementById("infos-container");
    const petImageContainer = document.getElementById("pet-image-container");
    if (!nameContainer || !infoContainer || !petImageContainer)
        return _console__WEBPACK_IMPORTED_MODULE_0__.Console.error("The pet display was damaged.", {
            nameContainer,
            infoContainer,
            petImageContainer,
        });
    nameContainer.style.display = "";
    infoContainer.style.display = "";
    petImageContainer.style.display = "";
}
function showHistory() {
    const history = document.getElementById("history-container");
    if (!history)
        return;
    history.style.display = "";
}
function hideHistory() {
    const history = document.getElementById("history-container");
    if (!history)
        return;
    history.style.display = "none";
}
function hideExploration() {
    document
        .getElementById("main-section")
        ?.classList.remove("treasure-hunt-interface-open");
}
function makeHistory() {
    document.getElementById("history-container")?.remove();
    const template = __webpack_require__(/*! ../templates/html/exploration_history.html */ "./src/templates/html/exploration_history.html");
    document.getElementById("left-container")?.insertAdjacentHTML("beforeend", template.render({
        translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate,
        history: _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.explorationHistory.map(history => ({
            ...history,
            date: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.pet.date_time_format.format(new Date(history.date)),
            web_hd: history.icon && toWebHd(history.icon),
        })),
    }));
    document.getElementById("delete-history")?.addEventListener("click", () => {
        _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.explorationHistory = [];
        makeHistory();
    });
}
function toWebHd(icon) {
    return icon.replace("icon", "web_hd");
}


/***/ }),

/***/ "./src/pet/exploration-watcher.ts":
/*!****************************************!*\
  !*** ./src/pet/exploration-watcher.ts ***!
  \****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "listenTreasureHunt": () => (/* binding */ listenTreasureHunt)
/* harmony export */ });
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../console */ "./src/console.ts");
/* harmony import */ var _eldarya_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../eldarya_util */ "./src/eldarya_util.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");



function listenTreasureHunt() {
    const resultOverlay = document.querySelector("#treasure-hunt-result-overlay");
    if (!resultOverlay)
        return _console__WEBPACK_IMPORTED_MODULE_0__.Console.error("There is no result overlay.", resultOverlay);
    new MutationObserver(() => {
        _console__WEBPACK_IMPORTED_MODULE_0__.Console.log("Mutation in", resultOverlay);
        if (!resultOverlay.classList.contains("active"))
            return;
        const results = getResults();
        if (results.length === 0)
            return;
        _console__WEBPACK_IMPORTED_MODULE_0__.Console.log("Results:", results);
        _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.explorationHistory = [
            ...results,
            ..._local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.explorationHistory,
        ];
    }).observe(resultOverlay, {
        attributeFilter: ["class"],
    });
}
function getResults() {
    const locationName = document
        .querySelector("#th-again strong")
        ?.textContent?.trim();
    const now = new Date();
    return Array.from(document.querySelectorAll(".th-result")).map(result => {
        const img = result.querySelector("img.th-result-img");
        return {
            count: result.querySelector(".resource-count")?.textContent?.trim(),
            date: now,
            icon: img ? (0,_eldarya_util__WEBPACK_IMPORTED_MODULE_1__.trimIcon)(img.src) : undefined,
            locationName,
            name: result.querySelector(".tooltip-content h3")?.textContent?.trim(),
            tradable: Boolean(result.querySelector(".tradable")),
        };
    });
}


/***/ }),

/***/ "./src/pet/exploration.ts":
/*!********************************!*\
  !*** ./src/pet/exploration.ts ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "getRegion": () => (/* binding */ getRegion),
/* harmony export */   "loadMarkers": () => (/* binding */ loadMarkers),
/* harmony export */   "reloadMarkers": () => (/* binding */ reloadMarkers)
/* harmony export */ });
/* harmony import */ var _ajax_change_region__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ajax/change_region */ "./src/ajax/change_region.ts");
/* harmony import */ var _api_result_enum__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/result.enum */ "./src/api/result.enum.ts");
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../console */ "./src/console.ts");
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");





function loadMarkers() {
    const autoExploreLocations = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.autoExploreLocations;
    for (const div of document.querySelectorAll(".map-location[data-id]")) {
        const locationId = Number(div.getAttribute("data-id"));
        if (!locationId)
            continue;
        loadPictoMap(autoExploreLocations, div);
        div.addEventListener("click", () => new MutationObserver((_, observer) => {
            addAutoExploreButton(locationId, observer);
        }).observe(document.getElementById("map-location-preview"), {
            attributes: true,
        }));
    }
}
function reloadMarkers() {
    const autoExploreLocations = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.autoExploreLocations;
    for (const div of document.querySelectorAll(".map-location[data-id]")) {
        const locationId = Number(div.getAttribute("data-id"));
        if (!locationId)
            continue;
        loadPictoMap(autoExploreLocations, div);
    }
}
function addAutoExploreButton(locationId, observer) {
    const buttonsContainer = document.querySelector("#buttons-container");
    if (!buttonsContainer)
        return;
    observer?.disconnect();
    // Parameters to be injected into the template
    const context = {
        locationId,
        active: _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.autoExploreLocations.some(saved => saved.location.id === locationId),
        regionId: Number(document
            .querySelector(".minimap.current[data-mapid]")
            ?.getAttribute("data-mapid")),
    };
    // Add the auto explore button
    buttonsContainer.querySelector("#auto-explore-button")?.remove();
    const autoExploreTemplate = __webpack_require__(/*! ../templates/html/auto_explore_button.html */ "./src/templates/html/auto_explore_button.html");
    buttonsContainer.insertAdjacentHTML("beforeend", autoExploreTemplate.render({ ...context, translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_3__.translate }));
    // Bind `autoExplore` and `loadPictoMaps`
    buttonsContainer
        .querySelector("#auto-explore-button")
        ?.addEventListener("click", () => {
        _console__WEBPACK_IMPORTED_MODULE_2__.Console.debug("Clicked on #auto-explore-button.", context);
        void markLocation(context).then(loadPictoMaps);
    });
    void disableExplore(context);
}
async function disableExplore(context) {
    const entry = await getAutoExploreEntry(context.regionId, context.locationId);
    if (!entry)
        return;
    if (petEnergy < Number(entry.location.energyRequired))
        document.getElementById("explore-button")?.classList.add("disabled");
}
async function markLocation(context) {
    if (context.active) {
        const filteredLocations = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.autoExploreLocations.filter(saved => saved.location.id !== context.locationId);
        _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.autoExploreLocations = filteredLocations;
        addAutoExploreButton(context.locationId);
        return;
    }
    const newAutoExplore = await getAutoExploreEntry(context.regionId, context.locationId);
    if (!newAutoExplore) {
        _console__WEBPACK_IMPORTED_MODULE_2__.Console.error(`Could not generate an auto explore entry for location #${context.locationId}.`, context);
        return;
    }
    const newLocations = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.autoExploreLocations;
    newLocations.push(newAutoExplore);
    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.autoExploreLocations = newLocations;
    addAutoExploreButton(context.locationId);
}
async function getAutoExploreEntry(regionId, locationId) {
    const region = await getRegion(regionId);
    if (!region) {
        _console__WEBPACK_IMPORTED_MODULE_2__.Console.error(`Could not get region #${regionId}.`);
        return null;
    }
    const location = region.locations.find(location => location.id === locationId);
    if (!location) {
        _console__WEBPACK_IMPORTED_MODULE_2__.Console.error(`Could not get location #${locationId} in ${region.name}.`, region);
        return null;
    }
    return {
        location,
        region,
    };
}
async function getRegion(id) {
    if (id.toString() === currentRegion.id)
        return currentRegion;
    const json = await (0,_ajax_change_region__WEBPACK_IMPORTED_MODULE_0__.changeRegion)(id);
    if (json.result === _api_result_enum__WEBPACK_IMPORTED_MODULE_1__.Result.success)
        return json.data.currentRegion;
    return null;
}
function loadPictoMaps() {
    const autoExploreLocations = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.autoExploreLocations;
    for (const div of document.querySelectorAll(".map-location[data-id]")) {
        loadPictoMap(autoExploreLocations, div);
    }
}
function loadPictoMap(autoExploreLocations, div) {
    const mapLocation = div.getAttribute("data-id");
    if (!mapLocation)
        return;
    div.style.backgroundImage = autoExploreLocations.some(saved => saved.location.id === Number(mapLocation))
        ? "url(/static/img/new-layout/pet/icons/picto_map_explo.png)"
        : "url(/static/img/new-layout/pet/icons/picto_map.png)";
}


/***/ }),

/***/ "./src/pet/map_location_dataset.ts":
/*!*****************************************!*\
  !*** ./src/pet/map_location_dataset.ts ***!
  \*****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "getMapLocationDataset": () => (/* binding */ getMapLocationDataset)
/* harmony export */ });
function getMapLocationDataset(div) {
    const dataset = div.dataset;
    return {
        id: Number(dataset.id),
    };
}


/***/ }),

/***/ "./src/pet/mark_context.ts":
/*!*********************************!*\
  !*** ./src/pet/mark_context.ts ***!
  \*********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "markAllContext": () => (/* binding */ markAllContext),
/* harmony export */   "unmarkAllContext": () => (/* binding */ unmarkAllContext)
/* harmony export */ });
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");

const markAllContext = {
    src: "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/picto_map_explo.png",
    textContent: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.pet.mark_all,
};
const unmarkAllContext = {
    src: "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/picto_map.png",
    textContent: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.pet.unmark_all,
};


/***/ }),

/***/ "./src/pet/mass_mark.ts":
/*!******************************!*\
  !*** ./src/pet/mass_mark.ts ***!
  \******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadMassMark": () => (/* binding */ loadMassMark)
/* harmony export */ });
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../console */ "./src/console.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");
/* harmony import */ var _exploration__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./exploration */ "./src/pet/exploration.ts");
/* harmony import */ var _map_location_dataset__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./map_location_dataset */ "./src/pet/map_location_dataset.ts");
/* harmony import */ var _mark_context__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mark_context */ "./src/pet/mark_context.ts");
/* harmony import */ var _minimap_dataset__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./minimap_dataset */ "./src/pet/minimap_dataset.ts");






function loadMassMark() {
    void setupMassMarkButton();
    handleClickMinimaps();
}
async function setupMassMarkButton() {
    document.getElementById("mass-mark")?.remove();
    const marked = hasSomeMarked();
    const template = __webpack_require__(/*! ../templates/html/mass_mark_button.html */ "./src/templates/html/mass_mark_button.html");
    const rendered = template.render(marked ? _mark_context__WEBPACK_IMPORTED_MODULE_4__.unmarkAllContext : _mark_context__WEBPACK_IMPORTED_MODULE_4__.markAllContext);
    document
        .getElementById("ee-buttons-row")
        ?.insertAdjacentHTML("beforeend", rendered);
    const id = getCurrentRegionId();
    if (!id)
        return;
    const region = await (0,_exploration__WEBPACK_IMPORTED_MODULE_2__.getRegion)(id);
    if (!region)
        return;
    const inserted = document.getElementById("mass-mark");
    inserted?.addEventListener("click", () => marked ? void unmarkRegion(region) : void markRegion(region));
}
function handleClickMinimaps() {
    for (const minimap of document.querySelectorAll(".minimap"))
        minimap.addEventListener("click", () => handleClickMinimap(minimap));
}
/** Wait for the minimap to change then reload the mass mark button */
function handleClickMinimap(div) {
    const dataset = (0,_minimap_dataset__WEBPACK_IMPORTED_MODULE_5__.getMinimapDataset)(div);
    const container = document.querySelector("#minimaps-container");
    if (!container)
        return _console__WEBPACK_IMPORTED_MODULE_0__.Console.error("Couldn't get #minimaps-container", container);
    new MutationObserver((mutations, observer) => {
        const found = mutations.find(mutation => mutation.target instanceof HTMLDivElement &&
            mutation.target.classList.contains("minimap") &&
            mutation.target.classList.contains("current") &&
            (0,_minimap_dataset__WEBPACK_IMPORTED_MODULE_5__.getMinimapDataset)(mutation.target).mapid === dataset.mapid);
        if (found) {
            observer.disconnect();
            void setupMassMarkButton();
        }
    }).observe(container, {
        attributes: true,
        subtree: true,
    });
}
function hasSomeMarked() {
    const autoExploreLocations = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.autoExploreLocations;
    return Array.from(document.querySelectorAll("#map-locations-container .map-location")).some(location => {
        const dataset = (0,_map_location_dataset__WEBPACK_IMPORTED_MODULE_3__.getMapLocationDataset)(location);
        return autoExploreLocations.some(autoLocation => dataset.id === autoLocation.location.id);
    });
}
async function markRegion(region) {
    const autoExploreLocations = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.autoExploreLocations;
    autoExploreLocations.push(...region.locations
        .filter(newLocation => !autoExploreLocations.find(autoLocation => autoLocation.location.id === newLocation.id))
        .map(newLocation => ({ location: newLocation, region: region })));
    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.autoExploreLocations = autoExploreLocations;
    await setupMassMarkButton();
    (0,_exploration__WEBPACK_IMPORTED_MODULE_2__.reloadMarkers)();
}
async function unmarkRegion(region) {
    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.autoExploreLocations = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.autoExploreLocations.filter(autoLocation => !region.locations.find(location => location.id === autoLocation.location.id));
    await setupMassMarkButton();
    (0,_exploration__WEBPACK_IMPORTED_MODULE_2__.reloadMarkers)();
}
function getCurrentRegionId() {
    const div = document.querySelector(".minimap.current");
    if (!div)
        return Number(currentRegion.id);
    return Number((0,_minimap_dataset__WEBPACK_IMPORTED_MODULE_5__.getMinimapDataset)(div).mapid);
}


/***/ }),

/***/ "./src/pet/minimap_dataset.ts":
/*!************************************!*\
  !*** ./src/pet/minimap_dataset.ts ***!
  \************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "getMinimapDataset": () => (/* binding */ getMinimapDataset)
/* harmony export */ });
function getMinimapDataset(div) {
    return {
        mapid: Number(div.dataset.mapid),
    };
}


/***/ }),

/***/ "./src/session_storage/session_storage.enum.ts":
/*!*****************************************************!*\
  !*** ./src/session_storage/session_storage.enum.ts ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "SessionStorageKey": () => (/* binding */ SessionStorageKey)
/* harmony export */ });
var SessionStorageKey;
(function (SessionStorageKey) {
    SessionStorageKey["action"] = "action";
    SessionStorageKey["explorationsDone"] = "explorationsDone";
    SessionStorageKey["minigamesDone"] = "minigamesDone";
    SessionStorageKey["selectedLocation"] = "selectedLocation";
    SessionStorageKey["takeover"] = "takeover";
    SessionStorageKey["wishlist"] = "wishlist";
    SessionStorageKey["summerGameDone"] = "summerGameDone";
})(SessionStorageKey || (SessionStorageKey = {}));


/***/ }),

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

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "SessionStorage": () => (/* binding */ SessionStorage)
/* harmony export */ });
/* harmony import */ var _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./session_storage.enum */ "./src/session_storage/session_storage.enum.ts");

class SessionStorage {
    static sessionStorage = sessionStorage;
    constructor() { }
    static get action() {
        return this.getItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.action, null);
    }
    static set action(action) {
        this.setItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.action, action);
    }
    static get explorationsDone() {
        return this.getItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.explorationsDone, false);
    }
    static set explorationsDone(done) {
        this.setItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.explorationsDone, done);
    }
    static get minigamesDone() {
        return this.getItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.minigamesDone, false);
    }
    static set minigamesDone(done) {
        this.setItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.minigamesDone, done);
    }
    static get summerGameDone() {
        return this.getItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.summerGameDone, false);
    }
    static set summerGameDone(done) {
        this.setItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.summerGameDone, done);
    }
    static get selectedLocation() {
        return this.getItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.selectedLocation, null);
    }
    static set selectedLocation(selected) {
        this.setItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.selectedLocation, selected);
    }
    static get takeover() {
        return this.getItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.takeover, false);
    }
    static set takeover(enabled) {
        this.setItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.takeover, enabled);
    }
    static get wishlist() {
        return this.getItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.wishlist, []);
    }
    static set wishlist(wishlist) {
        this.setItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.wishlist, wishlist);
    }
    static getItem(key, fallback) {
        return (JSON.parse(this.sessionStorage.getItem(key) ?? JSON.stringify(fallback)) ?? fallback);
    }
    static setItem(key, value) {
        this.sessionStorage.setItem(key, JSON.stringify(value));
    }
}


/***/ }),

/***/ "./src/session_storage/takeover_action.enum.ts":
/*!*****************************************************!*\
  !*** ./src/session_storage/takeover_action.enum.ts ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "TakeoverAction": () => (/* binding */ TakeoverAction)
/* harmony export */ });
var TakeoverAction;
(function (TakeoverAction) {
    TakeoverAction["daily"] = "daily";
    TakeoverAction["minigames"] = "minigames";
    TakeoverAction["explorations"] = "explorations";
    TakeoverAction["auctions"] = "auctions";
    TakeoverAction["buy"] = "buy";
    // sell,
    TakeoverAction["summerGame"] = "summerGame";
    TakeoverAction["wait"] = "wait";
})(TakeoverAction || (TakeoverAction = {}));


/***/ }),

/***/ "./src/takeover/brain.ts":
/*!*******************************!*\
  !*** ./src/takeover/brain.ts ***!
  \*******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadTakeover": () => (/* binding */ loadTakeover),
/* harmony export */   "resetTakeover": () => (/* binding */ resetTakeover),
/* harmony export */   "toggleTakeover": () => (/* binding */ toggleTakeover)
/* harmony export */ });
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../console */ "./src/console.ts");
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");
/* harmony import */ var _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../session_storage/session_storage */ "./src/session_storage/session_storage.ts");
/* harmony import */ var _ui_top_bar__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/top_bar */ "./src/ui/top_bar.ts");
/* harmony import */ var _classes_buy_action__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./classes/buy_action */ "./src/takeover/classes/buy_action.ts");
/* harmony import */ var _classes_daily_action__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./classes/daily_action */ "./src/takeover/classes/daily_action.ts");
/* harmony import */ var _classes_exploration_action__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./classes/exploration_action */ "./src/takeover/classes/exploration_action.ts");
/* harmony import */ var _classes_minigame_action__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./classes/minigame_action */ "./src/takeover/classes/minigame_action.ts");
/* harmony import */ var _classes_wait_action__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./classes/wait_action */ "./src/takeover/classes/wait_action.ts");










/** Automated entry point of the takeover. */
function loadTakeover() {
    if (_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.takeover && _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.unlocked)
        void takeover();
}
/** Manual entry point of the takeover. */
function toggleTakeover() {
    resetTakeover();
    _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.takeover = !_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.takeover;
    if (!_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.unlocked) {
        _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.takeover = false;
        return;
    }
    (0,_ui_top_bar__WEBPACK_IMPORTED_MODULE_4__.loadTopBar)();
    if (_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.takeover)
        $.flavrNotif(_i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.takeover.enabled);
    else
        $.flavrNotif(_i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.takeover.disabled);
    void takeover();
}
function resetTakeover() {
    _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.action = null;
    _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.explorationsDone = false;
    _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.minigamesDone = false;
    _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.selectedLocation = null;
    _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.summerGameDone = false;
    _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.wishlist = [];
}
async function takeover() {
    if (!_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.takeover)
        return;
    if (_classes_daily_action__WEBPACK_IMPORTED_MODULE_6__["default"].condition())
        await _classes_daily_action__WEBPACK_IMPORTED_MODULE_6__["default"].perform();
    const action = actions.find(action => action.key === _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.action);
    if (action?.condition()) {
        _console__WEBPACK_IMPORTED_MODULE_0__.Console.info("Action:", action.key);
        if (await action.perform())
            return;
    }
    changeAction();
    void takeover();
}
const actions = [
    _classes_exploration_action__WEBPACK_IMPORTED_MODULE_7__["default"],
    _classes_buy_action__WEBPACK_IMPORTED_MODULE_5__["default"],
    _classes_minigame_action__WEBPACK_IMPORTED_MODULE_8__["default"],
    _classes_wait_action__WEBPACK_IMPORTED_MODULE_9__["default"],
];
function changeAction() {
    const next = actions.findIndex(action => action.key === _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.action) + 1;
    return (_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.action =
        actions[next >= actions.length ? 0 : next].key);
}


/***/ }),

/***/ "./src/takeover/classes/action.ts":
/*!****************************************!*\
  !*** ./src/takeover/classes/action.ts ***!
  \****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "Action": () => (/* binding */ Action)
/* harmony export */ });
class Action {
}


/***/ }),

/***/ "./src/takeover/classes/buy_action.ts":
/*!********************************************!*\
  !*** ./src/takeover/classes/buy_action.ts ***!
  \********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _ajax_ajax_search__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../ajax/ajax_search */ "./src/ajax/ajax_search.ts");
/* harmony import */ var _ajax_buy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../ajax/buy */ "./src/ajax/buy.ts");
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../console */ "./src/console.ts");
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../local_storage/local_storage */ "./src/local_storage/local_storage.ts");
/* harmony import */ var _marketplace_marketplace_handlers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../marketplace/marketplace_handlers */ "./src/marketplace/marketplace_handlers.ts");
/* harmony import */ var _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../session_storage/takeover_action.enum */ "./src/session_storage/takeover_action.enum.ts");
/* harmony import */ var _action__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./action */ "./src/takeover/classes/action.ts");








class BuyAction extends _action__WEBPACK_IMPORTED_MODULE_7__.Action {
    key = _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_6__.TakeoverAction.buy;
    get currentMaana() {
        return Number(document.querySelector("#currency-maana")?.dataset
            .maana);
    }
    condition() {
        return _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.market && Boolean(_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.wishlist.length);
    }
    async perform() {
        if (location.pathname !== "/marketplace") {
            pageLoad("/marketplace");
            return true;
        }
        const iconMessage = __webpack_require__(/*! ../../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html");
        for (const wished of _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.wishlist) {
            // Clothes might be a special exception. If they are, then check for
            // `wished.type === Type.PlayerWearableItem`.
            if (wished.error) {
                _console__WEBPACK_IMPORTED_MODULE_2__.Console.warn(`Skipped "${wished.name}"`, wished);
                continue;
            }
            _console__WEBPACK_IMPORTED_MODULE_2__.Console.info(`Searching for "${wished.name}"`, wished);
            /** Search in each pages until the amount of items is less than 8 */
            let amount = 8;
            forpage: for (let page = 1; amount === 8; page++) {
                let results = [];
                try {
                    results = await this.search(wished, page);
                }
                catch (e) {
                    const error = e;
                    _console__WEBPACK_IMPORTED_MODULE_2__.Console.error(`Failed to search for "${wished.name}"`, error);
                    this.setError(wished.icon, `${error.statusText}`);
                    break forpage;
                }
                amount = results.length;
                _console__WEBPACK_IMPORTED_MODULE_2__.Console.log(`Found ${amount} results`, results);
                const wanted = results.filter(result => result.icon === wished.icon &&
                    result.buyNowPrice &&
                    Number(result.buyNowPrice.price) <= wished.price &&
                    Number(result.buyNowPrice.price) <= this.currentMaana);
                for (const result of wanted) {
                    if (!(await this.buy(result)))
                        break forpage;
                    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.purchases = [
                        result,
                        ..._local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.purchases.filter(purchase => purchase.itemid !== result.itemid),
                    ];
                    _console__WEBPACK_IMPORTED_MODULE_2__.Console.info(`Bought "${result.name}" for ${Number(result.buyNowPrice?.price)} maanas.`, result);
                    $.flavrNotif(iconMessage.render({
                        ...result,
                        message: _i18n_translate__WEBPACK_IMPORTED_MODULE_3__.translate.takeover.bought(result.name, Number(result.buyNowPrice?.price)),
                    }));
                }
            }
        }
        return false;
    }
    /**
     * Purchase an item from the market.
     * @returns whether the item was successfully purchased.
     */
    async buy(result) {
        const json = await (0,_ajax_buy__WEBPACK_IMPORTED_MODULE_1__.buy)(Number(result.itemid));
        _console__WEBPACK_IMPORTED_MODULE_2__.Console.error(`Failed to buy "${result.name}"`, result, json);
        if (json.result !== "success")
            this.setError(result.icon, json.data);
        return json.result === "success";
    }
    /** Search for a wished item on a specific page using the item's name. */
    async search(wished, page = 1) {
        // Put the name of the item in the filter
        const filterItemName = document.querySelector("#filter-itemName");
        if (filterItemName)
            filterItemName.value = wished.name;
        // Show the results of the search
        const marketplaceSearchItems = document.querySelector(".marketplace-search-items");
        if (!marketplaceSearchItems)
            return [];
        marketplaceSearchItems.innerHTML = await (0,_ajax_ajax_search__WEBPACK_IMPORTED_MODULE_0__.ajaxSearch)({
            name: wished.name,
            page,
        });
        return Array.from(marketplaceSearchItems.querySelectorAll(".marketplace-search-item"))
            .map(_marketplace_marketplace_handlers__WEBPACK_IMPORTED_MODULE_5__.getItemDetails)
            .filter((item) => item !== null);
    }
    /** Set the `WishedItem.error` property without reordering the wishlist. */
    setError(icon, error) {
        const wishlist = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.wishlist;
        const index = wishlist.findIndex(item => item.icon === icon);
        const entry = wishlist[index];
        if (!entry)
            return;
        entry.error = error;
        _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.wishlist = [
            ...wishlist.slice(undefined, index),
            entry,
            ...wishlist.slice(index + 1, undefined),
        ];
    }
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new BuyAction());


/***/ }),

/***/ "./src/takeover/classes/daily_action.ts":
/*!**********************************************!*\
  !*** ./src/takeover/classes/daily_action.ts ***!
  \**********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../session_storage/takeover_action.enum */ "./src/session_storage/takeover_action.enum.ts");
/* harmony import */ var _brain__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../brain */ "./src/takeover/brain.ts");
/* harmony import */ var _click__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../click */ "./src/takeover/click.ts");



class DailyAction {
    key = _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_0__.TakeoverAction.daily;
    /** Checks if the daily maana gift if there. */
    condition() {
        const dailyGiftContainer = document.getElementById("daily-gift-container");
        return (!!dailyGiftContainer &&
            getComputedStyle(dailyGiftContainer).display !== "none");
    }
    /**
     * Click on the daily maana gift.
     * @returns `false`. This action does not perform meaningful actions on the
     * page.
     */
    async perform() {
        const dailyGiftContainer = document.getElementById("daily-gift-container");
        if (!dailyGiftContainer ||
            getComputedStyle(dailyGiftContainer).display === "none") {
            return false;
        }
        dailyGiftContainer.click();
        await (0,_click__WEBPACK_IMPORTED_MODULE_2__.click)(".first-connexion .flavr-button.default");
        (0,_brain__WEBPACK_IMPORTED_MODULE_1__.resetTakeover)();
        return false;
    }
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new DailyAction());


/***/ }),

/***/ "./src/takeover/classes/exploration_action.ts":
/*!****************************************************!*\
  !*** ./src/takeover/classes/exploration_action.ts ***!
  \****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _ajax_capture_end__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../ajax/capture_end */ "./src/ajax/capture_end.ts");
/* harmony import */ var _ajax_change_region__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../ajax/change_region */ "./src/ajax/change_region.ts");
/* harmony import */ var _ajax_exploration_results__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../ajax/exploration_results */ "./src/ajax/exploration_results.ts");
/* harmony import */ var _api_result_enum__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../api/result.enum */ "./src/api/result.enum.ts");
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../console */ "./src/console.ts");
/* harmony import */ var _duration__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../duration */ "./src/duration.ts");
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../local_storage/local_storage */ "./src/local_storage/local_storage.ts");
/* harmony import */ var _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../session_storage/session_storage */ "./src/session_storage/session_storage.ts");
/* harmony import */ var _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../session_storage/takeover_action.enum */ "./src/session_storage/takeover_action.enum.ts");
/* harmony import */ var _click__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../click */ "./src/takeover/click.ts");
/* harmony import */ var _exploration_status_enum__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../exploration_status.enum */ "./src/takeover/exploration_status.enum.ts");
/* harmony import */ var _action__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./action */ "./src/takeover/classes/action.ts");













class ExplorationAction extends _action__WEBPACK_IMPORTED_MODULE_12__.Action {
    key = _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_9__.TakeoverAction.explorations;
    get globals() {
        return { currentRegion, pendingTreasureHuntLocation, timeLeftExploration };
    }
    condition() {
        return (_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__.LocalStorage.explorations &&
            !_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_8__.SessionStorage.explorationsDone &&
            !!_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__.LocalStorage.autoExploreLocations.length);
    }
    async perform() {
        if (location.pathname !== "/pet") {
            pageLoad("/pet");
            return true;
        }
        await this.openCurrentRegion();
        const status = this.getExplorationStatus();
        _console__WEBPACK_IMPORTED_MODULE_4__.Console.log("Exploration status:", _exploration_status_enum__WEBPACK_IMPORTED_MODULE_11__.ExplorationStatus[status]);
        switch (status) {
            case _exploration_status_enum__WEBPACK_IMPORTED_MODULE_11__.ExplorationStatus.idle:
                if (!(await this.startExploration()).selected)
                    _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_8__.SessionStorage.explorationsDone = true;
                return false;
            case _exploration_status_enum__WEBPACK_IMPORTED_MODULE_11__.ExplorationStatus.pending:
                return (await this.waitExploration()) && this.perform();
            case _exploration_status_enum__WEBPACK_IMPORTED_MODULE_11__.ExplorationStatus.result:
                await this.endExploration();
                return this.perform();
            case _exploration_status_enum__WEBPACK_IMPORTED_MODULE_11__.ExplorationStatus.capture:
                await this.endCapture();
                return this.perform();
            default:
                return false;
        }
    }
    async openCurrentRegion() {
        if (!pendingTreasureHuntLocation)
            return null;
        return (0,_click__WEBPACK_IMPORTED_MODULE_10__.click)(`.minimap[data-mapid="${pendingTreasureHuntLocation.MapRegion_id}"]`);
    }
    async clickExplore() {
        return (0,_click__WEBPACK_IMPORTED_MODULE_10__.click)("#explore-button");
    }
    async clickLocation(selected) {
        return (0,_click__WEBPACK_IMPORTED_MODULE_10__.click)(`.map-location[data-id="${selected.location.id}"]`);
    }
    async clickRegion(selected) {
        const container = document.querySelector("#minimaps-container");
        if (!container) {
            _console__WEBPACK_IMPORTED_MODULE_4__.Console.log("Couldn't find #minimaps-container:", container);
            return null;
        }
        const div = await (0,_click__WEBPACK_IMPORTED_MODULE_10__.waitObserve)(container, `.minimap[data-mapid="${selected.region.id}"]`);
        if (!div) {
            // Clearing invalid regions is useful to remove finished events.
            const template = __webpack_require__(/*! ../../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html");
            $.flavrNotif(template.render({
                icon: "/static/img/new-layout/pet/icons/picto_map.png",
                message: _i18n_translate__WEBPACK_IMPORTED_MODULE_6__.translate.pet.deleting_markers,
            }));
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__.LocalStorage.autoExploreLocations =
                _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__.LocalStorage.autoExploreLocations.filter(saved => saved.region.id !== selected.region.id);
            _console__WEBPACK_IMPORTED_MODULE_4__.Console.warn("Could not find region", selected.region);
            pageLoad("/pet");
            return null;
        }
        _console__WEBPACK_IMPORTED_MODULE_4__.Console.debug("Clicking on region", div);
        await (0,_click__WEBPACK_IMPORTED_MODULE_10__.clickElement)(div);
        return div;
    }
    async clickSeason() {
        return (0,_click__WEBPACK_IMPORTED_MODULE_10__.click)("#crystal-images-container");
    }
    async endCapture() {
        try {
            void new Audio("/static/event/2021/music/sounds/mission-complete.mp3").play();
        }
        catch (e) {
            // eslint-disable-next-line no-empty
        }
        await (0,_click__WEBPACK_IMPORTED_MODULE_10__.click)("#open-capture-interface");
        await (0,_click__WEBPACK_IMPORTED_MODULE_10__.click)("#capture-button");
        await (0,_click__WEBPACK_IMPORTED_MODULE_10__.click)("#close-result");
    }
    async endExploration() {
        return (0,_click__WEBPACK_IMPORTED_MODULE_10__.click)("#close-result");
    }
    getCurrentSeason() {
        const season = Array.from(document.querySelector("body")?.classList ?? [])
            .find(c => c.startsWith("season-"))
            ?.replace("season-", "");
        if (this.isSeason(season))
            return season;
        else
            return null;
    }
    isSeason(season) {
        return ["s1", "s2"].some(s => s === season);
    }
    getExplorationStatus() {
        if (document.querySelector("#treasure-hunt-result-overlay.active #open-capture-interface") ||
            document.querySelector("#capture-interface-outer.active")) {
            return _exploration_status_enum__WEBPACK_IMPORTED_MODULE_11__.ExplorationStatus.capture;
        }
        else if (document.querySelector("#pending-map-location-data-outer.active") ||
            document.querySelector("#map-container.pending")) {
            return _exploration_status_enum__WEBPACK_IMPORTED_MODULE_11__.ExplorationStatus.pending;
        }
        else if (document.querySelector("#treasure-hunt-result-overlay.active"))
            return _exploration_status_enum__WEBPACK_IMPORTED_MODULE_11__.ExplorationStatus.result;
        return _exploration_status_enum__WEBPACK_IMPORTED_MODULE_11__.ExplorationStatus.idle;
    }
    getLowestEnergyLocation() {
        return _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__.LocalStorage.autoExploreLocations.reduce((lowest, place) => Number(place.location.energyRequired) <
            Number(lowest.location.energyRequired)
            ? place
            : lowest);
    }
    getSelectedLocation() {
        let selected = _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_8__.SessionStorage.selectedLocation;
        if (!selected) {
            selected = this.selectLocation();
            _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_8__.SessionStorage.selectedLocation = selected;
        }
        return selected;
    }
    selectLocation() {
        const affordable = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__.LocalStorage.autoExploreLocations.filter(saved => Number(saved.location.energyRequired) <= petEnergy);
        const minimumEnergy = this.getLowestEnergyLocation();
        const notDeadEnd = affordable.filter(place => petEnergy - Number(place.location.energyRequired) >=
            Number(minimumEnergy.location.energyRequired));
        if (notDeadEnd.length)
            return notDeadEnd[Math.floor(Math.random() * notDeadEnd.length)] ?? null;
        const sameEnergy = affordable.filter(place => Number(place.location.energyRequired) === petEnergy);
        if (sameEnergy.length)
            return sameEnergy[Math.floor(Math.random() * sameEnergy.length)] ?? null;
        return affordable[Math.floor(Math.random() * affordable.length)] ?? null;
    }
    async startExploration() {
        const selected = this.getSelectedLocation();
        if (!selected)
            return { exploring: false, selected };
        _console__WEBPACK_IMPORTED_MODULE_4__.Console.info("Exploring", selected);
        // Go to season
        if (selected.region.season &&
            this.getCurrentSeason() !== selected.region.season) {
            await this.clickSeason();
            return { exploring: false, selected };
        }
        // Go to region
        await this.clickRegion(selected);
        // Go to location
        await this.clickLocation(selected);
        await this.clickExplore();
        _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_8__.SessionStorage.selectedLocation = null;
        return { exploring: true, selected };
    }
    /**
     * Wait for up to 10 minutes.
     * @returns whether the exploration is finished.
     */
    async waitExploration(selected) {
        document
            .querySelector(`.minimap[data-mapid="${selected?.region.id ?? currentRegion.id}"]`)
            ?.click();
        let ms = 3 * _duration__WEBPACK_IMPORTED_MODULE_5__.DurationUnit.second;
        if (selected)
            ms += selected.location.timeToExplore * _duration__WEBPACK_IMPORTED_MODULE_5__.DurationUnit.minute;
        else if (timeLeftExploration && timeLeftExploration > 0)
            ms += timeLeftExploration * _duration__WEBPACK_IMPORTED_MODULE_5__.DurationUnit.second;
        else if (!pendingTreasureHuntLocation &&
            document.querySelector("#map-container.pending")) {
            const json = await (0,_ajax_exploration_results__WEBPACK_IMPORTED_MODULE_2__.explorationResults)();
            if (json.result !== _api_result_enum__WEBPACK_IMPORTED_MODULE_3__.Result.success)
                return false;
            const capture = json.data.results.find(result => result.type === "capture");
            if (!capture)
                return false;
            await (0,_ajax_capture_end__WEBPACK_IMPORTED_MODULE_0__.captureEnd)();
            // Reloading is the only possible action if the exploration finished in a
            // different region.
            _console__WEBPACK_IMPORTED_MODULE_4__.Console.error("Reloading because the exploration is in another region.", this.globals);
            await new Promise(resolve => setTimeout(resolve, _duration__WEBPACK_IMPORTED_MODULE_5__.DurationUnit.minute));
            pageLoad("/pet");
            return true;
        }
        if (ms > 10 * _duration__WEBPACK_IMPORTED_MODULE_5__.DurationUnit.minute)
            return false;
        _console__WEBPACK_IMPORTED_MODULE_4__.Console.log(`Waiting for the exploration to end in ${Math.ceil(ms / _duration__WEBPACK_IMPORTED_MODULE_5__.DurationUnit.second)} seconds...`, this.globals);
        await new Promise(resolve => setTimeout(resolve, ms));
        await (0,_ajax_change_region__WEBPACK_IMPORTED_MODULE_1__.changeRegion)(Number(selected?.region.id ?? currentRegion.id));
        if (this.getExplorationStatus() === _exploration_status_enum__WEBPACK_IMPORTED_MODULE_11__.ExplorationStatus.pending &&
            timeLeftExploration &&
            timeLeftExploration < 0) {
            _console__WEBPACK_IMPORTED_MODULE_4__.Console.info("Reloading because the timer is desynchronised.", this.globals);
            await new Promise(resolve => setTimeout(resolve, _duration__WEBPACK_IMPORTED_MODULE_5__.DurationUnit.second));
            pageLoad("/pet");
        }
        return true;
    }
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new ExplorationAction());


/***/ }),

/***/ "./src/takeover/classes/minigame_action.ts":
/*!*************************************************!*\
  !*** ./src/takeover/classes/minigame_action.ts ***!
  \*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../console */ "./src/console.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../local_storage/local_storage */ "./src/local_storage/local_storage.ts");
/* harmony import */ var _minigames_emile__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../minigames/emile */ "./src/minigames/emile.ts");
/* harmony import */ var _minigames_flappy__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../minigames/flappy */ "./src/minigames/flappy.ts");
/* harmony import */ var _minigames_hatchlings__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../minigames/hatchlings */ "./src/minigames/hatchlings.ts");
/* harmony import */ var _minigames_peggle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../minigames/peggle */ "./src/minigames/peggle.ts");
/* harmony import */ var _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../session_storage/session_storage */ "./src/session_storage/session_storage.ts");
/* harmony import */ var _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../session_storage/takeover_action.enum */ "./src/session_storage/takeover_action.enum.ts");








class MinigameAction {
    key = _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_7__.TakeoverAction.minigames;
    condition() {
        return _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.minigames && !_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_6__.SessionStorage.minigamesDone;
    }
    /** Determines if the minigames should be played right now.
     * @returns whether the minigames are currently being played.
     */
    async perform() {
        switch (location.pathname) {
            case "/minigames": {
                await new Promise(resolve => setTimeout(resolve, 750));
                const playing = this.openMinigame(_minigames_peggle__WEBPACK_IMPORTED_MODULE_5__.peggle) ||
                    this.openMinigame(_minigames_flappy__WEBPACK_IMPORTED_MODULE_3__.flappy) ||
                    this.openMinigame(_minigames_hatchlings__WEBPACK_IMPORTED_MODULE_4__.hatchlings);
                if (!playing) {
                    _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_6__.SessionStorage.minigamesDone = true;
                    document
                        .querySelector('.minigames-rules [rel="btn-cancel"]')
                        ?.click();
                }
                return playing;
            }
            case "/minigames/gembomb":
                await (0,_minigames_emile__WEBPACK_IMPORTED_MODULE_2__.playPeggle)();
                break;
            case "/minigames/bubbltemple":
                await (0,_minigames_emile__WEBPACK_IMPORTED_MODULE_2__.playFlappy)();
                break;
            case "/minigames/cocooninpick":
                await (0,_minigames_emile__WEBPACK_IMPORTED_MODULE_2__.playHatchlings)();
                break;
            default:
                pageLoad("/minigames");
                return true;
        }
        pageLoad("/minigames");
        return true;
    }
    /** Click on a minigame's link. @returns whether the minigame was opened. */
    openMinigame(minigame) {
        const start = document.querySelector(minigame.buttonSelector);
        _console__WEBPACK_IMPORTED_MODULE_0__.Console.debug(`${minigame.name}'s button:`, start);
        if (!start)
            return false;
        start.click();
        return true;
    }
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new MinigameAction());


/***/ }),

/***/ "./src/takeover/classes/wait_action.ts":
/*!*********************************************!*\
  !*** ./src/takeover/classes/wait_action.ts ***!
  \*********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../console */ "./src/console.ts");
/* harmony import */ var _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../session_storage/takeover_action.enum */ "./src/session_storage/takeover_action.enum.ts");
/* harmony import */ var _action__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./action */ "./src/takeover/classes/action.ts");



class WaitAction extends _action__WEBPACK_IMPORTED_MODULE_2__.Action {
    key = _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_1__.TakeoverAction.wait;
    condition() {
        return true;
    }
    async perform() {
        _console__WEBPACK_IMPORTED_MODULE_0__.Console.log(`Waiting for 10 minutes...`);
        return new Promise(resolve => setTimeout(() => resolve(false), 10 * 60 * 1000));
    }
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new WaitAction());


/***/ }),

/***/ "./src/takeover/click.ts":
/*!*******************************!*\
  !*** ./src/takeover/click.ts ***!
  \*******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "click": () => (/* binding */ click),
/* harmony export */   "clickElement": () => (/* binding */ clickElement),
/* harmony export */   "wait": () => (/* binding */ wait),
/* harmony export */   "waitObserve": () => (/* binding */ waitObserve)
/* harmony export */ });
/** Click on an element after waiting for its selector, hovering it and waiting
 * for its potential animations.
 */
async function click(selector) {
    return new Promise(resolve => {
        const interval = setInterval(() => {
            const element = document.querySelector(selector);
            if (!element)
                return;
            clearInterval(interval);
            void clickElement(element).then(() => resolve(element));
        }, 800);
    });
}
/** Click on an element after hovering it and waiting for possible
 * animations.
 */
async function clickElement(element) {
    return new Promise(resolve => {
        // Some elements don't have their click handlers ready until they're
        // hovered.
        const mouseEvent = document.createEvent("MouseEvent");
        mouseEvent.initEvent("mouseover");
        element.dispatchEvent(mouseEvent);
        setTimeout(() => {
            element.click();
            resolve();
        }, 800);
    });
}
async function wait(selector) {
    return new Promise(resolve => {
        const interval = setInterval(() => {
            const element = document.querySelector(selector);
            if (!element)
                return;
            clearInterval(interval);
            resolve(element);
        }, 800);
    });
}
/**
 * Uses a `MutationObserver` to wait for an `HTMLElement` inside another
 * `HTMLElement`. Timeouts after 2s by default, at which point there's probably
 * a deeper problem going on.
 * @param container The container to observe and find the `HTMLElement` in
 * @param selector The argument for `container.querySelector<T>(selector)`
 * @returns The first element that is a descendant of `container` that matches
 * `selector` or `null` after the `timeout` delay.
 */
async function waitObserve(container, selector, ms = 2000) {
    const promise = new Promise(resolve => {
        const observer = new MutationObserver((_mutations, observer) => setTimeout(() => {
            const element = container.querySelector(selector);
            if (element) {
                observer.disconnect();
                resolve(element);
            }
        }, 1));
        observer.observe(container, { childList: true });
        setTimeout(() => {
            observer.disconnect();
            resolve(container.querySelector(selector));
        }, ms);
    });
    return promise;
}


/***/ }),

/***/ "./src/takeover/exploration_status.enum.ts":
/*!*************************************************!*\
  !*** ./src/takeover/exploration_status.enum.ts ***!
  \*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "ExplorationStatus": () => (/* binding */ ExplorationStatus)
/* harmony export */ });
var ExplorationStatus;
(function (ExplorationStatus) {
    ExplorationStatus[ExplorationStatus["idle"] = 0] = "idle";
    ExplorationStatus[ExplorationStatus["result"] = 1] = "result";
    ExplorationStatus[ExplorationStatus["capture"] = 2] = "capture";
    ExplorationStatus[ExplorationStatus["pending"] = 3] = "pending";
})(ExplorationStatus || (ExplorationStatus = {}));


/***/ }),

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

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "isEnum": () => (/* binding */ isEnum)
/* harmony export */ });
function isEnum(value, enumeration) {
    return Object.values(enumeration).includes(value);
}


/***/ }),

/***/ "./src/ui/auctions.ts":
/*!****************************!*\
  !*** ./src/ui/auctions.ts ***!
  \****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadAuctions": () => (/* binding */ loadAuctions)
/* harmony export */ });
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");


function loadAuctions() {
    if (location.pathname !== "/marketplace/auctions")
        return;
    const marketplaceActiveAuctions = document.querySelector("#marketplace-active-auctions");
    if (!marketplaceActiveAuctions)
        return;
    const layout2col = document.querySelector(".marketplace-main-container #layout-2col");
    if (layout2col)
        layout2col.style.overflowX = "visible";
    loadHistory(marketplaceActiveAuctions);
}
function loadHistory(marketplaceActiveAuctions) {
    marketplaceActiveAuctions.querySelector("style")?.remove();
    marketplaceActiveAuctions.querySelector("#purchase-history")?.remove();
    marketplaceActiveAuctions.querySelector("#sale-history")?.remove();
    const template = __webpack_require__(/*! ../templates/html/market_history.html */ "./src/templates/html/market_history.html");
    const history = {
        purchases: _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.purchases.map(purchase => ({
            ...purchase,
            date: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.market.auctions.date_time_format.format(new Date(purchase.date)),
        })),
        sales: _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.sales.map(sale => ({
            ...sale,
            date: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.market.auctions.date_time_format.format(new Date(sale.date)),
        })),
    };
    marketplaceActiveAuctions.insertAdjacentHTML("beforeend", template.render({ ...history, translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate }));
    for (const purchase of document.querySelectorAll("#purchase-history .marketplace-auctions-item")) {
        const itemid = purchase.dataset.itemid;
        purchase.querySelector(".delete-button")?.addEventListener("click", () => {
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.purchases = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.purchases.filter(purchase => purchase.itemid !== itemid);
            loadHistory(marketplaceActiveAuctions);
        });
    }
    for (const sale of document.querySelectorAll("#sale-history .marketplace-sales-item")) {
        const icon = sale.querySelector(".abstract-icon img")?.src;
        sale.querySelector(".delete-button")?.addEventListener("click", () => {
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.sales = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.sales.filter(sale => sale.icon !== icon);
            loadHistory(marketplaceActiveAuctions);
        });
    }
}


/***/ }),

/***/ "./src/ui/carousel.ts":
/*!****************************!*\
  !*** ./src/ui/carousel.ts ***!
  \****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadCarousel": () => (/* binding */ loadCarousel)
/* harmony export */ });
/* harmony import */ var _carousel_carousel_beemoov_annoyances__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../carousel/carousel_beemoov_annoyances */ "./src/carousel/carousel_beemoov_annoyances.ts");
/* harmony import */ var _carousel_carousel_download_face__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../carousel/carousel_download_face */ "./src/carousel/carousel_download_face.ts");
/* harmony import */ var _carousel_carousel_download_guardian__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../carousel/carousel_download_guardian */ "./src/carousel/carousel_download_guardian.ts");
/* harmony import */ var _carousel_carousel_eldarya_enhancements__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../carousel/carousel_eldarya_enhancements */ "./src/carousel/carousel_eldarya_enhancements.ts");
/* harmony import */ var _carousel_carousel_takeover__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../carousel/carousel_takeover */ "./src/carousel/carousel_takeover.ts");
/* harmony import */ var _download_canvas__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../download-canvas */ "./src/download-canvas.ts");
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");
/* harmony import */ var _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../session_storage/session_storage */ "./src/session_storage/session_storage.ts");
/* harmony import */ var _takeover_brain__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../takeover/brain */ "./src/takeover/brain.ts");










function loadCarousel() {
    const carouselInner = document.querySelector("#carousel-inner");
    if (!carouselInner || document.querySelector(".carousel-ee")) {
        return;
    }
    // Import carousel template
    const template = __webpack_require__(/*! ../templates/html/carousel_news.html */ "./src/templates/html/carousel_news.html");
    const contexts = [
        // Intro
        _carousel_carousel_eldarya_enhancements__WEBPACK_IMPORTED_MODULE_3__.carouselEE,
        // Features
        ...((_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__.LocalStorage.minigames ||
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__.LocalStorage.explorations ||
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__.LocalStorage.market) &&
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__.LocalStorage.unlocked
            ? [_carousel_carousel_takeover__WEBPACK_IMPORTED_MODULE_4__.carouselTakeover]
            : []),
        _carousel_carousel_download_guardian__WEBPACK_IMPORTED_MODULE_2__.carouselDownloadGuardian,
        _carousel_carousel_download_face__WEBPACK_IMPORTED_MODULE_1__.carouselDownloadFace,
        // Ads
        _carousel_carousel_beemoov_annoyances__WEBPACK_IMPORTED_MODULE_0__.carouselBeemoovAnnoyances,
    ];
    // Add entries to the carousel
    carouselInner.insertAdjacentHTML("beforeend", contexts.map(banner => template.render(banner)).join("\n"));
    // Add links
    for (const carousel of contexts) {
        if (!carousel.href)
            continue;
        const element = carouselInner.querySelector(`#${carousel.id}`);
        if (!element)
            continue;
        element.addEventListener("click", () => {
            if (element.classList.contains("active"))
                open(carousel.href, "_blank");
        });
    }
    // Add click events
    document
        .getElementById(_carousel_carousel_download_face__WEBPACK_IMPORTED_MODULE_1__.carouselDownloadFace.id)
        ?.addEventListener("click", _download_canvas__WEBPACK_IMPORTED_MODULE_5__.downloadFace);
    document
        .getElementById(_carousel_carousel_download_guardian__WEBPACK_IMPORTED_MODULE_2__.carouselDownloadGuardian.id)
        ?.addEventListener("click", _download_canvas__WEBPACK_IMPORTED_MODULE_5__.downloadGuardian);
    const takeoverAnchor = document.getElementById(_carousel_carousel_takeover__WEBPACK_IMPORTED_MODULE_4__.carouselTakeover.id);
    takeoverAnchor?.addEventListener("click", () => {
        (0,_takeover_brain__WEBPACK_IMPORTED_MODULE_9__.toggleTakeover)();
        takeoverTitle(takeoverAnchor);
    });
    if (takeoverAnchor)
        takeoverTitle(takeoverAnchor);
}
function takeoverTitle(takeoverAnchor) {
    const takeoverH4 = takeoverAnchor.querySelector("h4");
    if (takeoverH4) {
        takeoverH4.innerText = _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_8__.SessionStorage.takeover
            ? _i18n_translate__WEBPACK_IMPORTED_MODULE_6__.translate.carousel.takeover.disable_takeover
            : _i18n_translate__WEBPACK_IMPORTED_MODULE_6__.translate.carousel.takeover.enable_takeover;
    }
}


/***/ }),

/***/ "./src/ui/favourites.ts":
/*!******************************!*\
  !*** ./src/ui/favourites.ts ***!
  \******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadFakeFavourites": () => (/* binding */ loadFakeFavourites),
/* harmony export */   "loadFavourites": () => (/* binding */ loadFavourites)
/* harmony export */ });
/* harmony import */ var _appearance_fake_favourites__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../appearance/fake_favourites */ "./src/appearance/fake_favourites.ts");
/* harmony import */ var _appearance_favourites_actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../appearance/favourites_actions */ "./src/appearance/favourites_actions.ts");
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../console */ "./src/console.ts");
/* harmony import */ var _download_canvas__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../download-canvas */ "./src/download-canvas.ts");
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../indexed_db/indexed_db */ "./src/indexed_db/indexed_db.ts");
/* harmony import */ var _takeover_click__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../takeover/click */ "./src/takeover/click.ts");







function loadFavourites() {
    if (!location.pathname.startsWith("/player/appearance/favorites"))
        return;
    loadFavouritesActions();
    void loadFakeFavourites();
}
function loadFavouritesActions() {
    const actions = document.getElementById("favorites-actions");
    if (!actions || document.querySelector(".favorites-action-ee"))
        return;
    const actionTemplate = __webpack_require__(/*! ../templates/html/favourites_action.html */ "./src/templates/html/favourites_action.html");
    const importAction = {
        id: "import-outfit",
        text: _i18n_translate__WEBPACK_IMPORTED_MODULE_4__.translate.appearance.favourites.buttons["import"],
    };
    const exportAction = {
        id: "export-outfit",
        text: _i18n_translate__WEBPACK_IMPORTED_MODULE_4__.translate.appearance.favourites.buttons["export"],
    };
    const downloadAction = {
        id: "download-outfit",
        text: _i18n_translate__WEBPACK_IMPORTED_MODULE_4__.translate.appearance.favourites.buttons.download,
    };
    actions.insertAdjacentHTML("beforeend", actionTemplate.render(importAction) +
        actionTemplate.render(exportAction) +
        actionTemplate.render(downloadAction));
    document
        .getElementById(importAction.id)
        ?.addEventListener("click", _appearance_favourites_actions__WEBPACK_IMPORTED_MODULE_1__.importOutfit);
    document
        .getElementById(exportAction.id)
        ?.addEventListener("click", _appearance_favourites_actions__WEBPACK_IMPORTED_MODULE_1__.exportPreview);
    document
        .getElementById(downloadAction.id)
        ?.addEventListener("click", _download_canvas__WEBPACK_IMPORTED_MODULE_3__.downloadAppearance);
}
async function loadFakeFavourites() {
    const appearanceItems = document.querySelector("#appearance-items");
    if (!appearanceItems) {
        _console__WEBPACK_IMPORTED_MODULE_2__.Console.error("Couldn't access #appearance-items", appearanceItems);
        return;
    }
    const thumbs = await (0,_takeover_click__WEBPACK_IMPORTED_MODULE_6__.waitObserve)(appearanceItems, "#all-outfit-thumbs .mCSB_container", 3000);
    if (!thumbs) {
        _console__WEBPACK_IMPORTED_MODULE_2__.Console.error("Couldn't access #all-outfit-thumbs", thumbs);
        return;
    }
    const template = __webpack_require__(/*! ../templates/html/outfit_thumbs.html */ "./src/templates/html/outfit_thumbs.html");
    const favourites = await _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_5__["default"].getFavouriteOutfits();
    document.querySelector("#ee-outfit-thumbs")?.remove();
    thumbs.insertAdjacentHTML("beforeend", template.render({ outfits: favourites }));
    document
        .querySelector(".ee-available-slot")
        ?.addEventListener("click", () => void (0,_appearance_fake_favourites__WEBPACK_IMPORTED_MODULE_0__.saveFavourite)());
    for (const div of document.querySelectorAll(".ee-outfit-thumb")) {
        div.addEventListener("click", () => {
            const favourite = favourites.find(favourite => favourite.id === Number(div.dataset.arrayIndex));
            if (!favourite)
                return;
            (0,_appearance_fake_favourites__WEBPACK_IMPORTED_MODULE_0__.showFavourite)(favourite);
        });
    }
}


/***/ }),

/***/ "./src/ui/home_content.ts":
/*!********************************!*\
  !*** ./src/ui/home_content.ts ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadHomeContent": () => (/* binding */ loadHomeContent)
/* harmony export */ });
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");

function loadHomeContent() {
    const homeContentSmalls = document.getElementById("home-content-smalls");
    if (!homeContentSmalls ||
        homeContentSmalls.querySelector(".home-content-small-ee"))
        return;
    // Remove bank
    document.getElementById("home-bank")?.remove();
    // Add forum
    const smallTemplate = __webpack_require__(/*! ../templates/html/home_content_small.html */ "./src/templates/html/home_content_small.html");
    const smallContent = {
        backgroundImage: "/assets/img/minigames/treasurehunt/a48bbc4e4849745ebe6dbcf5313eb3f0.jpg",
        h4: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.home.forum,
        href: "/forum",
        id: "forum",
    };
    homeContentSmalls.insertAdjacentHTML("beforeend", smallTemplate.render(smallContent));
}


/***/ }),

/***/ "./src/ui/mall.ts":
/*!************************!*\
  !*** ./src/ui/mall.ts ***!
  \************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "addToWishlistFlavr": () => (/* binding */ addToWishlistFlavr),
/* harmony export */   "loadMall": () => (/* binding */ loadMall)
/* harmony export */ });
/* harmony import */ var _eldarya_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../eldarya_util */ "./src/eldarya_util.ts");
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");
/* harmony import */ var _marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../marketplace/enums/rarity.enum */ "./src/marketplace/enums/rarity.enum.ts");




function loadMall() {
    if (!location.pathname.startsWith("/mall"))
        return;
    for (const li of document.querySelectorAll("[data-product]"))
        li.addEventListener("click", () => addWishlistButton(li));
}
function addWishlistButton(li) {
    document.querySelector("#add-to-wishlist")?.remove();
    document
        .querySelector("#mall-productDetail-info")
        ?.insertAdjacentHTML("beforeend", "<button id='add-to-wishlist' class='nl-button' style='margin: 20px auto 0; min-width: 200px;'>Add to market wishlist</button>");
    const maxQuantity = li.querySelector(".item-maxQuantity");
    const mallEntry = {
        product: JSON.parse(li.dataset.product),
        icon: (0,_eldarya_util__WEBPACK_IMPORTED_MODULE_0__.trimIcon)(li.querySelector("img.mall-product-icon").src),
        rarity: _marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_3__.Rarity[(li
            .querySelector(".rarity-marker-common, .rarity-marker-rare, .rarity-marker-epic, .rarity-marker-legendary, .rarity-marker-event")
            ?.className.split("rarity-marker-")[1] ?? "")],
        maxQuantity: maxQuantity ? Number(maxQuantity.innerText) : undefined,
        abstractType: document.querySelector("#mall-menu .tooltip.active .tooltip-content")?.innerText ?? "",
    };
    document
        .querySelector("#add-to-wishlist")
        ?.addEventListener("click", () => addToWishlistFlavr(mallEntry));
}
function addToWishlistFlavr(mallEntry) {
    const template = __webpack_require__(/*! ../templates/html/auto_buy_flavr_mall.html */ "./src/templates/html/auto_buy_flavr_mall.html");
    $.flavr({
        content: template.render({ translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate }),
        buttons: {
            close: { style: "close" },
            save: {
                action: () => save(mallEntry),
            },
        },
        dialog: "prompt",
        prompt: {
            value: "",
        },
        onBuild: $container => {
            $container.addClass("new-layout-popup");
            document
                .querySelector(".flavr-prompt")
                ?.addEventListener("keyup", ({ key }) => {
                if (key !== "Enter")
                    return;
                save(mallEntry);
            });
        },
    });
}
function save(mallEntry) {
    const price = Number(document.querySelector(".flavr-prompt")?.value.trim());
    if (!price || price <= 0) {
        $.flavrNotif(_i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.market.add_to_wishlist.invalid_price);
        return false;
    }
    const wishlist = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.wishlist.filter(wishlistEntry => wishlistEntry.icon !== mallEntry.icon);
    const wished = {
        ...mallEntry,
        ...mallEntry.product,
        price,
    };
    wishlist.push(wished);
    wishlist.sort((a, b) => {
        const typeCompare = a.type.localeCompare(b.type);
        if (typeCompare !== 0)
            return typeCompare;
        const abstractTypeCompare = (a.abstractType ?? "").localeCompare(b.abstractType ?? "");
        if (abstractTypeCompare !== 0)
            return abstractTypeCompare;
        const rarityCompare = Object.keys(_marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_3__.Rarity).indexOf(a.rarity ?? "") -
            Object.keys(_marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_3__.Rarity).indexOf(b.rarity ?? "");
        if (rarityCompare !== 0)
            return rarityCompare;
        return a.name.localeCompare(b.name);
    });
    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.wishlist = wishlist;
    const template = __webpack_require__(/*! ../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html");
    $.flavrNotif(template.render({
        ...wished,
        message: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.market.add_to_wishlist.added_to_wishlist(wished.name, wished.price),
    }));
    return true;
}


/***/ }),

/***/ "./src/ui/market.ts":
/*!**************************!*\
  !*** ./src/ui/market.ts ***!
  \**************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadMarket": () => (/* binding */ loadMarket)
/* harmony export */ });
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");
/* harmony import */ var _marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../marketplace/enums/rarity.enum */ "./src/marketplace/enums/rarity.enum.ts");
/* harmony import */ var _marketplace_marketplace_handlers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../marketplace/marketplace_handlers */ "./src/marketplace/marketplace_handlers.ts");




let marketObserver;
function loadMarket() {
    marketObserver?.disconnect();
    marketObserver = null;
    if (location.pathname !== "/marketplace")
        return;
    // `.marketplace-search-items` is the container whose HTML content is being
    // replaced on every action.
    const searchItems = document.querySelector(".marketplace-search-items");
    if (!searchItems)
        return;
    marketObserver = new MutationObserver(loadWishlist);
    marketObserver.observe(searchItems, {
        childList: true,
    });
    loadWishlist();
}
function loadWishlist() {
    for (const li of document.querySelectorAll(".marketplace-abstract")) {
        li.addEventListener("click", () => new MutationObserver((_, observer) => {
            const marketEntry = (0,_marketplace_marketplace_handlers__WEBPACK_IMPORTED_MODULE_3__.getItemDetails)(li);
            if (!marketEntry)
                return;
            addWishistButton(marketEntry, observer);
        }).observe(document.getElementById("marketplace-zoom"), {
            childList: true,
        }));
    }
}
function addWishistButton(marketEntry, observer) {
    const buttonsContainer = document.querySelector("#marketplace-itemDetail");
    if (!buttonsContainer)
        return;
    observer?.disconnect();
    hijackBuyButtons(marketEntry);
    document.getElementById("marketplace-itemDetail-info-autobuy")?.remove();
    const buttonTemplate = __webpack_require__(/*! ../templates/html/auto_buy_button.html */ "./src/templates/html/auto_buy_button.html");
    buttonsContainer.insertAdjacentHTML("beforeend", buttonTemplate.render({ translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate }));
    buttonsContainer
        .querySelector("#marketplace-itemDetail-info-autobuy")
        ?.addEventListener("click", () => addToWishlistFlavr(marketEntry));
}
function addToWishlistFlavr(marketEntry) {
    const template = __webpack_require__(/*! ../templates/html/auto_buy_flavr.html */ "./src/templates/html/auto_buy_flavr.html");
    $.flavr({
        content: template.render({ translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate }),
        buttons: {
            close: { style: "close" },
            save: {
                action: () => save(marketEntry),
            },
        },
        dialog: "prompt",
        prompt: {
            value: "",
        },
        onBuild: $container => {
            $container.addClass("new-layout-popup");
            document
                .querySelector(".flavr-prompt")
                ?.addEventListener("keyup", ({ key }) => {
                if (key !== "Enter")
                    return;
                save(marketEntry);
            });
        },
    });
}
function save(marketEntry) {
    const price = Number(document.querySelector(".flavr-prompt")?.value.trim());
    if (!price || price <= 0) {
        $.flavrNotif(_i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.market.add_to_wishlist.invalid_price);
        return false;
    }
    const wishlist = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.wishlist.filter(wishlistEntry => wishlistEntry.icon !== marketEntry.icon);
    const wished = { ...marketEntry, price };
    wishlist.push(wished);
    wishlist.sort((a, b) => {
        const typeCompare = a.type.localeCompare(b.type);
        if (typeCompare !== 0)
            return typeCompare;
        const abstractTypeCompare = (a.abstractType ?? "").localeCompare(b.abstractType ?? "");
        if (abstractTypeCompare !== 0)
            return abstractTypeCompare;
        const rarityCompare = Object.keys(_marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_2__.Rarity).indexOf(a.rarity ?? "") -
            Object.keys(_marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_2__.Rarity).indexOf(b.rarity ?? "");
        if (rarityCompare !== 0)
            return rarityCompare;
        return a.name.localeCompare(b.name);
    });
    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.wishlist = wishlist;
    const template = __webpack_require__(/*! ../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html");
    $.flavrNotif(template.render({
        ...wished,
        message: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.market.add_to_wishlist.added_to_wishlist(wished.name, wished.price),
    }));
    return true;
}
function hijackBuyButtons(marketEntry) {
    document
        .querySelector(".marketplace-itemDetail-buy")
        ?.addEventListener("click", () => {
        addPurchase(marketEntry);
    });
}
function addPurchase(marketEntry) {
    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.purchases = [
        marketEntry,
        ..._local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.purchases.filter(purchase => purchase.itemid !== marketEntry.itemid),
    ];
}


/***/ }),

/***/ "./src/ui/menu.ts":
/*!************************!*\
  !*** ./src/ui/menu.ts ***!
  \************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadMenu": () => (/* binding */ loadMenu)
/* harmony export */ });
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");

function loadMenu() {
    const menuInnerRight = document.getElementById("menu-inner-right");
    if (!menuInnerRight || menuInnerRight.querySelector(".main-menu-ee"))
        return;
    // Remove bank
    menuInnerRight.querySelector(".main-menu-bank")?.remove();
    // Add Forum
    const menuTemplate = __webpack_require__(/*! ../templates/html/main_menu.html */ "./src/templates/html/main_menu.html");
    const mainMenuForum = {
        class: "forum",
        href: "/forum",
        text: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.home.forum,
    };
    menuInnerRight.insertAdjacentHTML("beforeend", menuTemplate.render(mainMenuForum));
}


/***/ }),

/***/ "./src/ui/pet.ts":
/*!***********************!*\
  !*** ./src/ui/pet.ts ***!
  \***********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadPet": () => (/* binding */ loadPet)
/* harmony export */ });
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../console */ "./src/console.ts");
/* harmony import */ var _pet_exploration__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../pet/exploration */ "./src/pet/exploration.ts");
/* harmony import */ var _pet_exploration_history__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../pet/exploration-history */ "./src/pet/exploration-history.ts");
/* harmony import */ var _pet_mass_mark__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../pet/mass_mark */ "./src/pet/mass_mark.ts");




let petObserver;
function loadExplorations() {
    petObserver?.disconnect();
    petObserver = null;
    /** `.page-main-container` changes background depending on the currently selected region. */
    const mainContainer = document.querySelector(".page-main-container");
    if (!mainContainer)
        return;
    petObserver = new MutationObserver(loadExplorations);
    petObserver.observe(mainContainer, {
        attributes: true,
    });
    (0,_pet_exploration__WEBPACK_IMPORTED_MODULE_1__.loadMarkers)();
}
function loadPet() {
    if (location.pathname !== "/pet")
        return;
    extendRightContainer();
    createButtonRow();
    loadExplorations();
    (0,_pet_exploration_history__WEBPACK_IMPORTED_MODULE_2__.loadExplorationHistory)();
    (0,_pet_mass_mark__WEBPACK_IMPORTED_MODULE_3__.loadMassMark)();
}
function createButtonRow() {
    const closeExplorationButton = document.querySelector("#close-treasure-hunt-interface");
    if (!closeExplorationButton)
        return _console__WEBPACK_IMPORTED_MODULE_0__.Console.error("Couldn't find #close-treasure-hunt-interface.");
    closeExplorationButton.style.display = "inline-block";
    closeExplorationButton.style.marginRight = "0.6em";
    closeExplorationButton.style.position = "relative";
    closeExplorationButton.style.right = "0";
    closeExplorationButton.style.top = "0";
    closeExplorationButton.addEventListener("click", _pet_exploration_history__WEBPACK_IMPORTED_MODULE_2__.onClickPet);
    const row = document.createElement("div");
    row.id = "ee-buttons-row";
    row.insertAdjacentElement("beforeend", closeExplorationButton);
    document
        .querySelector("#right-container-inner")
        ?.insertAdjacentElement("afterbegin", row);
}
function extendRightContainer() {
    const rightContainer = document.getElementById("right-container");
    if (!rightContainer)
        return _console__WEBPACK_IMPORTED_MODULE_0__.Console.warn("Couldn't find #right-container", rightContainer);
    rightContainer.style.height = "40em";
}


/***/ }),

/***/ "./src/ui/profile.ts":
/*!***************************!*\
  !*** ./src/ui/profile.ts ***!
  \***************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadProfile": () => (/* binding */ loadProfile)
/* harmony export */ });
/* harmony import */ var _download_canvas__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../download-canvas */ "./src/download-canvas.ts");
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _outfit__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../outfit */ "./src/outfit.ts");



function loadProfile() {
    const profileContactActions = document.getElementById("profile-contact-actions");
    if (!profileContactActions ||
        document.querySelector(".profile-contact-action-ee")) {
        return;
    }
    const template = __webpack_require__(/*! ../templates/html/profile_contact_action.html */ "./src/templates/html/profile_contact_action.html");
    const profileActionExport = {
        id: "profile-contact-action-export",
        actionDescription: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.profile.export_outfit,
    };
    const profileActionDownload = {
        id: "profile-contact-action-download",
        actionDescription: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.profile.download_outfit,
    };
    // Add entries
    profileContactActions.insertAdjacentHTML("beforeend", template.render(profileActionExport));
    profileContactActions.insertAdjacentHTML("beforeend", template.render(profileActionDownload));
    // Add click events
    document
        .getElementById(profileActionExport.id)
        ?.addEventListener("click", exportProfile);
    document
        .getElementById(profileActionDownload.id)
        ?.addEventListener("click", _download_canvas__WEBPACK_IMPORTED_MODULE_0__.downloadProfile);
}
function exportProfile() {
    const title = document.querySelector("#main-section .section-title");
    const keys = Object.keys(Sacha.Avatar.avatars).filter(key => key.startsWith("#playerProfileAvatar"));
    for (const key of keys) {
        (0,_outfit__WEBPACK_IMPORTED_MODULE_2__.exportOutfit)(key, title?.textContent?.trim());
    }
}


/***/ }),

/***/ "./src/ui/purro_shop.ts":
/*!******************************!*\
  !*** ./src/ui/purro_shop.ts ***!
  \******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadPurroShop": () => (/* binding */ loadPurroShop)
/* harmony export */ });
/* harmony import */ var _api_meta__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api/meta */ "./src/api/meta.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");


/** Shows a Purro'Shop button in the main menu when it's available. */
function loadPurroShop() {
    document.querySelector(".main-menu-purroshop")?.remove();
    // A bug in WebPack prevents using `LocalStorage.meta?.purroshop.status`.
    if (_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.meta === null ||
        _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.meta.purroshop.status !== _api_meta__WEBPACK_IMPORTED_MODULE_0__.PurroshopStatus.enabled)
        return;
    const template = __webpack_require__(/*! ../templates/html/main_menu_purroshop.html */ "./src/templates/html/main_menu_purroshop.html");
    document
        .getElementById("menu-inner-left")
        ?.insertAdjacentHTML("afterbegin", template.render({}));
}


/***/ }),

/***/ "./src/ui/settings.ts":
/*!****************************!*\
  !*** ./src/ui/settings.ts ***!
  \****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadSettings": () => (/* binding */ loadSettings)
/* harmony export */ });
/* harmony import */ var _download_canvas__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../download-canvas */ "./src/download-canvas.ts");
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");



/** Creates the UI for the settings in the account page. */
function loadSettings() {
    const accountRight = document.querySelector("#account-right div");
    if (!accountRight || accountRight.querySelector(".account-ee-bloc"))
        return;
    const settings = {
        debug: _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.debug,
        explorations: _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.explorations,
        market: _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.market,
        minigames: _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.minigames,
        unlocked: _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.unlocked,
    };
    const settingsTemplate = __webpack_require__(/*! ../templates/html/settings.html */ "./src/templates/html/settings.html");
    const rendered = settingsTemplate.render({ ...settings, translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate });
    accountRight.insertAdjacentHTML("beforeend", rendered);
    document.getElementById("ee-debug-enabled")?.addEventListener("click", () => {
        _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.debug = !_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.debug;
        reloadSettings();
    });
    if (_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.unlocked) {
        document
            .getElementById("ee-minigames-enabled")
            ?.addEventListener("click", () => {
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.minigames = !_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.minigames;
            reloadSettings();
        });
        document
            .getElementById("ee-explorations-enabled")
            ?.addEventListener("click", () => {
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.explorations = !_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.explorations;
            reloadSettings();
        });
        document
            .getElementById("ee-market-enabled")
            ?.addEventListener("click", () => {
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.market = !_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.market;
            reloadSettings();
        });
        document
            .getElementById("ee-delete-explorations")
            ?.addEventListener("click", () => {
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.autoExploreLocations = [];
            const template = __webpack_require__(/*! ../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html");
            const rendered = template.render({
                icon: "/static/img/new-layout/pet/icons/picto_map.png",
                message: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.account.explorations_deleted,
            });
            $.flavrNotif(rendered);
        });
    }
    document
        .getElementById("ee-import")
        ?.addEventListener("click", importSettings);
    document
        .getElementById("ee-export")
        ?.addEventListener("click", () => void exportSettings());
    document
        .getElementById("ee-reset")
        ?.addEventListener("click", confirmResetSettings);
}
function reloadSettings() {
    document.querySelector(".account-ee-bloc")?.remove();
    loadSettings();
}
function importSettings() {
    const input = document.createElement("input");
    input.setAttribute("type", "file");
    input.setAttribute("accept", "application/json");
    input.click();
    input.addEventListener("input", event => {
        if (!event.target)
            return;
        const files = event.target.files;
        if (!files)
            return;
        const file = files[0];
        if (!file)
            return;
        void file.text().then(async (value) => {
            if (!value)
                return;
            const parsed = JSON.parse(value);
            await _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.setSettings(parsed);
            reloadSettings();
            $.flavrNotif(_i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.account.imported);
        });
    });
}
async function exportSettings() {
    const href = "data:text/json;charset=utf-8," +
        encodeURIComponent(JSON.stringify(await _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.getSettings(), null, 2));
    const a = document.createElement("a");
    a.setAttribute("href", href);
    a.setAttribute("download", `${(0,_download_canvas__WEBPACK_IMPORTED_MODULE_0__.getName)() ?? "eldarya-enhancements"}-settings.json`);
    a.click();
}
function confirmResetSettings() {
    const template = __webpack_require__(/*! ../templates/html/confirm_reset_settings.html */ "./src/templates/html/confirm_reset_settings.html");
    const rendered = template.render({ translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate });
    $.flavr({
        content: rendered,
        dialog: "confirm",
        buttons: {
            close: { style: "close" },
            cancel: {
                text: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.account.cancel,
                action: () => true,
            },
            confirm: {
                text: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.account.confirm,
                action: () => {
                    void resetSettings();
                    return true;
                },
            },
        },
        onBuild: $container => {
            $container.addClass("new-layout-popup vacation");
        },
    });
}
async function resetSettings() {
    await _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.resetSettings();
    pageLoad(location.pathname);
}


/***/ }),

/***/ "./src/ui/top_bar.ts":
/*!***************************!*\
  !*** ./src/ui/top_bar.ts ***!
  \***************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadTopBar": () => (/* binding */ loadTopBar)
/* harmony export */ });
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");
/* harmony import */ var _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../session_storage/session_storage */ "./src/session_storage/session_storage.ts");
/* harmony import */ var _takeover_brain__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../takeover/brain */ "./src/takeover/brain.ts");




function loadTopBar() {
    const headerRight = document.getElementById("header-right");
    if (!headerRight)
        return;
    const headerTakeover = headerRight.querySelector("#header-takeover");
    if (headerTakeover)
        headerTakeover.remove();
    else
        loadLinks();
    if ((_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.minigames ||
        _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.explorations ||
        _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.market) &&
        _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.unlocked) {
        const template = __webpack_require__(/*! ../templates/html/header_takeover.html */ "./src/templates/html/header_takeover.html");
        headerRight.insertAdjacentHTML("afterbegin", template.render({ takeover: _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_2__.SessionStorage.takeover, translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate }));
        headerRight
            .querySelector("#header-takeover")
            ?.addEventListener("click", _takeover_brain__WEBPACK_IMPORTED_MODULE_3__.toggleTakeover);
    }
}
function loadLinks() {
    const headerProfile = document.getElementById("header-profile")?.firstChild;
    if (headerProfile?.textContent) {
        const a = document.createElement("a");
        a.href = "/player/profile";
        a.style.color = "var(--text-color)";
        a.style.fontFamily = '"Alegreya Sans", sans-serif';
        a.style.fontWeight = "unset";
        a.textContent = headerProfile.textContent.trim();
        const p = document.createElement("p");
        p.insertAdjacentElement("beforeend", a);
        headerProfile.replaceWith(p);
    }
    const avatarTitle = document.querySelector("#avatar-menu-container-outer>p");
    if (avatarTitle?.textContent)
        avatarTitle.innerHTML = `<a href="/player/profile" style="color: #FFFFFF; font-size: 23px; font-weight: 900; text-transform: uppercase;">${avatarTitle.textContent.trim()}</a>`;
    document
        .querySelector("#avatar-menu-container>canvas")
        ?.addEventListener("click", () => pageLoad("/player/appearance"));
}


/***/ }),

/***/ "./src/ui/wishlist.ts":
/*!****************************!*\
  !*** ./src/ui/wishlist.ts ***!
  \****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadWishlist": () => (/* binding */ loadWishlist)
/* harmony export */ });
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../console */ "./src/console.ts");
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");



function loadWishlist() {
    const marketplaceMenu = document.getElementById("marketplace-menu");
    if (!marketplaceMenu)
        return;
    if (!marketplaceMenu.querySelector("#wishlist-button")) {
        for (const a of marketplaceMenu.querySelectorAll("a")) {
            a.addEventListener("click", () => pageLoad(a.href, undefined, undefined, undefined, true));
        }
    }
    marketplaceMenu.querySelector("#wishlist-button")?.remove();
    const wishlistButtonTemplate = __webpack_require__(/*! ../templates/html/wishlist_button.html */ "./src/templates/html/wishlist_button.html");
    marketplaceMenu.insertAdjacentHTML("beforeend", wishlistButtonTemplate.render({ translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate }));
    marketplaceMenu
        .querySelector("#wishlist-button")
        ?.addEventListener("click", insertWishlist);
}
function insertWishlist() {
    // Assistance
    const assistance = document.querySelector(".marketplace-assistance");
    if (assistance)
        assistance.innerHTML = _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.market.wishlist.assistance;
    const button = document.querySelector("#wishlist-button");
    if (!button)
        return _console__WEBPACK_IMPORTED_MODULE_0__.Console.error("Wishlist button not found", button);
    // Menu
    document
        .querySelector("#marketplace-menu .active")
        ?.classList.remove("active");
    button.classList.add("active");
    // Filters
    const filters = document.getElementById("marketplace-filters");
    if (filters)
        filters.innerHTML = "";
    // Content
    const wishlistTemplate = __webpack_require__(/*! ../templates/html/wishlist_settings.html */ "./src/templates/html/wishlist_settings.html");
    const container = document.querySelector(".marketplace-container") ??
        document.getElementById("marketplace-active-auctions") ??
        document.getElementById("marketplace-itemsForSale");
    if (!container)
        return _console__WEBPACK_IMPORTED_MODULE_0__.Console.error("The wishlist cannot be placed", container);
    const wishlistContext = {
        wishlist: _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.wishlist,
    };
    container.innerHTML = wishlistTemplate.render({
        ...wishlistContext,
        translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate,
    });
    // Buttons
    for (const tr of container.querySelectorAll("tr")) {
        const icon = tr.dataset.icon;
        if (!icon)
            continue;
        // Reset status
        const reset = tr.querySelector(".reset-item-status");
        if (reset)
            reset.addEventListener("click", () => {
                resetStatus(icon);
                insertWishlist();
            });
        // Delete item from wishlist
        const deleteButton = tr.querySelector(".delete-wishlist-item");
        if (deleteButton)
            deleteButton.addEventListener("click", () => {
                deleteItem(icon);
                insertWishlist();
            });
        // Change price
        const editPrice = tr.querySelector(".edit-price");
        if (editPrice)
            editPrice.addEventListener("click", () => void changePrice(icon).then(insertWishlist));
    }
    // Reset statuses
    document.querySelector(".reset-all")?.addEventListener("click", resetStatuses);
}
function resetStatus(icon) {
    const wishlist = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.wishlist;
    const index = wishlist.findIndex(item => item.icon === icon);
    const entry = wishlist[index];
    if (!entry)
        return;
    delete entry.error;
    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.wishlist = [
        ...wishlist.slice(undefined, index),
        entry,
        ...wishlist.slice(index + 1, undefined),
    ];
}
function deleteItem(icon) {
    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.wishlist = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.wishlist.filter(item => item.icon !== icon);
}
async function changePrice(icon) {
    const template = __webpack_require__(/*! ../templates/html/change_price_flavr.html */ "./src/templates/html/change_price_flavr.html");
    const wishlist = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.wishlist;
    const index = wishlist.findIndex(item => item.icon === icon);
    const entry = wishlist[index];
    if (!entry)
        return;
    return new Promise(resolve => {
        $.flavr({
            content: template.render({ translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate }),
            dialog: "prompt",
            prompt: {
                value: entry.price.toString(),
            },
            buttons: {
                close: {
                    style: "close",
                    action: () => {
                        resolve();
                        return true;
                    },
                },
                save: {
                    action: () => save(icon, resolve),
                },
            },
            onBuild: $container => {
                $container.addClass("new-layout-popup");
                document
                    .querySelector(".flavr-prompt")
                    ?.addEventListener("keyup", ({ key }) => {
                    if (key !== "Enter")
                        return;
                    save(icon, resolve);
                });
            },
        });
    });
}
function save(icon, resolve) {
    const wishlist = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.wishlist;
    const index = wishlist.findIndex(item => item.icon === icon);
    const entry = wishlist[index];
    if (!entry)
        return false;
    const price = Number(document.querySelector(".flavr-prompt")?.value.trim());
    if (!price || price <= 0) {
        $.flavrNotif(_i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.market.change_price.invalid_price);
        return false;
    }
    entry.price = price;
    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.wishlist = [
        ...wishlist.slice(undefined, index),
        entry,
        ...wishlist.slice(index + 1, undefined),
    ];
    const template = __webpack_require__(/*! ../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html");
    $.flavrNotif(template.render({
        ...entry,
        message: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.market.change_price.changed_price(entry.name, entry.price),
    }));
    resolve();
    return true;
}
function resetStatuses() {
    _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.wishlist = _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.wishlist.map(item => {
        delete item.error;
        return item;
    });
    insertWishlist();
}


/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// 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] = {
/******/ 			// no module.id needed
/******/ 			// 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/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 });
/******/ 		};
/******/ 	})();
/******/ 	
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
(() => {
"use strict";
/*!*********************!*\
  !*** ./src/main.ts ***!
  \*********************/
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _appearance_dressing_experience__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./appearance/dressing_experience */ "./src/appearance/dressing_experience.ts");
/* harmony import */ var _cheat_codes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cheat_codes */ "./src/cheat_codes.ts");
/* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./console */ "./src/console.ts");
/* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./i18n/translate */ "./src/i18n/translate.ts");
/* harmony import */ var _migrate__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./migrate */ "./src/migrate.ts");
/* harmony import */ var _takeover_brain__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./takeover/brain */ "./src/takeover/brain.ts");
/* harmony import */ var _ui_auctions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ui/auctions */ "./src/ui/auctions.ts");
/* harmony import */ var _ui_carousel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ui/carousel */ "./src/ui/carousel.ts");
/* harmony import */ var _ui_favourites__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ui/favourites */ "./src/ui/favourites.ts");
/* harmony import */ var _ui_home_content__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ui/home_content */ "./src/ui/home_content.ts");
/* harmony import */ var _ui_mall__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ui/mall */ "./src/ui/mall.ts");
/* harmony import */ var _ui_market__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ui/market */ "./src/ui/market.ts");
/* harmony import */ var _ui_menu__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ui/menu */ "./src/ui/menu.ts");
/* harmony import */ var _ui_pet__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./ui/pet */ "./src/ui/pet.ts");
/* harmony import */ var _ui_profile__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./ui/profile */ "./src/ui/profile.ts");
/* harmony import */ var _ui_purro_shop__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./ui/purro_shop */ "./src/ui/purro_shop.ts");
/* harmony import */ var _ui_settings__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./ui/settings */ "./src/ui/settings.ts");
/* harmony import */ var _ui_top_bar__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./ui/top_bar */ "./src/ui/top_bar.ts");
/* harmony import */ var _ui_wishlist__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./ui/wishlist */ "./src/ui/wishlist.ts");



















// loadJS("https://unpkg.com/hogan.js/dist/template-3.0.2.min.js", true);
function load() {
    const container = document.getElementById("container");
    if (!container) {
        $.flavrNotif(_i18n_translate__WEBPACK_IMPORTED_MODULE_3__.translate.error.longLoading);
        _console__WEBPACK_IMPORTED_MODULE_2__.Console.error("#container couldn't be found:", container);
        return void setTimeout(load, 10_000);
    }
    (0,_migrate__WEBPACK_IMPORTED_MODULE_4__.migrate)();
    loadUI();
    observe();
    _console__WEBPACK_IMPORTED_MODULE_2__.Console.log(`${GM.info.script.name} v${GM.info.script.version} loaded.`);
    (0,_takeover_brain__WEBPACK_IMPORTED_MODULE_5__.loadTakeover)();
}
function loadUI() {
    (0,_ui_menu__WEBPACK_IMPORTED_MODULE_12__.loadMenu)();
    (0,_ui_carousel__WEBPACK_IMPORTED_MODULE_7__.loadCarousel)();
    (0,_ui_home_content__WEBPACK_IMPORTED_MODULE_9__.loadHomeContent)();
    (0,_ui_favourites__WEBPACK_IMPORTED_MODULE_8__.loadFavourites)();
    (0,_ui_profile__WEBPACK_IMPORTED_MODULE_14__.loadProfile)();
    (0,_ui_pet__WEBPACK_IMPORTED_MODULE_13__.loadPet)();
    (0,_ui_market__WEBPACK_IMPORTED_MODULE_11__.loadMarket)();
    (0,_ui_wishlist__WEBPACK_IMPORTED_MODULE_18__.loadWishlist)();
    (0,_ui_top_bar__WEBPACK_IMPORTED_MODULE_17__.loadTopBar)();
    (0,_ui_auctions__WEBPACK_IMPORTED_MODULE_6__.loadAuctions)();
    (0,_ui_purro_shop__WEBPACK_IMPORTED_MODULE_15__.loadPurroShop)();
    (0,_ui_mall__WEBPACK_IMPORTED_MODULE_10__.loadMall)();
    (0,_cheat_codes__WEBPACK_IMPORTED_MODULE_1__.loadCheatCodes)();
    (0,_ui_settings__WEBPACK_IMPORTED_MODULE_16__.loadSettings)();
    // Eldarya is crashing when opening groups.
    // TODO: Handle errors and stop the loading process.
    void (0,_appearance_dressing_experience__WEBPACK_IMPORTED_MODULE_0__.loadDressingExperience)();
}
function observe() {
    const container = document.getElementById("container");
    new MutationObserver(reload).observe(container, { childList: true });
}
function reload() {
    loadUI();
    (0,_takeover_brain__WEBPACK_IMPORTED_MODULE_5__.loadTakeover)();
}
_console__WEBPACK_IMPORTED_MODULE_2__.Console.log("Loading...");
if (document.readyState === "complete")
    load();
else
    window.addEventListener("load", () => load());

})();

/******/ })()
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkYXJ5YS1lbmhhbmNlbWVudHMudXNlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsbUJBQW1CO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxvQkFBb0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsb0JBQW9CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGtCQUFrQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsWUFBWTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBLGdDQUFnQyxZQUFZO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFK1M7Ozs7Ozs7Ozs7O0FDbGIvUztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFD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SSxDQUFDO0lBQzNFLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBa0I7UUFDdEIsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzNFLENBQUM7SUFFRCxRQUFRLENBQUMsUUFBa0I7UUFDekIsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzNFLENBQUM7SUFFRCxJQUFJLENBQUMsUUFBa0I7UUFDckIsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzNFLENBQUM7SUFFRCxFQUFFLENBQUMsSUFBa0I7UUFDbkIsT0FBTyxJQUFJLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxJQUFJLENBQUM7SUFDNUQsQ0FBQztDQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FFL0NNLFNBQVMsUUFBUSxDQUFDLElBQVk7SUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUM7SUFDbkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUM7SUFDakMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSTtJQUUzQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FB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QUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL25vZGVfbW9kdWxlcy8ucG5wbS9ibG9iLXV0aWxAMi4wLjIvbm9kZV9tb2R1bGVzL2Jsb2ItdXRpbC9kaXN0L2Jsb2ItdXRpbC5lcy5qcyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL25vZGVfbW9kdWxlcy8ucG5wbS9ob2dhbi5qc0AzLjAuMi9ub2RlX21vZHVsZXMvaG9nYW4uanMvbGliL2NvbXBpbGVyLmpzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vbm9kZV9tb2R1bGVzLy5wbnBtL2hvZ2FuLmpzQDMuMC4yL25vZGVfbW9kdWxlcy9ob2dhbi5qcy9saWIvaG9nYW4uanMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9ub2RlX21vZHVsZXMvLnBucG0vaG9nYW4uanNAMy4wLjIvbm9kZV9tb2R1bGVzL2hvZ2FuLmpzL2xpYi90ZW1wbGF0ZS5qcyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9hcHBlYXJhbmNlX2l0ZW0uaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9hcHBlYXJhbmNlX2l0ZW1zX2NhdGVnb3J5Lmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvYXBwZWFyYW5jZV9pdGVtc19ncm91cC5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2F1dG9fYnV5X2J1dHRvbi5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2F1dG9fYnV5X2ZsYXZyLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvYXV0b19idXlfZmxhdnJfbWFsbC5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2F1dG9fZXhwbG9yZV9idXR0b24uaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9jYXJvdXNlbF9uZXdzLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvY2hhbmdlX3ByaWNlX2ZsYXZyLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvY29uZmlybV9yZXNldF9zZXR0aW5ncy5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2NyZWF0ZWRfb3V0Zml0X2ZsYXZyLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvZXhwbG9yYXRpb25faGlzdG9yeS5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2Zhdm91cml0ZV9vdXRmaXRfZmxhdnIuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9mYXZvdXJpdGVzX2FjdGlvbi5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2ZsYXZyX25vdGlmL2ljb25fbWVzc2FnZS5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2hlYWRlcl90YWtlb3Zlci5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2hvbWVfY29udGVudF9zbWFsbC5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL21haW5fbWVudS5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL21haW5fbWVudV9wdXJyb3Nob3AuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9tYXJrZXRfaGlzdG9yeS5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL21hc3NfbWFya19idXR0b24uaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9vdXRmaXRfdGh1bWJzLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvcHJvZmlsZV9jb250YWN0X2FjdGlvbi5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL3JlbmFtZV9mYXZvdXJpdGVfb3V0Zml0X2ZsYXZyLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvc2V0dGluZ3MuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC93aXNobGlzdF9idXR0b24uaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC93aXNobGlzdF9zZXR0aW5ncy5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2FqYXgvYWpheF9zZWFyY2gudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYWpheC9idXkudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYWpheC9jYXB0dXJlX2VuZC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hamF4L2NoYW5nZV9yZWdpb24udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYWpheC9leHBsb3JhdGlvbl9yZXN1bHRzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2FwaS9tZXRhLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2FwaS9yZXN1bHQuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hcHBlYXJhbmNlL2FwcGVhcmFuY2VfdWkudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYXBwZWFyYW5jZS9kYXRhX3NldC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hcHBlYXJhbmNlL2RyZXNzaW5nX2V4cGVyaWVuY2UudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYXBwZWFyYW5jZS9lbnVtcy9hcHBlYXJhbmNlX2NhdGVnb3J5X2NvZGUuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hcHBlYXJhbmNlL2Zha2VfZmF2b3VyaXRlcy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hcHBlYXJhbmNlL2Zhdm91cml0ZXNfYWN0aW9ucy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hcHBlYXJhbmNlL2hpZGRlbi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hcHBlYXJhbmNlL3dhcmRyb2JlLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2Nhcm91c2VsL2Nhcm91c2VsX2JlZW1vb3ZfYW5ub3lhbmNlcy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9jYXJvdXNlbC9jYXJvdXNlbF9kb3dubG9hZF9mYWNlLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2Nhcm91c2VsL2Nhcm91c2VsX2Rvd25sb2FkX2d1YXJkaWFuLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2Nhcm91c2VsL2Nhcm91c2VsX2VsZGFyeWFfZW5oYW5jZW1lbnRzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2Nhcm91c2VsL2Nhcm91c2VsX3Rha2VvdmVyLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2NoZWF0X2NvZGVzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2NvbnNvbGUudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvZG93bmxvYWQtY2FudmFzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2R1cmF0aW9uLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2VsZGFyeWEvanF1ZXJ5LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2VsZGFyeWFfdXRpbC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9pMThuL2VuLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2kxOG4vZnIudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvaTE4bi90cmFuc2xhdGUudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvaW5kZXhlZF9kYi9kYXRhYmFzZXMuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9pbmRleGVkX2RiL2ZpZWxkcy5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2luZGV4ZWRfZGIvaW5kZXhlZF9kYi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9pbmRleGVkX2RiL3RhYmxlcy5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZS5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9tYXJrZXRwbGFjZS9lbnVtcy9ib2R5X2xvY2F0aW9uLmVudW0udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvbWFya2V0cGxhY2UvZW51bXMvY2F0ZWdvcnkuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9tYXJrZXRwbGFjZS9lbnVtcy9ndWFyZC5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21hcmtldHBsYWNlL2VudW1zL3Jhcml0eS5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21hcmtldHBsYWNlL2VudW1zL3R5cGUuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZV9oYW5kbGVycy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9taWdyYXRlLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21pbmlnYW1lcy9lbWlsZS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9taW5pZ2FtZXMvZmxhcHB5LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21pbmlnYW1lcy9oYXRjaGxpbmdzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21pbmlnYW1lcy9wZWdnbGUudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvb3V0Zml0LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3BldC9leHBsb3JhdGlvbi1oaXN0b3J5LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3BldC9leHBsb3JhdGlvbi13YXRjaGVyLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3BldC9leHBsb3JhdGlvbi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9wZXQvbWFwX2xvY2F0aW9uX2RhdGFzZXQudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvcGV0L21hcmtfY29udGV4dC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9wZXQvbWFzc19tYXJrLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3BldC9taW5pbWFwX2RhdGFzZXQudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvc2Vzc2lvbl9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZS5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3Nlc3Npb25fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2UudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvc2Vzc2lvbl9zdG9yYWdlL3Rha2VvdmVyX2FjdGlvbi5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3Rha2VvdmVyL2JyYWluLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3Rha2VvdmVyL2NsYXNzZXMvYWN0aW9uLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3Rha2VvdmVyL2NsYXNzZXMvYnV5X2FjdGlvbi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90YWtlb3Zlci9jbGFzc2VzL2RhaWx5X2FjdGlvbi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90YWtlb3Zlci9jbGFzc2VzL2V4cGxvcmF0aW9uX2FjdGlvbi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90YWtlb3Zlci9jbGFzc2VzL21pbmlnYW1lX2FjdGlvbi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90YWtlb3Zlci9jbGFzc2VzL3dhaXRfYWN0aW9uLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3Rha2VvdmVyL2NsaWNrLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3Rha2VvdmVyL2V4cGxvcmF0aW9uX3N0YXR1cy5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RzX3V0aWwudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvYXVjdGlvbnMudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvY2Fyb3VzZWwudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvZmF2b3VyaXRlcy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy91aS9ob21lX2NvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvbWFsbC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy91aS9tYXJrZXQudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvbWVudS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy91aS9wZXQudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvcHJvZmlsZS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy91aS9wdXJyb19zaG9wLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL3NldHRpbmdzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL3RvcF9iYXIudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvd2lzaGxpc3QudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFRPRE86IGluY2x1ZGluZyB0aGVzZSBpbiBibG9iLXV0aWwudHMgY2F1c2VzIHR5cGVkb2MgdG8gZ2VuZXJhdGUgZG9jcyBmb3IgdGhlbSxcbi8vIGV2ZW4gd2l0aCAtLWV4Y2x1ZGVQcml2YXRlIMKvXFxfKOODhClfL8KvXG4vKiogQHByaXZhdGUgKi9cbmZ1bmN0aW9uIGxvYWRJbWFnZShzcmMsIGNyb3NzT3JpZ2luKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpZiAoY3Jvc3NPcmlnaW4pIHtcbiAgICAgICAgICAgIGltZy5jcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luO1xuICAgICAgICB9XG4gICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXNvbHZlKGltZyk7XG4gICAgICAgIH07XG4gICAgICAgIGltZy5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICBpbWcuc3JjID0gc3JjO1xuICAgIH0pO1xufVxuLyoqIEBwcml2YXRlICovXG5mdW5jdGlvbiBpbWdUb0NhbnZhcyhpbWcpIHtcbiAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gaW1nLndpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuICAgIC8vIGNvcHkgdGhlIGltYWdlIGNvbnRlbnRzIHRvIHRoZSBjYW52YXNcbiAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0LCAwLCAwLCBpbWcud2lkdGgsIGltZy5oZWlnaHQpO1xuICAgIHJldHVybiBjYW52YXM7XG59XG5cbi8qIGdsb2JhbCBQcm9taXNlLCBJbWFnZSwgQmxvYiwgRmlsZVJlYWRlciwgYXRvYiwgYnRvYSxcbiAgIEJsb2JCdWlsZGVyLCBNU0Jsb2JCdWlsZGVyLCBNb3pCbG9iQnVpbGRlciwgV2ViS2l0QmxvYkJ1aWxkZXIsIHdlYmtpdFVSTCAqL1xuLyoqXG4gKiBTaGltIGZvclxuICogW2BuZXcgQmxvYigpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Jsb2IuQmxvYilcbiAqIHRvIHN1cHBvcnRcbiAqIFtvbGRlciBicm93c2VycyB0aGF0IHVzZSB0aGUgZGVwcmVjYXRlZCBgQmxvYkJ1aWxkZXJgIEFQSV0oaHR0cDovL2Nhbml1c2UuY29tL2Jsb2IpLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciBteUJsb2IgPSBibG9iVXRpbC5jcmVhdGVCbG9iKFsnaGVsbG8gd29ybGQnXSwge3R5cGU6ICd0ZXh0L3BsYWluJ30pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHBhcnRzIC0gY29udGVudCBvZiB0aGUgQmxvYlxuICogQHBhcmFtIHByb3BlcnRpZXMgLSB1c3VhbGx5IGB7dHlwZTogbXlDb250ZW50VHlwZX1gLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UgY2FuIGFsc28gcGFzcyBhIHN0cmluZyBmb3IgdGhlIGNvbnRlbnQgdHlwZVxuICogQHJldHVybnMgQmxvYlxuICovXG5mdW5jdGlvbiBjcmVhdGVCbG9iKHBhcnRzLCBwcm9wZXJ0aWVzKSB7XG4gICAgcGFydHMgPSBwYXJ0cyB8fCBbXTtcbiAgICBwcm9wZXJ0aWVzID0gcHJvcGVydGllcyB8fCB7fTtcbiAgICBpZiAodHlwZW9mIHByb3BlcnRpZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHByb3BlcnRpZXMgPSB7IHR5cGU6IHByb3BlcnRpZXMgfTsgLy8gaW5mZXIgY29udGVudCB0eXBlXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvYihwYXJ0cywgcHJvcGVydGllcyk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlLm5hbWUgIT09ICdUeXBlRXJyb3InKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBCdWlsZGVyID0gdHlwZW9mIEJsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgPyBCbG9iQnVpbGRlciA6IHR5cGVvZiBNU0Jsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgPyBNU0Jsb2JCdWlsZGVyIDogdHlwZW9mIE1vekJsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgPyBNb3pCbG9iQnVpbGRlciA6IFdlYktpdEJsb2JCdWlsZGVyO1xuICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHBhcnRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRCbG9iKHByb3BlcnRpZXMudHlwZSk7XG4gICAgfVxufVxuLyoqXG4gKiBTaGltIGZvclxuICogW2BVUkwuY3JlYXRlT2JqZWN0VVJMKClgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVVJMLmNyZWF0ZU9iamVjdFVSTClcbiAqIHRvIHN1cHBvcnQgYnJvd3NlcnMgdGhhdCBvbmx5IGhhdmUgdGhlIHByZWZpeGVkXG4gKiBgd2Via2l0VVJMYCAoZS5nLiBBbmRyb2lkIDw0LjQpLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciBteVVybCA9IGJsb2JVdGlsLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBibG9iXG4gKiBAcmV0dXJucyB1cmxcbiAqL1xuZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMKGJsb2IpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBVUkwgIT09ICd1bmRlZmluZWQnID8gVVJMIDogd2Via2l0VVJMKS5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG59XG4vKipcbiAqIFNoaW0gZm9yXG4gKiBbYFVSTC5yZXZva2VPYmplY3RVUkwoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwucmV2b2tlT2JqZWN0VVJMKVxuICogdG8gc3VwcG9ydCBicm93c2VycyB0aGF0IG9ubHkgaGF2ZSB0aGUgcHJlZml4ZWRcbiAqIGB3ZWJraXRVUkxgIChlLmcuIEFuZHJvaWQgPDQuNCkuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogYmxvYlV0aWwucmV2b2tlT2JqZWN0VVJMKG15VXJsKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB1cmxcbiAqL1xuZnVuY3Rpb24gcmV2b2tlT2JqZWN0VVJMKHVybCkge1xuICAgIHJldHVybiAodHlwZW9mIFVSTCAhPT0gJ3VuZGVmaW5lZCcgPyBVUkwgOiB3ZWJraXRVUkwpLnJldm9rZU9iamVjdFVSTCh1cmwpO1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgYEJsb2JgIHRvIGEgYmluYXJ5IHN0cmluZy5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBibG9iVXRpbC5ibG9iVG9CaW5hcnlTdHJpbmcoYmxvYikudGhlbihmdW5jdGlvbiAoYmluYXJ5U3RyaW5nKSB7XG4gKiAgIC8vIHN1Y2Nlc3NcbiAqIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAqICAgLy8gZXJyb3JcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGJsb2JcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBiaW5hcnkgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGJsb2JUb0JpbmFyeVN0cmluZyhibG9iKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHZhciBoYXNCaW5hcnlTdHJpbmcgPSB0eXBlb2YgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWFkZXIucmVzdWx0IHx8ICcnO1xuICAgICAgICAgICAgaWYgKGhhc0JpbmFyeVN0cmluZykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKGFycmF5QnVmZmVyVG9CaW5hcnlTdHJpbmcocmVzdWx0KSk7XG4gICAgICAgIH07XG4gICAgICAgIHJlYWRlci5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICBpZiAoaGFzQmluYXJ5U3RyaW5nKSB7XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKGJsb2IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIENvbnZlcnQgYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcgdG8gYSBgQmxvYmAuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIGJsb2IgPSBibG9iVXRpbC5iYXNlNjRTdHJpbmdUb0Jsb2IoYmFzZTY0U3RyaW5nKTtcbiAqIGBgYFxuICogQHBhcmFtIGJhc2U2NCAtIGJhc2U2NC1lbmNvZGVkIHN0cmluZ1xuICogQHBhcmFtIHR5cGUgLSB0aGUgY29udGVudCB0eXBlIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEJsb2JcbiAqL1xuZnVuY3Rpb24gYmFzZTY0U3RyaW5nVG9CbG9iKGJhc2U2NCwgdHlwZSkge1xuICAgIHZhciBwYXJ0cyA9IFtiaW5hcnlTdHJpbmdUb0FycmF5QnVmZmVyKGF0b2IoYmFzZTY0KSldO1xuICAgIHJldHVybiB0eXBlID8gY3JlYXRlQmxvYihwYXJ0cywgeyB0eXBlOiB0eXBlIH0pIDogY3JlYXRlQmxvYihwYXJ0cyk7XG59XG4vKipcbiAqIENvbnZlcnQgYSBiaW5hcnkgc3RyaW5nIHRvIGEgYEJsb2JgLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciBibG9iID0gYmxvYlV0aWwuYmluYXJ5U3RyaW5nVG9CbG9iKGJpbmFyeVN0cmluZyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYmluYXJ5IC0gYmluYXJ5IHN0cmluZ1xuICogQHBhcmFtIHR5cGUgLSB0aGUgY29udGVudCB0eXBlIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEJsb2JcbiAqL1xuZnVuY3Rpb24gYmluYXJ5U3RyaW5nVG9CbG9iKGJpbmFyeSwgdHlwZSkge1xuICAgIHJldHVybiBiYXNlNjRTdHJpbmdUb0Jsb2IoYnRvYShiaW5hcnkpLCB0eXBlKTtcbn1cbi8qKlxuICogQ29udmVydCBhIGBCbG9iYCB0byBhIGJpbmFyeSBzdHJpbmcuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogYmxvYlV0aWwuYmxvYlRvQmFzZTY0U3RyaW5nKGJsb2IpLnRoZW4oZnVuY3Rpb24gKGJhc2U2NFN0cmluZykge1xuICogICAvLyBzdWNjZXNzXG4gKiB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gKiAgIC8vIGVycm9yXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBibG9iXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmluYXJ5IHN0cmluZ1xuICovXG5mdW5jdGlvbiBibG9iVG9CYXNlNjRTdHJpbmcoYmxvYikge1xuICAgIHJldHVybiBibG9iVG9CaW5hcnlTdHJpbmcoYmxvYikudGhlbihidG9hKTtcbn1cbi8qKlxuICogQ29udmVydCBhIGRhdGEgVVJMIHN0cmluZ1xuICogKGUuZy4gYCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHLi4uJ2ApXG4gKiB0byBhIGBCbG9iYC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgYmxvYiA9IGJsb2JVdGlsLmRhdGFVUkxUb0Jsb2IoZGF0YVVSTCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZGF0YVVSTCAtIGRhdGFVUkwtZW5jb2RlZCBzdHJpbmdcbiAqIEByZXR1cm5zIEJsb2JcbiAqL1xuZnVuY3Rpb24gZGF0YVVSTFRvQmxvYihkYXRhVVJMKSB7XG4gICAgdmFyIHR5cGUgPSBkYXRhVVJMLm1hdGNoKC9kYXRhOihbXjtdKykvKVsxXTtcbiAgICB2YXIgYmFzZTY0ID0gZGF0YVVSTC5yZXBsYWNlKC9eW14sXSssLywgJycpO1xuICAgIHZhciBidWZmID0gYmluYXJ5U3RyaW5nVG9BcnJheUJ1ZmZlcihhdG9iKGJhc2U2NCkpO1xuICAgIHJldHVybiBjcmVhdGVCbG9iKFtidWZmXSwgeyB0eXBlOiB0eXBlIH0pO1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgYEJsb2JgIHRvIGEgZGF0YSBVUkwgc3RyaW5nXG4gKiAoZS5nLiBgJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0cuLi4nYCkuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIGRhdGFVUkwgPSBibG9iVXRpbC5ibG9iVG9EYXRhVVJMKGJsb2IpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGJsb2JcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBkYXRhIFVSTCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gYmxvYlRvRGF0YVVSTChibG9iKSB7XG4gICAgcmV0dXJuIGJsb2JUb0Jhc2U2NFN0cmluZyhibG9iKS50aGVuKGZ1bmN0aW9uIChiYXNlNjRTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICdkYXRhOicgKyBibG9iLnR5cGUgKyAnO2Jhc2U2NCwnICsgYmFzZTY0U3RyaW5nO1xuICAgIH0pO1xufVxuLyoqXG4gKiBDb252ZXJ0IGFuIGltYWdlJ3MgYHNyY2AgVVJMIHRvIGEgZGF0YSBVUkwgYnkgbG9hZGluZyB0aGUgaW1hZ2UgYW5kIHBhaW50aW5nXG4gKiBpdCB0byBhIGBjYW52YXNgLlxuICpcbiAqIE5vdGU6IHRoaXMgd2lsbCBjb2VyY2UgdGhlIGltYWdlIHRvIHRoZSBkZXNpcmVkIGNvbnRlbnQgdHlwZSwgYW5kIGl0XG4gKiB3aWxsIG9ubHkgcGFpbnQgdGhlIGZpcnN0IGZyYW1lIG9mIGFuIGFuaW1hdGVkIEdJRi5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGBqc1xuICogYmxvYlV0aWwuaW1nU3JjVG9EYXRhVVJMKCdodHRwOi8vbXlzaXRlLmNvbS9pbWcucG5nJykudGhlbihmdW5jdGlvbiAoZGF0YVVSTCkge1xuICogICAvLyBzdWNjZXNzXG4gKiB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gKiAgIC8vIGVycm9yXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBibG9iVXRpbC5pbWdTcmNUb0RhdGFVUkwoJ2h0dHA6Ly9zb21lLW90aGVyLXNpdGUuY29tL2ltZy5qcGcnLCAnaW1hZ2UvanBlZycsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Fub255bW91cycsIDEuMCkudGhlbihmdW5jdGlvbiAoZGF0YVVSTCkge1xuICogICAvLyBzdWNjZXNzXG4gKiB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gKiAgIC8vIGVycm9yXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzcmMgLSBpbWFnZSBzcmNcbiAqIEBwYXJhbSB0eXBlIC0gdGhlIGNvbnRlbnQgdHlwZSAob3B0aW9uYWwsIGRlZmF1bHRzIHRvICdpbWFnZS9wbmcnKVxuICogQHBhcmFtIGNyb3NzT3JpZ2luIC0gZm9yIENPUlMtZW5hYmxlZCBpbWFnZXMsIHNldCB0aGlzIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Fub255bW91cycgdG8gYXZvaWQgXCJ0YWludGVkIGNhbnZhc1wiIGVycm9yc1xuICogQHBhcmFtIHF1YWxpdHkgLSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgaW5kaWNhdGluZyBpbWFnZSBxdWFsaXR5XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgcmVxdWVzdGVkIHR5cGUgaXMgJ2ltYWdlL2pwZWcnIG9yICdpbWFnZS93ZWJwJ1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGRhdGEgVVJMIHN0cmluZ1xuICovXG5mdW5jdGlvbiBpbWdTcmNUb0RhdGFVUkwoc3JjLCB0eXBlLCBjcm9zc09yaWdpbiwgcXVhbGl0eSkge1xuICAgIHR5cGUgPSB0eXBlIHx8ICdpbWFnZS9wbmcnO1xuICAgIHJldHVybiBsb2FkSW1hZ2Uoc3JjLCBjcm9zc09yaWdpbikudGhlbihpbWdUb0NhbnZhcykudGhlbihmdW5jdGlvbiAoY2FudmFzKSB7XG4gICAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKHR5cGUsIHF1YWxpdHkpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgYGNhbnZhc2AgdG8gYSBgQmxvYmAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogYGBganNcbiAqIGJsb2JVdGlsLmNhbnZhc1RvQmxvYihjYW52YXMpLnRoZW4oZnVuY3Rpb24gKGJsb2IpIHtcbiAqICAgLy8gc3VjY2Vzc1xuICogfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICogICAvLyBlcnJvclxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBNb3N0IGJyb3dzZXJzIHN1cHBvcnQgY29udmVydGluZyBhIGNhbnZhcyB0byBib3RoIGAnaW1hZ2UvcG5nJ2AgYW5kIGAnaW1hZ2UvanBlZydgLiBZb3UgbWF5XG4gKiBhbHNvIHdhbnQgdG8gdHJ5IGAnaW1hZ2Uvd2VicCdgLCB3aGljaCB3aWxsIHdvcmsgaW4gc29tZSBicm93c2VycyBsaWtlIENocm9tZSAoYW5kIGluIG90aGVyIGJyb3dzZXJzLCB3aWxsIGp1c3QgZmFsbCBiYWNrIHRvIGAnaW1hZ2UvcG5nJ2ApOlxuICpcbiAqIGBgYGpzXG4gKiBibG9iVXRpbC5jYW52YXNUb0Jsb2IoY2FudmFzLCAnaW1hZ2Uvd2VicCcpLnRoZW4oZnVuY3Rpb24gKGJsb2IpIHtcbiAqICAgLy8gc3VjY2Vzc1xuICogfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICogICAvLyBlcnJvclxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gY2FudmFzIC0gSFRNTENhbnZhc0VsZW1lbnRcbiAqIEBwYXJhbSB0eXBlIC0gdGhlIGNvbnRlbnQgdHlwZSAob3B0aW9uYWwsIGRlZmF1bHRzIHRvICdpbWFnZS9wbmcnKVxuICogQHBhcmFtIHF1YWxpdHkgLSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgaW5kaWNhdGluZyBpbWFnZSBxdWFsaXR5XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgcmVxdWVzdGVkIHR5cGUgaXMgJ2ltYWdlL2pwZWcnIG9yICdpbWFnZS93ZWJwJ1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGBCbG9iYFxuICovXG5mdW5jdGlvbiBjYW52YXNUb0Jsb2IoY2FudmFzLCB0eXBlLCBxdWFsaXR5KSB7XG4gICAgaWYgKHR5cGVvZiBjYW52YXMudG9CbG9iID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgY2FudmFzLnRvQmxvYihyZXNvbHZlLCB0eXBlLCBxdWFsaXR5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGF0YVVSTFRvQmxvYihjYW52YXMudG9EYXRhVVJMKHR5cGUsIHF1YWxpdHkpKSk7XG59XG4vKipcbiAqIENvbnZlcnQgYW4gaW1hZ2UncyBgc3JjYCBVUkwgdG8gYSBgQmxvYmAgYnkgbG9hZGluZyB0aGUgaW1hZ2UgYW5kIHBhaW50aW5nXG4gKiBpdCB0byBhIGBjYW52YXNgLlxuICpcbiAqIE5vdGU6IHRoaXMgd2lsbCBjb2VyY2UgdGhlIGltYWdlIHRvIHRoZSBkZXNpcmVkIGNvbnRlbnQgdHlwZSwgYW5kIGl0XG4gKiB3aWxsIG9ubHkgcGFpbnQgdGhlIGZpcnN0IGZyYW1lIG9mIGFuIGFuaW1hdGVkIEdJRi5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGBqc1xuICogYmxvYlV0aWwuaW1nU3JjVG9CbG9iKCdodHRwOi8vbXlzaXRlLmNvbS9pbWcucG5nJykudGhlbihmdW5jdGlvbiAoYmxvYikge1xuICogICAvLyBzdWNjZXNzXG4gKiB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gKiAgIC8vIGVycm9yXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBibG9iVXRpbC5pbWdTcmNUb0Jsb2IoJ2h0dHA6Ly9zb21lLW90aGVyLXNpdGUuY29tL2ltZy5qcGcnLCAnaW1hZ2UvanBlZycsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Fub255bW91cycsIDEuMCkudGhlbihmdW5jdGlvbiAoYmxvYikge1xuICogICAvLyBzdWNjZXNzXG4gKiB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gKiAgIC8vIGVycm9yXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzcmMgLSBpbWFnZSBzcmNcbiAqIEBwYXJhbSB0eXBlIC0gdGhlIGNvbnRlbnQgdHlwZSAob3B0aW9uYWwsIGRlZmF1bHRzIHRvICdpbWFnZS9wbmcnKVxuICogQHBhcmFtIGNyb3NzT3JpZ2luIC0gZm9yIENPUlMtZW5hYmxlZCBpbWFnZXMsIHNldCB0aGlzIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Fub255bW91cycgdG8gYXZvaWQgXCJ0YWludGVkIGNhbnZhc1wiIGVycm9yc1xuICogQHBhcmFtIHF1YWxpdHkgLSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgaW5kaWNhdGluZyBpbWFnZSBxdWFsaXR5XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgcmVxdWVzdGVkIHR5cGUgaXMgJ2ltYWdlL2pwZWcnIG9yICdpbWFnZS93ZWJwJ1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGBCbG9iYFxuICovXG5mdW5jdGlvbiBpbWdTcmNUb0Jsb2Ioc3JjLCB0eXBlLCBjcm9zc09yaWdpbiwgcXVhbGl0eSkge1xuICAgIHR5cGUgPSB0eXBlIHx8ICdpbWFnZS9wbmcnO1xuICAgIHJldHVybiBsb2FkSW1hZ2Uoc3JjLCBjcm9zc09yaWdpbikudGhlbihpbWdUb0NhbnZhcykudGhlbihmdW5jdGlvbiAoY2FudmFzKSB7XG4gICAgICAgIHJldHVybiBjYW52YXNUb0Jsb2IoY2FudmFzLCB0eXBlLCBxdWFsaXR5KTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ29udmVydCBhbiBgQXJyYXlCdWZmZXJgIHRvIGEgYEJsb2JgLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciBibG9iID0gYmxvYlV0aWwuYXJyYXlCdWZmZXJUb0Jsb2IoYXJyYXlCdWZmLCAnYXVkaW8vbXBlZycpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGJ1ZmZlclxuICogQHBhcmFtIHR5cGUgLSB0aGUgY29udGVudCB0eXBlIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEJsb2JcbiAqL1xuZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0Jsb2IoYnVmZmVyLCB0eXBlKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJsb2IoW2J1ZmZlcl0sIHR5cGUpO1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgYEJsb2JgIHRvIGFuIGBBcnJheUJ1ZmZlcmAuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogYmxvYlV0aWwuYmxvYlRvQXJyYXlCdWZmZXIoYmxvYikudGhlbihmdW5jdGlvbiAoYXJyYXlCdWZmKSB7XG4gKiAgIC8vIHN1Y2Nlc3NcbiAqIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAqICAgLy8gZXJyb3JcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGJsb2JcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBgQXJyYXlCdWZmZXJgXG4gKi9cbmZ1bmN0aW9uIGJsb2JUb0FycmF5QnVmZmVyKGJsb2IpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWFkZXIucmVzdWx0IHx8IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ29udmVydCBhbiBgQXJyYXlCdWZmZXJgIHRvIGEgYmluYXJ5IHN0cmluZy5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgbXlTdHJpbmcgPSBibG9iVXRpbC5hcnJheUJ1ZmZlclRvQmluYXJ5U3RyaW5nKGFycmF5QnVmZilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBidWZmZXIgLSBhcnJheSBidWZmZXJcbiAqIEByZXR1cm5zIGJpbmFyeSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyhidWZmZXIpIHtcbiAgICB2YXIgYmluYXJ5ID0gJyc7XG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICB2YXIgbGVuZ3RoID0gYnl0ZXMuYnl0ZUxlbmd0aDtcbiAgICB2YXIgaSA9IC0xO1xuICAgIHdoaWxlICgrK2kgPCBsZW5ndGgpIHtcbiAgICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYmluYXJ5O1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgYmluYXJ5IHN0cmluZyB0byBhbiBgQXJyYXlCdWZmZXJgLlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgbXlCdWZmZXIgPSBibG9iVXRpbC5iaW5hcnlTdHJpbmdUb0FycmF5QnVmZmVyKGJpbmFyeVN0cmluZylcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBiaW5hcnkgLSBiaW5hcnkgc3RyaW5nXG4gKiBAcmV0dXJucyBhcnJheSBidWZmZXJcbiAqL1xuZnVuY3Rpb24gYmluYXJ5U3RyaW5nVG9BcnJheUJ1ZmZlcihiaW5hcnkpIHtcbiAgICB2YXIgbGVuZ3RoID0gYmluYXJ5Lmxlbmd0aDtcbiAgICB2YXIgYnVmID0gbmV3IEFycmF5QnVmZmVyKGxlbmd0aCk7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgdmFyIGkgPSAtMTtcbiAgICB3aGlsZSAoKytpIDwgbGVuZ3RoKSB7XG4gICAgICAgIGFycltpXSA9IGJpbmFyeS5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xufVxuXG5leHBvcnQgeyBjcmVhdGVCbG9iLCBjcmVhdGVPYmplY3RVUkwsIHJldm9rZU9iamVjdFVSTCwgYmxvYlRvQmluYXJ5U3RyaW5nLCBiYXNlNjRTdHJpbmdUb0Jsb2IsIGJpbmFyeVN0cmluZ1RvQmxvYiwgYmxvYlRvQmFzZTY0U3RyaW5nLCBkYXRhVVJMVG9CbG9iLCBibG9iVG9EYXRhVVJMLCBpbWdTcmNUb0RhdGFVUkwsIGNhbnZhc1RvQmxvYiwgaW1nU3JjVG9CbG9iLCBhcnJheUJ1ZmZlclRvQmxvYiwgYmxvYlRvQXJyYXlCdWZmZXIsIGFycmF5QnVmZmVyVG9CaW5hcnlTdHJpbmcsIGJpbmFyeVN0cmluZ1RvQXJyYXlCdWZmZXIgfTtcbiIsIi8qXG4gKiAgQ29weXJpZ2h0IDIwMTEgVHdpdHRlciwgSW5jLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuKGZ1bmN0aW9uIChIb2dhbikge1xuICAvLyBTZXR1cCByZWdleCAgYXNzaWdubWVudHNcbiAgLy8gcmVtb3ZlIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIE11c3RhY2hlIHNwZWNcbiAgdmFyIHJJc1doaXRlc3BhY2UgPSAvXFxTLyxcbiAgICAgIHJRdW90ID0gL1xcXCIvZyxcbiAgICAgIHJOZXdsaW5lID0gIC9cXG4vZyxcbiAgICAgIHJDciA9IC9cXHIvZyxcbiAgICAgIHJTbGFzaCA9IC9cXFxcL2csXG4gICAgICByTGluZVNlcCA9IC9cXHUyMDI4LyxcbiAgICAgIHJQYXJhZ3JhcGhTZXAgPSAvXFx1MjAyOS87XG5cbiAgSG9nYW4udGFncyA9IHtcbiAgICAnIyc6IDEsICdeJzogMiwgJzwnOiAzLCAnJCc6IDQsXG4gICAgJy8nOiA1LCAnISc6IDYsICc+JzogNywgJz0nOiA4LCAnX3YnOiA5LFxuICAgICd7JzogMTAsICcmJzogMTEsICdfdCc6IDEyXG4gIH07XG5cbiAgSG9nYW4uc2NhbiA9IGZ1bmN0aW9uIHNjYW4odGV4dCwgZGVsaW1pdGVycykge1xuICAgIHZhciBsZW4gPSB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgSU5fVEVYVCA9IDAsXG4gICAgICAgIElOX1RBR19UWVBFID0gMSxcbiAgICAgICAgSU5fVEFHID0gMixcbiAgICAgICAgc3RhdGUgPSBJTl9URVhULFxuICAgICAgICB0YWdUeXBlID0gbnVsbCxcbiAgICAgICAgdGFnID0gbnVsbCxcbiAgICAgICAgYnVmID0gJycsXG4gICAgICAgIHRva2VucyA9IFtdLFxuICAgICAgICBzZWVuVGFnID0gZmFsc2UsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBsaW5lU3RhcnQgPSAwLFxuICAgICAgICBvdGFnID0gJ3t7JyxcbiAgICAgICAgY3RhZyA9ICd9fSc7XG5cbiAgICBmdW5jdGlvbiBhZGRCdWYoKSB7XG4gICAgICBpZiAoYnVmLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdG9rZW5zLnB1c2goe3RhZzogJ190JywgdGV4dDogbmV3IFN0cmluZyhidWYpfSk7XG4gICAgICAgIGJ1ZiA9ICcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpbmVJc1doaXRlc3BhY2UoKSB7XG4gICAgICB2YXIgaXNBbGxXaGl0ZXNwYWNlID0gdHJ1ZTtcbiAgICAgIGZvciAodmFyIGogPSBsaW5lU3RhcnQ7IGogPCB0b2tlbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaXNBbGxXaGl0ZXNwYWNlID1cbiAgICAgICAgICAoSG9nYW4udGFnc1t0b2tlbnNbal0udGFnXSA8IEhvZ2FuLnRhZ3NbJ192J10pIHx8XG4gICAgICAgICAgKHRva2Vuc1tqXS50YWcgPT0gJ190JyAmJiB0b2tlbnNbal0udGV4dC5tYXRjaChySXNXaGl0ZXNwYWNlKSA9PT0gbnVsbCk7XG4gICAgICAgIGlmICghaXNBbGxXaGl0ZXNwYWNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc0FsbFdoaXRlc3BhY2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmlsdGVyTGluZShoYXZlU2VlblRhZywgbm9OZXdMaW5lKSB7XG4gICAgICBhZGRCdWYoKTtcblxuICAgICAgaWYgKGhhdmVTZWVuVGFnICYmIGxpbmVJc1doaXRlc3BhY2UoKSkge1xuICAgICAgICBmb3IgKHZhciBqID0gbGluZVN0YXJ0LCBuZXh0OyBqIDwgdG9rZW5zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKHRva2Vuc1tqXS50ZXh0KSB7XG4gICAgICAgICAgICBpZiAoKG5leHQgPSB0b2tlbnNbaisxXSkgJiYgbmV4dC50YWcgPT0gJz4nKSB7XG4gICAgICAgICAgICAgIC8vIHNldCBpbmRlbnQgdG8gdG9rZW4gdmFsdWVcbiAgICAgICAgICAgICAgbmV4dC5pbmRlbnQgPSB0b2tlbnNbal0udGV4dC50b1N0cmluZygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc3BsaWNlKGosIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghbm9OZXdMaW5lKSB7XG4gICAgICAgIHRva2Vucy5wdXNoKHt0YWc6J1xcbid9KTtcbiAgICAgIH1cblxuICAgICAgc2VlblRhZyA9IGZhbHNlO1xuICAgICAgbGluZVN0YXJ0ID0gdG9rZW5zLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGFuZ2VEZWxpbWl0ZXJzKHRleHQsIGluZGV4KSB7XG4gICAgICB2YXIgY2xvc2UgPSAnPScgKyBjdGFnLFxuICAgICAgICAgIGNsb3NlSW5kZXggPSB0ZXh0LmluZGV4T2YoY2xvc2UsIGluZGV4KSxcbiAgICAgICAgICBkZWxpbWl0ZXJzID0gdHJpbShcbiAgICAgICAgICAgIHRleHQuc3Vic3RyaW5nKHRleHQuaW5kZXhPZignPScsIGluZGV4KSArIDEsIGNsb3NlSW5kZXgpXG4gICAgICAgICAgKS5zcGxpdCgnICcpO1xuXG4gICAgICBvdGFnID0gZGVsaW1pdGVyc1swXTtcbiAgICAgIGN0YWcgPSBkZWxpbWl0ZXJzW2RlbGltaXRlcnMubGVuZ3RoIC0gMV07XG5cbiAgICAgIHJldHVybiBjbG9zZUluZGV4ICsgY2xvc2UubGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICBpZiAoZGVsaW1pdGVycykge1xuICAgICAgZGVsaW1pdGVycyA9IGRlbGltaXRlcnMuc3BsaXQoJyAnKTtcbiAgICAgIG90YWcgPSBkZWxpbWl0ZXJzWzBdO1xuICAgICAgY3RhZyA9IGRlbGltaXRlcnNbMV07XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAoc3RhdGUgPT0gSU5fVEVYVCkge1xuICAgICAgICBpZiAodGFnQ2hhbmdlKG90YWcsIHRleHQsIGkpKSB7XG4gICAgICAgICAgLS1pO1xuICAgICAgICAgIGFkZEJ1ZigpO1xuICAgICAgICAgIHN0YXRlID0gSU5fVEFHX1RZUEU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRleHQuY2hhckF0KGkpID09ICdcXG4nKSB7XG4gICAgICAgICAgICBmaWx0ZXJMaW5lKHNlZW5UYWcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBidWYgKz0gdGV4dC5jaGFyQXQoaSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09IElOX1RBR19UWVBFKSB7XG4gICAgICAgIGkgKz0gb3RhZy5sZW5ndGggLSAxO1xuICAgICAgICB0YWcgPSBIb2dhbi50YWdzW3RleHQuY2hhckF0KGkgKyAxKV07XG4gICAgICAgIHRhZ1R5cGUgPSB0YWcgPyB0ZXh0LmNoYXJBdChpICsgMSkgOiAnX3YnO1xuICAgICAgICBpZiAodGFnVHlwZSA9PSAnPScpIHtcbiAgICAgICAgICBpID0gY2hhbmdlRGVsaW1pdGVycyh0ZXh0LCBpKTtcbiAgICAgICAgICBzdGF0ZSA9IElOX1RFWFQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRhZykge1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZSA9IElOX1RBRztcbiAgICAgICAgfVxuICAgICAgICBzZWVuVGFnID0gaTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0YWdDaGFuZ2UoY3RhZywgdGV4dCwgaSkpIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh7dGFnOiB0YWdUeXBlLCBuOiB0cmltKGJ1ZiksIG90YWc6IG90YWcsIGN0YWc6IGN0YWcsXG4gICAgICAgICAgICAgICAgICAgICAgIGk6ICh0YWdUeXBlID09ICcvJykgPyBzZWVuVGFnIC0gb3RhZy5sZW5ndGggOiBpICsgY3RhZy5sZW5ndGh9KTtcbiAgICAgICAgICBidWYgPSAnJztcbiAgICAgICAgICBpICs9IGN0YWcubGVuZ3RoIC0gMTtcbiAgICAgICAgICBzdGF0ZSA9IElOX1RFWFQ7XG4gICAgICAgICAgaWYgKHRhZ1R5cGUgPT0gJ3snKSB7XG4gICAgICAgICAgICBpZiAoY3RhZyA9PSAnfX0nKSB7XG4gICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNsZWFuVHJpcGxlU3RhY2hlKHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWYgKz0gdGV4dC5jaGFyQXQoaSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWx0ZXJMaW5lKHNlZW5UYWcsIHRydWUpO1xuXG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFuVHJpcGxlU3RhY2hlKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLm4uc3Vic3RyKHRva2VuLm4ubGVuZ3RoIC0gMSkgPT09ICd9Jykge1xuICAgICAgdG9rZW4ubiA9IHRva2VuLm4uc3Vic3RyaW5nKDAsIHRva2VuLm4ubGVuZ3RoIC0gMSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdHJpbShzKSB7XG4gICAgaWYgKHMudHJpbSkge1xuICAgICAgcmV0dXJuIHMudHJpbSgpO1xuICAgIH1cblxuICAgIHJldHVybiBzLnJlcGxhY2UoL15cXHMqfFxccyokL2csICcnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ0NoYW5nZSh0YWcsIHRleHQsIGluZGV4KSB7XG4gICAgaWYgKHRleHQuY2hhckF0KGluZGV4KSAhPSB0YWcuY2hhckF0KDApKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDEsIGwgPSB0YWcubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAodGV4dC5jaGFyQXQoaW5kZXggKyBpKSAhPSB0YWcuY2hhckF0KGkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHRoZSB0YWdzIGFsbG93ZWQgaW5zaWRlIHN1cGVyIHRlbXBsYXRlc1xuICB2YXIgYWxsb3dlZEluU3VwZXIgPSB7J190JzogdHJ1ZSwgJ1xcbic6IHRydWUsICckJzogdHJ1ZSwgJy8nOiB0cnVlfTtcblxuICBmdW5jdGlvbiBidWlsZFRyZWUodG9rZW5zLCBraW5kLCBzdGFjaywgY3VzdG9tVGFncykge1xuICAgIHZhciBpbnN0cnVjdGlvbnMgPSBbXSxcbiAgICAgICAgb3BlbmVyID0gbnVsbCxcbiAgICAgICAgdGFpbCA9IG51bGwsXG4gICAgICAgIHRva2VuID0gbnVsbDtcblxuICAgIHRhaWwgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcblxuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKTtcblxuICAgICAgaWYgKHRhaWwgJiYgdGFpbC50YWcgPT0gJzwnICYmICEodG9rZW4udGFnIGluIGFsbG93ZWRJblN1cGVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgY29udGVudCBpbiA8IHN1cGVyIHRhZy4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKEhvZ2FuLnRhZ3NbdG9rZW4udGFnXSA8PSBIb2dhbi50YWdzWyckJ10gfHwgaXNPcGVuZXIodG9rZW4sIGN1c3RvbVRhZ3MpKSB7XG4gICAgICAgIHN0YWNrLnB1c2godG9rZW4pO1xuICAgICAgICB0b2tlbi5ub2RlcyA9IGJ1aWxkVHJlZSh0b2tlbnMsIHRva2VuLnRhZywgc3RhY2ssIGN1c3RvbVRhZ3MpO1xuICAgICAgfSBlbHNlIGlmICh0b2tlbi50YWcgPT0gJy8nKSB7XG4gICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nsb3NpbmcgdGFnIHdpdGhvdXQgb3BlbmVyOiAvJyArIHRva2VuLm4pO1xuICAgICAgICB9XG4gICAgICAgIG9wZW5lciA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAodG9rZW4ubiAhPSBvcGVuZXIubiAmJiAhaXNDbG9zZXIodG9rZW4ubiwgb3BlbmVyLm4sIGN1c3RvbVRhZ3MpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZXN0aW5nIGVycm9yOiAnICsgb3BlbmVyLm4gKyAnIHZzLiAnICsgdG9rZW4ubik7XG4gICAgICAgIH1cbiAgICAgICAgb3BlbmVyLmVuZCA9IHRva2VuLmk7XG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvbnM7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuLnRhZyA9PSAnXFxuJykge1xuICAgICAgICB0b2tlbi5sYXN0ID0gKHRva2Vucy5sZW5ndGggPT0gMCkgfHwgKHRva2Vuc1swXS50YWcgPT0gJ1xcbicpO1xuICAgICAgfVxuXG4gICAgICBpbnN0cnVjdGlvbnMucHVzaCh0b2tlbik7XG4gICAgfVxuXG4gICAgaWYgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBjbG9zaW5nIHRhZzogJyArIHN0YWNrLnBvcCgpLm4pO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0cnVjdGlvbnM7XG4gIH1cblxuICBmdW5jdGlvbiBpc09wZW5lcih0b2tlbiwgdGFncykge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGFncy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0YWdzW2ldLm8gPT0gdG9rZW4ubikge1xuICAgICAgICB0b2tlbi50YWcgPSAnIyc7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQ2xvc2VyKGNsb3NlLCBvcGVuLCB0YWdzKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0YWdzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKHRhZ3NbaV0uYyA9PSBjbG9zZSAmJiB0YWdzW2ldLm8gPT0gb3Blbikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdHJpbmdpZnlTdWJzdGl0dXRpb25zKG9iaikge1xuICAgIHZhciBpdGVtcyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGl0ZW1zLnB1c2goJ1wiJyArIGVzYyhrZXkpICsgJ1wiOiBmdW5jdGlvbihjLHAsdCxpKSB7JyArIG9ialtrZXldICsgJ30nKTtcbiAgICB9XG4gICAgcmV0dXJuIFwieyBcIiArIGl0ZW1zLmpvaW4oXCIsXCIpICsgXCIgfVwiO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RyaW5naWZ5UGFydGlhbHMoY29kZU9iaikge1xuICAgIHZhciBwYXJ0aWFscyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBjb2RlT2JqLnBhcnRpYWxzKSB7XG4gICAgICBwYXJ0aWFscy5wdXNoKCdcIicgKyBlc2Moa2V5KSArICdcIjp7bmFtZTpcIicgKyBlc2MoY29kZU9iai5wYXJ0aWFsc1trZXldLm5hbWUpICsgJ1wiLCAnICsgc3RyaW5naWZ5UGFydGlhbHMoY29kZU9iai5wYXJ0aWFsc1trZXldKSArIFwifVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIFwicGFydGlhbHM6IHtcIiArIHBhcnRpYWxzLmpvaW4oXCIsXCIpICsgXCJ9LCBzdWJzOiBcIiArIHN0cmluZ2lmeVN1YnN0aXR1dGlvbnMoY29kZU9iai5zdWJzKTtcbiAgfVxuXG4gIEhvZ2FuLnN0cmluZ2lmeSA9IGZ1bmN0aW9uKGNvZGVPYmosIHRleHQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gXCJ7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IFwiICsgSG9nYW4ud3JhcE1haW4oY29kZU9iai5jb2RlKSArIFwiIH0sXCIgKyBzdHJpbmdpZnlQYXJ0aWFscyhjb2RlT2JqKSArICBcIn1cIjtcbiAgfVxuXG4gIHZhciBzZXJpYWxObyA9IDA7XG4gIEhvZ2FuLmdlbmVyYXRlID0gZnVuY3Rpb24odHJlZSwgdGV4dCwgb3B0aW9ucykge1xuICAgIHNlcmlhbE5vID0gMDtcbiAgICB2YXIgY29udGV4dCA9IHsgY29kZTogJycsIHN1YnM6IHt9LCBwYXJ0aWFsczoge30gfTtcbiAgICBIb2dhbi53YWxrKHRyZWUsIGNvbnRleHQpO1xuXG4gICAgaWYgKG9wdGlvbnMuYXNTdHJpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmluZ2lmeShjb250ZXh0LCB0ZXh0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tYWtlVGVtcGxhdGUoY29udGV4dCwgdGV4dCwgb3B0aW9ucyk7XG4gIH1cblxuICBIb2dhbi53cmFwTWFpbiA9IGZ1bmN0aW9uKGNvZGUpIHtcbiAgICByZXR1cm4gJ3ZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7JyArIGNvZGUgKyAncmV0dXJuIHQuZmwoKTsnO1xuICB9XG5cbiAgSG9nYW4udGVtcGxhdGUgPSBIb2dhbi5UZW1wbGF0ZTtcblxuICBIb2dhbi5tYWtlVGVtcGxhdGUgPSBmdW5jdGlvbihjb2RlT2JqLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgdmFyIHRlbXBsYXRlID0gdGhpcy5tYWtlUGFydGlhbHMoY29kZU9iaik7XG4gICAgdGVtcGxhdGUuY29kZSA9IG5ldyBGdW5jdGlvbignYycsICdwJywgJ2knLCB0aGlzLndyYXBNYWluKGNvZGVPYmouY29kZSkpO1xuICAgIHJldHVybiBuZXcgdGhpcy50ZW1wbGF0ZSh0ZW1wbGF0ZSwgdGV4dCwgdGhpcywgb3B0aW9ucyk7XG4gIH1cblxuICBIb2dhbi5tYWtlUGFydGlhbHMgPSBmdW5jdGlvbihjb2RlT2JqKSB7XG4gICAgdmFyIGtleSwgdGVtcGxhdGUgPSB7c3Viczoge30sIHBhcnRpYWxzOiBjb2RlT2JqLnBhcnRpYWxzLCBuYW1lOiBjb2RlT2JqLm5hbWV9O1xuICAgIGZvciAoa2V5IGluIHRlbXBsYXRlLnBhcnRpYWxzKSB7XG4gICAgICB0ZW1wbGF0ZS5wYXJ0aWFsc1trZXldID0gdGhpcy5tYWtlUGFydGlhbHModGVtcGxhdGUucGFydGlhbHNba2V5XSk7XG4gICAgfVxuICAgIGZvciAoa2V5IGluIGNvZGVPYmouc3Vicykge1xuICAgICAgdGVtcGxhdGUuc3Vic1trZXldID0gbmV3IEZ1bmN0aW9uKCdjJywgJ3AnLCAndCcsICdpJywgY29kZU9iai5zdWJzW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH1cblxuICBmdW5jdGlvbiBlc2Mocykge1xuICAgIHJldHVybiBzLnJlcGxhY2UoclNsYXNoLCAnXFxcXFxcXFwnKVxuICAgICAgICAgICAgLnJlcGxhY2UoclF1b3QsICdcXFxcXFxcIicpXG4gICAgICAgICAgICAucmVwbGFjZShyTmV3bGluZSwgJ1xcXFxuJylcbiAgICAgICAgICAgIC5yZXBsYWNlKHJDciwgJ1xcXFxyJylcbiAgICAgICAgICAgIC5yZXBsYWNlKHJMaW5lU2VwLCAnXFxcXHUyMDI4JylcbiAgICAgICAgICAgIC5yZXBsYWNlKHJQYXJhZ3JhcGhTZXAsICdcXFxcdTIwMjknKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNob29zZU1ldGhvZChzKSB7XG4gICAgcmV0dXJuICh+cy5pbmRleE9mKCcuJykpID8gJ2QnIDogJ2YnO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUGFydGlhbChub2RlLCBjb250ZXh0KSB7XG4gICAgdmFyIHByZWZpeCA9IFwiPFwiICsgKGNvbnRleHQucHJlZml4IHx8IFwiXCIpO1xuICAgIHZhciBzeW0gPSBwcmVmaXggKyBub2RlLm4gKyBzZXJpYWxObysrO1xuICAgIGNvbnRleHQucGFydGlhbHNbc3ltXSA9IHtuYW1lOiBub2RlLm4sIHBhcnRpYWxzOiB7fX07XG4gICAgY29udGV4dC5jb2RlICs9ICd0LmIodC5ycChcIicgKyAgZXNjKHN5bSkgKyAnXCIsYyxwLFwiJyArIChub2RlLmluZGVudCB8fCAnJykgKyAnXCIpKTsnO1xuICAgIHJldHVybiBzeW07XG4gIH1cblxuICBIb2dhbi5jb2RlZ2VuID0ge1xuICAgICcjJzogZnVuY3Rpb24obm9kZSwgY29udGV4dCkge1xuICAgICAgY29udGV4dC5jb2RlICs9ICdpZih0LnModC4nICsgY2hvb3NlTWV0aG9kKG5vZGUubikgKyAnKFwiJyArIGVzYyhub2RlLm4pICsgJ1wiLGMscCwxKSwnICtcbiAgICAgICAgICAgICAgICAgICAgICAnYyxwLDAsJyArIG5vZGUuaSArICcsJyArIG5vZGUuZW5kICsgJyxcIicgKyBub2RlLm90YWcgKyBcIiBcIiArIG5vZGUuY3RhZyArICdcIikpeycgK1xuICAgICAgICAgICAgICAgICAgICAgICd0LnJzKGMscCwnICsgJ2Z1bmN0aW9uKGMscCx0KXsnO1xuICAgICAgSG9nYW4ud2Fsayhub2RlLm5vZGVzLCBjb250ZXh0KTtcbiAgICAgIGNvbnRleHQuY29kZSArPSAnfSk7Yy5wb3AoKTt9JztcbiAgICB9LFxuXG4gICAgJ14nOiBmdW5jdGlvbihub2RlLCBjb250ZXh0KSB7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gJ2lmKCF0LnModC4nICsgY2hvb3NlTWV0aG9kKG5vZGUubikgKyAnKFwiJyArIGVzYyhub2RlLm4pICsgJ1wiLGMscCwxKSxjLHAsMSwwLDAsXCJcIikpeyc7XG4gICAgICBIb2dhbi53YWxrKG5vZGUubm9kZXMsIGNvbnRleHQpO1xuICAgICAgY29udGV4dC5jb2RlICs9ICd9Oyc7XG4gICAgfSxcblxuICAgICc+JzogY3JlYXRlUGFydGlhbCxcbiAgICAnPCc6IGZ1bmN0aW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICAgIHZhciBjdHggPSB7cGFydGlhbHM6IHt9LCBjb2RlOiAnJywgc3Viczoge30sIGluUGFydGlhbDogdHJ1ZX07XG4gICAgICBIb2dhbi53YWxrKG5vZGUubm9kZXMsIGN0eCk7XG4gICAgICB2YXIgdGVtcGxhdGUgPSBjb250ZXh0LnBhcnRpYWxzW2NyZWF0ZVBhcnRpYWwobm9kZSwgY29udGV4dCldO1xuICAgICAgdGVtcGxhdGUuc3VicyA9IGN0eC5zdWJzO1xuICAgICAgdGVtcGxhdGUucGFydGlhbHMgPSBjdHgucGFydGlhbHM7XG4gICAgfSxcblxuICAgICckJzogZnVuY3Rpb24obm9kZSwgY29udGV4dCkge1xuICAgICAgdmFyIGN0eCA9IHtzdWJzOiB7fSwgY29kZTogJycsIHBhcnRpYWxzOiBjb250ZXh0LnBhcnRpYWxzLCBwcmVmaXg6IG5vZGUubn07XG4gICAgICBIb2dhbi53YWxrKG5vZGUubm9kZXMsIGN0eCk7XG4gICAgICBjb250ZXh0LnN1YnNbbm9kZS5uXSA9IGN0eC5jb2RlO1xuICAgICAgaWYgKCFjb250ZXh0LmluUGFydGlhbCkge1xuICAgICAgICBjb250ZXh0LmNvZGUgKz0gJ3Quc3ViKFwiJyArIGVzYyhub2RlLm4pICsgJ1wiLGMscCxpKTsnO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAnXFxuJzogZnVuY3Rpb24obm9kZSwgY29udGV4dCkge1xuICAgICAgY29udGV4dC5jb2RlICs9IHdyaXRlKCdcIlxcXFxuXCInICsgKG5vZGUubGFzdCA/ICcnIDogJyArIGknKSk7XG4gICAgfSxcblxuICAgICdfdic6IGZ1bmN0aW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICAgIGNvbnRleHQuY29kZSArPSAndC5iKHQudih0LicgKyBjaG9vc2VNZXRob2Qobm9kZS5uKSArICcoXCInICsgZXNjKG5vZGUubikgKyAnXCIsYyxwLDApKSk7JztcbiAgICB9LFxuXG4gICAgJ190JzogZnVuY3Rpb24obm9kZSwgY29udGV4dCkge1xuICAgICAgY29udGV4dC5jb2RlICs9IHdyaXRlKCdcIicgKyBlc2Mobm9kZS50ZXh0KSArICdcIicpO1xuICAgIH0sXG5cbiAgICAneyc6IHRyaXBsZVN0YWNoZSxcblxuICAgICcmJzogdHJpcGxlU3RhY2hlXG4gIH1cblxuICBmdW5jdGlvbiB0cmlwbGVTdGFjaGUobm9kZSwgY29udGV4dCkge1xuICAgIGNvbnRleHQuY29kZSArPSAndC5iKHQudCh0LicgKyBjaG9vc2VNZXRob2Qobm9kZS5uKSArICcoXCInICsgZXNjKG5vZGUubikgKyAnXCIsYyxwLDApKSk7JztcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyaXRlKHMpIHtcbiAgICByZXR1cm4gJ3QuYignICsgcyArICcpOyc7XG4gIH1cblxuICBIb2dhbi53YWxrID0gZnVuY3Rpb24obm9kZWxpc3QsIGNvbnRleHQpIHtcbiAgICB2YXIgZnVuYztcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGVsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgZnVuYyA9IEhvZ2FuLmNvZGVnZW5bbm9kZWxpc3RbaV0udGFnXTtcbiAgICAgIGZ1bmMgJiYgZnVuYyhub2RlbGlzdFtpXSwgY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG5cbiAgSG9nYW4ucGFyc2UgPSBmdW5jdGlvbih0b2tlbnMsIHRleHQsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gYnVpbGRUcmVlKHRva2VucywgJycsIFtdLCBvcHRpb25zLnNlY3Rpb25UYWdzIHx8IFtdKTtcbiAgfVxuXG4gIEhvZ2FuLmNhY2hlID0ge307XG5cbiAgSG9nYW4uY2FjaGVLZXkgPSBmdW5jdGlvbih0ZXh0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIFt0ZXh0LCAhIW9wdGlvbnMuYXNTdHJpbmcsICEhb3B0aW9ucy5kaXNhYmxlTGFtYmRhLCBvcHRpb25zLmRlbGltaXRlcnMsICEhb3B0aW9ucy5tb2RlbEdldF0uam9pbignfHwnKTtcbiAgfVxuXG4gIEhvZ2FuLmNvbXBpbGUgPSBmdW5jdGlvbih0ZXh0LCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdmFyIGtleSA9IEhvZ2FuLmNhY2hlS2V5KHRleHQsIG9wdGlvbnMpO1xuICAgIHZhciB0ZW1wbGF0ZSA9IHRoaXMuY2FjaGVba2V5XTtcblxuICAgIGlmICh0ZW1wbGF0ZSkge1xuICAgICAgdmFyIHBhcnRpYWxzID0gdGVtcGxhdGUucGFydGlhbHM7XG4gICAgICBmb3IgKHZhciBuYW1lIGluIHBhcnRpYWxzKSB7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsc1tuYW1lXS5pbnN0YW5jZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICB0ZW1wbGF0ZSA9IHRoaXMuZ2VuZXJhdGUodGhpcy5wYXJzZSh0aGlzLnNjYW4odGV4dCwgb3B0aW9ucy5kZWxpbWl0ZXJzKSwgdGV4dCwgb3B0aW9ucyksIHRleHQsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlW2tleV0gPSB0ZW1wbGF0ZTtcbiAgfVxufSkodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnID8gZXhwb3J0cyA6IEhvZ2FuKTtcbiIsIi8qXG4gKiAgQ29weXJpZ2h0IDIwMTEgVHdpdHRlciwgSW5jLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gVGhpcyBmaWxlIGlzIGZvciB1c2Ugd2l0aCBOb2RlLmpzLiBTZWUgZGlzdC8gZm9yIGJyb3dzZXIgZmlsZXMuXG5cbnZhciBIb2dhbiA9IHJlcXVpcmUoJy4vY29tcGlsZXInKTtcbkhvZ2FuLlRlbXBsYXRlID0gcmVxdWlyZSgnLi90ZW1wbGF0ZScpLlRlbXBsYXRlO1xuSG9nYW4udGVtcGxhdGUgPSBIb2dhbi5UZW1wbGF0ZTtcbm1vZHVsZS5leHBvcnRzID0gSG9nYW47XG4iLCIvKlxuICogIENvcHlyaWdodCAyMDExIFR3aXR0ZXIsIEluYy5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbnZhciBIb2dhbiA9IHt9O1xuXG4oZnVuY3Rpb24gKEhvZ2FuKSB7XG4gIEhvZ2FuLlRlbXBsYXRlID0gZnVuY3Rpb24gKGNvZGVPYmosIHRleHQsIGNvbXBpbGVyLCBvcHRpb25zKSB7XG4gICAgY29kZU9iaiA9IGNvZGVPYmogfHwge307XG4gICAgdGhpcy5yID0gY29kZU9iai5jb2RlIHx8IHRoaXMucjtcbiAgICB0aGlzLmMgPSBjb21waWxlcjtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHRoaXMudGV4dCA9IHRleHQgfHwgJyc7XG4gICAgdGhpcy5wYXJ0aWFscyA9IGNvZGVPYmoucGFydGlhbHMgfHwge307XG4gICAgdGhpcy5zdWJzID0gY29kZU9iai5zdWJzIHx8IHt9O1xuICAgIHRoaXMuYnVmID0gJyc7XG4gIH1cblxuICBIb2dhbi5UZW1wbGF0ZS5wcm90b3R5cGUgPSB7XG4gICAgLy8gcmVuZGVyOiByZXBsYWNlZCBieSBnZW5lcmF0ZWQgY29kZS5cbiAgICByOiBmdW5jdGlvbiAoY29udGV4dCwgcGFydGlhbHMsIGluZGVudCkgeyByZXR1cm4gJyc7IH0sXG5cbiAgICAvLyB2YXJpYWJsZSBlc2NhcGluZ1xuICAgIHY6IGhvZ2FuRXNjYXBlLFxuXG4gICAgLy8gdHJpcGxlIHN0YWNoZVxuICAgIHQ6IGNvZXJjZVRvU3RyaW5nLFxuXG4gICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoY29udGV4dCwgcGFydGlhbHMsIGluZGVudCkge1xuICAgICAgcmV0dXJuIHRoaXMucmkoW2NvbnRleHRdLCBwYXJ0aWFscyB8fCB7fSwgaW5kZW50KTtcbiAgICB9LFxuXG4gICAgLy8gcmVuZGVyIGludGVybmFsIC0tIGEgaG9vayBmb3Igb3ZlcnJpZGVzIHRoYXQgY2F0Y2hlcyBwYXJ0aWFscyB0b29cbiAgICByaTogZnVuY3Rpb24gKGNvbnRleHQsIHBhcnRpYWxzLCBpbmRlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnIoY29udGV4dCwgcGFydGlhbHMsIGluZGVudCk7XG4gICAgfSxcblxuICAgIC8vIGVuc3VyZVBhcnRpYWxcbiAgICBlcDogZnVuY3Rpb24oc3ltYm9sLCBwYXJ0aWFscykge1xuICAgICAgdmFyIHBhcnRpYWwgPSB0aGlzLnBhcnRpYWxzW3N5bWJvbF07XG5cbiAgICAgIC8vIGNoZWNrIHRvIHNlZSB0aGF0IGlmIHdlJ3ZlIGluc3RhbnRpYXRlZCB0aGlzIHBhcnRpYWwgYmVmb3JlXG4gICAgICB2YXIgdGVtcGxhdGUgPSBwYXJ0aWFsc1twYXJ0aWFsLm5hbWVdO1xuICAgICAgaWYgKHBhcnRpYWwuaW5zdGFuY2UgJiYgcGFydGlhbC5iYXNlID09IHRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybiBwYXJ0aWFsLmluc3RhbmNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRlbXBsYXRlID09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICghdGhpcy5jKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29tcGlsZXIgYXZhaWxhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuYy5jb21waWxlKHRlbXBsYXRlLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSB1c2UgdGhpcyB0byBjaGVjayB3aGV0aGVyIHRoZSBwYXJ0aWFscyBkaWN0aW9uYXJ5IGhhcyBjaGFuZ2VkXG4gICAgICB0aGlzLnBhcnRpYWxzW3N5bWJvbF0uYmFzZSA9IHRlbXBsYXRlO1xuXG4gICAgICBpZiAocGFydGlhbC5zdWJzKSB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjb25zaWRlciBwYXJlbnQgdGVtcGxhdGUgbm93XG4gICAgICAgIGlmICghcGFydGlhbHMuc3RhY2tUZXh0KSBwYXJ0aWFscy5zdGFja1RleHQgPSB7fTtcbiAgICAgICAgZm9yIChrZXkgaW4gcGFydGlhbC5zdWJzKSB7XG4gICAgICAgICAgaWYgKCFwYXJ0aWFscy5zdGFja1RleHRba2V5XSkge1xuICAgICAgICAgICAgcGFydGlhbHMuc3RhY2tUZXh0W2tleV0gPSAodGhpcy5hY3RpdmVTdWIgIT09IHVuZGVmaW5lZCAmJiBwYXJ0aWFscy5zdGFja1RleHRbdGhpcy5hY3RpdmVTdWJdKSA/IHBhcnRpYWxzLnN0YWNrVGV4dFt0aGlzLmFjdGl2ZVN1Yl0gOiB0aGlzLnRleHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlID0gY3JlYXRlU3BlY2lhbGl6ZWRQYXJ0aWFsKHRlbXBsYXRlLCBwYXJ0aWFsLnN1YnMsIHBhcnRpYWwucGFydGlhbHMsXG4gICAgICAgICAgdGhpcy5zdGFja1N1YnMsIHRoaXMuc3RhY2tQYXJ0aWFscywgcGFydGlhbHMuc3RhY2tUZXh0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFydGlhbHNbc3ltYm9sXS5pbnN0YW5jZSA9IHRlbXBsYXRlO1xuXG4gICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgfSxcblxuICAgIC8vIHRyaWVzIHRvIGZpbmQgYSBwYXJ0aWFsIGluIHRoZSBjdXJyZW50IHNjb3BlIGFuZCByZW5kZXIgaXRcbiAgICBycDogZnVuY3Rpb24oc3ltYm9sLCBjb250ZXh0LCBwYXJ0aWFscywgaW5kZW50KSB7XG4gICAgICB2YXIgcGFydGlhbCA9IHRoaXMuZXAoc3ltYm9sLCBwYXJ0aWFscyk7XG4gICAgICBpZiAoIXBhcnRpYWwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFydGlhbC5yaShjb250ZXh0LCBwYXJ0aWFscywgaW5kZW50KTtcbiAgICB9LFxuXG4gICAgLy8gcmVuZGVyIGEgc2VjdGlvblxuICAgIHJzOiBmdW5jdGlvbihjb250ZXh0LCBwYXJ0aWFscywgc2VjdGlvbikge1xuICAgICAgdmFyIHRhaWwgPSBjb250ZXh0W2NvbnRleHQubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmICghaXNBcnJheSh0YWlsKSkge1xuICAgICAgICBzZWN0aW9uKGNvbnRleHQsIHBhcnRpYWxzLCB0aGlzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhaWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29udGV4dC5wdXNoKHRhaWxbaV0pO1xuICAgICAgICBzZWN0aW9uKGNvbnRleHQsIHBhcnRpYWxzLCB0aGlzKTtcbiAgICAgICAgY29udGV4dC5wb3AoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gbWF5YmUgc3RhcnQgYSBzZWN0aW9uXG4gICAgczogZnVuY3Rpb24odmFsLCBjdHgsIHBhcnRpYWxzLCBpbnZlcnRlZCwgc3RhcnQsIGVuZCwgdGFncykge1xuICAgICAgdmFyIHBhc3M7XG5cbiAgICAgIGlmIChpc0FycmF5KHZhbCkgJiYgdmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsID0gdGhpcy5tcyh2YWwsIGN0eCwgcGFydGlhbHMsIGludmVydGVkLCBzdGFydCwgZW5kLCB0YWdzKTtcbiAgICAgIH1cblxuICAgICAgcGFzcyA9ICEhdmFsO1xuXG4gICAgICBpZiAoIWludmVydGVkICYmIHBhc3MgJiYgY3R4KSB7XG4gICAgICAgIGN0eC5wdXNoKCh0eXBlb2YgdmFsID09ICdvYmplY3QnKSA/IHZhbCA6IGN0eFtjdHgubGVuZ3RoIC0gMV0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFzcztcbiAgICB9LFxuXG4gICAgLy8gZmluZCB2YWx1ZXMgd2l0aCBkb3R0ZWQgbmFtZXNcbiAgICBkOiBmdW5jdGlvbihrZXksIGN0eCwgcGFydGlhbHMsIHJldHVybkZvdW5kKSB7XG4gICAgICB2YXIgZm91bmQsXG4gICAgICAgICAgbmFtZXMgPSBrZXkuc3BsaXQoJy4nKSxcbiAgICAgICAgICB2YWwgPSB0aGlzLmYobmFtZXNbMF0sIGN0eCwgcGFydGlhbHMsIHJldHVybkZvdW5kKSxcbiAgICAgICAgICBkb01vZGVsR2V0ID0gdGhpcy5vcHRpb25zLm1vZGVsR2V0LFxuICAgICAgICAgIGN4ID0gbnVsbDtcblxuICAgICAgaWYgKGtleSA9PT0gJy4nICYmIGlzQXJyYXkoY3R4W2N0eC5sZW5ndGggLSAyXSkpIHtcbiAgICAgICAgdmFsID0gY3R4W2N0eC5sZW5ndGggLSAxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBmb3VuZCA9IGZpbmRJblNjb3BlKG5hbWVzW2ldLCB2YWwsIGRvTW9kZWxHZXQpO1xuICAgICAgICAgIGlmIChmb3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjeCA9IHZhbDtcbiAgICAgICAgICAgIHZhbCA9IGZvdW5kO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWwgPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJldHVybkZvdW5kICYmICF2YWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJldHVybkZvdW5kICYmIHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjdHgucHVzaChjeCk7XG4gICAgICAgIHZhbCA9IHRoaXMubXYodmFsLCBjdHgsIHBhcnRpYWxzKTtcbiAgICAgICAgY3R4LnBvcCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICAvLyBmaW5kIHZhbHVlcyB3aXRoIG5vcm1hbCBuYW1lc1xuICAgIGY6IGZ1bmN0aW9uKGtleSwgY3R4LCBwYXJ0aWFscywgcmV0dXJuRm91bmQpIHtcbiAgICAgIHZhciB2YWwgPSBmYWxzZSxcbiAgICAgICAgICB2ID0gbnVsbCxcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlLFxuICAgICAgICAgIGRvTW9kZWxHZXQgPSB0aGlzLm9wdGlvbnMubW9kZWxHZXQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSBjdHgubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdiA9IGN0eFtpXTtcbiAgICAgICAgdmFsID0gZmluZEluU2NvcGUoa2V5LCB2LCBkb01vZGVsR2V0KTtcbiAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgcmV0dXJuIChyZXR1cm5Gb3VuZCkgPyBmYWxzZSA6IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmV0dXJuRm91bmQgJiYgdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbCA9IHRoaXMubXYodmFsLCBjdHgsIHBhcnRpYWxzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgLy8gaGlnaGVyIG9yZGVyIHRlbXBsYXRlc1xuICAgIGxzOiBmdW5jdGlvbihmdW5jLCBjeCwgcGFydGlhbHMsIHRleHQsIHRhZ3MpIHtcbiAgICAgIHZhciBvbGRUYWdzID0gdGhpcy5vcHRpb25zLmRlbGltaXRlcnM7XG5cbiAgICAgIHRoaXMub3B0aW9ucy5kZWxpbWl0ZXJzID0gdGFncztcbiAgICAgIHRoaXMuYih0aGlzLmN0KGNvZXJjZVRvU3RyaW5nKGZ1bmMuY2FsbChjeCwgdGV4dCkpLCBjeCwgcGFydGlhbHMpKTtcbiAgICAgIHRoaXMub3B0aW9ucy5kZWxpbWl0ZXJzID0gb2xkVGFncztcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvLyBjb21waWxlIHRleHRcbiAgICBjdDogZnVuY3Rpb24odGV4dCwgY3gsIHBhcnRpYWxzKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVMYW1iZGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMYW1iZGEgZmVhdHVyZXMgZGlzYWJsZWQuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jLmNvbXBpbGUodGV4dCwgdGhpcy5vcHRpb25zKS5yZW5kZXIoY3gsIHBhcnRpYWxzKTtcbiAgICB9LFxuXG4gICAgLy8gdGVtcGxhdGUgcmVzdWx0IGJ1ZmZlcmluZ1xuICAgIGI6IGZ1bmN0aW9uKHMpIHsgdGhpcy5idWYgKz0gczsgfSxcblxuICAgIGZsOiBmdW5jdGlvbigpIHsgdmFyIHIgPSB0aGlzLmJ1ZjsgdGhpcy5idWYgPSAnJzsgcmV0dXJuIHI7IH0sXG5cbiAgICAvLyBtZXRob2QgcmVwbGFjZSBzZWN0aW9uXG4gICAgbXM6IGZ1bmN0aW9uKGZ1bmMsIGN0eCwgcGFydGlhbHMsIGludmVydGVkLCBzdGFydCwgZW5kLCB0YWdzKSB7XG4gICAgICB2YXIgdGV4dFNvdXJjZSxcbiAgICAgICAgICBjeCA9IGN0eFtjdHgubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgcmVzdWx0ID0gZnVuYy5jYWxsKGN4KTtcblxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoaW52ZXJ0ZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXh0U291cmNlID0gKHRoaXMuYWN0aXZlU3ViICYmIHRoaXMuc3Vic1RleHQgJiYgdGhpcy5zdWJzVGV4dFt0aGlzLmFjdGl2ZVN1Yl0pID8gdGhpcy5zdWJzVGV4dFt0aGlzLmFjdGl2ZVN1Yl0gOiB0aGlzLnRleHQ7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubHMocmVzdWx0LCBjeCwgcGFydGlhbHMsIHRleHRTb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLCB0YWdzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICAvLyBtZXRob2QgcmVwbGFjZSB2YXJpYWJsZVxuICAgIG12OiBmdW5jdGlvbihmdW5jLCBjdHgsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgY3ggPSBjdHhbY3R4Lmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuY2FsbChjeCk7XG5cbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3QoY29lcmNlVG9TdHJpbmcocmVzdWx0LmNhbGwoY3gpKSwgY3gsIHBhcnRpYWxzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgc3ViOiBmdW5jdGlvbihuYW1lLCBjb250ZXh0LCBwYXJ0aWFscywgaW5kZW50KSB7XG4gICAgICB2YXIgZiA9IHRoaXMuc3Vic1tuYW1lXTtcbiAgICAgIGlmIChmKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlU3ViID0gbmFtZTtcbiAgICAgICAgZihjb250ZXh0LCBwYXJ0aWFscywgdGhpcywgaW5kZW50KTtcbiAgICAgICAgdGhpcy5hY3RpdmVTdWIgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgfTtcblxuICAvL0ZpbmQgYSBrZXkgaW4gYW4gb2JqZWN0XG4gIGZ1bmN0aW9uIGZpbmRJblNjb3BlKGtleSwgc2NvcGUsIGRvTW9kZWxHZXQpIHtcbiAgICB2YXIgdmFsO1xuXG4gICAgaWYgKHNjb3BlICYmIHR5cGVvZiBzY29wZSA9PSAnb2JqZWN0Jykge1xuXG4gICAgICBpZiAoc2NvcGVba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbCA9IHNjb3BlW2tleV07XG5cbiAgICAgIC8vIHRyeSBsb29rdXAgd2l0aCBnZXQgZm9yIGJhY2tib25lIG9yIHNpbWlsYXIgbW9kZWwgZGF0YVxuICAgICAgfSBlbHNlIGlmIChkb01vZGVsR2V0ICYmIHNjb3BlLmdldCAmJiB0eXBlb2Ygc2NvcGUuZ2V0ID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsID0gc2NvcGUuZ2V0KGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVNwZWNpYWxpemVkUGFydGlhbChpbnN0YW5jZSwgc3VicywgcGFydGlhbHMsIHN0YWNrU3Vicywgc3RhY2tQYXJ0aWFscywgc3RhY2tUZXh0KSB7XG4gICAgZnVuY3Rpb24gUGFydGlhbFRlbXBsYXRlKCkge307XG4gICAgUGFydGlhbFRlbXBsYXRlLnByb3RvdHlwZSA9IGluc3RhbmNlO1xuICAgIGZ1bmN0aW9uIFN1YnN0aXR1dGlvbnMoKSB7fTtcbiAgICBTdWJzdGl0dXRpb25zLnByb3RvdHlwZSA9IGluc3RhbmNlLnN1YnM7XG4gICAgdmFyIGtleTtcbiAgICB2YXIgcGFydGlhbCA9IG5ldyBQYXJ0aWFsVGVtcGxhdGUoKTtcbiAgICBwYXJ0aWFsLnN1YnMgPSBuZXcgU3Vic3RpdHV0aW9ucygpO1xuICAgIHBhcnRpYWwuc3Vic1RleHQgPSB7fTsgIC8vaGVoZS4gc3Vic3RleHQuXG4gICAgcGFydGlhbC5idWYgPSAnJztcblxuICAgIHN0YWNrU3VicyA9IHN0YWNrU3VicyB8fCB7fTtcbiAgICBwYXJ0aWFsLnN0YWNrU3VicyA9IHN0YWNrU3VicztcbiAgICBwYXJ0aWFsLnN1YnNUZXh0ID0gc3RhY2tUZXh0O1xuICAgIGZvciAoa2V5IGluIHN1YnMpIHtcbiAgICAgIGlmICghc3RhY2tTdWJzW2tleV0pIHN0YWNrU3Vic1trZXldID0gc3Vic1trZXldO1xuICAgIH1cbiAgICBmb3IgKGtleSBpbiBzdGFja1N1YnMpIHtcbiAgICAgIHBhcnRpYWwuc3Vic1trZXldID0gc3RhY2tTdWJzW2tleV07XG4gICAgfVxuXG4gICAgc3RhY2tQYXJ0aWFscyA9IHN0YWNrUGFydGlhbHMgfHwge307XG4gICAgcGFydGlhbC5zdGFja1BhcnRpYWxzID0gc3RhY2tQYXJ0aWFscztcbiAgICBmb3IgKGtleSBpbiBwYXJ0aWFscykge1xuICAgICAgaWYgKCFzdGFja1BhcnRpYWxzW2tleV0pIHN0YWNrUGFydGlhbHNba2V5XSA9IHBhcnRpYWxzW2tleV07XG4gICAgfVxuICAgIGZvciAoa2V5IGluIHN0YWNrUGFydGlhbHMpIHtcbiAgICAgIHBhcnRpYWwucGFydGlhbHNba2V5XSA9IHN0YWNrUGFydGlhbHNba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydGlhbDtcbiAgfVxuXG4gIHZhciByQW1wID0gLyYvZyxcbiAgICAgIHJMdCA9IC88L2csXG4gICAgICByR3QgPSAvPi9nLFxuICAgICAgckFwb3MgPSAvXFwnL2csXG4gICAgICByUXVvdCA9IC9cXFwiL2csXG4gICAgICBoQ2hhcnMgPSAvWyY8PlxcXCJcXCddLztcblxuICBmdW5jdGlvbiBjb2VyY2VUb1N0cmluZyh2YWwpIHtcbiAgICByZXR1cm4gU3RyaW5nKCh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpID8gJycgOiB2YWwpO1xuICB9XG5cbiAgZnVuY3Rpb24gaG9nYW5Fc2NhcGUoc3RyKSB7XG4gICAgc3RyID0gY29lcmNlVG9TdHJpbmcoc3RyKTtcbiAgICByZXR1cm4gaENoYXJzLnRlc3Qoc3RyKSA/XG4gICAgICBzdHJcbiAgICAgICAgLnJlcGxhY2UockFtcCwgJyZhbXA7JylcbiAgICAgICAgLnJlcGxhY2Uockx0LCAnJmx0OycpXG4gICAgICAgIC5yZXBsYWNlKHJHdCwgJyZndDsnKVxuICAgICAgICAucmVwbGFjZShyQXBvcywgJyYjMzk7JylcbiAgICAgICAgLnJlcGxhY2UoclF1b3QsICcmcXVvdDsnKSA6XG4gICAgICBzdHI7XG4gIH1cblxuICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oYSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gIH07XG5cbn0pKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJyA/IGV4cG9ydHMgOiBIb2dhbik7XG4iLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxsaVwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgaWQ9XFxcImFwcGVhcmFuY2UtaXRlbS1cIik7dC5iKHQudih0LmYoXCJpdGVtaWRcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtIGdyb3VwLVwiKTt0LmIodC52KHQuZihcImdyb3VwXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgZGF0YS1pdGVtaWQ9XFxcIlwiKTt0LmIodC52KHQuZihcIml0ZW1pZFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGRhdGEtbmFtZT1cXFwiXCIpO3QuYih0LnYodC5mKFwibmFtZVwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGRhdGEtcmFyaXR5PVxcXCJcIik7dC5iKHQudih0LmYoXCJyYXJpdHlcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBkYXRhLXJhcml0eW5hbWU9XFxcIlwiKTt0LmIodC52KHQuZihcInJhcml0eW5hbWVcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGRpdiBjbGFzcz1cXFwicmFyaXR5LW1hcmtlci1cIik7dC5iKHQudih0LmYoXCJyYXJpdHlcIixjLHAsMCkpKTt0LmIoXCJcXFwiPjwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGltZyBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtLWljb25cXFwiIHNyYz1cXFwiXCIpO3QuYih0LnYodC5mKFwiaWNvblwiLGMscCwwKSkpO3QuYihcIlxcXCIgLz5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2xpPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxsaVxcbiAgaWQ9XFxcImFwcGVhcmFuY2UtaXRlbS17e2l0ZW1pZH19XFxcIlxcbiAgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbSBncm91cC17e2dyb3VwfX1cXFwiXFxuICBkYXRhLWl0ZW1pZD1cXFwie3tpdGVtaWR9fVxcXCJcXG4gIGRhdGEtbmFtZT1cXFwie3tuYW1lfX1cXFwiXFxuICBkYXRhLXJhcml0eT1cXFwie3tyYXJpdHl9fVxcXCJcXG4gIGRhdGEtcmFyaXR5bmFtZT1cXFwie3tyYXJpdHluYW1lfX1cXFwiXFxuPlxcbiAgPGRpdiBjbGFzcz1cXFwicmFyaXR5LW1hcmtlci17e3Jhcml0eX19XFxcIj48L2Rpdj5cXG4gIDxpbWcgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbS1pY29uXFxcIiBzcmM9XFxcInt7aWNvbn19XFxcIiAvPlxcbjwvbGk+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8ZGl2XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBpZD1cXFwiZWUtY2F0ZWdvcnlcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeSBhY3RpdmVcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBkYXRhLWNhdGVnb3J5PVxcXCJcIik7dC5iKHQudih0LmYoXCJjYXRlZ29yeVwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGRhdGEtY2F0ZWdvcnlpZD1cXFwiXCIpO3QuYih0LnYodC5mKFwiY2F0ZWdvcnlpZFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8c3R5bGU+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICNlZS1pdGVtcyB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgc2Nyb2xsYmFyLWNvbG9yOiBkYXJrO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPC9zdHlsZT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDx1bFwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtcy1saXN0XFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBpZD1cXFwiZWUtaXRlbXNcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHN0eWxlPVxcXCJtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNTY1cHgpXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBcIik7dC5iKHQudCh0LmYoXCJpdGVtc1wiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8L3VsPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwhLS0gSW5mbyAtLT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxkaXYgaWQ9XFxcImVlLWluZm9cXFwiIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW1zLWluZm9cXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8ZGl2IGNsYXNzPVxcXCJhcHBlYXJhbmNlLWluZm8tdGlwc1xcXCI+PC9kaXY+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8aDMgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbS1pbmZvLW5hbWVcXFwiPjwvaDM+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8ZGl2IGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW0taW5mby1ndWFyZFxcXCI+PC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxkaXYgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbS1pbmZvLXJhcml0eVxcXCI+PC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxkaXYgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbS1pbmZvLWJ1dHRvbnNcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDxkaXYgY2xhc3M9XFxcImFwcGVhcmFuY2UtZm9yd2FyZCBubC1idXR0b25cXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLmFwcGVhcmFuY2UuYnV0dG9ucy5mb3J3YXJkXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8ZGl2IGNsYXNzPVxcXCJhcHBlYXJhbmNlLWJhY2t3YXJkIG5sLWJ1dHRvblxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUuYXBwZWFyYW5jZS5idXR0b25zLmJhY2t3YXJkXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8ZGl2XFxuICBpZD1cXFwiZWUtY2F0ZWdvcnlcXFwiXFxuICBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeSBhY3RpdmVcXFwiXFxuICBkYXRhLWNhdGVnb3J5PVxcXCJ7e2NhdGVnb3J5fX1cXFwiXFxuICBkYXRhLWNhdGVnb3J5aWQ9XFxcInt7Y2F0ZWdvcnlpZH19XFxcIlxcbj5cXG4gIDxzdHlsZT5cXG4gICAgI2VlLWl0ZW1zIHtcXG4gICAgICBzY3JvbGxiYXItY29sb3I6IGRhcms7XFxuICAgICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xcbiAgICB9XFxuICA8L3N0eWxlPlxcbiAgPHVsXFxuICAgIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW1zLWxpc3RcXFwiXFxuICAgIGlkPVxcXCJlZS1pdGVtc1xcXCJcXG4gICAgc3R5bGU9XFxcIm1heC1oZWlnaHQ6IGNhbGMoMTAwdmggLSA1NjVweClcXFwiXFxuICA+XFxuICAgIHt7e2l0ZW1zfX19XFxuICA8L3VsPlxcblxcbiAgPCEtLSBJbmZvIC0tPlxcbiAgPGRpdiBpZD1cXFwiZWUtaW5mb1xcXCIgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbXMtaW5mb1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImFwcGVhcmFuY2UtaW5mby10aXBzXFxcIj48L2Rpdj5cXG5cXG4gICAgPGgzIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW0taW5mby1uYW1lXFxcIj48L2gzPlxcblxcbiAgICA8ZGl2IGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW0taW5mby1ndWFyZFxcXCI+PC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbS1pbmZvLXJhcml0eVxcXCI+PC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbS1pbmZvLWJ1dHRvbnNcXFwiPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImFwcGVhcmFuY2UtZm9yd2FyZCBubC1idXR0b25cXFwiPlxcbiAgICAgICAge3t0cmFuc2xhdGUuYXBwZWFyYW5jZS5idXR0b25zLmZvcndhcmR9fVxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImFwcGVhcmFuY2UtYmFja3dhcmQgbmwtYnV0dG9uXFxcIj5cXG4gICAgICAgIHt7dHJhbnNsYXRlLmFwcGVhcmFuY2UuYnV0dG9ucy5iYWNrd2FyZH19XFxuICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+XFxuPC9kaXY+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8ZGl2XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBpZD1cXFwiYXBwZWFyYW5jZS1pdGVtcy1ncm91cC1cIik7dC5iKHQudih0LmYoXCJncm91cFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5XFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgZGF0YS1jYXRlZ29yeWlkPVxcXCJcIik7dC5iKHQudih0LmYoXCJjYXRlZ29yeWlkXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgZGF0YS1jYXRlZ29yeT1cXFwiXCIpO3QuYih0LnYodC5mKFwiY2F0ZWdvcnlcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPHVsIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW1zLWxpc3RcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBcIik7dC5iKHQudCh0LmYoXCJpdGVtc1wiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8L3VsPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxkaXZcXG4gIGlkPVxcXCJhcHBlYXJhbmNlLWl0ZW1zLWdyb3VwLXt7Z3JvdXB9fVxcXCJcXG4gIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5XFxcIlxcbiAgZGF0YS1jYXRlZ29yeWlkPVxcXCJ7e2NhdGVnb3J5aWR9fVxcXCJcXG4gIGRhdGEtY2F0ZWdvcnk9XFxcInt7Y2F0ZWdvcnl9fVxcXCJcXG4+XFxuICA8dWwgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbXMtbGlzdFxcXCI+XFxuICAgIHt7e2l0ZW1zfX19XFxuICA8L3VsPlxcbjwvZGl2PlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGRpdlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgaWQ9XFxcIm1hcmtldHBsYWNlLWl0ZW1EZXRhaWwtaW5mby1hdXRvYnV5XFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgc3R5bGU9XFxcInRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luOiAyMHB4IGF1dG9cXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGRpdiBjbGFzcz1cXFwibmwtYnV0dG9uXFxcIj5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0LmFkZF90b193aXNobGlzdC50aXRsZVwiLGMscCwwKSkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxkaXZcXG4gIGlkPVxcXCJtYXJrZXRwbGFjZS1pdGVtRGV0YWlsLWluZm8tYXV0b2J1eVxcXCJcXG4gIHN0eWxlPVxcXCJ0ZXh0LWFsaWduOiBjZW50ZXI7IG1hcmdpbjogMjBweCBhdXRvXFxcIlxcbj5cXG4gIDxkaXYgY2xhc3M9XFxcIm5sLWJ1dHRvblxcXCI+e3t0cmFuc2xhdGUubWFya2V0LmFkZF90b193aXNobGlzdC50aXRsZX19PC9kaXY+XFxuPC9kaXY+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8aDE+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC5hZGRfdG9fd2lzaGxpc3QudGl0bGVcIixjLHAsMCkpKTt0LmIoXCI8L2gxPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjxwPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQuYWRkX3RvX3dpc2hsaXN0LnRleHRcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGgxPnt7dHJhbnNsYXRlLm1hcmtldC5hZGRfdG9fd2lzaGxpc3QudGl0bGV9fTwvaDE+XFxuPHA+e3t0cmFuc2xhdGUubWFya2V0LmFkZF90b193aXNobGlzdC50ZXh0fX08L3A+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8aDE+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hbGwuYWRkX3RvX3dpc2hsaXN0LnRpdGxlXCIsYyxwLDApKSk7dC5iKFwiPC9oMT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8cD5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFsbC5hZGRfdG9fd2lzaGxpc3QudGV4dFwiLGMscCwwKSkpO3QuYihcIjwvcD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8cCBzdHlsZT1cXFwiZm9udC1zaXplOiAxNHB4XFxcIj48ZW0+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hbGwuYWRkX3RvX3dpc2hsaXN0Lm5vdGVcIixjLHAsMCkpKTt0LmIoXCI8L2VtPjwvcD5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8aDE+e3t0cmFuc2xhdGUubWFsbC5hZGRfdG9fd2lzaGxpc3QudGl0bGV9fTwvaDE+XFxuPHA+e3t0cmFuc2xhdGUubWFsbC5hZGRfdG9fd2lzaGxpc3QudGV4dH19PC9wPlxcbjxwIHN0eWxlPVxcXCJmb250LXNpemU6IDE0cHhcXFwiPjxlbT57e3RyYW5zbGF0ZS5tYWxsLmFkZF90b193aXNobGlzdC5ub3RlfX08L2VtPjwvcD5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxidXR0b25cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGlkPVxcXCJhdXRvLWV4cGxvcmUtYnV0dG9uXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgY2xhc3M9XFxcIm5sLWJ1dHRvbiBcIik7aWYodC5zKHQuZihcImFjdGl2ZVwiLGMscCwxKSxjLHAsMCw2NSw3MSxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiYWN0aXZlXCIpO30pO2MucG9wKCk7fXQuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGRhdGEtaWQ9XFxcIlwiKTt0LmIodC52KHQuZihcImxvY2F0aW9uSWRcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBkYXRhLW1hcGlkPVxcXCJcIik7dC5iKHQudih0LmYoXCJyZWdpb25JZFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUucGV0LmF1dG9fZXhwbG9yZVwiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9idXR0b24+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGJ1dHRvblxcbiAgaWQ9XFxcImF1dG8tZXhwbG9yZS1idXR0b25cXFwiXFxuICBjbGFzcz1cXFwibmwtYnV0dG9uIHt7I2FjdGl2ZX19YWN0aXZle3svYWN0aXZlfX1cXFwiXFxuICBkYXRhLWlkPVxcXCJ7e2xvY2F0aW9uSWR9fVxcXCJcXG4gIGRhdGEtbWFwaWQ9XFxcInt7cmVnaW9uSWR9fVxcXCJcXG4+XFxuICB7e3RyYW5zbGF0ZS5wZXQuYXV0b19leHBsb3JlfX1cXG48L2J1dHRvbj5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxhXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBpZD1cXFwiXCIpO3QuYih0LnYodC5mKFwiaWRcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBjbGFzcz1cXFwiY2Fyb3VzZWwtbmV3cyBjYXJvdXNlbC1lZVxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGhyZWY9XFxcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIHN0eWxlPVxcXCJiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIpO3QuYih0LnYodC5mKFwiYmFja2dyb3VuZEltYWdlXCIsYyxwLDApKSk7dC5iKFwiKVxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8ZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8aDQ+XCIpO3QuYih0LnYodC5mKFwiaDRcIixjLHAsMCkpKTt0LmIoXCI8L2g0PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8aDU+XCIpO3QuYih0LnYodC5mKFwiaDVcIixjLHAsMCkpKTt0LmIoXCI8L2g1PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8cD5cIik7dC5iKHQudih0LmYoXCJwXCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9hPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxhXFxuICBpZD1cXFwie3tpZH19XFxcIlxcbiAgY2xhc3M9XFxcImNhcm91c2VsLW5ld3MgY2Fyb3VzZWwtZWVcXFwiXFxuICBocmVmPVxcXCJcXFwiXFxuICBzdHlsZT1cXFwiYmFja2dyb3VuZC1pbWFnZTogdXJsKHt7YmFja2dyb3VuZEltYWdlfX0pXFxcIlxcbj5cXG4gIDxkaXY+XFxuICAgIDxoND57e2g0fX08L2g0PlxcbiAgICA8aDU+e3toNX19PC9oNT5cXG4gICAgPHA+e3twfX08L3A+XFxuICA8L2Rpdj5cXG48L2E+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8aDE+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC5jaGFuZ2VfcHJpY2UudGl0bGVcIixjLHAsMCkpKTt0LmIoXCI8L2gxPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjxwPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQuY2hhbmdlX3ByaWNlLnRleHRcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGgxPnt7dHJhbnNsYXRlLm1hcmtldC5jaGFuZ2VfcHJpY2UudGl0bGV9fTwvaDE+XFxuPHA+e3t0cmFuc2xhdGUubWFya2V0LmNoYW5nZV9wcmljZS50ZXh0fX08L3A+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8aDE+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLmFjY291bnQuY29uZmlybV9yZXNldF90aXRsZVwiLGMscCwwKSkpO3QuYihcIjwvaDE+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPHA+XCIpO3QuYih0LnQodC5kKFwidHJhbnNsYXRlLmFjY291bnQuY29uZmlybV9yZXNldF9jb250ZW50XCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxoMT57e3RyYW5zbGF0ZS5hY2NvdW50LmNvbmZpcm1fcmVzZXRfdGl0bGV9fTwvaDE+XFxuPHA+e3t7dHJhbnNsYXRlLmFjY291bnQuY29uZmlybV9yZXNldF9jb250ZW50fX19PC9wPlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGgxPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuc2F2ZV9vdXRmaXQudGl0bGVcIixjLHAsMCkpKTt0LmIoXCI8L2gxPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8cD5cIik7dC5iKHQudCh0LmQoXCJ0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLnNhdmVfb3V0Zml0LnNhdmVkX2xvY2FsbHlcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjxiciAvPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8cD5cIik7dC5iKHQudCh0LmQoXCJ0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLnNhdmVfb3V0Zml0LmdvdG9fYWNjb3VudFwiLGMscCwwKSkpO3QuYihcIjwvcD5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPGlucHV0XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBpZD1cXFwiY2hvb3NlLW5hbWVcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBtYXhsZW5ndGg9XFxcIjMwXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgbWlubGVuZ3RoPVxcXCIxXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgcGxhY2Vob2xkZXI9XFxcIlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuc2F2ZV9vdXRmaXQucGxhY2Vob2xkZXJcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiLz5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8aDE+e3t0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLnNhdmVfb3V0Zml0LnRpdGxlfX08L2gxPlxcblxcbjxwPnt7e3RyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuc2F2ZV9vdXRmaXQuc2F2ZWRfbG9jYWxseX19fTwvcD5cXG5cXG48YnIgLz5cXG5cXG48cD57e3t0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLnNhdmVfb3V0Zml0LmdvdG9fYWNjb3VudH19fTwvcD5cXG5cXG48aW5wdXRcXG4gIGlkPVxcXCJjaG9vc2UtbmFtZVxcXCJcXG4gIG1heGxlbmd0aD1cXFwiMzBcXFwiXFxuICBtaW5sZW5ndGg9XFxcIjFcXFwiXFxuICBwbGFjZWhvbGRlcj1cXFwie3t0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLnNhdmVfb3V0Zml0LnBsYWNlaG9sZGVyfX1cXFwiXFxuLz5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxkaXYgaWQ9XFxcImhpc3RvcnktY29udGFpbmVyXFxcIiBzdHlsZT1cXFwid2lkdGg6IDEwMCVcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPHN0eWxlPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAuaGlzdG9yeS1hY3Rpb25zIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBtYXJnaW4tYm90dG9tOiAxZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICNkZWxldGUtaGlzdG9yeSB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbWFyZ2luLXJpZ2h0OiAxZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5oZWxwLWljb24ge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMwMjkxZjY7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgY29sb3I6ICNmZmY7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZm9udC1zaXplOiAyNnB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGhlaWdodDogMjNweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBsaW5lLWhlaWdodDogMjBweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBwYWRkaW5nOiAwO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB3aWR0aDogMjNweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLmhpc3RvcnktbWVzc2FnZSB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBtYXJnaW46IDFlbTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBwYWRkaW5nOiAxZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5oaXN0b3J5LXJvdyB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZGlzcGxheTogZmxleDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmbGV4LXdyYXA6IHdyYXA7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaGVpZ2h0OiA0NjVweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBtYXJnaW4tcmlnaHQ6IDFlbTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBvdmVyZmxvdy15OiBhdXRvO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHNjcm9sbGJhci1jb2xvcjogZGFyaztcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5yZXN1bHQtY2FyZCB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYm9yZGVyLXJhZGl1czogMWVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBoZWlnaHQ6IDIwNXB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIG1hcmdpbjogMC41ZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgcGFkZGluZzogMC41ZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHdpZHRoOiAxMjhweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLnJlc3VsdC1pbWFnZSB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYm9yZGVyLXJhZGl1czogMWVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJveC1zaGFkb3c6IDAgMCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLFwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgMCAycHggNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDgpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGhlaWdodDogMTAwcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRvcDogLTAuOGVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHdpZHRoOiAxMDBweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLnJlc3VsdC1jb250ZW50LWNvbHVtbiB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZGlzcGxheTogZmxleDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGhlaWdodDogMTAzcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAucmVzdWx0LW5hbWUge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgLXdlYmtpdC1saW5lLWNsYW1wOiAzO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGNvbG9yOiByZ2IoNTIsIDU2LCAxMTEpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGRpc3BsYXk6IC13ZWJraXQtYm94O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZsZXgtZ3JvdzogMTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LXNpemU6IDE2cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbWFyZ2luLXRvcDogLTAuMmVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIG92ZXJmbG93OiBoaWRkZW47XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5yZXN1bHQtbG9jYXRpb24ge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAucmVzdWx0LWRhdGUge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGNvbG9yOiAjZmI4OTAwO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtc2l6ZTogMTNweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LXdlaWdodDogYm9sZDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLnJlc3VsdC1pY29ucyB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbWFyZ2luLXRvcDogMC41ZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5yZXN1bHQtY291bnQge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMDBjZGZiO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgY29sb3I6ICMzZWMwZDc7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtZmFtaWx5OiBcXFwiQWxlZ3JleWEgU2FucyBTQ1xcXCIsIHNhbnMtc2VyaWY7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZm9udC1zaXplOiAxOHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtd2VpZ2h0OiA4MDA7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaGVpZ2h0OiAyOXB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGxpbmUtaGVpZ2h0OiAyN3B4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB3aWR0aDogMjlweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLmhpc3RvcnktdHJhZGFibGUge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJhY2tncm91bmQtY29sb3I6ICM2NjY7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYm9yZGVyLXJhZGl1czogMjVweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBib3JkZXI6IDFweCBzb2xpZCAjYjliOWI5O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGNvbG9yOiAjZmZmZmZmO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LWZhbWlseTogXFxcIlRlbXAgTWVudVxcXCIsIHNlcmlmO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtc2l6ZTogMTNweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBoZWlnaHQ6IDE1cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbGluZS1oZWlnaHQ6IDE1cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHdpZHRoOiAxNXB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAuaWNvbi1zcGFjZXIge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB3aWR0aDogMC4xZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvc3R5bGU+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGRpdiBjbGFzcz1cXFwiaGlzdG9yeS1hY3Rpb25zXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGJ1dHRvbiBpZD1cXFwiZGVsZXRlLWhpc3RvcnlcXFwiIGNsYXNzPVxcXCJubC1idXR0b25cXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5wZXQuZGVsZXRlX2hpc3RvcnlcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8L2J1dHRvbj5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxzcGFuIGNsYXNzPVxcXCJ0b29sdGlwXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8c3BhbiBjbGFzcz1cXFwibmwtYnV0dG9uIGhlbHAtaWNvblxcXCI+Pzwvc3Bhbj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8ZGl2IGNsYXNzPVxcXCJ0b29sdGlwLWNvbnRlbnRcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPHA+XCIpO3QuYih0LnQodC5kKFwidHJhbnNsYXRlLnBldC5zYXZlZF9sb2NhbGx5XCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPHA+XCIpO3QuYih0LnQodC5kKFwidHJhbnNsYXRlLnBldC5nb3RvX2FjY291bnRcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDwvc3Bhbj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTtpZighdC5zKHQuZihcImhpc3RvcnlcIixjLHAsMSksYyxwLDEsMCwwLFwiXCIpKXt0LmIoXCIgIDxwIGNsYXNzPVxcXCJoaXN0b3J5LW1lc3NhZ2VcXFwiPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5wZXQuZW1wdHlfaGlzdG9yeVwiLGMscCwwKSkpO3QuYihcIjwvcD5cIik7dC5iKFwiXFxuXCIgKyBpKTt9O3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8ZGl2IGNsYXNzPVxcXCJoaXN0b3J5LXJvd1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7aWYodC5zKHQuZihcImhpc3RvcnlcIixjLHAsMSksYyxwLDAsMzIzMCwzOTIwLFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCIgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWNhcmRcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDxhIGhyZWY9XFxcIlwiKTt0LmIodC52KHQuZihcIndlYl9oZFwiLGMscCwwKSkpO3QuYihcIlxcXCIgdGFyZ2V0PVxcXCJfYmxhbmtcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGltZyBjbGFzcz1cXFwicmVzdWx0LWltYWdlXFxcIiBzcmM9XFxcIlwiKTt0LmIodC52KHQuZihcImljb25cIixjLHAsMCkpKTt0LmIoXCJcXFwiIC8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC9hPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtY29udGVudC1jb2x1bW5cXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LW5hbWVcXFwiPlwiKTt0LmIodC52KHQuZihcIm5hbWVcIixjLHAsMCkpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcInJlc3VsdC1sb2NhdGlvblxcXCI+XCIpO3QuYih0LnYodC5mKFwibG9jYXRpb25OYW1lXCIsYyxwLDApKSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtZGF0ZVxcXCI+XCIpO3QuYih0LnYodC5mKFwiZGF0ZVwiLGMscCwwKSkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcInJlc3VsdC1pY29uc1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIFwiKTtpZih0LnModC5mKFwiY291bnRcIixjLHAsMSksYyxwLDAsMzYyMywzNjY2LFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCI8c3BhbiBjbGFzcz1cXFwicmVzdWx0LWNvdW50XFxcIj5cIik7dC5iKHQudih0LmYoXCJjb3VudFwiLGMscCwwKSkpO3QuYihcIjwvc3Bhbj5cIik7fSk7Yy5wb3AoKTt9dC5iKFwiXFxuXCIgKyBpKTtpZih0LnModC5mKFwiY291bnRcIixjLHAsMSksYyxwLDAsMzY5NywzNzc2LFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXtpZih0LnModC5mKFwidHJhZGFibGVcIixjLHAsMSksYyxwLDAsMzcxMCwzNzYzLFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCIgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiaWNvbi1zcGFjZXJcXFwiPjwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICBcIik7fSk7Yy5wb3AoKTt9fSk7Yy5wb3AoKTt9dC5iKFwiIFwiKTtpZih0LnModC5mKFwidHJhZGFibGVcIixjLHAsMSksYyxwLDAsMzgwMCwzODYzLFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCI8c3BhbiBjbGFzcz1cXFwiaGlzdG9yeS10cmFkYWJsZVxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICA+7qCCPC9zcGFuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgID5cIik7fSk7Yy5wb3AoKTt9dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt9KTtjLnBvcCgpO310LmIoXCIgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxkaXYgaWQ9XFxcImhpc3RvcnktY29udGFpbmVyXFxcIiBzdHlsZT1cXFwid2lkdGg6IDEwMCVcXFwiPlxcbiAgPHN0eWxlPlxcbiAgICAuaGlzdG9yeS1hY3Rpb25zIHtcXG4gICAgICBtYXJnaW4tYm90dG9tOiAxZW07XFxuICAgIH1cXG5cXG4gICAgI2RlbGV0ZS1oaXN0b3J5IHtcXG4gICAgICBtYXJnaW4tcmlnaHQ6IDFlbTtcXG4gICAgfVxcblxcbiAgICAuaGVscC1pY29uIHtcXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDI5MWY2O1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcXG4gICAgICBib3gtc2hhZG93OiBub25lO1xcbiAgICAgIGNvbG9yOiAjZmZmO1xcbiAgICAgIGZvbnQtc2l6ZTogMjZweDtcXG4gICAgICBmb250LXdlaWdodDogYm9sZDtcXG4gICAgICBoZWlnaHQ6IDIzcHg7XFxuICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7XFxuICAgICAgcGFkZGluZzogMDtcXG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgICAgd2lkdGg6IDIzcHg7XFxuICAgIH1cXG5cXG4gICAgLmhpc3RvcnktbWVzc2FnZSB7XFxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcXG4gICAgICBtYXJnaW46IDFlbTtcXG4gICAgICBwYWRkaW5nOiAxZW07XFxuICAgIH1cXG5cXG4gICAgLmhpc3Rvcnktcm93IHtcXG4gICAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcXG4gICAgICBoZWlnaHQ6IDQ2NXB4O1xcbiAgICAgIG1hcmdpbi1yaWdodDogMWVtO1xcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XFxuICAgICAgc2Nyb2xsYmFyLWNvbG9yOiBkYXJrO1xcbiAgICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjtcXG4gICAgfVxcblxcbiAgICAucmVzdWx0LWNhcmQge1xcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcXG4gICAgICBib3gtc2hhZG93OiAwIDAgNXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMyk7XFxuICAgICAgaGVpZ2h0OiAyMDVweDtcXG4gICAgICBtYXJnaW46IDAuNWVtO1xcbiAgICAgIHBhZGRpbmc6IDAuNWVtO1xcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgICB3aWR0aDogMTI4cHg7XFxuICAgIH1cXG5cXG4gICAgLnJlc3VsdC1pbWFnZSB7XFxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgICAgYm9yZGVyLXJhZGl1czogMWVtO1xcbiAgICAgIGJveC1zaGFkb3c6IDAgMCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLFxcbiAgICAgICAgMCAycHggNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xcbiAgICAgIGhlaWdodDogMTAwcHg7XFxuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICAgIHRvcDogLTAuOGVtO1xcbiAgICAgIHdpZHRoOiAxMDBweDtcXG4gICAgfVxcblxcbiAgICAucmVzdWx0LWNvbnRlbnQtY29sdW1uIHtcXG4gICAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgICAgaGVpZ2h0OiAxMDNweDtcXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIH1cXG5cXG4gICAgLnJlc3VsdC1uYW1lIHtcXG4gICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xcbiAgICAgIC13ZWJraXQtbGluZS1jbGFtcDogMztcXG4gICAgICBjb2xvcjogcmdiKDUyLCA1NiwgMTExKTtcXG4gICAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gICAgICBmbGV4LWdyb3c6IDE7XFxuICAgICAgZm9udC1zaXplOiAxNnB4O1xcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgICAgIG1hcmdpbi10b3A6IC0wLjJlbTtcXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICB9XFxuXFxuICAgIC5yZXN1bHQtbG9jYXRpb24ge1xcbiAgICB9XFxuXFxuICAgIC5yZXN1bHQtZGF0ZSB7XFxuICAgICAgY29sb3I6ICNmYjg5MDA7XFxuICAgICAgZm9udC1zaXplOiAxM3B4O1xcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgICB9XFxuXFxuICAgIC5yZXN1bHQtaWNvbnMge1xcbiAgICAgIG1hcmdpbi10b3A6IDAuNWVtO1xcbiAgICB9XFxuXFxuICAgIC5yZXN1bHQtY291bnQge1xcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XFxuICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTtcXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjMDBjZGZiO1xcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgICAgY29sb3I6ICMzZWMwZDc7XFxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAgIGZvbnQtZmFtaWx5OiBcXFwiQWxlZ3JleWEgU2FucyBTQ1xcXCIsIHNhbnMtc2VyaWY7XFxuICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgICAgIGZvbnQtd2VpZ2h0OiA4MDA7XFxuICAgICAgaGVpZ2h0OiAyOXB4O1xcbiAgICAgIGxpbmUtaGVpZ2h0OiAyN3B4O1xcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgICB3aWR0aDogMjlweDtcXG4gICAgfVxcblxcbiAgICAuaGlzdG9yeS10cmFkYWJsZSB7XFxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzY2NjtcXG4gICAgICBib3JkZXItcmFkaXVzOiAyNXB4O1xcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiOWI5Yjk7XFxuICAgICAgY29sb3I6ICNmZmZmZmY7XFxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAgIGZvbnQtZmFtaWx5OiBcXFwiVGVtcCBNZW51XFxcIiwgc2VyaWY7XFxuICAgICAgZm9udC1zaXplOiAxM3B4O1xcbiAgICAgIGhlaWdodDogMTVweDtcXG4gICAgICBsaW5lLWhlaWdodDogMTVweDtcXG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgICAgd2lkdGg6IDE1cHg7XFxuICAgIH1cXG5cXG4gICAgLmljb24tc3BhY2VyIHtcXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgICAgd2lkdGg6IDAuMWVtO1xcbiAgICB9XFxuICA8L3N0eWxlPlxcblxcbiAgPGRpdiBjbGFzcz1cXFwiaGlzdG9yeS1hY3Rpb25zXFxcIj5cXG4gICAgPGJ1dHRvbiBpZD1cXFwiZGVsZXRlLWhpc3RvcnlcXFwiIGNsYXNzPVxcXCJubC1idXR0b25cXFwiPlxcbiAgICAgIHt7dHJhbnNsYXRlLnBldC5kZWxldGVfaGlzdG9yeX19XFxuICAgIDwvYnV0dG9uPlxcblxcbiAgICA8c3BhbiBjbGFzcz1cXFwidG9vbHRpcFxcXCI+XFxuICAgICAgPHNwYW4gY2xhc3M9XFxcIm5sLWJ1dHRvbiBoZWxwLWljb25cXFwiPj88L3NwYW4+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwidG9vbHRpcC1jb250ZW50XFxcIj5cXG4gICAgICAgIDxwPnt7e3RyYW5zbGF0ZS5wZXQuc2F2ZWRfbG9jYWxseX19fTwvcD5cXG4gICAgICAgIDxwPnt7e3RyYW5zbGF0ZS5wZXQuZ290b19hY2NvdW50fX19PC9wPlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L3NwYW4+XFxuICA8L2Rpdj5cXG5cXG4gIHt7Xmhpc3Rvcnl9fVxcbiAgPHAgY2xhc3M9XFxcImhpc3RvcnktbWVzc2FnZVxcXCI+e3t0cmFuc2xhdGUucGV0LmVtcHR5X2hpc3Rvcnl9fTwvcD5cXG4gIHt7L2hpc3Rvcnl9fVxcblxcbiAgPGRpdiBjbGFzcz1cXFwiaGlzdG9yeS1yb3dcXFwiPlxcbiAgICB7eyNoaXN0b3J5fX1cXG4gICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWNhcmRcXFwiPlxcbiAgICAgIDxhIGhyZWY9XFxcInt7d2ViX2hkfX1cXFwiIHRhcmdldD1cXFwiX2JsYW5rXFxcIj5cXG4gICAgICAgIDxpbWcgY2xhc3M9XFxcInJlc3VsdC1pbWFnZVxcXCIgc3JjPVxcXCJ7e2ljb259fVxcXCIgLz5cXG4gICAgICA8L2E+XFxuXFxuICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWNvbnRlbnQtY29sdW1uXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInJlc3VsdC1uYW1lXFxcIj57e25hbWV9fTwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWxvY2F0aW9uXFxcIj57e2xvY2F0aW9uTmFtZX19PC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtZGF0ZVxcXCI+e3tkYXRlfX08L2Rpdj5cXG5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInJlc3VsdC1pY29uc1xcXCI+XFxuICAgICAgICAgIHt7I2NvdW50fX08c3BhbiBjbGFzcz1cXFwicmVzdWx0LWNvdW50XFxcIj57e2NvdW50fX08L3NwYW4+e3svY291bnR9fVxcbiAgICAgICAgICB7eyNjb3VudH19e3sjdHJhZGFibGV9fVxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJpY29uLXNwYWNlclxcXCI+PC9kaXY+XFxuICAgICAgICAgIHt7L3RyYWRhYmxlfX17ey9jb3VudH19IHt7I3RyYWRhYmxlfX08c3BhbiBjbGFzcz1cXFwiaGlzdG9yeS10cmFkYWJsZVxcXCJcXG4gICAgICAgICAgICA+7qCCPC9zcGFuXFxuICAgICAgICAgID57ey90cmFkYWJsZX19XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuICAgIHt7L2hpc3Rvcnl9fVxcbiAgPC9kaXY+XFxuPC9kaXY+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8c3R5bGU+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAuY3JlYXRlZC1vdXRmaXQtcG9wdXAgLmZsYXZyLW91dGVyIC5mbGF2ci1tZXNzYWdlOjphZnRlciB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIik7dC5iKHQudih0LmYoXCJ1cmxcIixjLHAsMCkpKTt0LmIoXCIpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICB9XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9zdHlsZT5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPGgxPlwiKTt0LmIodC52KHQuZihcIm5hbWVcIixjLHAsMCkpKTt0LmIoXCI8L2gxPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8cD5cIik7dC5iKHQudCh0LmQoXCJ0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLmNsaWNrX291dGZpdC5zYXZlZF9sb2NhbGx5XCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8YnIgLz5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPHA+XCIpO3QuYih0LnQodC5kKFwidHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5jbGlja19vdXRmaXQuZ290b19hY2NvdW50XCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxzdHlsZT5cXG4gIC5jcmVhdGVkLW91dGZpdC1wb3B1cCAuZmxhdnItb3V0ZXIgLmZsYXZyLW1lc3NhZ2U6OmFmdGVyIHtcXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKHt7dXJsfX0pO1xcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XFxuICB9XFxuPC9zdHlsZT5cXG5cXG48aDE+e3tuYW1lfX08L2gxPlxcblxcbjxwPnt7e3RyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuY2xpY2tfb3V0Zml0LnNhdmVkX2xvY2FsbHl9fX08L3A+XFxuXFxuPGJyIC8+XFxuXFxuPHA+e3t7dHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5jbGlja19vdXRmaXQuZ290b19hY2NvdW50fX19PC9wPlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGJ1dHRvbiBpZD1cXFwiXCIpO3QuYih0LnYodC5mKFwiaWRcIixjLHAsMCkpKTt0LmIoXCJcXFwiIGNsYXNzPVxcXCJubC1idXR0b24gZmF2b3JpdGVzLWFjdGlvbi1lZVxcXCI+XCIpO3QuYih0LnYodC5mKFwidGV4dFwiLGMscCwwKSkpO3QuYihcIjwvYnV0dG9uPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxidXR0b24gaWQ9XFxcInt7aWR9fVxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvbiBmYXZvcml0ZXMtYWN0aW9uLWVlXFxcIj57e3RleHR9fTwvYnV0dG9uPlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGltZ1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgc3JjPVxcXCJcIik7dC5iKHQudih0LmYoXCJpY29uXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgYWx0PVxcXCJcIik7dC5iKHQudih0LmYoXCJuYW1lXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgaGVpZ2h0PVxcXCIyMVxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIHN0eWxlPVxcXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbjogLTJweCBhdXRvXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIi8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKHQudCh0LmYoXCJtZXNzYWdlXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8aW1nXFxuICBzcmM9XFxcInt7aWNvbn19XFxcIlxcbiAgYWx0PVxcXCJ7e25hbWV9fVxcXCJcXG4gIGhlaWdodD1cXFwiMjFcXFwiXFxuICBzdHlsZT1cXFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW46IC0ycHggYXV0b1xcXCJcXG4vPlxcbnt7e21lc3NhZ2V9fX1cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxsaVwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgaWQ9XFxcImhlYWRlci10YWtlb3ZlclxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIHRpdGxlPVxcXCJcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUuaG9tZS50YWtlb3ZlclwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIHN0eWxlPVxcXCJ0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gZWFzZS1pbi1vdXQgMjAwbXM7IGN1cnNvcjogcG9pbnRlclxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIG9uTW91c2VPdmVyPVxcXCJ0aGlzLnN0eWxlLnRyYW5zZm9ybT0nc2NhbGUoMS4zKSdcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBvbk1vdXNlT3V0PVxcXCJ0aGlzLnN0eWxlLnRyYW5zZm9ybT0nc2NhbGUoMSknXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxhPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8aW1nXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgc3JjPVxcXCIvc3RhdGljL2ltZy9uZXctbGF5b3V0L2hvbWUvY29ubmVjdGVkL2xvY2sucG5nXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGFsdD1cXFwiXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLmhvbWUudGFrZW92ZXJcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgc3R5bGU9XFxcImZpbHRlcjogY29udHJhc3QoMCUpIGJyaWdodG5lc3MoMjAwJSkgXCIpO2lmKCF0LnModC5mKFwidGFrZW92ZXJcIixjLHAsMSksYyxwLDEsMCwwLFwiXCIpKXt0LmIoXCJvcGFjaXR5KDApXCIpO307dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGhlaWdodD1cXFwiMjFcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8L2E+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9saT5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8bGlcXG4gIGlkPVxcXCJoZWFkZXItdGFrZW92ZXJcXFwiXFxuICB0aXRsZT1cXFwie3t0cmFuc2xhdGUuaG9tZS50YWtlb3Zlcn19XFxcIlxcbiAgc3R5bGU9XFxcInRyYW5zaXRpb246IHRyYW5zZm9ybSBlYXNlLWluLW91dCAyMDBtczsgY3Vyc29yOiBwb2ludGVyXFxcIlxcbiAgb25Nb3VzZU92ZXI9XFxcInRoaXMuc3R5bGUudHJhbnNmb3JtPSdzY2FsZSgxLjMpJ1xcXCJcXG4gIG9uTW91c2VPdXQ9XFxcInRoaXMuc3R5bGUudHJhbnNmb3JtPSdzY2FsZSgxKSdcXFwiXFxuPlxcbiAgPGE+XFxuICAgIDxpbWdcXG4gICAgICBzcmM9XFxcIi9zdGF0aWMvaW1nL25ldy1sYXlvdXQvaG9tZS9jb25uZWN0ZWQvbG9jay5wbmdcXFwiXFxuICAgICAgYWx0PVxcXCJ7e3RyYW5zbGF0ZS5ob21lLnRha2VvdmVyfX1cXFwiXFxuICAgICAgc3R5bGU9XFxcImZpbHRlcjogY29udHJhc3QoMCUpIGJyaWdodG5lc3MoMjAwJSkge3tedGFrZW92ZXJ9fW9wYWNpdHkoMCl7ey90YWtlb3Zlcn19XFxcIlxcbiAgICAgIGhlaWdodD1cXFwiMjFcXFwiXFxuICAgIC8+XFxuICA8L2E+XFxuPC9saT5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxhXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBpZD1cXFwiaG9tZS1cIik7dC5iKHQudih0LmYoXCJpZFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGNsYXNzPVxcXCJob21lLWNvbnRlbnQtdGlsZSBob21lLWNvbnRlbnQtc21hbGwgaG9tZS1jb250ZW50LXNtYWxsLWVlXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgaHJlZj1cXFwiXCIpO3QuYih0LnYodC5mKFwiaHJlZlwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIHN0eWxlPVxcXCJiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIpO3QuYih0LnYodC5mKFwiYmFja2dyb3VuZEltYWdlXCIsYyxwLDApKSk7dC5iKFwiKTtcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGg0PlwiKTt0LmIodC52KHQuZihcImg0XCIsYyxwLDApKSk7dC5iKFwiPC9oND5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2E+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGFcXG4gIGlkPVxcXCJob21lLXt7aWR9fVxcXCJcXG4gIGNsYXNzPVxcXCJob21lLWNvbnRlbnQtdGlsZSBob21lLWNvbnRlbnQtc21hbGwgaG9tZS1jb250ZW50LXNtYWxsLWVlXFxcIlxcbiAgaHJlZj1cXFwie3tocmVmfX1cXFwiXFxuICBzdHlsZT1cXFwiYmFja2dyb3VuZC1pbWFnZTogdXJsKHt7YmFja2dyb3VuZEltYWdlfX0pO1xcXCJcXG4+XFxuICA8aDQ+e3toNH19PC9oND5cXG48L2E+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8bGkgY2xhc3M9XFxcIm1haW4tbWVudS1cIik7dC5iKHQudih0LmYoXCJjbGFzc1wiLGMscCwwKSkpO3QuYihcIiBtYWluLW1lbnUtZWVcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGEgaHJlZj1cXFwiXCIpO3QuYih0LnYodC5mKFwiaHJlZlwiLGMscCwwKSkpO3QuYihcIlxcXCI+XCIpO3QuYih0LnYodC5mKFwidGV4dFwiLGMscCwwKSkpO3QuYihcIjwvYT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2xpPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxsaSBjbGFzcz1cXFwibWFpbi1tZW51LXt7Y2xhc3N9fSBtYWluLW1lbnUtZWVcXFwiPlxcbiAgPGEgaHJlZj1cXFwie3tocmVmfX1cXFwiPnt7dGV4dH19PC9hPlxcbjwvbGk+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8bGkgY2xhc3M9XFxcIm1haW4tbWVudS1wdXJyb3Nob3BcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGEgaHJlZj1cXFwiL21hbGwvcHVycm9zaG9wXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGltZ1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGhlaWdodD1cXFwiMjBcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgc3JjPVxcXCIvYXNzZXRzL2ltZy9pdGVtL2NvbnN1bWFibGUvYjY0N2Q1NGFmZDZiMDQzNTNlMTI5MjE5ODEwNTEyZjUucG5nXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAvPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBQdXJybydTaG9wXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8L2E+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9saT5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8bGkgY2xhc3M9XFxcIm1haW4tbWVudS1wdXJyb3Nob3BcXFwiPlxcbiAgPGEgaHJlZj1cXFwiL21hbGwvcHVycm9zaG9wXFxcIj5cXG4gICAgPGltZ1xcbiAgICAgIGhlaWdodD1cXFwiMjBcXFwiXFxuICAgICAgc3JjPVxcXCIvYXNzZXRzL2ltZy9pdGVtL2NvbnN1bWFibGUvYjY0N2Q1NGFmZDZiMDQzNTNlMTI5MjE5ODEwNTEyZjUucG5nXFxcIlxcbiAgICAgIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlXFxcIlxcbiAgICAvPlxcbiAgICBQdXJybydTaG9wXFxuICA8L2E+XFxuPC9saT5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxzdHlsZT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIC8qICNtYXJrZXRwbGFjZS1hYnN0cmFjdC1wdXJjaGFzZXMgYW5kICNtYXJrZXRwbGFjZS1hYnN0cmFjdC1zYWxlcyB3ZXJlXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICByZS13cml0dGVuIHRvIHRhcmdldCAjcHVyY2hhc2UtaGlzdG9yeSBhbmQgI3NhbGUtaGlzdG9yeS4gKi9cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAjcHVyY2hhc2UtaGlzdG9yeSxcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICNzYWxlLWhpc3Rvcnkge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBoZWlnaHQ6IDYwMHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHdpZHRoOiAzNjBweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICNzYWxlLWhpc3RvcnkgLmFic3RyYWN0LWFjdGlvbnMsXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAjcHVyY2hhc2UtaGlzdG9yeSAuYWJzdHJhY3QtYWN0aW9ucyB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgdG9wOiAtNDBweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgZGlzcGxheTogZmxleDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1ldmVubHk7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGhlaWdodDogODBweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAjc2FsZS1oaXN0b3J5IC5hYnN0cmFjdC10aW1lLFwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgI3B1cmNoYXNlLWhpc3RvcnkgLmFic3RyYWN0LXRpbWUge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBwb3NpdGlvbjogc3RhdGljO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBkaXNwbGF5OiBpbmxpbmU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGhlaWdodDogYXV0bztcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgY29sb3I6ICNmYjg5MDA7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGZvbnQtd2VpZ2h0OiBib2xkO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBmb250LXNpemU6IDEzcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgI3B1cmNoYXNlLWhpc3Rvcnkge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBtYXJnaW4tcmlnaHQ6IDgwcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgI3B1cmNoYXNlLWhpc3Rvcnk6YmVmb3JlIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgY29udGVudDogXFxcIlxcXCI7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgdG9wOiAxMjBweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgcmlnaHQ6IC00MnB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBib3JkZXItcmlnaHQ6IHNvbGlkIDJweCAjYWFhO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBoZWlnaHQ6IDMyMHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIC8qIEN1c3RvbSBmaXhlcyB0byB0aGUgbGF5b3V0ICovXCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgI3B1cmNoYXNlLWhpc3RvcnkgbGkge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBtYXJnaW4tbGVmdDogNHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBtYXJnaW4tcmlnaHQ6IDRweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L3N0eWxlPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8IS0tIFB1cmNoYXNlcyAtLT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8ZGl2IGNsYXNzPVxcXCJtYXJrZXRwbGFjZS1hYnN0cmFjdFxcXCIgaWQ9XFxcInB1cmNoYXNlLWhpc3RvcnlcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGgyIGNsYXNzPVxcXCJzZWN0aW9uLXN1YnRpdGxlXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC5hdWN0aW9ucy5wdXJjaGFzZV9oaXN0b3J5XCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvaDI+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPHVsPlwiKTt0LmIoXCJcXG5cIiArIGkpO2lmKHQucyh0LmYoXCJwdXJjaGFzZXNcIixjLHAsMSksYyxwLDAsMTI0OCwyNTA5LFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCIgICAgPGxpXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZGF0YS1pdGVtaWQ9XFxcIlwiKTt0LmIodC52KHQuZihcIml0ZW1pZFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBjbGFzcz1cXFwibWFya2V0cGxhY2UtYWJzdHJhY3QgbWFya2V0cGxhY2UtYXVjdGlvbnMtaXRlbSBtYXJrZXRwbGFjZS1zYWxlcy1pdGVtXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPCEtLSBJY29uIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LWljb25cXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGltZyBzcmM9XFxcIlwiKTt0LmIodC52KHQuZihcImljb25cIixjLHAsMCkpKTt0LmIoXCJcXFwiIC8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwhLS0gUHJpY2VzIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LWNvbnRhaW5lclxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1uYW1lXFxcIj5cIik7dC5iKHQudih0LmYoXCJuYW1lXCIsYyxwLDApKSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1jb250ZW50XFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtY3VycmVudFByaWNlXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICBcIik7aWYodC5zKHQuZihcImN1cnJlbnRQcmljZVwiLGMscCwxKSxjLHAsMCwxNzAyLDE4NzEsXCJ7eyB9fVwiKSl7dC5ycyhjLHAsZnVuY3Rpb24oYyxwLHQpe3QuYihcIiBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0LmF1Y3Rpb25zLmN1cnJlbnRfcHJpY2VcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJwcmljZS1pdGVtXFxcIj5cIik7dC5iKHQudih0LmQoXCJjdXJyZW50UHJpY2UucHJpY2VcIixjLHAsMCkpKTt0LmIoXCI8L3NwYW4+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hYW5hLWljb25cXFwiPjwvc3Bhbj5cIik7dC5iKFwiXFxuXCIgKyBpKTt9KTtjLnBvcCgpO310LmIoXCIgICAgICAgICAgICA8YnIgLz5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICBcIik7aWYodC5zKHQuZihcImJ1eU5vd1ByaWNlXCIsYyxwLDEpLGMscCwwLDE5MzYsMjEwNCxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQuYXVjdGlvbnMuYnV5X25vd19wcmljZVwiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInByaWNlLWl0ZW1cXFwiPlwiKTt0LmIodC52KHQuZChcImJ1eU5vd1ByaWNlLnByaWNlXCIsYyxwLDApKSk7dC5iKFwiPC9zcGFuPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYWFuYS1pY29uXFxcIj48L3NwYW4+XCIpO3QuYihcIlxcblwiICsgaSk7fSk7Yy5wb3AoKTt9dC5iKFwiICAgICAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwhLS0gQWN0aW9ucyAtLT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1hY3Rpb25zXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LXRpbWVcXFwiPlwiKTt0LmIodC52KHQuZihcImRhdGVcIixjLHAsMCkpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXZcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc20gbWFya2V0cGxhY2UtaXRlbURldGFpbC1jYW5jZWwgZGVsZXRlLWJ1dHRvblxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgZGF0YS1pdGVtaWQ9XFxcIlwiKTt0LmIodC52KHQuZihcIml0ZW1pZFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgID5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC5hdWN0aW9ucy5kZWxldGVcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDwvbGk+XCIpO3QuYihcIlxcblwiICsgaSk7fSk7Yy5wb3AoKTt9dC5iKFwiICA8L3VsPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8IS0tIFNhbGVzIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjxkaXYgY2xhc3M9XFxcIm1hcmtldHBsYWNlLWFic3RyYWN0XFxcIiBpZD1cXFwic2FsZS1oaXN0b3J5XFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxoMiBjbGFzcz1cXFwic2VjdGlvbi1zdWJ0aXRsZVxcXCI+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC5hdWN0aW9ucy5zYWxlc19oaXN0b3J5XCIsYyxwLDApKSk7dC5iKFwiPC9oMj5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8dWw+XCIpO3QuYihcIlxcblwiICsgaSk7aWYodC5zKHQuZihcInNhbGVzXCIsYyxwLDEpLGMscCwwLDI3MTAsMzg1NixcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiICAgIDxsaSBjbGFzcz1cXFwibWFya2V0cGxhY2UtYWJzdHJhY3QgbWFya2V0cGxhY2Utc2FsZXMtaXRlbVxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPCEtLSBJY29uIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LWljb25cXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGltZyBzcmM9XFxcIlwiKTt0LmIodC52KHQuZihcImljb25cIixjLHAsMCkpKTt0LmIoXCJcXFwiIC8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwhLS0gUHJpY2VzIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LWNvbnRhaW5lclxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1uYW1lXFxcIj5cIik7dC5iKHQudih0LmYoXCJuYW1lXCIsYyxwLDApKSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1jb250ZW50XFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtY3VycmVudFByaWNlXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICBcIik7aWYodC5zKHQuZihcImN1cnJlbnRQcmljZVwiLGMscCwxKSxjLHAsMCwzMDk2LDMyNTksXCJ7eyB9fVwiKSl7dC5ycyhjLHAsZnVuY3Rpb24oYyxwLHQpe3QuYihcIiBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0LmF1Y3Rpb25zLmN1cnJlbnRfcHJpY2VcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJwcmljZS1pdGVtXFxcIj5cIik7dC5iKHQudih0LmYoXCJjdXJyZW50UHJpY2VcIixjLHAsMCkpKTt0LmIoXCI8L3NwYW4+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hYW5hLWljb25cXFwiPjwvc3Bhbj5cIik7dC5iKFwiXFxuXCIgKyBpKTt9KTtjLnBvcCgpO310LmIoXCIgICAgICAgICAgICA8YnIgLz5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICBcIik7aWYodC5zKHQuZihcImJ1eU5vd1ByaWNlXCIsYyxwLDEpLGMscCwwLDMzMjQsMzQ4NixcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQuYXVjdGlvbnMuYnV5X25vd19wcmljZVwiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInByaWNlLWl0ZW1cXFwiPlwiKTt0LmIodC52KHQuZihcImJ1eU5vd1ByaWNlXCIsYyxwLDApKSk7dC5iKFwiPC9zcGFuPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYWFuYS1pY29uXFxcIj48L3NwYW4+XCIpO3QuYihcIlxcblwiICsgaSk7fSk7Yy5wb3AoKTt9dC5iKFwiICAgICAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwhLS0gQWN0aW9ucyAtLT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1hY3Rpb25zXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LXRpbWVcXFwiPlwiKTt0LmIodC52KHQuZihcImRhdGVcIixjLHAsMCkpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXZcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc20gbWFya2V0cGxhY2UtaXRlbURldGFpbC1jYW5jZWwgZGVsZXRlLWJ1dHRvblxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgID5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC5hdWN0aW9ucy5kZWxldGVcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDwvbGk+XCIpO3QuYihcIlxcblwiICsgaSk7fSk7Yy5wb3AoKTt9dC5iKFwiICA8L3VsPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxzdHlsZT5cXG4gIC8qICNtYXJrZXRwbGFjZS1hYnN0cmFjdC1wdXJjaGFzZXMgYW5kICNtYXJrZXRwbGFjZS1hYnN0cmFjdC1zYWxlcyB3ZXJlXFxuICByZS13cml0dGVuIHRvIHRhcmdldCAjcHVyY2hhc2UtaGlzdG9yeSBhbmQgI3NhbGUtaGlzdG9yeS4gKi9cXG5cXG4gICNwdXJjaGFzZS1oaXN0b3J5LFxcbiAgI3NhbGUtaGlzdG9yeSB7XFxuICAgIGhlaWdodDogNjAwcHg7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgd2lkdGg6IDM2MHB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxuICB9XFxuXFxuICAjc2FsZS1oaXN0b3J5IC5hYnN0cmFjdC1hY3Rpb25zLFxcbiAgI3B1cmNoYXNlLWhpc3RvcnkgLmFic3RyYWN0LWFjdGlvbnMge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHRvcDogLTQwcHg7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtZXZlbmx5O1xcbiAgICBoZWlnaHQ6IDgwcHg7XFxuICB9XFxuXFxuICAjc2FsZS1oaXN0b3J5IC5hYnN0cmFjdC10aW1lLFxcbiAgI3B1cmNoYXNlLWhpc3RvcnkgLmFic3RyYWN0LXRpbWUge1xcbiAgICBwb3NpdGlvbjogc3RhdGljO1xcbiAgICBkaXNwbGF5OiBpbmxpbmU7XFxuICAgIGhlaWdodDogYXV0bztcXG4gICAgY29sb3I6ICNmYjg5MDA7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgICBmb250LXNpemU6IDEzcHg7XFxuICB9XFxuXFxuICAjcHVyY2hhc2UtaGlzdG9yeSB7XFxuICAgIG1hcmdpbi1yaWdodDogODBweDtcXG4gIH1cXG5cXG4gICNwdXJjaGFzZS1oaXN0b3J5OmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMTIwcHg7XFxuICAgIHJpZ2h0OiAtNDJweDtcXG4gICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAycHggI2FhYTtcXG4gICAgaGVpZ2h0OiAzMjBweDtcXG4gIH1cXG5cXG4gIC8qIEN1c3RvbSBmaXhlcyB0byB0aGUgbGF5b3V0ICovXFxuXFxuICAjcHVyY2hhc2UtaGlzdG9yeSBsaSB7XFxuICAgIG1hcmdpbi1sZWZ0OiA0cHg7XFxuICAgIG1hcmdpbi1yaWdodDogNHB4O1xcbiAgfVxcbjwvc3R5bGU+XFxuXFxuPCEtLSBQdXJjaGFzZXMgLS0+XFxuPGRpdiBjbGFzcz1cXFwibWFya2V0cGxhY2UtYWJzdHJhY3RcXFwiIGlkPVxcXCJwdXJjaGFzZS1oaXN0b3J5XFxcIj5cXG4gIDxoMiBjbGFzcz1cXFwic2VjdGlvbi1zdWJ0aXRsZVxcXCI+XFxuICAgIHt7dHJhbnNsYXRlLm1hcmtldC5hdWN0aW9ucy5wdXJjaGFzZV9oaXN0b3J5fX1cXG4gIDwvaDI+XFxuXFxuICA8dWw+XFxuICAgIHt7I3B1cmNoYXNlc319XFxuICAgIDxsaVxcbiAgICAgIGRhdGEtaXRlbWlkPVxcXCJ7e2l0ZW1pZH19XFxcIlxcbiAgICAgIGNsYXNzPVxcXCJtYXJrZXRwbGFjZS1hYnN0cmFjdCBtYXJrZXRwbGFjZS1hdWN0aW9ucy1pdGVtIG1hcmtldHBsYWNlLXNhbGVzLWl0ZW1cXFwiXFxuICAgID5cXG4gICAgICA8IS0tIEljb24gLS0+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtaWNvblxcXCI+XFxuICAgICAgICA8aW1nIHNyYz1cXFwie3tpY29ufX1cXFwiIC8+XFxuICAgICAgPC9kaXY+XFxuXFxuICAgICAgPCEtLSBQcmljZXMgLS0+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtY29udGFpbmVyXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LW5hbWVcXFwiPnt7bmFtZX19PC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1jb250ZW50XFxcIj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtY3VycmVudFByaWNlXFxcIj5cXG4gICAgICAgICAgICB7eyNjdXJyZW50UHJpY2V9fSB7e3RyYW5zbGF0ZS5tYXJrZXQuYXVjdGlvbnMuY3VycmVudF9wcmljZX19XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInByaWNlLWl0ZW1cXFwiPnt7Y3VycmVudFByaWNlLnByaWNlfX08L3NwYW4+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hYW5hLWljb25cXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICB7ey9jdXJyZW50UHJpY2V9fVxcbiAgICAgICAgICAgIDxiciAvPlxcbiAgICAgICAgICAgIHt7I2J1eU5vd1ByaWNlfX0ge3t0cmFuc2xhdGUubWFya2V0LmF1Y3Rpb25zLmJ1eV9ub3dfcHJpY2V9fVxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJwcmljZS1pdGVtXFxcIj57e2J1eU5vd1ByaWNlLnByaWNlfX08L3NwYW4+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hYW5hLWljb25cXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICB7ey9idXlOb3dQcmljZX19XFxuICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgPC9kaXY+XFxuXFxuICAgICAgPCEtLSBBY3Rpb25zIC0tPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LWFjdGlvbnNcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtdGltZVxcXCI+e3tkYXRlfX08L2Rpdj5cXG4gICAgICAgIDxkaXZcXG4gICAgICAgICAgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc20gbWFya2V0cGxhY2UtaXRlbURldGFpbC1jYW5jZWwgZGVsZXRlLWJ1dHRvblxcXCJcXG4gICAgICAgICAgZGF0YS1pdGVtaWQ9XFxcInt7aXRlbWlkfX1cXFwiXFxuICAgICAgICA+XFxuICAgICAgICAgIHt7dHJhbnNsYXRlLm1hcmtldC5hdWN0aW9ucy5kZWxldGV9fVxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgPC9kaXY+XFxuICAgIDwvbGk+XFxuICAgIHt7L3B1cmNoYXNlc319XFxuICA8L3VsPlxcbjwvZGl2PlxcblxcbjwhLS0gU2FsZXMgLS0+XFxuPGRpdiBjbGFzcz1cXFwibWFya2V0cGxhY2UtYWJzdHJhY3RcXFwiIGlkPVxcXCJzYWxlLWhpc3RvcnlcXFwiPlxcbiAgPGgyIGNsYXNzPVxcXCJzZWN0aW9uLXN1YnRpdGxlXFxcIj57e3RyYW5zbGF0ZS5tYXJrZXQuYXVjdGlvbnMuc2FsZXNfaGlzdG9yeX19PC9oMj5cXG5cXG4gIDx1bD5cXG4gICAge3sjc2FsZXN9fVxcbiAgICA8bGkgY2xhc3M9XFxcIm1hcmtldHBsYWNlLWFic3RyYWN0IG1hcmtldHBsYWNlLXNhbGVzLWl0ZW1cXFwiPlxcbiAgICAgIDwhLS0gSWNvbiAtLT5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1pY29uXFxcIj5cXG4gICAgICAgIDxpbWcgc3JjPVxcXCJ7e2ljb259fVxcXCIgLz5cXG4gICAgICA8L2Rpdj5cXG5cXG4gICAgICA8IS0tIFByaWNlcyAtLT5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1jb250YWluZXJcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtbmFtZVxcXCI+e3tuYW1lfX08L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1jdXJyZW50UHJpY2VcXFwiPlxcbiAgICAgICAgICAgIHt7I2N1cnJlbnRQcmljZX19IHt7dHJhbnNsYXRlLm1hcmtldC5hdWN0aW9ucy5jdXJyZW50X3ByaWNlfX1cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwicHJpY2UtaXRlbVxcXCI+e3tjdXJyZW50UHJpY2V9fTwvc3Bhbj5cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWFhbmEtaWNvblxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgIHt7L2N1cnJlbnRQcmljZX19XFxuICAgICAgICAgICAgPGJyIC8+XFxuICAgICAgICAgICAge3sjYnV5Tm93UHJpY2V9fSB7e3RyYW5zbGF0ZS5tYXJrZXQuYXVjdGlvbnMuYnV5X25vd19wcmljZX19XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInByaWNlLWl0ZW1cXFwiPnt7YnV5Tm93UHJpY2V9fTwvc3Bhbj5cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWFhbmEtaWNvblxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgIHt7L2J1eU5vd1ByaWNlfX1cXG4gICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICA8L2Rpdj5cXG5cXG4gICAgICA8IS0tIEFjdGlvbnMgLS0+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtYWN0aW9uc1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC10aW1lXFxcIj57e2RhdGV9fTwvZGl2PlxcbiAgICAgICAgPGRpdlxcbiAgICAgICAgICBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSBtYXJrZXRwbGFjZS1pdGVtRGV0YWlsLWNhbmNlbCBkZWxldGUtYnV0dG9uXFxcIlxcbiAgICAgICAgPlxcbiAgICAgICAgICB7e3RyYW5zbGF0ZS5tYXJrZXQuYXVjdGlvbnMuZGVsZXRlfX1cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2xpPlxcbiAgICB7ey9zYWxlc319XFxuICA8L3VsPlxcbjwvZGl2PlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGFcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGlkPVxcXCJtYXNzLW1hcmtcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBjbGFzcz1cXFwibmwtYnV0dG9uXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgc3R5bGU9XFxcIm1hcmdpbi1yaWdodDogMC42ZW07IG1hcmdpbi10b3A6IDAuNmVtXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxpbWcgc3JjPVxcXCJcIik7dC5iKHQudih0LmYoXCJzcmNcIixjLHAsMCkpKTt0LmIoXCJcXFwiIGhlaWdodD1cXFwiMjBweFxcXCIgc3R5bGU9XFxcIm1hcmdpbjogLTVweCAwcHhcXFwiIC8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBcIik7dC5iKHQudih0LmYoXCJ0ZXh0Q29udGVudFwiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9hPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxhXFxuICBpZD1cXFwibWFzcy1tYXJrXFxcIlxcbiAgY2xhc3M9XFxcIm5sLWJ1dHRvblxcXCJcXG4gIHN0eWxlPVxcXCJtYXJnaW4tcmlnaHQ6IDAuNmVtOyBtYXJnaW4tdG9wOiAwLjZlbVxcXCJcXG4+XFxuICA8aW1nIHNyYz1cXFwie3tzcmN9fVxcXCIgaGVpZ2h0PVxcXCIyMHB4XFxcIiBzdHlsZT1cXFwibWFyZ2luOiAtNXB4IDBweFxcXCIgLz5cXG4gIHt7dGV4dENvbnRlbnR9fVxcbjwvYT5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxkaXYgaWQ9XFxcImVlLW91dGZpdC10aHVtYnNcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPHN0eWxlPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXMgLnNsb3QuZWUtYXZhaWxhYmxlLXNsb3Qge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChodHRwczovL2dpdGxhYi5jb20vTmF0b0JvcmFtL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy0vcmF3L21hc3Rlci9pbWFnZXMvYXZhaWxhYmxlLWZhdm9yaXRlLnBuZyk7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0cHggLTExcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYmFja2dyb3VuZC1zaXplOiAxNzFweCAyNDRweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBib3JkZXItcmFkaXVzOiA0NHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJveC1zaGFkb3c6IDAgMCA0cHggNHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgI2FwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnktZmF2b3JpdGVzIC5zbG90LmVlLWF2YWlsYWJsZS1zbG90OjphZnRlciB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYmFja2dyb3VuZDogdXJsKC9zdGF0aWMvaW1nL25ldy1sYXlvdXQvd2FyZHJvYmUvaWNvbi1wbHVzLnBuZyk7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgY29udGVudDogXFxcIiBcXFwiO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMCAwIDZweCByZ2JhKDIzNywgMTIsIDI0NSwgMC45KSk7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaGVpZ2h0OiA3MXB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGxlZnQ6IDUwJTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBvcGFjaXR5OiAwO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB0b3A6IDUwJTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IGVhc2UtaW4tb3V0IDEwMG1zO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHdpZHRoOiA2NnB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXMgLnNsb3QuZWUtYXZhaWxhYmxlLXNsb3Q6aG92ZXI6OmFmdGVyLFwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXMgLnNsb3QuZWUtb3V0Zml0LXRodW1iOmhvdmVyIHAge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIG9wYWNpdHk6IDE7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlcyAuc2xvdC5lZS1vdXRmaXQtdGh1bWIgaW1nIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBib3JkZXItcmFkaXVzOiA0NHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGhlaWdodDogMTAwJTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB3aWR0aDogMTAwJTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgI2FwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnktZmF2b3JpdGVzIC5zbG90LmVlLW91dGZpdC10aHVtYiBwIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgY29sb3I6ICNmZmY7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZm9udC1mYW1pbHk6IFxcXCJBbGVncmV5YSBTYW5zIFNDXFxcIiwgc2Fucy1zZXJpZjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LXNpemU6IDIycHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBsZWZ0OiA1MCU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbGluZS1oZWlnaHQ6IDIycHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgb3BhY2l0eTogMDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBwYWRkaW5nOiAxMnB4IDA7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgcG9zaXRpb246IGFic29sdXRlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB0b3A6IDUwJTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IGVhc2UtaW4tb3V0IDQwMG1zO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHdpZHRoOiAxMDAlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8L3N0eWxlPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTtpZih0LnModC5mKFwib3V0Zml0c1wiLGMscCwxKSxjLHAsMCwxNjU0LDE3OTAsXCJ7eyB9fVwiKSl7dC5ycyhjLHAsZnVuY3Rpb24oYyxwLHQpe3QuYihcIiAgPGRpdiBjbGFzcz1cXFwic2xvdCBlZS1vdXRmaXQtdGh1bWJcXFwiIGRhdGEtYXJyYXktaW5kZXg9XFxcIlwiKTt0LmIodC52KHQuZihcImlkXCIsYyxwLDApKSk7dC5iKFwiXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGltZyBhbHQ9XFxcIlwiKTt0LmIodC52KHQuZihcIm5hbWVcIixjLHAsMCkpKTt0LmIoXCJcXFwiIHNyYz1cXFwiXCIpO3QuYih0LnYodC5mKFwidXJsXCIsYyxwLDApKSk7dC5iKFwiXFxcIiAvPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8cD5cIik7dC5iKHQudih0LmYoXCJuYW1lXCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7fSk7Yy5wb3AoKTt9dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxkaXYgY2xhc3M9XFxcInNsb3QgZWUtYXZhaWxhYmxlLXNsb3RcXFwiPjwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxkaXYgaWQ9XFxcImVlLW91dGZpdC10aHVtYnNcXFwiPlxcbiAgPHN0eWxlPlxcbiAgICAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXMgLnNsb3QuZWUtYXZhaWxhYmxlLXNsb3Qge1xcbiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChodHRwczovL2dpdGxhYi5jb20vTmF0b0JvcmFtL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy0vcmF3L21hc3Rlci9pbWFnZXMvYXZhaWxhYmxlLWZhdm9yaXRlLnBuZyk7XFxuICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0cHggLTExcHg7XFxuICAgICAgYmFja2dyb3VuZC1zaXplOiAxNzFweCAyNDRweDtcXG4gICAgICBib3JkZXItcmFkaXVzOiA0NHB4O1xcbiAgICAgIGJveC1zaGFkb3c6IDAgMCA0cHggNHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTtcXG4gICAgfVxcblxcbiAgICAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXMgLnNsb3QuZWUtYXZhaWxhYmxlLXNsb3Q6OmFmdGVyIHtcXG4gICAgICBiYWNrZ3JvdW5kOiB1cmwoL3N0YXRpYy9pbWcvbmV3LWxheW91dC93YXJkcm9iZS9pY29uLXBsdXMucG5nKTtcXG4gICAgICBjb250ZW50OiBcXFwiIFxcXCI7XFxuICAgICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwIDAgNnB4IHJnYmEoMjM3LCAxMiwgMjQ1LCAwLjkpKTtcXG4gICAgICBoZWlnaHQ6IDcxcHg7XFxuICAgICAgbGVmdDogNTAlO1xcbiAgICAgIG9wYWNpdHk6IDA7XFxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICAgIHRvcDogNTAlO1xcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcbiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgZWFzZS1pbi1vdXQgMTAwbXM7XFxuICAgICAgd2lkdGg6IDY2cHg7XFxuICAgIH1cXG5cXG4gICAgI2FwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnktZmF2b3JpdGVzIC5zbG90LmVlLWF2YWlsYWJsZS1zbG90OmhvdmVyOjphZnRlcixcXG4gICAgI2FwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnktZmF2b3JpdGVzIC5zbG90LmVlLW91dGZpdC10aHVtYjpob3ZlciBwIHtcXG4gICAgICBvcGFjaXR5OiAxO1xcbiAgICB9XFxuXFxuICAgICNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlcyAuc2xvdC5lZS1vdXRmaXQtdGh1bWIgaW1nIHtcXG4gICAgICBib3JkZXItcmFkaXVzOiA0NHB4O1xcbiAgICAgIGhlaWdodDogMTAwJTtcXG4gICAgICB3aWR0aDogMTAwJTtcXG4gICAgfVxcblxcbiAgICAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXMgLnNsb3QuZWUtb3V0Zml0LXRodW1iIHAge1xcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcXG4gICAgICBjb2xvcjogI2ZmZjtcXG4gICAgICBmb250LWZhbWlseTogXFxcIkFsZWdyZXlhIFNhbnMgU0NcXFwiLCBzYW5zLXNlcmlmO1xcbiAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gICAgICBmb250LXdlaWdodDogNzAwO1xcbiAgICAgIGxlZnQ6IDUwJTtcXG4gICAgICBsaW5lLWhlaWdodDogMjJweDtcXG4gICAgICBvcGFjaXR5OiAwO1xcbiAgICAgIHBhZGRpbmc6IDEycHggMDtcXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICAgIHRvcDogNTAlO1xcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcbiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgZWFzZS1pbi1vdXQgNDAwbXM7XFxuICAgICAgd2lkdGg6IDEwMCU7XFxuICAgIH1cXG4gIDwvc3R5bGU+XFxuXFxuICB7eyNvdXRmaXRzfX1cXG4gIDxkaXYgY2xhc3M9XFxcInNsb3QgZWUtb3V0Zml0LXRodW1iXFxcIiBkYXRhLWFycmF5LWluZGV4PVxcXCJ7e2lkfX1cXFwiPlxcbiAgICA8aW1nIGFsdD1cXFwie3tuYW1lfX1cXFwiIHNyYz1cXFwie3t1cmx9fVxcXCIgLz5cXG4gICAgPHA+e3tuYW1lfX08L3A+XFxuICA8L2Rpdj5cXG4gIHt7L291dGZpdHN9fVxcblxcbiAgPGRpdiBjbGFzcz1cXFwic2xvdCBlZS1hdmFpbGFibGUtc2xvdFxcXCI+PC9kaXY+XFxuPC9kaXY+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8bGkgaWQ9XFxcIlwiKTt0LmIodC52KHQuZihcImlkXCIsYyxwLDApKSk7dC5iKFwiXFxcIiBjbGFzcz1cXFwicHJvZmlsZS1jb250YWN0LWFjdGlvbi1lZVxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8c3BhbiBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbVxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxkaXYgY2xhc3M9XFxcImFjdGlvbi1kZXNjcmlwdGlvblxcXCI+XCIpO3QuYih0LnYodC5mKFwiYWN0aW9uRGVzY3JpcHRpb25cIixjLHAsMCkpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvc3Bhbj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2xpPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxsaSBpZD1cXFwie3tpZH19XFxcIiBjbGFzcz1cXFwicHJvZmlsZS1jb250YWN0LWFjdGlvbi1lZVxcXCI+XFxuICA8c3BhbiBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbVxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImFjdGlvbi1kZXNjcmlwdGlvblxcXCI+e3thY3Rpb25EZXNjcmlwdGlvbn19PC9kaXY+XFxuICA8L3NwYW4+XFxuPC9saT5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxzdHlsZT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIC5jcmVhdGVkLW91dGZpdC1wb3B1cCAuZmxhdnItb3V0ZXIgLmZsYXZyLW1lc3NhZ2U6OmFmdGVyIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiKTt0LmIodC52KHQuZihcInVybFwiLGMscCwwKSkpO3QuYihcIik7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L3N0eWxlPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8aDE+XCIpO3QuYih0LnQodC5mKFwidGl0bGVcIixjLHAsMCkpKTt0LmIoXCI8L2gxPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8cD5cIik7dC5iKHQudCh0LmQoXCJ0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLmNsaWNrX291dGZpdC5zYXZlZF9sb2NhbGx5XCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8YnIgLz5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPHA+XCIpO3QuYih0LnQodC5kKFwidHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5jbGlja19vdXRmaXQuZ290b19hY2NvdW50XCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8aW5wdXRcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGlkPVxcXCJjaG9vc2UtbmFtZVxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIG1heGxlbmd0aD1cXFwiMzBcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBtaW5sZW5ndGg9XFxcIjFcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBwbGFjZWhvbGRlcj1cXFwiXCIpO3QuYih0LnYodC5mKFwibmFtZVwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIHZhbHVlPVxcXCJcIik7dC5iKHQudih0LmYoXCJuYW1lXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIi8+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPHN0eWxlPlxcbiAgLmNyZWF0ZWQtb3V0Zml0LXBvcHVwIC5mbGF2ci1vdXRlciAuZmxhdnItbWVzc2FnZTo6YWZ0ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoe3t1cmx9fSk7XFxuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcXG4gIH1cXG48L3N0eWxlPlxcblxcbjxoMT57e3t0aXRsZX19fTwvaDE+XFxuXFxuPHA+e3t7dHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5jbGlja19vdXRmaXQuc2F2ZWRfbG9jYWxseX19fTwvcD5cXG5cXG48YnIgLz5cXG5cXG48cD57e3t0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLmNsaWNrX291dGZpdC5nb3RvX2FjY291bnR9fX08L3A+XFxuXFxuPGlucHV0XFxuICBpZD1cXFwiY2hvb3NlLW5hbWVcXFwiXFxuICBtYXhsZW5ndGg9XFxcIjMwXFxcIlxcbiAgbWlubGVuZ3RoPVxcXCIxXFxcIlxcbiAgcGxhY2Vob2xkZXI9XFxcInt7bmFtZX19XFxcIlxcbiAgdmFsdWU9XFxcInt7bmFtZX19XFxcIlxcbi8+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8ZGl2IGNsYXNzPVxcXCJhY2NvdW50LW1pc2MtYmxvYyBhY2NvdW50LWVlLWJsb2MgYmxvY1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8IS0tXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8c3R5bGU+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHRhYmxlIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB3aWR0aDogMTAwJTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgdGgge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRleHQtYWxpZ246IHN0YXJ0O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHBhZGRpbmc6IDFlbTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPC9zdHlsZT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIC0tPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwhLS0gU2V0dGluZ3MgLS0+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8aDIgY2xhc3M9XFxcInNlY3Rpb24tdGl0bGVcXFwiPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hY2NvdW50LmVuaGFuY2VtZW50c1wiLGMscCwwKSkpO3QuYihcIjwvaDI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8dWwgY2xhc3M9XFxcImFjY291bnQtbWlzYy1hY3Rpb25zXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGxpXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaWQ9XFxcImVlLWRlYnVnLWVuYWJsZWRcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc20gXCIpO2lmKHQucyh0LmYoXCJkZWJ1Z1wiLGMscCwxKSxjLHAsMCwzOTIsMzk4LFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCJhY3RpdmVcIik7fSk7Yy5wb3AoKTt9dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRpdGxlPVxcXCJcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUuYWNjb3VudC5kZWJ1Z190b29sdGlwXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLmFjY291bnQuZGVidWdcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8L2xpPlwiKTt0LmIoXCJcXG5cIiArIGkpO2lmKHQucyh0LmYoXCJ1bmxvY2tlZFwiLGMscCwxKSxjLHAsMCw1MjcsMTAzMCxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiICAgIDxsaVwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGlkPVxcXCJlZS1taW5pZ2FtZXMtZW5hYmxlZFxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSBcIik7aWYodC5zKHQuZihcIm1pbmlnYW1lc1wiLGMscCwxKSxjLHAsMCw2MTgsNjI0LFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCJhY3RpdmVcIik7fSk7Yy5wb3AoKTt9dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLmFjY291bnQubWluaWdhbWVzXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC9saT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGxpXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaWQ9XFxcImVlLWV4cGxvcmF0aW9ucy1lbmFibGVkXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtIFwiKTtpZih0LnModC5mKFwiZXhwbG9yYXRpb25zXCIsYyxwLDEpLGMscCwwLDc5MCw3OTYsXCJ7eyB9fVwiKSl7dC5ycyhjLHAsZnVuY3Rpb24oYyxwLHQpe3QuYihcImFjdGl2ZVwiKTt9KTtjLnBvcCgpO310LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgID5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUuYWNjb3VudC5leHBsb3JhdGlvbnNcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8L2xpPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8bGlcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBpZD1cXFwiZWUtbWFya2V0LWVuYWJsZWRcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc20gXCIpO2lmKHQucyh0LmYoXCJtYXJrZXRcIixjLHAsMSksYyxwLDAsOTU2LDk2MixcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiYWN0aXZlXCIpO30pO2MucG9wKCk7fXQuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hY2NvdW50Lm1hcmtldFwiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDwvbGk+XCIpO3QuYihcIlxcblwiICsgaSk7fSk7Yy5wb3AoKTt9dC5iKFwiICAgIDxsaSBpZD1cXFwiZWUtaW1wb3J0XFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbVxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLmFjY291bnQuaW1wb3J0XCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC9saT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGxpIGlkPVxcXCJlZS1leHBvcnRcXFwiIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUuYWNjb3VudC5leHBvcnRcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8L2xpPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8bGkgaWQ9XFxcImVlLWRlbGV0ZS1leHBsb3JhdGlvbnNcXFwiIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUuYWNjb3VudC5kZWxldGVfZXhwbG9yYXRpb25zXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC9saT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGxpIGlkPVxcXCJlZS1yZXNldFxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc21cXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hY2NvdW50LnJlc2V0XCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC9saT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvdWw+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPCEtLSBFeHBsb3JhdGlvbnNcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxoMyBjbGFzcz1cXFwic2VjdGlvbi10aXRsZVxcXCI+RXhwbG9yYXRpb25zPC9oMz5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDx0YWJsZT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPHRoZWFkPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDx0aD5Mb2NhdGlvbjwvdGg+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPHRoPkRlbGV0ZTwvdGg+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDwvdGhlYWQ+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDx0Ym9keT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGQ+Um9jazwvdGQ+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPHRkPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbVxcXCI+RGVsZXRlPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC90ZD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC90Ym9keT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvdGFibGU+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAtLT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8ZGl2IGNsYXNzPVxcXCJhY2NvdW50LW1pc2MtYmxvYyBhY2NvdW50LWVlLWJsb2MgYmxvY1xcXCI+XFxuICA8IS0tXFxuICA8c3R5bGU+XFxuICAgIHRhYmxlIHtcXG4gICAgICB3aWR0aDogMTAwJTtcXG4gICAgfVxcblxcbiAgICB0aCB7XFxuICAgICAgdGV4dC1hbGlnbjogc3RhcnQ7XFxuICAgICAgcGFkZGluZzogMWVtO1xcbiAgICB9XFxuICA8L3N0eWxlPlxcbiAgLS0+XFxuXFxuICA8IS0tIFNldHRpbmdzIC0tPlxcbiAgPGgyIGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj57e3RyYW5zbGF0ZS5hY2NvdW50LmVuaGFuY2VtZW50c319PC9oMj5cXG4gIDx1bCBjbGFzcz1cXFwiYWNjb3VudC1taXNjLWFjdGlvbnNcXFwiPlxcbiAgICA8bGlcXG4gICAgICBpZD1cXFwiZWUtZGVidWctZW5hYmxlZFxcXCJcXG4gICAgICBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSB7eyNkZWJ1Z319YWN0aXZle3svZGVidWd9fVxcXCJcXG4gICAgICB0aXRsZT1cXFwie3t0cmFuc2xhdGUuYWNjb3VudC5kZWJ1Z190b29sdGlwfX1cXFwiXFxuICAgID5cXG4gICAgICB7e3RyYW5zbGF0ZS5hY2NvdW50LmRlYnVnfX1cXG4gICAgPC9saT5cXG4gICAge3sjdW5sb2NrZWR9fVxcbiAgICA8bGlcXG4gICAgICBpZD1cXFwiZWUtbWluaWdhbWVzLWVuYWJsZWRcXFwiXFxuICAgICAgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc20ge3sjbWluaWdhbWVzfX1hY3RpdmV7ey9taW5pZ2FtZXN9fVxcXCJcXG4gICAgPlxcbiAgICAgIHt7dHJhbnNsYXRlLmFjY291bnQubWluaWdhbWVzfX1cXG4gICAgPC9saT5cXG4gICAgPGxpXFxuICAgICAgaWQ9XFxcImVlLWV4cGxvcmF0aW9ucy1lbmFibGVkXFxcIlxcbiAgICAgIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtIHt7I2V4cGxvcmF0aW9uc319YWN0aXZle3svZXhwbG9yYXRpb25zfX1cXFwiXFxuICAgID5cXG4gICAgICB7e3RyYW5zbGF0ZS5hY2NvdW50LmV4cGxvcmF0aW9uc319XFxuICAgIDwvbGk+XFxuICAgIDxsaVxcbiAgICAgIGlkPVxcXCJlZS1tYXJrZXQtZW5hYmxlZFxcXCJcXG4gICAgICBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSB7eyNtYXJrZXR9fWFjdGl2ZXt7L21hcmtldH19XFxcIlxcbiAgICA+XFxuICAgICAge3t0cmFuc2xhdGUuYWNjb3VudC5tYXJrZXR9fVxcbiAgICA8L2xpPlxcbiAgICB7ey91bmxvY2tlZH19XFxuICAgIDxsaSBpZD1cXFwiZWUtaW1wb3J0XFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbVxcXCI+XFxuICAgICAge3t0cmFuc2xhdGUuYWNjb3VudC5pbXBvcnR9fVxcbiAgICA8L2xpPlxcbiAgICA8bGkgaWQ9XFxcImVlLWV4cG9ydFxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc21cXFwiPlxcbiAgICAgIHt7dHJhbnNsYXRlLmFjY291bnQuZXhwb3J0fX1cXG4gICAgPC9saT5cXG4gICAgPGxpIGlkPVxcXCJlZS1kZWxldGUtZXhwbG9yYXRpb25zXFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbVxcXCI+XFxuICAgICAge3t0cmFuc2xhdGUuYWNjb3VudC5kZWxldGVfZXhwbG9yYXRpb25zfX1cXG4gICAgPC9saT5cXG4gICAgPGxpIGlkPVxcXCJlZS1yZXNldFxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc21cXFwiPlxcbiAgICAgIHt7dHJhbnNsYXRlLmFjY291bnQucmVzZXR9fVxcbiAgICA8L2xpPlxcbiAgPC91bD5cXG5cXG4gIDwhLS0gRXhwbG9yYXRpb25zXFxuICA8aDMgY2xhc3M9XFxcInNlY3Rpb24tdGl0bGVcXFwiPkV4cGxvcmF0aW9uczwvaDM+XFxuICA8dGFibGU+XFxuICAgIDx0aGVhZD5cXG4gICAgICA8dGg+TG9jYXRpb248L3RoPlxcbiAgICAgIDx0aD5EZWxldGU8L3RoPlxcbiAgICA8L3RoZWFkPlxcbiAgICA8dGJvZHk+XFxuICAgICAgPHRkPlJvY2s8L3RkPlxcbiAgICAgIDx0ZD5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc21cXFwiPkRlbGV0ZTwvZGl2PlxcbiAgICAgIDwvdGQ+XFxuICAgIDwvdGJvZHk+XFxuICA8L3RhYmxlPlxcbiAgLS0+XFxuPC9kaXY+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8YSBpZD1cXFwid2lzaGxpc3QtYnV0dG9uXFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QudGl0bGVcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvYT5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8YSBpZD1cXFwid2lzaGxpc3QtYnV0dG9uXFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uXFxcIj5cXG4gIHt7dHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC50aXRsZX19XFxuPC9hPlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPHN0eWxlPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgLnJlc2V0LWFsbCB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIG1hcmdpbi1ib3R0b206IDFlbTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICB0YWJsZSB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHRleHQtYWxpZ246IGNlbnRlcjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgd2lkdGg6IDEwMCU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgLnRleHQtcGFkZGluZyB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHBhZGRpbmc6IDAuMjVlbTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAuYWN0aW9uLXBpY3RvIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgaGVpZ2h0OiA1MHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB3aWR0aDogNTBweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgY3Vyc29yOiBwb2ludGVyO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIC5hY3Rpb24tcGljdG86aG92ZXI6bm90KC5kaXNhYmxlZCksXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAuZWRpdC1wcmljZTpob3ZlciB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGFuaW1hdGlvbjogYnV0dG9uLWJvdW5jZSAzMDBtcyBsaW5lYXIgZm9yd2FyZHM7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxLjA1KSBjb250cmFzdCgxLjEpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIC5yb3cge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBkaXNwbGF5OiBmbGV4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAuZWRpdC1wcmljZSB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGN1cnNvcjogcG9pbnRlcjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBpbWcuZGlzYWJsZWQge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgxKTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAuaXRlbS1pY29uLWNvbnRhaW5lciB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgcG9zaXRpb246IHJlbGF0aXZlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIC5pdGVtLWljb24ge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB3aWR0aDogMTAwcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGhlaWdodDogMTAwcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICB9XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9zdHlsZT5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPGJ1dHRvbiBjbGFzcz1cXFwibmwtYnV0dG9uIHJlc2V0LWFsbFxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LnJlc2V0X2FsbFwiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9idXR0b24+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjx0YWJsZT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDx0aGVhZD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPHRyPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDx0aD5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0Lmljb25cIixjLHAsMCkpKTt0LmIoXCI8L3RoPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDx0aD5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0Lm5hbWVcIixjLHAsMCkpKTt0LmIoXCI8L3RoPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDx0aD5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LnByaWNlXCIsYyxwLDApKSk7dC5iKFwiPC90aD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGg+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5zdGF0dXNcIixjLHAsMCkpKTt0LmIoXCI8L3RoPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDx0aD5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LmFjdGlvbnNcIixjLHAsMCkpKTt0LmIoXCI8L3RoPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8L3RyPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPC90aGVhZD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDx0Ym9keT5cIik7dC5iKFwiXFxuXCIgKyBpKTtpZih0LnModC5mKFwid2lzaGxpc3RcIixjLHAsMSksYyxwLDAsMTEzNywyNjU3LFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCIgICAgPHRyIGNsYXNzPVxcXCJtYXJrZXRwbGFjZS1hYnN0cmFjdFxcXCIgZGF0YS1pY29uPVxcXCJcIik7dC5iKHQudih0LmYoXCJpY29uXCIsYyxwLDApKSk7dC5iKFwiXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8IS0tIEljb24gLS0+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPHRkPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwiaXRlbS1pY29uLWNvbnRhaW5lclxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIDxpbWcgY2xhc3M9XFxcIml0ZW0taWNvblxcXCIgc3JjPVxcXCJcIik7dC5iKHQudih0LmYoXCJpY29uXCIsYyxwLDApKSk7dC5iKFwiXFxcIiBhbHQ9XFxcIlwiKTt0LmIodC52KHQuZihcIm5hbWVcIixjLHAsMCkpKTt0LmIoXCJcXFwiIC8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInJhcml0eS1tYXJrZXItXCIpO3QuYih0LnYodC5mKFwicmFyaXR5XCIsYyxwLDApKSk7dC5iKFwiXFxcIj48L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwvdGQ+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwhLS0gTmFtZSAtLT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGQgY2xhc3M9XFxcInRleHQtcGFkZGluZ1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1uYW1lXFxcIj5cIik7dC5iKHQudih0LmYoXCJuYW1lXCIsYyxwLDApKSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC10eXBlXFxcIj5cIik7dC5iKHQudih0LmYoXCJhYnN0cmFjdFR5cGVcIixjLHAsMCkpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8L3RkPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8IS0tIFByaWNlIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDx0ZCBjbGFzcz1cXFwidGV4dC1wYWRkaW5nXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXZcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgY2xhc3M9XFxcImVkaXQtcHJpY2Ugcm93XFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICB0aXRsZT1cXFwiXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5jaGFuZ2VfcHJpY2VcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJwcmljZS1pdGVtXFxcIj5cIik7dC5iKHQudih0LmYoXCJwcmljZVwiLGMscCwwKSkpO3QuYihcIjwvc3Bhbj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hYW5hLWljb25cXFwiIGFsdD1cXFwibWFhbmFzXFxcIj48L3NwYW4+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8L3RkPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8IS0tIEVycm9yIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDx0ZCBjbGFzcz1cXFwidGV4dC1wYWRkaW5nXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxwIGNsYXNzPVxcXCJlcnJvclxcXCI+XCIpO3QuYih0LnYodC5mKFwiZXJyb3JcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC90ZD5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPCEtLSBBY3Rpb25zIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDx0ZD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcInJvd1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIDxpbWdcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICBjbGFzcz1cXFwiYWN0aW9uLXBpY3RvIHJlc2V0LWl0ZW0tc3RhdHVzIFwiKTtpZighdC5zKHQuZihcImVycm9yXCIsYyxwLDEpLGMscCwxLDAsMCxcIlwiKSl7dC5iKFwiZGlzYWJsZWRcIik7fTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgICAgc3JjPVxcXCIvc3RhdGljL2ltZy9uZXctbGF5b3V0L3dhcmRyb2JlL3Jlc2V0LWJ0bi5wbmdcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgICAgdGl0bGU9XFxcIlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QucmVzZXRfdG9vbHRpcFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICBhbHQ9XFxcIlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QucmVzZXRcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIC8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIDxpbWdcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICBjbGFzcz1cXFwiYWN0aW9uLXBpY3RvIGRlbGV0ZS13aXNobGlzdC1pdGVtXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAgIHNyYz1cXFwiL3N0YXRpYy9pbWcvbmV3LWxheW91dC93YXJkcm9iZS9kZWxldGUucG5nXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAgIHRpdGxlPVxcXCJcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LmRlbGV0ZV90b29sdGlwXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAgIGFsdD1cXFwiXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5kZWxldGVcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIC8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8L3RkPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8L3RyPlwiKTt0LmIoXCJcXG5cIiArIGkpO30pO2MucG9wKCk7fXQuYihcIiAgPC90Ym9keT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L3RhYmxlPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxzdHlsZT5cXG4gIC5yZXNldC1hbGwge1xcbiAgICBtYXJnaW4tYm90dG9tOiAxZW07XFxuICB9XFxuXFxuICB0YWJsZSB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICB9XFxuXFxuICAudGV4dC1wYWRkaW5nIHtcXG4gICAgcGFkZGluZzogMC4yNWVtO1xcbiAgfVxcblxcbiAgLmFjdGlvbi1waWN0byB7XFxuICAgIGhlaWdodDogNTBweDtcXG4gICAgd2lkdGg6IDUwcHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gIH1cXG5cXG4gIC5hY3Rpb24tcGljdG86aG92ZXI6bm90KC5kaXNhYmxlZCksXFxuICAuZWRpdC1wcmljZTpob3ZlciB7XFxuICAgIGFuaW1hdGlvbjogYnV0dG9uLWJvdW5jZSAzMDBtcyBsaW5lYXIgZm9yd2FyZHM7XFxuICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxLjA1KSBjb250cmFzdCgxLjEpO1xcbiAgfVxcblxcbiAgLnJvdyB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgfVxcblxcbiAgLmVkaXQtcHJpY2Uge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICB9XFxuXFxuICBpbWcuZGlzYWJsZWQge1xcbiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgxKTtcXG4gIH1cXG5cXG4gIC5pdGVtLWljb24tY29udGFpbmVyIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB9XFxuXFxuICAuaXRlbS1pY29uIHtcXG4gICAgd2lkdGg6IDEwMHB4O1xcbiAgICBoZWlnaHQ6IDEwMHB4O1xcbiAgfVxcbjwvc3R5bGU+XFxuXFxuPGJ1dHRvbiBjbGFzcz1cXFwibmwtYnV0dG9uIHJlc2V0LWFsbFxcXCI+XFxuICB7e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QucmVzZXRfYWxsfX1cXG48L2J1dHRvbj5cXG5cXG48dGFibGU+XFxuICA8dGhlYWQ+XFxuICAgIDx0cj5cXG4gICAgICA8dGg+e3t0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0Lmljb259fTwvdGg+XFxuICAgICAgPHRoPnt7dHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5uYW1lfX08L3RoPlxcbiAgICAgIDx0aD57e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QucHJpY2V9fTwvdGg+XFxuICAgICAgPHRoPnt7dHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5zdGF0dXN9fTwvdGg+XFxuICAgICAgPHRoPnt7dHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5hY3Rpb25zfX08L3RoPlxcbiAgICA8L3RyPlxcbiAgPC90aGVhZD5cXG4gIDx0Ym9keT5cXG4gICAge3sjd2lzaGxpc3R9fVxcbiAgICA8dHIgY2xhc3M9XFxcIm1hcmtldHBsYWNlLWFic3RyYWN0XFxcIiBkYXRhLWljb249XFxcInt7aWNvbn19XFxcIj5cXG4gICAgICA8IS0tIEljb24gLS0+XFxuICAgICAgPHRkPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiaXRlbS1pY29uLWNvbnRhaW5lclxcXCI+XFxuICAgICAgICAgIDxpbWcgY2xhc3M9XFxcIml0ZW0taWNvblxcXCIgc3JjPVxcXCJ7e2ljb259fVxcXCIgYWx0PVxcXCJ7e25hbWV9fVxcXCIgLz5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwicmFyaXR5LW1hcmtlci17e3Jhcml0eX19XFxcIj48L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvdGQ+XFxuXFxuICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgIDx0ZCBjbGFzcz1cXFwidGV4dC1wYWRkaW5nXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LW5hbWVcXFwiPnt7bmFtZX19PC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC10eXBlXFxcIj57e2Fic3RyYWN0VHlwZX19PC9kaXY+XFxuICAgICAgPC90ZD5cXG5cXG4gICAgICA8IS0tIFByaWNlIC0tPlxcbiAgICAgIDx0ZCBjbGFzcz1cXFwidGV4dC1wYWRkaW5nXFxcIj5cXG4gICAgICAgIDxkaXZcXG4gICAgICAgICAgY2xhc3M9XFxcImVkaXQtcHJpY2Ugcm93XFxcIlxcbiAgICAgICAgICB0aXRsZT1cXFwie3t0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LmNoYW5nZV9wcmljZX19XFxcIlxcbiAgICAgICAgPlxcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwicHJpY2UtaXRlbVxcXCI+e3twcmljZX19PC9zcGFuPlxcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWFhbmEtaWNvblxcXCIgYWx0PVxcXCJtYWFuYXNcXFwiPjwvc3Bhbj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvdGQ+XFxuXFxuICAgICAgPCEtLSBFcnJvciAtLT5cXG4gICAgICA8dGQgY2xhc3M9XFxcInRleHQtcGFkZGluZ1xcXCI+XFxuICAgICAgICA8cCBjbGFzcz1cXFwiZXJyb3JcXFwiPnt7ZXJyb3J9fTwvcD5cXG4gICAgICA8L3RkPlxcblxcbiAgICAgIDwhLS0gQWN0aW9ucyAtLT5cXG4gICAgICA8dGQ+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyb3dcXFwiPlxcbiAgICAgICAgICA8aW1nXFxuICAgICAgICAgICAgY2xhc3M9XFxcImFjdGlvbi1waWN0byByZXNldC1pdGVtLXN0YXR1cyB7e15lcnJvcn19ZGlzYWJsZWR7ey9lcnJvcn19XFxcIlxcbiAgICAgICAgICAgIHNyYz1cXFwiL3N0YXRpYy9pbWcvbmV3LWxheW91dC93YXJkcm9iZS9yZXNldC1idG4ucG5nXFxcIlxcbiAgICAgICAgICAgIHRpdGxlPVxcXCJ7e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QucmVzZXRfdG9vbHRpcH19XFxcIlxcbiAgICAgICAgICAgIGFsdD1cXFwie3t0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LnJlc2V0fX1cXFwiXFxuICAgICAgICAgIC8+XFxuICAgICAgICAgIDxpbWdcXG4gICAgICAgICAgICBjbGFzcz1cXFwiYWN0aW9uLXBpY3RvIGRlbGV0ZS13aXNobGlzdC1pdGVtXFxcIlxcbiAgICAgICAgICAgIHNyYz1cXFwiL3N0YXRpYy9pbWcvbmV3LWxheW91dC93YXJkcm9iZS9kZWxldGUucG5nXFxcIlxcbiAgICAgICAgICAgIHRpdGxlPVxcXCJ7e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QuZGVsZXRlX3Rvb2x0aXB9fVxcXCJcXG4gICAgICAgICAgICBhbHQ9XFxcInt7dHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5kZWxldGV9fVxcXCJcXG4gICAgICAgICAgLz5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvdGQ+XFxuICAgIDwvdHI+XFxuICAgIHt7L3dpc2hsaXN0fX1cXG4gIDwvdGJvZHk+XFxuPC90YWJsZT5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJpbXBvcnQgeyBCb2R5TG9jYXRpb24gfSBmcm9tIFwiLi4vbWFya2V0cGxhY2UvZW51bXMvYm9keV9sb2NhdGlvbi5lbnVtXCJcbmltcG9ydCB7IENhdGVnb3J5TnVtYmVyIH0gZnJvbSBcIi4uL21hcmtldHBsYWNlL2VudW1zL2NhdGVnb3J5LmVudW1cIlxuaW1wb3J0IHsgR3VhcmQgfSBmcm9tIFwiLi4vbWFya2V0cGxhY2UvZW51bXMvZ3VhcmQuZW51bVwiXG5pbXBvcnQgeyBSYXJpdHkgfSBmcm9tIFwiLi4vbWFya2V0cGxhY2UvZW51bXMvcmFyaXR5LmVudW1cIlxuaW1wb3J0IHsgVHlwZSB9IGZyb20gXCIuLi9tYXJrZXRwbGFjZS9lbnVtcy90eXBlLmVudW1cIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWpheFNlYXJjaChkYXRhOiB7XG4gIHR5cGU/OiBUeXBlXG4gIGJvZHlMb2NhdGlvbj86IEJvZHlMb2NhdGlvblxuICBjYXRlZ29yeT86IENhdGVnb3J5TnVtYmVyXG4gIHJhcml0eT86IFJhcml0eVxuICBwcmljZT86IG51bWJlciB8IFwiXCJcbiAgZ3VhcmQ/OiBHdWFyZFxuICAvKiogUGFnZSBudW1iZXIsIGluZGV4ZWQgYnkgMSAqL1xuICBwYWdlOiBudW1iZXJcbiAgbmFtZT86IHN0cmluZ1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGRhdGEgPSB7XG4gICAgLi4ue1xuICAgICAgdHlwZTogVHlwZS5BbGwsXG4gICAgICBib2R5TG9jYXRpb246IEJvZHlMb2NhdGlvbi5BbGwsXG4gICAgICBjYXRlZ29yeTogQ2F0ZWdvcnlOdW1iZXIuYWxsLFxuICAgICAgcmFyaXR5OiBSYXJpdHkuYWxsLFxuICAgICAgcHJpY2U6IFwiXCIsXG4gICAgICBndWFyZDogR3VhcmQuYW55LFxuICAgICAgcGFnZTogMSxcbiAgICAgIG5hbWU6IFwiXCIsXG4gICAgfSxcbiAgICAuLi5kYXRhLFxuICB9XG5cbiAgY29uc3QgSVRFTVNfUEVSX1BBR0UgPSA4XG4gIHJldHVybiAoYXdhaXQgJC5nZXQoXCIvbWFya2V0cGxhY2UvYWpheF9zZWFyY2hcIiwge1xuICAgIC4uLmRhdGEsXG4gICAgZnJvbTogKGRhdGEucGFnZSAtIDEpICogSVRFTVNfUEVSX1BBR0UsXG4gICAgdG86IElURU1TX1BFUl9QQUdFLFxuICB9KSkgYXMgc3RyaW5nXG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2tldCB9IGZyb20gXCIuLi9hcGkvcGFja2V0XCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnV5KGl0ZW1JZDogbnVtYmVyKTogUHJvbWlzZTxQYWNrZXQ8XCJcIj4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIHZvaWQgJC5wb3N0KFxuICAgICAgXCIvbWFya2V0cGxhY2UvYnV5XCIsXG4gICAgICB7IGlkOiBpdGVtSWQgfSxcbiAgICAgIChqc29uOiBQYWNrZXQ8XCJcIj4pOiB2b2lkID0+IHtcbiAgICAgICAgTG9jYWxTdG9yYWdlLm1ldGEgPSBqc29uLm1ldGFcbiAgICAgICAgcmVzb2x2ZShqc29uKVxuXG4gICAgICAgIGlmIChqc29uLnJlc3VsdCAhPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAkLmZsYXZyTm90aWYoanNvbi5kYXRhKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJqc29uXCJcbiAgICApXG4gIH0pXG59XG4iLCJpbXBvcnQgdHlwZSB7IEV4cGxvcmF0aW9uUmVzdWx0c0RhdGEgfSBmcm9tIFwiLi4vYXBpL2V4cGxvcmF0aW9uX3Jlc3VsdHNfZGF0YVwiXG5pbXBvcnQgdHlwZSB7IFBhY2tldCB9IGZyb20gXCIuLi9hcGkvcGFja2V0XCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FwdHVyZUVuZCgpOiBQcm9taXNlPFBhY2tldDxFeHBsb3JhdGlvblJlc3VsdHNEYXRhPj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgdm9pZCAkLnBvc3QoXG4gICAgICBcIi9wZXQvY2FwdHVyZS9lbmRcIixcbiAgICAgIChqc29uOiBQYWNrZXQ8RXhwbG9yYXRpb25SZXN1bHRzRGF0YT4pOiB2b2lkID0+IHtcbiAgICAgICAgTG9jYWxTdG9yYWdlLm1ldGEgPSBqc29uLm1ldGFcbiAgICAgICAgcmVzb2x2ZShqc29uKVxuXG4gICAgICAgIGlmIChqc29uLnJlc3VsdCAhPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAkLmZsYXZyTm90aWYoanNvbi5kYXRhKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuICB9KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDaGFuZ2VSZWdpb25EYXRhIH0gZnJvbSBcIi4uL2FwaS9jaGFuZ2VfcmVnaW9uX2RhdGFcIlxuaW1wb3J0IHR5cGUgeyBQYWNrZXQgfSBmcm9tIFwiLi4vYXBpL3BhY2tldFwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoYW5nZVJlZ2lvbihcbiAgbmV3UmVnaW9uSWQ6IG51bWJlclxuKTogUHJvbWlzZTxQYWNrZXQ8Q2hhbmdlUmVnaW9uRGF0YT4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFBhY2tldDxDaGFuZ2VSZWdpb25EYXRhPj4oKHJlc29sdmUpOiB2b2lkID0+IHtcbiAgICB2b2lkICQucG9zdChcbiAgICAgIFwiL3BldC9jaGFuZ2VSZWdpb25cIixcbiAgICAgIHsgbmV3UmVnaW9uSWQgfSxcbiAgICAgIChqc29uOiBQYWNrZXQ8Q2hhbmdlUmVnaW9uRGF0YT4pOiB2b2lkID0+IHtcbiAgICAgICAgTG9jYWxTdG9yYWdlLm1ldGEgPSBqc29uLm1ldGFcbiAgICAgICAgcmVzb2x2ZShqc29uKVxuXG4gICAgICAgIGlmIChqc29uLnJlc3VsdCAhPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAkLmZsYXZyTm90aWYoanNvbi5kYXRhKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFJlZ2lvbiA9IGpzb24uZGF0YS5jdXJyZW50UmVnaW9uXG5cbiAgICAgICAgcGVuZGluZ1RyZWFzdXJlSHVudExvY2F0aW9uID1cbiAgICAgICAgICB0eXBlb2YganNvbi5kYXRhLnBlbmRpbmdUcmVhc3VyZUh1bnRMb2NhdGlvbiA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IGpzb24uZGF0YS5wZW5kaW5nVHJlYXN1cmVIdW50TG9jYXRpb25cblxuICAgICAgICB0aW1lTGVmdEV4cGxvcmF0aW9uID1cbiAgICAgICAgICB0eXBlb2YganNvbi5kYXRhLnRpbWVMZWZ0RXhwbG9yYXRpb24gPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiBqc29uLmRhdGEudGltZUxlZnRFeHBsb3JhdGlvblxuICAgICAgfVxuICAgIClcbiAgfSlcbn1cbiIsImltcG9ydCB0eXBlIHsgRXhwbG9yYXRpb25SZXN1bHRzRGF0YSB9IGZyb20gXCIuLi9hcGkvZXhwbG9yYXRpb25fcmVzdWx0c19kYXRhXCJcbmltcG9ydCB0eXBlIHsgUGFja2V0IH0gZnJvbSBcIi4uL2FwaS9wYWNrZXRcIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBsb3JhdGlvblJlc3VsdHMoKTogUHJvbWlzZTxcbiAgUGFja2V0PEV4cGxvcmF0aW9uUmVzdWx0c0RhdGE+XG4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFBhY2tldDxFeHBsb3JhdGlvblJlc3VsdHNEYXRhPj4oKHJlc29sdmUpOiB2b2lkID0+IHtcbiAgICB2b2lkICQucG9zdChcbiAgICAgIFwiL3BldC9leHBsb3JhdGlvblJlc3VsdHNcIixcbiAgICAgIChqc29uOiBQYWNrZXQ8RXhwbG9yYXRpb25SZXN1bHRzRGF0YT4pOiB2b2lkID0+IHtcbiAgICAgICAgTG9jYWxTdG9yYWdlLm1ldGEgPSBqc29uLm1ldGFcbiAgICAgICAgcmVzb2x2ZShqc29uKVxuXG4gICAgICAgIGlmIChqc29uLnJlc3VsdCAhPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAkLmZsYXZyTm90aWYoanNvbi5kYXRhKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuICB9KVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBNZXRhIHtcbiAgZXZlbnQ6IE1ldGFFdmVudFxuICBtZXNzYWdlOiBNZXNzYWdlXG4gIG5vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbnNcbiAgcGV0OiBQZXRcbiAgcGxheWVyOiBQbGF5ZXJcbiAgcHVycm9zaG9wOiBQdXJyb3Nob3Bcbn1cblxudHlwZSBNZXRhRXZlbnQgPSBcImVhc3RlclwiIHwgbnVsbFxuXG5pbnRlcmZhY2UgTWVzc2FnZSB7XG4gIHVucmVhZDogc3RyaW5nXG59XG5cbmludGVyZmFjZSBQZXQge1xuICAvKiogRXhwbG9yYXRpb24gaXMgZmluaXNoZWQgKi9cbiAgZXhwbG9yYXRpb246IGJvb2xlYW5cbiAgcG9ydHJhaXQ6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgUGxheWVyIHtcbiAgZGFpbHlNYWFuYTogYm9vbGVhblxuICBnb2xkOiBDdXJyZW5jeVxuICBsZWdhY3lDdXJyZW5jeTogQ3VycmVuY3lcbiAgbWFhbmE6IEN1cnJlbmN5XG4gIHB1cnJvcGFzczogUHVycm9wYXNzXG4gIHVucmVhZE5ld3M6IG51bGxcbiAgeHA6IFhQXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VycmVuY3kge1xuICBjaGFuZ2U6IENoYW5nZVxuICB0ZXh0OiBzdHJpbmdcbiAgdmFsdWU6IG51bWJlclxufVxuXG5pbnRlcmZhY2UgQ2hhbmdlIHtcbiAgdGV4dDogc3RyaW5nXG4gIHZhbHVlOiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIFB1cnJvcGFzcyB7XG4gIGNoYW5nZTogQ2hhbmdlXG4gIHRleHQ6IHN0cmluZ1xuICB2YWx1ZTogc3RyaW5nXG59XG5cbmludGVyZmFjZSBYUCB7XG4gIGdvYWw6IG51bWJlclxuICBsZXZlbDogbnVtYmVyXG4gIHZhbHVlOiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIFB1cnJvc2hvcCB7XG4gIHN0YXR1czogUHVycm9zaG9wU3RhdHVzXG59XG5cbmludGVyZmFjZSBOb3RpZmljYXRpb25zIHtcbiAgZGlzcGxheVRpbWU6IG51bWJlclxuICBtZXNzYWdlOiBzdHJpbmdcbiAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBlbnVtIFB1cnJvc2hvcFN0YXR1cyB7XG4gIGRpc2FibGVkID0gXCJkaXNhYmxlZFwiLFxuICBlbmFibGVkID0gXCJlbmFibGVkXCIsXG59XG4iLCJleHBvcnQgZW51bSBSZXN1bHQge1xuICBlcnJvciA9IFwiZXJyb3JcIixcbiAgc3VjY2VzcyA9IFwic3VjY2Vzc1wiLFxufVxuIiwiaW1wb3J0IHdhcmRyb2JlIGZyb20gXCIuL3dhcmRyb2JlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRBcHBlYXJhbmNlVUkoKTogdm9pZCB7XG4gIHNldHVwQmFja2dyb3VuZCgpXG4gIHNldHVwTGVmdFBhbmVsKClcbiAgc2V0dXBSaWdodFBhbmVsKClcblxuICBpZiAod2FyZHJvYmUuYXZhaWxhYmxlSXRlbXMpIGF2YWlsYWJsZUl0ZW1zID0gd2FyZHJvYmUuYXZhaWxhYmxlSXRlbXNcbiAgZWxzZSB3YXJkcm9iZS5hdmFpbGFibGVJdGVtcyA9IGF2YWlsYWJsZUl0ZW1zXG59XG5cbmZ1bmN0aW9uIHNldHVwQmFja2dyb3VuZCgpOiB2b2lkIHtcbiAgY29uc3QgYmFja2dyb3VuZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEltYWdlRWxlbWVudD4oXG4gICAgXCIjYXZhdGFyLWJhY2tncm91bmQgaW1nXCJcbiAgKVxuICBpZiAoYmFja2dyb3VuZCkge1xuICAgIGJhY2tncm91bmQuc3R5bGUuZmlsdGVyID0gXCJ1bnNldFwiXG4gICAgYmFja2dyb3VuZC5zdHlsZS5oZWlnaHQgPSBcInVuc2V0XCJcbiAgICBiYWNrZ3JvdW5kLnN0eWxlLm1hc2sgPVxuICAgICAgXCJsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIGJsYWNrIDUwJSwgdHJhbnNwYXJlbnQgMTAwJSlcIlxuICAgIGJhY2tncm91bmQuc3R5bGUubWluSGVpZ2h0ID0gXCIxMDB2aFwiXG4gICAgYmFja2dyb3VuZC5zdHlsZS5taW5XaWR0aCA9IFwiNTB2d1wiXG4gICAgYmFja2dyb3VuZC5zdHlsZS5wb3NpdGlvbiA9IFwiZml4ZWRcIlxuICAgIGJhY2tncm91bmQuc3R5bGUudHJhbnNmb3JtID0gXCJ1bnNldFwiXG4gICAgYmFja2dyb3VuZC5zdHlsZS53aWR0aCA9IFwidW5zZXRcIlxuICB9XG59XG5cbmZ1bmN0aW9uIHNldHVwUmlnaHRQYW5lbCgpOiB2b2lkIHtcbiAgY29uc3QgcmlnaHRQYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYXBwZWFyYW5jZS1yaWdodFwiKVxuICBpZiAocmlnaHRQYW5lbCkgcmlnaHRQYW5lbC5zdHlsZS5wYWRkaW5nVG9wID0gXCI4MHB4XCJcbn1cblxuZnVuY3Rpb24gc2V0dXBMZWZ0UGFuZWwoKTogdm9pZCB7XG4gIGNvbnN0IHByZXZpZXdPdXRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYXBwZWFyYW5jZS1wcmV2aWV3LW91dGVyXCIpXG4gIGlmIChwcmV2aWV3T3V0ZXIpIHtcbiAgICBwcmV2aWV3T3V0ZXIuc3R5bGUucGFkZGluZyA9IFwiMHB4XCJcbiAgfVxuXG4gIGNvbnN0IHByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFwcGVhcmFuY2UtcHJldmlld1wiKVxuICBpZiAocHJldmlldykge1xuICAgIHByZXZpZXcuc3R5bGUubGVmdCA9IFwiMFwiXG4gICAgcHJldmlldy5zdHlsZS5wb3NpdGlvbiA9IFwiZml4ZWRcIlxuICAgIHByZXZpZXcuc3R5bGUudG9wID0gXCJjYWxjKDUwJSAtIHZhcigtLXRvcGJhci1oZWlnaHQpKVwiXG4gICAgcHJldmlldy5zdHlsZS50cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZVkoLTUwJSlcIlxuICB9XG5cbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQ2FudmFzRWxlbWVudD4oXG4gICAgXCIjYXBwZWFyYW5jZS1wcmV2aWV3IGNhbnZhc1wiXG4gIClcbiAgaWYgKGNhbnZhcykge1xuICAgIGNhbnZhcy5zdHlsZS5tYXhIZWlnaHQgPSBcIjEwMHZoXCJcbiAgICBjYW52YXMuc3R5bGUubWF4V2lkdGggPSBcIjUwdndcIlxuICB9XG59XG4iLCJpbXBvcnQgeyB0cmltSWNvbiB9IGZyb20gXCIuLi9lbGRhcnlhX3V0aWxcIlxuaW1wb3J0IHR5cGUgeyBBcHBlYXJhbmNlQ2F0ZWdvcnkgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvYXBwZWFyYW5jZV9jYXRlZ29yeVwiXG5pbXBvcnQgdHlwZSB7IEFwcGVhcmFuY2VHcm91cCB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9hcHBlYXJhbmNlX2dyb3VwXCJcbmltcG9ydCB0eXBlIHsgQXBwZWFyYW5jZUl0ZW0gfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvYXBwZWFyYW5jZV9pdGVtXCJcbmltcG9ydCB0eXBlIHsgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZSB9IGZyb20gXCIuL2VudW1zL2FwcGVhcmFuY2VfY2F0ZWdvcnlfY29kZS5lbnVtXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3J5Q29udGFpbmVyRGF0YVNldChcbiAgY2F0ZWdvcnlDb250YWluZXI6IEhUTUxEaXZFbGVtZW50XG4pOiBBcHBlYXJhbmNlQ2F0ZWdvcnkgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGNhdGVnb3J5aWQsIGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUgfSA9IGNhdGVnb3J5Q29udGFpbmVyLmRhdGFzZXRcbiAgaWYgKCFjYXRlZ29yeWlkIHx8ICFjYXRlZ29yeSB8fCAhY2F0ZWdvcnluYW1lKSByZXR1cm5cbiAgcmV0dXJuIHtcbiAgICBjYXRlZ29yeWlkOiBOdW1iZXIoY2F0ZWdvcnlpZCksXG4gICAgY2F0ZWdvcnk6IGNhdGVnb3J5IGFzIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUsXG4gICAgY2F0ZWdvcnluYW1lLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeUdyb3VwRGF0YVNldChcbiAgZ3JvdXBJdGVtOiBIVE1MTElFbGVtZW50LFxuICBhcHBlYXJhbmNlQ2F0ZWdvcnk6IEFwcGVhcmFuY2VDYXRlZ29yeVxuKTogQXBwZWFyYW5jZUdyb3VwIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBpdGVtaWQsIGdyb3VwLCBuYW1lLCByYXJpdHksIHJhcml0eW5hbWUgfSA9IGdyb3VwSXRlbS5kYXRhc2V0XG4gIGlmICghaXRlbWlkIHx8ICFncm91cCB8fCAhbmFtZSB8fCAhcmFyaXR5IHx8ICFyYXJpdHluYW1lKSByZXR1cm5cbiAgcmV0dXJuIHtcbiAgICAuLi5hcHBlYXJhbmNlQ2F0ZWdvcnksXG4gICAgaXRlbWlkOiBOdW1iZXIoaXRlbWlkKSxcbiAgICBncm91cDogTnVtYmVyKGdyb3VwKSxcbiAgICBuYW1lLFxuICAgIHJhcml0eSxcbiAgICByYXJpdHluYW1lLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpdGVtRGF0YVNldChcbiAgbGk6IEhUTUxMSUVsZW1lbnQsXG4gIGFwcGVhcmFuY2VHcm91cDogQXBwZWFyYW5jZUdyb3VwXG4pOiBBcHBlYXJhbmNlSXRlbSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgaXRlbWlkLCBuYW1lLCByYXJpdHksIHJhcml0eW5hbWUgfSA9IGxpLmRhdGFzZXRcbiAgY29uc3QgaWNvbiA9IGxpLnF1ZXJ5U2VsZWN0b3IoXCJpbWdcIik/LnNyY1xuICBpZiAoIWl0ZW1pZCB8fCAhbmFtZSB8fCAhcmFyaXR5IHx8ICFyYXJpdHluYW1lIHx8ICFpY29uKSByZXR1cm5cblxuICByZXR1cm4ge1xuICAgIC4uLmFwcGVhcmFuY2VHcm91cCxcbiAgICBpdGVtaWQ6IE51bWJlcihpdGVtaWQpLFxuICAgIG5hbWUsXG4gICAgcmFyaXR5LFxuICAgIHJhcml0eW5hbWUsXG4gICAgaWNvbjogdHJpbUljb24oaWNvbiksXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IGlzRW51bSB9IGZyb20gXCIuLi90c191dGlsXCJcbmltcG9ydCB7IGxvYWRGYXZvdXJpdGVzIH0gZnJvbSBcIi4uL3VpL2Zhdm91cml0ZXNcIlxuaW1wb3J0IHsgbG9hZEFwcGVhcmFuY2VVSSB9IGZyb20gXCIuL2FwcGVhcmFuY2VfdWlcIlxuaW1wb3J0IHtcbiAgY2F0ZWdvcnlDb250YWluZXJEYXRhU2V0LFxuICBjYXRlZ29yeUdyb3VwRGF0YVNldCxcbiAgaXRlbURhdGFTZXQsXG59IGZyb20gXCIuL2RhdGFfc2V0XCJcbmltcG9ydCB7IEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUgfSBmcm9tIFwiLi9lbnVtcy9hcHBlYXJhbmNlX2NhdGVnb3J5X2NvZGUuZW51bVwiXG5pbXBvcnQgeyBvcGVuQ2F0ZWdvcnksIG9wZW5Hcm91cCB9IGZyb20gXCIuL2Zhdm91cml0ZXNfYWN0aW9uc1wiXG5pbXBvcnQgeyBsb2FkSGlkZGVuQ2F0ZWdvcnksIHVubG9hZEhpZGRlbkNhdGVnb3JpZXMgfSBmcm9tIFwiLi9oaWRkZW5cIlxuaW1wb3J0IHdhcmRyb2JlIGZyb20gXCIuL3dhcmRyb2JlXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWREcmVzc2luZ0V4cGVyaWVuY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghbG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aChcIi9wbGF5ZXIvYXBwZWFyYW5jZVwiKSkgcmV0dXJuXG5cbiAgaGFuZGxlZENhdGVnb3JpZXMuY2xlYXIoKVxuICBsb2FkaW5nID0gZmFsc2VcblxuICBsb2FkQXBwZWFyYW5jZVVJKClcblxuICAvLyBTZXR1cCBjYXRlZ29yaWVzXG4gIGZvciAoY29uc3QgbGkgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MTElFbGVtZW50PihcbiAgICBcIiN3YXJkcm9iZS1tZW51PmxpLCAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yaWVzIGxpXCJcbiAgKSkge1xuICAgIGNvbnN0IHsgY2F0ZWdvcnkgfSA9IGxpLmRhdGFzZXRcbiAgICBpZiAoIWlzRW51bShjYXRlZ29yeSwgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZSkpIGNvbnRpbnVlXG5cbiAgICBzd2l0Y2ggKGNhdGVnb3J5KSB7XG4gICAgICBjYXNlIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuYmFja2dyb3VuZDpcbiAgICAgICAgbGkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlZS1jYXRlZ29yeVwiKT8ucmVtb3ZlKClcbiAgICAgICAgKVxuICAgICAgICBjb250aW51ZVxuICAgICAgY2FzZSBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmZhdm9yaXRlczpcbiAgICAgICAgbGkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVlLWNhdGVnb3J5XCIpPy5yZW1vdmUoKVxuICAgICAgICAgIHZvaWQgaGFuZGxlQ2F0ZWdvcnkoY2F0ZWdvcnkpXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBjYXNlIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuYXR0aWM6XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsaS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgIGRvY3VtZW50XG4gICAgICAgICAgICAuZ2V0RWxlbWVudEJ5SWQoXCJhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlc1wiKVxuICAgICAgICAgICAgPy5yZW1vdmUoKVxuICAgICAgICAgIC8vIHZvaWQgaGFuZGxlQ2F0ZWdvcnkoY2F0ZWdvcnkpXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKVxuICAvLyBhd2FpdCBsb2FkQmFja2dyb3VuZCgpXG59XG5cbi8qKlxuICogR2V0IHRoZSBjYXRlZ29yeSBjb250YWluZXIgZm9yIHRoZSBjbGlja2VkIGNhdGVnb3J5IGFuZCBsb2FkIGl0cyBncm91cHNcbiAqIEByZXR1cm5zIENhdGVnb3J5IGNvbnRhaW5lclxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVDYXRlZ29yeShcbiAgY2F0ZWdvcnk6IEFwcGVhcmFuY2VDYXRlZ29yeUNvZGVcbik6IFByb21pc2U8SFRNTERpdkVsZW1lbnQgfCBudWxsPiB7XG4gIGNvbnN0IGFwcGVhcmFuY2VJdGVtcyA9XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIjYXBwZWFyYW5jZS1pdGVtc1wiKVxuICBpZiAoIWFwcGVhcmFuY2VJdGVtcykgcmV0dXJuIG51bGxcblxuICBjb25zdCBvbGRDYXRDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcbiAgICBgI2FwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnktJHtjYXRlZ29yeX1gXG4gIClcblxuICBpZiAob2xkQ2F0Q29udGFpbmVyKSB7XG4gICAgYXdhaXQgb25BcHBlYXJhbmNlSXRlbXNDYXRlZ29yeShjYXRlZ29yeSwgYXBwZWFyYW5jZUl0ZW1zLCBvbGRDYXRDb250YWluZXIpXG4gICAgcmV0dXJuIG9sZENhdENvbnRhaW5lclxuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKChfLCBvYnNlcnZlcikgPT4ge1xuICAgICAgY29uc3QgbmV3Q2F0Q29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgICAgIGAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS0ke2NhdGVnb3J5fWBcbiAgICAgIClcbiAgICAgIGlmICghbmV3Q2F0Q29udGFpbmVyKSByZXR1cm5cbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKVxuXG4gICAgICB2b2lkIChhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGF3YWl0IG9uQXBwZWFyYW5jZUl0ZW1zQ2F0ZWdvcnkoXG4gICAgICAgICAgY2F0ZWdvcnksXG4gICAgICAgICAgYXBwZWFyYW5jZUl0ZW1zLFxuICAgICAgICAgIG5ld0NhdENvbnRhaW5lclxuICAgICAgICApXG4gICAgICAgIHJlc29sdmUobmV3Q2F0Q29udGFpbmVyKVxuICAgICAgfSkoKVxuICAgIH0pLm9ic2VydmUoYXBwZWFyYW5jZUl0ZW1zLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KVxuICB9KVxufVxuXG5hc3luYyBmdW5jdGlvbiBvbkFwcGVhcmFuY2VJdGVtc0NhdGVnb3J5KFxuICBjYXRlZ29yeTogQXBwZWFyYW5jZUNhdGVnb3J5Q29kZSxcbiAgYXBwZWFyYW5jZUl0ZW1zOiBIVE1MRGl2RWxlbWVudCxcbiAgY2F0ZWdvcnlDb250YWluZXI6IEhUTUxEaXZFbGVtZW50XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGNhdGVnb3J5ID09PSBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmZhdm9yaXRlcykgbG9hZEZhdm91cml0ZXMoKVxuICBlbHNlIHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjIwKSlcbiAgICBsb2FkRWVJdGVtcyhhcHBlYXJhbmNlSXRlbXMsIGNhdGVnb3J5Q29udGFpbmVyKVxuICAgIGF3YWl0IGhhbmRsZUdyb3VwcyhjYXRlZ29yeUNvbnRhaW5lcilcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2FkRWVJdGVtcyhcbiAgYXBwZWFyYW5jZUl0ZW1zOiBIVE1MRGl2RWxlbWVudCxcbiAgY2F0ZWdvcnlDb250YWluZXI6IEhUTUxEaXZFbGVtZW50XG4pOiBIVE1MRGl2RWxlbWVudCB8IG51bGwge1xuICAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgY2F0ZWdvcnlcbiAgY29uc3QgYXBwZWFyYW5jZUNhdGVnb3J5ID0gY2F0ZWdvcnlDb250YWluZXJEYXRhU2V0KGNhdGVnb3J5Q29udGFpbmVyKVxuICBpZiAoIWFwcGVhcmFuY2VDYXRlZ29yeSkgcmV0dXJuIG51bGxcbiAgd2FyZHJvYmUuc2V0Q2F0ZWdvcnkoYXBwZWFyYW5jZUNhdGVnb3J5KVxuICBjYXRlZ29yeUNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpXG4gIGNhdGVnb3J5Q29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuXG4gIC8vIFNldHVwIGFwcGVhcmFuY2VfaXRlbXNfY2F0ZWdvcnlcbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2FwcGVhcmFuY2VfaXRlbXNfY2F0ZWdvcnkuaHRtbFwiKVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVlLWNhdGVnb3J5XCIpPy5yZW1vdmUoKVxuICBhcHBlYXJhbmNlSXRlbXMuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgdGVtcGxhdGUucmVuZGVyKHsgLi4uYXBwZWFyYW5jZUNhdGVnb3J5LCB0cmFuc2xhdGUgfSlcbiAgKVxuXG4gIGNvbnN0IGVlSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcIiNlZS1pdGVtc1wiKVxuICBpZiAoIWVlSXRlbXMpIHJldHVybiBudWxsXG4gIGVlSXRlbXMuZGF0YXNldC5jYXRlZ29yeWlkID0gYXBwZWFyYW5jZUNhdGVnb3J5LmNhdGVnb3J5aWQudG9TdHJpbmcoKVxuICBlZUl0ZW1zLmRhdGFzZXQuY2F0ZWdvcnkgPSBhcHBlYXJhbmNlQ2F0ZWdvcnkuY2F0ZWdvcnlcbiAgZWVJdGVtcy5kYXRhc2V0LmNhdGVnb3J5bmFtZSA9IGFwcGVhcmFuY2VDYXRlZ29yeS5jYXRlZ29yeW5hbWVcbiAgcmV0dXJuIGVlSXRlbXNcbn1cblxuY29uc3QgaGFuZGxlZENhdGVnb3JpZXMgPSBuZXcgU2V0PEFwcGVhcmFuY2VDYXRlZ29yeUNvZGU+KClcblxuLyoqIExvYWQgZWFjaCBncm91cHMgc3luY2hyb25vdXNseSBhbmQgYWRkIHRoZW0gdG8gYSBjdXN0b20gY29udGFpbmVyLiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlR3JvdXBzKGNhdGVnb3J5Q29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcHBlYXJhbmNlQ2F0ZWdvcnkgPSBjYXRlZ29yeUNvbnRhaW5lckRhdGFTZXQoY2F0ZWdvcnlDb250YWluZXIpXG4gIGlmICghYXBwZWFyYW5jZUNhdGVnb3J5KSByZXR1cm5cbiAgd2FyZHJvYmUuc2V0Q2F0ZWdvcnkoYXBwZWFyYW5jZUNhdGVnb3J5KVxuICBjYXRlZ29yeUNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpXG4gIGNhdGVnb3J5Q29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuXG4gIGNvbnN0IGhhbmRsZWQgPSBoYW5kbGVkQ2F0ZWdvcmllcy5oYXMoYXBwZWFyYW5jZUNhdGVnb3J5LmNhdGVnb3J5KVxuICBoYW5kbGVkQ2F0ZWdvcmllcy5hZGQoYXBwZWFyYW5jZUNhdGVnb3J5LmNhdGVnb3J5KVxuXG4gIGxvYWRIaWRkZW5DYXRlZ29yeShhcHBlYXJhbmNlQ2F0ZWdvcnkuY2F0ZWdvcnkpXG4gIGZvciAoY29uc3QgbGkgb2YgY2F0ZWdvcnlDb250YWluZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MTElFbGVtZW50PihcbiAgICBcImxpLmFwcGVhcmFuY2UtaXRlbS1ncm91cFwiXG4gICkpIHtcbiAgICBjb25zdCBhcHBlYXJhbmNlR3JvdXAgPSBjYXRlZ29yeUdyb3VwRGF0YVNldChsaSwgYXBwZWFyYW5jZUNhdGVnb3J5KVxuICAgIGlmICghYXBwZWFyYW5jZUdyb3VwPy5ncm91cCkgYnJlYWtcbiAgICB3YXJkcm9iZS5zZXRHcm91cChhcHBlYXJhbmNlR3JvdXApXG5cbiAgICBpZiAoXG4gICAgICAhZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgYCNhcHBlYXJhbmNlLWl0ZW1zLWdyb3VwLSR7YXBwZWFyYW5jZUdyb3VwLmdyb3VwfWBcbiAgICAgICkgJiZcbiAgICAgICFoYW5kbGVkXG4gICAgICAvLyAmJiAhbG9hZEhpZGRlbkdyb3VwKGFwcGVhcmFuY2VHcm91cC5ncm91cClcbiAgICApXG4gICAgICBhd2FpdCBvcGVuR3JvdXAoYXBwZWFyYW5jZUdyb3VwLmdyb3VwKVxuXG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgICBgI2FwcGVhcmFuY2UtaXRlbXMtZ3JvdXAtJHthcHBlYXJhbmNlR3JvdXAuZ3JvdXB9YFxuICAgIClcbiAgICBpZiAoIWRpdikgYnJlYWtcbiAgICBkaXYuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKVxuXG4gICAgY29uc3Qgc2NyaXB0ID0gZGl2LnF1ZXJ5U2VsZWN0b3IoXCJzY3JpcHRcIikgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbXBsaWVkLWV2YWxcbiAgICBpZiAoc2NyaXB0KSBzZXRUaW1lb3V0KHNjcmlwdC5pbm5lckhUTUwsIDApXG5cbiAgICBjb25zdCBvdXRlckhUTUwgPSBBcnJheS5mcm9tKFxuICAgICAgZGl2LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTExJRWxlbWVudD4oXCJsaS5hcHBlYXJhbmNlLWl0ZW1cIilcbiAgICApXG4gICAgICAubWFwKGxpID0+IHtcbiAgICAgICAgY29uc3QgYXBwZWFyYW5jZUl0ZW0gPSBpdGVtRGF0YVNldChsaSwgYXBwZWFyYW5jZUdyb3VwKVxuICAgICAgICBpZiAoIWFwcGVhcmFuY2VJdGVtPy5pY29uKSByZXR1cm4gbGkub3V0ZXJIVE1MXG5cbiAgICAgICAgbGkuZGF0YXNldC5jYXRlZ29yeWlkID0gYXBwZWFyYW5jZUl0ZW0uY2F0ZWdvcnlpZC50b1N0cmluZygpXG4gICAgICAgIGxpLmRhdGFzZXQuY2F0ZWdvcnkgPSBhcHBlYXJhbmNlSXRlbS5jYXRlZ29yeVxuICAgICAgICBsaS5kYXRhc2V0LmNhdGVnb3J5bmFtZSA9IGFwcGVhcmFuY2VJdGVtLmNhdGVnb3J5bmFtZVxuICAgICAgICBsaS5kYXRhc2V0Lmdyb3VwID0gYXBwZWFyYW5jZUl0ZW0uZ3JvdXAudG9TdHJpbmcoKVxuICAgICAgICB3YXJkcm9iZS5zZXRJdGVtKGFwcGVhcmFuY2VJdGVtKVxuXG4gICAgICAgIHJldHVybiBsaS5vdXRlckhUTUxcbiAgICAgIH0pXG4gICAgICAuam9pbihcIlxcblwiKVxuICAgIHdhcmRyb2JlLmF2YWlsYWJsZUl0ZW1zID0gYXZhaWxhYmxlSXRlbXNcblxuICAgIGRpdi5yZW1vdmUoKVxuXG4gICAgY29uc3QgYWN0aXZlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgIGAjd2FyZHJvYmUtbWVudSBsaVtkYXRhLWNhdGVnb3J5PVwiJHthcHBlYXJhbmNlR3JvdXAuY2F0ZWdvcnl9XCJdLmFjdGl2ZWBcbiAgICApXG5cbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICBkb2N1bWVudFxuICAgICAgICAucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIjZWUtaXRlbXNcIilcbiAgICAgICAgPy5pbnNlcnRBZGphY2VudEhUTUwoXCJiZWZvcmVlbmRcIiwgb3V0ZXJIVE1MKVxuXG4gICAgICBpbml0aWFsaXplU2VsZWN0ZWRJdGVtcygpXG4gICAgICBpbml0aWFsaXplSGlkZGVuQ2F0ZWdvcmllcygpXG4gICAgfSBlbHNlIGlmIChoYW5kbGVkKSBicmVha1xuICB9XG5cbiAgaWYgKCFoYW5kbGVkKSBoYW5kbGVkQ2F0ZWdvcmllcy5kZWxldGUoYXBwZWFyYW5jZUNhdGVnb3J5LmNhdGVnb3J5KVxuICB1bmxvYWRIaWRkZW5DYXRlZ29yaWVzKClcbn1cblxubGV0IGxvYWRpbmcgPSBmYWxzZVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEJhY2tncm91bmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChsb2FkaW5nKSByZXR1cm5cbiAgbG9hZGluZyA9IHRydWVcbiAgbGV0IHN1Y2Nlc3MgPSB0cnVlXG5cbiAgY29uc3QgY2F0ZWdvcmllcyA9IFtcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLnVuZGVyd2VhcixcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLnNraW4sXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS50YXRvbyxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLm1vdXRoLFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuZXllLFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuaGFpcixcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLnNvY2ssXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5zaG9lLFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUucGFudHMsXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5oYW5kQWNjZXNzb3J5LFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUudG9wLFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuY29hdCxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmdsb3ZlLFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUubmVja2xhY2UsXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5kcmVzcyxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmhhdCxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmZhY2VBY2Nlc3NvcnksXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5iZWx0LFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuYW1iaWVudCxcbiAgXVxuXG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9mbGF2cl9ub3RpZi9pY29uX21lc3NhZ2UuaHRtbFwiKVxuXG4gIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgY2F0ZWdvcmllcykge1xuICAgIGlmICghbG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aChcIi9wbGF5ZXIvYXBwZWFyYW5jZVwiKSkge1xuICAgICAgc3VjY2VzcyA9IGZhbHNlXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBgI3dhcmRyb2JlLW1lbnUgbGlbZGF0YS1jYXRlZ29yeT1cIiR7Y2F0ZWdvcnl9XCJdLmFjdGl2ZWBcbiAgICApXG4gICAgaWYgKGFjdGl2ZSkgY29udGludWVcblxuICAgIGNvbnN0IGNhdGVnb3J5Q29udGFpbmVyID0gYXdhaXQgb3BlbkNhdGVnb3J5KGNhdGVnb3J5KVxuICAgIGlmICghY2F0ZWdvcnlDb250YWluZXIpIHtcbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBsZXQgZmluaXNoZWQgPSBmYWxzZVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFmaW5pc2hlZClcbiAgICAgICAgJC5mbGF2ck5vdGlmKFxuICAgICAgICAgIHRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAgICAgICBpY29uOiBgL3N0YXRpYy9pbWcvbWFsbC9jYXRlZ29yaWVzLyR7Y2F0ZWdvcnl9LnBuZ2AsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cmFuc2xhdGUuYXBwZWFyYW5jZS5sb2FkaW5nKFxuICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxMSUVsZW1lbnQ+KFxuICAgICAgICAgICAgICAgIGAjd2FyZHJvYmUtbWVudSBsaVtkYXRhLWNhdGVnb3J5PVwiJHtjYXRlZ29yeX1cIl1gXG4gICAgICAgICAgICAgICk/LmRhdGFzZXQuY2F0ZWdvcnluYW1lID8/IGNhdGVnb3J5XG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICB9LCAxMDAwKVxuXG4gICAgYXdhaXQgaGFuZGxlR3JvdXBzKGNhdGVnb3J5Q29udGFpbmVyKVxuICAgIGZpbmlzaGVkID0gdHJ1ZVxuICB9XG5cbiAgaWYgKHN1Y2Nlc3MpICQuZmxhdnJOb3RpZih0cmFuc2xhdGUuYXBwZWFyYW5jZS5sb2FkZWQpXG4gIGxvYWRpbmcgPSBmYWxzZVxufVxuIiwiZXhwb3J0IGVudW0gQXBwZWFyYW5jZUNhdGVnb3J5Q29kZSB7XG4gIGF0dGljID0gXCJhdHRpY1wiLFxuICBmYXZvcml0ZXMgPSBcImZhdm9yaXRlc1wiLFxuICB1bmRlcndlYXIgPSBcInVuZGVyd2VhclwiLFxuICBza2luID0gXCJza2luXCIsXG4gIHRhdG9vID0gXCJ0YXRvb1wiLFxuICBtb3V0aCA9IFwibW91dGhcIixcbiAgZXllID0gXCJleWVcIixcbiAgaGFpciA9IFwiaGFpclwiLFxuICBzb2NrID0gXCJzb2NrXCIsXG4gIHNob2UgPSBcInNob2VcIixcbiAgcGFudHMgPSBcInBhbnRzXCIsXG4gIGhhbmRBY2Nlc3NvcnkgPSBcImhhbmRBY2Nlc3NvcnlcIixcbiAgdG9wID0gXCJ0b3BcIixcbiAgY29hdCA9IFwiY29hdFwiLFxuICBnbG92ZSA9IFwiZ2xvdmVcIixcbiAgbmVja2xhY2UgPSBcIm5lY2tsYWNlXCIsXG4gIGRyZXNzID0gXCJkcmVzc1wiLFxuICBoYXQgPSBcImhhdFwiLFxuICBmYWNlQWNjZXNzb3J5ID0gXCJmYWNlQWNjZXNzb3J5XCIsXG4gIGJhY2tncm91bmQgPSBcImJhY2tncm91bmRcIixcbiAgYmVsdCA9IFwiYmVsdFwiLFxuICBhbWJpZW50ID0gXCJhbWJpZW50XCIsXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgaW5kZXhlZF9kYiBmcm9tIFwiLi4vaW5kZXhlZF9kYi9pbmRleGVkX2RiXCJcbmltcG9ydCB7IHBhcnNlQXZhdGFyIH0gZnJvbSBcIi4uL291dGZpdFwiXG5pbXBvcnQgeyBsb2FkRmFrZUZhdm91cml0ZXMgfSBmcm9tIFwiLi4vdWkvZmF2b3VyaXRlc1wiXG5pbXBvcnQgeyB3ZWFyT3V0Zml0IH0gZnJvbSBcIi4vZmF2b3VyaXRlc19hY3Rpb25zXCJcbmltcG9ydCB0eXBlIHsgRmF2b3VyaXRlT3V0Zml0IH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9mYXZvdXJpdGVfb3V0Zml0XCJcbmltcG9ydCB0eXBlIHsgUGFyc2FibGVJdGVtIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9wYXJzYWJsZV9pdGVtXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVGYXZvdXJpdGUoKTogUHJvbWlzZTxGYXZvdXJpdGVPdXRmaXQgfCBudWxsPiB7XG4gIGNvbnN0IGZhdm91cml0ZSA9IGF3YWl0IHNob3dPdXRmaXQoKVxuICBpZiAoZmF2b3VyaXRlKSBhd2FpdCBsb2FkRmFrZUZhdm91cml0ZXMoKVxuICByZXR1cm4gZmF2b3VyaXRlXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUZhdm91cml0ZShmYXZvdXJpdGU6IEZhdm91cml0ZU91dGZpdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBpbmRleGVkX2RiLmRlbGV0ZUZhdm91cml0ZU91dGZpdChmYXZvdXJpdGUpXG4gIGF3YWl0IGxvYWRGYWtlRmF2b3VyaXRlcygpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dPdXRmaXQoKTogUHJvbWlzZTxGYXZvdXJpdGVPdXRmaXQgfCBudWxsPiB7XG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9jcmVhdGVkX291dGZpdF9mbGF2ci5odG1sXCIpXG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT5cbiAgICAkLmZsYXZyKHtcbiAgICAgIGNvbnRlbnQ6IHRlbXBsYXRlLnJlbmRlcih7IHRyYW5zbGF0ZSB9KSxcbiAgICAgIG9uQnVpbGQ6ICRjb250YWluZXIgPT4ge1xuICAgICAgICAkY29udGFpbmVyLmFkZENsYXNzKFwibmV3LWxheW91dC1wb3B1cFwiKVxuICAgICAgICAkY29udGFpbmVyLmFkZENsYXNzKFwiY3JlYXRlZC1vdXRmaXQtcG9wdXBcIilcblxuICAgICAgICBjb25zdCBzYXZlQnV0dG9uID1cbiAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxCdXR0b25FbGVtZW50PignW3JlbD1cImJ0bi1zYXZlXCJdJylcbiAgICAgICAgaWYgKCFzYXZlQnV0dG9uKSByZXR1cm5cblxuICAgICAgICBkb2N1bWVudFxuICAgICAgICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFwiI2Nob29zZS1uYW1lXCIpXG4gICAgICAgICAgPy5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSBzYXZlQnV0dG9uLmNsaWNrKClcblxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oXCIjY2hvb3NlLW5hbWVcIik/LnZhbHVlKVxuICAgICAgICAgICAgICBzYXZlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJkaXNhYmxlZFwiKVxuICAgICAgICAgICAgZWxzZSBzYXZlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJkaXNhYmxlZFwiKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgc2F2ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibmwtYnV0dG9uXCIsIFwibmwtYnV0dG9uLWxnXCIsIFwiZGlzYWJsZWRcIilcbiAgICAgIH0sXG4gICAgICBidXR0b25zOiB7XG4gICAgICAgIGNsb3NlOiB7XG4gICAgICAgICAgdGV4dDogXCJcIixcbiAgICAgICAgICBzdHlsZTogXCJjbG9zZVwiLFxuICAgICAgICAgIGFjdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzYXZlOiB7XG4gICAgICAgICAgdGV4dDogdHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5zYXZlX291dGZpdC5zYXZlLFxuICAgICAgICAgIHN0eWxlOiBcImRlZmF1bHRcIixcbiAgICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPVxuICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFwiI2Nob29zZS1uYW1lXCIpPy52YWx1ZVxuICAgICAgICAgICAgaWYgKCFuYW1lKSByZXR1cm4gZmFsc2VcblxuICAgICAgICAgICAgY29uc3QgYXZhdGFyID0gU2FjaGEuQXZhdGFyLmF2YXRhcnNbXCIjYXBwZWFyYW5jZS1wcmV2aWV3XCJdXG4gICAgICAgICAgICBpZiAoIWF2YXRhcikgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHBhcnNlQXZhdGFyKGF2YXRhcilcblxuICAgICAgICAgICAgdm9pZCBzYXZlQWN0aW9uKG5hbWUsIGl0ZW1zKS50aGVuKHJlc29sdmUpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3dGYXZvdXJpdGUoZmF2b3VyaXRlOiBGYXZvdXJpdGVPdXRmaXQpOiB2b2lkIHtcbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2Zhdm91cml0ZV9vdXRmaXRfZmxhdnIuaHRtbFwiKVxuXG4gICQuZmxhdnIoe1xuICAgIGNvbnRlbnQ6IHRlbXBsYXRlLnJlbmRlcih7IC4uLmZhdm91cml0ZSwgdHJhbnNsYXRlIH0pLFxuICAgIG9uQnVpbGQ6ICRjb250YWluZXIgPT4ge1xuICAgICAgJGNvbnRhaW5lci5hZGRDbGFzcyhcIm5ldy1sYXlvdXQtcG9wdXBcIilcbiAgICAgICRjb250YWluZXIuYWRkQ2xhc3MoXCJjcmVhdGVkLW91dGZpdC1wb3B1cFwiKVxuICAgIH0sXG4gICAgYnV0dG9uczoge1xuICAgICAgY2xvc2U6IHtcbiAgICAgICAgdGV4dDogXCJcIixcbiAgICAgICAgc3R5bGU6IFwiY2xvc2VcIixcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB0cnVlLFxuICAgICAgfSxcbiAgICAgIGRlbGV0ZToge1xuICAgICAgICB0ZXh0OiB0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLmNsaWNrX291dGZpdC5kZWxldGUsXG4gICAgICAgIHN0eWxlOiBcImRlZmF1bHRcIixcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgdm9pZCBkZWxldGVGYXZvdXJpdGUoZmF2b3VyaXRlKVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgd2Vhcjoge1xuICAgICAgICB0ZXh0OiB0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLmNsaWNrX291dGZpdC53ZWFyLFxuICAgICAgICBzdHlsZTogXCJkZWZhdWx0XCIsXG4gICAgICAgIGFjdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGF2YXRhciA9IFNhY2hhLkF2YXRhci5hdmF0YXJzW1wiI2FwcGVhcmFuY2UtcHJldmlld1wiXVxuICAgICAgICAgIGlmICghYXZhdGFyKSByZXR1cm4gZmFsc2VcblxuICAgICAgICAgIHZvaWQgKGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+XG4gICAgICAgICAgICB3ZWFyT3V0Zml0KGF2YXRhciwgZmF2b3VyaXRlLml0ZW1zKSkoKVxuXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZW5hbWU6IHtcbiAgICAgICAgdGV4dDogdHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5yZW5hbWVfb3V0Zml0LmJ1dHRvbixcbiAgICAgICAgc3R5bGU6IFwiZGVmYXVsdFwiLFxuICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgdm9pZCBzaG93UmVuYW1lRmF2b3VyaXRlKGZhdm91cml0ZSkudGhlbihmYXZvdXJpdGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmYXZvdXJpdGUpIHZvaWQgbG9hZEZha2VGYXZvdXJpdGVzKClcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICA4MDBcbiAgICAgICAgICApXG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KVxufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlQWN0aW9uKFxuICBuYW1lOiBzdHJpbmcsXG4gIGl0ZW1zOiBQYXJzYWJsZUl0ZW1bXVxuKTogUHJvbWlzZTxGYXZvdXJpdGVPdXRmaXQ+IHtcbiAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2I+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBkb2N1bWVudFxuICAgICAgLnF1ZXJ5U2VsZWN0b3I8SFRNTENhbnZhc0VsZW1lbnQ+KFwiI2FwcGVhcmFuY2UtcHJldmlldyBjYW52YXNcIilcbiAgICAgID8udG9CbG9iKFxuICAgICAgICBibG9iID0+IHtcbiAgICAgICAgICBpZiAoYmxvYikgcmVzb2x2ZShibG9iKVxuICAgICAgICAgIGVsc2UgcmVqZWN0KFwiQmxvYiBkb2Vzbid0IGV4aXN0LlwiKVxuICAgICAgICB9LFxuICAgICAgICBcImltYWdlL3BuZ1wiLFxuICAgICAgICAxXG4gICAgICApXG4gIH0pXG5cbiAgY29uc3QgZmF2b3VyaXRlID0gYXdhaXQgaW5kZXhlZF9kYi5hZGRGYXZvdXJpdGVPdXRmaXQoeyBpdGVtcywgbmFtZSwgYmxvYiB9KVxuICByZXR1cm4geyAuLi5mYXZvdXJpdGUsIHVybDogVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG93UmVuYW1lRmF2b3VyaXRlKFxuICBmYXZvdXJpdGU6IEZhdm91cml0ZU91dGZpdFxuKTogUHJvbWlzZTxGYXZvdXJpdGVPdXRmaXQgfCBudWxsPiB7XG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9yZW5hbWVfZmF2b3VyaXRlX291dGZpdF9mbGF2ci5odG1sXCIpXG4gIGNvbnN0IHJlbmRlcmVkID0gdGVtcGxhdGUucmVuZGVyKHtcbiAgICAuLi5mYXZvdXJpdGUsXG4gICAgdGl0bGU6IHRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMucmVuYW1lX291dGZpdC50aXRsZShmYXZvdXJpdGUubmFtZSksXG4gICAgdHJhbnNsYXRlLFxuICB9KVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxGYXZvdXJpdGVPdXRmaXQgfCBudWxsPihyZXNvbHZlID0+IHtcbiAgICAkLmZsYXZyKHtcbiAgICAgIGNvbnRlbnQ6IHJlbmRlcmVkLFxuICAgICAgb25CdWlsZDogJGNvbnRhaW5lciA9PiB7XG4gICAgICAgICRjb250YWluZXIuYWRkQ2xhc3MoXCJuZXctbGF5b3V0LXBvcHVwXCIpXG4gICAgICAgICRjb250YWluZXIuYWRkQ2xhc3MoXCJjcmVhdGVkLW91dGZpdC1wb3B1cFwiKVxuXG4gICAgICAgIGNvbnN0IHJlbmFtZUJ1dHRvbiA9XG4gICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oJ1tyZWw9XCJidG4tcmVuYW1lXCJdJylcbiAgICAgICAgaWYgKCFyZW5hbWVCdXR0b24pIHJldHVyblxuXG4gICAgICAgIGRvY3VtZW50XG4gICAgICAgICAgLnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oXCIjY2hvb3NlLW5hbWVcIilcbiAgICAgICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIpIHJlbmFtZUJ1dHRvbi5jbGljaygpXG5cbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFwiI2Nob29zZS1uYW1lXCIpPy52YWx1ZSlcbiAgICAgICAgICAgICAgcmVuYW1lQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJkaXNhYmxlZFwiKVxuICAgICAgICAgICAgZWxzZSByZW5hbWVCdXR0b24uY2xhc3NMaXN0LmFkZChcImRpc2FibGVkXCIpXG4gICAgICAgICAgfSlcblxuICAgICAgICByZW5hbWVCdXR0b24uY2xhc3NMaXN0LmFkZChcIm5sLWJ1dHRvblwiLCBcIm5sLWJ1dHRvbi1sZ1wiLCBcImRpc2FibGVkXCIpXG4gICAgICB9LFxuICAgICAgYnV0dG9uczoge1xuICAgICAgICBjbG9zZToge1xuICAgICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgICAgc3R5bGU6IFwiY2xvc2VcIixcbiAgICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVuYW1lOiB7XG4gICAgICAgICAgdGV4dDogdHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5yZW5hbWVfb3V0Zml0LmJ1dHRvbixcbiAgICAgICAgICBzdHlsZTogXCJkZWZhdWx0XCIsXG4gICAgICAgICAgYWN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID1cbiAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihcIiNjaG9vc2UtbmFtZVwiKT8udmFsdWVcbiAgICAgICAgICAgIGlmICghbmFtZSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgICAgICAgIHZvaWQgaW5kZXhlZF9kYlxuICAgICAgICAgICAgICAudXBkYXRlRmF2b3VyaXRlT3V0Zml0KHsgLi4uZmF2b3VyaXRlLCBuYW1lIH0pXG4gICAgICAgICAgICAgIC50aGVuKHJlc29sdmUpXG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSlcbiAgfSlcbn1cbiIsImltcG9ydCB0eXBlIHsgQXZhdGFyIH0gZnJvbSBcIi4uL2VsZGFyeWEvYXZhdGFyXCJcbmltcG9ydCB0eXBlIHsgSXRlbSB9IGZyb20gXCIuLi9lbGRhcnlhL2l0ZW1cIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IGV4cG9ydE91dGZpdCB9IGZyb20gXCIuLi9vdXRmaXRcIlxuaW1wb3J0IHR5cGUgeyBQYXJzYWJsZUl0ZW0gfSBmcm9tIFwiLi9pbnRlcmZhY2VzL3BhcnNhYmxlX2l0ZW1cIlxuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0UHJldmlldygpOiB2b2lkIHtcbiAgZXhwb3J0T3V0Zml0KFwiI2FwcGVhcmFuY2UtcHJldmlld1wiKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW1wb3J0T3V0Zml0KCk6IHZvaWQge1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKVxuICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiZmlsZVwiKVxuICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJhY2NlcHRcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpXG4gIGlucHV0LmNsaWNrKClcblxuICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgIGlmICghZXZlbnQudGFyZ2V0KSByZXR1cm5cbiAgICBjb25zdCBmaWxlcyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXNcbiAgICBpZiAoIWZpbGVzKSByZXR1cm5cbiAgICBjb25zdCBmaWxlID0gZmlsZXNbMF1cbiAgICBpZiAoIWZpbGUpIHJldHVyblxuICAgIHZvaWQgZmlsZS50ZXh0KCkudGhlbihhc3luYyB2YWx1ZSA9PiB7XG4gICAgICBpZiAoIXZhbHVlKSByZXR1cm5cblxuICAgICAgY29uc3Qgb3V0Zml0OiBQYXJzYWJsZUl0ZW1bXSA9IEpTT04ucGFyc2UodmFsdWUpXG4gICAgICBjb25zdCBhdmF0YXIgPSBTYWNoYS5BdmF0YXIuYXZhdGFyc1tcIiNhcHBlYXJhbmNlLXByZXZpZXdcIl1cbiAgICAgIGlmICghYXZhdGFyKSByZXR1cm5cblxuICAgICAgYXdhaXQgd2Vhck91dGZpdChhdmF0YXIsIG91dGZpdClcbiAgICB9KVxuICB9KVxufVxuXG5mdW5jdGlvbiByZW1vdmVDbG90aGVzKCk6IHZvaWQge1xuICBjb25zdCBhdmF0YXIgPSBTYWNoYS5BdmF0YXIuYXZhdGFyc1tcIiNhcHBlYXJhbmNlLXByZXZpZXdcIl1cbiAgaWYgKCFhdmF0YXIpIHJldHVyblxuXG4gIGZvciAobGV0IGkgPSBhdmF0YXIuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBpdGVtUmVuZGVyID0gYXZhdGFyLmNoaWxkcmVuW2ldXG4gICAgaWYgKCFpdGVtUmVuZGVyKSBjb250aW51ZVxuXG4gICAgY29uc3QgaXRlbSA9IGl0ZW1SZW5kZXIuZ2V0SXRlbSgpXG4gICAgaWYgKFNhY2hhLkF2YXRhci5yZW1vdmVJdGVtRnJvbUFsbEF2YXRhcnMoaXRlbSkpIHtcbiAgICAgICQoYCNhcHBlYXJhbmNlLWl0ZW0tJHtpdGVtLl9pZH1gKS5yZW1vdmVDbGFzcyhcInNlbGVjdGVkXCIpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuR3JvdXAoZ3JvdXA6IG51bWJlcik6IFByb21pc2U8SFRNTERpdkVsZW1lbnQgfCBudWxsPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxIVE1MRGl2RWxlbWVudCB8IG51bGw+KChyZXNvbHZlKTogdm9pZCA9PiB7XG4gICAgY29uc3QgZ3JvdXBDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcbiAgICAgIGAjYXBwZWFyYW5jZS1pdGVtcy1ncm91cC0ke2dyb3VwfWBcbiAgICApXG4gICAgaWYgKGdyb3VwQ29udGFpbmVyKSByZXR1cm4gcmVzb2x2ZShncm91cENvbnRhaW5lcilcblxuICAgIGNvbnN0IGF2YXRhciA9IFNhY2hhLkF2YXRhci5hdmF0YXJzW1wiI2FwcGVhcmFuY2UtcHJldmlld1wiXVxuICAgIGlmICghYXZhdGFyKSByZXR1cm4gcmVzb2x2ZShudWxsKVxuXG4gICAgdm9pZCAkLmdldChcbiAgICAgIGAvcGxheWVyL29wZW5Hcm91cC8ke2dyb3VwfWAsXG4gICAgICB7IHdvcm5JdGVtczogYXZhdGFyLmdldEl0ZW1zVG9TYXZlKCkgfSxcbiAgICAgICh2aWV3OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgJCh2aWV3KS5oaWRlKCkuYXBwZW5kVG8oXCIjYXBwZWFyYW5jZS1pdGVtc1wiKVxuICAgICAgICByZXNvbHZlKFxuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFxuICAgICAgICAgICAgYCNhcHBlYXJhbmNlLWl0ZW1zLWdyb3VwLSR7Z3JvdXB9YFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfVxuICAgIClcbiAgfSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5DYXRlZ29yeShcbiAgY2F0ZWdvcnk6IHN0cmluZ1xuKTogUHJvbWlzZTxIVE1MRGl2RWxlbWVudCB8IG51bGw+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4oKHJlc29sdmUpOiB2b2lkID0+IHtcbiAgICBjb25zdCBjYXRlZ29yeUNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFxuICAgICAgYCNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LSR7Y2F0ZWdvcnl9YFxuICAgIClcbiAgICBpZiAoY2F0ZWdvcnlDb250YWluZXIpIHJldHVybiByZXNvbHZlKGNhdGVnb3J5Q29udGFpbmVyKVxuXG4gICAgdm9pZCAkLnBvc3QoYC9wbGF5ZXIvb3BlbkNhdGVnb3J5LyR7Y2F0ZWdvcnl9YCwgKHZpZXc6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgJCh2aWV3KS5oaWRlKCkuYXBwZW5kVG8oXCIjYXBwZWFyYW5jZS1pdGVtc1wiKVxuICAgICAgcmVzb2x2ZShcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgICAgICAgYCNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LSR7Y2F0ZWdvcnl9YFxuICAgICAgICApXG4gICAgICApXG4gICAgfSlcbiAgfSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdlYXJPdXRmaXQoXG4gIGF2YXRhcjogQXZhdGFyLFxuICBvdXRmaXQ6IFBhcnNhYmxlSXRlbVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgJC5mbGF2ck5vdGlmKHRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuaW1wb3J0aW5nKVxuXG4gIC8vIEdldCBhbGwgY2F0ZWdvcmllc1xuICBjb25zdCBjYXRlZ29yaWVzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgZm9yIChjb25zdCBjbG90aGluZyBvZiBvdXRmaXQpXG4gICAgaWYgKCFhdmFpbGFibGVJdGVtc1tjbG90aGluZy5pZF0pIGNhdGVnb3JpZXMuYWRkKGNsb3RoaW5nLnR5cGUpXG5cbiAgLy8gT3BlbiBhbGwgY2F0ZWdvcmllc1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBBcnJheS5mcm9tKGNhdGVnb3JpZXMudmFsdWVzKCkpLm1hcChhc3luYyBjYXRlZ29yeSA9PlxuICAgICAgb3BlbkNhdGVnb3J5KGNhdGVnb3J5KVxuICAgIClcbiAgKVxuXG4gIC8vIEdldCBhbGwgZ3JvdXBzXG4gIGNvbnN0IGdyb3VwcyA9IG5ldyBTZXQ8bnVtYmVyPigpXG4gIGZvciAoY29uc3QgY2xvdGhpbmcgb2Ygb3V0Zml0KVxuICAgIGlmIChcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWdyb3VwPVwiJHtjbG90aGluZy5ncm91cH1cIl1gKSAmJlxuICAgICAgIWF2YWlsYWJsZUl0ZW1zW2Nsb3RoaW5nLmlkXVxuICAgIClcbiAgICAgIGdyb3Vwcy5hZGQoY2xvdGhpbmcuZ3JvdXApXG5cbiAgLy8gT3BlbiBhbGwgZ3JvdXBzXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIEFycmF5LmZyb20oZ3JvdXBzLnZhbHVlcygpKS5tYXAoYXN5bmMgZ3JvdXAgPT4gb3Blbkdyb3VwKGdyb3VwKSlcbiAgKVxuXG4gIC8vIEdldCB0aGUgaXRlbXMgZnJvbSBgYXZhaWxhYmxlSXRlbXNgXG4gIGNvbnN0IHdvcm5JdGVtczogSXRlbVtdID0gW11cbiAgZm9yIChjb25zdCBjbG90aGluZyBvZiBvdXRmaXQpIHtcbiAgICBjb25zdCBpdGVtID0gYXZhaWxhYmxlSXRlbXNbY2xvdGhpbmcuaWRdXG4gICAgaWYgKGl0ZW0pIHdvcm5JdGVtcy5wdXNoKGl0ZW0pXG4gIH1cblxuICByZW1vdmVDbG90aGVzKClcbiAgYXZhdGFyLmFkZEl0ZW1zKHdvcm5JdGVtcylcbiAgaW5pdGlhbGl6ZVNlbGVjdGVkSXRlbXMoKVxuICBpbml0aWFsaXplSGlkZGVuQ2F0ZWdvcmllcygpXG5cbiAgY29uc3QgYXZhdGFyQWN0aW9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYXZhdGFyLWFjdGlvbnNcIilcbiAgaWYgKGF2YXRhckFjdGlvbnMpIGF2YXRhckFjdGlvbnMuc3R5bGUuZGlzcGxheSA9IFwiaW5pdGlhbFwiXG5cbiAgJC5mbGF2ck5vdGlmKHRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuaW1wb3J0ZWQpXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB0eXBlIHsgQXBwZWFyYW5jZUNhdGVnb3J5IH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2FwcGVhcmFuY2VfY2F0ZWdvcnlcIlxuaW1wb3J0IHR5cGUgeyBBcHBlYXJhbmNlR3JvdXAgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvYXBwZWFyYW5jZV9ncm91cFwiXG5pbXBvcnQgd2FyZHJvYmUgZnJvbSBcIi4vd2FyZHJvYmVcIlxuXG5leHBvcnQgZnVuY3Rpb24gdW5sb2FkSGlkZGVuQ2F0ZWdvcmllcygpOiB2b2lkIHtcbiAgY29uc3QgaGlkZGVuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRGl2RWxlbWVudD4oXG4gICAgXCIjYXBwZWFyYW5jZS1pdGVtcyAuYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeTpub3QoLmFjdGl2ZSk6bm90KFtkYXRhLWNhdGVnb3J5bmFtZV0pLCAjYXBwZWFyYW5jZS1pdGVtcyBzY3JpcHQsIGJvZHk+c2NyaXB0XCJcbiAgKVxuICBmb3IgKGNvbnN0IGRpdiBvZiBoaWRkZW4pIHtcbiAgICBkaXYucmVtb3ZlKClcbiAgfVxufVxuXG4vKipcbiAqIFBsYWNlIHRoZSBzYXZlZCBncm91cHMgb24gdGhlIERPTSBhcyBpZiBpdCB3YXMgRWxkYXJ5YSBkb2luZyBpdC5cbiAqIEByZXR1cm5zIHRoZSBhc3NvY2lhdGVkIGBBcHBlYXJhbmNlQ2F0ZWdvcnlgIGlmIGl0J3MgZm91bmQgaW4gdGhlIHdhcmRyb2JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEhpZGRlbkNhdGVnb3J5KGNvZGU6IHN0cmluZyk6IEFwcGVhcmFuY2VDYXRlZ29yeSB8IG51bGwge1xuICBjb25zdCBjYXRlZ29yeSA9IHdhcmRyb2JlLmdldENhdGVnb3JpZXMoKS5maW5kKGMgPT4gYy5jYXRlZ29yeSA9PT0gY29kZSlcbiAgaWYgKCFjYXRlZ29yeSkgcmV0dXJuIG51bGxcblxuICBjb25zdCBncm91cHMgPSB3YXJkcm9iZS5nZXRDYXRlZ29yeUdyb3VwcyhjYXRlZ29yeS5jYXRlZ29yeWlkKVxuICBjb25zdCBpdGVtVGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2FwcGVhcmFuY2VfaXRlbS5odG1sXCIpXG4gIGNvbnN0IGdyb3VwVGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2FwcGVhcmFuY2VfaXRlbXNfZ3JvdXAuaHRtbFwiKVxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcIiNhcHBlYXJhbmNlLWl0ZW1zXCIpXG4gICAgPy5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgICBcImJlZm9yZWVuZFwiLFxuICAgICAgZ3JvdXBzXG4gICAgICAgIC5tYXAoZ3JvdXAgPT5cbiAgICAgICAgICBncm91cFRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAgICAgICAuLi5ncm91cCxcbiAgICAgICAgICAgIGl0ZW1zOiB3YXJkcm9iZVxuICAgICAgICAgICAgICAuZ2V0SXRlbXMoZ3JvdXAuZ3JvdXApXG4gICAgICAgICAgICAgIC5tYXAoaXRlbSA9PiBpdGVtVGVtcGxhdGUucmVuZGVyKGl0ZW0pKVxuICAgICAgICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5qb2luKFwiXFxuXCIpXG4gICAgKVxuICByZXR1cm4gY2F0ZWdvcnlcbn1cblxuLyoqXG4gKiBMb2FkIHRoZSBzYXZlZCBncm91cCBvbiB0aGUgRE9NIGFzIGlmIGl0IHdhcyBFbGRhcnlhIGRvaW5nIGl0LlxuICogQHJldHVybnMgdGhlIGFzc29jaWF0ZWQgYEFwcGVhcmFuY2VHcm91cGAgaWYgaXQncyBmb3VuZCBpbiB0aGUgd2FyZHJvYmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkSGlkZGVuR3JvdXAoaWQ6IG51bWJlcik6IEFwcGVhcmFuY2VHcm91cCB8IG51bGwge1xuICBjb25zdCBncm91cCA9IHdhcmRyb2JlLmdldEdyb3VwKGlkKVxuICBpZiAoIWdyb3VwKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGl0ZW1UZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvYXBwZWFyYW5jZV9pdGVtLmh0bWxcIilcbiAgY29uc3QgZ3JvdXBUZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvYXBwZWFyYW5jZV9pdGVtc19ncm91cC5odG1sXCIpXG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFwiI2FwcGVhcmFuY2UtaXRlbXNcIilcbiAgICA/Lmluc2VydEFkamFjZW50SFRNTChcbiAgICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgICBncm91cFRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAgIC4uLmdyb3VwLFxuICAgICAgICBpdGVtczogd2FyZHJvYmVcbiAgICAgICAgICAuZ2V0SXRlbXMoZ3JvdXAuZ3JvdXApXG4gICAgICAgICAgLm1hcChpdGVtID0+IGl0ZW1UZW1wbGF0ZS5yZW5kZXIoaXRlbSkpXG4gICAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICB9KVxuICAgIClcbiAgcmV0dXJuIGdyb3VwXG59XG4iLCJpbXBvcnQgdHlwZSB7IEl0ZW0gfSBmcm9tIFwiLi4vZWxkYXJ5YS9pdGVtXCJcbmltcG9ydCB0eXBlIHsgQXBwZWFyYW5jZUNhdGVnb3J5IH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2FwcGVhcmFuY2VfY2F0ZWdvcnlcIlxuaW1wb3J0IHR5cGUgeyBBcHBlYXJhbmNlR3JvdXAgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvYXBwZWFyYW5jZV9ncm91cFwiXG5pbXBvcnQgdHlwZSB7IEFwcGVhcmFuY2VJdGVtIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2FwcGVhcmFuY2VfaXRlbVwiXG5cbmNsYXNzIFdhcmRyb2JlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjYXRlZ29yaWVzOiBSZWNvcmQ8bnVtYmVyLCBBcHBlYXJhbmNlQ2F0ZWdvcnk+ID0ge31cblxuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwczogUmVjb3JkPG51bWJlciwgQXBwZWFyYW5jZUdyb3VwPiA9IHt9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpdGVtczogUmVjb3JkPG51bWJlciwgQXBwZWFyYW5jZUl0ZW0+ID0ge31cblxuICBhdmFpbGFibGVJdGVtcz86IFJlY29yZDxudW1iZXIsIEl0ZW0+XG5cbiAgZ2V0Q2F0ZWdvcmllcygpOiBBcHBlYXJhbmNlQ2F0ZWdvcnlbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5jYXRlZ29yaWVzKVxuICB9XG5cbiAgZ2V0Q2F0ZWdvcnkoaWQ6IG51bWJlcik6IEFwcGVhcmFuY2VDYXRlZ29yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2F0ZWdvcmllc1tpZF1cbiAgfVxuXG4gIGdldENhdGVnb3J5R3JvdXBzKGNhdGVnb3J5aWQ6IG51bWJlcik6IEFwcGVhcmFuY2VHcm91cFtdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmdyb3VwcykuZmlsdGVyKFxuICAgICAgZ3JvdXAgPT4gZ3JvdXAuY2F0ZWdvcnlpZCA9PT0gY2F0ZWdvcnlpZFxuICAgIClcbiAgfVxuXG4gIGdldEdyb3VwKGlkOiBudW1iZXIpOiBBcHBlYXJhbmNlR3JvdXAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdyb3Vwc1tpZF1cbiAgfVxuXG4gIGdldEdyb3VwcygpOiBBcHBlYXJhbmNlR3JvdXBbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5ncm91cHMpXG4gIH1cblxuICBnZXRJdGVtKGlkOiBudW1iZXIpOiBBcHBlYXJhbmNlSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNbaWRdXG4gIH1cblxuICBnZXRJdGVtcyhncm91cDogbnVtYmVyKTogQXBwZWFyYW5jZUl0ZW1bXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5pdGVtcykuZmlsdGVyKGl0ZW0gPT4gaXRlbS5ncm91cCA9PT0gZ3JvdXApXG4gIH1cblxuICBzZXRDYXRlZ29yeShjYXRlZ29yeTogQXBwZWFyYW5jZUNhdGVnb3J5KTogdm9pZCB7XG4gICAgdGhpcy5jYXRlZ29yaWVzW2NhdGVnb3J5LmNhdGVnb3J5aWRdID0gY2F0ZWdvcnlcbiAgfVxuXG4gIHNldEdyb3VwKGdyb3VwOiBBcHBlYXJhbmNlR3JvdXApOiB2b2lkIHtcbiAgICB0aGlzLmdyb3Vwc1tncm91cC5ncm91cF0gPSBncm91cFxuICB9XG5cbiAgc2V0SXRlbShpdGVtOiBBcHBlYXJhbmNlSXRlbSk6IHZvaWQge1xuICAgIHRoaXMuaXRlbXNbaXRlbS5pdGVtaWRdID0gaXRlbVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBXYXJkcm9iZSgpXG4iLCJpbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHR5cGUgeyBDYXJvdXNlbE5ld3MgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvY2Fyb3VzZWxfbmV3c1wiXG5cbmV4cG9ydCBjb25zdCBjYXJvdXNlbEJlZW1vb3ZBbm5veWFuY2VzOiBDYXJvdXNlbE5ld3MgPSB7XG4gIGJhY2tncm91bmRJbWFnZTpcbiAgICBcImh0dHBzOi8vZ2l0bGFiLmNvbS9OYXRvQm9yYW0vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLS9yYXcvbWFzdGVyL2ltYWdlcy9jYXJvdXNlbF9iZWVtb292X2Fubm95YW5jZXMucG5nXCIsXG4gIGg0OiB0cmFuc2xhdGUuY2Fyb3VzZWwuYmVlbW9vdl9hbm5veWFuY2VzLnRpdGxlLFxuICBocmVmOiBcImh0dHBzOi8vZ2l0bGFiLmNvbS9OYXRvQm9yYW0vQmVlbW9vdi1Bbm5veWFuY2VzXCIsXG4gIGlkOiBcImNhcm91c2VsLWJlZW1vb3YtYW5ub3lhbmNlc1wiLFxuICBwOiB0cmFuc2xhdGUuY2Fyb3VzZWwuYmVlbW9vdl9hbm5veWFuY2VzLnN1YnRpdGxlLFxufVxuIiwiaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB0eXBlIHsgQ2Fyb3VzZWxOZXdzIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2Nhcm91c2VsX25ld3NcIlxuXG5leHBvcnQgY29uc3QgY2Fyb3VzZWxEb3dubG9hZEZhY2U6IENhcm91c2VsTmV3cyA9IHtcbiAgYmFja2dyb3VuZEltYWdlOlxuICAgIFwiaHR0cHM6Ly9naXRsYWIuY29tL05hdG9Cb3JhbS9lbGRhcnlhLWVuaGFuY2VtZW50cy8tL3Jhdy9tYXN0ZXIvaW1hZ2VzL2Nhcm91c2VsX2Rvd25sb2FkX2ZhY2UucG5nXCIsXG4gIGlkOiBcImNhcm91c2VsLWRvd25sb2FkLWZhY2VcIixcbiAgaDQ6IHRyYW5zbGF0ZS5jYXJvdXNlbC5kb3dubG9hZF9mYWNlLnRpdGxlLFxuICBwOiB0cmFuc2xhdGUuY2Fyb3VzZWwuZG93bmxvYWRfZmFjZS5zdWJ0aXRsZSxcbn1cbiIsImltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgdHlwZSB7IENhcm91c2VsTmV3cyB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9jYXJvdXNlbF9uZXdzXCJcblxuZXhwb3J0IGNvbnN0IGNhcm91c2VsRG93bmxvYWRHdWFyZGlhbjogQ2Fyb3VzZWxOZXdzID0ge1xuICBiYWNrZ3JvdW5kSW1hZ2U6XG4gICAgXCJodHRwczovL2dpdGxhYi5jb20vTmF0b0JvcmFtL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy0vcmF3L21hc3Rlci9pbWFnZXMvY2Fyb3VzZWxfZG93bmxvYWRfZ3VhcmRpYW4ucG5nXCIsXG4gIGlkOiBcImNhcm91c2VsLWRvd25sb2FkLWd1YXJkaWFuXCIsXG4gIGg0OiB0cmFuc2xhdGUuY2Fyb3VzZWwuZG93bmxvYWRfZ3VhcmRpYW4udGl0bGUsXG4gIHA6IHRyYW5zbGF0ZS5jYXJvdXNlbC5kb3dubG9hZF9ndWFyZGlhbi5zdWJ0aXRsZSxcbn1cbiIsImltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgdHlwZSB7IENhcm91c2VsTmV3cyB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9jYXJvdXNlbF9uZXdzXCJcblxuZXhwb3J0IGNvbnN0IGNhcm91c2VsRUU6IENhcm91c2VsTmV3cyA9IHtcbiAgYmFja2dyb3VuZEltYWdlOlxuICAgIFwiaHR0cHM6Ly9naXRsYWIuY29tL05hdG9Cb3JhbS9lbGRhcnlhLWVuaGFuY2VtZW50cy8tL3Jhdy9tYXN0ZXIvaW1hZ2VzL2Nhcm91c2VsX2VsZGFyeWFfZW5oYW5jZW1lbnRzLnBuZ1wiLFxuICBoNDogdHJhbnNsYXRlLmNhcm91c2VsLmVsZGFyeWFfZW5oYW5jZW1lbnRzLnRpdGxlLFxuICBocmVmOiBHTS5pbmZvLnNjcmlwdC5uYW1lc3BhY2UsXG4gIGlkOiBcImNhcm91c2VsLWVsZGFyeWEtZW5oYW5jZW1lbnRzXCIsXG4gIHA6IHRyYW5zbGF0ZS5jYXJvdXNlbC5lbGRhcnlhX2VuaGFuY2VtZW50cy5zdWJ0aXRsZSxcbn1cbiIsImltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgdHlwZSB7IENhcm91c2VsTmV3cyB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9jYXJvdXNlbF9uZXdzXCJcblxuZXhwb3J0IGNvbnN0IGNhcm91c2VsVGFrZW92ZXI6IENhcm91c2VsTmV3cyA9IHtcbiAgYmFja2dyb3VuZEltYWdlOlxuICAgIFwiaHR0cHM6Ly9naXRsYWIuY29tL05hdG9Cb3JhbS9lbGRhcnlhLWVuaGFuY2VtZW50cy8tL3Jhdy9tYXN0ZXIvaW1hZ2VzL2Nhcm91c2VsX3Rha2VvdmVyLnBuZ1wiLFxuICBpZDogXCJjYXJvdXNlbC10YWtlb3ZlclwiLFxuICBoNDogdHJhbnNsYXRlLmNhcm91c2VsLnRha2VvdmVyLnRpdGxlLFxuICBwOiB0cmFuc2xhdGUuY2Fyb3VzZWwudGFrZW92ZXIuc3VidGl0bGUsXG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbmltcG9ydCB7IENvbnNvbGUgfSBmcm9tIFwiLi9jb25zb2xlXCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ2hlYXRDb2RlcygpOiB2b2lkIHtcbiAgLy8gY29uc3QgY2hlYXRlZCA9IHdpbmRvdyBhcyB1bmtub3duIGFzIENoZWF0ZWRXaW5kb3dcbiAgOyh3aW5kb3cgYXMgdW5rbm93biBhcyBDaGVhdGVkV2luZG93KS51bmxvY2tFbmhhbmNlbWVudHMgPSB1bmxvY2tFbmhhbmNlbWVudHNcbiAgOyh3aW5kb3cgYXMgdW5rbm93biBhcyBDaGVhdGVkV2luZG93KS5sb2NrRW5oYW5jZW1lbnRzID0gbG9ja0VuaGFuY2VtZW50c1xufVxuXG5hc3luYyBmdW5jdGlvbiB1bmxvY2tFbmhhbmNlbWVudHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIExvY2FsU3RvcmFnZS51bmxvY2tlZCA9IHRydWVcbiAgQ29uc29sZS5pbmZvKFwiVW5sb2NrZWQgZW5oYW5jZW1lbnRzLlwiKVxuICBhd2FpdCByZWxvYWQoKVxufVxuXG5hc3luYyBmdW5jdGlvbiBsb2NrRW5oYW5jZW1lbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICBMb2NhbFN0b3JhZ2UudW5sb2NrZWQgPSBmYWxzZVxuICBDb25zb2xlLmluZm8oXCJMb2NrZWQgZW5oYW5jZW1lbnRzLlwiKVxuICBhd2FpdCByZWxvYWQoKVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDAwKSlcbiAgQ29uc29sZS5sb2coXCJSZWxvYWRpbmcuLi5cIilcbiAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKVxuICBsb2NhdGlvbi5yZWxvYWQoKVxufVxuXG5pbnRlcmZhY2UgQ2hlYXRlZFdpbmRvdyBleHRlbmRzIFdpbmRvdyB7XG4gIHVubG9ja0VuaGFuY2VtZW50czogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICBsb2NrRW5oYW5jZW1lbnRzOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG59XG4iLCJpbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuXG5leHBvcnQgY2xhc3MgQ29uc29sZSB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGNvbnNvbGUgPSBjb25zb2xlXG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0IGRlYnVnZ2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gTG9jYWxTdG9yYWdlLmRlYnVnXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXQgdGltZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpXG4gIH1cblxuICBzdGF0aWMgYXNzZXJ0KFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAuLi5vcHRpb25hbFBhcmFtczogdW5rbm93bltdXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kZWJ1Z2dpbmcpIHJldHVyblxuICAgIHRoaXMuY29uc29sZS5hc3NlcnQodmFsdWUsIC4uLnRoaXMuZm9ybWF0KG1lc3NhZ2UpLCAuLi5vcHRpb25hbFBhcmFtcylcbiAgfVxuXG4gIHN0YXRpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGVidWdnaW5nKSByZXR1cm5cbiAgICB0aGlzLmNvbnNvbGUuZGVidWcoLi4udGhpcy5mb3JtYXQobWVzc2FnZSksIC4uLm9wdGlvbmFsUGFyYW1zKVxuICB9XG5cbiAgc3RhdGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuY29uc29sZS5lcnJvciguLi50aGlzLmZvcm1hdChtZXNzYWdlKSwgLi4ub3B0aW9uYWxQYXJhbXMpXG4gIH1cblxuICBzdGF0aWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGVidWdnaW5nKSByZXR1cm5cbiAgICB0aGlzLmNvbnNvbGUuaW5mbyguLi50aGlzLmZvcm1hdChtZXNzYWdlKSwgLi4ub3B0aW9uYWxQYXJhbXMpXG4gIH1cblxuICBzdGF0aWMgbG9nKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kZWJ1Z2dpbmcpIHJldHVyblxuICAgIHRoaXMuY29uc29sZS5sb2coLi4udGhpcy5mb3JtYXQobWVzc2FnZSksIC4uLm9wdGlvbmFsUGFyYW1zKVxuICB9XG5cbiAgc3RhdGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5jb25zb2xlLndhcm4oLi4udGhpcy5mb3JtYXQobWVzc2FnZSksIC4uLm9wdGlvbmFsUGFyYW1zKVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZm9ybWF0KG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgYCVjWyVjJHt0aGlzLnRpbWV9JWNdYCxcbiAgICAgIFwiY29sb3I6Izk3NDJjMlwiLFxuICAgICAgXCJjb2xvcjpub25lXCIsXG4gICAgICBcImNvbG9yOiM5NzQyYzJcIixcbiAgICAgIG1lc3NhZ2UsXG4gICAgXVxuICB9XG59XG4iLCJpbXBvcnQgeyBDb25zb2xlIH0gZnJvbSBcIi4vY29uc29sZVwiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi9pMThuL3RyYW5zbGF0ZVwiXG5cbmZ1bmN0aW9uIGRvd25sb2FkQ2FudmFzKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBjYW52YXMudG9CbG9iKFxuICAgIGJsb2IgPT4ge1xuICAgICAgaWYgKCFibG9iKSB7XG4gICAgICAgIENvbnNvbGUuZXJyb3IoXCJDYW52YXMgaXMgZW1wdHlcIilcbiAgICAgICAgJC5mbGF2ck5vdGlmKHRyYW5zbGF0ZS5lcnJvci5kb3dubG9hZENhbnZhcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcblxuICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpXG4gICAgICBhLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgdXJsKVxuICAgICAgYS5zZXRBdHRyaWJ1dGUoXCJkb3dubG9hZFwiLCBgJHtuYW1lfS5wbmdgKVxuICAgICAgYS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcblxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKVxuICAgICAgYS5jbGljaygpXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpXG5cbiAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgIH0sXG4gICAgXCJpbWFnZS9wbmdcIixcbiAgICAxXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkRmFjZSgpOiB2b2lkIHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQ2FudmFzRWxlbWVudD4oXG4gICAgXCIjYXZhdGFyLW1lbnUtY29udGFpbmVyIGNhbnZhc1wiXG4gIClcbiAgaWYgKCFjYW52YXMpIHtcbiAgICBDb25zb2xlLndhcm4oXCJDb3VsZG4ndCBmaW5kIHRoZSBndWFyZGlhbidzIGZhY2UuXCIpXG4gICAgcmV0dXJuXG4gIH1cblxuICBkb3dubG9hZENhbnZhcyhjYW52YXMsIFwiZmFjZVwiKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZG93bmxvYWRHdWFyZGlhbigpOiB2b2lkIHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQ2FudmFzRWxlbWVudD4oXG4gICAgXCIjaG9tZS1hdmF0YXItcGxheWVyIGNhbnZhc1wiXG4gIClcbiAgaWYgKCFjYW52YXMpIHtcbiAgICBDb25zb2xlLndhcm4oXCJDb3VsZG4ndCBmaW5kIHRoZSBndWFyZGlhbi5cIilcbiAgICByZXR1cm5cbiAgfVxuXG4gIGRvd25sb2FkQ2FudmFzKGNhbnZhcywgZ2V0TmFtZSgpID8/IFwiZ3VhcmRpYW5cIilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkQXBwZWFyYW5jZSgpOiB2b2lkIHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQ2FudmFzRWxlbWVudD4oXG4gICAgXCIjYXBwZWFyYW5jZS1wcmV2aWV3IGNhbnZhc1wiXG4gIClcbiAgaWYgKCFjYW52YXMpIHtcbiAgICBDb25zb2xlLndhcm4oXCJDb3VsZG4ndCBmaW5kIHRoZSBndWFyZGlhbi5cIilcbiAgICByZXR1cm5cbiAgfVxuXG4gIGRvd25sb2FkQ2FudmFzKGNhbnZhcywgZ2V0TmFtZSgpID8/IFwiZ3VhcmRpYW5cIilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkUHJvZmlsZSgpOiB2b2lkIHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQ2FudmFzRWxlbWVudD4oXG4gICAgXCIucGxheWVyUHJvZmlsZUF2YXRhciBjYW52YXNcIlxuICApXG4gIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSGVhZGluZ0VsZW1lbnQ+KFxuICAgIFwiI21haW4tc2VjdGlvbiAuc2VjdGlvbi10aXRsZVwiXG4gIClcbiAgaWYgKCFjYW52YXMgfHwgIXRpdGxlKSByZXR1cm5cblxuICBkb3dubG9hZENhbnZhcyhjYW52YXMsIHRpdGxlLnRleHRDb250ZW50Py50cmltKCkgPz8gXCJndWFyZGlhblwiKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIChcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2F2YXRhci1tZW51LWNvbnRhaW5lci1vdXRlcj5wXCIpPy50ZXh0Q29udGVudCA/P1xuICAgIG51bGxcbiAgKVxufVxuIiwiZXhwb3J0IGVudW0gRHVyYXRpb25Vbml0IHtcbiAgbWlsbGlzZWNvbmQgPSAxLFxuICBzZWNvbmQgPSAxMDAwICogbWlsbGlzZWNvbmQsXG4gIG1pbnV0ZSA9IDYwICogc2Vjb25kLFxuICBob3VyID0gNjAgKiBtaW51dGUsXG4gIGRheSA9IDI0ICogaG91cixcbiAgd2VlayA9IDcgKiBkYXksXG5cbiAgeWVhciA9ICgzNjUgKyAxIC8gNCAtIDEgLyAxMDAgKyAxIC8gNDAwKSAqIGRheSxcbiAgZGVjYWRlID0gMTAgKiB5ZWFyLFxuICBjZW50dXJ5ID0gMTAgKiBkZWNhZGUsXG4gIG1pbGxlbm5pdW0gPSAxMCAqIGNlbnR1cnksXG5cbiAgLy8gR2VvbG9naWMgdGltZSBzY2FsZVxuICBhZ2UgPSAxMCAqIG1pbGxlbm5pdW0sXG4gIHN1YmVwb2NoID0gMTAgKiBhZ2UsXG4gIGVwb2NoID0gMTAgKiBzdWJlcG9jaCxcbiAgcGVyaW9kID0gMTAgKiBlcG9jaCxcbiAgZXJhID0gMTAgKiBwZXJpb2QsXG4gIGVvbiA9IDEwICogZXJhLFxuXG4gIC8vIE5vbiBzZXF1aXR1clxuICBtb250aCA9IHllYXIgLyAxMixcbn1cblxuZXhwb3J0IGNsYXNzIER1cmF0aW9uIHtcbiAgY29uc3RydWN0b3IocmVhZG9ubHkgdmFsdWU6IG51bWJlciwgcmVhZG9ubHkgdW5pdDogRHVyYXRpb25Vbml0KSB7fVxuXG4gIGRpdmlkZShkdXJhdGlvbjogRHVyYXRpb24pOiBEdXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBEdXJhdGlvbih0aGlzLnZhbHVlIC8gZHVyYXRpb24udG8odGhpcy51bml0KS52YWx1ZSwgdGhpcy51bml0KVxuICB9XG5cbiAgbWludXMoZHVyYXRpb246IER1cmF0aW9uKTogRHVyYXRpb24ge1xuICAgIHJldHVybiBuZXcgRHVyYXRpb24odGhpcy52YWx1ZSAtIGR1cmF0aW9uLnRvKHRoaXMudW5pdCkudmFsdWUsIHRoaXMudW5pdClcbiAgfVxuXG4gIG11bHRpcGx5KGR1cmF0aW9uOiBEdXJhdGlvbik6IER1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IER1cmF0aW9uKHRoaXMudmFsdWUgKiBkdXJhdGlvbi50byh0aGlzLnVuaXQpLnZhbHVlLCB0aGlzLnVuaXQpXG4gIH1cblxuICBwbHVzKGR1cmF0aW9uOiBEdXJhdGlvbik6IER1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IER1cmF0aW9uKHRoaXMudmFsdWUgKyBkdXJhdGlvbi50byh0aGlzLnVuaXQpLnZhbHVlLCB0aGlzLnVuaXQpXG4gIH1cblxuICB0byh1bml0OiBEdXJhdGlvblVuaXQpOiBEdXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBEdXJhdGlvbigodGhpcy52YWx1ZSAqIHRoaXMudW5pdCkgLyB1bml0LCB1bml0KVxuICB9XG59XG4iLCIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5pbnRlcmZhY2UgSlF1ZXJ5U3RhdGljIHtcbiAgZmxhdnI6IChkYXRhOiBmbGF2clBhcmFtcykgPT4gdm9pZFxuICBmbGF2ck5vdGlmOiAoXG4gICAgY29udGVudDogc3RyaW5nIHwgdW5rbm93bixcbiAgICBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgaWQ/OiBudW1iZXIsXG4gICAgZm9yY2U/OiBib29sZWFuXG4gICkgPT4gdm9pZFxufVxuXG5pbnRlcmZhY2UgZmxhdnJQYXJhbXMge1xuICAvKiogQW5pbWF0ZS5jc3MgKi9cbiAgYW5pbWF0ZUNsb3Npbmc/OiBcImZhZGVPdXRcIiB8IFwiZmFkZU91dFVwXCJcbiAgLyoqIEFuaW1hdGUuY3NzICovXG4gIGFuaW1hdGVFbnRyYW5jZT86IFwiZmFkZUluXCIgfCBcImZhZGVJbkRvd25cIlxuICAvKiogQnV0dG9ucyBhcmUga2V5LXZhbHVlIHBhaXJzIHdoZXJlIHRoZSBrZXkgaXMgdGhlICAqL1xuICBidXR0b25zPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7XG4gICAgICBzdHlsZT86IFwiY2xvc2VcIiB8IFwiZGVmYXVsdFwiXG4gICAgICB0ZXh0Pzogc3RyaW5nXG4gICAgICBhZGRDbGFzcz86IHN0cmluZ1xuICAgICAgLyoqIEByZXR1cm5zIHdoZXRoZXIgdGhlIHBvcHVwIHNob3VsZCBjbG9zZSAqL1xuICAgICAgYWN0aW9uPzogKCRjb250YWluZXI6IEpRdWVyeSkgPT4gYm9vbGVhblxuICAgIH1cbiAgPlxuICAvKiogSFRNTCBjb250ZW50IG9mIHRoZSBmbGF2ciAqL1xuICBjb250ZW50Pzogc3RyaW5nXG4gIC8qKiBUeXBlIG9mIGRpYWxvZy4gKi9cbiAgZGlhbG9nPzogXCJhbGVydFwiIHwgXCJjb25maXJtXCIgfCBcImZvcm1cIiB8IFwicHJvbXB0XCJcbiAgb25CdWlsZD86ICgkY29udGFpbmVyOiBKUXVlcnkpID0+IHZvaWRcbiAgb25DYW5jZWw/OiAoKSA9PiB2b2lkXG4gIG9uQ29uZmlybT86ICgpID0+IHZvaWRcbiAgb25TaG93PzogKCkgPT4gdm9pZFxuICBwcm9tcHQ/OiB7XG4gICAgLyoqIERlZmF1bHQgdmFsdWUgKi9cbiAgICB2YWx1ZTogc3RyaW5nXG4gIH1cblxuICB0aXRsZT86IHN0cmluZ1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHRyaW1JY29uKGljb246IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRpbGRlID0gaWNvbi5sYXN0SW5kZXhPZihcIn5cIilcbiAgY29uc3QgZG90ID0gaWNvbi5sYXN0SW5kZXhPZihcIi5cIilcbiAgaWYgKHRpbGRlID09PSAtMSB8fCBkb3QgPT09IC0xKSByZXR1cm4gaWNvblxuXG4gIHJldHVybiBpY29uLnN1YnN0cmluZygwLCB0aWxkZSkgKyBpY29uLnN1YnN0cmluZyhkb3QpXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRyYW5zbGF0aW9uIH0gZnJvbSBcIi4vdHJhbnNsYXRpb25cIlxuXG5leHBvcnQgY29uc3QgZW46IFRyYW5zbGF0aW9uID0ge1xuICBob21lOiB7XG4gICAgZm9ydW06IFwiRm9ydW1cIixcbiAgICB0YWtlb3ZlcjogXCJUYWtlb3ZlclwiLFxuICB9LFxuICB0YWtlb3Zlcjoge1xuICAgIGJvdWdodDogKG5hbWUsIHByaWNlKSA9PlxuICAgICAgYEJvdWdodCA8c3Ryb25nPiR7bmFtZX08L3N0cm9uZz4gZm9yIDxzdHJvbmcgY2xhc3M9XCJwcmljZS1pdGVtXCI+JHtwcmljZX08L3N0cm9uZz4gPHNwYW4gY2xhc3M9XCJtYWFuYS1pY29uXCIgYWx0PVwibWFhbmFzXCI+PC9zcGFuPi5gLFxuICAgIGRpc2FibGVkOiBcIlRha2VvdmVyIG1vZGUgZGlzYWJsZWQuXCIsXG4gICAgZW5hYmxlZDogXCJUYWtlb3ZlciBtb2RlIGVuYWJsZWQuIFBsZWFzZSBkbyBub3QgaW50ZXJhY3Qgd2l0aCB0aGlzIHRhYi5cIixcbiAgfSxcbiAgY2Fyb3VzZWw6IHtcbiAgICBiZWVtb292X2Fubm95YW5jZXM6IHtcbiAgICAgIHRpdGxlOiBcIkJlZW1vb3YgQW5ub3lhbmNlc1wiLFxuICAgICAgc3VidGl0bGU6IFwiQmxvY2sgc29tZSBvZiBFbGRhcnlhJ3MgYW5ub3lhbmNlcy5cIixcbiAgICB9LFxuICAgIGRvd25sb2FkX2ZhY2U6IHtcbiAgICAgIHRpdGxlOiBcIkRvd25sb2FkIHlvdXIgZ3VhcmRpYW4ncyBmYWNlIVwiLFxuICAgICAgc3VidGl0bGU6IFwiQ2xpY2sgaGVyZSB0byBkb3dubG9hZCB5b3VyIGd1YXJkaWFuJ3MgZmFjZS5cIixcbiAgICB9LFxuICAgIGRvd25sb2FkX2d1YXJkaWFuOiB7XG4gICAgICB0aXRsZTogXCJEb3dubG9hZCB5b3VyIGd1YXJkaWFuIVwiLFxuICAgICAgc3VidGl0bGU6IFwiQ2xpY2sgaGVyZSB0byBkb3dubG9hZCB5b3VyIGd1YXJkaWFuLlwiLFxuICAgIH0sXG4gICAgZWxkYXJ5YV9lbmhhbmNlbWVudHM6IHtcbiAgICAgIHRpdGxlOiBgJHtHTS5pbmZvLnNjcmlwdC5uYW1lfSB2JHtHTS5pbmZvLnNjcmlwdC52ZXJzaW9ufWAsXG4gICAgICBzdWJ0aXRsZTogR00uaW5mby5zY3JpcHQuZGVzY3JpcHRpb24sXG4gICAgfSxcbiAgICB0YWtlb3Zlcjoge1xuICAgICAgZGlzYWJsZV90YWtlb3ZlcjogXCJEaXNhYmxlIFRha2VvdmVyXCIsXG4gICAgICBlbmFibGVfdGFrZW92ZXI6IFwiRW5hYmxlIFRha2VvdmVyXCIsXG4gICAgICBzdWJ0aXRsZTogXCJHaXZlIHVwIHRoaXMgdGFiIHRvIHBlcmZvcm0gYXV0b21hdGVkIGFjdGlvbnMuXCIsXG4gICAgICB0aXRsZTogXCJUYWtlb3ZlclwiLFxuICAgIH0sXG4gIH0sXG4gIG1pbmlnYW1lczoge1xuICAgIHBsYXllZF9mb3I6IChuYW1lLCBtYWFuYXMpID0+XG4gICAgICBgUGxheWVkIDxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPiBmb3IgPHN0cm9uZyBjbGFzcz1cInByaWNlLWl0ZW1cIj4ke21hYW5hc308L3N0cm9uZz4gPHNwYW4gY2xhc3M9XCJtYWFuYS1pY29uXCIgYWx0PVwibWFhbmFzXCI+PC9zcGFuPiBlYXJuZWQuYCxcbiAgICBwbGF5ZWQ6IG5hbWUgPT4gYFBsYXllZCA8c3Ryb25nPiR7bmFtZX08L3N0cm9uZz4uYCxcbiAgICBwbGF5aW5nOiBuYW1lID0+IGBQbGF5aW5nIDxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPi4uLmAsXG4gIH0sXG4gIGFwcGVhcmFuY2U6IHtcbiAgICBidXR0b25zOiB7XG4gICAgICBiYWNrd2FyZDogXCJNb3ZlIGJhY2tcIixcbiAgICAgIGZvcndhcmQ6IFwiQnJpbmcgZm9yd2FyZFwiLFxuICAgIH0sXG4gICAgZmF2b3VyaXRlczoge1xuICAgICAgYnV0dG9uczoge1xuICAgICAgICBkb3dubG9hZDogXCJEb3dubG9hZCBQTkdcIixcbiAgICAgICAgZXhwb3J0OiBcIkV4cG9ydFwiLFxuICAgICAgICBpbXBvcnQ6IFwiSW1wb3J0XCIsXG4gICAgICB9LFxuICAgICAgY2xpY2tfb3V0Zml0OiB7XG4gICAgICAgIGRlbGV0ZTogXCJEZWxldGVcIixcbiAgICAgICAgZ290b19hY2NvdW50OiBgVG8gdHJhbnNmZXIgeW91ciA8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz4gZmF2b3VyaXRlIG91dGZpdHMgdG8gYW5vdGhlciBicm93c2VyLCBleHBvcnQgeW91ciBzZXR0aW5ncyBpbiB0aGUgPGEgaHJlZj1cIi91c2VyL2FjY291bnRcIiBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1wiPm15Jm5ic3A7YWNjb3VudDwvYT4gcGFnZS5gLFxuICAgICAgICBzYXZlZF9sb2NhbGx5OiBgVGFrZSBub3RlIHRoYXQgdGhpcyBvdXRmaXQgaXMgc2F2ZWQgaW4gPHN0cm9uZz4ke0dNLmluZm8uc2NyaXB0Lm5hbWV9PC9zdHJvbmc+JyBzZXR0aW5ncyBhbmQgd2FzIG5vdCBzZW50IHRvIEVsZGFyeWEncyBzZXJ2ZXJzLmAsXG4gICAgICAgIHdlYXI6IFwiV2VhclwiLFxuICAgICAgfSxcbiAgICAgIGltcG9ydGVkOiBcIkltcG9ydGVkIG91dGZpdCFcIixcbiAgICAgIGltcG9ydGluZzogXCJJbXBvcnRpbmcgb3V0Zml0LiBQbGVhc2Ugd2FpdC4uLlwiLFxuICAgICAgcmVuYW1lX291dGZpdDoge1xuICAgICAgICB0aXRsZTogKG5hbWU6IHN0cmluZykgPT4gYFJlbmFtZSA8c3Ryb25nPiR7bmFtZX08L3N0cm9uZz5gLFxuICAgICAgICBidXR0b246IFwiUmVuYW1lXCIsXG4gICAgICB9LFxuICAgICAgc2F2ZV9vdXRmaXQ6IHtcbiAgICAgICAgZ290b19hY2NvdW50OiBgVG8gdHJhbnNmZXIgeW91ciA8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz4gZmF2b3VyaXRlIG91dGZpdHMgdG8gYW5vdGhlciBicm93c2VyLCBleHBvcnQgeW91ciBzZXR0aW5ncyBpbiB0aGUgPGEgaHJlZj1cIi91c2VyL2FjY291bnRcIiBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1wiPm15Jm5ic3A7YWNjb3VudDwvYT4gcGFnZS5gLFxuICAgICAgICBwbGFjZWhvbGRlcjogXCJOYW1lLi4uXCIsXG4gICAgICAgIHNhdmU6IFwiU2F2ZVwiLFxuICAgICAgICBzYXZlZF9sb2NhbGx5OiBgVGFrZSBub3RlIHRoYXQgdGhpcyBvdXRmaXQgd2lsbCBvbmx5IGJlIHNhdmVkIHdpdGhpbiA8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz4nIHNldHRpbmdzIGFuZCB3aWxsIG5vdCBiZSBzZW50IHRvIEVsZGFyeWEncyBzZXJ2ZXJzLmAsXG4gICAgICAgIHRpdGxlOiBcIlNhdmUgb3V0Zml0XCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbG9hZGVkOiBcIlRoZSB3YXJkcm9iZSBpcyBsb2FkZWQuXCIsXG4gICAgbG9hZGluZzogKGNhdGVnb3J5bmFtZTogc3RyaW5nKSA9PlxuICAgICAgYExvYWRpbmcgPHN0cm9uZz4ke2NhdGVnb3J5bmFtZX08L3N0cm9uZz4uLi5gLFxuICB9LFxuICBtYXJrZXQ6IHtcbiAgICBhZGRfdG9fd2lzaGxpc3Q6IHtcbiAgICAgIGFkZGVkX3RvX3dpc2hsaXN0OiAobmFtZSwgcHJpY2UpID0+XG4gICAgICAgIGBBZGRlZCA8c3Ryb25nPiR7bmFtZX08L3N0cm9uZz4gZm9yIDxzdHJvbmcgY2xhc3M9XCJwcmljZS1pdGVtXCI+JHtwcmljZX08L3N0cm9uZz4gPHNwYW4gY2xhc3M9XCJtYWFuYS1pY29uXCIgYWx0PVwibWFhbmFzXCI+PC9zcGFuPiB0byB0aGUgd2lzaGxpc3QuYCxcbiAgICAgIGludmFsaWRfcHJpY2U6IFwiVGhpcyBpcyBub3QgYSB2YWxpZCBwcmljZS5cIixcbiAgICAgIHNhdmU6IFwiU2F2ZVwiLFxuICAgICAgdGV4dDogXCJIb3cgbWFueSBtYWFuYXMgZG8geW91IHdpc2ggdG8gb2ZmZXIgdG8gYWNxdWlyZSB0aGlzIGl0ZW0/XCIsXG4gICAgICB0aXRsZTogXCJBZGQgdG8gd2lzaGxpc3RcIixcbiAgICB9LFxuICAgIGF1Y3Rpb25zOiB7XG4gICAgICBidXlfbm93X3ByaWNlOiBcIkJ1eSBub3cgcHJpY2UgOlwiLFxuICAgICAgY3VycmVudF9wcmljZTogXCJDdXJyZW50IHByaWNlIDpcIixcbiAgICAgIGRlbGV0ZTogXCJEZWxldGVcIixcbiAgICAgIHB1cmNoYXNlX2hpc3Rvcnk6IFwiUHVyY2hhc2UgaGlzdG9yeVwiLFxuICAgICAgc2FsZXNfaGlzdG9yeTogXCJTYWxlcyBoaXN0b3J5XCIsXG4gICAgICBkYXRlX3RpbWVfZm9ybWF0OiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuLUdCXCIsIHtcbiAgICAgICAgbWludXRlOiBcIjItZGlnaXRcIixcbiAgICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICAgIGRheTogXCJudW1lcmljXCIsXG4gICAgICAgIG1vbnRoOiBcImxvbmdcIixcbiAgICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICB9KSxcbiAgICB9LFxuICAgIGNoYW5nZV9wcmljZToge1xuICAgICAgY2hhbmdlZF9wcmljZTogKG5hbWUsIHByaWNlKSA9PlxuICAgICAgICBgQ2hhbmdlZCA8c3Ryb25nPiR7bmFtZX08L3N0cm9uZz4ncyBwcmljZSBmb3IgPHN0cm9uZyBjbGFzcz1cInByaWNlLWl0ZW1cIj4ke3ByaWNlfTwvc3Ryb25nPiA8c3BhbiBjbGFzcz1cIm1hYW5hLWljb25cIiBhbHQ9XCJtYWFuYXNcIj48L3NwYW4+LmAsXG4gICAgICBpbnZhbGlkX3ByaWNlOiBcIlRoaXMgaXMgbm90IGEgdmFsaWQgcHJpY2UuXCIsXG4gICAgICBzYXZlOiBcIlNhdmVcIixcbiAgICAgIHRleHQ6IFwiSG93IG1hbnkgbWFhbmFzIGRvIHlvdSB3aXNoIHRvIG9mZmVyIHRvIGFjcXVpcmUgdGhpcyBpdGVtP1wiLFxuICAgICAgdGl0bGU6IFwiQ2hhbmdlIHByaWNlXCIsXG4gICAgfSxcbiAgICB3aXNobGlzdDoge1xuICAgICAgYWN0aW9uczogXCJBY3Rpb25zXCIsXG4gICAgICBhc3Npc3RhbmNlOiBgT24gdGhpcyBwYWdlLCB5b3UgY2FuIG9yZ2FuaXplIHlvdXIgd2lzaGxpc3QgYW5kIGNoZWNrIHRoZSBzdGF0dXMgb2YgeW91ciB3aXNoZWQgaXRlbXMuIFBsZWFzZSBub3RlIHRoYXQgeW91ciB3aXNobGlzdCBpcyBzYXZlZCBsb2NhbGx5IGluIDxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC5uYW1lfTwvc3Ryb25nPicgc2V0dGluZ3MgYW5kIGlzIG5vdCBzZW50IHRvIEVsZGFyeWEncyBzZXJ2ZXJzLiBUbyB0cmFuc2ZlciB5b3VyIHdpc2hsaXN0IHRvIGFub3RoZXIgYnJvd3NlciwgZXhwb3J0IHlvdXIgc2V0dGluZ3MgaW4gdGhlIDxhIGhyZWY9XCIvdXNlci9hY2NvdW50XCIgc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcIj5teSZuYnNwO2FjY291bnQ8L2E+IHBhZ2UuYCxcbiAgICAgIGNoYW5nZV9wcmljZTogXCJDaGFuZ2UgcHJpY2VcIixcbiAgICAgIGRlbGV0ZV90b29sdGlwOiBcIlJlbW92ZSBmcm9tIHdpc2hsaXN0XCIsXG4gICAgICBkZWxldGU6IFwiRGVsZXRlXCIsXG4gICAgICBpY29uOiBcIkljb25cIixcbiAgICAgIG5hbWU6IFwiTmFtZVwiLFxuICAgICAgcHJpY2U6IFwiUHJpY2VcIixcbiAgICAgIHJlc2V0X2FsbDogXCJSZXNldCBhbGwgc3RhdHVzZXNcIixcbiAgICAgIHJlc2V0X3Rvb2x0aXA6IFwiUmVzZXQgdGhlIGVycm9yIHN0YXR1c1wiLFxuICAgICAgcmVzZXQ6IFwiUmVzZXRcIixcbiAgICAgIHN0YXR1czogXCJTdGF0dXNcIixcbiAgICAgIHRpdGxlOiBcIldpc2hsaXN0XCIsXG4gICAgfSxcbiAgfSxcbiAgYWNjb3VudDoge1xuICAgIGNhbmNlbDogXCJDYW5jZWxcIixcbiAgICBjb25maXJtX3Jlc2V0X2NvbnRlbnQ6IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVzZXQgeW91ciA8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz4gc2V0dGluZ3M/IFlvdXIgZnJlZSBzYXZlZCBmYXZvcml0ZSBvdXRmaXRzLCB3aXNobGlzdCwgZXhwbG9yYXRpb24gYW5kIG1hcmtldCBoaXN0b3J5LCBhbmQgbWFya2VkIGV4cGxvcmF0aW9uIHBvaW50cyB3aWxsIGJlIGVyYXNlZC4gWW91IHdpbGwgYWxzbyBuZWVkIHRvIHJlLWVuYWJsZSBhbGwgdGhlIGRlc2lyZWQgc2V0dGluZ3MuYCxcbiAgICBjb25maXJtX3Jlc2V0X3RpdGxlOiBcIkVyYXNlIHNldHRpbmdzXCIsXG4gICAgY29uZmlybTogXCJSZXNldFwiLFxuICAgIGRlYnVnX3Rvb2x0aXA6IFwiRW5hYmxlcyBvciBkaXNhYmxlcyBsb2dnaW5nLlwiLFxuICAgIGRlYnVnOiBcIkRlYnVnXCIsXG4gICAgZGVsZXRlX2V4cGxvcmF0aW9uczogXCJEZWxldGUgYWxsIGV4cGxvcmF0aW9uIHBvaW50c1wiLFxuICAgIGVuaGFuY2VtZW50czogXCJFbmhhbmNlbWVudHNcIixcbiAgICBleHBsb3JhdGlvbnNfZGVsZXRlZDogXCJZb3VyIG1hcmtlZCBleHBsb3JhdGlvbiBwb2ludHMgd2VyZSBkZWxldGVkLlwiLFxuICAgIGV4cGxvcmF0aW9uczogXCJFeHBsb3JhdGlvbnNcIixcbiAgICBleHBvcnQ6IFwiRXhwb3J0IHNldHRpbmdzXCIsXG4gICAgaW1wb3J0OiBcIkltcG9ydCBzZXR0aW5nc1wiLFxuICAgIGltcG9ydGVkOiBcIkltcG9ydGVkIHNldHRpbmdzIVwiLFxuICAgIG1hcmtldDogXCJNYXJrZXRcIixcbiAgICBtaW5pZ2FtZXM6IFwiTWluaWdhbWVzXCIsXG4gICAgcmVzZXQ6IFwiUmVzZXRcIixcbiAgfSxcbiAgcGV0OiB7XG4gICAgYXV0b19leHBsb3JlOiBcIkhpZ2hsaWdodFwiLFxuICAgIGRhdGVfdGltZV9mb3JtYXQ6IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW4tR0JcIiwge1xuICAgICAgbWludXRlOiBcIjItZGlnaXRcIixcbiAgICAgIGhvdXI6IFwiMi1kaWdpdFwiLFxuICAgICAgZGF5OiBcIm51bWVyaWNcIixcbiAgICAgIG1vbnRoOiBcImxvbmdcIixcbiAgICAgIHllYXI6IFwibnVtZXJpY1wiLFxuICAgIH0pLFxuICAgIGRlbGV0ZV9oaXN0b3J5OiBcIkRlbGV0ZSBoaXN0b3J5XCIsXG4gICAgZGVsZXRpbmdfbWFya2VyczogXCJEZWxldGluZyBtYXJrZXJzLi4uXCIsXG4gICAgZW1wdHlfaGlzdG9yeTpcbiAgICAgIFwiWW91ciBleHBsb3JhdGlvbiBoaXN0b3J5IGlzIGVtcHR5LiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgZmlsbCB1cCBhcyB5b3VyIGZhbWlsaWFyIGZpbmRzIGl0ZW1zIHdoaWxlIGV4cGxvcmluZy5cIixcbiAgICBnb3RvX2FjY291bnQ6IGBUbyB0cmFuc2ZlciB5b3VyIGV4cGxvcmF0aW9uIGhpc3RvcnkgdG8gYW5vdGhlciBicm93c2VyLCBleHBvcnQgeW91ciBzZXR0aW5ncyBmcm9tIHRoZSA8ZW0+bXkmbmJzcDthY2NvdW50PC9lbT4gcGFnZS5gLFxuICAgIGhpc3Rvcnk6IFwiSGlzdG9yeVwiLFxuICAgIG1hcmtfYWxsOiBcIk1hcmsgdGhpcyByZWdpb25cIixcbiAgICBzYXZlZF9sb2NhbGx5OiBgUGxlYXNlIG5vdGUgdGhhdCB5b3VyIGV4cGxvcmF0aW9uIGhpc3RvcnkgaXMgc2F2ZWQgbG9jYWxseSBpbiA8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz4nIHNldHRpbmdzIGFuZCB3YXMgbm90IHNlbnQgdG8gRWxkYXJ5YSdzIHNlcnZlcnMuYCxcbiAgICB1bm1hcmtfYWxsOiBcIlVubWFyayB0aGlzIHJlZ2lvblwiLFxuICB9LFxuICBwcm9maWxlOiB7XG4gICAgZXhwb3J0X291dGZpdDogXCJFeHBvcnQgb3V0Zml0XCIsXG4gICAgZG93bmxvYWRfb3V0Zml0OiBcIkRvd25sb2FkIFBOR1wiLFxuICB9LFxuICBlcnJvcjoge1xuICAgIGRvd25sb2FkQ2FudmFzOiBcIlRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgaW1hZ2UuXCIsXG4gICAgbG9uZ0xvYWRpbmc6XG4gICAgICBcIkVsZGFyeWEgaXMgdGFraW5nIHRvbyBsb25nIHRvIGxvYWQuIFJldHJ5aW5nIGluIDEwIHNlY29uZHMuLi5cIixcbiAgfSxcbiAgbWFsbDoge1xuICAgIGFkZF90b193aXNobGlzdDoge1xuICAgICAgdGl0bGU6IFwiQWRkIHRvIG1hcmtldCB3aXNobGlzdFwiLFxuICAgICAgdGV4dDogXCJIb3cgbWFueSBtYWFuYXMgZG8geW91IHdpc2ggdG8gb2ZmZXIgdG8gYWNxdWlyZSB0aGlzIGl0ZW0/XCIsXG4gICAgICBub3RlOiBcIlBsZWFzZSBub3RlIHRoYXQgdGhlIGl0ZW1zIGFkZGVkIGZyb20gdGhlIG1hbGwgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYXZhaWxhYmxlIGF0IHRoZSBtYXJrZXQuXCIsXG4gICAgfSxcbiAgfSxcbn1cblxuT2JqZWN0LmZyZWV6ZShlbilcbiIsImltcG9ydCB0eXBlIHsgVHJhbnNsYXRpb24gfSBmcm9tIFwiLi90cmFuc2xhdGlvblwiXG5cbmV4cG9ydCBjb25zdCBmcjogVHJhbnNsYXRpb24gPSB7XG4gIGhvbWU6IHtcbiAgICBmb3J1bTogXCJGb3J1bVwiLFxuICAgIHRha2VvdmVyOiBcIlRha2VvdmVyXCIsXG4gIH0sXG4gIHRha2VvdmVyOiB7XG4gICAgYm91Z2h0OiAobmFtZSwgcHJpY2UpID0+XG4gICAgICBgQWNoZXTDqSA8c3Ryb25nPiR7bmFtZX08L3N0cm9uZz4gcG91ciA8c3Ryb25nIGNsYXNzPVwicHJpY2UtaXRlbVwiPiR7cHJpY2V9PC9zdHJvbmc+IDxzcGFuIGNsYXNzPVwibWFhbmEtaWNvblwiIGFsdD1cIm1hYW5hc1wiPjwvc3Bhbj4uYCxcbiAgICBkaXNhYmxlZDogXCJUYWtlb3ZlciBkw6lzYWN0aXbDqS5cIixcbiAgICBlbmFibGVkOiBcIlRha2VvdmVyIGFjdGl2w6kuIMOJdml0ZSBkJ2ludMOpcmFnaXIgYXZlYyBjZXQgb25nbGV0LlwiLFxuICB9LFxuICBjYXJvdXNlbDoge1xuICAgIGJlZW1vb3ZfYW5ub3lhbmNlczoge1xuICAgICAgdGl0bGU6IFwiQmVlbW9vdiBBbm5veWFuY2VzXCIsXG4gICAgICBzdWJ0aXRsZTogXCJCbG9xdWUgY2VydGFpbnMgaXJyaXRhbnRzIGQnRWxkYXJ5YS5cIixcbiAgICB9LFxuICAgIGRvd25sb2FkX2ZhY2U6IHtcbiAgICAgIHRpdGxlOiBcIlTDqWzDqWNoYXJnZSBsZSB2aXNhZ2UgZGUgdGEgZ2FyZGllbm5lIVwiLFxuICAgICAgc3VidGl0bGU6IFwiQ2xpcXVlIGljaSBwb3VyIHTDqWzDqWNoYXJnZXIgbGUgdmlzYWdlIGRlIHRhIGdhcmRpZW5uZS5cIixcbiAgICB9LFxuICAgIGRvd25sb2FkX2d1YXJkaWFuOiB7XG4gICAgICB0aXRsZTogXCJUw6lsw6ljaGFyZ2UgdGEgZ2FyZGllbm5lIVwiLFxuICAgICAgc3VidGl0bGU6IFwiQ2xpcXVlIGljaSBwb3VyIHTDqWzDqWNoYXJnZXIgdGEgZ2FyZGllbm5lLlwiLFxuICAgIH0sXG4gICAgZWxkYXJ5YV9lbmhhbmNlbWVudHM6IHtcbiAgICAgIHRpdGxlOiBgJHtHTS5pbmZvLnNjcmlwdC5uYW1lfSB2JHtHTS5pbmZvLnNjcmlwdC52ZXJzaW9ufWAsXG4gICAgICBzdWJ0aXRsZTogXCJBbcOpbGlvcmUgbCdleHDDqXJpZW5jZSB1dGlsaXNhdGV1ciBkJ0VsZGFyeWEuXCIsXG4gICAgfSxcbiAgICB0YWtlb3Zlcjoge1xuICAgICAgZGlzYWJsZV90YWtlb3ZlcjogXCJEw6lzYWN0aXZlIGxlIHRha2VvdmVyXCIsXG4gICAgICBlbmFibGVfdGFrZW92ZXI6IFwiQWN0aXZlIGxlIHRha2VvdmVyXCIsXG4gICAgICBzdWJ0aXRsZTogXCJMYWlzc2UgY2V0IG9uZ2xldCBwZXJmb3JtZXIgZGVzIGFjdGlvbnMgYXV0b21hdGlxdWVzLlwiLFxuICAgICAgdGl0bGU6IFwiVGFrZW92ZXJcIixcbiAgICB9LFxuICB9LFxuICBtaW5pZ2FtZXM6IHtcbiAgICBwbGF5ZWRfZm9yOiAobmFtZTogc3RyaW5nLCBtYWFuYXM6IG51bWJlcikgPT5cbiAgICAgIGBBIGpvdcOpIMOgIDxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPiBwb3VyIDxzdHJvbmcgY2xhc3M9XCJwcmljZS1pdGVtXCI+JHttYWFuYXN9PC9zdHJvbmc+IDxzcGFuIGNsYXNzPVwibWFhbmEtaWNvblwiIGFsdD1cIm1hYW5hc1wiPjwvc3Bhbj4gZ2FnbsOpcy5gLFxuICAgIHBsYXllZDogKG5hbWU6IHN0cmluZykgPT4gYEEgam91w6kgw6AgPHN0cm9uZz4ke25hbWV9PC9zdHJvbmc+LmAsXG4gICAgcGxheWluZzogKG5hbWU6IHN0cmluZykgPT4gYEpvdWUgw6AgPHN0cm9uZz4ke25hbWV9PC9zdHJvbmc+Li4uYCxcbiAgfSxcbiAgYXBwZWFyYW5jZToge1xuICAgIGJ1dHRvbnM6IHtcbiAgICAgIGJhY2t3YXJkOiBcIlZlcnMgbCdhcnJpw6hyZVwiLFxuICAgICAgZm9yd2FyZDogXCJWZXJzIGwnYXZhbnRcIixcbiAgICB9LFxuICAgIGZhdm91cml0ZXM6IHtcbiAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgZG93bmxvYWQ6IFwiVMOpbMOpY2hhcmdlciBsZSBQTkdcIixcbiAgICAgICAgZXhwb3J0OiBcIkV4cG9ydGVyXCIsXG4gICAgICAgIGltcG9ydDogXCJJbXBvcnRlclwiLFxuICAgICAgfSxcbiAgICAgIGNsaWNrX291dGZpdDoge1xuICAgICAgICBkZWxldGU6IFwiU3VwcHJpbWVyXCIsXG4gICAgICAgIGdvdG9fYWNjb3VudDogYFBvdXIgdHJhbnNmw6lyZXIgdGVzIHRlbnVlcyBmYXZvcml0ZXMgZCc8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz4gdmVycyB1biBhdXRyZSBuYXZpZ2F0ZXVyLCBleHBvcnRlIHRlcyBwYXJhbcOodHJlcyDDoCBwYXJ0aXIgZGUgbGEgcGFnZSA8YSBocmVmPVwiL3VzZXIvYWNjb3VudFwiIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XCI+bW9uJm5ic3A7Y29tcHRlPC9hPi5gLFxuICAgICAgICBzYXZlZF9sb2NhbGx5OiBgUHJlbmRzIG5vdGUgcXVlIGNldHRlIHRlbnVlIGVzdCBzYXV2ZWdhcmTDqWUgbG9jYWxlbWVudCBkYW5zIGxlcyBwYXJhbcOodHJlcyBkJzxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC5uYW1lfTwvc3Ryb25nPiBldCBuJ2EgcGFzIMOpdMOpIGVudm95w6llIGF1eCBzZXJ2ZXVycyBkJ0VsZGFyeWEuYCxcbiAgICAgICAgd2VhcjogXCJQb3J0ZXJcIixcbiAgICAgIH0sXG4gICAgICBpbXBvcnRlZDogXCJJbXBvcnRhdGlvbiByw6l1c3NpZSFcIixcbiAgICAgIGltcG9ydGluZzogXCJJbXBvcnRhdGlvbiBlbiBjb3Vycy4uLlwiLFxuICAgICAgcmVuYW1lX291dGZpdDoge1xuICAgICAgICBidXR0b246IFwiUmVub21tZXJcIixcbiAgICAgICAgdGl0bGU6IChuYW1lOiBzdHJpbmcpID0+IGBSZW5vbW1lciA8c3Ryb25nPiR7bmFtZX08L3N0cm9uZz5gLFxuICAgICAgfSxcbiAgICAgIHNhdmVfb3V0Zml0OiB7XG4gICAgICAgIGdvdG9fYWNjb3VudDogYFBvdXIgdHJhbnNmw6lyZXIgdGVzIHRlbnVlcyBmYXZvcml0ZXMgZCc8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz4gdmVycyB1biBhdXRyZSBuYXZpZ2F0ZXVyLCBleHBvcnRlIHRlcyBwYXJhbcOodHJlcyDDoCBwYXJ0aXIgZGUgbGEgcGFnZSA8YSBocmVmPVwiL3VzZXIvYWNjb3VudFwiIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XCI+bW9uJm5ic3A7Y29tcHRlPC9hPi5gLFxuICAgICAgICBwbGFjZWhvbGRlcjogXCJOb20uLi5cIixcbiAgICAgICAgc2F2ZTogXCJTYXV2ZWdhcmRlclwiLFxuICAgICAgICBzYXZlZF9sb2NhbGx5OiBgUHJlbmRzIG5vdGUgcXVlIGNldHRlIHRlbnVlIHNlcmEgc2F1dmVnYXJkw6llIGxvY2FsZW1lbnQgZGFucyBsZXMgcGFyYW3DqHRyZXMgZCc8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz4gZXQgbmUgc2VyYSBwYXMgZW52b3nDqWUgYXV4IHNlcnZldXJzIGQnRWxkYXJ5YS5gLFxuICAgICAgICB0aXRsZTogXCJTYXV2ZWdhcmRlciBjZXR0ZSB0ZW51ZVwiLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxvYWRlZDogXCJMZSBjaGFyZ2VtZW50IGRlIGxhIGdhcmRlLXJvYmUgZXN0IHRlcm1pbsOpLlwiLFxuICAgIGxvYWRpbmc6IChjYXRlZ29yeW5hbWU6IHN0cmluZykgPT5cbiAgICAgIGBDaGFyZ2VtZW50IGRlIDxzdHJvbmc+JHtjYXRlZ29yeW5hbWV9PC9zdHJvbmc+Li4uYCxcbiAgfSxcbiAgbWFya2V0OiB7XG4gICAgYWRkX3RvX3dpc2hsaXN0OiB7XG4gICAgICBhZGRlZF90b193aXNobGlzdDogKG5hbWU6IHN0cmluZywgcHJpY2U6IG51bWJlcikgPT5cbiAgICAgICAgYEFqb3V0w6kgPHN0cm9uZz4ke25hbWV9PC9zdHJvbmc+IHBvdXIgPHN0cm9uZyBjbGFzcz1cInByaWNlLWl0ZW1cIj4ke3ByaWNlfTwvc3Ryb25nPiA8c3BhbiBjbGFzcz1cIm1hYW5hLWljb25cIiBhbHQ9XCJtYWFuYXNcIj48L3NwYW4+IMOgIGxhIGxpc3RlIGRlIHNvdWhhaXRzLmAsXG4gICAgICBpbnZhbGlkX3ByaWNlOiBcIkNlIHByaXggbidlc3QgcGFzIHZhbGlkZS5cIixcbiAgICAgIHNhdmU6IFwiU2F1dmVnYXJkZXJcIixcbiAgICAgIHRleHQ6IFwiQ29tYmllbiBkZSBtYWFuYXMgc291aGFpdGVzLXR1IG9mZnJpciBwb3VyIGFjcXXDqXJpciBjZXQgaXRlbT9cIixcbiAgICAgIHRpdGxlOiBcIkFqb3V0ZXIgw6AgbGEgbGlzdGUgZGUgc291aGFpdFwiLFxuICAgIH0sXG4gICAgYXVjdGlvbnM6IHtcbiAgICAgIGJ1eV9ub3dfcHJpY2U6IFwiQWNoYXQgaW1tw6lkaWF0IDpcIixcbiAgICAgIGN1cnJlbnRfcHJpY2U6IFwiTWlzZSBhY3R1ZWxsZSA6XCIsXG4gICAgICBkZWxldGU6IFwiU3VwcHJpbWVyXCIsXG4gICAgICBwdXJjaGFzZV9oaXN0b3J5OiBcIkhpc3RvcmlxdWUgZCdhY2hhdFwiLFxuICAgICAgc2FsZXNfaGlzdG9yeTogXCJIaXN0b3JpcXVlIGRlIHZlbnRlXCIsXG4gICAgICBkYXRlX3RpbWVfZm9ybWF0OiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImZyLUNBXCIsIHtcbiAgICAgICAgbWludXRlOiBcIjItZGlnaXRcIixcbiAgICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICAgIGRheTogXCJudW1lcmljXCIsXG4gICAgICAgIG1vbnRoOiBcImxvbmdcIixcbiAgICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICB9KSxcbiAgICB9LFxuICAgIGNoYW5nZV9wcmljZToge1xuICAgICAgY2hhbmdlZF9wcmljZTogKG5hbWU6IHN0cmluZywgcHJpY2U6IG51bWJlcikgPT5cbiAgICAgICAgYENoYW5nw6kgbGUgcHJpeCBkZSA8c3Ryb25nPiR7bmFtZX08L3N0cm9uZz4gcG91ciA8c3Ryb25nIGNsYXNzPVwicHJpY2UtaXRlbVwiPiR7cHJpY2V9PC9zdHJvbmc+IDxzcGFuIGNsYXNzPVwibWFhbmEtaWNvblwiIGFsdD1cIm1hYW5hc1wiPjwvc3Bhbj4uYCxcbiAgICAgIGludmFsaWRfcHJpY2U6IFwiQ2UgcHJpeCBuJ2VzdCBwYXMgdmFsaWRlLlwiLFxuICAgICAgc2F2ZTogXCJTYXV2ZWdhcmRlclwiLFxuICAgICAgdGV4dDogXCJDb21iaWVuIGRlIG1hYW5hcyBzb3VoYWl0ZXMtdHUgb2ZmcmlyIHBvdXIgYWNxdcOpcmlyIGNldCBpdGVtP1wiLFxuICAgICAgdGl0bGU6IFwiQ2hhbmdlciBsZSBwcml4XCIsXG4gICAgfSxcbiAgICB3aXNobGlzdDoge1xuICAgICAgYWN0aW9uczogXCJBY3Rpb25zXCIsXG4gICAgICBhc3Npc3RhbmNlOiBgU3VyIGNldHRlIHBhZ2UsIHR1IHBldXggb3JnYW5pc2VyIHRhIGxpc3RlIGRlIHNvdWhhaXRzIGV0IHbDqXJpZmllciBsZSBzdGF0dXQgZGUgdGVzIGFydGljbGVzIHNvdWhhaXTDqXMuIFByZW5kcyBub3RlIHF1ZSB0YSBsaXN0ZSBkZSBzb3VoYWl0cyBlc3Qgc2F1dmVnYXJkw6llIGxvY2FsZW1lbnQgZGFucyBsZXMgcGFyYW3DqHRyZXMgZCc8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz4gZXQgbidlc3QgcGFzIGVudm95w6llIGF1eCBzZXJ2ZXVycyBkJ0VsZGFyeWEuIFBvdXIgdHJhbnNmw6lyZXIgdGEgbGlzdGUgZGUgc291aGFpdHMgdmVycyB1biBhdXRyZSBuYXZpZ2F0ZXVyLCBleHBvcnRlLWxhIMOgIHBhcnRpciBkZSBsYSBwYWdlIDxhIGhyZWY9XCIvdXNlci9hY2NvdW50XCIgc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcIj5tb24mbmJzcDtjb21wdGU8L2E+LmAsXG4gICAgICBjaGFuZ2VfcHJpY2U6IFwiQ2hhbmdlciBsZSBwcml4XCIsXG4gICAgICBkZWxldGVfdG9vbHRpcDogXCJSZXRpcmVyIGRlIGxhIGxpc3RlIGRlIHNvdWhhaXRzXCIsXG4gICAgICBkZWxldGU6IFwiU3VwcHJpbWVyXCIsXG4gICAgICBpY29uOiBcIkljw7RuZVwiLFxuICAgICAgbmFtZTogXCJOb21cIixcbiAgICAgIHByaWNlOiBcIlByaXhcIixcbiAgICAgIHJlc2V0X2FsbDogXCJSw6lpbml0aWFsaXNlciB0b3V0IGxlcyBzdGF0dXRzXCIsXG4gICAgICByZXNldF90b29sdGlwOiBcIlLDqWluaXRpYWxpc2VyIGwnw6l0YXQgZCdlcnJldXJcIixcbiAgICAgIHJlc2V0OiBcIlLDqWluaXRpYWxpc2VyXCIsXG4gICAgICBzdGF0dXM6IFwiU3RhdHV0XCIsXG4gICAgICB0aXRsZTogXCJMaXN0ZSBkZSBzb3VoYWl0c1wiLFxuICAgIH0sXG4gIH0sXG4gIGFjY291bnQ6IHtcbiAgICBjYW5jZWw6IFwiQW5udWxlclwiLFxuICAgIGNvbmZpcm1fcmVzZXRfY29udGVudDogYFZldXgtdHUgdnJhaW1lbnQgcsOpaW5pdGlhbGlzZXIgdGVzIHBhcmFtw6h0cmVzIGQnPHN0cm9uZz4ke0dNLmluZm8uc2NyaXB0Lm5hbWV9PC9zdHJvbmc+PyBUZXMgdGVudWVzIGZhdm9yaXRlcyBlbnJlZ2lzdHLDqWVzIGdyYXR1aXRlbWVudCwgdGEgbGlzdGUgZGUgc291aGFpdCwgdG9uIGhpc3RvcmlxdWUgZCdleHBsb3JhdGlvbiBldCBkdSBtYXJjaMOpIGFpbnNpIHF1ZSB0ZXMgcG9pbnRzIGQnZXhwbG9yYXRpb25zIG1hcnF1w6lzIHNlcm9udCBlZmZhY8Opcy4gVHUgZGV2cmFzIMOpZ2FsZW1lbnQgcsOpYWN0aXZlciB0b3VzIGxlcyBwYXJhbcOodHJlcyBkw6lzaXLDqXMuYCxcbiAgICBjb25maXJtX3Jlc2V0X3RpdGxlOiBcIlN1cHByaW1lciBsZXMgcGFyYW3DqHRyZXNcIixcbiAgICBjb25maXJtOiBcIlLDqWluaXRpYWxpc2VyXCIsXG4gICAgZGVidWdfdG9vbHRpcDogXCJBY3RpdmUgb3UgZMOpc2FjdGl2ZSBsYSBqb3VybmFsaXNhdGlvbi5cIixcbiAgICBkZWJ1ZzogXCJEw6lib2dhZ2VcIixcbiAgICBkZWxldGVfZXhwbG9yYXRpb25zOiBcIlN1cHByaW1lciB0b3VzIGxlcyBwb2ludHMgZCdleHBsb3JhdGlvblwiLFxuICAgIGVuaGFuY2VtZW50czogXCJBbcOpbGlvcmF0aW9uc1wiLFxuICAgIGV4cGxvcmF0aW9uc19kZWxldGVkOiBcIlRlcyBwb2ludHMgZCdleHBsb3JhdGlvbiBtYXJxdcOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBleHBsb3JhdGlvbnM6IFwiRXhwbG9yYXRpb25zXCIsXG4gICAgZXhwb3J0OiBcIkV4cG9ydGVyIGxlcyBwYXJhbcOodHJlc1wiLFxuICAgIGltcG9ydDogXCJJbXBvcnRlciBsZXMgcGFyYW3DqHRyZXNcIixcbiAgICBpbXBvcnRlZDogXCJQYXJhbcOodHJlcyBpbXBvcnTDqXNcIixcbiAgICBtYXJrZXQ6IFwiTWFyY2jDqVwiLFxuICAgIG1pbmlnYW1lczogXCJNaW5pLWpldXhcIixcbiAgICByZXNldDogXCJSw6lpbml0aWFsaXNlclwiLFxuICB9LFxuICBwZXQ6IHtcbiAgICBhdXRvX2V4cGxvcmU6IFwiTWFycXVlclwiLFxuICAgIGRhdGVfdGltZV9mb3JtYXQ6IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZnItQ0FcIiwge1xuICAgICAgbWludXRlOiBcIjItZGlnaXRcIixcbiAgICAgIGhvdXI6IFwiMi1kaWdpdFwiLFxuICAgICAgZGF5OiBcIm51bWVyaWNcIixcbiAgICAgIG1vbnRoOiBcImxvbmdcIixcbiAgICAgIHllYXI6IFwibnVtZXJpY1wiLFxuICAgIH0pLFxuICAgIGRlbGV0ZV9oaXN0b3J5OiBcIk5ldHRveWVyIGwnaGlzdG9yaXF1ZVwiLFxuICAgIGRlbGV0aW5nX21hcmtlcnM6IFwiU3VwcHJlc3Npb24gZGVzIG1hcnF1ZXVycy4uLlwiLFxuICAgIGVtcHR5X2hpc3Rvcnk6XG4gICAgICBcIlRvbiBoaXN0b3JpcXVlIGQnZXhwbG9yYXRpb24gZXN0IHZpZGUuIElsIHNlIHJlbXBsaXJhIGF1dG9tYXRpcXVlbWVudCDDoCBtZXN1cmUgcXVlIHRvbiBmYW1pbGllciB0cm91dmVyYSBkZXMgaXRlbXMgZW4gZXhwbG9yYXRpb24uXCIsXG4gICAgZ290b19hY2NvdW50OlxuICAgICAgXCJQb3VyIHRyYW5zZsOpcmVyIHRvbiBoaXN0b3JpcXVlIGQnZXhwbG9yYXRpb25zIHZlcnMgdW4gYXV0cmUgbmF2aWdhdGV1ciwgZXhwb3J0ZSB0ZXMgcGFyYW3DqHRyZXMgw6AgcGFydGlyIGRlIGxhIHBhZ2UgPGVtPm1vbiBjb21wdGU8L2VtPi5cIixcbiAgICBoaXN0b3J5OiBcIkhpc3RvcmlxdWVcIixcbiAgICBtYXJrX2FsbDogXCJNYXJxdWVyIGNldHRlIGNhcnRlXCIsXG4gICAgc2F2ZWRfbG9jYWxseTogYFByZW5kcyBub3RlIHF1ZSB0b24gaGlzdG9yaXF1ZSBkJ2V4cGxvcmF0aW9ucyBlc3Qgc2F1dmVnYXJkw6kgbG9jYWxlbWVudCBkYW5zIGxlcyBwYXJhbcOodHJlcyBkJzxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC5uYW1lfTwvc3Ryb25nPiBldCBuJ2EgcGFzIMOpdMOpIGVudm95w6kgYXV4IHNlcnZldXJzIGQnRWxkYXJ5YS5gLFxuICAgIHVubWFya19hbGw6IFwiRMOpLW1hcnF1ZXIgY2V0dGUgY2FydGVcIixcbiAgfSxcbiAgcHJvZmlsZToge1xuICAgIGV4cG9ydF9vdXRmaXQ6IFwiRXhwb3J0ZXIgbGEgdGVudWVcIixcbiAgICBkb3dubG9hZF9vdXRmaXQ6IFwiVMOpbMOpY2hhcmdlciBsZSBQTkdcIixcbiAgfSxcbiAgZXJyb3I6IHtcbiAgICBkb3dubG9hZENhbnZhczpcbiAgICAgIFwiVW5lIGVycmV1ciBlc3Qgc3VydmVudWUgbG9ycyBkdSB0w6lsw6ljaGFyZ2VtZW50IGRlIGwnaW1hZ2UuXCIsXG4gICAgbG9uZ0xvYWRpbmc6XG4gICAgICBcIkVsZGFyeWEgcHJlbmQgdHJvcCBkZSB0ZW1wcyDDoCBjaGFyZ2VyLiBOb3V2ZWxsZSB0ZW50YXRpdmUgZGFucyAxMCBzZWNvbmRlcy4uLlwiLFxuICB9LFxuICBtYWxsOiB7XG4gICAgYWRkX3RvX3dpc2hsaXN0OiB7XG4gICAgICB0aXRsZTogXCJBam91dGVyIMOgIGxhIGxpc3RlIGRlIHNvdWhhaXQgZHUgbWFyY2jDqVwiLFxuICAgICAgdGV4dDogXCJDb21iaWVuIGRlIG1hYW5hcyBzb3VoYWl0ZXMtdHUgb2ZmcmlyIHBvdXIgYWNxdcOpcmlyIGNldCBpdGVtP1wiLFxuICAgICAgbm90ZTogXCJQcmVuZHMgbm90ZSBxdWUgbGVzIGl0ZW1zIGFqb3V0w6lzIMOgIHBhcnRpciBkZSBsYSBib3V0aXF1ZSBuZSBzZXJvbnQgcGFzIG7DqWNlc3NhaXJlbWVudCBkaXNwb25pYmxlcyBhdSBtYXJjaMOpLlwiLFxuICAgIH0sXG4gIH0sXG59XG5cbk9iamVjdC5mcmVlemUoZnIpXG4iLCJpbXBvcnQgeyBlbiB9IGZyb20gXCIuL2VuXCJcbmltcG9ydCB7IGZyIH0gZnJvbSBcIi4vZnJcIlxuaW1wb3J0IHR5cGUgeyBUcmFuc2xhdGlvbiB9IGZyb20gXCIuL3RyYW5zbGF0aW9uXCJcblxuZnVuY3Rpb24gdHJhbnNsYXRpb24oKTogVHJhbnNsYXRpb24ge1xuICBpZiAobG9jYXRpb24uaG9zdG5hbWUuZW5kc1dpdGgoXCIuY29tLmJyXCIpKSByZXR1cm4gZW5cbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLmRlXCIpKSByZXR1cm4gZW5cbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLmVzXCIpKSByZXR1cm4gZW5cbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLmh1XCIpKSByZXR1cm4gZW5cbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLml0XCIpKSByZXR1cm4gZW5cbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLnBsXCIpKSByZXR1cm4gZW5cbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLnJ1XCIpKSByZXR1cm4gZW5cbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLmNvbVwiKSkgcmV0dXJuIGVuXG4gIGlmIChsb2NhdGlvbi5ob3N0bmFtZS5lbmRzV2l0aChcIi5mclwiKSkgcmV0dXJuIGZyXG4gIGVsc2UgcmV0dXJuIGVuXG59XG5cbmV4cG9ydCBjb25zdCB0cmFuc2xhdGUgPSB0cmFuc2xhdGlvbigpXG4iLCJleHBvcnQgZW51bSBEYXRhYmFzZXMge1xuICBlbGRhcnlhX2VuaGFuY2VtZW50cyA9IFwiZWxkYXJ5YV9lbmhhbmNlbWVudHNcIixcbn1cbiIsImV4cG9ydCBlbnVtIEZpZWxkcyB7XG4gIGJsb2IgPSBcImJsb2JcIixcbiAgaWQgPSBcImlkXCIsXG4gIGl0ZW1zID0gXCJpdGVtc1wiLFxuICBuYW1lID0gXCJuYW1lXCIsXG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEZhdm91cml0ZU91dGZpdCxcbiAgTmV3RmF2b3VyaXRlT3V0Zml0LFxufSBmcm9tIFwiLi4vYXBwZWFyYW5jZS9pbnRlcmZhY2VzL2Zhdm91cml0ZV9vdXRmaXRcIlxuaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi9jb25zb2xlXCJcbmltcG9ydCB7IERhdGFiYXNlcyB9IGZyb20gXCIuL2RhdGFiYXNlcy5lbnVtXCJcbmltcG9ydCB7IEZpZWxkcyB9IGZyb20gXCIuL2ZpZWxkcy5lbnVtXCJcbmltcG9ydCB7IFRhYmxlcyB9IGZyb20gXCIuL3RhYmxlcy5lbnVtXCJcblxuY2xhc3MgSW5kZXhlZERCIHtcbiAgcHJpdmF0ZSBkYj86IElEQkRhdGFiYXNlXG4gIHByaXZhdGUgcmVhZG9ubHkgdmVyc2lvbiA9IDFcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oRGF0YWJhc2VzLmVsZGFyeWFfZW5oYW5jZW1lbnRzLCB0aGlzLnZlcnNpb24pXG4gICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKTogSURCRGF0YWJhc2UgPT4gKHRoaXMuZGIgPSByZXF1ZXN0LnJlc3VsdClcbiAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IGZ1bmN0aW9uICh0aGlzOiBJREJPcGVuREJSZXF1ZXN0KTogdm9pZCB7XG4gICAgICBjb25zdCBkYjogSURCRGF0YWJhc2UgPSB0aGlzLnJlc3VsdFxuXG4gICAgICBjb25zdCBvYmplY3RTdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKFRhYmxlcy5mYXZvdXJpdGVfb3V0Zml0cywge1xuICAgICAgICBrZXlQYXRoOiBcImlkXCIsXG4gICAgICAgIGF1dG9JbmNyZW1lbnQ6IHRydWUsXG4gICAgICB9KVxuXG4gICAgICBvYmplY3RTdG9yZS5jcmVhdGVJbmRleChGaWVsZHMuYmxvYiwgXCJibG9iXCIsIHsgdW5pcXVlOiBmYWxzZSB9KVxuICAgICAgb2JqZWN0U3RvcmUuY3JlYXRlSW5kZXgoRmllbGRzLml0ZW1zLCBcIml0ZW1zXCIsIHsgdW5pcXVlOiBmYWxzZSB9KVxuICAgICAgb2JqZWN0U3RvcmUuY3JlYXRlSW5kZXgoRmllbGRzLm5hbWUsIFwibmFtZVwiLCB7IHVuaXF1ZTogZmFsc2UgfSlcbiAgICB9XG4gICAgcmVxdWVzdC5vbmVycm9yID0gKCk6IHZvaWQgPT5cbiAgICAgIENvbnNvbGUuZXJyb3IoXCJFcnJvciB3aGVuIG9wZW5pbmcgdGhlIGluZGV4ZWREQlwiLCByZXF1ZXN0LmVycm9yKVxuICAgIHJlcXVlc3Qub25ibG9ja2VkID0gKCk6IHZvaWQgPT5cbiAgICAgIENvbnNvbGUuZXJyb3IoXCJCbG9ja2VkIGZyb20gb3BlbmluZyB0aGUgaW5kZXhlZERCXCIsIHJlcXVlc3QuZXJyb3IpXG4gIH1cblxuICAvKiogQHJldHVybnMgYSBuZXcgYEZhdm91cml0ZU91dGZpdGAgd2l0aCB0aGUgYGtleWAgcHJvcGVydHkgc2V0LiAqL1xuICBhc3luYyBhZGRGYXZvdXJpdGVPdXRmaXQoXG4gICAgZmF2b3VyaXRlOiBOZXdGYXZvdXJpdGVPdXRmaXRcbiAgKTogUHJvbWlzZTxGYXZvdXJpdGVPdXRmaXQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRiKSByZXR1cm4gcmVqZWN0KClcblxuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZGJcbiAgICAgICAgLnRyYW5zYWN0aW9uKFtUYWJsZXMuZmF2b3VyaXRlX291dGZpdHNdLCBcInJlYWR3cml0ZVwiKVxuICAgICAgICAub2JqZWN0U3RvcmUoVGFibGVzLmZhdm91cml0ZV9vdXRmaXRzKVxuICAgICAgICAuYWRkKGZhdm91cml0ZSlcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgIC4uLmZhdm91cml0ZSxcbiAgICAgICAgICB1cmw6IFVSTC5jcmVhdGVPYmplY3RVUkwoZmF2b3VyaXRlLmJsb2IpLFxuICAgICAgICAgIGlkOiBOdW1iZXIocmVxdWVzdC5yZXN1bHQpLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhc3luYyB1cGRhdGVGYXZvdXJpdGVPdXRmaXQoXG4gICAgZmF2b3VyaXRlOiBGYXZvdXJpdGVPdXRmaXRcbiAgKTogUHJvbWlzZTxGYXZvdXJpdGVPdXRmaXQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRiKSByZXR1cm4gcmVqZWN0KClcblxuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZGJcbiAgICAgICAgLnRyYW5zYWN0aW9uKFtUYWJsZXMuZmF2b3VyaXRlX291dGZpdHNdLCBcInJlYWR3cml0ZVwiKVxuICAgICAgICAub2JqZWN0U3RvcmUoVGFibGVzLmZhdm91cml0ZV9vdXRmaXRzKVxuICAgICAgICAucHV0KGZhdm91cml0ZSlcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgIC4uLmZhdm91cml0ZSxcbiAgICAgICAgICBpZDogTnVtYmVyKHJlcXVlc3QucmVzdWx0KSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgY2xlYXJGYXZvdXJpdGVPdXRmaXRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXRoaXMuZGIpIHJldHVybiByZWplY3QoKVxuXG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5kYlxuICAgICAgICAudHJhbnNhY3Rpb24oW1RhYmxlcy5mYXZvdXJpdGVfb3V0Zml0c10sIFwicmVhZHdyaXRlXCIpXG4gICAgICAgIC5vYmplY3RTdG9yZShUYWJsZXMuZmF2b3VyaXRlX291dGZpdHMpXG4gICAgICAgIC5jbGVhcigpXG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT4gcmVzb2x2ZSgpXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUZhdm91cml0ZU91dGZpdChmYXZvdXJpdGU6IEZhdm91cml0ZU91dGZpdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXRoaXMuZGIpIHJldHVybiByZWplY3QoKVxuXG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5kYlxuICAgICAgICAudHJhbnNhY3Rpb24oW1RhYmxlcy5mYXZvdXJpdGVfb3V0Zml0c10sIFwicmVhZHdyaXRlXCIpXG4gICAgICAgIC5vYmplY3RTdG9yZShUYWJsZXMuZmF2b3VyaXRlX291dGZpdHMpXG4gICAgICAgIC5kZWxldGUoZmF2b3VyaXRlLmlkKVxuXG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIGlmIChmYXZvdXJpdGUudXJsKSBVUkwucmV2b2tlT2JqZWN0VVJMKGZhdm91cml0ZS51cmwpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGdldEZhdm91cml0ZU91dGZpdChpZDogbnVtYmVyKTogUHJvbWlzZTxGYXZvdXJpdGVPdXRmaXQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRiKSByZXR1cm4gcmVqZWN0KClcblxuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZGJcbiAgICAgICAgLnRyYW5zYWN0aW9uKFtUYWJsZXMuZmF2b3VyaXRlX291dGZpdHNdLCBcInJlYWRvbmx5XCIpXG4gICAgICAgIC5vYmplY3RTdG9yZShUYWJsZXMuZmF2b3VyaXRlX291dGZpdHMpXG4gICAgICAgIC5nZXQoaWQpXG5cbiAgICAgIGNvbnN0IGZhdm91cml0ZTogRmF2b3VyaXRlT3V0Zml0ID0gcmVxdWVzdC5yZXN1bHRcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKTogdm9pZCA9PlxuICAgICAgICByZXNvbHZlKHsgLi4uZmF2b3VyaXRlLCB1cmw6IFVSTC5jcmVhdGVPYmplY3RVUkwoZmF2b3VyaXRlLmJsb2IpIH0pXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGdldEZhdm91cml0ZU91dGZpdHMoKTogUHJvbWlzZTxGYXZvdXJpdGVPdXRmaXRbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXRoaXMuZGIpIHJldHVybiByZWplY3QoXCJObyBkYXRhYmFzZVwiKVxuXG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5kYlxuICAgICAgICAudHJhbnNhY3Rpb24oW1RhYmxlcy5mYXZvdXJpdGVfb3V0Zml0c10sIFwicmVhZG9ubHlcIilcbiAgICAgICAgLm9iamVjdFN0b3JlKFRhYmxlcy5mYXZvdXJpdGVfb3V0Zml0cylcbiAgICAgICAgLmdldEFsbCgpXG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT5cbiAgICAgICAgcmVzb2x2ZShcbiAgICAgICAgICByZXF1ZXN0LnJlc3VsdC5tYXA8RmF2b3VyaXRlT3V0Zml0PigoZmF2b3VyaXRlOiBGYXZvdXJpdGVPdXRmaXQpID0+ICh7XG4gICAgICAgICAgICAuLi5mYXZvdXJpdGUsXG4gICAgICAgICAgICB1cmw6IFVSTC5jcmVhdGVPYmplY3RVUkwoZmF2b3VyaXRlLmJsb2IpLFxuICAgICAgICAgIH0pKVxuICAgICAgICApXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgSW5kZXhlZERCKClcbiIsImV4cG9ydCBlbnVtIFRhYmxlcyB7XG4gIGZhdm91cml0ZV9vdXRmaXRzID0gXCJmYXZvdXJpdGVfb3V0Zml0c1wiLFxufVxuIiwiZXhwb3J0IGVudW0gTG9jYWxTdG9yYWdlS2V5IHtcbiAgYXV0b0V4cGxvcmVMb2NhdGlvbnMgPSBcImF1dG9FeHBsb3JlTG9jYXRpb25zXCIsXG4gIGRlYnVnID0gXCJkZWJ1Z1wiLFxuICBleHBsb3JhdGlvbkhpc3RvcnkgPSBcImV4cGxvcmF0aW9uSGlzdG9yeVwiLFxuICBleHBsb3JhdGlvbnMgPSBcImV4cGxvcmF0aW9uc1wiLFxuICBtYXJrZXQgPSBcIm1hcmtldFwiLFxuICBtZXRhID0gXCJtZXRhXCIsXG4gIG1pbmlnYW1lcyA9IFwibWluaWdhbWVzXCIsXG4gIHB1cmNoYXNlcyA9IFwicHVyY2hhc2VzXCIsXG4gIHNhbGVzID0gXCJzYWxlc1wiLFxuICB1bmxvY2tlZCA9IFwidW5sb2NrZWRcIixcbiAgdmVyc2lvbiA9IFwidmVyc2lvblwiLFxuICB3aXNobGlzdCA9IFwid2lzaGxpc3RcIixcbn1cbiIsImltcG9ydCB7IGJhc2U2NFN0cmluZ1RvQmxvYiwgYmxvYlRvQmFzZTY0U3RyaW5nIH0gZnJvbSBcImJsb2ItdXRpbFwiXG5pbXBvcnQgdHlwZSB7IE1ldGEgfSBmcm9tIFwiLi4vYXBpL21ldGFcIlxuaW1wb3J0IHR5cGUgeyBOZXdGYXZvdXJpdGVPdXRmaXQgfSBmcm9tIFwiLi4vYXBwZWFyYW5jZS9pbnRlcmZhY2VzL2Zhdm91cml0ZV9vdXRmaXRcIlxuaW1wb3J0IGluZGV4ZWRfZGIgZnJvbSBcIi4uL2luZGV4ZWRfZGIvaW5kZXhlZF9kYlwiXG5pbXBvcnQgdHlwZSB7IE1hcmtldEVudHJ5IH0gZnJvbSBcIi4uL21hcmtldHBsYWNlL2ludGVyZmFjZXMvbWFya2V0X2VudHJ5XCJcbmltcG9ydCB0eXBlIHsgU2V0dGluZ3MgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvc2V0dGluZ3NcIlxuaW1wb3J0IHR5cGUgeyBBdXRvRXhwbG9yZUxvY2F0aW9uIH0gZnJvbSBcIi4vYXV0b19leHBsb3JlX2xvY2F0aW9uXCJcbmltcG9ydCB0eXBlIHsgRXhwbG9yYXRpb25SZXN1bHQgfSBmcm9tIFwiLi9leHBsb3JhdGlvbl9yZXN1bHRcIlxuaW1wb3J0IHR5cGUgeyBFeHBvcnRhYmxlRmF2b3VyaXRlIH0gZnJvbSBcIi4vZXhwb3J0YWJsZV9mYXZvdXJpdGVcIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlS2V5IH0gZnJvbSBcIi4vbG9jYWxfc3RvcmFnZS5lbnVtXCJcbmltcG9ydCB0eXBlIHsgU2FsZSB9IGZyb20gXCIuL3NhbGVcIlxuaW1wb3J0IHR5cGUgeyBXaXNoZWRJdGVtIH0gZnJvbSBcIi4vd2lzaGVkX2l0ZW1cIlxuXG5leHBvcnQgY2xhc3MgTG9jYWxTdG9yYWdlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9jYWxTdG9yYWdlID0gbG9jYWxTdG9yYWdlXG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGdldCBhdXRvRXhwbG9yZUxvY2F0aW9ucygpOiBBdXRvRXhwbG9yZUxvY2F0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW08QXV0b0V4cGxvcmVMb2NhdGlvbltdPihcbiAgICAgIExvY2FsU3RvcmFnZUtleS5hdXRvRXhwbG9yZUxvY2F0aW9ucyxcbiAgICAgIFtdXG4gICAgKVxuICB9XG5cbiAgc3RhdGljIHNldCBhdXRvRXhwbG9yZUxvY2F0aW9ucyhsb2NhdGlvbnM6IEF1dG9FeHBsb3JlTG9jYXRpb25bXSkge1xuICAgIHRoaXMuc2V0SXRlbShMb2NhbFN0b3JhZ2VLZXkuYXV0b0V4cGxvcmVMb2NhdGlvbnMsIGxvY2F0aW9ucylcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZGVidWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxib29sZWFuPihMb2NhbFN0b3JhZ2VLZXkuZGVidWcsIGZhbHNlKVxuICB9XG5cbiAgc3RhdGljIHNldCBkZWJ1ZyhlbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKExvY2FsU3RvcmFnZUtleS5kZWJ1ZywgZW5hYmxlZClcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZXhwbG9yYXRpb25IaXN0b3J5KCk6IEV4cGxvcmF0aW9uUmVzdWx0W10ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW08RXhwbG9yYXRpb25SZXN1bHRbXT4oXG4gICAgICBMb2NhbFN0b3JhZ2VLZXkuZXhwbG9yYXRpb25IaXN0b3J5LFxuICAgICAgW11cbiAgICApXG4gIH1cblxuICBzdGF0aWMgc2V0IGV4cGxvcmF0aW9uSGlzdG9yeShleHBsb3JhdGlvbkhpc3Rvcnk6IEV4cGxvcmF0aW9uUmVzdWx0W10pIHtcbiAgICB0aGlzLnNldEl0ZW0oTG9jYWxTdG9yYWdlS2V5LmV4cGxvcmF0aW9uSGlzdG9yeSwgZXhwbG9yYXRpb25IaXN0b3J5KVxuICB9XG5cbiAgc3RhdGljIGdldCBleHBsb3JhdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxib29sZWFuPihMb2NhbFN0b3JhZ2VLZXkuZXhwbG9yYXRpb25zLCBmYWxzZSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgZXhwbG9yYXRpb25zKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldEl0ZW0oTG9jYWxTdG9yYWdlS2V5LmV4cGxvcmF0aW9ucywgZW5hYmxlZClcbiAgfVxuXG4gIHN0YXRpYyBnZXQgbWFya2V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW08Ym9vbGVhbj4oTG9jYWxTdG9yYWdlS2V5Lm1hcmtldCwgZmFsc2UpXG4gIH1cblxuICBzdGF0aWMgc2V0IG1hcmtldChlbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKExvY2FsU3RvcmFnZUtleS5tYXJrZXQsIGVuYWJsZWQpXG4gIH1cblxuICBzdGF0aWMgZ2V0IG1ldGEoKTogTWV0YSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW08TWV0YSB8IG51bGw+KExvY2FsU3RvcmFnZUtleS5tZXRhLCBudWxsKVxuICB9XG5cbiAgc3RhdGljIHNldCBtZXRhKG1ldGE6IE1ldGEgfCBudWxsKSB7XG4gICAgdGhpcy5zZXRJdGVtKExvY2FsU3RvcmFnZUtleS5tZXRhLCBtZXRhKVxuICB9XG5cbiAgc3RhdGljIGdldCBtaW5pZ2FtZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxib29sZWFuPihMb2NhbFN0b3JhZ2VLZXkubWluaWdhbWVzLCBmYWxzZSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgbWluaWdhbWVzKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldEl0ZW0oTG9jYWxTdG9yYWdlS2V5Lm1pbmlnYW1lcywgZW5hYmxlZClcbiAgfVxuXG4gIHN0YXRpYyBnZXQgcHVyY2hhc2VzKCk6IE1hcmtldEVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW08TWFya2V0RW50cnlbXT4oTG9jYWxTdG9yYWdlS2V5LnB1cmNoYXNlcywgW10pXG4gIH1cblxuICBzdGF0aWMgc2V0IHB1cmNoYXNlcyhlbnRyeTogTWFya2V0RW50cnlbXSkge1xuICAgIHRoaXMuc2V0SXRlbShMb2NhbFN0b3JhZ2VLZXkucHVyY2hhc2VzLCBlbnRyeSlcbiAgfVxuXG4gIHN0YXRpYyBnZXQgc2FsZXMoKTogU2FsZVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtPFNhbGVbXT4oTG9jYWxTdG9yYWdlS2V5LnNhbGVzLCBbXSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgc2FsZXMoc2FsZTogU2FsZVtdKSB7XG4gICAgdGhpcy5zZXRJdGVtKExvY2FsU3RvcmFnZUtleS5zYWxlcywgc2FsZSlcbiAgfVxuXG4gIHN0YXRpYyBnZXQgdW5sb2NrZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxib29sZWFuPihMb2NhbFN0b3JhZ2VLZXkudW5sb2NrZWQsIGZhbHNlKVxuICB9XG5cbiAgc3RhdGljIHNldCB1bmxvY2tlZCh1bmxvY2tlZDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0SXRlbShMb2NhbFN0b3JhZ2VLZXkudW5sb2NrZWQsIHVubG9ja2VkKVxuICB9XG5cbiAgc3RhdGljIGdldCB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxzdHJpbmc+KExvY2FsU3RvcmFnZUtleS52ZXJzaW9uLCBcIlwiKVxuICB9XG5cbiAgc3RhdGljIHNldCB2ZXJzaW9uKHZlcnNpb246IHN0cmluZykge1xuICAgIHRoaXMuc2V0SXRlbShMb2NhbFN0b3JhZ2VLZXkudmVyc2lvbiwgdmVyc2lvbilcbiAgfVxuXG4gIHN0YXRpYyBnZXQgd2lzaGxpc3QoKTogV2lzaGVkSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtPFdpc2hlZEl0ZW1bXT4oTG9jYWxTdG9yYWdlS2V5Lndpc2hsaXN0LCBbXSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgd2lzaGxpc3QobG9jYXRpb25zOiBXaXNoZWRJdGVtW10pIHtcbiAgICB0aGlzLnNldEl0ZW0oTG9jYWxTdG9yYWdlS2V5Lndpc2hsaXN0LCBsb2NhdGlvbnMpXG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0U2V0dGluZ3MoKTogUHJvbWlzZTxTZXR0aW5ncz4ge1xuICAgIHJldHVybiB7XG4gICAgICBhdXRvRXhwbG9yZUxvY2F0aW9uczogdGhpcy5hdXRvRXhwbG9yZUxvY2F0aW9ucyxcbiAgICAgIGRlYnVnOiB0aGlzLmRlYnVnLFxuICAgICAgZXhwbG9yYXRpb25IaXN0b3J5OiB0aGlzLmV4cGxvcmF0aW9uSGlzdG9yeSxcbiAgICAgIGV4cGxvcmF0aW9uczogdGhpcy5leHBsb3JhdGlvbnMsXG4gICAgICBmYXZvdXJpdGVzOiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgKFxuICAgICAgICAgIGF3YWl0IGluZGV4ZWRfZGIuZ2V0RmF2b3VyaXRlT3V0Zml0cygpXG4gICAgICAgICkubWFwPFByb21pc2U8RXhwb3J0YWJsZUZhdm91cml0ZT4+KGFzeW5jIGZhdm91cml0ZSA9PiAoe1xuICAgICAgICAgIGlkOiBmYXZvdXJpdGUuaWQsXG4gICAgICAgICAgbmFtZTogZmF2b3VyaXRlLm5hbWUsXG4gICAgICAgICAgaXRlbXM6IGZhdm91cml0ZS5pdGVtcyxcbiAgICAgICAgICBiYXNlNjQ6IGF3YWl0IGJsb2JUb0Jhc2U2NFN0cmluZyhmYXZvdXJpdGUuYmxvYiksXG4gICAgICAgIH0pKVxuICAgICAgKSxcbiAgICAgIG1hcmtldDogdGhpcy5tYXJrZXQsXG4gICAgICBtaW5pZ2FtZXM6IHRoaXMubWluaWdhbWVzLFxuICAgICAgdW5sb2NrZWQ6IHRoaXMudW5sb2NrZWQsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICB3aXNobGlzdDogdGhpcy53aXNobGlzdCxcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgc2V0U2V0dGluZ3Moc2V0dGluZ3M6IFNldHRpbmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hdXRvRXhwbG9yZUxvY2F0aW9ucyA9IHNldHRpbmdzLmF1dG9FeHBsb3JlTG9jYXRpb25zXG4gICAgdGhpcy5kZWJ1ZyA9IHNldHRpbmdzLmRlYnVnXG4gICAgdGhpcy5leHBsb3JhdGlvbkhpc3RvcnkgPSBzZXR0aW5ncy5leHBsb3JhdGlvbkhpc3RvcnlcbiAgICB0aGlzLmV4cGxvcmF0aW9ucyA9IHNldHRpbmdzLmV4cGxvcmF0aW9uc1xuICAgIHRoaXMubWFya2V0ID0gc2V0dGluZ3MubWFya2V0XG4gICAgdGhpcy5taW5pZ2FtZXMgPSBzZXR0aW5ncy5taW5pZ2FtZXNcbiAgICB0aGlzLnVubG9ja2VkID0gc2V0dGluZ3MudW5sb2NrZWRcbiAgICB0aGlzLnZlcnNpb24gPSBzZXR0aW5ncy52ZXJzaW9uXG4gICAgdGhpcy53aXNobGlzdCA9IHNldHRpbmdzLndpc2hsaXN0XG5cbiAgICBhd2FpdCBpbmRleGVkX2RiLmNsZWFyRmF2b3VyaXRlT3V0Zml0cygpXG4gICAgZm9yIChjb25zdCBmYXZvdXJpdGUgb2Ygc2V0dGluZ3MuZmF2b3VyaXRlcy5tYXA8TmV3RmF2b3VyaXRlT3V0Zml0PihcbiAgICAgIGZhdm91cml0ZSA9PiAoe1xuICAgICAgICBuYW1lOiBmYXZvdXJpdGUubmFtZSxcbiAgICAgICAgaXRlbXM6IGZhdm91cml0ZS5pdGVtcyxcbiAgICAgICAgYmxvYjogYmFzZTY0U3RyaW5nVG9CbG9iKGZhdm91cml0ZS5iYXNlNjQpLFxuICAgICAgfSlcbiAgICApKSB7XG4gICAgICB2b2lkIGluZGV4ZWRfZGIuYWRkRmF2b3VyaXRlT3V0Zml0KGZhdm91cml0ZSlcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcmVzZXRTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmF1dG9FeHBsb3JlTG9jYXRpb25zID0gW11cbiAgICB0aGlzLmRlYnVnID0gZmFsc2VcbiAgICB0aGlzLmV4cGxvcmF0aW9uSGlzdG9yeSA9IFtdXG4gICAgdGhpcy5leHBsb3JhdGlvbnMgPSBmYWxzZVxuICAgIHRoaXMubWFya2V0ID0gZmFsc2VcbiAgICB0aGlzLm1pbmlnYW1lcyA9IGZhbHNlXG4gICAgdGhpcy51bmxvY2tlZCA9IGZhbHNlXG4gICAgdGhpcy52ZXJzaW9uID0gXCJcIlxuICAgIHRoaXMud2lzaGxpc3QgPSBbXVxuICAgIGF3YWl0IGluZGV4ZWRfZGIuY2xlYXJGYXZvdXJpdGVPdXRmaXRzKClcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldEl0ZW08VD4oa2V5OiBMb2NhbFN0b3JhZ2VLZXksIGZhbGxiYWNrOiBUKTogVCB7XG4gICAgcmV0dXJuIChKU09OLnBhcnNlKFxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpID8/IEpTT04uc3RyaW5naWZ5KGZhbGxiYWNrKVxuICAgICkgPz8gZmFsbGJhY2spIGFzIFRcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNldEl0ZW08VD4oa2V5OiBMb2NhbFN0b3JhZ2VLZXksIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gQm9keUxvY2F0aW9uIHtcbiAgQWxsID0gXCJcIixcbiAgVW5kZXJ3ZWFyID0gMSxcbiAgU2tpbnMgPSAyLFxuICBUYXR0b29zID0gMjAsXG4gIE1vdXRocyA9IDIxLFxuICBFeWVzID0gMyxcbiAgSGFpciA9IDQsXG4gIFNvY2tzID0gNSxcbiAgU2hvZXMgPSA2LFxuICBQYW50cyA9IDcsXG4gIEhhbmRBY2Nlc3NvcmllcyA9IDgsXG4gIFRvcHMgPSA5LFxuICBDb2F0cyA9IDEwLFxuICBHbG92ZXMgPSAxMSxcbiAgTmVja2xhY2VzID0gMTIsXG4gIERyZXNzZXMgPSAxMyxcbiAgSGF0cyA9IDE0LFxuICBGYWNlQWNjZXNzb3JpZXMgPSAxNSxcbiAgRnVuZHMgPSAxNixcbiAgQmVsdHMgPSAxOCxcbiAgQXRtb3NwaGVyZXMgPSAxOSxcbn1cbiIsImltcG9ydCB7IFR5cGUgfSBmcm9tIFwiLi90eXBlLmVudW1cIlxuXG5leHBvcnQgZW51bSBDYXRlZ29yeVN0cmluZyB7XG4gIGFsbCA9IFwiXCIsXG4gIGZvb2QgPSBcImZvb2RcIixcbiAgYWxjaGVteSA9IFwiYWxjaGVteVwiLFxuICB1dGlsaXR5ID0gXCJ1dGlsaXR5XCIsXG4gIHRhbWUgPSBcInRhbWVcIixcbn1cblxuZXhwb3J0IGVudW0gQ2F0ZWdvcnlOdW1iZXIge1xuICBhbGwgPSBDYXRlZ29yeVN0cmluZy5hbGwsXG4gIGZvb2QgPSAxLFxuICBhbGNoZW15ID0gVHlwZS5Db25zdW1hYmxlLFxuICB1dGlsaXR5ID0gMyxcbiAgdGFtZSA9IDQsXG59XG4iLCJleHBvcnQgZW51bSBHdWFyZCB7XG4gIGFueSA9IFwiXCIsXG4gIGxpZ2h0ID0gMSxcbiAgb2JzaWRpYW4sXG4gIGFic3ludGhlLFxuICBzaGFkb3csXG59XG4iLCJleHBvcnQgZW51bSBSYXJpdHkge1xuICBhbGwgPSBcIlwiLFxuICBjb21tb24gPSBcImNvbW1vblwiLFxuICByYXJlID0gXCJyYXJlXCIsXG4gIGVwaWMgPSBcImVwaWNcIixcbiAgbGVnZW5kYXJ5ID0gXCJsZWdlbmRhcnlcIixcbiAgZXZlbnQgPSBcImV2ZW50XCIsXG59XG4iLCJleHBvcnQgZW51bSBUeXBlIHtcbiAgQWxsID0gXCJcIixcbiAgQmFnID0gXCJCYWdcIixcbiAgQ29uc3VtYWJsZSA9IFwiQ29uc3VtYWJsZVwiLFxuICBFZ2dJdGVtID0gXCJFZ2dJdGVtXCIsXG4gIFBsYXllcldlYXJhYmxlSXRlbSA9IFwiUGxheWVyV2VhcmFibGVJdGVtXCIsXG4gIFF1ZXN0SXRlbSA9IFwiUXVlc3RJdGVtXCIsXG59XG4iLCJpbXBvcnQgeyBDb25zb2xlIH0gZnJvbSBcIi4uL2NvbnNvbGVcIlxuaW1wb3J0IHsgdHJpbUljb24gfSBmcm9tIFwiLi4vZWxkYXJ5YV91dGlsXCJcbmltcG9ydCB7IFJhcml0eSB9IGZyb20gXCIuL2VudW1zL3Jhcml0eS5lbnVtXCJcbmltcG9ydCB0eXBlIHsgQnV5Tm93UHJpY2UgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2J1eV9ub3dfcHJpY2VcIlxuaW1wb3J0IHR5cGUgeyBDdXJyZW50UHJpY2UgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2N1cnJlbnRfcHJpY2VcIlxuaW1wb3J0IHR5cGUgeyBNYXJrZXRFbnRyeSB9IGZyb20gXCIuL2ludGVyZmFjZXMvbWFya2V0X2VudHJ5XCJcbmltcG9ydCB0eXBlIHsgTWFya2V0RW50cnlEYXRhU2V0IH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9tYXJrZXRfZW50cnlfZGF0YV9zZXRcIlxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbURldGFpbHMobGk6IEhUTUxMSUVsZW1lbnQpOiBNYXJrZXRFbnRyeSB8IG51bGwge1xuICBjb25zdCBkYXRhc2V0ID0gbGkuZGF0YXNldCBhcyB1bmtub3duIGFzIE1hcmtldEVudHJ5RGF0YVNldFxuICBjb25zdCBuYW1lID0gbGkucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIuYWJzdHJhY3QtbmFtZVwiKT8uaW5uZXJUZXh0XG4gIGNvbnN0IGFic3RyYWN0VHlwZSA9XG4gICAgbGkucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIuYWJzdHJhY3QtdHlwZVwiKT8uaW5uZXJUZXh0XG4gIGNvbnN0IHNyYyA9IGxpLnF1ZXJ5U2VsZWN0b3I8SFRNTEltYWdlRWxlbWVudD4oXCIuYWJzdHJhY3QtaWNvbiBpbWdcIik/LnNyY1xuXG4gIGNvbnN0IHJhcml0eTogUmFyaXR5ID1cbiAgICBSYXJpdHlbXG4gICAgICAobGlcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgXCIucmFyaXR5LW1hcmtlci1jb21tb24sIC5yYXJpdHktbWFya2VyLXJhcmUsIC5yYXJpdHktbWFya2VyLWVwaWMsIC5yYXJpdHktbWFya2VyLWxlZ2VuZGFyeSwgLnJhcml0eS1tYXJrZXItZXZlbnRcIlxuICAgICAgICApXG4gICAgICAgID8uY2xhc3NOYW1lLnNwbGl0KFwicmFyaXR5LW1hcmtlci1cIilbMV0gPz8gXCJcIikgYXMga2V5b2YgdHlwZW9mIFJhcml0eVxuICAgIF1cblxuICBjb25zdCBjdXJyZW50UHJpY2UgPSBsaS5xdWVyeVNlbGVjdG9yPEhUTUxJbWFnZUVsZW1lbnQ+KFxuICAgIFwiLnByaWNlLWl0ZW1bZGF0YS1iaWRzXVwiXG4gICk/LmRhdGFzZXQgYXMgdW5rbm93biBhcyBDdXJyZW50UHJpY2VcblxuICBjb25zdCBidXlOb3dQcmljZSA9IGxpLnF1ZXJ5U2VsZWN0b3I8SFRNTEltYWdlRWxlbWVudD4oXG4gICAgXCIucHJpY2UtaXRlbTpub3QoW2RhdGEtYmlkc10pXCJcbiAgKT8uZGF0YXNldCBhcyB1bmtub3duIGFzIEJ1eU5vd1ByaWNlXG5cbiAgaWYgKCFzcmMgfHwgIW5hbWUpIHtcbiAgICBDb25zb2xlLndhcm4oXCJJbmNvbXBsZXRlIG1hcmtldCBlbnRyeVwiLCBsaSlcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5kYXRhc2V0LFxuICAgIGljb246IHRyaW1JY29uKHNyYyksXG4gICAgcmFyaXR5LFxuICAgIG5hbWUsXG4gICAgYWJzdHJhY3RUeXBlLFxuICAgIGJ1eU5vd1ByaWNlLFxuICAgIGN1cnJlbnRQcmljZSxcbiAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICB9XG59XG4iLCJpbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuXG5leHBvcnQgZnVuY3Rpb24gbWlncmF0ZSgpOiB2b2lkIHtcbiAgc3dpdGNoIChMb2NhbFN0b3JhZ2UudmVyc2lvbikge1xuICAgIGNhc2UgR00uaW5mby5zY3JpcHQudmVyc2lvbjpcbiAgICAgIHJldHVyblxuXG4gICAgY2FzZSBcIlwiOlxuICAgICAgaW5zdGFsbGVkKClcbiAgICAgIGJyZWFrXG5cbiAgICBkZWZhdWx0OlxuICAgICAgc3dpdGNoIChHTS5pbmZvLnNjcmlwdC52ZXJzaW9uKSB7XG4gICAgICAgIGNhc2UgXCIxLjIuMFwiOlxuICAgICAgICAgIHYxXzJfMCgpXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwiMS4yLjlcIjpcbiAgICAgICAgICB2MV8yXzkoKVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcIjEuMi4xMFwiOlxuICAgICAgICAgIHYxXzJfMTAoKVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcIjEuMi4xM1wiOlxuICAgICAgICAgIHYxXzJfMTMoKVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpbnN0YWxsZWQoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gIH1cblxuICBMb2NhbFN0b3JhZ2UudmVyc2lvbiA9IEdNLmluZm8uc2NyaXB0LnZlcnNpb25cbn1cblxuZnVuY3Rpb24gaW5zdGFsbGVkKCk6IHZvaWQge1xuICAkLmZsYXZyTm90aWYoYCR7bmFtZSgpfSAke3ZlcnNpb24oKX0gaW5zdGFsbGVkIWApXG59XG5cbmZ1bmN0aW9uIG5hbWUoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGA8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz5gXG59XG5cbmZ1bmN0aW9uIHZlcnNpb24oKTogc3RyaW5nIHtcbiAgcmV0dXJuIGB2PHN0cm9uZz4ke0dNLmluZm8uc2NyaXB0LnZlcnNpb259PC9zdHJvbmc+YFxufVxuXG5mdW5jdGlvbiB2MV8yXzAoKTogdm9pZCB7XG4gIExvY2FsU3RvcmFnZS5zYWxlcyA9IFtdXG4gICQuZmxhdnJOb3RpZihgVXBkYXRlZCB0byAke3ZlcnNpb24oKX0uIFlvdXIgc2FsZXMgaGlzdG9yeSB3YXMgZXJhc2VkLmApXG59XG5cbmZ1bmN0aW9uIHYxXzJfOSgpOiB2b2lkIHtcbiAgJC5mbGF2ck5vdGlmKFxuICAgIGBVcGRhdGVkIHRvICR7dmVyc2lvbigpfS4gVGhlIHdpc2hsaXN0IGhhcyBiZWVuIGltcHJvdmVkIHRvIHNvcnQgYnkgY2F0ZWdvcnkvdHlwZS9uYW1lLCBidXQgeW91ciB3aXNoZWQgaXRlbXMgZG8gbm90IGhhdmUgYSB0eXBlLiBZb3UgY2FuIGFkZCB0eXBlcyBieSByZS1hZGRpbmcgdGhlIGl0ZW1zIHZpYSB0aGUgbWFya2V0LmBcbiAgKVxufVxuXG5mdW5jdGlvbiB2MV8yXzEwKCk6IHZvaWQge1xuICAkLmZsYXZyTm90aWYoXG4gICAgYFVwZGF0ZWQgdG8gJHt2ZXJzaW9uKCl9LiBUaGUgd2lzaGxpc3QgaGFzIGJlZW4gaW1wcm92ZWQgdG8gc29ydCBieSBjYXRlZ29yeS90eXBlL3Jhcml0eS9uYW1lLCBidXQgeW91ciB3aXNoZWQgaXRlbXMgZG8gbm90IGhhdmUgYSByYXJpdHkuIFlvdSBjYW4gYWRkIHJhcml0aWVzIGJ5IHJlLWFkZGluZyB0aGUgaXRlbXMgdmlhIHRoZSBtYXJrZXQuYFxuICApXG59XG5cbmZ1bmN0aW9uIHYxXzJfMTMoKTogdm9pZCB7XG4gICQuZmxhdnJOb3RpZihcbiAgICBgVXBkYXRlZCB0byAke3ZlcnNpb24oKX0uIFRoZSBlbmhhbmNlZCBkcmVzc2luZyBleHBlcmllbmNlIHdhcyBkaXNhYmxlZC5gXG4gIClcbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHR5cGUgeyBHZXRQcml6ZXNEYXRhIH0gZnJvbSBcIi4uL2FwaS9nZXRfcHJpemVzX2RhdGFcIlxuaW1wb3J0IHR5cGUgeyBQYWNrZXQgfSBmcm9tIFwiLi4vYXBpL3BhY2tldFwiXG5pbXBvcnQgdHlwZSB7IFN0YXJ0R2FtZURhdGEgfSBmcm9tIFwiLi4vYXBpL3N0YXJ0X2dhbWVfZGF0YVwiXG5pbXBvcnQgXCIuLi9lbGRhcnlhL2pxdWVyeVwiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHsgZmxhcHB5IH0gZnJvbSBcIi4vZmxhcHB5XCJcbmltcG9ydCB7IGhhdGNobGluZ3MgfSBmcm9tIFwiLi9oYXRjaGxpbmdzXCJcbmltcG9ydCB0eXBlIHsgTWluaWdhbWUgfSBmcm9tIFwiLi9taW5pZ2FtZVwiXG5pbXBvcnQgeyBwZWdnbGUgfSBmcm9tIFwiLi9wZWdnbGVcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGxheVBlZ2dsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHBsYXkocGVnZ2xlKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGxheUZsYXBweSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHBsYXkoZmxhcHB5KVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGxheUhhdGNobGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBwbGF5KGhhdGNobGluZ3MpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBsYXkobWluaWdhbWU6IE1pbmlnYW1lKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIERpc2FibGUgYnV0dG9uc1xuICBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPihyZXNvbHZlID0+IHtcbiAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IGJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PihcbiAgICAgICAgXCIubWluaWdhbWVzLXJ1bGVzIC5mbGF2ci1idXR0b25cIlxuICAgICAgKVxuXG4gICAgICBpZiAoYnV0dG9ucy5sZW5ndGgpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbClcblxuICAgICAgICBmb3IgKGNvbnN0IGJ1dHRvbiBvZiBidXR0b25zKSB7XG4gICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJkaXNhYmxlZFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgfVxuICAgIH0sIDI1MClcbiAgfSlcblxuICBjb25zdCBqc29uID0gYXdhaXQgZXhlY3V0ZShtaW5pZ2FtZSlcblxuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvZmxhdnJfbm90aWYvaWNvbl9tZXNzYWdlLmh0bWxcIilcbiAgJC5mbGF2ck5vdGlmKFxuICAgIHRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAuLi5taW5pZ2FtZSxcbiAgICAgIG1lc3NhZ2U6IHRyYW5zbGF0ZS5taW5pZ2FtZXMucGxheWluZyhtaW5pZ2FtZS5uYW1lKSxcbiAgICB9KVxuICApXG5cbiAgY29uc3QgZ2FtZVRva2VuID0ganNvbi5kYXRhXG4gIGNvbnN0IHNjb3JlID0gcmFuZG9tSW50KG1pbmlnYW1lLnNjb3JlTWluLCBtaW5pZ2FtZS5zY29yZU1heClcbiAgY29uc3QgZW5jX3Rva2VuID0geG9yRW5jb2RlKGdhbWVUb2tlbiwgc2NvcmUudG9TdHJpbmcoKSlcbiAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PlxuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgcmFuZG9tSW50KG1pbmlnYW1lLmRlbGF5TWluLCBtaW5pZ2FtZS5kZWxheU1heCkpXG4gIClcblxuICBhd2FpdCBnZXRQcml6ZXMobWluaWdhbWUsIGdhbWVUb2tlbiwgc2NvcmUpXG4gIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCByYW5kb21JbnQoMTAwMCwgMzAwMCkpKVxuXG4gIGF3YWl0IHNlbmQoZW5jX3Rva2VuLCBzY29yZSwgbWluaWdhbWUubmFtZS50b0xvd2VyQ2FzZSgpKVxuICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgcmFuZG9tSW50KDEwMDAsIDMwMDApKSlcbn1cblxuZnVuY3Rpb24gcmFuZG9tSW50KG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkgKyBtaW4pXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGUobWluaWdhbWU6IE1pbmlnYW1lKTogUHJvbWlzZTxQYWNrZXQ8U3RhcnRHYW1lRGF0YT4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFBhY2tldDxTdGFydEdhbWVEYXRhPj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmICh0eXBlb2YgUmVjYXB0Y2hhICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBSZWNhcHRjaGEuZXhlY3V0ZShcbiAgICAgICAgYG1pbmlnYW1lU3RhcnQke21pbmlnYW1lLm5hbWV9YCxcbiAgICAgICAgKHRva2VuKTogdm9pZCA9PlxuICAgICAgICAgIHZvaWQgc3RhcnRHYW1lKG1pbmlnYW1lLCB0b2tlbikudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHZvaWQgc3RhcnRHYW1lKG1pbmlnYW1lKS50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdClcbiAgICB9XG4gIH0pXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0R2FtZShcbiAgbWluaWdhbWU6IE1pbmlnYW1lLFxuICByZWNhcHRjaGFUb2tlbj86IHN0cmluZ1xuKTogUHJvbWlzZTxQYWNrZXQ8U3RhcnRHYW1lRGF0YT4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFBhY2tldDxTdGFydEdhbWVEYXRhPj4oXG4gICAgKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICAgIHZvaWQgJC5hamF4KHtcbiAgICAgICAgdXJsOiBcIi9taW5pZ2FtZXMvYWpheF9zdGFydEdhbWVcIixcbiAgICAgICAgdHlwZTogXCJwb3N0XCIsXG4gICAgICAgIGRhdGFUeXBlOiBcImpzb25cIixcbiAgICAgICAgZGF0YTogcmVjYXB0Y2hhVG9rZW5cbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZ2FtZTogbWluaWdhbWUubmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICByZWNhcHRjaGFUb2tlbjogcmVjYXB0Y2hhVG9rZW4sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGdhbWU6IG1pbmlnYW1lLm5hbWUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3M6IChqc29uOiBQYWNrZXQ8U3RhcnRHYW1lRGF0YT4pOiB2b2lkID0+IHtcbiAgICAgICAgICByZXNvbHZlKGpzb24pXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgcmVqZWN0KClcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gIClcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UHJpemVzKFxuICBtaW5pZ2FtZTogTWluaWdhbWUsXG4gIGdhbWVUb2tlbjogc3RyaW5nLFxuICBzY29yZTogbnVtYmVyXG4pOiBQcm9taXNlPFBhY2tldDxHZXRQcml6ZXNEYXRhPj4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8UGFja2V0PEdldFByaXplc0RhdGE+PihcbiAgICAocmVzb2x2ZSk6IHZvaWQgPT5cbiAgICAgIHZvaWQgJC5wb3N0KFxuICAgICAgICBcIi9taW5pZ2FtZXMvYWpheF9nZXRQcml6ZXNcIixcbiAgICAgICAgeyBnYW1lOiBtaW5pZ2FtZS5uYW1lLnRvTG93ZXJDYXNlKCksIHNjb3JlOiBzY29yZSB9LFxuICAgICAgICAoanNvbjogUGFja2V0PEdldFByaXplc0RhdGE+KTogdm9pZCA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShqc29uKVxuXG4gICAgICAgICAgaWYgKGpzb24ucmVzdWx0ID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2ZsYXZyX25vdGlmL2ljb25fbWVzc2FnZS5odG1sXCIpXG5cbiAgICAgICAgICAgICQuZmxhdnJOb3RpZihcbiAgICAgICAgICAgICAgdGVtcGxhdGUucmVuZGVyKHtcbiAgICAgICAgICAgICAgICAuLi5taW5pZ2FtZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiB0cmFuc2xhdGUubWluaWdhbWVzLnBsYXllZF9mb3IoXG4gICAgICAgICAgICAgICAgICBtaW5pZ2FtZS5uYW1lLFxuICAgICAgICAgICAgICAgICAganNvbi5kYXRhLm1hYW5hXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9IGVsc2UgJC5mbGF2ck5vdGlmKGpzb24uZGF0YSlcbiAgICAgICAgfSxcbiAgICAgICAgXCJqc29uXCJcbiAgICAgICkuZmFpbCgoKSA9PlxuICAgICAgICBzZXRUaW1lb3V0KCgpOiB2b2lkID0+IHtcbiAgICAgICAgICByZXNvbHZlKGdldFByaXplcyhtaW5pZ2FtZSwgZ2FtZVRva2VuLCBzY29yZSkpXG4gICAgICAgIH0sIHJhbmRvbUludCgxMDAwLCAzMDAwKSlcbiAgICAgIClcbiAgKVxufVxuXG4vKipcbiAqIFPDqWN1cmlzYXRpb24gZGUgbCdlbnZvaSBkdSBzY29yZVxuICogQmFzw6kgc3VyIGwnZW5jb2RhZ2UgWE9SIDogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9YT1JfY2lwaGVyXG4gKiBFZmZlY3R1ZSB1biBYT1IgYml0IMOgIGJpdCBlbnRyZSB1bmUgY2hhaW5lIGV0IHVuZSBjbMOpXG4gKi9cbmZ1bmN0aW9uIHhvckVuY29kZShzdHI6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBBc3N1cmUgcXVlIGxlcyBkZXV4IHBhcmFtw6h0cmVzIHNvaWVudCBkZXMgY2hhaW5lcyBkZSBjYXJhY3TDqHJlXG4gIHN0ciA9IHN0ci50b1N0cmluZygpXG4gIGtleSA9IGtleS50b1N0cmluZygpXG5cbiAgLyoqIEVuY29kYWdlIFhPUiAqL1xuICBsZXQgeG9yID0gXCJcIlxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZvci1vZlxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGxldCB0bXAgPSBzdHJbaV1cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGtleS5sZW5ndGg7ICsraikge1xuICAgICAgdG1wID0gU3RyaW5nLmZyb21DaGFyQ29kZSh0bXAhLmNoYXJDb2RlQXQoMCkgXiBrZXkuY2hhckNvZGVBdChqKSlcbiAgICB9XG4gICAgeG9yICs9IHRtcFxuICB9XG5cbiAgLy8gUmVudm9pZSBsZSByw6lzdWx0YXQgZW4gZW5jb2RhbnQgbGVzIGNhcmFjdMOocmVzIHNww6ljaWF1eCBwb3V2YW50IHBvc2VyIHByb2Jsw6htZSAoXFxuIHBhciBleGVtcGxlKVxuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHhvcilcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VuZChcbiAgZW5jX3Rva2VuOiBzdHJpbmcsXG4gIHNjb3JlOiBudW1iZXIsXG4gIGdhbWU6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBpZiAodHlwZW9mIFJlY2FwdGNoYSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgUmVjYXB0Y2hhLmV4ZWN1dGUoXG4gICAgICAgIFwibWluaWdhbWVTYXZlXCIgKyBnYW1lLFxuICAgICAgICAocmVjYXB0Y2hhVG9rZW4pOiB2b2lkID0+XG4gICAgICAgICAgdm9pZCBzYXZlU2NvcmUoZW5jX3Rva2VuLCBzY29yZSwgZ2FtZSwgcmVjYXB0Y2hhVG9rZW4pLnRoZW4ocmVzb2x2ZSlcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdm9pZCBzYXZlU2NvcmUoZW5jX3Rva2VuLCBzY29yZSwgZ2FtZSkudGhlbihyZXNvbHZlKVxuICAgIH1cbiAgfSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVNjb3JlKFxuICBlbmNfdG9rZW46IHN0cmluZyxcbiAgc2NvcmU6IG51bWJlcixcbiAgZ2FtZTogc3RyaW5nLFxuICByZWNhcHRjaGFUb2tlbj86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBjb25zdCB0b2tlbiA9IGRlY29kZVVSSUNvbXBvbmVudChlbmNfdG9rZW4pXG5cbiAgICB2b2lkICQuYWpheCh7XG4gICAgICB0eXBlOiBcInBvc3RcIixcbiAgICAgIHVybDogXCIvbWluaWdhbWVzL2FqYXhfc2F2ZVNjb3JlXCIsXG4gICAgICBkYXRhOiByZWNhcHRjaGFUb2tlblxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgICAgIHNjb3JlOiBzY29yZSxcbiAgICAgICAgICAgIGdhbWU6IGdhbWUsXG4gICAgICAgICAgICByZWNhcHRjaGFUb2tlbjogcmVjYXB0Y2hhVG9rZW4sXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgICAgIHNjb3JlOiBzY29yZSxcbiAgICAgICAgICAgIGdhbWU6IGdhbWUsXG4gICAgICAgICAgfSxcbiAgICAgIHN1Y2Nlc3M6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+XG4gICAgICAgIHNldFRpbWVvdXQoKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIHJlc29sdmUoc2F2ZVNjb3JlKGVuY190b2tlbiwgc2NvcmUsIGdhbWUpKVxuICAgICAgICB9LCByYW5kb21JbnQoMTAwMCwgMzAwMCkpLFxuICAgIH0pXG4gIH0pXG59XG4iLCJpbXBvcnQgdHlwZSB7IE1pbmlnYW1lIH0gZnJvbSBcIi4vbWluaWdhbWVcIlxuXG5leHBvcnQgY29uc3QgZmxhcHB5OiBNaW5pZ2FtZSA9IHtcbiAgbmFtZTogXCJGbGFwcHlcIixcbiAgc2NvcmVNaW46IDE4MCxcbiAgc2NvcmVNYXg6IDIwMCxcbiAgZGVsYXlNaW46IDYwXzAwMCxcbiAgZGVsYXlNYXg6IDcwXzAwMCxcbiAgYnV0dG9uU2VsZWN0b3I6ICcubWluaWdhbWUtc3RhcnQgW2hyZWY9XCIvbWluaWdhbWVzL2J1YmJsdGVtcGxlXCJdIC5ubC1idXR0b24nLFxuICBpY29uOiBcIi9zdGF0aWMvaW1nL25ldy1sYXlvdXQvbWluaWdhbWVzL2ljb25fYnViYmxldGVtcGxlLnBuZ1wiLFxufVxuIiwiaW1wb3J0IHR5cGUgeyBNaW5pZ2FtZSB9IGZyb20gXCIuL21pbmlnYW1lXCJcblxuZXhwb3J0IGNvbnN0IGhhdGNobGluZ3M6IE1pbmlnYW1lID0ge1xuICBuYW1lOiBcIkhhdGNobGluZ3NcIixcbiAgc2NvcmVNaW46IDE4LFxuICBzY29yZU1heDogMjAsXG4gIGRlbGF5TWluOiAzMF8wMDAsXG4gIGRlbGF5TWF4OiAzMF8wMDAsXG4gIGJ1dHRvblNlbGVjdG9yOiAnLm1pbmlnYW1lLXN0YXJ0IFtocmVmPVwiL21pbmlnYW1lcy9jb2Nvb25pbnBpY2tcIl0gLm5sLWJ1dHRvbicsXG4gIGljb246IFwiL3N0YXRpYy9pbWcvbmV3LWxheW91dC9taW5pZ2FtZXMvaWNvbl9jb2NvbmlucGljay5wbmdcIixcbn1cbiIsImltcG9ydCB0eXBlIHsgTWluaWdhbWUgfSBmcm9tIFwiLi9taW5pZ2FtZVwiXG5cbmV4cG9ydCBjb25zdCBwZWdnbGU6IE1pbmlnYW1lID0ge1xuICBuYW1lOiBcIlBlZ2dsZVwiLFxuICBzY29yZU1pbjogOSxcbiAgc2NvcmVNYXg6IDEwLFxuICBkZWxheU1pbjogMTBfMDAwLFxuICBkZWxheU1heDogMjBfMDAwLFxuICBidXR0b25TZWxlY3RvcjogJy5taW5pZ2FtZS1zdGFydCBbaHJlZj1cIi9taW5pZ2FtZXMvZ2VtYm9tYlwiXSAubmwtYnV0dG9uJyxcbiAgaWNvbjogXCIvc3RhdGljL2ltZy9uZXctbGF5b3V0L21pbmlnYW1lcy9pY29uX2dlbWJvbWIucG5nXCIsXG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhcnNhYmxlSXRlbSB9IGZyb20gXCIuL2FwcGVhcmFuY2UvaW50ZXJmYWNlcy9wYXJzYWJsZV9pdGVtXCJcbmltcG9ydCB0eXBlIHsgQXZhdGFyIH0gZnJvbSBcIi4vZWxkYXJ5YS9hdmF0YXJcIlxuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0T3V0Zml0KHNlbGVjdG9yOiBzdHJpbmcsIG5hbWUgPSBcIm91dGZpdFwiKTogdm9pZCB7XG4gIGNvbnN0IGF2YXRhciA9IFNhY2hhLkF2YXRhci5hdmF0YXJzW3NlbGVjdG9yXVxuICBpZiAoIWF2YXRhcikgcmV0dXJuXG5cbiAgY29uc3Qgb3V0Zml0ID0gcGFyc2VBdmF0YXIoYXZhdGFyKVxuXG4gIGNvbnN0IGhyZWYgPVxuICAgIFwiZGF0YTp0ZXh0L2pzb247Y2hhcnNldD11dGYtOCxcIiArXG4gICAgZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KG91dGZpdCwgdW5kZWZpbmVkLCAyKSlcblxuICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIilcbiAgYS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGhyZWYpXG4gIGEuc2V0QXR0cmlidXRlKFwiZG93bmxvYWRcIiwgYCR7bmFtZX0uanNvbmApXG4gIGEuY2xpY2soKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBdmF0YXIoYXZhdGFyOiBBdmF0YXIpOiBQYXJzYWJsZUl0ZW1bXSB7XG4gIHJldHVybiBhdmF0YXIuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICBjb25zdCBpdGVtID0gY2hpbGQuZ2V0SXRlbSgpXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBpdGVtLl9pZCxcbiAgICAgIGdyb3VwOiBpdGVtLl9ncm91cCxcbiAgICAgIG5hbWU6IGl0ZW0uX25hbWUsXG4gICAgICBpbWFnZTogaXRlbS5faW1hZ2UsXG4gICAgICB0eXBlOiBpdGVtLl90eXBlLFxuICAgICAgY2F0ZWdvcnlJZDogaXRlbS5fY2F0ZWdvcnlJZCxcbiAgICAgIGhpZGRlbkNhdGVnb3JpZXM6IE9iamVjdC52YWx1ZXMoaXRlbS5faGlkZGVuQ2F0ZWdvcmllcyksXG4gICAgICBhbmltYXRpb25EYXRhOiBpdGVtLl9hbmltYXRpb25EYXRhLFxuICAgICAgbG9ja2VkOiBpdGVtLl9sb2NrZWQsXG4gICAgfVxuICB9KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyBDb25zb2xlIH0gZnJvbSBcIi4uL2NvbnNvbGVcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuaW1wb3J0IHsgbGlzdGVuVHJlYXN1cmVIdW50IH0gZnJvbSBcIi4vZXhwbG9yYXRpb24td2F0Y2hlclwiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRXhwbG9yYXRpb25IaXN0b3J5KCk6IHZvaWQge1xuICBsb2FkSGlzdG9yeUJ1dHRvbigpXG4gIGxpc3RlblRyZWFzdXJlSHVudCgpXG59XG5cbmZ1bmN0aW9uIGxvYWRIaXN0b3J5QnV0dG9uKCk6IHZvaWQge1xuICBjb25zdCBoaXN0b3J5QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIilcbiAgaGlzdG9yeUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibmwtYnV0dG9uXCIsIFwibmwtYnV0dG9uLWJhY2tcIilcbiAgaGlzdG9yeUJ1dHRvbi5zdHlsZS5tYXJnaW5SaWdodCA9IFwiMC42ZW1cIlxuICBoaXN0b3J5QnV0dG9uLnRleHRDb250ZW50ID0gdHJhbnNsYXRlLnBldC5oaXN0b3J5XG4gIGhpc3RvcnlCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIG9uQ2xpY2tIaXN0b3J5KVxuXG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKFwiZWUtYnV0dG9ucy1yb3dcIilcbiAgICA/Lmluc2VydEFkamFjZW50RWxlbWVudChcImJlZm9yZWVuZFwiLCBoaXN0b3J5QnV0dG9uKVxufVxuXG5mdW5jdGlvbiBvbkNsaWNrSGlzdG9yeSgpOiB2b2lkIHtcbiAgaGlkZVBldCgpXG4gIGhpZGVFeHBsb3JhdGlvbigpXG4gIG1ha2VIaXN0b3J5KClcbiAgc2hvd0hpc3RvcnkoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb25DbGlja1BldCgpOiB2b2lkIHtcbiAgaGlkZUhpc3RvcnkoKVxuICBzaG93UGV0KClcbn1cblxuZnVuY3Rpb24gaGlkZVBldCgpOiB2b2lkIHtcbiAgY29uc3QgbmFtZUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibmFtZS1jb250YWluZXJcIilcbiAgY29uc3QgaW5mb0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaW5mb3MtY29udGFpbmVyXCIpXG4gIGNvbnN0IHBldEltYWdlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwZXQtaW1hZ2UtY29udGFpbmVyXCIpXG5cbiAgaWYgKCFuYW1lQ29udGFpbmVyIHx8ICFpbmZvQ29udGFpbmVyIHx8ICFwZXRJbWFnZUNvbnRhaW5lcilcbiAgICByZXR1cm4gQ29uc29sZS5lcnJvcihcIlRoZSBwZXQgZGlzcGxheSB3YXMgZGFtYWdlZC5cIiwge1xuICAgICAgbmFtZUNvbnRhaW5lcixcbiAgICAgIGluZm9Db250YWluZXIsXG4gICAgICBwZXRJbWFnZUNvbnRhaW5lcixcbiAgICB9KVxuXG4gIG5hbWVDb250YWluZXIuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiXG4gIGluZm9Db250YWluZXIuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiXG4gIHBldEltYWdlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxufVxuXG5mdW5jdGlvbiBzaG93UGV0KCk6IHZvaWQge1xuICBjb25zdCBuYW1lQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJuYW1lLWNvbnRhaW5lclwiKVxuICBjb25zdCBpbmZvQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpbmZvcy1jb250YWluZXJcIilcbiAgY29uc3QgcGV0SW1hZ2VDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInBldC1pbWFnZS1jb250YWluZXJcIilcblxuICBpZiAoIW5hbWVDb250YWluZXIgfHwgIWluZm9Db250YWluZXIgfHwgIXBldEltYWdlQ29udGFpbmVyKVxuICAgIHJldHVybiBDb25zb2xlLmVycm9yKFwiVGhlIHBldCBkaXNwbGF5IHdhcyBkYW1hZ2VkLlwiLCB7XG4gICAgICBuYW1lQ29udGFpbmVyLFxuICAgICAgaW5mb0NvbnRhaW5lcixcbiAgICAgIHBldEltYWdlQ29udGFpbmVyLFxuICAgIH0pXG5cbiAgbmFtZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJcIlxuICBpbmZvQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIlwiXG4gIHBldEltYWdlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIlwiXG59XG5cbmZ1bmN0aW9uIHNob3dIaXN0b3J5KCk6IHZvaWQge1xuICBjb25zdCBoaXN0b3J5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoaXN0b3J5LWNvbnRhaW5lclwiKVxuICBpZiAoIWhpc3RvcnkpIHJldHVyblxuICBoaXN0b3J5LnN0eWxlLmRpc3BsYXkgPSBcIlwiXG59XG5cbmZ1bmN0aW9uIGhpZGVIaXN0b3J5KCk6IHZvaWQge1xuICBjb25zdCBoaXN0b3J5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoaXN0b3J5LWNvbnRhaW5lclwiKVxuICBpZiAoIWhpc3RvcnkpIHJldHVyblxuICBoaXN0b3J5LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxufVxuXG5mdW5jdGlvbiBoaWRlRXhwbG9yYXRpb24oKTogdm9pZCB7XG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKFwibWFpbi1zZWN0aW9uXCIpXG4gICAgPy5jbGFzc0xpc3QucmVtb3ZlKFwidHJlYXN1cmUtaHVudC1pbnRlcmZhY2Utb3BlblwiKVxufVxuXG5mdW5jdGlvbiBtYWtlSGlzdG9yeSgpOiB2b2lkIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoaXN0b3J5LWNvbnRhaW5lclwiKT8ucmVtb3ZlKClcbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2V4cGxvcmF0aW9uX2hpc3RvcnkuaHRtbFwiKVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibGVmdC1jb250YWluZXJcIik/Lmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIHRlbXBsYXRlLnJlbmRlcih7XG4gICAgICB0cmFuc2xhdGUsXG4gICAgICBoaXN0b3J5OiBMb2NhbFN0b3JhZ2UuZXhwbG9yYXRpb25IaXN0b3J5Lm1hcChoaXN0b3J5ID0+ICh7XG4gICAgICAgIC4uLmhpc3RvcnksXG4gICAgICAgIGRhdGU6IHRyYW5zbGF0ZS5wZXQuZGF0ZV90aW1lX2Zvcm1hdC5mb3JtYXQobmV3IERhdGUoaGlzdG9yeS5kYXRlKSksXG4gICAgICAgIHdlYl9oZDogaGlzdG9yeS5pY29uICYmIHRvV2ViSGQoaGlzdG9yeS5pY29uKSxcbiAgICAgIH0pKSxcbiAgICB9KVxuICApXG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJkZWxldGUtaGlzdG9yeVwiKT8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICBMb2NhbFN0b3JhZ2UuZXhwbG9yYXRpb25IaXN0b3J5ID0gW11cbiAgICBtYWtlSGlzdG9yeSgpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHRvV2ViSGQoaWNvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGljb24ucmVwbGFjZShcImljb25cIiwgXCJ3ZWJfaGRcIilcbn1cbiIsImltcG9ydCB7IENvbnNvbGUgfSBmcm9tIFwiLi4vY29uc29sZVwiXG5pbXBvcnQgeyB0cmltSWNvbiB9IGZyb20gXCIuLi9lbGRhcnlhX3V0aWxcIlxuaW1wb3J0IHR5cGUgeyBFeHBsb3JhdGlvblJlc3VsdCB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2V4cGxvcmF0aW9uX3Jlc3VsdFwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlblRyZWFzdXJlSHVudCgpOiB2b2lkIHtcbiAgY29uc3QgcmVzdWx0T3ZlcmxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjdHJlYXN1cmUtaHVudC1yZXN1bHQtb3ZlcmxheVwiKVxuICBpZiAoIXJlc3VsdE92ZXJsYXkpXG4gICAgcmV0dXJuIENvbnNvbGUuZXJyb3IoXCJUaGVyZSBpcyBubyByZXN1bHQgb3ZlcmxheS5cIiwgcmVzdWx0T3ZlcmxheSlcblxuICBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgQ29uc29sZS5sb2coXCJNdXRhdGlvbiBpblwiLCByZXN1bHRPdmVybGF5KVxuICAgIGlmICghcmVzdWx0T3ZlcmxheS5jbGFzc0xpc3QuY29udGFpbnMoXCJhY3RpdmVcIikpIHJldHVyblxuXG4gICAgY29uc3QgcmVzdWx0cyA9IGdldFJlc3VsdHMoKVxuICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG4gICAgQ29uc29sZS5sb2coXCJSZXN1bHRzOlwiLCByZXN1bHRzKVxuXG4gICAgTG9jYWxTdG9yYWdlLmV4cGxvcmF0aW9uSGlzdG9yeSA9IFtcbiAgICAgIC4uLnJlc3VsdHMsXG4gICAgICAuLi5Mb2NhbFN0b3JhZ2UuZXhwbG9yYXRpb25IaXN0b3J5LFxuICAgIF1cbiAgfSkub2JzZXJ2ZShyZXN1bHRPdmVybGF5LCB7XG4gICAgYXR0cmlidXRlRmlsdGVyOiBbXCJjbGFzc1wiXSxcbiAgfSlcbn1cblxuZnVuY3Rpb24gZ2V0UmVzdWx0cygpOiBFeHBsb3JhdGlvblJlc3VsdFtdIHtcbiAgY29uc3QgbG9jYXRpb25OYW1lID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIiN0aC1hZ2FpbiBzdHJvbmdcIilcbiAgICA/LnRleHRDb250ZW50Py50cmltKClcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuXG4gIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGgtcmVzdWx0XCIpKS5tYXAocmVzdWx0ID0+IHtcbiAgICBjb25zdCBpbWcgPSByZXN1bHQucXVlcnlTZWxlY3RvcjxIVE1MSW1hZ2VFbGVtZW50PihcImltZy50aC1yZXN1bHQtaW1nXCIpXG5cbiAgICByZXR1cm4ge1xuICAgICAgY291bnQ6IHJlc3VsdC5xdWVyeVNlbGVjdG9yKFwiLnJlc291cmNlLWNvdW50XCIpPy50ZXh0Q29udGVudD8udHJpbSgpLFxuICAgICAgZGF0ZTogbm93LFxuICAgICAgaWNvbjogaW1nID8gdHJpbUljb24oaW1nLnNyYykgOiB1bmRlZmluZWQsXG4gICAgICBsb2NhdGlvbk5hbWUsXG4gICAgICBuYW1lOiByZXN1bHQucXVlcnlTZWxlY3RvcihcIi50b29sdGlwLWNvbnRlbnQgaDNcIik/LnRleHRDb250ZW50Py50cmltKCksXG4gICAgICB0cmFkYWJsZTogQm9vbGVhbihyZXN1bHQucXVlcnlTZWxlY3RvcihcIi50cmFkYWJsZVwiKSksXG4gICAgfVxuICB9KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyBjaGFuZ2VSZWdpb24gfSBmcm9tIFwiLi4vYWpheC9jaGFuZ2VfcmVnaW9uXCJcbmltcG9ydCB7IFJlc3VsdCB9IGZyb20gXCIuLi9hcGkvcmVzdWx0LmVudW1cIlxuaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi9jb25zb2xlXCJcbmltcG9ydCB0eXBlIHsgTWFwUmVnaW9uIH0gZnJvbSBcIi4uL2VsZGFyeWEvY3VycmVudF9yZWdpb25cIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB0eXBlIHsgQXV0b0V4cGxvcmVMb2NhdGlvbiB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2F1dG9fZXhwbG9yZV9sb2NhdGlvblwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB0eXBlIHsgQXV0b0V4cGxvcmVCdXR0b24gfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvYXV0b19leHBsb3JlX2J1dHRvblwiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTWFya2VycygpOiB2b2lkIHtcbiAgY29uc3QgYXV0b0V4cGxvcmVMb2NhdGlvbnMgPSBMb2NhbFN0b3JhZ2UuYXV0b0V4cGxvcmVMb2NhdGlvbnNcblxuICBmb3IgKGNvbnN0IGRpdiBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxEaXZFbGVtZW50PihcbiAgICBcIi5tYXAtbG9jYXRpb25bZGF0YS1pZF1cIlxuICApKSB7XG4gICAgY29uc3QgbG9jYXRpb25JZCA9IE51bWJlcihkaXYuZ2V0QXR0cmlidXRlKFwiZGF0YS1pZFwiKSlcbiAgICBpZiAoIWxvY2F0aW9uSWQpIGNvbnRpbnVlXG5cbiAgICBsb2FkUGljdG9NYXAoYXV0b0V4cGxvcmVMb2NhdGlvbnMsIGRpdilcblxuICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT5cbiAgICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKFxuICAgICAgICAoXzogTXV0YXRpb25SZWNvcmRbXSwgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXIpOiB2b2lkID0+IHtcbiAgICAgICAgICBhZGRBdXRvRXhwbG9yZUJ1dHRvbihsb2NhdGlvbklkLCBvYnNlcnZlcilcbiAgICAgICAgfVxuICAgICAgKS5vYnNlcnZlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFwLWxvY2F0aW9uLXByZXZpZXdcIikgYXMgTm9kZSwge1xuICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgfSlcbiAgICApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZE1hcmtlcnMoKTogdm9pZCB7XG4gIGNvbnN0IGF1dG9FeHBsb3JlTG9jYXRpb25zID0gTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zXG5cbiAgZm9yIChjb25zdCBkaXYgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRGl2RWxlbWVudD4oXG4gICAgXCIubWFwLWxvY2F0aW9uW2RhdGEtaWRdXCJcbiAgKSkge1xuICAgIGNvbnN0IGxvY2F0aW9uSWQgPSBOdW1iZXIoZGl2LmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIikpXG4gICAgaWYgKCFsb2NhdGlvbklkKSBjb250aW51ZVxuXG4gICAgbG9hZFBpY3RvTWFwKGF1dG9FeHBsb3JlTG9jYXRpb25zLCBkaXYpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkQXV0b0V4cGxvcmVCdXR0b24oXG4gIGxvY2F0aW9uSWQ6IG51bWJlcixcbiAgb2JzZXJ2ZXI/OiBNdXRhdGlvbk9ic2VydmVyXG4pOiB2b2lkIHtcbiAgY29uc3QgYnV0dG9uc0NvbnRhaW5lciA9XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIjYnV0dG9ucy1jb250YWluZXJcIilcbiAgaWYgKCFidXR0b25zQ29udGFpbmVyKSByZXR1cm5cbiAgb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKVxuXG4gIC8vIFBhcmFtZXRlcnMgdG8gYmUgaW5qZWN0ZWQgaW50byB0aGUgdGVtcGxhdGVcbiAgY29uc3QgY29udGV4dDogQXV0b0V4cGxvcmVCdXR0b24gPSB7XG4gICAgbG9jYXRpb25JZCxcbiAgICBhY3RpdmU6IExvY2FsU3RvcmFnZS5hdXRvRXhwbG9yZUxvY2F0aW9ucy5zb21lKFxuICAgICAgc2F2ZWQgPT4gc2F2ZWQubG9jYXRpb24uaWQgPT09IGxvY2F0aW9uSWRcbiAgICApLFxuICAgIHJlZ2lvbklkOiBOdW1iZXIoXG4gICAgICBkb2N1bWVudFxuICAgICAgICAucXVlcnlTZWxlY3RvcihcIi5taW5pbWFwLmN1cnJlbnRbZGF0YS1tYXBpZF1cIilcbiAgICAgICAgPy5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1hcGlkXCIpXG4gICAgKSxcbiAgfVxuXG4gIC8vIEFkZCB0aGUgYXV0byBleHBsb3JlIGJ1dHRvblxuICBidXR0b25zQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCIjYXV0by1leHBsb3JlLWJ1dHRvblwiKT8ucmVtb3ZlKClcbiAgY29uc3QgYXV0b0V4cGxvcmVUZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvYXV0b19leHBsb3JlX2J1dHRvbi5odG1sXCIpXG4gIGJ1dHRvbnNDb250YWluZXIuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgYXV0b0V4cGxvcmVUZW1wbGF0ZS5yZW5kZXIoeyAuLi5jb250ZXh0LCB0cmFuc2xhdGUgfSlcbiAgKVxuXG4gIC8vIEJpbmQgYGF1dG9FeHBsb3JlYCBhbmQgYGxvYWRQaWN0b01hcHNgXG4gIGJ1dHRvbnNDb250YWluZXJcbiAgICAucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oXCIjYXV0by1leHBsb3JlLWJ1dHRvblwiKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIENvbnNvbGUuZGVidWcoXCJDbGlja2VkIG9uICNhdXRvLWV4cGxvcmUtYnV0dG9uLlwiLCBjb250ZXh0KVxuICAgICAgdm9pZCBtYXJrTG9jYXRpb24oY29udGV4dCkudGhlbihsb2FkUGljdG9NYXBzKVxuICAgIH0pXG5cbiAgdm9pZCBkaXNhYmxlRXhwbG9yZShjb250ZXh0KVxufVxuXG5hc3luYyBmdW5jdGlvbiBkaXNhYmxlRXhwbG9yZShjb250ZXh0OiBBdXRvRXhwbG9yZUJ1dHRvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBlbnRyeSA9IGF3YWl0IGdldEF1dG9FeHBsb3JlRW50cnkoY29udGV4dC5yZWdpb25JZCwgY29udGV4dC5sb2NhdGlvbklkKVxuICBpZiAoIWVudHJ5KSByZXR1cm5cblxuICBpZiAocGV0RW5lcmd5IDwgTnVtYmVyKGVudHJ5LmxvY2F0aW9uLmVuZXJneVJlcXVpcmVkKSlcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImV4cGxvcmUtYnV0dG9uXCIpPy5jbGFzc0xpc3QuYWRkKFwiZGlzYWJsZWRcIilcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFya0xvY2F0aW9uKGNvbnRleHQ6IEF1dG9FeHBsb3JlQnV0dG9uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjb250ZXh0LmFjdGl2ZSkge1xuICAgIGNvbnN0IGZpbHRlcmVkTG9jYXRpb25zID0gTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zLmZpbHRlcihcbiAgICAgIHNhdmVkID0+IHNhdmVkLmxvY2F0aW9uLmlkICE9PSBjb250ZXh0LmxvY2F0aW9uSWRcbiAgICApXG4gICAgTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zID0gZmlsdGVyZWRMb2NhdGlvbnNcbiAgICBhZGRBdXRvRXhwbG9yZUJ1dHRvbihjb250ZXh0LmxvY2F0aW9uSWQpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBuZXdBdXRvRXhwbG9yZSA9IGF3YWl0IGdldEF1dG9FeHBsb3JlRW50cnkoXG4gICAgY29udGV4dC5yZWdpb25JZCxcbiAgICBjb250ZXh0LmxvY2F0aW9uSWRcbiAgKVxuICBpZiAoIW5ld0F1dG9FeHBsb3JlKSB7XG4gICAgQ29uc29sZS5lcnJvcihcbiAgICAgIGBDb3VsZCBub3QgZ2VuZXJhdGUgYW4gYXV0byBleHBsb3JlIGVudHJ5IGZvciBsb2NhdGlvbiAjJHtjb250ZXh0LmxvY2F0aW9uSWR9LmAsXG4gICAgICBjb250ZXh0XG4gICAgKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbmV3TG9jYXRpb25zID0gTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zXG4gIG5ld0xvY2F0aW9ucy5wdXNoKG5ld0F1dG9FeHBsb3JlKVxuICBMb2NhbFN0b3JhZ2UuYXV0b0V4cGxvcmVMb2NhdGlvbnMgPSBuZXdMb2NhdGlvbnNcbiAgYWRkQXV0b0V4cGxvcmVCdXR0b24oY29udGV4dC5sb2NhdGlvbklkKVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBdXRvRXhwbG9yZUVudHJ5KFxuICByZWdpb25JZDogbnVtYmVyLFxuICBsb2NhdGlvbklkOiBudW1iZXJcbik6IFByb21pc2U8QXV0b0V4cGxvcmVMb2NhdGlvbiB8IG51bGw+IHtcbiAgY29uc3QgcmVnaW9uID0gYXdhaXQgZ2V0UmVnaW9uKHJlZ2lvbklkKVxuICBpZiAoIXJlZ2lvbikge1xuICAgIENvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCBnZXQgcmVnaW9uICMke3JlZ2lvbklkfS5gKVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBsb2NhdGlvbiA9IHJlZ2lvbi5sb2NhdGlvbnMuZmluZChsb2NhdGlvbiA9PiBsb2NhdGlvbi5pZCA9PT0gbG9jYXRpb25JZClcbiAgaWYgKCFsb2NhdGlvbikge1xuICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICBgQ291bGQgbm90IGdldCBsb2NhdGlvbiAjJHtsb2NhdGlvbklkfSBpbiAke3JlZ2lvbi5uYW1lfS5gLFxuICAgICAgcmVnaW9uXG4gICAgKVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxvY2F0aW9uLFxuICAgIHJlZ2lvbixcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVnaW9uKGlkOiBudW1iZXIpOiBQcm9taXNlPE1hcFJlZ2lvbiB8IG51bGw+IHtcbiAgaWYgKGlkLnRvU3RyaW5nKCkgPT09IGN1cnJlbnRSZWdpb24uaWQpIHJldHVybiBjdXJyZW50UmVnaW9uXG5cbiAgY29uc3QganNvbiA9IGF3YWl0IGNoYW5nZVJlZ2lvbihpZClcbiAgaWYgKGpzb24ucmVzdWx0ID09PSBSZXN1bHQuc3VjY2VzcykgcmV0dXJuIGpzb24uZGF0YS5jdXJyZW50UmVnaW9uXG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gbG9hZFBpY3RvTWFwcygpOiB2b2lkIHtcbiAgY29uc3QgYXV0b0V4cGxvcmVMb2NhdGlvbnMgPSBMb2NhbFN0b3JhZ2UuYXV0b0V4cGxvcmVMb2NhdGlvbnNcbiAgZm9yIChjb25zdCBkaXYgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRGl2RWxlbWVudD4oXG4gICAgXCIubWFwLWxvY2F0aW9uW2RhdGEtaWRdXCJcbiAgKSkge1xuICAgIGxvYWRQaWN0b01hcChhdXRvRXhwbG9yZUxvY2F0aW9ucywgZGl2KVxuICB9XG59XG5cbmZ1bmN0aW9uIGxvYWRQaWN0b01hcChcbiAgYXV0b0V4cGxvcmVMb2NhdGlvbnM6IEF1dG9FeHBsb3JlTG9jYXRpb25bXSxcbiAgZGl2OiBIVE1MRGl2RWxlbWVudFxuKTogdm9pZCB7XG4gIGNvbnN0IG1hcExvY2F0aW9uID0gZGl2LmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIilcbiAgaWYgKCFtYXBMb2NhdGlvbikgcmV0dXJuXG5cbiAgZGl2LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGF1dG9FeHBsb3JlTG9jYXRpb25zLnNvbWUoXG4gICAgc2F2ZWQgPT4gc2F2ZWQubG9jYXRpb24uaWQgPT09IE51bWJlcihtYXBMb2NhdGlvbilcbiAgKVxuICAgID8gXCJ1cmwoL3N0YXRpYy9pbWcvbmV3LWxheW91dC9wZXQvaWNvbnMvcGljdG9fbWFwX2V4cGxvLnBuZylcIlxuICAgIDogXCJ1cmwoL3N0YXRpYy9pbWcvbmV3LWxheW91dC9wZXQvaWNvbnMvcGljdG9fbWFwLnBuZylcIlxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBNYXBMb2NhdGlvbkRhdGFzZXQge1xuICBpZDogbnVtYmVyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXBMb2NhdGlvbkRhdGFzZXQoZGl2OiBIVE1MRGl2RWxlbWVudCk6IE1hcExvY2F0aW9uRGF0YXNldCB7XG4gIGNvbnN0IGRhdGFzZXQgPSBkaXYuZGF0YXNldFxuICByZXR1cm4ge1xuICAgIGlkOiBOdW1iZXIoZGF0YXNldC5pZCksXG4gIH1cbn1cbiIsImltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5cbmludGVyZmFjZSBNYXJrQ29udGV4dCB7XG4gIHNyYzogc3RyaW5nXG4gIHRleHRDb250ZW50OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IG1hcmtBbGxDb250ZXh0OiBNYXJrQ29udGV4dCA9IHtcbiAgc3JjOiBcImh0dHBzOi8vZ2l0bGFiLmNvbS9OYXRvQm9yYW0vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLS9yYXcvbWFzdGVyL2ltYWdlcy9waWN0b19tYXBfZXhwbG8ucG5nXCIsXG4gIHRleHRDb250ZW50OiB0cmFuc2xhdGUucGV0Lm1hcmtfYWxsLFxufVxuXG5leHBvcnQgY29uc3QgdW5tYXJrQWxsQ29udGV4dDogTWFya0NvbnRleHQgPSB7XG4gIHNyYzogXCJodHRwczovL2dpdGxhYi5jb20vTmF0b0JvcmFtL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy0vcmF3L21hc3Rlci9pbWFnZXMvcGljdG9fbWFwLnBuZ1wiLFxuICB0ZXh0Q29udGVudDogdHJhbnNsYXRlLnBldC51bm1hcmtfYWxsLFxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyBDb25zb2xlIH0gZnJvbSBcIi4uL2NvbnNvbGVcIlxuaW1wb3J0IHR5cGUgeyBNYXBSZWdpb24gfSBmcm9tIFwiLi4vZWxkYXJ5YS9jdXJyZW50X3JlZ2lvblwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB7IGdldFJlZ2lvbiwgcmVsb2FkTWFya2VycyB9IGZyb20gXCIuL2V4cGxvcmF0aW9uXCJcbmltcG9ydCB7IGdldE1hcExvY2F0aW9uRGF0YXNldCB9IGZyb20gXCIuL21hcF9sb2NhdGlvbl9kYXRhc2V0XCJcbmltcG9ydCB7IG1hcmtBbGxDb250ZXh0LCB1bm1hcmtBbGxDb250ZXh0IH0gZnJvbSBcIi4vbWFya19jb250ZXh0XCJcbmltcG9ydCB7IGdldE1pbmltYXBEYXRhc2V0IH0gZnJvbSBcIi4vbWluaW1hcF9kYXRhc2V0XCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRNYXNzTWFyaygpOiB2b2lkIHtcbiAgdm9pZCBzZXR1cE1hc3NNYXJrQnV0dG9uKClcbiAgaGFuZGxlQ2xpY2tNaW5pbWFwcygpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTWFzc01hcmtCdXR0b24oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFzcy1tYXJrXCIpPy5yZW1vdmUoKVxuXG4gIGNvbnN0IG1hcmtlZCA9IGhhc1NvbWVNYXJrZWQoKVxuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvbWFzc19tYXJrX2J1dHRvbi5odG1sXCIpXG4gIGNvbnN0IHJlbmRlcmVkID0gdGVtcGxhdGUucmVuZGVyKG1hcmtlZCA/IHVubWFya0FsbENvbnRleHQgOiBtYXJrQWxsQ29udGV4dClcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChcImVlLWJ1dHRvbnMtcm93XCIpXG4gICAgPy5pbnNlcnRBZGphY2VudEhUTUwoXCJiZWZvcmVlbmRcIiwgcmVuZGVyZWQpXG5cbiAgY29uc3QgaWQgPSBnZXRDdXJyZW50UmVnaW9uSWQoKVxuICBpZiAoIWlkKSByZXR1cm5cbiAgY29uc3QgcmVnaW9uID0gYXdhaXQgZ2V0UmVnaW9uKGlkKVxuICBpZiAoIXJlZ2lvbikgcmV0dXJuXG5cbiAgY29uc3QgaW5zZXJ0ZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1hc3MtbWFya1wiKVxuICBpbnNlcnRlZD8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+XG4gICAgbWFya2VkID8gdm9pZCB1bm1hcmtSZWdpb24ocmVnaW9uKSA6IHZvaWQgbWFya1JlZ2lvbihyZWdpb24pXG4gIClcbn1cblxuZnVuY3Rpb24gaGFuZGxlQ2xpY2tNaW5pbWFwcygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBtaW5pbWFwIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTERpdkVsZW1lbnQ+KFwiLm1pbmltYXBcIikpXG4gICAgbWluaW1hcC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4gaGFuZGxlQ2xpY2tNaW5pbWFwKG1pbmltYXApKVxufVxuXG4vKiogV2FpdCBmb3IgdGhlIG1pbmltYXAgdG8gY2hhbmdlIHRoZW4gcmVsb2FkIHRoZSBtYXNzIG1hcmsgYnV0dG9uICovXG5mdW5jdGlvbiBoYW5kbGVDbGlja01pbmltYXAoZGl2OiBIVE1MRGl2RWxlbWVudCk6IHZvaWQge1xuICBjb25zdCBkYXRhc2V0ID0gZ2V0TWluaW1hcERhdGFzZXQoZGl2KVxuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI21pbmltYXBzLWNvbnRhaW5lclwiKVxuICBpZiAoIWNvbnRhaW5lcilcbiAgICByZXR1cm4gQ29uc29sZS5lcnJvcihcIkNvdWxkbid0IGdldCAjbWluaW1hcHMtY29udGFpbmVyXCIsIGNvbnRhaW5lcilcblxuICBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zLCBvYnNlcnZlcikgPT4ge1xuICAgIGNvbnN0IGZvdW5kID0gbXV0YXRpb25zLmZpbmQoXG4gICAgICBtdXRhdGlvbiA9PlxuICAgICAgICBtdXRhdGlvbi50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRGl2RWxlbWVudCAmJlxuICAgICAgICBtdXRhdGlvbi50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKFwibWluaW1hcFwiKSAmJlxuICAgICAgICBtdXRhdGlvbi50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiY3VycmVudFwiKSAmJlxuICAgICAgICBnZXRNaW5pbWFwRGF0YXNldChtdXRhdGlvbi50YXJnZXQpLm1hcGlkID09PSBkYXRhc2V0Lm1hcGlkXG4gICAgKVxuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICAgIHZvaWQgc2V0dXBNYXNzTWFya0J1dHRvbigpXG4gICAgfVxuICB9KS5vYnNlcnZlKGNvbnRhaW5lciwge1xuICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgc3VidHJlZTogdHJ1ZSxcbiAgfSlcbn1cblxuZnVuY3Rpb24gaGFzU29tZU1hcmtlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgYXV0b0V4cGxvcmVMb2NhdGlvbnMgPSBMb2NhbFN0b3JhZ2UuYXV0b0V4cGxvcmVMb2NhdGlvbnNcblxuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxEaXZFbGVtZW50PihcbiAgICAgIFwiI21hcC1sb2NhdGlvbnMtY29udGFpbmVyIC5tYXAtbG9jYXRpb25cIlxuICAgIClcbiAgKS5zb21lKGxvY2F0aW9uID0+IHtcbiAgICBjb25zdCBkYXRhc2V0ID0gZ2V0TWFwTG9jYXRpb25EYXRhc2V0KGxvY2F0aW9uKVxuXG4gICAgcmV0dXJuIGF1dG9FeHBsb3JlTG9jYXRpb25zLnNvbWUoXG4gICAgICBhdXRvTG9jYXRpb24gPT4gZGF0YXNldC5pZCA9PT0gYXV0b0xvY2F0aW9uLmxvY2F0aW9uLmlkXG4gICAgKVxuICB9KVxufVxuXG5hc3luYyBmdW5jdGlvbiBtYXJrUmVnaW9uKHJlZ2lvbjogTWFwUmVnaW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGF1dG9FeHBsb3JlTG9jYXRpb25zID0gTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zXG4gIGF1dG9FeHBsb3JlTG9jYXRpb25zLnB1c2goXG4gICAgLi4ucmVnaW9uLmxvY2F0aW9uc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgbmV3TG9jYXRpb24gPT5cbiAgICAgICAgICAhYXV0b0V4cGxvcmVMb2NhdGlvbnMuZmluZChcbiAgICAgICAgICAgIGF1dG9Mb2NhdGlvbiA9PiBhdXRvTG9jYXRpb24ubG9jYXRpb24uaWQgPT09IG5ld0xvY2F0aW9uLmlkXG4gICAgICAgICAgKVxuICAgICAgKVxuICAgICAgLm1hcChuZXdMb2NhdGlvbiA9PiAoeyBsb2NhdGlvbjogbmV3TG9jYXRpb24sIHJlZ2lvbjogcmVnaW9uIH0pKVxuICApXG5cbiAgTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zID0gYXV0b0V4cGxvcmVMb2NhdGlvbnNcbiAgYXdhaXQgc2V0dXBNYXNzTWFya0J1dHRvbigpXG4gIHJlbG9hZE1hcmtlcnMoKVxufVxuXG5hc3luYyBmdW5jdGlvbiB1bm1hcmtSZWdpb24ocmVnaW9uOiBNYXBSZWdpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zID0gTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zLmZpbHRlcihcbiAgICBhdXRvTG9jYXRpb24gPT5cbiAgICAgICFyZWdpb24ubG9jYXRpb25zLmZpbmQoXG4gICAgICAgIGxvY2F0aW9uID0+IGxvY2F0aW9uLmlkID09PSBhdXRvTG9jYXRpb24ubG9jYXRpb24uaWRcbiAgICAgIClcbiAgKVxuXG4gIGF3YWl0IHNldHVwTWFzc01hcmtCdXR0b24oKVxuICByZWxvYWRNYXJrZXJzKClcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudFJlZ2lvbklkKCk6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBkaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcIi5taW5pbWFwLmN1cnJlbnRcIilcbiAgaWYgKCFkaXYpIHJldHVybiBOdW1iZXIoY3VycmVudFJlZ2lvbi5pZClcbiAgcmV0dXJuIE51bWJlcihnZXRNaW5pbWFwRGF0YXNldChkaXYpLm1hcGlkKVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBNaW5pbWFwRGF0YXNldCB7XG4gIG1hcGlkOiBudW1iZXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1pbmltYXBEYXRhc2V0KGRpdjogSFRNTERpdkVsZW1lbnQpOiBNaW5pbWFwRGF0YXNldCB7XG4gIHJldHVybiB7XG4gICAgbWFwaWQ6IE51bWJlcihkaXYuZGF0YXNldC5tYXBpZCksXG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIFNlc3Npb25TdG9yYWdlS2V5IHtcbiAgYWN0aW9uID0gXCJhY3Rpb25cIixcbiAgZXhwbG9yYXRpb25zRG9uZSA9IFwiZXhwbG9yYXRpb25zRG9uZVwiLFxuICBtaW5pZ2FtZXNEb25lID0gXCJtaW5pZ2FtZXNEb25lXCIsXG4gIHNlbGVjdGVkTG9jYXRpb24gPSBcInNlbGVjdGVkTG9jYXRpb25cIixcbiAgdGFrZW92ZXIgPSBcInRha2VvdmVyXCIsXG4gIHdpc2hsaXN0ID0gXCJ3aXNobGlzdFwiLFxuICBzdW1tZXJHYW1lRG9uZSA9IFwic3VtbWVyR2FtZURvbmVcIixcbn1cbiIsImltcG9ydCB0eXBlIHsgQXV0b0V4cGxvcmVMb2NhdGlvbiB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2F1dG9fZXhwbG9yZV9sb2NhdGlvblwiXG5pbXBvcnQgdHlwZSB7IFdpc2hlZEl0ZW0gfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS93aXNoZWRfaXRlbVwiXG5pbXBvcnQgeyBTZXNzaW9uU3RvcmFnZUtleSB9IGZyb20gXCIuL3Nlc3Npb25fc3RvcmFnZS5lbnVtXCJcbmltcG9ydCB0eXBlIHsgVGFrZW92ZXJBY3Rpb24gfSBmcm9tIFwiLi90YWtlb3Zlcl9hY3Rpb24uZW51bVwiXG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uU3RvcmFnZSB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHNlc3Npb25TdG9yYWdlID0gc2Vzc2lvblN0b3JhZ2VcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZ2V0IGFjdGlvbigpOiBUYWtlb3ZlckFjdGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW0oU2Vzc2lvblN0b3JhZ2VLZXkuYWN0aW9uLCBudWxsKVxuICB9XG5cbiAgc3RhdGljIHNldCBhY3Rpb24oYWN0aW9uOiBUYWtlb3ZlckFjdGlvbiB8IG51bGwpIHtcbiAgICB0aGlzLnNldEl0ZW0oU2Vzc2lvblN0b3JhZ2VLZXkuYWN0aW9uLCBhY3Rpb24pXG4gIH1cblxuICBzdGF0aWMgZ2V0IGV4cGxvcmF0aW9uc0RvbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbShTZXNzaW9uU3RvcmFnZUtleS5leHBsb3JhdGlvbnNEb25lLCBmYWxzZSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgZXhwbG9yYXRpb25zRG9uZShkb25lOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LmV4cGxvcmF0aW9uc0RvbmUsIGRvbmUpXG4gIH1cblxuICBzdGF0aWMgZ2V0IG1pbmlnYW1lc0RvbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbShTZXNzaW9uU3RvcmFnZUtleS5taW5pZ2FtZXNEb25lLCBmYWxzZSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgbWluaWdhbWVzRG9uZShkb25lOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5Lm1pbmlnYW1lc0RvbmUsIGRvbmUpXG4gIH1cblxuICBzdGF0aWMgZ2V0IHN1bW1lckdhbWVEb25lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW0oU2Vzc2lvblN0b3JhZ2VLZXkuc3VtbWVyR2FtZURvbmUsIGZhbHNlKVxuICB9XG5cbiAgc3RhdGljIHNldCBzdW1tZXJHYW1lRG9uZShkb25lOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LnN1bW1lckdhbWVEb25lLCBkb25lKVxuICB9XG5cbiAgc3RhdGljIGdldCBzZWxlY3RlZExvY2F0aW9uKCk6IEF1dG9FeHBsb3JlTG9jYXRpb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LnNlbGVjdGVkTG9jYXRpb24sIG51bGwpXG4gIH1cblxuICBzdGF0aWMgc2V0IHNlbGVjdGVkTG9jYXRpb24oc2VsZWN0ZWQ6IEF1dG9FeHBsb3JlTG9jYXRpb24gfCBudWxsKSB7XG4gICAgdGhpcy5zZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LnNlbGVjdGVkTG9jYXRpb24sIHNlbGVjdGVkKVxuICB9XG5cbiAgc3RhdGljIGdldCB0YWtlb3ZlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LnRha2VvdmVyLCBmYWxzZSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgdGFrZW92ZXIoZW5hYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0SXRlbShTZXNzaW9uU3RvcmFnZUtleS50YWtlb3ZlciwgZW5hYmxlZClcbiAgfVxuXG4gIHN0YXRpYyBnZXQgd2lzaGxpc3QoKTogV2lzaGVkSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5Lndpc2hsaXN0LCBbXSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgd2lzaGxpc3Qod2lzaGxpc3Q6IFdpc2hlZEl0ZW1bXSkge1xuICAgIHRoaXMuc2V0SXRlbShTZXNzaW9uU3RvcmFnZUtleS53aXNobGlzdCwgd2lzaGxpc3QpXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRJdGVtPFQ+KGtleTogU2Vzc2lvblN0b3JhZ2VLZXksIGZhbGxiYWNrOiBUKTogVCB7XG4gICAgcmV0dXJuIChKU09OLnBhcnNlKFxuICAgICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGtleSkgPz8gSlNPTi5zdHJpbmdpZnkoZmFsbGJhY2spXG4gICAgKSA/PyBmYWxsYmFjaykgYXMgVFxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2V0SXRlbTxUPihrZXk6IFNlc3Npb25TdG9yYWdlS2V5LCB2YWx1ZTogVCk6IHZvaWQge1xuICAgIHRoaXMuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gVGFrZW92ZXJBY3Rpb24ge1xuICBkYWlseSA9IFwiZGFpbHlcIixcbiAgbWluaWdhbWVzID0gXCJtaW5pZ2FtZXNcIixcbiAgZXhwbG9yYXRpb25zID0gXCJleHBsb3JhdGlvbnNcIixcbiAgYXVjdGlvbnMgPSBcImF1Y3Rpb25zXCIsXG4gIGJ1eSA9IFwiYnV5XCIsXG4gIC8vIHNlbGwsXG4gIHN1bW1lckdhbWUgPSBcInN1bW1lckdhbWVcIixcbiAgd2FpdCA9IFwid2FpdFwiLFxufVxuIiwiaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi9jb25zb2xlXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB7IFNlc3Npb25TdG9yYWdlIH0gZnJvbSBcIi4uL3Nlc3Npb25fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VcIlxuaW1wb3J0IHR5cGUgeyBUYWtlb3ZlckFjdGlvbiB9IGZyb20gXCIuLi9zZXNzaW9uX3N0b3JhZ2UvdGFrZW92ZXJfYWN0aW9uLmVudW1cIlxuaW1wb3J0IHsgbG9hZFRvcEJhciB9IGZyb20gXCIuLi91aS90b3BfYmFyXCJcbmltcG9ydCB0eXBlIHsgQWN0aW9uIH0gZnJvbSBcIi4vY2xhc3Nlcy9hY3Rpb25cIlxuaW1wb3J0IGJ1eUFjdGlvbiBmcm9tIFwiLi9jbGFzc2VzL2J1eV9hY3Rpb25cIlxuaW1wb3J0IGRhaWx5QWN0aW9uIGZyb20gXCIuL2NsYXNzZXMvZGFpbHlfYWN0aW9uXCJcbmltcG9ydCBleHBsb3JhdGlvbkFjdGlvbiBmcm9tIFwiLi9jbGFzc2VzL2V4cGxvcmF0aW9uX2FjdGlvblwiXG5pbXBvcnQgbWluaWdhbWVBY3Rpb24gZnJvbSBcIi4vY2xhc3Nlcy9taW5pZ2FtZV9hY3Rpb25cIlxuaW1wb3J0IHdhaXRBY3Rpb24gZnJvbSBcIi4vY2xhc3Nlcy93YWl0X2FjdGlvblwiXG5cbi8qKiBBdXRvbWF0ZWQgZW50cnkgcG9pbnQgb2YgdGhlIHRha2VvdmVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRUYWtlb3ZlcigpOiB2b2lkIHtcbiAgaWYgKFNlc3Npb25TdG9yYWdlLnRha2VvdmVyICYmIExvY2FsU3RvcmFnZS51bmxvY2tlZCkgdm9pZCB0YWtlb3ZlcigpXG59XG5cbi8qKiBNYW51YWwgZW50cnkgcG9pbnQgb2YgdGhlIHRha2VvdmVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZVRha2VvdmVyKCk6IHZvaWQge1xuICByZXNldFRha2VvdmVyKClcbiAgU2Vzc2lvblN0b3JhZ2UudGFrZW92ZXIgPSAhU2Vzc2lvblN0b3JhZ2UudGFrZW92ZXJcblxuICBpZiAoIUxvY2FsU3RvcmFnZS51bmxvY2tlZCkge1xuICAgIFNlc3Npb25TdG9yYWdlLnRha2VvdmVyID0gZmFsc2VcbiAgICByZXR1cm5cbiAgfVxuXG4gIGxvYWRUb3BCYXIoKVxuICBpZiAoU2Vzc2lvblN0b3JhZ2UudGFrZW92ZXIpICQuZmxhdnJOb3RpZih0cmFuc2xhdGUudGFrZW92ZXIuZW5hYmxlZClcbiAgZWxzZSAkLmZsYXZyTm90aWYodHJhbnNsYXRlLnRha2VvdmVyLmRpc2FibGVkKVxuXG4gIHZvaWQgdGFrZW92ZXIoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRUYWtlb3ZlcigpOiB2b2lkIHtcbiAgU2Vzc2lvblN0b3JhZ2UuYWN0aW9uID0gbnVsbFxuICBTZXNzaW9uU3RvcmFnZS5leHBsb3JhdGlvbnNEb25lID0gZmFsc2VcbiAgU2Vzc2lvblN0b3JhZ2UubWluaWdhbWVzRG9uZSA9IGZhbHNlXG4gIFNlc3Npb25TdG9yYWdlLnNlbGVjdGVkTG9jYXRpb24gPSBudWxsXG4gIFNlc3Npb25TdG9yYWdlLnN1bW1lckdhbWVEb25lID0gZmFsc2VcbiAgU2Vzc2lvblN0b3JhZ2Uud2lzaGxpc3QgPSBbXVxufVxuXG5hc3luYyBmdW5jdGlvbiB0YWtlb3ZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFTZXNzaW9uU3RvcmFnZS50YWtlb3ZlcikgcmV0dXJuXG4gIGlmIChkYWlseUFjdGlvbi5jb25kaXRpb24oKSkgYXdhaXQgZGFpbHlBY3Rpb24ucGVyZm9ybSgpXG5cbiAgY29uc3QgYWN0aW9uID0gYWN0aW9ucy5maW5kKGFjdGlvbiA9PiBhY3Rpb24ua2V5ID09PSBTZXNzaW9uU3RvcmFnZS5hY3Rpb24pXG4gIGlmIChhY3Rpb24/LmNvbmRpdGlvbigpKSB7XG4gICAgQ29uc29sZS5pbmZvKFwiQWN0aW9uOlwiLCBhY3Rpb24ua2V5KVxuXG4gICAgaWYgKGF3YWl0IGFjdGlvbi5wZXJmb3JtKCkpIHJldHVyblxuICB9XG5cbiAgY2hhbmdlQWN0aW9uKClcbiAgdm9pZCB0YWtlb3ZlcigpXG59XG5cbmNvbnN0IGFjdGlvbnM6IEFjdGlvbltdID0gW1xuICBleHBsb3JhdGlvbkFjdGlvbixcbiAgYnV5QWN0aW9uLFxuICBtaW5pZ2FtZUFjdGlvbixcbiAgd2FpdEFjdGlvbixcbl1cblxuZnVuY3Rpb24gY2hhbmdlQWN0aW9uKCk6IFRha2VvdmVyQWN0aW9uIHtcbiAgY29uc3QgbmV4dCA9XG4gICAgYWN0aW9ucy5maW5kSW5kZXgoYWN0aW9uID0+IGFjdGlvbi5rZXkgPT09IFNlc3Npb25TdG9yYWdlLmFjdGlvbikgKyAxXG5cbiAgcmV0dXJuIChTZXNzaW9uU3RvcmFnZS5hY3Rpb24gPVxuICAgIGFjdGlvbnNbbmV4dCA+PSBhY3Rpb25zLmxlbmd0aCA/IDAgOiBuZXh0XSEua2V5KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUYWtlb3ZlckFjdGlvbiB9IGZyb20gXCIuLi8uLi9zZXNzaW9uX3N0b3JhZ2UvdGFrZW92ZXJfYWN0aW9uLmVudW1cIlxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWN0aW9uIHtcbiAgLyoqIEtleSBieSB3aGljaCB0aGUgYFNlc3Npb25TdG9yYWdlYCBjYW4gcmVmZXJlbmNlIHRoaXMgYWN0aW9uLiAqL1xuICBhYnN0cmFjdCByZWFkb25seSBrZXk6IFRha2VvdmVyQWN0aW9uXG5cbiAgLyoqIERldGVybWluZXMgaWYgdGhpcyBhY3Rpb24gY2FuIGJlIHBlcmZvcm1lZCBkdXJpbmcgYSB0YWtlb3Zlci4gKi9cbiAgYWJzdHJhY3QgY29uZGl0aW9uKCk6IGJvb2xlYW5cblxuICAvKipcbiAgICogUGVyZm9ybXMgdGhlIGFjdGlvbiBhbmQgcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaGFzIHNvbWV0aGluZyBlbHNlIHRvIGRvIG9yXG4gICAqIGBmYWxzZWAgaWYgdGhpcyBhY3Rpb24gaXMgZmluaXNoZWQgZXhlY3V0aW5nLlxuICAgKi9cbiAgYWJzdHJhY3QgcGVyZm9ybSgpOiBQcm9taXNlPGJvb2xlYW4+XG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IGFqYXhTZWFyY2ggfSBmcm9tIFwiLi4vLi4vYWpheC9hamF4X3NlYXJjaFwiXG5pbXBvcnQgeyBidXkgfSBmcm9tIFwiLi4vLi4vYWpheC9idXlcIlxuaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi8uLi9jb25zb2xlXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi8uLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB0eXBlIHsgV2lzaGVkSXRlbSB9IGZyb20gXCIuLi8uLi9sb2NhbF9zdG9yYWdlL3dpc2hlZF9pdGVtXCJcbmltcG9ydCB0eXBlIHsgTWFya2V0RW50cnkgfSBmcm9tIFwiLi4vLi4vbWFya2V0cGxhY2UvaW50ZXJmYWNlcy9tYXJrZXRfZW50cnlcIlxuaW1wb3J0IHsgZ2V0SXRlbURldGFpbHMgfSBmcm9tIFwiLi4vLi4vbWFya2V0cGxhY2UvbWFya2V0cGxhY2VfaGFuZGxlcnNcIlxuaW1wb3J0IHsgVGFrZW92ZXJBY3Rpb24gfSBmcm9tIFwiLi4vLi4vc2Vzc2lvbl9zdG9yYWdlL3Rha2VvdmVyX2FjdGlvbi5lbnVtXCJcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuL2FjdGlvblwiXG5cbmNsYXNzIEJ1eUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7XG4gIHJlYWRvbmx5IGtleSA9IFRha2VvdmVyQWN0aW9uLmJ1eVxuXG4gIHByaXZhdGUgZ2V0IGN1cnJlbnRNYWFuYSgpOiBudW1iZXIge1xuICAgIHJldHVybiBOdW1iZXIoXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxBbmNob3JFbGVtZW50PihcIiNjdXJyZW5jeS1tYWFuYVwiKT8uZGF0YXNldFxuICAgICAgICAubWFhbmFcbiAgICApXG4gIH1cblxuICBjb25kaXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIExvY2FsU3RvcmFnZS5tYXJrZXQgJiYgQm9vbGVhbihMb2NhbFN0b3JhZ2Uud2lzaGxpc3QubGVuZ3RoKVxuICB9XG5cbiAgYXN5bmMgcGVyZm9ybSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAobG9jYXRpb24ucGF0aG5hbWUgIT09IFwiL21hcmtldHBsYWNlXCIpIHtcbiAgICAgIHBhZ2VMb2FkKFwiL21hcmtldHBsYWNlXCIpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IGljb25NZXNzYWdlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvaHRtbC9mbGF2cl9ub3RpZi9pY29uX21lc3NhZ2UuaHRtbFwiKVxuICAgIGZvciAoY29uc3Qgd2lzaGVkIG9mIExvY2FsU3RvcmFnZS53aXNobGlzdCkge1xuICAgICAgLy8gQ2xvdGhlcyBtaWdodCBiZSBhIHNwZWNpYWwgZXhjZXB0aW9uLiBJZiB0aGV5IGFyZSwgdGhlbiBjaGVjayBmb3JcbiAgICAgIC8vIGB3aXNoZWQudHlwZSA9PT0gVHlwZS5QbGF5ZXJXZWFyYWJsZUl0ZW1gLlxuICAgICAgaWYgKHdpc2hlZC5lcnJvcikge1xuICAgICAgICBDb25zb2xlLndhcm4oYFNraXBwZWQgXCIke3dpc2hlZC5uYW1lfVwiYCwgd2lzaGVkKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgQ29uc29sZS5pbmZvKGBTZWFyY2hpbmcgZm9yIFwiJHt3aXNoZWQubmFtZX1cImAsIHdpc2hlZClcblxuICAgICAgLyoqIFNlYXJjaCBpbiBlYWNoIHBhZ2VzIHVudGlsIHRoZSBhbW91bnQgb2YgaXRlbXMgaXMgbGVzcyB0aGFuIDggKi9cbiAgICAgIGxldCBhbW91bnQgPSA4XG4gICAgICBmb3JwYWdlOiBmb3IgKGxldCBwYWdlID0gMTsgYW1vdW50ID09PSA4OyBwYWdlKyspIHtcbiAgICAgICAgbGV0IHJlc3VsdHM6IE1hcmtldEVudHJ5W10gPSBbXVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdHMgPSBhd2FpdCB0aGlzLnNlYXJjaCh3aXNoZWQsIHBhZ2UpXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IGUgYXMgSlF1ZXJ5WEhSXG4gICAgICAgICAgQ29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHNlYXJjaCBmb3IgXCIke3dpc2hlZC5uYW1lfVwiYCwgZXJyb3IpXG4gICAgICAgICAgdGhpcy5zZXRFcnJvcih3aXNoZWQuaWNvbiwgYCR7ZXJyb3Iuc3RhdHVzVGV4dH1gKVxuICAgICAgICAgIGJyZWFrIGZvcnBhZ2VcbiAgICAgICAgfVxuXG4gICAgICAgIGFtb3VudCA9IHJlc3VsdHMubGVuZ3RoXG4gICAgICAgIENvbnNvbGUubG9nKGBGb3VuZCAke2Ftb3VudH0gcmVzdWx0c2AsIHJlc3VsdHMpXG5cbiAgICAgICAgY29uc3Qgd2FudGVkID0gcmVzdWx0cy5maWx0ZXIoXG4gICAgICAgICAgcmVzdWx0ID0+XG4gICAgICAgICAgICByZXN1bHQuaWNvbiA9PT0gd2lzaGVkLmljb24gJiZcbiAgICAgICAgICAgIHJlc3VsdC5idXlOb3dQcmljZSAmJlxuICAgICAgICAgICAgTnVtYmVyKHJlc3VsdC5idXlOb3dQcmljZS5wcmljZSkgPD0gd2lzaGVkLnByaWNlICYmXG4gICAgICAgICAgICBOdW1iZXIocmVzdWx0LmJ1eU5vd1ByaWNlLnByaWNlKSA8PSB0aGlzLmN1cnJlbnRNYWFuYVxuICAgICAgICApXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHdhbnRlZCkge1xuICAgICAgICAgIGlmICghKGF3YWl0IHRoaXMuYnV5KHJlc3VsdCkpKSBicmVhayBmb3JwYWdlXG5cbiAgICAgICAgICBMb2NhbFN0b3JhZ2UucHVyY2hhc2VzID0gW1xuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgLi4uTG9jYWxTdG9yYWdlLnB1cmNoYXNlcy5maWx0ZXIoXG4gICAgICAgICAgICAgIHB1cmNoYXNlID0+IHB1cmNoYXNlLml0ZW1pZCAhPT0gcmVzdWx0Lml0ZW1pZFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBdXG5cbiAgICAgICAgICBDb25zb2xlLmluZm8oXG4gICAgICAgICAgICBgQm91Z2h0IFwiJHtyZXN1bHQubmFtZX1cIiBmb3IgJHtOdW1iZXIoXG4gICAgICAgICAgICAgIHJlc3VsdC5idXlOb3dQcmljZT8ucHJpY2VcbiAgICAgICAgICAgICl9IG1hYW5hcy5gLFxuICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgKVxuXG4gICAgICAgICAgJC5mbGF2ck5vdGlmKFxuICAgICAgICAgICAgaWNvbk1lc3NhZ2UucmVuZGVyKHtcbiAgICAgICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0cmFuc2xhdGUudGFrZW92ZXIuYm91Z2h0KFxuICAgICAgICAgICAgICAgIHJlc3VsdC5uYW1lLFxuICAgICAgICAgICAgICAgIE51bWJlcihyZXN1bHQuYnV5Tm93UHJpY2U/LnByaWNlKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXJjaGFzZSBhbiBpdGVtIGZyb20gdGhlIG1hcmtldC5cbiAgICogQHJldHVybnMgd2hldGhlciB0aGUgaXRlbSB3YXMgc3VjY2Vzc2Z1bGx5IHB1cmNoYXNlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnV5KHJlc3VsdDogTWFya2V0RW50cnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgYnV5KE51bWJlcihyZXN1bHQuaXRlbWlkKSlcbiAgICBDb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gYnV5IFwiJHtyZXN1bHQubmFtZX1cImAsIHJlc3VsdCwganNvbilcbiAgICBpZiAoanNvbi5yZXN1bHQgIT09IFwic3VjY2Vzc1wiKSB0aGlzLnNldEVycm9yKHJlc3VsdC5pY29uLCBqc29uLmRhdGEpXG4gICAgcmV0dXJuIGpzb24ucmVzdWx0ID09PSBcInN1Y2Nlc3NcIlxuICB9XG5cbiAgLyoqIFNlYXJjaCBmb3IgYSB3aXNoZWQgaXRlbSBvbiBhIHNwZWNpZmljIHBhZ2UgdXNpbmcgdGhlIGl0ZW0ncyBuYW1lLiAqL1xuICBwcml2YXRlIGFzeW5jIHNlYXJjaCh3aXNoZWQ6IFdpc2hlZEl0ZW0sIHBhZ2UgPSAxKTogUHJvbWlzZTxNYXJrZXRFbnRyeVtdPiB7XG4gICAgLy8gUHV0IHRoZSBuYW1lIG9mIHRoZSBpdGVtIGluIHRoZSBmaWx0ZXJcbiAgICBjb25zdCBmaWx0ZXJJdGVtTmFtZSA9XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFwiI2ZpbHRlci1pdGVtTmFtZVwiKVxuICAgIGlmIChmaWx0ZXJJdGVtTmFtZSkgZmlsdGVySXRlbU5hbWUudmFsdWUgPSB3aXNoZWQubmFtZVxuXG4gICAgLy8gU2hvdyB0aGUgcmVzdWx0cyBvZiB0aGUgc2VhcmNoXG4gICAgY29uc3QgbWFya2V0cGxhY2VTZWFyY2hJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBcIi5tYXJrZXRwbGFjZS1zZWFyY2gtaXRlbXNcIlxuICAgIClcbiAgICBpZiAoIW1hcmtldHBsYWNlU2VhcmNoSXRlbXMpIHJldHVybiBbXVxuICAgIG1hcmtldHBsYWNlU2VhcmNoSXRlbXMuaW5uZXJIVE1MID0gYXdhaXQgYWpheFNlYXJjaCh7XG4gICAgICBuYW1lOiB3aXNoZWQubmFtZSxcbiAgICAgIHBhZ2UsXG4gICAgfSlcblxuICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgbWFya2V0cGxhY2VTZWFyY2hJdGVtcy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxMSUVsZW1lbnQ+KFxuICAgICAgICBcIi5tYXJrZXRwbGFjZS1zZWFyY2gtaXRlbVwiXG4gICAgICApXG4gICAgKVxuICAgICAgLm1hcChnZXRJdGVtRGV0YWlscylcbiAgICAgIC5maWx0ZXI8TWFya2V0RW50cnk+KChpdGVtKTogaXRlbSBpcyBNYXJrZXRFbnRyeSA9PiBpdGVtICE9PSBudWxsKVxuICB9XG5cbiAgLyoqIFNldCB0aGUgYFdpc2hlZEl0ZW0uZXJyb3JgIHByb3BlcnR5IHdpdGhvdXQgcmVvcmRlcmluZyB0aGUgd2lzaGxpc3QuICovXG4gIHByaXZhdGUgc2V0RXJyb3IoaWNvbjogc3RyaW5nLCBlcnJvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgd2lzaGxpc3QgPSBMb2NhbFN0b3JhZ2Uud2lzaGxpc3RcbiAgICBjb25zdCBpbmRleCA9IHdpc2hsaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWNvbiA9PT0gaWNvbilcbiAgICBjb25zdCBlbnRyeSA9IHdpc2hsaXN0W2luZGV4XVxuICAgIGlmICghZW50cnkpIHJldHVyblxuXG4gICAgZW50cnkuZXJyb3IgPSBlcnJvclxuICAgIExvY2FsU3RvcmFnZS53aXNobGlzdCA9IFtcbiAgICAgIC4uLndpc2hsaXN0LnNsaWNlKHVuZGVmaW5lZCwgaW5kZXgpLFxuICAgICAgZW50cnksXG4gICAgICAuLi53aXNobGlzdC5zbGljZShpbmRleCArIDEsIHVuZGVmaW5lZCksXG4gICAgXVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBCdXlBY3Rpb24oKVxuIiwiaW1wb3J0IHsgVGFrZW92ZXJBY3Rpb24gfSBmcm9tIFwiLi4vLi4vc2Vzc2lvbl9zdG9yYWdlL3Rha2VvdmVyX2FjdGlvbi5lbnVtXCJcbmltcG9ydCB7IHJlc2V0VGFrZW92ZXIgfSBmcm9tIFwiLi4vYnJhaW5cIlxuaW1wb3J0IHsgY2xpY2sgfSBmcm9tIFwiLi4vY2xpY2tcIlxuaW1wb3J0IHR5cGUgeyBBY3Rpb24gfSBmcm9tIFwiLi9hY3Rpb25cIlxuXG5jbGFzcyBEYWlseUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbiB7XG4gIHJlYWRvbmx5IGtleSA9IFRha2VvdmVyQWN0aW9uLmRhaWx5XG5cbiAgLyoqIENoZWNrcyBpZiB0aGUgZGFpbHkgbWFhbmEgZ2lmdCBpZiB0aGVyZS4gKi9cbiAgY29uZGl0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhaWx5R2lmdENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGFpbHktZ2lmdC1jb250YWluZXJcIilcbiAgICByZXR1cm4gKFxuICAgICAgISFkYWlseUdpZnRDb250YWluZXIgJiZcbiAgICAgIGdldENvbXB1dGVkU3R5bGUoZGFpbHlHaWZ0Q29udGFpbmVyKS5kaXNwbGF5ICE9PSBcIm5vbmVcIlxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGljayBvbiB0aGUgZGFpbHkgbWFhbmEgZ2lmdC5cbiAgICogQHJldHVybnMgYGZhbHNlYC4gVGhpcyBhY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBtZWFuaW5nZnVsIGFjdGlvbnMgb24gdGhlXG4gICAqIHBhZ2UuXG4gICAqL1xuICBhc3luYyBwZXJmb3JtKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGRhaWx5R2lmdENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGFpbHktZ2lmdC1jb250YWluZXJcIilcbiAgICBpZiAoXG4gICAgICAhZGFpbHlHaWZ0Q29udGFpbmVyIHx8XG4gICAgICBnZXRDb21wdXRlZFN0eWxlKGRhaWx5R2lmdENvbnRhaW5lcikuZGlzcGxheSA9PT0gXCJub25lXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGRhaWx5R2lmdENvbnRhaW5lci5jbGljaygpXG4gICAgYXdhaXQgY2xpY2s8SFRNTEJ1dHRvbkVsZW1lbnQ+KFwiLmZpcnN0LWNvbm5leGlvbiAuZmxhdnItYnV0dG9uLmRlZmF1bHRcIilcblxuICAgIHJlc2V0VGFrZW92ZXIoKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBEYWlseUFjdGlvbigpXG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IGNhcHR1cmVFbmQgfSBmcm9tIFwiLi4vLi4vYWpheC9jYXB0dXJlX2VuZFwiXG5pbXBvcnQgeyBjaGFuZ2VSZWdpb24gfSBmcm9tIFwiLi4vLi4vYWpheC9jaGFuZ2VfcmVnaW9uXCJcbmltcG9ydCB7IGV4cGxvcmF0aW9uUmVzdWx0cyB9IGZyb20gXCIuLi8uLi9hamF4L2V4cGxvcmF0aW9uX3Jlc3VsdHNcIlxuaW1wb3J0IHsgUmVzdWx0IH0gZnJvbSBcIi4uLy4uL2FwaS9yZXN1bHQuZW51bVwiXG5pbXBvcnQgeyBDb25zb2xlIH0gZnJvbSBcIi4uLy4uL2NvbnNvbGVcIlxuaW1wb3J0IHsgRHVyYXRpb25Vbml0IH0gZnJvbSBcIi4uLy4uL2R1cmF0aW9uXCJcbmltcG9ydCB0eXBlIHsgTWFwUmVnaW9uLCBTZWFzb24gfSBmcm9tIFwiLi4vLi4vZWxkYXJ5YS9jdXJyZW50X3JlZ2lvblwiXG5pbXBvcnQgdHlwZSB7IFBlbmRpbmdUcmVhc3VyZUh1bnRMb2NhdGlvbiB9IGZyb20gXCIuLi8uLi9lbGRhcnlhL3RyZWFzdXJlXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi8uLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgdHlwZSB7IEF1dG9FeHBsb3JlTG9jYXRpb24gfSBmcm9tIFwiLi4vLi4vbG9jYWxfc3RvcmFnZS9hdXRvX2V4cGxvcmVfbG9jYXRpb25cIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5pbXBvcnQgeyBTZXNzaW9uU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9zZXNzaW9uX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlXCJcbmltcG9ydCB7IFRha2VvdmVyQWN0aW9uIH0gZnJvbSBcIi4uLy4uL3Nlc3Npb25fc3RvcmFnZS90YWtlb3Zlcl9hY3Rpb24uZW51bVwiXG5pbXBvcnQgeyBjbGljaywgY2xpY2tFbGVtZW50LCB3YWl0T2JzZXJ2ZSB9IGZyb20gXCIuLi9jbGlja1wiXG5pbXBvcnQgeyBFeHBsb3JhdGlvblN0YXR1cyB9IGZyb20gXCIuLi9leHBsb3JhdGlvbl9zdGF0dXMuZW51bVwiXG5pbXBvcnQgdHlwZSB7IFN0YXJ0RXhwbG9yYXRpb24gfSBmcm9tIFwiLi4vc3RhcnRfZXhwbG9yYXRpb25cIlxuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9uXCJcblxuY2xhc3MgRXhwbG9yYXRpb25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24ge1xuICByZWFkb25seSBrZXkgPSBUYWtlb3ZlckFjdGlvbi5leHBsb3JhdGlvbnNcblxuICBwcml2YXRlIGdldCBnbG9iYWxzKCk6IHtcbiAgICBjdXJyZW50UmVnaW9uOiBNYXBSZWdpb25cbiAgICBwZW5kaW5nVHJlYXN1cmVIdW50TG9jYXRpb246IFBlbmRpbmdUcmVhc3VyZUh1bnRMb2NhdGlvbiB8IG51bGxcbiAgICB0aW1lTGVmdEV4cGxvcmF0aW9uOiBudW1iZXIgfCBudWxsXG4gIH0ge1xuICAgIHJldHVybiB7IGN1cnJlbnRSZWdpb24sIHBlbmRpbmdUcmVhc3VyZUh1bnRMb2NhdGlvbiwgdGltZUxlZnRFeHBsb3JhdGlvbiB9XG4gIH1cblxuICBjb25kaXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIExvY2FsU3RvcmFnZS5leHBsb3JhdGlvbnMgJiZcbiAgICAgICFTZXNzaW9uU3RvcmFnZS5leHBsb3JhdGlvbnNEb25lICYmXG4gICAgICAhIUxvY2FsU3RvcmFnZS5hdXRvRXhwbG9yZUxvY2F0aW9ucy5sZW5ndGhcbiAgICApXG4gIH1cblxuICBhc3luYyBwZXJmb3JtKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChsb2NhdGlvbi5wYXRobmFtZSAhPT0gXCIvcGV0XCIpIHtcbiAgICAgIHBhZ2VMb2FkKFwiL3BldFwiKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9wZW5DdXJyZW50UmVnaW9uKClcbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmdldEV4cGxvcmF0aW9uU3RhdHVzKClcbiAgICBDb25zb2xlLmxvZyhcIkV4cGxvcmF0aW9uIHN0YXR1czpcIiwgRXhwbG9yYXRpb25TdGF0dXNbc3RhdHVzXSlcbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSBFeHBsb3JhdGlvblN0YXR1cy5pZGxlOlxuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLnN0YXJ0RXhwbG9yYXRpb24oKSkuc2VsZWN0ZWQpXG4gICAgICAgICAgU2Vzc2lvblN0b3JhZ2UuZXhwbG9yYXRpb25zRG9uZSA9IHRydWVcbiAgICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGNhc2UgRXhwbG9yYXRpb25TdGF0dXMucGVuZGluZzpcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLndhaXRFeHBsb3JhdGlvbigpKSAmJiB0aGlzLnBlcmZvcm0oKVxuXG4gICAgICBjYXNlIEV4cGxvcmF0aW9uU3RhdHVzLnJlc3VsdDpcbiAgICAgICAgYXdhaXQgdGhpcy5lbmRFeHBsb3JhdGlvbigpXG4gICAgICAgIHJldHVybiB0aGlzLnBlcmZvcm0oKVxuXG4gICAgICBjYXNlIEV4cGxvcmF0aW9uU3RhdHVzLmNhcHR1cmU6XG4gICAgICAgIGF3YWl0IHRoaXMuZW5kQ2FwdHVyZSgpXG4gICAgICAgIHJldHVybiB0aGlzLnBlcmZvcm0oKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG9wZW5DdXJyZW50UmVnaW9uKCk6IFByb21pc2U8SFRNTERpdkVsZW1lbnQgfCBudWxsPiB7XG4gICAgaWYgKCFwZW5kaW5nVHJlYXN1cmVIdW50TG9jYXRpb24pIHJldHVybiBudWxsXG4gICAgcmV0dXJuIGNsaWNrPEhUTUxEaXZFbGVtZW50PihcbiAgICAgIGAubWluaW1hcFtkYXRhLW1hcGlkPVwiJHtwZW5kaW5nVHJlYXN1cmVIdW50TG9jYXRpb24uTWFwUmVnaW9uX2lkfVwiXWBcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNsaWNrRXhwbG9yZSgpOiBQcm9taXNlPEhUTUxCdXR0b25FbGVtZW50PiB7XG4gICAgcmV0dXJuIGNsaWNrKFwiI2V4cGxvcmUtYnV0dG9uXCIpXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNsaWNrTG9jYXRpb24oXG4gICAgc2VsZWN0ZWQ6IEF1dG9FeHBsb3JlTG9jYXRpb25cbiAgKTogUHJvbWlzZTxIVE1MRGl2RWxlbWVudD4ge1xuICAgIHJldHVybiBjbGljazxIVE1MRGl2RWxlbWVudD4oXG4gICAgICBgLm1hcC1sb2NhdGlvbltkYXRhLWlkPVwiJHtzZWxlY3RlZC5sb2NhdGlvbi5pZH1cIl1gXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbGlja1JlZ2lvbihcbiAgICBzZWxlY3RlZDogQXV0b0V4cGxvcmVMb2NhdGlvblxuICApOiBQcm9taXNlPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjbWluaW1hcHMtY29udGFpbmVyXCIpXG4gICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgIENvbnNvbGUubG9nKFwiQ291bGRuJ3QgZmluZCAjbWluaW1hcHMtY29udGFpbmVyOlwiLCBjb250YWluZXIpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IGRpdiA9IGF3YWl0IHdhaXRPYnNlcnZlPEhUTUxEaXZFbGVtZW50PihcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGAubWluaW1hcFtkYXRhLW1hcGlkPVwiJHtzZWxlY3RlZC5yZWdpb24uaWR9XCJdYFxuICAgIClcbiAgICBpZiAoIWRpdikge1xuICAgICAgLy8gQ2xlYXJpbmcgaW52YWxpZCByZWdpb25zIGlzIHVzZWZ1bCB0byByZW1vdmUgZmluaXNoZWQgZXZlbnRzLlxuICAgICAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9odG1sL2ZsYXZyX25vdGlmL2ljb25fbWVzc2FnZS5odG1sXCIpXG4gICAgICAkLmZsYXZyTm90aWYoXG4gICAgICAgIHRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAgICAgaWNvbjogXCIvc3RhdGljL2ltZy9uZXctbGF5b3V0L3BldC9pY29ucy9waWN0b19tYXAucG5nXCIsXG4gICAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRlLnBldC5kZWxldGluZ19tYXJrZXJzLFxuICAgICAgICB9KVxuICAgICAgKVxuXG4gICAgICBMb2NhbFN0b3JhZ2UuYXV0b0V4cGxvcmVMb2NhdGlvbnMgPVxuICAgICAgICBMb2NhbFN0b3JhZ2UuYXV0b0V4cGxvcmVMb2NhdGlvbnMuZmlsdGVyKFxuICAgICAgICAgIHNhdmVkID0+IHNhdmVkLnJlZ2lvbi5pZCAhPT0gc2VsZWN0ZWQucmVnaW9uLmlkXG4gICAgICAgIClcblxuICAgICAgQ29uc29sZS53YXJuKFwiQ291bGQgbm90IGZpbmQgcmVnaW9uXCIsIHNlbGVjdGVkLnJlZ2lvbilcbiAgICAgIHBhZ2VMb2FkKFwiL3BldFwiKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBDb25zb2xlLmRlYnVnKFwiQ2xpY2tpbmcgb24gcmVnaW9uXCIsIGRpdilcbiAgICBhd2FpdCBjbGlja0VsZW1lbnQoZGl2KVxuICAgIHJldHVybiBkaXZcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2xpY2tTZWFzb24oKTogUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PiB7XG4gICAgcmV0dXJuIGNsaWNrPEhUTUxJbWFnZUVsZW1lbnQ+KFwiI2NyeXN0YWwtaW1hZ2VzLWNvbnRhaW5lclwiKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbmRDYXB0dXJlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB2b2lkIG5ldyBBdWRpbyhcbiAgICAgICAgXCIvc3RhdGljL2V2ZW50LzIwMjEvbXVzaWMvc291bmRzL21pc3Npb24tY29tcGxldGUubXAzXCJcbiAgICAgICkucGxheSgpXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfVxuXG4gICAgYXdhaXQgY2xpY2s8SFRNTEJ1dHRvbkVsZW1lbnQ+KFwiI29wZW4tY2FwdHVyZS1pbnRlcmZhY2VcIilcbiAgICBhd2FpdCBjbGljazxIVE1MQnV0dG9uRWxlbWVudD4oXCIjY2FwdHVyZS1idXR0b25cIilcbiAgICBhd2FpdCBjbGljazxIVE1MQnV0dG9uRWxlbWVudD4oXCIjY2xvc2UtcmVzdWx0XCIpXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuZEV4cGxvcmF0aW9uKCk6IFByb21pc2U8SFRNTERpdkVsZW1lbnQ+IHtcbiAgICByZXR1cm4gY2xpY2soXCIjY2xvc2UtcmVzdWx0XCIpXG4gIH1cblxuICBwcml2YXRlIGdldEN1cnJlbnRTZWFzb24oKTogU2Vhc29uIHwgbnVsbCB7XG4gICAgY29uc3Qgc2Vhc29uID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiYm9keVwiKT8uY2xhc3NMaXN0ID8/IFtdKVxuICAgICAgLmZpbmQoYyA9PiBjLnN0YXJ0c1dpdGgoXCJzZWFzb24tXCIpKVxuICAgICAgPy5yZXBsYWNlKFwic2Vhc29uLVwiLCBcIlwiKVxuXG4gICAgaWYgKHRoaXMuaXNTZWFzb24oc2Vhc29uKSkgcmV0dXJuIHNlYXNvblxuICAgIGVsc2UgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHByaXZhdGUgaXNTZWFzb24oc2Vhc29uOiB1bmtub3duKTogc2Vhc29uIGlzIFNlYXNvbiB7XG4gICAgcmV0dXJuIFtcInMxXCIsIFwiczJcIl0uc29tZShzID0+IHMgPT09IHNlYXNvbilcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXhwbG9yYXRpb25TdGF0dXMoKTogRXhwbG9yYXRpb25TdGF0dXMge1xuICAgIGlmIChcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIFwiI3RyZWFzdXJlLWh1bnQtcmVzdWx0LW92ZXJsYXkuYWN0aXZlICNvcGVuLWNhcHR1cmUtaW50ZXJmYWNlXCJcbiAgICAgICkgfHxcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY2FwdHVyZS1pbnRlcmZhY2Utb3V0ZXIuYWN0aXZlXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gRXhwbG9yYXRpb25TdGF0dXMuY2FwdHVyZVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3BlbmRpbmctbWFwLWxvY2F0aW9uLWRhdGEtb3V0ZXIuYWN0aXZlXCIpIHx8XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI21hcC1jb250YWluZXIucGVuZGluZ1wiKVxuICAgICkge1xuICAgICAgcmV0dXJuIEV4cGxvcmF0aW9uU3RhdHVzLnBlbmRpbmdcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjdHJlYXN1cmUtaHVudC1yZXN1bHQtb3ZlcmxheS5hY3RpdmVcIikpXG4gICAgICByZXR1cm4gRXhwbG9yYXRpb25TdGF0dXMucmVzdWx0XG4gICAgcmV0dXJuIEV4cGxvcmF0aW9uU3RhdHVzLmlkbGVcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG93ZXN0RW5lcmd5TG9jYXRpb24oKTogQXV0b0V4cGxvcmVMb2NhdGlvbiB7XG4gICAgcmV0dXJuIExvY2FsU3RvcmFnZS5hdXRvRXhwbG9yZUxvY2F0aW9ucy5yZWR1Y2UoKGxvd2VzdCwgcGxhY2UpID0+XG4gICAgICBOdW1iZXIocGxhY2UubG9jYXRpb24uZW5lcmd5UmVxdWlyZWQpIDxcbiAgICAgIE51bWJlcihsb3dlc3QubG9jYXRpb24uZW5lcmd5UmVxdWlyZWQpXG4gICAgICAgID8gcGxhY2VcbiAgICAgICAgOiBsb3dlc3RcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdGVkTG9jYXRpb24oKTogQXV0b0V4cGxvcmVMb2NhdGlvbiB8IG51bGwge1xuICAgIGxldCBzZWxlY3RlZCA9IFNlc3Npb25TdG9yYWdlLnNlbGVjdGVkTG9jYXRpb25cbiAgICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgICBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0TG9jYXRpb24oKVxuICAgICAgU2Vzc2lvblN0b3JhZ2Uuc2VsZWN0ZWRMb2NhdGlvbiA9IHNlbGVjdGVkXG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdGVkXG4gIH1cblxuICBwcml2YXRlIHNlbGVjdExvY2F0aW9uKCk6IEF1dG9FeHBsb3JlTG9jYXRpb24gfCBudWxsIHtcbiAgICBjb25zdCBhZmZvcmRhYmxlID0gTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zLmZpbHRlcihcbiAgICAgIHNhdmVkID0+IE51bWJlcihzYXZlZC5sb2NhdGlvbi5lbmVyZ3lSZXF1aXJlZCkgPD0gcGV0RW5lcmd5XG4gICAgKVxuXG4gICAgY29uc3QgbWluaW11bUVuZXJneSA9IHRoaXMuZ2V0TG93ZXN0RW5lcmd5TG9jYXRpb24oKVxuICAgIGNvbnN0IG5vdERlYWRFbmQgPSBhZmZvcmRhYmxlLmZpbHRlcihcbiAgICAgIHBsYWNlID0+XG4gICAgICAgIHBldEVuZXJneSAtIE51bWJlcihwbGFjZS5sb2NhdGlvbi5lbmVyZ3lSZXF1aXJlZCkgPj1cbiAgICAgICAgTnVtYmVyKG1pbmltdW1FbmVyZ3kubG9jYXRpb24uZW5lcmd5UmVxdWlyZWQpXG4gICAgKVxuICAgIGlmIChub3REZWFkRW5kLmxlbmd0aClcbiAgICAgIHJldHVybiBub3REZWFkRW5kW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vdERlYWRFbmQubGVuZ3RoKV0gPz8gbnVsbFxuXG4gICAgY29uc3Qgc2FtZUVuZXJneSA9IGFmZm9yZGFibGUuZmlsdGVyKFxuICAgICAgcGxhY2UgPT4gTnVtYmVyKHBsYWNlLmxvY2F0aW9uLmVuZXJneVJlcXVpcmVkKSA9PT0gcGV0RW5lcmd5XG4gICAgKVxuICAgIGlmIChzYW1lRW5lcmd5Lmxlbmd0aClcbiAgICAgIHJldHVybiBzYW1lRW5lcmd5W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHNhbWVFbmVyZ3kubGVuZ3RoKV0gPz8gbnVsbFxuXG4gICAgcmV0dXJuIGFmZm9yZGFibGVbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYWZmb3JkYWJsZS5sZW5ndGgpXSA/PyBudWxsXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN0YXJ0RXhwbG9yYXRpb24oKTogUHJvbWlzZTxTdGFydEV4cGxvcmF0aW9uPiB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmdldFNlbGVjdGVkTG9jYXRpb24oKVxuICAgIGlmICghc2VsZWN0ZWQpIHJldHVybiB7IGV4cGxvcmluZzogZmFsc2UsIHNlbGVjdGVkIH1cbiAgICBDb25zb2xlLmluZm8oXCJFeHBsb3JpbmdcIiwgc2VsZWN0ZWQpXG5cbiAgICAvLyBHbyB0byBzZWFzb25cbiAgICBpZiAoXG4gICAgICBzZWxlY3RlZC5yZWdpb24uc2Vhc29uICYmXG4gICAgICB0aGlzLmdldEN1cnJlbnRTZWFzb24oKSAhPT0gc2VsZWN0ZWQucmVnaW9uLnNlYXNvblxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy5jbGlja1NlYXNvbigpXG4gICAgICByZXR1cm4geyBleHBsb3Jpbmc6IGZhbHNlLCBzZWxlY3RlZCB9XG4gICAgfVxuXG4gICAgLy8gR28gdG8gcmVnaW9uXG4gICAgYXdhaXQgdGhpcy5jbGlja1JlZ2lvbihzZWxlY3RlZClcblxuICAgIC8vIEdvIHRvIGxvY2F0aW9uXG4gICAgYXdhaXQgdGhpcy5jbGlja0xvY2F0aW9uKHNlbGVjdGVkKVxuICAgIGF3YWl0IHRoaXMuY2xpY2tFeHBsb3JlKClcblxuICAgIFNlc3Npb25TdG9yYWdlLnNlbGVjdGVkTG9jYXRpb24gPSBudWxsXG4gICAgcmV0dXJuIHsgZXhwbG9yaW5nOiB0cnVlLCBzZWxlY3RlZCB9XG4gIH1cblxuICAvKipcbiAgICogV2FpdCBmb3IgdXAgdG8gMTAgbWludXRlcy5cbiAgICogQHJldHVybnMgd2hldGhlciB0aGUgZXhwbG9yYXRpb24gaXMgZmluaXNoZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRFeHBsb3JhdGlvbihcbiAgICBzZWxlY3RlZD86IEF1dG9FeHBsb3JlTG9jYXRpb25cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcbiAgICAgICAgYC5taW5pbWFwW2RhdGEtbWFwaWQ9XCIke3NlbGVjdGVkPy5yZWdpb24uaWQgPz8gY3VycmVudFJlZ2lvbi5pZH1cIl1gXG4gICAgICApXG4gICAgICA/LmNsaWNrKClcblxuICAgIGxldCBtcyA9IDMgKiBEdXJhdGlvblVuaXQuc2Vjb25kXG4gICAgaWYgKHNlbGVjdGVkKSBtcyArPSBzZWxlY3RlZC5sb2NhdGlvbi50aW1lVG9FeHBsb3JlICogRHVyYXRpb25Vbml0Lm1pbnV0ZVxuICAgIGVsc2UgaWYgKHRpbWVMZWZ0RXhwbG9yYXRpb24gJiYgdGltZUxlZnRFeHBsb3JhdGlvbiA+IDApXG4gICAgICBtcyArPSB0aW1lTGVmdEV4cGxvcmF0aW9uICogRHVyYXRpb25Vbml0LnNlY29uZFxuICAgIGVsc2UgaWYgKFxuICAgICAgIXBlbmRpbmdUcmVhc3VyZUh1bnRMb2NhdGlvbiAmJlxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNtYXAtY29udGFpbmVyLnBlbmRpbmdcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCBleHBsb3JhdGlvblJlc3VsdHMoKVxuICAgICAgaWYgKGpzb24ucmVzdWx0ICE9PSBSZXN1bHQuc3VjY2VzcykgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGNvbnN0IGNhcHR1cmUgPSBqc29uLmRhdGEucmVzdWx0cy5maW5kKFxuICAgICAgICByZXN1bHQgPT4gcmVzdWx0LnR5cGUgPT09IFwiY2FwdHVyZVwiXG4gICAgICApXG4gICAgICBpZiAoIWNhcHR1cmUpIHJldHVybiBmYWxzZVxuICAgICAgYXdhaXQgY2FwdHVyZUVuZCgpXG5cbiAgICAgIC8vIFJlbG9hZGluZyBpcyB0aGUgb25seSBwb3NzaWJsZSBhY3Rpb24gaWYgdGhlIGV4cGxvcmF0aW9uIGZpbmlzaGVkIGluIGFcbiAgICAgIC8vIGRpZmZlcmVudCByZWdpb24uXG4gICAgICBDb25zb2xlLmVycm9yKFxuICAgICAgICBcIlJlbG9hZGluZyBiZWNhdXNlIHRoZSBleHBsb3JhdGlvbiBpcyBpbiBhbm90aGVyIHJlZ2lvbi5cIixcbiAgICAgICAgdGhpcy5nbG9iYWxzXG4gICAgICApXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgRHVyYXRpb25Vbml0Lm1pbnV0ZSkpXG4gICAgICBwYWdlTG9hZChcIi9wZXRcIilcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKG1zID4gMTAgKiBEdXJhdGlvblVuaXQubWludXRlKSByZXR1cm4gZmFsc2VcblxuICAgIENvbnNvbGUubG9nKFxuICAgICAgYFdhaXRpbmcgZm9yIHRoZSBleHBsb3JhdGlvbiB0byBlbmQgaW4gJHtNYXRoLmNlaWwoXG4gICAgICAgIG1zIC8gRHVyYXRpb25Vbml0LnNlY29uZFxuICAgICAgKX0gc2Vjb25kcy4uLmAsXG4gICAgICB0aGlzLmdsb2JhbHNcbiAgICApXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSlcbiAgICBhd2FpdCBjaGFuZ2VSZWdpb24oTnVtYmVyKHNlbGVjdGVkPy5yZWdpb24uaWQgPz8gY3VycmVudFJlZ2lvbi5pZCkpXG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmdldEV4cGxvcmF0aW9uU3RhdHVzKCkgPT09IEV4cGxvcmF0aW9uU3RhdHVzLnBlbmRpbmcgJiZcbiAgICAgIHRpbWVMZWZ0RXhwbG9yYXRpb24gJiZcbiAgICAgIHRpbWVMZWZ0RXhwbG9yYXRpb24gPCAwXG4gICAgKSB7XG4gICAgICBDb25zb2xlLmluZm8oXG4gICAgICAgIFwiUmVsb2FkaW5nIGJlY2F1c2UgdGhlIHRpbWVyIGlzIGRlc3luY2hyb25pc2VkLlwiLFxuICAgICAgICB0aGlzLmdsb2JhbHNcbiAgICAgIClcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBEdXJhdGlvblVuaXQuc2Vjb25kKSlcbiAgICAgIHBhZ2VMb2FkKFwiL3BldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IEV4cGxvcmF0aW9uQWN0aW9uKClcbiIsImltcG9ydCB7IENvbnNvbGUgfSBmcm9tIFwiLi4vLi4vY29uc29sZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB7IHBsYXlGbGFwcHksIHBsYXlIYXRjaGxpbmdzLCBwbGF5UGVnZ2xlIH0gZnJvbSBcIi4uLy4uL21pbmlnYW1lcy9lbWlsZVwiXG5pbXBvcnQgeyBmbGFwcHkgfSBmcm9tIFwiLi4vLi4vbWluaWdhbWVzL2ZsYXBweVwiXG5pbXBvcnQgeyBoYXRjaGxpbmdzIH0gZnJvbSBcIi4uLy4uL21pbmlnYW1lcy9oYXRjaGxpbmdzXCJcbmltcG9ydCB0eXBlIHsgTWluaWdhbWUgfSBmcm9tIFwiLi4vLi4vbWluaWdhbWVzL21pbmlnYW1lXCJcbmltcG9ydCB7IHBlZ2dsZSB9IGZyb20gXCIuLi8uLi9taW5pZ2FtZXMvcGVnZ2xlXCJcbmltcG9ydCB7IFNlc3Npb25TdG9yYWdlIH0gZnJvbSBcIi4uLy4uL3Nlc3Npb25fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VcIlxuaW1wb3J0IHsgVGFrZW92ZXJBY3Rpb24gfSBmcm9tIFwiLi4vLi4vc2Vzc2lvbl9zdG9yYWdlL3Rha2VvdmVyX2FjdGlvbi5lbnVtXCJcbmltcG9ydCB0eXBlIHsgQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9uXCJcblxuY2xhc3MgTWluaWdhbWVBY3Rpb24gaW1wbGVtZW50cyBBY3Rpb24ge1xuICByZWFkb25seSBrZXkgPSBUYWtlb3ZlckFjdGlvbi5taW5pZ2FtZXNcblxuICBjb25kaXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIExvY2FsU3RvcmFnZS5taW5pZ2FtZXMgJiYgIVNlc3Npb25TdG9yYWdlLm1pbmlnYW1lc0RvbmVcbiAgfVxuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIHRoZSBtaW5pZ2FtZXMgc2hvdWxkIGJlIHBsYXllZCByaWdodCBub3cuXG4gICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIG1pbmlnYW1lcyBhcmUgY3VycmVudGx5IGJlaW5nIHBsYXllZC5cbiAgICovXG4gIGFzeW5jIHBlcmZvcm0oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgc3dpdGNoIChsb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgY2FzZSBcIi9taW5pZ2FtZXNcIjoge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNzUwKSlcbiAgICAgICAgY29uc3QgcGxheWluZyA9XG4gICAgICAgICAgdGhpcy5vcGVuTWluaWdhbWUocGVnZ2xlKSB8fFxuICAgICAgICAgIHRoaXMub3Blbk1pbmlnYW1lKGZsYXBweSkgfHxcbiAgICAgICAgICB0aGlzLm9wZW5NaW5pZ2FtZShoYXRjaGxpbmdzKVxuXG4gICAgICAgIGlmICghcGxheWluZykge1xuICAgICAgICAgIFNlc3Npb25TdG9yYWdlLm1pbmlnYW1lc0RvbmUgPSB0cnVlXG4gICAgICAgICAgZG9jdW1lbnRcbiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxCdXR0b25FbGVtZW50PihcbiAgICAgICAgICAgICAgJy5taW5pZ2FtZXMtcnVsZXMgW3JlbD1cImJ0bi1jYW5jZWxcIl0nXG4gICAgICAgICAgICApXG4gICAgICAgICAgICA/LmNsaWNrKClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwbGF5aW5nXG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCIvbWluaWdhbWVzL2dlbWJvbWJcIjpcbiAgICAgICAgYXdhaXQgcGxheVBlZ2dsZSgpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgXCIvbWluaWdhbWVzL2J1YmJsdGVtcGxlXCI6XG4gICAgICAgIGF3YWl0IHBsYXlGbGFwcHkoKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFwiL21pbmlnYW1lcy9jb2Nvb25pbnBpY2tcIjpcbiAgICAgICAgYXdhaXQgcGxheUhhdGNobGluZ3MoKVxuICAgICAgICBicmVha1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBwYWdlTG9hZChcIi9taW5pZ2FtZXNcIilcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBwYWdlTG9hZChcIi9taW5pZ2FtZXNcIilcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIENsaWNrIG9uIGEgbWluaWdhbWUncyBsaW5rLiBAcmV0dXJucyB3aGV0aGVyIHRoZSBtaW5pZ2FtZSB3YXMgb3BlbmVkLiAqL1xuICBwcml2YXRlIG9wZW5NaW5pZ2FtZShtaW5pZ2FtZTogTWluaWdhbWUpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGFydCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTFNwYW5FbGVtZW50PihcbiAgICAgIG1pbmlnYW1lLmJ1dHRvblNlbGVjdG9yXG4gICAgKVxuXG4gICAgQ29uc29sZS5kZWJ1ZyhgJHttaW5pZ2FtZS5uYW1lfSdzIGJ1dHRvbjpgLCBzdGFydClcbiAgICBpZiAoIXN0YXJ0KSByZXR1cm4gZmFsc2VcblxuICAgIHN0YXJ0LmNsaWNrKClcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBNaW5pZ2FtZUFjdGlvbigpXG4iLCJpbXBvcnQgeyBDb25zb2xlIH0gZnJvbSBcIi4uLy4uL2NvbnNvbGVcIlxuaW1wb3J0IHsgVGFrZW92ZXJBY3Rpb24gfSBmcm9tIFwiLi4vLi4vc2Vzc2lvbl9zdG9yYWdlL3Rha2VvdmVyX2FjdGlvbi5lbnVtXCJcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuL2FjdGlvblwiXG5cbmNsYXNzIFdhaXRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24ge1xuICByZWFkb25seSBrZXkgPSBUYWtlb3ZlckFjdGlvbi53YWl0XG5cbiAgY29uZGl0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBhc3luYyBwZXJmb3JtKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIENvbnNvbGUubG9nKGBXYWl0aW5nIGZvciAxMCBtaW51dGVzLi4uYClcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihyZXNvbHZlID0+XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoZmFsc2UpLCAxMCAqIDYwICogMTAwMClcbiAgICApXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IFdhaXRBY3Rpb24oKVxuIiwiLyoqIENsaWNrIG9uIGFuIGVsZW1lbnQgYWZ0ZXIgd2FpdGluZyBmb3IgaXRzIHNlbGVjdG9yLCBob3ZlcmluZyBpdCBhbmQgd2FpdGluZ1xuICogZm9yIGl0cyBwb3RlbnRpYWwgYW5pbWF0aW9ucy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsaWNrPFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4oXG4gIHNlbGVjdG9yOiBzdHJpbmdcbik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8VD4ocmVzb2x2ZSA9PiB7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxUPihzZWxlY3RvcilcbiAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuXG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsKVxuICAgICAgdm9pZCBjbGlja0VsZW1lbnQoZWxlbWVudCkudGhlbigoKSA9PiByZXNvbHZlKGVsZW1lbnQpKVxuICAgIH0sIDgwMClcbiAgfSlcbn1cblxuLyoqIENsaWNrIG9uIGFuIGVsZW1lbnQgYWZ0ZXIgaG92ZXJpbmcgaXQgYW5kIHdhaXRpbmcgZm9yIHBvc3NpYmxlXG4gKiBhbmltYXRpb25zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xpY2tFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICAvLyBTb21lIGVsZW1lbnRzIGRvbid0IGhhdmUgdGhlaXIgY2xpY2sgaGFuZGxlcnMgcmVhZHkgdW50aWwgdGhleSdyZVxuICAgIC8vIGhvdmVyZWQuXG4gICAgY29uc3QgbW91c2VFdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiTW91c2VFdmVudFwiKVxuICAgIG1vdXNlRXZlbnQuaW5pdEV2ZW50KFwibW91c2VvdmVyXCIpXG4gICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG1vdXNlRXZlbnQpXG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGVsZW1lbnQuY2xpY2soKVxuICAgICAgcmVzb2x2ZSgpXG4gICAgfSwgODAwKVxuICB9KVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdDxUIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KFxuICBzZWxlY3Rvcjogc3RyaW5nXG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KHJlc29sdmUgPT4ge1xuICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8VD4oc2VsZWN0b3IpXG4gICAgICBpZiAoIWVsZW1lbnQpIHJldHVyblxuXG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsKVxuICAgICAgcmVzb2x2ZShlbGVtZW50KVxuICAgIH0sIDgwMClcbiAgfSlcbn1cblxuLyoqXG4gKiBVc2VzIGEgYE11dGF0aW9uT2JzZXJ2ZXJgIHRvIHdhaXQgZm9yIGFuIGBIVE1MRWxlbWVudGAgaW5zaWRlIGFub3RoZXJcbiAqIGBIVE1MRWxlbWVudGAuIFRpbWVvdXRzIGFmdGVyIDJzIGJ5IGRlZmF1bHQsIGF0IHdoaWNoIHBvaW50IHRoZXJlJ3MgcHJvYmFibHlcbiAqIGEgZGVlcGVyIHByb2JsZW0gZ29pbmcgb24uXG4gKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgdG8gb2JzZXJ2ZSBhbmQgZmluZCB0aGUgYEhUTUxFbGVtZW50YCBpblxuICogQHBhcmFtIHNlbGVjdG9yIFRoZSBhcmd1bWVudCBmb3IgYGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yPFQ+KHNlbGVjdG9yKWBcbiAqIEByZXR1cm5zIFRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgYSBkZXNjZW5kYW50IG9mIGBjb250YWluZXJgIHRoYXQgbWF0Y2hlc1xuICogYHNlbGVjdG9yYCBvciBgbnVsbGAgYWZ0ZXIgdGhlIGB0aW1lb3V0YCBkZWxheS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRPYnNlcnZlPFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4oXG4gIGNvbnRhaW5lcjogRWxlbWVudCxcbiAgc2VsZWN0b3I6IHN0cmluZyxcbiAgbXMgPSAyMDAwXG4pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUIHwgbnVsbD4ocmVzb2x2ZSA9PiB7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihcbiAgICAgIChfbXV0YXRpb25zOiBNdXRhdGlvblJlY29yZFtdLCBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcikgPT5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yPFQ+KHNlbGVjdG9yKVxuICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICAgICAgICAgIHJlc29sdmUoZWxlbWVudClcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEpXG4gICAgKVxuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIsIHsgY2hpbGRMaXN0OiB0cnVlIH0pXG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgICAgcmVzb2x2ZShjb250YWluZXIucXVlcnlTZWxlY3RvcjxUPihzZWxlY3RvcikpXG4gICAgfSwgbXMpXG4gIH0pXG5cbiAgcmV0dXJuIHByb21pc2Vcbn1cbiIsImV4cG9ydCBlbnVtIEV4cGxvcmF0aW9uU3RhdHVzIHtcbiAgaWRsZSxcbiAgcmVzdWx0LFxuICBjYXB0dXJlLFxuICBwZW5kaW5nLFxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzRW51bTxUIGV4dGVuZHMgUmVjb3JkPG51bWJlciB8IHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4+KFxuICB2YWx1ZTogdW5rbm93bixcbiAgZW51bWVyYXRpb246IFRcbik6IHZhbHVlIGlzIFRba2V5b2YgVF0ge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhlbnVtZXJhdGlvbikuaW5jbHVkZXModmFsdWUpXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB0eXBlIHsgTWFya2V0SGlzdG9yeSB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9tYXJrZXRfaGlzdG9yeVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQXVjdGlvbnMoKTogdm9pZCB7XG4gIGlmIChsb2NhdGlvbi5wYXRobmFtZSAhPT0gXCIvbWFya2V0cGxhY2UvYXVjdGlvbnNcIikgcmV0dXJuXG5cbiAgY29uc3QgbWFya2V0cGxhY2VBY3RpdmVBdWN0aW9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFxuICAgIFwiI21hcmtldHBsYWNlLWFjdGl2ZS1hdWN0aW9uc1wiXG4gIClcbiAgaWYgKCFtYXJrZXRwbGFjZUFjdGl2ZUF1Y3Rpb25zKSByZXR1cm5cblxuICBjb25zdCBsYXlvdXQyY29sID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgXCIubWFya2V0cGxhY2UtbWFpbi1jb250YWluZXIgI2xheW91dC0yY29sXCJcbiAgKVxuICBpZiAobGF5b3V0MmNvbCkgbGF5b3V0MmNvbC5zdHlsZS5vdmVyZmxvd1ggPSBcInZpc2libGVcIlxuXG4gIGxvYWRIaXN0b3J5KG1hcmtldHBsYWNlQWN0aXZlQXVjdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGxvYWRIaXN0b3J5KG1hcmtldHBsYWNlQWN0aXZlQXVjdGlvbnM6IEhUTUxEaXZFbGVtZW50KTogdm9pZCB7XG4gIG1hcmtldHBsYWNlQWN0aXZlQXVjdGlvbnMucXVlcnlTZWxlY3RvcihcInN0eWxlXCIpPy5yZW1vdmUoKVxuICBtYXJrZXRwbGFjZUFjdGl2ZUF1Y3Rpb25zLnF1ZXJ5U2VsZWN0b3IoXCIjcHVyY2hhc2UtaGlzdG9yeVwiKT8ucmVtb3ZlKClcbiAgbWFya2V0cGxhY2VBY3RpdmVBdWN0aW9ucy5xdWVyeVNlbGVjdG9yKFwiI3NhbGUtaGlzdG9yeVwiKT8ucmVtb3ZlKClcblxuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvbWFya2V0X2hpc3RvcnkuaHRtbFwiKVxuICBjb25zdCBoaXN0b3J5OiBNYXJrZXRIaXN0b3J5ID0ge1xuICAgIHB1cmNoYXNlczogTG9jYWxTdG9yYWdlLnB1cmNoYXNlcy5tYXAocHVyY2hhc2UgPT4gKHtcbiAgICAgIC4uLnB1cmNoYXNlLFxuICAgICAgZGF0ZTogdHJhbnNsYXRlLm1hcmtldC5hdWN0aW9ucy5kYXRlX3RpbWVfZm9ybWF0LmZvcm1hdChcbiAgICAgICAgbmV3IERhdGUocHVyY2hhc2UuZGF0ZSlcbiAgICAgICksXG4gICAgfSkpLFxuICAgIHNhbGVzOiBMb2NhbFN0b3JhZ2Uuc2FsZXMubWFwKHNhbGUgPT4gKHtcbiAgICAgIC4uLnNhbGUsXG4gICAgICBkYXRlOiB0cmFuc2xhdGUubWFya2V0LmF1Y3Rpb25zLmRhdGVfdGltZV9mb3JtYXQuZm9ybWF0KFxuICAgICAgICBuZXcgRGF0ZShzYWxlLmRhdGUpXG4gICAgICApLFxuICAgIH0pKSxcbiAgfVxuXG4gIG1hcmtldHBsYWNlQWN0aXZlQXVjdGlvbnMuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgdGVtcGxhdGUucmVuZGVyKHsgLi4uaGlzdG9yeSwgdHJhbnNsYXRlIH0pXG4gIClcblxuICBmb3IgKGNvbnN0IHB1cmNoYXNlIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTExJRWxlbWVudD4oXG4gICAgXCIjcHVyY2hhc2UtaGlzdG9yeSAubWFya2V0cGxhY2UtYXVjdGlvbnMtaXRlbVwiXG4gICkpIHtcbiAgICBjb25zdCBpdGVtaWQgPSBwdXJjaGFzZS5kYXRhc2V0Lml0ZW1pZFxuICAgIHB1cmNoYXNlLnF1ZXJ5U2VsZWN0b3IoXCIuZGVsZXRlLWJ1dHRvblwiKT8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIExvY2FsU3RvcmFnZS5wdXJjaGFzZXMgPSBMb2NhbFN0b3JhZ2UucHVyY2hhc2VzLmZpbHRlcihcbiAgICAgICAgcHVyY2hhc2UgPT4gcHVyY2hhc2UuaXRlbWlkICE9PSBpdGVtaWRcbiAgICAgIClcblxuICAgICAgbG9hZEhpc3RvcnkobWFya2V0cGxhY2VBY3RpdmVBdWN0aW9ucylcbiAgICB9KVxuICB9XG5cbiAgZm9yIChjb25zdCBzYWxlIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTExJRWxlbWVudD4oXG4gICAgXCIjc2FsZS1oaXN0b3J5IC5tYXJrZXRwbGFjZS1zYWxlcy1pdGVtXCJcbiAgKSkge1xuICAgIGNvbnN0IGljb24gPSBzYWxlLnF1ZXJ5U2VsZWN0b3I8SFRNTEltYWdlRWxlbWVudD4oXCIuYWJzdHJhY3QtaWNvbiBpbWdcIik/LnNyY1xuICAgIHNhbGUucXVlcnlTZWxlY3RvcihcIi5kZWxldGUtYnV0dG9uXCIpPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgTG9jYWxTdG9yYWdlLnNhbGVzID0gTG9jYWxTdG9yYWdlLnNhbGVzLmZpbHRlcihzYWxlID0+IHNhbGUuaWNvbiAhPT0gaWNvbilcblxuICAgICAgbG9hZEhpc3RvcnkobWFya2V0cGxhY2VBY3RpdmVBdWN0aW9ucylcbiAgICB9KVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IGNhcm91c2VsQmVlbW9vdkFubm95YW5jZXMgfSBmcm9tIFwiLi4vY2Fyb3VzZWwvY2Fyb3VzZWxfYmVlbW9vdl9hbm5veWFuY2VzXCJcbmltcG9ydCB7IGNhcm91c2VsRG93bmxvYWRGYWNlIH0gZnJvbSBcIi4uL2Nhcm91c2VsL2Nhcm91c2VsX2Rvd25sb2FkX2ZhY2VcIlxuaW1wb3J0IHsgY2Fyb3VzZWxEb3dubG9hZEd1YXJkaWFuIH0gZnJvbSBcIi4uL2Nhcm91c2VsL2Nhcm91c2VsX2Rvd25sb2FkX2d1YXJkaWFuXCJcbmltcG9ydCB7IGNhcm91c2VsRUUgfSBmcm9tIFwiLi4vY2Fyb3VzZWwvY2Fyb3VzZWxfZWxkYXJ5YV9lbmhhbmNlbWVudHNcIlxuaW1wb3J0IHsgY2Fyb3VzZWxUYWtlb3ZlciB9IGZyb20gXCIuLi9jYXJvdXNlbC9jYXJvdXNlbF90YWtlb3ZlclwiXG5pbXBvcnQgeyBkb3dubG9hZEZhY2UsIGRvd25sb2FkR3VhcmRpYW4gfSBmcm9tIFwiLi4vZG93bmxvYWQtY2FudmFzXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB7IFNlc3Npb25TdG9yYWdlIH0gZnJvbSBcIi4uL3Nlc3Npb25fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VcIlxuaW1wb3J0IHsgdG9nZ2xlVGFrZW92ZXIgfSBmcm9tIFwiLi4vdGFrZW92ZXIvYnJhaW5cIlxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZENhcm91c2VsKCk6IHZvaWQge1xuICBjb25zdCBjYXJvdXNlbElubmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjYXJvdXNlbC1pbm5lclwiKVxuICBpZiAoIWNhcm91c2VsSW5uZXIgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5jYXJvdXNlbC1lZVwiKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gSW1wb3J0IGNhcm91c2VsIHRlbXBsYXRlXG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9jYXJvdXNlbF9uZXdzLmh0bWxcIilcblxuICBjb25zdCBjb250ZXh0cyA9IFtcbiAgICAvLyBJbnRyb1xuICAgIGNhcm91c2VsRUUsXG5cbiAgICAvLyBGZWF0dXJlc1xuICAgIC4uLigoTG9jYWxTdG9yYWdlLm1pbmlnYW1lcyB8fFxuICAgICAgTG9jYWxTdG9yYWdlLmV4cGxvcmF0aW9ucyB8fFxuICAgICAgTG9jYWxTdG9yYWdlLm1hcmtldCkgJiZcbiAgICBMb2NhbFN0b3JhZ2UudW5sb2NrZWRcbiAgICAgID8gW2Nhcm91c2VsVGFrZW92ZXJdXG4gICAgICA6IFtdKSxcbiAgICBjYXJvdXNlbERvd25sb2FkR3VhcmRpYW4sXG4gICAgY2Fyb3VzZWxEb3dubG9hZEZhY2UsXG5cbiAgICAvLyBBZHNcbiAgICBjYXJvdXNlbEJlZW1vb3ZBbm5veWFuY2VzLFxuICBdXG5cbiAgLy8gQWRkIGVudHJpZXMgdG8gdGhlIGNhcm91c2VsXG4gIGNhcm91c2VsSW5uZXIuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgY29udGV4dHMubWFwKGJhbm5lciA9PiB0ZW1wbGF0ZS5yZW5kZXIoYmFubmVyKSkuam9pbihcIlxcblwiKVxuICApXG5cbiAgLy8gQWRkIGxpbmtzXG4gIGZvciAoY29uc3QgY2Fyb3VzZWwgb2YgY29udGV4dHMpIHtcbiAgICBpZiAoIWNhcm91c2VsLmhyZWYpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBlbGVtZW50ID0gY2Fyb3VzZWxJbm5lci5xdWVyeVNlbGVjdG9yKGAjJHtjYXJvdXNlbC5pZH1gKVxuICAgIGlmICghZWxlbWVudCkgY29udGludWVcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImFjdGl2ZVwiKSkgb3BlbihjYXJvdXNlbC5ocmVmLCBcIl9ibGFua1wiKVxuICAgIH0pXG4gIH1cblxuICAvLyBBZGQgY2xpY2sgZXZlbnRzXG5cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoY2Fyb3VzZWxEb3dubG9hZEZhY2UuaWQpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZG93bmxvYWRGYWNlKVxuXG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKGNhcm91c2VsRG93bmxvYWRHdWFyZGlhbi5pZClcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBkb3dubG9hZEd1YXJkaWFuKVxuXG4gIGNvbnN0IHRha2VvdmVyQW5jaG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2Fyb3VzZWxUYWtlb3Zlci5pZClcbiAgdGFrZW92ZXJBbmNob3I/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgdG9nZ2xlVGFrZW92ZXIoKVxuICAgIHRha2VvdmVyVGl0bGUodGFrZW92ZXJBbmNob3IpXG4gIH0pXG5cbiAgaWYgKHRha2VvdmVyQW5jaG9yKSB0YWtlb3ZlclRpdGxlKHRha2VvdmVyQW5jaG9yKVxufVxuXG5mdW5jdGlvbiB0YWtlb3ZlclRpdGxlKHRha2VvdmVyQW5jaG9yOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICBjb25zdCB0YWtlb3Zlckg0ID0gdGFrZW92ZXJBbmNob3IucXVlcnlTZWxlY3RvcihcImg0XCIpXG4gIGlmICh0YWtlb3Zlckg0KSB7XG4gICAgdGFrZW92ZXJINC5pbm5lclRleHQgPSBTZXNzaW9uU3RvcmFnZS50YWtlb3ZlclxuICAgICAgPyB0cmFuc2xhdGUuY2Fyb3VzZWwudGFrZW92ZXIuZGlzYWJsZV90YWtlb3ZlclxuICAgICAgOiB0cmFuc2xhdGUuY2Fyb3VzZWwudGFrZW92ZXIuZW5hYmxlX3Rha2VvdmVyXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgc2F2ZUZhdm91cml0ZSwgc2hvd0Zhdm91cml0ZSB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL2Zha2VfZmF2b3VyaXRlc1wiXG5pbXBvcnQgeyBleHBvcnRQcmV2aWV3LCBpbXBvcnRPdXRmaXQgfSBmcm9tIFwiLi4vYXBwZWFyYW5jZS9mYXZvdXJpdGVzX2FjdGlvbnNcIlxuaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi9jb25zb2xlXCJcbmltcG9ydCB7IGRvd25sb2FkQXBwZWFyYW5jZSB9IGZyb20gXCIuLi9kb3dubG9hZC1jYW52YXNcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCBpbmRleGVkX2RiIGZyb20gXCIuLi9pbmRleGVkX2RiL2luZGV4ZWRfZGJcIlxuaW1wb3J0IHsgd2FpdE9ic2VydmUgfSBmcm9tIFwiLi4vdGFrZW92ZXIvY2xpY2tcIlxuaW1wb3J0IHR5cGUgeyBGYXZvdXJpdGVzQWN0aW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2Zhdm91cml0ZXNfYWN0aW9uXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGYXZvdXJpdGVzKCk6IHZvaWQge1xuICBpZiAoIWxvY2F0aW9uLnBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvcGxheWVyL2FwcGVhcmFuY2UvZmF2b3JpdGVzXCIpKSByZXR1cm5cblxuICBsb2FkRmF2b3VyaXRlc0FjdGlvbnMoKVxuICB2b2lkIGxvYWRGYWtlRmF2b3VyaXRlcygpXG59XG5cbmZ1bmN0aW9uIGxvYWRGYXZvdXJpdGVzQWN0aW9ucygpOiB2b2lkIHtcbiAgY29uc3QgYWN0aW9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZmF2b3JpdGVzLWFjdGlvbnNcIilcbiAgaWYgKCFhY3Rpb25zIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZmF2b3JpdGVzLWFjdGlvbi1lZVwiKSkgcmV0dXJuXG5cbiAgY29uc3QgYWN0aW9uVGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2Zhdm91cml0ZXNfYWN0aW9uLmh0bWxcIilcblxuICBjb25zdCBpbXBvcnRBY3Rpb246IEZhdm91cml0ZXNBY3Rpb24gPSB7XG4gICAgaWQ6IFwiaW1wb3J0LW91dGZpdFwiLFxuICAgIHRleHQ6IHRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuYnV0dG9ucy5pbXBvcnQsXG4gIH1cbiAgY29uc3QgZXhwb3J0QWN0aW9uOiBGYXZvdXJpdGVzQWN0aW9uID0ge1xuICAgIGlkOiBcImV4cG9ydC1vdXRmaXRcIixcbiAgICB0ZXh0OiB0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLmJ1dHRvbnMuZXhwb3J0LFxuICB9XG4gIGNvbnN0IGRvd25sb2FkQWN0aW9uOiBGYXZvdXJpdGVzQWN0aW9uID0ge1xuICAgIGlkOiBcImRvd25sb2FkLW91dGZpdFwiLFxuICAgIHRleHQ6IHRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuYnV0dG9ucy5kb3dubG9hZCxcbiAgfVxuXG4gIGFjdGlvbnMuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgYWN0aW9uVGVtcGxhdGUucmVuZGVyKGltcG9ydEFjdGlvbikgK1xuICAgICAgYWN0aW9uVGVtcGxhdGUucmVuZGVyKGV4cG9ydEFjdGlvbikgK1xuICAgICAgYWN0aW9uVGVtcGxhdGUucmVuZGVyKGRvd25sb2FkQWN0aW9uKVxuICApXG5cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoaW1wb3J0QWN0aW9uLmlkKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGltcG9ydE91dGZpdClcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChleHBvcnRBY3Rpb24uaWQpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZXhwb3J0UHJldmlldylcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChkb3dubG9hZEFjdGlvbi5pZClcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBkb3dubG9hZEFwcGVhcmFuY2UpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkRmFrZUZhdm91cml0ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFwcGVhcmFuY2VJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwZWFyYW5jZS1pdGVtc1wiKVxuICBpZiAoIWFwcGVhcmFuY2VJdGVtcykge1xuICAgIENvbnNvbGUuZXJyb3IoXCJDb3VsZG4ndCBhY2Nlc3MgI2FwcGVhcmFuY2UtaXRlbXNcIiwgYXBwZWFyYW5jZUl0ZW1zKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdGh1bWJzID0gYXdhaXQgd2FpdE9ic2VydmUoXG4gICAgYXBwZWFyYW5jZUl0ZW1zLFxuICAgIFwiI2FsbC1vdXRmaXQtdGh1bWJzIC5tQ1NCX2NvbnRhaW5lclwiLFxuICAgIDMwMDBcbiAgKVxuICBpZiAoIXRodW1icykge1xuICAgIENvbnNvbGUuZXJyb3IoXCJDb3VsZG4ndCBhY2Nlc3MgI2FsbC1vdXRmaXQtdGh1bWJzXCIsIHRodW1icylcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9vdXRmaXRfdGh1bWJzLmh0bWxcIilcblxuICBjb25zdCBmYXZvdXJpdGVzID0gYXdhaXQgaW5kZXhlZF9kYi5nZXRGYXZvdXJpdGVPdXRmaXRzKClcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2VlLW91dGZpdC10aHVtYnNcIik/LnJlbW92ZSgpXG4gIHRodW1icy5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgXCJiZWZvcmVlbmRcIixcbiAgICB0ZW1wbGF0ZS5yZW5kZXIoeyBvdXRmaXRzOiBmYXZvdXJpdGVzIH0pXG4gIClcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwiLmVlLWF2YWlsYWJsZS1zbG90XCIpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCk6IHZvaWQgPT4gdm9pZCBzYXZlRmF2b3VyaXRlKCkpXG5cbiAgZm9yIChjb25zdCBkaXYgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRGl2RWxlbWVudD4oXG4gICAgXCIuZWUtb3V0Zml0LXRodW1iXCJcbiAgKSkge1xuICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZmF2b3VyaXRlID0gZmF2b3VyaXRlcy5maW5kKFxuICAgICAgICBmYXZvdXJpdGUgPT4gZmF2b3VyaXRlLmlkID09PSBOdW1iZXIoZGl2LmRhdGFzZXQuYXJyYXlJbmRleClcbiAgICAgIClcbiAgICAgIGlmICghZmF2b3VyaXRlKSByZXR1cm5cblxuICAgICAgc2hvd0Zhdm91cml0ZShmYXZvdXJpdGUpXG4gICAgfSlcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHR5cGUgeyBIb21lQ29udGVudFNtYWxsIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2hvbWVfY29udGVudF9zbWFsbFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkSG9tZUNvbnRlbnQoKTogdm9pZCB7XG4gIGNvbnN0IGhvbWVDb250ZW50U21hbGxzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJob21lLWNvbnRlbnQtc21hbGxzXCIpXG4gIGlmIChcbiAgICAhaG9tZUNvbnRlbnRTbWFsbHMgfHxcbiAgICBob21lQ29udGVudFNtYWxscy5xdWVyeVNlbGVjdG9yKFwiLmhvbWUtY29udGVudC1zbWFsbC1lZVwiKVxuICApXG4gICAgcmV0dXJuXG5cbiAgLy8gUmVtb3ZlIGJhbmtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJob21lLWJhbmtcIik/LnJlbW92ZSgpXG5cbiAgLy8gQWRkIGZvcnVtXG4gIGNvbnN0IHNtYWxsVGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2hvbWVfY29udGVudF9zbWFsbC5odG1sXCIpXG4gIGNvbnN0IHNtYWxsQ29udGVudDogSG9tZUNvbnRlbnRTbWFsbCA9IHtcbiAgICBiYWNrZ3JvdW5kSW1hZ2U6XG4gICAgICBcIi9hc3NldHMvaW1nL21pbmlnYW1lcy90cmVhc3VyZWh1bnQvYTQ4YmJjNGU0ODQ5NzQ1ZWJlNmRiY2Y1MzEzZWIzZjAuanBnXCIsXG4gICAgaDQ6IHRyYW5zbGF0ZS5ob21lLmZvcnVtLFxuICAgIGhyZWY6IFwiL2ZvcnVtXCIsXG4gICAgaWQ6IFwiZm9ydW1cIixcbiAgfVxuXG4gIGhvbWVDb250ZW50U21hbGxzLmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIHNtYWxsVGVtcGxhdGUucmVuZGVyKHNtYWxsQ29udGVudClcbiAgKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyB0cmltSWNvbiB9IGZyb20gXCIuLi9lbGRhcnlhX3V0aWxcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuaW1wb3J0IHR5cGUgeyBXaXNoZWRJdGVtIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2Uvd2lzaGVkX2l0ZW1cIlxuaW1wb3J0IHR5cGUgeyBEYXRhUHJvZHVjdCB9IGZyb20gXCIuLi9tYWxsL2RhdGFfcHJvZHVjdFwiXG5pbXBvcnQgdHlwZSB7IE1hbGxFbnRyeSB9IGZyb20gXCIuLi9tYWxsL21hbGxfZW50cnlcIlxuaW1wb3J0IHsgUmFyaXR5IH0gZnJvbSBcIi4uL21hcmtldHBsYWNlL2VudW1zL3Jhcml0eS5lbnVtXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRNYWxsKCk6IHZvaWQge1xuICBpZiAoIWxvY2F0aW9uLnBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvbWFsbFwiKSkgcmV0dXJuXG5cbiAgZm9yIChjb25zdCBsaSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxMSUVsZW1lbnQ+KFwiW2RhdGEtcHJvZHVjdF1cIikpXG4gICAgbGkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IGFkZFdpc2hsaXN0QnV0dG9uKGxpKSlcbn1cblxuZnVuY3Rpb24gYWRkV2lzaGxpc3RCdXR0b24obGk6IEhUTUxMSUVsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhZGQtdG8td2lzaGxpc3RcIik/LnJlbW92ZSgpXG5cbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIiNtYWxsLXByb2R1Y3REZXRhaWwtaW5mb1wiKVxuICAgID8uaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgICAgXCJiZWZvcmVlbmRcIixcbiAgICAgIFwiPGJ1dHRvbiBpZD0nYWRkLXRvLXdpc2hsaXN0JyBjbGFzcz0nbmwtYnV0dG9uJyBzdHlsZT0nbWFyZ2luOiAyMHB4IGF1dG8gMDsgbWluLXdpZHRoOiAyMDBweDsnPkFkZCB0byBtYXJrZXQgd2lzaGxpc3Q8L2J1dHRvbj5cIlxuICAgIClcblxuICBjb25zdCBtYXhRdWFudGl0eSA9IGxpLnF1ZXJ5U2VsZWN0b3I8SFRNTFNwYW5FbGVtZW50PihcIi5pdGVtLW1heFF1YW50aXR5XCIpXG5cbiAgY29uc3QgbWFsbEVudHJ5OiBNYWxsRW50cnkgPSB7XG4gICAgcHJvZHVjdDogSlNPTi5wYXJzZShsaS5kYXRhc2V0LnByb2R1Y3QhKSBhcyBEYXRhUHJvZHVjdCxcbiAgICBpY29uOiB0cmltSWNvbihcbiAgICAgIGxpLnF1ZXJ5U2VsZWN0b3I8SFRNTEltYWdlRWxlbWVudD4oXCJpbWcubWFsbC1wcm9kdWN0LWljb25cIikhLnNyY1xuICAgICksXG4gICAgcmFyaXR5OlxuICAgICAgUmFyaXR5W1xuICAgICAgICAobGlcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgIFwiLnJhcml0eS1tYXJrZXItY29tbW9uLCAucmFyaXR5LW1hcmtlci1yYXJlLCAucmFyaXR5LW1hcmtlci1lcGljLCAucmFyaXR5LW1hcmtlci1sZWdlbmRhcnksIC5yYXJpdHktbWFya2VyLWV2ZW50XCJcbiAgICAgICAgICApXG4gICAgICAgICAgPy5jbGFzc05hbWUuc3BsaXQoXCJyYXJpdHktbWFya2VyLVwiKVsxXSA/PyBcIlwiKSBhcyBrZXlvZiB0eXBlb2YgUmFyaXR5XG4gICAgICBdLFxuICAgIG1heFF1YW50aXR5OiBtYXhRdWFudGl0eSA/IE51bWJlcihtYXhRdWFudGl0eS5pbm5lclRleHQpIDogdW5kZWZpbmVkLFxuICAgIGFic3RyYWN0VHlwZTpcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFxuICAgICAgICBcIiNtYWxsLW1lbnUgLnRvb2x0aXAuYWN0aXZlIC50b29sdGlwLWNvbnRlbnRcIlxuICAgICAgKT8uaW5uZXJUZXh0ID8/IFwiXCIsXG4gIH1cblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwiI2FkZC10by13aXNobGlzdFwiKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IGFkZFRvV2lzaGxpc3RGbGF2cihtYWxsRW50cnkpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkVG9XaXNobGlzdEZsYXZyKG1hbGxFbnRyeTogTWFsbEVudHJ5KTogdm9pZCB7XG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9hdXRvX2J1eV9mbGF2cl9tYWxsLmh0bWxcIilcblxuICAkLmZsYXZyKHtcbiAgICBjb250ZW50OiB0ZW1wbGF0ZS5yZW5kZXIoeyB0cmFuc2xhdGUgfSksXG4gICAgYnV0dG9uczoge1xuICAgICAgY2xvc2U6IHsgc3R5bGU6IFwiY2xvc2VcIiB9LFxuICAgICAgc2F2ZToge1xuICAgICAgICBhY3Rpb246ICgpID0+IHNhdmUobWFsbEVudHJ5KSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkaWFsb2c6IFwicHJvbXB0XCIsXG4gICAgcHJvbXB0OiB7XG4gICAgICB2YWx1ZTogXCJcIixcbiAgICB9LFxuICAgIG9uQnVpbGQ6ICRjb250YWluZXIgPT4ge1xuICAgICAgJGNvbnRhaW5lci5hZGRDbGFzcyhcIm5ldy1sYXlvdXQtcG9wdXBcIilcblxuICAgICAgZG9jdW1lbnRcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oXCIuZmxhdnItcHJvbXB0XCIpXG4gICAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsICh7IGtleSB9KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSAhPT0gXCJFbnRlclwiKSByZXR1cm5cbiAgICAgICAgICBzYXZlKG1hbGxFbnRyeSlcbiAgICAgICAgfSlcbiAgICB9LFxuICB9KVxufVxuXG5mdW5jdGlvbiBzYXZlKG1hbGxFbnRyeTogTWFsbEVudHJ5KTogYm9vbGVhbiB7XG4gIGNvbnN0IHByaWNlID0gTnVtYmVyKFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oXCIuZmxhdnItcHJvbXB0XCIpPy52YWx1ZS50cmltKClcbiAgKVxuICBpZiAoIXByaWNlIHx8IHByaWNlIDw9IDApIHtcbiAgICAkLmZsYXZyTm90aWYodHJhbnNsYXRlLm1hcmtldC5hZGRfdG9fd2lzaGxpc3QuaW52YWxpZF9wcmljZSlcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IHdpc2hsaXN0ID0gTG9jYWxTdG9yYWdlLndpc2hsaXN0LmZpbHRlcihcbiAgICB3aXNobGlzdEVudHJ5ID0+IHdpc2hsaXN0RW50cnkuaWNvbiAhPT0gbWFsbEVudHJ5Lmljb25cbiAgKVxuICBjb25zdCB3aXNoZWQ6IFdpc2hlZEl0ZW0gPSB7XG4gICAgLi4ubWFsbEVudHJ5LFxuICAgIC4uLm1hbGxFbnRyeS5wcm9kdWN0LFxuICAgIHByaWNlLFxuICB9XG4gIHdpc2hsaXN0LnB1c2god2lzaGVkKVxuXG4gIHdpc2hsaXN0LnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCB0eXBlQ29tcGFyZSA9IGEudHlwZS5sb2NhbGVDb21wYXJlKGIudHlwZSlcbiAgICBpZiAodHlwZUNvbXBhcmUgIT09IDApIHJldHVybiB0eXBlQ29tcGFyZVxuXG4gICAgY29uc3QgYWJzdHJhY3RUeXBlQ29tcGFyZSA9IChhLmFic3RyYWN0VHlwZSA/PyBcIlwiKS5sb2NhbGVDb21wYXJlKFxuICAgICAgYi5hYnN0cmFjdFR5cGUgPz8gXCJcIlxuICAgIClcbiAgICBpZiAoYWJzdHJhY3RUeXBlQ29tcGFyZSAhPT0gMCkgcmV0dXJuIGFic3RyYWN0VHlwZUNvbXBhcmVcblxuICAgIGNvbnN0IHJhcml0eUNvbXBhcmUgPVxuICAgICAgT2JqZWN0LmtleXMoUmFyaXR5KS5pbmRleE9mKGEucmFyaXR5ID8/IFwiXCIpIC1cbiAgICAgIE9iamVjdC5rZXlzKFJhcml0eSkuaW5kZXhPZihiLnJhcml0eSA/PyBcIlwiKVxuICAgIGlmIChyYXJpdHlDb21wYXJlICE9PSAwKSByZXR1cm4gcmFyaXR5Q29tcGFyZVxuXG4gICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSlcbiAgfSlcblxuICBMb2NhbFN0b3JhZ2Uud2lzaGxpc3QgPSB3aXNobGlzdFxuXG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9mbGF2cl9ub3RpZi9pY29uX21lc3NhZ2UuaHRtbFwiKVxuICAkLmZsYXZyTm90aWYoXG4gICAgdGVtcGxhdGUucmVuZGVyKHtcbiAgICAgIC4uLndpc2hlZCxcbiAgICAgIG1lc3NhZ2U6IHRyYW5zbGF0ZS5tYXJrZXQuYWRkX3RvX3dpc2hsaXN0LmFkZGVkX3RvX3dpc2hsaXN0KFxuICAgICAgICB3aXNoZWQubmFtZSxcbiAgICAgICAgd2lzaGVkLnByaWNlXG4gICAgICApLFxuICAgIH0pXG4gIClcbiAgcmV0dXJuIHRydWVcbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuaW1wb3J0IHR5cGUgeyBXaXNoZWRJdGVtIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2Uvd2lzaGVkX2l0ZW1cIlxuaW1wb3J0IHsgUmFyaXR5IH0gZnJvbSBcIi4uL21hcmtldHBsYWNlL2VudW1zL3Jhcml0eS5lbnVtXCJcbmltcG9ydCB0eXBlIHsgTWFya2V0RW50cnkgfSBmcm9tIFwiLi4vbWFya2V0cGxhY2UvaW50ZXJmYWNlcy9tYXJrZXRfZW50cnlcIlxuaW1wb3J0IHsgZ2V0SXRlbURldGFpbHMgfSBmcm9tIFwiLi4vbWFya2V0cGxhY2UvbWFya2V0cGxhY2VfaGFuZGxlcnNcIlxuXG5sZXQgbWFya2V0T2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXIgfCBudWxsXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTWFya2V0KCk6IHZvaWQge1xuICBtYXJrZXRPYnNlcnZlcj8uZGlzY29ubmVjdCgpXG4gIG1hcmtldE9ic2VydmVyID0gbnVsbFxuXG4gIGlmIChsb2NhdGlvbi5wYXRobmFtZSAhPT0gXCIvbWFya2V0cGxhY2VcIikgcmV0dXJuXG5cbiAgLy8gYC5tYXJrZXRwbGFjZS1zZWFyY2gtaXRlbXNgIGlzIHRoZSBjb250YWluZXIgd2hvc2UgSFRNTCBjb250ZW50IGlzIGJlaW5nXG4gIC8vIHJlcGxhY2VkIG9uIGV2ZXJ5IGFjdGlvbi5cbiAgY29uc3Qgc2VhcmNoSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxVTGlzdEVsZW1lbnQ+KFxuICAgIFwiLm1hcmtldHBsYWNlLXNlYXJjaC1pdGVtc1wiXG4gIClcbiAgaWYgKCFzZWFyY2hJdGVtcykgcmV0dXJuXG5cbiAgbWFya2V0T2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihsb2FkV2lzaGxpc3QpXG4gIG1hcmtldE9ic2VydmVyLm9ic2VydmUoc2VhcmNoSXRlbXMsIHtcbiAgICBjaGlsZExpc3Q6IHRydWUsXG4gIH0pXG5cbiAgbG9hZFdpc2hsaXN0KClcbn1cblxuZnVuY3Rpb24gbG9hZFdpc2hsaXN0KCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGxpIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTExJRWxlbWVudD4oXG4gICAgXCIubWFya2V0cGxhY2UtYWJzdHJhY3RcIlxuICApKSB7XG4gICAgbGkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+XG4gICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihcbiAgICAgICAgKF86IE11dGF0aW9uUmVjb3JkW10sIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyKTogdm9pZCA9PiB7XG4gICAgICAgICAgY29uc3QgbWFya2V0RW50cnkgPSBnZXRJdGVtRGV0YWlscyhsaSlcbiAgICAgICAgICBpZiAoIW1hcmtldEVudHJ5KSByZXR1cm5cblxuICAgICAgICAgIGFkZFdpc2hpc3RCdXR0b24obWFya2V0RW50cnksIG9ic2VydmVyKVxuICAgICAgICB9XG4gICAgICApLm9ic2VydmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYXJrZXRwbGFjZS16b29tXCIpIGFzIE5vZGUsIHtcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgfSlcbiAgICApXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkV2lzaGlzdEJ1dHRvbihcbiAgbWFya2V0RW50cnk6IE1hcmtldEVudHJ5LFxuICBvYnNlcnZlcj86IE11dGF0aW9uT2JzZXJ2ZXJcbik6IHZvaWQge1xuICBjb25zdCBidXR0b25zQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgXCIjbWFya2V0cGxhY2UtaXRlbURldGFpbFwiXG4gIClcbiAgaWYgKCFidXR0b25zQ29udGFpbmVyKSByZXR1cm5cbiAgb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKVxuICBoaWphY2tCdXlCdXR0b25zKG1hcmtldEVudHJ5KVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFya2V0cGxhY2UtaXRlbURldGFpbC1pbmZvLWF1dG9idXlcIik/LnJlbW92ZSgpXG4gIGNvbnN0IGJ1dHRvblRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9hdXRvX2J1eV9idXR0b24uaHRtbFwiKVxuICBidXR0b25zQ29udGFpbmVyLmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIGJ1dHRvblRlbXBsYXRlLnJlbmRlcih7IHRyYW5zbGF0ZSB9KVxuICApXG5cbiAgYnV0dG9uc0NvbnRhaW5lclxuICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcIiNtYXJrZXRwbGFjZS1pdGVtRGV0YWlsLWluZm8tYXV0b2J1eVwiKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IGFkZFRvV2lzaGxpc3RGbGF2cihtYXJrZXRFbnRyeSkpXG59XG5cbmZ1bmN0aW9uIGFkZFRvV2lzaGxpc3RGbGF2cihtYXJrZXRFbnRyeTogTWFya2V0RW50cnkpOiB2b2lkIHtcbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2F1dG9fYnV5X2ZsYXZyLmh0bWxcIilcblxuICAkLmZsYXZyKHtcbiAgICBjb250ZW50OiB0ZW1wbGF0ZS5yZW5kZXIoeyB0cmFuc2xhdGUgfSksXG4gICAgYnV0dG9uczoge1xuICAgICAgY2xvc2U6IHsgc3R5bGU6IFwiY2xvc2VcIiB9LFxuICAgICAgc2F2ZToge1xuICAgICAgICBhY3Rpb246ICgpID0+IHNhdmUobWFya2V0RW50cnkpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRpYWxvZzogXCJwcm9tcHRcIixcbiAgICBwcm9tcHQ6IHtcbiAgICAgIHZhbHVlOiBcIlwiLFxuICAgIH0sXG4gICAgb25CdWlsZDogJGNvbnRhaW5lciA9PiB7XG4gICAgICAkY29udGFpbmVyLmFkZENsYXNzKFwibmV3LWxheW91dC1wb3B1cFwiKVxuXG4gICAgICBkb2N1bWVudFxuICAgICAgICAucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihcIi5mbGF2ci1wcm9tcHRcIilcbiAgICAgICAgPy5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgKHsga2V5IH0pID0+IHtcbiAgICAgICAgICBpZiAoa2V5ICE9PSBcIkVudGVyXCIpIHJldHVyblxuICAgICAgICAgIHNhdmUobWFya2V0RW50cnkpXG4gICAgICAgIH0pXG4gICAgfSxcbiAgfSlcbn1cblxuZnVuY3Rpb24gc2F2ZShtYXJrZXRFbnRyeTogTWFya2V0RW50cnkpOiBib29sZWFuIHtcbiAgY29uc3QgcHJpY2UgPSBOdW1iZXIoXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihcIi5mbGF2ci1wcm9tcHRcIik/LnZhbHVlLnRyaW0oKVxuICApXG4gIGlmICghcHJpY2UgfHwgcHJpY2UgPD0gMCkge1xuICAgICQuZmxhdnJOb3RpZih0cmFuc2xhdGUubWFya2V0LmFkZF90b193aXNobGlzdC5pbnZhbGlkX3ByaWNlKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3Qgd2lzaGxpc3QgPSBMb2NhbFN0b3JhZ2Uud2lzaGxpc3QuZmlsdGVyKFxuICAgIHdpc2hsaXN0RW50cnkgPT4gd2lzaGxpc3RFbnRyeS5pY29uICE9PSBtYXJrZXRFbnRyeS5pY29uXG4gIClcbiAgY29uc3Qgd2lzaGVkOiBXaXNoZWRJdGVtID0geyAuLi5tYXJrZXRFbnRyeSwgcHJpY2UgfVxuICB3aXNobGlzdC5wdXNoKHdpc2hlZClcblxuICB3aXNobGlzdC5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgdHlwZUNvbXBhcmUgPSBhLnR5cGUubG9jYWxlQ29tcGFyZShiLnR5cGUpXG4gICAgaWYgKHR5cGVDb21wYXJlICE9PSAwKSByZXR1cm4gdHlwZUNvbXBhcmVcblxuICAgIGNvbnN0IGFic3RyYWN0VHlwZUNvbXBhcmUgPSAoYS5hYnN0cmFjdFR5cGUgPz8gXCJcIikubG9jYWxlQ29tcGFyZShcbiAgICAgIGIuYWJzdHJhY3RUeXBlID8/IFwiXCJcbiAgICApXG4gICAgaWYgKGFic3RyYWN0VHlwZUNvbXBhcmUgIT09IDApIHJldHVybiBhYnN0cmFjdFR5cGVDb21wYXJlXG5cbiAgICBjb25zdCByYXJpdHlDb21wYXJlID1cbiAgICAgIE9iamVjdC5rZXlzKFJhcml0eSkuaW5kZXhPZihhLnJhcml0eSA/PyBcIlwiKSAtXG4gICAgICBPYmplY3Qua2V5cyhSYXJpdHkpLmluZGV4T2YoYi5yYXJpdHkgPz8gXCJcIilcbiAgICBpZiAocmFyaXR5Q29tcGFyZSAhPT0gMCkgcmV0dXJuIHJhcml0eUNvbXBhcmVcblxuICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpXG4gIH0pXG5cbiAgTG9jYWxTdG9yYWdlLndpc2hsaXN0ID0gd2lzaGxpc3RcblxuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvZmxhdnJfbm90aWYvaWNvbl9tZXNzYWdlLmh0bWxcIilcbiAgJC5mbGF2ck5vdGlmKFxuICAgIHRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAuLi53aXNoZWQsXG4gICAgICBtZXNzYWdlOiB0cmFuc2xhdGUubWFya2V0LmFkZF90b193aXNobGlzdC5hZGRlZF90b193aXNobGlzdChcbiAgICAgICAgd2lzaGVkLm5hbWUsXG4gICAgICAgIHdpc2hlZC5wcmljZVxuICAgICAgKSxcbiAgICB9KVxuICApXG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGhpamFja0J1eUJ1dHRvbnMobWFya2V0RW50cnk6IE1hcmtldEVudHJ5KTogdm9pZCB7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCIubWFya2V0cGxhY2UtaXRlbURldGFpbC1idXlcIilcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBhZGRQdXJjaGFzZShtYXJrZXRFbnRyeSlcbiAgICB9KVxufVxuXG5mdW5jdGlvbiBhZGRQdXJjaGFzZShtYXJrZXRFbnRyeTogTWFya2V0RW50cnkpOiB2b2lkIHtcbiAgTG9jYWxTdG9yYWdlLnB1cmNoYXNlcyA9IFtcbiAgICBtYXJrZXRFbnRyeSxcbiAgICAuLi5Mb2NhbFN0b3JhZ2UucHVyY2hhc2VzLmZpbHRlcihcbiAgICAgIHB1cmNoYXNlID0+IHB1cmNoYXNlLml0ZW1pZCAhPT0gbWFya2V0RW50cnkuaXRlbWlkXG4gICAgKSxcbiAgXVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHR5cGUgeyBNYWluTWVudSB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9tYWluX21lbnVcIlxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZE1lbnUoKTogdm9pZCB7XG4gIGNvbnN0IG1lbnVJbm5lclJpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtZW51LWlubmVyLXJpZ2h0XCIpXG4gIGlmICghbWVudUlubmVyUmlnaHQgfHwgbWVudUlubmVyUmlnaHQucXVlcnlTZWxlY3RvcihcIi5tYWluLW1lbnUtZWVcIikpIHJldHVyblxuXG4gIC8vIFJlbW92ZSBiYW5rXG4gIG1lbnVJbm5lclJpZ2h0LnF1ZXJ5U2VsZWN0b3IoXCIubWFpbi1tZW51LWJhbmtcIik/LnJlbW92ZSgpXG5cbiAgLy8gQWRkIEZvcnVtXG4gIGNvbnN0IG1lbnVUZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvbWFpbl9tZW51Lmh0bWxcIilcbiAgY29uc3QgbWFpbk1lbnVGb3J1bTogTWFpbk1lbnUgPSB7XG4gICAgY2xhc3M6IFwiZm9ydW1cIixcbiAgICBocmVmOiBcIi9mb3J1bVwiLFxuICAgIHRleHQ6IHRyYW5zbGF0ZS5ob21lLmZvcnVtLFxuICB9XG5cbiAgbWVudUlubmVyUmlnaHQuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgbWVudVRlbXBsYXRlLnJlbmRlcihtYWluTWVudUZvcnVtKVxuICApXG59XG4iLCJpbXBvcnQgeyBDb25zb2xlIH0gZnJvbSBcIi4uL2NvbnNvbGVcIlxuaW1wb3J0IHsgbG9hZE1hcmtlcnMgfSBmcm9tIFwiLi4vcGV0L2V4cGxvcmF0aW9uXCJcbmltcG9ydCB7IGxvYWRFeHBsb3JhdGlvbkhpc3RvcnksIG9uQ2xpY2tQZXQgfSBmcm9tIFwiLi4vcGV0L2V4cGxvcmF0aW9uLWhpc3RvcnlcIlxuaW1wb3J0IHsgbG9hZE1hc3NNYXJrIH0gZnJvbSBcIi4uL3BldC9tYXNzX21hcmtcIlxuXG5sZXQgcGV0T2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXIgfCBudWxsXG5cbmZ1bmN0aW9uIGxvYWRFeHBsb3JhdGlvbnMoKTogdm9pZCB7XG4gIHBldE9ic2VydmVyPy5kaXNjb25uZWN0KClcbiAgcGV0T2JzZXJ2ZXIgPSBudWxsXG5cbiAgLyoqIGAucGFnZS1tYWluLWNvbnRhaW5lcmAgY2hhbmdlcyBiYWNrZ3JvdW5kIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJlZ2lvbi4gKi9cbiAgY29uc3QgbWFpbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFxuICAgIFwiLnBhZ2UtbWFpbi1jb250YWluZXJcIlxuICApXG4gIGlmICghbWFpbkNvbnRhaW5lcikgcmV0dXJuXG5cbiAgcGV0T2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihsb2FkRXhwbG9yYXRpb25zKVxuICBwZXRPYnNlcnZlci5vYnNlcnZlKG1haW5Db250YWluZXIsIHtcbiAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICB9KVxuXG4gIGxvYWRNYXJrZXJzKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRQZXQoKTogdm9pZCB7XG4gIGlmIChsb2NhdGlvbi5wYXRobmFtZSAhPT0gXCIvcGV0XCIpIHJldHVyblxuICBleHRlbmRSaWdodENvbnRhaW5lcigpXG4gIGNyZWF0ZUJ1dHRvblJvdygpXG5cbiAgbG9hZEV4cGxvcmF0aW9ucygpXG4gIGxvYWRFeHBsb3JhdGlvbkhpc3RvcnkoKVxuICBsb2FkTWFzc01hcmsoKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Sb3coKTogdm9pZCB7XG4gIGNvbnN0IGNsb3NlRXhwbG9yYXRpb25CdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxBbmNob3JFbGVtZW50PihcbiAgICBcIiNjbG9zZS10cmVhc3VyZS1odW50LWludGVyZmFjZVwiXG4gIClcbiAgaWYgKCFjbG9zZUV4cGxvcmF0aW9uQnV0dG9uKVxuICAgIHJldHVybiBDb25zb2xlLmVycm9yKFwiQ291bGRuJ3QgZmluZCAjY2xvc2UtdHJlYXN1cmUtaHVudC1pbnRlcmZhY2UuXCIpXG5cbiAgY2xvc2VFeHBsb3JhdGlvbkJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuICBjbG9zZUV4cGxvcmF0aW9uQnV0dG9uLnN0eWxlLm1hcmdpblJpZ2h0ID0gXCIwLjZlbVwiXG4gIGNsb3NlRXhwbG9yYXRpb25CdXR0b24uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCJcbiAgY2xvc2VFeHBsb3JhdGlvbkJ1dHRvbi5zdHlsZS5yaWdodCA9IFwiMFwiXG4gIGNsb3NlRXhwbG9yYXRpb25CdXR0b24uc3R5bGUudG9wID0gXCIwXCJcbiAgY2xvc2VFeHBsb3JhdGlvbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgb25DbGlja1BldClcblxuICBjb25zdCByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIHJvdy5pZCA9IFwiZWUtYnV0dG9ucy1yb3dcIlxuICByb3cuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYmVmb3JlZW5kXCIsIGNsb3NlRXhwbG9yYXRpb25CdXR0b24pXG5cbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIjcmlnaHQtY29udGFpbmVyLWlubmVyXCIpXG4gICAgPy5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIHJvdylcbn1cblxuZnVuY3Rpb24gZXh0ZW5kUmlnaHRDb250YWluZXIoKTogdm9pZCB7XG4gIGNvbnN0IHJpZ2h0Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyaWdodC1jb250YWluZXJcIilcbiAgaWYgKCFyaWdodENvbnRhaW5lcilcbiAgICByZXR1cm4gQ29uc29sZS53YXJuKFwiQ291bGRuJ3QgZmluZCAjcmlnaHQtY29udGFpbmVyXCIsIHJpZ2h0Q29udGFpbmVyKVxuXG4gIHJpZ2h0Q29udGFpbmVyLnN0eWxlLmhlaWdodCA9IFwiNDBlbVwiXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IGRvd25sb2FkUHJvZmlsZSB9IGZyb20gXCIuLi9kb3dubG9hZC1jYW52YXNcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IGV4cG9ydE91dGZpdCB9IGZyb20gXCIuLi9vdXRmaXRcIlxuaW1wb3J0IHR5cGUgeyBQcm9maWxlQ29udGFjdEFjdGlvbiB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9wcm9maWxlX2NvbnRhY3RfYWN0aW9uXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRQcm9maWxlKCk6IHZvaWQge1xuICBjb25zdCBwcm9maWxlQ29udGFjdEFjdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICBcInByb2ZpbGUtY29udGFjdC1hY3Rpb25zXCJcbiAgKVxuICBpZiAoXG4gICAgIXByb2ZpbGVDb250YWN0QWN0aW9ucyB8fFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIucHJvZmlsZS1jb250YWN0LWFjdGlvbi1lZVwiKVxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9wcm9maWxlX2NvbnRhY3RfYWN0aW9uLmh0bWxcIilcblxuICBjb25zdCBwcm9maWxlQWN0aW9uRXhwb3J0OiBQcm9maWxlQ29udGFjdEFjdGlvbiA9IHtcbiAgICBpZDogXCJwcm9maWxlLWNvbnRhY3QtYWN0aW9uLWV4cG9ydFwiLFxuICAgIGFjdGlvbkRlc2NyaXB0aW9uOiB0cmFuc2xhdGUucHJvZmlsZS5leHBvcnRfb3V0Zml0LFxuICB9XG4gIGNvbnN0IHByb2ZpbGVBY3Rpb25Eb3dubG9hZDogUHJvZmlsZUNvbnRhY3RBY3Rpb24gPSB7XG4gICAgaWQ6IFwicHJvZmlsZS1jb250YWN0LWFjdGlvbi1kb3dubG9hZFwiLFxuICAgIGFjdGlvbkRlc2NyaXB0aW9uOiB0cmFuc2xhdGUucHJvZmlsZS5kb3dubG9hZF9vdXRmaXQsXG4gIH1cblxuICAvLyBBZGQgZW50cmllc1xuICBwcm9maWxlQ29udGFjdEFjdGlvbnMuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgdGVtcGxhdGUucmVuZGVyKHByb2ZpbGVBY3Rpb25FeHBvcnQpXG4gIClcbiAgcHJvZmlsZUNvbnRhY3RBY3Rpb25zLmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIHRlbXBsYXRlLnJlbmRlcihwcm9maWxlQWN0aW9uRG93bmxvYWQpXG4gIClcblxuICAvLyBBZGQgY2xpY2sgZXZlbnRzXG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKHByb2ZpbGVBY3Rpb25FeHBvcnQuaWQpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZXhwb3J0UHJvZmlsZSlcbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQocHJvZmlsZUFjdGlvbkRvd25sb2FkLmlkKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGRvd25sb2FkUHJvZmlsZSlcbn1cblxuZnVuY3Rpb24gZXhwb3J0UHJvZmlsZSgpOiB2b2lkIHtcbiAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxIZWFkaW5nRWxlbWVudD4oXG4gICAgXCIjbWFpbi1zZWN0aW9uIC5zZWN0aW9uLXRpdGxlXCJcbiAgKVxuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhTYWNoYS5BdmF0YXIuYXZhdGFycykuZmlsdGVyKGtleSA9PlxuICAgIGtleS5zdGFydHNXaXRoKFwiI3BsYXllclByb2ZpbGVBdmF0YXJcIilcbiAgKVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBleHBvcnRPdXRmaXQoa2V5LCB0aXRsZT8udGV4dENvbnRlbnQ/LnRyaW0oKSlcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyBQdXJyb3Nob3BTdGF0dXMgfSBmcm9tIFwiLi4vYXBpL21ldGFcIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5cbi8qKiBTaG93cyBhIFB1cnJvJ1Nob3AgYnV0dG9uIGluIHRoZSBtYWluIG1lbnUgd2hlbiBpdCdzIGF2YWlsYWJsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUHVycm9TaG9wKCk6IHZvaWQge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLm1haW4tbWVudS1wdXJyb3Nob3BcIik/LnJlbW92ZSgpXG5cbiAgLy8gQSBidWcgaW4gV2ViUGFjayBwcmV2ZW50cyB1c2luZyBgTG9jYWxTdG9yYWdlLm1ldGE/LnB1cnJvc2hvcC5zdGF0dXNgLlxuICBpZiAoXG4gICAgTG9jYWxTdG9yYWdlLm1ldGEgPT09IG51bGwgfHxcbiAgICBMb2NhbFN0b3JhZ2UubWV0YS5wdXJyb3Nob3Auc3RhdHVzICE9PSBQdXJyb3Nob3BTdGF0dXMuZW5hYmxlZFxuICApXG4gICAgcmV0dXJuXG5cbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL21haW5fbWVudV9wdXJyb3Nob3AuaHRtbFwiKVxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChcIm1lbnUtaW5uZXItbGVmdFwiKVxuICAgID8uaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLCB0ZW1wbGF0ZS5yZW5kZXIoe30pKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyBnZXROYW1lIH0gZnJvbSBcIi4uL2Rvd25sb2FkLWNhbnZhc1wiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5pbXBvcnQgdHlwZSB7IFNldHRpbmdzIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL3NldHRpbmdzXCJcblxuLyoqIENyZWF0ZXMgdGhlIFVJIGZvciB0aGUgc2V0dGluZ3MgaW4gdGhlIGFjY291bnQgcGFnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkU2V0dGluZ3MoKTogdm9pZCB7XG4gIGNvbnN0IGFjY291bnRSaWdodCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYWNjb3VudC1yaWdodCBkaXZcIilcbiAgaWYgKCFhY2NvdW50UmlnaHQgfHwgYWNjb3VudFJpZ2h0LnF1ZXJ5U2VsZWN0b3IoXCIuYWNjb3VudC1lZS1ibG9jXCIpKSByZXR1cm5cblxuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxTZXR0aW5ncz4gPSB7XG4gICAgZGVidWc6IExvY2FsU3RvcmFnZS5kZWJ1ZyxcbiAgICBleHBsb3JhdGlvbnM6IExvY2FsU3RvcmFnZS5leHBsb3JhdGlvbnMsXG4gICAgbWFya2V0OiBMb2NhbFN0b3JhZ2UubWFya2V0LFxuICAgIG1pbmlnYW1lczogTG9jYWxTdG9yYWdlLm1pbmlnYW1lcyxcbiAgICB1bmxvY2tlZDogTG9jYWxTdG9yYWdlLnVubG9ja2VkLFxuICB9XG4gIGNvbnN0IHNldHRpbmdzVGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL3NldHRpbmdzLmh0bWxcIilcbiAgY29uc3QgcmVuZGVyZWQgPSBzZXR0aW5nc1RlbXBsYXRlLnJlbmRlcih7IC4uLnNldHRpbmdzLCB0cmFuc2xhdGUgfSlcbiAgYWNjb3VudFJpZ2h0Lmluc2VydEFkamFjZW50SFRNTChcImJlZm9yZWVuZFwiLCByZW5kZXJlZClcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVlLWRlYnVnLWVuYWJsZWRcIik/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgTG9jYWxTdG9yYWdlLmRlYnVnID0gIUxvY2FsU3RvcmFnZS5kZWJ1Z1xuICAgIHJlbG9hZFNldHRpbmdzKClcbiAgfSlcblxuICBpZiAoTG9jYWxTdG9yYWdlLnVubG9ja2VkKSB7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZChcImVlLW1pbmlnYW1lcy1lbmFibGVkXCIpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIExvY2FsU3RvcmFnZS5taW5pZ2FtZXMgPSAhTG9jYWxTdG9yYWdlLm1pbmlnYW1lc1xuICAgICAgICByZWxvYWRTZXR0aW5ncygpXG4gICAgICB9KVxuXG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZChcImVlLWV4cGxvcmF0aW9ucy1lbmFibGVkXCIpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIExvY2FsU3RvcmFnZS5leHBsb3JhdGlvbnMgPSAhTG9jYWxTdG9yYWdlLmV4cGxvcmF0aW9uc1xuICAgICAgICByZWxvYWRTZXR0aW5ncygpXG4gICAgICB9KVxuXG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZChcImVlLW1hcmtldC1lbmFibGVkXCIpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIExvY2FsU3RvcmFnZS5tYXJrZXQgPSAhTG9jYWxTdG9yYWdlLm1hcmtldFxuICAgICAgICByZWxvYWRTZXR0aW5ncygpXG4gICAgICB9KVxuXG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZChcImVlLWRlbGV0ZS1leHBsb3JhdGlvbnNcIilcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zID0gW11cblxuICAgICAgICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvZmxhdnJfbm90aWYvaWNvbl9tZXNzYWdlLmh0bWxcIilcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSB0ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgICAgIGljb246IFwiL3N0YXRpYy9pbWcvbmV3LWxheW91dC9wZXQvaWNvbnMvcGljdG9fbWFwLnBuZ1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IHRyYW5zbGF0ZS5hY2NvdW50LmV4cGxvcmF0aW9uc19kZWxldGVkLFxuICAgICAgICB9KVxuICAgICAgICAkLmZsYXZyTm90aWYocmVuZGVyZWQpXG4gICAgICB9KVxuICB9XG5cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoXCJlZS1pbXBvcnRcIilcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBpbXBvcnRTZXR0aW5ncylcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChcImVlLWV4cG9ydFwiKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHZvaWQgZXhwb3J0U2V0dGluZ3MoKSlcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChcImVlLXJlc2V0XCIpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgY29uZmlybVJlc2V0U2V0dGluZ3MpXG59XG5cbmZ1bmN0aW9uIHJlbG9hZFNldHRpbmdzKCk6IHZvaWQge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcIi5hY2NvdW50LWVlLWJsb2NcIik/LnJlbW92ZSgpXG4gIGxvYWRTZXR0aW5ncygpXG59XG5cbmZ1bmN0aW9uIGltcG9ydFNldHRpbmdzKCk6IHZvaWQge1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKVxuICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiZmlsZVwiKVxuICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJhY2NlcHRcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpXG4gIGlucHV0LmNsaWNrKClcblxuICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgIGlmICghZXZlbnQudGFyZ2V0KSByZXR1cm5cbiAgICBjb25zdCBmaWxlcyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXNcbiAgICBpZiAoIWZpbGVzKSByZXR1cm5cbiAgICBjb25zdCBmaWxlID0gZmlsZXNbMF1cbiAgICBpZiAoIWZpbGUpIHJldHVyblxuICAgIHZvaWQgZmlsZS50ZXh0KCkudGhlbihhc3luYyB2YWx1ZSA9PiB7XG4gICAgICBpZiAoIXZhbHVlKSByZXR1cm5cblxuICAgICAgY29uc3QgcGFyc2VkOiBTZXR0aW5ncyA9IEpTT04ucGFyc2UodmFsdWUpXG4gICAgICBhd2FpdCBMb2NhbFN0b3JhZ2Uuc2V0U2V0dGluZ3MocGFyc2VkKVxuXG4gICAgICByZWxvYWRTZXR0aW5ncygpXG4gICAgICAkLmZsYXZyTm90aWYodHJhbnNsYXRlLmFjY291bnQuaW1wb3J0ZWQpXG4gICAgfSlcbiAgfSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhwb3J0U2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGhyZWYgPVxuICAgIFwiZGF0YTp0ZXh0L2pzb247Y2hhcnNldD11dGYtOCxcIiArXG4gICAgZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgSlNPTi5zdHJpbmdpZnkoYXdhaXQgTG9jYWxTdG9yYWdlLmdldFNldHRpbmdzKCksIG51bGwsIDIpXG4gICAgKVxuXG4gIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKVxuICBhLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgaHJlZilcbiAgYS5zZXRBdHRyaWJ1dGUoXG4gICAgXCJkb3dubG9hZFwiLFxuICAgIGAke2dldE5hbWUoKSA/PyBcImVsZGFyeWEtZW5oYW5jZW1lbnRzXCJ9LXNldHRpbmdzLmpzb25gXG4gIClcbiAgYS5jbGljaygpXG59XG5cbmZ1bmN0aW9uIGNvbmZpcm1SZXNldFNldHRpbmdzKCk6IHZvaWQge1xuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvY29uZmlybV9yZXNldF9zZXR0aW5ncy5odG1sXCIpXG4gIGNvbnN0IHJlbmRlcmVkID0gdGVtcGxhdGUucmVuZGVyKHsgdHJhbnNsYXRlIH0pXG5cbiAgJC5mbGF2cih7XG4gICAgY29udGVudDogcmVuZGVyZWQsXG4gICAgZGlhbG9nOiBcImNvbmZpcm1cIixcbiAgICBidXR0b25zOiB7XG4gICAgICBjbG9zZTogeyBzdHlsZTogXCJjbG9zZVwiIH0sXG4gICAgICBjYW5jZWw6IHtcbiAgICAgICAgdGV4dDogdHJhbnNsYXRlLmFjY291bnQuY2FuY2VsLFxuICAgICAgICBhY3Rpb246ICgpID0+IHRydWUsXG4gICAgICB9LFxuICAgICAgY29uZmlybToge1xuICAgICAgICB0ZXh0OiB0cmFuc2xhdGUuYWNjb3VudC5jb25maXJtLFxuICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICB2b2lkIHJlc2V0U2V0dGluZ3MoKVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgb25CdWlsZDogJGNvbnRhaW5lciA9PiB7XG4gICAgICAkY29udGFpbmVyLmFkZENsYXNzKFwibmV3LWxheW91dC1wb3B1cCB2YWNhdGlvblwiKVxuICAgIH0sXG4gIH0pXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc2V0U2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IExvY2FsU3RvcmFnZS5yZXNldFNldHRpbmdzKClcbiAgcGFnZUxvYWQobG9jYXRpb24ucGF0aG5hbWUpXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB7IFNlc3Npb25TdG9yYWdlIH0gZnJvbSBcIi4uL3Nlc3Npb25fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VcIlxuaW1wb3J0IHsgdG9nZ2xlVGFrZW92ZXIgfSBmcm9tIFwiLi4vdGFrZW92ZXIvYnJhaW5cIlxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZFRvcEJhcigpOiB2b2lkIHtcbiAgY29uc3QgaGVhZGVyUmlnaHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhlYWRlci1yaWdodFwiKVxuICBpZiAoIWhlYWRlclJpZ2h0KSByZXR1cm5cblxuICBjb25zdCBoZWFkZXJUYWtlb3ZlciA9IGhlYWRlclJpZ2h0LnF1ZXJ5U2VsZWN0b3IoXCIjaGVhZGVyLXRha2VvdmVyXCIpXG4gIGlmIChoZWFkZXJUYWtlb3ZlcikgaGVhZGVyVGFrZW92ZXIucmVtb3ZlKClcbiAgZWxzZSBsb2FkTGlua3MoKVxuXG4gIGlmIChcbiAgICAoTG9jYWxTdG9yYWdlLm1pbmlnYW1lcyB8fFxuICAgICAgTG9jYWxTdG9yYWdlLmV4cGxvcmF0aW9ucyB8fFxuICAgICAgTG9jYWxTdG9yYWdlLm1hcmtldCkgJiZcbiAgICBMb2NhbFN0b3JhZ2UudW5sb2NrZWRcbiAgKSB7XG4gICAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2hlYWRlcl90YWtlb3Zlci5odG1sXCIpXG4gICAgaGVhZGVyUmlnaHQuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgICAgXCJhZnRlcmJlZ2luXCIsXG4gICAgICB0ZW1wbGF0ZS5yZW5kZXIoeyB0YWtlb3ZlcjogU2Vzc2lvblN0b3JhZ2UudGFrZW92ZXIsIHRyYW5zbGF0ZSB9KVxuICAgIClcblxuICAgIGhlYWRlclJpZ2h0XG4gICAgICAucXVlcnlTZWxlY3RvcihcIiNoZWFkZXItdGFrZW92ZXJcIilcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRvZ2dsZVRha2VvdmVyKVxuICB9XG59XG5cbmZ1bmN0aW9uIGxvYWRMaW5rcygpOiB2b2lkIHtcbiAgY29uc3QgaGVhZGVyUHJvZmlsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGVhZGVyLXByb2ZpbGVcIik/LmZpcnN0Q2hpbGRcbiAgaWYgKGhlYWRlclByb2ZpbGU/LnRleHRDb250ZW50KSB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpXG4gICAgYS5ocmVmID0gXCIvcGxheWVyL3Byb2ZpbGVcIlxuICAgIGEuc3R5bGUuY29sb3IgPSBcInZhcigtLXRleHQtY29sb3IpXCJcbiAgICBhLnN0eWxlLmZvbnRGYW1pbHkgPSAnXCJBbGVncmV5YSBTYW5zXCIsIHNhbnMtc2VyaWYnXG4gICAgYS5zdHlsZS5mb250V2VpZ2h0ID0gXCJ1bnNldFwiXG4gICAgYS50ZXh0Q29udGVudCA9IGhlYWRlclByb2ZpbGUudGV4dENvbnRlbnQudHJpbSgpXG5cbiAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIilcbiAgICBwLmluc2VydEFkamFjZW50RWxlbWVudChcImJlZm9yZWVuZFwiLCBhKVxuXG4gICAgaGVhZGVyUHJvZmlsZS5yZXBsYWNlV2l0aChwKVxuICB9XG5cbiAgY29uc3QgYXZhdGFyVGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2F2YXRhci1tZW51LWNvbnRhaW5lci1vdXRlcj5wXCIpXG4gIGlmIChhdmF0YXJUaXRsZT8udGV4dENvbnRlbnQpXG4gICAgYXZhdGFyVGl0bGUuaW5uZXJIVE1MID0gYDxhIGhyZWY9XCIvcGxheWVyL3Byb2ZpbGVcIiBzdHlsZT1cImNvbG9yOiAjRkZGRkZGOyBmb250LXNpemU6IDIzcHg7IGZvbnQtd2VpZ2h0OiA5MDA7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XCI+JHthdmF0YXJUaXRsZS50ZXh0Q29udGVudC50cmltKCl9PC9hPmBcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwiI2F2YXRhci1tZW51LWNvbnRhaW5lcj5jYW52YXNcIilcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiBwYWdlTG9hZChcIi9wbGF5ZXIvYXBwZWFyYW5jZVwiKSlcbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi9jb25zb2xlXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB0eXBlIHsgV2lzaGxpc3RTZXR0aW5ncyB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy93aXNobGlzdF9zZXR0aW5nc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkV2lzaGxpc3QoKTogdm9pZCB7XG4gIGNvbnN0IG1hcmtldHBsYWNlTWVudSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFya2V0cGxhY2UtbWVudVwiKVxuICBpZiAoIW1hcmtldHBsYWNlTWVudSkgcmV0dXJuXG5cbiAgaWYgKCFtYXJrZXRwbGFjZU1lbnUucXVlcnlTZWxlY3RvcihcIiN3aXNobGlzdC1idXR0b25cIikpIHtcbiAgICBmb3IgKGNvbnN0IGEgb2YgbWFya2V0cGxhY2VNZW51LnF1ZXJ5U2VsZWN0b3JBbGwoXCJhXCIpKSB7XG4gICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PlxuICAgICAgICBwYWdlTG9hZChhLmhyZWYsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgbWFya2V0cGxhY2VNZW51LnF1ZXJ5U2VsZWN0b3IoXCIjd2lzaGxpc3QtYnV0dG9uXCIpPy5yZW1vdmUoKVxuICBjb25zdCB3aXNobGlzdEJ1dHRvblRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC93aXNobGlzdF9idXR0b24uaHRtbFwiKVxuICBtYXJrZXRwbGFjZU1lbnUuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgd2lzaGxpc3RCdXR0b25UZW1wbGF0ZS5yZW5kZXIoeyB0cmFuc2xhdGUgfSlcbiAgKVxuXG4gIG1hcmtldHBsYWNlTWVudVxuICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxBbmNob3JFbGVtZW50PihcIiN3aXNobGlzdC1idXR0b25cIilcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBpbnNlcnRXaXNobGlzdClcbn1cblxuZnVuY3Rpb24gaW5zZXJ0V2lzaGxpc3QoKTogdm9pZCB7XG4gIC8vIEFzc2lzdGFuY2VcbiAgY29uc3QgYXNzaXN0YW5jZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubWFya2V0cGxhY2UtYXNzaXN0YW5jZVwiKVxuICBpZiAoYXNzaXN0YW5jZSkgYXNzaXN0YW5jZS5pbm5lckhUTUwgPSB0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LmFzc2lzdGFuY2VcblxuICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxBbmNob3JFbGVtZW50PihcIiN3aXNobGlzdC1idXR0b25cIilcbiAgaWYgKCFidXR0b24pIHJldHVybiBDb25zb2xlLmVycm9yKFwiV2lzaGxpc3QgYnV0dG9uIG5vdCBmb3VuZFwiLCBidXR0b24pXG5cbiAgLy8gTWVudVxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwiI21hcmtldHBsYWNlLW1lbnUgLmFjdGl2ZVwiKVxuICAgID8uY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKVxuICBidXR0b24uY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKVxuXG4gIC8vIEZpbHRlcnNcbiAgY29uc3QgZmlsdGVycyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFya2V0cGxhY2UtZmlsdGVyc1wiKVxuICBpZiAoZmlsdGVycykgZmlsdGVycy5pbm5lckhUTUwgPSBcIlwiXG5cbiAgLy8gQ29udGVudFxuICBjb25zdCB3aXNobGlzdFRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC93aXNobGlzdF9zZXR0aW5ncy5odG1sXCIpXG4gIGNvbnN0IGNvbnRhaW5lciA9XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5tYXJrZXRwbGFjZS1jb250YWluZXJcIikgPz9cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1hcmtldHBsYWNlLWFjdGl2ZS1hdWN0aW9uc1wiKSA/P1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFya2V0cGxhY2UtaXRlbXNGb3JTYWxlXCIpXG4gIGlmICghY29udGFpbmVyKVxuICAgIHJldHVybiBDb25zb2xlLmVycm9yKFwiVGhlIHdpc2hsaXN0IGNhbm5vdCBiZSBwbGFjZWRcIiwgY29udGFpbmVyKVxuXG4gIGNvbnN0IHdpc2hsaXN0Q29udGV4dDogV2lzaGxpc3RTZXR0aW5ncyA9IHtcbiAgICB3aXNobGlzdDogTG9jYWxTdG9yYWdlLndpc2hsaXN0LFxuICB9XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSB3aXNobGlzdFRlbXBsYXRlLnJlbmRlcih7XG4gICAgLi4ud2lzaGxpc3RDb250ZXh0LFxuICAgIHRyYW5zbGF0ZSxcbiAgfSlcblxuICAvLyBCdXR0b25zXG4gIGZvciAoY29uc3QgdHIgb2YgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0clwiKSkge1xuICAgIGNvbnN0IGljb24gPSB0ci5kYXRhc2V0Lmljb25cbiAgICBpZiAoIWljb24pIGNvbnRpbnVlXG5cbiAgICAvLyBSZXNldCBzdGF0dXNcbiAgICBjb25zdCByZXNldCA9IHRyLnF1ZXJ5U2VsZWN0b3IoXCIucmVzZXQtaXRlbS1zdGF0dXNcIilcbiAgICBpZiAocmVzZXQpXG4gICAgICByZXNldC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICByZXNldFN0YXR1cyhpY29uKVxuICAgICAgICBpbnNlcnRXaXNobGlzdCgpXG4gICAgICB9KVxuXG4gICAgLy8gRGVsZXRlIGl0ZW0gZnJvbSB3aXNobGlzdFxuICAgIGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IHRyLnF1ZXJ5U2VsZWN0b3IoXCIuZGVsZXRlLXdpc2hsaXN0LWl0ZW1cIilcbiAgICBpZiAoZGVsZXRlQnV0dG9uKVxuICAgICAgZGVsZXRlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIGRlbGV0ZUl0ZW0oaWNvbilcbiAgICAgICAgaW5zZXJ0V2lzaGxpc3QoKVxuICAgICAgfSlcblxuICAgIC8vIENoYW5nZSBwcmljZVxuICAgIGNvbnN0IGVkaXRQcmljZSA9IHRyLnF1ZXJ5U2VsZWN0b3IoXCIuZWRpdC1wcmljZVwiKVxuICAgIGlmIChlZGl0UHJpY2UpXG4gICAgICBlZGl0UHJpY2UuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAoKSA9PiB2b2lkIGNoYW5nZVByaWNlKGljb24pLnRoZW4oaW5zZXJ0V2lzaGxpc3QpXG4gICAgICApXG4gIH1cblxuICAvLyBSZXNldCBzdGF0dXNlc1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnJlc2V0LWFsbFwiKT8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHJlc2V0U3RhdHVzZXMpXG59XG5cbmZ1bmN0aW9uIHJlc2V0U3RhdHVzKGljb246IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCB3aXNobGlzdCA9IExvY2FsU3RvcmFnZS53aXNobGlzdFxuICBjb25zdCBpbmRleCA9IHdpc2hsaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWNvbiA9PT0gaWNvbilcbiAgY29uc3QgZW50cnkgPSB3aXNobGlzdFtpbmRleF1cbiAgaWYgKCFlbnRyeSkgcmV0dXJuXG5cbiAgZGVsZXRlIGVudHJ5LmVycm9yXG4gIExvY2FsU3RvcmFnZS53aXNobGlzdCA9IFtcbiAgICAuLi53aXNobGlzdC5zbGljZSh1bmRlZmluZWQsIGluZGV4KSxcbiAgICBlbnRyeSxcbiAgICAuLi53aXNobGlzdC5zbGljZShpbmRleCArIDEsIHVuZGVmaW5lZCksXG4gIF1cbn1cblxuZnVuY3Rpb24gZGVsZXRlSXRlbShpY29uOiBzdHJpbmcpOiB2b2lkIHtcbiAgTG9jYWxTdG9yYWdlLndpc2hsaXN0ID0gTG9jYWxTdG9yYWdlLndpc2hsaXN0LmZpbHRlcihcbiAgICBpdGVtID0+IGl0ZW0uaWNvbiAhPT0gaWNvblxuICApXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoYW5nZVByaWNlKGljb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvY2hhbmdlX3ByaWNlX2ZsYXZyLmh0bWxcIilcblxuICBjb25zdCB3aXNobGlzdCA9IExvY2FsU3RvcmFnZS53aXNobGlzdFxuICBjb25zdCBpbmRleCA9IHdpc2hsaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWNvbiA9PT0gaWNvbilcbiAgY29uc3QgZW50cnkgPSB3aXNobGlzdFtpbmRleF1cbiAgaWYgKCFlbnRyeSkgcmV0dXJuXG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICQuZmxhdnIoe1xuICAgICAgY29udGVudDogdGVtcGxhdGUucmVuZGVyKHsgdHJhbnNsYXRlIH0pLFxuICAgICAgZGlhbG9nOiBcInByb21wdFwiLFxuICAgICAgcHJvbXB0OiB7XG4gICAgICAgIHZhbHVlOiBlbnRyeS5wcmljZS50b1N0cmluZygpLFxuICAgICAgfSxcbiAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgY2xvc2U6IHtcbiAgICAgICAgICBzdHlsZTogXCJjbG9zZVwiLFxuICAgICAgICAgIGFjdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNhdmU6IHtcbiAgICAgICAgICBhY3Rpb246ICgpID0+IHNhdmUoaWNvbiwgcmVzb2x2ZSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgb25CdWlsZDogJGNvbnRhaW5lciA9PiB7XG4gICAgICAgICRjb250YWluZXIuYWRkQ2xhc3MoXCJuZXctbGF5b3V0LXBvcHVwXCIpXG5cbiAgICAgICAgZG9jdW1lbnRcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihcIi5mbGF2ci1wcm9tcHRcIilcbiAgICAgICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCAoeyBrZXkgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gXCJFbnRlclwiKSByZXR1cm5cbiAgICAgICAgICAgIHNhdmUoaWNvbiwgcmVzb2x2ZSlcbiAgICAgICAgICB9KVxuICAgICAgfSxcbiAgICB9KVxuICB9KVxufVxuXG5mdW5jdGlvbiBzYXZlKGljb246IHN0cmluZywgcmVzb2x2ZTogKCkgPT4gdm9pZCk6IGJvb2xlYW4ge1xuICBjb25zdCB3aXNobGlzdCA9IExvY2FsU3RvcmFnZS53aXNobGlzdFxuICBjb25zdCBpbmRleCA9IHdpc2hsaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWNvbiA9PT0gaWNvbilcbiAgY29uc3QgZW50cnkgPSB3aXNobGlzdFtpbmRleF1cbiAgaWYgKCFlbnRyeSkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgcHJpY2UgPSBOdW1iZXIoXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihcIi5mbGF2ci1wcm9tcHRcIik/LnZhbHVlLnRyaW0oKVxuICApXG4gIGlmICghcHJpY2UgfHwgcHJpY2UgPD0gMCkge1xuICAgICQuZmxhdnJOb3RpZih0cmFuc2xhdGUubWFya2V0LmNoYW5nZV9wcmljZS5pbnZhbGlkX3ByaWNlKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZW50cnkucHJpY2UgPSBwcmljZVxuICBMb2NhbFN0b3JhZ2Uud2lzaGxpc3QgPSBbXG4gICAgLi4ud2lzaGxpc3Quc2xpY2UodW5kZWZpbmVkLCBpbmRleCksXG4gICAgZW50cnksXG4gICAgLi4ud2lzaGxpc3Quc2xpY2UoaW5kZXggKyAxLCB1bmRlZmluZWQpLFxuICBdXG5cbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2ZsYXZyX25vdGlmL2ljb25fbWVzc2FnZS5odG1sXCIpXG4gICQuZmxhdnJOb3RpZihcbiAgICB0ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgLi4uZW50cnksXG4gICAgICBtZXNzYWdlOiB0cmFuc2xhdGUubWFya2V0LmNoYW5nZV9wcmljZS5jaGFuZ2VkX3ByaWNlKFxuICAgICAgICBlbnRyeS5uYW1lLFxuICAgICAgICBlbnRyeS5wcmljZVxuICAgICAgKSxcbiAgICB9KVxuICApXG5cbiAgcmVzb2x2ZSgpXG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIHJlc2V0U3RhdHVzZXMoKTogdm9pZCB7XG4gIExvY2FsU3RvcmFnZS53aXNobGlzdCA9IExvY2FsU3RvcmFnZS53aXNobGlzdC5tYXAoaXRlbSA9PiB7XG4gICAgZGVsZXRlIGl0ZW0uZXJyb3JcbiAgICByZXR1cm4gaXRlbVxuICB9KVxuXG4gIGluc2VydFdpc2hsaXN0KClcbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJpbXBvcnQgeyBsb2FkRHJlc3NpbmdFeHBlcmllbmNlIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9kcmVzc2luZ19leHBlcmllbmNlXCJcbmltcG9ydCB7IGxvYWRDaGVhdENvZGVzIH0gZnJvbSBcIi4vY2hlYXRfY29kZXNcIlxuaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuL2NvbnNvbGVcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHsgbWlncmF0ZSB9IGZyb20gXCIuL21pZ3JhdGVcIlxuaW1wb3J0IHsgbG9hZFRha2VvdmVyIH0gZnJvbSBcIi4vdGFrZW92ZXIvYnJhaW5cIlxuaW1wb3J0IHsgbG9hZEF1Y3Rpb25zIH0gZnJvbSBcIi4vdWkvYXVjdGlvbnNcIlxuaW1wb3J0IHsgbG9hZENhcm91c2VsIH0gZnJvbSBcIi4vdWkvY2Fyb3VzZWxcIlxuaW1wb3J0IHsgbG9hZEZhdm91cml0ZXMgfSBmcm9tIFwiLi91aS9mYXZvdXJpdGVzXCJcbmltcG9ydCB7IGxvYWRIb21lQ29udGVudCB9IGZyb20gXCIuL3VpL2hvbWVfY29udGVudFwiXG5pbXBvcnQgeyBsb2FkTWFsbCB9IGZyb20gXCIuL3VpL21hbGxcIlxuaW1wb3J0IHsgbG9hZE1hcmtldCB9IGZyb20gXCIuL3VpL21hcmtldFwiXG5pbXBvcnQgeyBsb2FkTWVudSB9IGZyb20gXCIuL3VpL21lbnVcIlxuaW1wb3J0IHsgbG9hZFBldCB9IGZyb20gXCIuL3VpL3BldFwiXG5pbXBvcnQgeyBsb2FkUHJvZmlsZSB9IGZyb20gXCIuL3VpL3Byb2ZpbGVcIlxuaW1wb3J0IHsgbG9hZFB1cnJvU2hvcCB9IGZyb20gXCIuL3VpL3B1cnJvX3Nob3BcIlxuaW1wb3J0IHsgbG9hZFNldHRpbmdzIH0gZnJvbSBcIi4vdWkvc2V0dGluZ3NcIlxuaW1wb3J0IHsgbG9hZFRvcEJhciB9IGZyb20gXCIuL3VpL3RvcF9iYXJcIlxuaW1wb3J0IHsgbG9hZFdpc2hsaXN0IH0gZnJvbSBcIi4vdWkvd2lzaGxpc3RcIlxuXG4vLyBsb2FkSlMoXCJodHRwczovL3VucGtnLmNvbS9ob2dhbi5qcy9kaXN0L3RlbXBsYXRlLTMuMC4yLm1pbi5qc1wiLCB0cnVlKTtcblxuZnVuY3Rpb24gbG9hZCgpOiB2b2lkIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250YWluZXJcIilcbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICAkLmZsYXZyTm90aWYodHJhbnNsYXRlLmVycm9yLmxvbmdMb2FkaW5nKVxuICAgIENvbnNvbGUuZXJyb3IoXCIjY29udGFpbmVyIGNvdWxkbid0IGJlIGZvdW5kOlwiLCBjb250YWluZXIpXG4gICAgcmV0dXJuIHZvaWQgc2V0VGltZW91dChsb2FkLCAxMF8wMDApXG4gIH1cblxuICBtaWdyYXRlKClcbiAgbG9hZFVJKClcbiAgb2JzZXJ2ZSgpXG5cbiAgQ29uc29sZS5sb2coYCR7R00uaW5mby5zY3JpcHQubmFtZX0gdiR7R00uaW5mby5zY3JpcHQudmVyc2lvbn0gbG9hZGVkLmApXG4gIGxvYWRUYWtlb3ZlcigpXG59XG5cbmZ1bmN0aW9uIGxvYWRVSSgpOiB2b2lkIHtcbiAgbG9hZE1lbnUoKVxuICBsb2FkQ2Fyb3VzZWwoKVxuICBsb2FkSG9tZUNvbnRlbnQoKVxuICBsb2FkRmF2b3VyaXRlcygpXG4gIGxvYWRQcm9maWxlKClcbiAgbG9hZFBldCgpXG4gIGxvYWRNYXJrZXQoKVxuICBsb2FkV2lzaGxpc3QoKVxuICBsb2FkVG9wQmFyKClcbiAgbG9hZEF1Y3Rpb25zKClcbiAgbG9hZFB1cnJvU2hvcCgpXG4gIGxvYWRNYWxsKClcbiAgbG9hZENoZWF0Q29kZXMoKVxuICBsb2FkU2V0dGluZ3MoKVxuXG4gIC8vIEVsZGFyeWEgaXMgY3Jhc2hpbmcgd2hlbiBvcGVuaW5nIGdyb3Vwcy5cbiAgLy8gVE9ETzogSGFuZGxlIGVycm9ycyBhbmQgc3RvcCB0aGUgbG9hZGluZyBwcm9jZXNzLlxuICB2b2lkIGxvYWREcmVzc2luZ0V4cGVyaWVuY2UoKVxufVxuXG5mdW5jdGlvbiBvYnNlcnZlKCk6IHZvaWQge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbnRhaW5lclwiKVxuICBuZXcgTXV0YXRpb25PYnNlcnZlcihyZWxvYWQpLm9ic2VydmUoY29udGFpbmVyIGFzIE5vZGUsIHsgY2hpbGRMaXN0OiB0cnVlIH0pXG59XG5cbmZ1bmN0aW9uIHJlbG9hZCgpOiB2b2lkIHtcbiAgbG9hZFVJKClcbiAgbG9hZFRha2VvdmVyKClcbn1cblxuQ29uc29sZS5sb2coXCJMb2FkaW5nLi4uXCIpXG5pZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiKSBsb2FkKClcbmVsc2Ugd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsICgpID0+IGxvYWQoKSlcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==