// ==UserScript==
// @name Eldarya Enhancements
// @namespace https://gitlab.com/NatoBoram/eldarya-enhancements
// @license GPL-3.0-or-later
// @version 1.2.16
// @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/[email protected]/node_modules/blob-util/dist/blob-util.es.js":
/*!****************************************************************************************!*\
!*** ./node_modules/.pnpm/[email protected]/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/[email protected]/node_modules/hogan.js/lib/compiler.js":
/*!*********************************************************************************!*\
!*** ./node_modules/.pnpm/[email protected]/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/[email protected]/node_modules/hogan.js/lib/hogan.js":
/*!******************************************************************************!*\
!*** ./node_modules/.pnpm/[email protected]/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/[email protected]/node_modules/hogan.js/lib/compiler.js"
)
Hogan.Template = __webpack_require__(
/*! ./template */ "./node_modules/.pnpm/[email protected]/node_modules/hogan.js/lib/template.js"
).Template
Hogan.template = Hogan.Template
module.exports = Hogan
/***/
},
/***/ "./node_modules/.pnpm/[email protected]/node_modules/hogan.js/lib/template.js":
/*!*********************************************************************************!*\
!*** ./node_modules/.pnpm/[email protected]/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, "&")
.replace(rLt, "<")
.replace(rGt, ">")
.replace(rApos, "'")
.replace(rQuot, """)
: 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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/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/[email protected]/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/[email protected]/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, 3863, "{{ }}")
) {
t.rs(c, p, function (c, p, t) {
t.b(' <div class="result-card">')
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")
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, 3566, 3609, "{{ }}")
) {
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, 3640, 3719, "{{ }}")
) {
t.rs(c, p, function (c, p, t) {
if (
t.s(
t.f("tradable", c, p, 1),
c,
p,
0,
3653,
3706,
"{{ }}"
)
) {
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,
3743,
3806,
"{{ }}"
)
) {
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 <img class="result-image" src="{{icon}}" />\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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/outfit_thumbs.html":
/*!***********************************************!*\
!*** ./src/templates/html/outfit_thumbs.html ***!
\***********************************************/
/***/ (module, __unused_webpack_exports, __webpack_require__) => {
var H = __webpack_require__(
/*! hogan.js */ "./node_modules/.pnpm/[email protected]/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/[email protected]/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/settings.html":
/*!******************************************!*\
!*** ./src/templates/html/settings.html ***!
\******************************************/
/***/ (module, __unused_webpack_exports, __webpack_require__) => {
var H = __webpack_require__(
/*! hogan.js */ "./node_modules/.pnpm/[email protected]/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(" </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 </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/[email protected]/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/[email protected]/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 */
})
/* 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, 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
},
},
},
})
}
async function saveAction(name, items, resolve) {
const blob = await new Promise(resolve => {
document
.querySelector("#appearance-preview canvas")
?.toBlob(blob => resolve(blob), "image/png", 1)
})
resolve({
...(await _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__[
"default"
].addFavouriteOutfit({
items,
name,
blob,
})),
url: URL.createObjectURL(blob),
})
}
/***/
},
/***/ "./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 void resolve(groupContainer)
const avatar = Sacha.Avatar.avatars["#appearance-preview"]
if (!avatar) return void 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 void 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 _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__ =
__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_0__.LocalStorage.unlocked = true
console.info("Unlocked enhancements.")
await reload()
}
async function lockEnhancements() {
_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.unlocked = false
console.info("Locked enhancements.")
await reload()
}
async function reload() {
await new Promise(resolve => setTimeout(resolve, 1000))
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.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.warn("Couldn't find the guardian.")
return
}
downloadCanvas(canvas, getName() ?? "guardian")
}
function downloadAppearance() {
const canvas = document.querySelector("#appearance-preview canvas")
if (!canvas) {
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 = {}))
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: {
imported: "Imported outfit!",
importing: "Importing outfit. Please wait...",
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 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",
},
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 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",
},
buttons: {
download: "Download PNG",
export: "Export",
import: "Import",
},
},
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 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: {
debug_tooltip: "Enables or disables logging.",
debug: "Debug",
enhancements: "Enhancements",
explorations: "Explorations",
export: "Export settings",
import: "Import settings",
imported: "Imported settings!",
market: "Market",
minigames: "Minigames",
},
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",
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 account</em> page.`,
history: "History",
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.`,
},
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: {
imported: "Importation réussie!",
importing: "Importation en cours...",
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 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",
},
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 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",
},
buttons: {
download: "Télécharger le PNG",
export: "Exporter",
import: "Importer",
},
},
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 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: {
debug_tooltip: "Active ou désactive la journalisation.",
debug: "Débogage",
enhancements: "Améliorations",
explorations: "Explorations",
export: "Exporter les paramètres",
import: "Importer les paramètres",
imported: "Paramètres importés",
market: "Marché",
minigames: "Mini-jeux",
},
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",
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",
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.`,
},
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 void 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: favourite.url ?? URL.createObjectURL(favourite.blob),
id: Number(request.result),
})
})
}
async clearFavouriteOutfits() {
return new Promise((resolve, reject) => {
if (!this.db) return void 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 void 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 void 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 void 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/[email protected]/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 => ({
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 => ({
blob: (0,
blob_util__WEBPACK_IMPORTED_MODULE_0__.base64StringToBlob)(
favourite.base64
),
items: favourite.items,
name: favourite.name,
}))) {
void _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__[
"default"
].addFavouriteOutfit(favourite)
}
}
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 */
})
/* 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 closeExplorationButton = document.querySelector(
"#close-treasure-hunt-interface"
)
if (!closeExplorationButton)
return void _console__WEBPACK_IMPORTED_MODULE_0__.Console.error(
"Couldn't find #close-treasure-hunt-interface."
)
closeExplorationButton.style.display = "inline-block"
closeExplorationButton.style.position = "relative"
closeExplorationButton.style.right = "0"
closeExplorationButton.style.top = "0"
closeExplorationButton.addEventListener("click", onClickPet)
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)
const row = document.createElement("div")
row.insertAdjacentElement("beforeend", historyButton)
row.insertAdjacentElement("beforeend", closeExplorationButton)
document
.querySelector("#right-container-inner")
?.insertAdjacentElement("afterbegin", row)
}
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 void _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 void _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)
),
})
),
})
)
document
.getElementById("delete-history")
?.addEventListener("click", () => {
_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.explorationHistory =
[]
makeHistory()
})
}
/***/
},
/***/ "./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 void _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 */ loadMarkers: () => /* binding */ loadMarkers,
/* 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 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/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)
)
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 _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_6__ =
__webpack_require__(
/*! ../../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
)
/* harmony import */ var _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_7__ =
__webpack_require__(
/*! ../../session_storage/session_storage */ "./src/session_storage/session_storage.ts"
)
/* harmony import */ var _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_8__ =
__webpack_require__(
/*! ../../session_storage/takeover_action.enum */ "./src/session_storage/takeover_action.enum.ts"
)
/* harmony import */ var _click__WEBPACK_IMPORTED_MODULE_9__ =
__webpack_require__(/*! ../click */ "./src/takeover/click.ts")
/* harmony import */ var _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__ =
__webpack_require__(
/*! ../exploration_status.enum */ "./src/takeover/exploration_status.enum.ts"
)
/* harmony import */ var _action__WEBPACK_IMPORTED_MODULE_11__ =
__webpack_require__(
/*! ./action */ "./src/takeover/classes/action.ts"
)
class ExplorationAction extends _action__WEBPACK_IMPORTED_MODULE_11__.Action {
key =
_session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_8__
.TakeoverAction.explorations
get globals() {
return {
currentRegion,
pendingTreasureHuntLocation,
timeLeftExploration,
}
}
condition() {
return (
_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_6__
.LocalStorage.explorations &&
!_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_7__
.SessionStorage.explorationsDone &&
!!_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_6__
.LocalStorage.autoExploreLocations.length
)
}
async perform() {
if (location.pathname !== "/pet") {
pageLoad("/pet")
return true
}
const status = this.getExplorationStatus()
_console__WEBPACK_IMPORTED_MODULE_4__.Console.log(
"Exploration status:",
_exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
.ExplorationStatus[status]
)
switch (status) {
case _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
.ExplorationStatus.idle:
if (!(await this.startExploration()).selected)
_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_7__.SessionStorage.explorationsDone = true
return false
case _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
.ExplorationStatus.pending:
return (await this.waitExploration()) && this.perform()
case _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
.ExplorationStatus.result:
await this.endExploration()
return this.perform()
case _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
.ExplorationStatus.capture:
await this.endCapture()
return this.perform()
default:
return false
}
}
async clickExplore() {
return (0, _click__WEBPACK_IMPORTED_MODULE_9__.click)(
"#explore-button"
)
}
async clickLocation(selected) {
return (0, _click__WEBPACK_IMPORTED_MODULE_9__.click)(
`.map-location[data-id="${selected.location.id}"]`
)
}
clickRegion(selected) {
const div = document.querySelector(
`.minimap[data-mapid="${selected.region.id}"]`
)
if (!div) {
// Clearing invalid regions is useful to remove finished events.
_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_6__.LocalStorage.autoExploreLocations =
_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_6__.LocalStorage.autoExploreLocations.filter(
saved => saved.region.id !== selected.region.id
)
_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_7__.SessionStorage.selectedLocation =
null
pageLoad("/pet")
return null
}
div.click()
return div
}
async clickSeason() {
return (0, _click__WEBPACK_IMPORTED_MODULE_9__.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_9__.click)(
"#open-capture-interface"
)
await (0, _click__WEBPACK_IMPORTED_MODULE_9__.click)(
"#capture-button"
)
await (0, _click__WEBPACK_IMPORTED_MODULE_9__.click)(
"#close-result"
)
}
async endExploration() {
return (0, _click__WEBPACK_IMPORTED_MODULE_9__.click)(
"#close-result"
)
}
getCurrentSeason() {
return (
Array.from(document.querySelector("body")?.classList ?? [])
.find(c => c.startsWith("season-"))
?.replace("season-", "") ?? null
)
}
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_10__
.ExplorationStatus.capture
} else if (
document.querySelector(
"#pending-map-location-data-outer.active"
) ||
document.querySelector("#map-container.pending")
) {
return _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
.ExplorationStatus.pending
} else if (
document.querySelector("#treasure-hunt-result-overlay.active")
)
return _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
.ExplorationStatus.result
return _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
.ExplorationStatus.idle
}
getLowestEnergyLocation() {
return _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_6__.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_7__
.SessionStorage.selectedLocation
if (!selected) {
selected = this.selectLocation()
_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_7__.SessionStorage.selectedLocation =
selected
}
return selected
}
selectLocation() {
const affordable =
_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_6__.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
this.clickRegion(selected)
// Go to location
await this.clickLocation(selected)
await this.clickExplore()
_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_7__.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_10__
.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 */ wait: () => /* binding */ wait,
/* harmony export */ waitObserve: () => /* binding */ waitObserve,
/* harmony export */
})
async function click(selector) {
return new Promise(resolve => {
const interval = setInterval(() => {
const element = document.querySelector(selector)
if (!element) return
clearInterval(interval)
// 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(element)
}, 800)
}, 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 _pet_exploration__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(
/*! ../pet/exploration */ "./src/pet/exploration.ts"
)
/* harmony import */ var _pet_exploration_history__WEBPACK_IMPORTED_MODULE_1__ =
__webpack_require__(
/*! ../pet/exploration-history */ "./src/pet/exploration-history.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_0__.loadMarkers)()
}
function loadPet() {
if (location.pathname !== "/pet") return
loadExplorations()
;(0,
_pet_exploration_history__WEBPACK_IMPORTED_MODULE_1__.loadExplorationHistory)()
}
/***/
},
/***/ "./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-import")
?.addEventListener("click", importSettings)
document
.getElementById("ee-export")
?.addEventListener("click", () => void exportSettings())
}
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()
}
/***/
},
/***/ "./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 void _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 void _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.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)()
}
if (document.readyState === "complete") load()
else window.addEventListener("load", () => load())
})()
/******/
})()
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkYXJ5YS1lbmhhbmNlbWVudHMudXNlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsbUJBQW1CO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxvQkFBb0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsb0JBQW9CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGtCQUFrQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsWUFBWTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBLGdDQUFnQyxZQUFZO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFK1M7Ozs7Ozs7Ozs7O0FDbGIvUztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFD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RSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDOUUsQ0FBQztBQUVELFNBQVMsTUFBTTtJQUNiLE1BQU0sRUFBRTtJQUNSLDZEQUFZLEVBQUU7QUFDaEIsQ0FBQztBQUVELElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxVQUFVO0lBQUUsSUFBSSxFQUFFOztJQUN6QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9ub2RlX21vZHVsZXMvLnBucG0vYmxvYi11dGlsQDIuMC4yL25vZGVfbW9kdWxlcy9ibG9iLXV0aWwvZGlzdC9ibG9iLXV0aWwuZXMuanMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9ub2RlX21vZHVsZXMvLnBucG0vaG9nYW4uanNAMy4wLjIvbm9kZV9tb2R1bGVzL2hvZ2FuLmpzL2xpYi9jb21waWxlci5qcyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL25vZGVfbW9kdWxlcy8ucG5wbS9ob2dhbi5qc0AzLjAuMi9ub2RlX21vZHVsZXMvaG9nYW4uanMvbGliL2hvZ2FuLmpzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vbm9kZV9tb2R1bGVzLy5wbnBtL2hvZ2FuLmpzQDMuMC4yL25vZGVfbW9kdWxlcy9ob2dhbi5qcy9saWIvdGVtcGxhdGUuanMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvYXBwZWFyYW5jZV9pdGVtLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvYXBwZWFyYW5jZV9pdGVtc19jYXRlZ29yeS5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2FwcGVhcmFuY2VfaXRlbXNfZ3JvdXAuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9hdXRvX2J1eV9idXR0b24uaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9hdXRvX2J1eV9mbGF2ci5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2F1dG9fYnV5X2ZsYXZyX21hbGwuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9hdXRvX2V4cGxvcmVfYnV0dG9uLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvY2Fyb3VzZWxfbmV3cy5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2NoYW5nZV9wcmljZV9mbGF2ci5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2NyZWF0ZWRfb3V0Zml0X2ZsYXZyLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvZXhwbG9yYXRpb25faGlzdG9yeS5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2Zhdm91cml0ZV9vdXRmaXRfZmxhdnIuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9mYXZvdXJpdGVzX2FjdGlvbi5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2ZsYXZyX25vdGlmL2ljb25fbWVzc2FnZS5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2hlYWRlcl90YWtlb3Zlci5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2hvbWVfY29udGVudF9zbWFsbC5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL21haW5fbWVudS5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL21haW5fbWVudV9wdXJyb3Nob3AuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9tYXJrZXRfaGlzdG9yeS5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL291dGZpdF90aHVtYnMuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9wcm9maWxlX2NvbnRhY3RfYWN0aW9uLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvc2V0dGluZ3MuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC93aXNobGlzdF9idXR0b24uaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC93aXNobGlzdF9zZXR0aW5ncy5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2FqYXgvYWpheF9zZWFyY2gudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYWpheC9idXkudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYWpheC9jYXB0dXJlX2VuZC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hamF4L2NoYW5nZV9yZWdpb24udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYWpheC9leHBsb3JhdGlvbl9yZXN1bHRzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2FwaS9tZXRhLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2FwaS9yZXN1bHQuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hcHBlYXJhbmNlL2FwcGVhcmFuY2VfdWkudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYXBwZWFyYW5jZS9kYXRhX3NldC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hcHBlYXJhbmNlL2RyZXNzaW5nX2V4cGVyaWVuY2UudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYXBwZWFyYW5jZS9lbnVtcy9hcHBlYXJhbmNlX2NhdGVnb3J5X2NvZGUuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hcHBlYXJhbmNlL2Zha2VfZmF2b3VyaXRlcy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hcHBlYXJhbmNlL2Zhdm91cml0ZXNfYWN0aW9ucy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hcHBlYXJhbmNlL2hpZGRlbi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hcHBlYXJhbmNlL3dhcmRyb2JlLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2Nhcm91c2VsL2Nhcm91c2VsX2JlZW1vb3ZfYW5ub3lhbmNlcy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9jYXJvdXNlbC9jYXJvdXNlbF9kb3dubG9hZF9mYWNlLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2Nhcm91c2VsL2Nhcm91c2VsX2Rvd25sb2FkX2d1YXJkaWFuLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2Nhcm91c2VsL2Nhcm91c2VsX2VsZGFyeWFfZW5oYW5jZW1lbnRzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2Nhcm91c2VsL2Nhcm91c2VsX3Rha2VvdmVyLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2NoZWF0X2NvZGVzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2NvbnNvbGUudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvZG93bmxvYWQtY2FudmFzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2R1cmF0aW9uLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2VsZGFyeWEvanF1ZXJ5LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2VsZGFyeWFfdXRpbC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9pMThuL2VuLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2kxOG4vZnIudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvaTE4bi90cmFuc2xhdGUudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvaW5kZXhlZF9kYi9kYXRhYmFzZXMuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9pbmRleGVkX2RiL2ZpZWxkcy5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2luZGV4ZWRfZGIvaW5kZXhlZF9kYi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9pbmRleGVkX2RiL3RhYmxlcy5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZS5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9tYXJrZXRwbGFjZS9lbnVtcy9ib2R5X2xvY2F0aW9uLmVudW0udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvbWFya2V0cGxhY2UvZW51bXMvY2F0ZWdvcnkuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9tYXJrZXRwbGFjZS9lbnVtcy9ndWFyZC5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21hcmtldHBsYWNlL2VudW1zL3Jhcml0eS5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21hcmtldHBsYWNlL2VudW1zL3R5cGUuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZV9oYW5kbGVycy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9taWdyYXRlLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21pbmlnYW1lcy9lbWlsZS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9taW5pZ2FtZXMvZmxhcHB5LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21pbmlnYW1lcy9oYXRjaGxpbmdzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21pbmlnYW1lcy9wZWdnbGUudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvb3V0Zml0LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3BldC9leHBsb3JhdGlvbi1oaXN0b3J5LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3BldC9leHBsb3JhdGlvbi13YXRjaGVyLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3BldC9leHBsb3JhdGlvbi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9zZXNzaW9uX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlLmVudW0udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvc2Vzc2lvbl9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9zZXNzaW9uX3N0b3JhZ2UvdGFrZW92ZXJfYWN0aW9uLmVudW0udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGFrZW92ZXIvYnJhaW4udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGFrZW92ZXIvY2xhc3Nlcy9hY3Rpb24udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGFrZW92ZXIvY2xhc3Nlcy9idXlfYWN0aW9uLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3Rha2VvdmVyL2NsYXNzZXMvZGFpbHlfYWN0aW9uLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3Rha2VvdmVyL2NsYXNzZXMvZXhwbG9yYXRpb25fYWN0aW9uLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3Rha2VvdmVyL2NsYXNzZXMvbWluaWdhbWVfYWN0aW9uLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3Rha2VvdmVyL2NsYXNzZXMvd2FpdF9hY3Rpb24udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGFrZW92ZXIvY2xpY2sudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGFrZW92ZXIvZXhwbG9yYXRpb25fc3RhdHVzLmVudW0udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdHNfdXRpbC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy91aS9hdWN0aW9ucy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy91aS9jYXJvdXNlbC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy91aS9mYXZvdXJpdGVzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL2hvbWVfY29udGVudC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy91aS9tYWxsLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL21hcmtldC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy91aS9tZW51LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL3BldC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy91aS9wcm9maWxlLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL3B1cnJvX3Nob3AudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvc2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvdG9wX2Jhci50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy91aS93aXNobGlzdC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVE9ETzogaW5jbHVkaW5nIHRoZXNlIGluIGJsb2ItdXRpbC50cyBjYXVzZXMgdHlwZWRvYyB0byBnZW5lcmF0ZSBkb2NzIGZvciB0aGVtLFxuLy8gZXZlbiB3aXRoIC0tZXhjbHVkZVByaXZhdGUgwq9cXF8o44OEKV8vwq9cbi8qKiBAcHJpdmF0ZSAqL1xuZnVuY3Rpb24gbG9hZEltYWdlKHNyYywgY3Jvc3NPcmlnaW4pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGlmIChjcm9zc09yaWdpbikge1xuICAgICAgICAgICAgaW1nLmNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47XG4gICAgICAgIH1cbiAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJlc29sdmUoaW1nKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgIGltZy5zcmMgPSBzcmM7XG4gICAgfSk7XG59XG4vKiogQHByaXZhdGUgKi9cbmZ1bmN0aW9uIGltZ1RvQ2FudmFzKGltZykge1xuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgLy8gY29weSB0aGUgaW1hZ2UgY29udGVudHMgdG8gdGhlIGNhbnZhc1xuICAgIHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgY29udGV4dC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBpbWcud2lkdGgsIGltZy5oZWlnaHQsIDAsIDAsIGltZy53aWR0aCwgaW1nLmhlaWdodCk7XG4gICAgcmV0dXJuIGNhbnZhcztcbn1cblxuLyogZ2xvYmFsIFByb21pc2UsIEltYWdlLCBCbG9iLCBGaWxlUmVhZGVyLCBhdG9iLCBidG9hLFxuICAgQmxvYkJ1aWxkZXIsIE1TQmxvYkJ1aWxkZXIsIE1vekJsb2JCdWlsZGVyLCBXZWJLaXRCbG9iQnVpbGRlciwgd2Via2l0VVJMICovXG4vKipcbiAqIFNoaW0gZm9yXG4gKiBbYG5ldyBCbG9iKClgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQmxvYi5CbG9iKVxuICogdG8gc3VwcG9ydFxuICogW29sZGVyIGJyb3dzZXJzIHRoYXQgdXNlIHRoZSBkZXByZWNhdGVkIGBCbG9iQnVpbGRlcmAgQVBJXShodHRwOi8vY2FuaXVzZS5jb20vYmxvYikuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIG15QmxvYiA9IGJsb2JVdGlsLmNyZWF0ZUJsb2IoWydoZWxsbyB3b3JsZCddLCB7dHlwZTogJ3RleHQvcGxhaW4nfSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcGFydHMgLSBjb250ZW50IG9mIHRoZSBCbG9iXG4gKiBAcGFyYW0gcHJvcGVydGllcyAtIHVzdWFsbHkgYHt0eXBlOiBteUNvbnRlbnRUeXBlfWAsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlvdSBjYW4gYWxzbyBwYXNzIGEgc3RyaW5nIGZvciB0aGUgY29udGVudCB0eXBlXG4gKiBAcmV0dXJucyBCbG9iXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJsb2IocGFydHMsIHByb3BlcnRpZXMpIHtcbiAgICBwYXJ0cyA9IHBhcnRzIHx8IFtdO1xuICAgIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IHt9O1xuICAgIGlmICh0eXBlb2YgcHJvcGVydGllcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcHJvcGVydGllcyA9IHsgdHlwZTogcHJvcGVydGllcyB9OyAvLyBpbmZlciBjb250ZW50IHR5cGVcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKHBhcnRzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUubmFtZSAhPT0gJ1R5cGVFcnJvcicpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIEJ1aWxkZXIgPSB0eXBlb2YgQmxvYkJ1aWxkZXIgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IEJsb2JCdWlsZGVyIDogdHlwZW9mIE1TQmxvYkJ1aWxkZXIgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IE1TQmxvYkJ1aWxkZXIgOiB0eXBlb2YgTW96QmxvYkJ1aWxkZXIgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IE1vekJsb2JCdWlsZGVyIDogV2ViS2l0QmxvYkJ1aWxkZXI7XG4gICAgICAgIHZhciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocGFydHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmdldEJsb2IocHJvcGVydGllcy50eXBlKTtcbiAgICB9XG59XG4vKipcbiAqIFNoaW0gZm9yXG4gKiBbYFVSTC5jcmVhdGVPYmplY3RVUkwoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwuY3JlYXRlT2JqZWN0VVJMKVxuICogdG8gc3VwcG9ydCBicm93c2VycyB0aGF0IG9ubHkgaGF2ZSB0aGUgcHJlZml4ZWRcbiAqIGB3ZWJraXRVUkxgIChlLmcuIEFuZHJvaWQgPDQuNCkuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIG15VXJsID0gYmxvYlV0aWwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGJsb2JcbiAqIEByZXR1cm5zIHVybFxuICovXG5mdW5jdGlvbiBjcmVhdGVPYmplY3RVUkwoYmxvYikge1xuICAgIHJldHVybiAodHlwZW9mIFVSTCAhPT0gJ3VuZGVmaW5lZCcgPyBVUkwgOiB3ZWJraXRVUkwpLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbn1cbi8qKlxuICogU2hpbSBmb3JcbiAqIFtgVVJMLnJldm9rZU9iamVjdFVSTCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTC5yZXZva2VPYmplY3RVUkwpXG4gKiB0byBzdXBwb3J0IGJyb3dzZXJzIHRoYXQgb25seSBoYXZlIHRoZSBwcmVmaXhlZFxuICogYHdlYmtpdFVSTGAgKGUuZy4gQW5kcm9pZCA8NC40KS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBibG9iVXRpbC5yZXZva2VPYmplY3RVUkwobXlVcmwpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHVybFxuICovXG5mdW5jdGlvbiByZXZva2VPYmplY3RVUkwodXJsKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgVVJMICE9PSAndW5kZWZpbmVkJyA/IFVSTCA6IHdlYmtpdFVSTCkucmV2b2tlT2JqZWN0VVJMKHVybCk7XG59XG4vKipcbiAqIENvbnZlcnQgYSBgQmxvYmAgdG8gYSBiaW5hcnkgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGJsb2JVdGlsLmJsb2JUb0JpbmFyeVN0cmluZyhibG9iKS50aGVuKGZ1bmN0aW9uIChiaW5hcnlTdHJpbmcpIHtcbiAqICAgLy8gc3VjY2Vzc1xuICogfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICogICAvLyBlcnJvclxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYmxvYlxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJpbmFyeSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gYmxvYlRvQmluYXJ5U3RyaW5nKGJsb2IpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgdmFyIGhhc0JpbmFyeVN0cmluZyA9IHR5cGVvZiByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nID09PSAnZnVuY3Rpb24nO1xuICAgICAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYWRlci5yZXN1bHQgfHwgJyc7XG4gICAgICAgICAgICBpZiAoaGFzQmluYXJ5U3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUoYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyhyZXN1bHQpKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgIGlmIChoYXNCaW5hcnlTdHJpbmcpIHtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoYmxvYik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogQ29udmVydCBhIGJhc2U2NC1lbmNvZGVkIHN0cmluZyB0byBhIGBCbG9iYC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgYmxvYiA9IGJsb2JVdGlsLmJhc2U2NFN0cmluZ1RvQmxvYihiYXNlNjRTdHJpbmcpO1xuICogYGBgXG4gKiBAcGFyYW0gYmFzZTY0IC0gYmFzZTY0LWVuY29kZWQgc3RyaW5nXG4gKiBAcGFyYW0gdHlwZSAtIHRoZSBjb250ZW50IHR5cGUgKG9wdGlvbmFsKVxuICogQHJldHVybnMgQmxvYlxuICovXG5mdW5jdGlvbiBiYXNlNjRTdHJpbmdUb0Jsb2IoYmFzZTY0LCB0eXBlKSB7XG4gICAgdmFyIHBhcnRzID0gW2JpbmFyeVN0cmluZ1RvQXJyYXlCdWZmZXIoYXRvYihiYXNlNjQpKV07XG4gICAgcmV0dXJuIHR5cGUgPyBjcmVhdGVCbG9iKHBhcnRzLCB7IHR5cGU6IHR5cGUgfSkgOiBjcmVhdGVCbG9iKHBhcnRzKTtcbn1cbi8qKlxuICogQ29udmVydCBhIGJpbmFyeSBzdHJpbmcgdG8gYSBgQmxvYmAuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIGJsb2IgPSBibG9iVXRpbC5iaW5hcnlTdHJpbmdUb0Jsb2IoYmluYXJ5U3RyaW5nKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBiaW5hcnkgLSBiaW5hcnkgc3RyaW5nXG4gKiBAcGFyYW0gdHlwZSAtIHRoZSBjb250ZW50IHR5cGUgKG9wdGlvbmFsKVxuICogQHJldHVybnMgQmxvYlxuICovXG5mdW5jdGlvbiBiaW5hcnlTdHJpbmdUb0Jsb2IoYmluYXJ5LCB0eXBlKSB7XG4gICAgcmV0dXJuIGJhc2U2NFN0cmluZ1RvQmxvYihidG9hKGJpbmFyeSksIHR5cGUpO1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgYEJsb2JgIHRvIGEgYmluYXJ5IHN0cmluZy5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBibG9iVXRpbC5ibG9iVG9CYXNlNjRTdHJpbmcoYmxvYikudGhlbihmdW5jdGlvbiAoYmFzZTY0U3RyaW5nKSB7XG4gKiAgIC8vIHN1Y2Nlc3NcbiAqIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAqICAgLy8gZXJyb3JcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGJsb2JcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBiaW5hcnkgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGJsb2JUb0Jhc2U2NFN0cmluZyhibG9iKSB7XG4gICAgcmV0dXJuIGJsb2JUb0JpbmFyeVN0cmluZyhibG9iKS50aGVuKGJ0b2EpO1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgZGF0YSBVUkwgc3RyaW5nXG4gKiAoZS5nLiBgJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0cuLi4nYClcbiAqIHRvIGEgYEJsb2JgLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciBibG9iID0gYmxvYlV0aWwuZGF0YVVSTFRvQmxvYihkYXRhVVJMKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBkYXRhVVJMIC0gZGF0YVVSTC1lbmNvZGVkIHN0cmluZ1xuICogQHJldHVybnMgQmxvYlxuICovXG5mdW5jdGlvbiBkYXRhVVJMVG9CbG9iKGRhdGFVUkwpIHtcbiAgICB2YXIgdHlwZSA9IGRhdGFVUkwubWF0Y2goL2RhdGE6KFteO10rKS8pWzFdO1xuICAgIHZhciBiYXNlNjQgPSBkYXRhVVJMLnJlcGxhY2UoL15bXixdKywvLCAnJyk7XG4gICAgdmFyIGJ1ZmYgPSBiaW5hcnlTdHJpbmdUb0FycmF5QnVmZmVyKGF0b2IoYmFzZTY0KSk7XG4gICAgcmV0dXJuIGNyZWF0ZUJsb2IoW2J1ZmZdLCB7IHR5cGU6IHR5cGUgfSk7XG59XG4vKipcbiAqIENvbnZlcnQgYSBgQmxvYmAgdG8gYSBkYXRhIFVSTCBzdHJpbmdcbiAqIChlLmcuIGAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLRy4uLidgKS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgZGF0YVVSTCA9IGJsb2JVdGlsLmJsb2JUb0RhdGFVUkwoYmxvYik7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYmxvYlxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGRhdGEgVVJMIHN0cmluZ1xuICovXG5mdW5jdGlvbiBibG9iVG9EYXRhVVJMKGJsb2IpIHtcbiAgICByZXR1cm4gYmxvYlRvQmFzZTY0U3RyaW5nKGJsb2IpLnRoZW4oZnVuY3Rpb24gKGJhc2U2NFN0cmluZykge1xuICAgICAgICByZXR1cm4gJ2RhdGE6JyArIGJsb2IudHlwZSArICc7YmFzZTY0LCcgKyBiYXNlNjRTdHJpbmc7XG4gICAgfSk7XG59XG4vKipcbiAqIENvbnZlcnQgYW4gaW1hZ2UncyBgc3JjYCBVUkwgdG8gYSBkYXRhIFVSTCBieSBsb2FkaW5nIHRoZSBpbWFnZSBhbmQgcGFpbnRpbmdcbiAqIGl0IHRvIGEgYGNhbnZhc2AuXG4gKlxuICogTm90ZTogdGhpcyB3aWxsIGNvZXJjZSB0aGUgaW1hZ2UgdG8gdGhlIGRlc2lyZWQgY29udGVudCB0eXBlLCBhbmQgaXRcbiAqIHdpbGwgb25seSBwYWludCB0aGUgZmlyc3QgZnJhbWUgb2YgYW4gYW5pbWF0ZWQgR0lGLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYGpzXG4gKiBibG9iVXRpbC5pbWdTcmNUb0RhdGFVUkwoJ2h0dHA6Ly9teXNpdGUuY29tL2ltZy5wbmcnKS50aGVuKGZ1bmN0aW9uIChkYXRhVVJMKSB7XG4gKiAgIC8vIHN1Y2Nlc3NcbiAqIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAqICAgLy8gZXJyb3JcbiAqIH0pO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIGJsb2JVdGlsLmltZ1NyY1RvRGF0YVVSTCgnaHR0cDovL3NvbWUtb3RoZXItc2l0ZS5jb20vaW1nLmpwZycsICdpbWFnZS9qcGVnJyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAnQW5vbnltb3VzJywgMS4wKS50aGVuKGZ1bmN0aW9uIChkYXRhVVJMKSB7XG4gKiAgIC8vIHN1Y2Nlc3NcbiAqIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAqICAgLy8gZXJyb3JcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNyYyAtIGltYWdlIHNyY1xuICogQHBhcmFtIHR5cGUgLSB0aGUgY29udGVudCB0eXBlIChvcHRpb25hbCwgZGVmYXVsdHMgdG8gJ2ltYWdlL3BuZycpXG4gKiBAcGFyYW0gY3Jvc3NPcmlnaW4gLSBmb3IgQ09SUy1lbmFibGVkIGltYWdlcywgc2V0IHRoaXMgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQW5vbnltb3VzJyB0byBhdm9pZCBcInRhaW50ZWQgY2FudmFzXCIgZXJyb3JzXG4gKiBAcGFyYW0gcXVhbGl0eSAtIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSBpbmRpY2F0aW5nIGltYWdlIHF1YWxpdHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSByZXF1ZXN0ZWQgdHlwZSBpcyAnaW1hZ2UvanBlZycgb3IgJ2ltYWdlL3dlYnAnXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZGF0YSBVUkwgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGltZ1NyY1RvRGF0YVVSTChzcmMsIHR5cGUsIGNyb3NzT3JpZ2luLCBxdWFsaXR5KSB7XG4gICAgdHlwZSA9IHR5cGUgfHwgJ2ltYWdlL3BuZyc7XG4gICAgcmV0dXJuIGxvYWRJbWFnZShzcmMsIGNyb3NzT3JpZ2luKS50aGVuKGltZ1RvQ2FudmFzKS50aGVuKGZ1bmN0aW9uIChjYW52YXMpIHtcbiAgICAgICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwodHlwZSwgcXVhbGl0eSk7XG4gICAgfSk7XG59XG4vKipcbiAqIENvbnZlcnQgYSBgY2FudmFzYCB0byBhIGBCbG9iYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGBqc1xuICogYmxvYlV0aWwuY2FudmFzVG9CbG9iKGNhbnZhcykudGhlbihmdW5jdGlvbiAoYmxvYikge1xuICogICAvLyBzdWNjZXNzXG4gKiB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gKiAgIC8vIGVycm9yXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIE1vc3QgYnJvd3NlcnMgc3VwcG9ydCBjb252ZXJ0aW5nIGEgY2FudmFzIHRvIGJvdGggYCdpbWFnZS9wbmcnYCBhbmQgYCdpbWFnZS9qcGVnJ2AuIFlvdSBtYXlcbiAqIGFsc28gd2FudCB0byB0cnkgYCdpbWFnZS93ZWJwJ2AsIHdoaWNoIHdpbGwgd29yayBpbiBzb21lIGJyb3dzZXJzIGxpa2UgQ2hyb21lIChhbmQgaW4gb3RoZXIgYnJvd3NlcnMsIHdpbGwganVzdCBmYWxsIGJhY2sgdG8gYCdpbWFnZS9wbmcnYCk6XG4gKlxuICogYGBganNcbiAqIGJsb2JVdGlsLmNhbnZhc1RvQmxvYihjYW52YXMsICdpbWFnZS93ZWJwJykudGhlbihmdW5jdGlvbiAoYmxvYikge1xuICogICAvLyBzdWNjZXNzXG4gKiB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gKiAgIC8vIGVycm9yXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjYW52YXMgLSBIVE1MQ2FudmFzRWxlbWVudFxuICogQHBhcmFtIHR5cGUgLSB0aGUgY29udGVudCB0eXBlIChvcHRpb25hbCwgZGVmYXVsdHMgdG8gJ2ltYWdlL3BuZycpXG4gKiBAcGFyYW0gcXVhbGl0eSAtIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSBpbmRpY2F0aW5nIGltYWdlIHF1YWxpdHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSByZXF1ZXN0ZWQgdHlwZSBpcyAnaW1hZ2UvanBlZycgb3IgJ2ltYWdlL3dlYnAnXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYEJsb2JgXG4gKi9cbmZ1bmN0aW9uIGNhbnZhc1RvQmxvYihjYW52YXMsIHR5cGUsIHF1YWxpdHkpIHtcbiAgICBpZiAodHlwZW9mIGNhbnZhcy50b0Jsb2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICBjYW52YXMudG9CbG9iKHJlc29sdmUsIHR5cGUsIHF1YWxpdHkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkYXRhVVJMVG9CbG9iKGNhbnZhcy50b0RhdGFVUkwodHlwZSwgcXVhbGl0eSkpKTtcbn1cbi8qKlxuICogQ29udmVydCBhbiBpbWFnZSdzIGBzcmNgIFVSTCB0byBhIGBCbG9iYCBieSBsb2FkaW5nIHRoZSBpbWFnZSBhbmQgcGFpbnRpbmdcbiAqIGl0IHRvIGEgYGNhbnZhc2AuXG4gKlxuICogTm90ZTogdGhpcyB3aWxsIGNvZXJjZSB0aGUgaW1hZ2UgdG8gdGhlIGRlc2lyZWQgY29udGVudCB0eXBlLCBhbmQgaXRcbiAqIHdpbGwgb25seSBwYWludCB0aGUgZmlyc3QgZnJhbWUgb2YgYW4gYW5pbWF0ZWQgR0lGLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYGpzXG4gKiBibG9iVXRpbC5pbWdTcmNUb0Jsb2IoJ2h0dHA6Ly9teXNpdGUuY29tL2ltZy5wbmcnKS50aGVuKGZ1bmN0aW9uIChibG9iKSB7XG4gKiAgIC8vIHN1Y2Nlc3NcbiAqIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAqICAgLy8gZXJyb3JcbiAqIH0pO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIGJsb2JVdGlsLmltZ1NyY1RvQmxvYignaHR0cDovL3NvbWUtb3RoZXItc2l0ZS5jb20vaW1nLmpwZycsICdpbWFnZS9qcGVnJyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAnQW5vbnltb3VzJywgMS4wKS50aGVuKGZ1bmN0aW9uIChibG9iKSB7XG4gKiAgIC8vIHN1Y2Nlc3NcbiAqIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAqICAgLy8gZXJyb3JcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNyYyAtIGltYWdlIHNyY1xuICogQHBhcmFtIHR5cGUgLSB0aGUgY29udGVudCB0eXBlIChvcHRpb25hbCwgZGVmYXVsdHMgdG8gJ2ltYWdlL3BuZycpXG4gKiBAcGFyYW0gY3Jvc3NPcmlnaW4gLSBmb3IgQ09SUy1lbmFibGVkIGltYWdlcywgc2V0IHRoaXMgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQW5vbnltb3VzJyB0byBhdm9pZCBcInRhaW50ZWQgY2FudmFzXCIgZXJyb3JzXG4gKiBAcGFyYW0gcXVhbGl0eSAtIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSBpbmRpY2F0aW5nIGltYWdlIHF1YWxpdHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSByZXF1ZXN0ZWQgdHlwZSBpcyAnaW1hZ2UvanBlZycgb3IgJ2ltYWdlL3dlYnAnXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYEJsb2JgXG4gKi9cbmZ1bmN0aW9uIGltZ1NyY1RvQmxvYihzcmMsIHR5cGUsIGNyb3NzT3JpZ2luLCBxdWFsaXR5KSB7XG4gICAgdHlwZSA9IHR5cGUgfHwgJ2ltYWdlL3BuZyc7XG4gICAgcmV0dXJuIGxvYWRJbWFnZShzcmMsIGNyb3NzT3JpZ2luKS50aGVuKGltZ1RvQ2FudmFzKS50aGVuKGZ1bmN0aW9uIChjYW52YXMpIHtcbiAgICAgICAgcmV0dXJuIGNhbnZhc1RvQmxvYihjYW52YXMsIHR5cGUsIHF1YWxpdHkpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBDb252ZXJ0IGFuIGBBcnJheUJ1ZmZlcmAgdG8gYSBgQmxvYmAuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIGJsb2IgPSBibG9iVXRpbC5hcnJheUJ1ZmZlclRvQmxvYihhcnJheUJ1ZmYsICdhdWRpby9tcGVnJyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYnVmZmVyXG4gKiBAcGFyYW0gdHlwZSAtIHRoZSBjb250ZW50IHR5cGUgKG9wdGlvbmFsKVxuICogQHJldHVybnMgQmxvYlxuICovXG5mdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmxvYihidWZmZXIsIHR5cGUpIHtcbiAgICByZXR1cm4gY3JlYXRlQmxvYihbYnVmZmVyXSwgdHlwZSk7XG59XG4vKipcbiAqIENvbnZlcnQgYSBgQmxvYmAgdG8gYW4gYEFycmF5QnVmZmVyYC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBibG9iVXRpbC5ibG9iVG9BcnJheUJ1ZmZlcihibG9iKS50aGVuKGZ1bmN0aW9uIChhcnJheUJ1ZmYpIHtcbiAqICAgLy8gc3VjY2Vzc1xuICogfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICogICAvLyBlcnJvclxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYmxvYlxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGBBcnJheUJ1ZmZlcmBcbiAqL1xuZnVuY3Rpb24gYmxvYlRvQXJyYXlCdWZmZXIoYmxvYikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYWRlci5yZXN1bHQgfHwgbmV3IEFycmF5QnVmZmVyKDApO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9O1xuICAgICAgICByZWFkZXIub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBDb252ZXJ0IGFuIGBBcnJheUJ1ZmZlcmAgdG8gYSBiaW5hcnkgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciBteVN0cmluZyA9IGJsb2JVdGlsLmFycmF5QnVmZmVyVG9CaW5hcnlTdHJpbmcoYXJyYXlCdWZmKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGJ1ZmZlciAtIGFycmF5IGJ1ZmZlclxuICogQHJldHVybnMgYmluYXJ5IHN0cmluZ1xuICovXG5mdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmluYXJ5U3RyaW5nKGJ1ZmZlcikge1xuICAgIHZhciBiaW5hcnkgPSAnJztcbiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgIHZhciBsZW5ndGggPSBieXRlcy5ieXRlTGVuZ3RoO1xuICAgIHZhciBpID0gLTE7XG4gICAgd2hpbGUgKCsraSA8IGxlbmd0aCkge1xuICAgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBiaW5hcnk7XG59XG4vKipcbiAqIENvbnZlcnQgYSBiaW5hcnkgc3RyaW5nIHRvIGFuIGBBcnJheUJ1ZmZlcmAuXG4gKlxuICogYGBganNcbiAqIHZhciBteUJ1ZmZlciA9IGJsb2JVdGlsLmJpbmFyeVN0cmluZ1RvQXJyYXlCdWZmZXIoYmluYXJ5U3RyaW5nKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGJpbmFyeSAtIGJpbmFyeSBzdHJpbmdcbiAqIEByZXR1cm5zIGFycmF5IGJ1ZmZlclxuICovXG5mdW5jdGlvbiBiaW5hcnlTdHJpbmdUb0FycmF5QnVmZmVyKGJpbmFyeSkge1xuICAgIHZhciBsZW5ndGggPSBiaW5hcnkubGVuZ3RoO1xuICAgIHZhciBidWYgPSBuZXcgQXJyYXlCdWZmZXIobGVuZ3RoKTtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICB2YXIgaSA9IC0xO1xuICAgIHdoaWxlICgrK2kgPCBsZW5ndGgpIHtcbiAgICAgICAgYXJyW2ldID0gYmluYXJ5LmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBidWY7XG59XG5cbmV4cG9ydCB7IGNyZWF0ZUJsb2IsIGNyZWF0ZU9iamVjdFVSTCwgcmV2b2tlT2JqZWN0VVJMLCBibG9iVG9CaW5hcnlTdHJpbmcsIGJhc2U2NFN0cmluZ1RvQmxvYiwgYmluYXJ5U3RyaW5nVG9CbG9iLCBibG9iVG9CYXNlNjRTdHJpbmcsIGRhdGFVUkxUb0Jsb2IsIGJsb2JUb0RhdGFVUkwsIGltZ1NyY1RvRGF0YVVSTCwgY2FudmFzVG9CbG9iLCBpbWdTcmNUb0Jsb2IsIGFycmF5QnVmZmVyVG9CbG9iLCBibG9iVG9BcnJheUJ1ZmZlciwgYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZywgYmluYXJ5U3RyaW5nVG9BcnJheUJ1ZmZlciB9O1xuIiwiLypcbiAqICBDb3B5cmlnaHQgMjAxMSBUd2l0dGVyLCBJbmMuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4oZnVuY3Rpb24gKEhvZ2FuKSB7XG4gIC8vIFNldHVwIHJlZ2V4ICBhc3NpZ25tZW50c1xuICAvLyByZW1vdmUgd2hpdGVzcGFjZSBhY2NvcmRpbmcgdG8gTXVzdGFjaGUgc3BlY1xuICB2YXIgcklzV2hpdGVzcGFjZSA9IC9cXFMvLFxuICAgICAgclF1b3QgPSAvXFxcIi9nLFxuICAgICAgck5ld2xpbmUgPSAgL1xcbi9nLFxuICAgICAgckNyID0gL1xcci9nLFxuICAgICAgclNsYXNoID0gL1xcXFwvZyxcbiAgICAgIHJMaW5lU2VwID0gL1xcdTIwMjgvLFxuICAgICAgclBhcmFncmFwaFNlcCA9IC9cXHUyMDI5LztcblxuICBIb2dhbi50YWdzID0ge1xuICAgICcjJzogMSwgJ14nOiAyLCAnPCc6IDMsICckJzogNCxcbiAgICAnLyc6IDUsICchJzogNiwgJz4nOiA3LCAnPSc6IDgsICdfdic6IDksXG4gICAgJ3snOiAxMCwgJyYnOiAxMSwgJ190JzogMTJcbiAgfTtcblxuICBIb2dhbi5zY2FuID0gZnVuY3Rpb24gc2Nhbih0ZXh0LCBkZWxpbWl0ZXJzKSB7XG4gICAgdmFyIGxlbiA9IHRleHQubGVuZ3RoLFxuICAgICAgICBJTl9URVhUID0gMCxcbiAgICAgICAgSU5fVEFHX1RZUEUgPSAxLFxuICAgICAgICBJTl9UQUcgPSAyLFxuICAgICAgICBzdGF0ZSA9IElOX1RFWFQsXG4gICAgICAgIHRhZ1R5cGUgPSBudWxsLFxuICAgICAgICB0YWcgPSBudWxsLFxuICAgICAgICBidWYgPSAnJyxcbiAgICAgICAgdG9rZW5zID0gW10sXG4gICAgICAgIHNlZW5UYWcgPSBmYWxzZSxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIGxpbmVTdGFydCA9IDAsXG4gICAgICAgIG90YWcgPSAne3snLFxuICAgICAgICBjdGFnID0gJ319JztcblxuICAgIGZ1bmN0aW9uIGFkZEJ1ZigpIHtcbiAgICAgIGlmIChidWYubGVuZ3RoID4gMCkge1xuICAgICAgICB0b2tlbnMucHVzaCh7dGFnOiAnX3QnLCB0ZXh0OiBuZXcgU3RyaW5nKGJ1Zil9KTtcbiAgICAgICAgYnVmID0gJyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGluZUlzV2hpdGVzcGFjZSgpIHtcbiAgICAgIHZhciBpc0FsbFdoaXRlc3BhY2UgPSB0cnVlO1xuICAgICAgZm9yICh2YXIgaiA9IGxpbmVTdGFydDsgaiA8IHRva2Vucy5sZW5ndGg7IGorKykge1xuICAgICAgICBpc0FsbFdoaXRlc3BhY2UgPVxuICAgICAgICAgIChIb2dhbi50YWdzW3Rva2Vuc1tqXS50YWddIDwgSG9nYW4udGFnc1snX3YnXSkgfHxcbiAgICAgICAgICAodG9rZW5zW2pdLnRhZyA9PSAnX3QnICYmIHRva2Vuc1tqXS50ZXh0Lm1hdGNoKHJJc1doaXRlc3BhY2UpID09PSBudWxsKTtcbiAgICAgICAgaWYgKCFpc0FsbFdoaXRlc3BhY2UpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlzQWxsV2hpdGVzcGFjZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaWx0ZXJMaW5lKGhhdmVTZWVuVGFnLCBub05ld0xpbmUpIHtcbiAgICAgIGFkZEJ1ZigpO1xuXG4gICAgICBpZiAoaGF2ZVNlZW5UYWcgJiYgbGluZUlzV2hpdGVzcGFjZSgpKSB7XG4gICAgICAgIGZvciAodmFyIGogPSBsaW5lU3RhcnQsIG5leHQ7IGogPCB0b2tlbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBpZiAodG9rZW5zW2pdLnRleHQpIHtcbiAgICAgICAgICAgIGlmICgobmV4dCA9IHRva2Vuc1tqKzFdKSAmJiBuZXh0LnRhZyA9PSAnPicpIHtcbiAgICAgICAgICAgICAgLy8gc2V0IGluZGVudCB0byB0b2tlbiB2YWx1ZVxuICAgICAgICAgICAgICBuZXh0LmluZGVudCA9IHRva2Vuc1tqXS50ZXh0LnRvU3RyaW5nKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2Vucy5zcGxpY2UoaiwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFub05ld0xpbmUpIHtcbiAgICAgICAgdG9rZW5zLnB1c2goe3RhZzonXFxuJ30pO1xuICAgICAgfVxuXG4gICAgICBzZWVuVGFnID0gZmFsc2U7XG4gICAgICBsaW5lU3RhcnQgPSB0b2tlbnMubGVuZ3RoO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoYW5nZURlbGltaXRlcnModGV4dCwgaW5kZXgpIHtcbiAgICAgIHZhciBjbG9zZSA9ICc9JyArIGN0YWcsXG4gICAgICAgICAgY2xvc2VJbmRleCA9IHRleHQuaW5kZXhPZihjbG9zZSwgaW5kZXgpLFxuICAgICAgICAgIGRlbGltaXRlcnMgPSB0cmltKFxuICAgICAgICAgICAgdGV4dC5zdWJzdHJpbmcodGV4dC5pbmRleE9mKCc9JywgaW5kZXgpICsgMSwgY2xvc2VJbmRleClcbiAgICAgICAgICApLnNwbGl0KCcgJyk7XG5cbiAgICAgIG90YWcgPSBkZWxpbWl0ZXJzWzBdO1xuICAgICAgY3RhZyA9IGRlbGltaXRlcnNbZGVsaW1pdGVycy5sZW5ndGggLSAxXTtcblxuICAgICAgcmV0dXJuIGNsb3NlSW5kZXggKyBjbG9zZS5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIGlmIChkZWxpbWl0ZXJzKSB7XG4gICAgICBkZWxpbWl0ZXJzID0gZGVsaW1pdGVycy5zcGxpdCgnICcpO1xuICAgICAgb3RhZyA9IGRlbGltaXRlcnNbMF07XG4gICAgICBjdGFnID0gZGVsaW1pdGVyc1sxXTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChzdGF0ZSA9PSBJTl9URVhUKSB7XG4gICAgICAgIGlmICh0YWdDaGFuZ2Uob3RhZywgdGV4dCwgaSkpIHtcbiAgICAgICAgICAtLWk7XG4gICAgICAgICAgYWRkQnVmKCk7XG4gICAgICAgICAgc3RhdGUgPSBJTl9UQUdfVFlQRTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGV4dC5jaGFyQXQoaSkgPT0gJ1xcbicpIHtcbiAgICAgICAgICAgIGZpbHRlckxpbmUoc2VlblRhZyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZiArPSB0ZXh0LmNoYXJBdChpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gSU5fVEFHX1RZUEUpIHtcbiAgICAgICAgaSArPSBvdGFnLmxlbmd0aCAtIDE7XG4gICAgICAgIHRhZyA9IEhvZ2FuLnRhZ3NbdGV4dC5jaGFyQXQoaSArIDEpXTtcbiAgICAgICAgdGFnVHlwZSA9IHRhZyA/IHRleHQuY2hhckF0KGkgKyAxKSA6ICdfdic7XG4gICAgICAgIGlmICh0YWdUeXBlID09ICc9Jykge1xuICAgICAgICAgIGkgPSBjaGFuZ2VEZWxpbWl0ZXJzKHRleHQsIGkpO1xuICAgICAgICAgIHN0YXRlID0gSU5fVEVYVDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGFnKSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gSU5fVEFHO1xuICAgICAgICB9XG4gICAgICAgIHNlZW5UYWcgPSBpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRhZ0NoYW5nZShjdGFnLCB0ZXh0LCBpKSkge1xuICAgICAgICAgIHRva2Vucy5wdXNoKHt0YWc6IHRhZ1R5cGUsIG46IHRyaW0oYnVmKSwgb3RhZzogb3RhZywgY3RhZzogY3RhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgaTogKHRhZ1R5cGUgPT0gJy8nKSA/IHNlZW5UYWcgLSBvdGFnLmxlbmd0aCA6IGkgKyBjdGFnLmxlbmd0aH0pO1xuICAgICAgICAgIGJ1ZiA9ICcnO1xuICAgICAgICAgIGkgKz0gY3RhZy5sZW5ndGggLSAxO1xuICAgICAgICAgIHN0YXRlID0gSU5fVEVYVDtcbiAgICAgICAgICBpZiAodGFnVHlwZSA9PSAneycpIHtcbiAgICAgICAgICAgIGlmIChjdGFnID09ICd9fScpIHtcbiAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2xlYW5UcmlwbGVTdGFjaGUodG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1ZiArPSB0ZXh0LmNoYXJBdChpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZpbHRlckxpbmUoc2VlblRhZywgdHJ1ZSk7XG5cbiAgICByZXR1cm4gdG9rZW5zO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYW5UcmlwbGVTdGFjaGUodG9rZW4pIHtcbiAgICBpZiAodG9rZW4ubi5zdWJzdHIodG9rZW4ubi5sZW5ndGggLSAxKSA9PT0gJ30nKSB7XG4gICAgICB0b2tlbi5uID0gdG9rZW4ubi5zdWJzdHJpbmcoMCwgdG9rZW4ubi5sZW5ndGggLSAxKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0cmltKHMpIHtcbiAgICBpZiAocy50cmltKSB7XG4gICAgICByZXR1cm4gcy50cmltKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMucmVwbGFjZSgvXlxccyp8XFxzKiQvZywgJycpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGFnQ2hhbmdlKHRhZywgdGV4dCwgaW5kZXgpIHtcbiAgICBpZiAodGV4dC5jaGFyQXQoaW5kZXgpICE9IHRhZy5jaGFyQXQoMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMSwgbCA9IHRhZy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0ZXh0LmNoYXJBdChpbmRleCArIGkpICE9IHRhZy5jaGFyQXQoaSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gdGhlIHRhZ3MgYWxsb3dlZCBpbnNpZGUgc3VwZXIgdGVtcGxhdGVzXG4gIHZhciBhbGxvd2VkSW5TdXBlciA9IHsnX3QnOiB0cnVlLCAnXFxuJzogdHJ1ZSwgJyQnOiB0cnVlLCAnLyc6IHRydWV9O1xuXG4gIGZ1bmN0aW9uIGJ1aWxkVHJlZSh0b2tlbnMsIGtpbmQsIHN0YWNrLCBjdXN0b21UYWdzKSB7XG4gICAgdmFyIGluc3RydWN0aW9ucyA9IFtdLFxuICAgICAgICBvcGVuZXIgPSBudWxsLFxuICAgICAgICB0YWlsID0gbnVsbCxcbiAgICAgICAgdG9rZW4gPSBudWxsO1xuXG4gICAgdGFpbCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuXG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICB0b2tlbiA9IHRva2Vucy5zaGlmdCgpO1xuXG4gICAgICBpZiAodGFpbCAmJiB0YWlsLnRhZyA9PSAnPCcgJiYgISh0b2tlbi50YWcgaW4gYWxsb3dlZEluU3VwZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBjb250ZW50IGluIDwgc3VwZXIgdGFnLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoSG9nYW4udGFnc1t0b2tlbi50YWddIDw9IEhvZ2FuLnRhZ3NbJyQnXSB8fCBpc09wZW5lcih0b2tlbiwgY3VzdG9tVGFncykpIHtcbiAgICAgICAgc3RhY2sucHVzaCh0b2tlbik7XG4gICAgICAgIHRva2VuLm5vZGVzID0gYnVpbGRUcmVlKHRva2VucywgdG9rZW4udGFnLCBzdGFjaywgY3VzdG9tVGFncyk7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuLnRhZyA9PSAnLycpIHtcbiAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2xvc2luZyB0YWcgd2l0aG91dCBvcGVuZXI6IC8nICsgdG9rZW4ubik7XG4gICAgICAgIH1cbiAgICAgICAgb3BlbmVyID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGlmICh0b2tlbi5uICE9IG9wZW5lci5uICYmICFpc0Nsb3Nlcih0b2tlbi5uLCBvcGVuZXIubiwgY3VzdG9tVGFncykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lc3RpbmcgZXJyb3I6ICcgKyBvcGVuZXIubiArICcgdnMuICcgKyB0b2tlbi5uKTtcbiAgICAgICAgfVxuICAgICAgICBvcGVuZXIuZW5kID0gdG9rZW4uaTtcbiAgICAgICAgcmV0dXJuIGluc3RydWN0aW9ucztcbiAgICAgIH0gZWxzZSBpZiAodG9rZW4udGFnID09ICdcXG4nKSB7XG4gICAgICAgIHRva2VuLmxhc3QgPSAodG9rZW5zLmxlbmd0aCA9PSAwKSB8fCAodG9rZW5zWzBdLnRhZyA9PSAnXFxuJyk7XG4gICAgICB9XG5cbiAgICAgIGluc3RydWN0aW9ucy5wdXNoKHRva2VuKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNsb3NpbmcgdGFnOiAnICsgc3RhY2sucG9wKCkubik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RydWN0aW9ucztcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzT3BlbmVyKHRva2VuLCB0YWdzKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0YWdzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKHRhZ3NbaV0ubyA9PSB0b2tlbi5uKSB7XG4gICAgICAgIHRva2VuLnRhZyA9ICcjJztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNDbG9zZXIoY2xvc2UsIG9wZW4sIHRhZ3MpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRhZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAodGFnc1tpXS5jID09IGNsb3NlICYmIHRhZ3NbaV0ubyA9PSBvcGVuKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0cmluZ2lmeVN1YnN0aXR1dGlvbnMob2JqKSB7XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaXRlbXMucHVzaCgnXCInICsgZXNjKGtleSkgKyAnXCI6IGZ1bmN0aW9uKGMscCx0LGkpIHsnICsgb2JqW2tleV0gKyAnfScpO1xuICAgIH1cbiAgICByZXR1cm4gXCJ7IFwiICsgaXRlbXMuam9pbihcIixcIikgKyBcIiB9XCI7XG4gIH1cblxuICBmdW5jdGlvbiBzdHJpbmdpZnlQYXJ0aWFscyhjb2RlT2JqKSB7XG4gICAgdmFyIHBhcnRpYWxzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIGNvZGVPYmoucGFydGlhbHMpIHtcbiAgICAgIHBhcnRpYWxzLnB1c2goJ1wiJyArIGVzYyhrZXkpICsgJ1wiOntuYW1lOlwiJyArIGVzYyhjb2RlT2JqLnBhcnRpYWxzW2tleV0ubmFtZSkgKyAnXCIsICcgKyBzdHJpbmdpZnlQYXJ0aWFscyhjb2RlT2JqLnBhcnRpYWxzW2tleV0pICsgXCJ9XCIpO1xuICAgIH1cbiAgICByZXR1cm4gXCJwYXJ0aWFsczoge1wiICsgcGFydGlhbHMuam9pbihcIixcIikgKyBcIn0sIHN1YnM6IFwiICsgc3RyaW5naWZ5U3Vic3RpdHV0aW9ucyhjb2RlT2JqLnN1YnMpO1xuICB9XG5cbiAgSG9nYW4uc3RyaW5naWZ5ID0gZnVuY3Rpb24oY29kZU9iaiwgdGV4dCwgb3B0aW9ucykge1xuICAgIHJldHVybiBcIntjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgXCIgKyBIb2dhbi53cmFwTWFpbihjb2RlT2JqLmNvZGUpICsgXCIgfSxcIiArIHN0cmluZ2lmeVBhcnRpYWxzKGNvZGVPYmopICsgIFwifVwiO1xuICB9XG5cbiAgdmFyIHNlcmlhbE5vID0gMDtcbiAgSG9nYW4uZ2VuZXJhdGUgPSBmdW5jdGlvbih0cmVlLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgc2VyaWFsTm8gPSAwO1xuICAgIHZhciBjb250ZXh0ID0geyBjb2RlOiAnJywgc3Viczoge30sIHBhcnRpYWxzOiB7fSB9O1xuICAgIEhvZ2FuLndhbGsodHJlZSwgY29udGV4dCk7XG5cbiAgICBpZiAob3B0aW9ucy5hc1N0cmluZykge1xuICAgICAgcmV0dXJuIHRoaXMuc3RyaW5naWZ5KGNvbnRleHQsIHRleHQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VUZW1wbGF0ZShjb250ZXh0LCB0ZXh0LCBvcHRpb25zKTtcbiAgfVxuXG4gIEhvZ2FuLndyYXBNYWluID0gZnVuY3Rpb24oY29kZSkge1xuICAgIHJldHVybiAndmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTsnICsgY29kZSArICdyZXR1cm4gdC5mbCgpOyc7XG4gIH1cblxuICBIb2dhbi50ZW1wbGF0ZSA9IEhvZ2FuLlRlbXBsYXRlO1xuXG4gIEhvZ2FuLm1ha2VUZW1wbGF0ZSA9IGZ1bmN0aW9uKGNvZGVPYmosIHRleHQsIG9wdGlvbnMpIHtcbiAgICB2YXIgdGVtcGxhdGUgPSB0aGlzLm1ha2VQYXJ0aWFscyhjb2RlT2JqKTtcbiAgICB0ZW1wbGF0ZS5jb2RlID0gbmV3IEZ1bmN0aW9uKCdjJywgJ3AnLCAnaScsIHRoaXMud3JhcE1haW4oY29kZU9iai5jb2RlKSk7XG4gICAgcmV0dXJuIG5ldyB0aGlzLnRlbXBsYXRlKHRlbXBsYXRlLCB0ZXh0LCB0aGlzLCBvcHRpb25zKTtcbiAgfVxuXG4gIEhvZ2FuLm1ha2VQYXJ0aWFscyA9IGZ1bmN0aW9uKGNvZGVPYmopIHtcbiAgICB2YXIga2V5LCB0ZW1wbGF0ZSA9IHtzdWJzOiB7fSwgcGFydGlhbHM6IGNvZGVPYmoucGFydGlhbHMsIG5hbWU6IGNvZGVPYmoubmFtZX07XG4gICAgZm9yIChrZXkgaW4gdGVtcGxhdGUucGFydGlhbHMpIHtcbiAgICAgIHRlbXBsYXRlLnBhcnRpYWxzW2tleV0gPSB0aGlzLm1ha2VQYXJ0aWFscyh0ZW1wbGF0ZS5wYXJ0aWFsc1trZXldKTtcbiAgICB9XG4gICAgZm9yIChrZXkgaW4gY29kZU9iai5zdWJzKSB7XG4gICAgICB0ZW1wbGF0ZS5zdWJzW2tleV0gPSBuZXcgRnVuY3Rpb24oJ2MnLCAncCcsICd0JywgJ2knLCBjb2RlT2JqLnN1YnNba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVzYyhzKSB7XG4gICAgcmV0dXJuIHMucmVwbGFjZShyU2xhc2gsICdcXFxcXFxcXCcpXG4gICAgICAgICAgICAucmVwbGFjZShyUXVvdCwgJ1xcXFxcXFwiJylcbiAgICAgICAgICAgIC5yZXBsYWNlKHJOZXdsaW5lLCAnXFxcXG4nKVxuICAgICAgICAgICAgLnJlcGxhY2UockNyLCAnXFxcXHInKVxuICAgICAgICAgICAgLnJlcGxhY2UockxpbmVTZXAsICdcXFxcdTIwMjgnKVxuICAgICAgICAgICAgLnJlcGxhY2UoclBhcmFncmFwaFNlcCwgJ1xcXFx1MjAyOScpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hvb3NlTWV0aG9kKHMpIHtcbiAgICByZXR1cm4gKH5zLmluZGV4T2YoJy4nKSkgPyAnZCcgOiAnZic7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQYXJ0aWFsKG5vZGUsIGNvbnRleHQpIHtcbiAgICB2YXIgcHJlZml4ID0gXCI8XCIgKyAoY29udGV4dC5wcmVmaXggfHwgXCJcIik7XG4gICAgdmFyIHN5bSA9IHByZWZpeCArIG5vZGUubiArIHNlcmlhbE5vKys7XG4gICAgY29udGV4dC5wYXJ0aWFsc1tzeW1dID0ge25hbWU6IG5vZGUubiwgcGFydGlhbHM6IHt9fTtcbiAgICBjb250ZXh0LmNvZGUgKz0gJ3QuYih0LnJwKFwiJyArICBlc2Moc3ltKSArICdcIixjLHAsXCInICsgKG5vZGUuaW5kZW50IHx8ICcnKSArICdcIikpOyc7XG4gICAgcmV0dXJuIHN5bTtcbiAgfVxuXG4gIEhvZ2FuLmNvZGVnZW4gPSB7XG4gICAgJyMnOiBmdW5jdGlvbihub2RlLCBjb250ZXh0KSB7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gJ2lmKHQucyh0LicgKyBjaG9vc2VNZXRob2Qobm9kZS5uKSArICcoXCInICsgZXNjKG5vZGUubikgKyAnXCIsYyxwLDEpLCcgK1xuICAgICAgICAgICAgICAgICAgICAgICdjLHAsMCwnICsgbm9kZS5pICsgJywnICsgbm9kZS5lbmQgKyAnLFwiJyArIG5vZGUub3RhZyArIFwiIFwiICsgbm9kZS5jdGFnICsgJ1wiKSl7JyArXG4gICAgICAgICAgICAgICAgICAgICAgJ3QucnMoYyxwLCcgKyAnZnVuY3Rpb24oYyxwLHQpeyc7XG4gICAgICBIb2dhbi53YWxrKG5vZGUubm9kZXMsIGNvbnRleHQpO1xuICAgICAgY29udGV4dC5jb2RlICs9ICd9KTtjLnBvcCgpO30nO1xuICAgIH0sXG5cbiAgICAnXic6IGZ1bmN0aW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICAgIGNvbnRleHQuY29kZSArPSAnaWYoIXQucyh0LicgKyBjaG9vc2VNZXRob2Qobm9kZS5uKSArICcoXCInICsgZXNjKG5vZGUubikgKyAnXCIsYyxwLDEpLGMscCwxLDAsMCxcIlwiKSl7JztcbiAgICAgIEhvZ2FuLndhbGsobm9kZS5ub2RlcywgY29udGV4dCk7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gJ307JztcbiAgICB9LFxuXG4gICAgJz4nOiBjcmVhdGVQYXJ0aWFsLFxuICAgICc8JzogZnVuY3Rpb24obm9kZSwgY29udGV4dCkge1xuICAgICAgdmFyIGN0eCA9IHtwYXJ0aWFsczoge30sIGNvZGU6ICcnLCBzdWJzOiB7fSwgaW5QYXJ0aWFsOiB0cnVlfTtcbiAgICAgIEhvZ2FuLndhbGsobm9kZS5ub2RlcywgY3R4KTtcbiAgICAgIHZhciB0ZW1wbGF0ZSA9IGNvbnRleHQucGFydGlhbHNbY3JlYXRlUGFydGlhbChub2RlLCBjb250ZXh0KV07XG4gICAgICB0ZW1wbGF0ZS5zdWJzID0gY3R4LnN1YnM7XG4gICAgICB0ZW1wbGF0ZS5wYXJ0aWFscyA9IGN0eC5wYXJ0aWFscztcbiAgICB9LFxuXG4gICAgJyQnOiBmdW5jdGlvbihub2RlLCBjb250ZXh0KSB7XG4gICAgICB2YXIgY3R4ID0ge3N1YnM6IHt9LCBjb2RlOiAnJywgcGFydGlhbHM6IGNvbnRleHQucGFydGlhbHMsIHByZWZpeDogbm9kZS5ufTtcbiAgICAgIEhvZ2FuLndhbGsobm9kZS5ub2RlcywgY3R4KTtcbiAgICAgIGNvbnRleHQuc3Vic1tub2RlLm5dID0gY3R4LmNvZGU7XG4gICAgICBpZiAoIWNvbnRleHQuaW5QYXJ0aWFsKSB7XG4gICAgICAgIGNvbnRleHQuY29kZSArPSAndC5zdWIoXCInICsgZXNjKG5vZGUubikgKyAnXCIsYyxwLGkpOyc7XG4gICAgICB9XG4gICAgfSxcblxuICAgICdcXG4nOiBmdW5jdGlvbihub2RlLCBjb250ZXh0KSB7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gd3JpdGUoJ1wiXFxcXG5cIicgKyAobm9kZS5sYXN0ID8gJycgOiAnICsgaScpKTtcbiAgICB9LFxuXG4gICAgJ192JzogZnVuY3Rpb24obm9kZSwgY29udGV4dCkge1xuICAgICAgY29udGV4dC5jb2RlICs9ICd0LmIodC52KHQuJyArIGNob29zZU1ldGhvZChub2RlLm4pICsgJyhcIicgKyBlc2Mobm9kZS5uKSArICdcIixjLHAsMCkpKTsnO1xuICAgIH0sXG5cbiAgICAnX3QnOiBmdW5jdGlvbihub2RlLCBjb250ZXh0KSB7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gd3JpdGUoJ1wiJyArIGVzYyhub2RlLnRleHQpICsgJ1wiJyk7XG4gICAgfSxcblxuICAgICd7JzogdHJpcGxlU3RhY2hlLFxuXG4gICAgJyYnOiB0cmlwbGVTdGFjaGVcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaXBsZVN0YWNoZShub2RlLCBjb250ZXh0KSB7XG4gICAgY29udGV4dC5jb2RlICs9ICd0LmIodC50KHQuJyArIGNob29zZU1ldGhvZChub2RlLm4pICsgJyhcIicgKyBlc2Mobm9kZS5uKSArICdcIixjLHAsMCkpKTsnO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGUocykge1xuICAgIHJldHVybiAndC5iKCcgKyBzICsgJyk7JztcbiAgfVxuXG4gIEhvZ2FuLndhbGsgPSBmdW5jdGlvbihub2RlbGlzdCwgY29udGV4dCkge1xuICAgIHZhciBmdW5jO1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gbm9kZWxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmdW5jID0gSG9nYW4uY29kZWdlbltub2RlbGlzdFtpXS50YWddO1xuICAgICAgZnVuYyAmJiBmdW5jKG5vZGVsaXN0W2ldLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cblxuICBIb2dhbi5wYXJzZSA9IGZ1bmN0aW9uKHRva2VucywgdGV4dCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBidWlsZFRyZWUodG9rZW5zLCAnJywgW10sIG9wdGlvbnMuc2VjdGlvblRhZ3MgfHwgW10pO1xuICB9XG5cbiAgSG9nYW4uY2FjaGUgPSB7fTtcblxuICBIb2dhbi5jYWNoZUtleSA9IGZ1bmN0aW9uKHRleHQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gW3RleHQsICEhb3B0aW9ucy5hc1N0cmluZywgISFvcHRpb25zLmRpc2FibGVMYW1iZGEsIG9wdGlvbnMuZGVsaW1pdGVycywgISFvcHRpb25zLm1vZGVsR2V0XS5qb2luKCd8fCcpO1xuICB9XG5cbiAgSG9nYW4uY29tcGlsZSA9IGZ1bmN0aW9uKHRleHQsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB2YXIga2V5ID0gSG9nYW4uY2FjaGVLZXkodGV4dCwgb3B0aW9ucyk7XG4gICAgdmFyIHRlbXBsYXRlID0gdGhpcy5jYWNoZVtrZXldO1xuXG4gICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICB2YXIgcGFydGlhbHMgPSB0ZW1wbGF0ZS5wYXJ0aWFscztcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gcGFydGlhbHMpIHtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxzW25hbWVdLmluc3RhbmNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH1cblxuICAgIHRlbXBsYXRlID0gdGhpcy5nZW5lcmF0ZSh0aGlzLnBhcnNlKHRoaXMuc2Nhbih0ZXh0LCBvcHRpb25zLmRlbGltaXRlcnMpLCB0ZXh0LCBvcHRpb25zKSwgdGV4dCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVba2V5XSA9IHRlbXBsYXRlO1xuICB9XG59KSh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcgPyBleHBvcnRzIDogSG9nYW4pO1xuIiwiLypcbiAqICBDb3B5cmlnaHQgMjAxMSBUd2l0dGVyLCBJbmMuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vLyBUaGlzIGZpbGUgaXMgZm9yIHVzZSB3aXRoIE5vZGUuanMuIFNlZSBkaXN0LyBmb3IgYnJvd3NlciBmaWxlcy5cblxudmFyIEhvZ2FuID0gcmVxdWlyZSgnLi9jb21waWxlcicpO1xuSG9nYW4uVGVtcGxhdGUgPSByZXF1aXJlKCcuL3RlbXBsYXRlJykuVGVtcGxhdGU7XG5Ib2dhbi50ZW1wbGF0ZSA9IEhvZ2FuLlRlbXBsYXRlO1xubW9kdWxlLmV4cG9ydHMgPSBIb2dhbjtcbiIsIi8qXG4gKiAgQ29weXJpZ2h0IDIwMTEgVHdpdHRlciwgSW5jLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxudmFyIEhvZ2FuID0ge307XG5cbihmdW5jdGlvbiAoSG9nYW4pIHtcbiAgSG9nYW4uVGVtcGxhdGUgPSBmdW5jdGlvbiAoY29kZU9iaiwgdGV4dCwgY29tcGlsZXIsIG9wdGlvbnMpIHtcbiAgICBjb2RlT2JqID0gY29kZU9iaiB8fCB7fTtcbiAgICB0aGlzLnIgPSBjb2RlT2JqLmNvZGUgfHwgdGhpcy5yO1xuICAgIHRoaXMuYyA9IGNvbXBpbGVyO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy50ZXh0ID0gdGV4dCB8fCAnJztcbiAgICB0aGlzLnBhcnRpYWxzID0gY29kZU9iai5wYXJ0aWFscyB8fCB7fTtcbiAgICB0aGlzLnN1YnMgPSBjb2RlT2JqLnN1YnMgfHwge307XG4gICAgdGhpcy5idWYgPSAnJztcbiAgfVxuXG4gIEhvZ2FuLlRlbXBsYXRlLnByb3RvdHlwZSA9IHtcbiAgICAvLyByZW5kZXI6IHJlcGxhY2VkIGJ5IGdlbmVyYXRlZCBjb2RlLlxuICAgIHI6IGZ1bmN0aW9uIChjb250ZXh0LCBwYXJ0aWFscywgaW5kZW50KSB7IHJldHVybiAnJzsgfSxcblxuICAgIC8vIHZhcmlhYmxlIGVzY2FwaW5nXG4gICAgdjogaG9nYW5Fc2NhcGUsXG5cbiAgICAvLyB0cmlwbGUgc3RhY2hlXG4gICAgdDogY29lcmNlVG9TdHJpbmcsXG5cbiAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihjb250ZXh0LCBwYXJ0aWFscywgaW5kZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5yaShbY29udGV4dF0sIHBhcnRpYWxzIHx8IHt9LCBpbmRlbnQpO1xuICAgIH0sXG5cbiAgICAvLyByZW5kZXIgaW50ZXJuYWwgLS0gYSBob29rIGZvciBvdmVycmlkZXMgdGhhdCBjYXRjaGVzIHBhcnRpYWxzIHRvb1xuICAgIHJpOiBmdW5jdGlvbiAoY29udGV4dCwgcGFydGlhbHMsIGluZGVudCkge1xuICAgICAgcmV0dXJuIHRoaXMucihjb250ZXh0LCBwYXJ0aWFscywgaW5kZW50KTtcbiAgICB9LFxuXG4gICAgLy8gZW5zdXJlUGFydGlhbFxuICAgIGVwOiBmdW5jdGlvbihzeW1ib2wsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgcGFydGlhbCA9IHRoaXMucGFydGlhbHNbc3ltYm9sXTtcblxuICAgICAgLy8gY2hlY2sgdG8gc2VlIHRoYXQgaWYgd2UndmUgaW5zdGFudGlhdGVkIHRoaXMgcGFydGlhbCBiZWZvcmVcbiAgICAgIHZhciB0ZW1wbGF0ZSA9IHBhcnRpYWxzW3BhcnRpYWwubmFtZV07XG4gICAgICBpZiAocGFydGlhbC5pbnN0YW5jZSAmJiBwYXJ0aWFsLmJhc2UgPT0gdGVtcGxhdGUpIHtcbiAgICAgICAgcmV0dXJuIHBhcnRpYWwuaW5zdGFuY2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKCF0aGlzLmMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb21waWxlciBhdmFpbGFibGUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlID0gdGhpcy5jLmNvbXBpbGUodGVtcGxhdGUsIHRoaXMub3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGVtcGxhdGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIHVzZSB0aGlzIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHBhcnRpYWxzIGRpY3Rpb25hcnkgaGFzIGNoYW5nZWRcbiAgICAgIHRoaXMucGFydGlhbHNbc3ltYm9sXS5iYXNlID0gdGVtcGxhdGU7XG5cbiAgICAgIGlmIChwYXJ0aWFsLnN1YnMpIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNvbnNpZGVyIHBhcmVudCB0ZW1wbGF0ZSBub3dcbiAgICAgICAgaWYgKCFwYXJ0aWFscy5zdGFja1RleHQpIHBhcnRpYWxzLnN0YWNrVGV4dCA9IHt9O1xuICAgICAgICBmb3IgKGtleSBpbiBwYXJ0aWFsLnN1YnMpIHtcbiAgICAgICAgICBpZiAoIXBhcnRpYWxzLnN0YWNrVGV4dFtrZXldKSB7XG4gICAgICAgICAgICBwYXJ0aWFscy5zdGFja1RleHRba2V5XSA9ICh0aGlzLmFjdGl2ZVN1YiAhPT0gdW5kZWZpbmVkICYmIHBhcnRpYWxzLnN0YWNrVGV4dFt0aGlzLmFjdGl2ZVN1Yl0pID8gcGFydGlhbHMuc3RhY2tUZXh0W3RoaXMuYWN0aXZlU3ViXSA6IHRoaXMudGV4dDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGVtcGxhdGUgPSBjcmVhdGVTcGVjaWFsaXplZFBhcnRpYWwodGVtcGxhdGUsIHBhcnRpYWwuc3VicywgcGFydGlhbC5wYXJ0aWFscyxcbiAgICAgICAgICB0aGlzLnN0YWNrU3VicywgdGhpcy5zdGFja1BhcnRpYWxzLCBwYXJ0aWFscy5zdGFja1RleHQpO1xuICAgICAgfVxuICAgICAgdGhpcy5wYXJ0aWFsc1tzeW1ib2xdLmluc3RhbmNlID0gdGVtcGxhdGU7XG5cbiAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICB9LFxuXG4gICAgLy8gdHJpZXMgdG8gZmluZCBhIHBhcnRpYWwgaW4gdGhlIGN1cnJlbnQgc2NvcGUgYW5kIHJlbmRlciBpdFxuICAgIHJwOiBmdW5jdGlvbihzeW1ib2wsIGNvbnRleHQsIHBhcnRpYWxzLCBpbmRlbnQpIHtcbiAgICAgIHZhciBwYXJ0aWFsID0gdGhpcy5lcChzeW1ib2wsIHBhcnRpYWxzKTtcbiAgICAgIGlmICghcGFydGlhbCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJ0aWFsLnJpKGNvbnRleHQsIHBhcnRpYWxzLCBpbmRlbnQpO1xuICAgIH0sXG5cbiAgICAvLyByZW5kZXIgYSBzZWN0aW9uXG4gICAgcnM6IGZ1bmN0aW9uKGNvbnRleHQsIHBhcnRpYWxzLCBzZWN0aW9uKSB7XG4gICAgICB2YXIgdGFpbCA9IGNvbnRleHRbY29udGV4dC5sZW5ndGggLSAxXTtcblxuICAgICAgaWYgKCFpc0FycmF5KHRhaWwpKSB7XG4gICAgICAgIHNlY3Rpb24oY29udGV4dCwgcGFydGlhbHMsIHRoaXMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFpbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb250ZXh0LnB1c2godGFpbFtpXSk7XG4gICAgICAgIHNlY3Rpb24oY29udGV4dCwgcGFydGlhbHMsIHRoaXMpO1xuICAgICAgICBjb250ZXh0LnBvcCgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBtYXliZSBzdGFydCBhIHNlY3Rpb25cbiAgICBzOiBmdW5jdGlvbih2YWwsIGN0eCwgcGFydGlhbHMsIGludmVydGVkLCBzdGFydCwgZW5kLCB0YWdzKSB7XG4gICAgICB2YXIgcGFzcztcblxuICAgICAgaWYgKGlzQXJyYXkodmFsKSAmJiB2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSB0aGlzLm1zKHZhbCwgY3R4LCBwYXJ0aWFscywgaW52ZXJ0ZWQsIHN0YXJ0LCBlbmQsIHRhZ3MpO1xuICAgICAgfVxuXG4gICAgICBwYXNzID0gISF2YWw7XG5cbiAgICAgIGlmICghaW52ZXJ0ZWQgJiYgcGFzcyAmJiBjdHgpIHtcbiAgICAgICAgY3R4LnB1c2goKHR5cGVvZiB2YWwgPT0gJ29iamVjdCcpID8gdmFsIDogY3R4W2N0eC5sZW5ndGggLSAxXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXNzO1xuICAgIH0sXG5cbiAgICAvLyBmaW5kIHZhbHVlcyB3aXRoIGRvdHRlZCBuYW1lc1xuICAgIGQ6IGZ1bmN0aW9uKGtleSwgY3R4LCBwYXJ0aWFscywgcmV0dXJuRm91bmQpIHtcbiAgICAgIHZhciBmb3VuZCxcbiAgICAgICAgICBuYW1lcyA9IGtleS5zcGxpdCgnLicpLFxuICAgICAgICAgIHZhbCA9IHRoaXMuZihuYW1lc1swXSwgY3R4LCBwYXJ0aWFscywgcmV0dXJuRm91bmQpLFxuICAgICAgICAgIGRvTW9kZWxHZXQgPSB0aGlzLm9wdGlvbnMubW9kZWxHZXQsXG4gICAgICAgICAgY3ggPSBudWxsO1xuXG4gICAgICBpZiAoa2V5ID09PSAnLicgJiYgaXNBcnJheShjdHhbY3R4Lmxlbmd0aCAtIDJdKSkge1xuICAgICAgICB2YWwgPSBjdHhbY3R4Lmxlbmd0aCAtIDFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGZvdW5kID0gZmluZEluU2NvcGUobmFtZXNbaV0sIHZhbCwgZG9Nb2RlbEdldCk7XG4gICAgICAgICAgaWYgKGZvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGN4ID0gdmFsO1xuICAgICAgICAgICAgdmFsID0gZm91bmQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbCA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmV0dXJuRm91bmQgJiYgIXZhbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmV0dXJuRm91bmQgJiYgdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGN0eC5wdXNoKGN4KTtcbiAgICAgICAgdmFsID0gdGhpcy5tdih2YWwsIGN0eCwgcGFydGlhbHMpO1xuICAgICAgICBjdHgucG9wKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIC8vIGZpbmQgdmFsdWVzIHdpdGggbm9ybWFsIG5hbWVzXG4gICAgZjogZnVuY3Rpb24oa2V5LCBjdHgsIHBhcnRpYWxzLCByZXR1cm5Gb3VuZCkge1xuICAgICAgdmFyIHZhbCA9IGZhbHNlLFxuICAgICAgICAgIHYgPSBudWxsLFxuICAgICAgICAgIGZvdW5kID0gZmFsc2UsXG4gICAgICAgICAgZG9Nb2RlbEdldCA9IHRoaXMub3B0aW9ucy5tb2RlbEdldDtcblxuICAgICAgZm9yICh2YXIgaSA9IGN0eC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2ID0gY3R4W2ldO1xuICAgICAgICB2YWwgPSBmaW5kSW5TY29wZShrZXksIHYsIGRvTW9kZWxHZXQpO1xuICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICByZXR1cm4gKHJldHVybkZvdW5kKSA/IGZhbHNlIDogXCJcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXR1cm5Gb3VuZCAmJiB0eXBlb2YgdmFsID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsID0gdGhpcy5tdih2YWwsIGN0eCwgcGFydGlhbHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICAvLyBoaWdoZXIgb3JkZXIgdGVtcGxhdGVzXG4gICAgbHM6IGZ1bmN0aW9uKGZ1bmMsIGN4LCBwYXJ0aWFscywgdGV4dCwgdGFncykge1xuICAgICAgdmFyIG9sZFRhZ3MgPSB0aGlzLm9wdGlvbnMuZGVsaW1pdGVycztcblxuICAgICAgdGhpcy5vcHRpb25zLmRlbGltaXRlcnMgPSB0YWdzO1xuICAgICAgdGhpcy5iKHRoaXMuY3QoY29lcmNlVG9TdHJpbmcoZnVuYy5jYWxsKGN4LCB0ZXh0KSksIGN4LCBwYXJ0aWFscykpO1xuICAgICAgdGhpcy5vcHRpb25zLmRlbGltaXRlcnMgPSBvbGRUYWdzO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8vIGNvbXBpbGUgdGV4dFxuICAgIGN0OiBmdW5jdGlvbih0ZXh0LCBjeCwgcGFydGlhbHMpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZUxhbWJkYSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xhbWJkYSBmZWF0dXJlcyBkaXNhYmxlZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmMuY29tcGlsZSh0ZXh0LCB0aGlzLm9wdGlvbnMpLnJlbmRlcihjeCwgcGFydGlhbHMpO1xuICAgIH0sXG5cbiAgICAvLyB0ZW1wbGF0ZSByZXN1bHQgYnVmZmVyaW5nXG4gICAgYjogZnVuY3Rpb24ocykgeyB0aGlzLmJ1ZiArPSBzOyB9LFxuXG4gICAgZmw6IGZ1bmN0aW9uKCkgeyB2YXIgciA9IHRoaXMuYnVmOyB0aGlzLmJ1ZiA9ICcnOyByZXR1cm4gcjsgfSxcblxuICAgIC8vIG1ldGhvZCByZXBsYWNlIHNlY3Rpb25cbiAgICBtczogZnVuY3Rpb24oZnVuYywgY3R4LCBwYXJ0aWFscywgaW52ZXJ0ZWQsIHN0YXJ0LCBlbmQsIHRhZ3MpIHtcbiAgICAgIHZhciB0ZXh0U291cmNlLFxuICAgICAgICAgIGN4ID0gY3R4W2N0eC5sZW5ndGggLSAxXSxcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmNhbGwoY3gpO1xuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChpbnZlcnRlZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRleHRTb3VyY2UgPSAodGhpcy5hY3RpdmVTdWIgJiYgdGhpcy5zdWJzVGV4dCAmJiB0aGlzLnN1YnNUZXh0W3RoaXMuYWN0aXZlU3ViXSkgPyB0aGlzLnN1YnNUZXh0W3RoaXMuYWN0aXZlU3ViXSA6IHRoaXMudGV4dDtcbiAgICAgICAgICByZXR1cm4gdGhpcy5scyhyZXN1bHQsIGN4LCBwYXJ0aWFscywgdGV4dFNvdXJjZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCksIHRhZ3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIC8vIG1ldGhvZCByZXBsYWNlIHZhcmlhYmxlXG4gICAgbXY6IGZ1bmN0aW9uKGZ1bmMsIGN0eCwgcGFydGlhbHMpIHtcbiAgICAgIHZhciBjeCA9IGN0eFtjdHgubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgcmVzdWx0ID0gZnVuYy5jYWxsKGN4KTtcblxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdGhpcy5jdChjb2VyY2VUb1N0cmluZyhyZXN1bHQuY2FsbChjeCkpLCBjeCwgcGFydGlhbHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBzdWI6IGZ1bmN0aW9uKG5hbWUsIGNvbnRleHQsIHBhcnRpYWxzLCBpbmRlbnQpIHtcbiAgICAgIHZhciBmID0gdGhpcy5zdWJzW25hbWVdO1xuICAgICAgaWYgKGYpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVTdWIgPSBuYW1lO1xuICAgICAgICBmKGNvbnRleHQsIHBhcnRpYWxzLCB0aGlzLCBpbmRlbnQpO1xuICAgICAgICB0aGlzLmFjdGl2ZVN1YiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICB9O1xuXG4gIC8vRmluZCBhIGtleSBpbiBhbiBvYmplY3RcbiAgZnVuY3Rpb24gZmluZEluU2NvcGUoa2V5LCBzY29wZSwgZG9Nb2RlbEdldCkge1xuICAgIHZhciB2YWw7XG5cbiAgICBpZiAoc2NvcGUgJiYgdHlwZW9mIHNjb3BlID09ICdvYmplY3QnKSB7XG5cbiAgICAgIGlmIChzY29wZVtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsID0gc2NvcGVba2V5XTtcblxuICAgICAgLy8gdHJ5IGxvb2t1cCB3aXRoIGdldCBmb3IgYmFja2JvbmUgb3Igc2ltaWxhciBtb2RlbCBkYXRhXG4gICAgICB9IGVsc2UgaWYgKGRvTW9kZWxHZXQgJiYgc2NvcGUuZ2V0ICYmIHR5cGVvZiBzY29wZS5nZXQgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSBzY29wZS5nZXQoa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3BlY2lhbGl6ZWRQYXJ0aWFsKGluc3RhbmNlLCBzdWJzLCBwYXJ0aWFscywgc3RhY2tTdWJzLCBzdGFja1BhcnRpYWxzLCBzdGFja1RleHQpIHtcbiAgICBmdW5jdGlvbiBQYXJ0aWFsVGVtcGxhdGUoKSB7fTtcbiAgICBQYXJ0aWFsVGVtcGxhdGUucHJvdG90eXBlID0gaW5zdGFuY2U7XG4gICAgZnVuY3Rpb24gU3Vic3RpdHV0aW9ucygpIHt9O1xuICAgIFN1YnN0aXR1dGlvbnMucHJvdG90eXBlID0gaW5zdGFuY2Uuc3VicztcbiAgICB2YXIga2V5O1xuICAgIHZhciBwYXJ0aWFsID0gbmV3IFBhcnRpYWxUZW1wbGF0ZSgpO1xuICAgIHBhcnRpYWwuc3VicyA9IG5ldyBTdWJzdGl0dXRpb25zKCk7XG4gICAgcGFydGlhbC5zdWJzVGV4dCA9IHt9OyAgLy9oZWhlLiBzdWJzdGV4dC5cbiAgICBwYXJ0aWFsLmJ1ZiA9ICcnO1xuXG4gICAgc3RhY2tTdWJzID0gc3RhY2tTdWJzIHx8IHt9O1xuICAgIHBhcnRpYWwuc3RhY2tTdWJzID0gc3RhY2tTdWJzO1xuICAgIHBhcnRpYWwuc3Vic1RleHQgPSBzdGFja1RleHQ7XG4gICAgZm9yIChrZXkgaW4gc3Vicykge1xuICAgICAgaWYgKCFzdGFja1N1YnNba2V5XSkgc3RhY2tTdWJzW2tleV0gPSBzdWJzW2tleV07XG4gICAgfVxuICAgIGZvciAoa2V5IGluIHN0YWNrU3Vicykge1xuICAgICAgcGFydGlhbC5zdWJzW2tleV0gPSBzdGFja1N1YnNba2V5XTtcbiAgICB9XG5cbiAgICBzdGFja1BhcnRpYWxzID0gc3RhY2tQYXJ0aWFscyB8fCB7fTtcbiAgICBwYXJ0aWFsLnN0YWNrUGFydGlhbHMgPSBzdGFja1BhcnRpYWxzO1xuICAgIGZvciAoa2V5IGluIHBhcnRpYWxzKSB7XG4gICAgICBpZiAoIXN0YWNrUGFydGlhbHNba2V5XSkgc3RhY2tQYXJ0aWFsc1trZXldID0gcGFydGlhbHNba2V5XTtcbiAgICB9XG4gICAgZm9yIChrZXkgaW4gc3RhY2tQYXJ0aWFscykge1xuICAgICAgcGFydGlhbC5wYXJ0aWFsc1trZXldID0gc3RhY2tQYXJ0aWFsc1trZXldO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0aWFsO1xuICB9XG5cbiAgdmFyIHJBbXAgPSAvJi9nLFxuICAgICAgckx0ID0gLzwvZyxcbiAgICAgIHJHdCA9IC8+L2csXG4gICAgICByQXBvcyA9IC9cXCcvZyxcbiAgICAgIHJRdW90ID0gL1xcXCIvZyxcbiAgICAgIGhDaGFycyA9IC9bJjw+XFxcIlxcJ10vO1xuXG4gIGZ1bmN0aW9uIGNvZXJjZVRvU3RyaW5nKHZhbCkge1xuICAgIHJldHVybiBTdHJpbmcoKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgPyAnJyA6IHZhbCk7XG4gIH1cblxuICBmdW5jdGlvbiBob2dhbkVzY2FwZShzdHIpIHtcbiAgICBzdHIgPSBjb2VyY2VUb1N0cmluZyhzdHIpO1xuICAgIHJldHVybiBoQ2hhcnMudGVzdChzdHIpID9cbiAgICAgIHN0clxuICAgICAgICAucmVwbGFjZShyQW1wLCAnJmFtcDsnKVxuICAgICAgICAucmVwbGFjZShyTHQsICcmbHQ7JylcbiAgICAgICAgLnJlcGxhY2Uockd0LCAnJmd0OycpXG4gICAgICAgIC5yZXBsYWNlKHJBcG9zLCAnJiMzOTsnKVxuICAgICAgICAucmVwbGFjZShyUXVvdCwgJyZxdW90OycpIDpcbiAgICAgIHN0cjtcbiAgfVxuXG4gIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbihhKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgfTtcblxufSkodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnID8gZXhwb3J0cyA6IEhvZ2FuKTtcbiIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGxpXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBpZD1cXFwiYXBwZWFyYW5jZS1pdGVtLVwiKTt0LmIodC52KHQuZihcIml0ZW1pZFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW0gZ3JvdXAtXCIpO3QuYih0LnYodC5mKFwiZ3JvdXBcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBkYXRhLWl0ZW1pZD1cXFwiXCIpO3QuYih0LnYodC5mKFwiaXRlbWlkXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgZGF0YS1uYW1lPVxcXCJcIik7dC5iKHQudih0LmYoXCJuYW1lXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgZGF0YS1yYXJpdHk9XFxcIlwiKTt0LmIodC52KHQuZihcInJhcml0eVwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGRhdGEtcmFyaXR5bmFtZT1cXFwiXCIpO3QuYih0LnYodC5mKFwicmFyaXR5bmFtZVwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8ZGl2IGNsYXNzPVxcXCJyYXJpdHktbWFya2VyLVwiKTt0LmIodC52KHQuZihcInJhcml0eVwiLGMscCwwKSkpO3QuYihcIlxcXCI+PC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8aW1nIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW0taWNvblxcXCIgc3JjPVxcXCJcIik7dC5iKHQudih0LmYoXCJpY29uXCIsYyxwLDApKSk7dC5iKFwiXFxcIiAvPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvbGk+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGxpXFxuICBpZD1cXFwiYXBwZWFyYW5jZS1pdGVtLXt7aXRlbWlkfX1cXFwiXFxuICBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtIGdyb3VwLXt7Z3JvdXB9fVxcXCJcXG4gIGRhdGEtaXRlbWlkPVxcXCJ7e2l0ZW1pZH19XFxcIlxcbiAgZGF0YS1uYW1lPVxcXCJ7e25hbWV9fVxcXCJcXG4gIGRhdGEtcmFyaXR5PVxcXCJ7e3Jhcml0eX19XFxcIlxcbiAgZGF0YS1yYXJpdHluYW1lPVxcXCJ7e3Jhcml0eW5hbWV9fVxcXCJcXG4+XFxuICA8ZGl2IGNsYXNzPVxcXCJyYXJpdHktbWFya2VyLXt7cmFyaXR5fX1cXFwiPjwvZGl2PlxcbiAgPGltZyBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtLWljb25cXFwiIHNyYz1cXFwie3tpY29ufX1cXFwiIC8+XFxuPC9saT5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxkaXZcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGlkPVxcXCJlZS1jYXRlZ29yeVxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5IGFjdGl2ZVxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGRhdGEtY2F0ZWdvcnk9XFxcIlwiKTt0LmIodC52KHQuZihcImNhdGVnb3J5XCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgZGF0YS1jYXRlZ29yeWlkPVxcXCJcIik7dC5iKHQudih0LmYoXCJjYXRlZ29yeWlkXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxzdHlsZT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgI2VlLWl0ZW1zIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBzY3JvbGxiYXItY29sb3I6IGRhcms7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8L3N0eWxlPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPHVsXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW1zLWxpc3RcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGlkPVxcXCJlZS1pdGVtc1xcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgc3R5bGU9XFxcIm1heC1oZWlnaHQ6IGNhbGMoMTAwdmggLSA1NjVweClcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIFwiKTt0LmIodC50KHQuZihcIml0ZW1zXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvdWw+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPCEtLSBJbmZvIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGRpdiBpZD1cXFwiZWUtaW5mb1xcXCIgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbXMtaW5mb1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxkaXYgY2xhc3M9XFxcImFwcGVhcmFuY2UtaW5mby10aXBzXFxcIj48L2Rpdj5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxoMyBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtLWluZm8tbmFtZVxcXCI+PC9oMz5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxkaXYgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbS1pbmZvLWd1YXJkXFxcIj48L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGRpdiBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtLWluZm8tcmFyaXR5XFxcIj48L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGRpdiBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtLWluZm8tYnV0dG9uc1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPGRpdiBjbGFzcz1cXFwiYXBwZWFyYW5jZS1mb3J3YXJkIG5sLWJ1dHRvblxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUuYXBwZWFyYW5jZS5idXR0b25zLmZvcndhcmRcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDxkaXYgY2xhc3M9XFxcImFwcGVhcmFuY2UtYmFja3dhcmQgbmwtYnV0dG9uXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hcHBlYXJhbmNlLmJ1dHRvbnMuYmFja3dhcmRcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxkaXZcXG4gIGlkPVxcXCJlZS1jYXRlZ29yeVxcXCJcXG4gIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5IGFjdGl2ZVxcXCJcXG4gIGRhdGEtY2F0ZWdvcnk9XFxcInt7Y2F0ZWdvcnl9fVxcXCJcXG4gIGRhdGEtY2F0ZWdvcnlpZD1cXFwie3tjYXRlZ29yeWlkfX1cXFwiXFxuPlxcbiAgPHN0eWxlPlxcbiAgICAjZWUtaXRlbXMge1xcbiAgICAgIHNjcm9sbGJhci1jb2xvcjogZGFyaztcXG4gICAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47XFxuICAgIH1cXG4gIDwvc3R5bGU+XFxuICA8dWxcXG4gICAgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbXMtbGlzdFxcXCJcXG4gICAgaWQ9XFxcImVlLWl0ZW1zXFxcIlxcbiAgICBzdHlsZT1cXFwibWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDU2NXB4KVxcXCJcXG4gID5cXG4gICAge3t7aXRlbXN9fX1cXG4gIDwvdWw+XFxuXFxuICA8IS0tIEluZm8gLS0+XFxuICA8ZGl2IGlkPVxcXCJlZS1pbmZvXFxcIiBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtcy1pbmZvXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pbmZvLXRpcHNcXFwiPjwvZGl2PlxcblxcbiAgICA8aDMgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbS1pbmZvLW5hbWVcXFwiPjwvaDM+XFxuXFxuICAgIDxkaXYgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbS1pbmZvLWd1YXJkXFxcIj48L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtLWluZm8tcmFyaXR5XFxcIj48L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtLWluZm8tYnV0dG9uc1xcXCI+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwiYXBwZWFyYW5jZS1mb3J3YXJkIG5sLWJ1dHRvblxcXCI+XFxuICAgICAgICB7e3RyYW5zbGF0ZS5hcHBlYXJhbmNlLmJ1dHRvbnMuZm9yd2FyZH19XFxuICAgICAgPC9kaXY+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwiYXBwZWFyYW5jZS1iYWNrd2FyZCBubC1idXR0b25cXFwiPlxcbiAgICAgICAge3t0cmFuc2xhdGUuYXBwZWFyYW5jZS5idXR0b25zLmJhY2t3YXJkfX1cXG4gICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuICA8L2Rpdj5cXG48L2Rpdj5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxkaXZcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGlkPVxcXCJhcHBlYXJhbmNlLWl0ZW1zLWdyb3VwLVwiKTt0LmIodC52KHQuZihcImdyb3VwXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnlcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBkYXRhLWNhdGVnb3J5aWQ9XFxcIlwiKTt0LmIodC52KHQuZihcImNhdGVnb3J5aWRcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBkYXRhLWNhdGVnb3J5PVxcXCJcIik7dC5iKHQudih0LmYoXCJjYXRlZ29yeVwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8dWwgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbXMtbGlzdFxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIFwiKTt0LmIodC50KHQuZihcIml0ZW1zXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvdWw+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGRpdlxcbiAgaWQ9XFxcImFwcGVhcmFuY2UtaXRlbXMtZ3JvdXAte3tncm91cH19XFxcIlxcbiAgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnlcXFwiXFxuICBkYXRhLWNhdGVnb3J5aWQ9XFxcInt7Y2F0ZWdvcnlpZH19XFxcIlxcbiAgZGF0YS1jYXRlZ29yeT1cXFwie3tjYXRlZ29yeX19XFxcIlxcbj5cXG4gIDx1bCBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtcy1saXN0XFxcIj5cXG4gICAge3t7aXRlbXN9fX1cXG4gIDwvdWw+XFxuPC9kaXY+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8ZGl2XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBpZD1cXFwibWFya2V0cGxhY2UtaXRlbURldGFpbC1pbmZvLWF1dG9idXlcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBzdHlsZT1cXFwidGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW46IDIwcHggYXV0b1xcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8ZGl2IGNsYXNzPVxcXCJubC1idXR0b25cXFwiPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQuYWRkX3RvX3dpc2hsaXN0LnRpdGxlXCIsYyxwLDApKSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGRpdlxcbiAgaWQ9XFxcIm1hcmtldHBsYWNlLWl0ZW1EZXRhaWwtaW5mby1hdXRvYnV5XFxcIlxcbiAgc3R5bGU9XFxcInRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luOiAyMHB4IGF1dG9cXFwiXFxuPlxcbiAgPGRpdiBjbGFzcz1cXFwibmwtYnV0dG9uXFxcIj57e3RyYW5zbGF0ZS5tYXJrZXQuYWRkX3RvX3dpc2hsaXN0LnRpdGxlfX08L2Rpdj5cXG48L2Rpdj5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxoMT5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0LmFkZF90b193aXNobGlzdC50aXRsZVwiLGMscCwwKSkpO3QuYihcIjwvaDE+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPHA+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC5hZGRfdG9fd2lzaGxpc3QudGV4dFwiLGMscCwwKSkpO3QuYihcIjwvcD5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8aDE+e3t0cmFuc2xhdGUubWFya2V0LmFkZF90b193aXNobGlzdC50aXRsZX19PC9oMT5cXG48cD57e3RyYW5zbGF0ZS5tYXJrZXQuYWRkX3RvX3dpc2hsaXN0LnRleHR9fTwvcD5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxoMT5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFsbC5hZGRfdG9fd2lzaGxpc3QudGl0bGVcIixjLHAsMCkpKTt0LmIoXCI8L2gxPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjxwPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYWxsLmFkZF90b193aXNobGlzdC50ZXh0XCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjxwIHN0eWxlPVxcXCJmb250LXNpemU6IDE0cHhcXFwiPjxlbT5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFsbC5hZGRfdG9fd2lzaGxpc3Qubm90ZVwiLGMscCwwKSkpO3QuYihcIjwvZW0+PC9wPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxoMT57e3RyYW5zbGF0ZS5tYWxsLmFkZF90b193aXNobGlzdC50aXRsZX19PC9oMT5cXG48cD57e3RyYW5zbGF0ZS5tYWxsLmFkZF90b193aXNobGlzdC50ZXh0fX08L3A+XFxuPHAgc3R5bGU9XFxcImZvbnQtc2l6ZTogMTRweFxcXCI+PGVtPnt7dHJhbnNsYXRlLm1hbGwuYWRkX3RvX3dpc2hsaXN0Lm5vdGV9fTwvZW0+PC9wPlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGJ1dHRvblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgaWQ9XFxcImF1dG8tZXhwbG9yZS1idXR0b25cXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBjbGFzcz1cXFwibmwtYnV0dG9uIFwiKTtpZih0LnModC5mKFwiYWN0aXZlXCIsYyxwLDEpLGMscCwwLDY1LDcxLFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCJhY3RpdmVcIik7fSk7Yy5wb3AoKTt9dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgZGF0YS1pZD1cXFwiXCIpO3QuYih0LnYodC5mKFwibG9jYXRpb25JZFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGRhdGEtbWFwaWQ9XFxcIlwiKTt0LmIodC52KHQuZihcInJlZ2lvbklkXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5wZXQuYXV0b19leHBsb3JlXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2J1dHRvbj5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8YnV0dG9uXFxuICBpZD1cXFwiYXV0by1leHBsb3JlLWJ1dHRvblxcXCJcXG4gIGNsYXNzPVxcXCJubC1idXR0b24ge3sjYWN0aXZlfX1hY3RpdmV7ey9hY3RpdmV9fVxcXCJcXG4gIGRhdGEtaWQ9XFxcInt7bG9jYXRpb25JZH19XFxcIlxcbiAgZGF0YS1tYXBpZD1cXFwie3tyZWdpb25JZH19XFxcIlxcbj5cXG4gIHt7dHJhbnNsYXRlLnBldC5hdXRvX2V4cGxvcmV9fVxcbjwvYnV0dG9uPlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGFcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGlkPVxcXCJcIik7dC5iKHQudih0LmYoXCJpZFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGNsYXNzPVxcXCJjYXJvdXNlbC1uZXdzIGNhcm91c2VsLWVlXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgaHJlZj1cXFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgc3R5bGU9XFxcImJhY2tncm91bmQtaW1hZ2U6IHVybChcIik7dC5iKHQudih0LmYoXCJiYWNrZ3JvdW5kSW1hZ2VcIixjLHAsMCkpKTt0LmIoXCIpXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxkaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxoND5cIik7dC5iKHQudih0LmYoXCJoNFwiLGMscCwwKSkpO3QuYihcIjwvaDQ+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxoNT5cIik7dC5iKHQudih0LmYoXCJoNVwiLGMscCwwKSkpO3QuYihcIjwvaDU+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxwPlwiKTt0LmIodC52KHQuZihcInBcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2E+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGFcXG4gIGlkPVxcXCJ7e2lkfX1cXFwiXFxuICBjbGFzcz1cXFwiY2Fyb3VzZWwtbmV3cyBjYXJvdXNlbC1lZVxcXCJcXG4gIGhyZWY9XFxcIlxcXCJcXG4gIHN0eWxlPVxcXCJiYWNrZ3JvdW5kLWltYWdlOiB1cmwoe3tiYWNrZ3JvdW5kSW1hZ2V9fSlcXFwiXFxuPlxcbiAgPGRpdj5cXG4gICAgPGg0Pnt7aDR9fTwvaDQ+XFxuICAgIDxoNT57e2g1fX08L2g1PlxcbiAgICA8cD57e3B9fTwvcD5cXG4gIDwvZGl2PlxcbjwvYT5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxoMT5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0LmNoYW5nZV9wcmljZS50aXRsZVwiLGMscCwwKSkpO3QuYihcIjwvaDE+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPHA+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC5jaGFuZ2VfcHJpY2UudGV4dFwiLGMscCwwKSkpO3QuYihcIjwvcD5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8aDE+e3t0cmFuc2xhdGUubWFya2V0LmNoYW5nZV9wcmljZS50aXRsZX19PC9oMT5cXG48cD57e3RyYW5zbGF0ZS5tYXJrZXQuY2hhbmdlX3ByaWNlLnRleHR9fTwvcD5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxoMT5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLnNhdmVfb3V0Zml0LnRpdGxlXCIsYyxwLDApKSk7dC5iKFwiPC9oMT5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPHA+XCIpO3QuYih0LnQodC5kKFwidHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5zYXZlX291dGZpdC5zYXZlZF9sb2NhbGx5XCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8YnIgLz5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPHA+XCIpO3QuYih0LnQodC5kKFwidHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5zYXZlX291dGZpdC5nb3RvX2FjY291bnRcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjxpbnB1dFwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgaWQ9XFxcImNob29zZS1uYW1lXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgbWF4bGVuZ3RoPVxcXCIzMFxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIG1pbmxlbmd0aD1cXFwiMVxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIHBsYWNlaG9sZGVyPVxcXCJcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLnNhdmVfb3V0Zml0LnBsYWNlaG9sZGVyXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIi8+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGgxPnt7dHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5zYXZlX291dGZpdC50aXRsZX19PC9oMT5cXG5cXG48cD57e3t0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLnNhdmVfb3V0Zml0LnNhdmVkX2xvY2FsbHl9fX08L3A+XFxuXFxuPGJyIC8+XFxuXFxuPHA+e3t7dHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5zYXZlX291dGZpdC5nb3RvX2FjY291bnR9fX08L3A+XFxuXFxuPGlucHV0XFxuICBpZD1cXFwiY2hvb3NlLW5hbWVcXFwiXFxuICBtYXhsZW5ndGg9XFxcIjMwXFxcIlxcbiAgbWlubGVuZ3RoPVxcXCIxXFxcIlxcbiAgcGxhY2Vob2xkZXI9XFxcInt7dHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5zYXZlX291dGZpdC5wbGFjZWhvbGRlcn19XFxcIlxcbi8+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8ZGl2IGlkPVxcXCJoaXN0b3J5LWNvbnRhaW5lclxcXCIgc3R5bGU9XFxcIndpZHRoOiAxMDAlXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxzdHlsZT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLmhpc3RvcnktYWN0aW9ucyB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbWFyZ2luLWJvdHRvbTogMWVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAjZGVsZXRlLWhpc3Rvcnkge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIG1hcmdpbi1yaWdodDogMWVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAuaGVscC1pY29uIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDI5MWY2O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBib3gtc2hhZG93OiBub25lO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGNvbG9yOiAjZmZmO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtc2l6ZTogMjZweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LXdlaWdodDogYm9sZDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBoZWlnaHQ6IDIzcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgcGFkZGluZzogMDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgd2lkdGg6IDIzcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5oaXN0b3J5LW1lc3NhZ2Uge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBib3JkZXItcmFkaXVzOiAxZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbWFyZ2luOiAxZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgcGFkZGluZzogMWVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAuaGlzdG9yeS1yb3cge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGRpc3BsYXk6IGZsZXg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZmxleC13cmFwOiB3cmFwO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGhlaWdodDogNDY1cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbWFyZ2luLXJpZ2h0OiAxZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgb3ZlcmZsb3cteTogYXV0bztcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBzY3JvbGxiYXItY29sb3I6IGRhcms7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAucmVzdWx0LWNhcmQge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBib3gtc2hhZG93OiAwIDAgNXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMyk7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaGVpZ2h0OiAyMDVweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBtYXJnaW46IDAuNWVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHBhZGRpbmc6IDAuNWVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB3aWR0aDogMTI4cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5yZXN1bHQtaW1hZ2Uge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBib3gtc2hhZG93OiAwIDAgNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSxcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDAgMnB4IDRweCAycHggcmdiYSgwLCAwLCAwLCAwLjA4KTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBoZWlnaHQ6IDEwMHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB0b3A6IC0wLjhlbTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB3aWR0aDogMTAwcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5yZXN1bHQtY29udGVudC1jb2x1bW4ge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGRpc3BsYXk6IGZsZXg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBoZWlnaHQ6IDEwM3B4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLnJlc3VsdC1uYW1lIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIC13ZWJraXQtbGluZS1jbGFtcDogMztcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBjb2xvcjogcmdiKDUyLCA1NiwgMTExKTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmbGV4LWdyb3c6IDE7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZm9udC1zaXplOiAxNnB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIG1hcmdpbi10b3A6IC0wLjJlbTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBvdmVyZmxvdzogaGlkZGVuO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAucmVzdWx0LWxvY2F0aW9uIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLnJlc3VsdC1kYXRlIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBjb2xvcjogI2ZiODkwMDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LXNpemU6IDEzcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5yZXN1bHQtaWNvbnMge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIG1hcmdpbi10b3A6IDAuNWVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAucmVzdWx0LWNvdW50IHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYm9yZGVyOiAxcHggc29saWQgIzAwY2RmYjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGNvbG9yOiAjM2VjMGQ3O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LWZhbWlseTogXFxcIkFsZWdyZXlhIFNhbnMgU0NcXFwiLCBzYW5zLXNlcmlmO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtc2l6ZTogMThweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LXdlaWdodDogODAwO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGhlaWdodDogMjlweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBsaW5lLWhlaWdodDogMjdweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgd2lkdGg6IDI5cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5oaXN0b3J5LXRyYWRhYmxlIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjY2O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJvcmRlci1yYWRpdXM6IDI1cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYm9yZGVyOiAxcHggc29saWQgI2I5YjliOTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBjb2xvcjogI2ZmZmZmZjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZm9udC1mYW1pbHk6IFxcXCJUZW1wIE1lbnVcXFwiLCBzZXJpZjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LXNpemU6IDEzcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaGVpZ2h0OiAxNXB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGxpbmUtaGVpZ2h0OiAxNXB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB3aWR0aDogMTVweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLmljb24tc3BhY2VyIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgd2lkdGg6IDAuMWVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8L3N0eWxlPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxkaXYgY2xhc3M9XFxcImhpc3RvcnktYWN0aW9uc1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxidXR0b24gaWQ9XFxcImRlbGV0ZS1oaXN0b3J5XFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUucGV0LmRlbGV0ZV9oaXN0b3J5XCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC9idXR0b24+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8c3BhbiBjbGFzcz1cXFwidG9vbHRpcFxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPHNwYW4gY2xhc3M9XFxcIm5sLWJ1dHRvbiBoZWxwLWljb25cXFwiPj88L3NwYW4+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPGRpdiBjbGFzcz1cXFwidG9vbHRpcC1jb250ZW50XFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxwPlwiKTt0LmIodC50KHQuZChcInRyYW5zbGF0ZS5wZXQuc2F2ZWRfbG9jYWxseVwiLGMscCwwKSkpO3QuYihcIjwvcD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxwPlwiKTt0LmIodC50KHQuZChcInRyYW5zbGF0ZS5wZXQuZ290b19hY2NvdW50XCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8L3NwYW4+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7aWYoIXQucyh0LmYoXCJoaXN0b3J5XCIsYyxwLDEpLGMscCwxLDAsMCxcIlwiKSl7dC5iKFwiICA8cCBjbGFzcz1cXFwiaGlzdG9yeS1tZXNzYWdlXFxcIj5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUucGV0LmVtcHR5X2hpc3RvcnlcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiICsgaSk7fTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGRpdiBjbGFzcz1cXFwiaGlzdG9yeS1yb3dcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO2lmKHQucyh0LmYoXCJoaXN0b3J5XCIsYyxwLDEpLGMscCwwLDMyMzAsMzg2MyxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiICAgIDxkaXYgY2xhc3M9XFxcInJlc3VsdC1jYXJkXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8aW1nIGNsYXNzPVxcXCJyZXN1bHQtaW1hZ2VcXFwiIHNyYz1cXFwiXCIpO3QuYih0LnYodC5mKFwiaWNvblwiLGMscCwwKSkpO3QuYihcIlxcXCIgLz5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWNvbnRlbnQtY29sdW1uXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcInJlc3VsdC1uYW1lXFxcIj5cIik7dC5iKHQudih0LmYoXCJuYW1lXCIsYyxwLDApKSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtbG9jYXRpb25cXFwiPlwiKTt0LmIodC52KHQuZihcImxvY2F0aW9uTmFtZVwiLGMscCwwKSkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWRhdGVcXFwiPlwiKTt0LmIodC52KHQuZihcImRhdGVcIixjLHAsMCkpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtaWNvbnNcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICBcIik7aWYodC5zKHQuZihcImNvdW50XCIsYyxwLDEpLGMscCwwLDM1NjYsMzYwOSxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiPHNwYW4gY2xhc3M9XFxcInJlc3VsdC1jb3VudFxcXCI+XCIpO3QuYih0LnYodC5mKFwiY291bnRcIixjLHAsMCkpKTt0LmIoXCI8L3NwYW4+XCIpO30pO2MucG9wKCk7fXQuYihcIlxcblwiICsgaSk7aWYodC5zKHQuZihcImNvdW50XCIsYyxwLDEpLGMscCwwLDM2NDAsMzcxOSxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7aWYodC5zKHQuZihcInRyYWRhYmxlXCIsYyxwLDEpLGMscCwwLDM2NTMsMzcwNixcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImljb24tc3BhY2VyXFxcIj48L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgXCIpO30pO2MucG9wKCk7fX0pO2MucG9wKCk7fXQuYihcIiBcIik7aWYodC5zKHQuZihcInRyYWRhYmxlXCIsYyxwLDEpLGMscCwwLDM3NDMsMzgwNixcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiPHNwYW4gY2xhc3M9XFxcImhpc3RvcnktdHJhZGFibGVcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgICAgPu6ggjwvc3BhblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICA+XCIpO30pO2MucG9wKCk7fXQuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7fSk7Yy5wb3AoKTt9dC5iKFwiICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8ZGl2IGlkPVxcXCJoaXN0b3J5LWNvbnRhaW5lclxcXCIgc3R5bGU9XFxcIndpZHRoOiAxMDAlXFxcIj5cXG4gIDxzdHlsZT5cXG4gICAgLmhpc3RvcnktYWN0aW9ucyB7XFxuICAgICAgbWFyZ2luLWJvdHRvbTogMWVtO1xcbiAgICB9XFxuXFxuICAgICNkZWxldGUtaGlzdG9yeSB7XFxuICAgICAgbWFyZ2luLXJpZ2h0OiAxZW07XFxuICAgIH1cXG5cXG4gICAgLmhlbHAtaWNvbiB7XFxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAyOTFmNjtcXG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxuICAgICAgYm94LXNoYWRvdzogbm9uZTtcXG4gICAgICBjb2xvcjogI2ZmZjtcXG4gICAgICBmb250LXNpemU6IDI2cHg7XFxuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICAgICAgaGVpZ2h0OiAyM3B4O1xcbiAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xcbiAgICAgIHBhZGRpbmc6IDA7XFxuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICAgIHdpZHRoOiAyM3B4O1xcbiAgICB9XFxuXFxuICAgIC5oaXN0b3J5LW1lc3NhZ2Uge1xcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcXG4gICAgICBib3JkZXItcmFkaXVzOiAxZW07XFxuICAgICAgbWFyZ2luOiAxZW07XFxuICAgICAgcGFkZGluZzogMWVtO1xcbiAgICB9XFxuXFxuICAgIC5oaXN0b3J5LXJvdyB7XFxuICAgICAgZGlzcGxheTogZmxleDtcXG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XFxuICAgICAgaGVpZ2h0OiA0NjVweDtcXG4gICAgICBtYXJnaW4tcmlnaHQ6IDFlbTtcXG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xcbiAgICAgIHNjcm9sbGJhci1jb2xvcjogZGFyaztcXG4gICAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47XFxuICAgIH1cXG5cXG4gICAgLnJlc3VsdC1jYXJkIHtcXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgICBib3JkZXItcmFkaXVzOiAxZW07XFxuICAgICAgYm94LXNoYWRvdzogMCAwIDVweCAycHggcmdiYSgwLCAwLCAwLCAwLjMpO1xcbiAgICAgIGhlaWdodDogMjA1cHg7XFxuICAgICAgbWFyZ2luOiAwLjVlbTtcXG4gICAgICBwYWRkaW5nOiAwLjVlbTtcXG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgICAgd2lkdGg6IDEyOHB4O1xcbiAgICB9XFxuXFxuICAgIC5yZXN1bHQtaW1hZ2Uge1xcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcXG4gICAgICBib3gtc2hhZG93OiAwIDAgNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSxcXG4gICAgICAgIDAgMnB4IDRweCAycHggcmdiYSgwLCAwLCAwLCAwLjA4KTtcXG4gICAgICBoZWlnaHQ6IDEwMHB4O1xcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgICB0b3A6IC0wLjhlbTtcXG4gICAgICB3aWR0aDogMTAwcHg7XFxuICAgIH1cXG5cXG4gICAgLnJlc3VsdC1jb250ZW50LWNvbHVtbiB7XFxuICAgICAgZGlzcGxheTogZmxleDtcXG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICAgIGhlaWdodDogMTAzcHg7XFxuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbiAgICB9XFxuXFxuICAgIC5yZXN1bHQtbmFtZSB7XFxuICAgICAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcXG4gICAgICAtd2Via2l0LWxpbmUtY2xhbXA6IDM7XFxuICAgICAgY29sb3I6IHJnYig1MiwgNTYsIDExMSk7XFxuICAgICAgZGlzcGxheTogLXdlYmtpdC1ib3g7XFxuICAgICAgZmxleC1ncm93OiAxO1xcbiAgICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gICAgICBmb250LXdlaWdodDogYm9sZDtcXG4gICAgICBtYXJnaW4tdG9wOiAtMC4yZW07XFxuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgfVxcblxcbiAgICAucmVzdWx0LWxvY2F0aW9uIHtcXG4gICAgfVxcblxcbiAgICAucmVzdWx0LWRhdGUge1xcbiAgICAgIGNvbG9yOiAjZmI4OTAwO1xcbiAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gICAgICBmb250LXdlaWdodDogYm9sZDtcXG4gICAgfVxcblxcbiAgICAucmVzdWx0LWljb25zIHtcXG4gICAgICBtYXJnaW4tdG9wOiAwLjVlbTtcXG4gICAgfVxcblxcbiAgICAucmVzdWx0LWNvdW50IHtcXG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XFxuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzAwY2RmYjtcXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICAgIGNvbG9yOiAjM2VjMGQ3O1xcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgICBmb250LWZhbWlseTogXFxcIkFsZWdyZXlhIFNhbnMgU0NcXFwiLCBzYW5zLXNlcmlmO1xcbiAgICAgIGZvbnQtc2l6ZTogMThweDtcXG4gICAgICBmb250LXdlaWdodDogODAwO1xcbiAgICAgIGhlaWdodDogMjlweDtcXG4gICAgICBsaW5lLWhlaWdodDogMjdweDtcXG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgICAgd2lkdGg6IDI5cHg7XFxuICAgIH1cXG5cXG4gICAgLmhpc3RvcnktdHJhZGFibGUge1xcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICM2NjY7XFxuICAgICAgYm9yZGVyLXJhZGl1czogMjVweDtcXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYjliOWI5O1xcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgICBmb250LWZhbWlseTogXFxcIlRlbXAgTWVudVxcXCIsIHNlcmlmO1xcbiAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gICAgICBoZWlnaHQ6IDE1cHg7XFxuICAgICAgbGluZS1oZWlnaHQ6IDE1cHg7XFxuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICAgIHdpZHRoOiAxNXB4O1xcbiAgICB9XFxuXFxuICAgIC5pY29uLXNwYWNlciB7XFxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAgIHdpZHRoOiAwLjFlbTtcXG4gICAgfVxcbiAgPC9zdHlsZT5cXG5cXG4gIDxkaXYgY2xhc3M9XFxcImhpc3RvcnktYWN0aW9uc1xcXCI+XFxuICAgIDxidXR0b24gaWQ9XFxcImRlbGV0ZS1oaXN0b3J5XFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uXFxcIj5cXG4gICAgICB7e3RyYW5zbGF0ZS5wZXQuZGVsZXRlX2hpc3Rvcnl9fVxcbiAgICA8L2J1dHRvbj5cXG5cXG4gICAgPHNwYW4gY2xhc3M9XFxcInRvb2x0aXBcXFwiPlxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJubC1idXR0b24gaGVscC1pY29uXFxcIj4/PC9zcGFuPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInRvb2x0aXAtY29udGVudFxcXCI+XFxuICAgICAgICA8cD57e3t0cmFuc2xhdGUucGV0LnNhdmVkX2xvY2FsbHl9fX08L3A+XFxuICAgICAgICA8cD57e3t0cmFuc2xhdGUucGV0LmdvdG9fYWNjb3VudH19fTwvcD5cXG4gICAgICA8L2Rpdj5cXG4gICAgPC9zcGFuPlxcbiAgPC9kaXY+XFxuXFxuICB7e15oaXN0b3J5fX1cXG4gIDxwIGNsYXNzPVxcXCJoaXN0b3J5LW1lc3NhZ2VcXFwiPnt7dHJhbnNsYXRlLnBldC5lbXB0eV9oaXN0b3J5fX08L3A+XFxuICB7ey9oaXN0b3J5fX1cXG5cXG4gIDxkaXYgY2xhc3M9XFxcImhpc3Rvcnktcm93XFxcIj5cXG4gICAge3sjaGlzdG9yeX19XFxuICAgIDxkaXYgY2xhc3M9XFxcInJlc3VsdC1jYXJkXFxcIj5cXG4gICAgICA8aW1nIGNsYXNzPVxcXCJyZXN1bHQtaW1hZ2VcXFwiIHNyYz1cXFwie3tpY29ufX1cXFwiIC8+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+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC10aW1lXFxcIj57e2RhdGV9fTwvZGl2PlxcbiAgICAgICAgPGRpdlxcbiAgICAgICAgICBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSBtYXJrZXRwbGFjZS1pdGVtRGV0YWlsLWNhbmNlbCBkZWxldGUtYnV0dG9uXFxcIlxcbiAgICAgICAgPlxcbiAgICAgICAgICB7e3RyYW5zbGF0ZS5tYXJrZXQuYXVjdGlvbnMuZGVsZXRlfX1cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2xpPlxcbiAgICB7ey9zYWxlc319XFxuICA8L3VsPlxcbjwvZGl2PlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGRpdiBpZD1cXFwiZWUtb3V0Zml0LXRodW1ic1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8c3R5bGU+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlcyAuc2xvdC5lZS1hdmFpbGFibGUtc2xvdCB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGh0dHBzOi8vZ2l0bGFiLmNvbS9OYXRvQm9yYW0vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLS9yYXcvbWFzdGVyL2ltYWdlcy9hdmFpbGFibGUtZmF2b3JpdGUucG5nKTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTRweCAtMTFweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBiYWNrZ3JvdW5kLXNpemU6IDE3MXB4IDI0NHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJvcmRlci1yYWRpdXM6IDQ0cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYm94LXNoYWRvdzogMCAwIDRweCA0cHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXMgLnNsb3QuZWUtYXZhaWxhYmxlLXNsb3Q6OmFmdGVyIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBiYWNrZ3JvdW5kOiB1cmwoL3N0YXRpYy9pbWcvbmV3LWxheW91dC93YXJkcm9iZS9pY29uLXBsdXMucG5nKTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBjb250ZW50OiBcXFwiIFxcXCI7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwIDAgNnB4IHJnYmEoMjM3LCAxMiwgMjQ1LCAwLjkpKTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBoZWlnaHQ6IDcxcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbGVmdDogNTAlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIG9wYWNpdHk6IDA7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgcG9zaXRpb246IGFic29sdXRlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRvcDogNTAlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgZWFzZS1pbi1vdXQgMTAwbXM7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgd2lkdGg6IDY2cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlcyAuc2xvdC5lZS1hdmFpbGFibGUtc2xvdDpob3Zlcjo6YWZ0ZXIsXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlcyAuc2xvdC5lZS1vdXRmaXQtdGh1bWI6aG92ZXIgcCB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgb3BhY2l0eTogMTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgI2FwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnktZmF2b3JpdGVzIC5zbG90LmVlLW91dGZpdC10aHVtYiBpbWcge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJvcmRlci1yYWRpdXM6IDQ0cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaGVpZ2h0OiAxMDAlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHdpZHRoOiAxMDAlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXMgLnNsb3QuZWUtb3V0Zml0LXRodW1iIHAge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBjb2xvcjogI2ZmZjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LWZhbWlseTogXFxcIkFsZWdyZXlhIFNhbnMgU0NcXFwiLCBzYW5zLXNlcmlmO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtc2l6ZTogMjJweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LXdlaWdodDogNzAwO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGxlZnQ6IDUwJTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBsaW5lLWhlaWdodDogMjJweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBvcGFjaXR5OiAwO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHBhZGRpbmc6IDEycHggMDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRvcDogNTAlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgZWFzZS1pbi1vdXQgNDAwbXM7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgd2lkdGg6IDEwMCU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvc3R5bGU+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO2lmKHQucyh0LmYoXCJvdXRmaXRzXCIsYyxwLDEpLGMscCwwLDE2NTQsMTc5MCxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiICA8ZGl2IGNsYXNzPVxcXCJzbG90IGVlLW91dGZpdC10aHVtYlxcXCIgZGF0YS1hcnJheS1pbmRleD1cXFwiXCIpO3QuYih0LnYodC5mKFwiaWRcIixjLHAsMCkpKTt0LmIoXCJcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8aW1nIGFsdD1cXFwiXCIpO3QuYih0LnYodC5mKFwibmFtZVwiLGMscCwwKSkpO3QuYihcIlxcXCIgc3JjPVxcXCJcIik7dC5iKHQudih0LmYoXCJ1cmxcIixjLHAsMCkpKTt0LmIoXCJcXFwiIC8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxwPlwiKTt0LmIodC52KHQuZihcIm5hbWVcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt9KTtjLnBvcCgpO310LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGRpdiBjbGFzcz1cXFwic2xvdCBlZS1hdmFpbGFibGUtc2xvdFxcXCI+PC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGRpdiBpZD1cXFwiZWUtb3V0Zml0LXRodW1ic1xcXCI+XFxuICA8c3R5bGU+XFxuICAgICNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlcyAuc2xvdC5lZS1hdmFpbGFibGUtc2xvdCB7XFxuICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGh0dHBzOi8vZ2l0bGFiLmNvbS9OYXRvQm9yYW0vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLS9yYXcvbWFzdGVyL2ltYWdlcy9hdmFpbGFibGUtZmF2b3JpdGUucG5nKTtcXG4gICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTRweCAtMTFweDtcXG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IDE3MXB4IDI0NHB4O1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDQ0cHg7XFxuICAgICAgYm94LXNoYWRvdzogMCAwIDRweCA0cHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1xcbiAgICB9XFxuXFxuICAgICNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlcyAuc2xvdC5lZS1hdmFpbGFibGUtc2xvdDo6YWZ0ZXIge1xcbiAgICAgIGJhY2tncm91bmQ6IHVybCgvc3RhdGljL2ltZy9uZXctbGF5b3V0L3dhcmRyb2JlL2ljb24tcGx1cy5wbmcpO1xcbiAgICAgIGNvbnRlbnQ6IFxcXCIgXFxcIjtcXG4gICAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDAgMCA2cHggcmdiYSgyMzcsIDEyLCAyNDUsIDAuOSkpO1xcbiAgICAgIGhlaWdodDogNzFweDtcXG4gICAgICBsZWZ0OiA1MCU7XFxuICAgICAgb3BhY2l0eTogMDtcXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgICAgdG9wOiA1MCU7XFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxuICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSBlYXNlLWluLW91dCAxMDBtcztcXG4gICAgICB3aWR0aDogNjZweDtcXG4gICAgfVxcblxcbiAgICAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXMgLnNsb3QuZWUtYXZhaWxhYmxlLXNsb3Q6aG92ZXI6OmFmdGVyLFxcbiAgICAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXMgLnNsb3QuZWUtb3V0Zml0LXRodW1iOmhvdmVyIHAge1xcbiAgICAgIG9wYWNpdHk6IDE7XFxuICAgIH1cXG5cXG4gICAgI2FwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnktZmF2b3JpdGVzIC5zbG90LmVlLW91dGZpdC10aHVtYiBpbWcge1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDQ0cHg7XFxuICAgICAgaGVpZ2h0OiAxMDAlO1xcbiAgICAgIHdpZHRoOiAxMDAlO1xcbiAgICB9XFxuXFxuICAgICNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlcyAuc2xvdC5lZS1vdXRmaXQtdGh1bWIgcCB7XFxuICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUpO1xcbiAgICAgIGNvbG9yOiAjZmZmO1xcbiAgICAgIGZvbnQtZmFtaWx5OiBcXFwiQWxlZ3JleWEgU2FucyBTQ1xcXCIsIHNhbnMtc2VyaWY7XFxuICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICAgICAgbGVmdDogNTAlO1xcbiAgICAgIGxpbmUtaGVpZ2h0OiAyMnB4O1xcbiAgICAgIG9wYWNpdHk6IDA7XFxuICAgICAgcGFkZGluZzogMTJweCAwO1xcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgICAgdG9wOiA1MCU7XFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxuICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSBlYXNlLWluLW91dCA0MDBtcztcXG4gICAgICB3aWR0aDogMTAwJTtcXG4gICAgfVxcbiAgPC9zdHlsZT5cXG5cXG4gIHt7I291dGZpdHN9fVxcbiAgPGRpdiBjbGFzcz1cXFwic2xvdCBlZS1vdXRmaXQtdGh1bWJcXFwiIGRhdGEtYXJyYXktaW5kZXg9XFxcInt7aWR9fVxcXCI+XFxuICAgIDxpbWcgYWx0PVxcXCJ7e25hbWV9fVxcXCIgc3JjPVxcXCJ7e3VybH19XFxcIiAvPlxcbiAgICA8cD57e25hbWV9fTwvcD5cXG4gIDwvZGl2PlxcbiAge3svb3V0Zml0c319XFxuXFxuICA8ZGl2IGNsYXNzPVxcXCJzbG90IGVlLWF2YWlsYWJsZS1zbG90XFxcIj48L2Rpdj5cXG48L2Rpdj5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxsaSBpZD1cXFwiXCIpO3QuYih0LnYodC5mKFwiaWRcIixjLHAsMCkpKTt0LmIoXCJcXFwiIGNsYXNzPVxcXCJwcm9maWxlLWNvbnRhY3QtYWN0aW9uLWVlXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxzcGFuIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGRpdiBjbGFzcz1cXFwiYWN0aW9uLWRlc2NyaXB0aW9uXFxcIj5cIik7dC5iKHQudih0LmYoXCJhY3Rpb25EZXNjcmlwdGlvblwiLGMscCwwKSkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPC9zcGFuPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvbGk+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGxpIGlkPVxcXCJ7e2lkfX1cXFwiIGNsYXNzPVxcXCJwcm9maWxlLWNvbnRhY3QtYWN0aW9uLWVlXFxcIj5cXG4gIDxzcGFuIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYWN0aW9uLWRlc2NyaXB0aW9uXFxcIj57e2FjdGlvbkRlc2NyaXB0aW9ufX08L2Rpdj5cXG4gIDwvc3Bhbj5cXG48L2xpPlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGRpdiBjbGFzcz1cXFwiYWNjb3VudC1taXNjLWJsb2MgYWNjb3VudC1lZS1ibG9jIGJsb2NcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPCEtLVwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPHN0eWxlPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB0YWJsZSB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgd2lkdGg6IDEwMCU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHRoIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB0ZXh0LWFsaWduOiBzdGFydDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBwYWRkaW5nOiAxZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvc3R5bGU+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAtLT5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8IS0tIFNldHRpbmdzIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGgyIGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUuYWNjb3VudC5lbmhhbmNlbWVudHNcIixjLHAsMCkpKTt0LmIoXCI8L2gyPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPHVsIGNsYXNzPVxcXCJhY2NvdW50LW1pc2MtYWN0aW9uc1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxsaVwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGlkPVxcXCJlZS1kZWJ1Zy1lbmFibGVkXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtIFwiKTtpZih0LnModC5mKFwiZGVidWdcIixjLHAsMSksYyxwLDAsMzkyLDM5OCxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiYWN0aXZlXCIpO30pO2MucG9wKCk7fXQuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB0aXRsZT1cXFwiXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLmFjY291bnQuZGVidWdfdG9vbHRpcFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hY2NvdW50LmRlYnVnXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC9saT5cIik7dC5iKFwiXFxuXCIgKyBpKTtpZih0LnModC5mKFwidW5sb2NrZWRcIixjLHAsMSksYyxwLDAsNTI3LDEwMzAsXCJ7eyB9fVwiKSl7dC5ycyhjLHAsZnVuY3Rpb24oYyxwLHQpe3QuYihcIiAgICA8bGlcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBpZD1cXFwiZWUtbWluaWdhbWVzLWVuYWJsZWRcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc20gXCIpO2lmKHQucyh0LmYoXCJtaW5pZ2FtZXNcIixjLHAsMSksYyxwLDAsNjE4LDYyNCxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiYWN0aXZlXCIpO30pO2MucG9wKCk7fXQuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hY2NvdW50Lm1pbmlnYW1lc1wiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDwvbGk+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxsaVwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGlkPVxcXCJlZS1leHBsb3JhdGlvbnMtZW5hYmxlZFxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSBcIik7aWYodC5zKHQuZihcImV4cGxvcmF0aW9uc1wiLGMscCwxKSxjLHAsMCw3OTAsNzk2LFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCJhY3RpdmVcIik7fSk7Yy5wb3AoKTt9dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLmFjY291bnQuZXhwbG9yYXRpb25zXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC9saT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGxpXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaWQ9XFxcImVlLW1hcmtldC1lbmFibGVkXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtIFwiKTtpZih0LnModC5mKFwibWFya2V0XCIsYyxwLDEpLGMscCwwLDk1Niw5NjIsXCJ7eyB9fVwiKSl7dC5ycyhjLHAsZnVuY3Rpb24oYyxwLHQpe3QuYihcImFjdGl2ZVwiKTt9KTtjLnBvcCgpO310LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgID5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUuYWNjb3VudC5tYXJrZXRcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8L2xpPlwiKTt0LmIoXCJcXG5cIiArIGkpO30pO2MucG9wKCk7fXQuYihcIiAgICA8bGkgaWQ9XFxcImVlLWltcG9ydFxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc21cXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hY2NvdW50LmltcG9ydFwiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDwvbGk+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxsaSBpZD1cXFwiZWUtZXhwb3J0XFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbVxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLmFjY291bnQuZXhwb3J0XCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC9saT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvdWw+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPCEtLSBFeHBsb3JhdGlvbnNcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxoMyBjbGFzcz1cXFwic2VjdGlvbi10aXRsZVxcXCI+RXhwbG9yYXRpb25zPC9oMz5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDx0YWJsZT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPHRoZWFkPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDx0aD5Mb2NhdGlvbjwvdGg+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPHRoPkRlbGV0ZTwvdGg+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDwvdGhlYWQ+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDx0Ym9keT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGQ+Um9jazwvdGQ+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPHRkPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbVxcXCI+RGVsZXRlPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC90ZD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC90Ym9keT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvdGFibGU+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAtLT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8ZGl2IGNsYXNzPVxcXCJhY2NvdW50LW1pc2MtYmxvYyBhY2NvdW50LWVlLWJsb2MgYmxvY1xcXCI+XFxuICA8IS0tXFxuICA8c3R5bGU+XFxuICAgIHRhYmxlIHtcXG4gICAgICB3aWR0aDogMTAwJTtcXG4gICAgfVxcblxcbiAgICB0aCB7XFxuICAgICAgdGV4dC1hbGlnbjogc3RhcnQ7XFxuICAgICAgcGFkZGluZzogMWVtO1xcbiAgICB9XFxuICA8L3N0eWxlPlxcbiAgLS0+XFxuXFxuICA8IS0tIFNldHRpbmdzIC0tPlxcbiAgPGgyIGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj57e3RyYW5zbGF0ZS5hY2NvdW50LmVuaGFuY2VtZW50c319PC9oMj5cXG4gIDx1bCBjbGFzcz1cXFwiYWNjb3VudC1taXNjLWFjdGlvbnNcXFwiPlxcbiAgICA8bGlcXG4gICAgICBpZD1cXFwiZWUtZGVidWctZW5hYmxlZFxcXCJcXG4gICAgICBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSB7eyNkZWJ1Z319YWN0aXZle3svZGVidWd9fVxcXCJcXG4gICAgICB0aXRsZT1cXFwie3t0cmFuc2xhdGUuYWNjb3VudC5kZWJ1Z190b29sdGlwfX1cXFwiXFxuICAgID5cXG4gICAgICB7e3RyYW5zbGF0ZS5hY2NvdW50LmRlYnVnfX1cXG4gICAgPC9saT5cXG4gICAge3sjdW5sb2NrZWR9fVxcbiAgICA8bGlcXG4gICAgICBpZD1cXFwiZWUtbWluaWdhbWVzLWVuYWJsZWRcXFwiXFxuICAgICAgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc20ge3sjbWluaWdhbWVzfX1hY3RpdmV7ey9taW5pZ2FtZXN9fVxcXCJcXG4gICAgPlxcbiAgICAgIHt7dHJhbnNsYXRlLmFjY291bnQubWluaWdhbWVzfX1cXG4gICAgPC9saT5cXG4gICAgPGxpXFxuICAgICAgaWQ9XFxcImVlLWV4cGxvcmF0aW9ucy1lbmFibGVkXFxcIlxcbiAgICAgIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtIHt7I2V4cGxvcmF0aW9uc319YWN0aXZle3svZXhwbG9yYXRpb25zfX1cXFwiXFxuICAgID5cXG4gICAgICB7e3RyYW5zbGF0ZS5hY2NvdW50LmV4cGxvcmF0aW9uc319XFxuICAgIDwvbGk+XFxuICAgIDxsaVxcbiAgICAgIGlkPVxcXCJlZS1tYXJrZXQtZW5hYmxlZFxcXCJcXG4gICAgICBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSB7eyNtYXJrZXR9fWFjdGl2ZXt7L21hcmtldH19XFxcIlxcbiAgICA+XFxuICAgICAge3t0cmFuc2xhdGUuYWNjb3VudC5tYXJrZXR9fVxcbiAgICA8L2xpPlxcbiAgICB7ey91bmxvY2tlZH19XFxuICAgIDxsaSBpZD1cXFwiZWUtaW1wb3J0XFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbVxcXCI+XFxuICAgICAge3t0cmFuc2xhdGUuYWNjb3VudC5pbXBvcnR9fVxcbiAgICA8L2xpPlxcbiAgICA8bGkgaWQ9XFxcImVlLWV4cG9ydFxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc21cXFwiPlxcbiAgICAgIHt7dHJhbnNsYXRlLmFjY291bnQuZXhwb3J0fX1cXG4gICAgPC9saT5cXG4gIDwvdWw+XFxuXFxuICA8IS0tIEV4cGxvcmF0aW9uc1xcbiAgPGgzIGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5FeHBsb3JhdGlvbnM8L2gzPlxcbiAgPHRhYmxlPlxcbiAgICA8dGhlYWQ+XFxuICAgICAgPHRoPkxvY2F0aW9uPC90aD5cXG4gICAgICA8dGg+RGVsZXRlPC90aD5cXG4gICAgPC90aGVhZD5cXG4gICAgPHRib2R5PlxcbiAgICAgIDx0ZD5Sb2NrPC90ZD5cXG4gICAgICA8dGQ+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtXFxcIj5EZWxldGU8L2Rpdj5cXG4gICAgICA8L3RkPlxcbiAgICA8L3Rib2R5PlxcbiAgPC90YWJsZT5cXG4gIC0tPlxcbjwvZGl2PlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGEgaWQ9XFxcIndpc2hsaXN0LWJ1dHRvblxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvblxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LnRpdGxlXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2E+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGEgaWQ9XFxcIndpc2hsaXN0LWJ1dHRvblxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvblxcXCI+XFxuICB7e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QudGl0bGV9fVxcbjwvYT5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxzdHlsZT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIC5yZXNldC1hbGwge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBtYXJnaW4tYm90dG9tOiAxZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgdGFibGUge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHdpZHRoOiAxMDAlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIC50ZXh0LXBhZGRpbmcge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBwYWRkaW5nOiAwLjI1ZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgLmFjdGlvbi1waWN0byB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGhlaWdodDogNTBweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgd2lkdGg6IDUwcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGN1cnNvcjogcG9pbnRlcjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAuYWN0aW9uLXBpY3RvOmhvdmVyOm5vdCguZGlzYWJsZWQpLFwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgLmVkaXQtcHJpY2U6aG92ZXIge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBhbmltYXRpb246IGJ1dHRvbi1ib3VuY2UgMzAwbXMgbGluZWFyIGZvcndhcmRzO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBmaWx0ZXI6IGJyaWdodG5lc3MoMS4wNSkgY29udHJhc3QoMS4xKTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAucm93IHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgZGlzcGxheTogZmxleDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgLmVkaXQtcHJpY2Uge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBjdXJzb3I6IHBvaW50ZXI7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgaW1nLmRpc2FibGVkIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgZmlsdGVyOiBncmF5c2NhbGUoMSk7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgLml0ZW0taWNvbi1jb250YWluZXIge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAuaXRlbS1pY29uIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgd2lkdGg6IDEwMHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBoZWlnaHQ6IDEwMHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgfVwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvc3R5bGU+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjxidXR0b24gY2xhc3M9XFxcIm5sLWJ1dHRvbiByZXNldC1hbGxcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5yZXNldF9hbGxcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvYnV0dG9uPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8dGFibGU+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8dGhlYWQ+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDx0cj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGg+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5pY29uXCIsYyxwLDApKSk7dC5iKFwiPC90aD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGg+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5uYW1lXCIsYyxwLDApKSk7dC5iKFwiPC90aD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGg+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5wcmljZVwiLGMscCwwKSkpO3QuYihcIjwvdGg+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPHRoPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3Quc3RhdHVzXCIsYyxwLDApKSk7dC5iKFwiPC90aD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGg+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5hY3Rpb25zXCIsYyxwLDApKSk7dC5iKFwiPC90aD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC90cj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvdGhlYWQ+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8dGJvZHk+XCIpO3QuYihcIlxcblwiICsgaSk7aWYodC5zKHQuZihcIndpc2hsaXN0XCIsYyxwLDEpLGMscCwwLDExMzcsMjY1NyxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiICAgIDx0ciBjbGFzcz1cXFwibWFya2V0cGxhY2UtYWJzdHJhY3RcXFwiIGRhdGEtaWNvbj1cXFwiXCIpO3QuYih0LnYodC5mKFwiaWNvblwiLGMscCwwKSkpO3QuYihcIlxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPCEtLSBJY29uIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDx0ZD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcIml0ZW0taWNvbi1jb250YWluZXJcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICA8aW1nIGNsYXNzPVxcXCJpdGVtLWljb25cXFwiIHNyYz1cXFwiXCIpO3QuYih0LnYodC5mKFwiaWNvblwiLGMscCwwKSkpO3QuYihcIlxcXCIgYWx0PVxcXCJcIik7dC5iKHQudih0LmYoXCJuYW1lXCIsYyxwLDApKSk7dC5iKFwiXFxcIiAvPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyYXJpdHktbWFya2VyLVwiKTt0LmIodC52KHQuZihcInJhcml0eVwiLGMscCwwKSkpO3QuYihcIlxcXCI+PC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8L3RkPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8IS0tIE5hbWUgLS0+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPHRkIGNsYXNzPVxcXCJ0ZXh0LXBhZGRpbmdcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtbmFtZVxcXCI+XCIpO3QuYih0LnYodC5mKFwibmFtZVwiLGMscCwwKSkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtdHlwZVxcXCI+XCIpO3QuYih0LnYodC5mKFwiYWJzdHJhY3RUeXBlXCIsYyxwLDApKSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC90ZD5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPCEtLSBQcmljZSAtLT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGQgY2xhc3M9XFxcInRleHQtcGFkZGluZ1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIGNsYXNzPVxcXCJlZGl0LXByaWNlIHJvd1xcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgdGl0bGU9XFxcIlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QuY2hhbmdlX3ByaWNlXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwicHJpY2UtaXRlbVxcXCI+XCIpO3QuYih0LnYodC5mKFwicHJpY2VcIixjLHAsMCkpKTt0LmIoXCI8L3NwYW4+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYWFuYS1pY29uXFxcIiBhbHQ9XFxcIm1hYW5hc1xcXCI+PC9zcGFuPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC90ZD5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPCEtLSBFcnJvciAtLT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGQgY2xhc3M9XFxcInRleHQtcGFkZGluZ1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8cCBjbGFzcz1cXFwiZXJyb3JcXFwiPlwiKTt0LmIodC52KHQuZihcImVycm9yXCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwvdGQ+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwhLS0gQWN0aW9ucyAtLT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGQ+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyb3dcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICA8aW1nXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgICAgY2xhc3M9XFxcImFjdGlvbi1waWN0byByZXNldC1pdGVtLXN0YXR1cyBcIik7aWYoIXQucyh0LmYoXCJlcnJvclwiLGMscCwxKSxjLHAsMSwwLDAsXCJcIikpe3QuYihcImRpc2FibGVkXCIpO307dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAgIHNyYz1cXFwiL3N0YXRpYy9pbWcvbmV3LWxheW91dC93YXJkcm9iZS9yZXNldC1idG4ucG5nXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAgIHRpdGxlPVxcXCJcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LnJlc2V0X3Rvb2x0aXBcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgICAgYWx0PVxcXCJcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LnJlc2V0XCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAvPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICA8aW1nXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgICAgY2xhc3M9XFxcImFjdGlvbi1waWN0byBkZWxldGUtd2lzaGxpc3QtaXRlbVxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICBzcmM9XFxcIi9zdGF0aWMvaW1nL25ldy1sYXlvdXQvd2FyZHJvYmUvZGVsZXRlLnBuZ1xcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICB0aXRsZT1cXFwiXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5kZWxldGVfdG9vbHRpcFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICBhbHQ9XFxcIlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QuZGVsZXRlXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAvPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC90ZD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC90cj5cIik7dC5iKFwiXFxuXCIgKyBpKTt9KTtjLnBvcCgpO310LmIoXCIgIDwvdGJvZHk+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC90YWJsZT5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8c3R5bGU+XFxuICAucmVzZXQtYWxsIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMWVtO1xcbiAgfVxcblxcbiAgdGFibGUge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgfVxcblxcbiAgLnRleHQtcGFkZGluZyB7XFxuICAgIHBhZGRpbmc6IDAuMjVlbTtcXG4gIH1cXG5cXG4gIC5hY3Rpb24tcGljdG8ge1xcbiAgICBoZWlnaHQ6IDUwcHg7XFxuICAgIHdpZHRoOiA1MHB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICB9XFxuXFxuICAuYWN0aW9uLXBpY3RvOmhvdmVyOm5vdCguZGlzYWJsZWQpLFxcbiAgLmVkaXQtcHJpY2U6aG92ZXIge1xcbiAgICBhbmltYXRpb246IGJ1dHRvbi1ib3VuY2UgMzAwbXMgbGluZWFyIGZvcndhcmRzO1xcbiAgICBmaWx0ZXI6IGJyaWdodG5lc3MoMS4wNSkgY29udHJhc3QoMS4xKTtcXG4gIH1cXG5cXG4gIC5yb3cge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIH1cXG5cXG4gIC5lZGl0LXByaWNlIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgfVxcblxcbiAgaW1nLmRpc2FibGVkIHtcXG4gICAgZmlsdGVyOiBncmF5c2NhbGUoMSk7XFxuICB9XFxuXFxuICAuaXRlbS1pY29uLWNvbnRhaW5lciB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgfVxcblxcbiAgLml0ZW0taWNvbiB7XFxuICAgIHdpZHRoOiAxMDBweDtcXG4gICAgaGVpZ2h0OiAxMDBweDtcXG4gIH1cXG48L3N0eWxlPlxcblxcbjxidXR0b24gY2xhc3M9XFxcIm5sLWJ1dHRvbiByZXNldC1hbGxcXFwiPlxcbiAge3t0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LnJlc2V0X2FsbH19XFxuPC9idXR0b24+XFxuXFxuPHRhYmxlPlxcbiAgPHRoZWFkPlxcbiAgICA8dHI+XFxuICAgICAgPHRoPnt7dHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5pY29ufX08L3RoPlxcbiAgICAgIDx0aD57e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QubmFtZX19PC90aD5cXG4gICAgICA8dGg+e3t0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LnByaWNlfX08L3RoPlxcbiAgICAgIDx0aD57e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3Quc3RhdHVzfX08L3RoPlxcbiAgICAgIDx0aD57e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QuYWN0aW9uc319PC90aD5cXG4gICAgPC90cj5cXG4gIDwvdGhlYWQ+XFxuICA8dGJvZHk+XFxuICAgIHt7I3dpc2hsaXN0fX1cXG4gICAgPHRyIGNsYXNzPVxcXCJtYXJrZXRwbGFjZS1hYnN0cmFjdFxcXCIgZGF0YS1pY29uPVxcXCJ7e2ljb259fVxcXCI+XFxuICAgICAgPCEtLSBJY29uIC0tPlxcbiAgICAgIDx0ZD5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIml0ZW0taWNvbi1jb250YWluZXJcXFwiPlxcbiAgICAgICAgICA8aW1nIGNsYXNzPVxcXCJpdGVtLWljb25cXFwiIHNyYz1cXFwie3tpY29ufX1cXFwiIGFsdD1cXFwie3tuYW1lfX1cXFwiIC8+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInJhcml0eS1tYXJrZXIte3tyYXJpdHl9fVxcXCI+PC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICA8L3RkPlxcblxcbiAgICAgIDwhLS0gTmFtZSAtLT5cXG4gICAgICA8dGQgY2xhc3M9XFxcInRleHQtcGFkZGluZ1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1uYW1lXFxcIj57e25hbWV9fTwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtdHlwZVxcXCI+e3thYnN0cmFjdFR5cGV9fTwvZGl2PlxcbiAgICAgIDwvdGQ+XFxuXFxuICAgICAgPCEtLSBQcmljZSAtLT5cXG4gICAgICA8dGQgY2xhc3M9XFxcInRleHQtcGFkZGluZ1xcXCI+XFxuICAgICAgICA8ZGl2XFxuICAgICAgICAgIGNsYXNzPVxcXCJlZGl0LXByaWNlIHJvd1xcXCJcXG4gICAgICAgICAgdGl0bGU9XFxcInt7dHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5jaGFuZ2VfcHJpY2V9fVxcXCJcXG4gICAgICAgID5cXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInByaWNlLWl0ZW1cXFwiPnt7cHJpY2V9fTwvc3Bhbj5cXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hYW5hLWljb25cXFwiIGFsdD1cXFwibWFhbmFzXFxcIj48L3NwYW4+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICA8L3RkPlxcblxcbiAgICAgIDwhLS0gRXJyb3IgLS0+XFxuICAgICAgPHRkIGNsYXNzPVxcXCJ0ZXh0LXBhZGRpbmdcXFwiPlxcbiAgICAgICAgPHAgY2xhc3M9XFxcImVycm9yXFxcIj57e2Vycm9yfX08L3A+XFxuICAgICAgPC90ZD5cXG5cXG4gICAgICA8IS0tIEFjdGlvbnMgLS0+XFxuICAgICAgPHRkPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicm93XFxcIj5cXG4gICAgICAgICAgPGltZ1xcbiAgICAgICAgICAgIGNsYXNzPVxcXCJhY3Rpb24tcGljdG8gcmVzZXQtaXRlbS1zdGF0dXMge3teZXJyb3J9fWRpc2FibGVke3svZXJyb3J9fVxcXCJcXG4gICAgICAgICAgICBzcmM9XFxcIi9zdGF0aWMvaW1nL25ldy1sYXlvdXQvd2FyZHJvYmUvcmVzZXQtYnRuLnBuZ1xcXCJcXG4gICAgICAgICAgICB0aXRsZT1cXFwie3t0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LnJlc2V0X3Rvb2x0aXB9fVxcXCJcXG4gICAgICAgICAgICBhbHQ9XFxcInt7dHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5yZXNldH19XFxcIlxcbiAgICAgICAgICAvPlxcbiAgICAgICAgICA8aW1nXFxuICAgICAgICAgICAgY2xhc3M9XFxcImFjdGlvbi1waWN0byBkZWxldGUtd2lzaGxpc3QtaXRlbVxcXCJcXG4gICAgICAgICAgICBzcmM9XFxcIi9zdGF0aWMvaW1nL25ldy1sYXlvdXQvd2FyZHJvYmUvZGVsZXRlLnBuZ1xcXCJcXG4gICAgICAgICAgICB0aXRsZT1cXFwie3t0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LmRlbGV0ZV90b29sdGlwfX1cXFwiXFxuICAgICAgICAgICAgYWx0PVxcXCJ7e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QuZGVsZXRlfX1cXFwiXFxuICAgICAgICAgIC8+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICA8L3RkPlxcbiAgICA8L3RyPlxcbiAgICB7ey93aXNobGlzdH19XFxuICA8L3Rib2R5PlxcbjwvdGFibGU+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwiaW1wb3J0IHsgQm9keUxvY2F0aW9uIH0gZnJvbSBcIi4uL21hcmtldHBsYWNlL2VudW1zL2JvZHlfbG9jYXRpb24uZW51bVwiXG5pbXBvcnQgeyBDYXRlZ29yeU51bWJlciB9IGZyb20gXCIuLi9tYXJrZXRwbGFjZS9lbnVtcy9jYXRlZ29yeS5lbnVtXCJcbmltcG9ydCB7IEd1YXJkIH0gZnJvbSBcIi4uL21hcmtldHBsYWNlL2VudW1zL2d1YXJkLmVudW1cIlxuaW1wb3J0IHsgUmFyaXR5IH0gZnJvbSBcIi4uL21hcmtldHBsYWNlL2VudW1zL3Jhcml0eS5lbnVtXCJcbmltcG9ydCB7IFR5cGUgfSBmcm9tIFwiLi4vbWFya2V0cGxhY2UvZW51bXMvdHlwZS5lbnVtXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFqYXhTZWFyY2goZGF0YToge1xuICB0eXBlPzogVHlwZVxuICBib2R5TG9jYXRpb24/OiBCb2R5TG9jYXRpb25cbiAgY2F0ZWdvcnk/OiBDYXRlZ29yeU51bWJlclxuICByYXJpdHk/OiBSYXJpdHlcbiAgcHJpY2U/OiBudW1iZXIgfCBcIlwiXG4gIGd1YXJkPzogR3VhcmRcbiAgLyoqIFBhZ2UgbnVtYmVyLCBpbmRleGVkIGJ5IDEgKi9cbiAgcGFnZTogbnVtYmVyXG4gIG5hbWU/OiBzdHJpbmdcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBkYXRhID0ge1xuICAgIC4uLntcbiAgICAgIHR5cGU6IFR5cGUuQWxsLFxuICAgICAgYm9keUxvY2F0aW9uOiBCb2R5TG9jYXRpb24uQWxsLFxuICAgICAgY2F0ZWdvcnk6IENhdGVnb3J5TnVtYmVyLmFsbCxcbiAgICAgIHJhcml0eTogUmFyaXR5LmFsbCxcbiAgICAgIHByaWNlOiBcIlwiLFxuICAgICAgZ3VhcmQ6IEd1YXJkLmFueSxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBuYW1lOiBcIlwiLFxuICAgIH0sXG4gICAgLi4uZGF0YSxcbiAgfVxuXG4gIGNvbnN0IElURU1TX1BFUl9QQUdFID0gOFxuICByZXR1cm4gKGF3YWl0ICQuZ2V0KFwiL21hcmtldHBsYWNlL2FqYXhfc2VhcmNoXCIsIHtcbiAgICAuLi5kYXRhLFxuICAgIGZyb206IChkYXRhLnBhZ2UgLSAxKSAqIElURU1TX1BFUl9QQUdFLFxuICAgIHRvOiBJVEVNU19QRVJfUEFHRSxcbiAgfSkpIGFzIHN0cmluZ1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrZXQgfSBmcm9tIFwiLi4vYXBpL3BhY2tldFwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1eShpdGVtSWQ6IG51bWJlcik6IFByb21pc2U8UGFja2V0PFwiXCI+PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICB2b2lkICQucG9zdChcbiAgICAgIFwiL21hcmtldHBsYWNlL2J1eVwiLFxuICAgICAgeyBpZDogaXRlbUlkIH0sXG4gICAgICAoanNvbjogUGFja2V0PFwiXCI+KTogdm9pZCA9PiB7XG4gICAgICAgIExvY2FsU3RvcmFnZS5tZXRhID0ganNvbi5tZXRhXG4gICAgICAgIHJlc29sdmUoanNvbilcblxuICAgICAgICBpZiAoanNvbi5yZXN1bHQgIT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgJC5mbGF2ck5vdGlmKGpzb24uZGF0YSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwianNvblwiXG4gICAgKVxuICB9KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBFeHBsb3JhdGlvblJlc3VsdHNEYXRhIH0gZnJvbSBcIi4uL2FwaS9leHBsb3JhdGlvbl9yZXN1bHRzX2RhdGFcIlxuaW1wb3J0IHR5cGUgeyBQYWNrZXQgfSBmcm9tIFwiLi4vYXBpL3BhY2tldFwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhcHR1cmVFbmQoKTogUHJvbWlzZTxQYWNrZXQ8RXhwbG9yYXRpb25SZXN1bHRzRGF0YT4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIHZvaWQgJC5wb3N0KFxuICAgICAgXCIvcGV0L2NhcHR1cmUvZW5kXCIsXG4gICAgICAoanNvbjogUGFja2V0PEV4cGxvcmF0aW9uUmVzdWx0c0RhdGE+KTogdm9pZCA9PiB7XG4gICAgICAgIExvY2FsU3RvcmFnZS5tZXRhID0ganNvbi5tZXRhXG4gICAgICAgIHJlc29sdmUoanNvbilcblxuICAgICAgICBpZiAoanNvbi5yZXN1bHQgIT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgJC5mbGF2ck5vdGlmKGpzb24uZGF0YSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIClcbiAgfSlcbn1cbiIsImltcG9ydCB0eXBlIHsgQ2hhbmdlUmVnaW9uRGF0YSB9IGZyb20gXCIuLi9hcGkvY2hhbmdlX3JlZ2lvbl9kYXRhXCJcbmltcG9ydCB0eXBlIHsgUGFja2V0IH0gZnJvbSBcIi4uL2FwaS9wYWNrZXRcIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGFuZ2VSZWdpb24oXG4gIG5ld1JlZ2lvbklkOiBudW1iZXJcbik6IFByb21pc2U8UGFja2V0PENoYW5nZVJlZ2lvbkRhdGE+PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxQYWNrZXQ8Q2hhbmdlUmVnaW9uRGF0YT4+KChyZXNvbHZlKTogdm9pZCA9PiB7XG4gICAgdm9pZCAkLnBvc3QoXG4gICAgICBcIi9wZXQvY2hhbmdlUmVnaW9uXCIsXG4gICAgICB7IG5ld1JlZ2lvbklkIH0sXG4gICAgICAoanNvbjogUGFja2V0PENoYW5nZVJlZ2lvbkRhdGE+KTogdm9pZCA9PiB7XG4gICAgICAgIExvY2FsU3RvcmFnZS5tZXRhID0ganNvbi5tZXRhXG4gICAgICAgIHJlc29sdmUoanNvbilcblxuICAgICAgICBpZiAoanNvbi5yZXN1bHQgIT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgJC5mbGF2ck5vdGlmKGpzb24uZGF0YSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRSZWdpb24gPSBqc29uLmRhdGEuY3VycmVudFJlZ2lvblxuXG4gICAgICAgIHBlbmRpbmdUcmVhc3VyZUh1bnRMb2NhdGlvbiA9XG4gICAgICAgICAgdHlwZW9mIGpzb24uZGF0YS5wZW5kaW5nVHJlYXN1cmVIdW50TG9jYXRpb24gPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiBqc29uLmRhdGEucGVuZGluZ1RyZWFzdXJlSHVudExvY2F0aW9uXG5cbiAgICAgICAgdGltZUxlZnRFeHBsb3JhdGlvbiA9XG4gICAgICAgICAgdHlwZW9mIGpzb24uZGF0YS50aW1lTGVmdEV4cGxvcmF0aW9uID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDoganNvbi5kYXRhLnRpbWVMZWZ0RXhwbG9yYXRpb25cbiAgICAgIH1cbiAgICApXG4gIH0pXG59XG4iLCJpbXBvcnQgdHlwZSB7IEV4cGxvcmF0aW9uUmVzdWx0c0RhdGEgfSBmcm9tIFwiLi4vYXBpL2V4cGxvcmF0aW9uX3Jlc3VsdHNfZGF0YVwiXG5pbXBvcnQgdHlwZSB7IFBhY2tldCB9IGZyb20gXCIuLi9hcGkvcGFja2V0XCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwbG9yYXRpb25SZXN1bHRzKCk6IFByb21pc2U8XG4gIFBhY2tldDxFeHBsb3JhdGlvblJlc3VsdHNEYXRhPlxuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxQYWNrZXQ8RXhwbG9yYXRpb25SZXN1bHRzRGF0YT4+KChyZXNvbHZlKTogdm9pZCA9PiB7XG4gICAgdm9pZCAkLnBvc3QoXG4gICAgICBcIi9wZXQvZXhwbG9yYXRpb25SZXN1bHRzXCIsXG4gICAgICAoanNvbjogUGFja2V0PEV4cGxvcmF0aW9uUmVzdWx0c0RhdGE+KTogdm9pZCA9PiB7XG4gICAgICAgIExvY2FsU3RvcmFnZS5tZXRhID0ganNvbi5tZXRhXG4gICAgICAgIHJlc29sdmUoanNvbilcblxuICAgICAgICBpZiAoanNvbi5yZXN1bHQgIT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgJC5mbGF2ck5vdGlmKGpzb24uZGF0YSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIClcbiAgfSlcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgTWV0YSB7XG4gIGV2ZW50OiBNZXRhRXZlbnRcbiAgbWVzc2FnZTogTWVzc2FnZVxuICBub3RpZmljYXRpb25zOiBOb3RpZmljYXRpb25zXG4gIHBldDogUGV0XG4gIHBsYXllcjogUGxheWVyXG4gIHB1cnJvc2hvcDogUHVycm9zaG9wXG59XG5cbnR5cGUgTWV0YUV2ZW50ID0gXCJlYXN0ZXJcIiB8IG51bGxcblxuaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICB1bnJlYWQ6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgUGV0IHtcbiAgLyoqIEV4cGxvcmF0aW9uIGlzIGZpbmlzaGVkICovXG4gIGV4cGxvcmF0aW9uOiBib29sZWFuXG4gIHBvcnRyYWl0OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIFBsYXllciB7XG4gIGRhaWx5TWFhbmE6IGJvb2xlYW5cbiAgZ29sZDogQ3VycmVuY3lcbiAgbGVnYWN5Q3VycmVuY3k6IEN1cnJlbmN5XG4gIG1hYW5hOiBDdXJyZW5jeVxuICBwdXJyb3Bhc3M6IFB1cnJvcGFzc1xuICB1bnJlYWROZXdzOiBudWxsXG4gIHhwOiBYUFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJlbmN5IHtcbiAgY2hhbmdlOiBDaGFuZ2VcbiAgdGV4dDogc3RyaW5nXG4gIHZhbHVlOiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIENoYW5nZSB7XG4gIHRleHQ6IHN0cmluZ1xuICB2YWx1ZTogbnVtYmVyXG59XG5cbmludGVyZmFjZSBQdXJyb3Bhc3Mge1xuICBjaGFuZ2U6IENoYW5nZVxuICB0ZXh0OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgWFAge1xuICBnb2FsOiBudW1iZXJcbiAgbGV2ZWw6IG51bWJlclxuICB2YWx1ZTogbnVtYmVyXG59XG5cbmludGVyZmFjZSBQdXJyb3Nob3Age1xuICBzdGF0dXM6IFB1cnJvc2hvcFN0YXR1c1xufVxuXG5pbnRlcmZhY2UgTm90aWZpY2F0aW9ucyB7XG4gIGRpc3BsYXlUaW1lOiBudW1iZXJcbiAgbWVzc2FnZTogc3RyaW5nXG4gIHR5cGU6IHN0cmluZ1xufVxuXG5leHBvcnQgZW51bSBQdXJyb3Nob3BTdGF0dXMge1xuICBkaXNhYmxlZCA9IFwiZGlzYWJsZWRcIixcbiAgZW5hYmxlZCA9IFwiZW5hYmxlZFwiLFxufVxuIiwiZXhwb3J0IGVudW0gUmVzdWx0IHtcbiAgZXJyb3IgPSBcImVycm9yXCIsXG4gIHN1Y2Nlc3MgPSBcInN1Y2Nlc3NcIixcbn1cbiIsImltcG9ydCB3YXJkcm9iZSBmcm9tIFwiLi93YXJkcm9iZVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQXBwZWFyYW5jZVVJKCk6IHZvaWQge1xuICBzZXR1cEJhY2tncm91bmQoKVxuICBzZXR1cExlZnRQYW5lbCgpXG4gIHNldHVwUmlnaHRQYW5lbCgpXG5cbiAgaWYgKHdhcmRyb2JlLmF2YWlsYWJsZUl0ZW1zKSBhdmFpbGFibGVJdGVtcyA9IHdhcmRyb2JlLmF2YWlsYWJsZUl0ZW1zXG4gIGVsc2Ugd2FyZHJvYmUuYXZhaWxhYmxlSXRlbXMgPSBhdmFpbGFibGVJdGVtc1xufVxuXG5mdW5jdGlvbiBzZXR1cEJhY2tncm91bmQoKTogdm9pZCB7XG4gIGNvbnN0IGJhY2tncm91bmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbWFnZUVsZW1lbnQ+KFxuICAgIFwiI2F2YXRhci1iYWNrZ3JvdW5kIGltZ1wiXG4gIClcbiAgaWYgKGJhY2tncm91bmQpIHtcbiAgICBiYWNrZ3JvdW5kLnN0eWxlLmZpbHRlciA9IFwidW5zZXRcIlxuICAgIGJhY2tncm91bmQuc3R5bGUuaGVpZ2h0ID0gXCJ1bnNldFwiXG4gICAgYmFja2dyb3VuZC5zdHlsZS5tYXNrID1cbiAgICAgIFwibGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCBibGFjayA1MCUsIHRyYW5zcGFyZW50IDEwMCUpXCJcbiAgICBiYWNrZ3JvdW5kLnN0eWxlLm1pbkhlaWdodCA9IFwiMTAwdmhcIlxuICAgIGJhY2tncm91bmQuc3R5bGUubWluV2lkdGggPSBcIjUwdndcIlxuICAgIGJhY2tncm91bmQuc3R5bGUucG9zaXRpb24gPSBcImZpeGVkXCJcbiAgICBiYWNrZ3JvdW5kLnN0eWxlLnRyYW5zZm9ybSA9IFwidW5zZXRcIlxuICAgIGJhY2tncm91bmQuc3R5bGUud2lkdGggPSBcInVuc2V0XCJcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXR1cFJpZ2h0UGFuZWwoKTogdm9pZCB7XG4gIGNvbnN0IHJpZ2h0UGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFwcGVhcmFuY2UtcmlnaHRcIilcbiAgaWYgKHJpZ2h0UGFuZWwpIHJpZ2h0UGFuZWwuc3R5bGUucGFkZGluZ1RvcCA9IFwiODBweFwiXG59XG5cbmZ1bmN0aW9uIHNldHVwTGVmdFBhbmVsKCk6IHZvaWQge1xuICBjb25zdCBwcmV2aWV3T3V0ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFwcGVhcmFuY2UtcHJldmlldy1vdXRlclwiKVxuICBpZiAocHJldmlld091dGVyKSB7XG4gICAgcHJldmlld091dGVyLnN0eWxlLnBhZGRpbmcgPSBcIjBweFwiXG4gIH1cblxuICBjb25zdCBwcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhcHBlYXJhbmNlLXByZXZpZXdcIilcbiAgaWYgKHByZXZpZXcpIHtcbiAgICBwcmV2aWV3LnN0eWxlLmxlZnQgPSBcIjBcIlxuICAgIHByZXZpZXcuc3R5bGUucG9zaXRpb24gPSBcImZpeGVkXCJcbiAgICBwcmV2aWV3LnN0eWxlLnRvcCA9IFwiY2FsYyg1MCUgLSB2YXIoLS10b3BiYXItaGVpZ2h0KSlcIlxuICAgIHByZXZpZXcuc3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGVZKC01MCUpXCJcbiAgfVxuXG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTENhbnZhc0VsZW1lbnQ+KFxuICAgIFwiI2FwcGVhcmFuY2UtcHJldmlldyBjYW52YXNcIlxuICApXG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUubWF4SGVpZ2h0ID0gXCIxMDB2aFwiXG4gICAgY2FudmFzLnN0eWxlLm1heFdpZHRoID0gXCI1MHZ3XCJcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHJpbUljb24gfSBmcm9tIFwiLi4vZWxkYXJ5YV91dGlsXCJcbmltcG9ydCB0eXBlIHsgQXBwZWFyYW5jZUNhdGVnb3J5IH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2FwcGVhcmFuY2VfY2F0ZWdvcnlcIlxuaW1wb3J0IHR5cGUgeyBBcHBlYXJhbmNlR3JvdXAgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvYXBwZWFyYW5jZV9ncm91cFwiXG5pbXBvcnQgdHlwZSB7IEFwcGVhcmFuY2VJdGVtIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2FwcGVhcmFuY2VfaXRlbVwiXG5pbXBvcnQgdHlwZSB7IEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUgfSBmcm9tIFwiLi9lbnVtcy9hcHBlYXJhbmNlX2NhdGVnb3J5X2NvZGUuZW51bVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeUNvbnRhaW5lckRhdGFTZXQoXG4gIGNhdGVnb3J5Q29udGFpbmVyOiBIVE1MRGl2RWxlbWVudFxuKTogQXBwZWFyYW5jZUNhdGVnb3J5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBjYXRlZ29yeWlkLCBjYXRlZ29yeSwgY2F0ZWdvcnluYW1lIH0gPSBjYXRlZ29yeUNvbnRhaW5lci5kYXRhc2V0XG4gIGlmICghY2F0ZWdvcnlpZCB8fCAhY2F0ZWdvcnkgfHwgIWNhdGVnb3J5bmFtZSkgcmV0dXJuXG4gIHJldHVybiB7XG4gICAgY2F0ZWdvcnlpZDogTnVtYmVyKGNhdGVnb3J5aWQpLFxuICAgIGNhdGVnb3J5OiBjYXRlZ29yeSBhcyBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLFxuICAgIGNhdGVnb3J5bmFtZSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2F0ZWdvcnlHcm91cERhdGFTZXQoXG4gIGdyb3VwSXRlbTogSFRNTExJRWxlbWVudCxcbiAgYXBwZWFyYW5jZUNhdGVnb3J5OiBBcHBlYXJhbmNlQ2F0ZWdvcnlcbik6IEFwcGVhcmFuY2VHcm91cCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgaXRlbWlkLCBncm91cCwgbmFtZSwgcmFyaXR5LCByYXJpdHluYW1lIH0gPSBncm91cEl0ZW0uZGF0YXNldFxuICBpZiAoIWl0ZW1pZCB8fCAhZ3JvdXAgfHwgIW5hbWUgfHwgIXJhcml0eSB8fCAhcmFyaXR5bmFtZSkgcmV0dXJuXG4gIHJldHVybiB7XG4gICAgLi4uYXBwZWFyYW5jZUNhdGVnb3J5LFxuICAgIGl0ZW1pZDogTnVtYmVyKGl0ZW1pZCksXG4gICAgZ3JvdXA6IE51bWJlcihncm91cCksXG4gICAgbmFtZSxcbiAgICByYXJpdHksXG4gICAgcmFyaXR5bmFtZSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlbURhdGFTZXQoXG4gIGxpOiBIVE1MTElFbGVtZW50LFxuICBhcHBlYXJhbmNlR3JvdXA6IEFwcGVhcmFuY2VHcm91cFxuKTogQXBwZWFyYW5jZUl0ZW0gfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGl0ZW1pZCwgbmFtZSwgcmFyaXR5LCByYXJpdHluYW1lIH0gPSBsaS5kYXRhc2V0XG4gIGNvbnN0IGljb24gPSBsaS5xdWVyeVNlbGVjdG9yKFwiaW1nXCIpPy5zcmNcbiAgaWYgKCFpdGVtaWQgfHwgIW5hbWUgfHwgIXJhcml0eSB8fCAhcmFyaXR5bmFtZSB8fCAhaWNvbikgcmV0dXJuXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5hcHBlYXJhbmNlR3JvdXAsXG4gICAgaXRlbWlkOiBOdW1iZXIoaXRlbWlkKSxcbiAgICBuYW1lLFxuICAgIHJhcml0eSxcbiAgICByYXJpdHluYW1lLFxuICAgIGljb246IHRyaW1JY29uKGljb24pLFxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBpc0VudW0gfSBmcm9tIFwiLi4vdHNfdXRpbFwiXG5pbXBvcnQgeyBsb2FkRmF2b3VyaXRlcyB9IGZyb20gXCIuLi91aS9mYXZvdXJpdGVzXCJcbmltcG9ydCB7IGxvYWRBcHBlYXJhbmNlVUkgfSBmcm9tIFwiLi9hcHBlYXJhbmNlX3VpXCJcbmltcG9ydCB7XG4gIGNhdGVnb3J5Q29udGFpbmVyRGF0YVNldCxcbiAgY2F0ZWdvcnlHcm91cERhdGFTZXQsXG4gIGl0ZW1EYXRhU2V0LFxufSBmcm9tIFwiLi9kYXRhX3NldFwiXG5pbXBvcnQgeyBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlIH0gZnJvbSBcIi4vZW51bXMvYXBwZWFyYW5jZV9jYXRlZ29yeV9jb2RlLmVudW1cIlxuaW1wb3J0IHsgb3BlbkNhdGVnb3J5LCBvcGVuR3JvdXAgfSBmcm9tIFwiLi9mYXZvdXJpdGVzX2FjdGlvbnNcIlxuaW1wb3J0IHsgbG9hZEhpZGRlbkNhdGVnb3J5LCB1bmxvYWRIaWRkZW5DYXRlZ29yaWVzIH0gZnJvbSBcIi4vaGlkZGVuXCJcbmltcG9ydCB3YXJkcm9iZSBmcm9tIFwiLi93YXJkcm9iZVwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkRHJlc3NpbmdFeHBlcmllbmNlKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWxvY2F0aW9uLnBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvcGxheWVyL2FwcGVhcmFuY2VcIikpIHJldHVyblxuXG4gIGhhbmRsZWRDYXRlZ29yaWVzLmNsZWFyKClcbiAgbG9hZGluZyA9IGZhbHNlXG5cbiAgbG9hZEFwcGVhcmFuY2VVSSgpXG5cbiAgLy8gU2V0dXAgY2F0ZWdvcmllc1xuICBmb3IgKGNvbnN0IGxpIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTExJRWxlbWVudD4oXG4gICAgXCIjd2FyZHJvYmUtbWVudT5saSwgI2FwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcmllcyBsaVwiXG4gICkpIHtcbiAgICBjb25zdCB7IGNhdGVnb3J5IH0gPSBsaS5kYXRhc2V0XG4gICAgaWYgKCFpc0VudW0oY2F0ZWdvcnksIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUpKSBjb250aW51ZVxuXG4gICAgc3dpdGNoIChjYXRlZ29yeSkge1xuICAgICAgY2FzZSBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmJhY2tncm91bmQ6XG4gICAgICAgIGxpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZWUtY2F0ZWdvcnlcIik/LnJlbW92ZSgpXG4gICAgICAgIClcbiAgICAgICAgY29udGludWVcbiAgICAgIGNhc2UgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5mYXZvcml0ZXM6XG4gICAgICAgIGxpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlZS1jYXRlZ29yeVwiKT8ucmVtb3ZlKClcbiAgICAgICAgICB2b2lkIGhhbmRsZUNhdGVnb3J5KGNhdGVnb3J5KVxuICAgICAgICB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgY2FzZSBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmF0dGljOlxuICAgICAgICBjb250aW51ZVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbGkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudFxuICAgICAgICAgICAgLmdldEVsZW1lbnRCeUlkKFwiYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXNcIilcbiAgICAgICAgICAgID8ucmVtb3ZlKClcbiAgICAgICAgICAvLyB2b2lkIGhhbmRsZUNhdGVnb3J5KGNhdGVnb3J5KVxuICAgICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDAwKSlcbiAgLy8gYXdhaXQgbG9hZEJhY2tncm91bmQoKVxufVxuXG4vKipcbiAqIEdldCB0aGUgY2F0ZWdvcnkgY29udGFpbmVyIGZvciB0aGUgY2xpY2tlZCBjYXRlZ29yeSBhbmQgbG9hZCBpdHMgZ3JvdXBzXG4gKiBAcmV0dXJucyBDYXRlZ29yeSBjb250YWluZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ2F0ZWdvcnkoXG4gIGNhdGVnb3J5OiBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlXG4pOiBQcm9taXNlPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4ge1xuICBjb25zdCBhcHBlYXJhbmNlSXRlbXMgPVxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFwiI2FwcGVhcmFuY2UtaXRlbXNcIilcbiAgaWYgKCFhcHBlYXJhbmNlSXRlbXMpIHJldHVybiBudWxsXG5cbiAgY29uc3Qgb2xkQ2F0Q29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgYCNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LSR7Y2F0ZWdvcnl9YFxuICApXG5cbiAgaWYgKG9sZENhdENvbnRhaW5lcikge1xuICAgIGF3YWl0IG9uQXBwZWFyYW5jZUl0ZW1zQ2F0ZWdvcnkoY2F0ZWdvcnksIGFwcGVhcmFuY2VJdGVtcywgb2xkQ2F0Q29udGFpbmVyKVxuICAgIHJldHVybiBvbGRDYXRDb250YWluZXJcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcigoXywgb2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IG5ld0NhdENvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFxuICAgICAgICBgI2FwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnktJHtjYXRlZ29yeX1gXG4gICAgICApXG4gICAgICBpZiAoIW5ld0NhdENvbnRhaW5lcikgcmV0dXJuXG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KClcblxuICAgICAgdm9pZCAoYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBhd2FpdCBvbkFwcGVhcmFuY2VJdGVtc0NhdGVnb3J5KFxuICAgICAgICAgIGNhdGVnb3J5LFxuICAgICAgICAgIGFwcGVhcmFuY2VJdGVtcyxcbiAgICAgICAgICBuZXdDYXRDb250YWluZXJcbiAgICAgICAgKVxuICAgICAgICByZXNvbHZlKG5ld0NhdENvbnRhaW5lcilcbiAgICAgIH0pKClcbiAgICB9KS5vYnNlcnZlKGFwcGVhcmFuY2VJdGVtcywgeyBjaGlsZExpc3Q6IHRydWUgfSlcbiAgfSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gb25BcHBlYXJhbmNlSXRlbXNDYXRlZ29yeShcbiAgY2F0ZWdvcnk6IEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUsXG4gIGFwcGVhcmFuY2VJdGVtczogSFRNTERpdkVsZW1lbnQsXG4gIGNhdGVnb3J5Q29udGFpbmVyOiBIVE1MRGl2RWxlbWVudFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjYXRlZ29yeSA9PT0gQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5mYXZvcml0ZXMpIGxvYWRGYXZvdXJpdGVzKClcbiAgZWxzZSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDIyMCkpXG4gICAgbG9hZEVlSXRlbXMoYXBwZWFyYW5jZUl0ZW1zLCBjYXRlZ29yeUNvbnRhaW5lcilcbiAgICBhd2FpdCBoYW5kbGVHcm91cHMoY2F0ZWdvcnlDb250YWluZXIpXG4gIH1cbn1cblxuZnVuY3Rpb24gbG9hZEVlSXRlbXMoXG4gIGFwcGVhcmFuY2VJdGVtczogSFRNTERpdkVsZW1lbnQsXG4gIGNhdGVnb3J5Q29udGFpbmVyOiBIVE1MRGl2RWxlbWVudFxuKTogSFRNTERpdkVsZW1lbnQgfCBudWxsIHtcbiAgLy8gR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGNhdGVnb3J5XG4gIGNvbnN0IGFwcGVhcmFuY2VDYXRlZ29yeSA9IGNhdGVnb3J5Q29udGFpbmVyRGF0YVNldChjYXRlZ29yeUNvbnRhaW5lcilcbiAgaWYgKCFhcHBlYXJhbmNlQ2F0ZWdvcnkpIHJldHVybiBudWxsXG4gIHdhcmRyb2JlLnNldENhdGVnb3J5KGFwcGVhcmFuY2VDYXRlZ29yeSlcbiAgY2F0ZWdvcnlDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKVxuICBjYXRlZ29yeUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcblxuICAvLyBTZXR1cCBhcHBlYXJhbmNlX2l0ZW1zX2NhdGVnb3J5XG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9hcHBlYXJhbmNlX2l0ZW1zX2NhdGVnb3J5Lmh0bWxcIilcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlZS1jYXRlZ29yeVwiKT8ucmVtb3ZlKClcbiAgYXBwZWFyYW5jZUl0ZW1zLmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIHRlbXBsYXRlLnJlbmRlcih7IC4uLmFwcGVhcmFuY2VDYXRlZ29yeSwgdHJhbnNsYXRlIH0pXG4gIClcblxuICBjb25zdCBlZUl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIjZWUtaXRlbXNcIilcbiAgaWYgKCFlZUl0ZW1zKSByZXR1cm4gbnVsbFxuICBlZUl0ZW1zLmRhdGFzZXQuY2F0ZWdvcnlpZCA9IGFwcGVhcmFuY2VDYXRlZ29yeS5jYXRlZ29yeWlkLnRvU3RyaW5nKClcbiAgZWVJdGVtcy5kYXRhc2V0LmNhdGVnb3J5ID0gYXBwZWFyYW5jZUNhdGVnb3J5LmNhdGVnb3J5XG4gIGVlSXRlbXMuZGF0YXNldC5jYXRlZ29yeW5hbWUgPSBhcHBlYXJhbmNlQ2F0ZWdvcnkuY2F0ZWdvcnluYW1lXG4gIHJldHVybiBlZUl0ZW1zXG59XG5cbmNvbnN0IGhhbmRsZWRDYXRlZ29yaWVzID0gbmV3IFNldDxBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlPigpXG5cbi8qKiBMb2FkIGVhY2ggZ3JvdXBzIHN5bmNocm9ub3VzbHkgYW5kIGFkZCB0aGVtIHRvIGEgY3VzdG9tIGNvbnRhaW5lci4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUdyb3VwcyhjYXRlZ29yeUNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXBwZWFyYW5jZUNhdGVnb3J5ID0gY2F0ZWdvcnlDb250YWluZXJEYXRhU2V0KGNhdGVnb3J5Q29udGFpbmVyKVxuICBpZiAoIWFwcGVhcmFuY2VDYXRlZ29yeSkgcmV0dXJuXG4gIHdhcmRyb2JlLnNldENhdGVnb3J5KGFwcGVhcmFuY2VDYXRlZ29yeSlcbiAgY2F0ZWdvcnlDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKVxuICBjYXRlZ29yeUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcblxuICBjb25zdCBoYW5kbGVkID0gaGFuZGxlZENhdGVnb3JpZXMuaGFzKGFwcGVhcmFuY2VDYXRlZ29yeS5jYXRlZ29yeSlcbiAgaGFuZGxlZENhdGVnb3JpZXMuYWRkKGFwcGVhcmFuY2VDYXRlZ29yeS5jYXRlZ29yeSlcblxuICBsb2FkSGlkZGVuQ2F0ZWdvcnkoYXBwZWFyYW5jZUNhdGVnb3J5LmNhdGVnb3J5KVxuICBmb3IgKGNvbnN0IGxpIG9mIGNhdGVnb3J5Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTExJRWxlbWVudD4oXG4gICAgXCJsaS5hcHBlYXJhbmNlLWl0ZW0tZ3JvdXBcIlxuICApKSB7XG4gICAgY29uc3QgYXBwZWFyYW5jZUdyb3VwID0gY2F0ZWdvcnlHcm91cERhdGFTZXQobGksIGFwcGVhcmFuY2VDYXRlZ29yeSlcbiAgICBpZiAoIWFwcGVhcmFuY2VHcm91cD8uZ3JvdXApIGJyZWFrXG4gICAgd2FyZHJvYmUuc2V0R3JvdXAoYXBwZWFyYW5jZUdyb3VwKVxuXG4gICAgaWYgKFxuICAgICAgIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGAjYXBwZWFyYW5jZS1pdGVtcy1ncm91cC0ke2FwcGVhcmFuY2VHcm91cC5ncm91cH1gXG4gICAgICApICYmXG4gICAgICAhaGFuZGxlZFxuICAgICAgLy8gJiYgIWxvYWRIaWRkZW5Hcm91cChhcHBlYXJhbmNlR3JvdXAuZ3JvdXApXG4gICAgKVxuICAgICAgYXdhaXQgb3Blbkdyb3VwKGFwcGVhcmFuY2VHcm91cC5ncm91cClcblxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFxuICAgICAgYCNhcHBlYXJhbmNlLWl0ZW1zLWdyb3VwLSR7YXBwZWFyYW5jZUdyb3VwLmdyb3VwfWBcbiAgICApXG4gICAgaWYgKCFkaXYpIGJyZWFrXG4gICAgZGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIilcblxuICAgIGNvbnN0IHNjcmlwdCA9IGRpdi5xdWVyeVNlbGVjdG9yKFwic2NyaXB0XCIpIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW1wbGllZC1ldmFsXG4gICAgaWYgKHNjcmlwdCkgc2V0VGltZW91dChzY3JpcHQuaW5uZXJIVE1MLCAwKVxuXG4gICAgY29uc3Qgb3V0ZXJIVE1MID0gQXJyYXkuZnJvbShcbiAgICAgIGRpdi5xdWVyeVNlbGVjdG9yQWxsPEhUTUxMSUVsZW1lbnQ+KFwibGkuYXBwZWFyYW5jZS1pdGVtXCIpXG4gICAgKVxuICAgICAgLm1hcChsaSA9PiB7XG4gICAgICAgIGNvbnN0IGFwcGVhcmFuY2VJdGVtID0gaXRlbURhdGFTZXQobGksIGFwcGVhcmFuY2VHcm91cClcbiAgICAgICAgaWYgKCFhcHBlYXJhbmNlSXRlbT8uaWNvbikgcmV0dXJuIGxpLm91dGVySFRNTFxuXG4gICAgICAgIGxpLmRhdGFzZXQuY2F0ZWdvcnlpZCA9IGFwcGVhcmFuY2VJdGVtLmNhdGVnb3J5aWQudG9TdHJpbmcoKVxuICAgICAgICBsaS5kYXRhc2V0LmNhdGVnb3J5ID0gYXBwZWFyYW5jZUl0ZW0uY2F0ZWdvcnlcbiAgICAgICAgbGkuZGF0YXNldC5jYXRlZ29yeW5hbWUgPSBhcHBlYXJhbmNlSXRlbS5jYXRlZ29yeW5hbWVcbiAgICAgICAgbGkuZGF0YXNldC5ncm91cCA9IGFwcGVhcmFuY2VJdGVtLmdyb3VwLnRvU3RyaW5nKClcbiAgICAgICAgd2FyZHJvYmUuc2V0SXRlbShhcHBlYXJhbmNlSXRlbSlcblxuICAgICAgICByZXR1cm4gbGkub3V0ZXJIVE1MXG4gICAgICB9KVxuICAgICAgLmpvaW4oXCJcXG5cIilcbiAgICB3YXJkcm9iZS5hdmFpbGFibGVJdGVtcyA9IGF2YWlsYWJsZUl0ZW1zXG5cbiAgICBkaXYucmVtb3ZlKClcblxuICAgIGNvbnN0IGFjdGl2ZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBgI3dhcmRyb2JlLW1lbnUgbGlbZGF0YS1jYXRlZ29yeT1cIiR7YXBwZWFyYW5jZUdyb3VwLmNhdGVnb3J5fVwiXS5hY3RpdmVgXG4gICAgKVxuXG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgZG9jdW1lbnRcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFwiI2VlLWl0ZW1zXCIpXG4gICAgICAgID8uaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYmVmb3JlZW5kXCIsIG91dGVySFRNTClcblxuICAgICAgaW5pdGlhbGl6ZVNlbGVjdGVkSXRlbXMoKVxuICAgICAgaW5pdGlhbGl6ZUhpZGRlbkNhdGVnb3JpZXMoKVxuICAgIH0gZWxzZSBpZiAoaGFuZGxlZCkgYnJlYWtcbiAgfVxuXG4gIGlmICghaGFuZGxlZCkgaGFuZGxlZENhdGVnb3JpZXMuZGVsZXRlKGFwcGVhcmFuY2VDYXRlZ29yeS5jYXRlZ29yeSlcbiAgdW5sb2FkSGlkZGVuQ2F0ZWdvcmllcygpXG59XG5cbmxldCBsb2FkaW5nID0gZmFsc2VcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRCYWNrZ3JvdW5kKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAobG9hZGluZykgcmV0dXJuXG4gIGxvYWRpbmcgPSB0cnVlXG4gIGxldCBzdWNjZXNzID0gdHJ1ZVxuXG4gIGNvbnN0IGNhdGVnb3JpZXMgPSBbXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS51bmRlcndlYXIsXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5za2luLFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUudGF0b28sXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5tb3V0aCxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmV5ZSxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmhhaXIsXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5zb2NrLFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuc2hvZSxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLnBhbnRzLFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuaGFuZEFjY2Vzc29yeSxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLnRvcCxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmNvYXQsXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5nbG92ZSxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLm5lY2tsYWNlLFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuZHJlc3MsXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5oYXQsXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5mYWNlQWNjZXNzb3J5LFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuYmVsdCxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmFtYmllbnQsXG4gIF1cblxuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvZmxhdnJfbm90aWYvaWNvbl9tZXNzYWdlLmh0bWxcIilcblxuICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIGNhdGVnb3JpZXMpIHtcbiAgICBpZiAoIWxvY2F0aW9uLnBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvcGxheWVyL2FwcGVhcmFuY2VcIikpIHtcbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgYCN3YXJkcm9iZS1tZW51IGxpW2RhdGEtY2F0ZWdvcnk9XCIke2NhdGVnb3J5fVwiXS5hY3RpdmVgXG4gICAgKVxuICAgIGlmIChhY3RpdmUpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBjYXRlZ29yeUNvbnRhaW5lciA9IGF3YWl0IG9wZW5DYXRlZ29yeShjYXRlZ29yeSlcbiAgICBpZiAoIWNhdGVnb3J5Q29udGFpbmVyKSB7XG4gICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgbGV0IGZpbmlzaGVkID0gZmFsc2VcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghZmluaXNoZWQpXG4gICAgICAgICQuZmxhdnJOb3RpZihcbiAgICAgICAgICB0ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgICAgICAgaWNvbjogYC9zdGF0aWMvaW1nL21hbGwvY2F0ZWdvcmllcy8ke2NhdGVnb3J5fS5wbmdgLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRlLmFwcGVhcmFuY2UubG9hZGluZyhcbiAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MTElFbGVtZW50PihcbiAgICAgICAgICAgICAgICBgI3dhcmRyb2JlLW1lbnUgbGlbZGF0YS1jYXRlZ29yeT1cIiR7Y2F0ZWdvcnl9XCJdYFxuICAgICAgICAgICAgICApPy5kYXRhc2V0LmNhdGVnb3J5bmFtZSA/PyBjYXRlZ29yeVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgfSwgMTAwMClcblxuICAgIGF3YWl0IGhhbmRsZUdyb3VwcyhjYXRlZ29yeUNvbnRhaW5lcilcbiAgICBmaW5pc2hlZCA9IHRydWVcbiAgfVxuXG4gIGlmIChzdWNjZXNzKSAkLmZsYXZyTm90aWYodHJhbnNsYXRlLmFwcGVhcmFuY2UubG9hZGVkKVxuICBsb2FkaW5nID0gZmFsc2Vcbn1cbiIsImV4cG9ydCBlbnVtIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUge1xuICBhdHRpYyA9IFwiYXR0aWNcIixcbiAgZmF2b3JpdGVzID0gXCJmYXZvcml0ZXNcIixcbiAgdW5kZXJ3ZWFyID0gXCJ1bmRlcndlYXJcIixcbiAgc2tpbiA9IFwic2tpblwiLFxuICB0YXRvbyA9IFwidGF0b29cIixcbiAgbW91dGggPSBcIm1vdXRoXCIsXG4gIGV5ZSA9IFwiZXllXCIsXG4gIGhhaXIgPSBcImhhaXJcIixcbiAgc29jayA9IFwic29ja1wiLFxuICBzaG9lID0gXCJzaG9lXCIsXG4gIHBhbnRzID0gXCJwYW50c1wiLFxuICBoYW5kQWNjZXNzb3J5ID0gXCJoYW5kQWNjZXNzb3J5XCIsXG4gIHRvcCA9IFwidG9wXCIsXG4gIGNvYXQgPSBcImNvYXRcIixcbiAgZ2xvdmUgPSBcImdsb3ZlXCIsXG4gIG5lY2tsYWNlID0gXCJuZWNrbGFjZVwiLFxuICBkcmVzcyA9IFwiZHJlc3NcIixcbiAgaGF0ID0gXCJoYXRcIixcbiAgZmFjZUFjY2Vzc29yeSA9IFwiZmFjZUFjY2Vzc29yeVwiLFxuICBiYWNrZ3JvdW5kID0gXCJiYWNrZ3JvdW5kXCIsXG4gIGJlbHQgPSBcImJlbHRcIixcbiAgYW1iaWVudCA9IFwiYW1iaWVudFwiLFxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IGluZGV4ZWRfZGIgZnJvbSBcIi4uL2luZGV4ZWRfZGIvaW5kZXhlZF9kYlwiXG5pbXBvcnQgeyBwYXJzZUF2YXRhciB9IGZyb20gXCIuLi9vdXRmaXRcIlxuaW1wb3J0IHsgbG9hZEZha2VGYXZvdXJpdGVzIH0gZnJvbSBcIi4uL3VpL2Zhdm91cml0ZXNcIlxuaW1wb3J0IHsgd2Vhck91dGZpdCB9IGZyb20gXCIuL2Zhdm91cml0ZXNfYWN0aW9uc1wiXG5pbXBvcnQgdHlwZSB7IEZhdm91cml0ZU91dGZpdCB9IGZyb20gXCIuL2ludGVyZmFjZXMvZmF2b3VyaXRlX291dGZpdFwiXG5pbXBvcnQgdHlwZSB7IFBhcnNhYmxlSXRlbSB9IGZyb20gXCIuL2ludGVyZmFjZXMvcGFyc2FibGVfaXRlbVwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlRmF2b3VyaXRlKCk6IFByb21pc2U8RmF2b3VyaXRlT3V0Zml0IHwgbnVsbD4ge1xuICBjb25zdCBmYXZvdXJpdGUgPSBhd2FpdCBzaG93T3V0Zml0KClcbiAgaWYgKGZhdm91cml0ZSkgYXdhaXQgbG9hZEZha2VGYXZvdXJpdGVzKClcbiAgcmV0dXJuIGZhdm91cml0ZVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVGYXZvdXJpdGUoZmF2b3VyaXRlOiBGYXZvdXJpdGVPdXRmaXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgaW5kZXhlZF9kYi5kZWxldGVGYXZvdXJpdGVPdXRmaXQoZmF2b3VyaXRlKVxuICBhd2FpdCBsb2FkRmFrZUZhdm91cml0ZXMoKVxufVxuXG5hc3luYyBmdW5jdGlvbiBzaG93T3V0Zml0KCk6IFByb21pc2U8RmF2b3VyaXRlT3V0Zml0IHwgbnVsbD4ge1xuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvY3JlYXRlZF9vdXRmaXRfZmxhdnIuaHRtbFwiKVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+XG4gICAgJC5mbGF2cih7XG4gICAgICBjb250ZW50OiB0ZW1wbGF0ZS5yZW5kZXIoeyB0cmFuc2xhdGUgfSksXG4gICAgICBvbkJ1aWxkOiAkY29udGFpbmVyID0+IHtcbiAgICAgICAgJGNvbnRhaW5lci5hZGRDbGFzcyhcIm5ldy1sYXlvdXQtcG9wdXBcIilcbiAgICAgICAgJGNvbnRhaW5lci5hZGRDbGFzcyhcImNyZWF0ZWQtb3V0Zml0LXBvcHVwXCIpXG5cbiAgICAgICAgY29uc3Qgc2F2ZUJ1dHRvbiA9XG4gICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oJ1tyZWw9XCJidG4tc2F2ZVwiXScpXG4gICAgICAgIGlmICghc2F2ZUJ1dHRvbikgcmV0dXJuXG5cbiAgICAgICAgZG9jdW1lbnRcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihcIiNjaG9vc2UtbmFtZVwiKVxuICAgICAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IFwiRW50ZXJcIikgc2F2ZUJ1dHRvbi5jbGljaygpXG5cbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFwiI2Nob29zZS1uYW1lXCIpPy52YWx1ZSlcbiAgICAgICAgICAgICAgc2F2ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwiZGlzYWJsZWRcIilcbiAgICAgICAgICAgIGVsc2Ugc2F2ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiZGlzYWJsZWRcIilcbiAgICAgICAgICB9KVxuXG4gICAgICAgIHNhdmVCdXR0b24uY2xhc3NMaXN0LmFkZChcIm5sLWJ1dHRvblwiLCBcIm5sLWJ1dHRvbi1sZ1wiLCBcImRpc2FibGVkXCIpXG4gICAgICB9LFxuICAgICAgYnV0dG9uczoge1xuICAgICAgICBjbG9zZToge1xuICAgICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgICAgc3R5bGU6IFwiY2xvc2VcIixcbiAgICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2F2ZToge1xuICAgICAgICAgIHRleHQ6IHRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuc2F2ZV9vdXRmaXQuc2F2ZSxcbiAgICAgICAgICBzdHlsZTogXCJkZWZhdWx0XCIsXG4gICAgICAgICAgYWN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID1cbiAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihcIiNjaG9vc2UtbmFtZVwiKT8udmFsdWVcbiAgICAgICAgICAgIGlmICghbmFtZSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgICAgICAgIGNvbnN0IGF2YXRhciA9IFNhY2hhLkF2YXRhci5hdmF0YXJzW1wiI2FwcGVhcmFuY2UtcHJldmlld1wiXVxuICAgICAgICAgICAgaWYgKCFhdmF0YXIpIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBwYXJzZUF2YXRhcihhdmF0YXIpXG5cbiAgICAgICAgICAgIHZvaWQgc2F2ZUFjdGlvbihuYW1lLCBpdGVtcywgcmVzb2x2ZSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvd0Zhdm91cml0ZShmYXZvdXJpdGU6IEZhdm91cml0ZU91dGZpdCk6IHZvaWQge1xuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvZmF2b3VyaXRlX291dGZpdF9mbGF2ci5odG1sXCIpXG5cbiAgJC5mbGF2cih7XG4gICAgY29udGVudDogdGVtcGxhdGUucmVuZGVyKHsgLi4uZmF2b3VyaXRlLCB0cmFuc2xhdGUgfSksXG4gICAgb25CdWlsZDogJGNvbnRhaW5lciA9PiB7XG4gICAgICAkY29udGFpbmVyLmFkZENsYXNzKFwibmV3LWxheW91dC1wb3B1cFwiKVxuICAgICAgJGNvbnRhaW5lci5hZGRDbGFzcyhcImNyZWF0ZWQtb3V0Zml0LXBvcHVwXCIpXG4gICAgfSxcbiAgICBidXR0b25zOiB7XG4gICAgICBjbG9zZToge1xuICAgICAgICB0ZXh0OiBcIlwiLFxuICAgICAgICBzdHlsZTogXCJjbG9zZVwiLFxuICAgICAgICBhY3Rpb246ICgpID0+IHRydWUsXG4gICAgICB9LFxuICAgICAgZGVsZXRlOiB7XG4gICAgICAgIHRleHQ6IHRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuY2xpY2tfb3V0Zml0LmRlbGV0ZSxcbiAgICAgICAgc3R5bGU6IFwiZGVmYXVsdFwiLFxuICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICB2b2lkIGRlbGV0ZUZhdm91cml0ZShmYXZvdXJpdGUpXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB3ZWFyOiB7XG4gICAgICAgIHRleHQ6IHRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuY2xpY2tfb3V0Zml0LndlYXIsXG4gICAgICAgIHN0eWxlOiBcImRlZmF1bHRcIixcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXZhdGFyID0gU2FjaGEuQXZhdGFyLmF2YXRhcnNbXCIjYXBwZWFyYW5jZS1wcmV2aWV3XCJdXG4gICAgICAgICAgaWYgKCFhdmF0YXIpIHJldHVybiBmYWxzZVxuXG4gICAgICAgICAgdm9pZCAoYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT5cbiAgICAgICAgICAgIHdlYXJPdXRmaXQoYXZhdGFyLCBmYXZvdXJpdGUuaXRlbXMpKSgpXG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KVxufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlQWN0aW9uKFxuICBuYW1lOiBzdHJpbmcsXG4gIGl0ZW1zOiBQYXJzYWJsZUl0ZW1bXSxcbiAgcmVzb2x2ZTogKHZhbHVlOiBGYXZvdXJpdGVPdXRmaXQpID0+IHZvaWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBibG9iID0gYXdhaXQgbmV3IFByb21pc2U8QmxvYj4ocmVzb2x2ZSA9PiB7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxDYW52YXNFbGVtZW50PihcIiNhcHBlYXJhbmNlLXByZXZpZXcgY2FudmFzXCIpXG4gICAgICA/LnRvQmxvYihibG9iID0+IHJlc29sdmUoYmxvYiEpLCBcImltYWdlL3BuZ1wiLCAxKVxuICB9KVxuXG4gIHJlc29sdmUoe1xuICAgIC4uLihhd2FpdCBpbmRleGVkX2RiLmFkZEZhdm91cml0ZU91dGZpdCh7XG4gICAgICBpdGVtcyxcbiAgICAgIG5hbWUsXG4gICAgICBibG9iLFxuICAgIH0pKSxcbiAgICB1cmw6IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYiksXG4gIH0pXG59XG4iLCJpbXBvcnQgdHlwZSB7IEF2YXRhciB9IGZyb20gXCIuLi9lbGRhcnlhL2F2YXRhclwiXG5pbXBvcnQgdHlwZSB7IEl0ZW0gfSBmcm9tIFwiLi4vZWxkYXJ5YS9pdGVtXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBleHBvcnRPdXRmaXQgfSBmcm9tIFwiLi4vb3V0Zml0XCJcbmltcG9ydCB0eXBlIHsgUGFyc2FibGVJdGVtIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9wYXJzYWJsZV9pdGVtXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFByZXZpZXcoKTogdm9pZCB7XG4gIGV4cG9ydE91dGZpdChcIiNhcHBlYXJhbmNlLXByZXZpZXdcIilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGltcG9ydE91dGZpdCgpOiB2b2lkIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIilcbiAgaW5wdXQuc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcImZpbGVcIilcbiAgaW5wdXQuc2V0QXR0cmlidXRlKFwiYWNjZXB0XCIsIFwiYXBwbGljYXRpb24vanNvblwiKVxuICBpbnB1dC5jbGljaygpXG5cbiAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGV2ZW50ID0+IHtcbiAgICBpZiAoIWV2ZW50LnRhcmdldCkgcmV0dXJuXG4gICAgY29uc3QgZmlsZXMgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzXG4gICAgaWYgKCFmaWxlcykgcmV0dXJuXG4gICAgY29uc3QgZmlsZSA9IGZpbGVzWzBdXG4gICAgaWYgKCFmaWxlKSByZXR1cm5cbiAgICB2b2lkIGZpbGUudGV4dCgpLnRoZW4oYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IG91dGZpdDogUGFyc2FibGVJdGVtW10gPSBKU09OLnBhcnNlKHZhbHVlKVxuICAgICAgY29uc3QgYXZhdGFyID0gU2FjaGEuQXZhdGFyLmF2YXRhcnNbXCIjYXBwZWFyYW5jZS1wcmV2aWV3XCJdXG4gICAgICBpZiAoIWF2YXRhcikgcmV0dXJuXG5cbiAgICAgIGF3YWl0IHdlYXJPdXRmaXQoYXZhdGFyLCBvdXRmaXQpXG4gICAgfSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2xvdGhlcygpOiB2b2lkIHtcbiAgY29uc3QgYXZhdGFyID0gU2FjaGEuQXZhdGFyLmF2YXRhcnNbXCIjYXBwZWFyYW5jZS1wcmV2aWV3XCJdXG4gIGlmICghYXZhdGFyKSByZXR1cm5cblxuICBmb3IgKGxldCBpID0gYXZhdGFyLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgaXRlbVJlbmRlciA9IGF2YXRhci5jaGlsZHJlbltpXVxuICAgIGlmICghaXRlbVJlbmRlcikgY29udGludWVcblxuICAgIGNvbnN0IGl0ZW0gPSBpdGVtUmVuZGVyLmdldEl0ZW0oKVxuICAgIGlmIChTYWNoYS5BdmF0YXIucmVtb3ZlSXRlbUZyb21BbGxBdmF0YXJzKGl0ZW0pKSB7XG4gICAgICAkKGAjYXBwZWFyYW5jZS1pdGVtLSR7aXRlbS5faWR9YCkucmVtb3ZlQ2xhc3MoXCJzZWxlY3RlZFwiKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3Blbkdyb3VwKGdyb3VwOiBudW1iZXIpOiBQcm9taXNlPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8SFRNTERpdkVsZW1lbnQgfCBudWxsPigocmVzb2x2ZSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGdyb3VwQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgICBgI2FwcGVhcmFuY2UtaXRlbXMtZ3JvdXAtJHtncm91cH1gXG4gICAgKVxuICAgIGlmIChncm91cENvbnRhaW5lcikgcmV0dXJuIHZvaWQgcmVzb2x2ZShncm91cENvbnRhaW5lcilcblxuICAgIGNvbnN0IGF2YXRhciA9IFNhY2hhLkF2YXRhci5hdmF0YXJzW1wiI2FwcGVhcmFuY2UtcHJldmlld1wiXVxuICAgIGlmICghYXZhdGFyKSByZXR1cm4gdm9pZCByZXNvbHZlKG51bGwpXG5cbiAgICB2b2lkICQuZ2V0KFxuICAgICAgYC9wbGF5ZXIvb3Blbkdyb3VwLyR7Z3JvdXB9YCxcbiAgICAgIHsgd29ybkl0ZW1zOiBhdmF0YXIuZ2V0SXRlbXNUb1NhdmUoKSB9LFxuICAgICAgKHZpZXc6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICAkKHZpZXcpLmhpZGUoKS5hcHBlbmRUbyhcIiNhcHBlYXJhbmNlLWl0ZW1zXCIpXG4gICAgICAgIHJlc29sdmUoXG4gICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgICAgICAgICBgI2FwcGVhcmFuY2UtaXRlbXMtZ3JvdXAtJHtncm91cH1gXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICB9XG4gICAgKVxuICB9KVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlbkNhdGVnb3J5KFxuICBjYXRlZ29yeTogc3RyaW5nXG4pOiBQcm9taXNlPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8SFRNTERpdkVsZW1lbnQgfCBudWxsPigocmVzb2x2ZSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGNhdGVnb3J5Q29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgICBgI2FwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnktJHtjYXRlZ29yeX1gXG4gICAgKVxuICAgIGlmIChjYXRlZ29yeUNvbnRhaW5lcikgcmV0dXJuIHZvaWQgcmVzb2x2ZShjYXRlZ29yeUNvbnRhaW5lcilcblxuICAgIHZvaWQgJC5wb3N0KGAvcGxheWVyL29wZW5DYXRlZ29yeS8ke2NhdGVnb3J5fWAsICh2aWV3OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICQodmlldykuaGlkZSgpLmFwcGVuZFRvKFwiI2FwcGVhcmFuY2UtaXRlbXNcIilcbiAgICAgIHJlc29sdmUoXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFxuICAgICAgICAgIGAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS0ke2NhdGVnb3J5fWBcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0pXG4gIH0pXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3ZWFyT3V0Zml0KFxuICBhdmF0YXI6IEF2YXRhcixcbiAgb3V0Zml0OiBQYXJzYWJsZUl0ZW1bXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gICQuZmxhdnJOb3RpZih0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLmltcG9ydGluZylcblxuICAvLyBHZXQgYWxsIGNhdGVnb3JpZXNcbiAgY29uc3QgY2F0ZWdvcmllcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGZvciAoY29uc3QgY2xvdGhpbmcgb2Ygb3V0Zml0KVxuICAgIGlmICghYXZhaWxhYmxlSXRlbXNbY2xvdGhpbmcuaWRdKSBjYXRlZ29yaWVzLmFkZChjbG90aGluZy50eXBlKVxuXG4gIC8vIE9wZW4gYWxsIGNhdGVnb3JpZXNcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgQXJyYXkuZnJvbShjYXRlZ29yaWVzLnZhbHVlcygpKS5tYXAoYXN5bmMgY2F0ZWdvcnkgPT5cbiAgICAgIG9wZW5DYXRlZ29yeShjYXRlZ29yeSlcbiAgICApXG4gIClcblxuICAvLyBHZXQgYWxsIGdyb3Vwc1xuICBjb25zdCBncm91cHMgPSBuZXcgU2V0PG51bWJlcj4oKVxuICBmb3IgKGNvbnN0IGNsb3RoaW5nIG9mIG91dGZpdClcbiAgICBpZiAoXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ncm91cD1cIiR7Y2xvdGhpbmcuZ3JvdXB9XCJdYCkgJiZcbiAgICAgICFhdmFpbGFibGVJdGVtc1tjbG90aGluZy5pZF1cbiAgICApXG4gICAgICBncm91cHMuYWRkKGNsb3RoaW5nLmdyb3VwKVxuXG4gIC8vIE9wZW4gYWxsIGdyb3Vwc1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBBcnJheS5mcm9tKGdyb3Vwcy52YWx1ZXMoKSkubWFwKGFzeW5jIGdyb3VwID0+IG9wZW5Hcm91cChncm91cCkpXG4gIClcblxuICAvLyBHZXQgdGhlIGl0ZW1zIGZyb20gYGF2YWlsYWJsZUl0ZW1zYFxuICBjb25zdCB3b3JuSXRlbXM6IEl0ZW1bXSA9IFtdXG4gIGZvciAoY29uc3QgY2xvdGhpbmcgb2Ygb3V0Zml0KSB7XG4gICAgY29uc3QgaXRlbSA9IGF2YWlsYWJsZUl0ZW1zW2Nsb3RoaW5nLmlkXVxuICAgIGlmIChpdGVtKSB3b3JuSXRlbXMucHVzaChpdGVtKVxuICB9XG5cbiAgcmVtb3ZlQ2xvdGhlcygpXG4gIGF2YXRhci5hZGRJdGVtcyh3b3JuSXRlbXMpXG4gIGluaXRpYWxpemVTZWxlY3RlZEl0ZW1zKClcbiAgaW5pdGlhbGl6ZUhpZGRlbkNhdGVnb3JpZXMoKVxuXG4gIGNvbnN0IGF2YXRhckFjdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImF2YXRhci1hY3Rpb25zXCIpXG4gIGlmIChhdmF0YXJBY3Rpb25zKSBhdmF0YXJBY3Rpb25zLnN0eWxlLmRpc3BsYXkgPSBcImluaXRpYWxcIlxuXG4gICQuZmxhdnJOb3RpZih0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLmltcG9ydGVkKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgdHlwZSB7IEFwcGVhcmFuY2VDYXRlZ29yeSB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9hcHBlYXJhbmNlX2NhdGVnb3J5XCJcbmltcG9ydCB0eXBlIHsgQXBwZWFyYW5jZUdyb3VwIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2FwcGVhcmFuY2VfZ3JvdXBcIlxuaW1wb3J0IHdhcmRyb2JlIGZyb20gXCIuL3dhcmRyb2JlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHVubG9hZEhpZGRlbkNhdGVnb3JpZXMoKTogdm9pZCB7XG4gIGNvbnN0IGhpZGRlbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTERpdkVsZW1lbnQ+KFxuICAgIFwiI2FwcGVhcmFuY2UtaXRlbXMgLmFwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnk6bm90KC5hY3RpdmUpOm5vdChbZGF0YS1jYXRlZ29yeW5hbWVdKSwgI2FwcGVhcmFuY2UtaXRlbXMgc2NyaXB0LCBib2R5PnNjcmlwdFwiXG4gIClcbiAgZm9yIChjb25zdCBkaXYgb2YgaGlkZGVuKSB7XG4gICAgZGl2LnJlbW92ZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBQbGFjZSB0aGUgc2F2ZWQgZ3JvdXBzIG9uIHRoZSBET00gYXMgaWYgaXQgd2FzIEVsZGFyeWEgZG9pbmcgaXQuXG4gKiBAcmV0dXJucyB0aGUgYXNzb2NpYXRlZCBgQXBwZWFyYW5jZUNhdGVnb3J5YCBpZiBpdCdzIGZvdW5kIGluIHRoZSB3YXJkcm9iZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRIaWRkZW5DYXRlZ29yeShjb2RlOiBzdHJpbmcpOiBBcHBlYXJhbmNlQ2F0ZWdvcnkgfCBudWxsIHtcbiAgY29uc3QgY2F0ZWdvcnkgPSB3YXJkcm9iZS5nZXRDYXRlZ29yaWVzKCkuZmluZChjID0+IGMuY2F0ZWdvcnkgPT09IGNvZGUpXG4gIGlmICghY2F0ZWdvcnkpIHJldHVybiBudWxsXG5cbiAgY29uc3QgZ3JvdXBzID0gd2FyZHJvYmUuZ2V0Q2F0ZWdvcnlHcm91cHMoY2F0ZWdvcnkuY2F0ZWdvcnlpZClcbiAgY29uc3QgaXRlbVRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9hcHBlYXJhbmNlX2l0ZW0uaHRtbFwiKVxuICBjb25zdCBncm91cFRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9hcHBlYXJhbmNlX2l0ZW1zX2dyb3VwLmh0bWxcIilcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIjYXBwZWFyYW5jZS1pdGVtc1wiKVxuICAgID8uaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgICAgXCJiZWZvcmVlbmRcIixcbiAgICAgIGdyb3Vwc1xuICAgICAgICAubWFwKGdyb3VwID0+XG4gICAgICAgICAgZ3JvdXBUZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgICBpdGVtczogd2FyZHJvYmVcbiAgICAgICAgICAgICAgLmdldEl0ZW1zKGdyb3VwLmdyb3VwKVxuICAgICAgICAgICAgICAubWFwKGl0ZW0gPT4gaXRlbVRlbXBsYXRlLnJlbmRlcihpdGVtKSlcbiAgICAgICAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIlxcblwiKVxuICAgIClcbiAgcmV0dXJuIGNhdGVnb3J5XG59XG5cbi8qKlxuICogTG9hZCB0aGUgc2F2ZWQgZ3JvdXAgb24gdGhlIERPTSBhcyBpZiBpdCB3YXMgRWxkYXJ5YSBkb2luZyBpdC5cbiAqIEByZXR1cm5zIHRoZSBhc3NvY2lhdGVkIGBBcHBlYXJhbmNlR3JvdXBgIGlmIGl0J3MgZm91bmQgaW4gdGhlIHdhcmRyb2JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEhpZGRlbkdyb3VwKGlkOiBudW1iZXIpOiBBcHBlYXJhbmNlR3JvdXAgfCBudWxsIHtcbiAgY29uc3QgZ3JvdXAgPSB3YXJkcm9iZS5nZXRHcm91cChpZClcbiAgaWYgKCFncm91cCkgcmV0dXJuIG51bGxcblxuICBjb25zdCBpdGVtVGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2FwcGVhcmFuY2VfaXRlbS5odG1sXCIpXG4gIGNvbnN0IGdyb3VwVGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2FwcGVhcmFuY2VfaXRlbXNfZ3JvdXAuaHRtbFwiKVxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcIiNhcHBlYXJhbmNlLWl0ZW1zXCIpXG4gICAgPy5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgICBcImJlZm9yZWVuZFwiLFxuICAgICAgZ3JvdXBUZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgICAuLi5ncm91cCxcbiAgICAgICAgaXRlbXM6IHdhcmRyb2JlXG4gICAgICAgICAgLmdldEl0ZW1zKGdyb3VwLmdyb3VwKVxuICAgICAgICAgIC5tYXAoaXRlbSA9PiBpdGVtVGVtcGxhdGUucmVuZGVyKGl0ZW0pKVxuICAgICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgfSlcbiAgICApXG4gIHJldHVybiBncm91cFxufVxuIiwiaW1wb3J0IHR5cGUgeyBJdGVtIH0gZnJvbSBcIi4uL2VsZGFyeWEvaXRlbVwiXG5pbXBvcnQgdHlwZSB7IEFwcGVhcmFuY2VDYXRlZ29yeSB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9hcHBlYXJhbmNlX2NhdGVnb3J5XCJcbmltcG9ydCB0eXBlIHsgQXBwZWFyYW5jZUdyb3VwIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2FwcGVhcmFuY2VfZ3JvdXBcIlxuaW1wb3J0IHR5cGUgeyBBcHBlYXJhbmNlSXRlbSB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9hcHBlYXJhbmNlX2l0ZW1cIlxuXG5jbGFzcyBXYXJkcm9iZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2F0ZWdvcmllczogUmVjb3JkPG51bWJlciwgQXBwZWFyYW5jZUNhdGVnb3J5PiA9IHt9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBncm91cHM6IFJlY29yZDxudW1iZXIsIEFwcGVhcmFuY2VHcm91cD4gPSB7fVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgaXRlbXM6IFJlY29yZDxudW1iZXIsIEFwcGVhcmFuY2VJdGVtPiA9IHt9XG5cbiAgYXZhaWxhYmxlSXRlbXM/OiBSZWNvcmQ8bnVtYmVyLCBJdGVtPlxuXG4gIGdldENhdGVnb3JpZXMoKTogQXBwZWFyYW5jZUNhdGVnb3J5W10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuY2F0ZWdvcmllcylcbiAgfVxuXG4gIGdldENhdGVnb3J5KGlkOiBudW1iZXIpOiBBcHBlYXJhbmNlQ2F0ZWdvcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNhdGVnb3JpZXNbaWRdXG4gIH1cblxuICBnZXRDYXRlZ29yeUdyb3VwcyhjYXRlZ29yeWlkOiBudW1iZXIpOiBBcHBlYXJhbmNlR3JvdXBbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5ncm91cHMpLmZpbHRlcihcbiAgICAgIGdyb3VwID0+IGdyb3VwLmNhdGVnb3J5aWQgPT09IGNhdGVnb3J5aWRcbiAgICApXG4gIH1cblxuICBnZXRHcm91cChpZDogbnVtYmVyKTogQXBwZWFyYW5jZUdyb3VwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cHNbaWRdXG4gIH1cblxuICBnZXRHcm91cHMoKTogQXBwZWFyYW5jZUdyb3VwW10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuZ3JvdXBzKVxuICB9XG5cbiAgZ2V0SXRlbShpZDogbnVtYmVyKTogQXBwZWFyYW5jZUl0ZW0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLml0ZW1zW2lkXVxuICB9XG5cbiAgZ2V0SXRlbXMoZ3JvdXA6IG51bWJlcik6IEFwcGVhcmFuY2VJdGVtW10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuaXRlbXMpLmZpbHRlcihpdGVtID0+IGl0ZW0uZ3JvdXAgPT09IGdyb3VwKVxuICB9XG5cbiAgc2V0Q2F0ZWdvcnkoY2F0ZWdvcnk6IEFwcGVhcmFuY2VDYXRlZ29yeSk6IHZvaWQge1xuICAgIHRoaXMuY2F0ZWdvcmllc1tjYXRlZ29yeS5jYXRlZ29yeWlkXSA9IGNhdGVnb3J5XG4gIH1cblxuICBzZXRHcm91cChncm91cDogQXBwZWFyYW5jZUdyb3VwKTogdm9pZCB7XG4gICAgdGhpcy5ncm91cHNbZ3JvdXAuZ3JvdXBdID0gZ3JvdXBcbiAgfVxuXG4gIHNldEl0ZW0oaXRlbTogQXBwZWFyYW5jZUl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1zW2l0ZW0uaXRlbWlkXSA9IGl0ZW1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgV2FyZHJvYmUoKVxuIiwiaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB0eXBlIHsgQ2Fyb3VzZWxOZXdzIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2Nhcm91c2VsX25ld3NcIlxuXG5leHBvcnQgY29uc3QgY2Fyb3VzZWxCZWVtb292QW5ub3lhbmNlczogQ2Fyb3VzZWxOZXdzID0ge1xuICBiYWNrZ3JvdW5kSW1hZ2U6XG4gICAgXCJodHRwczovL2dpdGxhYi5jb20vTmF0b0JvcmFtL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy0vcmF3L21hc3Rlci9pbWFnZXMvY2Fyb3VzZWxfYmVlbW9vdl9hbm5veWFuY2VzLnBuZ1wiLFxuICBoNDogdHJhbnNsYXRlLmNhcm91c2VsLmJlZW1vb3ZfYW5ub3lhbmNlcy50aXRsZSxcbiAgaHJlZjogXCJodHRwczovL2dpdGxhYi5jb20vTmF0b0JvcmFtL0JlZW1vb3YtQW5ub3lhbmNlc1wiLFxuICBpZDogXCJjYXJvdXNlbC1iZWVtb292LWFubm95YW5jZXNcIixcbiAgcDogdHJhbnNsYXRlLmNhcm91c2VsLmJlZW1vb3ZfYW5ub3lhbmNlcy5zdWJ0aXRsZSxcbn1cbiIsImltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgdHlwZSB7IENhcm91c2VsTmV3cyB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9jYXJvdXNlbF9uZXdzXCJcblxuZXhwb3J0IGNvbnN0IGNhcm91c2VsRG93bmxvYWRGYWNlOiBDYXJvdXNlbE5ld3MgPSB7XG4gIGJhY2tncm91bmRJbWFnZTpcbiAgICBcImh0dHBzOi8vZ2l0bGFiLmNvbS9OYXRvQm9yYW0vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLS9yYXcvbWFzdGVyL2ltYWdlcy9jYXJvdXNlbF9kb3dubG9hZF9mYWNlLnBuZ1wiLFxuICBpZDogXCJjYXJvdXNlbC1kb3dubG9hZC1mYWNlXCIsXG4gIGg0OiB0cmFuc2xhdGUuY2Fyb3VzZWwuZG93bmxvYWRfZmFjZS50aXRsZSxcbiAgcDogdHJhbnNsYXRlLmNhcm91c2VsLmRvd25sb2FkX2ZhY2Uuc3VidGl0bGUsXG59XG4iLCJpbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHR5cGUgeyBDYXJvdXNlbE5ld3MgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvY2Fyb3VzZWxfbmV3c1wiXG5cbmV4cG9ydCBjb25zdCBjYXJvdXNlbERvd25sb2FkR3VhcmRpYW46IENhcm91c2VsTmV3cyA9IHtcbiAgYmFja2dyb3VuZEltYWdlOlxuICAgIFwiaHR0cHM6Ly9naXRsYWIuY29tL05hdG9Cb3JhbS9lbGRhcnlhLWVuaGFuY2VtZW50cy8tL3Jhdy9tYXN0ZXIvaW1hZ2VzL2Nhcm91c2VsX2Rvd25sb2FkX2d1YXJkaWFuLnBuZ1wiLFxuICBpZDogXCJjYXJvdXNlbC1kb3dubG9hZC1ndWFyZGlhblwiLFxuICBoNDogdHJhbnNsYXRlLmNhcm91c2VsLmRvd25sb2FkX2d1YXJkaWFuLnRpdGxlLFxuICBwOiB0cmFuc2xhdGUuY2Fyb3VzZWwuZG93bmxvYWRfZ3VhcmRpYW4uc3VidGl0bGUsXG59XG4iLCJpbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHR5cGUgeyBDYXJvdXNlbE5ld3MgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvY2Fyb3VzZWxfbmV3c1wiXG5cbmV4cG9ydCBjb25zdCBjYXJvdXNlbEVFOiBDYXJvdXNlbE5ld3MgPSB7XG4gIGJhY2tncm91bmRJbWFnZTpcbiAgICBcImh0dHBzOi8vZ2l0bGFiLmNvbS9OYXRvQm9yYW0vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLS9yYXcvbWFzdGVyL2ltYWdlcy9jYXJvdXNlbF9lbGRhcnlhX2VuaGFuY2VtZW50cy5wbmdcIixcbiAgaDQ6IHRyYW5zbGF0ZS5jYXJvdXNlbC5lbGRhcnlhX2VuaGFuY2VtZW50cy50aXRsZSxcbiAgaHJlZjogR00uaW5mby5zY3JpcHQubmFtZXNwYWNlLFxuICBpZDogXCJjYXJvdXNlbC1lbGRhcnlhLWVuaGFuY2VtZW50c1wiLFxuICBwOiB0cmFuc2xhdGUuY2Fyb3VzZWwuZWxkYXJ5YV9lbmhhbmNlbWVudHMuc3VidGl0bGUsXG59XG4iLCJpbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHR5cGUgeyBDYXJvdXNlbE5ld3MgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvY2Fyb3VzZWxfbmV3c1wiXG5cbmV4cG9ydCBjb25zdCBjYXJvdXNlbFRha2VvdmVyOiBDYXJvdXNlbE5ld3MgPSB7XG4gIGJhY2tncm91bmRJbWFnZTpcbiAgICBcImh0dHBzOi8vZ2l0bGFiLmNvbS9OYXRvQm9yYW0vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLS9yYXcvbWFzdGVyL2ltYWdlcy9jYXJvdXNlbF90YWtlb3Zlci5wbmdcIixcbiAgaWQ6IFwiY2Fyb3VzZWwtdGFrZW92ZXJcIixcbiAgaDQ6IHRyYW5zbGF0ZS5jYXJvdXNlbC50YWtlb3Zlci50aXRsZSxcbiAgcDogdHJhbnNsYXRlLmNhcm91c2VsLnRha2VvdmVyLnN1YnRpdGxlLFxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZENoZWF0Q29kZXMoKTogdm9pZCB7XG4gIC8vIGNvbnN0IGNoZWF0ZWQgPSB3aW5kb3cgYXMgdW5rbm93biBhcyBDaGVhdGVkV2luZG93XG4gIDsod2luZG93IGFzIHVua25vd24gYXMgQ2hlYXRlZFdpbmRvdykudW5sb2NrRW5oYW5jZW1lbnRzID0gdW5sb2NrRW5oYW5jZW1lbnRzXG4gIDsod2luZG93IGFzIHVua25vd24gYXMgQ2hlYXRlZFdpbmRvdykubG9ja0VuaGFuY2VtZW50cyA9IGxvY2tFbmhhbmNlbWVudHNcbn1cblxuYXN5bmMgZnVuY3Rpb24gdW5sb2NrRW5oYW5jZW1lbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICBMb2NhbFN0b3JhZ2UudW5sb2NrZWQgPSB0cnVlXG4gIGNvbnNvbGUuaW5mbyhcIlVubG9ja2VkIGVuaGFuY2VtZW50cy5cIilcbiAgYXdhaXQgcmVsb2FkKClcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9ja0VuaGFuY2VtZW50cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgTG9jYWxTdG9yYWdlLnVubG9ja2VkID0gZmFsc2VcbiAgY29uc29sZS5pbmZvKFwiTG9ja2VkIGVuaGFuY2VtZW50cy5cIilcbiAgYXdhaXQgcmVsb2FkKClcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwMCkpXG4gIGNvbnNvbGUubG9nKFwiUmVsb2FkaW5nLi4uXCIpXG4gIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDAwKSlcbiAgbG9jYXRpb24ucmVsb2FkKClcbn1cblxuaW50ZXJmYWNlIENoZWF0ZWRXaW5kb3cgZXh0ZW5kcyBXaW5kb3cge1xuICB1bmxvY2tFbmhhbmNlbWVudHM6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgbG9ja0VuaGFuY2VtZW50czogKCkgPT4gUHJvbWlzZTx2b2lkPlxufVxuIiwiaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcblxuZXhwb3J0IGNsYXNzIENvbnNvbGUge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBjb25zb2xlID0gY29uc29sZVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHByaXZhdGUgc3RhdGljIGdldCBkZWJ1Z2dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIExvY2FsU3RvcmFnZS5kZWJ1Z1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0IHRpbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKVxuICB9XG5cbiAgc3RhdGljIGFzc2VydChcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgLi4ub3B0aW9uYWxQYXJhbXM6IHVua25vd25bXVxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGVidWdnaW5nKSByZXR1cm5cbiAgICB0aGlzLmNvbnNvbGUuYXNzZXJ0KHZhbHVlLCAuLi50aGlzLmZvcm1hdChtZXNzYWdlKSwgLi4ub3B0aW9uYWxQYXJhbXMpXG4gIH1cblxuICBzdGF0aWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRlYnVnZ2luZykgcmV0dXJuXG4gICAgdGhpcy5jb25zb2xlLmRlYnVnKC4uLnRoaXMuZm9ybWF0KG1lc3NhZ2UpLCAuLi5vcHRpb25hbFBhcmFtcylcbiAgfVxuXG4gIHN0YXRpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnNvbGUuZXJyb3IoLi4udGhpcy5mb3JtYXQobWVzc2FnZSksIC4uLm9wdGlvbmFsUGFyYW1zKVxuICB9XG5cbiAgc3RhdGljIGluZm8obWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRlYnVnZ2luZykgcmV0dXJuXG4gICAgdGhpcy5jb25zb2xlLmluZm8oLi4udGhpcy5mb3JtYXQobWVzc2FnZSksIC4uLm9wdGlvbmFsUGFyYW1zKVxuICB9XG5cbiAgc3RhdGljIGxvZyhtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGVidWdnaW5nKSByZXR1cm5cbiAgICB0aGlzLmNvbnNvbGUubG9nKC4uLnRoaXMuZm9ybWF0KG1lc3NhZ2UpLCAuLi5vcHRpb25hbFBhcmFtcylcbiAgfVxuXG4gIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuY29uc29sZS53YXJuKC4uLnRoaXMuZm9ybWF0KG1lc3NhZ2UpLCAuLi5vcHRpb25hbFBhcmFtcylcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGZvcm1hdChtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGAlY1slYyR7dGhpcy50aW1lfSVjXWAsXG4gICAgICBcImNvbG9yOiM5NzQyYzJcIixcbiAgICAgIFwiY29sb3I6bm9uZVwiLFxuICAgICAgXCJjb2xvcjojOTc0MmMyXCIsXG4gICAgICBtZXNzYWdlLFxuICAgIF1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuL2NvbnNvbGVcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4vaTE4bi90cmFuc2xhdGVcIlxuXG5mdW5jdGlvbiBkb3dubG9hZENhbnZhcyhjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgY2FudmFzLnRvQmxvYihcbiAgICBibG9iID0+IHtcbiAgICAgIGlmICghYmxvYikge1xuICAgICAgICBDb25zb2xlLmVycm9yKFwiQ2FudmFzIGlzIGVtcHR5XCIpXG4gICAgICAgICQuZmxhdnJOb3RpZih0cmFuc2xhdGUuZXJyb3IuZG93bmxvYWRDYW52YXMpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG5cbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKVxuICAgICAgYS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIHVybClcbiAgICAgIGEuc2V0QXR0cmlidXRlKFwiZG93bmxvYWRcIiwgYCR7bmFtZX0ucG5nYClcbiAgICAgIGEuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiXG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSlcbiAgICAgIGEuY2xpY2soKVxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKVxuXG4gICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybClcbiAgICB9LFxuICAgIFwiaW1hZ2UvcG5nXCIsXG4gICAgMVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZEZhY2UoKTogdm9pZCB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTENhbnZhc0VsZW1lbnQ+KFxuICAgIFwiI2F2YXRhci1tZW51LWNvbnRhaW5lciBjYW52YXNcIlxuICApXG4gIGlmICghY2FudmFzKSB7XG4gICAgY29uc29sZS53YXJuKFwiQ291bGRuJ3QgZmluZCB0aGUgZ3VhcmRpYW4ncyBmYWNlLlwiKVxuICAgIHJldHVyblxuICB9XG5cbiAgZG93bmxvYWRDYW52YXMoY2FudmFzLCBcImZhY2VcIilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkR3VhcmRpYW4oKTogdm9pZCB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTENhbnZhc0VsZW1lbnQ+KFxuICAgIFwiI2hvbWUtYXZhdGFyLXBsYXllciBjYW52YXNcIlxuICApXG4gIGlmICghY2FudmFzKSB7XG4gICAgY29uc29sZS53YXJuKFwiQ291bGRuJ3QgZmluZCB0aGUgZ3VhcmRpYW4uXCIpXG4gICAgcmV0dXJuXG4gIH1cblxuICBkb3dubG9hZENhbnZhcyhjYW52YXMsIGdldE5hbWUoKSA/PyBcImd1YXJkaWFuXCIpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZEFwcGVhcmFuY2UoKTogdm9pZCB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTENhbnZhc0VsZW1lbnQ+KFxuICAgIFwiI2FwcGVhcmFuY2UtcHJldmlldyBjYW52YXNcIlxuICApXG4gIGlmICghY2FudmFzKSB7XG4gICAgY29uc29sZS53YXJuKFwiQ291bGRuJ3QgZmluZCB0aGUgZ3VhcmRpYW4uXCIpXG4gICAgcmV0dXJuXG4gIH1cblxuICBkb3dubG9hZENhbnZhcyhjYW52YXMsIGdldE5hbWUoKSA/PyBcImd1YXJkaWFuXCIpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZFByb2ZpbGUoKTogdm9pZCB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTENhbnZhc0VsZW1lbnQ+KFxuICAgIFwiLnBsYXllclByb2ZpbGVBdmF0YXIgY2FudmFzXCJcbiAgKVxuICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEhlYWRpbmdFbGVtZW50PihcbiAgICBcIiNtYWluLXNlY3Rpb24gLnNlY3Rpb24tdGl0bGVcIlxuICApXG4gIGlmICghY2FudmFzIHx8ICF0aXRsZSkgcmV0dXJuXG5cbiAgZG93bmxvYWRDYW52YXMoY2FudmFzLCB0aXRsZS50ZXh0Q29udGVudD8udHJpbSgpID8/IFwiZ3VhcmRpYW5cIilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gIHJldHVybiAoXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhdmF0YXItbWVudS1jb250YWluZXItb3V0ZXI+cFwiKT8udGV4dENvbnRlbnQgPz9cbiAgICBudWxsXG4gIClcbn1cbiIsImV4cG9ydCBlbnVtIER1cmF0aW9uVW5pdCB7XG4gIG1pbGxpc2Vjb25kID0gMSxcbiAgc2Vjb25kID0gMTAwMCAqIG1pbGxpc2Vjb25kLFxuICBtaW51dGUgPSA2MCAqIHNlY29uZCxcbiAgaG91ciA9IDYwICogbWludXRlLFxuICBkYXkgPSAyNCAqIGhvdXIsXG4gIHdlZWsgPSA3ICogZGF5LFxufVxuXG5leHBvcnQgY2xhc3MgRHVyYXRpb24ge1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSB2YWx1ZTogbnVtYmVyLCByZWFkb25seSB1bml0OiBEdXJhdGlvblVuaXQpIHt9XG5cbiAgZGl2aWRlKGR1cmF0aW9uOiBEdXJhdGlvbik6IER1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IER1cmF0aW9uKHRoaXMudmFsdWUgLyBkdXJhdGlvbi50byh0aGlzLnVuaXQpLnZhbHVlLCB0aGlzLnVuaXQpXG4gIH1cblxuICBtaW51cyhkdXJhdGlvbjogRHVyYXRpb24pOiBEdXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBEdXJhdGlvbih0aGlzLnZhbHVlIC0gZHVyYXRpb24udG8odGhpcy51bml0KS52YWx1ZSwgdGhpcy51bml0KVxuICB9XG5cbiAgbXVsdGlwbHkoZHVyYXRpb246IER1cmF0aW9uKTogRHVyYXRpb24ge1xuICAgIHJldHVybiBuZXcgRHVyYXRpb24odGhpcy52YWx1ZSAqIGR1cmF0aW9uLnRvKHRoaXMudW5pdCkudmFsdWUsIHRoaXMudW5pdClcbiAgfVxuXG4gIHBsdXMoZHVyYXRpb246IER1cmF0aW9uKTogRHVyYXRpb24ge1xuICAgIHJldHVybiBuZXcgRHVyYXRpb24odGhpcy52YWx1ZSArIGR1cmF0aW9uLnRvKHRoaXMudW5pdCkudmFsdWUsIHRoaXMudW5pdClcbiAgfVxuXG4gIHRvKHVuaXQ6IER1cmF0aW9uVW5pdCk6IER1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IER1cmF0aW9uKCh0aGlzLnZhbHVlICogdGhpcy51bml0KSAvIHVuaXQsIHVuaXQpXG4gIH1cbn1cbiIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmludGVyZmFjZSBKUXVlcnlTdGF0aWMge1xuICBmbGF2cjogKGRhdGE6IGZsYXZyUGFyYW1zKSA9PiB2b2lkXG4gIGZsYXZyTm90aWY6IChcbiAgICBjb250ZW50OiBzdHJpbmcgfCB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBpZD86IG51bWJlcixcbiAgICBmb3JjZT86IGJvb2xlYW5cbiAgKSA9PiB2b2lkXG59XG5cbmludGVyZmFjZSBmbGF2clBhcmFtcyB7XG4gIC8qKiBBbmltYXRlLmNzcyAqL1xuICBhbmltYXRlQ2xvc2luZz86IFwiZmFkZU91dFwiIHwgXCJmYWRlT3V0VXBcIlxuICAvKiogQW5pbWF0ZS5jc3MgKi9cbiAgYW5pbWF0ZUVudHJhbmNlPzogXCJmYWRlSW5cIiB8IFwiZmFkZUluRG93blwiXG4gIC8qKiBCdXR0b25zIGFyZSBrZXktdmFsdWUgcGFpcnMgd2hlcmUgdGhlIGtleSBpcyB0aGUgICovXG4gIGJ1dHRvbnM/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgIHN0eWxlPzogXCJjbG9zZVwiIHwgXCJkZWZhdWx0XCJcbiAgICAgIHRleHQ/OiBzdHJpbmdcbiAgICAgIGFkZENsYXNzPzogc3RyaW5nXG4gICAgICAvKiogQHJldHVybnMgd2hldGhlciB0aGUgcG9wdXAgc2hvdWxkIGNsb3NlICovXG4gICAgICBhY3Rpb24/OiAoJGNvbnRhaW5lcjogSlF1ZXJ5KSA9PiBib29sZWFuXG4gICAgfVxuICA+XG4gIC8qKiBIVE1MIGNvbnRlbnQgb2YgdGhlIGZsYXZyICovXG4gIGNvbnRlbnQ/OiBzdHJpbmdcbiAgLyoqIFR5cGUgb2YgZGlhbG9nLiAqL1xuICBkaWFsb2c/OiBcImFsZXJ0XCIgfCBcImNvbmZpcm1cIiB8IFwiZm9ybVwiIHwgXCJwcm9tcHRcIlxuICBvbkJ1aWxkPzogKCRjb250YWluZXI6IEpRdWVyeSkgPT4gdm9pZFxuICBvbkNhbmNlbD86ICgpID0+IHZvaWRcbiAgb25Db25maXJtPzogKCkgPT4gdm9pZFxuICBvblNob3c/OiAoKSA9PiB2b2lkXG4gIHByb21wdD86IHtcbiAgICAvKiogRGVmYXVsdCB2YWx1ZSAqL1xuICAgIHZhbHVlOiBzdHJpbmdcbiAgfVxuXG4gIHRpdGxlPzogc3RyaW5nXG59XG4iLCJleHBvcnQgZnVuY3Rpb24gdHJpbUljb24oaWNvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdGlsZGUgPSBpY29uLmxhc3RJbmRleE9mKFwiflwiKVxuICBjb25zdCBkb3QgPSBpY29uLmxhc3RJbmRleE9mKFwiLlwiKVxuICBpZiAodGlsZGUgPT09IC0xIHx8IGRvdCA9PT0gLTEpIHJldHVybiBpY29uXG5cbiAgcmV0dXJuIGljb24uc3Vic3RyaW5nKDAsIHRpbGRlKSArIGljb24uc3Vic3RyaW5nKGRvdClcbn1cbiIsImltcG9ydCB0eXBlIHsgVHJhbnNsYXRpb24gfSBmcm9tIFwiLi90cmFuc2xhdGlvblwiXG5cbmV4cG9ydCBjb25zdCBlbjogVHJhbnNsYXRpb24gPSB7XG4gIGhvbWU6IHtcbiAgICBmb3J1bTogXCJGb3J1bVwiLFxuICAgIHRha2VvdmVyOiBcIlRha2VvdmVyXCIsXG4gIH0sXG4gIHRha2VvdmVyOiB7XG4gICAgYm91Z2h0OiAobmFtZSwgcHJpY2UpID0+XG4gICAgICBgQm91Z2h0IDxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPiBmb3IgPHN0cm9uZyBjbGFzcz1cInByaWNlLWl0ZW1cIj4ke3ByaWNlfTwvc3Ryb25nPiA8c3BhbiBjbGFzcz1cIm1hYW5hLWljb25cIiBhbHQ9XCJtYWFuYXNcIj48L3NwYW4+LmAsXG4gICAgZGlzYWJsZWQ6IFwiVGFrZW92ZXIgbW9kZSBkaXNhYmxlZC5cIixcbiAgICBlbmFibGVkOiBcIlRha2VvdmVyIG1vZGUgZW5hYmxlZC4gUGxlYXNlIGRvIG5vdCBpbnRlcmFjdCB3aXRoIHRoaXMgdGFiLlwiLFxuICB9LFxuICBjYXJvdXNlbDoge1xuICAgIGJlZW1vb3ZfYW5ub3lhbmNlczoge1xuICAgICAgdGl0bGU6IFwiQmVlbW9vdiBBbm5veWFuY2VzXCIsXG4gICAgICBzdWJ0aXRsZTogXCJCbG9jayBzb21lIG9mIEVsZGFyeWEncyBhbm5veWFuY2VzLlwiLFxuICAgIH0sXG4gICAgZG93bmxvYWRfZmFjZToge1xuICAgICAgdGl0bGU6IFwiRG93bmxvYWQgeW91ciBndWFyZGlhbidzIGZhY2UhXCIsXG4gICAgICBzdWJ0aXRsZTogXCJDbGljayBoZXJlIHRvIGRvd25sb2FkIHlvdXIgZ3VhcmRpYW4ncyBmYWNlLlwiLFxuICAgIH0sXG4gICAgZG93bmxvYWRfZ3VhcmRpYW46IHtcbiAgICAgIHRpdGxlOiBcIkRvd25sb2FkIHlvdXIgZ3VhcmRpYW4hXCIsXG4gICAgICBzdWJ0aXRsZTogXCJDbGljayBoZXJlIHRvIGRvd25sb2FkIHlvdXIgZ3VhcmRpYW4uXCIsXG4gICAgfSxcbiAgICBlbGRhcnlhX2VuaGFuY2VtZW50czoge1xuICAgICAgdGl0bGU6IGAke0dNLmluZm8uc2NyaXB0Lm5hbWV9IHYke0dNLmluZm8uc2NyaXB0LnZlcnNpb259YCxcbiAgICAgIHN1YnRpdGxlOiBHTS5pbmZvLnNjcmlwdC5kZXNjcmlwdGlvbixcbiAgICB9LFxuICAgIHRha2VvdmVyOiB7XG4gICAgICBkaXNhYmxlX3Rha2VvdmVyOiBcIkRpc2FibGUgVGFrZW92ZXJcIixcbiAgICAgIGVuYWJsZV90YWtlb3ZlcjogXCJFbmFibGUgVGFrZW92ZXJcIixcbiAgICAgIHN1YnRpdGxlOiBcIkdpdmUgdXAgdGhpcyB0YWIgdG8gcGVyZm9ybSBhdXRvbWF0ZWQgYWN0aW9ucy5cIixcbiAgICAgIHRpdGxlOiBcIlRha2VvdmVyXCIsXG4gICAgfSxcbiAgfSxcbiAgbWluaWdhbWVzOiB7XG4gICAgcGxheWVkX2ZvcjogKG5hbWUsIG1hYW5hcykgPT5cbiAgICAgIGBQbGF5ZWQgPHN0cm9uZz4ke25hbWV9PC9zdHJvbmc+IGZvciA8c3Ryb25nIGNsYXNzPVwicHJpY2UtaXRlbVwiPiR7bWFhbmFzfTwvc3Ryb25nPiA8c3BhbiBjbGFzcz1cIm1hYW5hLWljb25cIiBhbHQ9XCJtYWFuYXNcIj48L3NwYW4+IGVhcm5lZC5gLFxuICAgIHBsYXllZDogbmFtZSA9PiBgUGxheWVkIDxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPi5gLFxuICAgIHBsYXlpbmc6IG5hbWUgPT4gYFBsYXlpbmcgPHN0cm9uZz4ke25hbWV9PC9zdHJvbmc+Li4uYCxcbiAgfSxcbiAgYXBwZWFyYW5jZToge1xuICAgIGJ1dHRvbnM6IHtcbiAgICAgIGJhY2t3YXJkOiBcIk1vdmUgYmFja1wiLFxuICAgICAgZm9yd2FyZDogXCJCcmluZyBmb3J3YXJkXCIsXG4gICAgfSxcbiAgICBmYXZvdXJpdGVzOiB7XG4gICAgICBpbXBvcnRlZDogXCJJbXBvcnRlZCBvdXRmaXQhXCIsXG4gICAgICBpbXBvcnRpbmc6IFwiSW1wb3J0aW5nIG91dGZpdC4gUGxlYXNlIHdhaXQuLi5cIixcbiAgICAgIGNsaWNrX291dGZpdDoge1xuICAgICAgICBkZWxldGU6IFwiRGVsZXRlXCIsXG4gICAgICAgIGdvdG9fYWNjb3VudDogYFRvIHRyYW5zZmVyIHlvdXIgPHN0cm9uZz4ke0dNLmluZm8uc2NyaXB0Lm5hbWV9PC9zdHJvbmc+IGZhdm91cml0ZSBvdXRmaXRzIHRvIGFub3RoZXIgYnJvd3NlciwgZXhwb3J0IHlvdXIgc2V0dGluZ3MgaW4gdGhlIDxhIGhyZWY9XCIvdXNlci9hY2NvdW50XCIgc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcIj5teSZuYnNwO2FjY291bnQ8L2E+IHBhZ2UuYCxcbiAgICAgICAgc2F2ZWRfbG9jYWxseTogYFRha2Ugbm90ZSB0aGF0IHRoaXMgb3V0Zml0IGlzIHNhdmVkIGluIDxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC5uYW1lfTwvc3Ryb25nPicgc2V0dGluZ3MgYW5kIHdhcyBub3Qgc2VudCB0byBFbGRhcnlhJ3Mgc2VydmVycy5gLFxuICAgICAgICB3ZWFyOiBcIldlYXJcIixcbiAgICAgIH0sXG4gICAgICBzYXZlX291dGZpdDoge1xuICAgICAgICBnb3RvX2FjY291bnQ6IGBUbyB0cmFuc2ZlciB5b3VyIDxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC5uYW1lfTwvc3Ryb25nPiBmYXZvdXJpdGUgb3V0Zml0cyB0byBhbm90aGVyIGJyb3dzZXIsIGV4cG9ydCB5b3VyIHNldHRpbmdzIGluIHRoZSA8YSBocmVmPVwiL3VzZXIvYWNjb3VudFwiIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XCI+bXkmbmJzcDthY2NvdW50PC9hPiBwYWdlLmAsXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIk5hbWUuLi5cIixcbiAgICAgICAgc2F2ZTogXCJTYXZlXCIsXG4gICAgICAgIHNhdmVkX2xvY2FsbHk6IGBUYWtlIG5vdGUgdGhhdCB0aGlzIG91dGZpdCB3aWxsIG9ubHkgYmUgc2F2ZWQgd2l0aGluIDxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC5uYW1lfTwvc3Ryb25nPicgc2V0dGluZ3MgYW5kIHdpbGwgbm90IGJlIHNlbnQgdG8gRWxkYXJ5YSdzIHNlcnZlcnMuYCxcbiAgICAgICAgdGl0bGU6IFwiU2F2ZSBvdXRmaXRcIixcbiAgICAgIH0sXG4gICAgICBidXR0b25zOiB7XG4gICAgICAgIGRvd25sb2FkOiBcIkRvd25sb2FkIFBOR1wiLFxuICAgICAgICBleHBvcnQ6IFwiRXhwb3J0XCIsXG4gICAgICAgIGltcG9ydDogXCJJbXBvcnRcIixcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsb2FkZWQ6IFwiVGhlIHdhcmRyb2JlIGlzIGxvYWRlZC5cIixcbiAgICBsb2FkaW5nOiAoY2F0ZWdvcnluYW1lOiBzdHJpbmcpID0+XG4gICAgICBgTG9hZGluZyA8c3Ryb25nPiR7Y2F0ZWdvcnluYW1lfTwvc3Ryb25nPi4uLmAsXG4gIH0sXG4gIG1hcmtldDoge1xuICAgIGFkZF90b193aXNobGlzdDoge1xuICAgICAgYWRkZWRfdG9fd2lzaGxpc3Q6IChuYW1lLCBwcmljZSkgPT5cbiAgICAgICAgYEFkZGVkIDxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPiBmb3IgPHN0cm9uZyBjbGFzcz1cInByaWNlLWl0ZW1cIj4ke3ByaWNlfTwvc3Ryb25nPiA8c3BhbiBjbGFzcz1cIm1hYW5hLWljb25cIiBhbHQ9XCJtYWFuYXNcIj48L3NwYW4+IHRvIHRoZSB3aXNobGlzdC5gLFxuICAgICAgaW52YWxpZF9wcmljZTogXCJUaGlzIGlzIG5vdCBhIHZhbGlkIHByaWNlLlwiLFxuICAgICAgc2F2ZTogXCJTYXZlXCIsXG4gICAgICB0ZXh0OiBcIkhvdyBtYW55IG1hYW5hcyBkbyB5b3Ugd2lzaCB0byBvZmZlciB0byBhY3F1aXJlIHRoaXMgaXRlbT9cIixcbiAgICAgIHRpdGxlOiBcIkFkZCB0byB3aXNobGlzdFwiLFxuICAgIH0sXG4gICAgYXVjdGlvbnM6IHtcbiAgICAgIGJ1eV9ub3dfcHJpY2U6IFwiQnV5IG5vdyBwcmljZSA6XCIsXG4gICAgICBjdXJyZW50X3ByaWNlOiBcIkN1cnJlbnQgcHJpY2UgOlwiLFxuICAgICAgZGVsZXRlOiBcIkRlbGV0ZVwiLFxuICAgICAgcHVyY2hhc2VfaGlzdG9yeTogXCJQdXJjaGFzZSBoaXN0b3J5XCIsXG4gICAgICBzYWxlc19oaXN0b3J5OiBcIlNhbGVzIGhpc3RvcnlcIixcbiAgICAgIGRhdGVfdGltZV9mb3JtYXQ6IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW4tR0JcIiwge1xuICAgICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgICAgICBob3VyOiBcIjItZGlnaXRcIixcbiAgICAgICAgZGF5OiBcIm51bWVyaWNcIixcbiAgICAgICAgbW9udGg6IFwibG9uZ1wiLFxuICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIixcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgY2hhbmdlX3ByaWNlOiB7XG4gICAgICBjaGFuZ2VkX3ByaWNlOiAobmFtZSwgcHJpY2UpID0+XG4gICAgICAgIGBDaGFuZ2VkIDxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPidzIHByaWNlIGZvciA8c3Ryb25nIGNsYXNzPVwicHJpY2UtaXRlbVwiPiR7cHJpY2V9PC9zdHJvbmc+IDxzcGFuIGNsYXNzPVwibWFhbmEtaWNvblwiIGFsdD1cIm1hYW5hc1wiPjwvc3Bhbj4uYCxcbiAgICAgIGludmFsaWRfcHJpY2U6IFwiVGhpcyBpcyBub3QgYSB2YWxpZCBwcmljZS5cIixcbiAgICAgIHNhdmU6IFwiU2F2ZVwiLFxuICAgICAgdGV4dDogXCJIb3cgbWFueSBtYWFuYXMgZG8geW91IHdpc2ggdG8gb2ZmZXIgdG8gYWNxdWlyZSB0aGlzIGl0ZW0/XCIsXG4gICAgICB0aXRsZTogXCJDaGFuZ2UgcHJpY2VcIixcbiAgICB9LFxuICAgIHdpc2hsaXN0OiB7XG4gICAgICBhY3Rpb25zOiBcIkFjdGlvbnNcIixcbiAgICAgIGFzc2lzdGFuY2U6IGBPbiB0aGlzIHBhZ2UsIHlvdSBjYW4gb3JnYW5pemUgeW91ciB3aXNobGlzdCBhbmQgY2hlY2sgdGhlIHN0YXR1cyBvZiB5b3VyIHdpc2hlZCBpdGVtcy4gUGxlYXNlIG5vdGUgdGhhdCB5b3VyIHdpc2hsaXN0IGlzIHNhdmVkIGxvY2FsbHkgaW4gPHN0cm9uZz4ke0dNLmluZm8uc2NyaXB0Lm5hbWV9PC9zdHJvbmc+JyBzZXR0aW5ncyBhbmQgaXMgbm90IHNlbnQgdG8gRWxkYXJ5YSdzIHNlcnZlcnMuIFRvIHRyYW5zZmVyIHlvdXIgd2lzaGxpc3QgdG8gYW5vdGhlciBicm93c2VyLCBleHBvcnQgeW91ciBzZXR0aW5ncyBpbiB0aGUgPGEgaHJlZj1cIi91c2VyL2FjY291bnRcIiBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1wiPm15Jm5ic3A7YWNjb3VudDwvYT4gcGFnZS5gLFxuICAgICAgY2hhbmdlX3ByaWNlOiBcIkNoYW5nZSBwcmljZVwiLFxuICAgICAgZGVsZXRlX3Rvb2x0aXA6IFwiUmVtb3ZlIGZyb20gd2lzaGxpc3RcIixcbiAgICAgIGRlbGV0ZTogXCJEZWxldGVcIixcbiAgICAgIGljb246IFwiSWNvblwiLFxuICAgICAgbmFtZTogXCJOYW1lXCIsXG4gICAgICBwcmljZTogXCJQcmljZVwiLFxuICAgICAgcmVzZXRfYWxsOiBcIlJlc2V0IGFsbCBzdGF0dXNlc1wiLFxuICAgICAgcmVzZXRfdG9vbHRpcDogXCJSZXNldCB0aGUgZXJyb3Igc3RhdHVzXCIsXG4gICAgICByZXNldDogXCJSZXNldFwiLFxuICAgICAgc3RhdHVzOiBcIlN0YXR1c1wiLFxuICAgICAgdGl0bGU6IFwiV2lzaGxpc3RcIixcbiAgICB9LFxuICB9LFxuICBhY2NvdW50OiB7XG4gICAgZGVidWdfdG9vbHRpcDogXCJFbmFibGVzIG9yIGRpc2FibGVzIGxvZ2dpbmcuXCIsXG4gICAgZGVidWc6IFwiRGVidWdcIixcbiAgICBlbmhhbmNlbWVudHM6IFwiRW5oYW5jZW1lbnRzXCIsXG4gICAgZXhwbG9yYXRpb25zOiBcIkV4cGxvcmF0aW9uc1wiLFxuICAgIGV4cG9ydDogXCJFeHBvcnQgc2V0dGluZ3NcIixcbiAgICBpbXBvcnQ6IFwiSW1wb3J0IHNldHRpbmdzXCIsXG4gICAgaW1wb3J0ZWQ6IFwiSW1wb3J0ZWQgc2V0dGluZ3MhXCIsXG4gICAgbWFya2V0OiBcIk1hcmtldFwiLFxuICAgIG1pbmlnYW1lczogXCJNaW5pZ2FtZXNcIixcbiAgfSxcbiAgcGV0OiB7XG4gICAgYXV0b19leHBsb3JlOiBcIkhpZ2hsaWdodFwiLFxuICAgIGRhdGVfdGltZV9mb3JtYXQ6IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW4tR0JcIiwge1xuICAgICAgbWludXRlOiBcIjItZGlnaXRcIixcbiAgICAgIGhvdXI6IFwiMi1kaWdpdFwiLFxuICAgICAgZGF5OiBcIm51bWVyaWNcIixcbiAgICAgIG1vbnRoOiBcImxvbmdcIixcbiAgICAgIHllYXI6IFwibnVtZXJpY1wiLFxuICAgIH0pLFxuICAgIGRlbGV0ZV9oaXN0b3J5OiBcIkRlbGV0ZSBoaXN0b3J5XCIsXG4gICAgZW1wdHlfaGlzdG9yeTpcbiAgICAgIFwiWW91ciBleHBsb3JhdGlvbiBoaXN0b3J5IGlzIGVtcHR5LiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgZmlsbCB1cCBhcyB5b3VyIGZhbWlsaWFyIGZpbmRzIGl0ZW1zIHdoaWxlIGV4cGxvcmluZy5cIixcbiAgICBnb3RvX2FjY291bnQ6IGBUbyB0cmFuc2ZlciB5b3VyIGV4cGxvcmF0aW9uIGhpc3RvcnkgdG8gYW5vdGhlciBicm93c2VyLCBleHBvcnQgeW91ciBzZXR0aW5ncyBmcm9tIHRoZSA8ZW0+bXkmbmJzcDthY2NvdW50PC9lbT4gcGFnZS5gLFxuICAgIGhpc3Rvcnk6IFwiSGlzdG9yeVwiLFxuICAgIHNhdmVkX2xvY2FsbHk6IGBQbGVhc2Ugbm90ZSB0aGF0IHlvdXIgZXhwbG9yYXRpb24gaGlzdG9yeSBpcyBzYXZlZCBsb2NhbGx5IGluIDxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC5uYW1lfTwvc3Ryb25nPicgc2V0dGluZ3MgYW5kIHdhcyBub3Qgc2VudCB0byBFbGRhcnlhJ3Mgc2VydmVycy5gLFxuICB9LFxuICBwcm9maWxlOiB7XG4gICAgZXhwb3J0X291dGZpdDogXCJFeHBvcnQgb3V0Zml0XCIsXG4gICAgZG93bmxvYWRfb3V0Zml0OiBcIkRvd25sb2FkIFBOR1wiLFxuICB9LFxuICBlcnJvcjoge1xuICAgIGRvd25sb2FkQ2FudmFzOiBcIlRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgaW1hZ2UuXCIsXG4gICAgbG9uZ0xvYWRpbmc6XG4gICAgICBcIkVsZGFyeWEgaXMgdGFraW5nIHRvbyBsb25nIHRvIGxvYWQuIFJldHJ5aW5nIGluIDEwIHNlY29uZHMuLi5cIixcbiAgfSxcbiAgbWFsbDoge1xuICAgIGFkZF90b193aXNobGlzdDoge1xuICAgICAgdGl0bGU6IFwiQWRkIHRvIG1hcmtldCB3aXNobGlzdFwiLFxuICAgICAgdGV4dDogXCJIb3cgbWFueSBtYWFuYXMgZG8geW91IHdpc2ggdG8gb2ZmZXIgdG8gYWNxdWlyZSB0aGlzIGl0ZW0/XCIsXG4gICAgICBub3RlOiBcIlBsZWFzZSBub3RlIHRoYXQgdGhlIGl0ZW1zIGFkZGVkIGZyb20gdGhlIG1hbGwgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYXZhaWxhYmxlIGF0IHRoZSBtYXJrZXQuXCIsXG4gICAgfSxcbiAgfSxcbn1cblxuT2JqZWN0LmZyZWV6ZShlbilcbiIsImltcG9ydCB0eXBlIHsgVHJhbnNsYXRpb24gfSBmcm9tIFwiLi90cmFuc2xhdGlvblwiXG5cbmV4cG9ydCBjb25zdCBmcjogVHJhbnNsYXRpb24gPSB7XG4gIGhvbWU6IHtcbiAgICBmb3J1bTogXCJGb3J1bVwiLFxuICAgIHRha2VvdmVyOiBcIlRha2VvdmVyXCIsXG4gIH0sXG4gIHRha2VvdmVyOiB7XG4gICAgYm91Z2h0OiAobmFtZSwgcHJpY2UpID0+XG4gICAgICBgQWNoZXTDqSA8c3Ryb25nPiR7bmFtZX08L3N0cm9uZz4gcG91ciA8c3Ryb25nIGNsYXNzPVwicHJpY2UtaXRlbVwiPiR7cHJpY2V9PC9zdHJvbmc+IDxzcGFuIGNsYXNzPVwibWFhbmEtaWNvblwiIGFsdD1cIm1hYW5hc1wiPjwvc3Bhbj4uYCxcbiAgICBkaXNhYmxlZDogXCJUYWtlb3ZlciBkw6lzYWN0aXbDqS5cIixcbiAgICBlbmFibGVkOiBcIlRha2VvdmVyIGFjdGl2w6kuIMOJdml0ZSBkJ2ludMOpcmFnaXIgYXZlYyBjZXQgb25nbGV0LlwiLFxuICB9LFxuICBjYXJvdXNlbDoge1xuICAgIGJlZW1vb3ZfYW5ub3lhbmNlczoge1xuICAgICAgdGl0bGU6IFwiQmVlbW9vdiBBbm5veWFuY2VzXCIsXG4gICAgICBzdWJ0aXRsZTogXCJCbG9xdWUgY2VydGFpbnMgaXJyaXRhbnRzIGQnRWxkYXJ5YS5cIixcbiAgICB9LFxuICAgIGRvd25sb2FkX2ZhY2U6IHtcbiAgICAgIHRpdGxlOiBcIlTDqWzDqWNoYXJnZSBsZSB2aXNhZ2UgZGUgdGEgZ2FyZGllbm5lIVwiLFxuICAgICAgc3VidGl0bGU6IFwiQ2xpcXVlIGljaSBwb3VyIHTDqWzDqWNoYXJnZXIgbGUgdmlzYWdlIGRlIHRhIGdhcmRpZW5uZS5cIixcbiAgICB9LFxuICAgIGRvd25sb2FkX2d1YXJkaWFuOiB7XG4gICAgICB0aXRsZTogXCJUw6lsw6ljaGFyZ2UgdGEgZ2FyZGllbm5lIVwiLFxuICAgICAgc3VidGl0bGU6IFwiQ2xpcXVlIGljaSBwb3VyIHTDqWzDqWNoYXJnZXIgdGEgZ2FyZGllbm5lLlwiLFxuICAgIH0sXG4gICAgZWxkYXJ5YV9lbmhhbmNlbWVudHM6IHtcbiAgICAgIHRpdGxlOiBgJHtHTS5pbmZvLnNjcmlwdC5uYW1lfSB2JHtHTS5pbmZvLnNjcmlwdC52ZXJzaW9ufWAsXG4gICAgICBzdWJ0aXRsZTogXCJBbcOpbGlvcmUgbCdleHDDqXJpZW5jZSB1dGlsaXNhdGV1ciBkJ0VsZGFyeWEuXCIsXG4gICAgfSxcbiAgICB0YWtlb3Zlcjoge1xuICAgICAgZGlzYWJsZV90YWtlb3ZlcjogXCJEw6lzYWN0aXZlIGxlIHRha2VvdmVyXCIsXG4gICAgICBlbmFibGVfdGFrZW92ZXI6IFwiQWN0aXZlIGxlIHRha2VvdmVyXCIsXG4gICAgICBzdWJ0aXRsZTogXCJMYWlzc2UgY2V0IG9uZ2xldCBwZXJmb3JtZXIgZGVzIGFjdGlvbnMgYXV0b21hdGlxdWVzLlwiLFxuICAgICAgdGl0bGU6IFwiVGFrZW92ZXJcIixcbiAgICB9LFxuICB9LFxuICBtaW5pZ2FtZXM6IHtcbiAgICBwbGF5ZWRfZm9yOiAobmFtZTogc3RyaW5nLCBtYWFuYXM6IG51bWJlcikgPT5cbiAgICAgIGBBIGpvdcOpIMOgIDxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPiBwb3VyIDxzdHJvbmcgY2xhc3M9XCJwcmljZS1pdGVtXCI+JHttYWFuYXN9PC9zdHJvbmc+IDxzcGFuIGNsYXNzPVwibWFhbmEtaWNvblwiIGFsdD1cIm1hYW5hc1wiPjwvc3Bhbj4gZ2FnbsOpcy5gLFxuICAgIHBsYXllZDogKG5hbWU6IHN0cmluZykgPT4gYEEgam91w6kgw6AgPHN0cm9uZz4ke25hbWV9PC9zdHJvbmc+LmAsXG4gICAgcGxheWluZzogKG5hbWU6IHN0cmluZykgPT4gYEpvdWUgw6AgPHN0cm9uZz4ke25hbWV9PC9zdHJvbmc+Li4uYCxcbiAgfSxcbiAgYXBwZWFyYW5jZToge1xuICAgIGJ1dHRvbnM6IHtcbiAgICAgIGJhY2t3YXJkOiBcIlZlcnMgbCdhcnJpw6hyZVwiLFxuICAgICAgZm9yd2FyZDogXCJWZXJzIGwnYXZhbnRcIixcbiAgICB9LFxuICAgIGZhdm91cml0ZXM6IHtcbiAgICAgIGltcG9ydGVkOiBcIkltcG9ydGF0aW9uIHLDqXVzc2llIVwiLFxuICAgICAgaW1wb3J0aW5nOiBcIkltcG9ydGF0aW9uIGVuIGNvdXJzLi4uXCIsXG4gICAgICBjbGlja19vdXRmaXQ6IHtcbiAgICAgICAgZGVsZXRlOiBcIlN1cHByaW1lclwiLFxuICAgICAgICBnb3RvX2FjY291bnQ6IGBQb3VyIHRyYW5zZsOpcmVyIHRlcyB0ZW51ZXMgZmF2b3JpdGVzIGQnPHN0cm9uZz4ke0dNLmluZm8uc2NyaXB0Lm5hbWV9PC9zdHJvbmc+IHZlcnMgdW4gYXV0cmUgbmF2aWdhdGV1ciwgZXhwb3J0ZSB0ZXMgcGFyYW3DqHRyZXMgw6AgcGFydGlyIGRlIGxhIHBhZ2UgPGEgaHJlZj1cIi91c2VyL2FjY291bnRcIiBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1wiPm1vbiZuYnNwO2NvbXB0ZTwvYT4uYCxcbiAgICAgICAgc2F2ZWRfbG9jYWxseTogYFByZW5kcyBub3RlIHF1ZSBjZXR0ZSB0ZW51ZSBlc3Qgc2F1dmVnYXJkw6llIGxvY2FsZW1lbnQgZGFucyBsZXMgcGFyYW3DqHRyZXMgZCc8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz4gZXQgbidhIHBhcyDDqXTDqSBlbnZvecOpZSBhdXggc2VydmV1cnMgZCdFbGRhcnlhLmAsXG4gICAgICAgIHdlYXI6IFwiUG9ydGVyXCIsXG4gICAgICB9LFxuICAgICAgc2F2ZV9vdXRmaXQ6IHtcbiAgICAgICAgZ290b19hY2NvdW50OiBgUG91ciB0cmFuc2bDqXJlciB0ZXMgdGVudWVzIGZhdm9yaXRlcyBkJzxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC5uYW1lfTwvc3Ryb25nPiB2ZXJzIHVuIGF1dHJlIG5hdmlnYXRldXIsIGV4cG9ydGUgdGVzIHBhcmFtw6h0cmVzIMOgIHBhcnRpciBkZSBsYSBwYWdlIDxhIGhyZWY9XCIvdXNlci9hY2NvdW50XCIgc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcIj5tb24mbmJzcDtjb21wdGU8L2E+LmAsXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIk5vbS4uLlwiLFxuICAgICAgICBzYXZlOiBcIlNhdXZlZ2FyZGVyXCIsXG4gICAgICAgIHNhdmVkX2xvY2FsbHk6IGBQcmVuZHMgbm90ZSBxdWUgY2V0dGUgdGVudWUgc2VyYSBzYXV2ZWdhcmTDqWUgbG9jYWxlbWVudCBkYW5zIGxlcyBwYXJhbcOodHJlcyBkJzxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC5uYW1lfTwvc3Ryb25nPiBldCBuZSBzZXJhIHBhcyBlbnZvecOpZSBhdXggc2VydmV1cnMgZCdFbGRhcnlhLmAsXG4gICAgICAgIHRpdGxlOiBcIlNhdXZlZ2FyZGVyIGNldHRlIHRlbnVlXCIsXG4gICAgICB9LFxuICAgICAgYnV0dG9uczoge1xuICAgICAgICBkb3dubG9hZDogXCJUw6lsw6ljaGFyZ2VyIGxlIFBOR1wiLFxuICAgICAgICBleHBvcnQ6IFwiRXhwb3J0ZXJcIixcbiAgICAgICAgaW1wb3J0OiBcIkltcG9ydGVyXCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbG9hZGVkOiBcIkxlIGNoYXJnZW1lbnQgZGUgbGEgZ2FyZGUtcm9iZSBlc3QgdGVybWluw6kuXCIsXG4gICAgbG9hZGluZzogKGNhdGVnb3J5bmFtZTogc3RyaW5nKSA9PlxuICAgICAgYENoYXJnZW1lbnQgZGUgPHN0cm9uZz4ke2NhdGVnb3J5bmFtZX08L3N0cm9uZz4uLi5gLFxuICB9LFxuICBtYXJrZXQ6IHtcbiAgICBhZGRfdG9fd2lzaGxpc3Q6IHtcbiAgICAgIGFkZGVkX3RvX3dpc2hsaXN0OiAobmFtZTogc3RyaW5nLCBwcmljZTogbnVtYmVyKSA9PlxuICAgICAgICBgQWpvdXTDqSA8c3Ryb25nPiR7bmFtZX08L3N0cm9uZz4gcG91ciA8c3Ryb25nIGNsYXNzPVwicHJpY2UtaXRlbVwiPiR7cHJpY2V9PC9zdHJvbmc+IDxzcGFuIGNsYXNzPVwibWFhbmEtaWNvblwiIGFsdD1cIm1hYW5hc1wiPjwvc3Bhbj4gw6AgbGEgbGlzdGUgZGUgc291aGFpdHMuYCxcbiAgICAgIGludmFsaWRfcHJpY2U6IFwiQ2UgcHJpeCBuJ2VzdCBwYXMgdmFsaWRlLlwiLFxuICAgICAgc2F2ZTogXCJTYXV2ZWdhcmRlclwiLFxuICAgICAgdGV4dDogXCJDb21iaWVuIGRlIG1hYW5hcyBzb3VoYWl0ZXMtdHUgb2ZmcmlyIHBvdXIgYWNxdcOpcmlyIGNldCBpdGVtP1wiLFxuICAgICAgdGl0bGU6IFwiQWpvdXRlciDDoCBsYSBsaXN0ZSBkZSBzb3VoYWl0XCIsXG4gICAgfSxcbiAgICBhdWN0aW9uczoge1xuICAgICAgYnV5X25vd19wcmljZTogXCJBY2hhdCBpbW3DqWRpYXQgOlwiLFxuICAgICAgY3VycmVudF9wcmljZTogXCJNaXNlIGFjdHVlbGxlIDpcIixcbiAgICAgIGRlbGV0ZTogXCJTdXBwcmltZXJcIixcbiAgICAgIHB1cmNoYXNlX2hpc3Rvcnk6IFwiSGlzdG9yaXF1ZSBkJ2FjaGF0XCIsXG4gICAgICBzYWxlc19oaXN0b3J5OiBcIkhpc3RvcmlxdWUgZGUgdmVudGVcIixcbiAgICAgIGRhdGVfdGltZV9mb3JtYXQ6IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZnItQ0FcIiwge1xuICAgICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgICAgICBob3VyOiBcIjItZGlnaXRcIixcbiAgICAgICAgZGF5OiBcIm51bWVyaWNcIixcbiAgICAgICAgbW9udGg6IFwibG9uZ1wiLFxuICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIixcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgY2hhbmdlX3ByaWNlOiB7XG4gICAgICBjaGFuZ2VkX3ByaWNlOiAobmFtZTogc3RyaW5nLCBwcmljZTogbnVtYmVyKSA9PlxuICAgICAgICBgQ2hhbmfDqSBsZSBwcml4IGRlIDxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPiBwb3VyIDxzdHJvbmcgY2xhc3M9XCJwcmljZS1pdGVtXCI+JHtwcmljZX08L3N0cm9uZz4gPHNwYW4gY2xhc3M9XCJtYWFuYS1pY29uXCIgYWx0PVwibWFhbmFzXCI+PC9zcGFuPi5gLFxuICAgICAgaW52YWxpZF9wcmljZTogXCJDZSBwcml4IG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgICBzYXZlOiBcIlNhdXZlZ2FyZGVyXCIsXG4gICAgICB0ZXh0OiBcIkNvbWJpZW4gZGUgbWFhbmFzIHNvdWhhaXRlcy10dSBvZmZyaXIgcG91ciBhY3F1w6lyaXIgY2V0IGl0ZW0/XCIsXG4gICAgICB0aXRsZTogXCJDaGFuZ2VyIGxlIHByaXhcIixcbiAgICB9LFxuICAgIHdpc2hsaXN0OiB7XG4gICAgICBhY3Rpb25zOiBcIkFjdGlvbnNcIixcbiAgICAgIGFzc2lzdGFuY2U6IGBTdXIgY2V0dGUgcGFnZSwgdHUgcGV1eCBvcmdhbmlzZXIgdGEgbGlzdGUgZGUgc291aGFpdHMgZXQgdsOpcmlmaWVyIGxlIHN0YXR1dCBkZSB0ZXMgYXJ0aWNsZXMgc291aGFpdMOpcy4gUHJlbmRzIG5vdGUgcXVlIHRhIGxpc3RlIGRlIHNvdWhhaXRzIGVzdCBzYXV2ZWdhcmTDqWUgbG9jYWxlbWVudCBkYW5zIGxlcyBwYXJhbcOodHJlcyBkJzxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC5uYW1lfTwvc3Ryb25nPiBldCBuJ2VzdCBwYXMgZW52b3nDqWUgYXV4IHNlcnZldXJzIGQnRWxkYXJ5YS4gUG91ciB0cmFuc2bDqXJlciB0YSBsaXN0ZSBkZSBzb3VoYWl0cyB2ZXJzIHVuIGF1dHJlIG5hdmlnYXRldXIsIGV4cG9ydGUtbGEgw6AgcGFydGlyIGRlIGxhIHBhZ2UgPGEgaHJlZj1cIi91c2VyL2FjY291bnRcIiBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1wiPm1vbiZuYnNwO2NvbXB0ZTwvYT4uYCxcbiAgICAgIGNoYW5nZV9wcmljZTogXCJDaGFuZ2VyIGxlIHByaXhcIixcbiAgICAgIGRlbGV0ZV90b29sdGlwOiBcIlJldGlyZXIgZGUgbGEgbGlzdGUgZGUgc291aGFpdHNcIixcbiAgICAgIGRlbGV0ZTogXCJTdXBwcmltZXJcIixcbiAgICAgIGljb246IFwiSWPDtG5lXCIsXG4gICAgICBuYW1lOiBcIk5vbVwiLFxuICAgICAgcHJpY2U6IFwiUHJpeFwiLFxuICAgICAgcmVzZXRfYWxsOiBcIlLDqWluaXRpYWxpc2VyIHRvdXQgbGVzIHN0YXR1dHNcIixcbiAgICAgIHJlc2V0X3Rvb2x0aXA6IFwiUsOpaW5pdGlhbGlzZXIgbCfDqXRhdCBkJ2VycmV1clwiLFxuICAgICAgcmVzZXQ6IFwiUsOpaW5pdGlhbGlzZXJcIixcbiAgICAgIHN0YXR1czogXCJTdGF0dXRcIixcbiAgICAgIHRpdGxlOiBcIkxpc3RlIGRlIHNvdWhhaXRzXCIsXG4gICAgfSxcbiAgfSxcbiAgYWNjb3VudDoge1xuICAgIGRlYnVnX3Rvb2x0aXA6IFwiQWN0aXZlIG91IGTDqXNhY3RpdmUgbGEgam91cm5hbGlzYXRpb24uXCIsXG4gICAgZGVidWc6IFwiRMOpYm9nYWdlXCIsXG4gICAgZW5oYW5jZW1lbnRzOiBcIkFtw6lsaW9yYXRpb25zXCIsXG4gICAgZXhwbG9yYXRpb25zOiBcIkV4cGxvcmF0aW9uc1wiLFxuICAgIGV4cG9ydDogXCJFeHBvcnRlciBsZXMgcGFyYW3DqHRyZXNcIixcbiAgICBpbXBvcnQ6IFwiSW1wb3J0ZXIgbGVzIHBhcmFtw6h0cmVzXCIsXG4gICAgaW1wb3J0ZWQ6IFwiUGFyYW3DqHRyZXMgaW1wb3J0w6lzXCIsXG4gICAgbWFya2V0OiBcIk1hcmNow6lcIixcbiAgICBtaW5pZ2FtZXM6IFwiTWluaS1qZXV4XCIsXG4gIH0sXG4gIHBldDoge1xuICAgIGF1dG9fZXhwbG9yZTogXCJNYXJxdWVyXCIsXG4gICAgZGF0ZV90aW1lX2Zvcm1hdDogbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJmci1DQVwiLCB7XG4gICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICBkYXk6IFwibnVtZXJpY1wiLFxuICAgICAgbW9udGg6IFwibG9uZ1wiLFxuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgfSksXG4gICAgZGVsZXRlX2hpc3Rvcnk6IFwiTmV0dG95ZXIgbCdoaXN0b3JpcXVlXCIsXG4gICAgZW1wdHlfaGlzdG9yeTpcbiAgICAgIFwiVG9uIGhpc3RvcmlxdWUgZCdleHBsb3JhdGlvbiBlc3QgdmlkZS4gSWwgc2UgcmVtcGxpcmEgYXV0b21hdGlxdWVtZW50IMOgIG1lc3VyZSBxdWUgdG9uIGZhbWlsaWVyIHRyb3V2ZXJhIGRlcyBpdGVtcyBlbiBleHBsb3JhdGlvbi5cIixcbiAgICBnb3RvX2FjY291bnQ6XG4gICAgICBcIlBvdXIgdHJhbnNmw6lyZXIgdG9uIGhpc3RvcmlxdWUgZCdleHBsb3JhdGlvbnMgdmVycyB1biBhdXRyZSBuYXZpZ2F0ZXVyLCBleHBvcnRlIHRlcyBwYXJhbcOodHJlcyDDoCBwYXJ0aXIgZGUgbGEgcGFnZSA8ZW0+bW9uIGNvbXB0ZTwvZW0+LlwiLFxuICAgIGhpc3Rvcnk6IFwiSGlzdG9yaXF1ZVwiLFxuICAgIHNhdmVkX2xvY2FsbHk6IGBQcmVuZHMgbm90ZSBxdWUgdG9uIGhpc3RvcmlxdWUgZCdleHBsb3JhdGlvbnMgZXN0IHNhdXZlZ2FyZMOpIGxvY2FsZW1lbnQgZGFucyBsZXMgcGFyYW3DqHRyZXMgZCc8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz4gZXQgbidhIHBhcyDDqXTDqSBlbnZvecOpIGF1eCBzZXJ2ZXVycyBkJ0VsZGFyeWEuYCxcbiAgfSxcbiAgcHJvZmlsZToge1xuICAgIGV4cG9ydF9vdXRmaXQ6IFwiRXhwb3J0ZXIgbGEgdGVudWVcIixcbiAgICBkb3dubG9hZF9vdXRmaXQ6IFwiVMOpbMOpY2hhcmdlciBsZSBQTkdcIixcbiAgfSxcbiAgZXJyb3I6IHtcbiAgICBkb3dubG9hZENhbnZhczpcbiAgICAgIFwiVW5lIGVycmV1ciBlc3Qgc3VydmVudWUgbG9ycyBkdSB0w6lsw6ljaGFyZ2VtZW50IGRlIGwnaW1hZ2UuXCIsXG4gICAgbG9uZ0xvYWRpbmc6XG4gICAgICBcIkVsZGFyeWEgcHJlbmQgdHJvcCBkZSB0ZW1wcyDDoCBjaGFyZ2VyLiBOb3V2ZWxsZSB0ZW50YXRpdmUgZGFucyAxMCBzZWNvbmRlcy4uLlwiLFxuICB9LFxuICBtYWxsOiB7XG4gICAgYWRkX3RvX3dpc2hsaXN0OiB7XG4gICAgICB0aXRsZTogXCJBam91dGVyIMOgIGxhIGxpc3RlIGRlIHNvdWhhaXQgZHUgbWFyY2jDqVwiLFxuICAgICAgdGV4dDogXCJDb21iaWVuIGRlIG1hYW5hcyBzb3VoYWl0ZXMtdHUgb2ZmcmlyIHBvdXIgYWNxdcOpcmlyIGNldCBpdGVtP1wiLFxuICAgICAgbm90ZTogXCJQcmVuZHMgbm90ZSBxdWUgbGVzIGl0ZW1zIGFqb3V0w6lzIMOgIHBhcnRpciBkZSBsYSBib3V0aXF1ZSBuZSBzZXJvbnQgcGFzIG7DqWNlc3NhaXJlbWVudCBkaXNwb25pYmxlcyBhdSBtYXJjaMOpLlwiLFxuICAgIH0sXG4gIH0sXG59XG5cbk9iamVjdC5mcmVlemUoZnIpXG4iLCJpbXBvcnQgeyBlbiB9IGZyb20gXCIuL2VuXCJcbmltcG9ydCB7IGZyIH0gZnJvbSBcIi4vZnJcIlxuaW1wb3J0IHR5cGUgeyBUcmFuc2xhdGlvbiB9IGZyb20gXCIuL3RyYW5zbGF0aW9uXCJcblxuZnVuY3Rpb24gdHJhbnNsYXRpb24oKTogVHJhbnNsYXRpb24ge1xuICBpZiAobG9jYXRpb24uaG9zdG5hbWUuZW5kc1dpdGgoXCIuY29tLmJyXCIpKSByZXR1cm4gZW5cbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLmRlXCIpKSByZXR1cm4gZW5cbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLmVzXCIpKSByZXR1cm4gZW5cbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLmh1XCIpKSByZXR1cm4gZW5cbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLml0XCIpKSByZXR1cm4gZW5cbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLnBsXCIpKSByZXR1cm4gZW5cbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLnJ1XCIpKSByZXR1cm4gZW5cbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLmNvbVwiKSkgcmV0dXJuIGVuXG4gIGlmIChsb2NhdGlvbi5ob3N0bmFtZS5lbmRzV2l0aChcIi5mclwiKSkgcmV0dXJuIGZyXG4gIGVsc2UgcmV0dXJuIGVuXG59XG5cbmV4cG9ydCBjb25zdCB0cmFuc2xhdGUgPSB0cmFuc2xhdGlvbigpXG4iLCJleHBvcnQgZW51bSBEYXRhYmFzZXMge1xuICBlbGRhcnlhX2VuaGFuY2VtZW50cyA9IFwiZWxkYXJ5YV9lbmhhbmNlbWVudHNcIixcbn1cbiIsImV4cG9ydCBlbnVtIEZpZWxkcyB7XG4gIGJsb2IgPSBcImJsb2JcIixcbiAgaWQgPSBcImlkXCIsXG4gIGl0ZW1zID0gXCJpdGVtc1wiLFxuICBuYW1lID0gXCJuYW1lXCIsXG59XG4iLCJpbXBvcnQgdHlwZSB7IEZhdm91cml0ZU91dGZpdCB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL2ludGVyZmFjZXMvZmF2b3VyaXRlX291dGZpdFwiXG5pbXBvcnQgeyBDb25zb2xlIH0gZnJvbSBcIi4uL2NvbnNvbGVcIlxuaW1wb3J0IHsgRGF0YWJhc2VzIH0gZnJvbSBcIi4vZGF0YWJhc2VzLmVudW1cIlxuaW1wb3J0IHsgRmllbGRzIH0gZnJvbSBcIi4vZmllbGRzLmVudW1cIlxuaW1wb3J0IHsgVGFibGVzIH0gZnJvbSBcIi4vdGFibGVzLmVudW1cIlxuXG5jbGFzcyBJbmRleGVkREIge1xuICBwcml2YXRlIGRiPzogSURCRGF0YWJhc2VcbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJzaW9uID0gMVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihEYXRhYmFzZXMuZWxkYXJ5YV9lbmhhbmNlbWVudHMsIHRoaXMudmVyc2lvbilcbiAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiBJREJEYXRhYmFzZSA9PiAodGhpcy5kYiA9IHJlcXVlc3QucmVzdWx0KVxuICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24gKHRoaXM6IElEQk9wZW5EQlJlcXVlc3QpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGRiOiBJREJEYXRhYmFzZSA9IHRoaXMucmVzdWx0XG5cbiAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoVGFibGVzLmZhdm91cml0ZV9vdXRmaXRzLCB7XG4gICAgICAgIGtleVBhdGg6IFwiaWRcIixcbiAgICAgICAgYXV0b0luY3JlbWVudDogdHJ1ZSxcbiAgICAgIH0pXG5cbiAgICAgIG9iamVjdFN0b3JlLmNyZWF0ZUluZGV4KEZpZWxkcy5ibG9iLCBcImJsb2JcIiwgeyB1bmlxdWU6IGZhbHNlIH0pXG4gICAgICBvYmplY3RTdG9yZS5jcmVhdGVJbmRleChGaWVsZHMuaXRlbXMsIFwiaXRlbXNcIiwgeyB1bmlxdWU6IGZhbHNlIH0pXG4gICAgICBvYmplY3RTdG9yZS5jcmVhdGVJbmRleChGaWVsZHMubmFtZSwgXCJuYW1lXCIsIHsgdW5pcXVlOiBmYWxzZSB9KVxuICAgIH1cbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKTogdm9pZCA9PlxuICAgICAgQ29uc29sZS5lcnJvcihcIkVycm9yIHdoZW4gb3BlbmluZyB0aGUgaW5kZXhlZERCXCIsIHJlcXVlc3QuZXJyb3IpXG4gICAgcmVxdWVzdC5vbmJsb2NrZWQgPSAoKTogdm9pZCA9PlxuICAgICAgQ29uc29sZS5lcnJvcihcIkJsb2NrZWQgZnJvbSBvcGVuaW5nIHRoZSBpbmRleGVkREJcIiwgcmVxdWVzdC5lcnJvcilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyBhIG5ldyBgRmF2b3VyaXRlT3V0Zml0YCB3aXRoIHRoZSBga2V5YCBwcm9wZXJ0eSBzZXQuICovXG4gIGFzeW5jIGFkZEZhdm91cml0ZU91dGZpdChcbiAgICBmYXZvdXJpdGU6IEZhdm91cml0ZU91dGZpdFxuICApOiBQcm9taXNlPEZhdm91cml0ZU91dGZpdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXRoaXMuZGIpIHJldHVybiB2b2lkIHJlamVjdCgpXG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmRiXG4gICAgICAgIC50cmFuc2FjdGlvbihbVGFibGVzLmZhdm91cml0ZV9vdXRmaXRzXSwgXCJyZWFkd3JpdGVcIilcbiAgICAgICAgLm9iamVjdFN0b3JlKFRhYmxlcy5mYXZvdXJpdGVfb3V0Zml0cylcbiAgICAgICAgLmFkZChmYXZvdXJpdGUpXG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT5cbiAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgLi4uZmF2b3VyaXRlLFxuICAgICAgICAgIHVybDogZmF2b3VyaXRlLnVybCA/PyBVUkwuY3JlYXRlT2JqZWN0VVJMKGZhdm91cml0ZS5ibG9iKSxcbiAgICAgICAgICBpZDogTnVtYmVyKHJlcXVlc3QucmVzdWx0KSxcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgY2xlYXJGYXZvdXJpdGVPdXRmaXRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXRoaXMuZGIpIHJldHVybiB2b2lkIHJlamVjdCgpXG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmRiXG4gICAgICAgIC50cmFuc2FjdGlvbihbVGFibGVzLmZhdm91cml0ZV9vdXRmaXRzXSwgXCJyZWFkd3JpdGVcIilcbiAgICAgICAgLm9iamVjdFN0b3JlKFRhYmxlcy5mYXZvdXJpdGVfb3V0Zml0cylcbiAgICAgICAgLmNsZWFyKClcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKTogdm9pZCA9PiByZXNvbHZlKClcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlRmF2b3VyaXRlT3V0Zml0KGZhdm91cml0ZTogRmF2b3VyaXRlT3V0Zml0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIGlmICghdGhpcy5kYikgcmV0dXJuIHZvaWQgcmVqZWN0KClcblxuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZGJcbiAgICAgICAgLnRyYW5zYWN0aW9uKFtUYWJsZXMuZmF2b3VyaXRlX291dGZpdHNdLCBcInJlYWR3cml0ZVwiKVxuICAgICAgICAub2JqZWN0U3RvcmUoVGFibGVzLmZhdm91cml0ZV9vdXRmaXRzKVxuICAgICAgICAuZGVsZXRlKGZhdm91cml0ZS5pZCEpXG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICByZXNvbHZlKClcbiAgICAgICAgaWYgKGZhdm91cml0ZS51cmwpIFVSTC5yZXZva2VPYmplY3RVUkwoZmF2b3VyaXRlLnVybClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgZ2V0RmF2b3VyaXRlT3V0Zml0KGlkOiBudW1iZXIpOiBQcm9taXNlPEZhdm91cml0ZU91dGZpdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXRoaXMuZGIpIHJldHVybiB2b2lkIHJlamVjdCgpXG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmRiXG4gICAgICAgIC50cmFuc2FjdGlvbihbVGFibGVzLmZhdm91cml0ZV9vdXRmaXRzXSwgXCJyZWFkb25seVwiKVxuICAgICAgICAub2JqZWN0U3RvcmUoVGFibGVzLmZhdm91cml0ZV9vdXRmaXRzKVxuICAgICAgICAuZ2V0KGlkKVxuXG4gICAgICBjb25zdCBmYXZvdXJpdGU6IEZhdm91cml0ZU91dGZpdCA9IHJlcXVlc3QucmVzdWx0XG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT5cbiAgICAgICAgcmVzb2x2ZSh7IC4uLmZhdm91cml0ZSwgdXJsOiBVUkwuY3JlYXRlT2JqZWN0VVJMKGZhdm91cml0ZS5ibG9iKSB9KVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBnZXRGYXZvdXJpdGVPdXRmaXRzKCk6IFByb21pc2U8RmF2b3VyaXRlT3V0Zml0W10+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRiKSByZXR1cm4gdm9pZCByZWplY3QoXCJObyBkYXRhYmFzZVwiKVxuXG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5kYlxuICAgICAgICAudHJhbnNhY3Rpb24oW1RhYmxlcy5mYXZvdXJpdGVfb3V0Zml0c10sIFwicmVhZG9ubHlcIilcbiAgICAgICAgLm9iamVjdFN0b3JlKFRhYmxlcy5mYXZvdXJpdGVfb3V0Zml0cylcbiAgICAgICAgLmdldEFsbCgpXG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT5cbiAgICAgICAgcmVzb2x2ZShcbiAgICAgICAgICByZXF1ZXN0LnJlc3VsdC5tYXA8RmF2b3VyaXRlT3V0Zml0PigoZmF2b3VyaXRlOiBGYXZvdXJpdGVPdXRmaXQpID0+ICh7XG4gICAgICAgICAgICAuLi5mYXZvdXJpdGUsXG4gICAgICAgICAgICB1cmw6IFVSTC5jcmVhdGVPYmplY3RVUkwoZmF2b3VyaXRlLmJsb2IpLFxuICAgICAgICAgIH0pKVxuICAgICAgICApXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgSW5kZXhlZERCKClcbiIsImV4cG9ydCBlbnVtIFRhYmxlcyB7XG4gIGZhdm91cml0ZV9vdXRmaXRzID0gXCJmYXZvdXJpdGVfb3V0Zml0c1wiLFxufVxuIiwiZXhwb3J0IGVudW0gTG9jYWxTdG9yYWdlS2V5IHtcbiAgYXV0b0V4cGxvcmVMb2NhdGlvbnMgPSBcImF1dG9FeHBsb3JlTG9jYXRpb25zXCIsXG4gIGRlYnVnID0gXCJkZWJ1Z1wiLFxuICBleHBsb3JhdGlvbkhpc3RvcnkgPSBcImV4cGxvcmF0aW9uSGlzdG9yeVwiLFxuICBleHBsb3JhdGlvbnMgPSBcImV4cGxvcmF0aW9uc1wiLFxuICBtYXJrZXQgPSBcIm1hcmtldFwiLFxuICBtZXRhID0gXCJtZXRhXCIsXG4gIG1pbmlnYW1lcyA9IFwibWluaWdhbWVzXCIsXG4gIHB1cmNoYXNlcyA9IFwicHVyY2hhc2VzXCIsXG4gIHNhbGVzID0gXCJzYWxlc1wiLFxuICB1bmxvY2tlZCA9IFwidW5sb2NrZWRcIixcbiAgdmVyc2lvbiA9IFwidmVyc2lvblwiLFxuICB3aXNobGlzdCA9IFwid2lzaGxpc3RcIixcbn1cbiIsImltcG9ydCB7IGJhc2U2NFN0cmluZ1RvQmxvYiwgYmxvYlRvQmFzZTY0U3RyaW5nIH0gZnJvbSBcImJsb2ItdXRpbFwiXG5pbXBvcnQgdHlwZSB7IE1ldGEgfSBmcm9tIFwiLi4vYXBpL21ldGFcIlxuaW1wb3J0IHR5cGUgeyBGYXZvdXJpdGVPdXRmaXQgfSBmcm9tIFwiLi4vYXBwZWFyYW5jZS9pbnRlcmZhY2VzL2Zhdm91cml0ZV9vdXRmaXRcIlxuaW1wb3J0IGluZGV4ZWRfZGIgZnJvbSBcIi4uL2luZGV4ZWRfZGIvaW5kZXhlZF9kYlwiXG5pbXBvcnQgdHlwZSB7IE1hcmtldEVudHJ5IH0gZnJvbSBcIi4uL21hcmtldHBsYWNlL2ludGVyZmFjZXMvbWFya2V0X2VudHJ5XCJcbmltcG9ydCB0eXBlIHsgU2V0dGluZ3MgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvc2V0dGluZ3NcIlxuaW1wb3J0IHR5cGUgeyBBdXRvRXhwbG9yZUxvY2F0aW9uIH0gZnJvbSBcIi4vYXV0b19leHBsb3JlX2xvY2F0aW9uXCJcbmltcG9ydCB0eXBlIHsgRXhwbG9yYXRpb25SZXN1bHQgfSBmcm9tIFwiLi9leHBsb3JhdGlvbl9yZXN1bHRcIlxuaW1wb3J0IHR5cGUgeyBFeHBvcnRhYmxlRmF2b3VyaXRlIH0gZnJvbSBcIi4vZXhwb3J0YWJsZV9mYXZvdXJpdGVcIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlS2V5IH0gZnJvbSBcIi4vbG9jYWxfc3RvcmFnZS5lbnVtXCJcbmltcG9ydCB0eXBlIHsgU2FsZSB9IGZyb20gXCIuL3NhbGVcIlxuaW1wb3J0IHR5cGUgeyBXaXNoZWRJdGVtIH0gZnJvbSBcIi4vd2lzaGVkX2l0ZW1cIlxuXG5leHBvcnQgY2xhc3MgTG9jYWxTdG9yYWdlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9jYWxTdG9yYWdlID0gbG9jYWxTdG9yYWdlXG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGdldCBhdXRvRXhwbG9yZUxvY2F0aW9ucygpOiBBdXRvRXhwbG9yZUxvY2F0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW08QXV0b0V4cGxvcmVMb2NhdGlvbltdPihcbiAgICAgIExvY2FsU3RvcmFnZUtleS5hdXRvRXhwbG9yZUxvY2F0aW9ucyxcbiAgICAgIFtdXG4gICAgKVxuICB9XG5cbiAgc3RhdGljIHNldCBhdXRvRXhwbG9yZUxvY2F0aW9ucyhsb2NhdGlvbnM6IEF1dG9FeHBsb3JlTG9jYXRpb25bXSkge1xuICAgIHRoaXMuc2V0SXRlbShMb2NhbFN0b3JhZ2VLZXkuYXV0b0V4cGxvcmVMb2NhdGlvbnMsIGxvY2F0aW9ucylcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZGVidWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxib29sZWFuPihMb2NhbFN0b3JhZ2VLZXkuZGVidWcsIGZhbHNlKVxuICB9XG5cbiAgc3RhdGljIHNldCBkZWJ1ZyhlbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKExvY2FsU3RvcmFnZUtleS5kZWJ1ZywgZW5hYmxlZClcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZXhwbG9yYXRpb25IaXN0b3J5KCk6IEV4cGxvcmF0aW9uUmVzdWx0W10ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW08RXhwbG9yYXRpb25SZXN1bHRbXT4oXG4gICAgICBMb2NhbFN0b3JhZ2VLZXkuZXhwbG9yYXRpb25IaXN0b3J5LFxuICAgICAgW11cbiAgICApXG4gIH1cblxuICBzdGF0aWMgc2V0IGV4cGxvcmF0aW9uSGlzdG9yeShleHBsb3JhdGlvbkhpc3Rvcnk6IEV4cGxvcmF0aW9uUmVzdWx0W10pIHtcbiAgICB0aGlzLnNldEl0ZW0oTG9jYWxTdG9yYWdlS2V5LmV4cGxvcmF0aW9uSGlzdG9yeSwgZXhwbG9yYXRpb25IaXN0b3J5KVxuICB9XG5cbiAgc3RhdGljIGdldCBleHBsb3JhdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxib29sZWFuPihMb2NhbFN0b3JhZ2VLZXkuZXhwbG9yYXRpb25zLCBmYWxzZSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgZXhwbG9yYXRpb25zKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldEl0ZW0oTG9jYWxTdG9yYWdlS2V5LmV4cGxvcmF0aW9ucywgZW5hYmxlZClcbiAgfVxuXG4gIHN0YXRpYyBnZXQgbWFya2V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW08Ym9vbGVhbj4oTG9jYWxTdG9yYWdlS2V5Lm1hcmtldCwgZmFsc2UpXG4gIH1cblxuICBzdGF0aWMgc2V0IG1hcmtldChlbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKExvY2FsU3RvcmFnZUtleS5tYXJrZXQsIGVuYWJsZWQpXG4gIH1cblxuICBzdGF0aWMgZ2V0IG1ldGEoKTogTWV0YSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW08TWV0YSB8IG51bGw+KExvY2FsU3RvcmFnZUtleS5tZXRhLCBudWxsKVxuICB9XG5cbiAgc3RhdGljIHNldCBtZXRhKG1ldGE6IE1ldGEgfCBudWxsKSB7XG4gICAgdGhpcy5zZXRJdGVtKExvY2FsU3RvcmFnZUtleS5tZXRhLCBtZXRhKVxuICB9XG5cbiAgc3RhdGljIGdldCBtaW5pZ2FtZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxib29sZWFuPihMb2NhbFN0b3JhZ2VLZXkubWluaWdhbWVzLCBmYWxzZSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgbWluaWdhbWVzKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldEl0ZW0oTG9jYWxTdG9yYWdlS2V5Lm1pbmlnYW1lcywgZW5hYmxlZClcbiAgfVxuXG4gIHN0YXRpYyBnZXQgcHVyY2hhc2VzKCk6IE1hcmtldEVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW08TWFya2V0RW50cnlbXT4oTG9jYWxTdG9yYWdlS2V5LnB1cmNoYXNlcywgW10pXG4gIH1cblxuICBzdGF0aWMgc2V0IHB1cmNoYXNlcyhlbnRyeTogTWFya2V0RW50cnlbXSkge1xuICAgIHRoaXMuc2V0SXRlbShMb2NhbFN0b3JhZ2VLZXkucHVyY2hhc2VzLCBlbnRyeSlcbiAgfVxuXG4gIHN0YXRpYyBnZXQgc2FsZXMoKTogU2FsZVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtPFNhbGVbXT4oTG9jYWxTdG9yYWdlS2V5LnNhbGVzLCBbXSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgc2FsZXMoc2FsZTogU2FsZVtdKSB7XG4gICAgdGhpcy5zZXRJdGVtKExvY2FsU3RvcmFnZUtleS5zYWxlcywgc2FsZSlcbiAgfVxuXG4gIHN0YXRpYyBnZXQgdW5sb2NrZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxib29sZWFuPihMb2NhbFN0b3JhZ2VLZXkudW5sb2NrZWQsIGZhbHNlKVxuICB9XG5cbiAgc3RhdGljIHNldCB1bmxvY2tlZCh1bmxvY2tlZDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0SXRlbShMb2NhbFN0b3JhZ2VLZXkudW5sb2NrZWQsIHVubG9ja2VkKVxuICB9XG5cbiAgc3RhdGljIGdldCB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxzdHJpbmc+KExvY2FsU3RvcmFnZUtleS52ZXJzaW9uLCBcIlwiKVxuICB9XG5cbiAgc3RhdGljIHNldCB2ZXJzaW9uKHZlcnNpb246IHN0cmluZykge1xuICAgIHRoaXMuc2V0SXRlbShMb2NhbFN0b3JhZ2VLZXkudmVyc2lvbiwgdmVyc2lvbilcbiAgfVxuXG4gIHN0YXRpYyBnZXQgd2lzaGxpc3QoKTogV2lzaGVkSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtPFdpc2hlZEl0ZW1bXT4oTG9jYWxTdG9yYWdlS2V5Lndpc2hsaXN0LCBbXSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgd2lzaGxpc3QobG9jYXRpb25zOiBXaXNoZWRJdGVtW10pIHtcbiAgICB0aGlzLnNldEl0ZW0oTG9jYWxTdG9yYWdlS2V5Lndpc2hsaXN0LCBsb2NhdGlvbnMpXG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0U2V0dGluZ3MoKTogUHJvbWlzZTxTZXR0aW5ncz4ge1xuICAgIHJldHVybiB7XG4gICAgICBhdXRvRXhwbG9yZUxvY2F0aW9uczogdGhpcy5hdXRvRXhwbG9yZUxvY2F0aW9ucyxcbiAgICAgIGRlYnVnOiB0aGlzLmRlYnVnLFxuICAgICAgZXhwbG9yYXRpb25IaXN0b3J5OiB0aGlzLmV4cGxvcmF0aW9uSGlzdG9yeSxcbiAgICAgIGV4cGxvcmF0aW9uczogdGhpcy5leHBsb3JhdGlvbnMsXG4gICAgICBmYXZvdXJpdGVzOiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgKFxuICAgICAgICAgIGF3YWl0IGluZGV4ZWRfZGIuZ2V0RmF2b3VyaXRlT3V0Zml0cygpXG4gICAgICAgICkubWFwPFByb21pc2U8RXhwb3J0YWJsZUZhdm91cml0ZT4+KGFzeW5jIGZhdm91cml0ZSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGZhdm91cml0ZS5uYW1lLFxuICAgICAgICAgIGl0ZW1zOiBmYXZvdXJpdGUuaXRlbXMsXG4gICAgICAgICAgYmFzZTY0OiBhd2FpdCBibG9iVG9CYXNlNjRTdHJpbmcoZmF2b3VyaXRlLmJsb2IpLFxuICAgICAgICB9KSlcbiAgICAgICksXG4gICAgICBtYXJrZXQ6IHRoaXMubWFya2V0LFxuICAgICAgbWluaWdhbWVzOiB0aGlzLm1pbmlnYW1lcyxcbiAgICAgIHVubG9ja2VkOiB0aGlzLnVubG9ja2VkLFxuICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgd2lzaGxpc3Q6IHRoaXMud2lzaGxpc3QsXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNldFNldHRpbmdzKHNldHRpbmdzOiBTZXR0aW5ncyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXV0b0V4cGxvcmVMb2NhdGlvbnMgPSBzZXR0aW5ncy5hdXRvRXhwbG9yZUxvY2F0aW9uc1xuICAgIHRoaXMuZGVidWcgPSBzZXR0aW5ncy5kZWJ1Z1xuICAgIHRoaXMuZXhwbG9yYXRpb25IaXN0b3J5ID0gc2V0dGluZ3MuZXhwbG9yYXRpb25IaXN0b3J5XG4gICAgdGhpcy5leHBsb3JhdGlvbnMgPSBzZXR0aW5ncy5leHBsb3JhdGlvbnNcbiAgICB0aGlzLm1hcmtldCA9IHNldHRpbmdzLm1hcmtldFxuICAgIHRoaXMubWluaWdhbWVzID0gc2V0dGluZ3MubWluaWdhbWVzXG4gICAgdGhpcy51bmxvY2tlZCA9IHNldHRpbmdzLnVubG9ja2VkXG4gICAgdGhpcy52ZXJzaW9uID0gc2V0dGluZ3MudmVyc2lvblxuICAgIHRoaXMud2lzaGxpc3QgPSBzZXR0aW5ncy53aXNobGlzdFxuXG4gICAgYXdhaXQgaW5kZXhlZF9kYi5jbGVhckZhdm91cml0ZU91dGZpdHMoKVxuICAgIGZvciAoY29uc3QgZmF2b3VyaXRlIG9mIHNldHRpbmdzLmZhdm91cml0ZXMubWFwPEZhdm91cml0ZU91dGZpdD4oXG4gICAgICBmYXZvdXJpdGUgPT4gKHtcbiAgICAgICAgYmxvYjogYmFzZTY0U3RyaW5nVG9CbG9iKGZhdm91cml0ZS5iYXNlNjQpLFxuICAgICAgICBpdGVtczogZmF2b3VyaXRlLml0ZW1zLFxuICAgICAgICBuYW1lOiBmYXZvdXJpdGUubmFtZSxcbiAgICAgIH0pXG4gICAgKSkge1xuICAgICAgdm9pZCBpbmRleGVkX2RiLmFkZEZhdm91cml0ZU91dGZpdChmYXZvdXJpdGUpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0SXRlbTxUPihrZXk6IExvY2FsU3RvcmFnZUtleSwgZmFsbGJhY2s6IFQpOiBUIHtcbiAgICByZXR1cm4gKEpTT04ucGFyc2UoXG4gICAgICB0aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgPz8gSlNPTi5zdHJpbmdpZnkoZmFsbGJhY2spXG4gICAgKSA/PyBmYWxsYmFjaykgYXMgVFxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2V0SXRlbTxUPihrZXk6IExvY2FsU3RvcmFnZUtleSwgdmFsdWU6IFQpOiB2b2lkIHtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICB9XG59XG4iLCJleHBvcnQgZW51bSBCb2R5TG9jYXRpb24ge1xuICBBbGwgPSBcIlwiLFxuICBVbmRlcndlYXIgPSAxLFxuICBTa2lucyA9IDIsXG4gIFRhdHRvb3MgPSAyMCxcbiAgTW91dGhzID0gMjEsXG4gIEV5ZXMgPSAzLFxuICBIYWlyID0gNCxcbiAgU29ja3MgPSA1LFxuICBTaG9lcyA9IDYsXG4gIFBhbnRzID0gNyxcbiAgSGFuZEFjY2Vzc29yaWVzID0gOCxcbiAgVG9wcyA9IDksXG4gIENvYXRzID0gMTAsXG4gIEdsb3ZlcyA9IDExLFxuICBOZWNrbGFjZXMgPSAxMixcbiAgRHJlc3NlcyA9IDEzLFxuICBIYXRzID0gMTQsXG4gIEZhY2VBY2Nlc3NvcmllcyA9IDE1LFxuICBGdW5kcyA9IDE2LFxuICBCZWx0cyA9IDE4LFxuICBBdG1vc3BoZXJlcyA9IDE5LFxufVxuIiwiaW1wb3J0IHsgVHlwZSB9IGZyb20gXCIuL3R5cGUuZW51bVwiXG5cbmV4cG9ydCBlbnVtIENhdGVnb3J5U3RyaW5nIHtcbiAgYWxsID0gXCJcIixcbiAgZm9vZCA9IFwiZm9vZFwiLFxuICBhbGNoZW15ID0gXCJhbGNoZW15XCIsXG4gIHV0aWxpdHkgPSBcInV0aWxpdHlcIixcbiAgdGFtZSA9IFwidGFtZVwiLFxufVxuXG5leHBvcnQgZW51bSBDYXRlZ29yeU51bWJlciB7XG4gIGFsbCA9IENhdGVnb3J5U3RyaW5nLmFsbCxcbiAgZm9vZCA9IDEsXG4gIGFsY2hlbXkgPSBUeXBlLkNvbnN1bWFibGUsXG4gIHV0aWxpdHkgPSAzLFxuICB0YW1lID0gNCxcbn1cbiIsImV4cG9ydCBlbnVtIEd1YXJkIHtcbiAgYW55ID0gXCJcIixcbiAgbGlnaHQgPSAxLFxuICBvYnNpZGlhbixcbiAgYWJzeW50aGUsXG4gIHNoYWRvdyxcbn1cbiIsImV4cG9ydCBlbnVtIFJhcml0eSB7XG4gIGFsbCA9IFwiXCIsXG4gIGNvbW1vbiA9IFwiY29tbW9uXCIsXG4gIHJhcmUgPSBcInJhcmVcIixcbiAgZXBpYyA9IFwiZXBpY1wiLFxuICBsZWdlbmRhcnkgPSBcImxlZ2VuZGFyeVwiLFxuICBldmVudCA9IFwiZXZlbnRcIixcbn1cbiIsImV4cG9ydCBlbnVtIFR5cGUge1xuICBBbGwgPSBcIlwiLFxuICBCYWcgPSBcIkJhZ1wiLFxuICBDb25zdW1hYmxlID0gXCJDb25zdW1hYmxlXCIsXG4gIEVnZ0l0ZW0gPSBcIkVnZ0l0ZW1cIixcbiAgUGxheWVyV2VhcmFibGVJdGVtID0gXCJQbGF5ZXJXZWFyYWJsZUl0ZW1cIixcbiAgUXVlc3RJdGVtID0gXCJRdWVzdEl0ZW1cIixcbn1cbiIsImltcG9ydCB7IENvbnNvbGUgfSBmcm9tIFwiLi4vY29uc29sZVwiXG5pbXBvcnQgeyB0cmltSWNvbiB9IGZyb20gXCIuLi9lbGRhcnlhX3V0aWxcIlxuaW1wb3J0IHsgUmFyaXR5IH0gZnJvbSBcIi4vZW51bXMvcmFyaXR5LmVudW1cIlxuaW1wb3J0IHR5cGUgeyBCdXlOb3dQcmljZSB9IGZyb20gXCIuL2ludGVyZmFjZXMvYnV5X25vd19wcmljZVwiXG5pbXBvcnQgdHlwZSB7IEN1cnJlbnRQcmljZSB9IGZyb20gXCIuL2ludGVyZmFjZXMvY3VycmVudF9wcmljZVwiXG5pbXBvcnQgdHlwZSB7IE1hcmtldEVudHJ5IH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9tYXJrZXRfZW50cnlcIlxuaW1wb3J0IHR5cGUgeyBNYXJrZXRFbnRyeURhdGFTZXQgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL21hcmtldF9lbnRyeV9kYXRhX3NldFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJdGVtRGV0YWlscyhsaTogSFRNTExJRWxlbWVudCk6IE1hcmtldEVudHJ5IHwgbnVsbCB7XG4gIGNvbnN0IGRhdGFzZXQgPSBsaS5kYXRhc2V0IGFzIHVua25vd24gYXMgTWFya2V0RW50cnlEYXRhU2V0XG4gIGNvbnN0IG5hbWUgPSBsaS5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcIi5hYnN0cmFjdC1uYW1lXCIpPy5pbm5lclRleHRcbiAgY29uc3QgYWJzdHJhY3RUeXBlID1cbiAgICBsaS5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcIi5hYnN0cmFjdC10eXBlXCIpPy5pbm5lclRleHRcbiAgY29uc3Qgc3JjID0gbGkucXVlcnlTZWxlY3RvcjxIVE1MSW1hZ2VFbGVtZW50PihcIi5hYnN0cmFjdC1pY29uIGltZ1wiKT8uc3JjXG5cbiAgY29uc3QgcmFyaXR5OiBSYXJpdHkgPVxuICAgIFJhcml0eVtcbiAgICAgIChsaVxuICAgICAgICAucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBcIi5yYXJpdHktbWFya2VyLWNvbW1vbiwgLnJhcml0eS1tYXJrZXItcmFyZSwgLnJhcml0eS1tYXJrZXItZXBpYywgLnJhcml0eS1tYXJrZXItbGVnZW5kYXJ5LCAucmFyaXR5LW1hcmtlci1ldmVudFwiXG4gICAgICAgIClcbiAgICAgICAgPy5jbGFzc05hbWUuc3BsaXQoXCJyYXJpdHktbWFya2VyLVwiKVsxXSA/PyBcIlwiKSBhcyBrZXlvZiB0eXBlb2YgUmFyaXR5XG4gICAgXVxuXG4gIGNvbnN0IGN1cnJlbnRQcmljZSA9IGxpLnF1ZXJ5U2VsZWN0b3I8SFRNTEltYWdlRWxlbWVudD4oXG4gICAgXCIucHJpY2UtaXRlbVtkYXRhLWJpZHNdXCJcbiAgKT8uZGF0YXNldCBhcyB1bmtub3duIGFzIEN1cnJlbnRQcmljZVxuXG4gIGNvbnN0IGJ1eU5vd1ByaWNlID0gbGkucXVlcnlTZWxlY3RvcjxIVE1MSW1hZ2VFbGVtZW50PihcbiAgICBcIi5wcmljZS1pdGVtOm5vdChbZGF0YS1iaWRzXSlcIlxuICApPy5kYXRhc2V0IGFzIHVua25vd24gYXMgQnV5Tm93UHJpY2VcblxuICBpZiAoIXNyYyB8fCAhbmFtZSkge1xuICAgIENvbnNvbGUud2FybihcIkluY29tcGxldGUgbWFya2V0IGVudHJ5XCIsIGxpKVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmRhdGFzZXQsXG4gICAgaWNvbjogdHJpbUljb24oc3JjKSxcbiAgICByYXJpdHksXG4gICAgbmFtZSxcbiAgICBhYnN0cmFjdFR5cGUsXG4gICAgYnV5Tm93UHJpY2UsXG4gICAgY3VycmVudFByaWNlLFxuICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gIH1cbn1cbiIsImltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBtaWdyYXRlKCk6IHZvaWQge1xuICBzd2l0Y2ggKExvY2FsU3RvcmFnZS52ZXJzaW9uKSB7XG4gICAgY2FzZSBHTS5pbmZvLnNjcmlwdC52ZXJzaW9uOlxuICAgICAgcmV0dXJuXG5cbiAgICBjYXNlIFwiXCI6XG4gICAgICBpbnN0YWxsZWQoKVxuICAgICAgYnJlYWtcblxuICAgIGRlZmF1bHQ6XG4gICAgICBzd2l0Y2ggKEdNLmluZm8uc2NyaXB0LnZlcnNpb24pIHtcbiAgICAgICAgY2FzZSBcIjEuMi4wXCI6XG4gICAgICAgICAgdjFfMl8wKClcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCIxLjIuOVwiOlxuICAgICAgICAgIHYxXzJfOSgpXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwiMS4yLjEwXCI6XG4gICAgICAgICAgdjFfMl8xMCgpXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwiMS4yLjEzXCI6XG4gICAgICAgICAgdjFfMl8xMygpXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGluc3RhbGxlZCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgfVxuXG4gIExvY2FsU3RvcmFnZS52ZXJzaW9uID0gR00uaW5mby5zY3JpcHQudmVyc2lvblxufVxuXG5mdW5jdGlvbiBpbnN0YWxsZWQoKTogdm9pZCB7XG4gICQuZmxhdnJOb3RpZihgJHtuYW1lKCl9ICR7dmVyc2lvbigpfSBpbnN0YWxsZWQhYClcbn1cblxuZnVuY3Rpb24gbmFtZSgpOiBzdHJpbmcge1xuICByZXR1cm4gYDxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC5uYW1lfTwvc3Ryb25nPmBcbn1cblxuZnVuY3Rpb24gdmVyc2lvbigpOiBzdHJpbmcge1xuICByZXR1cm4gYHY8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQudmVyc2lvbn08L3N0cm9uZz5gXG59XG5cbmZ1bmN0aW9uIHYxXzJfMCgpOiB2b2lkIHtcbiAgTG9jYWxTdG9yYWdlLnNhbGVzID0gW11cbiAgJC5mbGF2ck5vdGlmKGBVcGRhdGVkIHRvICR7dmVyc2lvbigpfS4gWW91ciBzYWxlcyBoaXN0b3J5IHdhcyBlcmFzZWQuYClcbn1cblxuZnVuY3Rpb24gdjFfMl85KCk6IHZvaWQge1xuICAkLmZsYXZyTm90aWYoXG4gICAgYFVwZGF0ZWQgdG8gJHt2ZXJzaW9uKCl9LiBUaGUgd2lzaGxpc3QgaGFzIGJlZW4gaW1wcm92ZWQgdG8gc29ydCBieSBjYXRlZ29yeS90eXBlL25hbWUsIGJ1dCB5b3VyIHdpc2hlZCBpdGVtcyBkbyBub3QgaGF2ZSBhIHR5cGUuIFlvdSBjYW4gYWRkIHR5cGVzIGJ5IHJlLWFkZGluZyB0aGUgaXRlbXMgdmlhIHRoZSBtYXJrZXQuYFxuICApXG59XG5cbmZ1bmN0aW9uIHYxXzJfMTAoKTogdm9pZCB7XG4gICQuZmxhdnJOb3RpZihcbiAgICBgVXBkYXRlZCB0byAke3ZlcnNpb24oKX0uIFRoZSB3aXNobGlzdCBoYXMgYmVlbiBpbXByb3ZlZCB0byBzb3J0IGJ5IGNhdGVnb3J5L3R5cGUvcmFyaXR5L25hbWUsIGJ1dCB5b3VyIHdpc2hlZCBpdGVtcyBkbyBub3QgaGF2ZSBhIHJhcml0eS4gWW91IGNhbiBhZGQgcmFyaXRpZXMgYnkgcmUtYWRkaW5nIHRoZSBpdGVtcyB2aWEgdGhlIG1hcmtldC5gXG4gIClcbn1cblxuZnVuY3Rpb24gdjFfMl8xMygpOiB2b2lkIHtcbiAgJC5mbGF2ck5vdGlmKFxuICAgIGBVcGRhdGVkIHRvICR7dmVyc2lvbigpfS4gVGhlIGVuaGFuY2VkIGRyZXNzaW5nIGV4cGVyaWVuY2Ugd2FzIGRpc2FibGVkLmBcbiAgKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgdHlwZSB7IEdldFByaXplc0RhdGEgfSBmcm9tIFwiLi4vYXBpL2dldF9wcml6ZXNfZGF0YVwiXG5pbXBvcnQgdHlwZSB7IFBhY2tldCB9IGZyb20gXCIuLi9hcGkvcGFja2V0XCJcbmltcG9ydCB0eXBlIHsgU3RhcnRHYW1lRGF0YSB9IGZyb20gXCIuLi9hcGkvc3RhcnRfZ2FtZV9kYXRhXCJcbmltcG9ydCBcIi4uL2VsZGFyeWEvanF1ZXJ5XCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBmbGFwcHkgfSBmcm9tIFwiLi9mbGFwcHlcIlxuaW1wb3J0IHsgaGF0Y2hsaW5ncyB9IGZyb20gXCIuL2hhdGNobGluZ3NcIlxuaW1wb3J0IHR5cGUgeyBNaW5pZ2FtZSB9IGZyb20gXCIuL21pbmlnYW1lXCJcbmltcG9ydCB7IHBlZ2dsZSB9IGZyb20gXCIuL3BlZ2dsZVwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwbGF5UGVnZ2xlKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gcGxheShwZWdnbGUpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwbGF5RmxhcHB5KCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gcGxheShmbGFwcHkpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwbGF5SGF0Y2hsaW5ncygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHBsYXkoaGF0Y2hsaW5ncylcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGxheShtaW5pZ2FtZTogTWluaWdhbWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gRGlzYWJsZSBidXR0b25zXG4gIGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KHJlc29sdmUgPT4ge1xuICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgY29uc3QgYnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KFxuICAgICAgICBcIi5taW5pZ2FtZXMtcnVsZXMgLmZsYXZyLWJ1dHRvblwiXG4gICAgICApXG5cbiAgICAgIGlmIChidXR0b25zLmxlbmd0aCkge1xuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKVxuXG4gICAgICAgIGZvciAoY29uc3QgYnV0dG9uIG9mIGJ1dHRvbnMpIHtcbiAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZChcImRpc2FibGVkXCIpXG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICB9XG4gICAgfSwgMjUwKVxuICB9KVxuXG4gIGNvbnN0IGpzb24gPSBhd2FpdCBleGVjdXRlKG1pbmlnYW1lKVxuXG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9mbGF2cl9ub3RpZi9pY29uX21lc3NhZ2UuaHRtbFwiKVxuICAkLmZsYXZyTm90aWYoXG4gICAgdGVtcGxhdGUucmVuZGVyKHtcbiAgICAgIC4uLm1pbmlnYW1lLFxuICAgICAgbWVzc2FnZTogdHJhbnNsYXRlLm1pbmlnYW1lcy5wbGF5aW5nKG1pbmlnYW1lLm5hbWUpLFxuICAgIH0pXG4gIClcblxuICBjb25zdCBnYW1lVG9rZW4gPSBqc29uLmRhdGFcbiAgY29uc3Qgc2NvcmUgPSByYW5kb21JbnQobWluaWdhbWUuc2NvcmVNaW4sIG1pbmlnYW1lLnNjb3JlTWF4KVxuICBjb25zdCBlbmNfdG9rZW4gPSB4b3JFbmNvZGUoZ2FtZVRva2VuLCBzY29yZS50b1N0cmluZygpKVxuICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCByYW5kb21JbnQobWluaWdhbWUuZGVsYXlNaW4sIG1pbmlnYW1lLmRlbGF5TWF4KSlcbiAgKVxuXG4gIGF3YWl0IGdldFByaXplcyhtaW5pZ2FtZSwgZ2FtZVRva2VuLCBzY29yZSlcbiAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHJhbmRvbUludCgxMDAwLCAzMDAwKSkpXG5cbiAgYXdhaXQgc2VuZChlbmNfdG9rZW4sIHNjb3JlLCBtaW5pZ2FtZS5uYW1lLnRvTG93ZXJDYXNlKCkpXG4gIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCByYW5kb21JbnQoMTAwMCwgMzAwMCkpKVxufVxuXG5mdW5jdGlvbiByYW5kb21JbnQobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSArIG1pbilcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZShtaW5pZ2FtZTogTWluaWdhbWUpOiBQcm9taXNlPFBhY2tldDxTdGFydEdhbWVEYXRhPj4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8UGFja2V0PFN0YXJ0R2FtZURhdGE+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBSZWNhcHRjaGEgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIFJlY2FwdGNoYS5leGVjdXRlKFxuICAgICAgICBgbWluaWdhbWVTdGFydCR7bWluaWdhbWUubmFtZX1gLFxuICAgICAgICAodG9rZW4pOiB2b2lkID0+XG4gICAgICAgICAgdm9pZCBzdGFydEdhbWUobWluaWdhbWUsIHRva2VuKS50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdClcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdm9pZCBzdGFydEdhbWUobWluaWdhbWUpLnRoZW4ocmVzb2x2ZSkuY2F0Y2gocmVqZWN0KVxuICAgIH1cbiAgfSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRHYW1lKFxuICBtaW5pZ2FtZTogTWluaWdhbWUsXG4gIHJlY2FwdGNoYVRva2VuPzogc3RyaW5nXG4pOiBQcm9taXNlPFBhY2tldDxTdGFydEdhbWVEYXRhPj4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8UGFja2V0PFN0YXJ0R2FtZURhdGE+PihcbiAgICAocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgICAgdm9pZCAkLmFqYXgoe1xuICAgICAgICB1cmw6IFwiL21pbmlnYW1lcy9hamF4X3N0YXJ0R2FtZVwiLFxuICAgICAgICB0eXBlOiBcInBvc3RcIixcbiAgICAgICAgZGF0YVR5cGU6IFwianNvblwiLFxuICAgICAgICBkYXRhOiByZWNhcHRjaGFUb2tlblxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBnYW1lOiBtaW5pZ2FtZS5uYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgIHJlY2FwdGNoYVRva2VuOiByZWNhcHRjaGFUb2tlbixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgZ2FtZTogbWluaWdhbWUubmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgc3VjY2VzczogKGpzb246IFBhY2tldDxTdGFydEdhbWVEYXRhPik6IHZvaWQgPT4ge1xuICAgICAgICAgIHJlc29sdmUoanNvbilcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICByZWplY3QoKVxuICAgICAgICB9LFxuICAgICAgfSlcbiAgKVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQcml6ZXMoXG4gIG1pbmlnYW1lOiBNaW5pZ2FtZSxcbiAgZ2FtZVRva2VuOiBzdHJpbmcsXG4gIHNjb3JlOiBudW1iZXJcbik6IFByb21pc2U8UGFja2V0PEdldFByaXplc0RhdGE+PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxQYWNrZXQ8R2V0UHJpemVzRGF0YT4+KFxuICAgIChyZXNvbHZlKTogdm9pZCA9PlxuICAgICAgdm9pZCAkLnBvc3QoXG4gICAgICAgIFwiL21pbmlnYW1lcy9hamF4X2dldFByaXplc1wiLFxuICAgICAgICB7IGdhbWU6IG1pbmlnYW1lLm5hbWUudG9Mb3dlckNhc2UoKSwgc2NvcmU6IHNjb3JlIH0sXG4gICAgICAgIChqc29uOiBQYWNrZXQ8R2V0UHJpemVzRGF0YT4pOiB2b2lkID0+IHtcbiAgICAgICAgICByZXNvbHZlKGpzb24pXG5cbiAgICAgICAgICBpZiAoanNvbi5yZXN1bHQgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvZmxhdnJfbm90aWYvaWNvbl9tZXNzYWdlLmh0bWxcIilcblxuICAgICAgICAgICAgJC5mbGF2ck5vdGlmKFxuICAgICAgICAgICAgICB0ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgICAgICAgICAgIC4uLm1pbmlnYW1lLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRyYW5zbGF0ZS5taW5pZ2FtZXMucGxheWVkX2ZvcihcbiAgICAgICAgICAgICAgICAgIG1pbmlnYW1lLm5hbWUsXG4gICAgICAgICAgICAgICAgICBqc29uLmRhdGEubWFhbmFcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0gZWxzZSAkLmZsYXZyTm90aWYoanNvbi5kYXRhKVxuICAgICAgICB9LFxuICAgICAgICBcImpzb25cIlxuICAgICAgKS5mYWlsKCgpID0+XG4gICAgICAgIHNldFRpbWVvdXQoKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIHJlc29sdmUoZ2V0UHJpemVzKG1pbmlnYW1lLCBnYW1lVG9rZW4sIHNjb3JlKSlcbiAgICAgICAgfSwgcmFuZG9tSW50KDEwMDAsIDMwMDApKVxuICAgICAgKVxuICApXG59XG5cbi8qKlxuICogU8OpY3VyaXNhdGlvbiBkZSBsJ2Vudm9pIGR1IHNjb3JlXG4gKiBCYXPDqSBzdXIgbCdlbmNvZGFnZSBYT1IgOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1hPUl9jaXBoZXJcbiAqIEVmZmVjdHVlIHVuIFhPUiBiaXQgw6AgYml0IGVudHJlIHVuZSBjaGFpbmUgZXQgdW5lIGNsw6lcbiAqL1xuZnVuY3Rpb24geG9yRW5jb2RlKHN0cjogc3RyaW5nLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEFzc3VyZSBxdWUgbGVzIGRldXggcGFyYW3DqHRyZXMgc29pZW50IGRlcyBjaGFpbmVzIGRlIGNhcmFjdMOocmVcbiAgc3RyID0gc3RyLnRvU3RyaW5nKClcbiAga2V5ID0ga2V5LnRvU3RyaW5nKClcblxuICAvKiogRW5jb2RhZ2UgWE9SICovXG4gIGxldCB4b3IgPSBcIlwiXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItZm9yLW9mXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgbGV0IHRtcCA9IHN0cltpXVxuICAgIGZvciAobGV0IGogPSAwOyBqIDwga2V5Lmxlbmd0aDsgKytqKSB7XG4gICAgICB0bXAgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRtcCEuY2hhckNvZGVBdCgwKSBeIGtleS5jaGFyQ29kZUF0KGopKVxuICAgIH1cbiAgICB4b3IgKz0gdG1wXG4gIH1cblxuICAvLyBSZW52b2llIGxlIHLDqXN1bHRhdCBlbiBlbmNvZGFudCBsZXMgY2FyYWN0w6hyZXMgc3DDqWNpYXV4IHBvdXZhbnQgcG9zZXIgcHJvYmzDqG1lIChcXG4gcGFyIGV4ZW1wbGUpXG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoeG9yKVxufVxuXG5hc3luYyBmdW5jdGlvbiBzZW5kKFxuICBlbmNfdG9rZW46IHN0cmluZyxcbiAgc2NvcmU6IG51bWJlcixcbiAgZ2FtZTogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIGlmICh0eXBlb2YgUmVjYXB0Y2hhICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBSZWNhcHRjaGEuZXhlY3V0ZShcbiAgICAgICAgXCJtaW5pZ2FtZVNhdmVcIiArIGdhbWUsXG4gICAgICAgIChyZWNhcHRjaGFUb2tlbik6IHZvaWQgPT5cbiAgICAgICAgICB2b2lkIHNhdmVTY29yZShlbmNfdG9rZW4sIHNjb3JlLCBnYW1lLCByZWNhcHRjaGFUb2tlbikudGhlbihyZXNvbHZlKVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB2b2lkIHNhdmVTY29yZShlbmNfdG9rZW4sIHNjb3JlLCBnYW1lKS50aGVuKHJlc29sdmUpXG4gICAgfVxuICB9KVxufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlU2NvcmUoXG4gIGVuY190b2tlbjogc3RyaW5nLFxuICBzY29yZTogbnVtYmVyLFxuICBnYW1lOiBzdHJpbmcsXG4gIHJlY2FwdGNoYVRva2VuPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIGNvbnN0IHRva2VuID0gZGVjb2RlVVJJQ29tcG9uZW50KGVuY190b2tlbilcblxuICAgIHZvaWQgJC5hamF4KHtcbiAgICAgIHR5cGU6IFwicG9zdFwiLFxuICAgICAgdXJsOiBcIi9taW5pZ2FtZXMvYWpheF9zYXZlU2NvcmVcIixcbiAgICAgIGRhdGE6IHJlY2FwdGNoYVRva2VuXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICAgICAgc2NvcmU6IHNjb3JlLFxuICAgICAgICAgICAgZ2FtZTogZ2FtZSxcbiAgICAgICAgICAgIHJlY2FwdGNoYVRva2VuOiByZWNhcHRjaGFUb2tlbixcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICAgICAgc2NvcmU6IHNjb3JlLFxuICAgICAgICAgICAgZ2FtZTogZ2FtZSxcbiAgICAgICAgICB9LFxuICAgICAgc3VjY2VzczogKCk6IHZvaWQgPT4ge1xuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT5cbiAgICAgICAgc2V0VGltZW91dCgoKTogdm9pZCA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShzYXZlU2NvcmUoZW5jX3Rva2VuLCBzY29yZSwgZ2FtZSkpXG4gICAgICAgIH0sIHJhbmRvbUludCgxMDAwLCAzMDAwKSksXG4gICAgfSlcbiAgfSlcbn1cbiIsImltcG9ydCB0eXBlIHsgTWluaWdhbWUgfSBmcm9tIFwiLi9taW5pZ2FtZVwiXG5cbmV4cG9ydCBjb25zdCBmbGFwcHk6IE1pbmlnYW1lID0ge1xuICBuYW1lOiBcIkZsYXBweVwiLFxuICBzY29yZU1pbjogMTgwLFxuICBzY29yZU1heDogMjAwLFxuICBkZWxheU1pbjogNjBfMDAwLFxuICBkZWxheU1heDogNzBfMDAwLFxuICBidXR0b25TZWxlY3RvcjogJy5taW5pZ2FtZS1zdGFydCBbaHJlZj1cIi9taW5pZ2FtZXMvYnViYmx0ZW1wbGVcIl0gLm5sLWJ1dHRvbicsXG4gIGljb246IFwiL3N0YXRpYy9pbWcvbmV3LWxheW91dC9taW5pZ2FtZXMvaWNvbl9idWJibGV0ZW1wbGUucG5nXCIsXG59XG4iLCJpbXBvcnQgdHlwZSB7IE1pbmlnYW1lIH0gZnJvbSBcIi4vbWluaWdhbWVcIlxuXG5leHBvcnQgY29uc3QgaGF0Y2hsaW5nczogTWluaWdhbWUgPSB7XG4gIG5hbWU6IFwiSGF0Y2hsaW5nc1wiLFxuICBzY29yZU1pbjogMTgsXG4gIHNjb3JlTWF4OiAyMCxcbiAgZGVsYXlNaW46IDMwXzAwMCxcbiAgZGVsYXlNYXg6IDMwXzAwMCxcbiAgYnV0dG9uU2VsZWN0b3I6ICcubWluaWdhbWUtc3RhcnQgW2hyZWY9XCIvbWluaWdhbWVzL2NvY29vbmlucGlja1wiXSAubmwtYnV0dG9uJyxcbiAgaWNvbjogXCIvc3RhdGljL2ltZy9uZXctbGF5b3V0L21pbmlnYW1lcy9pY29uX2NvY29uaW5waWNrLnBuZ1wiLFxufVxuIiwiaW1wb3J0IHR5cGUgeyBNaW5pZ2FtZSB9IGZyb20gXCIuL21pbmlnYW1lXCJcblxuZXhwb3J0IGNvbnN0IHBlZ2dsZTogTWluaWdhbWUgPSB7XG4gIG5hbWU6IFwiUGVnZ2xlXCIsXG4gIHNjb3JlTWluOiA5LFxuICBzY29yZU1heDogMTAsXG4gIGRlbGF5TWluOiAxMF8wMDAsXG4gIGRlbGF5TWF4OiAyMF8wMDAsXG4gIGJ1dHRvblNlbGVjdG9yOiAnLm1pbmlnYW1lLXN0YXJ0IFtocmVmPVwiL21pbmlnYW1lcy9nZW1ib21iXCJdIC5ubC1idXR0b24nLFxuICBpY29uOiBcIi9zdGF0aWMvaW1nL25ldy1sYXlvdXQvbWluaWdhbWVzL2ljb25fZ2VtYm9tYi5wbmdcIixcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFyc2FibGVJdGVtIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9pbnRlcmZhY2VzL3BhcnNhYmxlX2l0ZW1cIlxuaW1wb3J0IHR5cGUgeyBBdmF0YXIgfSBmcm9tIFwiLi9lbGRhcnlhL2F2YXRhclwiXG5cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRPdXRmaXQoc2VsZWN0b3I6IHN0cmluZywgbmFtZSA9IFwib3V0Zml0XCIpOiB2b2lkIHtcbiAgY29uc3QgYXZhdGFyID0gU2FjaGEuQXZhdGFyLmF2YXRhcnNbc2VsZWN0b3JdXG4gIGlmICghYXZhdGFyKSByZXR1cm5cblxuICBjb25zdCBvdXRmaXQgPSBwYXJzZUF2YXRhcihhdmF0YXIpXG5cbiAgY29uc3QgaHJlZiA9XG4gICAgXCJkYXRhOnRleHQvanNvbjtjaGFyc2V0PXV0Zi04LFwiICtcbiAgICBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkob3V0Zml0LCB1bmRlZmluZWQsIDIpKVxuXG4gIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKVxuICBhLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgaHJlZilcbiAgYS5zZXRBdHRyaWJ1dGUoXCJkb3dubG9hZFwiLCBgJHtuYW1lfS5qc29uYClcbiAgYS5jbGljaygpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUF2YXRhcihhdmF0YXI6IEF2YXRhcik6IFBhcnNhYmxlSXRlbVtdIHtcbiAgcmV0dXJuIGF2YXRhci5jaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xuICAgIGNvbnN0IGl0ZW0gPSBjaGlsZC5nZXRJdGVtKClcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGl0ZW0uX2lkLFxuICAgICAgZ3JvdXA6IGl0ZW0uX2dyb3VwLFxuICAgICAgbmFtZTogaXRlbS5fbmFtZSxcbiAgICAgIGltYWdlOiBpdGVtLl9pbWFnZSxcbiAgICAgIHR5cGU6IGl0ZW0uX3R5cGUsXG4gICAgICBjYXRlZ29yeUlkOiBpdGVtLl9jYXRlZ29yeUlkLFxuICAgICAgaGlkZGVuQ2F0ZWdvcmllczogT2JqZWN0LnZhbHVlcyhpdGVtLl9oaWRkZW5DYXRlZ29yaWVzKSxcbiAgICAgIGFuaW1hdGlvbkRhdGE6IGl0ZW0uX2FuaW1hdGlvbkRhdGEsXG4gICAgICBsb2NrZWQ6IGl0ZW0uX2xvY2tlZCxcbiAgICB9XG4gIH0pXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IENvbnNvbGUgfSBmcm9tIFwiLi4vY29uc29sZVwiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5pbXBvcnQgeyBsaXN0ZW5UcmVhc3VyZUh1bnQgfSBmcm9tIFwiLi9leHBsb3JhdGlvbi13YXRjaGVyXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFeHBsb3JhdGlvbkhpc3RvcnkoKTogdm9pZCB7XG4gIGxvYWRIaXN0b3J5QnV0dG9uKClcbiAgbGlzdGVuVHJlYXN1cmVIdW50KClcbn1cblxuZnVuY3Rpb24gbG9hZEhpc3RvcnlCdXR0b24oKTogdm9pZCB7XG4gIGNvbnN0IGNsb3NlRXhwbG9yYXRpb25CdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxBbmNob3JFbGVtZW50PihcbiAgICBcIiNjbG9zZS10cmVhc3VyZS1odW50LWludGVyZmFjZVwiXG4gIClcbiAgaWYgKCFjbG9zZUV4cGxvcmF0aW9uQnV0dG9uKVxuICAgIHJldHVybiB2b2lkIENvbnNvbGUuZXJyb3IoXCJDb3VsZG4ndCBmaW5kICNjbG9zZS10cmVhc3VyZS1odW50LWludGVyZmFjZS5cIilcblxuICBjbG9zZUV4cGxvcmF0aW9uQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiXG4gIGNsb3NlRXhwbG9yYXRpb25CdXR0b24uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCJcbiAgY2xvc2VFeHBsb3JhdGlvbkJ1dHRvbi5zdHlsZS5yaWdodCA9IFwiMFwiXG4gIGNsb3NlRXhwbG9yYXRpb25CdXR0b24uc3R5bGUudG9wID0gXCIwXCJcbiAgY2xvc2VFeHBsb3JhdGlvbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgb25DbGlja1BldClcblxuICBjb25zdCBoaXN0b3J5QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIilcbiAgaGlzdG9yeUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibmwtYnV0dG9uXCIsIFwibmwtYnV0dG9uLWJhY2tcIilcbiAgaGlzdG9yeUJ1dHRvbi5zdHlsZS5tYXJnaW5SaWdodCA9IFwiMC42ZW1cIlxuICBoaXN0b3J5QnV0dG9uLnRleHRDb250ZW50ID0gdHJhbnNsYXRlLnBldC5oaXN0b3J5XG4gIGhpc3RvcnlCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIG9uQ2xpY2tIaXN0b3J5KVxuXG4gIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgcm93Lmluc2VydEFkamFjZW50RWxlbWVudChcImJlZm9yZWVuZFwiLCBoaXN0b3J5QnV0dG9uKVxuICByb3cuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYmVmb3JlZW5kXCIsIGNsb3NlRXhwbG9yYXRpb25CdXR0b24pXG5cbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIjcmlnaHQtY29udGFpbmVyLWlubmVyXCIpXG4gICAgPy5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIHJvdylcbn1cblxuZnVuY3Rpb24gb25DbGlja0hpc3RvcnkoKTogdm9pZCB7XG4gIGhpZGVQZXQoKVxuICBoaWRlRXhwbG9yYXRpb24oKVxuICBtYWtlSGlzdG9yeSgpXG4gIHNob3dIaXN0b3J5KClcbn1cblxuZnVuY3Rpb24gb25DbGlja1BldCgpOiB2b2lkIHtcbiAgaGlkZUhpc3RvcnkoKVxuICBzaG93UGV0KClcbn1cblxuZnVuY3Rpb24gaGlkZVBldCgpOiB2b2lkIHtcbiAgY29uc3QgbmFtZUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibmFtZS1jb250YWluZXJcIilcbiAgY29uc3QgaW5mb0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaW5mb3MtY29udGFpbmVyXCIpXG4gIGNvbnN0IHBldEltYWdlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwZXQtaW1hZ2UtY29udGFpbmVyXCIpXG5cbiAgaWYgKCFuYW1lQ29udGFpbmVyIHx8ICFpbmZvQ29udGFpbmVyIHx8ICFwZXRJbWFnZUNvbnRhaW5lcilcbiAgICByZXR1cm4gdm9pZCBDb25zb2xlLmVycm9yKFwiVGhlIHBldCBkaXNwbGF5IHdhcyBkYW1hZ2VkLlwiLCB7XG4gICAgICBuYW1lQ29udGFpbmVyLFxuICAgICAgaW5mb0NvbnRhaW5lcixcbiAgICAgIHBldEltYWdlQ29udGFpbmVyLFxuICAgIH0pXG5cbiAgbmFtZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcbiAgaW5mb0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcbiAgcGV0SW1hZ2VDb250YWluZXIuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiXG59XG5cbmZ1bmN0aW9uIHNob3dQZXQoKTogdm9pZCB7XG4gIGNvbnN0IG5hbWVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm5hbWUtY29udGFpbmVyXCIpXG4gIGNvbnN0IGluZm9Db250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImluZm9zLWNvbnRhaW5lclwiKVxuICBjb25zdCBwZXRJbWFnZUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicGV0LWltYWdlLWNvbnRhaW5lclwiKVxuXG4gIGlmICghbmFtZUNvbnRhaW5lciB8fCAhaW5mb0NvbnRhaW5lciB8fCAhcGV0SW1hZ2VDb250YWluZXIpXG4gICAgcmV0dXJuIHZvaWQgQ29uc29sZS5lcnJvcihcIlRoZSBwZXQgZGlzcGxheSB3YXMgZGFtYWdlZC5cIiwge1xuICAgICAgbmFtZUNvbnRhaW5lcixcbiAgICAgIGluZm9Db250YWluZXIsXG4gICAgICBwZXRJbWFnZUNvbnRhaW5lcixcbiAgICB9KVxuXG4gIG5hbWVDb250YWluZXIuc3R5bGUuZGlzcGxheSA9IFwiXCJcbiAgaW5mb0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJcIlxuICBwZXRJbWFnZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJcIlxufVxuXG5mdW5jdGlvbiBzaG93SGlzdG9yeSgpOiB2b2lkIHtcbiAgY29uc3QgaGlzdG9yeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGlzdG9yeS1jb250YWluZXJcIilcbiAgaWYgKCFoaXN0b3J5KSByZXR1cm5cbiAgaGlzdG9yeS5zdHlsZS5kaXNwbGF5ID0gXCJcIlxufVxuXG5mdW5jdGlvbiBoaWRlSGlzdG9yeSgpOiB2b2lkIHtcbiAgY29uc3QgaGlzdG9yeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGlzdG9yeS1jb250YWluZXJcIilcbiAgaWYgKCFoaXN0b3J5KSByZXR1cm5cbiAgaGlzdG9yeS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcbn1cblxuZnVuY3Rpb24gaGlkZUV4cGxvcmF0aW9uKCk6IHZvaWQge1xuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChcIm1haW4tc2VjdGlvblwiKVxuICAgID8uY2xhc3NMaXN0LnJlbW92ZShcInRyZWFzdXJlLWh1bnQtaW50ZXJmYWNlLW9wZW5cIilcbn1cblxuZnVuY3Rpb24gbWFrZUhpc3RvcnkoKTogdm9pZCB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGlzdG9yeS1jb250YWluZXJcIik/LnJlbW92ZSgpXG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9leHBsb3JhdGlvbl9oaXN0b3J5Lmh0bWxcIilcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxlZnQtY29udGFpbmVyXCIpPy5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgXCJiZWZvcmVlbmRcIixcbiAgICB0ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgdHJhbnNsYXRlLFxuICAgICAgaGlzdG9yeTogTG9jYWxTdG9yYWdlLmV4cGxvcmF0aW9uSGlzdG9yeS5tYXAoaGlzdG9yeSA9PiAoe1xuICAgICAgICAuLi5oaXN0b3J5LFxuICAgICAgICBkYXRlOiB0cmFuc2xhdGUucGV0LmRhdGVfdGltZV9mb3JtYXQuZm9ybWF0KG5ldyBEYXRlKGhpc3RvcnkuZGF0ZSkpLFxuICAgICAgfSkpLFxuICAgIH0pXG4gIClcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRlbGV0ZS1oaXN0b3J5XCIpPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgIExvY2FsU3RvcmFnZS5leHBsb3JhdGlvbkhpc3RvcnkgPSBbXVxuICAgIG1ha2VIaXN0b3J5KClcbiAgfSlcbn1cbiIsImltcG9ydCB7IENvbnNvbGUgfSBmcm9tIFwiLi4vY29uc29sZVwiXG5pbXBvcnQgeyB0cmltSWNvbiB9IGZyb20gXCIuLi9lbGRhcnlhX3V0aWxcIlxuaW1wb3J0IHR5cGUgeyBFeHBsb3JhdGlvblJlc3VsdCB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2V4cGxvcmF0aW9uX3Jlc3VsdFwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlblRyZWFzdXJlSHVudCgpOiB2b2lkIHtcbiAgY29uc3QgcmVzdWx0T3ZlcmxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjdHJlYXN1cmUtaHVudC1yZXN1bHQtb3ZlcmxheVwiKVxuICBpZiAoIXJlc3VsdE92ZXJsYXkpXG4gICAgcmV0dXJuIHZvaWQgQ29uc29sZS5lcnJvcihcIlRoZXJlIGlzIG5vIHJlc3VsdCBvdmVybGF5LlwiLCByZXN1bHRPdmVybGF5KVxuXG4gIG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbiAgICBDb25zb2xlLmxvZyhcIk11dGF0aW9uIGluXCIsIHJlc3VsdE92ZXJsYXkpXG4gICAgaWYgKCFyZXN1bHRPdmVybGF5LmNsYXNzTGlzdC5jb250YWlucyhcImFjdGl2ZVwiKSkgcmV0dXJuXG5cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0UmVzdWx0cygpXG4gICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBDb25zb2xlLmxvZyhcIlJlc3VsdHM6XCIsIHJlc3VsdHMpXG5cbiAgICBMb2NhbFN0b3JhZ2UuZXhwbG9yYXRpb25IaXN0b3J5ID0gW1xuICAgICAgLi4ucmVzdWx0cyxcbiAgICAgIC4uLkxvY2FsU3RvcmFnZS5leHBsb3JhdGlvbkhpc3RvcnksXG4gICAgXVxuICB9KS5vYnNlcnZlKHJlc3VsdE92ZXJsYXksIHtcbiAgICBhdHRyaWJ1dGVGaWx0ZXI6IFtcImNsYXNzXCJdLFxuICB9KVxufVxuXG5mdW5jdGlvbiBnZXRSZXN1bHRzKCk6IEV4cGxvcmF0aW9uUmVzdWx0W10ge1xuICBjb25zdCBsb2NhdGlvbk5hbWUgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwiI3RoLWFnYWluIHN0cm9uZ1wiKVxuICAgID8udGV4dENvbnRlbnQ/LnRyaW0oKVxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG5cbiAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi50aC1yZXN1bHRcIikpLm1hcChyZXN1bHQgPT4ge1xuICAgIGNvbnN0IGltZyA9IHJlc3VsdC5xdWVyeVNlbGVjdG9yPEhUTUxJbWFnZUVsZW1lbnQ+KFwiaW1nLnRoLXJlc3VsdC1pbWdcIilcblxuICAgIHJldHVybiB7XG4gICAgICBjb3VudDogcmVzdWx0LnF1ZXJ5U2VsZWN0b3IoXCIucmVzb3VyY2UtY291bnRcIik/LnRleHRDb250ZW50Py50cmltKCksXG4gICAgICBkYXRlOiBub3csXG4gICAgICBpY29uOiBpbWcgPyB0cmltSWNvbihpbWcuc3JjKSA6IHVuZGVmaW5lZCxcbiAgICAgIGxvY2F0aW9uTmFtZSxcbiAgICAgIG5hbWU6IHJlc3VsdC5xdWVyeVNlbGVjdG9yKFwiLnRvb2x0aXAtY29udGVudCBoM1wiKT8udGV4dENvbnRlbnQ/LnRyaW0oKSxcbiAgICAgIHRyYWRhYmxlOiBCb29sZWFuKHJlc3VsdC5xdWVyeVNlbGVjdG9yKFwiLnRyYWRhYmxlXCIpKSxcbiAgICB9XG4gIH0pXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IGNoYW5nZVJlZ2lvbiB9IGZyb20gXCIuLi9hamF4L2NoYW5nZV9yZWdpb25cIlxuaW1wb3J0IHsgUmVzdWx0IH0gZnJvbSBcIi4uL2FwaS9yZXN1bHQuZW51bVwiXG5pbXBvcnQgeyBDb25zb2xlIH0gZnJvbSBcIi4uL2NvbnNvbGVcIlxuaW1wb3J0IHR5cGUgeyBNYXBSZWdpb24gfSBmcm9tIFwiLi4vZWxkYXJ5YS9jdXJyZW50X3JlZ2lvblwiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHR5cGUgeyBBdXRvRXhwbG9yZUxvY2F0aW9uIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2UvYXV0b19leHBsb3JlX2xvY2F0aW9uXCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuaW1wb3J0IHR5cGUgeyBBdXRvRXhwbG9yZUJ1dHRvbiB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9hdXRvX2V4cGxvcmVfYnV0dG9uXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRNYXJrZXJzKCk6IHZvaWQge1xuICBjb25zdCBhdXRvRXhwbG9yZUxvY2F0aW9ucyA9IExvY2FsU3RvcmFnZS5hdXRvRXhwbG9yZUxvY2F0aW9uc1xuXG4gIGZvciAoY29uc3QgZGl2IG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTERpdkVsZW1lbnQ+KFxuICAgIFwiLm1hcC1sb2NhdGlvbltkYXRhLWlkXVwiXG4gICkpIHtcbiAgICBjb25zdCBsb2NhdGlvbklkID0gTnVtYmVyKGRpdi5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpKVxuICAgIGlmICghbG9jYXRpb25JZCkgY29udGludWVcblxuICAgIGxvYWRQaWN0b01hcChhdXRvRXhwbG9yZUxvY2F0aW9ucywgZGl2KVxuXG4gICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PlxuICAgICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoXG4gICAgICAgIChfOiBNdXRhdGlvblJlY29yZFtdLCBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcik6IHZvaWQgPT4ge1xuICAgICAgICAgIGFkZEF1dG9FeHBsb3JlQnV0dG9uKGxvY2F0aW9uSWQsIG9ic2VydmVyKVxuICAgICAgICB9XG4gICAgICApLm9ic2VydmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYXAtbG9jYXRpb24tcHJldmlld1wiKSBhcyBOb2RlLCB7XG4gICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICB9KVxuICAgIClcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRBdXRvRXhwbG9yZUJ1dHRvbihcbiAgbG9jYXRpb25JZDogbnVtYmVyLFxuICBvYnNlcnZlcj86IE11dGF0aW9uT2JzZXJ2ZXJcbik6IHZvaWQge1xuICBjb25zdCBidXR0b25zQ29udGFpbmVyID1cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcIiNidXR0b25zLWNvbnRhaW5lclwiKVxuICBpZiAoIWJ1dHRvbnNDb250YWluZXIpIHJldHVyblxuICBvYnNlcnZlcj8uZGlzY29ubmVjdCgpXG5cbiAgLy8gUGFyYW1ldGVycyB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSB0ZW1wbGF0ZVxuICBjb25zdCBjb250ZXh0OiBBdXRvRXhwbG9yZUJ1dHRvbiA9IHtcbiAgICBsb2NhdGlvbklkLFxuICAgIGFjdGl2ZTogTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zLnNvbWUoXG4gICAgICBzYXZlZCA9PiBzYXZlZC5sb2NhdGlvbi5pZCA9PT0gbG9jYXRpb25JZFxuICAgICksXG4gICAgcmVnaW9uSWQ6IE51bWJlcihcbiAgICAgIGRvY3VtZW50XG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKFwiLm1pbmltYXAuY3VycmVudFtkYXRhLW1hcGlkXVwiKVxuICAgICAgICA/LmdldEF0dHJpYnV0ZShcImRhdGEtbWFwaWRcIilcbiAgICApLFxuICB9XG5cbiAgLy8gQWRkIHRoZSBhdXRvIGV4cGxvcmUgYnV0dG9uXG4gIGJ1dHRvbnNDb250YWluZXIucXVlcnlTZWxlY3RvcihcIiNhdXRvLWV4cGxvcmUtYnV0dG9uXCIpPy5yZW1vdmUoKVxuICBjb25zdCBhdXRvRXhwbG9yZVRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9hdXRvX2V4cGxvcmVfYnV0dG9uLmh0bWxcIilcbiAgYnV0dG9uc0NvbnRhaW5lci5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgXCJiZWZvcmVlbmRcIixcbiAgICBhdXRvRXhwbG9yZVRlbXBsYXRlLnJlbmRlcih7IC4uLmNvbnRleHQsIHRyYW5zbGF0ZSB9KVxuICApXG5cbiAgLy8gQmluZCBgYXV0b0V4cGxvcmVgIGFuZCBgbG9hZFBpY3RvTWFwc2BcbiAgYnV0dG9uc0NvbnRhaW5lclxuICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxCdXR0b25FbGVtZW50PihcIiNhdXRvLWV4cGxvcmUtYnV0dG9uXCIpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgQ29uc29sZS5kZWJ1ZyhcIkNsaWNrZWQgb24gI2F1dG8tZXhwbG9yZS1idXR0b24uXCIsIGNvbnRleHQpXG4gICAgICB2b2lkIG1hcmtMb2NhdGlvbihjb250ZXh0KS50aGVuKGxvYWRQaWN0b01hcHMpXG4gICAgfSlcblxuICB2b2lkIGRpc2FibGVFeHBsb3JlKGNvbnRleHQpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRpc2FibGVFeHBsb3JlKGNvbnRleHQ6IEF1dG9FeHBsb3JlQnV0dG9uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGVudHJ5ID0gYXdhaXQgZ2V0QXV0b0V4cGxvcmVFbnRyeShjb250ZXh0LnJlZ2lvbklkLCBjb250ZXh0LmxvY2F0aW9uSWQpXG4gIGlmICghZW50cnkpIHJldHVyblxuXG4gIGlmIChwZXRFbmVyZ3kgPCBOdW1iZXIoZW50cnkubG9jYXRpb24uZW5lcmd5UmVxdWlyZWQpKVxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZXhwbG9yZS1idXR0b25cIik/LmNsYXNzTGlzdC5hZGQoXCJkaXNhYmxlZFwiKVxufVxuXG5hc3luYyBmdW5jdGlvbiBtYXJrTG9jYXRpb24oY29udGV4dDogQXV0b0V4cGxvcmVCdXR0b24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGNvbnRleHQuYWN0aXZlKSB7XG4gICAgY29uc3QgZmlsdGVyZWRMb2NhdGlvbnMgPSBMb2NhbFN0b3JhZ2UuYXV0b0V4cGxvcmVMb2NhdGlvbnMuZmlsdGVyKFxuICAgICAgc2F2ZWQgPT4gc2F2ZWQubG9jYXRpb24uaWQgIT09IGNvbnRleHQubG9jYXRpb25JZFxuICAgIClcbiAgICBMb2NhbFN0b3JhZ2UuYXV0b0V4cGxvcmVMb2NhdGlvbnMgPSBmaWx0ZXJlZExvY2F0aW9uc1xuICAgIGFkZEF1dG9FeHBsb3JlQnV0dG9uKGNvbnRleHQubG9jYXRpb25JZClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG5ld0F1dG9FeHBsb3JlID0gYXdhaXQgZ2V0QXV0b0V4cGxvcmVFbnRyeShcbiAgICBjb250ZXh0LnJlZ2lvbklkLFxuICAgIGNvbnRleHQubG9jYXRpb25JZFxuICApXG4gIGlmICghbmV3QXV0b0V4cGxvcmUpIHtcbiAgICBDb25zb2xlLmVycm9yKFxuICAgICAgYENvdWxkIG5vdCBnZW5lcmF0ZSBhbiBhdXRvIGV4cGxvcmUgZW50cnkgZm9yIGxvY2F0aW9uICMke2NvbnRleHQubG9jYXRpb25JZH0uYCxcbiAgICAgIGNvbnRleHRcbiAgICApXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBuZXdMb2NhdGlvbnMgPSBMb2NhbFN0b3JhZ2UuYXV0b0V4cGxvcmVMb2NhdGlvbnNcbiAgbmV3TG9jYXRpb25zLnB1c2gobmV3QXV0b0V4cGxvcmUpXG4gIExvY2FsU3RvcmFnZS5hdXRvRXhwbG9yZUxvY2F0aW9ucyA9IG5ld0xvY2F0aW9uc1xuICBhZGRBdXRvRXhwbG9yZUJ1dHRvbihjb250ZXh0LmxvY2F0aW9uSWQpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEF1dG9FeHBsb3JlRW50cnkoXG4gIHJlZ2lvbklkOiBudW1iZXIsXG4gIGxvY2F0aW9uSWQ6IG51bWJlclxuKTogUHJvbWlzZTxBdXRvRXhwbG9yZUxvY2F0aW9uIHwgbnVsbD4ge1xuICBjb25zdCByZWdpb24gPSBhd2FpdCBnZXRSZWdpb24ocmVnaW9uSWQpXG4gIGlmICghcmVnaW9uKSB7XG4gICAgQ29uc29sZS5lcnJvcihgQ291bGQgbm90IGdldCByZWdpb24gIyR7cmVnaW9uSWR9LmApXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGxvY2F0aW9uID0gcmVnaW9uLmxvY2F0aW9ucy5maW5kKGxvY2F0aW9uID0+IGxvY2F0aW9uLmlkID09PSBsb2NhdGlvbklkKVxuICBpZiAoIWxvY2F0aW9uKSB7XG4gICAgQ29uc29sZS5lcnJvcihcbiAgICAgIGBDb3VsZCBub3QgZ2V0IGxvY2F0aW9uICMke2xvY2F0aW9uSWR9IGluICR7cmVnaW9uLm5hbWV9LmAsXG4gICAgICByZWdpb25cbiAgICApXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbG9jYXRpb24sXG4gICAgcmVnaW9uLFxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFJlZ2lvbihpZDogbnVtYmVyKTogUHJvbWlzZTxNYXBSZWdpb24gfCBudWxsPiB7XG4gIGlmIChpZC50b1N0cmluZygpID09PSBjdXJyZW50UmVnaW9uLmlkKSByZXR1cm4gY3VycmVudFJlZ2lvblxuXG4gIGNvbnN0IGpzb24gPSBhd2FpdCBjaGFuZ2VSZWdpb24oaWQpXG4gIGlmIChqc29uLnJlc3VsdCA9PT0gUmVzdWx0LnN1Y2Nlc3MpIHJldHVybiBqc29uLmRhdGEuY3VycmVudFJlZ2lvblxuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIGxvYWRQaWN0b01hcHMoKTogdm9pZCB7XG4gIGNvbnN0IGF1dG9FeHBsb3JlTG9jYXRpb25zID0gTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zXG4gIGZvciAoY29uc3QgZGl2IG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTERpdkVsZW1lbnQ+KFxuICAgIFwiLm1hcC1sb2NhdGlvbltkYXRhLWlkXVwiXG4gICkpIHtcbiAgICBsb2FkUGljdG9NYXAoYXV0b0V4cGxvcmVMb2NhdGlvbnMsIGRpdilcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2FkUGljdG9NYXAoXG4gIGF1dG9FeHBsb3JlTG9jYXRpb25zOiBBdXRvRXhwbG9yZUxvY2F0aW9uW10sXG4gIGRpdjogSFRNTERpdkVsZW1lbnRcbik6IHZvaWQge1xuICBjb25zdCBtYXBMb2NhdGlvbiA9IGRpdi5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpXG4gIGlmICghbWFwTG9jYXRpb24pIHJldHVyblxuXG4gIGRpdi5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBhdXRvRXhwbG9yZUxvY2F0aW9ucy5zb21lKFxuICAgIHNhdmVkID0+IHNhdmVkLmxvY2F0aW9uLmlkID09PSBOdW1iZXIobWFwTG9jYXRpb24pXG4gIClcbiAgICA/IFwidXJsKC9zdGF0aWMvaW1nL25ldy1sYXlvdXQvcGV0L2ljb25zL3BpY3RvX21hcF9leHBsby5wbmcpXCJcbiAgICA6IFwidXJsKC9zdGF0aWMvaW1nL25ldy1sYXlvdXQvcGV0L2ljb25zL3BpY3RvX21hcC5wbmcpXCJcbn1cbiIsImV4cG9ydCBlbnVtIFNlc3Npb25TdG9yYWdlS2V5IHtcbiAgYWN0aW9uID0gXCJhY3Rpb25cIixcbiAgZXhwbG9yYXRpb25zRG9uZSA9IFwiZXhwbG9yYXRpb25zRG9uZVwiLFxuICBtaW5pZ2FtZXNEb25lID0gXCJtaW5pZ2FtZXNEb25lXCIsXG4gIHNlbGVjdGVkTG9jYXRpb24gPSBcInNlbGVjdGVkTG9jYXRpb25cIixcbiAgdGFrZW92ZXIgPSBcInRha2VvdmVyXCIsXG4gIHdpc2hsaXN0ID0gXCJ3aXNobGlzdFwiLFxuICBzdW1tZXJHYW1lRG9uZSA9IFwic3VtbWVyR2FtZURvbmVcIixcbn1cbiIsImltcG9ydCB0eXBlIHsgQXV0b0V4cGxvcmVMb2NhdGlvbiB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2F1dG9fZXhwbG9yZV9sb2NhdGlvblwiXG5pbXBvcnQgdHlwZSB7IFdpc2hlZEl0ZW0gfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS93aXNoZWRfaXRlbVwiXG5pbXBvcnQgeyBTZXNzaW9uU3RvcmFnZUtleSB9IGZyb20gXCIuL3Nlc3Npb25fc3RvcmFnZS5lbnVtXCJcbmltcG9ydCB0eXBlIHsgVGFrZW92ZXJBY3Rpb24gfSBmcm9tIFwiLi90YWtlb3Zlcl9hY3Rpb24uZW51bVwiXG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uU3RvcmFnZSB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHNlc3Npb25TdG9yYWdlID0gc2Vzc2lvblN0b3JhZ2VcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZ2V0IGFjdGlvbigpOiBUYWtlb3ZlckFjdGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW0oU2Vzc2lvblN0b3JhZ2VLZXkuYWN0aW9uLCBudWxsKVxuICB9XG5cbiAgc3RhdGljIHNldCBhY3Rpb24oYWN0aW9uOiBUYWtlb3ZlckFjdGlvbiB8IG51bGwpIHtcbiAgICB0aGlzLnNldEl0ZW0oU2Vzc2lvblN0b3JhZ2VLZXkuYWN0aW9uLCBhY3Rpb24pXG4gIH1cblxuICBzdGF0aWMgZ2V0IGV4cGxvcmF0aW9uc0RvbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbShTZXNzaW9uU3RvcmFnZUtleS5leHBsb3JhdGlvbnNEb25lLCBmYWxzZSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgZXhwbG9yYXRpb25zRG9uZShkb25lOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LmV4cGxvcmF0aW9uc0RvbmUsIGRvbmUpXG4gIH1cblxuICBzdGF0aWMgZ2V0IG1pbmlnYW1lc0RvbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbShTZXNzaW9uU3RvcmFnZUtleS5taW5pZ2FtZXNEb25lLCBmYWxzZSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgbWluaWdhbWVzRG9uZShkb25lOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5Lm1pbmlnYW1lc0RvbmUsIGRvbmUpXG4gIH1cblxuICBzdGF0aWMgZ2V0IHN1bW1lckdhbWVEb25lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW0oU2Vzc2lvblN0b3JhZ2VLZXkuc3VtbWVyR2FtZURvbmUsIGZhbHNlKVxuICB9XG5cbiAgc3RhdGljIHNldCBzdW1tZXJHYW1lRG9uZShkb25lOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LnN1bW1lckdhbWVEb25lLCBkb25lKVxuICB9XG5cbiAgc3RhdGljIGdldCBzZWxlY3RlZExvY2F0aW9uKCk6IEF1dG9FeHBsb3JlTG9jYXRpb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LnNlbGVjdGVkTG9jYXRpb24sIG51bGwpXG4gIH1cblxuICBzdGF0aWMgc2V0IHNlbGVjdGVkTG9jYXRpb24oc2VsZWN0ZWQ6IEF1dG9FeHBsb3JlTG9jYXRpb24gfCBudWxsKSB7XG4gICAgdGhpcy5zZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LnNlbGVjdGVkTG9jYXRpb24sIHNlbGVjdGVkKVxuICB9XG5cbiAgc3RhdGljIGdldCB0YWtlb3ZlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LnRha2VvdmVyLCBmYWxzZSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgdGFrZW92ZXIoZW5hYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0SXRlbShTZXNzaW9uU3RvcmFnZUtleS50YWtlb3ZlciwgZW5hYmxlZClcbiAgfVxuXG4gIHN0YXRpYyBnZXQgd2lzaGxpc3QoKTogV2lzaGVkSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5Lndpc2hsaXN0LCBbXSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgd2lzaGxpc3Qod2lzaGxpc3Q6IFdpc2hlZEl0ZW1bXSkge1xuICAgIHRoaXMuc2V0SXRlbShTZXNzaW9uU3RvcmFnZUtleS53aXNobGlzdCwgd2lzaGxpc3QpXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRJdGVtPFQ+KGtleTogU2Vzc2lvblN0b3JhZ2VLZXksIGZhbGxiYWNrOiBUKTogVCB7XG4gICAgcmV0dXJuIChKU09OLnBhcnNlKFxuICAgICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGtleSkgPz8gSlNPTi5zdHJpbmdpZnkoZmFsbGJhY2spXG4gICAgKSA/PyBmYWxsYmFjaykgYXMgVFxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2V0SXRlbTxUPihrZXk6IFNlc3Npb25TdG9yYWdlS2V5LCB2YWx1ZTogVCk6IHZvaWQge1xuICAgIHRoaXMuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gVGFrZW92ZXJBY3Rpb24ge1xuICBkYWlseSA9IFwiZGFpbHlcIixcbiAgbWluaWdhbWVzID0gXCJtaW5pZ2FtZXNcIixcbiAgZXhwbG9yYXRpb25zID0gXCJleHBsb3JhdGlvbnNcIixcbiAgYXVjdGlvbnMgPSBcImF1Y3Rpb25zXCIsXG4gIGJ1eSA9IFwiYnV5XCIsXG4gIC8vIHNlbGwsXG4gIHN1bW1lckdhbWUgPSBcInN1bW1lckdhbWVcIixcbiAgd2FpdCA9IFwid2FpdFwiLFxufVxuIiwiaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi9jb25zb2xlXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB7IFNlc3Npb25TdG9yYWdlIH0gZnJvbSBcIi4uL3Nlc3Npb25fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VcIlxuaW1wb3J0IHR5cGUgeyBUYWtlb3ZlckFjdGlvbiB9IGZyb20gXCIuLi9zZXNzaW9uX3N0b3JhZ2UvdGFrZW92ZXJfYWN0aW9uLmVudW1cIlxuaW1wb3J0IHsgbG9hZFRvcEJhciB9IGZyb20gXCIuLi91aS90b3BfYmFyXCJcbmltcG9ydCB0eXBlIHsgQWN0aW9uIH0gZnJvbSBcIi4vY2xhc3Nlcy9hY3Rpb25cIlxuaW1wb3J0IGJ1eUFjdGlvbiBmcm9tIFwiLi9jbGFzc2VzL2J1eV9hY3Rpb25cIlxuaW1wb3J0IGRhaWx5QWN0aW9uIGZyb20gXCIuL2NsYXNzZXMvZGFpbHlfYWN0aW9uXCJcbmltcG9ydCBleHBsb3JhdGlvbkFjdGlvbiBmcm9tIFwiLi9jbGFzc2VzL2V4cGxvcmF0aW9uX2FjdGlvblwiXG5pbXBvcnQgbWluaWdhbWVBY3Rpb24gZnJvbSBcIi4vY2xhc3Nlcy9taW5pZ2FtZV9hY3Rpb25cIlxuaW1wb3J0IHdhaXRBY3Rpb24gZnJvbSBcIi4vY2xhc3Nlcy93YWl0X2FjdGlvblwiXG5cbi8qKiBBdXRvbWF0ZWQgZW50cnkgcG9pbnQgb2YgdGhlIHRha2VvdmVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRUYWtlb3ZlcigpOiB2b2lkIHtcbiAgaWYgKFNlc3Npb25TdG9yYWdlLnRha2VvdmVyICYmIExvY2FsU3RvcmFnZS51bmxvY2tlZCkgdm9pZCB0YWtlb3ZlcigpXG59XG5cbi8qKiBNYW51YWwgZW50cnkgcG9pbnQgb2YgdGhlIHRha2VvdmVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZVRha2VvdmVyKCk6IHZvaWQge1xuICByZXNldFRha2VvdmVyKClcbiAgU2Vzc2lvblN0b3JhZ2UudGFrZW92ZXIgPSAhU2Vzc2lvblN0b3JhZ2UudGFrZW92ZXJcblxuICBpZiAoIUxvY2FsU3RvcmFnZS51bmxvY2tlZCkge1xuICAgIFNlc3Npb25TdG9yYWdlLnRha2VvdmVyID0gZmFsc2VcbiAgICByZXR1cm5cbiAgfVxuXG4gIGxvYWRUb3BCYXIoKVxuICBpZiAoU2Vzc2lvblN0b3JhZ2UudGFrZW92ZXIpICQuZmxhdnJOb3RpZih0cmFuc2xhdGUudGFrZW92ZXIuZW5hYmxlZClcbiAgZWxzZSAkLmZsYXZyTm90aWYodHJhbnNsYXRlLnRha2VvdmVyLmRpc2FibGVkKVxuXG4gIHZvaWQgdGFrZW92ZXIoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRUYWtlb3ZlcigpOiB2b2lkIHtcbiAgU2Vzc2lvblN0b3JhZ2UuYWN0aW9uID0gbnVsbFxuICBTZXNzaW9uU3RvcmFnZS5leHBsb3JhdGlvbnNEb25lID0gZmFsc2VcbiAgU2Vzc2lvblN0b3JhZ2UubWluaWdhbWVzRG9uZSA9IGZhbHNlXG4gIFNlc3Npb25TdG9yYWdlLnNlbGVjdGVkTG9jYXRpb24gPSBudWxsXG4gIFNlc3Npb25TdG9yYWdlLnN1bW1lckdhbWVEb25lID0gZmFsc2VcbiAgU2Vzc2lvblN0b3JhZ2Uud2lzaGxpc3QgPSBbXVxufVxuXG5hc3luYyBmdW5jdGlvbiB0YWtlb3ZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFTZXNzaW9uU3RvcmFnZS50YWtlb3ZlcikgcmV0dXJuXG4gIGlmIChkYWlseUFjdGlvbi5jb25kaXRpb24oKSkgYXdhaXQgZGFpbHlBY3Rpb24ucGVyZm9ybSgpXG5cbiAgY29uc3QgYWN0aW9uID0gYWN0aW9ucy5maW5kKGFjdGlvbiA9PiBhY3Rpb24ua2V5ID09PSBTZXNzaW9uU3RvcmFnZS5hY3Rpb24pXG4gIGlmIChhY3Rpb24/LmNvbmRpdGlvbigpKSB7XG4gICAgQ29uc29sZS5pbmZvKFwiQWN0aW9uOlwiLCBhY3Rpb24ua2V5KVxuXG4gICAgaWYgKGF3YWl0IGFjdGlvbi5wZXJmb3JtKCkpIHJldHVyblxuICB9XG5cbiAgY2hhbmdlQWN0aW9uKClcbiAgdm9pZCB0YWtlb3ZlcigpXG59XG5cbmNvbnN0IGFjdGlvbnM6IEFjdGlvbltdID0gW1xuICBleHBsb3JhdGlvbkFjdGlvbixcbiAgYnV5QWN0aW9uLFxuICBtaW5pZ2FtZUFjdGlvbixcbiAgd2FpdEFjdGlvbixcbl1cblxuZnVuY3Rpb24gY2hhbmdlQWN0aW9uKCk6IFRha2VvdmVyQWN0aW9uIHtcbiAgY29uc3QgbmV4dCA9XG4gICAgYWN0aW9ucy5maW5kSW5kZXgoYWN0aW9uID0+IGFjdGlvbi5rZXkgPT09IFNlc3Npb25TdG9yYWdlLmFjdGlvbikgKyAxXG5cbiAgcmV0dXJuIChTZXNzaW9uU3RvcmFnZS5hY3Rpb24gPVxuICAgIGFjdGlvbnNbbmV4dCA+PSBhY3Rpb25zLmxlbmd0aCA/IDAgOiBuZXh0XSEua2V5KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUYWtlb3ZlckFjdGlvbiB9IGZyb20gXCIuLi8uLi9zZXNzaW9uX3N0b3JhZ2UvdGFrZW92ZXJfYWN0aW9uLmVudW1cIlxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWN0aW9uIHtcbiAgLyoqIEtleSBieSB3aGljaCB0aGUgYFNlc3Npb25TdG9yYWdlYCBjYW4gcmVmZXJlbmNlIHRoaXMgYWN0aW9uLiAqL1xuICBhYnN0cmFjdCByZWFkb25seSBrZXk6IFRha2VvdmVyQWN0aW9uXG5cbiAgLyoqIERldGVybWluZXMgaWYgdGhpcyBhY3Rpb24gY2FuIGJlIHBlcmZvcm1lZCBkdXJpbmcgYSB0YWtlb3Zlci4gKi9cbiAgYWJzdHJhY3QgY29uZGl0aW9uKCk6IGJvb2xlYW5cblxuICAvKipcbiAgICogUGVyZm9ybXMgdGhlIGFjdGlvbiBhbmQgcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaGFzIHNvbWV0aGluZyBlbHNlIHRvIGRvIG9yXG4gICAqIGBmYWxzZWAgaWYgdGhpcyBhY3Rpb24gaXMgZmluaXNoZWQgZXhlY3V0aW5nLlxuICAgKi9cbiAgYWJzdHJhY3QgcGVyZm9ybSgpOiBQcm9taXNlPGJvb2xlYW4+XG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IGFqYXhTZWFyY2ggfSBmcm9tIFwiLi4vLi4vYWpheC9hamF4X3NlYXJjaFwiXG5pbXBvcnQgeyBidXkgfSBmcm9tIFwiLi4vLi4vYWpheC9idXlcIlxuaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi8uLi9jb25zb2xlXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi8uLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB0eXBlIHsgV2lzaGVkSXRlbSB9IGZyb20gXCIuLi8uLi9sb2NhbF9zdG9yYWdlL3dpc2hlZF9pdGVtXCJcbmltcG9ydCB0eXBlIHsgTWFya2V0RW50cnkgfSBmcm9tIFwiLi4vLi4vbWFya2V0cGxhY2UvaW50ZXJmYWNlcy9tYXJrZXRfZW50cnlcIlxuaW1wb3J0IHsgZ2V0SXRlbURldGFpbHMgfSBmcm9tIFwiLi4vLi4vbWFya2V0cGxhY2UvbWFya2V0cGxhY2VfaGFuZGxlcnNcIlxuaW1wb3J0IHsgVGFrZW92ZXJBY3Rpb24gfSBmcm9tIFwiLi4vLi4vc2Vzc2lvbl9zdG9yYWdlL3Rha2VvdmVyX2FjdGlvbi5lbnVtXCJcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuL2FjdGlvblwiXG5cbmNsYXNzIEJ1eUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7XG4gIHJlYWRvbmx5IGtleSA9IFRha2VvdmVyQWN0aW9uLmJ1eVxuXG4gIHByaXZhdGUgZ2V0IGN1cnJlbnRNYWFuYSgpOiBudW1iZXIge1xuICAgIHJldHVybiBOdW1iZXIoXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxBbmNob3JFbGVtZW50PihcIiNjdXJyZW5jeS1tYWFuYVwiKT8uZGF0YXNldFxuICAgICAgICAubWFhbmFcbiAgICApXG4gIH1cblxuICBjb25kaXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIExvY2FsU3RvcmFnZS5tYXJrZXQgJiYgQm9vbGVhbihMb2NhbFN0b3JhZ2Uud2lzaGxpc3QubGVuZ3RoKVxuICB9XG5cbiAgYXN5bmMgcGVyZm9ybSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAobG9jYXRpb24ucGF0aG5hbWUgIT09IFwiL21hcmtldHBsYWNlXCIpIHtcbiAgICAgIHBhZ2VMb2FkKFwiL21hcmtldHBsYWNlXCIpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IGljb25NZXNzYWdlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvaHRtbC9mbGF2cl9ub3RpZi9pY29uX21lc3NhZ2UuaHRtbFwiKVxuICAgIGZvciAoY29uc3Qgd2lzaGVkIG9mIExvY2FsU3RvcmFnZS53aXNobGlzdCkge1xuICAgICAgLy8gQ2xvdGhlcyBtaWdodCBiZSBhIHNwZWNpYWwgZXhjZXB0aW9uLiBJZiB0aGV5IGFyZSwgdGhlbiBjaGVjayBmb3JcbiAgICAgIC8vIGB3aXNoZWQudHlwZSA9PT0gVHlwZS5QbGF5ZXJXZWFyYWJsZUl0ZW1gLlxuICAgICAgaWYgKHdpc2hlZC5lcnJvcikge1xuICAgICAgICBDb25zb2xlLndhcm4oYFNraXBwZWQgXCIke3dpc2hlZC5uYW1lfVwiYCwgd2lzaGVkKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgQ29uc29sZS5pbmZvKGBTZWFyY2hpbmcgZm9yIFwiJHt3aXNoZWQubmFtZX1cImAsIHdpc2hlZClcblxuICAgICAgLyoqIFNlYXJjaCBpbiBlYWNoIHBhZ2VzIHVudGlsIHRoZSBhbW91bnQgb2YgaXRlbXMgaXMgbGVzcyB0aGFuIDggKi9cbiAgICAgIGxldCBhbW91bnQgPSA4XG4gICAgICBmb3JwYWdlOiBmb3IgKGxldCBwYWdlID0gMTsgYW1vdW50ID09PSA4OyBwYWdlKyspIHtcbiAgICAgICAgbGV0IHJlc3VsdHM6IE1hcmtldEVudHJ5W10gPSBbXVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdHMgPSBhd2FpdCB0aGlzLnNlYXJjaCh3aXNoZWQsIHBhZ2UpXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IGUgYXMgSlF1ZXJ5WEhSXG4gICAgICAgICAgQ29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHNlYXJjaCBmb3IgXCIke3dpc2hlZC5uYW1lfVwiYCwgZXJyb3IpXG4gICAgICAgICAgdGhpcy5zZXRFcnJvcih3aXNoZWQuaWNvbiwgYCR7ZXJyb3Iuc3RhdHVzVGV4dH1gKVxuICAgICAgICAgIGJyZWFrIGZvcnBhZ2VcbiAgICAgICAgfVxuXG4gICAgICAgIGFtb3VudCA9IHJlc3VsdHMubGVuZ3RoXG4gICAgICAgIENvbnNvbGUubG9nKGBGb3VuZCAke2Ftb3VudH0gcmVzdWx0c2AsIHJlc3VsdHMpXG5cbiAgICAgICAgY29uc3Qgd2FudGVkID0gcmVzdWx0cy5maWx0ZXIoXG4gICAgICAgICAgcmVzdWx0ID0+XG4gICAgICAgICAgICByZXN1bHQuaWNvbiA9PT0gd2lzaGVkLmljb24gJiZcbiAgICAgICAgICAgIHJlc3VsdC5idXlOb3dQcmljZSAmJlxuICAgICAgICAgICAgTnVtYmVyKHJlc3VsdC5idXlOb3dQcmljZS5wcmljZSkgPD0gd2lzaGVkLnByaWNlICYmXG4gICAgICAgICAgICBOdW1iZXIocmVzdWx0LmJ1eU5vd1ByaWNlLnByaWNlKSA8PSB0aGlzLmN1cnJlbnRNYWFuYVxuICAgICAgICApXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHdhbnRlZCkge1xuICAgICAgICAgIGlmICghKGF3YWl0IHRoaXMuYnV5KHJlc3VsdCkpKSBicmVhayBmb3JwYWdlXG5cbiAgICAgICAgICBMb2NhbFN0b3JhZ2UucHVyY2hhc2VzID0gW1xuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgLi4uTG9jYWxTdG9yYWdlLnB1cmNoYXNlcy5maWx0ZXIoXG4gICAgICAgICAgICAgIHB1cmNoYXNlID0+IHB1cmNoYXNlLml0ZW1pZCAhPT0gcmVzdWx0Lml0ZW1pZFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBdXG5cbiAgICAgICAgICBDb25zb2xlLmluZm8oXG4gICAgICAgICAgICBgQm91Z2h0IFwiJHtyZXN1bHQubmFtZX1cIiBmb3IgJHtOdW1iZXIoXG4gICAgICAgICAgICAgIHJlc3VsdC5idXlOb3dQcmljZT8ucHJpY2VcbiAgICAgICAgICAgICl9IG1hYW5hcy5gLFxuICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgKVxuXG4gICAgICAgICAgJC5mbGF2ck5vdGlmKFxuICAgICAgICAgICAgaWNvbk1lc3NhZ2UucmVuZGVyKHtcbiAgICAgICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0cmFuc2xhdGUudGFrZW92ZXIuYm91Z2h0KFxuICAgICAgICAgICAgICAgIHJlc3VsdC5uYW1lLFxuICAgICAgICAgICAgICAgIE51bWJlcihyZXN1bHQuYnV5Tm93UHJpY2U/LnByaWNlKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXJjaGFzZSBhbiBpdGVtIGZyb20gdGhlIG1hcmtldC5cbiAgICogQHJldHVybnMgd2hldGhlciB0aGUgaXRlbSB3YXMgc3VjY2Vzc2Z1bGx5IHB1cmNoYXNlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnV5KHJlc3VsdDogTWFya2V0RW50cnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgYnV5KE51bWJlcihyZXN1bHQuaXRlbWlkKSlcbiAgICBpZiAoanNvbi5yZXN1bHQgIT09IFwic3VjY2Vzc1wiKSB0aGlzLnNldEVycm9yKHJlc3VsdC5pY29uLCBqc29uLmRhdGEpXG4gICAgcmV0dXJuIGpzb24ucmVzdWx0ID09PSBcInN1Y2Nlc3NcIlxuICB9XG5cbiAgLyoqIFNlYXJjaCBmb3IgYSB3aXNoZWQgaXRlbSBvbiBhIHNwZWNpZmljIHBhZ2UgdXNpbmcgdGhlIGl0ZW0ncyBuYW1lLiAqL1xuICBwcml2YXRlIGFzeW5jIHNlYXJjaCh3aXNoZWQ6IFdpc2hlZEl0ZW0sIHBhZ2UgPSAxKTogUHJvbWlzZTxNYXJrZXRFbnRyeVtdPiB7XG4gICAgLy8gUHV0IHRoZSBuYW1lIG9mIHRoZSBpdGVtIGluIHRoZSBmaWx0ZXJcbiAgICBjb25zdCBmaWx0ZXJJdGVtTmFtZSA9XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFwiI2ZpbHRlci1pdGVtTmFtZVwiKVxuICAgIGlmIChmaWx0ZXJJdGVtTmFtZSkgZmlsdGVySXRlbU5hbWUudmFsdWUgPSB3aXNoZWQubmFtZVxuXG4gICAgLy8gU2hvdyB0aGUgcmVzdWx0cyBvZiB0aGUgc2VhcmNoXG4gICAgY29uc3QgbWFya2V0cGxhY2VTZWFyY2hJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBcIi5tYXJrZXRwbGFjZS1zZWFyY2gtaXRlbXNcIlxuICAgIClcbiAgICBpZiAoIW1hcmtldHBsYWNlU2VhcmNoSXRlbXMpIHJldHVybiBbXVxuICAgIG1hcmtldHBsYWNlU2VhcmNoSXRlbXMuaW5uZXJIVE1MID0gYXdhaXQgYWpheFNlYXJjaCh7XG4gICAgICBuYW1lOiB3aXNoZWQubmFtZSxcbiAgICAgIHBhZ2UsXG4gICAgfSlcblxuICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgbWFya2V0cGxhY2VTZWFyY2hJdGVtcy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxMSUVsZW1lbnQ+KFxuICAgICAgICBcIi5tYXJrZXRwbGFjZS1zZWFyY2gtaXRlbVwiXG4gICAgICApXG4gICAgKVxuICAgICAgLm1hcChnZXRJdGVtRGV0YWlscylcbiAgICAgIC5maWx0ZXI8TWFya2V0RW50cnk+KChpdGVtKTogaXRlbSBpcyBNYXJrZXRFbnRyeSA9PiBpdGVtICE9PSBudWxsKVxuICB9XG5cbiAgLyoqIFNldCB0aGUgYFdpc2hlZEl0ZW0uZXJyb3JgIHByb3BlcnR5IHdpdGhvdXQgcmVvcmRlcmluZyB0aGUgd2lzaGxpc3QuICovXG4gIHByaXZhdGUgc2V0RXJyb3IoaWNvbjogc3RyaW5nLCBlcnJvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgd2lzaGxpc3QgPSBMb2NhbFN0b3JhZ2Uud2lzaGxpc3RcbiAgICBjb25zdCBpbmRleCA9IHdpc2hsaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWNvbiA9PT0gaWNvbilcbiAgICBjb25zdCBlbnRyeSA9IHdpc2hsaXN0W2luZGV4XVxuICAgIGlmICghZW50cnkpIHJldHVyblxuXG4gICAgZW50cnkuZXJyb3IgPSBlcnJvclxuICAgIExvY2FsU3RvcmFnZS53aXNobGlzdCA9IFtcbiAgICAgIC4uLndpc2hsaXN0LnNsaWNlKHVuZGVmaW5lZCwgaW5kZXgpLFxuICAgICAgZW50cnksXG4gICAgICAuLi53aXNobGlzdC5zbGljZShpbmRleCArIDEsIHVuZGVmaW5lZCksXG4gICAgXVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBCdXlBY3Rpb24oKVxuIiwiaW1wb3J0IHsgVGFrZW92ZXJBY3Rpb24gfSBmcm9tIFwiLi4vLi4vc2Vzc2lvbl9zdG9yYWdlL3Rha2VvdmVyX2FjdGlvbi5lbnVtXCJcbmltcG9ydCB7IHJlc2V0VGFrZW92ZXIgfSBmcm9tIFwiLi4vYnJhaW5cIlxuaW1wb3J0IHsgY2xpY2sgfSBmcm9tIFwiLi4vY2xpY2tcIlxuaW1wb3J0IHR5cGUgeyBBY3Rpb24gfSBmcm9tIFwiLi9hY3Rpb25cIlxuXG5jbGFzcyBEYWlseUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbiB7XG4gIHJlYWRvbmx5IGtleSA9IFRha2VvdmVyQWN0aW9uLmRhaWx5XG5cbiAgLyoqIENoZWNrcyBpZiB0aGUgZGFpbHkgbWFhbmEgZ2lmdCBpZiB0aGVyZS4gKi9cbiAgY29uZGl0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhaWx5R2lmdENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGFpbHktZ2lmdC1jb250YWluZXJcIilcbiAgICByZXR1cm4gKFxuICAgICAgISFkYWlseUdpZnRDb250YWluZXIgJiZcbiAgICAgIGdldENvbXB1dGVkU3R5bGUoZGFpbHlHaWZ0Q29udGFpbmVyKS5kaXNwbGF5ICE9PSBcIm5vbmVcIlxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGljayBvbiB0aGUgZGFpbHkgbWFhbmEgZ2lmdC5cbiAgICogQHJldHVybnMgYGZhbHNlYC4gVGhpcyBhY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBtZWFuaW5nZnVsIGFjdGlvbnMgb24gdGhlXG4gICAqIHBhZ2UuXG4gICAqL1xuICBhc3luYyBwZXJmb3JtKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGRhaWx5R2lmdENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGFpbHktZ2lmdC1jb250YWluZXJcIilcbiAgICBpZiAoXG4gICAgICAhZGFpbHlHaWZ0Q29udGFpbmVyIHx8XG4gICAgICBnZXRDb21wdXRlZFN0eWxlKGRhaWx5R2lmdENvbnRhaW5lcikuZGlzcGxheSA9PT0gXCJub25lXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGRhaWx5R2lmdENvbnRhaW5lci5jbGljaygpXG4gICAgYXdhaXQgY2xpY2s8SFRNTEJ1dHRvbkVsZW1lbnQ+KFwiLmZpcnN0LWNvbm5leGlvbiAuZmxhdnItYnV0dG9uLmRlZmF1bHRcIilcblxuICAgIHJlc2V0VGFrZW92ZXIoKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBEYWlseUFjdGlvbigpXG4iLCJpbXBvcnQgeyBjYXB0dXJlRW5kIH0gZnJvbSBcIi4uLy4uL2FqYXgvY2FwdHVyZV9lbmRcIlxuaW1wb3J0IHsgY2hhbmdlUmVnaW9uIH0gZnJvbSBcIi4uLy4uL2FqYXgvY2hhbmdlX3JlZ2lvblwiXG5pbXBvcnQgeyBleHBsb3JhdGlvblJlc3VsdHMgfSBmcm9tIFwiLi4vLi4vYWpheC9leHBsb3JhdGlvbl9yZXN1bHRzXCJcbmltcG9ydCB7IFJlc3VsdCB9IGZyb20gXCIuLi8uLi9hcGkvcmVzdWx0LmVudW1cIlxuaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi8uLi9jb25zb2xlXCJcbmltcG9ydCB7IER1cmF0aW9uVW5pdCB9IGZyb20gXCIuLi8uLi9kdXJhdGlvblwiXG5pbXBvcnQgdHlwZSB7IE1hcFJlZ2lvbiwgU2Vhc29uIH0gZnJvbSBcIi4uLy4uL2VsZGFyeWEvY3VycmVudF9yZWdpb25cIlxuaW1wb3J0IHR5cGUgeyBQZW5kaW5nVHJlYXN1cmVIdW50TG9jYXRpb24gfSBmcm9tIFwiLi4vLi4vZWxkYXJ5YS90cmVhc3VyZVwiXG5pbXBvcnQgdHlwZSB7IEF1dG9FeHBsb3JlTG9jYXRpb24gfSBmcm9tIFwiLi4vLi4vbG9jYWxfc3RvcmFnZS9hdXRvX2V4cGxvcmVfbG9jYXRpb25cIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5pbXBvcnQgeyBTZXNzaW9uU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9zZXNzaW9uX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlXCJcbmltcG9ydCB7IFRha2VvdmVyQWN0aW9uIH0gZnJvbSBcIi4uLy4uL3Nlc3Npb25fc3RvcmFnZS90YWtlb3Zlcl9hY3Rpb24uZW51bVwiXG5pbXBvcnQgeyBjbGljayB9IGZyb20gXCIuLi9jbGlja1wiXG5pbXBvcnQgeyBFeHBsb3JhdGlvblN0YXR1cyB9IGZyb20gXCIuLi9leHBsb3JhdGlvbl9zdGF0dXMuZW51bVwiXG5pbXBvcnQgdHlwZSB7IFN0YXJ0RXhwbG9yYXRpb24gfSBmcm9tIFwiLi4vc3RhcnRfZXhwbG9yYXRpb25cIlxuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9uXCJcblxuY2xhc3MgRXhwbG9yYXRpb25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24ge1xuICByZWFkb25seSBrZXkgPSBUYWtlb3ZlckFjdGlvbi5leHBsb3JhdGlvbnNcblxuICBwcml2YXRlIGdldCBnbG9iYWxzKCk6IHtcbiAgICBjdXJyZW50UmVnaW9uOiBNYXBSZWdpb25cbiAgICBwZW5kaW5nVHJlYXN1cmVIdW50TG9jYXRpb246IFBlbmRpbmdUcmVhc3VyZUh1bnRMb2NhdGlvbiB8IG51bGxcbiAgICB0aW1lTGVmdEV4cGxvcmF0aW9uOiBudW1iZXIgfCBudWxsXG4gIH0ge1xuICAgIHJldHVybiB7IGN1cnJlbnRSZWdpb24sIHBlbmRpbmdUcmVhc3VyZUh1bnRMb2NhdGlvbiwgdGltZUxlZnRFeHBsb3JhdGlvbiB9XG4gIH1cblxuICBjb25kaXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIExvY2FsU3RvcmFnZS5leHBsb3JhdGlvbnMgJiZcbiAgICAgICFTZXNzaW9uU3RvcmFnZS5leHBsb3JhdGlvbnNEb25lICYmXG4gICAgICAhIUxvY2FsU3RvcmFnZS5hdXRvRXhwbG9yZUxvY2F0aW9ucy5sZW5ndGhcbiAgICApXG4gIH1cblxuICBhc3luYyBwZXJmb3JtKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChsb2NhdGlvbi5wYXRobmFtZSAhPT0gXCIvcGV0XCIpIHtcbiAgICAgIHBhZ2VMb2FkKFwiL3BldFwiKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmdldEV4cGxvcmF0aW9uU3RhdHVzKClcbiAgICBDb25zb2xlLmxvZyhcIkV4cGxvcmF0aW9uIHN0YXR1czpcIiwgRXhwbG9yYXRpb25TdGF0dXNbc3RhdHVzXSlcbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSBFeHBsb3JhdGlvblN0YXR1cy5pZGxlOlxuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLnN0YXJ0RXhwbG9yYXRpb24oKSkuc2VsZWN0ZWQpXG4gICAgICAgICAgU2Vzc2lvblN0b3JhZ2UuZXhwbG9yYXRpb25zRG9uZSA9IHRydWVcbiAgICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGNhc2UgRXhwbG9yYXRpb25TdGF0dXMucGVuZGluZzpcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLndhaXRFeHBsb3JhdGlvbigpKSAmJiB0aGlzLnBlcmZvcm0oKVxuXG4gICAgICBjYXNlIEV4cGxvcmF0aW9uU3RhdHVzLnJlc3VsdDpcbiAgICAgICAgYXdhaXQgdGhpcy5lbmRFeHBsb3JhdGlvbigpXG4gICAgICAgIHJldHVybiB0aGlzLnBlcmZvcm0oKVxuXG4gICAgICBjYXNlIEV4cGxvcmF0aW9uU3RhdHVzLmNhcHR1cmU6XG4gICAgICAgIGF3YWl0IHRoaXMuZW5kQ2FwdHVyZSgpXG4gICAgICAgIHJldHVybiB0aGlzLnBlcmZvcm0oKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNsaWNrRXhwbG9yZSgpOiBQcm9taXNlPEhUTUxCdXR0b25FbGVtZW50PiB7XG4gICAgcmV0dXJuIGNsaWNrKFwiI2V4cGxvcmUtYnV0dG9uXCIpXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNsaWNrTG9jYXRpb24oXG4gICAgc2VsZWN0ZWQ6IEF1dG9FeHBsb3JlTG9jYXRpb25cbiAgKTogUHJvbWlzZTxIVE1MRGl2RWxlbWVudD4ge1xuICAgIHJldHVybiBjbGljazxIVE1MRGl2RWxlbWVudD4oXG4gICAgICBgLm1hcC1sb2NhdGlvbltkYXRhLWlkPVwiJHtzZWxlY3RlZC5sb2NhdGlvbi5pZH1cIl1gXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBjbGlja1JlZ2lvbihzZWxlY3RlZDogQXV0b0V4cGxvcmVMb2NhdGlvbik6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgICBgLm1pbmltYXBbZGF0YS1tYXBpZD1cIiR7c2VsZWN0ZWQucmVnaW9uLmlkfVwiXWBcbiAgICApXG5cbiAgICBpZiAoIWRpdikge1xuICAgICAgLy8gQ2xlYXJpbmcgaW52YWxpZCByZWdpb25zIGlzIHVzZWZ1bCB0byByZW1vdmUgZmluaXNoZWQgZXZlbnRzLlxuICAgICAgTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zID1cbiAgICAgICAgTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zLmZpbHRlcihcbiAgICAgICAgICBzYXZlZCA9PiBzYXZlZC5yZWdpb24uaWQgIT09IHNlbGVjdGVkLnJlZ2lvbi5pZFxuICAgICAgICApXG5cbiAgICAgIFNlc3Npb25TdG9yYWdlLnNlbGVjdGVkTG9jYXRpb24gPSBudWxsXG4gICAgICBwYWdlTG9hZChcIi9wZXRcIilcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgZGl2LmNsaWNrKClcbiAgICByZXR1cm4gZGl2XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNsaWNrU2Vhc29uKCk6IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD4ge1xuICAgIHJldHVybiBjbGljazxIVE1MSW1hZ2VFbGVtZW50PihcIiNjcnlzdGFsLWltYWdlcy1jb250YWluZXJcIilcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5kQ2FwdHVyZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdm9pZCBuZXcgQXVkaW8oXG4gICAgICAgIFwiL3N0YXRpYy9ldmVudC8yMDIxL211c2ljL3NvdW5kcy9taXNzaW9uLWNvbXBsZXRlLm1wM1wiXG4gICAgICApLnBsYXkoKVxuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICAgIH1cblxuICAgIGF3YWl0IGNsaWNrPEhUTUxCdXR0b25FbGVtZW50PihcIiNvcGVuLWNhcHR1cmUtaW50ZXJmYWNlXCIpXG4gICAgYXdhaXQgY2xpY2s8SFRNTEJ1dHRvbkVsZW1lbnQ+KFwiI2NhcHR1cmUtYnV0dG9uXCIpXG4gICAgYXdhaXQgY2xpY2s8SFRNTEJ1dHRvbkVsZW1lbnQ+KFwiI2Nsb3NlLXJlc3VsdFwiKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbmRFeHBsb3JhdGlvbigpOiBQcm9taXNlPEhUTUxEaXZFbGVtZW50PiB7XG4gICAgcmV0dXJuIGNsaWNrKFwiI2Nsb3NlLXJlc3VsdFwiKVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDdXJyZW50U2Vhc29uKCk6IFNlYXNvbiB7XG4gICAgcmV0dXJuIChBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJib2R5XCIpPy5jbGFzc0xpc3QgPz8gW10pXG4gICAgICAuZmluZChjID0+IGMuc3RhcnRzV2l0aChcInNlYXNvbi1cIikpXG4gICAgICA/LnJlcGxhY2UoXCJzZWFzb24tXCIsIFwiXCIpID8/IG51bGwpIGFzIFNlYXNvblxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHBsb3JhdGlvblN0YXR1cygpOiBFeHBsb3JhdGlvblN0YXR1cyB7XG4gICAgaWYgKFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCIjdHJlYXN1cmUtaHVudC1yZXN1bHQtb3ZlcmxheS5hY3RpdmUgI29wZW4tY2FwdHVyZS1pbnRlcmZhY2VcIlxuICAgICAgKSB8fFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjYXB0dXJlLWludGVyZmFjZS1vdXRlci5hY3RpdmVcIilcbiAgICApIHtcbiAgICAgIHJldHVybiBFeHBsb3JhdGlvblN0YXR1cy5jYXB0dXJlXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjcGVuZGluZy1tYXAtbG9jYXRpb24tZGF0YS1vdXRlci5hY3RpdmVcIikgfHxcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjbWFwLWNvbnRhaW5lci5wZW5kaW5nXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gRXhwbG9yYXRpb25TdGF0dXMucGVuZGluZ1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiN0cmVhc3VyZS1odW50LXJlc3VsdC1vdmVybGF5LmFjdGl2ZVwiKSlcbiAgICAgIHJldHVybiBFeHBsb3JhdGlvblN0YXR1cy5yZXN1bHRcbiAgICByZXR1cm4gRXhwbG9yYXRpb25TdGF0dXMuaWRsZVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb3dlc3RFbmVyZ3lMb2NhdGlvbigpOiBBdXRvRXhwbG9yZUxvY2F0aW9uIHtcbiAgICByZXR1cm4gTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zLnJlZHVjZSgobG93ZXN0LCBwbGFjZSkgPT5cbiAgICAgIE51bWJlcihwbGFjZS5sb2NhdGlvbi5lbmVyZ3lSZXF1aXJlZCkgPFxuICAgICAgTnVtYmVyKGxvd2VzdC5sb2NhdGlvbi5lbmVyZ3lSZXF1aXJlZClcbiAgICAgICAgPyBwbGFjZVxuICAgICAgICA6IGxvd2VzdFxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRMb2NhdGlvbigpOiBBdXRvRXhwbG9yZUxvY2F0aW9uIHwgbnVsbCB7XG4gICAgbGV0IHNlbGVjdGVkID0gU2Vzc2lvblN0b3JhZ2Uuc2VsZWN0ZWRMb2NhdGlvblxuICAgIGlmICghc2VsZWN0ZWQpIHtcbiAgICAgIHNlbGVjdGVkID0gdGhpcy5zZWxlY3RMb2NhdGlvbigpXG4gICAgICBTZXNzaW9uU3RvcmFnZS5zZWxlY3RlZExvY2F0aW9uID0gc2VsZWN0ZWRcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0TG9jYXRpb24oKTogQXV0b0V4cGxvcmVMb2NhdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IGFmZm9yZGFibGUgPSBMb2NhbFN0b3JhZ2UuYXV0b0V4cGxvcmVMb2NhdGlvbnMuZmlsdGVyKFxuICAgICAgc2F2ZWQgPT4gTnVtYmVyKHNhdmVkLmxvY2F0aW9uLmVuZXJneVJlcXVpcmVkKSA8PSBwZXRFbmVyZ3lcbiAgICApXG5cbiAgICBjb25zdCBtaW5pbXVtRW5lcmd5ID0gdGhpcy5nZXRMb3dlc3RFbmVyZ3lMb2NhdGlvbigpXG4gICAgY29uc3Qgbm90RGVhZEVuZCA9IGFmZm9yZGFibGUuZmlsdGVyKFxuICAgICAgcGxhY2UgPT5cbiAgICAgICAgcGV0RW5lcmd5IC0gTnVtYmVyKHBsYWNlLmxvY2F0aW9uLmVuZXJneVJlcXVpcmVkKSA+PVxuICAgICAgICBOdW1iZXIobWluaW11bUVuZXJneS5sb2NhdGlvbi5lbmVyZ3lSZXF1aXJlZClcbiAgICApXG4gICAgaWYgKG5vdERlYWRFbmQubGVuZ3RoKVxuICAgICAgcmV0dXJuIG5vdERlYWRFbmRbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm90RGVhZEVuZC5sZW5ndGgpXSA/PyBudWxsXG5cbiAgICBjb25zdCBzYW1lRW5lcmd5ID0gYWZmb3JkYWJsZS5maWx0ZXIoXG4gICAgICBwbGFjZSA9PiBOdW1iZXIocGxhY2UubG9jYXRpb24uZW5lcmd5UmVxdWlyZWQpID09PSBwZXRFbmVyZ3lcbiAgICApXG4gICAgaWYgKHNhbWVFbmVyZ3kubGVuZ3RoKVxuICAgICAgcmV0dXJuIHNhbWVFbmVyZ3lbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogc2FtZUVuZXJneS5sZW5ndGgpXSA/PyBudWxsXG5cbiAgICByZXR1cm4gYWZmb3JkYWJsZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhZmZvcmRhYmxlLmxlbmd0aCldID8/IG51bGxcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3RhcnRFeHBsb3JhdGlvbigpOiBQcm9taXNlPFN0YXJ0RXhwbG9yYXRpb24+IHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuZ2V0U2VsZWN0ZWRMb2NhdGlvbigpXG4gICAgaWYgKCFzZWxlY3RlZCkgcmV0dXJuIHsgZXhwbG9yaW5nOiBmYWxzZSwgc2VsZWN0ZWQgfVxuICAgIENvbnNvbGUuaW5mbyhcIkV4cGxvcmluZ1wiLCBzZWxlY3RlZClcblxuICAgIC8vIEdvIHRvIHNlYXNvblxuICAgIGlmIChcbiAgICAgIHNlbGVjdGVkLnJlZ2lvbi5zZWFzb24gJiZcbiAgICAgIHRoaXMuZ2V0Q3VycmVudFNlYXNvbigpICE9PSBzZWxlY3RlZC5yZWdpb24uc2Vhc29uXG4gICAgKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsaWNrU2Vhc29uKClcbiAgICAgIHJldHVybiB7IGV4cGxvcmluZzogZmFsc2UsIHNlbGVjdGVkIH1cbiAgICB9XG5cbiAgICAvLyBHbyB0byByZWdpb25cbiAgICB0aGlzLmNsaWNrUmVnaW9uKHNlbGVjdGVkKVxuXG4gICAgLy8gR28gdG8gbG9jYXRpb25cbiAgICBhd2FpdCB0aGlzLmNsaWNrTG9jYXRpb24oc2VsZWN0ZWQpXG4gICAgYXdhaXQgdGhpcy5jbGlja0V4cGxvcmUoKVxuXG4gICAgU2Vzc2lvblN0b3JhZ2Uuc2VsZWN0ZWRMb2NhdGlvbiA9IG51bGxcbiAgICByZXR1cm4geyBleHBsb3Jpbmc6IHRydWUsIHNlbGVjdGVkIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0IGZvciB1cCB0byAxMCBtaW51dGVzLlxuICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBleHBsb3JhdGlvbiBpcyBmaW5pc2hlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEV4cGxvcmF0aW9uKFxuICAgIHNlbGVjdGVkPzogQXV0b0V4cGxvcmVMb2NhdGlvblxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBkb2N1bWVudFxuICAgICAgLnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFxuICAgICAgICBgLm1pbmltYXBbZGF0YS1tYXBpZD1cIiR7c2VsZWN0ZWQ/LnJlZ2lvbi5pZCA/PyBjdXJyZW50UmVnaW9uLmlkfVwiXWBcbiAgICAgIClcbiAgICAgID8uY2xpY2soKVxuXG4gICAgbGV0IG1zID0gMyAqIER1cmF0aW9uVW5pdC5zZWNvbmRcbiAgICBpZiAoc2VsZWN0ZWQpIG1zICs9IHNlbGVjdGVkLmxvY2F0aW9uLnRpbWVUb0V4cGxvcmUgKiBEdXJhdGlvblVuaXQubWludXRlXG4gICAgZWxzZSBpZiAodGltZUxlZnRFeHBsb3JhdGlvbiAmJiB0aW1lTGVmdEV4cGxvcmF0aW9uID4gMClcbiAgICAgIG1zICs9IHRpbWVMZWZ0RXhwbG9yYXRpb24gKiBEdXJhdGlvblVuaXQuc2Vjb25kXG4gICAgZWxzZSBpZiAoXG4gICAgICAhcGVuZGluZ1RyZWFzdXJlSHVudExvY2F0aW9uICYmXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI21hcC1jb250YWluZXIucGVuZGluZ1wiKVxuICAgICkge1xuICAgICAgY29uc3QganNvbiA9IGF3YWl0IGV4cGxvcmF0aW9uUmVzdWx0cygpXG4gICAgICBpZiAoanNvbi5yZXN1bHQgIT09IFJlc3VsdC5zdWNjZXNzKSByZXR1cm4gZmFsc2VcblxuICAgICAgY29uc3QgY2FwdHVyZSA9IGpzb24uZGF0YS5yZXN1bHRzLmZpbmQoXG4gICAgICAgIHJlc3VsdCA9PiByZXN1bHQudHlwZSA9PT0gXCJjYXB0dXJlXCJcbiAgICAgIClcbiAgICAgIGlmICghY2FwdHVyZSkgcmV0dXJuIGZhbHNlXG4gICAgICBhd2FpdCBjYXB0dXJlRW5kKClcblxuICAgICAgLy8gUmVsb2FkaW5nIGlzIHRoZSBvbmx5IHBvc3NpYmxlIGFjdGlvbiBpZiB0aGUgZXhwbG9yYXRpb24gZmluaXNoZWQgaW4gYVxuICAgICAgLy8gZGlmZmVyZW50IHJlZ2lvbi5cbiAgICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwiUmVsb2FkaW5nIGJlY2F1c2UgdGhlIGV4cGxvcmF0aW9uIGlzIGluIGFub3RoZXIgcmVnaW9uLlwiLFxuICAgICAgICB0aGlzLmdsb2JhbHNcbiAgICAgIClcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBEdXJhdGlvblVuaXQubWludXRlKSlcbiAgICAgIHBhZ2VMb2FkKFwiL3BldFwiKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAobXMgPiAxMCAqIER1cmF0aW9uVW5pdC5taW51dGUpIHJldHVybiBmYWxzZVxuXG4gICAgQ29uc29sZS5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgdGhlIGV4cGxvcmF0aW9uIHRvIGVuZCBpbiAke01hdGguY2VpbChcbiAgICAgICAgbXMgLyBEdXJhdGlvblVuaXQuc2Vjb25kXG4gICAgICApfSBzZWNvbmRzLi4uYCxcbiAgICAgIHRoaXMuZ2xvYmFsc1xuICAgIClcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuICAgIGF3YWl0IGNoYW5nZVJlZ2lvbihOdW1iZXIoc2VsZWN0ZWQ/LnJlZ2lvbi5pZCA/PyBjdXJyZW50UmVnaW9uLmlkKSlcblxuICAgIGlmIChcbiAgICAgIHRoaXMuZ2V0RXhwbG9yYXRpb25TdGF0dXMoKSA9PT0gRXhwbG9yYXRpb25TdGF0dXMucGVuZGluZyAmJlxuICAgICAgdGltZUxlZnRFeHBsb3JhdGlvbiAmJlxuICAgICAgdGltZUxlZnRFeHBsb3JhdGlvbiA8IDBcbiAgICApIHtcbiAgICAgIENvbnNvbGUuaW5mbyhcbiAgICAgICAgXCJSZWxvYWRpbmcgYmVjYXVzZSB0aGUgdGltZXIgaXMgZGVzeW5jaHJvbmlzZWQuXCIsXG4gICAgICAgIHRoaXMuZ2xvYmFsc1xuICAgICAgKVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIER1cmF0aW9uVW5pdC5zZWNvbmQpKVxuICAgICAgcGFnZUxvYWQoXCIvcGV0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgRXhwbG9yYXRpb25BY3Rpb24oKVxuIiwiaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi8uLi9jb25zb2xlXCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuaW1wb3J0IHsgcGxheUZsYXBweSwgcGxheUhhdGNobGluZ3MsIHBsYXlQZWdnbGUgfSBmcm9tIFwiLi4vLi4vbWluaWdhbWVzL2VtaWxlXCJcbmltcG9ydCB7IGZsYXBweSB9IGZyb20gXCIuLi8uLi9taW5pZ2FtZXMvZmxhcHB5XCJcbmltcG9ydCB7IGhhdGNobGluZ3MgfSBmcm9tIFwiLi4vLi4vbWluaWdhbWVzL2hhdGNobGluZ3NcIlxuaW1wb3J0IHR5cGUgeyBNaW5pZ2FtZSB9IGZyb20gXCIuLi8uLi9taW5pZ2FtZXMvbWluaWdhbWVcIlxuaW1wb3J0IHsgcGVnZ2xlIH0gZnJvbSBcIi4uLy4uL21pbmlnYW1lcy9wZWdnbGVcIlxuaW1wb3J0IHsgU2Vzc2lvblN0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vc2Vzc2lvbl9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZVwiXG5pbXBvcnQgeyBUYWtlb3ZlckFjdGlvbiB9IGZyb20gXCIuLi8uLi9zZXNzaW9uX3N0b3JhZ2UvdGFrZW92ZXJfYWN0aW9uLmVudW1cIlxuaW1wb3J0IHR5cGUgeyBBY3Rpb24gfSBmcm9tIFwiLi9hY3Rpb25cIlxuXG5jbGFzcyBNaW5pZ2FtZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbiB7XG4gIHJlYWRvbmx5IGtleSA9IFRha2VvdmVyQWN0aW9uLm1pbmlnYW1lc1xuXG4gIGNvbmRpdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gTG9jYWxTdG9yYWdlLm1pbmlnYW1lcyAmJiAhU2Vzc2lvblN0b3JhZ2UubWluaWdhbWVzRG9uZVxuICB9XG5cbiAgLyoqIERldGVybWluZXMgaWYgdGhlIG1pbmlnYW1lcyBzaG91bGQgYmUgcGxheWVkIHJpZ2h0IG5vdy5cbiAgICogQHJldHVybnMgd2hldGhlciB0aGUgbWluaWdhbWVzIGFyZSBjdXJyZW50bHkgYmVpbmcgcGxheWVkLlxuICAgKi9cbiAgYXN5bmMgcGVyZm9ybSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBzd2l0Y2ggKGxvY2F0aW9uLnBhdGhuYW1lKSB7XG4gICAgICBjYXNlIFwiL21pbmlnYW1lc1wiOiB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA3NTApKVxuICAgICAgICBjb25zdCBwbGF5aW5nID1cbiAgICAgICAgICB0aGlzLm9wZW5NaW5pZ2FtZShwZWdnbGUpIHx8XG4gICAgICAgICAgdGhpcy5vcGVuTWluaWdhbWUoZmxhcHB5KSB8fFxuICAgICAgICAgIHRoaXMub3Blbk1pbmlnYW1lKGhhdGNobGluZ3MpXG5cbiAgICAgICAgaWYgKCFwbGF5aW5nKSB7XG4gICAgICAgICAgU2Vzc2lvblN0b3JhZ2UubWluaWdhbWVzRG9uZSA9IHRydWVcbiAgICAgICAgICBkb2N1bWVudFxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3I8SFRNTEJ1dHRvbkVsZW1lbnQ+KFxuICAgICAgICAgICAgICAnLm1pbmlnYW1lcy1ydWxlcyBbcmVsPVwiYnRuLWNhbmNlbFwiXSdcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgID8uY2xpY2soKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBsYXlpbmdcbiAgICAgIH1cblxuICAgICAgY2FzZSBcIi9taW5pZ2FtZXMvZ2VtYm9tYlwiOlxuICAgICAgICBhd2FpdCBwbGF5UGVnZ2xlKClcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBcIi9taW5pZ2FtZXMvYnViYmx0ZW1wbGVcIjpcbiAgICAgICAgYXdhaXQgcGxheUZsYXBweSgpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgXCIvbWluaWdhbWVzL2NvY29vbmlucGlja1wiOlxuICAgICAgICBhd2FpdCBwbGF5SGF0Y2hsaW5ncygpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHBhZ2VMb2FkKFwiL21pbmlnYW1lc1wiKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHBhZ2VMb2FkKFwiL21pbmlnYW1lc1wiKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQ2xpY2sgb24gYSBtaW5pZ2FtZSdzIGxpbmsuIEByZXR1cm5zIHdoZXRoZXIgdGhlIG1pbmlnYW1lIHdhcyBvcGVuZWQuICovXG4gIHByaXZhdGUgb3Blbk1pbmlnYW1lKG1pbmlnYW1lOiBNaW5pZ2FtZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MU3BhbkVsZW1lbnQ+KFxuICAgICAgbWluaWdhbWUuYnV0dG9uU2VsZWN0b3JcbiAgICApXG5cbiAgICBDb25zb2xlLmRlYnVnKGAke21pbmlnYW1lLm5hbWV9J3MgYnV0dG9uOmAsIHN0YXJ0KVxuICAgIGlmICghc3RhcnQpIHJldHVybiBmYWxzZVxuXG4gICAgc3RhcnQuY2xpY2soKVxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IE1pbmlnYW1lQWN0aW9uKClcbiIsImltcG9ydCB7IENvbnNvbGUgfSBmcm9tIFwiLi4vLi4vY29uc29sZVwiXG5pbXBvcnQgeyBUYWtlb3ZlckFjdGlvbiB9IGZyb20gXCIuLi8uLi9zZXNzaW9uX3N0b3JhZ2UvdGFrZW92ZXJfYWN0aW9uLmVudW1cIlxuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9uXCJcblxuY2xhc3MgV2FpdEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7XG4gIHJlYWRvbmx5IGtleSA9IFRha2VvdmVyQWN0aW9uLndhaXRcblxuICBjb25kaXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGFzeW5jIHBlcmZvcm0oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgQ29uc29sZS5sb2coYFdhaXRpbmcgZm9yIDEwIG1pbnV0ZXMuLi5gKVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KHJlc29sdmUgPT5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZShmYWxzZSksIDEwICogNjAgKiAxMDAwKVxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgV2FpdEFjdGlvbigpXG4iLCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xpY2s8VCBleHRlbmRzIEhUTUxFbGVtZW50PihcbiAgc2VsZWN0b3I6IHN0cmluZ1xuKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxUPihyZXNvbHZlID0+IHtcbiAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPFQ+KHNlbGVjdG9yKVxuICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm5cbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpXG5cbiAgICAgIC8vIFNvbWUgZWxlbWVudHMgZG9uJ3QgaGF2ZSB0aGVpciBjbGljayBoYW5kbGVycyByZWFkeSB1bnRpbCB0aGV5J3JlXG4gICAgICAvLyBob3ZlcmVkLlxuICAgICAgY29uc3QgbW91c2VFdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiTW91c2VFdmVudFwiKVxuICAgICAgbW91c2VFdmVudC5pbml0RXZlbnQoXCJtb3VzZW92ZXJcIilcbiAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChtb3VzZUV2ZW50KVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWxlbWVudC5jbGljaygpXG4gICAgICAgIHJlc29sdmUoZWxlbWVudClcbiAgICAgIH0sIDgwMClcbiAgICB9LCA4MDApXG4gIH0pXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0PFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4oXG4gIHNlbGVjdG9yOiBzdHJpbmdcbik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8VD4ocmVzb2x2ZSA9PiB7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxUPihzZWxlY3RvcilcbiAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuXG5cbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpXG4gICAgICByZXNvbHZlKGVsZW1lbnQpXG4gICAgfSwgODAwKVxuICB9KVxufVxuXG4vKipcbiAqIFVzZXMgYSBgTXV0YXRpb25PYnNlcnZlcmAgdG8gd2FpdCBmb3IgYW4gYEhUTUxFbGVtZW50YCBpbnNpZGUgYW5vdGhlclxuICogYEhUTUxFbGVtZW50YC4gVGltZW91dHMgYWZ0ZXIgMnMgYnkgZGVmYXVsdCwgYXQgd2hpY2ggcG9pbnQgdGhlcmUncyBwcm9iYWJseVxuICogYSBkZWVwZXIgcHJvYmxlbSBnb2luZyBvbi5cbiAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciB0byBvYnNlcnZlIGFuZCBmaW5kIHRoZSBgSFRNTEVsZW1lbnRgIGluXG4gKiBAcGFyYW0gc2VsZWN0b3IgVGhlIGFyZ3VtZW50IGZvciBgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3I8VD4oc2VsZWN0b3IpYFxuICogQHJldHVybnMgVGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyBhIGRlc2NlbmRhbnQgb2YgYGNvbnRhaW5lcmAgdGhhdCBtYXRjaGVzXG4gKiBgc2VsZWN0b3JgIG9yIGBudWxsYCBhZnRlciB0aGUgYHRpbWVvdXRgIGRlbGF5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdE9ic2VydmU8VCBleHRlbmRzIEhUTUxFbGVtZW50PihcbiAgY29udGFpbmVyOiBFbGVtZW50LFxuICBzZWxlY3Rvcjogc3RyaW5nLFxuICBtcyA9IDIwMDBcbik6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFQgfCBudWxsPihyZXNvbHZlID0+IHtcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKFxuICAgICAgKF9tdXRhdGlvbnM6IE11dGF0aW9uUmVjb3JkW10sIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyKSA9PlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3I8VD4oc2VsZWN0b3IpXG4gICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgICAgICAgICAgcmVzb2x2ZShlbGVtZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgMSlcbiAgICApXG5cbiAgICBvYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lciwgeyBjaGlsZExpc3Q6IHRydWUgfSlcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgICByZXNvbHZlKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yPFQ+KHNlbGVjdG9yKSlcbiAgICB9LCBtcylcbiAgfSlcblxuICByZXR1cm4gcHJvbWlzZVxufVxuIiwiZXhwb3J0IGVudW0gRXhwbG9yYXRpb25TdGF0dXMge1xuICBpZGxlLFxuICByZXN1bHQsXG4gIGNhcHR1cmUsXG4gIHBlbmRpbmcsXG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNFbnVtPFQ+KHZhbHVlOiB1bmtub3duLCBlbnVtZXJhdGlvbjogVCk6IHZhbHVlIGlzIFRba2V5b2YgVF0ge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhlbnVtZXJhdGlvbikuaW5jbHVkZXModmFsdWUpXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB0eXBlIHsgTWFya2V0SGlzdG9yeSB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9tYXJrZXRfaGlzdG9yeVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQXVjdGlvbnMoKTogdm9pZCB7XG4gIGlmIChsb2NhdGlvbi5wYXRobmFtZSAhPT0gXCIvbWFya2V0cGxhY2UvYXVjdGlvbnNcIikgcmV0dXJuXG5cbiAgY29uc3QgbWFya2V0cGxhY2VBY3RpdmVBdWN0aW9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFxuICAgIFwiI21hcmtldHBsYWNlLWFjdGl2ZS1hdWN0aW9uc1wiXG4gIClcbiAgaWYgKCFtYXJrZXRwbGFjZUFjdGl2ZUF1Y3Rpb25zKSByZXR1cm5cblxuICBjb25zdCBsYXlvdXQyY29sID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgXCIubWFya2V0cGxhY2UtbWFpbi1jb250YWluZXIgI2xheW91dC0yY29sXCJcbiAgKVxuICBpZiAobGF5b3V0MmNvbCkgbGF5b3V0MmNvbC5zdHlsZS5vdmVyZmxvd1ggPSBcInZpc2libGVcIlxuXG4gIGxvYWRIaXN0b3J5KG1hcmtldHBsYWNlQWN0aXZlQXVjdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGxvYWRIaXN0b3J5KG1hcmtldHBsYWNlQWN0aXZlQXVjdGlvbnM6IEhUTUxEaXZFbGVtZW50KTogdm9pZCB7XG4gIG1hcmtldHBsYWNlQWN0aXZlQXVjdGlvbnMucXVlcnlTZWxlY3RvcihcInN0eWxlXCIpPy5yZW1vdmUoKVxuICBtYXJrZXRwbGFjZUFjdGl2ZUF1Y3Rpb25zLnF1ZXJ5U2VsZWN0b3IoXCIjcHVyY2hhc2UtaGlzdG9yeVwiKT8ucmVtb3ZlKClcbiAgbWFya2V0cGxhY2VBY3RpdmVBdWN0aW9ucy5xdWVyeVNlbGVjdG9yKFwiI3NhbGUtaGlzdG9yeVwiKT8ucmVtb3ZlKClcblxuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvbWFya2V0X2hpc3RvcnkuaHRtbFwiKVxuICBjb25zdCBoaXN0b3J5OiBNYXJrZXRIaXN0b3J5ID0ge1xuICAgIHB1cmNoYXNlczogTG9jYWxTdG9yYWdlLnB1cmNoYXNlcy5tYXAocHVyY2hhc2UgPT4gKHtcbiAgICAgIC4uLnB1cmNoYXNlLFxuICAgICAgZGF0ZTogdHJhbnNsYXRlLm1hcmtldC5hdWN0aW9ucy5kYXRlX3RpbWVfZm9ybWF0LmZvcm1hdChcbiAgICAgICAgbmV3IERhdGUocHVyY2hhc2UuZGF0ZSlcbiAgICAgICksXG4gICAgfSkpLFxuICAgIHNhbGVzOiBMb2NhbFN0b3JhZ2Uuc2FsZXMubWFwKHNhbGUgPT4gKHtcbiAgICAgIC4uLnNhbGUsXG4gICAgICBkYXRlOiB0cmFuc2xhdGUubWFya2V0LmF1Y3Rpb25zLmRhdGVfdGltZV9mb3JtYXQuZm9ybWF0KFxuICAgICAgICBuZXcgRGF0ZShzYWxlLmRhdGUpXG4gICAgICApLFxuICAgIH0pKSxcbiAgfVxuXG4gIG1hcmtldHBsYWNlQWN0aXZlQXVjdGlvbnMuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgdGVtcGxhdGUucmVuZGVyKHsgLi4uaGlzdG9yeSwgdHJhbnNsYXRlIH0pXG4gIClcblxuICBmb3IgKGNvbnN0IHB1cmNoYXNlIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTExJRWxlbWVudD4oXG4gICAgXCIjcHVyY2hhc2UtaGlzdG9yeSAubWFya2V0cGxhY2UtYXVjdGlvbnMtaXRlbVwiXG4gICkpIHtcbiAgICBjb25zdCBpdGVtaWQgPSBwdXJjaGFzZS5kYXRhc2V0Lml0ZW1pZFxuICAgIHB1cmNoYXNlLnF1ZXJ5U2VsZWN0b3IoXCIuZGVsZXRlLWJ1dHRvblwiKT8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIExvY2FsU3RvcmFnZS5wdXJjaGFzZXMgPSBMb2NhbFN0b3JhZ2UucHVyY2hhc2VzLmZpbHRlcihcbiAgICAgICAgcHVyY2hhc2UgPT4gcHVyY2hhc2UuaXRlbWlkICE9PSBpdGVtaWRcbiAgICAgIClcblxuICAgICAgbG9hZEhpc3RvcnkobWFya2V0cGxhY2VBY3RpdmVBdWN0aW9ucylcbiAgICB9KVxuICB9XG5cbiAgZm9yIChjb25zdCBzYWxlIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTExJRWxlbWVudD4oXG4gICAgXCIjc2FsZS1oaXN0b3J5IC5tYXJrZXRwbGFjZS1zYWxlcy1pdGVtXCJcbiAgKSkge1xuICAgIGNvbnN0IGljb24gPSBzYWxlLnF1ZXJ5U2VsZWN0b3I8SFRNTEltYWdlRWxlbWVudD4oXCIuYWJzdHJhY3QtaWNvbiBpbWdcIik/LnNyY1xuICAgIHNhbGUucXVlcnlTZWxlY3RvcihcIi5kZWxldGUtYnV0dG9uXCIpPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgTG9jYWxTdG9yYWdlLnNhbGVzID0gTG9jYWxTdG9yYWdlLnNhbGVzLmZpbHRlcihzYWxlID0+IHNhbGUuaWNvbiAhPT0gaWNvbilcblxuICAgICAgbG9hZEhpc3RvcnkobWFya2V0cGxhY2VBY3RpdmVBdWN0aW9ucylcbiAgICB9KVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IGNhcm91c2VsQmVlbW9vdkFubm95YW5jZXMgfSBmcm9tIFwiLi4vY2Fyb3VzZWwvY2Fyb3VzZWxfYmVlbW9vdl9hbm5veWFuY2VzXCJcbmltcG9ydCB7IGNhcm91c2VsRG93bmxvYWRGYWNlIH0gZnJvbSBcIi4uL2Nhcm91c2VsL2Nhcm91c2VsX2Rvd25sb2FkX2ZhY2VcIlxuaW1wb3J0IHsgY2Fyb3VzZWxEb3dubG9hZEd1YXJkaWFuIH0gZnJvbSBcIi4uL2Nhcm91c2VsL2Nhcm91c2VsX2Rvd25sb2FkX2d1YXJkaWFuXCJcbmltcG9ydCB7IGNhcm91c2VsRUUgfSBmcm9tIFwiLi4vY2Fyb3VzZWwvY2Fyb3VzZWxfZWxkYXJ5YV9lbmhhbmNlbWVudHNcIlxuaW1wb3J0IHsgY2Fyb3VzZWxUYWtlb3ZlciB9IGZyb20gXCIuLi9jYXJvdXNlbC9jYXJvdXNlbF90YWtlb3ZlclwiXG5pbXBvcnQgeyBkb3dubG9hZEZhY2UsIGRvd25sb2FkR3VhcmRpYW4gfSBmcm9tIFwiLi4vZG93bmxvYWQtY2FudmFzXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB7IFNlc3Npb25TdG9yYWdlIH0gZnJvbSBcIi4uL3Nlc3Npb25fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VcIlxuaW1wb3J0IHsgdG9nZ2xlVGFrZW92ZXIgfSBmcm9tIFwiLi4vdGFrZW92ZXIvYnJhaW5cIlxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZENhcm91c2VsKCk6IHZvaWQge1xuICBjb25zdCBjYXJvdXNlbElubmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjYXJvdXNlbC1pbm5lclwiKVxuICBpZiAoIWNhcm91c2VsSW5uZXIgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5jYXJvdXNlbC1lZVwiKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gSW1wb3J0IGNhcm91c2VsIHRlbXBsYXRlXG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9jYXJvdXNlbF9uZXdzLmh0bWxcIilcblxuICBjb25zdCBjb250ZXh0cyA9IFtcbiAgICAvLyBJbnRyb1xuICAgIGNhcm91c2VsRUUsXG5cbiAgICAvLyBGZWF0dXJlc1xuICAgIC4uLigoTG9jYWxTdG9yYWdlLm1pbmlnYW1lcyB8fFxuICAgICAgTG9jYWxTdG9yYWdlLmV4cGxvcmF0aW9ucyB8fFxuICAgICAgTG9jYWxTdG9yYWdlLm1hcmtldCkgJiZcbiAgICBMb2NhbFN0b3JhZ2UudW5sb2NrZWRcbiAgICAgID8gW2Nhcm91c2VsVGFrZW92ZXJdXG4gICAgICA6IFtdKSxcbiAgICBjYXJvdXNlbERvd25sb2FkR3VhcmRpYW4sXG4gICAgY2Fyb3VzZWxEb3dubG9hZEZhY2UsXG5cbiAgICAvLyBBZHNcbiAgICBjYXJvdXNlbEJlZW1vb3ZBbm5veWFuY2VzLFxuICBdXG5cbiAgLy8gQWRkIGVudHJpZXMgdG8gdGhlIGNhcm91c2VsXG4gIGNhcm91c2VsSW5uZXIuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgY29udGV4dHMubWFwKGJhbm5lciA9PiB0ZW1wbGF0ZS5yZW5kZXIoYmFubmVyKSkuam9pbihcIlxcblwiKVxuICApXG5cbiAgLy8gQWRkIGxpbmtzXG4gIGZvciAoY29uc3QgY2Fyb3VzZWwgb2YgY29udGV4dHMpIHtcbiAgICBpZiAoIWNhcm91c2VsLmhyZWYpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBlbGVtZW50ID0gY2Fyb3VzZWxJbm5lci5xdWVyeVNlbGVjdG9yKGAjJHtjYXJvdXNlbC5pZH1gKVxuICAgIGlmICghZWxlbWVudCkgY29udGludWVcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImFjdGl2ZVwiKSkgb3BlbihjYXJvdXNlbC5ocmVmLCBcIl9ibGFua1wiKVxuICAgIH0pXG4gIH1cblxuICAvLyBBZGQgY2xpY2sgZXZlbnRzXG5cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoY2Fyb3VzZWxEb3dubG9hZEZhY2UuaWQpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZG93bmxvYWRGYWNlKVxuXG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKGNhcm91c2VsRG93bmxvYWRHdWFyZGlhbi5pZClcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBkb3dubG9hZEd1YXJkaWFuKVxuXG4gIGNvbnN0IHRha2VvdmVyQW5jaG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2Fyb3VzZWxUYWtlb3Zlci5pZClcbiAgdGFrZW92ZXJBbmNob3I/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgdG9nZ2xlVGFrZW92ZXIoKVxuICAgIHRha2VvdmVyVGl0bGUodGFrZW92ZXJBbmNob3IpXG4gIH0pXG5cbiAgaWYgKHRha2VvdmVyQW5jaG9yKSB0YWtlb3ZlclRpdGxlKHRha2VvdmVyQW5jaG9yKVxufVxuXG5mdW5jdGlvbiB0YWtlb3ZlclRpdGxlKHRha2VvdmVyQW5jaG9yOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICBjb25zdCB0YWtlb3Zlckg0ID0gdGFrZW92ZXJBbmNob3IucXVlcnlTZWxlY3RvcihcImg0XCIpXG4gIGlmICh0YWtlb3Zlckg0KSB7XG4gICAgdGFrZW92ZXJINC5pbm5lclRleHQgPSBTZXNzaW9uU3RvcmFnZS50YWtlb3ZlclxuICAgICAgPyB0cmFuc2xhdGUuY2Fyb3VzZWwudGFrZW92ZXIuZGlzYWJsZV90YWtlb3ZlclxuICAgICAgOiB0cmFuc2xhdGUuY2Fyb3VzZWwudGFrZW92ZXIuZW5hYmxlX3Rha2VvdmVyXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgc2F2ZUZhdm91cml0ZSwgc2hvd0Zhdm91cml0ZSB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL2Zha2VfZmF2b3VyaXRlc1wiXG5pbXBvcnQgeyBleHBvcnRQcmV2aWV3LCBpbXBvcnRPdXRmaXQgfSBmcm9tIFwiLi4vYXBwZWFyYW5jZS9mYXZvdXJpdGVzX2FjdGlvbnNcIlxuaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi9jb25zb2xlXCJcbmltcG9ydCB7IGRvd25sb2FkQXBwZWFyYW5jZSB9IGZyb20gXCIuLi9kb3dubG9hZC1jYW52YXNcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCBpbmRleGVkX2RiIGZyb20gXCIuLi9pbmRleGVkX2RiL2luZGV4ZWRfZGJcIlxuaW1wb3J0IHsgd2FpdE9ic2VydmUgfSBmcm9tIFwiLi4vdGFrZW92ZXIvY2xpY2tcIlxuaW1wb3J0IHR5cGUgeyBGYXZvdXJpdGVzQWN0aW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2Zhdm91cml0ZXNfYWN0aW9uXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGYXZvdXJpdGVzKCk6IHZvaWQge1xuICBpZiAoIWxvY2F0aW9uLnBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvcGxheWVyL2FwcGVhcmFuY2UvZmF2b3JpdGVzXCIpKSByZXR1cm5cblxuICBsb2FkRmF2b3VyaXRlc0FjdGlvbnMoKVxuICB2b2lkIGxvYWRGYWtlRmF2b3VyaXRlcygpXG59XG5cbmZ1bmN0aW9uIGxvYWRGYXZvdXJpdGVzQWN0aW9ucygpOiB2b2lkIHtcbiAgY29uc3QgYWN0aW9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZmF2b3JpdGVzLWFjdGlvbnNcIilcbiAgaWYgKCFhY3Rpb25zIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZmF2b3JpdGVzLWFjdGlvbi1lZVwiKSkgcmV0dXJuXG5cbiAgY29uc3QgYWN0aW9uVGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2Zhdm91cml0ZXNfYWN0aW9uLmh0bWxcIilcblxuICBjb25zdCBpbXBvcnRBY3Rpb246IEZhdm91cml0ZXNBY3Rpb24gPSB7XG4gICAgaWQ6IFwiaW1wb3J0LW91dGZpdFwiLFxuICAgIHRleHQ6IHRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuYnV0dG9ucy5pbXBvcnQsXG4gIH1cbiAgY29uc3QgZXhwb3J0QWN0aW9uOiBGYXZvdXJpdGVzQWN0aW9uID0ge1xuICAgIGlkOiBcImV4cG9ydC1vdXRmaXRcIixcbiAgICB0ZXh0OiB0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLmJ1dHRvbnMuZXhwb3J0LFxuICB9XG4gIGNvbnN0IGRvd25sb2FkQWN0aW9uOiBGYXZvdXJpdGVzQWN0aW9uID0ge1xuICAgIGlkOiBcImRvd25sb2FkLW91dGZpdFwiLFxuICAgIHRleHQ6IHRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuYnV0dG9ucy5kb3dubG9hZCxcbiAgfVxuXG4gIGFjdGlvbnMuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgYWN0aW9uVGVtcGxhdGUucmVuZGVyKGltcG9ydEFjdGlvbikgK1xuICAgICAgYWN0aW9uVGVtcGxhdGUucmVuZGVyKGV4cG9ydEFjdGlvbikgK1xuICAgICAgYWN0aW9uVGVtcGxhdGUucmVuZGVyKGRvd25sb2FkQWN0aW9uKVxuICApXG5cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoaW1wb3J0QWN0aW9uLmlkKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGltcG9ydE91dGZpdClcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChleHBvcnRBY3Rpb24uaWQpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZXhwb3J0UHJldmlldylcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChkb3dubG9hZEFjdGlvbi5pZClcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBkb3dubG9hZEFwcGVhcmFuY2UpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkRmFrZUZhdm91cml0ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFwcGVhcmFuY2VJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwZWFyYW5jZS1pdGVtc1wiKVxuICBpZiAoIWFwcGVhcmFuY2VJdGVtcykge1xuICAgIENvbnNvbGUuZXJyb3IoXCJDb3VsZG4ndCBhY2Nlc3MgI2FwcGVhcmFuY2UtaXRlbXNcIiwgYXBwZWFyYW5jZUl0ZW1zKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdGh1bWJzID0gYXdhaXQgd2FpdE9ic2VydmUoXG4gICAgYXBwZWFyYW5jZUl0ZW1zLFxuICAgIFwiI2FsbC1vdXRmaXQtdGh1bWJzIC5tQ1NCX2NvbnRhaW5lclwiLFxuICAgIDMwMDBcbiAgKVxuICBpZiAoIXRodW1icykge1xuICAgIENvbnNvbGUuZXJyb3IoXCJDb3VsZG4ndCBhY2Nlc3MgI2FsbC1vdXRmaXQtdGh1bWJzXCIsIHRodW1icylcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9vdXRmaXRfdGh1bWJzLmh0bWxcIilcblxuICBjb25zdCBmYXZvdXJpdGVzID0gYXdhaXQgaW5kZXhlZF9kYi5nZXRGYXZvdXJpdGVPdXRmaXRzKClcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2VlLW91dGZpdC10aHVtYnNcIik/LnJlbW92ZSgpXG4gIHRodW1icy5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgXCJiZWZvcmVlbmRcIixcbiAgICB0ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgb3V0Zml0czogZmF2b3VyaXRlcyxcbiAgICB9KVxuICApXG5cbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIi5lZS1hdmFpbGFibGUtc2xvdFwiKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpOiB2b2lkID0+IHZvaWQgc2F2ZUZhdm91cml0ZSgpKVxuXG4gIGZvciAoY29uc3QgZGl2IG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTERpdkVsZW1lbnQ+KFxuICAgIFwiLmVlLW91dGZpdC10aHVtYlwiXG4gICkpIHtcbiAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGZhdm91cml0ZSA9IGZhdm91cml0ZXMuZmluZChcbiAgICAgICAgZmF2b3VyaXRlID0+IGZhdm91cml0ZS5pZCA9PT0gTnVtYmVyKGRpdi5kYXRhc2V0LmFycmF5SW5kZXgpXG4gICAgICApXG4gICAgICBpZiAoIWZhdm91cml0ZSkgcmV0dXJuXG5cbiAgICAgIHNob3dGYXZvdXJpdGUoZmF2b3VyaXRlKVxuICAgIH0pXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB0eXBlIHsgSG9tZUNvbnRlbnRTbWFsbCB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9ob21lX2NvbnRlbnRfc21hbGxcIlxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZEhvbWVDb250ZW50KCk6IHZvaWQge1xuICBjb25zdCBob21lQ29udGVudFNtYWxscyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaG9tZS1jb250ZW50LXNtYWxsc1wiKVxuICBpZiAoXG4gICAgIWhvbWVDb250ZW50U21hbGxzIHx8XG4gICAgaG9tZUNvbnRlbnRTbWFsbHMucXVlcnlTZWxlY3RvcihcIi5ob21lLWNvbnRlbnQtc21hbGwtZWVcIilcbiAgKVxuICAgIHJldHVyblxuXG4gIC8vIFJlbW92ZSBiYW5rXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaG9tZS1iYW5rXCIpPy5yZW1vdmUoKVxuXG4gIC8vIEFkZCBmb3J1bVxuICBjb25zdCBzbWFsbFRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9ob21lX2NvbnRlbnRfc21hbGwuaHRtbFwiKVxuICBjb25zdCBzbWFsbENvbnRlbnQ6IEhvbWVDb250ZW50U21hbGwgPSB7XG4gICAgYmFja2dyb3VuZEltYWdlOlxuICAgICAgXCIvYXNzZXRzL2ltZy9taW5pZ2FtZXMvdHJlYXN1cmVodW50L2E0OGJiYzRlNDg0OTc0NWViZTZkYmNmNTMxM2ViM2YwLmpwZ1wiLFxuICAgIGg0OiB0cmFuc2xhdGUuaG9tZS5mb3J1bSxcbiAgICBocmVmOiBcIi9mb3J1bVwiLFxuICAgIGlkOiBcImZvcnVtXCIsXG4gIH1cblxuICBob21lQ29udGVudFNtYWxscy5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgXCJiZWZvcmVlbmRcIixcbiAgICBzbWFsbFRlbXBsYXRlLnJlbmRlcihzbWFsbENvbnRlbnQpXG4gIClcbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgdHJpbUljb24gfSBmcm9tIFwiLi4vZWxkYXJ5YV91dGlsXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB0eXBlIHsgV2lzaGVkSXRlbSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL3dpc2hlZF9pdGVtXCJcbmltcG9ydCB0eXBlIHsgRGF0YVByb2R1Y3QgfSBmcm9tIFwiLi4vbWFsbC9kYXRhX3Byb2R1Y3RcIlxuaW1wb3J0IHR5cGUgeyBNYWxsRW50cnkgfSBmcm9tIFwiLi4vbWFsbC9tYWxsX2VudHJ5XCJcbmltcG9ydCB7IFJhcml0eSB9IGZyb20gXCIuLi9tYXJrZXRwbGFjZS9lbnVtcy9yYXJpdHkuZW51bVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTWFsbCgpOiB2b2lkIHtcbiAgaWYgKCFsb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKFwiL21hbGxcIikpIHJldHVyblxuXG4gIGZvciAoY29uc3QgbGkgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MTElFbGVtZW50PihcIltkYXRhLXByb2R1Y3RdXCIpKVxuICAgIGxpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiBhZGRXaXNobGlzdEJ1dHRvbihsaSkpXG59XG5cbmZ1bmN0aW9uIGFkZFdpc2hsaXN0QnV0dG9uKGxpOiBIVE1MTElFbGVtZW50KTogdm9pZCB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYWRkLXRvLXdpc2hsaXN0XCIpPy5yZW1vdmUoKVxuXG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCIjbWFsbC1wcm9kdWN0RGV0YWlsLWluZm9cIilcbiAgICA/Lmluc2VydEFkamFjZW50SFRNTChcbiAgICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgICBcIjxidXR0b24gaWQ9J2FkZC10by13aXNobGlzdCcgY2xhc3M9J25sLWJ1dHRvbicgc3R5bGU9J21hcmdpbjogMjBweCBhdXRvIDA7IG1pbi13aWR0aDogMjAwcHg7Jz5BZGQgdG8gbWFya2V0IHdpc2hsaXN0PC9idXR0b24+XCJcbiAgICApXG5cbiAgY29uc3QgbWF4UXVhbnRpdHkgPSBsaS5xdWVyeVNlbGVjdG9yPEhUTUxTcGFuRWxlbWVudD4oXCIuaXRlbS1tYXhRdWFudGl0eVwiKVxuXG4gIGNvbnN0IG1hbGxFbnRyeTogTWFsbEVudHJ5ID0ge1xuICAgIHByb2R1Y3Q6IEpTT04ucGFyc2UobGkuZGF0YXNldC5wcm9kdWN0ISkgYXMgRGF0YVByb2R1Y3QsXG4gICAgaWNvbjogdHJpbUljb24oXG4gICAgICBsaS5xdWVyeVNlbGVjdG9yPEhUTUxJbWFnZUVsZW1lbnQ+KFwiaW1nLm1hbGwtcHJvZHVjdC1pY29uXCIpIS5zcmNcbiAgICApLFxuICAgIHJhcml0eTpcbiAgICAgIFJhcml0eVtcbiAgICAgICAgKGxpXG4gICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICBcIi5yYXJpdHktbWFya2VyLWNvbW1vbiwgLnJhcml0eS1tYXJrZXItcmFyZSwgLnJhcml0eS1tYXJrZXItZXBpYywgLnJhcml0eS1tYXJrZXItbGVnZW5kYXJ5LCAucmFyaXR5LW1hcmtlci1ldmVudFwiXG4gICAgICAgICAgKVxuICAgICAgICAgID8uY2xhc3NOYW1lLnNwbGl0KFwicmFyaXR5LW1hcmtlci1cIilbMV0gPz8gXCJcIikgYXMga2V5b2YgdHlwZW9mIFJhcml0eVxuICAgICAgXSxcbiAgICBtYXhRdWFudGl0eTogbWF4UXVhbnRpdHkgPyBOdW1iZXIobWF4UXVhbnRpdHkuaW5uZXJUZXh0KSA6IHVuZGVmaW5lZCxcbiAgICBhYnN0cmFjdFR5cGU6XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcbiAgICAgICAgXCIjbWFsbC1tZW51IC50b29sdGlwLmFjdGl2ZSAudG9vbHRpcC1jb250ZW50XCJcbiAgICAgICk/LmlubmVyVGV4dCA/PyBcIlwiLFxuICB9XG5cbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIiNhZGQtdG8td2lzaGxpc3RcIilcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiBhZGRUb1dpc2hsaXN0RmxhdnIobWFsbEVudHJ5KSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRvV2lzaGxpc3RGbGF2cihtYWxsRW50cnk6IE1hbGxFbnRyeSk6IHZvaWQge1xuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvYXV0b19idXlfZmxhdnJfbWFsbC5odG1sXCIpXG5cbiAgJC5mbGF2cih7XG4gICAgY29udGVudDogdGVtcGxhdGUucmVuZGVyKHsgdHJhbnNsYXRlIH0pLFxuICAgIGJ1dHRvbnM6IHtcbiAgICAgIGNsb3NlOiB7IHN0eWxlOiBcImNsb3NlXCIgfSxcbiAgICAgIHNhdmU6IHtcbiAgICAgICAgYWN0aW9uOiAoKSA9PiBzYXZlKG1hbGxFbnRyeSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGlhbG9nOiBcInByb21wdFwiLFxuICAgIHByb21wdDoge1xuICAgICAgdmFsdWU6IFwiXCIsXG4gICAgfSxcbiAgICBvbkJ1aWxkOiAkY29udGFpbmVyID0+IHtcbiAgICAgICRjb250YWluZXIuYWRkQ2xhc3MoXCJuZXctbGF5b3V0LXBvcHVwXCIpXG5cbiAgICAgIGRvY3VtZW50XG4gICAgICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFwiLmZsYXZyLXByb21wdFwiKVxuICAgICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCAoeyBrZXkgfSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgIT09IFwiRW50ZXJcIikgcmV0dXJuXG4gICAgICAgICAgc2F2ZShtYWxsRW50cnkpXG4gICAgICAgIH0pXG4gICAgfSxcbiAgfSlcbn1cblxuZnVuY3Rpb24gc2F2ZShtYWxsRW50cnk6IE1hbGxFbnRyeSk6IGJvb2xlYW4ge1xuICBjb25zdCBwcmljZSA9IE51bWJlcihcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFwiLmZsYXZyLXByb21wdFwiKT8udmFsdWUudHJpbSgpXG4gIClcbiAgaWYgKCFwcmljZSB8fCBwcmljZSA8PSAwKSB7XG4gICAgJC5mbGF2ck5vdGlmKHRyYW5zbGF0ZS5tYXJrZXQuYWRkX3RvX3dpc2hsaXN0LmludmFsaWRfcHJpY2UpXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCB3aXNobGlzdCA9IExvY2FsU3RvcmFnZS53aXNobGlzdC5maWx0ZXIoXG4gICAgd2lzaGxpc3RFbnRyeSA9PiB3aXNobGlzdEVudHJ5Lmljb24gIT09IG1hbGxFbnRyeS5pY29uXG4gIClcbiAgY29uc3Qgd2lzaGVkOiBXaXNoZWRJdGVtID0ge1xuICAgIC4uLm1hbGxFbnRyeSxcbiAgICAuLi5tYWxsRW50cnkucHJvZHVjdCxcbiAgICBwcmljZSxcbiAgfVxuICB3aXNobGlzdC5wdXNoKHdpc2hlZClcblxuICB3aXNobGlzdC5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgdHlwZUNvbXBhcmUgPSBhLnR5cGUubG9jYWxlQ29tcGFyZShiLnR5cGUpXG4gICAgaWYgKHR5cGVDb21wYXJlICE9PSAwKSByZXR1cm4gdHlwZUNvbXBhcmVcblxuICAgIGNvbnN0IGFic3RyYWN0VHlwZUNvbXBhcmUgPSAoYS5hYnN0cmFjdFR5cGUgPz8gXCJcIikubG9jYWxlQ29tcGFyZShcbiAgICAgIGIuYWJzdHJhY3RUeXBlID8/IFwiXCJcbiAgICApXG4gICAgaWYgKGFic3RyYWN0VHlwZUNvbXBhcmUgIT09IDApIHJldHVybiBhYnN0cmFjdFR5cGVDb21wYXJlXG5cbiAgICBjb25zdCByYXJpdHlDb21wYXJlID1cbiAgICAgIE9iamVjdC5rZXlzKFJhcml0eSkuaW5kZXhPZihhLnJhcml0eSA/PyBcIlwiKSAtXG4gICAgICBPYmplY3Qua2V5cyhSYXJpdHkpLmluZGV4T2YoYi5yYXJpdHkgPz8gXCJcIilcbiAgICBpZiAocmFyaXR5Q29tcGFyZSAhPT0gMCkgcmV0dXJuIHJhcml0eUNvbXBhcmVcblxuICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpXG4gIH0pXG5cbiAgTG9jYWxTdG9yYWdlLndpc2hsaXN0ID0gd2lzaGxpc3RcblxuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvZmxhdnJfbm90aWYvaWNvbl9tZXNzYWdlLmh0bWxcIilcbiAgJC5mbGF2ck5vdGlmKFxuICAgIHRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAuLi53aXNoZWQsXG4gICAgICBtZXNzYWdlOiB0cmFuc2xhdGUubWFya2V0LmFkZF90b193aXNobGlzdC5hZGRlZF90b193aXNobGlzdChcbiAgICAgICAgd2lzaGVkLm5hbWUsXG4gICAgICAgIHdpc2hlZC5wcmljZVxuICAgICAgKSxcbiAgICB9KVxuICApXG4gIHJldHVybiB0cnVlXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB0eXBlIHsgV2lzaGVkSXRlbSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL3dpc2hlZF9pdGVtXCJcbmltcG9ydCB7IFJhcml0eSB9IGZyb20gXCIuLi9tYXJrZXRwbGFjZS9lbnVtcy9yYXJpdHkuZW51bVwiXG5pbXBvcnQgdHlwZSB7IE1hcmtldEVudHJ5IH0gZnJvbSBcIi4uL21hcmtldHBsYWNlL2ludGVyZmFjZXMvbWFya2V0X2VudHJ5XCJcbmltcG9ydCB7IGdldEl0ZW1EZXRhaWxzIH0gZnJvbSBcIi4uL21hcmtldHBsYWNlL21hcmtldHBsYWNlX2hhbmRsZXJzXCJcblxubGV0IG1hcmtldE9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyIHwgbnVsbFxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZE1hcmtldCgpOiB2b2lkIHtcbiAgbWFya2V0T2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKVxuICBtYXJrZXRPYnNlcnZlciA9IG51bGxcblxuICBpZiAobG9jYXRpb24ucGF0aG5hbWUgIT09IFwiL21hcmtldHBsYWNlXCIpIHJldHVyblxuXG4gIC8vIGAubWFya2V0cGxhY2Utc2VhcmNoLWl0ZW1zYCBpcyB0aGUgY29udGFpbmVyIHdob3NlIEhUTUwgY29udGVudCBpcyBiZWluZ1xuICAvLyByZXBsYWNlZCBvbiBldmVyeSBhY3Rpb24uXG4gIGNvbnN0IHNlYXJjaEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MVUxpc3RFbGVtZW50PihcbiAgICBcIi5tYXJrZXRwbGFjZS1zZWFyY2gtaXRlbXNcIlxuICApXG4gIGlmICghc2VhcmNoSXRlbXMpIHJldHVyblxuXG4gIG1hcmtldE9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobG9hZFdpc2hsaXN0KVxuICBtYXJrZXRPYnNlcnZlci5vYnNlcnZlKHNlYXJjaEl0ZW1zLCB7XG4gICAgY2hpbGRMaXN0OiB0cnVlLFxuICB9KVxuXG4gIGxvYWRXaXNobGlzdCgpXG59XG5cbmZ1bmN0aW9uIGxvYWRXaXNobGlzdCgpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBsaSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxMSUVsZW1lbnQ+KFxuICAgIFwiLm1hcmtldHBsYWNlLWFic3RyYWN0XCJcbiAgKSkge1xuICAgIGxpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PlxuICAgICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoXG4gICAgICAgIChfOiBNdXRhdGlvblJlY29yZFtdLCBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcik6IHZvaWQgPT4ge1xuICAgICAgICAgIGNvbnN0IG1hcmtldEVudHJ5ID0gZ2V0SXRlbURldGFpbHMobGkpXG4gICAgICAgICAgaWYgKCFtYXJrZXRFbnRyeSkgcmV0dXJuXG5cbiAgICAgICAgICBhZGRXaXNoaXN0QnV0dG9uKG1hcmtldEVudHJ5LCBvYnNlcnZlcilcbiAgICAgICAgfVxuICAgICAgKS5vYnNlcnZlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFya2V0cGxhY2Utem9vbVwiKSBhcyBOb2RlLCB7XG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFdpc2hpc3RCdXR0b24oXG4gIG1hcmtldEVudHJ5OiBNYXJrZXRFbnRyeSxcbiAgb2JzZXJ2ZXI/OiBNdXRhdGlvbk9ic2VydmVyXG4pOiB2b2lkIHtcbiAgY29uc3QgYnV0dG9uc0NvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFxuICAgIFwiI21hcmtldHBsYWNlLWl0ZW1EZXRhaWxcIlxuICApXG4gIGlmICghYnV0dG9uc0NvbnRhaW5lcikgcmV0dXJuXG4gIG9ic2VydmVyPy5kaXNjb25uZWN0KClcbiAgaGlqYWNrQnV5QnV0dG9ucyhtYXJrZXRFbnRyeSlcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1hcmtldHBsYWNlLWl0ZW1EZXRhaWwtaW5mby1hdXRvYnV5XCIpPy5yZW1vdmUoKVxuICBjb25zdCBidXR0b25UZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvYXV0b19idXlfYnV0dG9uLmh0bWxcIilcbiAgYnV0dG9uc0NvbnRhaW5lci5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgXCJiZWZvcmVlbmRcIixcbiAgICBidXR0b25UZW1wbGF0ZS5yZW5kZXIoeyB0cmFuc2xhdGUgfSlcbiAgKVxuXG4gIGJ1dHRvbnNDb250YWluZXJcbiAgICAucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIjbWFya2V0cGxhY2UtaXRlbURldGFpbC1pbmZvLWF1dG9idXlcIilcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiBhZGRUb1dpc2hsaXN0RmxhdnIobWFya2V0RW50cnkpKVxufVxuXG5mdW5jdGlvbiBhZGRUb1dpc2hsaXN0RmxhdnIobWFya2V0RW50cnk6IE1hcmtldEVudHJ5KTogdm9pZCB7XG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9hdXRvX2J1eV9mbGF2ci5odG1sXCIpXG5cbiAgJC5mbGF2cih7XG4gICAgY29udGVudDogdGVtcGxhdGUucmVuZGVyKHsgdHJhbnNsYXRlIH0pLFxuICAgIGJ1dHRvbnM6IHtcbiAgICAgIGNsb3NlOiB7IHN0eWxlOiBcImNsb3NlXCIgfSxcbiAgICAgIHNhdmU6IHtcbiAgICAgICAgYWN0aW9uOiAoKSA9PiBzYXZlKG1hcmtldEVudHJ5KSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkaWFsb2c6IFwicHJvbXB0XCIsXG4gICAgcHJvbXB0OiB7XG4gICAgICB2YWx1ZTogXCJcIixcbiAgICB9LFxuICAgIG9uQnVpbGQ6ICRjb250YWluZXIgPT4ge1xuICAgICAgJGNvbnRhaW5lci5hZGRDbGFzcyhcIm5ldy1sYXlvdXQtcG9wdXBcIilcblxuICAgICAgZG9jdW1lbnRcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oXCIuZmxhdnItcHJvbXB0XCIpXG4gICAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsICh7IGtleSB9KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSAhPT0gXCJFbnRlclwiKSByZXR1cm5cbiAgICAgICAgICBzYXZlKG1hcmtldEVudHJ5KVxuICAgICAgICB9KVxuICAgIH0sXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHNhdmUobWFya2V0RW50cnk6IE1hcmtldEVudHJ5KTogYm9vbGVhbiB7XG4gIGNvbnN0IHByaWNlID0gTnVtYmVyKFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oXCIuZmxhdnItcHJvbXB0XCIpPy52YWx1ZS50cmltKClcbiAgKVxuICBpZiAoIXByaWNlIHx8IHByaWNlIDw9IDApIHtcbiAgICAkLmZsYXZyTm90aWYodHJhbnNsYXRlLm1hcmtldC5hZGRfdG9fd2lzaGxpc3QuaW52YWxpZF9wcmljZSlcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IHdpc2hsaXN0ID0gTG9jYWxTdG9yYWdlLndpc2hsaXN0LmZpbHRlcihcbiAgICB3aXNobGlzdEVudHJ5ID0+IHdpc2hsaXN0RW50cnkuaWNvbiAhPT0gbWFya2V0RW50cnkuaWNvblxuICApXG4gIGNvbnN0IHdpc2hlZDogV2lzaGVkSXRlbSA9IHsgLi4ubWFya2V0RW50cnksIHByaWNlIH1cbiAgd2lzaGxpc3QucHVzaCh3aXNoZWQpXG5cbiAgd2lzaGxpc3Quc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IHR5cGVDb21wYXJlID0gYS50eXBlLmxvY2FsZUNvbXBhcmUoYi50eXBlKVxuICAgIGlmICh0eXBlQ29tcGFyZSAhPT0gMCkgcmV0dXJuIHR5cGVDb21wYXJlXG5cbiAgICBjb25zdCBhYnN0cmFjdFR5cGVDb21wYXJlID0gKGEuYWJzdHJhY3RUeXBlID8/IFwiXCIpLmxvY2FsZUNvbXBhcmUoXG4gICAgICBiLmFic3RyYWN0VHlwZSA/PyBcIlwiXG4gICAgKVxuICAgIGlmIChhYnN0cmFjdFR5cGVDb21wYXJlICE9PSAwKSByZXR1cm4gYWJzdHJhY3RUeXBlQ29tcGFyZVxuXG4gICAgY29uc3QgcmFyaXR5Q29tcGFyZSA9XG4gICAgICBPYmplY3Qua2V5cyhSYXJpdHkpLmluZGV4T2YoYS5yYXJpdHkgPz8gXCJcIikgLVxuICAgICAgT2JqZWN0LmtleXMoUmFyaXR5KS5pbmRleE9mKGIucmFyaXR5ID8/IFwiXCIpXG4gICAgaWYgKHJhcml0eUNvbXBhcmUgIT09IDApIHJldHVybiByYXJpdHlDb21wYXJlXG5cbiAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKVxuICB9KVxuXG4gIExvY2FsU3RvcmFnZS53aXNobGlzdCA9IHdpc2hsaXN0XG5cbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2ZsYXZyX25vdGlmL2ljb25fbWVzc2FnZS5odG1sXCIpXG4gICQuZmxhdnJOb3RpZihcbiAgICB0ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgLi4ud2lzaGVkLFxuICAgICAgbWVzc2FnZTogdHJhbnNsYXRlLm1hcmtldC5hZGRfdG9fd2lzaGxpc3QuYWRkZWRfdG9fd2lzaGxpc3QoXG4gICAgICAgIHdpc2hlZC5uYW1lLFxuICAgICAgICB3aXNoZWQucHJpY2VcbiAgICAgICksXG4gICAgfSlcbiAgKVxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBoaWphY2tCdXlCdXR0b25zKG1hcmtldEVudHJ5OiBNYXJrZXRFbnRyeSk6IHZvaWQge1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwiLm1hcmtldHBsYWNlLWl0ZW1EZXRhaWwtYnV5XCIpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgYWRkUHVyY2hhc2UobWFya2V0RW50cnkpXG4gICAgfSlcbn1cblxuZnVuY3Rpb24gYWRkUHVyY2hhc2UobWFya2V0RW50cnk6IE1hcmtldEVudHJ5KTogdm9pZCB7XG4gIExvY2FsU3RvcmFnZS5wdXJjaGFzZXMgPSBbXG4gICAgbWFya2V0RW50cnksXG4gICAgLi4uTG9jYWxTdG9yYWdlLnB1cmNoYXNlcy5maWx0ZXIoXG4gICAgICBwdXJjaGFzZSA9PiBwdXJjaGFzZS5pdGVtaWQgIT09IG1hcmtldEVudHJ5Lml0ZW1pZFxuICAgICksXG4gIF1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB0eXBlIHsgTWFpbk1lbnUgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvbWFpbl9tZW51XCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRNZW51KCk6IHZvaWQge1xuICBjb25zdCBtZW51SW5uZXJSaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWVudS1pbm5lci1yaWdodFwiKVxuICBpZiAoIW1lbnVJbm5lclJpZ2h0IHx8IG1lbnVJbm5lclJpZ2h0LnF1ZXJ5U2VsZWN0b3IoXCIubWFpbi1tZW51LWVlXCIpKSByZXR1cm5cblxuICAvLyBSZW1vdmUgYmFua1xuICBtZW51SW5uZXJSaWdodC5xdWVyeVNlbGVjdG9yKFwiLm1haW4tbWVudS1iYW5rXCIpPy5yZW1vdmUoKVxuXG4gIC8vIEFkZCBGb3J1bVxuICBjb25zdCBtZW51VGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL21haW5fbWVudS5odG1sXCIpXG4gIGNvbnN0IG1haW5NZW51Rm9ydW06IE1haW5NZW51ID0ge1xuICAgIGNsYXNzOiBcImZvcnVtXCIsXG4gICAgaHJlZjogXCIvZm9ydW1cIixcbiAgICB0ZXh0OiB0cmFuc2xhdGUuaG9tZS5mb3J1bSxcbiAgfVxuXG4gIG1lbnVJbm5lclJpZ2h0Lmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIG1lbnVUZW1wbGF0ZS5yZW5kZXIobWFpbk1lbnVGb3J1bSlcbiAgKVxufVxuIiwiaW1wb3J0IHsgbG9hZE1hcmtlcnMgfSBmcm9tIFwiLi4vcGV0L2V4cGxvcmF0aW9uXCJcbmltcG9ydCB7IGxvYWRFeHBsb3JhdGlvbkhpc3RvcnkgfSBmcm9tIFwiLi4vcGV0L2V4cGxvcmF0aW9uLWhpc3RvcnlcIlxuXG5sZXQgcGV0T2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXIgfCBudWxsXG5cbmZ1bmN0aW9uIGxvYWRFeHBsb3JhdGlvbnMoKTogdm9pZCB7XG4gIHBldE9ic2VydmVyPy5kaXNjb25uZWN0KClcbiAgcGV0T2JzZXJ2ZXIgPSBudWxsXG5cbiAgLyoqIGAucGFnZS1tYWluLWNvbnRhaW5lcmAgY2hhbmdlcyBiYWNrZ3JvdW5kIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJlZ2lvbi4gKi9cbiAgY29uc3QgbWFpbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFxuICAgIFwiLnBhZ2UtbWFpbi1jb250YWluZXJcIlxuICApXG4gIGlmICghbWFpbkNvbnRhaW5lcikgcmV0dXJuXG5cbiAgcGV0T2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihsb2FkRXhwbG9yYXRpb25zKVxuICBwZXRPYnNlcnZlci5vYnNlcnZlKG1haW5Db250YWluZXIsIHtcbiAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICB9KVxuXG4gIGxvYWRNYXJrZXJzKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRQZXQoKTogdm9pZCB7XG4gIGlmIChsb2NhdGlvbi5wYXRobmFtZSAhPT0gXCIvcGV0XCIpIHJldHVyblxuICBsb2FkRXhwbG9yYXRpb25zKClcbiAgbG9hZEV4cGxvcmF0aW9uSGlzdG9yeSgpXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IGRvd25sb2FkUHJvZmlsZSB9IGZyb20gXCIuLi9kb3dubG9hZC1jYW52YXNcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IGV4cG9ydE91dGZpdCB9IGZyb20gXCIuLi9vdXRmaXRcIlxuaW1wb3J0IHR5cGUgeyBQcm9maWxlQ29udGFjdEFjdGlvbiB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9wcm9maWxlX2NvbnRhY3RfYWN0aW9uXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRQcm9maWxlKCk6IHZvaWQge1xuICBjb25zdCBwcm9maWxlQ29udGFjdEFjdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICBcInByb2ZpbGUtY29udGFjdC1hY3Rpb25zXCJcbiAgKVxuICBpZiAoXG4gICAgIXByb2ZpbGVDb250YWN0QWN0aW9ucyB8fFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIucHJvZmlsZS1jb250YWN0LWFjdGlvbi1lZVwiKVxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9wcm9maWxlX2NvbnRhY3RfYWN0aW9uLmh0bWxcIilcblxuICBjb25zdCBwcm9maWxlQWN0aW9uRXhwb3J0OiBQcm9maWxlQ29udGFjdEFjdGlvbiA9IHtcbiAgICBpZDogXCJwcm9maWxlLWNvbnRhY3QtYWN0aW9uLWV4cG9ydFwiLFxuICAgIGFjdGlvbkRlc2NyaXB0aW9uOiB0cmFuc2xhdGUucHJvZmlsZS5leHBvcnRfb3V0Zml0LFxuICB9XG4gIGNvbnN0IHByb2ZpbGVBY3Rpb25Eb3dubG9hZDogUHJvZmlsZUNvbnRhY3RBY3Rpb24gPSB7XG4gICAgaWQ6IFwicHJvZmlsZS1jb250YWN0LWFjdGlvbi1kb3dubG9hZFwiLFxuICAgIGFjdGlvbkRlc2NyaXB0aW9uOiB0cmFuc2xhdGUucHJvZmlsZS5kb3dubG9hZF9vdXRmaXQsXG4gIH1cblxuICAvLyBBZGQgZW50cmllc1xuICBwcm9maWxlQ29udGFjdEFjdGlvbnMuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgdGVtcGxhdGUucmVuZGVyKHByb2ZpbGVBY3Rpb25FeHBvcnQpXG4gIClcbiAgcHJvZmlsZUNvbnRhY3RBY3Rpb25zLmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIHRlbXBsYXRlLnJlbmRlcihwcm9maWxlQWN0aW9uRG93bmxvYWQpXG4gIClcblxuICAvLyBBZGQgY2xpY2sgZXZlbnRzXG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKHByb2ZpbGVBY3Rpb25FeHBvcnQuaWQpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZXhwb3J0UHJvZmlsZSlcbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQocHJvZmlsZUFjdGlvbkRvd25sb2FkLmlkKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGRvd25sb2FkUHJvZmlsZSlcbn1cblxuZnVuY3Rpb24gZXhwb3J0UHJvZmlsZSgpOiB2b2lkIHtcbiAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxIZWFkaW5nRWxlbWVudD4oXG4gICAgXCIjbWFpbi1zZWN0aW9uIC5zZWN0aW9uLXRpdGxlXCJcbiAgKVxuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhTYWNoYS5BdmF0YXIuYXZhdGFycykuZmlsdGVyKGtleSA9PlxuICAgIGtleS5zdGFydHNXaXRoKFwiI3BsYXllclByb2ZpbGVBdmF0YXJcIilcbiAgKVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBleHBvcnRPdXRmaXQoa2V5LCB0aXRsZT8udGV4dENvbnRlbnQ/LnRyaW0oKSlcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyBQdXJyb3Nob3BTdGF0dXMgfSBmcm9tIFwiLi4vYXBpL21ldGFcIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5cbi8qKiBTaG93cyBhIFB1cnJvJ1Nob3AgYnV0dG9uIGluIHRoZSBtYWluIG1lbnUgd2hlbiBpdCdzIGF2YWlsYWJsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUHVycm9TaG9wKCk6IHZvaWQge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLm1haW4tbWVudS1wdXJyb3Nob3BcIik/LnJlbW92ZSgpXG5cbiAgLy8gQSBidWcgaW4gV2ViUGFjayBwcmV2ZW50cyB1c2luZyBgTG9jYWxTdG9yYWdlLm1ldGE/LnB1cnJvc2hvcC5zdGF0dXNgLlxuICBpZiAoXG4gICAgTG9jYWxTdG9yYWdlLm1ldGEgPT09IG51bGwgfHxcbiAgICBMb2NhbFN0b3JhZ2UubWV0YS5wdXJyb3Nob3Auc3RhdHVzICE9PSBQdXJyb3Nob3BTdGF0dXMuZW5hYmxlZFxuICApXG4gICAgcmV0dXJuXG5cbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL21haW5fbWVudV9wdXJyb3Nob3AuaHRtbFwiKVxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChcIm1lbnUtaW5uZXItbGVmdFwiKVxuICAgID8uaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLCB0ZW1wbGF0ZS5yZW5kZXIoe30pKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyBnZXROYW1lIH0gZnJvbSBcIi4uL2Rvd25sb2FkLWNhbnZhc1wiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5pbXBvcnQgdHlwZSB7IFNldHRpbmdzIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL3NldHRpbmdzXCJcblxuLyoqIENyZWF0ZXMgdGhlIFVJIGZvciB0aGUgc2V0dGluZ3MgaW4gdGhlIGFjY291bnQgcGFnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkU2V0dGluZ3MoKTogdm9pZCB7XG4gIGNvbnN0IGFjY291bnRSaWdodCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYWNjb3VudC1yaWdodCBkaXZcIilcbiAgaWYgKCFhY2NvdW50UmlnaHQgfHwgYWNjb3VudFJpZ2h0LnF1ZXJ5U2VsZWN0b3IoXCIuYWNjb3VudC1lZS1ibG9jXCIpKSByZXR1cm5cblxuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxTZXR0aW5ncz4gPSB7XG4gICAgZGVidWc6IExvY2FsU3RvcmFnZS5kZWJ1ZyxcbiAgICBleHBsb3JhdGlvbnM6IExvY2FsU3RvcmFnZS5leHBsb3JhdGlvbnMsXG4gICAgbWFya2V0OiBMb2NhbFN0b3JhZ2UubWFya2V0LFxuICAgIG1pbmlnYW1lczogTG9jYWxTdG9yYWdlLm1pbmlnYW1lcyxcbiAgICB1bmxvY2tlZDogTG9jYWxTdG9yYWdlLnVubG9ja2VkLFxuICB9XG4gIGNvbnN0IHNldHRpbmdzVGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL3NldHRpbmdzLmh0bWxcIilcbiAgY29uc3QgcmVuZGVyZWQgPSBzZXR0aW5nc1RlbXBsYXRlLnJlbmRlcih7IC4uLnNldHRpbmdzLCB0cmFuc2xhdGUgfSlcbiAgYWNjb3VudFJpZ2h0Lmluc2VydEFkamFjZW50SFRNTChcImJlZm9yZWVuZFwiLCByZW5kZXJlZClcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVlLWRlYnVnLWVuYWJsZWRcIik/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgTG9jYWxTdG9yYWdlLmRlYnVnID0gIUxvY2FsU3RvcmFnZS5kZWJ1Z1xuICAgIHJlbG9hZFNldHRpbmdzKClcbiAgfSlcblxuICBpZiAoTG9jYWxTdG9yYWdlLnVubG9ja2VkKSB7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZChcImVlLW1pbmlnYW1lcy1lbmFibGVkXCIpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIExvY2FsU3RvcmFnZS5taW5pZ2FtZXMgPSAhTG9jYWxTdG9yYWdlLm1pbmlnYW1lc1xuICAgICAgICByZWxvYWRTZXR0aW5ncygpXG4gICAgICB9KVxuXG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZChcImVlLWV4cGxvcmF0aW9ucy1lbmFibGVkXCIpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIExvY2FsU3RvcmFnZS5leHBsb3JhdGlvbnMgPSAhTG9jYWxTdG9yYWdlLmV4cGxvcmF0aW9uc1xuICAgICAgICByZWxvYWRTZXR0aW5ncygpXG4gICAgICB9KVxuXG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZChcImVlLW1hcmtldC1lbmFibGVkXCIpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIExvY2FsU3RvcmFnZS5tYXJrZXQgPSAhTG9jYWxTdG9yYWdlLm1hcmtldFxuICAgICAgICByZWxvYWRTZXR0aW5ncygpXG4gICAgICB9KVxuICB9XG5cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoXCJlZS1pbXBvcnRcIilcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBpbXBvcnRTZXR0aW5ncylcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChcImVlLWV4cG9ydFwiKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHZvaWQgZXhwb3J0U2V0dGluZ3MoKSlcbn1cblxuZnVuY3Rpb24gcmVsb2FkU2V0dGluZ3MoKTogdm9pZCB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFwiLmFjY291bnQtZWUtYmxvY1wiKT8ucmVtb3ZlKClcbiAgbG9hZFNldHRpbmdzKClcbn1cblxuZnVuY3Rpb24gaW1wb3J0U2V0dGluZ3MoKTogdm9pZCB7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpXG4gIGlucHV0LnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJmaWxlXCIpXG4gIGlucHV0LnNldEF0dHJpYnV0ZShcImFjY2VwdFwiLCBcImFwcGxpY2F0aW9uL2pzb25cIilcbiAgaW5wdXQuY2xpY2soKVxuXG4gIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBldmVudCA9PiB7XG4gICAgaWYgKCFldmVudC50YXJnZXQpIHJldHVyblxuICAgIGNvbnN0IGZpbGVzID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlc1xuICAgIGlmICghZmlsZXMpIHJldHVyblxuICAgIGNvbnN0IGZpbGUgPSBmaWxlc1swXVxuICAgIGlmICghZmlsZSkgcmV0dXJuXG4gICAgdm9pZCBmaWxlLnRleHQoKS50aGVuKGFzeW5jIHZhbHVlID0+IHtcbiAgICAgIGlmICghdmFsdWUpIHJldHVyblxuXG4gICAgICBjb25zdCBwYXJzZWQ6IFNldHRpbmdzID0gSlNPTi5wYXJzZSh2YWx1ZSlcbiAgICAgIGF3YWl0IExvY2FsU3RvcmFnZS5zZXRTZXR0aW5ncyhwYXJzZWQpXG5cbiAgICAgIHJlbG9hZFNldHRpbmdzKClcbiAgICAgICQuZmxhdnJOb3RpZih0cmFuc2xhdGUuYWNjb3VudC5pbXBvcnRlZClcbiAgICB9KVxuICB9KVxufVxuXG5hc3luYyBmdW5jdGlvbiBleHBvcnRTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaHJlZiA9XG4gICAgXCJkYXRhOnRleHQvanNvbjtjaGFyc2V0PXV0Zi04LFwiICtcbiAgICBlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBKU09OLnN0cmluZ2lmeShhd2FpdCBMb2NhbFN0b3JhZ2UuZ2V0U2V0dGluZ3MoKSwgbnVsbCwgMilcbiAgICApXG5cbiAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpXG4gIGEuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBocmVmKVxuICBhLnNldEF0dHJpYnV0ZShcbiAgICBcImRvd25sb2FkXCIsXG4gICAgYCR7Z2V0TmFtZSgpID8/IFwiZWxkYXJ5YS1lbmhhbmNlbWVudHNcIn0tc2V0dGluZ3MuanNvbmBcbiAgKVxuICBhLmNsaWNrKClcbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuaW1wb3J0IHsgU2Vzc2lvblN0b3JhZ2UgfSBmcm9tIFwiLi4vc2Vzc2lvbl9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZVwiXG5pbXBvcnQgeyB0b2dnbGVUYWtlb3ZlciB9IGZyb20gXCIuLi90YWtlb3Zlci9icmFpblwiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkVG9wQmFyKCk6IHZvaWQge1xuICBjb25zdCBoZWFkZXJSaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGVhZGVyLXJpZ2h0XCIpXG4gIGlmICghaGVhZGVyUmlnaHQpIHJldHVyblxuXG4gIGNvbnN0IGhlYWRlclRha2VvdmVyID0gaGVhZGVyUmlnaHQucXVlcnlTZWxlY3RvcihcIiNoZWFkZXItdGFrZW92ZXJcIilcbiAgaWYgKGhlYWRlclRha2VvdmVyKSBoZWFkZXJUYWtlb3Zlci5yZW1vdmUoKVxuICBlbHNlIGxvYWRMaW5rcygpXG5cbiAgaWYgKFxuICAgIChMb2NhbFN0b3JhZ2UubWluaWdhbWVzIHx8XG4gICAgICBMb2NhbFN0b3JhZ2UuZXhwbG9yYXRpb25zIHx8XG4gICAgICBMb2NhbFN0b3JhZ2UubWFya2V0KSAmJlxuICAgIExvY2FsU3RvcmFnZS51bmxvY2tlZFxuICApIHtcbiAgICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvaGVhZGVyX3Rha2VvdmVyLmh0bWxcIilcbiAgICBoZWFkZXJSaWdodC5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgICBcImFmdGVyYmVnaW5cIixcbiAgICAgIHRlbXBsYXRlLnJlbmRlcih7IHRha2VvdmVyOiBTZXNzaW9uU3RvcmFnZS50YWtlb3ZlciwgdHJhbnNsYXRlIH0pXG4gICAgKVxuXG4gICAgaGVhZGVyUmlnaHRcbiAgICAgIC5xdWVyeVNlbGVjdG9yKFwiI2hlYWRlci10YWtlb3ZlclwiKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdG9nZ2xlVGFrZW92ZXIpXG4gIH1cbn1cblxuZnVuY3Rpb24gbG9hZExpbmtzKCk6IHZvaWQge1xuICBjb25zdCBoZWFkZXJQcm9maWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoZWFkZXItcHJvZmlsZVwiKT8uZmlyc3RDaGlsZFxuICBpZiAoaGVhZGVyUHJvZmlsZT8udGV4dENvbnRlbnQpIHtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIilcbiAgICBhLmhyZWYgPSBcIi9wbGF5ZXIvcHJvZmlsZVwiXG4gICAgYS5zdHlsZS5jb2xvciA9IFwidmFyKC0tdGV4dC1jb2xvcilcIlxuICAgIGEuc3R5bGUuZm9udEZhbWlseSA9ICdcIkFsZWdyZXlhIFNhbnNcIiwgc2Fucy1zZXJpZidcbiAgICBhLnN0eWxlLmZvbnRXZWlnaHQgPSBcInVuc2V0XCJcbiAgICBhLnRleHRDb250ZW50ID0gaGVhZGVyUHJvZmlsZS50ZXh0Q29udGVudC50cmltKClcblxuICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKVxuICAgIHAuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYmVmb3JlZW5kXCIsIGEpXG5cbiAgICBoZWFkZXJQcm9maWxlLnJlcGxhY2VXaXRoKHApXG4gIH1cblxuICBjb25zdCBhdmF0YXJUaXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXZhdGFyLW1lbnUtY29udGFpbmVyLW91dGVyPnBcIilcbiAgaWYgKGF2YXRhclRpdGxlPy50ZXh0Q29udGVudClcbiAgICBhdmF0YXJUaXRsZS5pbm5lckhUTUwgPSBgPGEgaHJlZj1cIi9wbGF5ZXIvcHJvZmlsZVwiIHN0eWxlPVwiY29sb3I6ICNGRkZGRkY7IGZvbnQtc2l6ZTogMjNweDsgZm9udC13ZWlnaHQ6IDkwMDsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcIj4ke2F2YXRhclRpdGxlLnRleHRDb250ZW50LnRyaW0oKX08L2E+YFxuXG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCIjYXZhdGFyLW1lbnUtY29udGFpbmVyPmNhbnZhc1wiKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHBhZ2VMb2FkKFwiL3BsYXllci9hcHBlYXJhbmNlXCIpKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyBDb25zb2xlIH0gZnJvbSBcIi4uL2NvbnNvbGVcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuaW1wb3J0IHR5cGUgeyBXaXNobGlzdFNldHRpbmdzIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL3dpc2hsaXN0X3NldHRpbmdzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRXaXNobGlzdCgpOiB2b2lkIHtcbiAgY29uc3QgbWFya2V0cGxhY2VNZW51ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYXJrZXRwbGFjZS1tZW51XCIpXG4gIGlmICghbWFya2V0cGxhY2VNZW51KSByZXR1cm5cblxuICBpZiAoIW1hcmtldHBsYWNlTWVudS5xdWVyeVNlbGVjdG9yKFwiI3dpc2hsaXN0LWJ1dHRvblwiKSkge1xuICAgIGZvciAoY29uc3QgYSBvZiBtYXJrZXRwbGFjZU1lbnUucXVlcnlTZWxlY3RvckFsbChcImFcIikpIHtcbiAgICAgIGEuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+XG4gICAgICAgIHBhZ2VMb2FkKGEuaHJlZiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSlcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBtYXJrZXRwbGFjZU1lbnUucXVlcnlTZWxlY3RvcihcIiN3aXNobGlzdC1idXR0b25cIik/LnJlbW92ZSgpXG4gIGNvbnN0IHdpc2hsaXN0QnV0dG9uVGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL3dpc2hsaXN0X2J1dHRvbi5odG1sXCIpXG4gIG1hcmtldHBsYWNlTWVudS5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgXCJiZWZvcmVlbmRcIixcbiAgICB3aXNobGlzdEJ1dHRvblRlbXBsYXRlLnJlbmRlcih7IHRyYW5zbGF0ZSB9KVxuICApXG5cbiAgbWFya2V0cGxhY2VNZW51XG4gICAgLnF1ZXJ5U2VsZWN0b3I8SFRNTEFuY2hvckVsZW1lbnQ+KFwiI3dpc2hsaXN0LWJ1dHRvblwiKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGluc2VydFdpc2hsaXN0KVxufVxuXG5mdW5jdGlvbiBpbnNlcnRXaXNobGlzdCgpOiB2b2lkIHtcbiAgLy8gQXNzaXN0YW5jZVxuICBjb25zdCBhc3Npc3RhbmNlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5tYXJrZXRwbGFjZS1hc3Npc3RhbmNlXCIpXG4gIGlmIChhc3Npc3RhbmNlKSBhc3Npc3RhbmNlLmlubmVySFRNTCA9IHRyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QuYXNzaXN0YW5jZVxuXG4gIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEFuY2hvckVsZW1lbnQ+KFwiI3dpc2hsaXN0LWJ1dHRvblwiKVxuICBpZiAoIWJ1dHRvbikgcmV0dXJuIHZvaWQgQ29uc29sZS5lcnJvcihcIldpc2hsaXN0IGJ1dHRvbiBub3QgZm91bmRcIiwgYnV0dG9uKVxuXG4gIC8vIE1lbnVcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIiNtYXJrZXRwbGFjZS1tZW51IC5hY3RpdmVcIilcbiAgICA/LmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIilcbiAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIilcblxuICAvLyBGaWx0ZXJzXG4gIGNvbnN0IGZpbHRlcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1hcmtldHBsYWNlLWZpbHRlcnNcIilcbiAgaWYgKGZpbHRlcnMpIGZpbHRlcnMuaW5uZXJIVE1MID0gXCJcIlxuXG4gIC8vIENvbnRlbnRcbiAgY29uc3Qgd2lzaGxpc3RUZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvd2lzaGxpc3Rfc2V0dGluZ3MuaHRtbFwiKVxuICBjb25zdCBjb250YWluZXIgPVxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubWFya2V0cGxhY2UtY29udGFpbmVyXCIpID8/XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYXJrZXRwbGFjZS1hY3RpdmUtYXVjdGlvbnNcIikgPz9cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1hcmtldHBsYWNlLWl0ZW1zRm9yU2FsZVwiKVxuICBpZiAoIWNvbnRhaW5lcilcbiAgICByZXR1cm4gdm9pZCBDb25zb2xlLmVycm9yKFwiVGhlIHdpc2hsaXN0IGNhbm5vdCBiZSBwbGFjZWRcIiwgY29udGFpbmVyKVxuXG4gIGNvbnN0IHdpc2hsaXN0Q29udGV4dDogV2lzaGxpc3RTZXR0aW5ncyA9IHtcbiAgICB3aXNobGlzdDogTG9jYWxTdG9yYWdlLndpc2hsaXN0LFxuICB9XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSB3aXNobGlzdFRlbXBsYXRlLnJlbmRlcih7XG4gICAgLi4ud2lzaGxpc3RDb250ZXh0LFxuICAgIHRyYW5zbGF0ZSxcbiAgfSlcblxuICAvLyBCdXR0b25zXG4gIGZvciAoY29uc3QgdHIgb2YgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0clwiKSkge1xuICAgIGNvbnN0IGljb24gPSB0ci5kYXRhc2V0Lmljb25cbiAgICBpZiAoIWljb24pIGNvbnRpbnVlXG5cbiAgICAvLyBSZXNldCBzdGF0dXNcbiAgICBjb25zdCByZXNldCA9IHRyLnF1ZXJ5U2VsZWN0b3IoXCIucmVzZXQtaXRlbS1zdGF0dXNcIilcbiAgICBpZiAocmVzZXQpXG4gICAgICByZXNldC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICByZXNldFN0YXR1cyhpY29uKVxuICAgICAgICBpbnNlcnRXaXNobGlzdCgpXG4gICAgICB9KVxuXG4gICAgLy8gRGVsZXRlIGl0ZW0gZnJvbSB3aXNobGlzdFxuICAgIGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IHRyLnF1ZXJ5U2VsZWN0b3IoXCIuZGVsZXRlLXdpc2hsaXN0LWl0ZW1cIilcbiAgICBpZiAoZGVsZXRlQnV0dG9uKVxuICAgICAgZGVsZXRlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIGRlbGV0ZUl0ZW0oaWNvbilcbiAgICAgICAgaW5zZXJ0V2lzaGxpc3QoKVxuICAgICAgfSlcblxuICAgIC8vIENoYW5nZSBwcmljZVxuICAgIGNvbnN0IGVkaXRQcmljZSA9IHRyLnF1ZXJ5U2VsZWN0b3IoXCIuZWRpdC1wcmljZVwiKVxuICAgIGlmIChlZGl0UHJpY2UpXG4gICAgICBlZGl0UHJpY2UuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAoKSA9PiB2b2lkIGNoYW5nZVByaWNlKGljb24pLnRoZW4oaW5zZXJ0V2lzaGxpc3QpXG4gICAgICApXG4gIH1cblxuICAvLyBSZXNldCBzdGF0dXNlc1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnJlc2V0LWFsbFwiKT8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHJlc2V0U3RhdHVzZXMpXG59XG5cbmZ1bmN0aW9uIHJlc2V0U3RhdHVzKGljb246IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCB3aXNobGlzdCA9IExvY2FsU3RvcmFnZS53aXNobGlzdFxuICBjb25zdCBpbmRleCA9IHdpc2hsaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWNvbiA9PT0gaWNvbilcbiAgY29uc3QgZW50cnkgPSB3aXNobGlzdFtpbmRleF1cbiAgaWYgKCFlbnRyeSkgcmV0dXJuXG5cbiAgZGVsZXRlIGVudHJ5LmVycm9yXG4gIExvY2FsU3RvcmFnZS53aXNobGlzdCA9IFtcbiAgICAuLi53aXNobGlzdC5zbGljZSh1bmRlZmluZWQsIGluZGV4KSxcbiAgICBlbnRyeSxcbiAgICAuLi53aXNobGlzdC5zbGljZShpbmRleCArIDEsIHVuZGVmaW5lZCksXG4gIF1cbn1cblxuZnVuY3Rpb24gZGVsZXRlSXRlbShpY29uOiBzdHJpbmcpOiB2b2lkIHtcbiAgTG9jYWxTdG9yYWdlLndpc2hsaXN0ID0gTG9jYWxTdG9yYWdlLndpc2hsaXN0LmZpbHRlcihcbiAgICBpdGVtID0+IGl0ZW0uaWNvbiAhPT0gaWNvblxuICApXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoYW5nZVByaWNlKGljb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvY2hhbmdlX3ByaWNlX2ZsYXZyLmh0bWxcIilcblxuICBjb25zdCB3aXNobGlzdCA9IExvY2FsU3RvcmFnZS53aXNobGlzdFxuICBjb25zdCBpbmRleCA9IHdpc2hsaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWNvbiA9PT0gaWNvbilcbiAgY29uc3QgZW50cnkgPSB3aXNobGlzdFtpbmRleF1cbiAgaWYgKCFlbnRyeSkgcmV0dXJuXG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICQuZmxhdnIoe1xuICAgICAgY29udGVudDogdGVtcGxhdGUucmVuZGVyKHsgdHJhbnNsYXRlIH0pLFxuICAgICAgZGlhbG9nOiBcInByb21wdFwiLFxuICAgICAgcHJvbXB0OiB7XG4gICAgICAgIHZhbHVlOiBlbnRyeS5wcmljZS50b1N0cmluZygpLFxuICAgICAgfSxcbiAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgY2xvc2U6IHtcbiAgICAgICAgICBzdHlsZTogXCJjbG9zZVwiLFxuICAgICAgICAgIGFjdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNhdmU6IHtcbiAgICAgICAgICBhY3Rpb246ICgpID0+IHNhdmUoaWNvbiwgcmVzb2x2ZSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgb25CdWlsZDogJGNvbnRhaW5lciA9PiB7XG4gICAgICAgICRjb250YWluZXIuYWRkQ2xhc3MoXCJuZXctbGF5b3V0LXBvcHVwXCIpXG5cbiAgICAgICAgZG9jdW1lbnRcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihcIi5mbGF2ci1wcm9tcHRcIilcbiAgICAgICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCAoeyBrZXkgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gXCJFbnRlclwiKSByZXR1cm5cbiAgICAgICAgICAgIHNhdmUoaWNvbiwgcmVzb2x2ZSlcbiAgICAgICAgICB9KVxuICAgICAgfSxcbiAgICB9KVxuICB9KVxufVxuXG5mdW5jdGlvbiBzYXZlKGljb246IHN0cmluZywgcmVzb2x2ZTogKCkgPT4gdm9pZCk6IGJvb2xlYW4ge1xuICBjb25zdCB3aXNobGlzdCA9IExvY2FsU3RvcmFnZS53aXNobGlzdFxuICBjb25zdCBpbmRleCA9IHdpc2hsaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWNvbiA9PT0gaWNvbilcbiAgY29uc3QgZW50cnkgPSB3aXNobGlzdFtpbmRleF1cbiAgaWYgKCFlbnRyeSkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgcHJpY2UgPSBOdW1iZXIoXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihcIi5mbGF2ci1wcm9tcHRcIik/LnZhbHVlLnRyaW0oKVxuICApXG4gIGlmICghcHJpY2UgfHwgcHJpY2UgPD0gMCkge1xuICAgICQuZmxhdnJOb3RpZih0cmFuc2xhdGUubWFya2V0LmNoYW5nZV9wcmljZS5pbnZhbGlkX3ByaWNlKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZW50cnkucHJpY2UgPSBwcmljZVxuICBMb2NhbFN0b3JhZ2Uud2lzaGxpc3QgPSBbXG4gICAgLi4ud2lzaGxpc3Quc2xpY2UodW5kZWZpbmVkLCBpbmRleCksXG4gICAgZW50cnksXG4gICAgLi4ud2lzaGxpc3Quc2xpY2UoaW5kZXggKyAxLCB1bmRlZmluZWQpLFxuICBdXG5cbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2ZsYXZyX25vdGlmL2ljb25fbWVzc2FnZS5odG1sXCIpXG4gICQuZmxhdnJOb3RpZihcbiAgICB0ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgLi4uZW50cnksXG4gICAgICBtZXNzYWdlOiB0cmFuc2xhdGUubWFya2V0LmNoYW5nZV9wcmljZS5jaGFuZ2VkX3ByaWNlKFxuICAgICAgICBlbnRyeS5uYW1lLFxuICAgICAgICBlbnRyeS5wcmljZVxuICAgICAgKSxcbiAgICB9KVxuICApXG5cbiAgcmVzb2x2ZSgpXG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIHJlc2V0U3RhdHVzZXMoKTogdm9pZCB7XG4gIExvY2FsU3RvcmFnZS53aXNobGlzdCA9IExvY2FsU3RvcmFnZS53aXNobGlzdC5tYXAoaXRlbSA9PiB7XG4gICAgZGVsZXRlIGl0ZW0uZXJyb3JcbiAgICByZXR1cm4gaXRlbVxuICB9KVxuXG4gIGluc2VydFdpc2hsaXN0KClcbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJpbXBvcnQgeyBsb2FkRHJlc3NpbmdFeHBlcmllbmNlIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9kcmVzc2luZ19leHBlcmllbmNlXCJcbmltcG9ydCB7IGxvYWRDaGVhdENvZGVzIH0gZnJvbSBcIi4vY2hlYXRfY29kZXNcIlxuaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuL2NvbnNvbGVcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHsgbWlncmF0ZSB9IGZyb20gXCIuL21pZ3JhdGVcIlxuaW1wb3J0IHsgbG9hZFRha2VvdmVyIH0gZnJvbSBcIi4vdGFrZW92ZXIvYnJhaW5cIlxuaW1wb3J0IHsgbG9hZEF1Y3Rpb25zIH0gZnJvbSBcIi4vdWkvYXVjdGlvbnNcIlxuaW1wb3J0IHsgbG9hZENhcm91c2VsIH0gZnJvbSBcIi4vdWkvY2Fyb3VzZWxcIlxuaW1wb3J0IHsgbG9hZEZhdm91cml0ZXMgfSBmcm9tIFwiLi91aS9mYXZvdXJpdGVzXCJcbmltcG9ydCB7IGxvYWRIb21lQ29udGVudCB9IGZyb20gXCIuL3VpL2hvbWVfY29udGVudFwiXG5pbXBvcnQgeyBsb2FkTWFsbCB9IGZyb20gXCIuL3VpL21hbGxcIlxuaW1wb3J0IHsgbG9hZE1hcmtldCB9IGZyb20gXCIuL3VpL21hcmtldFwiXG5pbXBvcnQgeyBsb2FkTWVudSB9IGZyb20gXCIuL3VpL21lbnVcIlxuaW1wb3J0IHsgbG9hZFBldCB9IGZyb20gXCIuL3VpL3BldFwiXG5pbXBvcnQgeyBsb2FkUHJvZmlsZSB9IGZyb20gXCIuL3VpL3Byb2ZpbGVcIlxuaW1wb3J0IHsgbG9hZFB1cnJvU2hvcCB9IGZyb20gXCIuL3VpL3B1cnJvX3Nob3BcIlxuaW1wb3J0IHsgbG9hZFNldHRpbmdzIH0gZnJvbSBcIi4vdWkvc2V0dGluZ3NcIlxuaW1wb3J0IHsgbG9hZFRvcEJhciB9IGZyb20gXCIuL3VpL3RvcF9iYXJcIlxuaW1wb3J0IHsgbG9hZFdpc2hsaXN0IH0gZnJvbSBcIi4vdWkvd2lzaGxpc3RcIlxuXG4vLyBsb2FkSlMoXCJodHRwczovL3VucGtnLmNvbS9ob2dhbi5qcy9kaXN0L3RlbXBsYXRlLTMuMC4yLm1pbi5qc1wiLCB0cnVlKTtcblxuZnVuY3Rpb24gbG9hZCgpOiB2b2lkIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250YWluZXJcIilcbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICAkLmZsYXZyTm90aWYodHJhbnNsYXRlLmVycm9yLmxvbmdMb2FkaW5nKVxuICAgIENvbnNvbGUuZXJyb3IoXCIjY29udGFpbmVyIGNvdWxkbid0IGJlIGZvdW5kOlwiLCBjb250YWluZXIpXG4gICAgcmV0dXJuIHZvaWQgc2V0VGltZW91dChsb2FkLCAxMF8wMDApXG4gIH1cblxuICBtaWdyYXRlKClcbiAgbG9hZFVJKClcbiAgb2JzZXJ2ZSgpXG5cbiAgY29uc29sZS5sb2coYCR7R00uaW5mby5zY3JpcHQubmFtZX0gdiR7R00uaW5mby5zY3JpcHQudmVyc2lvbn0gbG9hZGVkLmApXG4gIGxvYWRUYWtlb3ZlcigpXG59XG5cbmZ1bmN0aW9uIGxvYWRVSSgpOiB2b2lkIHtcbiAgbG9hZE1lbnUoKVxuICBsb2FkQ2Fyb3VzZWwoKVxuICBsb2FkSG9tZUNvbnRlbnQoKVxuICBsb2FkRmF2b3VyaXRlcygpXG4gIGxvYWRQcm9maWxlKClcbiAgbG9hZFBldCgpXG4gIGxvYWRNYXJrZXQoKVxuICBsb2FkV2lzaGxpc3QoKVxuICBsb2FkVG9wQmFyKClcbiAgbG9hZEF1Y3Rpb25zKClcbiAgbG9hZFB1cnJvU2hvcCgpXG4gIGxvYWRNYWxsKClcbiAgbG9hZENoZWF0Q29kZXMoKVxuICBsb2FkU2V0dGluZ3MoKVxuXG4gIC8vIEVsZGFyeWEgaXMgY3Jhc2hpbmcgd2hlbiBvcGVuaW5nIGdyb3Vwcy5cbiAgLy8gVE9ETzogSGFuZGxlIGVycm9ycyBhbmQgc3RvcCB0aGUgbG9hZGluZyBwcm9jZXNzLlxuICB2b2lkIGxvYWREcmVzc2luZ0V4cGVyaWVuY2UoKVxufVxuXG5mdW5jdGlvbiBvYnNlcnZlKCk6IHZvaWQge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbnRhaW5lclwiKVxuICBuZXcgTXV0YXRpb25PYnNlcnZlcihyZWxvYWQpLm9ic2VydmUoY29udGFpbmVyIGFzIE5vZGUsIHsgY2hpbGRMaXN0OiB0cnVlIH0pXG59XG5cbmZ1bmN0aW9uIHJlbG9hZCgpOiB2b2lkIHtcbiAgbG9hZFVJKClcbiAgbG9hZFRha2VvdmVyKClcbn1cblxuaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIikgbG9hZCgpXG5lbHNlIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCAoKSA9PiBsb2FkKCkpXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=